TargetMode.lua 36 KB

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