TargetMode.lua 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975
  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. local function getTargetSide(attacker,targetMode)
  14. if targetMode[2] == 0 then
  15. return 0
  16. elseif targetMode[2] == 1 then
  17. if attacker.side == CombatDefine.ATTACK_SIDE then
  18. return CombatDefine.DEFEND_SIDE
  19. else
  20. return CombatDefine.ATTACK_SIDE
  21. end
  22. elseif targetMode[2] == 2 then
  23. return attacker.side
  24. end
  25. end
  26. local function canTarget(obj)
  27. if obj and obj.hp and obj.hp > 0 and not CombatBuff.isStatus(obj,{"revive"}) and CombatDefine.isBackup(obj) ~= CombatDefine.BACKUP_TYPE1 then
  28. return true
  29. end
  30. end
  31. -- 同列敌方找不到 随机上下找一列 有敌方的 策划 要求随机
  32. local function getColumn2PosRandom(yetList)
  33. local randomList = {}
  34. for i= 1, 3 do
  35. if not yetList[i] then
  36. randomList[#randomList + 1] = i
  37. end
  38. end
  39. if #randomList > 0 then
  40. local random = math.random(1, #randomList)
  41. local newColumn = randomList[random]
  42. yetList[newColumn] = true
  43. return newColumn, yetList
  44. end
  45. return 0, yetList
  46. end
  47. function getObj(pos)
  48. -- 不能直接取 援军对象
  49. if pos == CombatDefine.BACKUP_POS[1] or pos == CombatDefine.BACKUP_POS[2] then return end
  50. local obj = CombatImpl.objList[pos]
  51. local backupPos = pos < CombatDefine.COMBAT_HERO_CNT and CombatDefine.BACKUP_POS[1] or CombatDefine.BACKUP_POS[2]
  52. local backupObj = CombatImpl.objList[backupPos]
  53. -- 援军已上场
  54. if backupObj and backupObj.backupPos == pos then
  55. return backupObj
  56. end
  57. return obj
  58. end
  59. --
  60. CAN_EMPTY_TARGET = { [22] = 1 }
  61. function getTargets(attacker, targetMode, skillTargets, cmdTargets, checkChaofen, isNormalAtk, skillID)
  62. for i = 1, #targets do
  63. targets[i] = nil
  64. end
  65. handlerInit(attacker, targetMode)
  66. if isNormalAtk then
  67. local isStatus, cmd, ind = CombatBuff.isStatus(attacker, { "tiaoxin" })
  68. if isStatus then
  69. local buffer = attacker.buffer[ind]
  70. local target = buffer.attackPos and getObj(buffer.attackPos)
  71. if canTarget(target) then
  72. targets[#targets + 1] = target
  73. end
  74. elseif attacker.normalTarget and attacker.normalTarget.status then
  75. handlerStatus(attacker, attacker.normalTarget.status)
  76. end
  77. end
  78. if targets[1] == nil then
  79. if checkChaofen then
  80. -- 检查是否被嘲讽
  81. local chaofen, fromPos = CombatBuff.isChaofen(attacker)
  82. if chaofen then
  83. local obj = getObj(fromPos)
  84. if canTarget(obj) and obj.pos ~= attacker.pos then
  85. return { obj }, true
  86. end
  87. end
  88. end
  89. if skillID and CombatBuff.isStatus(attacker, { "hunluan" }) and CombatImpl.isFanji == false then
  90. handlerHunluan(attacker, targetMode)
  91. elseif handler[targetMode[1]] then
  92. handler[targetMode[1]](attacker, targetMode, skillTargets, cmdTargets, skillID)
  93. end
  94. if not CAN_EMPTY_TARGET[targetMode[1]] and targetMode[2] == 1 and targets[1] == nil and targetMode[1] ~= 32 then
  95. handler[1](attacker, targetMode, skillTargets)
  96. end
  97. handlerFenTan(attacker, targetMode, skillTargets, cmdTargets, skillID)
  98. end
  99. local ret = { }
  100. for _, v in ipairs(targets) do
  101. ret[#ret + 1] = v
  102. end
  103. return ret
  104. end
  105. --默认顺序位置
  106. function handler1(attacker,targetMode)
  107. local targetSide = getTargetSide(attacker,targetMode)
  108. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  109. -- assert()
  110. --end
  111. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  112. local atkPos = attacker.backupPos or attacker.pos
  113. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  114. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS[atkPos]) do
  115. local obj = getObj(pos)
  116. if canTarget(obj) and obj.pos ~= attacker.pos then
  117. targets[#targets+1] = obj
  118. end
  119. if #targets >= cnt then
  120. return
  121. end
  122. end
  123. end
  124. --全体
  125. function handler2(attacker,targetMode)
  126. local targetSide = getTargetSide(attacker,targetMode)
  127. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  128. -- assert()
  129. --end
  130. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  131. local atkPos = attacker.backupPos or attacker.pos
  132. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  133. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS[atkPos]) do
  134. local obj = getObj(pos)
  135. if canTarget(obj) and obj.pos ~= attacker.pos then
  136. targets[#targets+1] = obj
  137. end
  138. if #targets >= cnt then
  139. return
  140. end
  141. end
  142. end
  143. --前排,中排,后排
  144. function handler3(attacker,targetMode)
  145. local targetSide = getTargetSide(attacker,targetMode)
  146. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  147. -- assert()
  148. --end
  149. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  150. local atkPos = attacker.backupPos or attacker.pos
  151. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  152. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS[atkPos]) do
  153. local obj = getObj(pos)
  154. if canTarget(obj) and obj.pos ~= attacker.pos then
  155. targets[#targets+1] = obj
  156. end
  157. if #targets >= cnt then
  158. return
  159. end
  160. end
  161. end
  162. --最近一列
  163. function handler4(attacker,targetMode)
  164. local targetSide = getTargetSide(attacker,targetMode)
  165. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  166. -- assert()
  167. --end
  168. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  169. local atkPos = attacker.backupPos or attacker.pos
  170. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  171. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS[atkPos]) do
  172. local obj = getObj(pos)
  173. if canTarget(obj) and obj.pos ~= attacker.pos then
  174. targets[#targets+1] = obj
  175. end
  176. if #targets >= cnt then
  177. return
  178. end
  179. end
  180. end
  181. --随机前,中,后排
  182. function handler5(attacker,targetMode)
  183. local targetSide = getTargetSide(attacker,targetMode)
  184. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  185. -- assert()
  186. --end
  187. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  188. local atkPos = attacker.backupPos or attacker.pos
  189. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  190. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS[atkPos]) do
  191. local obj = getObj(pos)
  192. if canTarget(obj) and obj.pos ~= attacker.pos then
  193. targets[#targets+1] = obj
  194. end
  195. if #targets >= cnt then
  196. return
  197. end
  198. end
  199. end
  200. --随机
  201. function handler6(attacker,targetMode)
  202. local targetSide = getTargetSide(attacker,targetMode)
  203. if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  204. assert()
  205. end
  206. local cnt = targetMode[3] or 1
  207. local noSelf = targetMode[5]
  208. local temp = {}
  209. for i = 1,CombatDefine.COMBAT_HERO_CNT do
  210. local pos = CombatDefine.SIDE2POS[targetSide][i]
  211. if not (noSelf and pos == attacker.pos) then
  212. local obj = getObj(pos)
  213. if canTarget(obj) then
  214. temp[#temp+1] = obj
  215. end
  216. end
  217. end
  218. if #temp > 0 then
  219. for i = 1,cnt do
  220. local r = math.ceil(math.random(0,#temp))
  221. r = r == 0 and 1 or r
  222. targets[#targets+1] = temp[r]
  223. temp[r] = temp[#temp]
  224. temp[#temp] = nil
  225. if #temp <= 0 then
  226. break
  227. end
  228. end
  229. end
  230. if noSelf == 2 and canTarget(attacker) then
  231. targets[#targets+1] = attacker
  232. end
  233. end
  234. --血量最少
  235. function handler7(attacker,targetMode)
  236. local targetSide = getTargetSide(attacker,targetMode)
  237. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  238. -- assert()
  239. --end
  240. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  241. local atkPos = attacker.backupPos or attacker.pos
  242. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  243. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS[atkPos]) do
  244. local obj = getObj(pos)
  245. if canTarget(obj) and obj.pos ~= attacker.pos then
  246. targets[#targets+1] = obj
  247. end
  248. if #targets >= cnt then
  249. return
  250. end
  251. end
  252. end
  253. --血量最高
  254. function handler8(attacker,targetMode)
  255. local targetSide = getTargetSide(attacker,targetMode)
  256. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  257. -- assert()
  258. --end
  259. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  260. local atkPos = attacker.backupPos or attacker.pos
  261. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  262. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS[atkPos]) do
  263. local obj = getObj(pos)
  264. if canTarget(obj) and obj.pos ~= attacker.pos then
  265. targets[#targets+1] = obj
  266. end
  267. if #targets >= cnt then
  268. return
  269. end
  270. end
  271. end
  272. --攻击最高
  273. function handler9(attacker,targetMode)
  274. local targetSide = getTargetSide(attacker,targetMode)
  275. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  276. -- assert()
  277. --end
  278. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  279. local atkPos = attacker.backupPos or attacker.pos
  280. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  281. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS[atkPos]) do
  282. local obj = getObj(pos)
  283. if canTarget(obj) and obj.pos ~= attacker.pos then
  284. targets[#targets+1] = obj
  285. end
  286. if #targets >= cnt then
  287. return
  288. end
  289. end
  290. end
  291. --自己
  292. function handler10(attacker,targetMode,skillTargets)
  293. --if canTarget(obj) then
  294. targets[1] = attacker
  295. --end
  296. end
  297. --技能目标(所有目标)
  298. function handler11(attacker,targetMode,skillTargets)
  299. local targetSide = getTargetSide(attacker,targetMode)
  300. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  301. -- assert()
  302. --end
  303. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  304. local atkPos = attacker.backupPos or attacker.pos
  305. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  306. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS[atkPos]) do
  307. local obj = getObj(pos)
  308. if canTarget(obj) and obj.pos ~= attacker.pos then
  309. targets[#targets+1] = obj
  310. end
  311. if #targets >= cnt then
  312. return
  313. end
  314. end
  315. end
  316. --技能目标(指定第几个目标)
  317. function handler12(attacker,targetMode,skillTargets)
  318. local targetSide = getTargetSide(attacker,targetMode)
  319. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  320. -- assert()
  321. --end
  322. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  323. local atkPos = attacker.backupPos or attacker.pos
  324. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  325. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS[atkPos]) do
  326. local obj = getObj(pos)
  327. if canTarget(obj) and obj.pos ~= attacker.pos then
  328. targets[#targets+1] = obj
  329. end
  330. if #targets >= cnt then
  331. return
  332. end
  333. end
  334. end
  335. --被击时攻击者
  336. function handler13(attacker,targetMode,skillTargets)
  337. local targetSide = getTargetSide(attacker,targetMode)
  338. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  339. -- assert()
  340. --end
  341. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  342. local atkPos = attacker.backupPos or attacker.pos
  343. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  344. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS[atkPos]) do
  345. local obj = getObj(pos)
  346. if canTarget(obj) and obj.pos ~= attacker.pos then
  347. targets[#targets+1] = obj
  348. end
  349. if #targets >= cnt then
  350. return
  351. end
  352. end
  353. end
  354. --额外作用目标
  355. function handler14(attacker,targetMode,skillTargets,cmdTargets)
  356. local targetSide = getTargetSide(attacker,targetMode)
  357. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  358. -- assert()
  359. --end
  360. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  361. local atkPos = attacker.backupPos or attacker.pos
  362. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  363. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS[atkPos]) do
  364. local obj = getObj(pos)
  365. if canTarget(obj) and obj.pos ~= attacker.pos then
  366. targets[#targets+1] = obj
  367. end
  368. if #targets >= cnt then
  369. return
  370. end
  371. end
  372. end
  373. --技能目标(生命高于或者低于攻击方)
  374. function handler15(attacker,targetMode,skillTargets)
  375. local targetSide = getTargetSide(attacker,targetMode)
  376. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  377. -- assert()
  378. --end
  379. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  380. local atkPos = attacker.backupPos or attacker.pos
  381. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  382. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS[atkPos]) do
  383. local obj = getObj(pos)
  384. if canTarget(obj) and obj.pos ~= attacker.pos then
  385. targets[#targets+1] = obj
  386. end
  387. if #targets >= cnt then
  388. return
  389. end
  390. end
  391. end
  392. --技能目标(护甲高于或者低于攻击方)
  393. function handler16(attacker,targetMode,skillTargets)
  394. local targetSide = getTargetSide(attacker,targetMode)
  395. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  396. -- assert()
  397. --end
  398. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  399. local atkPos = attacker.backupPos or attacker.pos
  400. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  401. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS[atkPos]) do
  402. local obj = getObj(pos)
  403. if canTarget(obj) and obj.pos ~= attacker.pos then
  404. targets[#targets+1] = obj
  405. end
  406. if #targets >= cnt then
  407. return
  408. end
  409. end
  410. end
  411. --血量百分比最少
  412. function handler17(attacker,targetMode)
  413. local targetSide = getTargetSide(attacker,targetMode)
  414. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  415. -- assert()
  416. --end
  417. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  418. local atkPos = attacker.backupPos or attacker.pos
  419. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  420. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS[atkPos]) do
  421. local obj = getObj(pos)
  422. if canTarget(obj) and obj.pos ~= attacker.pos then
  423. targets[#targets+1] = obj
  424. end
  425. if #targets >= cnt then
  426. return
  427. end
  428. end
  429. end
  430. --血量最少,优先选择非满血的英雄
  431. function handler18(attacker,targetMode)
  432. local targetSide = getTargetSide(attacker,targetMode)
  433. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  434. -- assert()
  435. --end
  436. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  437. local atkPos = attacker.backupPos or attacker.pos
  438. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  439. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS[atkPos]) do
  440. local obj = getObj(pos)
  441. if canTarget(obj) and obj.pos ~= attacker.pos then
  442. targets[#targets+1] = obj
  443. end
  444. if #targets >= cnt then
  445. return
  446. end
  447. end
  448. end
  449. --随机后排,优先选择非满血的英雄
  450. function handler19(attacker,targetMode)
  451. local targetSide = getTargetSide(attacker,targetMode)
  452. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  453. -- assert()
  454. --end
  455. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  456. local atkPos = attacker.backupPos or attacker.pos
  457. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  458. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS[atkPos]) do
  459. local obj = getObj(pos)
  460. if canTarget(obj) and obj.pos ~= attacker.pos then
  461. targets[#targets+1] = obj
  462. end
  463. if #targets >= cnt then
  464. return
  465. end
  466. end
  467. end
  468. --随机,优先选择非满血的英雄
  469. function handler20(attacker,targetMode)
  470. local targetSide = getTargetSide(attacker,targetMode)
  471. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  472. -- assert()
  473. --end
  474. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  475. local atkPos = attacker.backupPos or attacker.pos
  476. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  477. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS[atkPos]) do
  478. local obj = getObj(pos)
  479. if canTarget(obj) and obj.pos ~= attacker.pos then
  480. targets[#targets+1] = obj
  481. end
  482. if #targets >= cnt then
  483. return
  484. end
  485. end
  486. end
  487. --全体
  488. function handler21(attacker,targetMode)
  489. local targetSide = getTargetSide(attacker,targetMode)
  490. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  491. -- assert()
  492. --end
  493. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  494. local atkPos = attacker.backupPos or attacker.pos
  495. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  496. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS[atkPos]) do
  497. local obj = getObj(pos)
  498. if canTarget(obj) and obj.pos ~= attacker.pos then
  499. targets[#targets+1] = obj
  500. end
  501. if #targets >= cnt then
  502. return
  503. end
  504. end
  505. end
  506. --非技能目标
  507. function handler22(attacker,targetMode,skillTargets)
  508. local targetSide = getTargetSide(attacker,targetMode)
  509. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  510. -- assert()
  511. --end
  512. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  513. local atkPos = attacker.backupPos or attacker.pos
  514. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  515. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS[atkPos]) do
  516. local obj = getObj(pos)
  517. if canTarget(obj) and obj.pos ~= attacker.pos then
  518. targets[#targets+1] = obj
  519. end
  520. if #targets >= cnt then
  521. return
  522. end
  523. end
  524. end
  525. --技能目标(速度高于或者低于攻击方)
  526. function handler23(attacker,targetMode,skillTargets)
  527. local targetSide = getTargetSide(attacker,targetMode)
  528. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  529. -- assert()
  530. --end
  531. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  532. local atkPos = attacker.backupPos or attacker.pos
  533. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  534. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS[atkPos]) do
  535. local obj = getObj(pos)
  536. if canTarget(obj) and obj.pos ~= attacker.pos then
  537. targets[#targets+1] = obj
  538. end
  539. if #targets >= cnt then
  540. return
  541. end
  542. end
  543. end
  544. --职业+攻击力排名
  545. function handler24(attacker,targetMode)
  546. local targetSide = getTargetSide(attacker,targetMode)
  547. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  548. -- assert()
  549. --end
  550. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  551. local atkPos = attacker.backupPos or attacker.pos
  552. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  553. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS[atkPos]) do
  554. local obj = getObj(pos)
  555. if canTarget(obj) and obj.pos ~= attacker.pos then
  556. targets[#targets+1] = obj
  557. end
  558. if #targets >= cnt then
  559. return
  560. end
  561. end
  562. end
  563. --职业优先
  564. function handler25(attacker,targetMode)
  565. local targetSide = getTargetSide(attacker,targetMode)
  566. if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  567. assert()
  568. end
  569. local cnt = targetMode[3] or 1
  570. local job = targetMode[4]
  571. local temp = {}
  572. for _,pos in ipairs(CombatDefine.SIDE2POS[targetSide]) do
  573. local obj = getObj(pos)
  574. if canTarget(obj) and obj.job == job then
  575. targets[#targets + 1] = obj
  576. end
  577. if #targets >= cnt then
  578. break
  579. end
  580. end
  581. if #targets == 0 then
  582. handler1(attacker,targetMode)
  583. end
  584. return
  585. end
  586. --同列
  587. function handler26(attacker,targetMode)
  588. local targetSide = getTargetSide(attacker,targetMode)
  589. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  590. -- assert()
  591. --end
  592. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  593. local atkPos = attacker.backupPos or attacker.pos
  594. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  595. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS[atkPos]) do
  596. local obj = getObj(pos)
  597. if canTarget(obj) and obj.pos ~= attacker.pos then
  598. targets[#targets+1] = obj
  599. end
  600. if #targets >= cnt then
  601. return
  602. end
  603. end
  604. end
  605. --默认顺序位置2
  606. function handler27(attacker,targetMode)
  607. local targetSide = getTargetSide(attacker,targetMode)
  608. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  609. -- assert()
  610. --end
  611. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  612. local atkPos = attacker.backupPos or attacker.pos
  613. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  614. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS[atkPos]) do
  615. local obj = getObj(pos)
  616. if canTarget(obj) and obj.pos ~= attacker.pos then
  617. targets[#targets+1] = obj
  618. end
  619. if #targets >= cnt then
  620. return
  621. end
  622. end
  623. end
  624. --前排,中排,后排
  625. function handler28(attacker,targetMode)
  626. local targetSide = getTargetSide(attacker,targetMode)
  627. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  628. -- assert()
  629. --end
  630. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  631. local atkPos = attacker.backupPos or attacker.pos
  632. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  633. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS[atkPos]) do
  634. local obj = getObj(pos)
  635. if canTarget(obj) and obj.pos ~= attacker.pos then
  636. targets[#targets+1] = obj
  637. end
  638. if #targets >= cnt then
  639. return
  640. end
  641. end
  642. end
  643. --随机 选择目标 多次
  644. function handler29(attacker,targetMode)
  645. local targetSide = getTargetSide(attacker,targetMode)
  646. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  647. -- assert()
  648. --end
  649. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  650. local atkPos = attacker.backupPos or attacker.pos
  651. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  652. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS[atkPos]) do
  653. local obj = getObj(pos)
  654. if canTarget(obj) and obj.pos ~= attacker.pos then
  655. targets[#targets+1] = obj
  656. end
  657. if #targets >= cnt then
  658. return
  659. end
  660. end
  661. end
  662. --攻击最高
  663. function handler30(attacker,targetMode)
  664. local targetSide = getTargetSide(attacker,targetMode)
  665. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  666. -- assert()
  667. --end
  668. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  669. local atkPos = attacker.backupPos or attacker.pos
  670. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  671. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS[atkPos]) do
  672. local obj = getObj(pos)
  673. if canTarget(obj) and obj.pos ~= attacker.pos then
  674. targets[#targets+1] = obj
  675. end
  676. if #targets >= cnt then
  677. return
  678. end
  679. end
  680. end
  681. --前排,中排,后排
  682. function handler31(attacker,targetMode)
  683. local targetSide = getTargetSide(attacker,targetMode)
  684. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  685. -- assert()
  686. --end
  687. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  688. local atkPos = attacker.backupPos or attacker.pos
  689. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  690. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS[atkPos]) do
  691. local obj = getObj(pos)
  692. if canTarget(obj) and obj.pos ~= attacker.pos then
  693. targets[#targets+1] = obj
  694. end
  695. if #targets >= cnt then
  696. return
  697. end
  698. end
  699. end
  700. -- 根据指定buff层数选择目标
  701. function handler32(attacker, targetMode, skillTargets, cmdTargets, skillID)
  702. local targetSide = getTargetSide(attacker,targetMode)
  703. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  704. -- assert()
  705. --end
  706. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  707. local atkPos = attacker.backupPos or attacker.pos
  708. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  709. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS[atkPos]) do
  710. local obj = getObj(pos)
  711. if canTarget(obj) and obj.pos ~= attacker.pos then
  712. targets[#targets+1] = obj
  713. end
  714. if #targets >= cnt then
  715. return
  716. end
  717. end
  718. end
  719. --随机攻击防御速度最高
  720. function handler33(attacker,targetMode)
  721. local targetSide = getTargetSide(attacker,targetMode)
  722. --if targetSide ~= CombatDefine.ATTACK_SIDE and targetSide ~= CombatDefine.DEFEND_SIDE then
  723. -- assert()
  724. --end
  725. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  726. local atkPos = attacker.backupPos or attacker.pos
  727. atkPos = atkPos % CombatDefine.COMBAT_HERO_ALL_CNT
  728. for _,pos in ipairs(CombatDefine.DEFAULT_TARGET_POS[atkPos]) do
  729. local obj = getObj(pos)
  730. if canTarget(obj) and obj.pos ~= attacker.pos then
  731. targets[#targets+1] = obj
  732. end
  733. if #targets >= cnt then
  734. return
  735. end
  736. end
  737. end
  738. function handlerInit(attacker, targetMode)
  739. -- 清除分摊标志
  740. attacker.handBuffCalcType = nil
  741. for _, pos in ipairs(CombatDefine.SIDE2POS[0]) do
  742. local obj = getObj(pos)
  743. if obj then
  744. obj.fentq = nil
  745. end
  746. end
  747. end
  748. -- 处理所有对象是否需要分摊
  749. function handlerFenTan(attacker, targetMode, skillTargets, cmdTargets, skillID)
  750. if #targets <= 0 then return end
  751. if skillID then
  752. local skillConfig = SkillExcel[skillID]
  753. if skillConfig then
  754. if skillConfig.otherArgs and skillConfig.otherArgs.hurtFenTan then
  755. return
  756. end
  757. end
  758. end
  759. local tagObj = targets[1]
  760. local targetSide = tagObj.side
  761. local fentq = {}
  762. local fentCnt = 0
  763. for _, pos in ipairs(CombatDefine.SIDE2POS[targetSide]) do
  764. local obj = getObj(pos)
  765. if obj and canTarget(obj) and obj.bufferCmd["fentan"] then
  766. fentq[pos] = 1
  767. fentCnt = fentCnt + 1
  768. end
  769. end
  770. -- 分摊比列
  771. for _, pos in ipairs(CombatDefine.SIDE2POS[targetSide]) do
  772. local obj = getObj(pos)
  773. if obj and canTarget(obj) and obj.bufferCmd["fentan"] then
  774. obj.fentq = fentCnt
  775. -- 把不在队列的分摊对象加入到队列当中
  776. local find = false
  777. for _, tarobj in ipairs(targets) do
  778. if tarobj.pos == obj.pos then
  779. find = true
  780. end
  781. end
  782. if not find then
  783. targets[#targets + 1] = obj
  784. end
  785. end
  786. end
  787. end
  788. function handlerHunluan(attacker,targetMode)
  789. local cnt = targetMode[3] or CombatDefine.COMBAT_HERO_ALL_CNT
  790. local len = 0
  791. local selectList = {}
  792. for pos = 1,CombatDefine.COMBAT_HERO_ALL_CNT do
  793. local obj = getObj(pos)
  794. if canTarget(obj) then
  795. len = len + 1
  796. selectList[len] = obj
  797. end
  798. end
  799. -- 混乱要随机选择目标 modify buy dxzeng
  800. local randomLen = #selectList
  801. if randomLen <= 0 or cnt <= 0 then return end
  802. if cnt > randomLen then
  803. cnt = randomLen
  804. end
  805. for index = 1, cnt do
  806. local len = 0
  807. local tempRandom = {}
  808. for k, v in pairs(selectList) do
  809. len = len + 1
  810. tempRandom[len] = k
  811. end
  812. local randomIndex = math.random(1, len)
  813. local selectIndex = tempRandom[randomIndex]
  814. targets[#targets+1] = selectList[selectIndex]
  815. selectList[selectIndex] = nil
  816. end
  817. end
  818. function handlerStatus(attacker,status)
  819. local targetSide
  820. if attacker.side == CombatDefine.ATTACK_SIDE then
  821. targetSide = CombatDefine.DEFEND_SIDE
  822. else
  823. targetSide = CombatDefine.ATTACK_SIDE
  824. end
  825. for _,pos in ipairs(CombatDefine.SIDE2POS[targetSide]) do
  826. local obj = getObj(pos)
  827. if canTarget(obj) and CombatBuff.isStatus(obj,status) then
  828. targets[#targets+1] = obj
  829. return
  830. end
  831. end
  832. end
  833. handler = handler or {} --选择策略
  834. handler[1] = handler1 --1 默认顺序位置
  835. handler[2] = handler2 --2 全体
  836. handler[3] = handler3 --3 前排,中排,后排
  837. handler[4] = handler4 --4 前方一列
  838. handler[5] = handler5 --5 随机前排,中排,后排
  839. handler[6] = handler6 --6 随机
  840. handler[7] = handler7 --7 血量最少
  841. handler[8] = handler8 --8 血量最高
  842. handler[9] = handler9 --9 攻击最高
  843. handler[10] = handler10 --10 自己
  844. handler[11] = handler11 --11 技能目标(所有目标)
  845. handler[12] = handler12 --12 技能目标(指定第几个目标)
  846. handler[13] = handler13 --13 被击时攻击者
  847. handler[14] = handler14 --14 额外作用目标
  848. handler[15] = handler15 --15 技能目标(生命高于或者低于攻击方)
  849. handler[16] = handler16 --16 技能目标(护甲高于或者低于攻击方)
  850. handler[17] = handler17 --17 技能目标(血量百分比最少)
  851. handler[18] = handler18 --18 技能目标(血量最少,优先选择非满血的英雄)
  852. handler[19] = handler19 --19 随机后排,优先选择非满血的英雄
  853. handler[20] = handler20 --20 随机,优先选择非满血的英雄
  854. handler[21] = handler21 --21 死亡武将
  855. handler[22] = handler22 --22 非技能目标
  856. handler[23] = handler23 --23 技能目标(速度高于或者低于攻击方)
  857. handler[24] = handler24 --24 职业+攻击力排名
  858. handler[25] = handler25 --25 职业优先
  859. handler[26] = handler26 --26 同一列
  860. handler[27] = handler27 --27 同一列
  861. handler[28] = handler28 --27 同一列
  862. handler[29] = handler29 --27 同一列
  863. handler[30] = handler30 --30 自己跟目标攻击最高
  864. handler[31] = handler31 --31 同行人数最多
  865. handler[32] = handler32 --32 指定buff选择
  866. handler[33] = handler33 --32 指定buff选择
  867. --对象选择器end