TargetMode.lua 33 KB

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