PGRData/Script/matrix/xmanager/XFubenBossSingleManager.lua

1034 lines
37 KiB
Lua
Raw Permalink Normal View History

2024-09-01 20:49:41 +00:00
local XExFubenSimulationChallengeManager = require("XEntity/XFuben/XExFubenSimulationChallengeManager")
2024-09-01 20:49:41 +00:00
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 = {}
2024-09-01 20:49:41 +00:00
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
2024-09-01 20:49:41 +00:00
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
2024-09-01 20:49:41 +00:00
function XFubenBossSingleManager.GetRankIsOpenByType(type)
local timeId = BossSingleGradeCfg[type].RankTimeId
return XFunctionManager.CheckInTimeByTimeId(timeId, true)
end
function XFubenBossSingleManager.GetRankRewardCfg(levelType)
2024-09-01 20:49:41 +00:00
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)
2024-09-01 20:49:41 +00:00
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)
2024-09-01 20:49:41 +00:00
FubenBossSingleData.EndTime = XTime.GetServerNowTimestamp() + FubenBossSingleData.RemainTime -- 结束时间是服务器刷新下发的,这里主动计算出结束的时间戳,方便倒计时计算
local newActivityId = bossSingleData.ActivityNo
2024-09-01 20:49:41 +00:00
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
2024-09-01 20:49:41 +00:00
-- 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)
2024-09-01 20:49:41 +00:00
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
2024-09-01 20:49:41 +00:00
local scoreRewardCfg = XFubenBossSingleManager.GetScoreRewardCfg(levelType)
2024-09-01 20:49:41 +00:00
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)
2024-09-01 20:49:41 +00:00
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)
2024-09-01 20:49:41 +00:00
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
2024-09-01 20:49:41 +00:00
------------------副本入口扩展 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