本帖最后由 二宫和也 于 2012-8-17 12:03 编辑
返回教程索引
2.1 丐帮的那些事儿 - 从降龙和打狗说起,判定的基础讲解和简单极意的制作
鉴于这是基础篇,先跟大家讲讲代码里的必需品 - 判定。很多童鞋发帖问乔峰的天赋如何实现,所以我们先从这一点着手:
2.1.1 什么是判定?
搜索关键词:乔峰必出极意,可以看到以下的代码
- if pid == 50 or (pid == 55 and math.random(10) < 5) or ((pid == 69 or
- (pid == 0 and GetS(4, 5, 5, 5) == 1 and JY.Person[pid]["武功等级" ..
- wugongnum] == 999)) and JLSD(30, 70, pid)) then
复制代码 这句代码似乎很长,但其实它只是几个语句用or连接起来的:
1)pid == 50
2)pid == 55 and math.random(10) < 5
3)(pid == 69 or (pid == 0 and GetS(4, 5, 5, 5) == 1 and JY.Person[pid]["武功等级" .. wugongnum] == 999) <-- 注意这里也是由几个句子连接起来的,等下详说
4)JLSD(30, 70, pid)
这里先说明一下,这段话是一个判定语句,所以开头是if,判定成功的话就执行接下来的代码,判定不成功的话就直接跳过。不知道啥叫判定的去打两盘三国杀或者玩一个月dnd。判定语句里面的or代表着or前后的两个条件只要实现其中之一就算判定成功;里面的and代表着and前后的两个条件必须都实现才能判定成功。混合判定的话需要括号来分辨优先权,这就跟咱们学加减乘除一个道理,先做括号里面的,再作括号外面的。
继续解说前面的几个语句,每个字的意思如下:
1)pid - 现在正在行动的人物的人物编号。这个可以用UPedit查看到,比如你一查,50是乔峰,55是郭靖,69是洪7,0是主角,这就对上了。这个变量很重要,请记住它
2)math.random(10) - 这是lua的随机数公式,括号里面的10说明了这个公式会生成1-10的随机数。后面的<5也是判定条件,也就是需要这个随机数字小于5,所以这个部分的几率是4/10=40%
3)GetS(4, 5, 5, 5) == 1 - 这个是灵犀真拳主角的判定,现在不需要管它,知道是什么就好
4)wugongnum - 这个有点难解释,暂时就把它理解为现在所用的是人物的第几个武功好了。比如你用的是第1个武功,wugongnum就等于1
5)JY.Person[pid]["武功等级" .. wugongnum]-联系上文,你应该可以猜出来这个代表着,编号为pid的人物,所用的第“wugongnum”个武功的武功等级(啊好拗口...),这个武功等级必须为999(999代表着极)才能发出降龙极意
6)JLSD(30, 70, pid) - 这个是很重要的函数。基本上大部分特效如果是有几率的话就会调用到这个函数。各位不需要知道这个函数是怎么实现的,只需要知道,括号里面的两个数字的差就是编号为pid的人物的成功几率。所以现在这个人物的成功几率为70-30=40%。另外npc享有10%的加成,所以如果这位人物是npc的话,成功率为70-30+10=50%
在绕了这么一大圈把我自己都搞头晕之后,我总结一下,这个判定语句的整个意思就是
1)如果pid/人物编号为50(乔峰),则必判定成功发出极意
2)如果pid为55(郭靖),则有math.random(10)<5也就是40%几率发出极意
3)如果pid为69(洪7),则有JLSD(30, 70, pid)也就是40%几率(记得npc要多加10%)
4)如果pid为0(主角),而且天赋为真拳,而且降龙的等级为999(极),则有JLSD(30, 70, pid)也就是40%几率。主角的这一段判定有几个括号,而且用or和洪7连起来了,请多看几遍熟悉一下判定的顺序。
最后要注意的是,所有这一切是在以用降龙攻击的前提条件下才能达到的,看关键词上面的那一句代码
- if JY.Person[pid]["武功" .. wugongnum] == 26 then
复制代码 26就是降龙的武功编号,也能用UPedit查到。只有用降龙攻击时才能引发接下来的人物判定等等,才能发出极意。
那么接下来的就是应用。比如如果我们想让虚竹也能以40%几率打出降龙极意的话,先用UPedit查到他的人物编号是49,然后把判定语句插入原本的判定语句中:
- if (pid == 49 and JLSD(0, 40, pid)) or pid == 50 or (pid == 55 and
- math.random(10) < 5) or ((pid == 69 or (pid == 0 and GetS(4, 5, 5,
- 5) == 1 and JY.Person[pid]["武功等级" .. wugongnum] == 999)) and JLSD(30,
- 70, pid)) then
复制代码 看到我在开头插了一句(pid == 49 and JLSD(0, 40, pid))没有?这个就是虚竹的判定语句,记得后面要用or连接起来。进游戏里面试试,就可以发现虚竹用降龙也能出极意了。
另外也可以改几率,比如你想要郭靖100%出极意,就把math.random(10) < 5改成math.random(10)<11。主角的几率也可以改,不过这里注意了,因为主角的几率判定JLSD是和洪7连接在一起的,所以改JLSD的话洪7也会受益。这个时候就需要用括号把洪7和主角分开了,相关语句如下
- (pid == 69 and JLSD(30, 70, pid)) or (pid == 0 and GetS(4, 5, 5, 5) == 1
- and JY.Person[pid]["武功等级" .. wugongnum] == 999 and JLSD(0, 100, pid))
复制代码 这里要注意括号的使用,新手请试多几遍。基本上你能把if语句掌握的话,对DIY的了解就已经入门了。如果发现游戏一开始就直接跳出说明你括号的格式错了,八成是缺了某个边。另外注意在判定语句里面需要用"=="来代表等于,而不是用一般的"=",其余的还有">" "<" ">=" "<="的符号。
2.1.2 扩大极意范围的方法
说到极意的范围,我们先把降龙丢开(因为有点复杂),看看打狗棒法。搜索词打狗棒法 特效,我稍微简化了一下。- --打狗棒法 特效
- if JY.Person[pid]["武功" .. wugongnum] == 80 and JY.Person[pid]["武功等级" ..
- wugongnum] == 999 and (JLSD(30, 70, pid) or (pid == 0 and GetS(4, 5, 5,
- 5) == 4 and JLSD(30, 75, pid))) then
- WAR.Person[id][CC.TXWZ3] = CC.WARS61 --打狗棒法绝学--天下无狗
- WAR.Person[id][CC.TXDH] = 89
- ng = ng + 1500
- WAR.WS = 1
- for i = 1, 6 do
- for j = 1, 6 do
- SetWarMap(x + i - 1, y + j - 1, 4, 1)
- SetWarMap(x - i + 1, y + j - 1, 4, 1)
- SetWarMap(x + i - 1, y - j + 1, 4, 1)
- SetWarMap(x - i + 1, y - j + 1, 4, 1)
- end
- end
- end
复制代码 这又是一大段看得吐血的代码。但是经过前面一节的历练,我相信你一定至少能把第一句的判定看懂吧?这个判定是说,如果使用的武功为打狗(编号80),而且等级为999,则有40%几率出现天下无狗。
注意:这里多了一个判定pid == 0 and GetS(4, 5, 5, 5) == 4 and JLSD(30, 75, pid),聪明如你应该能猜到,GetS(4, 5, 5, 5) == 4就是特系主角的判定,也就是说,特系的主角能够享有45%几率的二次判定。最终的成功率有67%(喜欢统计学的可以算一下,讨厌的可以无视)。所以特系主角出天下无狗的几率大大提升,而平常我们说的xx人物能享有二次判定就是这样子来的。
继续往下看,又有一堆没见过的东西,我在这里解释一下:
1)WAR.Person[id][CC.TXWZ3]:这是人物攻击时的文字显示,CC.WARS61是一个定量,设置为"打狗棒法绝学--天下无狗"。你把这句代码改成 WAR.Person[id][CC.TXWZ3] = "小二万岁" 然后出招试试就知道文字显示是啥东西了
2)WAR.Person[id][CC.TXDH]:这是人物的动画显示,也就是罩在人物头上的那堆红红绿绿的特效,后面的数字是动画的编号,可以用某软件查到,具体的我就不详解了
3)这里要解释一下id这个变量,咋看上去跟pid长得差不多,但实际上他们完全是两码事。id是人物在战场上的编号,是按照轻功来排序的,每场战斗都可能改变。pid是人物在数据文件中的编号,用UPedit可以查的,不会改变。写代码的时候有时候用到id有时候用到pid这点确实会让人头昏,但是因为用法不同所以必须这样,请慢慢适应。现在请先记住至少攻击时的文字显示和动画显示调用的是id。
4)ng:这个好懂,就是附加的气攻值。出无狗的时候气攻值加1500
5)WAR.WS:这个是变量,掌管误伤。如果把它设置为1则该次攻击不会误伤。
6)下面的是重头戏,两个for循环。有编程基础的人可以无视这一段。我只是对新手说一下,以后搞极意的时候照抄就好了!= =....只需要注意那个6,这个数字越大极意的攻击范围就越大,具体的范围是这个数字减1,也就是5x5格。
看懂这段了没有?看懂了之后你回头看看降龙的那段代码,应该至少也能弄懂个70%了吧....
以下是应用篇。问题:如果我要让虚竹使用5级以上的罗汉拳的时候有30%几率打出天马流星拳,效果为9x9大方块,气攻加3000,怎么做?
答案如下,注意武功等级0-99的时候实际上是1级,所以400以上是5级
- if JY.Person[pid]["武功" .. wugongnum] == 1 and JY.Person[pid]["武功等级" ..
- wugongnum] >= 400 and pid == 49 and JLSD(0, 30, pid) then
- WAR.Person[id][CC.TXWZ3] = "天马流星拳"
- ng = ng + 3000
- for i = 1, 10 do
- for j = 1, 10 do
- SetWarMap(x + i - 1, y + j - 1, 4, 1)
- SetWarMap(x - i + 1, y + j - 1, 4, 1)
- SetWarMap(x + i - 1, y - j + 1, 4, 1)
- SetWarMap(x - i + 1, y - j + 1, 4, 1)
- end
- end
- end
复制代码 看懂了这一步之后,你就可以用任意人物组合任意武功打造你自己的极意了(虽然现在的极意只限于大范围攻击,总比没有的强)
返回教程索引
|