PGRData/Script/matrix/xmanager/XFubenZhouMuManager.lua

231 lines
No EOL
8.2 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.

--- 一个主线或外篇章节对应一个周目(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