Skill.lua 36 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255
  1. local CombatImpl = require("combat.CombatImpl")
  2. local TargetMode = require("combat.TargetMode")
  3. local CombatCalc = require("combat.CombatCalc")
  4. local CombatObj = require("combat.CombatObj")
  5. local RoleDefine = require("role.RoleDefine")
  6. local CombatBuff = require("combat.CombatBuff")
  7. local CombatDefine = require("combat.CombatDefine")
  8. local BeSkill = require("combat.BeSkill")
  9. local Util = require("common.Util")
  10. local SkillExcel = require("excel.skill").skill
  11. local CmdExcel = require("excel.skill").cmd
  12. local ProjectLogic = require("platform.ProjectLogic")
  13. local BufferExcel = require("excel.buffer")
  14. function setSkill(obj,config,skinConfig)
  15. config = skinConfig or config
  16. obj.skillList = {}
  17. local skillList = obj.skillList
  18. local len = 0
  19. local skillConfig
  20. local normalAtkID = config.normalAtkID
  21. --普通技能
  22. if normalAtkID then
  23. len = len + 1
  24. skillConfig = SkillExcel[normalAtkID]
  25. obj.skillList[len] = {normalAtkID,skillConfig.cd[1] or 0,skillConfig.cd[2] or 0}--skillID,开始使用回合,冷切回合
  26. end
  27. --主动技能
  28. local temp = {}
  29. for _,skillID in ipairs(config.skillList) do
  30. len = len + 1
  31. skillConfig = SkillExcel[skillID]
  32. if not temp[skillID] and skillConfig and skillConfig.need <= obj.quality then
  33. obj.skillList[len] = {skillID,skillConfig.cd[1] or 0,skillConfig.cd[2] or 0}--skillID,开始使用回合,冷切回合
  34. temp[skillID] = 1
  35. end
  36. end
  37. if len > 1 then
  38. table.sort(obj.skillList,function(a,b)
  39. return a[3] > b[3]
  40. end)
  41. end
  42. end
  43. CMD2ID = {}
  44. function initAfterHot()
  45. for k,v in pairs(CMD2ID) do
  46. CMD2ID[k] = nil
  47. end
  48. for k,v in pairs(CmdExcel) do
  49. CMD2ID[v.cmd] = k
  50. end
  51. end
  52. function getCMD2ID(cmd)
  53. return CMD2ID[cmd]
  54. end
  55. GroupSkillCnt = 0--技能包触发技能次数
  56. local function realUse(obj, skillID, fanjiTargets,otherArgs)
  57. local skillConfig = SkillExcel[skillID]
  58. CombatImpl.nowAttacker = obj
  59. if skillConfig then
  60. --直接伤害
  61. CombatCalc.initAttacker(obj)
  62. --print("skill realuse:",obj.pos,skillID,skillConfig.targetMode[1],skillConfig.targetMode[2])
  63. local targets = TargetMode.getTargets(obj, skillConfig.targetMode, fanjiTargets, nil, true,skillConfig.type == CombatDefine.SKILL_TYPE1,skillID, true)
  64. local len = #targets
  65. if len < 1 then return end
  66. for i=1, len do
  67. local defobj = targets[i]
  68. CombatCalc.initAttacker(defobj)
  69. end
  70. GroupSkillCnt = GroupSkillCnt + 1
  71. -- 复活技能不走这里
  72. if skillConfig.cmd ~= "revive" then
  73. CombatImpl.addFrame()
  74. CombatImpl.setSkillID(obj, skillID)
  75. CombatImpl.setSaySkill(obj.pos,skillConfig.id,skillConfig.contentType)
  76. end
  77. attack(obj, targets, skillConfig)
  78. --战斗对象有分摊buff后导致会分摊debuff的修改, 如果需要更新到线上就把注释打开
  79. --targets = TargetMode.getTargets(obj, skillConfig.targetMode, fanjiTargets, nil, true, skillConfig.type == CombatDefine.SKILL_TYPE1, skillID)
  80. if not fanjiTargets and skillConfig.otherArgs.addBuffBeforeCmd then
  81. CombatBuff.onHit(obj,targets,skillConfig)
  82. end
  83. --额外作用
  84. local cmdTargets
  85. if CMD[skillConfig.cmd] then
  86. cmdTargets = CMD[skillConfig.cmd](obj, skillConfig, targets)
  87. end
  88. if not fanjiTargets then
  89. if not skillConfig.otherArgs.addBuffBeforeCmd then
  90. CombatBuff.onHit(obj,targets,skillConfig,cmdTargets,otherArgs)
  91. end
  92. end
  93. BeSkill.onHit(obj,targets,skillID)
  94. CombatImpl.totalAtkCnt = CombatImpl.totalAtkCnt + 1
  95. end
  96. CombatImpl.nowAttacker = nil
  97. end
  98. function use(obj, skillID, fanjiTargets)
  99. local skillConfig = SkillExcel[skillID]
  100. GroupSkillCnt = 0
  101. if skillConfig.type == CombatDefine.SKILL_TYPE5 then
  102. for k,v in ipairs(skillConfig.otherArgs.skillList) do
  103. local config = SkillExcel[v]
  104. local targets = TargetMode.getTargets(obj, config.targetMode,fanjiTargets, nil , true)
  105. if #targets > 0 then
  106. realUse(obj, v,fanjiTargets)
  107. return
  108. end
  109. end
  110. elseif skillConfig.type == CombatDefine.SKILL_TYPE6 then
  111. for k,v in ipairs(skillConfig.otherArgs.skillList) do
  112. local config = SkillExcel[v]
  113. local targets = TargetMode.getTargets(obj, config.targetMode,fanjiTargets, nil , true)
  114. if #targets > 0 then
  115. realUse(obj, v,fanjiTargets,{noFirst = (k ~= 1)})
  116. end
  117. end
  118. elseif skillConfig.type == CombatDefine.SKILL_TYPE7 then
  119. local r = math.random(1,10000)
  120. for k,v in ipairs(skillConfig.otherArgs.skillList) do
  121. if r <= v[1] then
  122. local config = SkillExcel[v[2]]
  123. local targets = TargetMode.getTargets(obj, config.targetMode,fanjiTargets, nil , true)
  124. if #targets > 0 then
  125. realUse(obj, v[2], fanjiTargets)
  126. end
  127. return
  128. else
  129. r = r - v[1]
  130. end
  131. end
  132. else
  133. realUse(obj, skillID,fanjiTargets)
  134. end
  135. end
  136. local hitList = {}
  137. local flagList = {}
  138. function attack(obj, targets, skillConfig)
  139. if not skillConfig.hurtRate[1] then obj.isAllCalcHp = true return end
  140. local totalHurt = 0
  141. local limitHurt = 0
  142. local fenTanHurt = 0
  143. if skillConfig.otherArgs and skillConfig.otherArgs.hurtFenTan and skillConfig.otherArgs.hurtFenTan[1] == 1 then
  144. for index = 1, #targets do
  145. local target = targets[index]
  146. if target.hp > 0 then
  147. local hurt, flag = CombatCalc.calcHurt(obj, index, targets, skillConfig)
  148. --totalHurt = totalHurt + hurt
  149. fenTanHurt = hurt--totalHurt / #targets
  150. limitHurt = CombatObj.getValue(obj,RoleDefine.ATK) * skillConfig.otherArgs.hurtFenTan[2]
  151. if fenTanHurt >= limitHurt then
  152. fenTanHurt = limitHurt
  153. end
  154. flagList[index] = flagList[index] or 0
  155. flagList[index] = flag
  156. end
  157. end
  158. end
  159. local len = 0
  160. obj.isAllCalcHp = nil
  161. if #targets == 0 then
  162. obj.isAllCalcHp = true
  163. end
  164. for index = 1, #targets do
  165. local target = targets[index]
  166. if target.hp > 0 then
  167. BeSkill.beforeHit(obj,target)
  168. local hurt,flag = nil
  169. if fenTanHurt == 0 then
  170. hurt,flag = CombatCalc.calcHurt(obj, index, targets, skillConfig)
  171. target.isShanBi = Util.getBit(flag, CombatDefine.FLAG_SHANBI)
  172. else
  173. hurt = fenTanHurt
  174. flag = flagList[index]
  175. end
  176. -- 闪避不处理目标被动技能
  177. obj.isAllCalcHp = index == #targets
  178. target.attackSkillID = skillConfig.id
  179. local hpValue,srcValue = 0,0
  180. if hurt > 0 then
  181. hpValue,srcValue = CombatObj.updateHp(target, -hurt,nil,true, obj.pos,CombatObj.SKILL_HP_TYPE)
  182. CombatObj.onHpCB(target,hpValue,obj.pos,skillConfig.id)
  183. end
  184. CombatImpl.setSkillHit(target,srcValue,nil,flag,obj,skillConfig.id)
  185. if target.isShanBi ~= 1 then
  186. len = len + 1
  187. hitList[len] = target
  188. BeSkill.afterHit(obj,target)
  189. end
  190. target.attackSkillID = nil
  191. end
  192. end
  193. -- 处理命中列表
  194. for index = 1, #targets do
  195. targets[index] = nil
  196. end
  197. for index = 1, len do
  198. targets[index] = hitList[index]
  199. end
  200. end
  201. local function calcHp(attacker,target,calcType,rate,limit,isAddHp,param, flag)
  202. local hp = CombatCalc.calcHp(attacker,target,calcType,rate, isAddHp, flag)
  203. if param and param.targetCnt then
  204. hp = hp / param.targetCnt
  205. end
  206. if limit then
  207. if hp > limit then
  208. hp = limit
  209. end
  210. end
  211. return hp
  212. end
  213. CMD = {}
  214. function CMD.hp(obj,skillConfig,skillTargets)
  215. local ret = {}
  216. local args = obj.isPet and obj.args or skillConfig.args
  217. local r = math.random(0,10000)
  218. if args[4] and r > args[4] then
  219. return
  220. end
  221. local calcType = args[1]
  222. local rate = args[2]
  223. local targets = TargetMode.getTargets(obj, args[3], skillTargets)
  224. local targetCnt = #targets
  225. local hp
  226. local limit
  227. if args[5] and args[5] > 0 then
  228. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  229. end
  230. if not obj.isPet and args[6] and args[6] > 0 then
  231. limit = args[6] * CombatObj.getHpMax(obj) / 10000
  232. end
  233. local hpAddRate = CombatObj.getValue(obj,RoleDefine.ZAOCHENG_HP_ADD_RATE) / 10000
  234. for _,target in ipairs(targets) do
  235. if not target.bufferCmd["noHp"] then
  236. hp = calcHp(obj,target,calcType,rate,limit,true)
  237. hp = hp * (1 + hpAddRate)
  238. hp = hp < 0 and 1 or hp
  239. if hp > 0 and obj.isAllCalcHp == true then
  240. if target.side == CombatDefine.DEFEND_SIDE then
  241. hp = CombatImpl.commonArgs.hpLimit or hp
  242. end
  243. local d = CombatObj.updateHp(target,hp,nil,true,obj.pos,CombatObj.EXTRA_HP_TYPE)
  244. local showHp = hp
  245. if hp > 0 and d < 0 then
  246. showHp = hp * (-1)
  247. end
  248. CombatImpl.setExtraHit(target, showHp, CMD2ID["hp"])
  249. CombatObj.onHpCB(target,d, obj.pos)
  250. end
  251. if hp < 0 then
  252. if target.side == CombatDefine.DEFEND_SIDE then
  253. hp = CombatImpl.commonArgs.hpLimit or hp
  254. end
  255. local d = CombatObj.updateHp(target,hp,nil,true,obj.pos,CombatObj.EXTRA_HP_TYPE)
  256. if hp > 0 and d < 0 then
  257. hp = hp * (-1)
  258. end
  259. CombatImpl.setExtraHit(target, hp, CMD2ID["hp"])
  260. CombatObj.onHpCB(target,d, obj.pos)
  261. end
  262. ret[#ret+1] = target
  263. end
  264. end
  265. return ret
  266. end
  267. function CMD.speedHp(obj,skillConfig,skillTargets)
  268. if not (skillTargets and skillTargets[1]) then
  269. return
  270. end
  271. local args = obj.isPet and obj.args or skillConfig.args
  272. local r = math.random(0,10000)
  273. if args[4] and r > args[4] then
  274. return
  275. end
  276. local calcType = args[1]
  277. local rate = args[2]
  278. local target = skillTargets[1]
  279. local ret = {}
  280. local hp
  281. local limit
  282. if args[5] then
  283. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  284. end
  285. local hpAddRate = CombatObj.getValue(obj,RoleDefine.ZAOCHENG_HP_ADD_RATE) / 10000
  286. local aSpeed = CombatImpl.getValue(obj,RoleDefine.SPEED)
  287. local bSpeed = CombatImpl.getValue(target,RoleDefine.SPEED)
  288. local checkSpeed = aSpeed - bSpeed
  289. if args[3] == 1 then
  290. checkSpeed = -checkSpeed
  291. end
  292. if checkSpeed > 0 then
  293. local targets = TargetMode.getTargets(obj, args[3], skillTargets)
  294. for _,target in ipairs(targets) do
  295. hp = calcHp(obj,target,calcType,rate,limit,true)
  296. hp = hp * (1 + hpAddRate)
  297. hp = hp < 0 and 1 or hp
  298. if hp ~= 0 and not target.bufferCmd["noHp"] then
  299. if target.side == CombatDefine.DEFEND_SIDE then
  300. hp = CombatImpl.commonArgs.hpLimit or hp
  301. end
  302. local d = CombatObj.updateHp(target,hp,nil,true,obj.pos,CombatObj.EXTRA_HP_TYPE)
  303. if hp > 0 and d < 0 then
  304. hp = hp * (-1)
  305. end
  306. CombatImpl.setExtraHit(target,hp,CMD2ID["hp"])
  307. CombatObj.onHpCB(target,d, obj.pos)
  308. end
  309. ret[#ret+1] = target
  310. end
  311. end
  312. return ret
  313. end
  314. function CMD.statusHp(obj,skillConfig,skillTargets)
  315. if not skillTargets then
  316. return
  317. end
  318. local isAdd = false
  319. local args = obj.isPet and obj.args or skillConfig.args
  320. for _,v in ipairs(skillTargets) do
  321. if CombatBuff.isStatus(v,args[4]) then
  322. isAdd = true
  323. break
  324. end
  325. end
  326. if not isAdd then return end
  327. local calcType = args[1]
  328. local rate = args[2]
  329. local ret = {}
  330. local hp
  331. local limit
  332. if args[5] then
  333. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  334. end
  335. local targets = TargetMode.getTargets(obj, args[3], skillTargets)
  336. for _,target in ipairs(targets) do
  337. hp = calcHp(obj,target,calcType,rate,limit,true)
  338. hp = hp < 0 and 1 or hp
  339. if hp ~= 0 and not target.bufferCmd["noHp"] then
  340. if target.side == CombatDefine.DEFEND_SIDE then
  341. hp = CombatImpl.commonArgs.hpLimit or hp
  342. end
  343. local d = CombatObj.updateHp(target,hp,nil,true,obj.pos,CombatObj.EXTRA_HP_TYPE)
  344. if hp > 0 and d < 0 then
  345. hp = hp * (-1)
  346. end
  347. CombatImpl.setExtraHit(target,hp,CMD2ID["hp"])
  348. CombatObj.onHpCB(target,d, obj.pos)
  349. end
  350. ret[#ret+1] = target
  351. end
  352. return ret
  353. end
  354. function CMD.hurt(obj,skillConfig,skillTargets)
  355. local args = obj.isPet and obj.args or skillConfig.args
  356. local r = math.random(0,10000)
  357. if r > args[4] then
  358. return
  359. end
  360. local calcType = args[1]
  361. local rate = args[2]
  362. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  363. local hp
  364. local limit
  365. local ret = {}
  366. if args[5] then
  367. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  368. end
  369. for _,target in ipairs(targets) do
  370. hp = calcHp(obj,target,calcType,rate,limit)
  371. if hp ~= 0 then
  372. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  373. if d ~= 0 then
  374. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurt"])
  375. CombatObj.onHpCB(target,d, obj.pos)
  376. ret[#ret+1] = target
  377. end
  378. end
  379. end
  380. return ret
  381. end
  382. function CMD.behurt(obj,skillConfig,skillTargets)
  383. local args = obj.isPet and obj.args or skillConfig.args
  384. local r = math.random(0,10000)
  385. if r > args[4] then
  386. return
  387. end
  388. local calcType = args[1]
  389. local rate = args[2]
  390. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  391. local hp
  392. local limit
  393. local ret = {}
  394. if args[5] then
  395. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  396. end
  397. for _,target in ipairs(targets) do
  398. if calcType ~= 17 then
  399. hp = calcHp(target,obj,calcType,rate,limit)
  400. else
  401. hp = calcHp(obj, target,calcType,rate,limit)
  402. end
  403. if hp ~= 0 then
  404. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  405. if d ~= 0 then
  406. CombatImpl.setExtraHit(target,-hp,CMD2ID["behurt"])
  407. CombatObj.onHpCB(target,d, obj.pos)
  408. ret[#ret+1] = target
  409. end
  410. end
  411. end
  412. return ret
  413. end
  414. function CMD.hurtwalun(obj,skillConfig,skillTargets)
  415. local args = obj.isPet and obj.args or skillConfig.args
  416. local r = math.random(0,10000)
  417. if r > args[4] then
  418. return
  419. end
  420. local calcType = args[1]
  421. local rate = args[2]
  422. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  423. local hp
  424. local limit
  425. local ret = {}
  426. if args[5] then
  427. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  428. end
  429. for _,target in ipairs(targets) do
  430. hp = calcHp(obj,target,calcType,rate,limit)
  431. if hp ~= 0 then
  432. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  433. if d ~= 0 then
  434. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtwalun"])
  435. CombatObj.onHpCB(target,d, obj.pos)
  436. ret[#ret+1] = target
  437. end
  438. end
  439. end
  440. return ret
  441. end
  442. function CMD.posHurt(obj,skillConfig,skillTargets)
  443. local args = obj.isPet and obj.args or skillConfig.args
  444. local r = math.random(0,10000)
  445. if r > args[4] then
  446. return
  447. end
  448. local calcType = args[1]
  449. local rate = args[2]
  450. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  451. local hp
  452. local limit
  453. local ret = {}
  454. if args[5] then
  455. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  456. end
  457. local posList = args[6]
  458. if posList == nil then
  459. return
  460. end
  461. for _,target in ipairs(targets) do
  462. local bfind = false
  463. for k, v in pairs(posList) do
  464. if v == target.pos then
  465. bfind = true
  466. break
  467. end
  468. end
  469. if bfind then
  470. hp = calcHp(obj,target,calcType,rate,limit, false)
  471. if hp ~= 0 then
  472. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  473. if d ~= 0 then
  474. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurt"])
  475. CombatObj.onHpCB(target,d, obj.pos)
  476. ret[#ret+1] = target
  477. end
  478. end
  479. end
  480. end
  481. return ret
  482. end
  483. function CMD.hurtxia(obj,skillConfig,skillTargets)
  484. local args = obj.isPet and obj.args or skillConfig.args
  485. local r = math.random(0,10000)
  486. if r > args[4] then
  487. return
  488. end
  489. local calcType = args[1]
  490. local rate = args[2]
  491. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  492. local hp
  493. local limit
  494. local ret = {}
  495. if args[5] then
  496. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  497. end
  498. for _,target in ipairs(targets) do
  499. hp = calcHp(obj,target,calcType,rate,limit)
  500. if hp ~= 0 then
  501. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  502. if d ~= 0 then
  503. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtxia"])
  504. CombatObj.onHpCB(target,d, obj.pos)
  505. ret[#ret+1] = target
  506. end
  507. end
  508. end
  509. return ret
  510. end
  511. function CMD.hurtmingli(obj,skillConfig,skillTargets)
  512. local args = obj.isPet and obj.args or skillConfig.args
  513. local r = math.random(0,10000)
  514. if r > args[4] then
  515. return
  516. end
  517. local calcType = args[1]
  518. local rate = args[2]
  519. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  520. local hp
  521. local limit
  522. local ret = {}
  523. if args[5] then
  524. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  525. end
  526. for _,target in ipairs(targets) do
  527. hp = calcHp(obj,target,calcType,rate,limit)
  528. if hp ~= 0 then
  529. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  530. if d ~= 0 then
  531. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtmingli"])
  532. CombatObj.onHpCB(target,d, obj.pos)
  533. ret[#ret+1] = target
  534. end
  535. end
  536. end
  537. return ret
  538. end
  539. function CMD.hurtmingli2(obj,skillConfig,skillTargets)
  540. local args = obj.isPet and obj.args or skillConfig.args
  541. local r = math.random(0,10000)
  542. if r > args[4] then
  543. return
  544. end
  545. local calcType = args[1]
  546. local rate = args[2]
  547. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  548. local hp
  549. local limit
  550. local ret = {}
  551. if args[5] then
  552. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  553. end
  554. for _,target in ipairs(targets) do
  555. hp = calcHp(obj,target,calcType,rate,limit)
  556. if hp ~= 0 then
  557. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  558. if d ~= 0 then
  559. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtmingli2"])
  560. CombatObj.onHpCB(target,d, obj.pos)
  561. ret[#ret+1] = target
  562. end
  563. end
  564. end
  565. return ret
  566. end
  567. function CMD.hurtguangci(obj,skillConfig,skillTargets)
  568. local args = obj.isPet and obj.args or skillConfig.args
  569. local r = math.random(0,10000)
  570. if r > args[4] then
  571. return
  572. end
  573. local calcType = args[1]
  574. local rate = args[2]
  575. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  576. local hp
  577. local limit
  578. local ret = {}
  579. if args[5] then
  580. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  581. end
  582. for _,target in ipairs(targets) do
  583. hp = calcHp(obj,target,calcType,rate,limit)
  584. if hp ~= 0 then
  585. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  586. if d ~= 0 then
  587. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtguangci"])
  588. CombatObj.onHpCB(target,d, obj.pos)
  589. ret[#ret+1] = target
  590. end
  591. end
  592. end
  593. return ret
  594. end
  595. function CMD.jobHurt(obj,skillConfig,skillTargets)
  596. local args = obj.isPet and obj.args or skillConfig.args
  597. local calcType = args[1]
  598. local rate = args[2]
  599. local r = math.random(0,10000)
  600. if r > args[3] then
  601. return
  602. end
  603. local job = args[4]
  604. local hp
  605. local limit
  606. if args[5] then
  607. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  608. end
  609. local ret = {}
  610. for _,target in ipairs(skillTargets) do
  611. if target.job == job then
  612. hp = calcHp(obj,target,calcType,rate,limit)
  613. if hp and hp ~= 0 then
  614. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  615. if d ~= 0 then
  616. CombatImpl.setExtraHit(target,-hp,CMD2ID["jobHurt"])
  617. CombatObj.onHpCB(target,d, obj.pos)
  618. ret[#ret+1] = target
  619. end
  620. end
  621. end
  622. end
  623. return ret
  624. end
  625. function CMD.statusHurt(obj,skillConfig,skillTargets)
  626. local args = obj.isPet and obj.args or skillConfig.args
  627. local calcType = args[1]
  628. local rate = args[2]
  629. local r = math.random(0,10000)
  630. if r > args[3] then
  631. return
  632. end
  633. local status = args[4]
  634. local hp
  635. local limit
  636. if args[5] then
  637. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  638. end
  639. local ret = {}
  640. for _,target in ipairs(skillTargets) do
  641. if CombatBuff.isStatus(target, status) then
  642. hp = calcHp(obj,target,calcType,rate,limit)
  643. if hp and hp ~= 0 then
  644. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  645. if d ~= 0 then
  646. CombatImpl.setExtraHit(target,-hp,CMD2ID["jobHurt"])
  647. CombatObj.onHpCB(target,d, obj.pos)
  648. ret[#ret+1] = target
  649. end
  650. end
  651. end
  652. end
  653. return ret
  654. end
  655. function CMD.hpHurt(obj,skillConfig,skillTargets)
  656. local args = obj.isPet and obj.args or skillConfig.args
  657. local calcType = args[1]
  658. local rate = args[2]
  659. local hpRate = args[3]/10000
  660. local ret = {}
  661. for _,target in ipairs(skillTargets) do
  662. local hpLimit = CombatObj.getHpMax(target) * hpRate
  663. if target.hp >= hpLimit then
  664. hp = calcHp(obj,target,calcType,rate)
  665. if hp and hp ~= 0 then
  666. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  667. if d ~= 0 then
  668. CombatImpl.setExtraHit(target,-hp,CMD2ID["hpHurt"])
  669. CombatObj.onHpCB(target,d, obj.pos)
  670. ret[#ret+1] = target
  671. end
  672. end
  673. end
  674. end
  675. return ret
  676. end
  677. function CMD.fanji(obj,skillConfig,skillTargets)
  678. if CombatImpl.isFanji or CombatImpl.comboType > 0 then return end
  679. if CombatBuff.isStatus(obj,{"xuanyun","shihua","bingdong"}) then return end
  680. if obj.side == skillTargets[1].side then
  681. return
  682. end
  683. if obj.hp > 0 then
  684. local r = math.random(0,10000)
  685. if r < skillConfig.args[2] then
  686. CombatImpl.fanjiList[#CombatImpl.fanjiList + 1] = {obj,skillConfig.args[1],skillTargets}
  687. end
  688. end
  689. end
  690. function CMD.qingsuan(obj,skillConfig,skillTargets)
  691. if obj.isPet then return {} end
  692. local args = skillConfig.args
  693. local r = math.random(0,10000)
  694. if r > args[3] then
  695. return
  696. end
  697. local rate = args[1]
  698. local limit
  699. if args[4] then
  700. limit = args[4] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  701. end
  702. local targets = TargetMode.getTargets(obj, args[2],skillTargets)
  703. local ret = {}
  704. for _,target in ipairs(targets) do
  705. local baseValue = CombatBuff.qingsuan(target)
  706. if baseValue > 0 then
  707. local hurt = baseValue * rate / 10000
  708. if limit and hurt > limit then
  709. hurt = limit
  710. end
  711. local d = CombatObj.updateHp(target,-hurt,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  712. CombatImpl.setExtraHit(target,-hurt,CMD2ID["qingsuan"])
  713. CombatObj.onHpCB(target,d, obj.pos)
  714. ret[#ret+1] = target
  715. end
  716. end
  717. return ret
  718. end
  719. function CMD.jiekong(obj,skillConfig,skillTargets)
  720. if obj.isPet then return {} end
  721. local args = skillConfig.args
  722. local r = math.random(0,10000)
  723. if r > args[2] then
  724. return
  725. end
  726. local targets = TargetMode.getTargets(obj, args[1],skillTargets)
  727. local ret = {}
  728. for _,target in ipairs(targets) do
  729. CombatBuff.jiekong(target)
  730. ret[#ret+1] = target
  731. end
  732. return ret
  733. end
  734. function CMD.groupcmd(obj,skillConfig,skillTargets)
  735. if obj.isPet then return {} end
  736. for k,v in ipairs(skillConfig.args) do
  737. local cmd = v[1]
  738. local conf = {args = v[2]}
  739. if CMD[cmd] then
  740. CMD[cmd](obj,conf,skillTargets)
  741. end
  742. end
  743. return {}
  744. end
  745. function CMD.randcmd(obj,skillConfig,skillTargets)
  746. if obj.isPet then return {} end
  747. local total = 0
  748. for k,v in ipairs(skillConfig.args) do
  749. total = total + v[3]
  750. end
  751. local r = math.random(0,total)
  752. for k,v in ipairs(skillConfig.args) do
  753. if r <= v[3] then
  754. local cmd = v[1]
  755. local conf = {args = v[2]}
  756. if CMD[cmd] then
  757. CMD[cmd](obj,conf,skillTargets)
  758. end
  759. break
  760. else
  761. r = r - v[1]
  762. end
  763. end
  764. return {}
  765. end
  766. function CMD.qusan(obj,skillConfig,skillTargets)
  767. if obj.isPet then return {} end
  768. local args = skillConfig.args
  769. local r = math.random(0,10000)
  770. if r > args[3] then
  771. return
  772. end
  773. local qusanType = args[1]
  774. local calcType = args[5] and args[5][1]
  775. local rate = args[5] and args[5][2]
  776. local buffers = args[8] and args[8][1]
  777. local targets = TargetMode.getTargets(obj, args[2],skillTargets)
  778. local ret = {}
  779. if args[7] then
  780. limit = args[7] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  781. end
  782. for _,target in ipairs(targets) do
  783. local cnt = CombatBuff.qusan(target, qusanType,args[4])
  784. if limit then
  785. limit = limit * cnt
  786. end
  787. if buffers and cnt > 0 then
  788. local targets = TargetMode.getTargets(obj, args[8][2],skillTargets)
  789. CombatBuff.qusanAddBuff(obj, targets, buffers)
  790. end
  791. ret[#ret+1] = target
  792. if calcType and rate and cnt > 0 then
  793. local hp = calcHp(obj,target,calcType,rate * cnt, limit, nil, nil, args[6])
  794. if hp ~= 0 then
  795. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  796. if d ~= 0 then
  797. CombatImpl.setExtraHit(target,-hp,CMD2ID["qusan"])
  798. CombatObj.onHpCB(target,d, obj.pos)
  799. end
  800. end
  801. end
  802. end
  803. return ret
  804. end
  805. function CMD.hurtwalun2(obj,skillConfig,skillTargets)
  806. local args = obj.isPet and obj.args or skillConfig.args
  807. local r = math.random(0,10000)
  808. if r > args[4] then
  809. return
  810. end
  811. local calcType = args[1]
  812. local rate = args[2]
  813. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  814. local hp
  815. local limit
  816. local ret = {}
  817. if args[5] then
  818. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  819. end
  820. for _,target in ipairs(targets) do
  821. hp = calcHp(obj,target,calcType,rate,limit)
  822. if hp ~= 0 then
  823. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  824. if d ~= 0 then
  825. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtwalun2"])
  826. CombatObj.onHpCB(target,d, obj.pos)
  827. ret[#ret+1] = target
  828. end
  829. end
  830. end
  831. return ret
  832. end
  833. function CMD.hurtxia2(obj,skillConfig,skillTargets)
  834. local args = obj.isPet and obj.args or skillConfig.args
  835. local r = math.random(0,10000)
  836. if r > args[4] then
  837. return
  838. end
  839. local calcType = args[1]
  840. local rate = args[2]
  841. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  842. local hp
  843. local limit
  844. local ret = {}
  845. if args[5] then
  846. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  847. end
  848. for _,target in ipairs(targets) do
  849. hp = calcHp(obj,target,calcType,rate,limit)
  850. if hp ~= 0 then
  851. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  852. if d ~= 0 then
  853. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtxia2"])
  854. CombatObj.onHpCB(target,d, obj.pos)
  855. ret[#ret+1] = target
  856. end
  857. end
  858. end
  859. return ret
  860. end
  861. function CMD.hurtxia3(obj,skillConfig,skillTargets)
  862. local args = obj.isPet and obj.args or skillConfig.args
  863. local r = math.random(0,10000)
  864. if r > args[4] then
  865. return
  866. end
  867. local calcType = args[1]
  868. local rate = args[2]
  869. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  870. local hp
  871. local limit
  872. local ret = {}
  873. if args[5] then
  874. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  875. end
  876. for _,target in ipairs(targets) do
  877. hp = calcHp(obj,target,calcType,rate,limit)
  878. if hp ~= 0 then
  879. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  880. if d ~= 0 then
  881. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtxia3"])
  882. CombatObj.onHpCB(target,d, obj.pos)
  883. ret[#ret+1] = target
  884. end
  885. end
  886. end
  887. return ret
  888. end
  889. NO_SKILL_CHECK_COMBO_LIST = {
  890. ["hp"] = 1,
  891. ["revive"] = 1,
  892. ["baohu"] = 1,
  893. }
  894. function skillIsHpOrRevive(argSkillID)
  895. local argSkillConf = SkillExcel[argSkillID]
  896. if not argSkillConf then return end
  897. -- 带有伤害
  898. if argSkillConf.hurtRate[1] then return end
  899. if argSkillConf.continuous and argSkillConf.continuous == 1 then return true end
  900. if NO_SKILL_CHECK_COMBO_LIST[argSkillConf.cmd] then
  901. return true
  902. end
  903. local bRet = false
  904. if argSkillConf.cmd == "groupcmd" then
  905. for k,v in ipairs(argSkillConf.args) do
  906. local cmd = v[1]
  907. if cmd == "hurt" then return end
  908. if NO_SKILL_CHECK_COMBO_LIST[cmd] then
  909. bRet = true
  910. end
  911. end
  912. end
  913. -- 技能包
  914. if argSkillConf.type == CombatDefine.SKILL_TYPE5 or
  915. argSkillConf.type == CombatDefine.SKILL_TYPE6 or
  916. argSkillConf.type == CombatDefine.SKILL_TYPE7 then
  917. for k,v in ipairs(argSkillConf.otherArgs.skillList) do
  918. local config = SkillExcel[v]
  919. -- 带有伤害
  920. if config and config.hurtRate[1] then return end
  921. if config then
  922. if NO_SKILL_CHECK_COMBO_LIST[config.cmd] or config.continuous == 1 then
  923. bRet = true
  924. end
  925. for k,v in ipairs(config.buffers) do
  926. local bufConfig = BufferExcel.buffer[v[1]]
  927. -- 带有伤害
  928. if bufConfig and NO_SKILL_CHECK_COMBO_LIST[bufConfig.cmd] then
  929. bRet = true
  930. end
  931. end
  932. end
  933. end
  934. for k,v in ipairs(argSkillConf.buffers) do
  935. local bufConfig = BufferExcel[v[1]]
  936. -- 带有伤害
  937. if bufConfig and NO_SKILL_CHECK_COMBO_LIST[bufConfig.cmd] then
  938. bRet = true
  939. end
  940. end
  941. end
  942. return bRet
  943. end
  944. function CMD.combo(obj,skillConfig,skillTargets)
  945. -- 二次元 屏蔽 治疗 复活的连击
  946. if ProjectLogic.isSsecy() then
  947. local argSkillID = skillConfig.args[3] or CombatImpl.getSkillID(obj)
  948. if skillIsHpOrRevive(argSkillID) then
  949. return
  950. end
  951. if skillIsHpOrRevive(skillConfig.id) then
  952. return
  953. end
  954. end
  955. if CombatImpl.isFanji or CombatImpl.comboType > 0 then return end
  956. if GroupSkillCnt ~= 1 then return end--技能包首次技能攻击才能触发
  957. local r = math.random(0,10000)
  958. if r < skillConfig.args[1] then
  959. CombatImpl.comboList[#CombatImpl.comboList + 1] = {obj, 1, skillConfig.args[2], skillConfig.args[3],skillConfig.args[4] or 1, skillConfig.args[5]}
  960. return true
  961. end
  962. end
  963. --
  964. function CMD.comboFight(obj,skillConfig,skillTargets)
  965. -- 二次元 屏蔽 治疗 复活的连击
  966. if ProjectLogic.isSsecy() then
  967. local argSkillID = skillConfig.args[3] or CombatImpl.getSkillID(obj)
  968. if skillIsHpOrRevive(argSkillID) then
  969. return
  970. end
  971. if skillIsHpOrRevive(skillConfig.id) then
  972. return
  973. end
  974. end
  975. if CombatImpl.isFanji then return end
  976. if GroupSkillCnt ~= 1 then return end--技能包首次技能攻击才能触发
  977. local r = math.random(0,10000)
  978. if r < skillConfig.args[1] then
  979. CombatImpl.comboList[#CombatImpl.comboList + 1] = {obj, 1, skillConfig.args[2], skillConfig.args[3],skillConfig.args[4] or 1, skillConfig.args[5]}
  980. return true
  981. end
  982. end
  983. function CMD.combo1(obj,skillConfig,skillTargets)
  984. -- 二次元 屏蔽 治疗 复活的连击
  985. if ProjectLogic.isSsecy() then
  986. local argSkillID = skillConfig.args[3] or CombatImpl.getSkillID(obj)
  987. if skillIsHpOrRevive(skillConfig) then
  988. return
  989. end
  990. if skillIsHpOrRevive(skillConfig.id) then
  991. return
  992. end
  993. end
  994. if CombatImpl.isFanji or CombatImpl.comboType > 0 then return end
  995. if GroupSkillCnt ~= 1 then return end--技能包首次技能攻击才能触发
  996. local r = math.random(0,10000)
  997. if r < skillConfig.args[1] then
  998. CombatImpl.comboList[#CombatImpl.comboList + 1] = {obj, 1, skillConfig.args[2], skillConfig.args[3],2}
  999. return true
  1000. end
  1001. end
  1002. function CMD.combo2(obj,skillConfig,skillTargets)
  1003. -- 二次元 屏蔽 治疗 复活的连击
  1004. if ProjectLogic.isSsecy() then
  1005. local argSkillID = skillConfig.args[3] or CombatImpl.getSkillID(obj)
  1006. if skillIsHpOrRevive(argSkillID) then
  1007. return
  1008. end
  1009. if skillIsHpOrRevive(skillConfig.id) then
  1010. return
  1011. end
  1012. end
  1013. if CombatImpl.isFanji or CombatImpl.comboType > 0 then return end
  1014. if GroupSkillCnt ~= 1 then return end--技能包首次技能攻击才能触发
  1015. local r = math.random(0,10000)
  1016. if r < skillConfig.args[1] then
  1017. CombatImpl.comboList[#CombatImpl.comboList + 1] = {obj, 1, skillConfig.args[2], skillConfig.args[3],3}
  1018. return true
  1019. end
  1020. end
  1021. function CMD.comboNormal(obj, skillConfig, skillTargets)
  1022. -- 二次元 屏蔽 治疗 复活的连击
  1023. if ProjectLogic.isSsecy() then
  1024. local argSkillID = skillConfig.args[3] or CombatImpl.getNormalSkill(obj)
  1025. if skillIsHpOrRevive(argSkillID) then
  1026. return
  1027. end
  1028. if skillIsHpOrRevive(skillConfig.id) then
  1029. return
  1030. end
  1031. end
  1032. if CombatImpl.comboType > 0 then return end
  1033. if CombatImpl.isFanji then
  1034. if GroupSkillCnt > 2 then return end
  1035. else
  1036. if GroupSkillCnt ~= 1 then return end--技能包首次技能攻击才能触发
  1037. end
  1038. local r = math.random(0,10000)
  1039. if r < skillConfig.args[1] then
  1040. CombatImpl.comboList[#CombatImpl.comboList + 1] = {obj, 2, skillConfig.args[2], skillConfig.args[3],skillConfig.args[4] or 1}
  1041. end
  1042. end
  1043. function CMD.attrcomboAgain(obj, skillConfig, skillTargets)
  1044. local tComboCof = nil
  1045. for _, v in ipairs(skillConfig.args) do
  1046. if v[1] == 2 then
  1047. tComboCof = v
  1048. break
  1049. end
  1050. end
  1051. if not tComboCof then
  1052. print("[CMD.attrcomboAgain] 不存在连击配置")
  1053. return
  1054. end
  1055. --table.print_lua_table(tComboCof)
  1056. --print("[CMD.attrcomboAgain] 打印完成")
  1057. -- 二次元 屏蔽 治疗 复活的连击
  1058. if ProjectLogic.isSsecy() then
  1059. local argSkillID = tComboCof[3] or CombatImpl.getSkillID(obj)
  1060. if skillIsHpOrRevive(argSkillID) then
  1061. return
  1062. end
  1063. if skillIsHpOrRevive(skillConfig.id) then
  1064. return
  1065. end
  1066. end
  1067. local nSkillID = tComboCof[3] or CombatImpl.getSkillID(obj)
  1068. if CombatImpl.isFanji or CombatImpl.comboType > 0 then return end
  1069. if GroupSkillCnt ~= 1 then return end--技能包首次技能攻击才能触发
  1070. local r = math.random(0,10000)
  1071. --print("[CMD.attrcomboAgain] nSkillID = "..nSkillID)
  1072. if r < tComboCof[2] then
  1073. CombatImpl.comboList[#CombatImpl.comboList + 1] = {obj, 1, tComboCof[3], nSkillID, tComboCof[5] or 1, tComboCof[6]}
  1074. return true
  1075. end
  1076. end
  1077. function CMD.baohu(obj,skillConfig,skillTargets)
  1078. local d = CombatObj.updateHp(obj,obj.baohuHurt,nil,nil, obj.pos,CombatObj.BUFFER_HP_TYPE)
  1079. if d ~= 0 then
  1080. local attrs = {}
  1081. attrs[RoleDefine.BAOHU_COMBAT] = skillTargets[1].pos
  1082. CombatImpl.setExtraHit(obj,d,CMD2ID["baohu"],attrs)
  1083. CombatObj.onHpCB(obj,d, skillTargets[1].pos)
  1084. end
  1085. end
  1086. function CMD.yinbaoZuzhou(obj,skillConfig,skillTargets)
  1087. CombatBuff.yinbaoZuzhou(obj, skillTargets, skillConfig)
  1088. end
  1089. --指定普攻目标模式
  1090. function CMD.normalTarget(obj,skillConfig)
  1091. obj.normalTarget = {status = {}}
  1092. if skillConfig.args.status then
  1093. for k,v in ipairs(skillConfig.args.status) do
  1094. obj.normalTarget.status[k] = v
  1095. end
  1096. end
  1097. end
  1098. --诅咒附加伤害
  1099. function CMD.zuzhouHurt(obj, skillConfig, skillTargets)
  1100. if not obj.args then return end
  1101. local confArgs = skillConfig.args
  1102. local targets = TargetMode.getTargets(obj, confArgs[1], skillTargets)
  1103. local zuzhouHurt = obj.args * confArgs[2] / 10000
  1104. for _,target in ipairs(targets) do
  1105. if zuzhouHurt ~= 0 then
  1106. local d = CombatObj.updateHp(target,-zuzhouHurt,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  1107. if d ~= 0 then
  1108. CombatImpl.setExtraHit(target,-zuzhouHurt,CMD2ID["zuzhouHurt"])
  1109. CombatObj.onHpCB(target,d, obj.pos)
  1110. end
  1111. end
  1112. end
  1113. obj.args = nil
  1114. end
  1115. function CMD.dnexhurt(obj,skillConfig,skillTargets)
  1116. local args = obj.isPet and obj.args or skillConfig.args
  1117. local r = math.random(0,10000)
  1118. if r > args[4] then
  1119. return
  1120. end
  1121. local calcType = args[1]
  1122. local rate = args[2]
  1123. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  1124. local hp
  1125. local limit
  1126. local ret = {}
  1127. if args[5] then
  1128. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK)
  1129. end
  1130. for _,target in ipairs(targets) do
  1131. hp = calcHp(obj,target,calcType,rate,limit)
  1132. if hp ~= 0 then
  1133. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  1134. if d ~= 0 then
  1135. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurt"])
  1136. CombatObj.onHpCB(target,d, obj.pos)
  1137. ret[#ret+1] = target
  1138. end
  1139. end
  1140. end
  1141. return ret
  1142. end