TargetMode.lua 35 KB

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