local GoldenHeroAnecdote_Model = {} local private = {} local EventSystem = require('Event/EventSystem') local fuben_pb = require 'Proto.fuben_pb' local gold_hero_anecdote_opt_pb = require 'Proto.gold_hero_anecdote_opt_pb' GoldenHeroAnecdote_Model.TextType = { Hero = 1, --武将 Narrator = 2, --旁边 Others = 3, --其他 } GoldenHeroAnecdote_Model.AnecdoteState = { Lock = 0, --未解锁 Unlock = 1, --解锁未通关 Passed = 2, --通关未领取 Collected = 3, --已领取奖励 } function GoldenHeroAnecdote_Model.OnStartup() NetManager.RegisterMsgCB(MessageEnums.MessageGoldHeroAnecdotesReward, private.GoldHeroAnecdotesRewardResp) -- 武将轶事-关卡扫荡 NetManager.RegisterMsgCB(MessageEnums.MessageGoldHeroAnecdotesSweep, private.GoldHeroAnecdotesSweepResp) -- 武将轶事-领取关卡奖励 private.ActivityType = MDL.OperationActivity.ActivityType.GoldenHero private.recommendGs = {} private.anecdoteInfo = {} private.anecdoteUnlock = {} end function GoldenHeroAnecdote_Model.GetDefaultIndex(activityId) local heroType = MDL.GoldenHeroMain.GetHeroTypeByActivityId(activityId) local index = 1 for i, v in DataSheetManager.GoldHeroActivityAnecdoteLevel:GetEnumerator() do if heroType == v.HeroType then if GoldenHeroAnecdote_Model.GetAnecdoteStateById(activityId, v.ID) == MDL.GoldenHeroAnecdote.AnecdoteState.Unlock then return index end index = index + 1 end end return index - 1 end function GoldenHeroAnecdote_Model.GetAnecdoteWholeName(anecdoteId) local data = DataSheetManager.GoldHeroActivityAnecdoteLevel:GetDataByID(anecdoteId) return string.FormatByIdsKey("IDS_GoldHeroActivity_AnecdotalHint10", UIUtils.GetLocalizedTxt(Const_IDS[data.BarrierTitle]), UIUtils.GetLocalizedTxt(Const_IDS[data.BarrierName])) end function GoldenHeroAnecdote_Model.GetAnecdoteInfo(activityId) return private.anecdoteInfo[activityId] end function GoldenHeroAnecdote_Model.GetAnecdoteStateById(activityId, anecdoteId) if private.anecdoteInfo[activityId] then if private.anecdoteInfo[activityId][anecdoteId] then return private.anecdoteInfo[activityId][anecdoteId] else logging.error(LTAG.ERROR, "没有activityId:", activityId, " , anecdoteId:", anecdoteId, " 的金将轶事信息!请检查!!!") end else logging.error(LTAG.ERROR, "没有activityId:", activityId, " 的金将轶事信息!请检查!!!") end end function GoldenHeroAnecdote_Model.GetAnecdoteUnlockFlag(activityId, anecdoteId) if private.anecdoteUnlock[activityId] then if private.anecdoteUnlock[activityId][anecdoteId] then private.anecdoteUnlock[activityId][anecdoteId] = nil return true end end return nil end function GoldenHeroAnecdote_Model.GetRecommendGs(activityId, anecdoteId) local recommendGs = MDL.GoldenHeroBoss.GetRecommendGs(activityId) local scoreRate = DataSheetManager.GoldHeroActivityAnecdoteLevel:GetDataByID(anecdoteId).ScoreRate recommendGs = recommendGs * scoreRate --对X-2位进行四舍五入,之后的位数省略为0 local GsStr = tostring(math.floor(recommendGs + 0.5)) local opNum = math.floor(tonumber(string.sub(GsStr, 1, 3)) / 10 + 0.5) recommendGs = opNum * 10 ^ (string.len(GsStr) - 2) local percent = MDL.GoldenHeroAnecdote.GetDampPercentAndTime(activityId, anecdoteId) return recommendGs * percent end ---@public 获取战力衰减的参数 ---@return 百分比, 是否已达上限, 距离下一次时间 function GoldenHeroAnecdote_Model.GetDampPercentAndTime(activityId, anecdoteId) local activityInfo = MDL.OperationActivity.GetOperationActivityInfo(private.ActivityType, activityId) if activityInfo then local startTime = activityInfo.startTime local startCrossDayTime = UTL.Time.GetDayStartTimestamp(startTime) local nowTime = UTL.Time.GetServerTimestamp() local dampDay = UTL.Time.GetGameDiffDayCount(nowTime, startTime) local isMax = true local percent = 0 local dampId = DataSheetManager.GoldHeroActivityAnecdoteLevel:GetDataByID(anecdoteId).GSDampID local dampTable = DataSheetManager.GoldHeroActivityAnecdoteGSDamp:GetDataByID(dampId).GSDampProportion if dampDay >= #dampTable then percent = dampTable[#dampTable] else isMax = false percent = dampTable[dampDay] end local nextStage = dampDay if not isMax then for i = dampDay + 1, #dampTable do if dampTable[i] < percent then nextStage = i - 1 break end end end local leftTime = not isMax and (startCrossDayTime + nextStage * UTL.Time.TotalSecondsOneDay - nowTime) if not isMax and leftTime < 0 then leftTime = 0 --置成0为了防止将负数传入界面中的RepeatFunc中导致界面卡死 logging.error(LTAG.ERROR, "金将轶事活动衰减时间小于0,请程序检查!!!") end return percent, isMax, leftTime end end function GoldenHeroAnecdote_Model.RefreshAnecdoteInfo(anecdotes) if IsServerDataNotNil(anecdotes) then for i, v in ipairs(anecdotes) do local activityId = v.ActivityID if not private.anecdoteInfo[activityId] then private.anecdoteInfo[activityId] = {} end for index, value in ipairs(v.GoldHeroAnecdotes) do local oldState = private.anecdoteInfo[activityId][value.ID] local newState = value.State private.anecdoteInfo[activityId][value.ID] = newState --检测新老状态,设置是否要播放解锁特效 if oldState == GoldenHeroAnecdote_Model.AnecdoteState.Lock and newState == GoldenHeroAnecdote_Model.AnecdoteState.Unlock then if not private.anecdoteUnlock[activityId] then private.anecdoteUnlock[activityId] = {} end private.anecdoteUnlock[activityId][value.ID] = true else if private.anecdoteUnlock[activityId] then private.anecdoteUnlock[activityId][value.ID] = nil end end end CTL.GoldenHeroAnecdote.RefreshAnecdoteRp() EventSystem.Dispatch(EventID.UI_GoldenHeroAnecdote_RefreshInfo, activityId) end end end function GoldenHeroAnecdote_Model.EnterGoldenHeroAnecdoteRequest(levelId, mapID, activityId) if CTL.TeamMatch.IsCanGoOtherScene(LuaConst.LevelType.GoldHeroExperience, mapID) == false then return end local msg = fuben_pb.EnterFubenReq() msg.id = levelId msg.mapType = LuaConst.LevelType.GoldHeroClimbTower msg.mapID = mapID msg.goldHeroInfo.activityId = activityId msg.goldHeroInfo.recommendGS = MDL.GoldenHeroAnecdote.GetRecommendGs(activityId, levelId) NetManager.SendMessage(MessageEnums.MessageEnterFuben, msg) private.SaveTempData(activityId, levelId) CTL.GoldenHeroMain.SetIsOpenedActivity() end function GoldenHeroAnecdote_Model.GoldHeroAnecdotesRewardReq(activityId, id) local msg = gold_hero_anecdote_opt_pb.GoldHeroAnecdotesRewardReq() msg.ActivityId = activityId msg.ID = id NetManager.SendMessage(MessageEnums.MessageGoldHeroAnecdotesReward, msg) end function private.GoldHeroAnecdotesRewardResp(msgResp) end function GoldenHeroAnecdote_Model.GoldHeroAnecdotesSweepReq(activityId, id, sweepNum) local msg = gold_hero_anecdote_opt_pb.GoldHeroAnecdotesSweepReq() msg.ActivityId = activityId msg.ID = id msg.SweepNum = sweepNum NetManager.SendMessage(MessageEnums.MessageGoldHeroAnecdotesSweep, msg) end function private.GoldHeroAnecdotesSweepResp(msgResp) EventSystem.Dispatch(EventID.UI_SweepFuben_Refresh, msgResp.SweepRewardList) end --region ******************************** 关卡结束返回数据处理 ******************************* function GoldenHeroAnecdote_Model.LoadTempData() return private.tempActivityId, private.tempLevelId, private.tempLevelIsFirst end function private.SaveTempData(activityId, levelId) private.tempActivityId = activityId private.tempLevelId = levelId end function GoldenHeroAnecdote_Model.ClearTempData() private.tempActivityId = nil private.tempLevelId = nil end --endregion ******************************** 关卡结束返回数据处理 ******************************* return GoldenHeroAnecdote_Model