generated from root/miduo_server
1263 lines
37 KiB
Lua
1263 lines
37 KiB
Lua
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 |