PGRData/Script/matrix/xmanager/XPlanetManager.lua

2053 lines
71 KiB
Lua
Raw Normal View History

2024-09-01 20:49:41 +00:00
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