Skill.lua 35 KB

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