Skill.lua 38 KB

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