forked from endernon/PGRData
502 lines
No EOL
16 KiB
Lua
502 lines
No EOL
16 KiB
Lua
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 |