TargetMode.lua 41 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484
  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. if #targetList <= 0 then
  624. return
  625. end
  626. local cntMap = {}
  627. for i = 1,cnt do
  628. local obj = table.shuffle(targetList)[#targetList]
  629. local objPos = obj.pos
  630. cntMap[objPos] = cntMap[objPos] or 0
  631. targets[#targets + 1] = obj
  632. cntMap[objPos] = cntMap[objPos] + 1
  633. if cntMap[objPos] >= maxCnt then
  634. table.remove(targetList,#targetList)
  635. end
  636. if #targetList <= 0 then
  637. break
  638. end
  639. end
  640. end
  641. --随机选择属性列表中一项最高的角色
  642. --[[
  643. @param2 = {
  644. handlerID,
  645. side
  646. cnt, 选择的数量,默认为1
  647. attrList, 属性列表
  648. order 排序方式 0 升序, 1 降序 默认为升序
  649. }
  650. ]]
  651. local function handler33(attacker,targetMode)
  652. local cnt = targetMode[3] or 1
  653. local attrList = targetMode[4] or {}
  654. local order = targetMode[5] or 0 -- 默认升序
  655. local targetSide = getTargetSide(attacker,targetMode)
  656. local targetList = {}
  657. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  658. local obj = getObj(pos)
  659. if canTarget(obj) then
  660. table.insert(targetList,obj)
  661. end
  662. end
  663. -- 随机出一个属性
  664. local attr = table.shuffle(attrList)[1] or RoleDefine.ATK
  665. table.sort(targetList,function(a,b)
  666. local a_attr = CombatObj.getValue(a,attr)
  667. local b_attr = CombatObj.getValue(b,attr)
  668. local ret = a_attr < b_attr
  669. if order ~= 0 then
  670. ret = a_attr > b_attr
  671. end
  672. return ret
  673. end)
  674. for _, obj in ipairs(targetList) do
  675. if #targets >= cnt then
  676. break
  677. end
  678. targets[#targets+1] = obj
  679. end
  680. end
  681. -- 根据自身指定buff层数选择x个目标
  682. --[[
  683. @param2 = {
  684. handlerID,
  685. side,
  686. buffID buff ID
  687. count, buff层数 默认为1
  688. cnt, 选择几个目标 默认为1
  689. isSkillTarget 1:非 2:是;默认1
  690. exclude 1: 否 2:是 和isSkillTarget关联,是skillTarget还是取非skillTarget
  691. }
  692. ]]
  693. local function handler32(attacker, targetMode, skillTargets)
  694. local buffID = assert(targetMode[3],"invalid config")
  695. local targetSide = getTargetSide(attacker,targetMode)
  696. local isSkillTarget = targetMode[6] or 1
  697. local exclude = targetMode[7] or 1
  698. local targetList = getTargetList(targetSide,isSkillTarget,exclude,skillTargets)
  699. local exist,buffLayer = CombatBuff.isStatus(attacker,{buffID})
  700. if not exist then
  701. return
  702. end
  703. local count = math.floor(buffLayer/(targetMode[4] or 1 ))
  704. local maxHit = targetMode[5] or 1
  705. local hitObjMap = {}
  706. -- 打乱targetList表
  707. table.shuffle(targetList)
  708. -- 筛选targets
  709. while true do
  710. if #targetList <= 0 or count <= 0 then
  711. break
  712. end
  713. local r = math.random(#targetList)
  714. local obj = targetList[r]
  715. hitObjMap[obj.pos] = hitObjMap[obj.pos] or 0
  716. -- 如果有重复的obj应该也删除
  717. if hitObjMap[obj.pos] >= maxHit then
  718. table.remove(targetList,r)
  719. else
  720. hitObjMap[obj.pos] = hitObjMap[obj.pos] + 1
  721. targets[#targets+1] = obj
  722. count = count - 1
  723. end
  724. end
  725. end
  726. -- 复活x个单位
  727. --[[
  728. @param2 = {
  729. handlerID,
  730. side,
  731. cnt, 选择复活的数量 默认为1
  732. }
  733. ]]
  734. local function handler21(attacker,targetMode)
  735. local cnt = targetMode[3] or 1
  736. local targetSide = getTargetSide(attacker,targetMode)
  737. local targetList = getAllTargetList(targetSide)
  738. table.shuffle(targetList)
  739. for _,obj in ipairs(targetList) do
  740. -- 判断能否复活
  741. if CombatBuff.canRevive(obj) then
  742. targets[#targets+1] = obj
  743. end
  744. if #targets >= cnt then
  745. break
  746. end
  747. end
  748. end
  749. --职业+攻击力排名
  750. --[[
  751. @param2 = {
  752. handlerID,
  753. side
  754. cnt,
  755. jobs, 职业列表
  756. }
  757. ]]
  758. local function handler24(attacker,targetMode)
  759. local targetSide = getTargetSide(attacker,targetMode)
  760. local targetList = {}
  761. local jobs = targetMode[4] or {}
  762. local cnt = targetMode[3] or 1
  763. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  764. local obj = getObj(pos)
  765. if canTarget(obj) then
  766. table.insert(targetList,obj)
  767. end
  768. end
  769. local attr = RoleDefine.ATK
  770. -- 降序排列
  771. table.sort(targetList,function(a,b)
  772. local a_attr = CombatObj.getValue(a,attr)
  773. local b_attr = CombatObj.getValue(b,attr)
  774. local ret = a_attr > b_attr
  775. if a_attr== b_attr then
  776. local a_idx = table.find(jobs,a.job) or (#jobs+1)
  777. local b_idx = table.find(jobs,b.job) or (#jobs+1)
  778. if a_idx ~= b_idx then
  779. return a_idx < b_idx
  780. end
  781. end
  782. return ret
  783. end)
  784. for _,obj in ipairs(targetList) do
  785. targets[#targets+1] = obj
  786. if #targets >= cnt then
  787. break
  788. end
  789. end
  790. end
  791. --选取百分比生命值最低cnt个目标
  792. --[[
  793. @param2 = {
  794. handlerID,
  795. side,
  796. cnt,
  797. limit 百分比
  798. }
  799. ]]
  800. local function handler14(attacker,targetMode)
  801. local targetSide = getTargetSide(attacker,targetMode)
  802. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  803. -- assert()
  804. --end
  805. local targetList = {}
  806. local limit = targetMode[4] or 100
  807. local cnt = targetMode[3] or 1
  808. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  809. local obj = getObj(pos)
  810. if canTarget(obj) then
  811. local obj_hp_limit = CombatObj.getValue(obj,RoleDefine.HP)
  812. if (obj.hp/obj_hp_limit) < (limit / 100) then
  813. table.insert(targetList,obj)
  814. end
  815. end
  816. end
  817. table.shuffle(targetList)
  818. for _,obj in ipairs(targetList) do
  819. targets[#targets+1] = obj
  820. if #targets >= cnt then
  821. break
  822. end
  823. end
  824. end
  825. --职业优先
  826. --[[
  827. @param2 = {
  828. handlerID,
  829. side,
  830. cnt,
  831. jobs -- 职业集合
  832. }
  833. ]]
  834. local function handler25(attacker,targetMode)
  835. local targetSide = getTargetSide(attacker,targetMode)
  836. if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  837. assert()
  838. end
  839. local cnt = targetMode[3] or 1
  840. local job = targetMode[4] or {}
  841. local temp = {}
  842. for _,pos in ipairs(CombatDefine.SIDE2POS[targetSide]) do
  843. local obj = getObj(pos)
  844. if canTarget(obj) and table.find(job,obj.job) then
  845. targets[#targets + 1] = obj
  846. end
  847. if #targets >= cnt then
  848. break
  849. end
  850. end
  851. -- 没有职业可选 则随机选择
  852. if #targets == 0 then
  853. handler6(attacker,{
  854. targetMode[1],
  855. targetMode[2],
  856. cnt
  857. })
  858. end
  859. end
  860. -- 技能选取
  861. local function handler0(_,_,skillTargets)
  862. for _,obj in ipairs (skillTargets) do
  863. targets[#targets + 1] = obj
  864. end
  865. end
  866. --技能目标(所有目标)
  867. local function handler11(_,_,skillTargets)
  868. -- abandon
  869. return handler0(_,_,skillTargets)
  870. end
  871. ------------------------------------ 未实现功能 分界线 ------------------------------------
  872. --默认顺序位置
  873. local function handler1(attacker,targetMode)
  874. local targetSide = getTargetSide(attacker,targetMode)
  875. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  876. -- assert()
  877. --end
  878. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  879. local atkPos = attacker.backupPos or attacker.pos
  880. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  881. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  882. local obj = getObj(pos)
  883. if canTarget(obj) and obj.pos ~= attacker.pos then
  884. targets[#targets+1] = obj
  885. end
  886. if #targets >= cnt then
  887. return
  888. end
  889. end
  890. end
  891. --最近一列
  892. local function handler4(attacker,targetMode)
  893. local targetSide = getTargetSide(attacker,targetMode)
  894. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  895. -- assert()
  896. --end
  897. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  898. local atkPos = attacker.backupPos or attacker.pos
  899. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  900. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  901. local obj = getObj(pos)
  902. if canTarget(obj) and obj.pos ~= attacker.pos then
  903. targets[#targets+1] = obj
  904. end
  905. if #targets >= cnt then
  906. return
  907. end
  908. end
  909. end
  910. --随机前,中,后排
  911. local function handler5(attacker,targetMode)
  912. -- abandon
  913. end
  914. --攻击最高
  915. --[[
  916. attacker = {
  917. backupPos,
  918. pos,
  919. }
  920. targetMode = [9,2,3] 选择类型,side(地方或者己方),选择人数
  921. ]]
  922. local function handler9(attacker,targetMode)
  923. local targetSide = getTargetSide(attacker,targetMode)
  924. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  925. -- assert()
  926. --end
  927. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  928. local atkPos = attacker.backupPos or attacker.pos
  929. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  930. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  931. local obj = getObj(pos)
  932. if canTarget(obj) and obj.pos ~= attacker.pos then
  933. targets[#targets+1] = obj
  934. end
  935. if #targets >= cnt then
  936. return
  937. end
  938. end
  939. end
  940. --技能目标(指定第几个目标)
  941. local function handler12(attacker,targetMode,skillTargets)
  942. local targetSide = getTargetSide(attacker,targetMode)
  943. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  944. -- assert()
  945. --end
  946. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  947. local atkPos = attacker.backupPos or attacker.pos
  948. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  949. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  950. local obj = getObj(pos)
  951. if canTarget(obj) and obj.pos ~= attacker.pos then
  952. targets[#targets+1] = obj
  953. end
  954. if #targets >= cnt then
  955. return
  956. end
  957. end
  958. end
  959. --被击时攻击者
  960. local function handler13(attacker,targetMode,skillTargets)
  961. local targetSide = getTargetSide(attacker,targetMode)
  962. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  963. -- assert()
  964. --end
  965. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  966. local atkPos = attacker.backupPos or attacker.pos
  967. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  968. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  969. local obj = getObj(pos)
  970. if canTarget(obj) and obj.pos ~= attacker.pos then
  971. targets[#targets+1] = obj
  972. end
  973. if #targets >= cnt then
  974. return
  975. end
  976. end
  977. end
  978. --技能目标(生命高于或者低于攻击方)
  979. local function handler15(attacker,targetMode,skillTargets)
  980. local targetSide = getTargetSide(attacker,targetMode)
  981. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  982. -- assert()
  983. --end
  984. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  985. local atkPos = attacker.backupPos or attacker.pos
  986. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  987. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  988. local obj = getObj(pos)
  989. if canTarget(obj) and obj.pos ~= attacker.pos then
  990. targets[#targets+1] = obj
  991. end
  992. if #targets >= cnt then
  993. return
  994. end
  995. end
  996. end
  997. --技能目标(护甲高于或者低于攻击方)
  998. local function handler16(attacker,targetMode,skillTargets)
  999. local targetSide = getTargetSide(attacker,targetMode)
  1000. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  1001. -- assert()
  1002. --end
  1003. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  1004. local atkPos = attacker.backupPos or attacker.pos
  1005. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  1006. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  1007. local obj = getObj(pos)
  1008. if canTarget(obj) and obj.pos ~= attacker.pos then
  1009. targets[#targets+1] = obj
  1010. end
  1011. if #targets >= cnt then
  1012. return
  1013. end
  1014. end
  1015. end
  1016. --血量百分比最少
  1017. local function handler17(attacker,targetMode)
  1018. local targetSide = getTargetSide(attacker,targetMode)
  1019. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  1020. -- assert()
  1021. --end
  1022. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  1023. local atkPos = attacker.backupPos or attacker.pos
  1024. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  1025. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  1026. local obj = getObj(pos)
  1027. if canTarget(obj) and obj.pos ~= attacker.pos then
  1028. targets[#targets+1] = obj
  1029. end
  1030. if #targets >= cnt then
  1031. return
  1032. end
  1033. end
  1034. end
  1035. --血量最少,优先选择非满血的英雄
  1036. local function handler18(attacker,targetMode)
  1037. local targetSide = getTargetSide(attacker,targetMode)
  1038. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  1039. -- assert()
  1040. --end
  1041. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  1042. local atkPos = attacker.backupPos or attacker.pos
  1043. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  1044. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  1045. local obj = getObj(pos)
  1046. if canTarget(obj) and obj.pos ~= attacker.pos then
  1047. targets[#targets+1] = obj
  1048. end
  1049. if #targets >= cnt then
  1050. return
  1051. end
  1052. end
  1053. end
  1054. --随机后排,优先选择非满血的英雄
  1055. local function handler19(attacker,targetMode)
  1056. local targetSide = getTargetSide(attacker,targetMode)
  1057. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  1058. -- assert()
  1059. --end
  1060. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  1061. local atkPos = attacker.backupPos or attacker.pos
  1062. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  1063. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  1064. local obj = getObj(pos)
  1065. if canTarget(obj) and obj.pos ~= attacker.pos then
  1066. targets[#targets+1] = obj
  1067. end
  1068. if #targets >= cnt then
  1069. return
  1070. end
  1071. end
  1072. end
  1073. --随机,优先选择非满血的英雄
  1074. local function handler20(attacker,targetMode)
  1075. local targetSide = getTargetSide(attacker,targetMode)
  1076. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  1077. -- assert()
  1078. --end
  1079. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  1080. local atkPos = attacker.backupPos or attacker.pos
  1081. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  1082. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  1083. local obj = getObj(pos)
  1084. if canTarget(obj) and obj.pos ~= attacker.pos then
  1085. targets[#targets+1] = obj
  1086. end
  1087. if #targets >= cnt then
  1088. return
  1089. end
  1090. end
  1091. end
  1092. --非技能目标
  1093. local function handler22(attacker,targetMode,skillTargets)
  1094. local targetSide = getTargetSide(attacker,targetMode)
  1095. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  1096. -- assert()
  1097. --end
  1098. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  1099. local atkPos = attacker.backupPos or attacker.pos
  1100. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  1101. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  1102. local obj = getObj(pos)
  1103. if canTarget(obj) and obj.pos ~= attacker.pos then
  1104. targets[#targets+1] = obj
  1105. end
  1106. if #targets >= cnt then
  1107. return
  1108. end
  1109. end
  1110. end
  1111. --技能目标(速度高于或者低于攻击方)
  1112. local function handler23(attacker,targetMode,skillTargets)
  1113. local targetSide = getTargetSide(attacker,targetMode)
  1114. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  1115. -- assert()
  1116. --end
  1117. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  1118. local atkPos = attacker.backupPos or attacker.pos
  1119. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  1120. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  1121. local obj = getObj(pos)
  1122. if canTarget(obj) and obj.pos ~= attacker.pos then
  1123. targets[#targets+1] = obj
  1124. end
  1125. if #targets >= cnt then
  1126. return
  1127. end
  1128. end
  1129. end
  1130. --默认顺序位置2
  1131. local function handler27(attacker,targetMode)
  1132. local targetSide = getTargetSide(attacker,targetMode)
  1133. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  1134. -- assert()
  1135. --end
  1136. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  1137. local atkPos = attacker.backupPos or attacker.pos
  1138. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  1139. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  1140. local obj = getObj(pos)
  1141. if canTarget(obj) and obj.pos ~= attacker.pos then
  1142. targets[#targets+1] = obj
  1143. end
  1144. if #targets >= cnt then
  1145. return
  1146. end
  1147. end
  1148. end
  1149. --攻击最高
  1150. local function handler30(attacker,targetMode)
  1151. local targetSide = getTargetSide(attacker,targetMode)
  1152. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  1153. -- assert()
  1154. --end
  1155. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  1156. local atkPos = attacker.backupPos or attacker.pos
  1157. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  1158. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  1159. local obj = getObj(pos)
  1160. if canTarget(obj) and obj.pos ~= attacker.pos then
  1161. targets[#targets+1] = obj
  1162. end
  1163. if #targets >= cnt then
  1164. return
  1165. end
  1166. end
  1167. end
  1168. --从技能目标中根据职业选择
  1169. --[=[
  1170. @param2 = {
  1171. handlerID,
  1172. jobs -- 职业集合
  1173. cnt,
  1174. }
  1175. ]=]--
  1176. local function handler34(attacker,targetMode, skillTargets)
  1177. local job = targetMode[2] or {}
  1178. local cnt = targetMode[3] or 1
  1179. local targetObjList = {}
  1180. for _,obj in ipairs (skillTargets) do
  1181. if canTarget(obj) and table.find(job,obj.job) then
  1182. targetObjList[#targetObjList + 1] = obj
  1183. end
  1184. end
  1185. -- 筛选最后的targets
  1186. table.shuffle(targetObjList)
  1187. for i = 1,#targetObjList do
  1188. targets[#targets+1] = targetObjList[i]
  1189. if #targets >= cnt then
  1190. break
  1191. end
  1192. end
  1193. end
  1194. -- 从全体中根据种族选择
  1195. --[[
  1196. @param2 = {
  1197. handlerID,
  1198. side 0: 全部双方 1:敌方 2: 己方
  1199. campList -- 种族集合
  1200. onjCnt 目标数量, 默认1
  1201. }
  1202. ]]
  1203. local function handler35(attacker,targetMode,skillTargets)
  1204. local targetSide = getTargetSide(attacker,targetMode)
  1205. local campList = targetMode[3] or {}
  1206. local cnt = targetMode[4] or 1
  1207. local targetList = {}
  1208. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  1209. local obj = getObj(pos)
  1210. if canTarget(obj) and table.find(campList, obj.camp) then
  1211. targetList[#targetList+1] = obj
  1212. end
  1213. end
  1214. for _, obj in ipairs (targetList) do
  1215. if #targets >= cnt then
  1216. break
  1217. end
  1218. targets[#targets + 1] = obj
  1219. end
  1220. end
  1221. -- 按照属性X排序,选择前Y个目标, 且排除技能施放者,属性值需要比技能施放者高/低
  1222. --[[
  1223. @param2 = {
  1224. handlerID,
  1225. side,
  1226. cnt, 选择的数量 默认为1
  1227. attrID, 属性ID
  1228. cmpType, 比技能施放者属性高/低, 1 高, 0 低
  1229. }
  1230. ]]
  1231. local function handler36(attacker,targetMode)
  1232. local cnt = targetMode[3] or 1
  1233. local attrID = targetMode[4] or RoleDefine.HP -- 默认是HP
  1234. local cmpType = targetMode[5] or 0 --默认是比施放者属性低
  1235. local targetList = {}
  1236. local targetSide = getTargetSide(attacker,targetMode)
  1237. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  1238. local obj = getObj(pos)
  1239. if canTarget(obj) and obj.pos ~= attacker.pos then
  1240. targetList[#targetList+1] = obj
  1241. end
  1242. end
  1243. table.sort(targetList,function(a,b)
  1244. local a_attr = CombatObj.getValue(a,attrID)
  1245. local b_attr = CombatObj.getValue(b,attrID)
  1246. local ret = a_attr < b_attr
  1247. return ret
  1248. end)
  1249. local attackerVal = CombatObj.getValue(attacker, attrID)
  1250. for i = 1,cnt do
  1251. local targetObjVal = CombatObj.getValue(targetList[i], attrID)
  1252. if cmpType == 0 then --比施放者低
  1253. if targetObjVal > attackerVal then
  1254. break
  1255. end
  1256. targets[#targets + 1] = targetList[i]
  1257. else
  1258. if targetObjVal > attackerVal then
  1259. targets[#targets + 1] = targetList[i]
  1260. end
  1261. end
  1262. if #targets >= cnt then
  1263. break
  1264. end
  1265. end
  1266. end
  1267. -- 在技能目标中选择友方/敌方
  1268. local function handler37(attacker,targetMode,skillTargets)
  1269. local targetSide = getTargetSide(attacker,targetMode)
  1270. for _,obj in ipairs (skillTargets) do
  1271. if obj.side == targetSide then
  1272. targets[#targets + 1] = obj
  1273. end
  1274. end
  1275. end
  1276. -- 从全体中根据职业选择
  1277. --[[
  1278. @param2 = {
  1279. handlerID,
  1280. side 0: 全部双方 1:敌方 2: 己方
  1281. jobList -- 职业集合
  1282. onjCnt 目标数量, 默认1
  1283. }
  1284. ]]
  1285. local function handler38(attacker,targetMode,skillTargets)
  1286. local targetSide = getTargetSide(attacker,targetMode)
  1287. local jobList = targetMode[3] or {}
  1288. local cnt = targetMode[4] or 1
  1289. local targetList = {}
  1290. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS3[targetSide]) do
  1291. local obj = getObj(pos)
  1292. if canTarget(obj) and table.find(jobList, obj.job) then
  1293. targetList[#targetList+1] = obj
  1294. end
  1295. end
  1296. for _, obj in ipairs (targetList) do
  1297. if #targets >= cnt then
  1298. break
  1299. end
  1300. targets[#targets + 1] = obj
  1301. end
  1302. end
  1303. ------------------------------ 分界线 ------------------------------
  1304. -- 目前是一样了,等策划配置好skill表后删掉 @mafei
  1305. local function handler3(attacker,targetMode)
  1306. return handler28(attacker,targetMode)
  1307. end
  1308. --------------------------------------------------------------------
  1309. handler[1] = handler1 --1 默认顺序位置
  1310. handler[2] = handler2 --2 全体
  1311. handler[3] = handler3 --3 前排,中排,后排
  1312. handler[4] = handler4 --4 前方一列
  1313. handler[5] = handler5 --5 随机前排,中排,后排
  1314. handler[6] = handler6 --6 随机
  1315. handler[7] = handler7 --7 血量最少
  1316. handler[8] = handler8 --8 血量最高
  1317. handler[9] = handler9 --9 攻击最高
  1318. handler[10] = handler10 --10 自己
  1319. handler[11] = handler11 --11 技能目标(所有目标)
  1320. handler[12] = handler12 --12 技能目标(指定第几个目标)
  1321. handler[13] = handler13 --13 被击时攻击者
  1322. handler[14] = handler14 --14 额外作用目标
  1323. handler[15] = handler15 --15 技能目标(生命高于或者低于攻击方)
  1324. handler[16] = handler16 --16 技能目标(护甲高于或者低于攻击方)
  1325. handler[17] = handler17 --17 技能目标(血量百分比最少)
  1326. handler[18] = handler18 --18 技能目标(血量最少,优先选择非满血的英雄)
  1327. handler[19] = handler19 --19 随机后排,优先选择非满血的英雄
  1328. handler[20] = handler20 --20 随机,优先选择非满血的英雄
  1329. handler[21] = handler21 --21 死亡武将
  1330. handler[22] = handler22 --22 非技能目标
  1331. handler[23] = handler23 --23 技能目标(速度高于或者低于攻击方)
  1332. handler[24] = handler24 --24 职业+攻击力排名
  1333. handler[25] = handler25 --25 职业优先
  1334. handler[26] = handler26 --26 同一列
  1335. handler[27] = handler27 --27 同一列
  1336. handler[28] = handler28 --27 同一列
  1337. handler[29] = handler29 --27 同一列
  1338. handler[30] = handler30 --30 自己跟目标攻击最高
  1339. handler[31] = handler31 --31 同行人数最多
  1340. handler[32] = handler32 --32 指定buff选择
  1341. handler[33] = handler33 --32 指定buff选择
  1342. handler[0] = handler0 -- 技能选取 和11相同
  1343. handler[34] = handler34 --从技能目标中根据职业选择
  1344. handler[35] = handler35 --从全体中根据种族选择
  1345. handler[36] = handler36 --按照属性X排序,选择前Y个目标, 且排除技能施放者,属性值需要比技能施放者高/低
  1346. handler[37] = handler37 -- 在技能目标中选择友方/敌方
  1347. handler[38] = handler38 --从全体中根据职业选择
  1348. --对象选择器end