PGRData/Script/matrix/xmodule/xtheatre3/XTheatre3Agency.lua
2024-09-01 22:49:41 +02:00

447 lines
No EOL
14 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local XFubenBaseAgency = require("XModule/XBase/XFubenBaseAgency")
---@class XTheatre3Agency : XFubenBaseAgency
---@field _Model XTheatre3Model
local XTheatre3Agency = XClass(XFubenBaseAgency, "XTheatre3Agency")
function XTheatre3Agency:OnInit()
--初始化一些变量
---@type XFubenExAgency
local fubenExAgency = XMVCA:GetAgency(ModuleId.XFubenEx)
fubenExAgency:RegisterChapterAgency(self)
---@type XFubenAgency
local fubenAgency = XMVCA:GetAgency(ModuleId.XFuben)
fubenAgency:RegisterFuben(XEnumConst.FuBen.StageType.Theatre3, ModuleId.XTheatre3)
end
function XTheatre3Agency:InitRpc()
--实现服务器事件注册
--XRpc.XXX
XRpc.NotifyTheatre3ActivityData = handler(self, self.NotifyTheatre3ActivityData)
XRpc.NotifyTheatre3BattlePassExp = handler(self, self.NotifyTheatre3BattlePassExp)
XRpc.NotifyTheatre3AddStep = handler(self, self.NotifyTheatre3AddStep)
XRpc.NotifyTheatre3AddItem = handler(self, self.NotifyTheatre3AddItem)
XRpc.NotifyTheatre3AdventureSettle = handler(self, self.NotifyTheatre3AdventureSettle)
XRpc.NotifyTheatre3NodeNextStep = handler(self, self.NotifyTheatre3NodeNextStep)
XRpc.NotifyTheatre3AbnormalExit = handler(self, self.NotifyTheatre3AbnormalExit)
XRpc.NotifyTheatre3EquipPosCapacityChange = handler(self, self.NotifyTheatre3EquipPosCapcityChange)
XRpc.NotifyTheatre3MaxEnergyChange = handler(self, self.NotifyTheatre3MaxEnergyChange)
end
function XTheatre3Agency:InitEvent()
--实现跨Agency事件注册
--self:AddAgencyEvent()
end
----------public start----------
--获取活动时间Id
function XTheatre3Agency:GetActivityTimeId()
local config = self._Model:GetActivityConfig()
if not config then
return 0
end
return config.TimeId or 0
end
-- 检查是否播放剧情
function XTheatre3Agency:CheckAutoPlayStory()
local storyId = self._Model:GetClientConfig("Theatre3FirstEntryStoryId", 1)
if self:GetEnterAutoPlayStory() or string.IsNilOrEmpty(storyId) then
XLuaUiManager.Open("UiTheatre3Main")
return
end
XDataCenter.MovieManager.PlayMovie(storyId, function()
XLuaUiManager.Open("UiTheatre3Main")
end, nil, nil, false)
self:SaveEnterAutoPlayStory()
end
function XTheatre3Agency:GetRebootCost(rebootId)
return self._Model:GetRebootCost(rebootId)
end
function XTheatre3Agency:GetMaxRebootCount(rebootId)
return self._Model:GetMaxRebootCount(rebootId)
end
-- 检查Bp奖励是否全部领取
function XTheatre3Agency:CheckBattlePassAllReceive()
if not self._Model.ActivityData then
return false
end
local configs = self._Model:GetBattlePassConfigs()
for id, _ in pairs(configs) do
if not self._Model.ActivityData:CheckGetRewardId(id) then
return false
end
end
return true
end
-- 检查Bp是否有未领取的奖励
function XTheatre3Agency:CheckBattlePassIsHaveReward()
if not self._Model.ActivityData then
return false
end
local totalExp = self._Model:GetBattlePassTotalExp()
local curLevel = self._Model:GetBattlePassLevelByExp(totalExp)
local configs = self._Model:GetBattlePassConfigs()
for id, _ in pairs(configs) do
if not self._Model.ActivityData:CheckGetRewardId(id) and id <= curLevel then
return true
end
end
return false
end
-- 检查Bp是否是最大等级
function XTheatre3Agency:CheckBattlePassMaxLevel()
if not self._Model.ActivityData then
return false
end
local totalExp = self._Model:GetBattlePassTotalExp()
local curLevel = self._Model:GetBattlePassLevelByExp(totalExp)
local maxLevel = self._Model:GetMaxBattlePassLevel()
return curLevel >= maxLevel
end
-- 检查是否有完成未领取的任务
function XTheatre3Agency:CheckAllTaskAchieved()
local taskConfigIdList = self._Model:GetTaskConfigIdList()
for _, id in pairs(taskConfigIdList) do
local taskIdList = self._Model:GetTaskIdsById(id)
for _, taskId in ipairs(taskIdList) do
if XDataCenter.TaskManager.CheckTaskAchieved(taskId) then
return true
end
end
end
return false
end
--region Condition
function XTheatre3Agency:CheckFirstOpenChapterId(chapterId)
if self._Model.ActivityData then
return self._Model.ActivityData:CheckFirstOpenChapterId(chapterId)
end
return false
end
function XTheatre3Agency:CheckHasPassEnding(difficultyId, endingId)
if self._Model.ActivityData then
return self._Model.ActivityData:CheckHasPassEnding(difficultyId, endingId)
end
return false
end
function XTheatre3Agency:CheckEndingIsPass(endingId)
if self._Model.ActivityData then
return self._Model.ActivityData:CheckEndingIsPass(endingId)
end
return false
end
function XTheatre3Agency:CheckAdventureHasPassEventStep(eventStepId)
if self._Model.ActivityData then
return self._Model.ActivityData:CheckAdventureHasPassEventStep(eventStepId)
end
return false
end
function XTheatre3Agency:CheckAdventureHasPassChapter(chapterId)
if self._Model.ActivityData then
return self._Model.ActivityData:CheckAdventureHasPassChapter(chapterId)
end
return false
end
function XTheatre3Agency:CheckAdventureHasPassNode(nodeId)
if self._Model.ActivityData then
return self._Model.ActivityData:CheckAdventureHasPassNode(nodeId)
end
return false
end
-- 检查天赋是否解锁
function XTheatre3Agency:CheckStrengthTreeUnlock(id)
if self._Model.ActivityData then
return self._Model.ActivityData:CheckUnlockStrengthTree(id)
end
return false
end
--endregion
----------public end----------
--region Rpc
function XTheatre3Agency:NotifyTheatre3ActivityData(data)
self._Model:NotifyTheatre3Activity(data)
end
function XTheatre3Agency:NotifyTheatre3BattlePassExp(data)
self._Model.ActivityData:UpdateTotalBattlePassExp(data.TotalBattlePassExp)
CsXGameEventManager.Instance:Notify(XEventId.EVENT_THEATRE3_BATTLE_PASS_EXP_CHANGE)
end
function XTheatre3Agency:NotifyTheatre3AddStep(data)
self._Model:NotifyTheatre3AddStep(data)
end
function XTheatre3Agency:NotifyTheatre3AddItem(data)
self._Model.ActivityData:NotifyTheatre3AddItem(data.InnerItems)
end
function XTheatre3Agency:NotifyTheatre3NodeNextStep(data)
self._Model.ActivityData:NotifyTheatre3NodeNextStep(data)
end
function XTheatre3Agency:NotifyTheatre3AdventureSettle(data)
self._Model:NotifyTheatre3AdventureSettle(data)
self:RemoveBlackView()
end
--发生非正常退出,触发保底保护
function XTheatre3Agency:NotifyTheatre3AbnormalExit(data)
end
function XTheatre3Agency:NotifyTheatre3EquipPosCapcityChange(data)
self._Model.ActivityData:UpdateEquipPosData(data.EquipPos)
end
function XTheatre3Agency:NotifyTheatre3MaxEnergyChange(data)
self._Model.ActivityData:UpdateMaxEnergy(data.MaxEnergy)
end
--endregion
--region 副本相关
function XTheatre3Agency:InitStageInfo()
---@type XFubenAgency
local fubenAgency = XMVCA:GetAgency(ModuleId.XFuben)
-- 关卡池的关卡
local configs = self._Model:GetFightStageTemplateConfigs()
local stageInfo = nil
for _, config in pairs(configs) do
stageInfo = fubenAgency:GetStageInfo(config.StageId)
if stageInfo then
stageInfo.Type = XEnumConst.FuBen.StageType.Theatre3
else
XLog.Error("肉鸽3.0找不到配置的关卡id", config.StageId)
end
end
end
---@param stage XTableStage
function XTheatre3Agency:PreFight(stage, teamId, isAssist, challengeCount)
local preFight = {}
preFight.RobotIds = self._Model.ActivityData:GetTeamRobotIds()
preFight.CardIds = self._Model.ActivityData:GetTeamsCharIds()
preFight.StageId = stage.StageId
preFight.IsHasAssist = isAssist
preFight.ChallengeCount = challengeCount
preFight.CaptainPos = self._Model.ActivityData:GetCaptainPos()
preFight.FirstFightPos = self._Model.ActivityData:GetFirstFightPos()
return preFight
end
function XTheatre3Agency:CallFinishFight()
---@type XFubenAgency
local fubenAgency = XMVCA:GetAgency(ModuleId.XFuben)
local res = fubenAgency:GetFubenSettleResult()
-- 手动结束
if not res then
fubenAgency:ResetSettle()
--通知战斗结束,关闭战斗设置页面
CS.XGameEventManager.Instance:Notify(XEventId.EVENT_FIGHT_FINISH)
-- 恢复回系统音声设置 避免战斗里将BGM音量设置为0导致结算后没有声音
XSoundManager.ResetSystemAudioVolume()
self:FinishFight({})
return
end
fubenAgency:CallFinishFight()
end
--战斗结束
function XTheatre3Agency:FinishFight(settle)
if settle.IsWin then
self._Model.ActivityData:GetCurChapterDb():SetFightNodeSlotAddPassStageId(settle.StageId)
if not self:CheckAndOpenSettle() then
-- 战斗胜利没结算就进入选奖励
XLuaUiManager.Open("UiTheatre3RewardChoose", false)
end
else
if not self:CheckAndOpenSettle() then
-- 打开黑幕因为手动结束战斗在settle前就走到了这里
-- 如果notify数据还没同步就先开个黑幕
self:OpenBlackView()
end
end
end
--endregion
--region 副本入口扩展
function XTheatre3Agency:ExOpenMainUi()
if not XFunctionManager.DetectionFunction(XFunctionManager.FunctionName.Theatre3) then
return
end
if not self._Model.ActivityData or not self:ExCheckInTime() then
XUiManager.TipErrorWithKey("CommonActivityNotStart")
return
end
self:CheckAutoPlayStory()
end
function XTheatre3Agency:ExGetConfig()
if XTool.IsTableEmpty(self.ExConfig) then
---@type XTableFubenChallengeBanner
self.ExConfig = XFubenConfigs.GetChapterBannerByType(self:ExGetChapterType())
end
return self.ExConfig
end
function XTheatre3Agency:ExGetChapterType()
return XDataCenter.FubenManager.ChapterType.Theatre3
end
function XTheatre3Agency:ExGetFunctionNameType()
return self:ExGetConfig().FunctionId
end
function XTheatre3Agency:ExGetName()
return self:ExGetConfig().SimpleDesc
end
function XTheatre3Agency:ExGetRewardId()
return self:ExGetConfig().RewardId
end
function XTheatre3Agency:ExCheckInTime()
local timeId = self:GetActivityTimeId()
if XFunctionManager.CheckInTimeByTimeId(timeId) then
return true
end
return false
end
function XTheatre3Agency:ExGetRunningTimeStr()
return ""
end
function XTheatre3Agency:ExCheckIsShowRedPoint()
if not XFunctionManager.JudgeCanOpen(XFunctionManager.FunctionName.Theatre3) then
return false
end
-- 当玩家有尚未领取的BP奖励时
-- 当玩家BP等级未达到最大且有完成未领取的任务时
return self:CheckBattlePassIsHaveReward() or (not self:CheckBattlePassMaxLevel() and self:CheckAllTaskAchieved())
end
function XTheatre3Agency:ExGetProgressTip()
local totalExp = self._Model:GetBattlePassTotalExp()
local curLevel = self._Model:GetBattlePassLevelByExp(totalExp)
local maxLevel = self._Model:GetMaxBattlePassLevel()
curLevel = curLevel > maxLevel and maxLevel or curLevel
local desc = self._Model:GetClientConfig("Theatre3EntryProgressDesc", 1)
return string.format(desc, curLevel, maxLevel)
end
function XTheatre3Agency:ExCheckIsFinished(cb)
if not XFunctionManager.DetectionFunction(XFunctionManager.FunctionName.Theatre3, nil, true) then
if cb then
cb(false)
end
return false
end
-- 当前BP等级达到满级且已领取所有奖励
local isGetAllLvReward = self:CheckBattlePassMaxLevel() and self:CheckBattlePassAllReceive()
if isGetAllLvReward then
self.IsClear = true
if cb then
cb(true)
end
return true
end
self.IsClear = false
if cb then
cb(false)
end
return false
end
--endregion
--region Settle
function XTheatre3Agency:OpenBlackView()
XLuaUiManager.Open("UiBiancaTheatreBlack")
end
function XTheatre3Agency:IsBlackViewOpen()
return XLuaUiManager.IsUiLoad("UiBiancaTheatreBlack")
end
function XTheatre3Agency:RemoveBlackView()
if self:IsBlackViewOpen() then
XLuaUiManager.Remove("UiBiancaTheatreBlack")
self:CheckAndOpenSettle()
end
end
function XTheatre3Agency:RemoveStepView()
XLuaUiManager.Remove("UiTheatre3PlayMain")
XLuaUiManager.Remove("UiTheatre3RewardChoose")
XLuaUiManager.Remove("UiTheatre3EquipmentChoose")
XLuaUiManager.Remove("UiTheatre3RoleRoom")
XLuaUiManager.Remove("UiTheatre3Outpost")
end
function XTheatre3Agency:CheckAndOpenSettle()
local settle = self._Model.ActivityData:GetSettleData()
if not settle then
return false
end
local storyId = self._Model:GetEndingById(settle.EndId).StoryId
if storyId then
self:OpenBlackView()
--结局剧情
XDataCenter.MovieManager.PlayMovie(storyId, function()
if self:IsBlackViewOpen() then
XLuaUiManager.Remove("UiBiancaTheatreBlack")
end
self:RemoveStepView()
XLuaUiManager.Open("UiTheatre3EndLoading", settle.EndId)
end, nil, nil, false)
else
self:RemoveStepView()
XLuaUiManager.Open("UiTheatre3EndLoading", settle.EndId)
end
return true
end
--endregion
--region 本地数据相关
function XTheatre3Agency:GetEnterAutoPlayStoryKey()
return string.format("Theatre3EnterAutoPlayStory_%s_%s", XPlayer.Id, self._Model.ActivityData:GetCurActivityId())
end
function XTheatre3Agency:GetEnterAutoPlayStory()
local key = self:GetEnterAutoPlayStoryKey()
return XSaveTool.GetData(key) or false
end
function XTheatre3Agency:SaveEnterAutoPlayStory()
local key = self:GetEnterAutoPlayStoryKey()
local data = XSaveTool.GetData(key) or false
if data then
return
end
XSaveTool.SaveData(key, true)
end
--endregion
return XTheatre3Agency