local Achievement_Controller = {} local private = {} local EventSystem = require('Event/EventSystem') local achievement = require 'Proto.achievement_pb' local ProgressStr_Number = "%d/%d" local ProgressStr_String = "%s/%s" local NobelProgressLevel = "%s%d" local WhiteStr = "%s" local NobilityMaxRankID = DataSheetManager.Nobility:GetDataCount() --------------------------------- 系统函数 ------------------------------ function Achievement_Controller.OnStartup() private.completeAchievementsShowQueues = {} private.shareAchievementData = { playerName = nil, achievementId = 0 } EventSystem.Regist(EventID.FunctionUnlockUpdate, private.RefreshInfoByFunction) end function Achievement_Controller.OnShutdown() private.completeAchievementsShowQueues = nil end ------------------------------------------------------------------------- function Achievement_Controller.IsAchievementCompleted(id) local achievementItem = MDL.Achievement.GetAchievementItemByID(id) return achievementItem.state == achievement.Achieve or achievementItem.state == achievement.Done end function Achievement_Controller.OnCompleteAchievement(achievementData) if not MDL.Unlock.IsUnlock(MDL.Unlock.FunctionType.Achievement) then return end if not achievementData then return end table.insert(private.completeAchievementsShowQueues, achievementData) if not UIManager.IsViewOpened(Const_UI_Lua.UIEnum.UIAchievementRemind) then UIManager.OpenView(Const_UI_Lua.UIEnum.UIAchievementRemind) end end function Achievement_Controller.GetShowCompleteAchievement() if #private.completeAchievementsShowQueues == 0 then return nil end local showData = private.completeAchievementsShowQueues[1] table.remove(private.completeAchievementsShowQueues, 1) return showData end function Achievement_Controller.WipeShowCompleteAchievements() table.clearArray(private.completeAchievementsShowQueues) end function Achievement_Controller.OnShareAchievement(playerName, achievementId) private.shareAchievementData.playerName = playerName private.shareAchievementData.achievementId = achievementId UIManager.OpenView(Const_UI_Lua.UIEnum.UIAchievementTip, private.shareAchievementData) end function Achievement_Controller.GetAchievementTitleAndDesc(achievementItem) if achievementItem then local title = UIUtils.GetLocalizedTxt(Const_IDS[achievementItem.configData.ChildName]) local index = string.find(title, '%%s') if index and index > 0 then title = string.format(title, UIUtils.GetLocalizedTxt(Const_IDS[achievementItem.configData.NameSuffix])) end local idsId = Const_IDS[achievementItem.configData.ChildDes] local desc = UIUtils.GetLocalizedTxt(idsId) index = string.find(desc, '%%s') if index and index > 0 then -- 判断参数个数 local paramCount = 0 while (index ~= nil) do paramCount = paramCount + 1 if index + 2 > string.len(desc) then break end index = string.find(desc, '%%s', index + 2) end local triggerData = DataSheetManager.TriggerID:GetDataByID(achievementItem.configData.ChildTriggerID) if triggerData then local triggerId = triggerData.Unlock_Table[1].UnlockCondition local paramA = triggerData.Unlock_Table[1].UnlockConditionParamA local param1 = string.format(WhiteStr, tonumber(paramA) > 9999 and UTL.String.GetCountStr(tonumber(paramA)) or paramA) if triggerId == 10101 or triggerId == 10406 or triggerId == 10803 then -- 等级相关特殊处理 param1 = string.format(WhiteStr, UTL.Item.GetNobilityByTeamLevel(tonumber(paramA))) elseif triggerId == 42471 then param1 = string.format(WhiteStr, UIUtils.GetLocalizedTxt(Const_IDS[DataSheetManager.HeroNum:GetDataByID(tonumber(paramA)).NameIDS])) elseif triggerId == 30503 then -- 时间特殊处理 param1 = string.format(WhiteStr, tonumber(paramA) / UTL.Time.TotalSecondsOneHour) end if paramCount == 1 then desc = string.format(desc, param1) else desc = string.FormatByIdsId(idsId, param1, triggerData.Unlock_Table[1].UnlockConditionParamB) end end end return title, desc end return "", "" end function Achievement_Controller.GetAchievementProgress(achievementItem) if achievementItem then local triggerData = DataSheetManager.TriggerID:GetDataByID(achievementItem.configData.ChildTriggerID) local triggerId = triggerData.Unlock_Table[1].UnlockCondition if triggerId == 10101 or triggerId == 10406 or triggerId == 10803 then -- 等级相关特殊处理 local curNobelCfg = private.GetNobilityCfgByProgress(achievementItem.progress) local progressStr = string.format(ProgressStr_String, UTL.Item.GetNobilityByTeamLevel(achievementItem.progress), UTL.Item.GetNobilityByTeamLevel(achievementItem.amountProgress)) local percent = achievementItem.progress / achievementItem.amountProgress if curNobelCfg.RankID > 1 then local formerCfg = DataSheetManager.Nobility:GetDataByRankID(curNobelCfg.RankID - 1) percent = (achievementItem.progress - formerCfg.TeamLevelMax) / (achievementItem.amountProgress - formerCfg.TeamLevelMax) end return progressStr, percent elseif triggerId == 30503 then -- 时间特殊处理 local progressStr = string.format(ProgressStr_Number, math.floor(achievementItem.progress / UTL.Time.TotalSecondsOneHour), achievementItem.amountProgress / UTL.Time.TotalSecondsOneHour) return progressStr, achievementItem.progress / achievementItem.amountProgress elseif triggerId == 31406 or triggerId == 31505 or triggerId == 31701 or triggerId == 31703 or triggerId == 40710 or triggerId == 40711 or triggerId == 90024 then if achievementItem.state == achievement.Doing then return string.format(ProgressStr_Number, 0, 1), 0 else return string.format(ProgressStr_Number, 1, 1), 1 end elseif achievementItem.progress > 9999 or achievementItem.amountProgress > 9999 then local progressStr = string.format(ProgressStr_String, UTL.String.GetCountStr(achievementItem.progress), UTL.String.GetCountStr(achievementItem.amountProgress)) return progressStr, achievementItem.progress / achievementItem.amountProgress elseif triggerId == 42471 then local amountProgress = 1 --觉醒trigger的第二个参数表示觉醒武将,进度写死1即可 return string.format(ProgressStr_Number, achievementItem.progress, amountProgress), achievementItem.progress / amountProgress elseif triggerId == 40103 then local amountProgress = triggerData.Unlock_Table[1].UnlockConditionParamB return string.format(ProgressStr_Number, achievementItem.progress, amountProgress), achievementItem.progress / amountProgress end return string.format(ProgressStr_Number, achievementItem.progress, achievementItem.amountProgress), achievementItem.progress / achievementItem.amountProgress end return "", 0 end function private.GetNobilityCfgByProgress(progress) local nobelCfg = nil for _, v in DataSheetManager.Nobility:GetEnumerator() do if not nobelCfg and progress <= v.TeamLevelMax then nobelCfg = v break end end return nobelCfg or DataSheetManager.Nobility:GetDataByRankID(NobilityMaxRankID) end --开关玩法时执行 function private.RefreshInfoByFunction(funcId, isUnlock) if funcId == MDL.Unlock.FunctionType.Achievement then if not isUnlock then private.EndAndCloseGamePlay() end end end function private.EndAndCloseGamePlay() logging.log(LTAG.LOG, "EndAndCloseGamePlay--Achievement_Controller") UIManager.CloseView(Const_UI_Lua.UIEnum.UICommonNoteView) UIManager.CloseView(Const_UI_Lua.UIEnum.UIPreviewItemTips) UIManager.CloseView(Const_UI_Lua.UIEnum.UIAchievementPandect) UIManager.CloseView(Const_UI_Lua.UIEnum.UIAchievementReward) UIManager.CloseView(Const_UI_Lua.UIEnum.UICommonEquipTips) UIManager.CloseView(Const_UI_Lua.UIEnum.UIAchievementInfo) UIManager.CloseView(Const_UI_Lua.UIEnum.UIAchievementShare) EventSystem.Dispatch(EventID.UI_Achievement_CloseGamePlay) end return Achievement_Controller