525 lines
18 KiB
Lua
525 lines
18 KiB
Lua
|
local XPlanetTeam = require("XEntity/XPlanet/Explore/XPlanetTeam")
|
||
|
local XPlanetCharacter = require("XEntity/XPlanet/Explore/XPlanetCharacter")
|
||
|
local XPlanetBuff = require("XEntity/XPlanet/Explore/XPlanetBuff")
|
||
|
local XPlanetResult = require("XEntity/XPlanet/Explore/XPlanetResult")
|
||
|
local XPlanetRunningExplore = require("XUi/XUiPlanet/Explore/XPlanetRunningExplore")
|
||
|
local ATTR = XPlanetCharacterConfigs.ATTR
|
||
|
|
||
|
XPlanetExploreManagerCreator = function()
|
||
|
local RequestProto = {
|
||
|
SetTeam = "PlanetRunningCharacterFormationRequest",
|
||
|
Move = "PlanetRunningDoMoveRequest",
|
||
|
PreFight = "PlanetRunningPreFightRequest",
|
||
|
CheckFight = "PlanetRunningCheckFightRequest",
|
||
|
SelectBuilding = "PlanetRunningSelectBuildingRequest",
|
||
|
UseItem = "PlanetRunningUseItemRequest",
|
||
|
SummonBoss = "PlanetRunningManualSummonBossRequest",
|
||
|
SetCaptain = "PlanetRunningSetCaptainRequest",
|
||
|
}
|
||
|
|
||
|
---@class XPlanetExploreManager
|
||
|
local XPlanetExploreManager = {}
|
||
|
|
||
|
local _StageData = {}
|
||
|
local _Character = {}
|
||
|
local _Stage = {}
|
||
|
---@type XPlanetResult
|
||
|
local _Result = false
|
||
|
|
||
|
---@type XPlanetTeam
|
||
|
local _Team = XPlanetTeam.New()
|
||
|
|
||
|
function XPlanetExploreManager.Init()
|
||
|
end
|
||
|
|
||
|
function XPlanetExploreManager.OnNotifyData(data)
|
||
|
_StageData = data.StageData
|
||
|
_Team:SetInitData(data.FightCharacters)
|
||
|
end
|
||
|
|
||
|
function XPlanetExploreManager.IsCharacterUnlock(characterId)
|
||
|
local isDefaultUnlock = XPlanetCharacterConfigs.GetCharacterDefaultUnlock(characterId)
|
||
|
local isUnLock = XDataCenter.PlanetManager.GetViewModel():CheckCharacterIsUnlock(characterId)
|
||
|
return isDefaultUnlock or isUnLock
|
||
|
end
|
||
|
|
||
|
function XPlanetExploreManager.GetTeam()
|
||
|
return _Team
|
||
|
end
|
||
|
|
||
|
---@return XPlanetCharacter
|
||
|
function XPlanetExploreManager.GetCharacter(characterId)
|
||
|
if not _Character[characterId] then
|
||
|
---@type XPlanetCharacter
|
||
|
local character = XPlanetCharacter.New()
|
||
|
character:SetCharacterId(characterId)
|
||
|
_Character[characterId] = character
|
||
|
end
|
||
|
return _Character[characterId]
|
||
|
end
|
||
|
|
||
|
function XPlanetExploreManager.GetAllCharacter()
|
||
|
local result = {}
|
||
|
local configs = XPlanetCharacterConfigs.GetAllCharacter()
|
||
|
for i, config in pairs(configs) do
|
||
|
local characterId = config.Id
|
||
|
local character = XPlanetExploreManager.GetCharacter(characterId)
|
||
|
result[#result + 1] = character
|
||
|
end
|
||
|
---@param a XPlanetCharacter
|
||
|
---@param b XPlanetCharacter
|
||
|
table.sort(result, function(a, b)
|
||
|
if a:IsUnlock() ~= b:IsUnlock() then
|
||
|
return a:IsUnlock()
|
||
|
end
|
||
|
|
||
|
return a:GetPriority() < b:GetPriority()
|
||
|
end)
|
||
|
return result
|
||
|
end
|
||
|
|
||
|
function XPlanetExploreManager.GetBuffList(eventIds)
|
||
|
local result = {}
|
||
|
for i = 1, #eventIds do
|
||
|
local eventId = eventIds[i]
|
||
|
---@type XPlanetBuff
|
||
|
local buff = XPlanetBuff.New()
|
||
|
buff:SetEventId(eventId)
|
||
|
result[#result + 1] = buff
|
||
|
end
|
||
|
return result
|
||
|
end
|
||
|
|
||
|
local _FightData
|
||
|
function XPlanetExploreManager.SetFightData(data)
|
||
|
_FightData = data
|
||
|
end
|
||
|
|
||
|
function XPlanetExploreManager.GetFightData()
|
||
|
return _FightData
|
||
|
end
|
||
|
|
||
|
---@param character XPlanetCharacter
|
||
|
function XPlanetExploreManager.RequestUpdateTeam()
|
||
|
local team = XPlanetExploreManager.GetTeam()
|
||
|
XNetwork.Call(RequestProto.SetTeam, {
|
||
|
CharacterIds = team:GetData4Request()
|
||
|
}, function(res)
|
||
|
if res.Code ~= XCode.Success then
|
||
|
XUiManager.TipCode(res.Code)
|
||
|
team:SetData(res.FightCharacterIds)
|
||
|
XEventManager.DispatchEvent(XEventId.EVENT_PLANET_UPDATE_TEAM)
|
||
|
return
|
||
|
end
|
||
|
end)
|
||
|
end
|
||
|
|
||
|
---@return XPlanetStage
|
||
|
function XPlanetExploreManager.GetStage(stageId)
|
||
|
if not stageId then
|
||
|
local stageData = XDataCenter.PlanetManager.GetStageData()
|
||
|
if stageData then
|
||
|
stageId = stageData:GetStageId()
|
||
|
else
|
||
|
XLog.Error("[XPlanetExploreManager] 获取当前stage失败")
|
||
|
return false
|
||
|
end
|
||
|
end
|
||
|
if _Stage[stageId] then
|
||
|
return _Stage[stageId]
|
||
|
end
|
||
|
---@type XPlanetStage
|
||
|
local stage = require("XEntity/XPlanet/Explore/XPlanetStage").New()
|
||
|
stage:SetStageId(stageId)
|
||
|
_Stage[stageId] = stage
|
||
|
return stage
|
||
|
end
|
||
|
|
||
|
---@param character XPlanetCharacter
|
||
|
function XPlanetExploreManager.RequestExploreMove(gridId, callback)
|
||
|
XNetwork.Call(RequestProto.Move, {
|
||
|
Grid = gridId,
|
||
|
}, function(res)
|
||
|
if res.Code ~= XCode.Success then
|
||
|
callback(false)
|
||
|
XUiManager.TipCode(res.Code)
|
||
|
return
|
||
|
end
|
||
|
callback(true)
|
||
|
local stageData = XDataCenter.PlanetManager.GetStageData()
|
||
|
stageData:SetGridId(gridId)
|
||
|
end)
|
||
|
end
|
||
|
|
||
|
local _PreFightLastTime = 0
|
||
|
local _PreFightDuration = 1 -- 服务端限制间隔是1秒
|
||
|
local _PreFightTimer = false
|
||
|
local function RequestFight(gridId, callback)
|
||
|
_PreFightLastTime = CS.UnityEngine.Time.unscaledTime
|
||
|
XNetwork.Call(RequestProto.PreFight, {
|
||
|
PreFightData = {
|
||
|
Grid = gridId,
|
||
|
StageId = XDataCenter.PlanetManager.GetStageData():GetStageId()
|
||
|
}
|
||
|
}, function(res)
|
||
|
if res.Code ~= XCode.Success then
|
||
|
if res.Code == XCode.FightCheckManagerClientVersionError then
|
||
|
local code = res.Code
|
||
|
local text = CS.XTextManager.GetCodeText(code)
|
||
|
XLoginManager.DoDisconnect(text)
|
||
|
return
|
||
|
end
|
||
|
callback(false, res)
|
||
|
XUiManager.TipCode(res.Code)
|
||
|
return
|
||
|
end
|
||
|
if callback then
|
||
|
callback(true, res)
|
||
|
end
|
||
|
end)
|
||
|
end
|
||
|
|
||
|
function XPlanetExploreManager.RequestPreFight(gridId, callback)
|
||
|
if _PreFightTimer then
|
||
|
XLog.Error("[XPlanetExploreManager] 同时请求两次战斗:" .. gridId)
|
||
|
return
|
||
|
end
|
||
|
local time = CS.UnityEngine.Time.unscaledTime
|
||
|
local duration = time - _PreFightLastTime
|
||
|
if duration > _PreFightDuration then
|
||
|
RequestFight(gridId, callback)
|
||
|
return
|
||
|
end
|
||
|
|
||
|
_PreFightTimer = XScheduleManager.ScheduleForever(function()
|
||
|
local time = CS.UnityEngine.Time.unscaledTime
|
||
|
local duration = time - _PreFightLastTime
|
||
|
if duration > _PreFightDuration then
|
||
|
RequestFight(gridId, callback)
|
||
|
XScheduleManager.UnSchedule(_PreFightTimer)
|
||
|
_PreFightTimer = false
|
||
|
end
|
||
|
end, 0)
|
||
|
end
|
||
|
|
||
|
function XPlanetExploreManager.RequestCheckFight(result2Check, callback)
|
||
|
local stageId = XDataCenter.PlanetManager.GetStageData():GetStageId()
|
||
|
result2Check.StageId = stageId,
|
||
|
XNetwork.Call(RequestProto.CheckFight, {
|
||
|
StageId = stageId,
|
||
|
ResultData = result2Check,
|
||
|
}, function(res)
|
||
|
if res.Code ~= XCode.Success then
|
||
|
if callback then
|
||
|
callback()
|
||
|
end
|
||
|
XUiManager.TipCode(res.Code)
|
||
|
return
|
||
|
end
|
||
|
XPlanetExploreManager.OnNotifyResult(res)
|
||
|
if callback then
|
||
|
callback()
|
||
|
end
|
||
|
end)
|
||
|
end
|
||
|
|
||
|
function XPlanetExploreManager.OnFightComplete(data)
|
||
|
local gridId = data.Grid
|
||
|
if gridId then
|
||
|
XDataCenter.PlanetManager.GetStageData():RemoveMonster(gridId)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XPlanetExploreManager.RequestUseItem(data)
|
||
|
XNetwork.Call(RequestProto.UseItem, data, function(res)
|
||
|
if res.Code ~= XCode.Success then
|
||
|
XUiManager.TipCode(res.Code)
|
||
|
return
|
||
|
end
|
||
|
end)
|
||
|
end
|
||
|
|
||
|
function XPlanetExploreManager.RequestSelectBuilding(data)
|
||
|
XNetwork.Call(RequestProto.SelectBuilding, {
|
||
|
BuildingIds = data
|
||
|
}, function(res)
|
||
|
if res.Code ~= XCode.Success then
|
||
|
XUiManager.TipCode(res.Code)
|
||
|
return
|
||
|
end
|
||
|
end)
|
||
|
end
|
||
|
|
||
|
function XPlanetExploreManager.OnNotifyResult(res)
|
||
|
local settleData = res.SettleData
|
||
|
local data = settleData.StageSettleData
|
||
|
-- 处理关卡的天赋货币收获值
|
||
|
XDataCenter.PlanetManager.GetStageData():SetTalentCoin(settleData.TalentCoin)
|
||
|
if not data then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
-- unlock character
|
||
|
local characters = data.UnlockCharacters
|
||
|
for i = 1, #characters do
|
||
|
local characterId = characters[i]
|
||
|
XDataCenter.PlanetManager.GetViewModel():SetCharacterUnlock(characterId)
|
||
|
end
|
||
|
|
||
|
---@type XPlanetResult
|
||
|
local result = XPlanetResult.New()
|
||
|
result:SetData(settleData)
|
||
|
_Result = result
|
||
|
|
||
|
if result:IsStageFinish() then
|
||
|
local stageId = result:GetStageId()
|
||
|
if stageId and result:IsWin() then
|
||
|
if not XDataCenter.PlanetManager.GetViewModel():CheckStageIsPass(stageId) then
|
||
|
result:SetFirstPass(true)
|
||
|
end
|
||
|
XDataCenter.PlanetManager.GetViewModel():AddPassStage(stageId)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XPlanetExploreManager.HandleResult(force)
|
||
|
local result = _Result
|
||
|
if not result then
|
||
|
return
|
||
|
end
|
||
|
if result:IsPlayed() and not force then
|
||
|
return
|
||
|
end
|
||
|
result:SetPlayed()
|
||
|
local settleType = result:GetSettleType()
|
||
|
if settleType == XPlanetExploreConfigs.SETTLE_TYPE.StageFinish
|
||
|
or settleType == XPlanetExploreConfigs.SETTLE_TYPE.Lose
|
||
|
or settleType == XPlanetExploreConfigs.SETTLE_TYPE.Quit
|
||
|
then
|
||
|
local explore = XPlanetExploreManager.GetExplore()
|
||
|
if explore then
|
||
|
explore:Pause(XPlanetExploreConfigs.PAUSE_REASON.RESULT)
|
||
|
end
|
||
|
XDataCenter.PlanetManager.ClearRepeatGuideCache()
|
||
|
|
||
|
XLuaUiManager.SafeClose("UiPlanetBuildDetail")
|
||
|
XLuaUiManager.SafeClose("UiPlanetDetail02")
|
||
|
XLuaUiManager.SafeClose("UiPlanetPropertyWeather")
|
||
|
XLuaUiManager.SafeClose("UiPlanetPropertyPopover")
|
||
|
XLuaUiManager.SafeClose("UiPlanetExplore")
|
||
|
XLuaUiManager.Open("UiPlanetDetail", result)
|
||
|
end
|
||
|
XDataCenter.PlanetManager.ClearStageData()
|
||
|
end
|
||
|
|
||
|
function XPlanetExploreManager.GetResult()
|
||
|
return _Result
|
||
|
end
|
||
|
|
||
|
function XPlanetExploreManager.NotifyPlanetRunningWeatherChange(data)
|
||
|
local stageData = XDataCenter.PlanetManager.GetStageData()
|
||
|
stageData:SetWeatherId(data.Weather)
|
||
|
stageData:SetWeatherLastCycle(data.WeatherLastCycle)
|
||
|
-- 事件改变天气
|
||
|
if XTool.IsNumberValid(data.WeatherLastCycle) then
|
||
|
stageData:UpdateWeatherGroupIsInEvent()
|
||
|
end
|
||
|
XEventManager.DispatchEvent(XEventId.EVENT_PLANET_UPDATE_STAGE_WEATHER)
|
||
|
end
|
||
|
|
||
|
---@type XPlanetRunningExplore
|
||
|
local _Explore = false
|
||
|
function XPlanetExploreManager.CreateExplore()
|
||
|
_Explore = XPlanetRunningExplore.New()
|
||
|
return _Explore
|
||
|
end
|
||
|
|
||
|
function XPlanetExploreManager.DestroyExplore()
|
||
|
_Explore:Destroy()
|
||
|
_Explore = false
|
||
|
XPlanetExploreManager.ClearTimeScale()
|
||
|
end
|
||
|
|
||
|
function XPlanetExploreManager.GetExplore()
|
||
|
return _Explore
|
||
|
end
|
||
|
|
||
|
function XPlanetExploreManager.RequestSummonBoss(callback)
|
||
|
XNetwork.Call(RequestProto.SummonBoss, {}, function(res)
|
||
|
if res.Code ~= XCode.Success then
|
||
|
XUiManager.TipCode(res.Code)
|
||
|
return
|
||
|
end
|
||
|
if callback then
|
||
|
callback()
|
||
|
end
|
||
|
end)
|
||
|
end
|
||
|
|
||
|
---@param entities XPlanetRunningExploreEntity[]
|
||
|
function XPlanetExploreManager.UpdateCharacterListAttrByClient(entities)
|
||
|
for i = 1, #entities do
|
||
|
local entity = entities[i]
|
||
|
XPlanetExploreManager.UpdateCharacterAttrByClient(entity)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
---@param entity XPlanetRunningExploreEntity
|
||
|
function XPlanetExploreManager.UpdateCharacterAttrByClient(entity)
|
||
|
local characterId = entity.Data.IdFromConfig
|
||
|
local attr = XPlanetExploreManager.GetCharacterAttr(characterId)
|
||
|
entity.Attr.MaxLife = attr[ATTR.MaxLife]
|
||
|
entity.Attr.Attack = attr[ATTR.Attack]
|
||
|
entity.Attr.Defense = attr[ATTR.Defense]
|
||
|
entity.Attr.CriticalPercent = attr[ATTR.CriticalChance]
|
||
|
entity.Attr.CriticalDamageAdded = attr[ATTR.CriticalDamage]
|
||
|
entity.Attr.Speed = attr[ATTR.AttackSpeed]
|
||
|
end
|
||
|
|
||
|
function XPlanetExploreManager.GetCharacterAttr(characterId)
|
||
|
local attrId = XPlanetCharacterConfigs.GetCharacterAttrId(characterId)
|
||
|
if not attrId then
|
||
|
return {}
|
||
|
end
|
||
|
|
||
|
local baseAttrConfig = XPlanetStageConfigs.GetAttr(attrId)
|
||
|
if not baseAttrConfig then
|
||
|
return {}
|
||
|
end
|
||
|
|
||
|
local attr = {
|
||
|
[ATTR.Life] = baseAttrConfig.Life,
|
||
|
[ATTR.MaxLife] = baseAttrConfig.Life,
|
||
|
[ATTR.Attack] = baseAttrConfig.Attack,
|
||
|
[ATTR.Defense] = baseAttrConfig.Defense,
|
||
|
[ATTR.CriticalChance] = baseAttrConfig.CriticalChance,
|
||
|
[ATTR.CriticalDamage] = baseAttrConfig.CriticalDamage,
|
||
|
[ATTR.AttackSpeed] = baseAttrConfig.AttackSpeed,
|
||
|
}
|
||
|
local baseAttr = XTool.Clone(attr)
|
||
|
|
||
|
local stageData = XDataCenter.PlanetManager.GetStageData()
|
||
|
local effectList = stageData:GetEffectRecords()
|
||
|
for i = 1, #effectList do
|
||
|
---@type {Id:number, Overlays:number}
|
||
|
local effect = effectList[i]
|
||
|
local effectId = effect.Id
|
||
|
local effectType = XPlanetStageConfigs.GetEffectType(effectId)
|
||
|
local effectParams = XPlanetStageConfigs.GetEffectParams(effectId)
|
||
|
if effectType == XPlanetStageConfigs.XPlanetRunningEffectType.AttrChange then
|
||
|
local attrType = effectParams[3] + 1
|
||
|
if attr[attrType] then
|
||
|
--local existType = effectParams[3]
|
||
|
local changeValue = effectParams[5]
|
||
|
local value = baseAttr[attrType]
|
||
|
|
||
|
if attrType == XPlanetStageConfigs.XPlanetRunningAttrChangeType.TenThousandthRatio then
|
||
|
local baseValue = baseAttr[attrType]
|
||
|
if (baseValue == 0) then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
changeValue = math.ceil(changeValue / 10000 * value)
|
||
|
end
|
||
|
|
||
|
if XPlanetStageConfigs.GetEffectOverlying(effectId) then
|
||
|
changeValue = changeValue * effect.Overlays
|
||
|
end
|
||
|
|
||
|
attr[attrType] = attr[attrType] + changeValue
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- 除了速度, 其他属性不能为负
|
||
|
for attrType, value in pairs(attr) do
|
||
|
if value < 0 then
|
||
|
if attrType ~= ATTR.AttackSpeed then
|
||
|
if attrType == ATTR.Life then
|
||
|
attr[attrType] = math.min(attr[attrType], 1)
|
||
|
elseif attrType == ATTR.Attack then
|
||
|
attr[attrType] = math.min(attr[attrType], 1)
|
||
|
else
|
||
|
attr[attrType] = 0
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- 暴击率最大100%
|
||
|
if attr[ATTR.CriticalChance] > 10000 then
|
||
|
attr[ATTR.CriticalChance] = 10000
|
||
|
end
|
||
|
|
||
|
return attr
|
||
|
end
|
||
|
|
||
|
local _TimeScale = XPlanetExploreConfigs.TIME_SCALE_FIGHT.NORMAL
|
||
|
function XPlanetExploreManager.SetTimeScale(timeScale)
|
||
|
_TimeScale = timeScale
|
||
|
end
|
||
|
|
||
|
function XPlanetExploreManager.GetTimeScale()
|
||
|
return _TimeScale
|
||
|
end
|
||
|
|
||
|
function XPlanetExploreManager.ClearTimeScale()
|
||
|
_TimeScale = XPlanetExploreConfigs.TIME_SCALE_FIGHT.NORMAL
|
||
|
end
|
||
|
|
||
|
function XPlanetExploreManager.SetCaptain(characterId, callback)
|
||
|
local stageData = XDataCenter.PlanetManager.GetStageData()
|
||
|
local characterData = stageData:GetCharacterData()
|
||
|
local captain
|
||
|
local index
|
||
|
for i = 1, #characterData do
|
||
|
local data = characterData[i]
|
||
|
if data.Id == characterId then
|
||
|
index = i
|
||
|
captain = data
|
||
|
end
|
||
|
end
|
||
|
if not index then
|
||
|
return
|
||
|
end
|
||
|
XNetwork.Call(RequestProto.SetCaptain, {
|
||
|
Index = index - 1
|
||
|
}, function(res)
|
||
|
if res.Code ~= XCode.Success then
|
||
|
XUiManager.TipCode(res.Code)
|
||
|
return
|
||
|
end
|
||
|
if index ~= 1 then
|
||
|
local captainOld = characterData[1]
|
||
|
characterData[1] = characterData[index]
|
||
|
characterData[index] = captainOld
|
||
|
end
|
||
|
XEventManager.DispatchEvent(XEventId.EVENT_PLANET_UPDATE_CHARACTER)
|
||
|
if callback then
|
||
|
callback()
|
||
|
end
|
||
|
end)
|
||
|
end
|
||
|
|
||
|
---@param stage XPlanetStage
|
||
|
function XPlanetExploreManager.EnterStage(stage, callback)
|
||
|
local stageId = stage:GetStageId()
|
||
|
local team = XPlanetExploreManager.GetTeam()
|
||
|
local members = team:GetData4Request()
|
||
|
local building = stage:GetBuildingSelected()
|
||
|
|
||
|
XDataCenter.PlanetManager.SetSceneActive(false)
|
||
|
XDataCenter.PlanetManager.EnterStage("UiPlanetBattleMain", stageId, members, building, callback)
|
||
|
end
|
||
|
|
||
|
function XPlanetExploreManager.OpenUiPlanetEncounter(...)
|
||
|
XLuaUiManager.SafeClose("UiPlanetEncounter")
|
||
|
XLuaUiManager.Open("UiPlanetEncounter", ...)
|
||
|
end
|
||
|
|
||
|
return XPlanetExploreManager
|
||
|
end
|
||
|
|
||
|
XRpc.NotifyPlanetRunningWeatherChange = function(data)
|
||
|
XDataCenter.PlanetExploreManager.NotifyPlanetRunningWeatherChange(data)
|
||
|
end
|