PGRData/Script/matrix/xmodule/xtheatre3/XTheatre3Agency.lua

447 lines
14 KiB
Lua
Raw Normal View History

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