本帖最后由 fina 于 2012-11-22 15:10 编辑
不好意思又来请教
基本上现在想制作的效果是
在被敌人攻击时,攻击特效出现前
我方可以使用武功反击
击中敌方后敌方攻击即中断
未击中则敌方攻击继续
但知自己初学能力不足
因此先从斗转星移武功反击学起
目前遇到很多问题想请教
在参考了 LDCR 文件后
基本发现斗转的实现相当复杂
1.先计算被攻击的我方兵器值及是否学过斗转
2.依兵器值判断显示特效及文字
3.记录被敌人使用的攻击武功代码
4.调用函式计算
基本 1 & 2 的程序代码是可以了解的
但 3 的步骤以后很多参数的使用就不太了解
这边表列如下
- for i = 1, 10 do
- local kfid = JY.Person[eid]["武功" .. i] --定義受擊方的武功列表
- local fanji=math.modf(JY.Person[eid]["资质"]/2) --斗转概率资质/2+5,慕容复额外60%判定
- if kfid == 43 and JY.Person[eid]["体力"] > 10 and WAR.Person[emenyid]["反击武功"] == -1
- and WAR.Person[emenyid]["我方"] ~= WAR.Person[WAR.CurID]["我方"] and
- (JLSD(10,20+fanji,eid) or (DT(eid , 51) and (WAR.HMXC > 0 or JLSD(20, 80, eid))) or
- (WAR.tmp[1000 + eid] == 1 and JLSD(30, 70, eid))) or DT(eid,113) then
- local p = JY.Person[eid]
- local dzlv = p["拳掌功夫"] + p["御剑能力"] + p["耍刀技巧"] + p["特殊兵器"]
- local dzwz = nil
- if T7DFWM(eid) and juexing() >= 2 then --东方未明乾坤斗转
- WAR.DFWM3 = 1
- end
- if (DT3(eid , 51) and WAR.HMXC > 0) or DT3(eid , 113) then --慕容幻梦星辰
- dzwz = "幻梦星辰"
- WAR.DZXYLV[eid] = 3
- elseif dzlv >= 300 or DT(eid , 51) then
- dzwz = CC.WARS88 --离合参商
- WAR.DZXYLV[eid] = 3
- elseif dzlv >= 220 then
- dzwz = CC.WARS89 --斗转星移
- WAR.DZXYLV[eid] = 2
- else
- dzwz = CC.WARS90 --北斗移辰
- WAR.DZXYLV[eid] = 1
- end
- if WAR.Person[emenyid][CC.TXWZ2] ~= nil then
- WAR.Person[emenyid][CC.TXWZ2] = WAR.Person[emenyid][CC.TXWZ2] .. "+" .. dzwz
- else
- WAR.Person[emenyid][CC.TXWZ2] = dzwz
- end
- if WAR.Person[emenyid][CC.TXDH] == nil then
- WAR.Person[emenyid][CC.TXDH] = math.fmod(kfid, 10) + 85
- end
- WAR.Person[emenyid]["反击武功"] = wugong
- JY.Person[eid]["体力"] = JY.Person[eid]["体力"] - 3
- break;
- end
- end
复制代码
TXWZ 跟 TZDH 是特效文字及特效动画先略过
但 WAR.Person[emenyid]["反击武功"] = wugong 这句搜寻了很多比对
还是不知道用途为何
似乎是将敌人使用的武功记录起来
搜寻后找到代码如下
- --斗转星移计算
- local dz = {}
- local dznum = 0
- for i = 0, WAR.PersonNum - 1 do
- if WAR.Person[i]["反击武功"] ~= -1 and WAR.Person[i]["反击武功"] ~= 9999 then
- dznum = dznum + 1
- dz[dznum] = {i, WAR.Person[i]["反击武功"], x - WAR.Person[WAR.CurID]["坐标X"], y - WAR.Person[WAR.CurID]["坐标Y"]}
- WAR.Person[i]["反击武功"] = 9999
- end
- end
- for i = 1, dznum do
- local tmp = WAR.CurID
- WAR.CurID = dz[i][1]
- WAR.DZXY = 1
- if WAR.DZXYLV[WAR.Person[WAR.CurID]["人物编号"]] == 1 then
- WAR.DZXYLV[WAR.Person[WAR.CurID]["人物编号"]] = 60
- elseif WAR.DZXYLV[WAR.Person[WAR.CurID]["人物编号"]] == 2 then
- WAR.DZXYLV[WAR.Person[WAR.CurID]["人物编号"]] = 85
- elseif WAR.DZXYLV[WAR.Person[WAR.CurID]["人物编号"]] == 3 then
- WAR.DZXYLV[WAR.Person[WAR.CurID]["人物编号"]] = 110
- end
-
- 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
- War_Fight_Sub(dz[i][1], dz[i][2] + 100, dz[i][3], dz[1][4])
- elseif ((DT(WAR.Person[dz[i][1]]["人物编号"],51) and inteam(51)) or
- (WAR.Person[dz[i][1]]["人物编号"]==0 and
- RWWH[0]==nil and GetS(10, 0, 7, 0) == 1) or
- (douzhuankekong(WAR.Person[dz[i][1]]["人物编号"]))) and WAR.AutoFight == 0 then --慕容可控,主角观武后可控
- War_Fight_Sub(dz[i][1], dz[i][2] + 100)
- else
- War_Fight_Sub(dz[i][1], dz[i][2] + 100, dz[i][3], dz[1][4])
- end
- WAR.Person[WAR.CurID]["反击武功"] = -1
- WAR.DZXYLV[WAR.Person[WAR.CurID]["人物编号"]] = nil
- WAR.CurID = tmp
- WAR.DZXY = 0
- end
复制代码
这段开始就完全无法理解
另外关于斗转的部分还有一段
- if wugongnum < 100 then
- wugong = JY.Person[pid]["武功" .. wugongnum]
- else
- wugong = wugongnum - 100
- wugongnum = 1
- for i = 1, 10 do
- if JY.Person[pid]["武功" .. i] == 43 then --如果学习有斗转星移
- wugongnum = i --记录斗转武功位置
- break;
- end
- end
-
- --斗轉星移函數定義
- local function douzhuantest()
- if ((pid==51 and (inteam(51)) and WAR.HMXC == 0) or (pid==0 and RWWH[0]==nil and GetS(10, 0, 7, 0) == 1)
- or douzhuankekong(pid)) and WAR.AutoFight == 0 then
- return true
- else
- return false
- end
- end
- if douzhuantest()== false or (DT3(pid , 51) and WAR.HMXC > 0) or DT3(pid , 113) then --慕容和主角可控
- x = WAR.Person[WAR.CurID]["坐标X"] - x
- y = WAR.Person[WAR.CurID]["坐标Y"] - y
- WarDrawMap(0)
- end
- local fj = nil
- if WAR.DZXYLV[pid] == 110 then --斗转星移提示的文字
- if (pid == 51 and WAR.HMXC > 0) or pid == 113 then
- fj = string.format(CC.WARSHMXC, JY.Person[pid]["姓名"])
- else
- fj = string.format(CC.WARS18, JY.Person[pid]["姓名"])
- end
- elseif WAR.DZXYLV[pid] == 85 then
- fj = string.format(CC.WARS19, JY.Person[pid]["姓名"])
- elseif WAR.DZXYLV[pid] == 60 then
- fj = string.format(CC.WARS20, JY.Person[pid]["姓名"])
- end
-
- for i = 1, 10 do
- DrawStrBox(-1, 24, fj, C_ORANGE, 20 + i)
- ShowScreen()
- if i == 10 then
- lib.Delay(40)
- else
- lib.Delay(1)
- end
- end
- end
复制代码
请教douzhuantest() 的用途为何呢 ?
斗转可控与否的判断式已经有一个
douzhuankekong() 了
为何还要再一个
douzhuantest()来判断呢 ?
不好意思,因为自己搜寻整个LDCR 文件研究了两天 几万行程序代码看到都快眼花了XDD
又参考了板上二宫大的教学
真的还是无法完全理解斗转参数的应用 所以才又来发文请教~~
希望各位大大不吝指教~~
我想实现的效果比较简单一点只使用单一武功反击因此不需要做敌方武功的记录但关于单一武功的反击相关的代码我无法从斗转的语法里解析出来所以才想请教整段代码的意义
|