PGRData/Script/matrix/xmanager/XFubenZhouMuManager.lua

231 lines
8.2 KiB
Lua
Raw Normal View History

--- 一个主线或外篇章节对应一个周目(ZhouMuId)把周目ZhouMuId当成一个模式第几周目对应周目的第几个周目章节(ZhouMuChapterId)
XFubenZhouMuManagerCreator = function()
local XFubenZhouMuManager = {}
---
--- 实现FubenManager中的接口初始化StageInfo
function XFubenZhouMuManager.InitStageInfo()
local zhouMuChapterCfg = XFubenZhouMuConfigs.GetAllZhouMuChapterCfg()
for _, data in pairs(zhouMuChapterCfg) do
for i,stageId in ipairs(data.StageId) do
local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId)
stageInfo.Type = XDataCenter.FubenManager.StageType.ZhouMu
stageInfo.OrderId = i
end
end
end
---
--- 根据'zhouMuId'检查当前章节处于第几周目
--- 如果没有解锁或没有配置周目挑战则返回 0
---@param zhouMuId number
---@return number
function XFubenZhouMuManager.GetZhouMuNumber(zhouMuId)
if zhouMuId == 0 or zhouMuId == nil then
return 0
end
local zhouMuChapters = XFubenZhouMuConfigs.GetZhouMuChapters(zhouMuId)
for i = #zhouMuChapters, 1, -1 do
local onThis = true -- 默认处于当前周目有任何一个条件不满足时改为false
-- 检查解锁条件
local conditions = XFubenZhouMuConfigs.GetZhouMuChapterCondition(zhouMuChapters[i])
for _, v in pairs(conditions) do
if not XConditionManager.CheckCondition(v) then
onThis = false
end
end
if onThis then
return i
end
end
return 0
end
---
--- 获取zhouMuId周目完成的挑战任务数与总数
---@param zhouMuId number
---@return number
---@return number
function XFubenZhouMuManager.GetZhouMuTaskProgress(zhouMuId)
local taskIds = XFubenZhouMuConfigs.GetZhouMuTasks(zhouMuId)
local totalTaskNum = #taskIds
local zhouMuNum = 0
local taskList = XDataCenter.TaskManager.GetZhouMuFullTaskList(XDataCenter.TaskManager.TaskType.ZhouMu)
if taskList == nil or next(taskList) == nil then
return zhouMuNum, totalTaskNum
end
local taskDic = {}
for _,v in pairs(taskList) do
taskDic[v.Id] = v
end
for _, id in pairs(taskIds) do
if taskDic[id].State == XDataCenter.TaskManager.TaskState.Achieved
or taskDic[id].State == XDataCenter.TaskManager.TaskState.Finish then
zhouMuNum = zhouMuNum + 1
end
end
return zhouMuNum, totalTaskNum
end
---
--- 检查zhouMuId周目的挑战任务是否全部领取奖励
---@param zhouMuId number
---@return boolean
function XFubenZhouMuManager.ZhouMuTaskIsAllFinish(zhouMuId)
local result = true
local taskIds = XFubenZhouMuConfigs.GetZhouMuTasks(zhouMuId)
local taskList = XDataCenter.TaskManager.GetZhouMuFullTaskList(XDataCenter.TaskManager.TaskType.ZhouMu)
if taskList == nil or next(taskList) == nil then
result = false
return result
end
local taskDic = {}
for _,v in pairs(taskList) do
taskDic[v.Id] = v
end
for _, id in pairs(taskIds) do
if taskDic[id].State ~= XDataCenter.TaskManager.TaskState.Finish then
result = false
end
end
return result
end
---
--- 检查'zhouMuId'周目是否有奖励可以领取
---@param zhouMuId number
---@return boolean
function XFubenZhouMuManager.HasTaskReward(zhouMuId)
local haveTask = false
if zhouMuId == nil then
return haveTask
end
local taskIds = XFubenZhouMuConfigs.GetZhouMuTasks(zhouMuId)
local taskList = XDataCenter.TaskManager.GetZhouMuFullTaskList(XDataCenter.TaskManager.TaskType.ZhouMu)
if taskList == nil or next(taskList) == nil then
return haveTask
end
local taskDic = {}
for _,v in pairs(taskList) do
taskDic[v.Id] = v
end
for _, id in pairs(taskIds) do
if taskDic[id].State == XDataCenter.TaskManager.TaskState.Achieved then
haveTask = true
end
end
return haveTask
end
---
--- 根据'zhouMuId'获取周目的当前周目章节Id
---@param zhouMuId number
---@return number
function XFubenZhouMuManager.GetZhouMuChapterIdByZhouMuId(zhouMuId)
-- 当前周目所在的周目章节数
local zhouMuNumber = XFubenZhouMuManager.GetZhouMuNumber(zhouMuId)
if zhouMuNumber == 0 then
return {}
end
-- 用周目Id得到所有周目章节Id
local zhouMuChapters = XFubenZhouMuConfigs.GetZhouMuChapters(zhouMuId)
return zhouMuChapters[zhouMuNumber]
end
---
--- 根据'ChapterMainId'获取周目的当前周目章节数据
--- 'isExtra'true为外篇false为主线
---@param ChapterMainId number
---@param isExtra boolean
---@return table
function XFubenZhouMuManager.GetZhouMuChapterData(chapterMainId, isExtra)
-- 得到该章节的周目Id
local zhouMuId
if isExtra then
zhouMuId = XFubenExtraChapterConfigs.GetZhouMuId(chapterMainId)
else
zhouMuId = XFubenMainLineConfigs.GetZhouMuId(chapterMainId)
end
-- 当前周目所在的周目章节数
local zhouMuNumber = XFubenZhouMuManager.GetZhouMuNumber(zhouMuId)
if zhouMuNumber == 0 then
return {}
end
-- 用周目Id得到所有周目章节Id
local zhouMuChapters = XFubenZhouMuConfigs.GetZhouMuChapters(zhouMuId)
-- 用当前周目章节的Id得到章节数据
local config = XFubenZhouMuConfigs.GetZhouMuChapterCfg(zhouMuChapters[zhouMuNumber])
return config
end
---
--- 判断是否需要播放弹窗动画,以及要播放怎样的弹窗动画
--- 'zhouMuId'为当前的周目Id
--- 'zhouMuChapterId'为当前的周目章节Id
--- 'oriLastStageIsPass'是一开始保存的当前章节最后一关是否通关的标志
--- 如果在开启界面的时候对比发现最后一关的通关状态与'oriLastStageIsPass'不同,则说明第一次通关了最后一关
---@param zhouMuId number
---@param zhouMuChapterId number
---@param oriLastStageIsPass boolean
---@return number
function XFubenZhouMuManager.CheckPlayTipAnima(zhouMuId, zhouMuChapterId, oriLastStageIsPass)
if oriLastStageIsPass then
-- 之前通关过当前周目章节的最后一关,不播放动画
return XFubenZhouMuConfigs.EnumZhouMuTipAnima.None
else
local zhouMuHadIn = XSaveTool.GetData(string.format("%s%s", "ZhouMuHadIn", XPlayer.Id))
if not zhouMuHadIn then
-- 第一次进入周目模式
XSaveTool.SaveData(string.format("%s%s", "ZhouMuHadIn", XPlayer.Id), true)
return XFubenZhouMuConfigs.EnumZhouMuTipAnima.PlayStart
end
local lastStage = XFubenZhouMuConfigs.GetZhouMuChapterLastStage(zhouMuChapterId)
local isPassLastStage = XDataCenter.FubenManager.CheckStageIsPass(lastStage)
if isPassLastStage then
-- 通关了最后一关
local isLastZhouMuChapter
local lastZhouMuChapter = XFubenZhouMuConfigs.GetZhouMuLastChapter(zhouMuId)
isLastZhouMuChapter = (lastZhouMuChapter == zhouMuChapterId)
if isLastZhouMuChapter then
-- 最后一个周目章节,只播放结束动画
return XFubenZhouMuConfigs.EnumZhouMuTipAnima.PlayEnd
else
-- 不是最后的周目章节,先播放结束动画,然后播放开启新周目章节的动画
return XFubenZhouMuConfigs.EnumZhouMuTipAnima.PlayEndStart
end
else
return XFubenZhouMuConfigs.EnumZhouMuTipAnima.None
end
end
end
return XFubenZhouMuManager
end