| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045 |
- BattleLogic = {}
- local floor = math.floor
- local min = math.min
- -- local objList = BattleDictionary.New()
- local removeObjList = BattleList.New()
- local MaxRound = 20
- local CurRound = 0
- local CurCamp = 0
- -- local CurSkillPos = {}
- local PosList = {}
- local PosIsAttackRecord = {} --< 记录当前回合是否attack过
- local CurPosition = -1 --< 当前位置
- local MoveTimes = 0 --< 行动次数
- local curFrame
- local IsHaveTibu=false -- todo yh 是否已经上阵替补
- BattleLogic.Type = 0 --1 故事副本 2 地图探索 3 竞技场 4 秘境boss 5 解锁秘境 6 公会战 7 血战 8 兽潮 9巅峰战
- BattleLogic.IsEnd = false
- BattleLogic.Result = -1
- BattleLogic.Event = BattleEvent.New()
- BattleLogic.BuffMgr = BuffManager.New()
- BattleLogic.useTimes = 0 --< 每场战斗总共回合数
- BattleLogic.RoundRandom = 0 --每回合随机值
- BattleLogic.IsFetchedResult = false -- 询问战斗结果
- local _IsDebug
- local fightData
- local record
- local optionRecord
- --是否开启战斗日志
- BattleLogic.IsOpenBattleRecord = false
- --逻辑帧频
- BattleLogic.GameFrameRate = 30
- BattleLogic.GameDeltaTime = 1 / BattleLogic.GameFrameRate
- --总波次
- BattleLogic.TotalOrder = 0
- --当前波次
- BattleLogic.CurOrder = 0
- BattleLogic.SingleRoundStatus = {
- RoundBegin = 1,
- RoundEnd = 2,
- Rounding = 3
- }
- -- 下一帧开始下一轮
- local _TurnRoundFlag = 0
- --> 暂停需要 隔帧执行技能 因技能中用到暂停
- local _ProcessSkillFlag = 2
- local actionPool = BattleObjectPool.New(function ()
- return { 0, 0 }
- end)
- local skillPool = BattleObjectPool.New(function ()
- return Skill:New()
- end)
- local tbActionList = BattleList.New()
- local rolePool = BattleObjectPool.New(function ()
- return RoleLogic.New()
- end)
- local function tablekIn(tbl, key)
- if tbl == nil then
- return false
- end
- for k, v in pairs(tbl) do
- if k == key then
- return true
- end
- end
- return false
- end
- local delayRoundTrip={}
- function BattleLogic.Init(data, optionData, maxRound)
- if BattleLogic.IsOpenBattleRecord then
- record = {}
- end
- fightData = data
- if optionData then
- optionRecord = optionData
- else
- optionRecord = {}
- end
- BattleLogic.CurOrder = 0
- BattleLogic.TotalOrder = #data.enemyData
- BattleLogic.IsFetchedResult = false
- BattleLogic.Clear()
- curFrame = 0
-
- CurRound = 0
- MaxRound = maxRound or 20
- _TurnRoundFlag = 0
- _ProcessSkillFlag = 2
- _IsDebug = false
- BattleLogic.Event:ClearEvent()
- BattleLogic.BuffMgr:Init()
- BattleLogic.IsEnd = false
- BattleLogic.Result = -1
- BattleLogic.useTimes = 0
- -- 数据初始化
- RoleManager.Init()
- SkillManager.Init()
- OutDataManager.Init(fightData)
- PassiveManager.Init()
- BattleLogManager.Init(fightData)
- FightUnitManager.Init()
- PosIsAttackRecord = {}
- delayRoundTrip = {}
- end
- -- 检测先手阵营
- function BattleLogic.CheckFirstCamp()
- -- 默认先手
- BattleLogic.FirstCamp = 0
- -- 数据不存在时,兼容老战斗数据
- if not fightData.playerData.firstCamp and not fightData.enemyData[BattleLogic.CurOrder].firstCamp then
- return
- end
- -- 敌方先手
- if fightData.playerData.firstCamp == 0 and fightData.enemyData[BattleLogic.CurOrder].firstCamp == 1 then
- BattleLogic.FirstCamp = 1
- end
- end
- -- to do check yh 检测加入节点测试数据
- function BattleLogic.StartOrder()
- BattleLogic.CurOrder = BattleLogic.CurOrder + 1
- if BattleLogic.CurOrder == 1 then
- local playerData = fightData.playerData
- local enemyData = fightData.enemyData[BattleLogic.CurOrder]
- for i = 1, #playerData do
- RoleManager.AddRole(playerData[i], playerData[i].position)
- end
- if #enemyData>0 then
- for i = 1, #enemyData do
- RoleManager.AddRole(enemyData[i], enemyData[i].position)
- end
- end
- --> unit
- for _, unitData in pairs(fightData.fightUnitData) do
- if unitData and next(unitData) ~= nil then --< 防服务器值错误问题
- FightUnitManager.AddUnit(unitData)
- end
- end
- else
- RoleManager.ClearEnemy()
- -- to do check yh 模拟参数
- local orderList = fightData.enemyData[BattleLogic.CurOrder]
- if orderList ~= nil then
- for i = 1, #orderList do
- RoleManager.AddRole(orderList[i], orderList[i].position)
- end
- end
- end
- if fightData.tibuData ~= nil then
- for _,tibuData in pairs(fightData.tibuData) do
- --获取当前在场英雄释放替补被动技能
- if tibuData~=nil then
- RoleManager.InitTibuData(tibuData,-1,false) -- 默认无位置信息 -1
- -- if tibuData.passivity~= nil then
- -- RoleManager.TriggerMyTeamOneAlivePassivity(tibuData.passivity) -- 修改被动生效地点
- -- end
- end
- end
- end
- -- RoleManager.printEveryOneDate(nil)
- -- 检测先后手
- BattleLogic.CheckFirstCamp()
- -- 开始战斗,延时一帧执行,避免战斗还没开始就释放了技能
- BattleLogic.TurnRoundNextFrame()
- MoveTimes = 0
- end
- -- 获取当前轮数
- function BattleLogic.GetCurRound()
- -- body
- return CurRound, MaxRound
- end
- -- 获取当前轮次信息
- function BattleLogic.GetCurTurn()
- -- body
- return CurCamp, CurPosition
- end
- -- 设置是否是debug
- function BattleLogic.SetIsDebug(isDebug)
- _IsDebug = isDebug
- end
- function BattleLogic.GetIsDebug()
- return _IsDebug
- end
- function BattleLogic.TurnRoundNextFrame()
- _TurnRoundFlag = 0
- end
- function BattleLogic.UnRegisterDelayRroundTrigger(_func,_camp)
- if #delayRoundTrip > 0 then
- for round,campfunc in pairs(delayRoundTrip) do
- if campfunc._camp == _camp then
- if _camp == 0 and _func == campfunc._mfunc then campfunc._mfunc = nil end
- if _camp == 1 and _func == campfunc._efunc then campfunc._efunc = nil end
- end
- end
- end
- end
- --根据回合数触发的定时器
- function BattleLogic.RegisterDelayRroundTrigger(delayRound,func,camp)
- local delay = CurRound+delayRound
- RoleManager.Log("...................... RegisterDelayRroundTrigger "..delay.." CurCamp "..camp)
- if delayRound ~= 0 and func ~= nil and delay <= MaxRound then
- local cafunc --缓存已注册方法
- if camp == 0 then
- if tablekIn(delayRoundTrip,delay) then
- -- if delayRoundTrip[delay]._efunc ~= nil then
- cafunc = delayRoundTrip[delay]._efunc
- RoleManager.Log("已注册敌方方法")
- -- end
- end
- RoleManager.Log(".......my RegisterDelayRroundTrigger "..delay.." CurCamp "..camp)
- delayRoundTrip[delay] = {
- _mfunc = func,
- _efunc = cafunc,
- _camp = camp
- }
- elseif camp == 1 then
- if tablekIn(delayRoundTrip,delay) then
- -- if delayRoundTrip[delay]._mfunc ~= nil then
- cafunc = delayRoundTrip[delay]._mfunc
- RoleManager.Log("已注册我方法")
- -- end
- end
- -- RoleManager.Log(".......enemy RegisterDelayRroundTrigger "..delay.." CurCamp "..camp)
- delayRoundTrip[delay]={
- _mfunc=cafunc,
- _efunc=func,
- _camp=camp
- }
- end
- end
- end
- function BattleLogic.TriggerDelay(_curCamp)
- RoleManager.Log("~~~~~~~~~~~~~~~~~ trigger CurRound "..CurRound.." CurCamp ".._curCamp)
- if delayRoundTrip==nil then
- return
- end
- for round , campfunc in pairs(delayRoundTrip) do
- if CurRound == round then --需要检验当前回合的我方还是敌方 and _curCamp==campfunc._camp
- RoleManager.Log("............................2.2 trigger CurRound "..CurRound.." CurCamp "..CurCamp)
- if campfunc._mfunc ~= nil then
- campfunc._mfunc(0)
- BattleLogic.TurnRoundNextFrame()
- delayRoundTrip[round]._mfunc = nil
- RoleManager.Log("............................3 .MY")
- elseif campfunc._efunc ~= nil then
- campfunc._efunc(1)
- BattleLogic.TurnRoundNextFrame()
- delayRoundTrip[round]._efunc=nil
- RoleManager.Log("............................3 .ENEMY")
- end
- end
- end
- end
- -- 检测是否要轮转 todo check yh
- function BattleLogic.CheckTurnRound()
- if _TurnRoundFlag == 2 then
- return
- end
- _TurnRoundFlag = _TurnRoundFlag + 1
- if _TurnRoundFlag == 2 then
- if BattleLogic.CheckSingleRoundStatus() == BattleLogic.SingleRoundStatus.RoundBegin then
- CurRound = CurRound + 1
- RoleManager.printEveryOneDate(nil)
- BattleLogic.RoundBegin(function()
- -- BattleLogic.TurnRound()
- -- 检测是否存在替补
- BattleLogic.ProcessSkillNextFrame()
- end)
- elseif BattleLogic.CheckSingleRoundStatus() == BattleLogic.SingleRoundStatus.RoundEnd then
- BattleLogic.RoundEnd(function()
- BattleLogic.TurnRoundNextFrame()
- end)
- else
- -- BattleLogic.TurnRound()
- BattleLogic.ProcessSkillNextFrame()
- end
- end
- end
- function BattleLogic.ProcessSkillNextFrame()
- _ProcessSkillFlag = 0
- end
- function BattleLogic.CheckProcessSkill()
- if _ProcessSkillFlag == 2 then
- return
- end
- _ProcessSkillFlag = _ProcessSkillFlag + 1
- if _ProcessSkillFlag == 2 then
- BattleLogic.TurnRound()
- end
- end
- --> 检测单回合首末 返回两种状态 --to do check yh
- function BattleLogic.CheckSingleRoundStatus()
- local isHave = false
- local nullNum = 0
- for pos = 1, 18 do
- while true
- do
- if PosIsAttackRecord[pos] then
- break
- else
- nullNum = nullNum + 1
- end
- local role = RoleManager.GetRoleByPos(pos)
- if role and not role:IsRealDead() then
- isHave = true
- end
- break
- end
- end
- local function ReCheckRound(_isHave,_nullNum)
- if _isHave then isHave=_isHave end
- if _nullNum then nullNum = _nullNum end
- end
- BattleLogic.Event:DispatchEvent(BattleEventName.BattleRoundCheck, isHave,nullNum,ReCheckRound)
- if nullNum == 18 then
- BattleLogic.Event:DispatchEvent(BattleEventName.RoundBegin, isHave,nullNum,ReCheckRound)
- return BattleLogic.SingleRoundStatus.RoundBegin
- else
- if isHave then
- else
- BattleLogic.Event:DispatchEvent(BattleEventName.RoundEnd, isHave,nullNum,ReCheckRound)
- return BattleLogic.SingleRoundStatus.RoundEnd
- end
- end
- BattleLogic.Event:DispatchEvent(BattleEventName.Rounding, isHave,nullNum,ReCheckRound)
- return BattleLogic.SingleRoundStatus.Rounding
- end
- function BattleLogic.RoundTibuBegin(func)
- if BattleLogic.CurOrder ~= 0 then
- BattleLogic.Event:DispatchEvent(BattleEventName.BattleTibuRoundBegin, RoleManager.getTibuState())
-
- BattleLogic.TriggerDelay((CurCamp+1)%2) -- 回合开始 当前储存是上回合结束数据未刷新
- BattleLogic.TriggerDelay((CurCamp)%2) -- 回合开始 当前储存是上回合结束数据未刷新
- if RoleManager.IsRoleTibuAdding(0) then
- RoleManager.setTibuPos(RoleManager.IsMyOneDeadPosCanNotRelive(0),0)
- RoleManager.AddTibuToWaitingState(0)
- BattleLogic.RegisterDelayRroundTrigger(1,RoleManager.AddTibu,0)
- else
- BattleLogic.CheckAndAddTibuToWaiting(0)
- BattleLogic.CheckAndAddTibuAtBeginRound(0)
- end
- ---------敌人 镜像逻辑 ---------
- if RoleManager.IsRoleTibuAdding(1) then
- RoleManager.setTibuPos(RoleManager.IsMyOneDeadPosCanNotRelive(1),1)
- RoleManager.AddTibuToWaitingState(1)
- BattleLogic.RegisterDelayRroundTrigger(1,RoleManager.AddTibu,1)
- else
- BattleLogic.CheckAndAddTibuToWaiting(1)
- BattleLogic.CheckAndAddTibuAtBeginRound(1)
- end
- ---------敌人 镜像逻辑 ---------
- ---------满场状态重置---------
- BattleLogic.CheckAndAddTibuToOnStage(0)
- BattleLogic.CheckAndAddTibuToOnStage(1)
- ---------满场状态重置---------
- BattleLogic.TriggerDelay((CurCamp+1)%2) -- 回合开始 当前储存是上回合结束数据未刷新
- BattleLogic.TriggerDelay((CurCamp)%2) -- 回合开始 当前储存是上回合结束数据未刷新
-
- BattleLogic.Event:DispatchEvent(BattleEventName.BattleTibuRoundEnd, RoleManager.getTibuState())
- if func then func() end
- end
- end
- function BattleLogic.RoundTibuEnd(func)
- if BattleLogic.CurOrder ~= 0 then
- RoleManager.getTibuState()
-
- local function OnlyRegister(camp)
- BattleLogic.RegisterDelayRroundTrigger(1,RoleManager.AddTibu,camp)
- end
- if RoleManager.IsRoleTibuAdding(0) then
- RoleManager.setTibuPos(RoleManager.IsMyOneDeadPosCanNotRelive(0),0)
- RoleManager.AddTibuToWaitingState(0)
- BattleLogic.RegisterDelayRroundTrigger(1,RoleManager.AddTibu,0)
- else
- BattleLogic.CheckAndAddTibuToWaiting(0,OnlyRegister)
- BattleLogic.CheckAndAddTibuAtBeginRound(0,OnlyRegister)
- end
- ---------敌人 镜像逻辑 ---------
- if RoleManager.IsRoleTibuAdding(1) then
- RoleManager.setTibuPos(RoleManager.IsMyOneDeadPosCanNotRelive(1),1)
- RoleManager.AddTibuToWaitingState(1)
- BattleLogic.RegisterDelayRroundTrigger(1,RoleManager.AddTibu,1)
- else
- BattleLogic.CheckAndAddTibuToWaiting(1,OnlyRegister)
- BattleLogic.CheckAndAddTibuAtBeginRound(1,OnlyRegister)
- end
- ---------敌人 镜像逻辑 ---------
- ---------满场状态重置---------
- BattleLogic.CheckAndAddTibuToOnStage(0,OnlyRegister)
- BattleLogic.CheckAndAddTibuToOnStage(1,OnlyRegister)
- ---------满场状态重置---------
- BattleLogic.Event:DispatchEvent(BattleEventName.RoundTibuEnd, RoleManager.getTibuState())
- if func then func() end
- end
- end
- --> 单回合开始
- function BattleLogic.RoundBegin(func)
- BattleLogic.RoundRandom = Random.Range01()
- BattleLogic.RoundTibuBegin(function()
- -- BattleLogManager.Log(
- -- "Round Tibu Begin",
- -- "round", CurRound
- -- )
- end)
-
- -- 轮数变化
- BattleLogic.Event:DispatchEvent(BattleEventName.BattleRoundChange, CurRound)
- BattleLogic.useTimes = CurRound
- BattleLogic.BuffMgr:TurnUpdate(1) -- 计算恢复血量
- BattleLogic.BuffMgr:TurnUpdate(2) -- 计算持续伤害(除去流血)
- BattleLogic.BuffMgr:TurnUpdate(3) -- 计算持续伤害(流血)
- BattleLogic.BuffMgr:TurnUpdate(4) -- 计算其他buff
- BattleLogic.BuffMgr:PassUpdate() -- 计算buff轮数
- --> unit 加入append Unit 单位
-
- if fightData.fightUnitDataAppend then
- for _, unitData in pairs(fightData.fightUnitDataAppend) do
- if unitData and next(unitData) ~= nil then --< 防服务器值错误问题
- if unitData.round and unitData.round == CurRound then
- local isInBattleUnit = FightUnitManager.GetUnit(unitData.type, unitData.camp)
- if isInBattleUnit == nil then --< 判断是否已有unit
- BattleLogic.Event:DispatchEvent(BattleEventName.BattleRoundBeginDialogue, unitData.client_dialogue)
- FightUnitManager.AddUnit(unitData)
- unitData.isAppend = true --< 是否是追加单位
- else
- RoleManager.Log("### repeated add append Unit error")
- end
- end
- end
- end
- end
- FightUnitManager.ProcessRoundBeginNextFrame(func)
- --> 坦克append单位
- if fightData.tankDataAppend then
- local tankAppendData = fightData.tankDataAppend
- if #tankAppendData > 0 then
- for i = 1, #tankAppendData do
- if tankAppendData[i].round and tankAppendData[i].round == CurRound and
- not RoleManager.CheckIsExistRole(tankAppendData[i].camp, tankAppendData[i].position) then --< 后端数据没有筛上阵的 前端筛除位置上已有的 理论后端也应该筛选
- RoleManager.AddRole(tankAppendData[i], tankAppendData[i].position, true)
- end
- end
- end
- end
- --无战斗单位参战,运行对话
- if fightData.noUnitDataAppend then
- local noUnitData = fightData.noUnitDataAppend
- if #noUnitData > 0 then
- for i = 1, #noUnitData do
- if noUnitData[i].round and noUnitData[i].round == CurRound then
- BattleLogic.Event:DispatchEvent(BattleEventName.BattleRoundBeginDialogue, noUnitData[i].client_dialogue)
- end
- end
- end
- end
- end
- --> 单回合结束
- function BattleLogic.RoundEnd(func)
- if BattleLogic.CurOrder ~= 0 then
- RoleManager.getTibuState()
- BattleLogic.RoundTibuEnd(function()
- -- BattleLogManager.Log(
- -- "Round Tibu end",
- -- "round", CurRound
- -- )
- end)
- end
- PosIsAttackRecord = {}
- --roundend延时触发继续
- -- BattleLogic.WaitForTrigger(0.2, function()
- -- func()
- -- end)
- FightUnitManager.ProcessRoundEndNextFrame(func)
- end
- -- 开始轮转
- -- debugTurn 用于判断是否是debug轮转的参数
- function BattleLogic.TurnRound(debugTurn)
- if CurRound == 0 then
-
- --return
- end
- -- if BattleLogic.GetIsDebug() and not debugTurn then
- -- BattleLogic.Event:DispatchEvent(BattleEventName.DebugStop)
- -- return
- -- end
- --> 计算速度最大的执行技能
- local maxSpeed = -1
- local maxSpeedPos = -1
- local SkillRole = nil
- for pos = 1, 18 do
- while true
- do
- if PosIsAttackRecord[pos] then
- break
- end
- local role = RoleManager.GetRoleByPos(pos)
- if role and not role:IsRealDead() then
- local speed = role:GetRoleData(RoleDataName.Speed)
- if speed > maxSpeed then
- maxSpeed = speed
- maxSpeedPos = pos
- SkillRole = role
- end
- end
- break
- end
- end
- local isFindRole = false
- if maxSpeedPos ~= -1 then
- PosIsAttackRecord[maxSpeedPos] = true
- isFindRole = true
- end
- -- BattleLogManager.Log(
- -- "Position Change",
- -- "camp", CurCamp,
- -- "position", CurPosition
- -- )
- -- RoleManager.Log(
- -- "Position Change "..SkillRole.position..
- -- "camp".. CurCamp
- -- )
-
-
- -- 如果找不到下一个人
- if not SkillRole then
- -- BattleLogManager.Log( "No Skill Position" )
- BattleLogic.TurnRoundNextFrame()
- return
- end
- local IsMyTeamEmpty = RoleManager.IsMyTeamEmpty(0)
- local IsEnemyTeamEmpty = RoleManager.IsMyTeamEmpty(1)
- local myhasSub = RoleManager.HasTibu(0)
- local enemyHasTibu = RoleManager.HasTibu(1)
- local myTibuState = RoleManager.getTibuStateByCamp(0)
- local enemyTibuState = RoleManager.getTibuStateByCamp(1)
- -- 空场 触发上场
- if (IsMyTeamEmpty and myhasSub) or (IsEnemyTeamEmpty and enemyHasTibu) then
- if IsMyTeamEmpty and myhasSub then
- BattleLogic.CheckAndAddTibu(0)
- BattleLogic.TriggerDelay(0)
- end
- if IsEnemyTeamEmpty and enemyHasTibu then
- BattleLogic.CheckAndAddTibu(1)
- BattleLogic.TriggerDelay(1)
- end
- BattleLogic.TurnRoundNextFrame()
- return
- end
- -- 一方空场 另一方不行动
- if (IsMyTeamEmpty and myTibuState == 3) or (IsEnemyTeamEmpty and enemyTibuState == 3) then
- BattleLogic.TurnRoundNextFrame()
- return
- end
- if not isFindRole then
- BattleLogic.TurnRoundNextFrame()
- end
- --> 首回合 or 回合更新
- -- if CurRound == 0 or not isFindRole then
- -- CurRound = CurRound + 1
-
- -- BattleLogManager.Log(
- -- "Round Change",
- -- "round", CurRound
- -- )
- -- -- 轮数变化
- -- BattleLogic.Event:DispatchEvent(BattleEventName.BattleRoundChange, CurRound)
- -- BattleLogic.BuffMgr:TurnUpdate(1) -- 计算恢复血量
- -- BattleLogic.BuffMgr:TurnUpdate(2) -- 计算持续伤害(除去流血)
- -- BattleLogic.BuffMgr:TurnUpdate(3) -- 计算持续伤害(流血)
- -- BattleLogic.BuffMgr:TurnUpdate(4) -- 计算其他buff
- -- BattleLogic.BuffMgr:PassUpdate() -- 计算buff轮数
- -- if not isFindRole then
- -- PosIsAttackRecord = {}
- -- BattleLogic.TurnRoundNextFrame()
- -- return
- -- end
- -- else
- -- -- 切换阵营
- -- --CurCamp = (CurCamp + 1) % 2
- -- end
- CurCamp = SkillRole.camp
- CurPosition = SkillRole.position
- -- BattleLogManager.Log(
- -- "Position Change",
- -- "camp", CurCamp,
- -- "position", CurPosition
- -- )
- -- --
- -- BattleLogManager.Log(
- -- "Camp Change",
- -- "camp", CurCamp
- -- )
- -- -- 当前阵营下一释放技能的位置
- -- local cpos = CurSkillPos[CurCamp] + 1
- -- -- 找到下一个释放技能的人
- -- local SkillRole
- -- for p = cpos, 9 do
- -- -- 保存当前位置
- -- CurSkillPos[CurCamp] = p
- -- -- 自己阵营中的位置 + 自己阵营的ID * 9 = 自己在PosList中的位置
- -- local role = RoleManager.GetRole(CurCamp, p) --PosList[p + (CurCamp * 9)]
- -- if role and not role:IsRealDead() then
- -- SkillRole = role
- -- break
- -- end
- -- -- 如果当前位置不能释放技能也需要走buff轮转
- -- BattleLogic.BuffMgr:TurnUpdate(1) -- 计算恢复血量
- -- BattleLogic.BuffMgr:TurnUpdate(2) -- 计算持续伤害(除去流血)
- -- BattleLogic.BuffMgr:TurnUpdate(3) -- 计算持续伤害(流血)
- -- BattleLogic.BuffMgr:TurnUpdate(4) -- 计算其他buff
- -- BattleLogic.BuffMgr:PassUpdate() -- 计算buff轮数
- -- end
-
- -- BattleLogManager.Log( "No Skill Position" )
- -- BattleLogic.TurnRoundNextFrame()
- -- return
- -- end
- -- BattleLogManager.Log(
- -- "Position Change",
- -- "position", CurSkillPos[CurCamp]
- -- )
- -- buff计算
- -- BattleLogic.BuffMgr:TurnUpdate(1) -- 计算恢复血量
- -- BattleLogic.BuffMgr:TurnUpdate(2) -- 计算持续伤害(除去流血)
- -- 如果角色无法释放技能
- if not SkillRole:IsAvailable() -- 角色不能释放技能
- or (SkillRole:IsDead() and not BattleLogic.BuffMgr:HasBuff(SkillRole,BuffName.NoDead)) --将死但没有不死buff
- then
- -- BattleLogic.BuffMgr:TurnUpdate(3) -- 计算持续伤害(流血)
- -- BattleLogic.BuffMgr:TurnUpdate(4) -- 计算其他buff
- -- BattleLogic.BuffMgr:PassUpdate() -- 计算buff轮数
- BattleLogic.TurnRoundNextFrame() -- 下一个
- return
- end
- if MoveTimes >= 1 then
- BattleLogic.Event:DispatchEvent(BattleEventName.CheckFrame,MoveTimes) --行动前核对
- end
- -- 行动
- SkillRole.Event:DispatchEvent(BattleEventName.RoleTurnStart, SkillRole) -- 开始行动
- BattleLogic.Event:DispatchEvent(BattleEventName.RoleTurnStart, SkillRole) -- 开始行动
- -- RoleManager.Log(SkillRole.roleId.."位置回调")
- -- BattleLogic.BuffMgr:TurnUpdate(1) -- 计算恢复血量
- -- BattleLogic.BuffMgr:TurnUpdate(2) -- 计算持续伤害(除去流血)
- -- 释放技能后,递归交换阵营
- MoveTimes = MoveTimes + 1
- local haveSkill = SkillRole:CastSkill(function()
- -- BattleLogic.BuffMgr:TurnUpdate(3) -- 计算持续伤害(流血)
- -- BattleLogic.BuffMgr:TurnUpdate(4) -- 计算其他buff
- -- BattleLogic.BuffMgr:PassUpdate() -- 计算buff轮数
- SkillRole.Event:DispatchEvent(BattleEventName.RoleTurnEnd, SkillRole) -- 行动结束
- BattleLogic.Event:DispatchEvent(BattleEventName.RoleTurnEnd, SkillRole) -- 开始行动
- BattleLogic.TurnRoundNextFrame()
- end)
- --> 无技能时 跳过死循环问题
- if not haveSkill then
- BattleLogic.TurnRoundNextFrame()
- end
- end
- function BattleLogic.WaitForTrigger(delayTime, action)
- -- RoleManager.LogCa(
- -- "frame:"..BattleLogic.CurFrame(),
- -- "before-delayTime",delayTime
- -- )
- delayTime = BattleUtil.ErrorCorrection(delayTime)
- -- RoleManager.LogCa(
- -- "frame:"..BattleLogic.CurFrame(),
- -- "after-delayTime",delayTime
- -- )
- local delayFrame = floor(delayTime * BattleLogic.GameFrameRate + 0.5)
- -- RoleManager.LogCa(
- -- "delayFrame:"..BattleLogic.CurFrame(),
- -- "delayFrame:",delayTime
- -- )
- if delayFrame == 0 then --0延迟的回调直接调用
- action()
- return
- end
- local item = actionPool:Get()
- item[1] = curFrame + delayFrame
- item[2] = action
- tbActionList:Add(item)
- end
- function BattleLogic.CurFrame()
- return curFrame
- end
- function BattleLogic.Update()
- curFrame = curFrame + 1
- -- BattleLogManager.Log(
- -- "Round :"..CurRound,
- -- "curFrame", curFrame
- -- )
- -- 检测死亡
- if RoleManager.CheckDead() then -- 单独用一帧执行死亡
- return curFrame
- end
- -- 检测复活
- if RoleManager.CheckRelive() then -- 单独用一帧执行复活
- return curFrame
- end
- -- to do yh check 检测战斗结束逻辑
- local roleResult = RoleManager.GetResult()
- if roleResult == 0 then
- BattleLogic.BattleEnd(0)
- return curFrame
- end
- if CurRound > MaxRound then
- BattleLogic.BattleEnd(0)
- return curFrame
- end
- if roleResult == 1 then
- if BattleLogic.CurOrder == BattleLogic.TotalOrder then
- BattleLogic.BattleEnd(1)
- else
- BattleLogic.Event:DispatchEvent(BattleEventName.BattleOrderChange, BattleLogic.CurOrder + 1)
- BattleLogic.StartOrder()
- end
- end
- -- 检测帧事件(技能命中,伤害计算,buff生成)
- local index = 1
- while index <= tbActionList.size do
- local action = tbActionList.buffer[index]
- if action[1] <= curFrame then
- action[2]()
- actionPool:Put(action)
- tbActionList:Remove(index)
- else
- index = index + 1
- end
- end
- -- 检测buff
- BattleLogic.BuffMgr:Update()
- ---
- -- 检测角色状态
- RoleManager.Update()
- -- -- 检测死亡
- -- if RoleManager.CheckDead() then -- 单独用一帧执行死亡
- -- return
- -- end
- -- -- 检测复活
- -- if RoleManager.CheckRelive() then -- 单独用一帧执行复活
- -- return
- -- end
- -- 检测技能释放
- -- 检测轮转
- BattleLogic.CheckTurnRound()
- BattleLogic.CheckProcessSkill() --< 检测技能轮转
- --> 空场时间 一方空场 另一方不进行战斗单元回合 以及技能回合
- -- if BattleLogic.IsJumpSkillAndUnitFrame() then
- -- BattleLogic.CheckAndAddTibu(0)
- -- BattleLogic.CheckAndAddTibu(1)
- -- -- end 待定处理防范
- -- CurRound = CurRound + 1
- -- return
- -- end
- FightUnitManager.UpdateRoundBegin() --< 检测unit 施放roundbegin
- FightUnitManager.UpdateRoundEnd() --< 检测unit 施放roundend
- -- 技能
- SkillManager.Update()
- return curFrame
- end
- --空场状态检测
- function BattleLogic.IsJumpSkillAndUnitFrame()
- local IsMyTeamEmpty = RoleManager.IsMyTeamEmpty(0)
- local IsEnemyTeamEmpty = RoleManager.IsMyTeamEmpty(1)
- local myhasSub = RoleManager.HasTibu(0)
- local enemyHasTibu = RoleManager.HasTibu(1)
- local myTibuState = RoleManager.getTibuStateByCamp(0)
- local enemyTibuState = RoleManager.getTibuStateByCamp(1)
- -- if (IsMyTeamEmpty and myhasSub ) or ( IsEnemyTeamEmpty and enemyHasTibu) then
- -- RoleManager.Log("!!")
- -- end
- local result = ( IsMyTeamEmpty and myhasSub ) or ( IsEnemyTeamEmpty and enemyHasTibu )
- return result
- end
- --检测注册替补上阵
- function BattleLogic.CheckAndAddTibuToWaiting(_camp,func)
- if RoleManager.IsMyOneDead(_camp) and
- RoleManager.HasTibu(_camp) and
- not RoleManager.IsRoleTibuAdding(_camp) then
- -- 增加替补回合游戏不会结束
- -- 轮转到我方回合
- RoleManager.setTibuPos(RoleManager.IsMyOneDeadPosCanNotRelive(_camp),_camp)
- RoleManager.AddTibuToWaitingState(_camp)
- if func then
- func(_camp)
- return
- end
- -- BattleLogic.RoundBegin(function()
- BattleLogic.RegisterDelayRroundTrigger(1,RoleManager.AddTibu,_camp)
- BattleLogic.TriggerDelay(_camp)
- BattleLogic.ProcessSkillNextFrame()
- -- end)
- end
- end
- --检测重置替补状态到待上场
- function BattleLogic.CheckAndAddTibuToOnStage(_camp)
- if RoleManager.HasTibu(_camp) and
- not RoleManager.IsRoleTibuAdding(_camp) and
- not RoleManager.IsNotFullTeam(_camp) then
- -- 重置状态
- RoleManager.SetTibuState(_camp,1)
- -- 注销上场
- BattleLogic.UnRegisterDelayRroundTrigger(RoleManager.AddTibu,_camp)
- end
- end
- --队伍未满检测上阵
- function BattleLogic.CheckAndAddTibuAtBeginRound(_camp,func)
- if RoleManager.HasTibu(_camp) and RoleManager.IsNotFullTeam(_camp) then
- RoleManager.setTibuPos(RoleManager.MyTeamEmptyPos(_camp),_camp)
- RoleManager.AddTibuToWaitingState(_camp)
- if func then
- func(_camp)
- return
- end
- -- BattleLogic.RoundBegin(function()
- BattleLogic.RegisterDelayRroundTrigger(1,RoleManager.AddTibu,_camp)
- BattleLogic.TriggerDelay(_camp)
- -- end)
- end
- end
- function BattleLogic.CheckAndAddTibu(_camp,func)
- if RoleManager.IsMyOneDead(_camp) and RoleManager.HasTibu(_camp) then
- -- 增加替补回合游戏不会结束
- -- 轮转到我方回合
- RoleManager.setTibuPos(RoleManager.IsMyOneDeadPosCanNotRelive(_camp),_camp)
- RoleManager.AddTibuToWaitingState(_camp)
- if func then
- func(_camp)
- return
- end
- -- BattleLogic.RoundBegin(function()
- BattleLogic.RegisterDelayRroundTrigger(1,RoleManager.AddTibu,_camp)
- BattleLogic.TriggerDelay(_camp)
- -- end)
- end
- end
- -- 替补上阵中
- function BattleLogic.IsAddingSubstitute(_camp)
- if not RoleManager.HasTibu(_camp) then
- return false
- end
- if RoleManager.IsRoleTibuAdding(_camp) then
- return true
- end
- return false
- end
- function BattleLogic.GetMoveTimes()
- return MoveTimes
- end
- --修改攻击位置为未攻击
- function BattleLogic.ChangeRecordPos(pos,flag)
- PosIsAttackRecord[pos]= flag
- end
- -- 战斗结束
- function BattleLogic.BattleEnd(result)
- BattleLogic.Event:DispatchEvent(BattleEventName.BeforeBattleEnd, result)
- BattleLogic.IsEnd = true
- BattleLogic.Result = result
- BattleLogic.Event:DispatchEvent(BattleEventName.BattleEnd, result)
- -- RoleManager.printEveryOneDate()
- -- BattleLogManager.Log(
- -- "BattleEnd",
- -- "result:", result
- -- )
- RoleManager.printEveryOneDate(nil)
- -- BattleLogManager.Log(
- -- "BattleEnd",
- -- "result:", result
- -- )
- -- 战斗日志写入
- if not BattleLogic.GetIsDebug() then
- BattleLogManager.WriteFile()
- -- 加入 计算数据
- -- local caculate = RoleManager.getCaRecord()
- -- BattleLogManager.WriteServerFightData(caculate, Random.GetSeed(), "Caculate")
- end
- -- BattleLogic.Clear()
- end
- --轮询战斗结果
- function BattleLogic.FeachResult()
- if BattleLogic.IsFetchedResult then return end
- BattleLogic.IsFetchedResult = true
- local roleResult = RoleManager.GetResult()
- if roleResult == 0 then
- BattleLogic.BattleEnd(0)
- return
- end
- if CurRound > MaxRound then
- BattleLogic.BattleEnd(0)
- return
- end
- if roleResult == 1 then
- if BattleLogic.CurOrder == BattleLogic.TotalOrder then
- BattleLogic.TotalOrder = #fightData.enemyData
- else
- BattleLogic.Event:DispatchEvent(BattleEventName.BattleOrderChange, BattleLogic.CurOrder + 1)
- BattleLogic.IsEnd = false
- end
- end
- end
- function BattleLogic.Clear()
- -- 清空角色
- RoleManager.Clear()
- -- 清空事件
- while tbActionList.size > 0 do
- actionPool:Put(tbActionList.buffer[tbActionList.size])
- tbActionList:Remove(tbActionList.size)
- end
- delayRoundTrip={}
- end
|