TargetMode.lua 33 KB

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