396 lines
14 KiB
Lua
396 lines
14 KiB
Lua
XTaikoMasterManagerCreator = function()
|
||
local BaseInfo = require("XEntity/XTaikoMaster/XTaikoMasterInfo").New()
|
||
local _JustPassedStageId = false
|
||
|
||
---@class XTaikoMasterManager@音游
|
||
local XTaikoMasterManager = {}
|
||
|
||
XTaikoMasterManager.GetSongName = function(songId)
|
||
return XTaikoMasterConfigs.GetSongName(songId)
|
||
end
|
||
|
||
XTaikoMasterManager.GetDefaultMusicId = function()
|
||
return XTaikoMasterConfigs.GetDefaultBgm(BaseInfo:GetActivityId())
|
||
end
|
||
|
||
XTaikoMasterManager.PlayDefaultBgm = function()
|
||
XSoundManager.PlaySoundDoNotInterrupt(XTaikoMasterManager.GetDefaultMusicId())
|
||
end
|
||
|
||
XTaikoMasterManager.PlaySong = function(songId)
|
||
if not songId then
|
||
return false
|
||
end
|
||
local musicId = XTaikoMasterConfigs.GetSongMusicId(songId)
|
||
if XSoundManager.GetCurrentBgmCueId() == musicId then
|
||
XSoundManager.Stop(musicId)
|
||
end
|
||
CS.XAudioManager.PlayMusicWithAnalyzer(musicId)
|
||
return true
|
||
end
|
||
|
||
XTaikoMasterManager.GetSongArray = function()
|
||
return XTaikoMasterConfigs.GetSongArray(BaseInfo:GetActivityId())
|
||
end
|
||
|
||
XTaikoMasterManager.GetRankSongArray = function()
|
||
local songArray = XTaikoMasterConfigs.GetSongArray(BaseInfo:GetActivityId())
|
||
local unlockSongArray = {}
|
||
for i = 1, #songArray do
|
||
local songId = songArray[i]
|
||
if XTaikoMasterManager.IsSongUnlock(songId) then
|
||
unlockSongArray[#unlockSongArray + 1] = songId
|
||
end
|
||
end
|
||
return unlockSongArray
|
||
end
|
||
|
||
-- 关卡封面图
|
||
XTaikoMasterManager.GetSongCoverImage = function(songId)
|
||
return XTaikoMasterConfigs.GetSongCoverImage(songId)
|
||
end
|
||
|
||
-- 活动剩余时间
|
||
XTaikoMasterManager.GetActivityRemainTime = function()
|
||
local currentTime = XTime.GetServerNowTimestamp()
|
||
local timeLimitId = XTaikoMasterConfigs.GetTimeLimitId(BaseInfo:GetActivityId())
|
||
return math.max(0, XFunctionManager.GetEndTimeByTimeId(timeLimitId) - currentTime)
|
||
end
|
||
|
||
-- 获取教学关卡id
|
||
XTaikoMasterManager.GetTrainingStageId = function()
|
||
return XTaikoMasterConfigs.GetTrainingStageId(BaseInfo:GetActivityId())
|
||
end
|
||
|
||
-- 获取设置调试关卡id
|
||
XTaikoMasterManager.GetSettingStageId = function()
|
||
return XTaikoMasterConfigs.GetSettingStageId(BaseInfo:GetActivityId())
|
||
end
|
||
|
||
XTaikoMasterManager.IsTrainingStageId = function(stageId)
|
||
return stageId == XTaikoMasterManager.GetTrainingStageId()
|
||
end
|
||
|
||
XTaikoMasterManager.IsSettingStageId = function(stageId)
|
||
return stageId == XTaikoMasterManager.GetSettingStageId()
|
||
end
|
||
|
||
XTaikoMasterManager.GetHelpKey = function()
|
||
local helpId = XTaikoMasterConfigs.GetHelpId(BaseInfo:GetActivityId())
|
||
local config = XHelpCourseConfig.GetHelpCourseTemplateById(helpId)
|
||
if config then
|
||
return config.Function
|
||
end
|
||
end
|
||
|
||
XTaikoMasterManager.GetTaskList = function()
|
||
local taskTimeLimitId = XTaikoMasterConfigs.GetTaskTimeLimitId(BaseInfo:GetActivityId())
|
||
local taskList = XDataCenter.TaskManager.GetTimeLimitTaskListByGroupId(taskTimeLimitId, true)
|
||
return taskList
|
||
end
|
||
|
||
-- 设置:视效偏移
|
||
XTaikoMasterManager.GetSettingAppearScale = function()
|
||
return BaseInfo:GetSettingAppearScale()
|
||
end
|
||
|
||
-- 设置:评判偏移
|
||
XTaikoMasterManager.GetSettingJudgeScale = function()
|
||
return BaseInfo:GetSettingJudgeScale()
|
||
end
|
||
|
||
XTaikoMasterManager.GetActivityTimeId = function()
|
||
return XTaikoMasterConfigs.GetActivityTimeId(BaseInfo:GetActivityId())
|
||
end
|
||
|
||
XTaikoMasterManager.HandleActivityEnd = function()
|
||
XLuaUiManager.RunMain()
|
||
XUiManager.TipMsg(XUiHelper.GetText("ActivityAlreadyOver"))
|
||
end
|
||
|
||
-- 排行榜只有困难难度(困难和简单是不同的stageId)
|
||
XTaikoMasterManager.GetStageId4Rank = function(songId)
|
||
return XTaikoMasterConfigs.GetStageId(songId, XTaikoMasterConfigs.DefaultRankDifficulty)
|
||
end
|
||
|
||
XTaikoMasterManager.GetRankList = function(songId)
|
||
local rankData = BaseInfo:GetRankData(songId)
|
||
return rankData.RankPlayerInfoList or {}
|
||
end
|
||
|
||
XTaikoMasterManager.GetMyRanking = function(songId)
|
||
local rankData = BaseInfo:GetRankData(songId)
|
||
return rankData.Ranking or 0
|
||
end
|
||
|
||
-- 排行榜人数
|
||
XTaikoMasterManager.GetRankPlayerAmount = function(songId)
|
||
local rankData = BaseInfo:GetRankData(songId)
|
||
return rankData.TotalCount or 0
|
||
end
|
||
|
||
XTaikoMasterManager.GetMyScoreByStage = function(stageId)
|
||
return BaseInfo:GetMyScore(stageId)
|
||
end
|
||
|
||
XTaikoMasterManager.GetMyScoreBySong = function(songId, difficulty)
|
||
local stageId = XTaikoMasterManager.GetStageId(songId, difficulty)
|
||
return XTaikoMasterManager.GetMyScoreByStage(stageId)
|
||
end
|
||
|
||
XTaikoMasterManager.GetMyComboBySong = function(songId, difficulty)
|
||
local stageId = XTaikoMasterManager.GetStageId(songId, difficulty)
|
||
return BaseInfo:GetMyCombo(stageId)
|
||
end
|
||
|
||
XTaikoMasterManager.GetMyAccuracyBySong = function(songId, difficulty)
|
||
local stageId = XTaikoMasterManager.GetStageId(songId, difficulty)
|
||
return BaseInfo:GetMyAccuracy(stageId)
|
||
end
|
||
|
||
XTaikoMasterManager.GetMyAssess = function(songId, difficulty)
|
||
local stageId = XTaikoMasterManager.GetStageId(songId, difficulty)
|
||
local score, isPassed = XTaikoMasterManager.GetMyScoreBySong(songId, difficulty)
|
||
if not isPassed then
|
||
return XTaikoMasterConfigs.Assess.None
|
||
end
|
||
return XTaikoMasterConfigs.GetAssess(stageId, score)
|
||
end
|
||
|
||
XTaikoMasterManager.GetStageId = function(songId, difficulty)
|
||
difficulty = difficulty or XTaikoMasterConfigs.DefaultRankDifficulty
|
||
return XTaikoMasterConfigs.GetStageId(songId, difficulty)
|
||
end
|
||
|
||
XTaikoMasterManager.IsClear = function(songId, difficulty)
|
||
return XTaikoMasterManager.GetMyAssess(songId, difficulty) == XTaikoMasterConfigs.Assess.SSS
|
||
end
|
||
|
||
-- 完全连击:玩家所有击打都正确,但未达到完美连击
|
||
XTaikoMasterManager.IsFullCombo = function(songId, difficulty, combo)
|
||
combo = combo or XTaikoMasterManager.GetMyComboBySong(songId, difficulty)
|
||
return combo >= XTaikoMasterConfigs.GetFullCombo(XTaikoMasterManager.GetStageId(songId, difficulty))
|
||
end
|
||
|
||
-- 完美连击:玩家所有击打都正确,并且每次击打均为Perfect评分
|
||
XTaikoMasterManager.IsPerfectCombo = function(songId, difficulty, perfect, combo)
|
||
perfect = perfect or BaseInfo:GetMyPerfect(XTaikoMasterConfigs.GetStageId(songId, difficulty))
|
||
return perfect >= XTaikoMasterConfigs.GetPerfectCombo(XTaikoMasterManager.GetStageId(songId, difficulty)) and
|
||
XTaikoMasterManager.IsFullCombo(songId, difficulty, combo)
|
||
end
|
||
|
||
XTaikoMasterManager.GetActivityChapters = function()
|
||
local chapters = {}
|
||
if XTaikoMasterManager.IsActivityOpen() then
|
||
local temp = {}
|
||
temp.Id = BaseInfo:GetActivityId()
|
||
temp.Name = XTaikoMasterManager.GetActivityName()
|
||
temp.BannerBg = XTaikoMasterConfigs.GetActivityBackground(BaseInfo:GetActivityId())
|
||
temp.Type = XDataCenter.FubenManager.ChapterType.TaikoMaster
|
||
table.insert(chapters, temp)
|
||
end
|
||
return chapters
|
||
end
|
||
|
||
XTaikoMasterManager.IsActivityOpen = function()
|
||
return XFunctionManager.CheckInTimeByTimeId(XTaikoMasterManager.GetActivityTimeId(), true)
|
||
end
|
||
|
||
XTaikoMasterManager.IsFunctionOpen = function()
|
||
return XFunctionManager.JudgeCanOpen(XFunctionManager.FunctionName.TaikoMaster)
|
||
end
|
||
|
||
XTaikoMasterManager.GetActivityName = function()
|
||
return XTaikoMasterConfigs.GetActivityName(BaseInfo:GetActivityId())
|
||
end
|
||
|
||
XTaikoMasterManager.GetActivityStartTime = function()
|
||
local timeId = XTaikoMasterManager.GetActivityTimeId()
|
||
return XFunctionManager.GetStartTimeByTimeId(timeId)
|
||
end
|
||
|
||
XTaikoMasterManager.GetActivityEndTime = function()
|
||
local timeId = XTaikoMasterManager.GetActivityTimeId()
|
||
return XFunctionManager.GetEndTimeByTimeId(timeId)
|
||
end
|
||
|
||
XTaikoMasterManager.OpenUi = function()
|
||
if not XFunctionManager.DetectionFunction(XFunctionManager.FunctionName.TaikoMaster) then
|
||
return
|
||
end
|
||
if not XTaikoMasterManager.IsActivityOpen() then
|
||
XUiManager.TipText("FestivalActivityNotInActivityTime")
|
||
return
|
||
end
|
||
XLuaUiManager.Open("UiTaikoMasterMain")
|
||
end
|
||
|
||
---@return XTeam
|
||
XTaikoMasterManager.GetXTeam = function()
|
||
local team = XDataCenter.TeamManager.GetXTeam(XTaikoMasterConfigs.TeamId)
|
||
if not team then
|
||
team = XDataCenter.TeamManager.GetXTeamByTypeId(XTaikoMasterConfigs.TeamTypeId)
|
||
end
|
||
return team
|
||
end
|
||
|
||
XTaikoMasterManager.OpenUiRoom = function(stageId)
|
||
local proxy = require("XUi/XUiTaikoMaster/XUiTaikoMasterRoomProxy")
|
||
local team = XTaikoMasterManager.GetXTeam()
|
||
XLuaUiManager.Open("UiBattleRoleRoom", stageId, team, proxy)
|
||
end
|
||
|
||
-- 从关卡传回
|
||
XTaikoMasterManager.SetSettingFromFight = function(appearScale, judgeScale)
|
||
BaseInfo:SetSetting(appearScale, judgeScale)
|
||
end
|
||
|
||
XTaikoMasterManager.PreFight = function(...)
|
||
local preFight = XDataCenter.FubenManager.PreFight(...)
|
||
--只有一个角色
|
||
if preFight.CardIds[1] then
|
||
preFight.RobotIds = {preFight.CardIds[1]}
|
||
preFight.CardIds = {}
|
||
else
|
||
-- 教学关 和 调试关,塞机器人
|
||
local stageId = preFight.StageId
|
||
local stageConfig = XDataCenter.FubenManager.GetStageCfg(stageId)
|
||
local robotIds = stageConfig.RobotId
|
||
preFight.RobotIds = {robotIds[1]}
|
||
end
|
||
return preFight
|
||
end
|
||
|
||
XTaikoMasterManager.IsSongUnlock = function(songId)
|
||
local timeId = XTaikoMasterConfigs.GetSongTimeId(songId)
|
||
return XFunctionManager.CheckInTimeByTimeId(timeId, true)
|
||
end
|
||
|
||
XTaikoMasterManager.TipSongLock = function(songId)
|
||
local timeId = XTaikoMasterConfigs.GetSongTimeId(songId)
|
||
local endTime = XFunctionManager.GetStartTimeByTimeId(timeId)
|
||
local timeTxt = os.date("%Y/%m/%d %H:%M", endTime)
|
||
XUiManager.TipErrorWithKey("TaikoMasterLock", timeTxt)
|
||
end
|
||
|
||
-- 胜利 & 奖励界面
|
||
function XTaikoMasterManager.ShowReward(winData)
|
||
local stageId = winData.StageId
|
||
local historyScore, isPassed = XTaikoMasterManager.GetMyScoreByStage(stageId)
|
||
BaseInfo:HandleWinData(stageId, winData.SettleData.TaikoMasterSettleResult)
|
||
-- 教学关和训练关没有结算信息
|
||
if XTool.IsTableEmpty(winData.SettleData.TaikoMasterSettleResult) then
|
||
XDataCenter.TaikoMasterManager.SetJustPassedStageId(stageId)
|
||
XDataCenter.FubenManager.ShowReward(winData)
|
||
else
|
||
XLuaUiManager.Open("UiTaikoMasterSettlement", winData, isPassed and historyScore)
|
||
end
|
||
end
|
||
|
||
function XTaikoMasterManager.FinishFight(settle)
|
||
if settle.IsWin then
|
||
XDataCenter.FubenManager.ChallengeWin(settle)
|
||
else
|
||
XDataCenter.TaikoMasterManager.SetJustPassedStageId(settle.StageId)
|
||
XDataCenter.FubenManager.ChallengeLose(settle)
|
||
end
|
||
end
|
||
|
||
function XTaikoMasterManager.CallFinishFight()
|
||
local res = XDataCenter.FubenManager.FubenSettleResult
|
||
if res then
|
||
XDataCenter.FubenManager.CallFinishFight()
|
||
else
|
||
local beginData = XDataCenter.FubenManager.GetFightBeginData()
|
||
local stageId = beginData.StageId
|
||
XTaikoMasterManager.SetJustPassedStageId(stageId)
|
||
XDataCenter.FubenManager.CallFinishFight()
|
||
end
|
||
end
|
||
|
||
function XTaikoMasterManager.SetJustPassedStageId(stageId)
|
||
_JustPassedStageId = stageId
|
||
end
|
||
|
||
function XTaikoMasterManager.GetJustPassedStageId()
|
||
local stageId = _JustPassedStageId
|
||
_JustPassedStageId = false
|
||
return stageId
|
||
end
|
||
|
||
function XTaikoMasterManager.GetSongState4RedDot(songId)
|
||
local key = XTaikoMasterConfigs.GetSaveKey(songId)
|
||
local data = XSaveTool.GetData(key)
|
||
if data then
|
||
return data
|
||
end
|
||
if XTaikoMasterManager.IsSongUnlock(songId) then
|
||
return XTaikoMasterConfigs.SongState.JustUnlock
|
||
else
|
||
return XTaikoMasterConfigs.SongState.Lock
|
||
end
|
||
end
|
||
|
||
function XTaikoMasterManager.SetSongBrowsed4RedDot(songId)
|
||
local key = XTaikoMasterConfigs.GetSaveKey(songId)
|
||
local data = XSaveTool.GetData(key)
|
||
if not data then
|
||
XSaveTool.SaveData(key, XTaikoMasterConfigs.SongState.Browsed)
|
||
XEventManager.DispatchEvent(XEventId.EVENT_TAIKO_MASTER_SONG_BROWSED_UPDATE, songId)
|
||
end
|
||
end
|
||
|
||
-- 关卡历史最高分数下的准确率
|
||
function XTaikoMasterManager.GetMyAccuracyUnderMaxScore(songId, difficulty)
|
||
local stageId = XTaikoMasterManager.GetStageId(songId, difficulty)
|
||
return BaseInfo:GetMyAccuracyUnderMaxScore(stageId)
|
||
end
|
||
|
||
-- 关卡历史最高分数下的连击数
|
||
function XTaikoMasterManager.GetMyComboUnderMaxScore(songId, difficulty)
|
||
local stageId = XTaikoMasterManager.GetStageId(songId, difficulty)
|
||
return BaseInfo:GetMyComboUnderMaxScore(stageId)
|
||
end
|
||
|
||
--region request
|
||
XTaikoMasterManager.RequestSaveSetting = function(appearScale, judgeScale)
|
||
XNetwork.CallWithAutoHandleErrorCode(
|
||
"TaikoMasterModifyOffsetRequest",
|
||
{AppearOffset = appearScale, JudgeOffset = judgeScale},
|
||
function(result)
|
||
if result.Code ~= XCode.Success then
|
||
return
|
||
end
|
||
BaseInfo:SetSetting(appearScale, judgeScale)
|
||
end
|
||
)
|
||
end
|
||
|
||
XTaikoMasterManager.RequestRankData = function(songId)
|
||
XNetwork.CallWithAutoHandleErrorCode(
|
||
"TaikoMasterGetRankInfoRequest",
|
||
{StageId = XTaikoMasterManager.GetStageId4Rank(songId)},
|
||
function(result)
|
||
if result.Code ~= XCode.Success then
|
||
return
|
||
end
|
||
BaseInfo:SetRankData(songId, result)
|
||
end
|
||
)
|
||
end
|
||
--endregion
|
||
|
||
--region Notify
|
||
XTaikoMasterManager.NotifyTaikoMasterData = function(data)
|
||
BaseInfo:SetData(data)
|
||
end
|
||
--endregion
|
||
|
||
return XTaikoMasterManager
|
||
end
|
||
|
||
--region Notify
|
||
XRpc.NotifyTaikoMasterData = function(data)
|
||
XDataCenter.TaikoMasterManager.NotifyTaikoMasterData(data.TaikoMasterData)
|
||
end
|
||
--endregion
|