TargetMode.lua 33 KB

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