TargetMode.lua 33 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184
  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. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  645. local obj = getObj(pos)
  646. if canTarget(obj) then
  647. table.insert(targetList,obj)
  648. end
  649. end
  650. local attr = RoleDefine.ATK
  651. -- 降序排列
  652. table.sort(targetList,function(a,b)
  653. local a_attr = CombatObj.getValue(a,attr)
  654. local b_attr = CombatObj.getValue(b,attr)
  655. ret = a_attr > b_attr
  656. if a_attr== b_attr then
  657. local a_idx = table.find(jobs,a.job)
  658. local b_idx = table.find(jobs,b.job)
  659. if a_idx ~= b_idx then
  660. return a_idx < b_idx
  661. end
  662. end
  663. return ret
  664. end)
  665. for _,obj in ipairs(targetList) do
  666. targets[#targets+1] = obj
  667. if #targets >= cnt then
  668. break
  669. end
  670. end
  671. end
  672. --选取百分比生命值最低cnt个目标
  673. --[[
  674. @param2 = {
  675. handlerID,
  676. side,
  677. cnt,
  678. limit 百分比
  679. }
  680. ]]
  681. local function handler14(attacker,targetMode)
  682. local targetSide = getTargetSide(attacker,targetMode)
  683. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  684. -- assert()
  685. --end
  686. local targetList = {}
  687. local limit = targetMode[4] or 100
  688. local cnt = targetMode[3] or 1
  689. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  690. local obj = getObj(pos)
  691. if canTarget(obj) then
  692. local obj_hp_limit = CombatObj.getValue(obj,RoleDefine.HP)
  693. if (obj.hp/obj_hp_limit) < (limit / 100) then
  694. table.insert(targetList,obj)
  695. end
  696. end
  697. end
  698. table.shuffle(targetList)
  699. for _,obj in ipairs(targetList) do
  700. targets[#targets+1] = obj
  701. if #targets >= cnt then
  702. break
  703. end
  704. end
  705. end
  706. --职业优先
  707. --[[
  708. @param2 = {
  709. handlerID,
  710. side,
  711. cnt,
  712. jobs -- 职业集合
  713. }
  714. ]]
  715. local function handler25(attacker,targetMode)
  716. local targetSide = getTargetSide(attacker,targetMode)
  717. if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  718. assert()
  719. end
  720. local cnt = targetMode[3] or 1
  721. local job = targetMode[4] or {}
  722. local temp = {}
  723. for _,pos in ipairs(CombatDefine.SIDE2POS[targetSide]) do
  724. local obj = getObj(pos)
  725. if canTarget(obj) and table.find(job,obj.job) then
  726. targets[#targets + 1] = obj
  727. end
  728. if #targets >= cnt then
  729. break
  730. end
  731. end
  732. -- 没有职业可选 则随机选择
  733. if #targets == 0 then
  734. handler6(attacker,{
  735. targetMode[1],
  736. targetMode[2],
  737. cnt
  738. })
  739. end
  740. end
  741. -- 技能选取
  742. local function handler0(_,_,skillTargets)
  743. for _,obj in ipairs (skillTargets) do
  744. targets[#targets + 1] = obj
  745. end
  746. end
  747. --技能目标(所有目标)
  748. local function handler11(_,_,skillTargets)
  749. -- abandon
  750. return handler0(_,_,skillTargets)
  751. end
  752. ------------------------------------ 未实现功能 分界线 ------------------------------------
  753. --默认顺序位置
  754. local function handler1(attacker,targetMode)
  755. local targetSide = getTargetSide(attacker,targetMode)
  756. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  757. -- assert()
  758. --end
  759. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  760. local atkPos = attacker.backupPos or attacker.pos
  761. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  762. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  763. local obj = getObj(pos)
  764. if canTarget(obj) and obj.pos ~= attacker.pos then
  765. targets[#targets+1] = obj
  766. end
  767. if #targets >= cnt then
  768. return
  769. end
  770. end
  771. end
  772. --最近一列
  773. local function handler4(attacker,targetMode)
  774. local targetSide = getTargetSide(attacker,targetMode)
  775. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  776. -- assert()
  777. --end
  778. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  779. local atkPos = attacker.backupPos or attacker.pos
  780. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  781. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  782. local obj = getObj(pos)
  783. if canTarget(obj) and obj.pos ~= attacker.pos then
  784. targets[#targets+1] = obj
  785. end
  786. if #targets >= cnt then
  787. return
  788. end
  789. end
  790. end
  791. --随机前,中,后排
  792. local function handler5(attacker,targetMode)
  793. -- abandon
  794. end
  795. --攻击最高
  796. --[[
  797. attacker = {
  798. backupPos,
  799. pos,
  800. }
  801. targetMode = [9,2,3] 选择类型,side(地方或者己方),选择人数
  802. ]]
  803. local function handler9(attacker,targetMode)
  804. local targetSide = getTargetSide(attacker,targetMode)
  805. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  806. -- assert()
  807. --end
  808. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  809. local atkPos = attacker.backupPos or attacker.pos
  810. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  811. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  812. local obj = getObj(pos)
  813. if canTarget(obj) and obj.pos ~= attacker.pos then
  814. targets[#targets+1] = obj
  815. end
  816. if #targets >= cnt then
  817. return
  818. end
  819. end
  820. end
  821. --技能目标(指定第几个目标)
  822. local function handler12(attacker,targetMode,skillTargets)
  823. local targetSide = getTargetSide(attacker,targetMode)
  824. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  825. -- assert()
  826. --end
  827. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  828. local atkPos = attacker.backupPos or attacker.pos
  829. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  830. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  831. local obj = getObj(pos)
  832. if canTarget(obj) and obj.pos ~= attacker.pos then
  833. targets[#targets+1] = obj
  834. end
  835. if #targets >= cnt then
  836. return
  837. end
  838. end
  839. end
  840. --被击时攻击者
  841. local function handler13(attacker,targetMode,skillTargets)
  842. local targetSide = getTargetSide(attacker,targetMode)
  843. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  844. -- assert()
  845. --end
  846. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  847. local atkPos = attacker.backupPos or attacker.pos
  848. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  849. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  850. local obj = getObj(pos)
  851. if canTarget(obj) and obj.pos ~= attacker.pos then
  852. targets[#targets+1] = obj
  853. end
  854. if #targets >= cnt then
  855. return
  856. end
  857. end
  858. end
  859. --技能目标(生命高于或者低于攻击方)
  860. local function handler15(attacker,targetMode,skillTargets)
  861. local targetSide = getTargetSide(attacker,targetMode)
  862. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  863. -- assert()
  864. --end
  865. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  866. local atkPos = attacker.backupPos or attacker.pos
  867. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  868. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  869. local obj = getObj(pos)
  870. if canTarget(obj) and obj.pos ~= attacker.pos then
  871. targets[#targets+1] = obj
  872. end
  873. if #targets >= cnt then
  874. return
  875. end
  876. end
  877. end
  878. --技能目标(护甲高于或者低于攻击方)
  879. local function handler16(attacker,targetMode,skillTargets)
  880. local targetSide = getTargetSide(attacker,targetMode)
  881. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  882. -- assert()
  883. --end
  884. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  885. local atkPos = attacker.backupPos or attacker.pos
  886. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  887. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  888. local obj = getObj(pos)
  889. if canTarget(obj) and obj.pos ~= attacker.pos then
  890. targets[#targets+1] = obj
  891. end
  892. if #targets >= cnt then
  893. return
  894. end
  895. end
  896. end
  897. --血量百分比最少
  898. local function handler17(attacker,targetMode)
  899. local targetSide = getTargetSide(attacker,targetMode)
  900. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  901. -- assert()
  902. --end
  903. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  904. local atkPos = attacker.backupPos or attacker.pos
  905. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  906. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  907. local obj = getObj(pos)
  908. if canTarget(obj) and obj.pos ~= attacker.pos then
  909. targets[#targets+1] = obj
  910. end
  911. if #targets >= cnt then
  912. return
  913. end
  914. end
  915. end
  916. --血量最少,优先选择非满血的英雄
  917. local function handler18(attacker,targetMode)
  918. local targetSide = getTargetSide(attacker,targetMode)
  919. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  920. -- assert()
  921. --end
  922. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  923. local atkPos = attacker.backupPos or attacker.pos
  924. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  925. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  926. local obj = getObj(pos)
  927. if canTarget(obj) and obj.pos ~= attacker.pos then
  928. targets[#targets+1] = obj
  929. end
  930. if #targets >= cnt then
  931. return
  932. end
  933. end
  934. end
  935. --随机后排,优先选择非满血的英雄
  936. local function handler19(attacker,targetMode)
  937. local targetSide = getTargetSide(attacker,targetMode)
  938. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  939. -- assert()
  940. --end
  941. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  942. local atkPos = attacker.backupPos or attacker.pos
  943. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  944. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  945. local obj = getObj(pos)
  946. if canTarget(obj) and obj.pos ~= attacker.pos then
  947. targets[#targets+1] = obj
  948. end
  949. if #targets >= cnt then
  950. return
  951. end
  952. end
  953. end
  954. --随机,优先选择非满血的英雄
  955. local function handler20(attacker,targetMode)
  956. local targetSide = getTargetSide(attacker,targetMode)
  957. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  958. -- assert()
  959. --end
  960. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  961. local atkPos = attacker.backupPos or attacker.pos
  962. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  963. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  964. local obj = getObj(pos)
  965. if canTarget(obj) and obj.pos ~= attacker.pos then
  966. targets[#targets+1] = obj
  967. end
  968. if #targets >= cnt then
  969. return
  970. end
  971. end
  972. end
  973. --非技能目标
  974. local function handler22(attacker,targetMode,skillTargets)
  975. local targetSide = getTargetSide(attacker,targetMode)
  976. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  977. -- assert()
  978. --end
  979. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  980. local atkPos = attacker.backupPos or attacker.pos
  981. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  982. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  983. local obj = getObj(pos)
  984. if canTarget(obj) and obj.pos ~= attacker.pos then
  985. targets[#targets+1] = obj
  986. end
  987. if #targets >= cnt then
  988. return
  989. end
  990. end
  991. end
  992. --技能目标(速度高于或者低于攻击方)
  993. local function handler23(attacker,targetMode,skillTargets)
  994. local targetSide = getTargetSide(attacker,targetMode)
  995. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  996. -- assert()
  997. --end
  998. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  999. local atkPos = attacker.backupPos or attacker.pos
  1000. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  1001. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  1002. local obj = getObj(pos)
  1003. if canTarget(obj) and obj.pos ~= attacker.pos then
  1004. targets[#targets+1] = obj
  1005. end
  1006. if #targets >= cnt then
  1007. return
  1008. end
  1009. end
  1010. end
  1011. --默认顺序位置2
  1012. local function handler27(attacker,targetMode)
  1013. local targetSide = getTargetSide(attacker,targetMode)
  1014. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  1015. -- assert()
  1016. --end
  1017. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  1018. local atkPos = attacker.backupPos or attacker.pos
  1019. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  1020. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  1021. local obj = getObj(pos)
  1022. if canTarget(obj) and obj.pos ~= attacker.pos then
  1023. targets[#targets+1] = obj
  1024. end
  1025. if #targets >= cnt then
  1026. return
  1027. end
  1028. end
  1029. end
  1030. --攻击最高
  1031. local function handler30(attacker,targetMode)
  1032. local targetSide = getTargetSide(attacker,targetMode)
  1033. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  1034. -- assert()
  1035. --end
  1036. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  1037. local atkPos = attacker.backupPos or attacker.pos
  1038. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  1039. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  1040. local obj = getObj(pos)
  1041. if canTarget(obj) and obj.pos ~= attacker.pos then
  1042. targets[#targets+1] = obj
  1043. end
  1044. if #targets >= cnt then
  1045. return
  1046. end
  1047. end
  1048. end
  1049. ------------------------------ 分界线 ------------------------------
  1050. -- 目前是一样了,等策划配置好skill表后删掉 @mafei
  1051. local function handler3(attacker,targetMode)
  1052. return handler28(attacker,targetMode)
  1053. end
  1054. --------------------------------------------------------------------
  1055. handler[1] = handler1 --1 默认顺序位置
  1056. handler[2] = handler2 --2 全体
  1057. handler[3] = handler3 --3 前排,中排,后排
  1058. handler[4] = handler4 --4 前方一列
  1059. handler[5] = handler5 --5 随机前排,中排,后排
  1060. handler[6] = handler6 --6 随机
  1061. handler[7] = handler7 --7 血量最少
  1062. handler[8] = handler8 --8 血量最高
  1063. handler[9] = handler9 --9 攻击最高
  1064. handler[10] = handler10 --10 自己
  1065. handler[11] = handler11 --11 技能目标(所有目标)
  1066. handler[12] = handler12 --12 技能目标(指定第几个目标)
  1067. handler[13] = handler13 --13 被击时攻击者
  1068. handler[14] = handler14 --14 额外作用目标
  1069. handler[15] = handler15 --15 技能目标(生命高于或者低于攻击方)
  1070. handler[16] = handler16 --16 技能目标(护甲高于或者低于攻击方)
  1071. handler[17] = handler17 --17 技能目标(血量百分比最少)
  1072. handler[18] = handler18 --18 技能目标(血量最少,优先选择非满血的英雄)
  1073. handler[19] = handler19 --19 随机后排,优先选择非满血的英雄
  1074. handler[20] = handler20 --20 随机,优先选择非满血的英雄
  1075. handler[21] = handler21 --21 死亡武将
  1076. handler[22] = handler22 --22 非技能目标
  1077. handler[23] = handler23 --23 技能目标(速度高于或者低于攻击方)
  1078. handler[24] = handler24 --24 职业+攻击力排名
  1079. handler[25] = handler25 --25 职业优先
  1080. handler[26] = handler26 --26 同一列
  1081. handler[27] = handler27 --27 同一列
  1082. handler[28] = handler28 --27 同一列
  1083. handler[29] = handler29 --27 同一列
  1084. handler[30] = handler30 --30 自己跟目标攻击最高
  1085. handler[31] = handler31 --31 同行人数最多
  1086. handler[32] = handler32 --32 指定buff选择
  1087. handler[33] = handler33 --32 指定buff选择
  1088. handler[0] = handler0 -- 技能选取 和11相同
  1089. --对象选择器end