PGRData/Script/matrix/xmanager/XTrialManager.lua
2024-09-01 22:49:41 +02:00

502 lines
No EOL
16 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.

local XExFubenSimulationChallengeManager = require("XEntity/XFuben/XExFubenSimulationChallengeManager")
XTrialManagerCreator = function()
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
------------------副本入口扩展 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