TargetMode.lua 40 KB

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