PGRData/Script/matrix/xmanager/XTrialManager.lua

502 lines
16 KiB
Lua
Raw Normal View History

2024-09-01 20:49:41 +00:00
local XExFubenSimulationChallengeManager = require("XEntity/XFuben/XExFubenSimulationChallengeManager")
XTrialManagerCreator = function()
2024-09-01 20:49:41 +00:00
local XTrialManager = XExFubenSimulationChallengeManager.New(XFubenConfigs.ChapterType.Trial)
local TrialInfos = nil
local PreFinishTrial = {}
local IsTrialChanllenge = false
XTrialManager.TrialTypeCfg = {
TrialFor = 1,
TrialBackEnd = 2
}
--关卡打开,玩家点过后红点消失。
XTrialManager.UnLockRed = false
-- Rpc请求
-- 领取关卡奖励
function XTrialManager.OnTrialPassRewardRequest(trialId, cb)
if not trialId then
return
end
XTrialManager.TrialRewardId = trialId
XNetwork.Call(
"TrialPassRewardRequest",
{ TrialId = trialId },
function(res)
cb = cb or function()
end
if res.Code == XCode.Success then
if not TrialInfos then
TrialInfos = {}
TrialInfos.rewardRecord = {}
end
TrialInfos.rewardRecord[trialId] = trialId
local rewardGoodsList = res.RewardGoodsList
cb(rewardGoodsList)
else
XUiManager.TipCode(res.Code)
end
end
)
end
-- 领取类型奖励
function XTrialManager.OnTrialTypeRewardRequest(trialType, cb)
if not trialType then
return
end
XNetwork.Call(
"TrialTypeRewardRequest",
{ Type = trialType },
function(res)
cb = cb or function()
end
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
if not TrialInfos then
TrialInfos = {}
TrialInfos.typeRewardRecord = {}
end
TrialInfos.typeRewardRecord[trialType] = trialType
local rewardGoodsList = res.RewardGoodsList
cb(rewardGoodsList)
end
)
end
-- 通知更新角色信息
function XTrialManager.OnTrialInfoUpdate(response)
if response then --有通关
TrialInfos = {}
TrialInfos.finishTrial = response.FinishTrial
TrialInfos.rewardRecord = {}
XTool.LoopMap(response.RewardRecord, function(_, v)
TrialInfos.rewardRecord[v] = v
end)
TrialInfos.typeRewardRecord = response.TypeRewardRecord
PreFinishTrial = TrialInfos.finishTrial
else
TrialInfos = nil
end
end
-- 判断当前完成到前段还是后段关卡,前段返回1后段返回2。
function XTrialManager.FinishTrialType()
if (not TrialInfos) or (not TrialInfos.finishTrial) then
return XDataCenter.TrialManager.TrialTypeCfg.TrialFor
end
local finishtrial = TrialInfos.finishTrial
local forcfgdata = XTrialConfigs.GetForTotalData(XDataCenter.TrialManager.TrialTypeCfg.TrialFor)
for _, v in pairs(forcfgdata) do
if finishtrial[v.Id] ~= v.Id then --没有在里面,前段没有完成。
return XDataCenter.TrialManager.TrialTypeCfg.TrialFor
end
end
return XDataCenter.TrialManager.TrialTypeCfg.TrialBackEnd
end
-- 判断当前关卡是否已经领取了奖励levelId-->TrialChallenge表Id,false:没有 true领了
function XTrialManager.TrialRewardGeted(trialId)
if (not TrialInfos) or (not TrialInfos.rewardRecord) then
return false
end
local rewardRecord = TrialInfos.rewardRecord
return rewardRecord[trialId] == trialId
end
-- 判断当前关卡是否完成,trialId-->TrialChallenge表Id,false:没有 true过了
function XTrialManager.TrialLevelFinished(trialId)
if (not TrialInfos) or (not TrialInfos.finishTrial) then
return false
end
local finishtrial = TrialInfos.finishTrial
return finishtrial[trialId] == trialId
end
-- 判断类型奖励是否领过。false:没有 true:领过(总)
function XTrialManager.TypeRewardGeted()
return TrialInfos and TrialInfos.typeRewardRecord
end
-- 判断当前类型奖励是否已经领了。false:没有 true:领过
function XTrialManager.TypeRewardByTrialtype(trialtype)
if not XTrialManager.TypeRewardGeted() then
return false
end
local typeRewardRecord = TrialInfos.typeRewardRecord
return typeRewardRecord[trialtype] == trialtype
end
-- 判断当前关卡是否是否解锁,trialId-->TrialChallenge表Id,false:没有解锁true:解锁
function XTrialManager.TrialLevelLock(trialId)
local trialcfg = XTrialConfigs.GetForDataByLevel(trialId) or
XTrialConfigs.GetBackEndDataByLevel(trialId - XTrialConfigs.GetForTotalLength())
local level = XPlayer.Level or 0
if not trialcfg or trialcfg.Unlocklevel > level then
return false
end
return trialcfg.PreId == 0 or XDataCenter.TrialManager.TrialLevelFinished(trialcfg.PreId)
end
-- 打过关卡
function XTrialManager.OnSettleTrial()
local res = XDataCenter.FubenManager.FubenSettleResult
if not res or not res.Settle then
return
end
local settle = res.Settle
local isWin = settle.IsWin and res.Code == 0
if not isWin then
return
end
local StageId = settle.StageId
local forcfgdata = XTrialConfigs.GetForTotalData()
for _, v in pairs(forcfgdata) do
if v.StageId == StageId then
XDataCenter.TrialManager.TrialLevelPassState(v.Id)
end
end
local backendcfgdata = XTrialConfigs.GetBackEndTotalData()
for _, v in pairs(backendcfgdata) do
if v.StageId == StageId then
XDataCenter.TrialManager.TrialLevelPassState(v.Id)
end
end
end
-- 关卡通关改状态,trialId-->TrialChallenge表Id,stageId-->关卡Id
function XTrialManager.TrialLevelPassState(trialId, stageId)
if not TrialInfos then
TrialInfos = {}
TrialInfos.finishTrial = {}
end
XDataCenter.TrialManager.SetTrialFinishJustState(true)
TrialInfos.finishTrial[trialId] = trialId
XEventManager.DispatchEvent(XEventId.EVENT_TRIAL_LEVEL_FINISH, stageId)
end
-- 判断前段是否刚好完成
function XTrialManager.ForTrialFinishJust()
if XDataCenter.TrialManager.FinishTrialType() ~= XDataCenter.TrialManager.TrialTypeCfg.TrialBackEnd then
return false
end
return XTrialConfigs.GetForTotalLength() == #TrialInfos.finishTrial --刚好完成前段
end
-- 判断后段是否刚好完成
function XTrialManager.BackEndTrialFinishJust()
if XDataCenter.TrialManager.FinishTrialType() ~= XDataCenter.TrialManager.TrialTypeCfg.TrialBackEnd then
return false
end
local cfg = XTrialConfigs.GetBackEndTotalData()
for _, v in pairs(cfg) do
if not TrialInfos.finishTrial[v.Id] then
return false
end
end
return true
end
-- 是否刚通关
function XTrialManager.IsTrialFinishJust()
return IsTrialChanllenge
end
-- 设置是否刚通关
function XTrialManager.SetTrialFinishJustState(state)
IsTrialChanllenge = state
end
-- 判断是否要打开入口 true:打开 false:关闭
--条件-->所有关卡打过&&奖励都领完。
function XTrialManager.EntranceOpen()
-- 判断类型奖励
for _, v in pairs(XDataCenter.TrialManager.TrialTypeCfg) do
if not XDataCenter.TrialManager.TypeRewardByTrialtype(v) and XDataCenter.TrialManager.TrialTypeRewardGeted(v) then
return true
end
end
-- 判断关卡是否通过而且奖励是否已经领取
local cfg = XTrialConfigs.GetForTotalData()
for _, v in pairs(cfg) do
if not XDataCenter.TrialManager.TrialLevelFinished(v.Id) or not XDataCenter.TrialManager.TrialRewardGeted(v.Id) then
return true
end
end
cfg = XTrialConfigs.GetBackEndTotalData()
for _, v in pairs(cfg) do
if not XDataCenter.TrialManager.TrialLevelFinished(v.Id) or not XDataCenter.TrialManager.TrialRewardGeted(v.Id) then
return true
end
end
return false
end
-- 红点相关
-- 判断该关卡奖励是否可领,trialId-->TrialChallenge表Id
function XTrialManager.TrialLevelRewardGetSignRedPoint(trialId)
if XDataCenter.TrialManager.TrialLevelFinished(trialId) and not XDataCenter.TrialManager.TrialRewardGeted(trialId) then
return true
end
return false
end
-- 判断该关卡是否刚刚解锁,trialId-->TrialChallenge表Id。关卡打完角色等级变化都需要判断一下。
function XTrialManager.TrialLevelLockSignRedPoint()
local playerLevel = XPlayer.Level or 1
-- 通关的时候
local finishTrial = TrialInfos.finishTrial
local trialId = -1
for _, v in pairs(finishTrial) do
if not PreFinishTrial[v] then
trialId = v
PreFinishTrial[v] = trialId
end
end
if not XDataCenter.TrialManager.PreLevel or XDataCenter.TrialManager.PreLevel < playerLevel then
XDataCenter.TrialManager.PreLevel = playerLevel
XDataCenter.TrialManager.UnLockRed = false
end
if XDataCenter.TrialManager.UnLockRed then
return false
end
if trialId ~= -1 then
local cfg = XTrialConfigs.GetForDataByLevel(trialId) or XTrialConfigs.GetBackEndDataByLevel(trialId - XTrialConfigs.GetForTotalLength())
if cfg and cfg.Unlocklevel <= playerLevel then
return true
end
end
-- 等级
local finishTrial2 = TrialInfos.finishTrial
local cfg = XTrialConfigs.GetForTotalData()
if XDataCenter.TrialManager.FinishTrialType() == XDataCenter.TrialManager.TrialTypeCfg.TrialBackEnd then
cfg = XTrialConfigs.GetBackEndTotalData()
end
for _, v in pairs(cfg) do
if not finishTrial2[v.Id] then
if v.Unlocklevel <= playerLevel then
return true
end
end
end
return false
end
--判断类型奖励是否可领
function XTrialManager.TrialTypeRewardRedPoint()
for _, v in pairs(XDataCenter.TrialManager.TrialTypeCfg) do
if XDataCenter.TrialManager.TypeRewardByTrialtype(v) and not XDataCenter.TrialManager.TrialTypeRewardGeted(v) then
return true
end
end
return false
end
-- 前段打到第几关
function XTrialManager.TrialForFinishLevel()
local cfg = XTrialConfigs.GetForTotalData()
for _, v in pairs(cfg) do
if v then
if not XDataCenter.TrialManager.TrialLevelFinished(v.Id) then
return v.Id - 1
end
end
end
return XTrialConfigs.GetForTotalLength()
end
-- 后段打到第几关
function XTrialManager.TrialBackEndFinishLevel()
local cfg = XTrialConfigs.GetBackEndTotalData()
for _, v in pairs(cfg) do
if v then
if not XDataCenter.TrialManager.TrialLevelFinished(v.Id) then
return v.Id - XTrialConfigs.GetForTotalLength() - 1
end
end
end
return XTrialConfigs.GetBackEndTotalLength()
end
-- 是否所有关卡打完
function XTrialManager.IsAllLevelFinish()
local cfg = XTrialConfigs.GetForTotalData() or {}
for _, v in pairs(cfg) do
if v then
if not XDataCenter.TrialManager.TrialLevelFinished(v.Id) then
return false
end
end
end
cfg = XTrialConfigs.GetBackEndTotalData() or {}
for _, v in pairs(cfg) do
if v then
if not XDataCenter.TrialManager.TrialLevelFinished(v.Id) then
return false
end
end
end
return true
end
-- 前段奖励是否领完
function XTrialManager.TrialRewardGetedFinish()
local cfg = XTrialConfigs.GetForTotalData()
for _, v in pairs(cfg) do
if v then
if not XDataCenter.TrialManager.TrialRewardGeted(v.Id) then
return false
end
end
end
return true
end
-- 后段奖励是否领完
function XTrialManager.TrialRewardGetedBackEndFinish()
local cfg = XTrialConfigs.GetBackEndTotalData()
for _, v in pairs(cfg) do
if v then
if not XDataCenter.TrialManager.TrialRewardGeted(v.Id) then
return false
end
end
end
return true
end
-- 判断前段奖励领取是不是最后一关
function XTrialManager.TrialRewardIdIsForEnd()
local cfg = XTrialConfigs.GetForTotalData()
if not XTrialManager.TrialRewardId or not cfg or not cfg[#cfg] or XTrialManager.TrialRewardId ~= cfg[#cfg].Id then
return false
end
return true
end
-- 前段奖励领了多少
function XTrialManager.TrialRewardGetedForCount()
local cfg = XTrialConfigs.GetForTotalData()
local count = 0
for _, v in pairs(cfg) do
if v then
if XDataCenter.TrialManager.TrialRewardGeted(v.Id) then
count = count + 1
end
end
end
return count
end
-- 后段奖励领了多少
function XTrialManager.TrialRewardGetedBackEndCount()
local cfg = XTrialConfigs.GetBackEndTotalData()
local count = 0
for _, v in pairs(cfg) do
if v then
if XDataCenter.TrialManager.TrialRewardGeted(v.Id) then
count = count + 1
end
end
end
return count
end
-- 关卡奖励领取完判断
function XTrialManager.TrialTypeRewardGeted(trialtype)
if trialtype == XDataCenter.TrialManager.TrialTypeCfg.TrialFor then
return XDataCenter.TrialManager.TrialRewardGetedFinish()
end
return XDataCenter.TrialManager.TrialRewardGetedBackEndFinish()
end
XEventManager.AddEventListener(XEventId.EVENT_FUBEN_SETTLE_REWARD, XTrialManager.OnSettleTrial, XTrialManager)
function XTrialManager.InitStageInfo()
local forcfgdata = XTrialConfigs.GetForTotalData(XDataCenter.TrialManager.TrialTypeCfg.TrialFor)
for _, v in pairs(forcfgdata) do
local stageInfo = XDataCenter.FubenManager.GetStageInfo(v.StageId)
stageInfo.Type = XDataCenter.FubenManager.StageType.Trial
end
end
2024-09-01 20:49:41 +00:00
------------------副本入口扩展 start-------------------------
function XTrialManager:ExGetFunctionNameType()
return XFunctionManager.FunctionName.FubenChallengeTrial
end
-- 获取进度提示
function XTrialManager:ExGetProgressTip()
local strProgress = ""
if not self:ExGetIsLocked() then
if XTrialManager.FinishTrialType() == XTrialManager.TrialTypeCfg.TrialBackEnd and XTrialManager.TrialRewardGetedFinish() then
strProgress = CS.XTextManager.GetText("TrialBackEndPro", XTrialManager:TrialBackEndFinishLevel(), XTrialConfigs.GetBackEndTotalLength())
else
strProgress = CS.XTextManager.GetText("TrialForPro", XTrialManager:TrialForFinishLevel(), XTrialConfigs.GetForTotalLength())
end
end
return strProgress
end
function XTrialManager:ExOpenMainUi()
if XFunctionManager.DetectionFunction(XFunctionManager.FunctionName.FubenChallengeTrial) then
XLuaUiManager.OpenWithCallback("UiTrial")
end
end
------------------副本入口扩展 end-------------------------
return XTrialManager
end
-- 记录玩家---完成的关卡、奖励记录、类型奖励记录
-- 完成的关卡-->对应TrialChallenge表的id
-- 奖励记录-->对应TrialTypeReward表的id
-- 类型奖励记录-->1:前段2后段。
XRpc.NotifyTrialData = function(response)
XDataCenter.TrialManager.OnTrialInfoUpdate(response)
end