TargetMode.lua 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198
  1. ----------------------------------
  2. -- 对象选择
  3. ----------------------------------
  4. local CombatImpl = require("combat.CombatImpl")
  5. local CombatObj = require("combat.CombatObj")
  6. local CombatDefine = require("combat.CombatDefine")
  7. local RoleDefine = require("role.RoleDefine")
  8. local CombatBuff = require("combat.CombatBuff")
  9. local SkillExcel = require("excel.skill").skill
  10. local targets = {}
  11. local handler = {} --选择策略
  12. --对象选择器begin
  13. --[[
  14. ret = 0,1,2 // 0:需要继承skilltargets 1:敌方 2 : 己方
  15. ]]
  16. local function getTargetSide(attacker,targetMode)
  17. if not targetMode[2] or targetMode[2] == 0 then
  18. return 0
  19. elseif targetMode[2] == 1 then
  20. if attacker.side == CombatDefine.ATTACK_SIDE then
  21. return CombatDefine.DEFEND_SIDE
  22. else
  23. return CombatDefine.ATTACK_SIDE
  24. end
  25. elseif targetMode[2] == 2 then
  26. return attacker.side
  27. end
  28. end
  29. local function canTarget(obj)
  30. if obj and obj.hp and obj.hp > 0 and not CombatBuff.isStatus(obj,{"revive"}) and CombatDefine.isBackup(obj) ~= CombatDefine.BACKUP_TYPE1 then
  31. return true
  32. end
  33. end
  34. local function getObj(pos)
  35. -- 不能直接取 援军对象
  36. if pos == CombatDefine.BACKUP_POS[1] or pos == CombatDefine.BACKUP_POS[2] then return end
  37. local obj = CombatImpl.objList[pos]
  38. local backupPos = pos < CombatDefine.COMBAT_HERO_CNT and CombatDefine.BACKUP_POS[1] or CombatDefine.BACKUP_POS[2]
  39. local backupObj = CombatImpl.objList[backupPos]
  40. -- 援军已上场
  41. if backupObj and backupObj.backupPos == pos then
  42. return backupObj
  43. end
  44. return obj
  45. end
  46. local function handlerInit(attacker, targetMode)
  47. -- 清除分摊标志
  48. attacker.handBuffCalcType = nil
  49. for _, pos in ipairs(CombatDefine.SIDE2POS[0]) do
  50. local obj = getObj(pos)
  51. if obj then
  52. obj.fentq = nil
  53. end
  54. end
  55. end
  56. -- 处理所有对象是否需要分摊
  57. local function handlerFenTan(attacker, targetMode, skillTargets, cmdTargets, skillID)
  58. if #targets <= 0 then return end
  59. if skillID then
  60. local skillConfig = SkillExcel[skillID]
  61. if skillConfig then
  62. if skillConfig.otherArgs and skillConfig.otherArgs.hurtFenTan then
  63. return
  64. end
  65. end
  66. end
  67. local tagObj = targets[1]
  68. local targetSide = tagObj.side
  69. local fentq = {}
  70. local fentCnt = 0
  71. for _, pos in ipairs(CombatDefine.SIDE2POS[targetSide]) do
  72. local obj = getObj(pos)
  73. if obj and canTarget(obj) and obj.bufferCmd["fentan"] then
  74. fentq[pos] = 1
  75. fentCnt = fentCnt + 1
  76. end
  77. end
  78. -- 分摊比列
  79. for _, pos in ipairs(CombatDefine.SIDE2POS[targetSide]) do
  80. local obj = getObj(pos)
  81. if obj and canTarget(obj) and obj.bufferCmd["fentan"] then
  82. obj.fentq = fentCnt
  83. -- 把不在队列的分摊对象加入到队列当中
  84. local find = false
  85. for _, tarobj in ipairs(targets) do
  86. if tarobj.pos == obj.pos then
  87. find = true
  88. end
  89. end
  90. if not find then
  91. targets[#targets + 1] = obj
  92. end
  93. end
  94. end
  95. end
  96. local function handlerHunluan(attacker,targetMode)
  97. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  98. local len = 0
  99. local selectList = {}
  100. for pos = 1,CombatDefine.COMBAT_HERO_ALL_CNT do
  101. local obj = getObj(pos)
  102. if canTarget(obj) then
  103. len = len + 1
  104. selectList[len] = obj
  105. end
  106. end
  107. -- 混乱要随机选择目标 modify buy dxzeng
  108. local randomLen = #selectList
  109. if randomLen <= 0 or cnt <= 0 then return end
  110. if cnt > randomLen then
  111. cnt = randomLen
  112. end
  113. for index = 1, cnt do
  114. local len = 0
  115. local tempRandom = {}
  116. for k, v in pairs(selectList) do
  117. len = len + 1
  118. tempRandom[len] = k
  119. end
  120. local randomIndex = math.random(1, len)
  121. local selectIndex = tempRandom[randomIndex]
  122. targets[#targets+1] = selectList[selectIndex]
  123. selectList[selectIndex] = nil
  124. end
  125. end
  126. local function handlerStatus(attacker,status)
  127. local targetSide
  128. if attacker.side == CombatDefine.ATTACK_SIDE then
  129. targetSide = CombatDefine.DEFEND_SIDE
  130. else
  131. targetSide = CombatDefine.ATTACK_SIDE
  132. end
  133. for _,pos in ipairs(CombatDefine.SIDE2POS[targetSide]) do
  134. local obj = getObj(pos)
  135. if canTarget(obj) and CombatBuff.isStatus(obj,status) then
  136. targets[#targets+1] = obj
  137. return
  138. end
  139. end
  140. end
  141. --
  142. CAN_EMPTY_TARGET = { [22] = 1 }
  143. function getTargets(attacker, targetMode, skillTargets, cmdTargets, checkChaofen, isNormalAtk, skillID, isNeedFentanObjs)
  144. for i = 1, #targets do
  145. targets[i] = nil
  146. end
  147. handlerInit(attacker, targetMode)
  148. if isNormalAtk then
  149. local isStatus, cmd, ind = CombatBuff.isStatus(attacker, { "tiaoxin" })
  150. if isStatus then
  151. local buffer = attacker.buffer[ind]
  152. local target = buffer.attackPos and getObj(buffer.attackPos)
  153. if canTarget(target) then
  154. targets[#targets + 1] = target
  155. end
  156. elseif attacker.normalTarget and attacker.normalTarget.status then
  157. handlerStatus(attacker, attacker.normalTarget.status)
  158. end
  159. end
  160. if targets[1] == nil then
  161. if checkChaofen then
  162. -- 检查是否被嘲讽
  163. local chaofen, fromPos = CombatBuff.isChaofen(attacker)
  164. if chaofen then
  165. local obj = getObj(fromPos)
  166. if canTarget(obj) and obj.pos ~= attacker.pos then
  167. return { obj }, true
  168. end
  169. end
  170. end
  171. if skillID and CombatBuff.isStatus(attacker, { "hunluan" }) and CombatImpl.isFanji == false then
  172. handlerHunluan(attacker, targetMode)
  173. elseif handler[targetMode[1]] then
  174. handler[targetMode[1]](attacker, targetMode, skillTargets, cmdTargets, skillID)
  175. end
  176. if not CAN_EMPTY_TARGET[targetMode[1]] and targetMode[2] == 1 and targets[1] == nil and targetMode[1] ~= 32 then
  177. handler[1](attacker, targetMode, skillTargets)
  178. end
  179. --战斗对象有分摊buff后导致会分摊debuff的修改, 如果需要更新到线上就把注释打开
  180. if isNeedFentanObjs then
  181. handlerFenTan(attacker, targetMode, skillTargets, cmdTargets, skillID)
  182. end
  183. end
  184. local ret = { }
  185. for _, v in ipairs(targets) do
  186. ret[#ret + 1] = v
  187. end
  188. return ret
  189. end
  190. local function getTargetList(side,isSkillTarget,exclude,skillTargets)
  191. local targetList = {}
  192. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[side]) do
  193. local obj = getObj(pos)
  194. if canTarget(obj) then
  195. targetList[#targetList+1] = obj
  196. end
  197. end
  198. if isSkillTarget ~= 1 then
  199. local skillTargetList = {}
  200. for _,obj in ipairs(skillTargets) do
  201. skillTargetList[#skillTargetList + 1] = obj
  202. end
  203. if exclude == 1 then
  204. targetList = skillTargetList
  205. else
  206. --从targetList中剔除skillTargetList
  207. for _,obj in ipairs(skillTargetList) do
  208. for i = 1,#targetList do
  209. if targetList[i].pos == obj.pos then
  210. table.remove(targetList,i)
  211. break
  212. end
  213. end
  214. end
  215. end
  216. end
  217. return targetList
  218. end
  219. local function getAllTargetList(side)
  220. local targetList = {}
  221. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[side]) do
  222. local obj = getObj(pos)
  223. if obj then
  224. targetList[#targetList+1] = obj
  225. end
  226. end
  227. return targetList
  228. end
  229. -- 全体目标
  230. --[[
  231. @param2 = {
  232. handlerID,
  233. side 0: 全部双方 1:敌方 2: 己方
  234. isSkillTarget 1:非 2:是;默认1
  235. exclude 1: 否 2:是 和isSkillTarget关联,是skillTarget还是取非skillTarget
  236. }
  237. @param3 = targetObjList 技能目标(所有目标)
  238. ]]
  239. local function handler2(attacker,targetMode,skillTargets)
  240. local targetSide = getTargetSide(attacker,targetMode)
  241. -- 如果传入有skillTarget 优先使用技能所带的target集合
  242. local isSkillTarget = targetMode[3] or 1
  243. local exclude = targetMode[4] or 1
  244. local targetList = getTargetList(targetSide,isSkillTarget,exclude,skillTargets)
  245. -- 转化为目标target
  246. for _,obj in ipairs (targetList) do
  247. targets[#targets + 1] = obj
  248. end
  249. end
  250. -- 自己
  251. local function handler10(attacker)
  252. --if canTarget(obj) then
  253. targets[1] = attacker
  254. --end
  255. end
  256. -- 选择指定排号
  257. --[[
  258. @param2 = {
  259. handlerID,
  260. side,
  261. cnt,
  262. {1,2}
  263. }
  264. ]]
  265. local function handler28(attacker,targetMode)
  266. local targetSide = getTargetSide(attacker,targetMode)
  267. -- 若没有配置默认攻击全部排
  268. local rowList = targetMode[4] or {1,2,3}
  269. local targetPosList = {}
  270. -- 待优化@mafei
  271. for row,list in pairs(CombatDefine.ROW2POS[targetSide]) do
  272. if table.find(rowList,row) then
  273. for _,pos in pairs(list) do
  274. table.insert(targetPosList,pos)
  275. end
  276. end
  277. end
  278. local cnt = targetMode[3]
  279. -- 随机打乱排序
  280. table.shuffle(targetPosList)
  281. for _,pos in ipairs(targetPosList) do
  282. local obj = getObj(pos)
  283. if canTarget(obj) and obj.pos ~= attacker.pos then
  284. targets[#targets+1] = obj
  285. end
  286. if #targets >= cnt then
  287. return
  288. end
  289. end
  290. end
  291. -- 随机选择X个目标
  292. --[[
  293. @param2 = {
  294. handlerID,
  295. side,
  296. cnt, 选择的数量 默认为1
  297. isSelf 0/默认:不做判定 1:不能选择自己, 2:必须有自己
  298. }
  299. ]]
  300. local function handler6(attacker,targetMode)
  301. local targetSide = getTargetSide(attacker,targetMode)
  302. -- 默认选择一个
  303. local cnt = targetMode[3] or 1
  304. local noSelf = targetMode[4] or 0
  305. local targetList = {}
  306. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  307. local obj = getObj(pos)
  308. if canTarget(obj) then
  309. targetList[#targetList+1] = obj
  310. end
  311. end
  312. if noSelf == 2 then
  313. targets[#targets+1] = attacker
  314. end
  315. table.shuffle(targetList)
  316. for _,obj in ipairs(targetList) do
  317. if #targets >= cnt then
  318. break
  319. end
  320. if obj.pos ~= attacker.pos or noSelf == 0 then
  321. targets[#targets+1] = obj
  322. end
  323. end
  324. end
  325. -- 按照属性X排序,选择前Y个目标 @mafei 还未实现当前hp和mp筛选
  326. --[[
  327. @param2 = {
  328. handlerID,
  329. side,
  330. cnt, 选择的数量 默认为1
  331. attrID, 属性ID
  332. order, 排序方式 0 升序, 1 降序 默认为升序
  333. }
  334. ]]
  335. local function handler7(attacker,targetMode)
  336. local cnt = targetMode[3] or 1
  337. local attrID = targetMode[4] or RoleDefine.HP -- 默认是HP
  338. local order = targetMode[5] or 0 -- 默认升序
  339. local targetList = {}
  340. local targetSide = getTargetSide(attacker,targetMode)
  341. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  342. local obj = getObj(pos)
  343. if canTarget(obj) then
  344. targetList[#targetList+1] = obj
  345. end
  346. end
  347. table.sort(targetList,function(a,b)
  348. local a_attr = CombatObj.getValue(a,attrID)
  349. local b_attr = CombatObj.getValue(b,attrID)
  350. -- 血量计算比较特殊, HPLimit * HPPercent
  351. if attrID == RoleDefine then
  352. a_attr = CombatObj.getHpMax(a)
  353. b_attr = CombatObj.getHpMax(b)
  354. end
  355. local ret = a_attr < b_attr
  356. if order ~= 0 then
  357. ret = a_attr > b_attr
  358. end
  359. return ret
  360. end)
  361. for i = 1,cnt do
  362. targets[#targets + 1] = targetList[i]
  363. if #targets >= cnt then
  364. break
  365. end
  366. end
  367. end
  368. --当前最低
  369. --[[
  370. @param2 = {
  371. handlerID,
  372. side,
  373. cnt,
  374. hp/mp, -- 血量还是蓝量
  375. order,
  376. }
  377. ]]
  378. local statusMap = {
  379. [RoleDefine.HP] = "hp",
  380. }
  381. local function handler8(attacker,targetMode)
  382. local cnt = targetMode[3] or 1
  383. local status = statusMap[targetMode[4]] or "hp" -- 默认是HP
  384. local order = targetMode[5] or 0 -- 默认升序
  385. local targetSide = getTargetSide(attacker,targetMode)
  386. local targetList = {}
  387. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  388. local obj = getObj(pos)
  389. if canTarget(obj) then
  390. targetList[#targetList+1] = obj
  391. end
  392. end
  393. table.sort(targetList,function(a,b)
  394. local a_value = a[status] or 0
  395. local b_value = b[status] or 0
  396. local ret = a_value < b_value
  397. if order ~= 0 then
  398. ret = a_value > b_value
  399. end
  400. return ret
  401. end)
  402. for i = 1,cnt do
  403. targets[#targets + 1] = targetList[i]
  404. if #targets >= cnt then
  405. break
  406. end
  407. end
  408. end
  409. -- 选择正前方一列的X目标
  410. --[[
  411. @param2 = {
  412. handlerID,
  413. side,
  414. cnt,
  415. col, 默认正前方,否则选择colList行数
  416. }
  417. ]]
  418. local function handler26(attacker,targetMode)
  419. local cnt = targetMode[3] or 1
  420. local targetCol = targetMode[4]
  421. local targetSide = getTargetSide(attacker,targetMode)
  422. -- 没有targetCol默认选取目标正前方的列数 warning: 检测是否援军情况 @mafei
  423. if not targetCol then
  424. for col,list in pairs(CombatDefine.COLUMN2POS[attacker.side]) do
  425. if table.find(list,attacker.pos) then
  426. targetCol = col
  427. break
  428. end
  429. end
  430. end
  431. -- 筛选出还存在的列
  432. local colList = {}
  433. for col,list in pairs(CombatDefine.COLUMN2POS[targetSide]) do
  434. local colObjList = {}
  435. for i = 1,#list do
  436. local obj = getObj(list[i])
  437. if canTarget(obj) then
  438. table.insert(colObjList,obj)
  439. end
  440. end
  441. if #colObjList > 0 then
  442. table.insert(colList,colObjList)
  443. end
  444. end
  445. -- 没有可选的列
  446. if #colList == 0 then
  447. return
  448. end
  449. local targetList
  450. for col,list in ipairs(colList) do
  451. if col == targetCol then
  452. targetList = list
  453. break
  454. end
  455. end
  456. if not targetList then
  457. table.shuffle(colList)
  458. targetList = colList[1]
  459. end
  460. for _,obj in ipairs(targetList) do
  461. targets[#targets+1] = obj
  462. if #targets >= cnt then
  463. break
  464. end
  465. end
  466. end
  467. -- 选择英雄数量最多的一列或者一行
  468. --[[
  469. @param2 = {
  470. handlerID,
  471. side,
  472. cnt,
  473. col 1表示列,2表示行,默认为1
  474. }
  475. ]]
  476. local function handler31(attacker,targetMode)
  477. local cnt = targetMode[3] or 1
  478. local mode = targetMode[4] or 1
  479. local targetSide = getTargetSide(attacker,targetMode)
  480. local posList = CombatDefine.COLUMN2POS
  481. if mode ~= 1 then
  482. posList = CombatDefine.ROW2POS
  483. end
  484. local targetObjList = {}
  485. for _,list in ipairs(posList[targetSide]) do
  486. local objList = {}
  487. for i = 1,#list do
  488. local obj = getObj(list[i])
  489. -- 确认是武将(英雄)
  490. if canTarget(obj) and obj.isPet then
  491. table.insert(objList,obj)
  492. end
  493. end
  494. if #targetObjList <= #objList then
  495. targetObjList = objList
  496. end
  497. end
  498. -- 筛选最后的targets
  499. table.shuffle(targetObjList)
  500. for i = 1,#targetObjList do
  501. targets[#targets+1] = targetObjList[i]
  502. if #targets >= cnt then
  503. break
  504. end
  505. end
  506. end
  507. --随机 选择目标 多次
  508. --[[
  509. @param2 = {
  510. handlerID,
  511. side,
  512. cnt, 随机选择的次数, 默认一次
  513. maxCnt 同一目标最多的次数,默认一次
  514. }
  515. ]]
  516. local function handler29(attacker,targetMode)
  517. local cnt = targetMode[3] or 1
  518. local maxCnt = targetMode[4] or 1
  519. local targetSide = getTargetSide(attacker,targetMode)
  520. local targetList = {}
  521. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  522. local obj = getObj(pos)
  523. if canTarget(obj) then
  524. table.insert(targetList,obj)
  525. end
  526. end
  527. local cntMap = {}
  528. for i = 0,cnt do
  529. local obj = table.shuffle(targetList)[#targetList]
  530. local objPos = obj.pos
  531. cntMap[objPos] = cntMap[objPos] or 0
  532. targets[#targets + 1] = obj
  533. cntMap[objPos] = cntMap[objPos] + 1
  534. if cntMap[objPos] >= maxCnt then
  535. table.remove(targetList,#targetList)
  536. end
  537. if #targetList <= 0 then
  538. break
  539. end
  540. end
  541. end
  542. --随机选择属性列表中一项最高的角色
  543. --[[
  544. @param2 = {
  545. handlerID,
  546. side
  547. cnt, 选择的数量,默认为1
  548. attrList, 属性列表
  549. order 排序方式 0 升序, 1 降序 默认为升序
  550. }
  551. ]]
  552. local function handler33(attacker,targetMode)
  553. local cnt = targetMode[3] or 1
  554. local attrList = targetMode[4] or {}
  555. local order = targetMode[5] or 0 -- 默认升序
  556. local targetSide = getTargetSide(attacker,targetMode)
  557. local targetList = {}
  558. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  559. local obj = getObj(pos)
  560. if canTarget(obj) then
  561. table.insert(targetList,obj)
  562. end
  563. end
  564. -- 随机出一个属性
  565. local attr = table.shuffle(attrList)[1] or RoleDefine.ATK
  566. table.sort(targetList,function(a,b)
  567. local a_attr = CombatObj.getValue(a,attr)
  568. local b_attr = CombatObj.getValue(b,attr)
  569. local ret = a_attr < b_attr
  570. if order ~= 0 then
  571. ret = a_attr > b_attr
  572. end
  573. return ret
  574. end)
  575. end
  576. -- 根据自身指定buff层数选择x个目标
  577. --[[
  578. @param2 = {
  579. handlerID,
  580. side,
  581. buffID buff ID
  582. count, buff层数 默认为1
  583. cnt, 选择几个目标 默认为1
  584. isSkillTarget 1:非 2:是;默认1
  585. exclude 1: 否 2:是 和isSkillTarget关联,是skillTarget还是取非skillTarget
  586. }
  587. ]]
  588. local function handler32(attacker, targetMode, skillTargets)
  589. local buffID = assert(targetMode[3],"invalid config")
  590. local targetSide = getTargetSide(attacker,targetMode)
  591. local isSkillTarget = targetMode[6] or 1
  592. local exclude = targetMode[7] or 1
  593. local targetList = getTargetList(targetSide,isSkillTarget,exclude,skillTargets)
  594. local exist,buffLayer = CombatBuff.isStatus(attacker,{buffID})
  595. if not exist then
  596. return
  597. end
  598. local count = math.floor(buffLayer/(targetMode[4] or 1 ))
  599. local maxHit = targetMode[5] or 1
  600. local hitObjMap = {}
  601. -- 打乱targetList表
  602. table.shuffle(targetList)
  603. -- 筛选targets
  604. while true do
  605. if #targetList <= 0 or count <= 0 then
  606. break
  607. end
  608. local r = math.random(#targetList)
  609. local obj = targetList[r]
  610. hitObjMap[obj.pos] = hitObjMap[obj.pos] or 0
  611. -- 如果有重复的obj应该也删除
  612. if hitObjMap[obj.pos] >= maxHit then
  613. table.remove(targetList,r)
  614. else
  615. hitObjMap[obj.pos] = hitObjMap[obj.pos] + 1
  616. targets[#targets+1] = obj
  617. count = count - 1
  618. end
  619. end
  620. end
  621. -- 复活x个单位
  622. --[[
  623. @param2 = {
  624. handlerID,
  625. side,
  626. cnt, 选择复活的数量 默认为1
  627. }
  628. ]]
  629. local function handler21(attacker,targetMode)
  630. local cnt = targetMode[3] or 1
  631. local targetSide = getTargetSide(attacker,targetMode)
  632. local targetList = getAllTargetList(targetSide)
  633. table.shuffle(targetList)
  634. for _,obj in ipairs(targetList) do
  635. -- 判断能否复活
  636. if CombatBuff.canRevive(obj) then
  637. targets[#targets+1] = obj
  638. end
  639. if #targets >= cnt then
  640. break
  641. end
  642. end
  643. end
  644. --职业+攻击力排名
  645. --[[
  646. @param2 = {
  647. handlerID,
  648. side
  649. cnt,
  650. jobs, 职业列表
  651. }
  652. ]]
  653. local function handler24(attacker,targetMode)
  654. local targetSide = getTargetSide(attacker,targetMode)
  655. local targetList = {}
  656. local jobs = targetMode[4] or {}
  657. local cnt = targetMode[3] or 1
  658. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  659. local obj = getObj(pos)
  660. if canTarget(obj) then
  661. table.insert(targetList,obj)
  662. end
  663. end
  664. local attr = RoleDefine.ATK
  665. -- 降序排列
  666. table.sort(targetList,function(a,b)
  667. local a_attr = CombatObj.getValue(a,attr)
  668. local b_attr = CombatObj.getValue(b,attr)
  669. local ret = a_attr > b_attr
  670. if a_attr== b_attr then
  671. local a_idx = table.find(jobs,a.job) or (#jobs+1)
  672. local b_idx = table.find(jobs,b.job) or (#jobs+1)
  673. if a_idx ~= b_idx then
  674. return a_idx < b_idx
  675. end
  676. end
  677. return ret
  678. end)
  679. for _,obj in ipairs(targetList) do
  680. targets[#targets+1] = obj
  681. if #targets >= cnt then
  682. break
  683. end
  684. end
  685. end
  686. --选取百分比生命值最低cnt个目标
  687. --[[
  688. @param2 = {
  689. handlerID,
  690. side,
  691. cnt,
  692. limit 百分比
  693. }
  694. ]]
  695. local function handler14(attacker,targetMode)
  696. local targetSide = getTargetSide(attacker,targetMode)
  697. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  698. -- assert()
  699. --end
  700. local targetList = {}
  701. local limit = targetMode[4] or 100
  702. local cnt = targetMode[3] or 1
  703. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  704. local obj = getObj(pos)
  705. if canTarget(obj) then
  706. local obj_hp_limit = CombatObj.getValue(obj,RoleDefine.HP)
  707. if (obj.hp/obj_hp_limit) < (limit / 100) then
  708. table.insert(targetList,obj)
  709. end
  710. end
  711. end
  712. table.shuffle(targetList)
  713. for _,obj in ipairs(targetList) do
  714. targets[#targets+1] = obj
  715. if #targets >= cnt then
  716. break
  717. end
  718. end
  719. end
  720. --职业优先
  721. --[[
  722. @param2 = {
  723. handlerID,
  724. side,
  725. cnt,
  726. jobs -- 职业集合
  727. }
  728. ]]
  729. local function handler25(attacker,targetMode)
  730. local targetSide = getTargetSide(attacker,targetMode)
  731. if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  732. assert()
  733. end
  734. local cnt = targetMode[3] or 1
  735. local job = targetMode[4] or {}
  736. local temp = {}
  737. for _,pos in ipairs(CombatDefine.SIDE2POS[targetSide]) do
  738. local obj = getObj(pos)
  739. if canTarget(obj) and table.find(job,obj.job) then
  740. targets[#targets + 1] = obj
  741. end
  742. if #targets >= cnt then
  743. break
  744. end
  745. end
  746. -- 没有职业可选 则随机选择
  747. if #targets == 0 then
  748. handler6(attacker,{
  749. targetMode[1],
  750. targetMode[2],
  751. cnt
  752. })
  753. end
  754. end
  755. -- 技能选取
  756. local function handler0(_,_,skillTargets)
  757. for _,obj in ipairs (skillTargets) do
  758. targets[#targets + 1] = obj
  759. end
  760. end
  761. --技能目标(所有目标)
  762. local function handler11(_,_,skillTargets)
  763. -- abandon
  764. return handler0(_,_,skillTargets)
  765. end
  766. ------------------------------------ 未实现功能 分界线 ------------------------------------
  767. --默认顺序位置
  768. local function handler1(attacker,targetMode)
  769. local targetSide = getTargetSide(attacker,targetMode)
  770. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  771. -- assert()
  772. --end
  773. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  774. local atkPos = attacker.backupPos or attacker.pos
  775. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  776. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  777. local obj = getObj(pos)
  778. if canTarget(obj) and obj.pos ~= attacker.pos then
  779. targets[#targets+1] = obj
  780. end
  781. if #targets >= cnt then
  782. return
  783. end
  784. end
  785. end
  786. --最近一列
  787. local function handler4(attacker,targetMode)
  788. local targetSide = getTargetSide(attacker,targetMode)
  789. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  790. -- assert()
  791. --end
  792. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  793. local atkPos = attacker.backupPos or attacker.pos
  794. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  795. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  796. local obj = getObj(pos)
  797. if canTarget(obj) and obj.pos ~= attacker.pos then
  798. targets[#targets+1] = obj
  799. end
  800. if #targets >= cnt then
  801. return
  802. end
  803. end
  804. end
  805. --随机前,中,后排
  806. local function handler5(attacker,targetMode)
  807. -- abandon
  808. end
  809. --攻击最高
  810. --[[
  811. attacker = {
  812. backupPos,
  813. pos,
  814. }
  815. targetMode = [9,2,3] 选择类型,side(地方或者己方),选择人数
  816. ]]
  817. local function handler9(attacker,targetMode)
  818. local targetSide = getTargetSide(attacker,targetMode)
  819. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  820. -- assert()
  821. --end
  822. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  823. local atkPos = attacker.backupPos or attacker.pos
  824. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  825. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  826. local obj = getObj(pos)
  827. if canTarget(obj) and obj.pos ~= attacker.pos then
  828. targets[#targets+1] = obj
  829. end
  830. if #targets >= cnt then
  831. return
  832. end
  833. end
  834. end
  835. --技能目标(指定第几个目标)
  836. local function handler12(attacker,targetMode,skillTargets)
  837. local targetSide = getTargetSide(attacker,targetMode)
  838. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  839. -- assert()
  840. --end
  841. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  842. local atkPos = attacker.backupPos or attacker.pos
  843. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  844. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  845. local obj = getObj(pos)
  846. if canTarget(obj) and obj.pos ~= attacker.pos then
  847. targets[#targets+1] = obj
  848. end
  849. if #targets >= cnt then
  850. return
  851. end
  852. end
  853. end
  854. --被击时攻击者
  855. local function handler13(attacker,targetMode,skillTargets)
  856. local targetSide = getTargetSide(attacker,targetMode)
  857. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  858. -- assert()
  859. --end
  860. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  861. local atkPos = attacker.backupPos or attacker.pos
  862. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  863. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  864. local obj = getObj(pos)
  865. if canTarget(obj) and obj.pos ~= attacker.pos then
  866. targets[#targets+1] = obj
  867. end
  868. if #targets >= cnt then
  869. return
  870. end
  871. end
  872. end
  873. --技能目标(生命高于或者低于攻击方)
  874. local function handler15(attacker,targetMode,skillTargets)
  875. local targetSide = getTargetSide(attacker,targetMode)
  876. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  877. -- assert()
  878. --end
  879. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  880. local atkPos = attacker.backupPos or attacker.pos
  881. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  882. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  883. local obj = getObj(pos)
  884. if canTarget(obj) and obj.pos ~= attacker.pos then
  885. targets[#targets+1] = obj
  886. end
  887. if #targets >= cnt then
  888. return
  889. end
  890. end
  891. end
  892. --技能目标(护甲高于或者低于攻击方)
  893. local function handler16(attacker,targetMode,skillTargets)
  894. local targetSide = getTargetSide(attacker,targetMode)
  895. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  896. -- assert()
  897. --end
  898. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  899. local atkPos = attacker.backupPos or attacker.pos
  900. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  901. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  902. local obj = getObj(pos)
  903. if canTarget(obj) and obj.pos ~= attacker.pos then
  904. targets[#targets+1] = obj
  905. end
  906. if #targets >= cnt then
  907. return
  908. end
  909. end
  910. end
  911. --血量百分比最少
  912. local function handler17(attacker,targetMode)
  913. local targetSide = getTargetSide(attacker,targetMode)
  914. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  915. -- assert()
  916. --end
  917. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  918. local atkPos = attacker.backupPos or attacker.pos
  919. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  920. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  921. local obj = getObj(pos)
  922. if canTarget(obj) and obj.pos ~= attacker.pos then
  923. targets[#targets+1] = obj
  924. end
  925. if #targets >= cnt then
  926. return
  927. end
  928. end
  929. end
  930. --血量最少,优先选择非满血的英雄
  931. local function handler18(attacker,targetMode)
  932. local targetSide = getTargetSide(attacker,targetMode)
  933. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  934. -- assert()
  935. --end
  936. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  937. local atkPos = attacker.backupPos or attacker.pos
  938. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  939. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  940. local obj = getObj(pos)
  941. if canTarget(obj) and obj.pos ~= attacker.pos then
  942. targets[#targets+1] = obj
  943. end
  944. if #targets >= cnt then
  945. return
  946. end
  947. end
  948. end
  949. --随机后排,优先选择非满血的英雄
  950. local function handler19(attacker,targetMode)
  951. local targetSide = getTargetSide(attacker,targetMode)
  952. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  953. -- assert()
  954. --end
  955. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  956. local atkPos = attacker.backupPos or attacker.pos
  957. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  958. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  959. local obj = getObj(pos)
  960. if canTarget(obj) and obj.pos ~= attacker.pos then
  961. targets[#targets+1] = obj
  962. end
  963. if #targets >= cnt then
  964. return
  965. end
  966. end
  967. end
  968. --随机,优先选择非满血的英雄
  969. local function handler20(attacker,targetMode)
  970. local targetSide = getTargetSide(attacker,targetMode)
  971. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  972. -- assert()
  973. --end
  974. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  975. local atkPos = attacker.backupPos or attacker.pos
  976. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  977. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  978. local obj = getObj(pos)
  979. if canTarget(obj) and obj.pos ~= attacker.pos then
  980. targets[#targets+1] = obj
  981. end
  982. if #targets >= cnt then
  983. return
  984. end
  985. end
  986. end
  987. --非技能目标
  988. local function handler22(attacker,targetMode,skillTargets)
  989. local targetSide = getTargetSide(attacker,targetMode)
  990. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  991. -- assert()
  992. --end
  993. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  994. local atkPos = attacker.backupPos or attacker.pos
  995. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  996. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  997. local obj = getObj(pos)
  998. if canTarget(obj) and obj.pos ~= attacker.pos then
  999. targets[#targets+1] = obj
  1000. end
  1001. if #targets >= cnt then
  1002. return
  1003. end
  1004. end
  1005. end
  1006. --技能目标(速度高于或者低于攻击方)
  1007. local function handler23(attacker,targetMode,skillTargets)
  1008. local targetSide = getTargetSide(attacker,targetMode)
  1009. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  1010. -- assert()
  1011. --end
  1012. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  1013. local atkPos = attacker.backupPos or attacker.pos
  1014. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  1015. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  1016. local obj = getObj(pos)
  1017. if canTarget(obj) and obj.pos ~= attacker.pos then
  1018. targets[#targets+1] = obj
  1019. end
  1020. if #targets >= cnt then
  1021. return
  1022. end
  1023. end
  1024. end
  1025. --默认顺序位置2
  1026. local function handler27(attacker,targetMode)
  1027. local targetSide = getTargetSide(attacker,targetMode)
  1028. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  1029. -- assert()
  1030. --end
  1031. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  1032. local atkPos = attacker.backupPos or attacker.pos
  1033. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  1034. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  1035. local obj = getObj(pos)
  1036. if canTarget(obj) and obj.pos ~= attacker.pos then
  1037. targets[#targets+1] = obj
  1038. end
  1039. if #targets >= cnt then
  1040. return
  1041. end
  1042. end
  1043. end
  1044. --攻击最高
  1045. local function handler30(attacker,targetMode)
  1046. local targetSide = getTargetSide(attacker,targetMode)
  1047. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  1048. -- assert()
  1049. --end
  1050. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  1051. local atkPos = attacker.backupPos or attacker.pos
  1052. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  1053. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  1054. local obj = getObj(pos)
  1055. if canTarget(obj) and obj.pos ~= attacker.pos then
  1056. targets[#targets+1] = obj
  1057. end
  1058. if #targets >= cnt then
  1059. return
  1060. end
  1061. end
  1062. end
  1063. ------------------------------ 分界线 ------------------------------
  1064. -- 目前是一样了,等策划配置好skill表后删掉 @mafei
  1065. local function handler3(attacker,targetMode)
  1066. return handler28(attacker,targetMode)
  1067. end
  1068. --------------------------------------------------------------------
  1069. handler[1] = handler1 --1 默认顺序位置
  1070. handler[2] = handler2 --2 全体
  1071. handler[3] = handler3 --3 前排,中排,后排
  1072. handler[4] = handler4 --4 前方一列
  1073. handler[5] = handler5 --5 随机前排,中排,后排
  1074. handler[6] = handler6 --6 随机
  1075. handler[7] = handler7 --7 血量最少
  1076. handler[8] = handler8 --8 血量最高
  1077. handler[9] = handler9 --9 攻击最高
  1078. handler[10] = handler10 --10 自己
  1079. handler[11] = handler11 --11 技能目标(所有目标)
  1080. handler[12] = handler12 --12 技能目标(指定第几个目标)
  1081. handler[13] = handler13 --13 被击时攻击者
  1082. handler[14] = handler14 --14 额外作用目标
  1083. handler[15] = handler15 --15 技能目标(生命高于或者低于攻击方)
  1084. handler[16] = handler16 --16 技能目标(护甲高于或者低于攻击方)
  1085. handler[17] = handler17 --17 技能目标(血量百分比最少)
  1086. handler[18] = handler18 --18 技能目标(血量最少,优先选择非满血的英雄)
  1087. handler[19] = handler19 --19 随机后排,优先选择非满血的英雄
  1088. handler[20] = handler20 --20 随机,优先选择非满血的英雄
  1089. handler[21] = handler21 --21 死亡武将
  1090. handler[22] = handler22 --22 非技能目标
  1091. handler[23] = handler23 --23 技能目标(速度高于或者低于攻击方)
  1092. handler[24] = handler24 --24 职业+攻击力排名
  1093. handler[25] = handler25 --25 职业优先
  1094. handler[26] = handler26 --26 同一列
  1095. handler[27] = handler27 --27 同一列
  1096. handler[28] = handler28 --27 同一列
  1097. handler[29] = handler29 --27 同一列
  1098. handler[30] = handler30 --30 自己跟目标攻击最高
  1099. handler[31] = handler31 --31 同行人数最多
  1100. handler[32] = handler32 --32 指定buff选择
  1101. handler[33] = handler33 --32 指定buff选择
  1102. handler[0] = handler0 -- 技能选取 和11相同
  1103. --对象选择器end