forked from endernon/PGRData
2053 lines
No EOL
71 KiB
Lua
2053 lines
No EOL
71 KiB
Lua
local XExFubenActivityManager = require("XEntity/XFuben/XExFubenActivityManager")
|
||
local XPlanetViewModel = require("XEntity/XPlanet/XPlanetViewModel")
|
||
local XPlanetStageData = require("XEntity/XPlanet/XData/XPlanetStageData")
|
||
local XPlanetMainScene = require("XEntity/XPlanet/XGameObject/XPlanetMainScene")
|
||
local XPlanetStageScene = require("XEntity/XPlanet/XGameObject/XPlanetStageScene")
|
||
local XPlanetTalentTeamData = require("XEntity/XPlanet/XData/XPlanetTalentTeamData")
|
||
local XPlanetSceneCamera = require("XEntity/XPlanet/XData/XPlanetSceneCamera")
|
||
|
||
XPlanetManagerCreator = function()
|
||
---@class XPlanetManager
|
||
local XPlanetManager = XExFubenActivityManager.New(XFubenConfigs.ChapterType.PlanetRunning, "PlanetManager")
|
||
|
||
---@type XPlanetViewModel
|
||
local PlanetViewModel
|
||
---@type XPlanetStageData
|
||
local PlanetStageData
|
||
---@type XPlanetMainScene
|
||
local PlanetMainScene
|
||
---@type XPlanetStageScene
|
||
local PlanetStageScene
|
||
---@type XPlanetTalentTeamData
|
||
local PlanetTalentTeam = XPlanetTalentTeamData.New()
|
||
|
||
---@type table<number,CS.XIResource>
|
||
local FloorMaterialDir = {}
|
||
---@type table<number,CS.XIResource>
|
||
local FloorEffectMaterialDir = {}
|
||
local SceneCameraDir = {}
|
||
|
||
local IsOpenActivity = false
|
||
local IsSceneLoaded = true ---场景是否加载完成,用于loading展示延时
|
||
local StageQuickBuildMode = false
|
||
local ReformCardFilter = XPlanetTalentConfigs.TalentCardFilter.All
|
||
local CurBuildingId = 0
|
||
local CurBuildSelectFloorId = 0
|
||
local CurFloorSelectBuildMode = XPlanetConfigs.FloorBuildingBuildMode.Point
|
||
local CurStageFloorSelectBuildMode = XPlanetConfigs.FloorBuildingBuildMode.Point
|
||
local IsReformBuyBuildTip = false
|
||
local IsNotCountinueEnterGame = false
|
||
|
||
local ActivityTimer = nil
|
||
local _SceneOpenReason = XPlanetConfigs.SceneOpenReason.None
|
||
local _SceneReleaseTimer = nil
|
||
local _LuaMemoryTimer
|
||
local _EnterLuaMemory = 0
|
||
local _LuaMemoryLimit = 200 * 1024 --进入玩法增加200M后会GC一次
|
||
|
||
---建筑操作请求
|
||
local BuildingOperation = {
|
||
Delete = 1, -- 删除
|
||
Insert = 2, -- 添加
|
||
Update = 3, -- 更新
|
||
}
|
||
|
||
---星球模式
|
||
local BuildingOperationMode = {
|
||
Talent = 0, -- 天赋球
|
||
Stage = 1, -- 关卡
|
||
}
|
||
|
||
|
||
--region 本地缓存
|
||
local function GetCacheKey(key)
|
||
local activityId = XPlanetManager.IsOpen() and PlanetViewModel:GetProperty("_ActivityId") or 0
|
||
return string.format("PlanetRunning_%s_PlayId_%s_%s", activityId, XPlayer.Id, key)
|
||
end
|
||
|
||
--首次进入缓存
|
||
local function SetFirstOpenRed()
|
||
local key = GetCacheKey("FirstOpen")
|
||
XSaveTool.SaveData(key, true)
|
||
end
|
||
|
||
local function GetFirstOpenRed()
|
||
local key = GetCacheKey("FirstOpen")
|
||
return XSaveTool.GetData(key)
|
||
end
|
||
|
||
--首次剧情缓存
|
||
local function SetFirstMovie()
|
||
local key = GetCacheKey("FirstMovie")
|
||
XSaveTool.SaveData(key, true)
|
||
end
|
||
|
||
local function GetFirstMovie()
|
||
local key = GetCacheKey("FirstMovie")
|
||
return XSaveTool.GetData(key)
|
||
end
|
||
|
||
--天赋建筑缓存
|
||
local function SetTalentBuildUnlockRed(buildingId)
|
||
local key = GetCacheKey("TalentBuildUnlock" .. buildingId)
|
||
XSaveTool.SaveData(key, true)
|
||
end
|
||
|
||
local function GetTalentBuildUnlockRed(buildingId)
|
||
local key = GetCacheKey("TalentBuildUnlock" .. buildingId)
|
||
return XSaveTool.GetData(key)
|
||
end
|
||
--天赋建筑建造上限缓存
|
||
local function SetTalentBuildLimitUnlockRed(buildingId, stageId)
|
||
local key = GetCacheKey("TalentBuildLimitUnlock" .. buildingId .. "Limit" .. stageId)
|
||
XSaveTool.SaveData(key, true)
|
||
end
|
||
|
||
local function GetTalentBuildLimitUnlockRed(buildingId, stageId)
|
||
local key = GetCacheKey("TalentBuildLimitUnlock" .. buildingId .. "Limit" .. stageId)
|
||
return XSaveTool.GetData(key)
|
||
end
|
||
--角色解锁提示缓存
|
||
local function SetCharacterUnlockTip(characterId)
|
||
local key = GetCacheKey("CharacterUnlockTip" .. characterId)
|
||
XSaveTool.SaveData(key, true)
|
||
end
|
||
|
||
local function GetCharacterUnlockTip(characterId)
|
||
local key = GetCacheKey("CharacterUnlockTip" .. characterId)
|
||
return XSaveTool.GetData(key)
|
||
end
|
||
--角色解锁红点缓存
|
||
local function SetCharacterUnlockRed(characterId)
|
||
local key = GetCacheKey("CharacterUnlock" .. characterId)
|
||
XSaveTool.SaveData(key, true)
|
||
end
|
||
|
||
local function GetCharacterUnlockRed(characterId)
|
||
local key = GetCacheKey("CharacterUnlock" .. characterId)
|
||
return XSaveTool.GetData(key)
|
||
end
|
||
--关卡建筑解锁提示缓存
|
||
local function SetStageBuildUnlockTip(buildingId)
|
||
local key = GetCacheKey("StageBuildUnlockTip" .. buildingId)
|
||
XSaveTool.SaveData(key, true)
|
||
end
|
||
|
||
local function GetStageBuildUnlockTip(buildingId)
|
||
local key = GetCacheKey("StageBuildUnlockTip" .. buildingId)
|
||
return XSaveTool.GetData(key)
|
||
end
|
||
--关卡建筑解锁红点缓存
|
||
local function SetStageBuildUnlockRed(buildingId)
|
||
local key = GetCacheKey("StageBuildUnlock" .. buildingId)
|
||
XSaveTool.SaveData(key, true)
|
||
end
|
||
|
||
local function GetStageBuildUnlockRed(buildingId)
|
||
local key = GetCacheKey("StageBuildUnlock" .. buildingId)
|
||
return XSaveTool.GetData(key)
|
||
end
|
||
--章节缓存
|
||
local function SetChapterOpenRed(chapterId)
|
||
local key = GetCacheKey("ChapterOpen" .. chapterId)
|
||
XSaveTool.SaveData(key, true)
|
||
end
|
||
|
||
local function GetChapterOpenRed(chapterId)
|
||
local key = GetCacheKey("ChapterOpen" .. chapterId)
|
||
return XSaveTool.GetData(key)
|
||
end
|
||
|
||
local function SetChapterUnlockRed(chapterId)
|
||
local key = GetCacheKey("ChapterUnlock" .. chapterId)
|
||
XSaveTool.SaveData(key, true)
|
||
end
|
||
|
||
local function GetChapterUnlockRed(chapterId)
|
||
local key = GetCacheKey("ChapterUnlock" .. chapterId)
|
||
return XSaveTool.GetData(key)
|
||
end
|
||
--天气缓存
|
||
local function SetWeatherUnlockRed(weatherId)
|
||
local key = GetCacheKey("WeatherUnlock" .. weatherId)
|
||
XSaveTool.SaveData(key, true)
|
||
end
|
||
|
||
local function GetWeatherUnlockRed(weatherId)
|
||
local key = GetCacheKey("WeatherUnlock" .. weatherId)
|
||
return XSaveTool.GetData(key)
|
||
end
|
||
|
||
function XPlanetManager.SetBtnStoryCache(state)
|
||
local key = GetCacheKey("BtnStory")
|
||
return XSaveTool.SaveData(key, state)
|
||
end
|
||
|
||
function XPlanetManager.GetBtnStoryCache()
|
||
local key = GetCacheKey("BtnStory")
|
||
return XSaveTool.GetData(key)
|
||
end
|
||
--endregion
|
||
|
||
|
||
function XPlanetManager.Init()
|
||
IsOpenActivity = false
|
||
IsReformBuyBuildTip = false
|
||
CurBuildSelectFloorId = 0
|
||
CurFloorSelectBuildMode = XPlanetConfigs.FloorBuildingBuildMode.Point
|
||
CurStageFloorSelectBuildMode = XPlanetConfigs.FloorBuildingBuildMode.Point
|
||
|
||
ActivityTimer = nil
|
||
|
||
_SceneOpenReason = XPlanetConfigs.SceneOpenReason.None
|
||
XPlanetManager._StopReleaseTimer()
|
||
end
|
||
|
||
function XPlanetManager.IsInGame()
|
||
if not PlanetStageData then
|
||
return false
|
||
end
|
||
return XTool.IsNumberValid(PlanetStageData:GetStageId())
|
||
end
|
||
|
||
function XPlanetManager.GetIsNotCountinueEnterGame()
|
||
return IsNotCountinueEnterGame
|
||
end
|
||
|
||
---踢人下线
|
||
function XPlanetManager.KickLogin(title, content)
|
||
XUiManager.DialogTip(
|
||
title,
|
||
content,
|
||
XUiManager.DialogType.OnlySure,
|
||
nil,
|
||
function()
|
||
CS.XNetwork.Disconnect()
|
||
XLoginManager.DoDisconnect()
|
||
end
|
||
)
|
||
end
|
||
|
||
|
||
--region 引导
|
||
local GuideCardClickCountDir = {}
|
||
---清除可重复触发的引导缓存
|
||
function XPlanetManager.ClearRepeatGuideCache()
|
||
XPlanetManager.SetGuideEnterMovie(false)
|
||
XPlanetManager.SetGuideFirstGetMoney(false)
|
||
XPlanetManager.SetGuideFirstFight(false)
|
||
XPlanetManager.SetGuideFirstHunt(false)
|
||
XPlanetManager.ClearGuideEndRecord()
|
||
GuideCardClickCountDir = {}
|
||
end
|
||
|
||
function XPlanetManager.CheckGuideOpen()
|
||
return XDataCenter.GuideManager.CheckGuideOpen()
|
||
end
|
||
|
||
---关卡结算清空该关引导记录确保下次重进
|
||
function XPlanetManager.ClearGuideEndRecord()
|
||
local key = GetCacheKey("GuildEndRecord")
|
||
XSaveTool.SaveData(key, { })
|
||
end
|
||
|
||
---本次引导播放完毕记录
|
||
function XPlanetManager.SetGuideEnd(guideId)
|
||
local key = GetCacheKey("GuildEndRecord")
|
||
local table = XSaveTool.GetData(key)
|
||
if not table then
|
||
table = {}
|
||
end
|
||
table[guideId] = true
|
||
XSaveTool.SaveData(key, table)
|
||
return true
|
||
end
|
||
|
||
function XPlanetManager.GetGuideEnd(guideId)
|
||
local key = GetCacheKey("GuildEndRecord")
|
||
local table = XSaveTool.GetData(key)
|
||
if not table then
|
||
return false
|
||
end
|
||
return table[guideId]
|
||
end
|
||
|
||
---引导中点击计数
|
||
function XPlanetManager.AddGuideCardClickCount(buildingId)
|
||
if not XTool.IsNumberValid(GuideCardClickCountDir[buildingId]) then
|
||
GuideCardClickCountDir[buildingId] = 0
|
||
end
|
||
GuideCardClickCountDir[buildingId] = GuideCardClickCountDir[buildingId] + 1
|
||
end
|
||
|
||
function XPlanetManager.GetGuideCardClickCount(buildingId)
|
||
if not XTool.IsNumberValid(GuideCardClickCountDir[buildingId]) then
|
||
GuideCardClickCountDir[buildingId] = 0
|
||
end
|
||
return GuideCardClickCountDir[buildingId]
|
||
end
|
||
|
||
---1-1入场剧情结束(可重复)
|
||
function XPlanetManager.SetGuideEnterMovie(value)
|
||
local key = GetCacheKey("GuildEnterMovie")
|
||
if not value then
|
||
XSaveTool.SaveData(key, false)
|
||
return
|
||
end
|
||
if XPlanetManager.GetGuideEnterMovie() then
|
||
return
|
||
end
|
||
XSaveTool.SaveData(key, true)
|
||
return true
|
||
end
|
||
|
||
function XPlanetManager.GetGuideEnterMovie()
|
||
local key = GetCacheKey("GuildEnterMovie")
|
||
return XSaveTool.GetData(key)
|
||
end
|
||
|
||
---1-1首次路过矿车引导(可重复)
|
||
function XPlanetManager.SetGuideFirstGetMoney(value)
|
||
local key = GetCacheKey("GuildFirstGetMoney")
|
||
if not value then
|
||
XSaveTool.SaveData(key, false)
|
||
return
|
||
end
|
||
if XPlanetManager.GetGuideFirstGetMoney() then
|
||
return
|
||
end
|
||
XSaveTool.SaveData(key, true)
|
||
return true
|
||
end
|
||
|
||
function XPlanetManager.GetGuideFirstGetMoney()
|
||
local key = GetCacheKey("GuildFirstGetMoney")
|
||
return XSaveTool.GetData(key)
|
||
end
|
||
|
||
---1-1首次战斗引导(可重复)
|
||
function XPlanetManager.SetGuideFirstFight(value)
|
||
local key = GetCacheKey("GuildFirstFight")
|
||
if not value then
|
||
XSaveTool.SaveData(key, false)
|
||
return
|
||
end
|
||
if XPlanetManager.GetGuideFirstFight() then
|
||
return
|
||
end
|
||
XSaveTool.SaveData(key, true)
|
||
return true
|
||
end
|
||
|
||
function XPlanetManager.GetGuideFirstFight()
|
||
local key = GetCacheKey("GuildFirstFight")
|
||
return XSaveTool.GetData(key)
|
||
end
|
||
|
||
---1-2首次掉血(可重复)
|
||
function XPlanetManager.SetGuideFirstHunt(value)
|
||
local key = GetCacheKey("GuildFirstHunt")
|
||
if not value then
|
||
XSaveTool.SaveData(key, false)
|
||
return
|
||
end
|
||
if XPlanetManager.GetGuideFirstHunt() then
|
||
return
|
||
end
|
||
XSaveTool.SaveData(key, true)
|
||
return true
|
||
end
|
||
|
||
function XPlanetManager.GetGuideFirstHunt()
|
||
local key = GetCacheKey("GuildFirstHunt")
|
||
return XSaveTool.GetData(key)
|
||
end
|
||
--endregion
|
||
|
||
|
||
--region PlanetTalentTeam
|
||
function XPlanetManager.GetTeam()
|
||
return PlanetTalentTeam
|
||
end
|
||
--endregion
|
||
|
||
|
||
--region PlanetSceneCamera
|
||
---@return XPlanetSceneCamera
|
||
function XPlanetManager.GetCamera(cameraId)
|
||
if not SceneCameraDir[cameraId] then
|
||
---@type XPlanetSceneCamera
|
||
local camera = XPlanetSceneCamera.New()
|
||
camera:SetCameraId(cameraId)
|
||
SceneCameraDir[cameraId] = camera
|
||
end
|
||
return SceneCameraDir[cameraId]
|
||
end
|
||
--endregion
|
||
|
||
|
||
--region PlanetViewModel
|
||
---@return XPlanetViewModel
|
||
function XPlanetManager.GetViewModel()
|
||
return PlanetViewModel
|
||
end
|
||
|
||
function XPlanetManager.IsOpen()
|
||
if not PlanetViewModel then
|
||
return false
|
||
end
|
||
return PlanetViewModel:IsOpen()
|
||
end
|
||
|
||
function XPlanetManager.IsOnActivity(isInActivity)
|
||
IsOpenActivity = isInActivity
|
||
end
|
||
|
||
function XPlanetManager.OnActivityEnd()
|
||
if XPlanetManager.IsOpen() then
|
||
return
|
||
end
|
||
if PlanetMainScene and PlanetMainScene:Exist() then
|
||
XLuaUiManager.RunMain()
|
||
XUiManager.TipText("CommonActivityEnd")
|
||
end
|
||
XPlanetManager.OnRelease()
|
||
end
|
||
|
||
function XPlanetManager._StartActivityTimer()
|
||
XPlanetManager._StopActivityTimer()
|
||
ActivityTimer = XScheduleManager.ScheduleForever(function()
|
||
local endTime = PlanetViewModel:GetEndTime()
|
||
local time = XTime.GetServerNowTimestamp()
|
||
if time > endTime then
|
||
XPlanetManager._StopActivityTimer()
|
||
XPlanetManager.OnActivityEnd(true)
|
||
end
|
||
end, XScheduleManager.SECOND, 0)
|
||
end
|
||
|
||
function XPlanetManager._StopActivityTimer()
|
||
if ActivityTimer then
|
||
XScheduleManager.UnSchedule(ActivityTimer)
|
||
ActivityTimer = nil
|
||
end
|
||
end
|
||
|
||
---活动是否开启基础判断
|
||
function XPlanetManager.BaseCheckActivity(isTip)
|
||
if not XFunctionManager.DetectionFunction(XFunctionManager.FunctionName.PlanetRunning, false, not isTip) then
|
||
return false
|
||
end
|
||
--活动未开启
|
||
if not XPlanetManager.IsOpen() and isTip then
|
||
XUiManager.TipText("CommonActivityNotStart")
|
||
return false
|
||
end
|
||
--功能未开启
|
||
if not PlanetViewModel then
|
||
return false
|
||
end
|
||
return true
|
||
end
|
||
|
||
--天赋球(Reform or Talent)
|
||
--============================================================
|
||
|
||
function XPlanetManager.GetReformQuickRecycleMode()
|
||
local key = GetCacheKey("QuickRecycleMode")
|
||
return XSaveTool.GetData(key, false)
|
||
end
|
||
|
||
function XPlanetManager.SetReformQuickRecycleMode(isOn)
|
||
local key = GetCacheKey("QuickRecycleMode")
|
||
if isOn then
|
||
XUiManager.TipErrorWithKey("PlanetRunningQuickBuildOpen")
|
||
else
|
||
XUiManager.TipErrorWithKey("PlanetRunningQuickBuildClose")
|
||
end
|
||
return XSaveTool.SaveData(key, isOn)
|
||
end
|
||
|
||
function XPlanetManager.GetReformQuickBuildMode()
|
||
local key = GetCacheKey("QuickBuildMode")
|
||
return XSaveTool.GetData(key, false)
|
||
end
|
||
|
||
function XPlanetManager.SetReformQuickBuildMode(isOn)
|
||
local key = GetCacheKey("QuickBuildMode")
|
||
return XSaveTool.SaveData(key, isOn)
|
||
end
|
||
|
||
function XPlanetManager.GetTalentBuildData()
|
||
return PlanetViewModel:GetReformBuildingData()
|
||
end
|
||
|
||
function XPlanetManager.GetTalentBuildGuid()
|
||
return PlanetViewModel:GetReformModeIncId()
|
||
end
|
||
|
||
---@param filter number XPlanetTalentConfigs.TalentCardFilter
|
||
function XPlanetManager.SetTalentBuildCardFilter(filter)
|
||
ReformCardFilter = filter
|
||
end
|
||
|
||
function XPlanetManager.GetTalentBuildCardList(isAll)
|
||
local result = {}
|
||
local isAllFilter = ReformCardFilter == XPlanetTalentConfigs.TalentCardFilter.All
|
||
local isBuildFilter = ReformCardFilter == XPlanetTalentConfigs.TalentCardFilter.Build
|
||
local isFloorFilter = ReformCardFilter == XPlanetTalentConfigs.TalentCardFilter.Floor
|
||
for _, config in pairs(XPlanetTalentConfigs.GetTalentBuildingConfigs()) do
|
||
local isFloor = XPlanetWorldConfigs.CheckBuildingIsType(config.Id, XPlanetWorldConfigs.BuildType.FloorBuild)
|
||
if XPlanetTalentConfigs.GetTalentBuildingIsCard(config.Id) then
|
||
if isAllFilter or (isBuildFilter and not isFloor) or (isFloorFilter and isFloor) or isAll then
|
||
table.insert(result, config.Id)
|
||
end
|
||
end
|
||
end
|
||
table.sort(result, function(a, b)
|
||
local lockValueA, lockValueB = 0, 0
|
||
if PlanetViewModel:CheckReformBuildCardIsUnLock(a) then
|
||
lockValueA = 1
|
||
end
|
||
if PlanetViewModel:CheckReformBuildCardIsUnLock(b) then
|
||
lockValueB = 1
|
||
end
|
||
if lockValueA ~= lockValueB then
|
||
return lockValueA > lockValueB
|
||
end
|
||
return a < b
|
||
end)
|
||
return result
|
||
end
|
||
|
||
function XPlanetManager.CheckTalentCardCanBuild(talentBuildId)
|
||
if not XTool.IsNumberValid(talentBuildId) then
|
||
return true
|
||
end
|
||
if not XPlanetManager.CheckTalentCardIsUnLock(talentBuildId) then
|
||
return true
|
||
end
|
||
if XPlanetManager.CheckTalentCurBuildCardIsLimit(talentBuildId) then
|
||
XUiManager.TipErrorWithKey("PlanetRunningMaxBuild")
|
||
return true
|
||
end
|
||
return false
|
||
end
|
||
|
||
function XPlanetManager.CheckTalentCurBuildCardIsLimit(talentBuildId)
|
||
local curCount = PlanetMainScene:GetBuildingCount(talentBuildId)
|
||
local maxCount = PlanetViewModel:GetReformBuildMaxBuyCount(talentBuildId)
|
||
return curCount >= maxCount
|
||
end
|
||
|
||
function XPlanetManager.CheckTalentCardIsUnLock(talentBuildId)
|
||
if not PlanetViewModel:CheckReformBuildCardIsUnLock(talentBuildId) then
|
||
local preStageId = XPlanetTalentConfigs.GetTalentBuildingUnlockStageId(talentBuildId)
|
||
local stageName = XPlanetStageConfigs.GetStageFullName(preStageId)
|
||
XUiManager.TipError(XUiHelper.GetText("PlanetRunningTalentCardLock", stageName))
|
||
return false
|
||
end
|
||
return true
|
||
end
|
||
|
||
function XPlanetManager.GetCurFloorSelectBuildMode(isTalent)
|
||
if isTalent then
|
||
return XPlanetManager.GetCurBuildSelectBuildMode()
|
||
else
|
||
return XPlanetManager.GetCurStageBuildSelectBuildMode()
|
||
end
|
||
end
|
||
|
||
function XPlanetManager.SetCurFloorSelectBuildMode(isTalent, mode)
|
||
if isTalent then
|
||
return XPlanetManager.SetCurBuildSelectBuildMode(mode)
|
||
else
|
||
return XPlanetManager.SetCurStageBuildSelectBuildMode(mode)
|
||
end
|
||
end
|
||
|
||
function XPlanetManager.GetCurBuildSelectBuildMode()
|
||
return CurFloorSelectBuildMode
|
||
end
|
||
|
||
function XPlanetManager.SetCurBuildSelectBuildMode(mode)
|
||
CurFloorSelectBuildMode = mode
|
||
end
|
||
|
||
function XPlanetManager.GetCurStageBuildSelectBuildMode()
|
||
return CurStageFloorSelectBuildMode
|
||
end
|
||
|
||
function XPlanetManager.SetCurStageBuildSelectBuildMode(mode)
|
||
CurStageFloorSelectBuildMode = mode
|
||
end
|
||
|
||
function XPlanetManager.GetCurBuildSelectFloorId()
|
||
return CurBuildSelectFloorId
|
||
end
|
||
|
||
function XPlanetManager.SetCurBuildSelectFloorId(floorId, buildingId)
|
||
CurBuildSelectFloorId = floorId
|
||
CurBuildingId = buildingId
|
||
end
|
||
|
||
function XPlanetManager.SetTalentCurBuildDefaultFloorId(buildingId)
|
||
if buildingId == CurBuildingId then
|
||
return
|
||
end
|
||
CurBuildSelectFloorId = XPlanetManager.GetTalentBuildingCanUseFloorId(buildingId)[1]
|
||
CurBuildingId = buildingId
|
||
end
|
||
|
||
function XPlanetManager.GetTalentBuildingCanUseFloorId(talentBuildId)
|
||
return PlanetViewModel:GetReformBuildCanUseFloorId(talentBuildId)
|
||
end
|
||
|
||
---章节界面奖励统计信息
|
||
function XPlanetManager.GetChapterRewardRecord(chapterId)
|
||
local stageIdList = XPlanetStageConfigs.GetStageListByChapterId(chapterId)
|
||
local rewards = {}
|
||
local isFinish = {}
|
||
local recordDir = {}
|
||
if XTool.IsTableEmpty(stageIdList) then
|
||
return rewards, isFinish
|
||
end
|
||
for _, stageId in ipairs(stageIdList) do
|
||
local rewardId = XPlanetStageConfigs.GetStageRewardId(stageId)
|
||
local tempRewardIds = {}
|
||
if rewardId > 0 then
|
||
tempRewardIds = XRewardManager.GetRewardList(rewardId)
|
||
end
|
||
for _, item in pairs(tempRewardIds) do
|
||
if not recordDir[item.TemplateId] then
|
||
table.insert(rewards, item)
|
||
table.insert(isFinish, true)
|
||
recordDir[item.TemplateId] = #rewards
|
||
end
|
||
if not PlanetViewModel:CheckStageIsPass(stageId) then
|
||
isFinish[recordDir[item.TemplateId]] = false
|
||
end
|
||
end
|
||
end
|
||
return rewards, isFinish
|
||
end
|
||
|
||
---显示的章节
|
||
function XPlanetManager.GetShowChapterList()
|
||
local result = {}
|
||
local chapterList = XPlanetStageConfigs.GetChapterIdList()
|
||
-- 上一个章节是否解锁
|
||
local beforeIsUnlock = true
|
||
for _, chapterId in ipairs(chapterList) do
|
||
if PlanetViewModel:CheckChapterIsUnlock(chapterId) or beforeIsUnlock then
|
||
table.insert(result, chapterId)
|
||
end
|
||
beforeIsUnlock = PlanetViewModel:CheckChapterIsUnlock(chapterId)
|
||
end
|
||
return result
|
||
end
|
||
|
||
function XPlanetManager.SetIsReformBuyBuildTip(isOn)
|
||
IsReformBuyBuildTip = isOn
|
||
end
|
||
|
||
function XPlanetManager.GetIsReformBuyBuildTip()
|
||
return IsReformBuyBuildTip
|
||
end
|
||
|
||
--关卡
|
||
--============================================================
|
||
|
||
---@return XPlanetStageData
|
||
function XPlanetManager.GetStageBuildData()
|
||
return PlanetStageData:GetStageBuildingData()
|
||
end
|
||
|
||
function XPlanetManager.GetStageBuildIncId()
|
||
return PlanetStageData:GetBuildIncId()
|
||
end
|
||
|
||
---@return XPlanetStageData
|
||
function XPlanetManager.GetStageData()
|
||
return PlanetStageData
|
||
end
|
||
|
||
function XPlanetManager.ClearStageData()
|
||
PlanetStageData:UpdateData()
|
||
end
|
||
|
||
function XPlanetManager.GetStageQuickBuildMode()
|
||
local key = GetCacheKey("StageQuickBuildMode")
|
||
return XSaveTool.GetData(key, false)
|
||
end
|
||
|
||
function XPlanetManager.SetStageQuickBuildMode(isOn)
|
||
local key = GetCacheKey("StageQuickBuildMode")
|
||
return XSaveTool.SaveData(key, isOn)
|
||
end
|
||
|
||
function XPlanetManager.GetStageSkipFight()
|
||
local key = GetCacheKey("StageSkipFight")
|
||
return XSaveTool.GetData(key, false)
|
||
end
|
||
|
||
function XPlanetManager.SetStageSkipFight(isOn)
|
||
local key = GetCacheKey("StageSkipFight")
|
||
return XSaveTool.SaveData(key, isOn)
|
||
end
|
||
|
||
function XPlanetManager.CheckBuildingIsUnLock(buildingId)
|
||
local unlockStage = XPlanetWorldConfigs.GetBuildingUnlockStageId(buildingId)
|
||
local unlockTimeId = XPlanetWorldConfigs.GetBuildingUnlockTimeId(buildingId)
|
||
if not unlockStage and not unlockTimeId then
|
||
return true
|
||
end
|
||
return PlanetViewModel:CheckStageIsPass(unlockStage) and XFunctionManager.CheckInTimeByTimeId(unlockTimeId, true)
|
||
end
|
||
--endregion
|
||
|
||
|
||
--region 入口
|
||
function XPlanetManager.CheckMainIsExit()
|
||
if PlanetMainScene then
|
||
return PlanetMainScene:Exist()
|
||
end
|
||
return false
|
||
end
|
||
|
||
---加载场景,避免意外进入传统战斗时返回玩法场景报错
|
||
function XPlanetManager.ResumeMainScene(cb)
|
||
PlanetMainScene = PlanetMainScene or XPlanetMainScene.New(nil, XPlanetWorldConfigs.GetTalentStageId())
|
||
PlanetMainScene:Load(cb)
|
||
end
|
||
|
||
function XPlanetManager.GetIsSceneLoad()
|
||
return IsSceneLoaded
|
||
end
|
||
|
||
function XPlanetManager.CloseLoading()
|
||
if XLuaUiManager.IsUiLoad("UiPlanetLoading") then
|
||
XLuaUiManager.Remove("UiPlanetLoading")
|
||
end
|
||
end
|
||
|
||
---进入玩法
|
||
function XPlanetManager.EnterUiMain(uiName)
|
||
if not XPlanetManager.BaseCheckActivity(true) then
|
||
return
|
||
end
|
||
IsSceneLoaded = false
|
||
local loadingStartCb = function()
|
||
--清除第一次红点
|
||
if XPlanetManager.CheckFirstOpenActivityRedPoint() then
|
||
SetFirstOpenRed()
|
||
end
|
||
--设置全局光
|
||
PlanetMainScene = PlanetMainScene or XPlanetMainScene.New(nil, XPlanetWorldConfigs.GetTalentStageId())
|
||
|
||
CS.UnityEngine.Resources.UnloadUnusedAssets() -- 释放无用资源
|
||
LuaGC() -- 手动执行GC
|
||
_EnterLuaMemory = CS.XLuaEngine.Env.Memroy
|
||
XPlanetManager._StartAutoLuaGC()
|
||
--XPlanetManager._StartActivityTimer()
|
||
|
||
PlanetMainScene:Load(function()
|
||
IsSceneLoaded = true
|
||
end)
|
||
end
|
||
local loadingCloseCb = function()
|
||
local movieId = XPlanetConfigs.GetFirstOpenMovie()
|
||
if movieId and not GetFirstMovie() then
|
||
if PlanetMainScene then
|
||
PlanetMainScene:SetActive(false)
|
||
end
|
||
-- 不销毁方式播放剧情防止剧情结束镜头穿帮
|
||
XDataCenter.MovieManager.PlayMovie(movieId, function()
|
||
SetFirstMovie()
|
||
XLuaUiManager.Open(uiName or "UiPlanetMain")
|
||
end, nil, nil, false)
|
||
else
|
||
XLuaUiManager.Open(uiName or "UiPlanetMain")
|
||
end
|
||
end
|
||
local onCallBack = function()
|
||
XLuaUiManager.Open("UiPlanetLoading", loadingStartCb, loadingCloseCb)
|
||
end
|
||
|
||
if not IsOpenActivity then
|
||
XPlanetManager.RequestEnterActivity(onCallBack)
|
||
else
|
||
onCallBack()
|
||
end
|
||
end
|
||
|
||
---进入关卡
|
||
function XPlanetManager.EnterStage(uiName, stageId, selectCharacters, selectBuildings, callback)
|
||
if not XPlanetManager.BaseCheckActivity() then
|
||
callback()
|
||
return
|
||
end
|
||
if XPlanetManager.IsInGame() then
|
||
callback()
|
||
XUiManager.TipErrorWithKey("PlanetRunningTipHaveGame")
|
||
return
|
||
end
|
||
|
||
local onCallBack = function()
|
||
XPlanetManager.LoadStageScene(uiName)
|
||
end
|
||
|
||
IsNotCountinueEnterGame = true
|
||
XPlanetManager.ClearRepeatGuideCache()
|
||
XPlanetManager.RequestEnterNewStage(stageId, selectCharacters, selectBuildings, onCallBack, callback)
|
||
end
|
||
|
||
---继续关卡
|
||
function XPlanetManager.ContinueStage(uiName)
|
||
if not XPlanetManager.BaseCheckActivity() then
|
||
return
|
||
end
|
||
if not XPlanetManager.IsInGame() then
|
||
XUiManager.TipErrorWithKey("PlanetRunningTipNoGame")
|
||
return
|
||
end
|
||
|
||
IsNotCountinueEnterGame = false
|
||
XPlanetManager.LoadStageScene(uiName)
|
||
end
|
||
|
||
---退出关卡
|
||
function XPlanetManager.ExitStage()
|
||
if PlanetMainScene then
|
||
PlanetMainScene:SetActive(true)
|
||
end
|
||
if PlanetStageScene then
|
||
PlanetStageScene:SetActive(false)
|
||
PlanetStageScene:Release()
|
||
PlanetStageScene = nil
|
||
end
|
||
CS.UnityEngine.Resources.UnloadUnusedAssets() -- 释放无用资源
|
||
LuaGC() -- 手动执行GC
|
||
end
|
||
|
||
---中途结算关卡
|
||
function XPlanetManager.SettleStage(cb)
|
||
if not XPlanetManager.IsInGame() then
|
||
XUiManager.TipErrorWithKey("PlanetRunningTipNoGame")
|
||
return
|
||
end
|
||
XPlanetManager.RequestQuitStage(cb)
|
||
end
|
||
|
||
function XPlanetManager.LoadStageScene(uiName, cb)
|
||
IsSceneLoaded = false
|
||
local isSkipLoading = false
|
||
--local UnityRuntimePlatform = CS.UnityEngine.RuntimePlatform
|
||
--local UnityApplication = CS.UnityEngine.Application
|
||
--if UnityApplication.platform == UnityRuntimePlatform.WindowsEditor then
|
||
-- isSkipLoading = true
|
||
--end
|
||
|
||
local openFunc = function()
|
||
if PlanetMainScene then
|
||
PlanetMainScene:SetActive(false)
|
||
end
|
||
PlanetStageScene = PlanetStageScene or XPlanetStageScene.New(nil, PlanetStageData:GetStageId())
|
||
--进入关卡默认不快速建造
|
||
StageQuickBuildMode = false
|
||
--进入关卡地块建造默认单格
|
||
CurStageFloorSelectBuildMode = XPlanetConfigs.FloorBuildingBuildMode.Point
|
||
|
||
PlanetStageScene:Load(function()
|
||
IsSceneLoaded = true
|
||
if isSkipLoading then
|
||
XLuaUiManager.Open(uiName or "UiPlanetBattleMain")
|
||
end
|
||
end)
|
||
|
||
CS.UnityEngine.Resources.UnloadUnusedAssets() -- 释放无用资源
|
||
LuaGC() -- 手动执行GC
|
||
end
|
||
|
||
if isSkipLoading then
|
||
openFunc()
|
||
return
|
||
end
|
||
|
||
XLuaUiManager.Open("UiPlanetLoading", openFunc, function()
|
||
XLuaUiManager.Open(uiName or "UiPlanetBattleMain")
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
--endregion
|
||
|
||
|
||
--region 资源管理
|
||
---场景自动销毁,避免意外跳转
|
||
function XPlanetManager.SceneOpen(reason)
|
||
if reason then
|
||
_SceneOpenReason = _SceneOpenReason | reason
|
||
XPlanetManager._StopReleaseTimer()
|
||
end
|
||
end
|
||
function XPlanetManager.SceneRelease(reason)
|
||
if reason then
|
||
_SceneOpenReason = _SceneOpenReason & (~reason)
|
||
end
|
||
if _SceneOpenReason ~= XPlanetConfigs.SceneOpenReason.None then
|
||
return
|
||
end
|
||
XPlanetManager._StartReleaseTimer()
|
||
end
|
||
function XPlanetManager._StartReleaseTimer()
|
||
XPlanetManager._StopReleaseTimer()
|
||
XPlanetManager.SetSceneActive(false)
|
||
_SceneReleaseTimer = XScheduleManager.ScheduleOnce(function()
|
||
XPlanetManager.OnRelease()
|
||
end, 30 * XScheduleManager.SECOND)
|
||
end
|
||
function XPlanetManager._StopReleaseTimer()
|
||
if _SceneReleaseTimer then
|
||
XScheduleManager.UnSchedule(_SceneReleaseTimer)
|
||
XPlanetManager.SetSceneActive(true)
|
||
end
|
||
_SceneReleaseTimer = nil
|
||
end
|
||
|
||
function XPlanetManager.SetSceneActive(active)
|
||
if PlanetMainScene then
|
||
PlanetMainScene:SetActive(active)
|
||
end
|
||
if PlanetStageScene then
|
||
if active and PlanetMainScene then
|
||
PlanetMainScene:SetActive(false)
|
||
end
|
||
PlanetStageScene:SetActive(active)
|
||
end
|
||
end
|
||
|
||
function XPlanetManager.OnRelease()
|
||
if PlanetMainScene then
|
||
PlanetMainScene:Release()
|
||
end
|
||
if PlanetStageScene then
|
||
PlanetStageScene:Release()
|
||
end
|
||
XPlanetManager.ReleaseFloorMaterial()
|
||
XPlanetManager.ReleaseEffectMaterial()
|
||
XPlanetManager._StopAutoLuaGC()
|
||
XPlanetManager._StopActivityTimer()
|
||
PlanetStageScene = nil
|
||
PlanetMainScene = nil
|
||
|
||
CS.UnityEngine.Resources.UnloadUnusedAssets() -- 释放无用资源
|
||
LuaGC() -- 手动执行GC
|
||
end
|
||
|
||
---读取地板材质
|
||
function XPlanetManager.GetMaterialByFloorId(floorId)
|
||
if FloorMaterialDir[floorId] then
|
||
return FloorMaterialDir[floorId].Asset
|
||
else
|
||
local assetPath = XPlanetWorldConfigs.GetFloorMaterialUrl(floorId)
|
||
local resource = CS.XResourceManager.LoadAsync(assetPath)
|
||
FloorMaterialDir[floorId] = resource
|
||
return FloorMaterialDir[floorId].Asset
|
||
end
|
||
end
|
||
|
||
---释放地板材质资源
|
||
function XPlanetManager.ReleaseFloorMaterial()
|
||
if not XTool.IsTableEmpty(FloorMaterialDir) then
|
||
for _, floorMaterial in pairs(FloorMaterialDir) do
|
||
floorMaterial:Release()
|
||
end
|
||
FloorMaterialDir = {}
|
||
end
|
||
end
|
||
|
||
---读取地板效果材质
|
||
function XPlanetManager.GetEffectMaterial(key)
|
||
if FloorEffectMaterialDir[key] then
|
||
--if FloorEffectMaterialDir[key].Asset:HasProperty("_ZOffset") then
|
||
-- FloorEffectMaterialDir[key].Asset:SetFloat("_ZOffset", 0.1)
|
||
--end
|
||
return FloorEffectMaterialDir[key].Asset
|
||
else
|
||
local assetPath = XPlanetConfigs.GetTileEffectMat(key)
|
||
local resource = CS.XResourceManager.LoadAsync(assetPath)
|
||
FloorEffectMaterialDir[key] = resource
|
||
return FloorEffectMaterialDir[key].Asset
|
||
end
|
||
end
|
||
|
||
---释放地板效果材质资源
|
||
function XPlanetManager.ReleaseEffectMaterial()
|
||
if not XTool.IsTableEmpty(FloorEffectMaterialDir) then
|
||
for _, floorMaterial in pairs(FloorEffectMaterialDir) do
|
||
floorMaterial:Release()
|
||
end
|
||
FloorEffectMaterialDir = {}
|
||
end
|
||
end
|
||
--endregion
|
||
|
||
|
||
--region Memory
|
||
function XPlanetManager._StartAutoLuaGC()
|
||
if not _LuaMemoryTimer then
|
||
_LuaMemoryTimer = XScheduleManager.ScheduleForever(function()
|
||
XPlanetManager._AutoLuaGC()
|
||
end, XScheduleManager.SECOND, 0)
|
||
end
|
||
end
|
||
|
||
function XPlanetManager._StopAutoLuaGC()
|
||
if _LuaMemoryTimer then
|
||
XScheduleManager.UnSchedule(_LuaMemoryTimer)
|
||
_LuaMemoryTimer = nil
|
||
end
|
||
LuaGC()
|
||
end
|
||
|
||
function XPlanetManager._AutoLuaGC()
|
||
if CS.XLuaEngine.Env.Memroy - _EnterLuaMemory > _LuaMemoryLimit then
|
||
LuaGC()
|
||
end
|
||
end
|
||
--endregion
|
||
|
||
|
||
--region Scene
|
||
function XPlanetManager.GetPlanetMainScene()
|
||
return PlanetMainScene
|
||
end
|
||
|
||
function XPlanetManager.GetPlanetStageScene()
|
||
return PlanetStageScene
|
||
end
|
||
--endregion
|
||
|
||
|
||
--region RedPoint
|
||
---首次进入
|
||
function XPlanetManager.CheckFirstOpenActivityRedPoint()
|
||
if not XPlanetManager.BaseCheckActivity() then
|
||
return false
|
||
end
|
||
return not GetFirstOpenRed()
|
||
end
|
||
|
||
---新商品道具
|
||
function XPlanetManager.CheckShopRedPoint()
|
||
if not XPlanetManager.BaseCheckActivity() then
|
||
return false
|
||
end
|
||
|
||
if not XFunctionManager.DetectionFunction(XFunctionManager.FunctionName.ShopCommon, nil, true) then
|
||
return false
|
||
end
|
||
|
||
local res = false
|
||
local shopIdList = XPlanetManager.GetViewModel():GetActivityShopIdList()
|
||
for _, id in pairs(shopIdList) do
|
||
local goodsList = XShopManager.GetShopGoodsList(id, true)
|
||
for _, data in pairs(goodsList) do
|
||
-- 检测每个商品
|
||
local key = XPlayer.Id .. "PlanetShopId" .. data.Id
|
||
local isCurrLock = nil -- 此次是否上锁
|
||
local isLastLockAndThisShow = nil -- 该商品是否为上次检测上锁,此次检测解锁
|
||
local allCdPass = true
|
||
local conditionIds = data.ConditionIds
|
||
-- 检测此次该商品是否解锁
|
||
if conditionIds and #conditionIds > 0 then
|
||
for _, cId in pairs(conditionIds) do
|
||
local ret, desc = XConditionManager.CheckCondition(cId)
|
||
if not ret then
|
||
allCdPass = false
|
||
end
|
||
end
|
||
end
|
||
|
||
local isLastLock = XSaveTool.GetData(key)
|
||
isCurrLock = not allCdPass
|
||
isLastLockAndThisShow = isLastLock and not isCurrLock
|
||
if isLastLockAndThisShow then
|
||
res = true
|
||
end
|
||
end
|
||
end
|
||
|
||
return res
|
||
end
|
||
|
||
---奖励可领
|
||
function XPlanetManager.CheckTaskRedPoint()
|
||
if not XPlanetManager.BaseCheckActivity() then
|
||
return false
|
||
end
|
||
|
||
local taskGroupId = XDataCenter.PlanetManager.GetViewModel():GetActivityTimeLimitTaskId()
|
||
local taskList = XDataCenter.TaskManager.GetTimeLimitTaskListByGroupId(taskGroupId)
|
||
for k, taskData in pairs(taskList) do
|
||
if taskData.State == XDataCenter.TaskManager.TaskState.Achieved then
|
||
return true
|
||
end
|
||
end
|
||
|
||
return false
|
||
end
|
||
|
||
---新章节开启
|
||
function XPlanetManager.CheckNewChapterRedPoint()
|
||
if not XPlanetManager.BaseCheckActivity() then
|
||
return false
|
||
end
|
||
|
||
local isHaveNewChapter, _ = XPlanetManager.CheckChapterOpenRedPoint()
|
||
return isHaveNewChapter
|
||
end
|
||
|
||
function XPlanetManager.CheckChapterOpenRedPoint()
|
||
local chapterIdList = XPlanetManager.GetShowChapterList()
|
||
for _, chapterId in ipairs(chapterIdList) do
|
||
local isNeedUnlock = XTool.IsNumberValid(XPlanetStageConfigs.GetChapterPreStageId(chapterId))
|
||
if isNeedUnlock and PlanetViewModel:CheckChapterIsInTime(chapterId) and not GetChapterOpenRed(chapterId) then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
function XPlanetManager.ClearChapterOpenRedPoint()
|
||
local chapterIdList = XPlanetManager.GetShowChapterList()
|
||
for _, chapterId in ipairs(chapterIdList) do
|
||
local isNeedUnlock = XTool.IsNumberValid(XPlanetStageConfigs.GetChapterPreStageId(chapterId))
|
||
if isNeedUnlock and PlanetViewModel:CheckChapterIsInTime(chapterId) and not GetChapterOpenRed(chapterId) then
|
||
SetChapterOpenRed(chapterId)
|
||
end
|
||
end
|
||
end
|
||
|
||
---章节解锁
|
||
function XPlanetManager.CheckChapterUnlockRedPoint()
|
||
local chapterIdList = XPlanetManager.GetShowChapterList()
|
||
local bePlayRedPointDir = {} -- 待播放列表
|
||
for _, chapterId in ipairs(chapterIdList) do
|
||
local isNeedUnlock = XTool.IsNumberValid(XPlanetStageConfigs.GetChapterPreStageId(chapterId))
|
||
if isNeedUnlock and PlanetViewModel:CheckChapterIsUnlock(chapterId) and not GetChapterUnlockRed(chapterId) then
|
||
bePlayRedPointDir[chapterId] = true
|
||
end
|
||
end
|
||
return not XTool.IsTableEmpty(bePlayRedPointDir), bePlayRedPointDir
|
||
end
|
||
|
||
function XPlanetManager.ClearChapterUnlockRedPoint()
|
||
local chapterIdList = XPlanetManager.GetShowChapterList()
|
||
for _, chapterId in ipairs(chapterIdList) do
|
||
local isNeedUnlock = XTool.IsNumberValid(XPlanetStageConfigs.GetChapterPreStageId(chapterId))
|
||
if isNeedUnlock and PlanetViewModel:CheckChapterIsUnlock(chapterId) and not GetChapterUnlockRed(chapterId) then
|
||
SetChapterUnlockRed(chapterId)
|
||
end
|
||
end
|
||
end
|
||
|
||
---天赋球总红点(解锁,新建筑,新建筑上限,新天气)
|
||
function XPlanetManager.CheckTalentRedPoint()
|
||
if not XPlanetManager.BaseCheckActivity() then
|
||
return false
|
||
end
|
||
|
||
if not PlanetViewModel:CheckStageIsPass(XPlanetConfigs.GetTalentUnLockStage()) then
|
||
return false
|
||
end
|
||
|
||
if XPlanetManager.CheckTalentBuildRedPoint() then
|
||
return true
|
||
end
|
||
|
||
if XPlanetManager.CheckAllWeatherUnlockRedPoint() then
|
||
return true
|
||
end
|
||
|
||
return false
|
||
end
|
||
|
||
---天赋球建筑总红点(新建筑,新建筑上限)
|
||
function XPlanetManager.CheckTalentBuildRedPoint()
|
||
if not XPlanetManager.BaseCheckActivity() then
|
||
return false
|
||
end
|
||
|
||
if XPlanetManager.CheckTalentBuildUnlockRedPoint() then
|
||
return true
|
||
end
|
||
|
||
if XPlanetManager.CheckTalentBuildLimitUnlockRedPoint() then
|
||
return true
|
||
end
|
||
|
||
return false
|
||
end
|
||
|
||
---天气解锁提示&红点
|
||
---[策划设计思路:Ui缓存+本地缓存,打开Ui清除本地缓存,不硬性要求玩家全部点击,天赋建筑同理]
|
||
function XPlanetManager.CheckAllWeatherUnlockRedPoint()
|
||
for _, weatherId in pairs(XPlanetWorldConfigs.GetWeatherIdList()) do
|
||
if XPlanetManager.CheckOneWeatherUnlockRedPoint(weatherId) then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
function XPlanetManager.CheckOneWeatherUnlockRedPoint(weatherId)
|
||
if not XTool.IsNumberValid(weatherId) then
|
||
return false
|
||
end
|
||
local stageId = XPlanetWorldConfigs.GetWeatherUnlockStageId(weatherId)
|
||
local isNeedUnlock = XTool.IsNumberValid(stageId)
|
||
if isNeedUnlock and
|
||
PlanetViewModel:CheckStageIsPass(stageId) and
|
||
XPlanetWorldConfigs.GetWeatherIsTalentShow(weatherId) and
|
||
not GetWeatherUnlockRed(weatherId)
|
||
then
|
||
return true
|
||
end
|
||
return false
|
||
end
|
||
|
||
function XPlanetManager.ClearAllWeatherUnlockRedPoint()
|
||
for _, weatherId in pairs(XPlanetWorldConfigs.GetWeatherIdList()) do
|
||
local stageId = XPlanetWorldConfigs.GetWeatherUnlockStageId(weatherId)
|
||
local isNeedUnlock = XTool.IsNumberValid(stageId)
|
||
if isNeedUnlock and
|
||
PlanetViewModel:CheckStageIsPass(stageId) and
|
||
XPlanetWorldConfigs.GetWeatherIsTalentShow(weatherId) and
|
||
not GetWeatherUnlockRed(weatherId)
|
||
then
|
||
SetWeatherUnlockRed(weatherId)
|
||
end
|
||
end
|
||
end
|
||
|
||
---天赋建筑解锁提示&红点
|
||
function XPlanetManager.CheckTalentBuildUnlockRedPoint()
|
||
local talentBuildList = XPlanetManager.GetTalentBuildCardList(true)
|
||
local bePlayRedPointDir = {} -- 待播放特效列表
|
||
for _, id in ipairs(talentBuildList) do
|
||
if XPlanetManager.CheckOneTalentBuildUnlockRedPoint(id) then
|
||
bePlayRedPointDir[id] = true
|
||
end
|
||
end
|
||
return not XTool.IsTableEmpty(bePlayRedPointDir), bePlayRedPointDir
|
||
end
|
||
|
||
function XPlanetManager.CheckOneTalentBuildUnlockRedPoint(buildId)
|
||
if PlanetViewModel:CheckReformBuildCardIsUnLock(buildId) and not GetTalentBuildUnlockRed(buildId) then
|
||
return true
|
||
end
|
||
return false
|
||
end
|
||
|
||
function XPlanetManager.ClearTalentBuildUnlockRedPoint()
|
||
local talentBuildList = XPlanetManager.GetTalentBuildCardList(true)
|
||
for _, id in ipairs(talentBuildList) do
|
||
if PlanetViewModel:CheckReformBuildCardIsUnLock(id) and not GetTalentBuildUnlockRed(id) then
|
||
SetTalentBuildUnlockRed(id)
|
||
end
|
||
end
|
||
end
|
||
|
||
---天赋建筑建造上限解锁提示&红点
|
||
function XPlanetManager.CheckTalentBuildLimitUnlockRedPoint()
|
||
local talentBuildList = XPlanetManager.GetTalentBuildCardList(true)
|
||
local bePlayRedPointList = {} -- 待播放特效列表
|
||
for _, id in ipairs(talentBuildList) do
|
||
if XPlanetManager.CheckOneTalentBuildLimitUnlockRedPoint(id) then
|
||
table.insert(bePlayRedPointList, id)
|
||
end
|
||
end
|
||
return not XTool.IsTableEmpty(bePlayRedPointList), bePlayRedPointList
|
||
end
|
||
|
||
function XPlanetManager.CheckOneTalentBuildLimitUnlockRedPoint(buildId)
|
||
local unlockStageId = XPlanetTalentConfigs.GetTalentBuildingUnlockCountStageIds(buildId)
|
||
for _, stageId in ipairs(unlockStageId) do
|
||
if PlanetViewModel:CheckStageIsPass(stageId) and
|
||
PlanetViewModel:CheckReformBuildCardIsUnLock(buildId) and
|
||
not GetTalentBuildLimitUnlockRed(buildId, stageId) then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
function XPlanetManager.ClearTalentBuildLimitUnlockRedPoint()
|
||
local talentBuildList = XPlanetManager.GetTalentBuildCardList(true)
|
||
for _, id in ipairs(talentBuildList) do
|
||
local unlockStageId = XPlanetTalentConfigs.GetTalentBuildingUnlockCountStageIds(id)
|
||
for _, stageId in ipairs(unlockStageId) do
|
||
if PlanetViewModel:CheckStageIsPass(stageId) and
|
||
PlanetViewModel:CheckReformBuildCardIsUnLock(id) and
|
||
not GetTalentBuildLimitUnlockRed(id, stageId) then
|
||
SetTalentBuildLimitUnlockRed(id, stageId)
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
---关卡建筑解锁提示
|
||
---[策划设计思路:红点和提示分开本地缓存,硬性要求玩家全部点击,角色解锁同理]
|
||
function XPlanetManager.CheckStageBuildUnlockTip()
|
||
local buildCfgList = XPlanetWorldConfigs.GetBuildingCanBring()
|
||
local bePlayRedPointDir = {} -- 待播放列表
|
||
for _, id in ipairs(buildCfgList) do
|
||
if XPlanetManager.CheckOneStageBuildUnlockTip(id) then
|
||
bePlayRedPointDir[id] = true
|
||
end
|
||
end
|
||
return not XTool.IsTableEmpty(bePlayRedPointDir), bePlayRedPointDir
|
||
end
|
||
|
||
function XPlanetManager.CheckOneStageBuildUnlockTip(buildId)
|
||
local isNeedUnlock = XTool.IsNumberValid(XPlanetWorldConfigs.GetBuildingUnlockStageId(buildId))
|
||
if isNeedUnlock and XPlanetManager.CheckBuildingIsUnLock(buildId) and not GetStageBuildUnlockTip(buildId) then
|
||
return true
|
||
end
|
||
return false
|
||
end
|
||
|
||
function XPlanetManager.ClearStageBuildUnlockTip()
|
||
local buildCfgList = XPlanetWorldConfigs.GetBuildingCanBring()
|
||
for _, id in ipairs(buildCfgList) do
|
||
XPlanetManager.ClearOneStageBuildUnlockTip(id)
|
||
end
|
||
end
|
||
|
||
function XPlanetManager.ClearOneStageBuildUnlockTip(buildId)
|
||
local isNeedUnlock = XTool.IsNumberValid(XPlanetWorldConfigs.GetBuildingUnlockStageId(buildId))
|
||
if isNeedUnlock and XPlanetManager.CheckBuildingIsUnLock(buildId) and not GetStageBuildUnlockTip(buildId) then
|
||
SetStageBuildUnlockTip(buildId)
|
||
end
|
||
end
|
||
|
||
---关卡建筑解锁红点
|
||
function XPlanetManager.CheckAllStageBuildUnlockRed()
|
||
local buildCfgList = XPlanetWorldConfigs.GetBuildingCanBring()
|
||
for _, id in ipairs(buildCfgList) do
|
||
if XPlanetManager.CheckOneStageBuildUnlockRed(id) then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
function XPlanetManager.CheckOneStageBuildUnlockRed(buildId)
|
||
local isNeedUnlock = XTool.IsNumberValid(XPlanetWorldConfigs.GetBuildingUnlockStageId(buildId))
|
||
if isNeedUnlock and XPlanetManager.CheckBuildingIsUnLock(buildId) and not GetStageBuildUnlockRed(buildId) then
|
||
return true
|
||
end
|
||
return false
|
||
end
|
||
|
||
function XPlanetManager.ClearOneStageBuildUnlockRed(buildId)
|
||
if XPlanetManager.CheckOneStageBuildUnlockRed(buildId) then
|
||
SetStageBuildUnlockRed(buildId)
|
||
end
|
||
end
|
||
|
||
---角色解锁提示
|
||
function XPlanetManager.CheckCharacterUnlockTip()
|
||
local characterList = XDataCenter.PlanetExploreManager.GetAllCharacter()
|
||
local bePlayRedPointList = {} -- 待播放列表
|
||
for _, character in ipairs(characterList) do
|
||
local id = character:GetCharacterId()
|
||
local isNeedUnlock = not XTool.IsNumberValid(XPlanetCharacterConfigs.GetCharacterDefaultUnlock(id))
|
||
if isNeedUnlock and PlanetViewModel:CheckCharacterIsUnlock(id) and not GetCharacterUnlockTip(id) then
|
||
table.insert(bePlayRedPointList, id)
|
||
end
|
||
end
|
||
return not XTool.IsTableEmpty(bePlayRedPointList), bePlayRedPointList
|
||
end
|
||
|
||
function XPlanetManager.ClearCharacterUnlockTip()
|
||
local characterList = XDataCenter.PlanetExploreManager.GetAllCharacter()
|
||
for _, character in ipairs(characterList) do
|
||
local id = character:GetCharacterId()
|
||
local isNeedUnlock = not XTool.IsNumberValid(XPlanetCharacterConfigs.GetCharacterDefaultUnlock(id))
|
||
if isNeedUnlock and PlanetViewModel:CheckCharacterIsUnlock(id) and not GetCharacterUnlockTip(id) then
|
||
SetCharacterUnlockTip(id)
|
||
end
|
||
end
|
||
end
|
||
|
||
---角色解锁红点
|
||
function XPlanetManager.CheckAllCharacterUnlockRed()
|
||
local characterList = XDataCenter.PlanetExploreManager.GetAllCharacter()
|
||
for _, character in ipairs(characterList) do
|
||
if XPlanetManager.CheckOneCharacterUnlockRed(character:GetCharacterId()) then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
function XPlanetManager.CheckOneCharacterUnlockRed(characterId)
|
||
local isNeedUnlock = not XTool.IsNumberValid(XPlanetCharacterConfigs.GetCharacterDefaultUnlock(characterId))
|
||
if isNeedUnlock and PlanetViewModel:CheckCharacterIsUnlock(characterId) and not GetCharacterUnlockRed(characterId) then
|
||
return true
|
||
end
|
||
return false
|
||
end
|
||
|
||
function XPlanetManager.ClearOneCharacterUnlockRed(characterId)
|
||
if XPlanetManager.CheckOneCharacterUnlockRed(characterId) then
|
||
SetCharacterUnlockRed(characterId)
|
||
end
|
||
end
|
||
--endregion
|
||
|
||
|
||
--region ExManager
|
||
function XPlanetManager.ExGetProgressTip()
|
||
end
|
||
--endregion
|
||
|
||
|
||
--region 协议
|
||
---活动数据 + 天赋球数据
|
||
function XPlanetManager.NotifyPlanetRunningDataDb(data)
|
||
local activityId = data.ActivityId
|
||
if XTool.IsNumberValid(activityId) then
|
||
PlanetViewModel = PlanetViewModel or XPlanetViewModel.New(activityId)
|
||
PlanetViewModel:NotifyPlanetRunningDataDb(data)
|
||
PlanetStageData = PlanetStageData or XPlanetStageData.New()
|
||
PlanetStageData:UpdateData(data.StageData)
|
||
PlanetTalentTeam:SetInitData(PlanetViewModel:GetReformCharacterIds())
|
||
XDataCenter.PlanetExploreManager.OnNotifyData(data)
|
||
else
|
||
XPlanetManager.OnActivityEnd()
|
||
end
|
||
|
||
XPlanetManager.RefreshShopInfo(nil, true)
|
||
end
|
||
|
||
-- 刷新商店信息
|
||
function XPlanetManager.RefreshShopInfo(cb, notTip)
|
||
if XFunctionManager.DetectionFunction(XFunctionManager.FunctionName.ShopCommon, nil, notTip) then
|
||
local viewModel = XDataCenter.PlanetManager.GetViewModel()
|
||
if not viewModel then
|
||
return
|
||
end
|
||
local shopIdList = viewModel:GetActivityShopIdList()
|
||
XShopManager.GetShopInfoList(shopIdList, cb, XShopManager.ActivityShopType.PlanetShop, notTip)
|
||
end
|
||
end
|
||
|
||
---配置修改
|
||
function XPlanetManager.NotifyPlanetRunningClearByConfigChange(data)
|
||
XPlanetManager.KickLogin(XUiHelper.GetText("PlanetConfigChangeKickOutTitle"), XUiHelper.GetText("PlanetConfigChangeKickOutContext"))
|
||
XPlanetManager.ClearStageData()
|
||
end
|
||
|
||
---准备建筑数据
|
||
function XPlanetManager.PrepareBuildingData(buildingList, isTalentPlanet)
|
||
local dataList = {}
|
||
for _, data in ipairs(buildingList) do
|
||
local occupyType = XPlanetWorldConfigs.GetBuildingGridOccupyType(data:GetBuildingId())
|
||
-- 7格占地只发中心点
|
||
local occupy = occupyType == XPlanetWorldConfigs.GridOccupyType.Occupy7 and { data:GetOccupyTileList()[1] } or data:GetOccupyTileList()
|
||
|
||
local buildData = {
|
||
Occupy = occupy,
|
||
Rotate = data:GetBuildingDirection(),
|
||
MaterialId = data:GetFloorId(),
|
||
}
|
||
table.insert(dataList, {
|
||
Guid = data:GetGuid(),
|
||
BuildingId = data:GetBuildingId(),
|
||
RoadGrid = data:GetInRangeRoadList(),
|
||
TalentBuilding = isTalentPlanet and buildData or {},
|
||
Building = not isTalentPlanet and buildData or {}
|
||
})
|
||
end
|
||
return dataList
|
||
end
|
||
|
||
---进入玩法
|
||
function XPlanetManager.RequestEnterActivity(cb)
|
||
XNetwork.Call("PlanetRunningOnEnableRequest", nil, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
IsOpenActivity = true
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
---天赋球:清空建筑
|
||
function XPlanetManager.RequestTalentBuildClear(cb)
|
||
XNetwork.Call("PlanetRunningReformClearRequest", nil, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
PlanetViewModel:UpdateReformMode(res)
|
||
PlanetMainScene:ClearBuilding()
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
---天赋球:建筑添加
|
||
function XPlanetManager.RequestTalentInsertBuild(buildingList, cb)
|
||
local buildDataDir = XPlanetManager.PrepareBuildingData(buildingList, true)
|
||
local req = {
|
||
Operation = {
|
||
OperationType = BuildingOperation.Insert,
|
||
OperationModeType = BuildingOperationMode.Talent,
|
||
BuildingOperationInfo = buildDataDir,
|
||
}
|
||
}
|
||
local func = function()
|
||
XNetwork.Call("PlanetRunningBuildingOperationRequest", req, function(res)
|
||
XEventManager.DispatchEvent(XEventId.EVENT_PLANET_RESUME_RUNNING, XPlanetExploreConfigs.PAUSE_REASON.BUILD)
|
||
if res.Code ~= XCode.Success then
|
||
PlanetMainScene:RemoveCurBuildingList()
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
for _, data in ipairs(buildDataDir) do
|
||
PlanetViewModel:AddReformBuildData(data)
|
||
end
|
||
PlanetViewModel:UpdateReformBuildBuyCount(res.Result.BuildBuyCount)
|
||
PlanetViewModel:UpdateReformModeIncId(res.Result.IncId)
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
-- 未持有天赋建筑发送二次弹窗
|
||
local buildId = buildingList[1]:GetBuildingId()
|
||
local curHaveCount = PlanetViewModel:GetReformCardCurHaveCount(buildId)
|
||
if curHaveCount == 0 and not IsReformBuyBuildTip then
|
||
XLuaUiManager.Open("UiPlanetPopover", buildId, #buildingList, function()
|
||
local count = XDataCenter.ItemManager.GetCount(XDataCenter.ItemManager.ItemId.PlanetRunningTalent)
|
||
if count < XPlanetTalentConfigs.GetTalentBuildingBuyPrices(buildId) * #buildingList then
|
||
PlanetMainScene:RemoveCurBuildingList()
|
||
XEventManager.DispatchEvent(XEventId.EVENT_PLANET_RESUME_RUNNING, XPlanetExploreConfigs.PAUSE_REASON.BUILD)
|
||
XUiManager.TipErrorWithKey("PlanetRunningNoEnoughCoin")
|
||
else
|
||
func()
|
||
end
|
||
end, function()
|
||
XPlanetManager.SetIsReformBuyBuildTip(false)
|
||
PlanetMainScene:RemoveCurBuildingList()
|
||
XEventManager.DispatchEvent(XEventId.EVENT_PLANET_RESUME_RUNNING, XPlanetExploreConfigs.PAUSE_REASON.BUILD)
|
||
end)
|
||
else
|
||
func()
|
||
end
|
||
end
|
||
|
||
---天赋球:建筑删除
|
||
function XPlanetManager.RequestTalentDeleteBuild(buildingList, cb)
|
||
local buildDataDir = XPlanetManager.PrepareBuildingData(buildingList, true)
|
||
local req = {
|
||
Operation = {
|
||
OperationType = BuildingOperation.Delete,
|
||
OperationModeType = BuildingOperationMode.Talent,
|
||
BuildingOperationInfo = buildDataDir,
|
||
}
|
||
}
|
||
XNetwork.Call("PlanetRunningBuildingOperationRequest", req, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
for _, data in ipairs(buildDataDir) do
|
||
PlanetViewModel:RemoveReformBuildData(data.BuildingId, data.Guid)
|
||
end
|
||
PlanetViewModel:UpdateReformModeIncId(res.Result.IncId)
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
---天赋球:建筑更新
|
||
function XPlanetManager.RequestTalentUpdateBuild(buildingList, cb)
|
||
local buildDataDir = XPlanetManager.PrepareBuildingData(buildingList, true)
|
||
local req = {
|
||
Operation = {
|
||
OperationType = BuildingOperation.Update,
|
||
OperationModeType = BuildingOperationMode.Talent,
|
||
BuildingOperationInfo = buildDataDir,
|
||
}
|
||
}
|
||
XNetwork.Call("PlanetRunningBuildingOperationRequest", req, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
PlanetViewModel:UpdateReformModeIncId(res.Result.IncId)
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
---天赋球:天气切换
|
||
function XPlanetManager.RequestTalentUpdateWeather(weatherId, cb)
|
||
local req = {
|
||
WeatherId = weatherId,
|
||
}
|
||
XNetwork.Call("PlanetRunningReformChangeWeatherRequest", req, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
PlanetViewModel:UpdateReformWeather(weatherId)
|
||
XEventManager.DispatchEvent(XEventId.EVENT_PLANET_UPDATE_REFROM_WEATHER)
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
---天赋球:角色切换
|
||
function XPlanetManager.RequestTalentChangeCharacter(cb)
|
||
local req = {
|
||
Characters = PlanetTalentTeam:GetData4Request(),
|
||
}
|
||
XNetwork.Call("PlanetRunningReformChangeCharacterRequest", req, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
PlanetViewModel:UpdateReformBuildCharacterIds(PlanetTalentTeam:GetData4Request())
|
||
PlanetTalentTeam:SetData(PlanetViewModel:GetReformCharacterIds())
|
||
XEventManager.DispatchEvent(XEventId.EVENT_PLANET_UPDATE_REFROM_TEAM)
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
---关卡:进入关卡
|
||
function XPlanetManager.RequestEnterNewStage(stageId, selectCharacters, selectBuildings, cb, callbackEvenFail)
|
||
local req = {
|
||
StageId = stageId,
|
||
GridId = XPlanetWorldConfigs.GetRoadStartPointByStageId(stageId), -- 道路起点
|
||
SelectCharacters = selectCharacters,
|
||
SelectBuildings = selectBuildings,
|
||
}
|
||
XNetwork.Call("PlanetRunningEnterNewStageRequest", req, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
if callbackEvenFail then
|
||
callbackEvenFail()
|
||
end
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
|
||
PlanetStageData:UpdateData(res.ResultStageData)
|
||
if cb then
|
||
cb()
|
||
end
|
||
if callbackEvenFail then
|
||
callbackEvenFail()
|
||
end
|
||
end)
|
||
end
|
||
|
||
---关卡:中断结算
|
||
function XPlanetManager.RequestQuitStage(cb)
|
||
local req = {}
|
||
XNetwork.Call("PlanetRunningQuitStageRequest", req, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
XDataCenter.PlanetExploreManager.OnNotifyResult(res)
|
||
XDataCenter.PlanetExploreManager.HandleResult()
|
||
XPlanetManager.ClearStageData()
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
---关卡:建筑添加
|
||
function XPlanetManager.RequestStageInsertBuild(buildingList, cb)
|
||
local cast = 0
|
||
local buildDataDir = XPlanetManager.PrepareBuildingData(buildingList)
|
||
for _, building in ipairs(buildingList) do
|
||
cast = cast + XPlanetWorldConfigs.GetBuildingCast(building:GetBuildingId())
|
||
end
|
||
if cast > PlanetStageData:GetCoin() then
|
||
PlanetStageScene:RemoveCurBuildingList()
|
||
XEventManager.DispatchEvent(XEventId.EVENT_PLANET_RESUME_RUNNING, XPlanetExploreConfigs.PAUSE_REASON.BUILD)
|
||
XUiManager.TipErrorWithKey("PlanetRunningNoEnoughCoin")
|
||
return
|
||
end
|
||
local req = {
|
||
Operation = {
|
||
OperationType = BuildingOperation.Insert,
|
||
OperationModeType = BuildingOperationMode.Stage,
|
||
BuildingOperationInfo = buildDataDir,
|
||
}
|
||
}
|
||
XNetwork.Call("PlanetRunningBuildingOperationRequest", req, function(res)
|
||
XEventManager.DispatchEvent(XEventId.EVENT_PLANET_RESUME_RUNNING, XPlanetExploreConfigs.PAUSE_REASON.BUILD)
|
||
if res.Code ~= XCode.Success then
|
||
PlanetStageScene:RemoveCurBuildingList()
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
for _, data in ipairs(buildDataDir) do
|
||
PlanetStageData:AddStageBuildData(data)
|
||
end
|
||
PlanetStageData:SetCoin(res.Result.StageCoin)
|
||
PlanetStageData:SetBuildIncId(res.Result.IncId)
|
||
PlanetStageScene:DebugDrawBuffDependence()
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
---关卡:建筑删除
|
||
function XPlanetManager.RequestStageDeleteBuild(buildingList, cb)
|
||
local buildDataDir = XPlanetManager.PrepareBuildingData(buildingList)
|
||
local req = {
|
||
Operation = {
|
||
OperationType = BuildingOperation.Delete,
|
||
OperationModeType = BuildingOperationMode.Stage,
|
||
BuildingOperationInfo = buildDataDir,
|
||
}
|
||
}
|
||
XNetwork.Call("PlanetRunningBuildingOperationRequest", req, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
for _, data in ipairs(buildDataDir) do
|
||
PlanetStageData:RemoveStageBuildData(data.BuildingId, data.Guid)
|
||
end
|
||
PlanetStageData:SetCoin(res.Result.StageCoin)
|
||
PlanetStageScene:DebugDrawBuffDependence()
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
---关卡:到达起点
|
||
function XPlanetManager.RequestArriveBeginGrid(stageId, cb)
|
||
local req = {
|
||
GridId = XPlanetWorldConfigs.GetRoadStartPointByStageId(stageId),
|
||
}
|
||
XNetwork.Call("PlanetRunningArriveBeginGridRequest", req, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
---关卡:角色移动
|
||
function XPlanetManager.RequestDoMove(grid, cb)
|
||
local req = {
|
||
Grid = grid,
|
||
}
|
||
XNetwork.CallWithAutoHandleErrorCode("PlanetRunningDoMoveRequest", req, cb)
|
||
end
|
||
|
||
---查看详情请求需要延时请求
|
||
local _DataDetail = {}
|
||
local _BuildDataDetail = {}
|
||
local _RequestTime = 0
|
||
local _RequestDuration = 1
|
||
|
||
---关卡:打开建筑详情查询效果激活
|
||
function XPlanetManager.RequestStageOpenBuildDetial(buildId, guid, isCard, cb)
|
||
if not PlanetStageScene or not PlanetStageScene:Exist() then
|
||
return
|
||
end
|
||
local time = XTime.GetServerNowTimestamp()
|
||
if _RequestTime + _RequestDuration < time then
|
||
_RequestTime = time
|
||
local req = {
|
||
Guid = guid,
|
||
CfgId = buildId,
|
||
}
|
||
XNetwork.CallWithAutoHandleErrorCode("PlanetRunningLookBuildingRequest", req, function(res)
|
||
_BuildDataDetail[guid] = res
|
||
XEventManager.DispatchEvent(XEventId.EVENT_PLANET_UPDATE_DETAIL)
|
||
end)
|
||
end
|
||
XLuaUiManager.Open("UiPlanetBuildDetail", buildId, false, isCard, guid, nil, nil, cb)
|
||
end
|
||
|
||
function XPlanetManager.GetBuildDataDetail(guid)
|
||
return _BuildDataDetail[guid]
|
||
end
|
||
|
||
---关卡:打开角色详情查询效果激活
|
||
---@param character XPlanetCharacter
|
||
---@param characterList XPlanetCharacter[]
|
||
function XPlanetManager.RequestStageOpenRoleDetial(character, characterList)
|
||
if not PlanetStageScene or not PlanetStageScene:Exist() then
|
||
return
|
||
end
|
||
if not character then
|
||
return
|
||
end
|
||
local characterId = character:GetCharacterId()
|
||
local time = XTime.GetServerNowTimestamp()
|
||
if _RequestTime + _RequestDuration < time then
|
||
_RequestTime = time
|
||
|
||
local characterIdList
|
||
if characterList then
|
||
characterIdList = {}
|
||
for i = 1, #characterList do
|
||
local characterOther = characterList[i]
|
||
characterIdList[#characterIdList + 1] = characterOther:GetCharacterId()
|
||
end
|
||
else
|
||
characterIdList = { characterId }
|
||
end
|
||
local req = {
|
||
CharacterId = characterIdList
|
||
}
|
||
XNetwork.CallWithAutoHandleErrorCode("PlanetRunningLookCharacterRequest", req, function(res)
|
||
local infoList = res.FightCharacterInfo
|
||
for i = 1, #infoList do
|
||
local info = infoList[i]
|
||
local characterOther = characterList[i]
|
||
_DataDetail[characterOther:GetUid()] = info
|
||
end
|
||
|
||
XEventManager.DispatchEvent(XEventId.EVENT_PLANET_UPDATE_DETAIL)
|
||
end)
|
||
end
|
||
|
||
XLuaUiManager.Open("UiPlanetDetail02", character, characterList)
|
||
end
|
||
|
||
function XPlanetManager.RequestUpdateDetailCharacter(character)
|
||
if not PlanetStageScene or not PlanetStageScene:Exist() then
|
||
return
|
||
end
|
||
local characterId = character:GetCharacterId()
|
||
local time = XTime.GetServerNowTimestamp()
|
||
if _RequestTime + _RequestDuration < time then
|
||
_RequestTime = time
|
||
local req = {
|
||
CharacterId = { characterId },
|
||
}
|
||
XNetwork.CallWithAutoHandleErrorCode("PlanetRunningLookCharacterRequest", req, function(res)
|
||
_DataDetail[character:GetUid()] = res.FightCharacterInfo[1]
|
||
XEventManager.DispatchEvent(XEventId.EVENT_PLANET_UPDATE_DETAIL)
|
||
end)
|
||
end
|
||
end
|
||
|
||
function XPlanetManager.GetDataDetailRole(characterId)
|
||
return _DataDetail[characterId]
|
||
end
|
||
|
||
---@param role XPlanetRoleBase
|
||
function XPlanetManager.GetExploreAttr(role)
|
||
local uid = role:GetUid()
|
||
local detail = _DataDetail[uid]
|
||
if detail then
|
||
if detail.BaseAttribute then
|
||
return detail.BaseAttribute.Attribute
|
||
end
|
||
end
|
||
return {}
|
||
end
|
||
|
||
---关卡:打开怪物详情查询效果激活
|
||
---@param boss XPlanetBoss
|
||
---@param bossList XPlanetBoss[]
|
||
function XPlanetManager.RequestStageOpenMonsterDetial(boss, bossList)
|
||
if not PlanetStageScene or not PlanetStageScene:Exist() then
|
||
return
|
||
end
|
||
local bossIdList
|
||
if bossList then
|
||
bossIdList = {}
|
||
for i = 1, #bossList do
|
||
local bossOther = bossList[i]
|
||
bossIdList[#bossIdList + 1] = bossOther:GetIdFromServer()
|
||
end
|
||
else
|
||
bossIdList = { boss:GetIdFromServer() }
|
||
end
|
||
local time = XTime.GetServerNowTimestamp()
|
||
if _RequestTime + _RequestDuration < time then
|
||
_RequestTime = time
|
||
local req = {
|
||
Grid = boss:GetGridId(),
|
||
MonsterGuid = bossIdList,
|
||
}
|
||
XNetwork.CallWithAutoHandleErrorCode("PlanetRunningLookMonsterRequest", req, function(res)
|
||
local infoList = res.FightMonsterInfo
|
||
if bossList then
|
||
for i = 1, #infoList do
|
||
local info = infoList[i]
|
||
local bossOther = bossList[i]
|
||
_DataDetail[bossOther:GetUid()] = info
|
||
end
|
||
else
|
||
_DataDetail[boss:GetUid()] = infoList[1]
|
||
end
|
||
XEventManager.DispatchEvent(XEventId.EVENT_PLANET_UPDATE_DETAIL)
|
||
end)
|
||
end
|
||
XLuaUiManager.Open("UiPlanetDetail02", boss, bossList)
|
||
end
|
||
|
||
---@param boss XPlanetBoss
|
||
function XPlanetManager.RequestUpdateDetailMonster(boss)
|
||
if not PlanetStageScene or not PlanetStageScene:Exist() then
|
||
return
|
||
end
|
||
local time = XTime.GetServerNowTimestamp()
|
||
if _RequestTime + _RequestDuration < time then
|
||
_RequestTime = time
|
||
local req = {
|
||
Grid = boss:GetGridId(),
|
||
MonsterGuid = { boss:GetIdFromServer() },
|
||
}
|
||
XNetwork.CallWithAutoHandleErrorCode("PlanetRunningLookMonsterRequest", req, function(res)
|
||
_DataDetail[boss:GetUid()] = res.FightMonsterInfo[1]
|
||
XEventManager.DispatchEvent(XEventId.EVENT_PLANET_UPDATE_DETAIL)
|
||
end)
|
||
end
|
||
end
|
||
--endregion
|
||
|
||
|
||
--region 回合制
|
||
function XPlanetManager.DebugFight(data, result)
|
||
XNetwork.Call("XPlanetRunningDebugFightSettleRequest", {
|
||
FightData = data,
|
||
ResultData = result,
|
||
}, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
XUiManager.TipText("Success")
|
||
end)
|
||
end
|
||
--endregion
|
||
|
||
|
||
--region Debug
|
||
function XPlanetManager.RequestDrawCollisionData(cb)
|
||
if not PlanetStageScene or not PlanetStageScene:Exist() then
|
||
return
|
||
end
|
||
XNetwork.CallWithAutoHandleErrorCode("PlanetRunningDebugDrawCollisionRequest", {}, function(res)
|
||
if cb then
|
||
cb(res)
|
||
end
|
||
end)
|
||
end
|
||
--endregion
|
||
|
||
function XPlanetManager.OnNotifyStageData(data)
|
||
PlanetStageData:UpdateData(data.StageData)
|
||
end
|
||
|
||
local XPlanetRunningStageDataChangeType = {
|
||
Character = 1,
|
||
Monster = 2,
|
||
Building = 3,
|
||
Weather = 4,
|
||
Coin = 5,
|
||
Prop = 6,
|
||
AddEvents = 7
|
||
}
|
||
|
||
function XPlanetManager.OnNotifyChangeStageData(data)
|
||
local change = data.EventChange
|
||
local changeList = change.DataChangeTypeList
|
||
if XTool.IsTableEmpty(changeList) then
|
||
return
|
||
end
|
||
for _, type in ipairs(changeList) do
|
||
if type == XPlanetRunningStageDataChangeType.Monster then
|
||
PlanetStageData:SetMonsterData(change.Monsters)
|
||
|
||
elseif type == XPlanetRunningStageDataChangeType.Character then
|
||
PlanetStageData:OnEffectAdd(change.CharacterEffectRecords)
|
||
PlanetStageData:SetCharacterData(change.Characters)
|
||
|
||
elseif type == XPlanetRunningStageDataChangeType.Prop then
|
||
PlanetStageData:SetRunningItem(change.RunningItems)
|
||
PlanetStageData:SetCoin(change.Coin)
|
||
|
||
elseif type == XPlanetRunningStageDataChangeType.Weather then
|
||
PlanetStageData:SetWeatherId(change.WeatherId)
|
||
|
||
elseif type == XPlanetRunningStageDataChangeType.Coin then
|
||
PlanetStageData:SetCoin(change.Coin)
|
||
local bubbleId = XPlanetConfigs.GetPlanetMoneyBubbleId()
|
||
if bubbleId then
|
||
XEventManager.DispatchEvent(XEventId.EVENT_PLANET_PLAY_BUBBLE, bubbleId)
|
||
end
|
||
|
||
elseif type == XPlanetRunningStageDataChangeType.AddEvents then
|
||
PlanetStageData:SetAddEvents(change.AddEvents)
|
||
|
||
end
|
||
end
|
||
end
|
||
|
||
function XPlanetManager.ClearEnableState()
|
||
IsOpenActivity = false
|
||
end
|
||
|
||
XPlanetManager.Init()
|
||
return XPlanetManager
|
||
end
|
||
|
||
XRpc.NotifyPlanetRunningDataDb = function(data)
|
||
XDataCenter.PlanetManager.NotifyPlanetRunningDataDb(data.DataDb)
|
||
end
|
||
|
||
XRpc.NotifyPlanetRunningNewMonsterInfo = function(data)
|
||
local stageData = XDataCenter.PlanetManager.GetStageData()
|
||
if stageData then
|
||
stageData:NewMonsterData(data.MonsterInfos)
|
||
end
|
||
end
|
||
|
||
XRpc.NotifyPlanetRunningStageData = function(data)
|
||
XDataCenter.PlanetManager.OnNotifyStageData(data)
|
||
end
|
||
|
||
XRpc.NotifyPlanetRunningEventChange = function(data)
|
||
XDataCenter.PlanetManager.OnNotifyChangeStageData(data)
|
||
end
|
||
|
||
XRpc.NotifyPlanetRunningClearByConfigChange = function(data)
|
||
XDataCenter.PlanetManager.NotifyPlanetRunningClearByConfigChange(data)
|
||
end |