636 lines
22 KiB
Lua
636 lines
22 KiB
Lua
|
local XTeam = require("XEntity/XTeam/XTeam")
|
|||
|
local XNormalGWNode = require("XEntity/XGuildWar/Battle/Node/XNormalGWNode")
|
|||
|
local XHomeGWNode = require("XEntity/XGuildWar/Battle/Node/XHomeGWNode")
|
|||
|
local XBuffGWNode = require("XEntity/XGuildWar/Battle/Node/XBuffGWNode")
|
|||
|
local XGuardGWNode = require("XEntity/XGuildWar/Battle/Node/XGuardGWNode")
|
|||
|
local XInfectGWNode = require("XEntity/XGuildWar/Battle/Node/XInfectGWNode")
|
|||
|
local XSentinelGWNode = require("XEntity/XGuildWar/Battle/Node/XSentinelGWNode")
|
|||
|
local XGWEliteMonster = require("XEntity/XGuildWar/Battle/XGWEliteMonster")
|
|||
|
local XGWBattleManager = XClass(nil, "XGWBattleManager")
|
|||
|
|
|||
|
local NodeType2Class = {
|
|||
|
[XGuildWarConfig.NodeType.Home] = XHomeGWNode,
|
|||
|
[XGuildWarConfig.NodeType.Normal] = XNormalGWNode,
|
|||
|
[XGuildWarConfig.NodeType.Buff] = XBuffGWNode,
|
|||
|
[XGuildWarConfig.NodeType.Sentinel] = XSentinelGWNode,
|
|||
|
[XGuildWarConfig.NodeType.Guard] = XGuardGWNode,
|
|||
|
[XGuildWarConfig.NodeType.Infect] = XInfectGWNode,
|
|||
|
}
|
|||
|
|
|||
|
local CreateNode = function(id)
|
|||
|
local nodeConfig = XGuildWarConfig.GetNodeConfig(id)
|
|||
|
if nodeConfig == nil then
|
|||
|
XLog.Error(string.format( "找不到节点%s配置", id))
|
|||
|
return
|
|||
|
end
|
|||
|
local nodeType = nodeConfig.Type
|
|||
|
local classDefine = NodeType2Class[nodeType]
|
|||
|
if classDefine == nil then
|
|||
|
XLog.Error(string.format( "找不到节点%s类型%s配置", id, nodeType))
|
|||
|
return
|
|||
|
end
|
|||
|
local result = classDefine.New(id)
|
|||
|
return result
|
|||
|
end
|
|||
|
|
|||
|
XGWBattleManager.DoAction = {
|
|||
|
[XGuildWarConfig.MosterActType.Dead] = function(self, actionGroup)--怪物死亡
|
|||
|
XEventManager.DispatchEvent(XEventId.EVENT_GUILDWAR_ACTION_DEAD, actionGroup)
|
|||
|
end,
|
|||
|
|
|||
|
[XGuildWarConfig.MosterActType.Born] = function(self, actionGroup)--怪物诞生
|
|||
|
XEventManager.DispatchEvent(XEventId.EVENT_GUILDWAR_ACTION_BORN, actionGroup)
|
|||
|
end,
|
|||
|
|
|||
|
[XGuildWarConfig.MosterActType.Move] = function(self, actionGroup)--怪物移动
|
|||
|
XEventManager.DispatchEvent(XEventId.EVENT_GUILDWAR_ACTION_MOVE, actionGroup)
|
|||
|
end,
|
|||
|
|
|||
|
[XGuildWarConfig.MosterActType.BaseHit] = function(self, actionGroup)--基地受伤
|
|||
|
XEventManager.DispatchEvent(XEventId.EVENT_GUILDWAR_ACTION_BASEHIT, actionGroup)
|
|||
|
end,
|
|||
|
|
|||
|
[XGuildWarConfig.MosterActType.NodeDestroyed] = function(self, actionGroup)--节点攻破
|
|||
|
XEventManager.DispatchEvent(XEventId.EVENT_GUILDWAR_ACTION_NODEDESTROY, actionGroup)
|
|||
|
end,
|
|||
|
}
|
|||
|
|
|||
|
function XGWBattleManager:Ctor(difficultyId)
|
|||
|
self.DifficultyId = difficultyId
|
|||
|
-- 所有节点
|
|||
|
self.NodeDic = {}
|
|||
|
-- { [uid] = XGWEliteMonster }
|
|||
|
self.MonsterDic = {}
|
|||
|
-- 路线节点字典
|
|||
|
self.NodeId2PathIndex = {}
|
|||
|
-- 我自己的回合数据 XGuildWarRoundDataDb
|
|||
|
self.CurrentMyRoundData = nil
|
|||
|
-- 节点战斗记录数据 { GuildWarFightRecord }
|
|||
|
self.FightRecords = {}
|
|||
|
-- 当前轮次的数据
|
|||
|
self.CurrentRoundData = nil
|
|||
|
-- 行动队列
|
|||
|
self.ActionList = {}
|
|||
|
-- 行动是否需要缩放字典
|
|||
|
self.ActionZoomDic = {}
|
|||
|
-- 已观看的行动ID
|
|||
|
self.ShowedActionIdDic = {}
|
|||
|
-- 行动正在展示中
|
|||
|
self.IsActionPlayingDic = {}
|
|||
|
-- 当前客户端缓存的战斗UID, 节点或怪物的
|
|||
|
self.CurrentClientBattleUID = nil
|
|||
|
-- 当前客户端缓存的节点状态
|
|||
|
self.CurrentClientBattleNodeStatus = nil
|
|||
|
-- 动画是否是历史动画
|
|||
|
self.IsHistoryAction = false
|
|||
|
-- 动画是否缩放
|
|||
|
self.IsActionInZoom = false
|
|||
|
end
|
|||
|
|
|||
|
-- activityData : GuildWarActivityData
|
|||
|
-- myRoundData : XGuildWarRoundDataDb
|
|||
|
function XGWBattleManager:InitWithServerData(currentRoundData, myRoundData, fightRecords)
|
|||
|
self:UpdateCurrentRoundData(currentRoundData)
|
|||
|
self:UpdateMyRoundData(myRoundData)
|
|||
|
self:UpdateFightRecords(fightRecords)
|
|||
|
end
|
|||
|
|
|||
|
-- data : GuildWarActivityData
|
|||
|
function XGWBattleManager:UpdateCurrentRoundData(data)
|
|||
|
self.DifficultyId = data.DifficultyId
|
|||
|
self.CurrentRoundData = data
|
|||
|
self:UpdateNodePathIndex(self:GetCurrentRoundData().AttackPlan)
|
|||
|
for id, node in pairs(self.NodeDic) do
|
|||
|
node:UpdateWithServerData(self:GetNodeServerData(id))
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
-- data : XGuildWarRoundDataDb
|
|||
|
function XGWBattleManager:UpdateMyRoundData(data)
|
|||
|
self.CurrentMyRoundData = data
|
|||
|
self.DifficultyId = data.DifficultyId
|
|||
|
end
|
|||
|
|
|||
|
-- data : List<GuildWarFightRecord>
|
|||
|
function XGWBattleManager:UpdateFightRecords(data)
|
|||
|
self.FightRecords = data
|
|||
|
end
|
|||
|
|
|||
|
-- data : XGuildWarNodeData
|
|||
|
function XGWBattleManager:UpdateNodeData(data)
|
|||
|
local node = self:GetNode(data.NodeId)
|
|||
|
node:UpdateWithServerData(data)
|
|||
|
end
|
|||
|
|
|||
|
function XGWBattleManager:UpdateNodeDatas(datas)
|
|||
|
for _, data in ipairs(datas) do
|
|||
|
self:UpdateNodeData(data)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function XGWBattleManager:UpdateMonsterData(data)
|
|||
|
local roundData = self:GetCurrentRoundData()
|
|||
|
local monsterData
|
|||
|
for i = #roundData.MonsterData, 1, -1 do
|
|||
|
monsterData = roundData.MonsterData[i]
|
|||
|
if monsterData.Uid == data.Uid then
|
|||
|
roundData.MonsterData[i] = data
|
|||
|
break
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
-- 更新精英怪死亡
|
|||
|
function XGWBattleManager:UpdateMonsterDead(uid, IsDead)
|
|||
|
local monster = self:GetMonsterDic()[uid]
|
|||
|
if not monster then
|
|||
|
XLog.Error(string.format( "服务器下发不存在的怪物Uid : %s", uid))
|
|||
|
return
|
|||
|
end
|
|||
|
monster:UpdateDead(IsDead)
|
|||
|
end
|
|||
|
|
|||
|
function XGWBattleManager:GetCurrentMyRoundData()
|
|||
|
return self.CurrentMyRoundData
|
|||
|
end
|
|||
|
|
|||
|
-- GuildWarRoundData
|
|||
|
function XGWBattleManager:GetCurrentRoundData()
|
|||
|
return self.CurrentRoundData
|
|||
|
end
|
|||
|
|
|||
|
-- 当前轮次累计活跃度
|
|||
|
function XGWBattleManager:GetTotalActivation()
|
|||
|
return self:GetCurrentRoundData().TotalActivation
|
|||
|
end
|
|||
|
|
|||
|
-- 当前轮次累计积分
|
|||
|
function XGWBattleManager:GetTotalPoint()
|
|||
|
return self:GetCurrentRoundData().TotalPoint
|
|||
|
end
|
|||
|
|
|||
|
-- 获取节点服务器数据
|
|||
|
function XGWBattleManager:GetNodeServerData(id)
|
|||
|
local currentRoundData = self:GetCurrentRoundData()
|
|||
|
if currentRoundData == nil then return nil end
|
|||
|
for _, nodeData in ipairs(currentRoundData.NodeData) do
|
|||
|
if nodeData.NodeId == id then
|
|||
|
return nodeData
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function XGWBattleManager:GetDifficultyId()
|
|||
|
return self.DifficultyId
|
|||
|
end
|
|||
|
|
|||
|
function XGWBattleManager:GetNode(id)
|
|||
|
local result = self.NodeDic[id]
|
|||
|
if result == nil then
|
|||
|
result = CreateNode(id)
|
|||
|
local serverData = self:GetNodeServerData(id)
|
|||
|
if serverData then
|
|||
|
result:UpdateWithServerData(serverData)
|
|||
|
else
|
|||
|
XLog.Error(string.format( "找不到%s节点的服务器数据", id))
|
|||
|
end
|
|||
|
self.NodeDic[id] = result
|
|||
|
end
|
|||
|
return result
|
|||
|
end
|
|||
|
|
|||
|
-- 获取当前难度名称
|
|||
|
function XGWBattleManager:GetDifficultyName()
|
|||
|
local difficultyCfg = XGuildWarConfig.GetCfgByIdKey(XGuildWarConfig.TableKey.Difficulty, self.DifficultyId)
|
|||
|
return difficultyCfg and difficultyCfg.Name
|
|||
|
end
|
|||
|
|
|||
|
-- 获取当前难度扫荡血量折损
|
|||
|
function XGWBattleManager:GetSweepHpFactor()
|
|||
|
local difficultyCfg = XGuildWarConfig.GetCfgByIdKey(XGuildWarConfig.TableKey.Difficulty, self.DifficultyId)
|
|||
|
return difficultyCfg and difficultyCfg.SweepHpFactor
|
|||
|
end
|
|||
|
|
|||
|
-- 获取当前节点id
|
|||
|
function XGWBattleManager:GetCurrentNodeId()
|
|||
|
if self:GetCurrentMyRoundData() == nil then
|
|||
|
return 1
|
|||
|
end
|
|||
|
return self:GetCurrentMyRoundData().CurNodeId
|
|||
|
end
|
|||
|
|
|||
|
function XGWBattleManager:UpdateCurrentNodeId(value)
|
|||
|
self:GetCurrentMyRoundData().CurNodeId = value
|
|||
|
end
|
|||
|
|
|||
|
-- 获取所有节点数据
|
|||
|
function XGWBattleManager:GetNodes()
|
|||
|
local result = {}
|
|||
|
local nodeIds = XGuildWarConfig.GetNodeIdsByDifficultyId(self.DifficultyId)
|
|||
|
for _, nodeId in ipairs(nodeIds) do
|
|||
|
table.insert(result, self:GetNode(nodeId))
|
|||
|
end
|
|||
|
return result
|
|||
|
end
|
|||
|
|
|||
|
-- 获取所有怪物字典,key为UID
|
|||
|
function XGWBattleManager:GetMonsterDic()
|
|||
|
local roundData = self:GetCurrentRoundData()
|
|||
|
local monster = nil
|
|||
|
local monsterUnRemoveDic = {}
|
|||
|
if roundData == nil then
|
|||
|
return {}
|
|||
|
end
|
|||
|
for _, monsterData in pairs(roundData.MonsterData) do
|
|||
|
monsterUnRemoveDic[monsterData.Uid] = true
|
|||
|
monster = self.MonsterDic[monsterData.Uid]
|
|||
|
if monster == nil then
|
|||
|
monster = XGWEliteMonster.New(monsterData.MonsterId)
|
|||
|
end
|
|||
|
monster:UpdateWithServerData(monsterData)
|
|||
|
self.MonsterDic[monsterData.Uid] = monster
|
|||
|
end
|
|||
|
-- 删除冗余的怪物数据
|
|||
|
for uid, _ in pairs(self.MonsterDic) do
|
|||
|
if not monsterUnRemoveDic[uid] then
|
|||
|
self.MonsterDic[uid] = nil
|
|||
|
end
|
|||
|
end
|
|||
|
return self.MonsterDic
|
|||
|
end
|
|||
|
|
|||
|
-- 根据节点id获取怪物数据
|
|||
|
function XGWBattleManager:GetMonstersByNodeId(id, checkIsDead)
|
|||
|
if checkIsDead == nil then checkIsDead = true end
|
|||
|
local result = {}
|
|||
|
for _, v in pairs(self:GetMonsterDic()) do
|
|||
|
if v:GetCurrentNodeId() == id then
|
|||
|
if not checkIsDead or not v:GetIsDead() then
|
|||
|
table.insert(result, v)
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
return result
|
|||
|
end
|
|||
|
|
|||
|
-- 根据节点id获取怪物数据
|
|||
|
function XGWBattleManager:GetMonsterById(uid)
|
|||
|
local monster = self:GetMonsterDic()[uid]
|
|||
|
if not monster then
|
|||
|
XLog.Error(string.format( "服务器下发不存在的怪物Uid : %s", uid))
|
|||
|
return
|
|||
|
end
|
|||
|
return monster
|
|||
|
end
|
|||
|
|
|||
|
function XGWBattleManager:UpdateNodePathIndex(pathNodeIds)
|
|||
|
self.NodeId2PathIndex = {}
|
|||
|
for index, id in ipairs(pathNodeIds or {}) do
|
|||
|
self.NodeId2PathIndex[id] = index
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function XGWBattleManager:GetNodePathIndex(nodeId)
|
|||
|
return self.NodeId2PathIndex[nodeId]
|
|||
|
end
|
|||
|
|
|||
|
-- 根据节点UID或者精英怪UID获取最高伤害
|
|||
|
function XGWBattleManager:GetMaxDamageByUID(uid, aliveType)
|
|||
|
if self.FightRecords == nil or #self.FightRecords <= 0 then
|
|||
|
return 0
|
|||
|
end
|
|||
|
for _, data in pairs(self.FightRecords) do
|
|||
|
if data.Uid == uid then
|
|||
|
if aliveType == nil then
|
|||
|
return data.MaxDamage
|
|||
|
elseif data.AliveType == aliveType then
|
|||
|
return data.MaxDamage
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
return 0
|
|||
|
end
|
|||
|
|
|||
|
-- 获取战斗日志
|
|||
|
function XGWBattleManager:GetBattleLogs(count)
|
|||
|
local result = {}
|
|||
|
local roundData = self:GetCurrentRoundData()
|
|||
|
for i = #roundData.Battlelog, 1, -1 do
|
|||
|
local logData = roundData.Battlelog[i]
|
|||
|
local menberData = XDataCenter.GuildManager.GetMemberDataByPlayerId(logData.PlayerId)
|
|||
|
if menberData then
|
|||
|
local IsFightNode = logData.FightType == XGuildWarConfig.NodeFightType.FightNode
|
|||
|
local IsShowDeadNode = logData.IsDead > 0 and IsFightNode
|
|||
|
|
|||
|
local textConfig = IsShowDeadNode and
|
|||
|
XGuildWarConfig.BattleDeadNodeLogTextConfig or
|
|||
|
XGuildWarConfig.BattleLogTextConfig[logData.LogType]
|
|||
|
|
|||
|
local text = ""
|
|||
|
local fightName = ""
|
|||
|
|
|||
|
if IsFightNode then
|
|||
|
local node = self:GetNode(logData.NodeId)
|
|||
|
fightName = node:GetName(false)
|
|||
|
text = textConfig[node:GetNodeType()] or ""
|
|||
|
else
|
|||
|
fightName = XGuildWarConfig.GetEliteMonsterConfig(logData.MonsterId).Name
|
|||
|
text = textConfig[XGuildWarConfig.NodeType.Normal] or ""
|
|||
|
end
|
|||
|
|
|||
|
local logFullText = ""
|
|||
|
if IsShowDeadNode then
|
|||
|
logFullText = XUiHelper.GetText(text,(logData.Point or 0))
|
|||
|
else
|
|||
|
logFullText = XUiHelper.GetText(text,fightName,string.format("%s", (logData.DamagePercent or 0) / 10))
|
|||
|
end
|
|||
|
|
|||
|
local log = {
|
|||
|
Time = XTime.TimestampToGameDateTimeString(logData.CreateTime, "MM.dd HH:mm"),
|
|||
|
Name = menberData:GetName(),
|
|||
|
Text = logFullText
|
|||
|
}
|
|||
|
table.insert(result, log)
|
|||
|
end
|
|||
|
|
|||
|
if count and #result >= count then
|
|||
|
return result
|
|||
|
end
|
|||
|
end
|
|||
|
return result
|
|||
|
end
|
|||
|
|
|||
|
-- 获取所有buff节点,默认是已经激活的
|
|||
|
function XGWBattleManager:GetBuffNodes()
|
|||
|
local result = {}
|
|||
|
for _, node in ipairs(self:GetNodes()) do
|
|||
|
if node:GetNodeType() == XGuildWarConfig.NodeType.Buff then
|
|||
|
if node:GetIsActiveBuff() then
|
|||
|
table.insert(result, node)
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
return result
|
|||
|
end
|
|||
|
|
|||
|
function XGWBattleManager:CheckActionIsShowed(id)
|
|||
|
return self.ShowedActionIdDic[id]
|
|||
|
end
|
|||
|
|
|||
|
function XGWBattleManager:UpdateShowedActionIdDic(idList)
|
|||
|
for _,id in pairs(idList or {}) do
|
|||
|
self.ShowedActionIdDic[id] = true
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
local InsertActinGroupList = function(allActinGroupList, actinGroup)
|
|||
|
if actinGroup and next(actinGroup) then
|
|||
|
table.sort(actinGroup, function (a, b)
|
|||
|
return a.ActionId < b.ActionId
|
|||
|
end)
|
|||
|
table.insert(allActinGroupList, actinGroup)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function XGWBattleManager:GetRobots(characterType)
|
|||
|
local robotIds = XGuildWarConfig.GetCfgByIdKey(XGuildWarConfig.TableKey.Difficulty, self:GetDifficultyId()).RobotId
|
|||
|
local result = {}
|
|||
|
local characterId = nil
|
|||
|
local robotCharacterType
|
|||
|
for _, id in ipairs(robotIds) do
|
|||
|
robotCharacterType = XEntityHelper.GetRobotCharacterType(id)
|
|||
|
if characterType == nil then
|
|||
|
table.insert(result, XRobotManager.GetRobotById(id))
|
|||
|
elseif characterType == robotCharacterType then
|
|||
|
table.insert(result, XRobotManager.GetRobotById(id))
|
|||
|
end
|
|||
|
end
|
|||
|
return result
|
|||
|
end
|
|||
|
|
|||
|
function XGWBattleManager:GetTeam()
|
|||
|
if self.__Team == nil then
|
|||
|
self.__Team = XTeam.New("XGWBattleManager" .. self:GetDifficultyId())
|
|||
|
end
|
|||
|
-- 清除错误配置的机器人
|
|||
|
local robotIds = XGuildWarConfig.GetCfgByIdKey(XGuildWarConfig.TableKey.Difficulty, self:GetDifficultyId()).RobotId
|
|||
|
local robotIdDic = table.arrayToDic(robotIds)
|
|||
|
for pos, entityId in ipairs(self.__Team:GetEntityIds()) do
|
|||
|
if entityId > 0 and XEntityHelper.GetIsRobot(entityId) then
|
|||
|
if robotIdDic[entityId] == nil then
|
|||
|
self.__Team:UpdateEntityTeamPos(entityId, pos, false)
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
return self.__Team
|
|||
|
end
|
|||
|
|
|||
|
function XGWBattleManager:OpenBattleRoomUi(stageId)
|
|||
|
XLuaUiManager.Open("UiBattleRoleRoom", stageId, self:GetTeam(), require("XUi/XUiGuildWar/XUiGuildWarBattleRoleRoom"))
|
|||
|
end
|
|||
|
|
|||
|
-- 获取怪物行动组队列
|
|||
|
function XGWBattleManager:GetActionGroupList()
|
|||
|
local actionAllGroupList = {}
|
|||
|
local actionDeadGroupDic = {}
|
|||
|
local actionBornGroupDic = {}
|
|||
|
local actionMoveGroupDic = {}
|
|||
|
local actionBaseHitGroupDic = {}
|
|||
|
local actionNodeDestroyedGroup = {}
|
|||
|
local turn = 1
|
|||
|
|
|||
|
for _,action in pairs(self.ActionList or {}) do
|
|||
|
if not self:CheckActionIsShowed(action.ActionId) then
|
|||
|
if action.ActionType == XGuildWarConfig.MosterActType.Dead then
|
|||
|
actionDeadGroupDic[turn] = actionDeadGroupDic[turn] or {}
|
|||
|
table.insert(actionDeadGroupDic[turn], action)
|
|||
|
|
|||
|
elseif action.ActionType == XGuildWarConfig.MosterActType.Move then
|
|||
|
actionMoveGroupDic[turn] = actionMoveGroupDic[turn] or {}
|
|||
|
table.insert(actionMoveGroupDic[turn], action)
|
|||
|
|
|||
|
elseif action.ActionType == XGuildWarConfig.MosterActType.Born then
|
|||
|
actionBornGroupDic[turn] = actionBornGroupDic[turn] or {}
|
|||
|
table.insert(actionBornGroupDic[turn], action)
|
|||
|
|
|||
|
elseif action.ActionType == XGuildWarConfig.MosterActType.BaseHit then
|
|||
|
actionBaseHitGroupDic[turn] = actionBaseHitGroupDic[turn] or {}
|
|||
|
table.insert(actionBaseHitGroupDic[turn], action)
|
|||
|
|
|||
|
elseif action.ActionType == XGuildWarConfig.MosterActType.NodeDestroyed then
|
|||
|
local node = self:GetNode(action.NodeId)
|
|||
|
table.insert(actionNodeDestroyedGroup, action)
|
|||
|
elseif action.ActionType == XGuildWarConfig.MosterActType.NextTurn then
|
|||
|
turn = turn + 1
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
for key = 1, turn do
|
|||
|
InsertActinGroupList(actionAllGroupList, actionMoveGroupDic[key])
|
|||
|
InsertActinGroupList(actionAllGroupList, actionBornGroupDic[key])
|
|||
|
InsertActinGroupList(actionAllGroupList, actionDeadGroupDic[key])
|
|||
|
InsertActinGroupList(actionAllGroupList, actionBaseHitGroupDic[key])
|
|||
|
end
|
|||
|
InsertActinGroupList(actionAllGroupList, actionNodeDestroyedGroup)
|
|||
|
|
|||
|
return actionAllGroupList
|
|||
|
end
|
|||
|
|
|||
|
function XGWBattleManager:GetPreMonsterDataDic()--只需拿出第一回合所有需要预创建的怪物就好,后面回合用到的怪物要么是出生的,要么是前面回合遗留下来的。
|
|||
|
local preMonsterDataDic = {}
|
|||
|
|
|||
|
for _,action in pairs(self.ActionList or {}) do
|
|||
|
if not self:CheckActionIsShowed(action.ActionId) then
|
|||
|
if action.ActionType == XGuildWarConfig.MosterActType.Dead then
|
|||
|
if not preMonsterDataDic[action.MonsterUid] then
|
|||
|
local data = {UID = action.MonsterUid, NodeIndex = action.CurNodeIdx}
|
|||
|
preMonsterDataDic[action.MonsterUid] = data
|
|||
|
end
|
|||
|
elseif action.ActionType == XGuildWarConfig.MosterActType.Move then
|
|||
|
if not preMonsterDataDic[action.MonsterUid] then
|
|||
|
local data = {UID = action.MonsterUid, NodeIndex = action.PreNodeIdx}
|
|||
|
preMonsterDataDic[action.MonsterUid] = data
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
for _,action in pairs(self.ActionList or {}) do
|
|||
|
if not self:CheckActionIsShowed(action.ActionId) then
|
|||
|
if action.ActionType == XGuildWarConfig.MosterActType.Born then
|
|||
|
if preMonsterDataDic[action.MonsterUid] then
|
|||
|
preMonsterDataDic[action.MonsterUid] = nil
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
return preMonsterDataDic
|
|||
|
end
|
|||
|
|
|||
|
function XGWBattleManager:GetIsHasCanPlayAction()
|
|||
|
for _,action in pairs(self.ActionList or {}) do
|
|||
|
if action.ActionType ~= XGuildWarConfig.MosterActType.NextTurn then
|
|||
|
if not self:CheckActionIsShowed(action.ActionId) then
|
|||
|
return true
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
function XGWBattleManager:DoActionFinish(actionType)
|
|||
|
self.IsActionPlayingDic[actionType] = nil
|
|||
|
self:CheckActionList()
|
|||
|
end
|
|||
|
|
|||
|
function XGWBattleManager:CheckActionList()
|
|||
|
if not self:CheckActionPlaying() then
|
|||
|
local firstIndex = 1
|
|||
|
local actionGroupList = self:GetActionGroupList()
|
|||
|
local actionGroup = actionGroupList[firstIndex]
|
|||
|
if actionGroup and next(actionGroup) then
|
|||
|
local actionIdList = {}
|
|||
|
for _,action in pairs(actionGroup) do
|
|||
|
table.insert(actionIdList, action.ActionId)
|
|||
|
end
|
|||
|
XDataCenter.GuildWarManager.RequestPopupActionID(actionIdList, function ()
|
|||
|
local type = actionGroup[1].ActionType
|
|||
|
self.IsActionPlayingDic[type] = true
|
|||
|
self:UpdateShowedActionIdDic(actionIdList)
|
|||
|
if self.DoAction[type] then
|
|||
|
if self:CheckActionGroupNeedZoom(actionGroup) and not self.IsActionInZoom then
|
|||
|
XEventManager.DispatchEvent(XEventId.EVENT_GUILDWAR_OPEN_MOVIEMODE,function ()
|
|||
|
self.DoAction[type](self, actionGroup)
|
|||
|
end)
|
|||
|
self.IsActionInZoom = true
|
|||
|
else
|
|||
|
self.DoAction[type](self, actionGroup)
|
|||
|
end
|
|||
|
end
|
|||
|
end)
|
|||
|
else
|
|||
|
XEventManager.DispatchEvent(XEventId.EVENT_GUILDWAR_ACTIONLIST_OVER)
|
|||
|
XEventManager.DispatchEvent(XEventId.EVENT_GUILDWAR_CLOSE_MOVIEMODE)
|
|||
|
self:SetIsHistoryAction(false)
|
|||
|
self.IsActionInZoom = false
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function XGWBattleManager:CheckActionPlaying()
|
|||
|
for _,plaing in pairs(self.IsActionPlayingDic or {}) do
|
|||
|
if plaing then
|
|||
|
return true
|
|||
|
end
|
|||
|
end
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
--设置行动队列
|
|||
|
function XGWBattleManager:SetActionList(actionList)
|
|||
|
self.ActionList = actionList
|
|||
|
self.ActionZoomDic = {}
|
|||
|
for _,action in pairs(actionList or {}) do
|
|||
|
self.ActionZoomDic[action.ActionId] = true
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--增加行动队列
|
|||
|
function XGWBattleManager:AddActionList(actionList)
|
|||
|
appendArray(self.ActionList, actionList)
|
|||
|
self:UpdateActionData(actionList)--只有即时发生的事件需要通过action去更新数据
|
|||
|
end
|
|||
|
|
|||
|
function XGWBattleManager:UpdateActionData(actionList)
|
|||
|
for _,action in pairs(actionList) do
|
|||
|
if action.ActionType == XGuildWarConfig.MosterActType.Dead then
|
|||
|
self:UpdateMonsterDead(action.MonsterUid, true)
|
|||
|
elseif action.ActionType == XGuildWarConfig.MosterActType.NodeDestroyed then
|
|||
|
self:UpdateNodeData(action.NodeData)
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function XGWBattleManager:UpdateCurrentClientBattleInfo(uid, nodeStatus)
|
|||
|
self.CurrentClientBattleUID = uid
|
|||
|
self.CurrentClientBattleNodeStatus = nodeStatus
|
|||
|
end
|
|||
|
|
|||
|
function XGWBattleManager:GetCurrentClientBattleUID()
|
|||
|
return self.CurrentClientBattleUID
|
|||
|
end
|
|||
|
|
|||
|
function XGWBattleManager:GetCurrentClientBattleNodeStatus()
|
|||
|
return self.CurrentClientBattleNodeStatus
|
|||
|
end
|
|||
|
|
|||
|
function XGWBattleManager:CheckActionGroupNeedZoom(actionGroup)
|
|||
|
for _,action in pairs(actionGroup or {}) do
|
|||
|
if self.ActionZoomDic[action.ActionId] then
|
|||
|
return true
|
|||
|
end
|
|||
|
end
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
function XGWBattleManager:CheckIsHistoryAction()
|
|||
|
return self.IsHistoryAction
|
|||
|
end
|
|||
|
|
|||
|
function XGWBattleManager:SetIsHistoryAction(IsHistory)
|
|||
|
self.IsHistoryAction = IsHistory
|
|||
|
end
|
|||
|
|
|||
|
function XGWBattleManager:CheckAllInfectIsDead()
|
|||
|
for _, node in ipairs(self:GetNodes()) do
|
|||
|
if node:GetNodeType() == XGuildWarConfig.NodeType.Infect then
|
|||
|
if not node:GetIsDead() then
|
|||
|
return false
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
return true
|
|||
|
end
|
|||
|
|
|||
|
return XGWBattleManager
|