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