TargetMode.lua 39 KB

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