forked from endernon/PGRData
1034 lines
No EOL
37 KiB
Lua
1034 lines
No EOL
37 KiB
Lua
local XExFubenSimulationChallengeManager = require("XEntity/XFuben/XExFubenSimulationChallengeManager")
|
||
|
||
XFubenBossSingleManagerCreator = function()
|
||
---@class XFubenBossSingleManager:XExFubenSimulationChallengeManager
|
||
local XFubenBossSingleManager = XExFubenSimulationChallengeManager.New(XFubenConfigs.ChapterType.BossSingle)
|
||
|
||
-- 重置倒计时
|
||
local RESET_COUNT_DOWN_NAME = "SingleBossReset"
|
||
|
||
-- templates
|
||
local BossSingleGradeCfg = {}
|
||
local RankRewardCfg = {} -- key = levelType, value = {cfg}
|
||
local ScoreRewardCfg = {} -- key = levelType, value = {cfg}
|
||
local BossSectionCfg = {}
|
||
local BossChapterTemplates = {}
|
||
local BossStageCfg = {}
|
||
local BossSectionInfo = {}
|
||
local BossSingleTrialGradeCfg = {}
|
||
|
||
local TrialStageInfo = {} -- key = TrialStageID, value = {TrialStageID, Score}
|
||
local TotalTrialSectionScoreInfo = {}
|
||
local TrialPreStageInfo = {}
|
||
local FubenBossSingleData = {}
|
||
local SelfRankData = {}
|
||
local BossList = {}
|
||
local ActivityNo = 0
|
||
local EnterBossInfo = {}
|
||
|
||
local RewardGroupId = 0
|
||
|
||
local LastSyncServerTimes = {}
|
||
local RankData = {}
|
||
local RankRole = {}
|
||
|
||
local IsBossSingleTrial = false
|
||
local NeedResetFlag = false
|
||
|
||
local METHOD_NAME = {
|
||
GetSelfRank = "BossSingleRankInfoRequest",
|
||
GetRankData = "BossSingleGetRankRequest",
|
||
GetReward = "BossSingleGetRewardRequest",
|
||
AutoFight = "BossSingleAutoFightRequest",
|
||
SaveScore = "BossSingleSaveScoreRequest",
|
||
ChooseLevelType = "BossSingleSelectLevelTypeRequest",
|
||
}
|
||
|
||
local SYNC_SERVER_BOSS_SECOND = 20
|
||
XFubenBossSingleManager.MAX_RANK_COUNT = CS.XGame.ClientConfig:GetInt("BossSingleMaxRanCount")
|
||
|
||
function XFubenBossSingleManager.Init()
|
||
BossSingleGradeCfg = XFubenBossSingleConfigs.GetBossSingleGradeCfg()
|
||
BossSectionCfg = XFubenBossSingleConfigs.GetBossSectionCfg()
|
||
BossSectionInfo = XFubenBossSingleConfigs.GetBossSectionInfo()
|
||
BossStageCfg = XFubenBossSingleConfigs.GetBossStageCfg()
|
||
RankRole = XFubenBossSingleConfigs.GetRankRole()
|
||
ScoreRewardCfg = XFubenBossSingleConfigs.GetScoreRewardCfg()
|
||
RankRewardCfg = XFubenBossSingleConfigs.GetRankRewardCfg()
|
||
BossSingleTrialGradeCfg = XFubenBossSingleConfigs.GetBossSingleTrialGradeCfg()
|
||
end
|
||
|
||
function XFubenBossSingleManager.InitStageInfo()
|
||
for _, sectionCfg in pairs(BossSectionCfg) do
|
||
for i = 1, #sectionCfg.StageId do
|
||
local bossStageCfg = BossStageCfg[sectionCfg.StageId[i]]
|
||
local stageInfo = XDataCenter.FubenManager.GetStageInfo(bossStageCfg.StageId)
|
||
stageInfo.BossSectionId = sectionCfg.Id
|
||
stageInfo.Type = XDataCenter.FubenManager.StageType.BossSingle
|
||
end
|
||
end
|
||
end
|
||
|
||
function XFubenBossSingleManager.SetBossSingleTrial(flag)
|
||
IsBossSingleTrial = flag
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetIsBossSingleTrial()
|
||
return IsBossSingleTrial
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetResetCountDownName()
|
||
return RESET_COUNT_DOWN_NAME
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetActivityNo()
|
||
return ActivityNo
|
||
end
|
||
|
||
function XFubenBossSingleManager.SetEnterBossInfo(bossId, bossLevel)
|
||
EnterBossInfo.BossId = bossId
|
||
EnterBossInfo.BossLevel = bossLevel
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetEnterBossInfo()
|
||
return EnterBossInfo
|
||
end
|
||
|
||
-- function XFubenBossSingleManager.FinishFight(settle)
|
||
-- XDataCenter.FubenManager.ChallengeWin(settle)
|
||
-- end
|
||
function XFubenBossSingleManager.GetBossSingleTemplates()
|
||
return BossChapterTemplates
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetRankLevelCfg()
|
||
local cfgs = {}
|
||
for _, cfg in ipairs(BossSingleGradeCfg) do
|
||
table.insert(cfgs, cfg)
|
||
end
|
||
|
||
table.sort(cfgs, function(a, b)
|
||
return a.LevelType < b.LevelType
|
||
end)
|
||
|
||
return cfgs
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetBossSingleTrialGradeCfg()
|
||
return BossSingleTrialGradeCfg
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetRankLevelCfgByType(type)
|
||
return BossSingleGradeCfg[type]
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetRankLevelCfgs()
|
||
return BossSingleGradeCfg
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetRankIsOpenByType(type)
|
||
local timeId = BossSingleGradeCfg[type].RankTimeId
|
||
|
||
return XFunctionManager.CheckInTimeByTimeId(timeId, true)
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetRankRewardCfg(levelType)
|
||
local rewardCfg = {}
|
||
local rankRewardCfg = RankRewardCfg[levelType]
|
||
|
||
for _, config in pairs(rankRewardCfg) do
|
||
if config.RewardGroupId == RewardGroupId then
|
||
rewardCfg[#rewardCfg + 1] = config
|
||
end
|
||
end
|
||
|
||
return rewardCfg
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetScoreRewardCfg(levelType)
|
||
local scoreRewardCfg = {}
|
||
|
||
if ScoreRewardCfg[levelType] then
|
||
for i, config in pairs(ScoreRewardCfg[levelType]) do
|
||
if config.RewardGroupId == RewardGroupId then
|
||
scoreRewardCfg[#scoreRewardCfg + 1] = config
|
||
end
|
||
end
|
||
end
|
||
|
||
return scoreRewardCfg
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetBossSectionCfg(bossId)
|
||
return BossSectionCfg[bossId]
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetBossSectionInfo(bossId)
|
||
return BossSectionInfo[bossId]
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetBossStageCfg(bossStageId)
|
||
return BossStageCfg[bossStageId]
|
||
end
|
||
|
||
function XFubenBossSingleManager.RefreshBossSingleData(bossSingleData)
|
||
if not bossSingleData then return end
|
||
|
||
local oldActivityId = FubenBossSingleData.ActivityNo
|
||
FubenBossSingleData = bossSingleData
|
||
BossList = bossSingleData.BossList
|
||
XCountDown.CreateTimer(RESET_COUNT_DOWN_NAME, FubenBossSingleData.RemainTime)
|
||
FubenBossSingleData.EndTime = XTime.GetServerNowTimestamp() + FubenBossSingleData.RemainTime -- 结束时间是服务器刷新下发的,这里主动计算出结束的时间戳,方便倒计时计算
|
||
|
||
local newActivityId = bossSingleData.ActivityNo
|
||
ActivityNo = newActivityId
|
||
RewardGroupId = bossSingleData.RewardGroupId or 0
|
||
if oldActivityId and newActivityId and oldActivityId ~= newActivityId then
|
||
XFubenBossSingleManager.SetNeedReset(true)
|
||
XEventManager.DispatchEvent(XEventId.EVENT_FUBEN_SINGLE_BOSS_RESET)
|
||
end
|
||
|
||
XFubenBossSingleManager.SetTrialStageInfo(bossSingleData.TrialStageInfoList)
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetCharacterChallengeCount(charId)
|
||
return FubenBossSingleData.CharacterPoints[charId] or 0
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetBoosSingleData()
|
||
return FubenBossSingleData
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetProposedLevel(stageId)
|
||
local levelType = FubenBossSingleData.LevelType
|
||
local bossSingleGradeCfg = BossSingleGradeCfg[levelType]
|
||
return XDataCenter.FubenManager.GetStageProposedLevel(stageId, bossSingleGradeCfg.MaxPlayerLevel)
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetPreFullScore(stageId)
|
||
local levelType = FubenBossSingleData.LevelType
|
||
local cfg = BossStageCfg[stageId]
|
||
if not cfg then
|
||
return 0
|
||
end
|
||
|
||
local fullScore = cfg.PreFullScore[levelType]
|
||
if not fullScore then
|
||
return 0
|
||
end
|
||
|
||
return fullScore
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetNpcScores(stageId, bossLeftHp, bossMaxHp)
|
||
local levelType = FubenBossSingleData.LevelType
|
||
local cfg = RankRole[stageId]
|
||
if not cfg then
|
||
XLog.ErrorTableDataNotFound("XFubenBossSingleManager.GetNpcScores",
|
||
"cfg", "Share/Fuben/BossSingle/BossSingleScoreRule.tab", "stageId", tostring(stageId))
|
||
return 0
|
||
end
|
||
local bossLoseHpScore = 0
|
||
if bossMaxHp > 0 then
|
||
bossLoseHpScore = math.floor((bossMaxHp - bossLeftHp) / bossMaxHp / cfg.BossLoseHp[levelType] * cfg.BossLoseHpScore[levelType])
|
||
end
|
||
return bossLoseHpScore
|
||
end
|
||
|
||
|
||
-- v1.31【囚笼】当前boss相关数据
|
||
--=========================================================================
|
||
-- 获取某个Boss的所有stageId配置
|
||
function XFubenBossSingleManager.GetBossStageList(bossId)
|
||
local bossSectionCfg = XFubenBossSingleManager.GetBossSectionCfg(bossId)
|
||
return bossSectionCfg.StageId or {}
|
||
end
|
||
|
||
-- 获取某关当次讨伐值
|
||
function XFubenBossSingleManager.GetBossStageScore(stageId)
|
||
local stageData = XDataCenter.FubenManager.GetStageData(stageId)
|
||
return stageData and stageData.Score or 0
|
||
end
|
||
|
||
-- 根据stageID获取bossId
|
||
function XFubenBossSingleManager.GetBossIdByStageId(targetStageId)
|
||
for bossId, _ in pairs(BossSectionCfg) do
|
||
for _, stageId in ipairs(XFubenBossSingleManager.GetBossStageList(bossId)) do
|
||
if stageId == targetStageId then
|
||
return bossId
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
-- 获取某个Boss讨伐值上限
|
||
function XFubenBossSingleManager.GetBossMaxScore(bossId)
|
||
local score = 0
|
||
for _, stageId in ipairs(XFubenBossSingleManager.GetBossStageList(bossId)) do
|
||
if XFubenBossSingleManager.GetBossStageCfg(stageId).DifficultyType ~= XFubenBossSingleConfigs.DifficultyType.Hide then
|
||
score = score + XFubenBossSingleManager.GetBossStageCfg(stageId).Score
|
||
end
|
||
end
|
||
return score
|
||
end
|
||
|
||
-- 获取某个Boss当前讨伐值
|
||
function XFubenBossSingleManager.GetBossCurScore(bossId)
|
||
local score = 0
|
||
for _, stageId in ipairs(XFubenBossSingleManager.GetBossStageList(bossId)) do
|
||
score = score + XFubenBossSingleManager.GetBossStageScore(stageId)
|
||
end
|
||
return score
|
||
end
|
||
|
||
-- 获取当次结算当前Boss的讨伐值
|
||
function XFubenBossSingleManager.GetBossCurSettleScore(sellleStageId, sellleScore)
|
||
local score = 0
|
||
local bossId = XFubenBossSingleManager.GetBossIdByStageId(sellleStageId)
|
||
if not bossId then return score end
|
||
for _, stageId in ipairs(XFubenBossSingleManager.GetBossStageList(bossId)) do
|
||
if stageId == sellleStageId then
|
||
score = score + sellleScore
|
||
else
|
||
score = score + XFubenBossSingleManager.GetBossStageScore(stageId)
|
||
end
|
||
end
|
||
return score
|
||
end
|
||
|
||
-- 通过stageId获取Boss讨伐值上限
|
||
function XFubenBossSingleManager.GetBossMaxScoreByStageId(stageId)
|
||
local bossId = XFubenBossSingleManager.GetBossIdByStageId(stageId)
|
||
return XFubenBossSingleManager.GetBossMaxScore(bossId)
|
||
end
|
||
--=================================end=====================================
|
||
|
||
|
||
-- 检查奖励是否领取
|
||
function XFubenBossSingleManager.CheckRewardGet(rewardId)
|
||
local rewardIds = FubenBossSingleData.RewardIds
|
||
for _, id in pairs(rewardIds) do
|
||
if rewardId == id then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
-- 检查奖励是否还有奖励需要领取
|
||
function XFubenBossSingleManager.CheckRewardRedHint()
|
||
local index = FubenBossSingleData.LevelType
|
||
local cfgs = XFubenBossSingleManager.GetScoreRewardCfg(index)
|
||
|
||
if (not cfgs) or #cfgs == 0 then return -1 end
|
||
|
||
local totalScore = FubenBossSingleData.TotalScore
|
||
local rewardIds = FubenBossSingleData.RewardIds
|
||
|
||
for _, v in pairs(cfgs) do
|
||
local canGet = totalScore >= v.Score
|
||
local got = false
|
||
if canGet then
|
||
for _, id in pairs(rewardIds) do
|
||
if id == v.Id then
|
||
got = true
|
||
break
|
||
end
|
||
end
|
||
|
||
if not got then
|
||
return 1
|
||
end
|
||
end
|
||
end
|
||
|
||
return -1
|
||
end
|
||
|
||
-- 检查自动战斗保存
|
||
function XFubenBossSingleManager.CheckAtuoFight(stageId)
|
||
for _, v in pairs(FubenBossSingleData.HistoryList) do
|
||
if v.StageId == stageId then
|
||
return v
|
||
end
|
||
end
|
||
|
||
return nil
|
||
end
|
||
|
||
function XFubenBossSingleManager.CheckStagePassed(sectionId, index)
|
||
local sectionInfo = XFubenBossSingleManager.GetBossSectionInfo(sectionId)
|
||
local stageId = sectionInfo[index].StageId
|
||
local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId)
|
||
return stageInfo.Unlock
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetCurScoreRewardCfg()
|
||
local curScore = FubenBossSingleData.TotalScore
|
||
local levelType = FubenBossSingleData.LevelType
|
||
local scoreRewardCfg = XFubenBossSingleManager.GetScoreRewardCfg(levelType)
|
||
|
||
for i = 1, #scoreRewardCfg do
|
||
if curScore < scoreRewardCfg[i].Score then
|
||
return scoreRewardCfg[i]
|
||
end
|
||
end
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetMaxStamina()
|
||
local levelType = FubenBossSingleData.LevelType
|
||
local levelTypeCfg = XFubenBossSingleManager.GetRankLevelCfgByType(levelType)
|
||
if not levelTypeCfg then
|
||
XLog.ErrorTableDataNotFound("XFubenBossSingleManager.GetMaxStamina",
|
||
"levelTypeCfg", "Share/Fuben/BossSingle/BossSingleGrade.tab", "levelType", tostring(levelType))
|
||
return 0
|
||
end
|
||
|
||
return levelTypeCfg.StaminaCount
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetChallengeCount()
|
||
local levelType = FubenBossSingleData.LevelType
|
||
local levelTypeCfg = XFubenBossSingleManager.GetRankLevelCfgByType(levelType)
|
||
if not levelTypeCfg then
|
||
XLog.ErrorTableDataNotFound("XFubenBossSingleManager.GetChallengeCount",
|
||
"levelTypeCfg", "Share/Fuben/BossSingle/BossSingleGrade.tab", "levelType", tostring(levelType))
|
||
return 0
|
||
end
|
||
|
||
if XTime.CheckWeekend() then
|
||
return levelTypeCfg.WeekChallengeCount
|
||
else
|
||
return levelTypeCfg.ChallengeCount
|
||
end
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetCurBossIndex(bossId)
|
||
local sectionInfo = XFubenBossSingleManager.GetBossSectionInfo(bossId)
|
||
local hasHideBoss = XDataCenter.FubenBossSingleManager.CheckLevelHasHideBoss()
|
||
local count = hasHideBoss and #sectionInfo or #sectionInfo - 1
|
||
|
||
for i = 1, count do
|
||
local stageInfo = XDataCenter.FubenManager.GetStageInfo(sectionInfo[i].StageId)
|
||
if not stageInfo.Passed then
|
||
count = sectionInfo[i].DifficultyType
|
||
break
|
||
end
|
||
end
|
||
|
||
-- 打到隐藏Boss 但是没有达到开启条件处理
|
||
if sectionInfo[count].DifficultyType == XFubenBossSingleConfigs.DifficultyType.Hide then
|
||
local hideBossOpen, _ = XFubenBossSingleManager.CheckHideBossOpen(sectionInfo[count])
|
||
if not hideBossOpen then
|
||
count = sectionInfo[#sectionInfo - 1].DifficultyType
|
||
end
|
||
end
|
||
|
||
return count
|
||
end
|
||
|
||
function XFubenBossSingleManager.CheckBossAllPassed(bossId)
|
||
local sectionInfo = XFubenBossSingleManager.GetBossSectionInfo(bossId)
|
||
for i = 1, #sectionInfo do
|
||
local stageInfo = XDataCenter.FubenManager.GetStageInfo(sectionInfo[i].StageId)
|
||
local bossStageInfo = BossStageCfg[sectionInfo[i].StageId]
|
||
if not stageInfo.Passed and bossStageInfo.DifficultyType ~= XFubenBossSingleConfigs.DifficultyType.Hide then -- 检查boss全部完成时不检查隐藏关
|
||
return false
|
||
end
|
||
end
|
||
return true
|
||
end
|
||
|
||
function XFubenBossSingleManager.CheckAllPassed()
|
||
for k, bossId in pairs(FubenBossSingleData.BossList) do
|
||
if not XFubenBossSingleManager.CheckBossAllPassed(bossId) then
|
||
return false
|
||
end
|
||
end
|
||
return true
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetBossCurDifficultyInfo(bossId, index)
|
||
local sectionInfo = XFubenBossSingleManager.GetBossSectionInfo(bossId)
|
||
local sectionCfg = XFubenBossSingleManager.GetBossSectionCfg(bossId)
|
||
local hasHideBoss = XDataCenter.FubenBossSingleManager.CheckLevelHasHideBoss()
|
||
local count = hasHideBoss and #sectionInfo or #sectionInfo - 1
|
||
local curBossCfg = sectionInfo[count]
|
||
for i = 1, count do
|
||
local stageInfo = XDataCenter.FubenManager.GetStageInfo(sectionInfo[i].StageId)
|
||
if not stageInfo.Passed then
|
||
curBossCfg = sectionInfo[i]
|
||
break
|
||
end
|
||
end
|
||
|
||
local now = XTime.GetServerNowTimestamp()
|
||
local tagTmepIcon = nil
|
||
for i = 1, #sectionCfg.ActivityTimeId do
|
||
local startTime, endTime = XFunctionManager.GetTimeByTimeId(sectionCfg.ActivityTimeId[i])
|
||
if startTime and endTime and now >= startTime and now < endTime then
|
||
tagTmepIcon = sectionCfg.ActivityTag[i]
|
||
break
|
||
end
|
||
end
|
||
|
||
local groupTempId = nil
|
||
local groupTempName = nil
|
||
local groupTempIcon = nil
|
||
local hideBossOpen = false
|
||
|
||
local levelTypeCfg = XFubenBossSingleManager.GetRankLevelCfgByType(FubenBossSingleData.LevelType)
|
||
if levelTypeCfg and levelTypeCfg.GroupId[index] then
|
||
groupTempId = levelTypeCfg.GroupId[index]
|
||
local groupInfo = XFubenBossSingleConfigs.GetBossSingleGroupById(groupTempId)
|
||
groupTempName = groupInfo.GroupName
|
||
groupTempIcon = groupInfo.GroupIcon
|
||
hideBossOpen = levelTypeCfg.HideBossOpen
|
||
end
|
||
|
||
if hideBossOpen then
|
||
hideBossOpen = XFubenBossSingleManager.CheckHideBossOpen(curBossCfg)
|
||
end
|
||
|
||
-- 打到隐藏Boss 但是没有达到开启条件处理
|
||
if not hideBossOpen and curBossCfg.DifficultyType == XFubenBossSingleConfigs.DifficultyType.Hide then
|
||
curBossCfg = sectionInfo[#sectionInfo - 1]
|
||
end
|
||
|
||
local info = {
|
||
bossName = curBossCfg.BossName,
|
||
bossIcon = sectionCfg.BossHeadIcon,
|
||
bossDiffiName = curBossCfg.DifficultyDesc,
|
||
tagIcon = tagTmepIcon,
|
||
groupId = groupTempId,
|
||
groupName = groupTempName,
|
||
groupIcon = groupTempIcon,
|
||
isHideBoss = hideBossOpen
|
||
}
|
||
return info
|
||
end
|
||
|
||
function XFubenBossSingleManager.CheckLevelHasHideBoss()
|
||
local levelTypeCfg = XFubenBossSingleManager.GetRankLevelCfgByType(FubenBossSingleData.LevelType)
|
||
if levelTypeCfg then
|
||
return levelTypeCfg.HideBossOpen
|
||
end
|
||
|
||
return false
|
||
end
|
||
|
||
function XFubenBossSingleManager.CheckHideBossOpenByBossId(bossId)
|
||
local sectionInfo = XFubenBossSingleManager.GetBossSectionInfo(bossId)
|
||
local hideBossCfg = nil
|
||
local closeDesc = ""
|
||
|
||
for i = 1, #sectionInfo do
|
||
if sectionInfo[i].DifficultyType == XFubenBossSingleConfigs.DifficultyType.Hide then
|
||
hideBossCfg = sectionInfo[i]
|
||
break
|
||
end
|
||
end
|
||
|
||
if hideBossCfg == nil then
|
||
return false, closeDesc
|
||
end
|
||
|
||
return XFubenBossSingleManager.CheckHideBossOpen(hideBossCfg)
|
||
end
|
||
|
||
function XFubenBossSingleManager.CheckHideBossOpen(bossStageCfg)
|
||
if bossStageCfg.DifficultyType ~= XFubenBossSingleConfigs.DifficultyType.Hide then
|
||
return false, nil
|
||
end
|
||
|
||
local isOpen, desc = XFubenBossSingleManager.CheckBossOpen(bossStageCfg)
|
||
return isOpen, desc
|
||
end
|
||
|
||
function XFubenBossSingleManager.CheckBossOpen(bossStageCfg)
|
||
local isOpen = true
|
||
local desc = ""
|
||
|
||
for i = 1, #bossStageCfg.OpenCondition do
|
||
if bossStageCfg.OpenCondition[i] and bossStageCfg.OpenCondition[i] > 0 then
|
||
isOpen, desc = XConditionManager.CheckCondition(bossStageCfg.OpenCondition[i])
|
||
end
|
||
|
||
if not isOpen then
|
||
break
|
||
end
|
||
end
|
||
|
||
return isOpen, desc
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetBossNameInfo(bossId, stageId)
|
||
local stageName = ""
|
||
local chapterName = ""
|
||
local sectionInfo = XFubenBossSingleManager.GetBossSectionInfo(bossId)
|
||
for i = 1, #sectionInfo do
|
||
if sectionInfo[i].StageId == stageId then
|
||
local stageCfg = XDataCenter.FubenManager.GetStageCfg(stageId)
|
||
local curBossStageCfg = XFubenBossSingleManager.GetBossStageCfg(sectionInfo[i].StageId)
|
||
stageName = stageCfg.Name
|
||
chapterName = curBossStageCfg.BossName
|
||
end
|
||
end
|
||
return chapterName, stageName
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetBossStageInfo(stageId)
|
||
local bossId = XDataCenter.FubenManager.GetStageInfo(stageId).BossSectionId
|
||
local sectionInfo = XFubenBossSingleManager.GetBossSectionInfo(bossId)
|
||
for i = 1, #sectionInfo do
|
||
if sectionInfo[i].StageId == stageId then
|
||
return sectionInfo[i]
|
||
end
|
||
end
|
||
return nil
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetBossDifficultName(stageId)
|
||
local name = ""
|
||
local bossId = XDataCenter.FubenManager.GetStageInfo(stageId).BossSectionId
|
||
local sectionInfo = XFubenBossSingleManager.GetBossSectionInfo(bossId)
|
||
for i = 1, #sectionInfo do
|
||
if sectionInfo[i].StageId == stageId then
|
||
name = sectionInfo[i].DifficultyDesc
|
||
end
|
||
end
|
||
return name
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetRankSpecialIcon(num, levelType)
|
||
if not levelType then
|
||
levelType = FubenBossSingleData.LevelType
|
||
end
|
||
|
||
local cfgs = XFubenBossSingleManager.GetRankRewardCfg(levelType)
|
||
|
||
if not cfgs[num] then
|
||
XLog.Error(string.format("表BossSignleReward.tab不存在当前LevelType的RankIcon!索引:%d LevelType:%d", num, levelType))
|
||
return
|
||
end
|
||
|
||
return cfgs[num].RankIcon
|
||
end
|
||
|
||
--超频区选择
|
||
function XFubenBossSingleManager.CheckNeedChooseLevelType()
|
||
return FubenBossSingleData.LevelType == XFubenBossSingleConfigs.LevelType.Chooseable
|
||
end
|
||
|
||
function XFubenBossSingleManager.IsInLevelTypeHigh()
|
||
return FubenBossSingleData.LevelType == XFubenBossSingleConfigs.LevelType.High
|
||
end
|
||
|
||
function XFubenBossSingleManager.IsInLevelTypeExtreme()
|
||
return FubenBossSingleData.LevelType == XFubenBossSingleConfigs.LevelType.Extreme
|
||
end
|
||
|
||
function XFubenBossSingleManager.IsChooseLevelTypeConditionOk()
|
||
if not XFubenBossSingleManager.IsInLevelTypeHigh() then return false end
|
||
|
||
local needScore = XFubenBossSingleManager.GetChooseLevelTypeNeedScore()
|
||
if needScore > 0 and FubenBossSingleData.MaxScore >= needScore then return true end
|
||
|
||
return XPlayer.IsMedalUnlock(XMedalConfigs.MedalId.BossSingle)
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetChooseLevelTypeNeedScore()
|
||
local levelType = FubenBossSingleData.LevelType + 1
|
||
local bossSingleGradeCfg = BossSingleGradeCfg[levelType]
|
||
return bossSingleGradeCfg and bossSingleGradeCfg.NeedScore or 0
|
||
end
|
||
|
||
function XFubenBossSingleManager.OpenBossSingleView()
|
||
local func = function()
|
||
XLuaUiManager.Open("UiFubenBossSingle", FubenBossSingleData, BossList)
|
||
end
|
||
XFubenBossSingleManager.RequestSelfRank(func)
|
||
end
|
||
|
||
function XFubenBossSingleManager.ReqChooseLevelType(levelType)
|
||
if not levelType then return end
|
||
|
||
local req = { LevelId = levelType }
|
||
XNetwork.Call(METHOD_NAME.ChooseLevelType, req, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
|
||
XDataCenter.FubenBossSingleManager.RefreshBossSingleData(res.FubenBossSingleData)
|
||
XFubenBossSingleManager.OpenBossSingleView()
|
||
end)
|
||
end
|
||
|
||
function XFubenBossSingleManager.RefreshSelfRank(rank, totalRank)
|
||
SelfRankData.Rank = rank
|
||
SelfRankData.TotalRank = totalRank
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetSelfRank()
|
||
return SelfRankData.Rank or 0
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetSelfTotalRank()
|
||
return SelfRankData.TotalRank or 0
|
||
end
|
||
|
||
function XFubenBossSingleManager.RefreshChallengeCount(challengeCount)
|
||
FubenBossSingleData.ChallengeCount = challengeCount
|
||
end
|
||
|
||
function XFubenBossSingleManager.PreFight(stage, teamId, isAssist, challengeCount, challengeId)
|
||
local preFight = {}
|
||
preFight.CardIds = {}
|
||
preFight.StageId = stage.StageId
|
||
preFight.IsHasAssist = isAssist and true or false
|
||
preFight.ChallengeCount = challengeCount or 1
|
||
local isArenaOnline = XDataCenter.ArenaOnlineManager.CheckStageIsArenaOnline(stage.StageId)
|
||
local isSimulatedCombat = XDataCenter.FubenSimulatedCombatManager.CheckStageIsSimulatedCombat(stage.StageId)
|
||
-- 如果有试玩角色,则不读取玩家队伍信息
|
||
if not stage.RobotId or #stage.RobotId <= 0 then
|
||
local teamData = XDataCenter.TeamManager.GetTeamData(teamId)
|
||
for _, v in pairs(teamData) do
|
||
table.insert(preFight.CardIds, v)
|
||
end
|
||
preFight.CaptainPos = XDataCenter.TeamManager.GetTeamCaptainPos(teamId)
|
||
preFight.FirstFightPos = XDataCenter.TeamManager.GetTeamFirstFightPos(teamId)
|
||
end
|
||
if isArenaOnline then
|
||
preFight.StageLevel = XDataCenter.ArenaOnlineManager.GetSingleModeDifficulty(challengeId, true)
|
||
end
|
||
if isSimulatedCombat then
|
||
preFight.RobotIds = {}
|
||
for i, v in ipairs(preFight.CardIds) do
|
||
local data = XDataCenter.FubenSimulatedCombatManager.GetCurStageMemberDataByCharId(v)
|
||
if data then
|
||
preFight.RobotIds[i] = data.RobotId
|
||
else
|
||
preFight.RobotIds[i] = 0
|
||
end
|
||
end
|
||
preFight.CardIds = nil
|
||
end
|
||
preFight.IsBossSingleTrialStage = IsBossSingleTrial
|
||
|
||
return preFight
|
||
end
|
||
|
||
function XFubenBossSingleManager.RequestSelfRank(cb)
|
||
XNetwork.Call(METHOD_NAME.GetSelfRank, nil, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
|
||
XFubenBossSingleManager.RefreshSelfRank(res.Rank, res.TotalRank)
|
||
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetRankData(cb, levelType)
|
||
local now = XTime.GetServerNowTimestamp()
|
||
if LastSyncServerTimes[levelType]
|
||
and LastSyncServerTimes[levelType] + SYNC_SERVER_BOSS_SECOND >= now then
|
||
if cb then
|
||
cb(RankData[levelType])
|
||
end
|
||
return
|
||
end
|
||
|
||
local req = { Level = levelType }
|
||
XNetwork.Call(METHOD_NAME.GetRankData, req,
|
||
function(response)
|
||
if response.Code ~= XCode.Success then
|
||
XUiManager.TipCode(response.Code)
|
||
return
|
||
end
|
||
LastSyncServerTimes[levelType] = now
|
||
|
||
local luaRankData = {}
|
||
luaRankData.MineRankNum = response.RankNum
|
||
luaRankData.HistoryMaxRankNum = response.HistoryNum
|
||
luaRankData.LeftTime = response.LeftTime
|
||
luaRankData.TotalCount = response.TotalCount
|
||
luaRankData.rankData = {}
|
||
|
||
if response.RankList and #response.RankList > 0 then
|
||
XTool.LoopCollection(response.RankList, function(data)
|
||
local luaRankMetaData = {}
|
||
luaRankMetaData.PlayerId = data.Id
|
||
luaRankMetaData.RankNum = data.RankNum
|
||
luaRankMetaData.HeadPortraitId = data.HeadPortraitId
|
||
luaRankMetaData.HeadFrameId = data.HeadFrameId
|
||
luaRankMetaData.Name = data.Name
|
||
luaRankMetaData.Score = data.Score
|
||
luaRankMetaData.CharacterHeadData = data.CharacterList or {}
|
||
table.insert(luaRankData.rankData, luaRankMetaData)
|
||
end)
|
||
end
|
||
|
||
RankData[levelType] = luaRankData
|
||
if cb then
|
||
cb(RankData[levelType])
|
||
end
|
||
end)
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetRankRewardReq(rewardId, cb)
|
||
local req = { Id = rewardId }
|
||
XNetwork.Call(METHOD_NAME.GetReward, req, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
|
||
table.insert(FubenBossSingleData.RewardIds, rewardId)
|
||
|
||
if cb then
|
||
cb(res.RewardGoodsList)
|
||
end
|
||
end)
|
||
end
|
||
|
||
-- 自动战斗
|
||
function XFubenBossSingleManager.AutoFight(stagedId, cb)
|
||
local req = { StageId = stagedId }
|
||
XNetwork.Call(METHOD_NAME.AutoFight, req, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
|
||
if cb then
|
||
cb(res.Supply > 0)
|
||
end
|
||
end)
|
||
end
|
||
|
||
-- 保存战斗数据
|
||
function XFubenBossSingleManager.SaveScore(stagedId, cb)
|
||
local req = { StageId = stagedId }
|
||
XNetwork.Call(METHOD_NAME.SaveScore, req, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
|
||
if cb then
|
||
cb(res.Supply > 0)
|
||
end
|
||
end)
|
||
end
|
||
|
||
function XFubenBossSingleManager.CheckPreFight()
|
||
local curCount = XFubenBossSingleManager.GetBoosSingleData().ChallengeCount
|
||
local allCount = XFubenBossSingleManager.GetChallengeCount()
|
||
if allCount - curCount <= 0 and not IsBossSingleTrial then
|
||
local msg = CS.XTextManager.GetText("FubenChallengeCountNotEnough")
|
||
XUiManager.TipMsg(msg)
|
||
return false
|
||
end
|
||
return true
|
||
end
|
||
|
||
-- 胜利 & 奖励界面
|
||
function XFubenBossSingleManager.ShowReward(winData)
|
||
if XDataCenter.FubenManager.CheckHasFlopReward(winData) then
|
||
XLuaUiManager.Open("UiFubenFlopReward", function()
|
||
XLuaUiManager.PopThenOpen("UiSettleWinSingleBoss", winData)
|
||
end, winData)
|
||
else
|
||
XLuaUiManager.Open("UiSettleWinSingleBoss", winData)
|
||
end
|
||
end
|
||
|
||
--为独立判断普通囚笼和体验囚笼的Stage解锁增加的handler
|
||
function XFubenBossSingleManager.CheckUnlockByStageId(stageId)
|
||
local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId)
|
||
|
||
return IsBossSingleTrial or (stageInfo.Unlock or false)
|
||
end
|
||
|
||
function XFubenBossSingleManager.SetTrialStageInfo(trialStageInfo)
|
||
if not trialStageInfo then
|
||
return
|
||
end
|
||
|
||
for key, value in pairs(trialStageInfo) do
|
||
TrialStageInfo[value.StageId] =
|
||
{
|
||
StageId = value.StageId,
|
||
Score = value.Score,
|
||
}
|
||
end
|
||
|
||
for levelType, value in pairs(BossSingleTrialGradeCfg) do
|
||
for i, sectionId in pairs(value.SectionId) do --拿到所有体验关boss,遍历体验关boss的stage 叠加分数
|
||
local sectionCfg = XFubenBossSingleManager.GetBossSectionCfg(sectionId)
|
||
local totalScore = 0
|
||
for k, stageId in pairs(sectionCfg.StageId) do
|
||
local tempInfo = TrialStageInfo[stageId]
|
||
if tempInfo then
|
||
-- 1.计算总分
|
||
totalScore = totalScore + tempInfo.Score
|
||
end
|
||
-- 2.添加前置id信息
|
||
TrialPreStageInfo[stageId] = sectionCfg.StageId[k-1]
|
||
end
|
||
TotalTrialSectionScoreInfo[sectionId] = totalScore
|
||
end
|
||
end
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetTrialStageInfo(stageId)
|
||
if not stageId then
|
||
return nil
|
||
end
|
||
|
||
return TrialStageInfo[stageId]
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetTrialTotalScoreInfo()
|
||
return TotalTrialSectionScoreInfo
|
||
end
|
||
|
||
function XFubenBossSingleManager.GetCurTrialBossIndex(bossId)
|
||
local index = 0
|
||
local sectionInfo = XFubenBossSingleManager.GetBossSectionInfo(bossId)
|
||
for key, value in pairs(sectionInfo) do
|
||
local stageId = value.StageId
|
||
if XFubenBossSingleManager.CheckTrialStageOpen(stageId) then
|
||
index = index + 1
|
||
end
|
||
end
|
||
|
||
return index
|
||
end
|
||
|
||
--囚笼体验关卡开启
|
||
function XFubenBossSingleManager.CheckTrialStageOpen(stageId)
|
||
local stageConfig = BossStageCfg[stageId]
|
||
local preStageId = TrialPreStageInfo[stageId]
|
||
if stageConfig.DifficultyType == XFubenBossSingleConfigs.DifficultyType.experiment then
|
||
return true
|
||
end
|
||
|
||
local preStageInfo = TrialStageInfo[preStageId]
|
||
if preStageInfo and preStageInfo.Score and stageConfig.DifficultyType ~= XFubenBossSingleConfigs.DifficultyType.Hide then --隐藏关不加入囚笼体验模式
|
||
return true
|
||
end
|
||
return false
|
||
end
|
||
|
||
function XFubenBossSingleManager.IsBossSingleOpen()
|
||
local isOpen = XFunctionManager.JudgeCanOpen(XFunctionManager.FunctionName.FubenChallengeBossSingle)
|
||
return isOpen
|
||
end
|
||
|
||
function XFubenBossSingleManager.SetNeedReset(value)
|
||
NeedResetFlag = value and true
|
||
end
|
||
|
||
function XFubenBossSingleManager.IsNeedReset()
|
||
return NeedResetFlag
|
||
end
|
||
|
||
function XFubenBossSingleManager.OnActivityEnd()
|
||
if not XFubenBossSingleManager.IsNeedReset() then
|
||
return
|
||
end
|
||
|
||
if CS.XFight.IsRunning or XLuaUiManager.IsUiLoad("UiLoading") then
|
||
return
|
||
end
|
||
|
||
XUiManager.TipText("BossOnlineOver")
|
||
XLuaUiManager.RunMain()
|
||
|
||
XFubenBossSingleManager.SetNeedReset(false)
|
||
end
|
||
|
||
------------------副本入口扩展 start-------------------------
|
||
function XFubenBossSingleManager:ExGetChapterType()
|
||
return XFubenConfigs.ChapterType.BossSingle
|
||
end
|
||
|
||
-- 获取进度提示
|
||
function XFubenBossSingleManager:ExGetProgressTip()
|
||
local strProgress = ""
|
||
if not self:ExGetIsLocked() then
|
||
-- 进度
|
||
if XFubenBossSingleManager.CheckNeedChooseLevelType() then
|
||
strProgress = CS.XTextManager.GetText("BossSingleProgressChooseable")
|
||
else
|
||
local allCount = XFubenBossSingleManager.GetChallengeCount()
|
||
local challengeCount = XFubenBossSingleManager.GetBoosSingleData().ChallengeCount
|
||
strProgress = CS.XTextManager.GetText("BossSingleProgress", challengeCount, allCount)
|
||
end
|
||
end
|
||
|
||
return strProgress
|
||
end
|
||
|
||
-- 获取倒计时
|
||
function XFubenBossSingleManager:ExGetRunningTimeStr()
|
||
local remainTime = FubenBossSingleData.EndTime - XTime.GetServerNowTimestamp()
|
||
local timeText = XUiHelper.GetTime(remainTime, XUiHelper.TimeFormatType.CHALLENGE)
|
||
return CS.XTextManager.GetText("BossSingleLeftTimeIcon", timeText)
|
||
end
|
||
|
||
function XFubenBossSingleManager:ExCheckIsFinished(cb)
|
||
local result = true
|
||
|
||
if XFubenBossSingleManager.CheckNeedChooseLevelType() -- 未选区
|
||
or (FubenBossSingleData.ChallengeCount < XFubenBossSingleManager.GetChallengeCount() and not XFubenBossSingleManager.CheckAllPassed()) --还剩余挑战次数,有未通过关卡(一个boss5个关卡)
|
||
or XRedPointManager.CheckConditions({"CONDITION_BOSS_SINGLE_REWARD"}) -- 有奖励未领取
|
||
or self:ExGetIsLocked()
|
||
then
|
||
result = false
|
||
end
|
||
|
||
if cb then
|
||
cb(result)
|
||
end
|
||
self.IsClear = result
|
||
return result
|
||
end
|
||
|
||
function XFubenBossSingleManager:ExOpenMainUi()
|
||
if XFunctionManager.DetectionFunction(self:ExGetFunctionNameType()) then
|
||
if XFubenBossSingleManager.CheckNeedChooseLevelType() then
|
||
XLuaUiManager.Open("UiFubenBossSingleChooseLevelType")
|
||
return
|
||
end
|
||
|
||
XDataCenter.FubenBossSingleManager.OpenBossSingleView()
|
||
end
|
||
end
|
||
|
||
------------------副本入口扩展 end-------------------------
|
||
|
||
XFubenBossSingleManager.Init()
|
||
return XFubenBossSingleManager
|
||
end
|
||
|
||
XRpc.NotifyFubenBossSingleData = function(data)
|
||
XDataCenter.FubenBossSingleManager.RefreshBossSingleData(data.FubenBossSingleData)
|
||
XEventManager.DispatchEvent(XEventId.EVENT_FUBEN_SINGLE_BOSS_SYNC)
|
||
end
|
||
|
||
XRpc.NotifyBossSingleRankInfo = function(data)
|
||
XDataCenter.FubenBossSingleManager.RefreshSelfRank(data.Rank, data.TotalRank)
|
||
XEventManager.DispatchEvent(XEventId.EVENT_FUBEN_SINGLE_BOSS_RANK_SYNC)
|
||
end
|
||
|
||
XRpc.NotifyBossSingleChallengeCount = function(data)
|
||
XDataCenter.FubenBossSingleManager.RefreshChallengeCount(data.ChallengeCount)
|
||
end |