TargetMode.lua 36 KB

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