BattleLogic.lua 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045
  1. BattleLogic = {}
  2. local floor = math.floor
  3. local min = math.min
  4. -- local objList = BattleDictionary.New()
  5. local removeObjList = BattleList.New()
  6. local MaxRound = 20
  7. local CurRound = 0
  8. local CurCamp = 0
  9. -- local CurSkillPos = {}
  10. local PosList = {}
  11. local PosIsAttackRecord = {} --< 记录当前回合是否attack过
  12. local CurPosition = -1 --< 当前位置
  13. local MoveTimes = 0 --< 行动次数
  14. local curFrame
  15. local IsHaveTibu=false -- todo yh 是否已经上阵替补
  16. BattleLogic.Type = 0 --1 故事副本 2 地图探索 3 竞技场 4 秘境boss 5 解锁秘境 6 公会战 7 血战 8 兽潮 9巅峰战
  17. BattleLogic.IsEnd = false
  18. BattleLogic.Result = -1
  19. BattleLogic.Event = BattleEvent.New()
  20. BattleLogic.BuffMgr = BuffManager.New()
  21. BattleLogic.useTimes = 0 --< 每场战斗总共回合数
  22. BattleLogic.RoundRandom = 0 --每回合随机值
  23. BattleLogic.IsFetchedResult = false -- 询问战斗结果
  24. local _IsDebug
  25. local fightData
  26. local record
  27. local optionRecord
  28. --是否开启战斗日志
  29. BattleLogic.IsOpenBattleRecord = false
  30. --逻辑帧频
  31. BattleLogic.GameFrameRate = 30
  32. BattleLogic.GameDeltaTime = 1 / BattleLogic.GameFrameRate
  33. --总波次
  34. BattleLogic.TotalOrder = 0
  35. --当前波次
  36. BattleLogic.CurOrder = 0
  37. BattleLogic.SingleRoundStatus = {
  38. RoundBegin = 1,
  39. RoundEnd = 2,
  40. Rounding = 3
  41. }
  42. -- 下一帧开始下一轮
  43. local _TurnRoundFlag = 0
  44. --> 暂停需要 隔帧执行技能 因技能中用到暂停
  45. local _ProcessSkillFlag = 2
  46. local actionPool = BattleObjectPool.New(function ()
  47. return { 0, 0 }
  48. end)
  49. local skillPool = BattleObjectPool.New(function ()
  50. return Skill:New()
  51. end)
  52. local tbActionList = BattleList.New()
  53. local rolePool = BattleObjectPool.New(function ()
  54. return RoleLogic.New()
  55. end)
  56. local function tablekIn(tbl, key)
  57. if tbl == nil then
  58. return false
  59. end
  60. for k, v in pairs(tbl) do
  61. if k == key then
  62. return true
  63. end
  64. end
  65. return false
  66. end
  67. local delayRoundTrip={}
  68. function BattleLogic.Init(data, optionData, maxRound)
  69. if BattleLogic.IsOpenBattleRecord then
  70. record = {}
  71. end
  72. fightData = data
  73. if optionData then
  74. optionRecord = optionData
  75. else
  76. optionRecord = {}
  77. end
  78. BattleLogic.CurOrder = 0
  79. BattleLogic.TotalOrder = #data.enemyData
  80. BattleLogic.IsFetchedResult = false
  81. BattleLogic.Clear()
  82. curFrame = 0
  83. CurRound = 0
  84. MaxRound = maxRound or 20
  85. _TurnRoundFlag = 0
  86. _ProcessSkillFlag = 2
  87. _IsDebug = false
  88. BattleLogic.Event:ClearEvent()
  89. BattleLogic.BuffMgr:Init()
  90. BattleLogic.IsEnd = false
  91. BattleLogic.Result = -1
  92. BattleLogic.useTimes = 0
  93. -- 数据初始化
  94. RoleManager.Init()
  95. SkillManager.Init()
  96. OutDataManager.Init(fightData)
  97. PassiveManager.Init()
  98. BattleLogManager.Init(fightData)
  99. FightUnitManager.Init()
  100. PosIsAttackRecord = {}
  101. delayRoundTrip = {}
  102. end
  103. -- 检测先手阵营
  104. function BattleLogic.CheckFirstCamp()
  105. -- 默认先手
  106. BattleLogic.FirstCamp = 0
  107. -- 数据不存在时,兼容老战斗数据
  108. if not fightData.playerData.firstCamp and not fightData.enemyData[BattleLogic.CurOrder].firstCamp then
  109. return
  110. end
  111. -- 敌方先手
  112. if fightData.playerData.firstCamp == 0 and fightData.enemyData[BattleLogic.CurOrder].firstCamp == 1 then
  113. BattleLogic.FirstCamp = 1
  114. end
  115. end
  116. -- to do check yh 检测加入节点测试数据
  117. function BattleLogic.StartOrder()
  118. BattleLogic.CurOrder = BattleLogic.CurOrder + 1
  119. if BattleLogic.CurOrder == 1 then
  120. local playerData = fightData.playerData
  121. local enemyData = fightData.enemyData[BattleLogic.CurOrder]
  122. for i = 1, #playerData do
  123. RoleManager.AddRole(playerData[i], playerData[i].position)
  124. end
  125. if #enemyData>0 then
  126. for i = 1, #enemyData do
  127. RoleManager.AddRole(enemyData[i], enemyData[i].position)
  128. end
  129. end
  130. --> unit
  131. for _, unitData in pairs(fightData.fightUnitData) do
  132. if unitData and next(unitData) ~= nil then --< 防服务器值错误问题
  133. FightUnitManager.AddUnit(unitData)
  134. end
  135. end
  136. else
  137. RoleManager.ClearEnemy()
  138. -- to do check yh 模拟参数
  139. local orderList = fightData.enemyData[BattleLogic.CurOrder]
  140. if orderList ~= nil then
  141. for i = 1, #orderList do
  142. RoleManager.AddRole(orderList[i], orderList[i].position)
  143. end
  144. end
  145. end
  146. if fightData.tibuData ~= nil then
  147. for _,tibuData in pairs(fightData.tibuData) do
  148. --获取当前在场英雄释放替补被动技能
  149. if tibuData~=nil then
  150. RoleManager.InitTibuData(tibuData,-1,false) -- 默认无位置信息 -1
  151. -- if tibuData.passivity~= nil then
  152. -- RoleManager.TriggerMyTeamOneAlivePassivity(tibuData.passivity) -- 修改被动生效地点
  153. -- end
  154. end
  155. end
  156. end
  157. -- RoleManager.printEveryOneDate(nil)
  158. -- 检测先后手
  159. BattleLogic.CheckFirstCamp()
  160. -- 开始战斗,延时一帧执行,避免战斗还没开始就释放了技能
  161. BattleLogic.TurnRoundNextFrame()
  162. MoveTimes = 0
  163. end
  164. -- 获取当前轮数
  165. function BattleLogic.GetCurRound()
  166. -- body
  167. return CurRound, MaxRound
  168. end
  169. -- 获取当前轮次信息
  170. function BattleLogic.GetCurTurn()
  171. -- body
  172. return CurCamp, CurPosition
  173. end
  174. -- 设置是否是debug
  175. function BattleLogic.SetIsDebug(isDebug)
  176. _IsDebug = isDebug
  177. end
  178. function BattleLogic.GetIsDebug()
  179. return _IsDebug
  180. end
  181. function BattleLogic.TurnRoundNextFrame()
  182. _TurnRoundFlag = 0
  183. end
  184. function BattleLogic.UnRegisterDelayRroundTrigger(_func,_camp)
  185. if #delayRoundTrip > 0 then
  186. for round,campfunc in pairs(delayRoundTrip) do
  187. if campfunc._camp == _camp then
  188. if _camp == 0 and _func == campfunc._mfunc then campfunc._mfunc = nil end
  189. if _camp == 1 and _func == campfunc._efunc then campfunc._efunc = nil end
  190. end
  191. end
  192. end
  193. end
  194. --根据回合数触发的定时器
  195. function BattleLogic.RegisterDelayRroundTrigger(delayRound,func,camp)
  196. local delay = CurRound+delayRound
  197. RoleManager.Log("...................... RegisterDelayRroundTrigger "..delay.." CurCamp "..camp)
  198. if delayRound ~= 0 and func ~= nil and delay <= MaxRound then
  199. local cafunc --缓存已注册方法
  200. if camp == 0 then
  201. if tablekIn(delayRoundTrip,delay) then
  202. -- if delayRoundTrip[delay]._efunc ~= nil then
  203. cafunc = delayRoundTrip[delay]._efunc
  204. RoleManager.Log("已注册敌方方法")
  205. -- end
  206. end
  207. RoleManager.Log(".......my RegisterDelayRroundTrigger "..delay.." CurCamp "..camp)
  208. delayRoundTrip[delay] = {
  209. _mfunc = func,
  210. _efunc = cafunc,
  211. _camp = camp
  212. }
  213. elseif camp == 1 then
  214. if tablekIn(delayRoundTrip,delay) then
  215. -- if delayRoundTrip[delay]._mfunc ~= nil then
  216. cafunc = delayRoundTrip[delay]._mfunc
  217. RoleManager.Log("已注册我方法")
  218. -- end
  219. end
  220. -- RoleManager.Log(".......enemy RegisterDelayRroundTrigger "..delay.." CurCamp "..camp)
  221. delayRoundTrip[delay]={
  222. _mfunc=cafunc,
  223. _efunc=func,
  224. _camp=camp
  225. }
  226. end
  227. end
  228. end
  229. function BattleLogic.TriggerDelay(_curCamp)
  230. RoleManager.Log("~~~~~~~~~~~~~~~~~ trigger CurRound "..CurRound.." CurCamp ".._curCamp)
  231. if delayRoundTrip==nil then
  232. return
  233. end
  234. for round , campfunc in pairs(delayRoundTrip) do
  235. if CurRound == round then --需要检验当前回合的我方还是敌方 and _curCamp==campfunc._camp
  236. RoleManager.Log("............................2.2 trigger CurRound "..CurRound.." CurCamp "..CurCamp)
  237. if campfunc._mfunc ~= nil then
  238. campfunc._mfunc(0)
  239. BattleLogic.TurnRoundNextFrame()
  240. delayRoundTrip[round]._mfunc = nil
  241. RoleManager.Log("............................3 .MY")
  242. elseif campfunc._efunc ~= nil then
  243. campfunc._efunc(1)
  244. BattleLogic.TurnRoundNextFrame()
  245. delayRoundTrip[round]._efunc=nil
  246. RoleManager.Log("............................3 .ENEMY")
  247. end
  248. end
  249. end
  250. end
  251. -- 检测是否要轮转 todo check yh
  252. function BattleLogic.CheckTurnRound()
  253. if _TurnRoundFlag == 2 then
  254. return
  255. end
  256. _TurnRoundFlag = _TurnRoundFlag + 1
  257. if _TurnRoundFlag == 2 then
  258. if BattleLogic.CheckSingleRoundStatus() == BattleLogic.SingleRoundStatus.RoundBegin then
  259. CurRound = CurRound + 1
  260. RoleManager.printEveryOneDate(nil)
  261. BattleLogic.RoundBegin(function()
  262. -- BattleLogic.TurnRound()
  263. -- 检测是否存在替补
  264. BattleLogic.ProcessSkillNextFrame()
  265. end)
  266. elseif BattleLogic.CheckSingleRoundStatus() == BattleLogic.SingleRoundStatus.RoundEnd then
  267. BattleLogic.RoundEnd(function()
  268. BattleLogic.TurnRoundNextFrame()
  269. end)
  270. else
  271. -- BattleLogic.TurnRound()
  272. BattleLogic.ProcessSkillNextFrame()
  273. end
  274. end
  275. end
  276. function BattleLogic.ProcessSkillNextFrame()
  277. _ProcessSkillFlag = 0
  278. end
  279. function BattleLogic.CheckProcessSkill()
  280. if _ProcessSkillFlag == 2 then
  281. return
  282. end
  283. _ProcessSkillFlag = _ProcessSkillFlag + 1
  284. if _ProcessSkillFlag == 2 then
  285. BattleLogic.TurnRound()
  286. end
  287. end
  288. --> 检测单回合首末 返回两种状态 --to do check yh
  289. function BattleLogic.CheckSingleRoundStatus()
  290. local isHave = false
  291. local nullNum = 0
  292. for pos = 1, 18 do
  293. while true
  294. do
  295. if PosIsAttackRecord[pos] then
  296. break
  297. else
  298. nullNum = nullNum + 1
  299. end
  300. local role = RoleManager.GetRoleByPos(pos)
  301. if role and not role:IsRealDead() then
  302. isHave = true
  303. end
  304. break
  305. end
  306. end
  307. local function ReCheckRound(_isHave,_nullNum)
  308. if _isHave then isHave=_isHave end
  309. if _nullNum then nullNum = _nullNum end
  310. end
  311. BattleLogic.Event:DispatchEvent(BattleEventName.BattleRoundCheck, isHave,nullNum,ReCheckRound)
  312. if nullNum == 18 then
  313. BattleLogic.Event:DispatchEvent(BattleEventName.RoundBegin, isHave,nullNum,ReCheckRound)
  314. return BattleLogic.SingleRoundStatus.RoundBegin
  315. else
  316. if isHave then
  317. else
  318. BattleLogic.Event:DispatchEvent(BattleEventName.RoundEnd, isHave,nullNum,ReCheckRound)
  319. return BattleLogic.SingleRoundStatus.RoundEnd
  320. end
  321. end
  322. BattleLogic.Event:DispatchEvent(BattleEventName.Rounding, isHave,nullNum,ReCheckRound)
  323. return BattleLogic.SingleRoundStatus.Rounding
  324. end
  325. function BattleLogic.RoundTibuBegin(func)
  326. if BattleLogic.CurOrder ~= 0 then
  327. BattleLogic.Event:DispatchEvent(BattleEventName.BattleTibuRoundBegin, RoleManager.getTibuState())
  328. BattleLogic.TriggerDelay((CurCamp+1)%2) -- 回合开始 当前储存是上回合结束数据未刷新
  329. BattleLogic.TriggerDelay((CurCamp)%2) -- 回合开始 当前储存是上回合结束数据未刷新
  330. if RoleManager.IsRoleTibuAdding(0) then
  331. RoleManager.setTibuPos(RoleManager.IsMyOneDeadPosCanNotRelive(0),0)
  332. RoleManager.AddTibuToWaitingState(0)
  333. BattleLogic.RegisterDelayRroundTrigger(1,RoleManager.AddTibu,0)
  334. else
  335. BattleLogic.CheckAndAddTibuToWaiting(0)
  336. BattleLogic.CheckAndAddTibuAtBeginRound(0)
  337. end
  338. ---------敌人 镜像逻辑 ---------
  339. if RoleManager.IsRoleTibuAdding(1) then
  340. RoleManager.setTibuPos(RoleManager.IsMyOneDeadPosCanNotRelive(1),1)
  341. RoleManager.AddTibuToWaitingState(1)
  342. BattleLogic.RegisterDelayRroundTrigger(1,RoleManager.AddTibu,1)
  343. else
  344. BattleLogic.CheckAndAddTibuToWaiting(1)
  345. BattleLogic.CheckAndAddTibuAtBeginRound(1)
  346. end
  347. ---------敌人 镜像逻辑 ---------
  348. ---------满场状态重置---------
  349. BattleLogic.CheckAndAddTibuToOnStage(0)
  350. BattleLogic.CheckAndAddTibuToOnStage(1)
  351. ---------满场状态重置---------
  352. BattleLogic.TriggerDelay((CurCamp+1)%2) -- 回合开始 当前储存是上回合结束数据未刷新
  353. BattleLogic.TriggerDelay((CurCamp)%2) -- 回合开始 当前储存是上回合结束数据未刷新
  354. BattleLogic.Event:DispatchEvent(BattleEventName.BattleTibuRoundEnd, RoleManager.getTibuState())
  355. if func then func() end
  356. end
  357. end
  358. function BattleLogic.RoundTibuEnd(func)
  359. if BattleLogic.CurOrder ~= 0 then
  360. RoleManager.getTibuState()
  361. local function OnlyRegister(camp)
  362. BattleLogic.RegisterDelayRroundTrigger(1,RoleManager.AddTibu,camp)
  363. end
  364. if RoleManager.IsRoleTibuAdding(0) then
  365. RoleManager.setTibuPos(RoleManager.IsMyOneDeadPosCanNotRelive(0),0)
  366. RoleManager.AddTibuToWaitingState(0)
  367. BattleLogic.RegisterDelayRroundTrigger(1,RoleManager.AddTibu,0)
  368. else
  369. BattleLogic.CheckAndAddTibuToWaiting(0,OnlyRegister)
  370. BattleLogic.CheckAndAddTibuAtBeginRound(0,OnlyRegister)
  371. end
  372. ---------敌人 镜像逻辑 ---------
  373. if RoleManager.IsRoleTibuAdding(1) then
  374. RoleManager.setTibuPos(RoleManager.IsMyOneDeadPosCanNotRelive(1),1)
  375. RoleManager.AddTibuToWaitingState(1)
  376. BattleLogic.RegisterDelayRroundTrigger(1,RoleManager.AddTibu,1)
  377. else
  378. BattleLogic.CheckAndAddTibuToWaiting(1,OnlyRegister)
  379. BattleLogic.CheckAndAddTibuAtBeginRound(1,OnlyRegister)
  380. end
  381. ---------敌人 镜像逻辑 ---------
  382. ---------满场状态重置---------
  383. BattleLogic.CheckAndAddTibuToOnStage(0,OnlyRegister)
  384. BattleLogic.CheckAndAddTibuToOnStage(1,OnlyRegister)
  385. ---------满场状态重置---------
  386. BattleLogic.Event:DispatchEvent(BattleEventName.RoundTibuEnd, RoleManager.getTibuState())
  387. if func then func() end
  388. end
  389. end
  390. --> 单回合开始
  391. function BattleLogic.RoundBegin(func)
  392. BattleLogic.RoundRandom = Random.Range01()
  393. BattleLogic.RoundTibuBegin(function()
  394. -- BattleLogManager.Log(
  395. -- "Round Tibu Begin",
  396. -- "round", CurRound
  397. -- )
  398. end)
  399. -- 轮数变化
  400. BattleLogic.Event:DispatchEvent(BattleEventName.BattleRoundChange, CurRound)
  401. BattleLogic.useTimes = CurRound
  402. BattleLogic.BuffMgr:TurnUpdate(1) -- 计算恢复血量
  403. BattleLogic.BuffMgr:TurnUpdate(2) -- 计算持续伤害(除去流血)
  404. BattleLogic.BuffMgr:TurnUpdate(3) -- 计算持续伤害(流血)
  405. BattleLogic.BuffMgr:TurnUpdate(4) -- 计算其他buff
  406. BattleLogic.BuffMgr:PassUpdate() -- 计算buff轮数
  407. --> unit 加入append Unit 单位
  408. if fightData.fightUnitDataAppend then
  409. for _, unitData in pairs(fightData.fightUnitDataAppend) do
  410. if unitData and next(unitData) ~= nil then --< 防服务器值错误问题
  411. if unitData.round and unitData.round == CurRound then
  412. local isInBattleUnit = FightUnitManager.GetUnit(unitData.type, unitData.camp)
  413. if isInBattleUnit == nil then --< 判断是否已有unit
  414. BattleLogic.Event:DispatchEvent(BattleEventName.BattleRoundBeginDialogue, unitData.client_dialogue)
  415. FightUnitManager.AddUnit(unitData)
  416. unitData.isAppend = true --< 是否是追加单位
  417. else
  418. RoleManager.Log("### repeated add append Unit error")
  419. end
  420. end
  421. end
  422. end
  423. end
  424. FightUnitManager.ProcessRoundBeginNextFrame(func)
  425. --> 坦克append单位
  426. if fightData.tankDataAppend then
  427. local tankAppendData = fightData.tankDataAppend
  428. if #tankAppendData > 0 then
  429. for i = 1, #tankAppendData do
  430. if tankAppendData[i].round and tankAppendData[i].round == CurRound and
  431. not RoleManager.CheckIsExistRole(tankAppendData[i].camp, tankAppendData[i].position) then --< 后端数据没有筛上阵的 前端筛除位置上已有的 理论后端也应该筛选
  432. RoleManager.AddRole(tankAppendData[i], tankAppendData[i].position, true)
  433. end
  434. end
  435. end
  436. end
  437. --无战斗单位参战,运行对话
  438. if fightData.noUnitDataAppend then
  439. local noUnitData = fightData.noUnitDataAppend
  440. if #noUnitData > 0 then
  441. for i = 1, #noUnitData do
  442. if noUnitData[i].round and noUnitData[i].round == CurRound then
  443. BattleLogic.Event:DispatchEvent(BattleEventName.BattleRoundBeginDialogue, noUnitData[i].client_dialogue)
  444. end
  445. end
  446. end
  447. end
  448. end
  449. --> 单回合结束
  450. function BattleLogic.RoundEnd(func)
  451. if BattleLogic.CurOrder ~= 0 then
  452. RoleManager.getTibuState()
  453. BattleLogic.RoundTibuEnd(function()
  454. -- BattleLogManager.Log(
  455. -- "Round Tibu end",
  456. -- "round", CurRound
  457. -- )
  458. end)
  459. end
  460. PosIsAttackRecord = {}
  461. --roundend延时触发继续
  462. -- BattleLogic.WaitForTrigger(0.2, function()
  463. -- func()
  464. -- end)
  465. FightUnitManager.ProcessRoundEndNextFrame(func)
  466. end
  467. -- 开始轮转
  468. -- debugTurn 用于判断是否是debug轮转的参数
  469. function BattleLogic.TurnRound(debugTurn)
  470. if CurRound == 0 then
  471. --return
  472. end
  473. -- if BattleLogic.GetIsDebug() and not debugTurn then
  474. -- BattleLogic.Event:DispatchEvent(BattleEventName.DebugStop)
  475. -- return
  476. -- end
  477. --> 计算速度最大的执行技能
  478. local maxSpeed = -1
  479. local maxSpeedPos = -1
  480. local SkillRole = nil
  481. for pos = 1, 18 do
  482. while true
  483. do
  484. if PosIsAttackRecord[pos] then
  485. break
  486. end
  487. local role = RoleManager.GetRoleByPos(pos)
  488. if role and not role:IsRealDead() then
  489. local speed = role:GetRoleData(RoleDataName.Speed)
  490. if speed > maxSpeed then
  491. maxSpeed = speed
  492. maxSpeedPos = pos
  493. SkillRole = role
  494. end
  495. end
  496. break
  497. end
  498. end
  499. local isFindRole = false
  500. if maxSpeedPos ~= -1 then
  501. PosIsAttackRecord[maxSpeedPos] = true
  502. isFindRole = true
  503. end
  504. -- BattleLogManager.Log(
  505. -- "Position Change",
  506. -- "camp", CurCamp,
  507. -- "position", CurPosition
  508. -- )
  509. -- RoleManager.Log(
  510. -- "Position Change "..SkillRole.position..
  511. -- "camp".. CurCamp
  512. -- )
  513. -- 如果找不到下一个人
  514. if not SkillRole then
  515. -- BattleLogManager.Log( "No Skill Position" )
  516. BattleLogic.TurnRoundNextFrame()
  517. return
  518. end
  519. local IsMyTeamEmpty = RoleManager.IsMyTeamEmpty(0)
  520. local IsEnemyTeamEmpty = RoleManager.IsMyTeamEmpty(1)
  521. local myhasSub = RoleManager.HasTibu(0)
  522. local enemyHasTibu = RoleManager.HasTibu(1)
  523. local myTibuState = RoleManager.getTibuStateByCamp(0)
  524. local enemyTibuState = RoleManager.getTibuStateByCamp(1)
  525. -- 空场 触发上场
  526. if (IsMyTeamEmpty and myhasSub) or (IsEnemyTeamEmpty and enemyHasTibu) then
  527. if IsMyTeamEmpty and myhasSub then
  528. BattleLogic.CheckAndAddTibu(0)
  529. BattleLogic.TriggerDelay(0)
  530. end
  531. if IsEnemyTeamEmpty and enemyHasTibu then
  532. BattleLogic.CheckAndAddTibu(1)
  533. BattleLogic.TriggerDelay(1)
  534. end
  535. BattleLogic.TurnRoundNextFrame()
  536. return
  537. end
  538. -- 一方空场 另一方不行动
  539. if (IsMyTeamEmpty and myTibuState == 3) or (IsEnemyTeamEmpty and enemyTibuState == 3) then
  540. BattleLogic.TurnRoundNextFrame()
  541. return
  542. end
  543. if not isFindRole then
  544. BattleLogic.TurnRoundNextFrame()
  545. end
  546. --> 首回合 or 回合更新
  547. -- if CurRound == 0 or not isFindRole then
  548. -- CurRound = CurRound + 1
  549. -- BattleLogManager.Log(
  550. -- "Round Change",
  551. -- "round", CurRound
  552. -- )
  553. -- -- 轮数变化
  554. -- BattleLogic.Event:DispatchEvent(BattleEventName.BattleRoundChange, CurRound)
  555. -- BattleLogic.BuffMgr:TurnUpdate(1) -- 计算恢复血量
  556. -- BattleLogic.BuffMgr:TurnUpdate(2) -- 计算持续伤害(除去流血)
  557. -- BattleLogic.BuffMgr:TurnUpdate(3) -- 计算持续伤害(流血)
  558. -- BattleLogic.BuffMgr:TurnUpdate(4) -- 计算其他buff
  559. -- BattleLogic.BuffMgr:PassUpdate() -- 计算buff轮数
  560. -- if not isFindRole then
  561. -- PosIsAttackRecord = {}
  562. -- BattleLogic.TurnRoundNextFrame()
  563. -- return
  564. -- end
  565. -- else
  566. -- -- 切换阵营
  567. -- --CurCamp = (CurCamp + 1) % 2
  568. -- end
  569. CurCamp = SkillRole.camp
  570. CurPosition = SkillRole.position
  571. -- BattleLogManager.Log(
  572. -- "Position Change",
  573. -- "camp", CurCamp,
  574. -- "position", CurPosition
  575. -- )
  576. -- --
  577. -- BattleLogManager.Log(
  578. -- "Camp Change",
  579. -- "camp", CurCamp
  580. -- )
  581. -- -- 当前阵营下一释放技能的位置
  582. -- local cpos = CurSkillPos[CurCamp] + 1
  583. -- -- 找到下一个释放技能的人
  584. -- local SkillRole
  585. -- for p = cpos, 9 do
  586. -- -- 保存当前位置
  587. -- CurSkillPos[CurCamp] = p
  588. -- -- 自己阵营中的位置 + 自己阵营的ID * 9 = 自己在PosList中的位置
  589. -- local role = RoleManager.GetRole(CurCamp, p) --PosList[p + (CurCamp * 9)]
  590. -- if role and not role:IsRealDead() then
  591. -- SkillRole = role
  592. -- break
  593. -- end
  594. -- -- 如果当前位置不能释放技能也需要走buff轮转
  595. -- BattleLogic.BuffMgr:TurnUpdate(1) -- 计算恢复血量
  596. -- BattleLogic.BuffMgr:TurnUpdate(2) -- 计算持续伤害(除去流血)
  597. -- BattleLogic.BuffMgr:TurnUpdate(3) -- 计算持续伤害(流血)
  598. -- BattleLogic.BuffMgr:TurnUpdate(4) -- 计算其他buff
  599. -- BattleLogic.BuffMgr:PassUpdate() -- 计算buff轮数
  600. -- end
  601. -- BattleLogManager.Log( "No Skill Position" )
  602. -- BattleLogic.TurnRoundNextFrame()
  603. -- return
  604. -- end
  605. -- BattleLogManager.Log(
  606. -- "Position Change",
  607. -- "position", CurSkillPos[CurCamp]
  608. -- )
  609. -- buff计算
  610. -- BattleLogic.BuffMgr:TurnUpdate(1) -- 计算恢复血量
  611. -- BattleLogic.BuffMgr:TurnUpdate(2) -- 计算持续伤害(除去流血)
  612. -- 如果角色无法释放技能
  613. if not SkillRole:IsAvailable() -- 角色不能释放技能
  614. or (SkillRole:IsDead() and not BattleLogic.BuffMgr:HasBuff(SkillRole,BuffName.NoDead)) --将死但没有不死buff
  615. then
  616. -- BattleLogic.BuffMgr:TurnUpdate(3) -- 计算持续伤害(流血)
  617. -- BattleLogic.BuffMgr:TurnUpdate(4) -- 计算其他buff
  618. -- BattleLogic.BuffMgr:PassUpdate() -- 计算buff轮数
  619. BattleLogic.TurnRoundNextFrame() -- 下一个
  620. return
  621. end
  622. if MoveTimes >= 1 then
  623. BattleLogic.Event:DispatchEvent(BattleEventName.CheckFrame,MoveTimes) --行动前核对
  624. end
  625. -- 行动
  626. SkillRole.Event:DispatchEvent(BattleEventName.RoleTurnStart, SkillRole) -- 开始行动
  627. BattleLogic.Event:DispatchEvent(BattleEventName.RoleTurnStart, SkillRole) -- 开始行动
  628. -- RoleManager.Log(SkillRole.roleId.."位置回调")
  629. -- BattleLogic.BuffMgr:TurnUpdate(1) -- 计算恢复血量
  630. -- BattleLogic.BuffMgr:TurnUpdate(2) -- 计算持续伤害(除去流血)
  631. -- 释放技能后,递归交换阵营
  632. MoveTimes = MoveTimes + 1
  633. local haveSkill = SkillRole:CastSkill(function()
  634. -- BattleLogic.BuffMgr:TurnUpdate(3) -- 计算持续伤害(流血)
  635. -- BattleLogic.BuffMgr:TurnUpdate(4) -- 计算其他buff
  636. -- BattleLogic.BuffMgr:PassUpdate() -- 计算buff轮数
  637. SkillRole.Event:DispatchEvent(BattleEventName.RoleTurnEnd, SkillRole) -- 行动结束
  638. BattleLogic.Event:DispatchEvent(BattleEventName.RoleTurnEnd, SkillRole) -- 开始行动
  639. BattleLogic.TurnRoundNextFrame()
  640. end)
  641. --> 无技能时 跳过死循环问题
  642. if not haveSkill then
  643. BattleLogic.TurnRoundNextFrame()
  644. end
  645. end
  646. function BattleLogic.WaitForTrigger(delayTime, action)
  647. -- RoleManager.LogCa(
  648. -- "frame:"..BattleLogic.CurFrame(),
  649. -- "before-delayTime",delayTime
  650. -- )
  651. delayTime = BattleUtil.ErrorCorrection(delayTime)
  652. -- RoleManager.LogCa(
  653. -- "frame:"..BattleLogic.CurFrame(),
  654. -- "after-delayTime",delayTime
  655. -- )
  656. local delayFrame = floor(delayTime * BattleLogic.GameFrameRate + 0.5)
  657. -- RoleManager.LogCa(
  658. -- "delayFrame:"..BattleLogic.CurFrame(),
  659. -- "delayFrame:",delayTime
  660. -- )
  661. if delayFrame == 0 then --0延迟的回调直接调用
  662. action()
  663. return
  664. end
  665. local item = actionPool:Get()
  666. item[1] = curFrame + delayFrame
  667. item[2] = action
  668. tbActionList:Add(item)
  669. end
  670. function BattleLogic.CurFrame()
  671. return curFrame
  672. end
  673. function BattleLogic.Update()
  674. curFrame = curFrame + 1
  675. -- BattleLogManager.Log(
  676. -- "Round :"..CurRound,
  677. -- "curFrame", curFrame
  678. -- )
  679. -- 检测死亡
  680. if RoleManager.CheckDead() then -- 单独用一帧执行死亡
  681. return curFrame
  682. end
  683. -- 检测复活
  684. if RoleManager.CheckRelive() then -- 单独用一帧执行复活
  685. return curFrame
  686. end
  687. -- to do yh check 检测战斗结束逻辑
  688. local roleResult = RoleManager.GetResult()
  689. if roleResult == 0 then
  690. BattleLogic.BattleEnd(0)
  691. return curFrame
  692. end
  693. if CurRound > MaxRound then
  694. BattleLogic.BattleEnd(0)
  695. return curFrame
  696. end
  697. if roleResult == 1 then
  698. if BattleLogic.CurOrder == BattleLogic.TotalOrder then
  699. BattleLogic.BattleEnd(1)
  700. else
  701. BattleLogic.Event:DispatchEvent(BattleEventName.BattleOrderChange, BattleLogic.CurOrder + 1)
  702. BattleLogic.StartOrder()
  703. end
  704. end
  705. -- 检测帧事件(技能命中,伤害计算,buff生成)
  706. local index = 1
  707. while index <= tbActionList.size do
  708. local action = tbActionList.buffer[index]
  709. if action[1] <= curFrame then
  710. action[2]()
  711. actionPool:Put(action)
  712. tbActionList:Remove(index)
  713. else
  714. index = index + 1
  715. end
  716. end
  717. -- 检测buff
  718. BattleLogic.BuffMgr:Update()
  719. ---
  720. -- 检测角色状态
  721. RoleManager.Update()
  722. -- -- 检测死亡
  723. -- if RoleManager.CheckDead() then -- 单独用一帧执行死亡
  724. -- return
  725. -- end
  726. -- -- 检测复活
  727. -- if RoleManager.CheckRelive() then -- 单独用一帧执行复活
  728. -- return
  729. -- end
  730. -- 检测技能释放
  731. -- 检测轮转
  732. BattleLogic.CheckTurnRound()
  733. BattleLogic.CheckProcessSkill() --< 检测技能轮转
  734. --> 空场时间 一方空场 另一方不进行战斗单元回合 以及技能回合
  735. -- if BattleLogic.IsJumpSkillAndUnitFrame() then
  736. -- BattleLogic.CheckAndAddTibu(0)
  737. -- BattleLogic.CheckAndAddTibu(1)
  738. -- -- end 待定处理防范
  739. -- CurRound = CurRound + 1
  740. -- return
  741. -- end
  742. FightUnitManager.UpdateRoundBegin() --< 检测unit 施放roundbegin
  743. FightUnitManager.UpdateRoundEnd() --< 检测unit 施放roundend
  744. -- 技能
  745. SkillManager.Update()
  746. return curFrame
  747. end
  748. --空场状态检测
  749. function BattleLogic.IsJumpSkillAndUnitFrame()
  750. local IsMyTeamEmpty = RoleManager.IsMyTeamEmpty(0)
  751. local IsEnemyTeamEmpty = RoleManager.IsMyTeamEmpty(1)
  752. local myhasSub = RoleManager.HasTibu(0)
  753. local enemyHasTibu = RoleManager.HasTibu(1)
  754. local myTibuState = RoleManager.getTibuStateByCamp(0)
  755. local enemyTibuState = RoleManager.getTibuStateByCamp(1)
  756. -- if (IsMyTeamEmpty and myhasSub ) or ( IsEnemyTeamEmpty and enemyHasTibu) then
  757. -- RoleManager.Log("!!")
  758. -- end
  759. local result = ( IsMyTeamEmpty and myhasSub ) or ( IsEnemyTeamEmpty and enemyHasTibu )
  760. return result
  761. end
  762. --检测注册替补上阵
  763. function BattleLogic.CheckAndAddTibuToWaiting(_camp,func)
  764. if RoleManager.IsMyOneDead(_camp) and
  765. RoleManager.HasTibu(_camp) and
  766. not RoleManager.IsRoleTibuAdding(_camp) then
  767. -- 增加替补回合游戏不会结束
  768. -- 轮转到我方回合
  769. RoleManager.setTibuPos(RoleManager.IsMyOneDeadPosCanNotRelive(_camp),_camp)
  770. RoleManager.AddTibuToWaitingState(_camp)
  771. if func then
  772. func(_camp)
  773. return
  774. end
  775. -- BattleLogic.RoundBegin(function()
  776. BattleLogic.RegisterDelayRroundTrigger(1,RoleManager.AddTibu,_camp)
  777. BattleLogic.TriggerDelay(_camp)
  778. BattleLogic.ProcessSkillNextFrame()
  779. -- end)
  780. end
  781. end
  782. --检测重置替补状态到待上场
  783. function BattleLogic.CheckAndAddTibuToOnStage(_camp)
  784. if RoleManager.HasTibu(_camp) and
  785. not RoleManager.IsRoleTibuAdding(_camp) and
  786. not RoleManager.IsNotFullTeam(_camp) then
  787. -- 重置状态
  788. RoleManager.SetTibuState(_camp,1)
  789. -- 注销上场
  790. BattleLogic.UnRegisterDelayRroundTrigger(RoleManager.AddTibu,_camp)
  791. end
  792. end
  793. --队伍未满检测上阵
  794. function BattleLogic.CheckAndAddTibuAtBeginRound(_camp,func)
  795. if RoleManager.HasTibu(_camp) and RoleManager.IsNotFullTeam(_camp) then
  796. RoleManager.setTibuPos(RoleManager.MyTeamEmptyPos(_camp),_camp)
  797. RoleManager.AddTibuToWaitingState(_camp)
  798. if func then
  799. func(_camp)
  800. return
  801. end
  802. -- BattleLogic.RoundBegin(function()
  803. BattleLogic.RegisterDelayRroundTrigger(1,RoleManager.AddTibu,_camp)
  804. BattleLogic.TriggerDelay(_camp)
  805. -- end)
  806. end
  807. end
  808. function BattleLogic.CheckAndAddTibu(_camp,func)
  809. if RoleManager.IsMyOneDead(_camp) and RoleManager.HasTibu(_camp) then
  810. -- 增加替补回合游戏不会结束
  811. -- 轮转到我方回合
  812. RoleManager.setTibuPos(RoleManager.IsMyOneDeadPosCanNotRelive(_camp),_camp)
  813. RoleManager.AddTibuToWaitingState(_camp)
  814. if func then
  815. func(_camp)
  816. return
  817. end
  818. -- BattleLogic.RoundBegin(function()
  819. BattleLogic.RegisterDelayRroundTrigger(1,RoleManager.AddTibu,_camp)
  820. BattleLogic.TriggerDelay(_camp)
  821. -- end)
  822. end
  823. end
  824. -- 替补上阵中
  825. function BattleLogic.IsAddingSubstitute(_camp)
  826. if not RoleManager.HasTibu(_camp) then
  827. return false
  828. end
  829. if RoleManager.IsRoleTibuAdding(_camp) then
  830. return true
  831. end
  832. return false
  833. end
  834. function BattleLogic.GetMoveTimes()
  835. return MoveTimes
  836. end
  837. --修改攻击位置为未攻击
  838. function BattleLogic.ChangeRecordPos(pos,flag)
  839. PosIsAttackRecord[pos]= flag
  840. end
  841. -- 战斗结束
  842. function BattleLogic.BattleEnd(result)
  843. BattleLogic.Event:DispatchEvent(BattleEventName.BeforeBattleEnd, result)
  844. BattleLogic.IsEnd = true
  845. BattleLogic.Result = result
  846. BattleLogic.Event:DispatchEvent(BattleEventName.BattleEnd, result)
  847. -- RoleManager.printEveryOneDate()
  848. -- BattleLogManager.Log(
  849. -- "BattleEnd",
  850. -- "result:", result
  851. -- )
  852. RoleManager.printEveryOneDate(nil)
  853. -- BattleLogManager.Log(
  854. -- "BattleEnd",
  855. -- "result:", result
  856. -- )
  857. -- 战斗日志写入
  858. if not BattleLogic.GetIsDebug() then
  859. BattleLogManager.WriteFile()
  860. -- 加入 计算数据
  861. -- local caculate = RoleManager.getCaRecord()
  862. -- BattleLogManager.WriteServerFightData(caculate, Random.GetSeed(), "Caculate")
  863. end
  864. -- BattleLogic.Clear()
  865. end
  866. --轮询战斗结果
  867. function BattleLogic.FeachResult()
  868. if BattleLogic.IsFetchedResult then return end
  869. BattleLogic.IsFetchedResult = true
  870. local roleResult = RoleManager.GetResult()
  871. if roleResult == 0 then
  872. BattleLogic.BattleEnd(0)
  873. return
  874. end
  875. if CurRound > MaxRound then
  876. BattleLogic.BattleEnd(0)
  877. return
  878. end
  879. if roleResult == 1 then
  880. if BattleLogic.CurOrder == BattleLogic.TotalOrder then
  881. BattleLogic.TotalOrder = #fightData.enemyData
  882. else
  883. BattleLogic.Event:DispatchEvent(BattleEventName.BattleOrderChange, BattleLogic.CurOrder + 1)
  884. BattleLogic.IsEnd = false
  885. end
  886. end
  887. end
  888. function BattleLogic.Clear()
  889. -- 清空角色
  890. RoleManager.Clear()
  891. -- 清空事件
  892. while tbActionList.size > 0 do
  893. actionPool:Put(tbActionList.buffer[tbActionList.size])
  894. tbActionList:Remove(tbActionList.size)
  895. end
  896. delayRoundTrip={}
  897. end