PGRData/Script/matrix/xmanager/XCourseManager.lua

516 lines
19 KiB
Lua
Raw Normal View History

2024-09-01 20:49:41 +00:00
local XExFubenCollegeStudyManager = require("XEntity/XFuben/XExFubenCollegeStudyManager")
local XCourseData = require("XEntity/XCourse/XCourseData")
XCourseManagerCreator = function()
local CourseData = XCourseData.New()
-- 请求协议
local RequesetHandle = {
-- 获得奖励
CourseGetReward = "CourseGetRewardRequest",
-- 结算绩点/放弃当前进度
CourseSaveResult = "CourseSaveResultRequest",
}
local XCourseManager = XExFubenCollegeStudyManager.New(XFubenConfigs.ChapterType.Course)
-- 获取红点缓存键值
local GetReddotKey = function(chapterId)
return string.format("CourseChapterReddotData_%s_%s", XPlayer.Id, chapterId)
end
function XCourseManager.GetCourseData()
return CourseData
end
-- 由于绩点是itemId但数值不存在item里因此手动调用刷新数据
function XCourseManager.GetTipShowItemData()
if XTool.IsTableEmpty(CourseData) then
return XCourseConfig.GetPointItemId()
end
local itemId = XCourseConfig.GetPointItemId()
local item = XDataCenter.ItemManager.GetItem(itemId)
local data = {
Id = itemId,
Count = item ~= nil and tostring(item.Count) or "0"
}
data = XTool.Clone(XGoodsCommonManager.GetGoodsShowParamsByTemplateId(itemId))
data.IsTempItemData = true
data.Count = CourseData:GetTotalPointByStageType(XCourseConfig.SystemType.Lesson)
data.Description = XGoodsCommonManager.GetGoodsDescription(itemId)
data.WorldDesc = XGoodsCommonManager.GetGoodsWorldDesc(itemId)
return data
end
function XCourseManager.FinishFight(settleData)
if settleData.IsWin then
XLuaUiManager.Open("UiCourseSettlement", settleData)
else
XDataCenter.FubenManager.ChallengeLose(settleData)
end
end
--==============================系统相关==============================
-- TimeId判断是否开启-和策划商量后暂时不用
function XCourseManager.IsOpen()
return XCourseManager.CheckIsOpen(XCourseConfig.SystemType.Lesson) or XCourseManager.CheckIsOpen(XCourseConfig.SystemType.Exam)
end
-- TimeId判断是否开启-和策划商量后暂时不用
function XCourseManager.CheckIsOpen(stageType)
local timeId = XCourseConfig.GetActivityTimeId(stageType)
return XFunctionManager.CheckInTimeByTimeId(timeId)
end
function XCourseManager.OpenMain()
XLuaUiManager.Open("UiCourseMain")
end
-- 初始化副本关卡类型
function XCourseManager.InitStageInfo()
local configs = XCourseConfig.GetCourseStage()
local stageInfo = nil
for _, config in pairs(configs) do
stageInfo = XDataCenter.FubenManager.GetStageInfo(config.StageId)
if stageInfo then
stageInfo.Type = XDataCenter.FubenManager.StageType.Course
else
XLog.Error("考级系统找不到配置的关卡id", config.StageId)
end
end
end
--===================================================================
--==============================章节组相关============================
-- 判断章节组是否解锁
function XCourseManager.CheckChapterGroupIsOpen(chapterGroupId)
local prevChapterIds = XCourseConfig.GetChapterGroupPrevChapterIds(chapterGroupId)
for index, chapterId in ipairs(prevChapterIds) do
if not XCourseManager.CheckChapterIsOpen(chapterId) then
return false
end
end
return XPlayer.GetLevel() >= XCourseConfig.GetChapterGroupUnlockLv(chapterGroupId)
end
--===================================================================
--==============================章节相关==============================
-- 读取章节最高进度值Lesson: 绩点 Exam: 星级
function XCourseManager.GetChapterMaxPoint(chapterId)
local stageIds = XCourseConfig.GetCourseChapterStageIdsById(chapterId)
local point = 0
for _, stageId in ipairs(stageIds) do
point = point + XCourseManager.GetStageMaxPoint(stageId)
end
return point
end
-- 获得课程或执照已获得的总星星数
function XCourseManager.GetTotalStarCount(stageType)
local chapterIdList = XCourseConfig.GetChapterIdListByStageType(stageType)
local totalStar = 0
for index, chapterId in ipairs(chapterIdList) do
totalStar = totalStar + self:GetChapterCurStarCount(chapterId)
end
return totalStar
end
-- 读取某课程已获得绩点
function XCourseManager.GetChapterCurPoint(chapterId)
return CourseData:GetChapterTotalPoint(chapterId)
end
-- 获得章节已获得的星星数
function XCourseManager.GetChapterCurStarCount(chapterId)
local stageIds = XCourseConfig.GetCourseChapterStageIdsById(chapterId)
local totalCount = 0
for index, stageId in ipairs(stageIds) do
totalCount = totalCount + XCourseManager.GetStageStarsCount(stageId)
end
return totalCount
end
-- 是否满足某章节解锁需要的总课程绩点
function XCourseManager.IsChapterUnlockPoint(chapterId)
local maxPoint = XCourseManager.GetMaxTotalLessonPoint()
local unlockLessonPoint = XCourseConfig.GetCourseChapterUnlockLessonPoint(chapterId)
return maxPoint >= unlockLessonPoint
end
-- 是否满足某章节解锁需要的前置章节
function XCourseManager.IsChapterUnlockPrevChapter(chapterId, index)
local prevChapterIds = XCourseConfig.GetCourseChapterPrevChapterId(chapterId)
if not index then
for index, chapterId in ipairs(prevChapterIds) do
if not XCourseManager.CheckChapterIsComplete(chapterId) then
return false
end
end
return true
end
local chapterId = prevChapterIds[index]
return XCourseManager.CheckChapterIsComplete(chapterId)
end
-- 判断章节是否解锁
function XCourseManager.CheckChapterIsOpen(chapterId)
return XCourseManager.IsChapterUnlockPrevChapter(chapterId) and
XCourseManager.IsChapterUnlockPoint(chapterId) and
XPlayer.GetLevel() >= XCourseConfig.GetCourseChapterUnlockLv(chapterId)
end
-- 判断章节是否满进度通关
function XCourseManager.CheckChapterIsMaxPointClear(chapterId)
return XCourseManager.GetChapterCurPoint(chapterId) >= XCourseManager.GetChapterMaxPoint(chapterId)
end
-- 判断章节是否通关
function XCourseManager.CheckChapterIsComplete(chapterId)
return CourseData:CheckChapterIsClear(chapterId)
end
-- 判断章节是否满星通关
function XCourseManager.CheckChapterIsFullStar(chapterId)
return CourseData:CheckChapterIsFullStar(chapterId)
end
-- 判断是否为新章节,章节开启但没有数据则为新章节,课程和考级通用
function XCourseManager.CheckIsNewChapter(chapterId)
local chapterData = CourseData:GetChapterData(chapterId)
return XCourseManager.CheckChapterIsOpen(chapterId) and XTool.IsTableEmpty(chapterData)
end
-- 章节是否进行中
function XCourseManager.IsChapterStarting(chapterId)
local chapterData = CourseData:GetChapterData(chapterId)
return not XTool.IsTableEmpty(chapterData)
end
-- 获得下一个解锁的章节Id
function XCourseManager.GetNextUnlockChapterId(curChapterId)
local config = XCourseConfig.GetCourseChapter()
local prevChapterIds
for chapterId in pairs(config) do
prevChapterIds = XCourseConfig.GetCourseChapterPrevChapterId(chapterId)
for _, prevChapterId in ipairs(prevChapterIds) do
if curChapterId == prevChapterId then
return chapterId
end
end
end
end
-- 读取总课程绩点
function XCourseManager.GetTotalLessonPoint()
return CourseData:GetTotalLessonPoint()
end
-- 历史总课程最高分
function XCourseManager.GetMaxTotalLessonPoint()
return CourseData:GetMaxTotalLessonPoint()
end
---- 课程绩点结算奖励弹窗 begin -----
local finishCourseChapterId
local SetFinishCourseChapterId = function(chapterId)
finishCourseChapterId = chapterId
end
function XCourseManager.CheckOpenFinishCourse(closeCb)
if not XTool.IsNumberValid(finishCourseChapterId) then
return
end
local chapterId = finishCourseChapterId
SetFinishCourseChapterId()
XLuaUiManager.Open("UiCourseFinishCourse", chapterId, closeCb)
end
---- 课程绩点结算奖励弹窗 end -----
---- 执照章节通关后弹窗 begin -----
local finishExamChapterId
local SetFinishExamChapterId = function(chapterId)
finishExamChapterId = chapterId
end
function XCourseManager.CheckOpenLiveWell(closeCb)
if not XTool.IsNumberValid(finishExamChapterId) then
return
end
local chapterId = finishExamChapterId
SetFinishExamChapterId()
--XLuaUiManager.Open("UiCourseLiveWell", chapterId, closeCb)
XLuaUiManager.Open("UiCourseFinishCourse", chapterId, closeCb)
end
---- 执照章节通关后弹窗 end -----
--===================================================================
--==============================关卡相关==============================
-- 读取关卡最高进度值
function XCourseManager.GetStageMaxPoint(stageId)
local point = 0
for _, value in ipairs(XCourseConfig.GetCourseStageStarPointById(stageId)) do
point = point + value
end
return point
end
-- 读取关卡当前进度值
function XCourseManager.GetStageCurPoint(stageId)
local point = 0
for index, flag in ipairs(XCourseManager.GetStageStarsFlagMap(stageId)) do
if flag then point = point + XCourseConfig.GetCourseStageStarPointById(stageId)[index] end
end
return point
end
-- 读取关卡当前星级标记
function XCourseManager.GetStageStarsFlagMap(stageId)
-- 按位标记
local flag = CourseData:GetStageStarsFlag(stageId)
local _, starsFlag = XTool.GetStageStarsFlag(flag)
return starsFlag
end
-- 读取关卡当前通关星级数
function XCourseManager.GetStageStarsCount(stageId)
-- 按位标记
local flag = CourseData:GetStageStarsFlag(stageId)
local count, _ = XTool.GetStageStarsFlag(flag)
return count
end
-- 判断关卡是否解锁
function XCourseManager.CheckStageIsOpen(stageId)
local prevStageIds = XCourseConfig.GetCourseStagePrevStageIdById(stageId)
for _, stageId in ipairs(prevStageIds) do
if not XCourseManager.CheckStageIsComplete(stageId) then
return false
end
end
return true
end
-- 判断关卡是否过关
function XCourseManager.CheckStageIsComplete(stageId)
return CourseData:CheckStageIsComplete(stageId)
end
-- 判断关卡是否满星过关
function XCourseManager.CheckStageIsFullStarComplete(stageId)
return CourseData:CheckStageIsFullStarComplete(stageId)
end
--===================================================================
--========================Reward判断相关===========================
-- 判断奖励是否已领取
function XCourseManager.CheckRewardIsDraw(courseRewardId)
return CourseData:CheckRewardIsDraw(courseRewardId)
end
-- 奖励是否可领取
function XCourseManager.CheckRewardCanDraw(courseRewardId, chapterId)
local rewardPoint = XCourseConfig.GetRewardPoint(courseRewardId)
local chapterData = CourseData:GetChapterData(chapterId)
local totalPoint = chapterData and chapterData:GetTotalPoint() or 0
return totalPoint >= rewardPoint
end
-- 某个类型的奖励是否可领取
function XCourseManager.CheckRewardCanDrawByStageType(stageType)
local courseRewardIdList = XCourseConfig.GetCourseRewardIdList(stageType)
local chapterId
for index, courseRewardId in ipairs(courseRewardIdList) do
chapterId = XCourseConfig.GetRewardChapterId(courseRewardId)
if XCourseManager.CheckRewardCanDraw(courseRewardId, chapterId) then
return true
end
end
return false
end
-- 某个章节是否有奖励可领取
function XCourseManager.CheckRewardCanDrawByChapterId(chapterId)
local courseRewardIdList = XCourseConfig.GetRewardIdListByChapterId(chapterId)
for index, courseRewardId in ipairs(courseRewardIdList) do
if XCourseManager.CheckRewardCanDraw(courseRewardId, chapterId)
and not XCourseManager.CheckRewardIsDraw(courseRewardId) then
return true
end
end
return false
end
-- 某个章节的奖励是否全领取过了
function XCourseManager.CheckRewardAllDraw(chapterId)
local courseRewardIdList = XCourseConfig.GetRewardIdListByChapterId(chapterId)
for index, courseRewardId in ipairs(courseRewardIdList) do
if not XCourseManager.CheckRewardIsDraw(courseRewardId) then
return false
end
end
return true
end
-- 某个章节的奖励是否全部可以领取/或者已经领取过了
function XCourseManager.CheckRewardAllCanDraw(chapterId)
local courseRewardIdList = XCourseConfig.GetRewardIdListByChapterId(chapterId)
for _, courseRewardId in ipairs(courseRewardIdList or {}) do
if not XCourseManager.CheckRewardCanDraw(courseRewardId, chapterId) then
return false
end
end
return true
end
--===================================================================
--==============================红点相关==============================
-- 课程页签红点
function XCourseManager.CheckCourseLessonReddot()
for _, chapterId in pairs(XCourseConfig.GetChapterIdListByStageType(XCourseConfig.SystemType.Lesson)) do
if XCourseManager.CheckCourseChapterReddot(chapterId) then return true end
end
return false
end
-- 考级页签红点
function XCourseManager.CheckCourseExamReddot()
for _, chapterId in pairs(XCourseConfig.GetChapterIdListByStageType(XCourseConfig.SystemType.Exam)) do
if XCourseManager.CheckCourseChapterReddot(chapterId) then return true end
end
return false
end
function XCourseManager.CheckCourseChapterReddot(chapterId)
return (not XCourseManager.GetCatchReddotData(chapterId)
and XCourseManager.CheckIsNewChapter(chapterId))
or XCourseManager.CheckChapterRewardReddot(chapterId)
end
function XCourseManager.CheckChapterRewardReddot(chapterId)
local isAllDraw = XDataCenter.CourseManager.CheckRewardAllDraw(chapterId)
local isCanDraw = XDataCenter.CourseManager.CheckRewardCanDrawByChapterId(chapterId)
return isCanDraw and not isAllDraw
end
-- 缓存红点数据
function XCourseManager.SetCatchReddotData(chapterId)
local key = GetReddotKey(chapterId)
XSaveTool.SaveData(key, true)
end
-- 读取红点缓存的数据
function XCourseManager.GetCatchReddotData(chapterId)
local key = GetReddotKey(chapterId)
return XSaveTool.GetData(key)
end
-- 入口红点
function XCourseManager.ExCheckIsShowRedPoint()
if not XFunctionManager.JudgeCanOpen(XFunctionManager.FunctionName.Course) then
return false
end
return XCourseManager.CheckCourseLessonReddot() or XCourseManager.CheckCourseExamReddot()
end
--===================================================================
--==============================事件相关==============================
-- 考级系统数据监听
-- @cb: 事件回调
-- @ui: ui节点
-- @obj: UI对象可为空
function XCourseManager.AddDataUpdataListener(cb, ui, obj)
XEventManager.BindEvent(ui, XEventId.EVENT_COURSE_DATA_NOTIFY, cb, obj)
end
--===================================================================
--============================Protocol相关==============================
-- 数据推送
function XCourseManager.NotifyCourseData(data)
CourseData:UpdateData(data["Data"])
XEventManager.DispatchEvent(XEventId.EVENT_COURSE_DATA_NOTIFY)
end
-- 获得奖励
function XCourseManager.RequestCourseGetReward(rewardIds, successCallback, failCallback)
for _, rewardId in ipairs(rewardIds or {}) do
if CourseData:CheckRewardIsDraw(rewardId) then
XUiManager.TipMsg(XCourseConfig.GetRewardTips(1))
return
end
end
local requestBody = {
RewardIds = rewardIds
}
XNetwork.Call(RequesetHandle.CourseGetReward, requestBody, function(res)
if res.Code ~= XCode.Success then
if failCallback then failCallback() end
XUiManager.TipCode(res.Code)
return
end
XUiManager.OpenUiObtain(res.RewardGoodsList or {})
CourseData:UpdateRewardIds(res.SuccessRewardIds or {})
if successCallback then successCallback() end
XEventManager.DispatchEvent(XEventId.EVENT_COURSE_DATA_NOTIFY)
end)
end
-- 绩点章节/放弃当前进度
function XCourseManager.RequestCourseSaveResult(successCallback, failCallback, chapterId)
XNetwork.Call(RequesetHandle.CourseSaveResult, nil, function(res)
if res.Code ~= XCode.Success then
if failCallback then failCallback() end
XUiManager.TipCode(res.Code)
return
end
local curIsClear = XCourseManager.CheckChapterIsComplete(chapterId)
CourseData:UpdateChapterDataList({res.ChapterData})
CourseData:UpdateStageDataDict({res.StageData})
CourseData:SetTotalLessonPoint(res.TotalLessonPoint)
CourseData:SetMaxTotalLessonPoint(res.MaxTotalLessonPoint)
if curIsClear ~= XCourseManager.CheckChapterIsComplete(chapterId) then
local stageType = XCourseConfig.GetChapterStageType(chapterId)
if stageType == XCourseConfig.SystemType.Lesson then
SetFinishCourseChapterId(chapterId)
else
SetFinishExamChapterId(chapterId)
end
end
if successCallback then successCallback() end
end)
end
--===================================================================
--============================副本入口扩展==============================
function XCourseManager:ExOpenMainUi()
if XFunctionManager.DetectionFunction(XFunctionManager.FunctionName.Course) then
XCourseManager.OpenMain()
end
end
--===================================================================
return XCourseManager
end
XRpc.NotifyCourseData = function(data)
XDataCenter.CourseManager.NotifyCourseData(data)
end