铁血丹心

 找回密码
 我要成为铁血侠客
搜索
查看: 1009|回复: 3

求教关于类斗转武功反击的实现

[复制链接]
发表于 2012-11-22 15:09 | 显示全部楼层 |阅读模式

马上注册,结交更多侠友!

您需要 登录 才可以下载或查看,没有账号?我要成为铁血侠客

x
本帖最后由 fina 于 2012-11-22 15:10 编辑

不好意思又来请教

基本上现在想制作的效果是
在被敌人攻击时,攻击特效出现前
我方可以使用武功反击
击中敌方后敌方攻击即中断
未击中则敌方攻击继续

但知自己初学能力不足
因此先从斗转星移武功反击学起
目前遇到很多问题想请教

在参考了 LDCR 文件后
基本发现斗转的实现相当复杂
1.先计算被攻击的我方兵器值及是否学过斗转
2.依兵器值判断显示特效及文字
3.记录被敌人使用的攻击武功代码
4.调用函式计算
基本 1 & 2 的程序代码是可以了解的
3 的步骤以后很多参数的使用就不太了解
这边表列如下

  1.   for i = 1, 10 do
  2.     local kfid = JY.Person[eid]["武功" .. i] --定義受擊方的武功列表
  3.           local fanji=math.modf(JY.Person[eid]["资质"]/2) --斗转概率资质/2+5,慕容复额外60%判定
  4.     if kfid == 43 and JY.Person[eid]["体力"] > 10 and WAR.Person[emenyid]["反击武功"] == -1
  5.                   and WAR.Person[emenyid]["我方"] ~= WAR.Person[WAR.CurID]["我方"] and
  6.                   (JLSD(10,20+fanji,eid) or (DT(eid , 51) and (WAR.HMXC > 0 or JLSD(20, 80, eid))) or
  7.                   (WAR.tmp[1000 + eid] == 1 and JLSD(30, 70, eid))) or DT(eid,113) then
  8.         local p = JY.Person[eid]
  9.         local dzlv = p["拳掌功夫"] + p["御剑能力"] + p["耍刀技巧"] + p["特殊兵器"]
  10.         local dzwz = nil
  11.             if T7DFWM(eid) and juexing() >= 2 then --东方未明乾坤斗转
  12.                   WAR.DFWM3 = 1
  13.             end
  14.             if (DT3(eid , 51) and WAR.HMXC > 0) or DT3(eid , 113) then --慕容幻梦星辰
  15.         dzwz = "幻梦星辰"
  16.         WAR.DZXYLV[eid] = 3
  17.       elseif dzlv >= 300 or DT(eid , 51) then
  18.         dzwz = CC.WARS88                        --离合参商
  19.         WAR.DZXYLV[eid] = 3
  20.       elseif dzlv >= 220 then
  21.         dzwz = CC.WARS89                        --斗转星移
  22.         WAR.DZXYLV[eid] = 2
  23.       else
  24.         dzwz = CC.WARS90                        --北斗移辰
  25.         WAR.DZXYLV[eid] = 1
  26.       end
  27.       if WAR.Person[emenyid][CC.TXWZ2] ~= nil then
  28.         WAR.Person[emenyid][CC.TXWZ2] = WAR.Person[emenyid][CC.TXWZ2] .. "+" .. dzwz
  29.       else
  30.         WAR.Person[emenyid][CC.TXWZ2] = dzwz
  31.       end
  32.       if WAR.Person[emenyid][CC.TXDH] == nil then
  33.         WAR.Person[emenyid][CC.TXDH] = math.fmod(kfid, 10) + 85
  34.       end
  35.       WAR.Person[emenyid]["反击武功"] = wugong
  36.       JY.Person[eid]["体力"] = JY.Person[eid]["体力"] - 3
  37.       break;
  38.     end
  39.   end
复制代码

TXWZ TZDH 是特效文字及特效动画先略过
WAR.Person[emenyid]["反击武功"] = wugong 这句搜寻了很多比对
还是不知道用途为何
似乎是将敌人使用的武功记录起来
搜寻后找到代码如下

  1.   --斗转星移计算
  2.   local dz = {}
  3.   local dznum = 0
  4.   for i = 0, WAR.PersonNum - 1 do
  5.     if WAR.Person[i]["反击武功"] ~= -1 and WAR.Person[i]["反击武功"] ~= 9999 then
  6.       dznum = dznum + 1
  7.       dz[dznum] = {i, WAR.Person[i]["反击武功"], x - WAR.Person[WAR.CurID]["坐标X"], y - WAR.Person[WAR.CurID]["坐标Y"]}
  8.       WAR.Person[i]["反击武功"] = 9999
  9.     end
  10.   end
  11.   for i = 1, dznum do
  12.     local tmp = WAR.CurID
  13.     WAR.CurID = dz[i][1]
  14.     WAR.DZXY = 1
  15.     if WAR.DZXYLV[WAR.Person[WAR.CurID]["人物编号"]] == 1 then
  16.       WAR.DZXYLV[WAR.Person[WAR.CurID]["人物编号"]] = 60
  17.     elseif WAR.DZXYLV[WAR.Person[WAR.CurID]["人物编号"]] == 2 then
  18.         WAR.DZXYLV[WAR.Person[WAR.CurID]["人物编号"]] = 85
  19.     elseif WAR.DZXYLV[WAR.Person[WAR.CurID]["人物编号"]] == 3 then
  20.         WAR.DZXYLV[WAR.Person[WAR.CurID]["人物编号"]] = 110
  21.     end
  22.         
  23.         if (DT3(WAR.Person[dz[i][1]]["人物编号"],51) and inteam(51) and WAR.HMXC > 0) or (DT3(WAR.Person[dz[i][1]]["人物编号"],113) and inteam(113)) then
  24.                 War_Fight_Sub(dz[i][1], dz[i][2] + 100, dz[i][3], dz[1][4])
  25.         elseif ((DT(WAR.Person[dz[i][1]]["人物编号"],51) and inteam(51)) or
  26.                 (WAR.Person[dz[i][1]]["人物编号"]==0 and
  27.                 RWWH[0]==nil and GetS(10, 0, 7, 0) == 1) or  
  28.                 (douzhuankekong(WAR.Person[dz[i][1]]["人物编号"]))) and WAR.AutoFight == 0 then --慕容可控,主角观武后可控
  29.                 War_Fight_Sub(dz[i][1], dz[i][2] + 100)
  30.         else
  31.                 War_Fight_Sub(dz[i][1], dz[i][2] + 100, dz[i][3], dz[1][4])
  32.         end
  33.     WAR.Person[WAR.CurID]["反击武功"] = -1
  34.     WAR.DZXYLV[WAR.Person[WAR.CurID]["人物编号"]] = nil
  35.     WAR.CurID = tmp
  36.     WAR.DZXY = 0
  37.   end
复制代码

这段开始就完全无法理解
另外关于斗转的部分还有一段

  1.   if wugongnum < 100 then
  2.     wugong = JY.Person[pid]["武功" .. wugongnum]
  3.   else
  4.     wugong = wugongnum - 100
  5.     wugongnum = 1
  6.           for i = 1, 10 do
  7.             if JY.Person[pid]["武功" .. i] == 43 then   --如果学习有斗转星移
  8.               wugongnum = i     --记录斗转武功位置
  9.                           break;
  10.             end
  11.           end         
  12.          
  13.           --斗轉星移函數定義
  14.           local function douzhuantest()
  15.                 if ((pid==51 and (inteam(51)) and WAR.HMXC == 0) or (pid==0 and RWWH[0]==nil and GetS(10, 0, 7, 0) == 1)
  16.                         or douzhuankekong(pid)) and WAR.AutoFight == 0 then
  17.                         return true
  18.                 else
  19.                         return false
  20.                 end
  21.           end
  22.                         if douzhuantest()== false or (DT3(pid , 51) and WAR.HMXC > 0) or DT3(pid , 113) then --慕容和主角可控
  23.                 x = WAR.Person[WAR.CurID]["坐标X"] - x
  24.                 y = WAR.Person[WAR.CurID]["坐标Y"] - y
  25.                 WarDrawMap(0)   
  26.           end
  27.           local fj = nil
  28.           if WAR.DZXYLV[pid] == 110 then    --斗转星移提示的文字
  29.                 if (pid == 51 and WAR.HMXC > 0) or pid == 113 then
  30.                         fj = string.format(CC.WARSHMXC, JY.Person[pid]["姓名"])
  31.                 else
  32.                         fj = string.format(CC.WARS18, JY.Person[pid]["姓名"])
  33.                 end
  34.           elseif WAR.DZXYLV[pid] == 85 then
  35.               fj = string.format(CC.WARS19, JY.Person[pid]["姓名"])
  36.           elseif WAR.DZXYLV[pid] == 60 then
  37.               fj = string.format(CC.WARS20, JY.Person[pid]["姓名"])
  38.           end
  39.          
  40.           for i = 1, 10 do
  41.             DrawStrBox(-1, 24, fj, C_ORANGE, 20 + i)
  42.             ShowScreen()
  43.             if i == 10 then
  44.               lib.Delay(40)
  45.             else
  46.               lib.Delay(1)
  47.             end
  48.           end
  49.         end
复制代码


请教douzhuantest() 的用途为何呢 ?
斗转可控与否的判断式已经有一个
douzhuankekong()
为何还要再一个
douzhuantest()来判断呢 ?


不好意思,因为自己搜寻整个LDCR 文件研究了两天
几万行程序代码看到都快眼花了XDD


又参考了板上二宫大的教学

真的还是无法完全理解斗转参数的应用
所以才又来发文请教~~

希望各位大大不吝指教~~

我想实现的效果比较简单一点只使用单一武功反击因此不需要做敌方武功的记录但关于单一武功的反击相关的代码我无法从斗转的语法里解析出来所以才想请教整段代码的意义

【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2012-11-22 21:19 | 显示全部楼层
本帖最后由 fina 于 2012-11-22 21:20 编辑

新的问题请教
请问在定义某些变量WAR.DZXY = [] 之类的后面的[] {}
两种括号是差在哪里呢?
另外,我参考原来独孤九剑破x式减伤的公式将公式改为


  1.   if (eid == 0 and GetS(4, 5, 5, 5) == 2 and WAR.DGJJ == 1
  2.         and 120 <= JY.Person[eid]["御剑能力"] and PersonKF(0, 47))
  3.         and WAR.Person[emenyid]["我方"] ~= WAR.Person[WAR.CurID]["我方"] then
  4.         
  5.           hurt = 10
  6.     if JY.Wugong[wugong]["武功类型"] == 1 then
  7.       WAR.Person[emenyid][CC.TXWZ3] = CC.WARS99
  8.     elseif JY.Wugong[wugong]["武功类型"] == 2 then
  9.       WAR.Person[emenyid][CC.TXWZ3] = CC.WARS100
  10.     elseif JY.Wugong[wugong]["武功类型"] == 3 then
  11.       WAR.Person[emenyid][CC.TXWZ3] = CC.WARS101
  12.     elseif JY.Wugong[wugong]["武功类型"] == 4 then
  13.       WAR.Person[emenyid][CC.TXWZ3] = CC.WARS102
  14.     end
  15.    
  16.     if wugong < 109 and wugong > 88 then
  17.       WAR.Person[emenyid][CC.TXWZ3] = CC.WARS103
  18.     end
  19.    
  20.     WAR.Person[emenyid][CC.TXDH] = 83
  21.   end
复制代码

但却没办法作用,破x式的字样会出现
代表判定式有作用
但却没办法将伤害降为10
请问是什么原因呢?


【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-11-23 11:00 | 显示全部楼层
本帖最后由 别子熊 于 2012-11-23 11:07 编辑

这类问题还是自己研究的好 因为高手只有心情好加有空才有可能回答 所以楼主还是边改边测试的好  
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-11-23 12:14 | 显示全部楼层
楼上的是受什么刺激了么...

楼主的想法我曾经试过,结果失败了= =

douzhuantest和douzhuankekong那两个函数是当初初学的时候写的,具体啥意义我忘了,貌似一个是判断四系总数300以上,另外一个才是真的判断可控

那一大段"斗转星移计算"就跟你说的那样,是把一些信息储存起来,包括进行反击的人物战场编号,反击武功,攻击坐标,都存到一个表里,然后按顺序一个个用War_Fight_Sub实现反击

{}是创建表的时候用的,[]类似于索引?我没正式学过lua也不知道怎样解释...你搜索一下lua的语法可能会有些心得

从代码上看hurt确实被改成了10,可能是判定上出了问题所以没有判定成功?WAR.DGJJ是啥?把判定改简单点然后一个个加上去慢慢测试?
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

小黑屋|手机版|铁血丹心

GMT+8, 2024-11-27 07:22

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表