TargetMode.lua 39 KB

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