| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263 |
- RoleManager = {}
- local this = RoleManager
- --我方死亡列表
- local _RealDeadList={}
- -- 将死之人
- local _DeadRoleList = {}
- -- 重生之人
- local _ReliveRoleList = {}
- -- 所有角色
- local PosList = {}
- -- 删除节点
- local removeObjList = BattleList.New()
- -- 角色对象池
- local rolePool = BattleObjectPool.New(function ()
- return RoleLogic.New()
- end)
- local bMyAllDead
- local bEnemyAllDead
- --替补数据
- local tibuRoleList={}
- local tibuData = {}
- local enemy_tibuData = {}
- -- 替补状态
- -- 0 不存在
- -- 1 存在且在替补席 (未有单位死亡备战)
- -- 3 存在且上阵中 (有战斗单位死亡准备上阵)
- -- 4 (角色出场时)
- -- 2 存在且已经上阵 (替补角色生成已在场上) 替补对象生成后
- -- 0 (不存在替补) --- 1 (存在初始化 备战ing)--- 3(场上有一个对象死亡等待上场)--- 4(开始上场直到上场动画回合结束)----2(回合结束到之后状态)
- SubstiState={
- none=0,
- stage=1,
- waiting=3,
- onshow=4,
- showed=5
- }
- local Tibu_State
- local enemyTibu_State
- local RecordCaculate={}
- -- 初始化
- function this.Init()
- bMyAllDead = false
- bEnemyAllDead = false
- Tibu_State=0
- enemyTibu_State = 0
- RecordCaculate={}
- this.Clear()
- end
- local isLog=false
- --temp角色日志
- function RoleManager.Log(str)
- if isLog then
- --LogError(str)
- end
- end
- --to do check yh 角色数据添加 camp==0 我方英雄 1 敌方英雄 战斗替补上阵回合增加角色上阵信息
- function this.getCaRecord()
- return RecordCaculate
- end
- -- 角色数据添加
- local curUid
- function this.AddRole(roleData, position, isHelp)
- if not curUid then
- curUid = 0
- end
- curUid = curUid + 1
- local role = rolePool:Get()
- -- 判断当前角色作为替补角色出现
- if not roleData.isTibu then
- RoleManager.Log("no tibu")
- role:Init(curUid, roleData, position)
- else
- RoleManager.Log("is tibu")
- if roleData.camp == 0 then
- role = tibuRoleList[1]
- elseif roleData.camp == 1 then
- role = tibuRoleList[2]
- end
- end
- -- objList:Add(curUid, role)
- if roleData.camp == 0 then
- RoleManager.Log("slef on"..position)
- PosList[position] = role -- 1-9 我方英雄
- role.position = position
- else
- -- 检测固定上场位置
- if position + 9 > 18 or position + 9 <= 9 then
- if position < 1 then
- position= position + 9
- elseif position > 9 then
- position = position - 9
- end
- end
- role.position = position
- RoleManager.Log("enemy on"..(position ))
- PosList[position + 9] = role-- 10-18 敌方英雄
- end
-
- if not role:IsRealDead() then
- if role:IsSubstitute() then
- BattleLogic.Event:DispatchEvent(BattleEventName.AddRole, role, isHelp,true)
-
- local RoundEndTibuSetState
- RoundEndTibuSetState =function (isHave,nullNum,ReCheckRound)
- if role.camp == 0 then Tibu_State=2 end
- if role.camp == 1 then enemyTibu_State=2 end
- BattleLogic.Event:RemoveEvent(BattleEventName.RoundBegin, RoundEndTibuSetState)
- end
- BattleLogic.Event:AddEvent(BattleEventName.RoundBegin, RoundEndTibuSetState)
-
- BattleLogic.ChangeRecordPos(role.position,false)
- local ResetTibuRound
- ResetTibuRound =function (isHave,nullNum,ReCheckRound)
- ReCheckRound(true,nullNum-1)
- BattleLogic.Event:RemoveEvent(BattleEventName.BattleRoundCheck, ResetTibuRound)
- end
- BattleLogic.Event:AddEvent(BattleEventName.BattleRoundCheck, ResetTibuRound)
- return
- end
- BattleLogic.Event:DispatchEvent(BattleEventName.AddRole, role, isHelp,false)
- end
- end
- ------------- 抽象替补逻辑
- function this.InitTibuData(roleData,position)
- local date
- if roleData.camp == 0 then
- date = tibuData
- if roleData == nil then
- tibuData.HasTibu = false
- tibuData.AddTibu = false
- Tibu_State = 0
- else
- if not curUid then
- curUid = 0
- end
- curUid = curUid + 1
- Tibu_State = 1
- local role = rolePool:Get()
- role:Init(curUid, roleData, position)
- tibuRoleList[1] = role
- tibuData.roleData = roleData
- tibuData.position = position
- tibuData.HasTibu = true
- tibuData.AddTibu = false
-
- end
- else
- date = enemy_tibuData
- if roleData == nil then
- enemy_tibuData.HasTibu = false
- enemy_tibuData.AddTibu = false
- enemyTibu_State = 0
- else
- if not curUid then
- curUid = 0
- end
- curUid = curUid + 1
- enemyTibu_State = 1
- local role = rolePool:Get()
- role:Init(curUid, roleData, position)
- tibuRoleList[2] = role
- enemy_tibuData.roleData = roleData
- enemy_tibuData.position = position
- enemy_tibuData.HasTibu = true
- enemy_tibuData.AddTibu = false
- end
- end
- return date
- end
- function this.getTibuStateByCamp(_camp)
- if _camp == 0 or _camp == nil then
- return Tibu_State
- elseif _camp == 1 then
- return enemyTibu_State
- end
- end
- function this.getTibuState()
- if Tibu_State ~= nil then
- RoleManager.Log("@@@@@@@@@@@@Tibu_State"..Tibu_State.."xxxxxxx enemyTibu_State"..enemyTibu_State)
- return Tibu_State,enemyTibu_State
- end
- RoleManager.Log("@@@@@@@@@@@@@@Tibu_State is nil")
- end
- function this.HasTibu(_camp)
- if _camp == 0 then
- if tibuData ~= nil then
- return tibuData.HasTibu
- else
- return false
- end
- elseif _camp == 1 then
- if enemy_tibuData ~= nil then
- return enemy_tibuData.HasTibu
- else
- return false
- end
- end
- end
- function this.SetTibuState(_camp,_state)
- if _camp == 0 then
- Tibu_State =_state
- elseif _camp == 1 then
- enemyTibu_State = _state
- end
- end
- function this.AddTibuToWaitingState(_camp)
- if _camp == 0 then
- Tibu_State = 3
- elseif _camp == 1 then
- enemyTibu_State = 3
- end
- end
- function this.IsRoleTibuAdding(_camp)
- if _camp == 0 then
- if Tibu_State == 3 then
- return true
- end
- return false
- elseif _camp == 1 then
- if enemyTibu_State == 3 then
- return true
- end
- return false
- end
- end
- function this.TibuClear()
- tibuData.HasTibu = false
- tibuData.AddTibu = false
- Tibu_State = 0
- enemy_tibuData.HasTibu = false
- enemy_tibuData.AddTibu = false
- enemyTibu_State = 0
- end
- --todo check yh 增加替补
- function this.AddTibu(_camp)
- if _camp == 0 then
- if tibuData.HasTibu then
- -- RoleManager.Log("............................1 my"..tibuData.position)
- Tibu_State = 4
- tibuData.AddTibu = true
- this.AddRole(tibuData.roleData,tibuData.position,false)
- bMyAllDead = false
- tibuData.HasTibu = false
- RoleManager.getTibuState()
- BattleLogic.Event:DispatchEvent(BattleEventName.OnAddTibuRole, tibuData.roleData)
- end
- elseif _camp == 1 then
- if enemy_tibuData.HasTibu then
- -- RoleManager.Log("............................1 enemy po"..enemy_tibuData.position)
- enemyTibu_State = 4
- enemy_tibuData.AddTibu = true
- this.AddRole(enemy_tibuData.roleData,enemy_tibuData.position - 9,false)
- bEnemyAllDead = false
- enemy_tibuData.HasTibu = false
- RoleManager.getTibuState()
- BattleLogic.Event:DispatchEvent(BattleEventName.OnAddTibuRole, enemy_tibuData.roleData)
- end
- end
- -- RoleManager.Log("............................2")
- end
- function this.setTibuPos(pos,_camp)
- if _camp == 0 then
- tibuData.position = pos
- elseif _camp == 1 then
- enemy_tibuData.position = pos
- end
- end
- -- 是否满编 !!pve 不适用
- function this.IsNotFullTeam(_camp)
- local teamFull = 5 --满编队 5人 --引用外部函数注意!
- local idx = 0
- for _, ro in pairs(PosList) do
- if ro.camp == _camp and ro ~= nil then
- idx = idx +1
- end
- end
- if idx < teamFull then
- return true
- end
- return false
- end
- --空场位置 返回第一个
- function this.MyTeamEmptyPos(_camp)
- for i =1 , 9 do
- if PosList[i+_camp*9] == nil then return i end
- end
- for po, ro in pairs(PosList) do
- if ro.camp == _camp and ro ==nil and not this.IsReliveRole(ro) then
- RoleManager.Log("po"..po)
- return po
- end
- end
- end
- -- 获取场上一个存活对象
- function this.getMyTeamOneAlive()
- for _, ro in pairs(PosList) do
- if ro.camp == 0 and ro:IsDead()==false then
- return ro
- end
- end
- return nil
- end
- --我方场上一人触发被动技能
- function this.TriggerMyTeamOneAlivePassivity(passivity)
- if tibuRoleList ~= nil then
- for _,ro in pairs(tibuRoleList) do
- local role = ro
- if role~=nil then
- role:AddPassiveByOther(passivity)
- -- LogError("TriggerMyTeamOneAlivePassivity")
- end
- end
- end
- end
- --给所有存活人员加上被动buff
- function this.AddPassiveToAliveRoles(role)
- for _, ro in pairs(PosList) do
- if ro.camp == 0 and ro:IsDead()==false then
- for idx = 1, #role.passivity do
- -- v:AddPassive(id)
- -- v:AddBuff()
- local v = role.passivity[idx]
- local ids = v[1]
- for k = 1, #ids do
- local args = {}
- for j = 1, #v[k + 1] do
- args[j] = v[k + 1][j]
- end
- local id = ids[k]
- if BattleUtil.Passivity[id] then
- BattleUtil.Passivity[id](ro, args)
- -- 加入被动列表
- table.insert(ro.passiveList, {id, args})
- else
- end
- end
- end
- end
- end
- if not role:IsRealDead() then
- BattleLogic.Event:DispatchEvent(BattleEventName.AddRole, role, isHelp)
- end
- this.Clone()
- end
- --当前场上没有角色
- function this.IsMyTeamEmpty(_camp)
- for _, v in pairs(PosList) do
- if v.camp == _camp and v:IsDead()==false then
- return false
- end
- end
- return true
- end
- --to do check yh 我方全部阵亡
- function this.IsMyAllDead()
- return bMyAllDead
- end
- --to do check yh 某方一人阵亡
- function this.IsMyOneDead(_camp)
- for pos, role in pairs(_RealDeadList) do
- if role.camp==_camp then
- --and not BattleLogic.BuffMgr:HasBuff(role,BuffName.NoDead)
- return true
- end
- end
- return false
- end
- --to do check yh 我方一人阵亡位置
- function this.IsMyOneDeadPosCanNotRelive(_camp)
- local upPos = -1
- for pos, role in pairs(_RealDeadList) do
- if role.camp==_camp then
- --被替补无法复活 role:GoDead() and not BattleLogic.BuffMgr:HasBuff(role,BuffName.NoDead)
- -- role:SetReliveFilter(false)
- upPos = pos
- break
- end
- end
- if upPos == -1 then upPos = this.MyTeamEmptyPos(_camp) end
- return upPos
- end
- ------------- 抽象替补逻辑 end
- function this.Update()
- bMyAllDead = true
- bEnemyAllDead = true
- for _, v in pairs(PosList) do
- if not v:IsRealDead() then
- v:Update()
- if v.camp == 0 then
- bMyAllDead = false
- else
- bEnemyAllDead = false
- end
- end
- end
- -- to do check yh 更新战斗检测
- if tibuData~=nil then
- if bMyAllDead and tibuData.HasTibu then
- bMyAllDead = false
- end
- end
- if enemy_tibuData~=nil then
- if bEnemyAllDead and enemy_tibuData.HasTibu then
- bEnemyAllDead = false
- end
- end
- if bEnemyAllDead then
- BattleLogic.Event:DispatchEvent(BattleEventName.BattleOrderEnd, BattleLogic.CurOrder)
- end
- end
- -- 获取结果
- function this.GetResult()
- -- RecordResult={}
- -- for _, v in pairs(PosList) do
- -- if v~=nil then
- -- local isdead="false"
- -- if v.isRealDead then isdead = "true" end
- -- local _rolinfo =tostring(_) .." hp:".. tostring(v:GetRoleData(RoleDataName.Hp)) .." camp:"..tostring(v.camp) .." isdead:".. isdead
- -- table.insert(RecordResult , _rolinfo)
- -- end
- -- end
- -- if bMyAllDead then
- -- local _set=" bMyAllDead is true"
- -- table.insert(RecordResult,_set)
- -- end
- -- if bEnemyAllDead then
- -- local _set=" bEnemyAllDead is true"
- -- table.insert(RecordResult,_set)
- -- end
- if bMyAllDead then
- return 0
- end
- if bEnemyAllDead then
- return 1
- end
- end
- function this.CheadListOnDeadPool()
- if _RealDeadList~=nil then
- for pos, role in pairs(_RealDeadList) do
- return role
- end
- end
- return nil
- end
- -- 加入将死的人
- function this.AddDeadRole(role)
- _DeadRoleList[role.position + role.camp * 9] = role
- _RealDeadList[role.position + role.camp * 9] = role
- end
- -- 检测是有人将死
- function this.CheckDead()
- local isDeadFrame = false
- local removePos = {}
- for pos, role in pairs(_DeadRoleList) do
- if role:GoDead() then
- isDeadFrame = true
- table.insert(removePos, pos)
- end
- end
- for _, pos in ipairs(removePos) do
- _DeadRoleList[pos] = nil
- end
- return isDeadFrame
- end
- -- 加入复活之人
- function this.AddReliveRole(role)
- _ReliveRoleList[role.position + role.camp * 9] = role
- _RealDeadList[role.position + role.camp * 9] = nil
- end
- -- 是否在复活列表
- function this.IsReliveRole(role)
- if _ReliveRoleList==nil then
- return false
- end
- for ro in pairs(_ReliveRoleList) do
- if ro==role then
- return true
- end
- end
- return false
- end
- -- 检测是否有人复活
- function this.CheckRelive()
- local isReliveFrame = false
- local removePos = {}
- for pos, role in pairs(_ReliveRoleList) do
- if role:Relive() then
- isReliveFrame = true
- table.insert(removePos, pos)
- end
- end
- for _, pos in ipairs(removePos) do
- _ReliveRoleList[pos] = nil
- end
- return isReliveFrame
- end
- -- 获取角色数据
- function this.GetRole(camp, pos)
- return PosList[pos + camp*9]
- end
- function this.GetRoleByPos(pos)
- return PosList[pos]
- end
- -- 获取某阵营所有角色
- function this.GetRoleByCamp(camp)
- local list = {}
- for i = 1, 6 do
- list[i] = PosList[i + camp * 6]
- end
- return list
- end
- --查找角色替补数据
- function RoleManager.QueryTibu(func, inCludeDeadRole)
- local list = {}
- local index = 1
- if #tibuRoleList > 0 then
- if func then
- for camp, v in pairs(tibuRoleList) do
- if func(v) and (inCludeDeadRole or not v:IsRealDead()) then
- list[index] = v
- index = index + 1
- end
- end
- end
- end
- table.sort(list, function(a, b)
- return a.position < b.position
- end)
- return list
- end
- -- 查找角色
- function RoleManager.Query(func, inCludeDeadRole)
- local list = {}
- local index = 1
- if func then
- for pos, v in pairs(PosList) do
- if func(v) and (inCludeDeadRole or not v:IsRealDead()) then
- list[index] = v
- index = index + 1
- end
- end
- end
- table.sort(list, function(a, b)
- return a.position < b.position
- end)
- return list
- end
- --> 查找死亡角色
- function RoleManager.QueryDead(func)
- local list = {}
- local index = 1
- if func then
- for pos, v in pairs(PosList) do
- if func(v) and v:IsRealDead() then
- list[index] = v
- index = index + 1
- end
- end
- end
- table.sort(list, function(a, b)
- return a.position < b.position
- end)
- return list
- end
- --对位规则: 1敌方相同对位 2若死亡或不存在,选取相邻阵位最近且阵位索引最小的
- function this.GetAggro(role)
- -- -- 计算开始位置
- -- local startPos = role.position
- -- startPos = startPos > 3 and startPos - 3 or startPos
- -- local target
- -- local enemyCamp = role.camp == 0 and 1 or 0
- -- -- c=0 前排 c=1 后排
- -- for c = 0, 1 do
- -- startPos = startPos + c*3
- -- -- 向左
- -- for i = startPos, c*3+1, -1 do
- -- local pos = i + enemyCamp * 6
- -- if PosList[pos] and not PosList[pos]:IsRealDead() then
- -- target = PosList[pos]
- -- break
- -- end
- -- end
- -- if target then return target end
- -- -- 向右
- -- for i = startPos + 1, c*3+3 do
- -- local pos = i + enemyCamp * 6
- -- if PosList[pos] and not PosList[pos]:IsRealDead() then
- -- target = PosList[pos]
- -- break
- -- end
- -- end
- -- if target then return target end
- -- end
- -->
- -- 计算开始位置
- local startPos = role.position
- startPos = startPos > 6 and startPos - 6 or (startPos > 3 and startPos - 3 or startPos)
- local target
- local enemyCamp = role.camp == 0 and 1 or 0
- local tempStartPos = startPos --< 重置用
- -- c=0 前排 c=1 中排
- for c = 0, 2 do
- startPos = tempStartPos
- startPos = startPos + c*3
- -- 向左
- for i = startPos, c*3+1, -1 do
- local pos = i + enemyCamp * 9
- if PosList[pos] and not PosList[pos]:IsRealDead() then
- target = PosList[pos]
- break
- end
- end
- if target then return target end
- -- 向右
- for i = startPos + 1, c*3+3 do
- local pos = i + enemyCamp * 9
- if PosList[pos] and not PosList[pos]:IsRealDead() then
- target = PosList[pos]
- break
- end
- end
- if target then return target end
- end
- end
- -- 获取没有进入死亡状态的仇恨目标
- function this.GetAliveAggro(role)
- -- 计算开始位置
- local startPos = role.position
- startPos = startPos > 3 and startPos - 3 or startPos
- local target
- local enemyCamp = role.camp == 0 and 1 or 0
- -- c=0 前排 c=1 后排
- for c = 0, 1 do
- startPos = startPos + c*3
- -- 向左
- for i = startPos, c*3+1, -1 do
- local pos = i + enemyCamp * 6
- if PosList[pos] and not PosList[pos]:IsDead() then
- target = PosList[pos]
- break
- end
- end
- if target then return target end
- -- 向右
- for i = startPos + 1, c*3+3 do
- local pos = i + enemyCamp * 6
- if PosList[pos] and not PosList[pos]:IsDead() then
- target = PosList[pos]
- break
- end
- end
- if target then return target end
- end
- --> 只有被动用 暂不动
- end
- --对位规则: 1敌方相同对位 2若死亡或不存在,选取相邻阵位最近且阵位索引最小的
- function this.GetArrAggroList(role, arr)
- -- -- 重构数据
- -- local plist = {}
- -- for _, role in ipairs(arr) do
- -- plist[role.position] = role
- -- end
- -- -- 计算开始位置
- -- local startPos = role.position
- -- startPos = startPos > 3 and startPos - 3 or startPos
- -- local targetList = {}
- -- -- c=0 前排 c=1 后排
- -- for c = 0, 1 do
- -- startPos = startPos + c*3
- -- -- 向左
- -- for i = startPos, c*3+1, -1 do
- -- local pos = i
- -- if plist[pos] and not plist[pos]:IsRealDead() then
- -- table.insert(targetList, plist[pos])
- -- end
- -- end
- -- -- 向右
- -- for i = startPos + 1, c*3+3 do
- -- local pos = i
- -- if plist[pos] and not plist[pos]:IsRealDead() then
- -- table.insert(targetList, plist[pos])
- -- end
- -- end
- -- end
- -- table.sort(targetList, function(a, b)
- -- return a.position < b.position
- -- end)
- -- return targetList
- -->
- -- 重构数据
- local plist = {}
- for _, role in ipairs(arr) do
- plist[role.position] = role
- end
- -- 计算开始位置
- local startPos = role.position
- startPos = startPos > 6 and startPos - 6 or (startPos > 3 and startPos - 3 or startPos)
- local targetList = {}
- local tempStartPos = startPos --< 重置用
- -- c=0 前排 c=1 中排
- for c = 0, 2 do
- startPos = tempStartPos
- startPos = startPos + c*3
- -- 向左
- for i = startPos, c*3+1, -1 do
- local pos = i
- if plist[pos] and not plist[pos]:IsRealDead() then
- table.insert(targetList, plist[pos])
- end
- end
- -- 向右
- for i = startPos + 1, c*3+3 do
- local pos = i
- if plist[pos] and not plist[pos]:IsRealDead() then
- table.insert(targetList, plist[pos])
- end
- end
- end
- table.sort(targetList, function(a, b)
- return a.position < b.position
- end)
- return targetList
- end
- --获取对位相邻站位的人 chooseType 1 我方 2 敌方(对位的敌人受到嘲讽的影响,若对位的敌人死亡,则选取相邻最近的作为目标)
- function this.GetNeighbor(role, chooseType)
- local posList = {}
- local target
- if chooseType == 1 then
- target = role
- else
- if role.lockTarget and not role.lockTarget:IsRealDead() then
- target = role.lockTarget
- else
- target = this.GetAggro(role)
- end
- end
- if target then
- local list = this.Query(function (r) return r.camp == target.camp end)
- for i=1, #list do
- if not list[i]:IsRealDead() then
- if list[i].position == target.position + 3 -- 后排的人
- or list[i].position == target.position - 3 -- 前排的人
- or (math.abs(target.position - list[i].position) <= 1 and math.floor((target.position-1)/3) == math.floor((list[i].position-1)/3)) then -- 旁边的人和自己
- table.insert(posList, list[i])
- end
- end
- end
- end
- table.sort(posList, function(a, b)
- return a.position < b.position
- end)
- return posList
- end
- function this.Clear()
- --todo check yh add
- this.TibuClear()
- for _, obj in pairs(PosList) do
- obj:Dispose()
- removeObjList:Add(obj)
- end
- PosList = {}
- while removeObjList.size > 0 do
- rolePool:Put(removeObjList.buffer[removeObjList.size])
- removeObjList:Remove(removeObjList.size)
- end
- _DeadRoleList = {}
- _ReliveRoleList = {}
- _RealDeadList= {}
- tibuRoleList={}
- end
- -- 多波
- function this.ClearEnemy()
- local removePos = {}
- for pos, obj in pairs(PosList) do
- if obj.camp == 1 then
- removePos[pos] = 1
- BattleLogic.Event:DispatchEvent(BattleEventName.RemoveRole, obj)
- obj:Dispose()
- removeObjList:Add(obj)
- end
- end
- for pos, _ in pairs(removePos) do
- PosList[pos] = nil
- end
- end
- --> 获取当前最高速度阵营
- function RoleManager.GetFastCamp()
- local maxSpeed = -1
- local maxSpeedCamp = 0
- for pos = 1, 18 do
- while true
- do
- local role = RoleManager.GetRoleByPos(pos)
- if role and not role:IsRealDead() then
- if maxSpeed < role:GetRoleData(RoleDataName.Speed) then
- maxSpeed = role:GetRoleData(RoleDataName.Speed)
- maxSpeedCamp = role.camp
- end
- end
- break
- end
- end
- return maxSpeedCamp
- end
- --> deprecated 改为服务器算好位置
- --> 检测是否有人物数据 根据 位置信息和当前阵型 (formationPos 需要是对应camp的阵型)
- function RoleManager.CheckIsHaveRole(camp, position, formationPos)
- local pos = nil
- local isInFormation = false
- for i = 1, 5 do
- if formationPos[i] then
- if position == formationPos[i] then
- isInFormation = true
- end
- else
- --Logerror("### RoleManager.CheckIsHaveRole error!!!")
- end
- end
- if isInFormation then
- if camp == 0 then
- pos = position
- elseif camp == 1 then
- pos = position + 9
- end
- if PosList[pos] then
- return true
- else
- return false
- end
- else
- return false
- end
- return false
- end
- function RoleManager.CheckIsExistRole(camp, position)
- local pos = nil
- if camp == 0 then
- pos = position
- elseif camp == 1 then
- pos = position + 9
- end
- if PosList[pos] then
- return true
- else
- return false
- end
- end
- function this.getOneRoleProperty(role,pro)
- local _line=""
- if role ~= nil then
- local date =role:GetData(pro)
- if date~=nil then
- _line =tostring(date)
- end
- end
- return _line
- end
- function this.printLogicInfo()
- local line=""
- local tb ={}
- line =line.." frame".. BattleLogic.CurFrame()
- line =line.." curRround"..BattleLogic.GetCurRound()
- line =line.." curMove"..BattleLogic.GetMoveTimes()
- return line
- end
- local _cacheTeam
- function this.printEveryOneDate(_posList)
- _cacheTeam={}
- if _posList == nil then _posList = PosList end
- for pos,_role in pairs(PosList) do
- local info =this.printOneProper(_role,"self ")
- local prop={
- _info=info,
- _pos=pos
- }
- if prop.info==nil then
- prop.info="null"
- end
- table.insert(_cacheTeam,prop)
- end
- return _cacheTeam
- end
- function this.GetTeamInfos()
- return this.printEveryOneDate(PosList)
- end
- function this.printOneProper(_role,_sign)
- local _line=_role.roleId.." \n"
- _line=_line..this.getOneRoleProperty(_role,RoleDataName.Hp).." ".."--生命 \n"
- _line=_line..this.getOneRoleProperty(_role,RoleDataName.MaxHp).." ".."--最大生命 \n"
- _line=_line..this.getOneRoleProperty(_role,RoleDataName.Attack).." ".."--攻击力 \n"
- _line=_line..this.getOneRoleProperty(_role,RoleDataName.PhysicalDefence).." ".."--护甲 \n"
- _line=_line..this.getOneRoleProperty(_role,RoleDataName.MagicDefence).." ".."--魔抗 \n"
- _line=_line..this.getOneRoleProperty(_role,RoleDataName.Speed).." ".."--速度 \n"
- _line=_line..this.getOneRoleProperty(_role,RoleDataName.DamageBocusFactor).."-> ".."--伤害加成系数(%) \n"
- _line=_line..this.getOneRoleProperty(_role,RoleDataName.DamageReduceFactor).." ".."--伤害减免系数(%) \n"
- _line=_line..this.getOneRoleProperty(_role,RoleDataName.Hit).." ".."--施法率(% \n"
- _line=_line..this.getOneRoleProperty(_role,RoleDataName.Dodge).." ".."--后期基础施法率(%) \n"
- _line=_line..this.getOneRoleProperty(_role,RoleDataName.Crit).." ".."--暴击率(%) \n"
- _line=_line..this.getOneRoleProperty(_role,RoleDataName.CritDamageFactor).." ".."--暴击伤害系数(%) \n"
- _line=_line..this.getOneRoleProperty(_role,RoleDataName.Tenacity).." ".."--抗暴率(%) \n"
- _line=_line..this.getOneRoleProperty(_role,RoleDataName.TreatFacter).." ".."--治疗加成系数(%) \n"
- _line=_line..this.getOneRoleProperty(_role,RoleDataName.CureFacter).." ".."--受到治疗加成系数(%) \n"
- _line=_line..this.getOneRoleProperty(_role,RoleDataName.PhysicalDamage).." ".."--< 物伤 \n"
- _line=_line..this.getOneRoleProperty(_role,RoleDataName.MagicDamage).." ".."--< 法伤 \n"
- _line=_line..this.getOneRoleProperty(_role,RoleDataName.PhysicalImmune).."-> ".."--< 物免 \n"
- _line=_line..this.getOneRoleProperty(_role,RoleDataName.MagicImmune).." ->".."--< 法免 \n"
- _line=_line..this.getOneRoleProperty(_role,RoleDataName.SpeedAddition).." ".."--< 速度加成 \n"
- _line=_line..this.getOneRoleProperty(_role,RoleDataName.AttackAddition).." ".."--< 攻击加成 \n"
- _line=_line..this.getOneRoleProperty(_role,RoleDataName.ArmorAddition).." ".."--< 护甲加成 \n"
- _line=_line..this.getOneRoleProperty(_role,RoleDataName.ControlProbability).." ".."--< 控制几率 \n"
- _line=_line..this.getOneRoleProperty(_role,RoleDataName.ControlResist).." ".."--< 控制抵抗 \n"
- _line=_line..this.getOneRoleProperty(_role,RoleDataName.SkillDamage).." ".."--< 技能伤害 \n"
- -- _line=_line..this.getOneRoleProperty(_role,RoleDataName.DamageToMage).." ".."--< 对高爆型伤害 \n"
- -- _line=_line..this.getOneRoleProperty(_role,RoleDataName.DamageToFighter).." ".."--< 对穿甲型伤害 \n"
- -- _line=_line..this.getOneRoleProperty(_role,RoleDataName.DamageToDefender).." ".."--< 对防御型伤害 \n"
- -- _line=_line..this.getOneRoleProperty(_role,RoleDataName.DamageToHealer).." ".."--< 对辅助型伤害 \n"
- -- _line=_line..this.getOneRoleProperty(_role,RoleDataName.DefenceFromFighter).." ".."--< 受穿甲型伤害降低 \n"
- -- _line=_line..this.getOneRoleProperty(_role,RoleDataName.DefenceFromMage).." ".."--< 受高爆型伤害降低 \n"
- -- _line=_line..this.getOneRoleProperty(_role,RoleDataName.DefenceFromDefender).." ".."--< 受防御型伤害降低 \n"
- -- _line=_line..this.getOneRoleProperty(_role,RoleDataName.DefenceFromHealer).." ".."--< 受辅助型伤害降低 \n"
- _line=_line..this.getOneRoleProperty(_role,RoleDataName.CriDamageReduceRate).." ".."--< 暴伤抵抗 \n"
- _line=_line..this.getOneRoleProperty(_role,RoleDataName.HealCritical).." ".."--< 修理暴击 \n"
- _line=_line..this.getOneRoleProperty(_role,RoleDataName.HealCriEffect).." ".."--< 修理暴击效果 \n"
- _line=_line..this.getOneRoleProperty(_role,RoleDataName.MaxHpPercentage).." ".."--< 生命加成 \n"
- if _role.isRealDead then
- _line=_line.."》》》isdead"
- else
- _line=_line.."》》》not dead"
- end
- BattleLogManager.Log(
- _sign.." round:"..BattleLogic.GetCurRound().."frame:"..BattleLogic.CurFrame(),
- "tcamp:".. _role.camp,
- "tpos:".. _role.position,
- "prop:".. _line," end"
- )
- return _line
- end
- ------------------- 回滚状态同步
- --记录当前回滚帧
- this.nowRecored={}
- function this.printMirror()
- -- --获取克隆的人员输出属性
- -- BattleLogManager.Log(
- -- "~~~~cloneMirror round:"..BattleLogic.GetCurRound().."frame:"..BattleLogic.CurFrame().." start"
- -- )
- -- if ##this.nowRecored > 0 and #this.nowRecored._fPosList > 0 then
- -- local _posList = this.nowRecored._fPosList
- -- this.printEveryOneDate(_posList)
-
- -- end
- -- BattleLogManager.Log(
- -- "~~~~~cloneMirror round:"..BattleLogic.GetCurRound().."frame:"..BattleLogic.CurFrame().." end"
- -- )
- end
- --记录角色计算数据
- function this.LogCa(...)
- -- local args = {...}
- -- local log = args[1] .. ":\n"
- -- log = log .. string.format("%s = %s, ", "frame", BattleLogic.CurFrame())
- -- for i = 2, #args, 2 do
- -- local key = args[i]
- -- local value = args[i + 1]
- -- log = log .. string.format("%s = %s, ", key, value)
- -- end
- -- table.insert(RecordCaculate, log)
- end
- function this.LogArgs(id,args)
- if #args > 0 then
- for i,arg in pairs(args) do
- --LogError("id:"..id.." ".."arg["..i.."]:"..arg)
- end
- end
- end
- -------------------工具方法--------------
- local function compare(_myrole,_other)
- --Logerror("compare ".._myrole.roleId.." ")
- return _myrole:Equle(_other)
- end
- local function getRoleInPool(_role,_pool)
- --Logerror("getRole".._role.roleId)
- local ro =_pool:Find(_role,compare)
- return ro
- end
- local function tableCloneUID(intb,cptb,_newpool)
- for pos, rol in pairs(cptb) do
- intb[pos]=getRoleInPool(rol,_newpool)
- -- --Logerror("R..................y")
- end
- return intb
- end
- -------------------工具方法--------------
- function this.XCpy()
- local _cpPool = BattleObjectPool.New(function ()
- return RoleLogic.New()
- end)
- local function _cpRoles(_role)
- --Logerror("ori".._role.roleId)
- local _r = _role:Clone()
- _cpPool:Put(_r)
- --Logerror("new".._r.roleId)
- end
- rolePool:Foreach(_cpRoles)
-
- --Logerror("_cpPool........."..tostring(_cpPool:Count()))
- end
- function this.CopyTableRole(_tb)
- local _copyTb=BattleDictionary.New()
- if _tb~=nil and #_tb>0 then
- for pos=1,#_tb do
- local _rol=_tb[pos]:Clone()
- _copyTb:Add(pos,_rol)
- end
- end
- return _copyTb
- end
- --克隆关键数据
- function this.Clone()
- local _roleCp = BattleObjectPool.New(function ()
- return RoleLogic.New()
- end)
- local function _cpRoles(_role)
- --Logerror("ori".._role.roleId)
- local _r = _role:Clone()
- _roleCp:Put(_r)
- --Logerror("new".._r.roleId)
- end
- rolePool:Foreach(_cpRoles)
-
- -- local _roleCp = rolePool:CloneType("RoleLogic") 做镜像数据
- -- 将死之人
- local function CopyTableRole(_tb,_copyTb)
- if _tb~=nil and #_tb>0 then
- for pos,role in pairs(_tb) do
- local _rol=role:Clone()
- --Logerror("_rol........."..role.roleId)
- _copyTb:Add(pos,_rol)
- end
- end
- end
- -- local _roleCp = rolePool:CloneType("RoleLogic") 做镜像数据
- -- 将死之人
- local _CpDeadRoleList = BattleDictionary.New()
- -- 重生之人
- local _CpReliveRoleList = BattleDictionary.New()
- -- 所有角色
- local _CpPosList = BattleDictionary.New()
- CopyTableRole(_DeadRoleList,_CpDeadRoleList)
- CopyTableRole(_ReliveRoleList,_CpReliveRoleList)
- CopyTableRole(PosList,_CpPosList)
-
- local frame = {
- _frolepool=_roleCp,
- _fDeadRoleList = _CpDeadRoleList,
- _fReliveRoleList = _CpReliveRoleList,
- _fPosList = _CpPosList
- }
- return frame
- end
- -- 更新当前角色池中的所有角色数据
- local function ContainsRoleInTable(tab,role)
- if #tab <=0 then return false end
- for pos,ro in pairs(tab) do
- if role:Equle(ro) then
- return true
- end
- end
- return true
- end
- local function FindRoleInTable(tab,role)
- --Logerror("F..............1")
- if #tab <=0 then return nil end
- for pos,ro in pairs(tab) do
- if role:Equle(ro) then
- return ro
- end
- end
- return nil
- end
- local function FindRolePosInTable(tab,role)
- if #tab <=0 then return nil end
- for pos,ro in pairs(tab) do
- if role:Equle(ro) then
- return pos
- end
- end
- return nil
- end
- --回滚战斗数据
- function this.RollBack(_frame)
- -- 重置对象池所有玩家数据
- local frame = _frame
- local _rolPol = frame._frolepool
- local _FDead= frame._fDeadRoleList
- local _FRelive= frame._fReliveRoleList
- local _FPos= frame._fPosList
- --Logerror("R..............5")
- ---- 原始角色池找到对象
- ---- 回滚到帧记录的对象数据
- -- local function XrollBack(_role)
- -- local mirro = _rolPol:Find(_role,compare)
- -- if mirro ~= nil then
- -- _role:RoleBack(mirro)
- -- --Logerror("R..............6")
- -- end
- -- end
- -- rolePool:Foreach(XrollBack)
- --Logerror("R..............7")
- -- 角色数据回滚
- local function XrolFucDate(orTb,MirTb)
- if #orTb<=0 then return end
- --Logerror("f..............1")
- for pos,role in pairs(orTb) do
- if MirTb:Contains(pos) then
- local _mir =MirTb:Get(pos)
- -- LogError("f..............2")
- this.printOneProper(_mir,"miro ")
- role:RoleBack(_mir)
- end
- end
- --Logerror("R..............x")
- end
- -- 角色站位回滚 --todo
- local function XrolFucPos(orTb,MirTb)
- if #orTb<=0 then return end
- for pos,role in pairs(orTb) do
- if ContainsRoleInTable(role,MirTb) then -- 在镜像数据中 回滚数据
- local _ps = FindRolePosInTable(role,MirTb)
- if _ps ~= pos then
- --Logerror(role.roleId.."pos is error")
- end
- end
- end
- end
- -- XrolFucDate(_DeadRoleList,_FDead)
- --Logerror("R..............8")
- -- XrolFucDate(_ReliveRoleList,_FRelive)
- --Logerror("R..............9")
- XrolFucDate(PosList,_FPos)
- --Logerror("R..............10")
- this.nowRecored = frame
- return frame
- end
- return this
|