local HeroLibrary_Model = {} local private = {} local EventSystem = require('Event/EventSystem') local pictorial_book = require 'Proto.pictorial_book_pb' local TabToKingom = { [0] = LuaConst.Kingdom.Shu, [1] = LuaConst.Kingdom.Wei, [2] = LuaConst.Kingdom.Wu, [3] = LuaConst.Kingdom.Qun } ------------------------------------------ 系统函数 ------------------------------------------ function HeroLibrary_Model.OnStartup() NetManager.RegisterMsgCB(MessageEnums.MessagePictorialLevelUp, private.ResponseUpdateLevel) NetManager.RegisterMsgCB(MessageEnums.MessageOneKeyPictorialLevelUp, private.OnOneKeyPictorialLevelUpResp) EventSystem.Regist(EventID.UI_Reborn_Recast_RecastSuccess, private.OnRecastSuccess) EventSystem.Regist(EventID.UI_HeroSubstitute_Success, private.OnHeroSubstituteSuccess) EventSystem.Regist(EventID.UI_HeroShow_UpdateHeroShow, private.SetInfoDirty) EventSystem.Regist(EventID.UI_Illustration_OneKeyUpLevel, private.OnOneKeyUpLevel) private.isInit = false private.libraryLevel = 0 private.libraryScore = 0 private.shuHeros = {} private.weiHeros = {} private.wuHeros = {} private.qunHeros = {} private.shuUnlockHeroCount = 0 private.weiUnlockHeroCount = 0 private.wuUnlockHeroCount = 0 private.qunUnlockHeroCount = 0 private.levelZeroAttrs = LuaExt.CreateTable(DataSheetManager.AttrData:GetDataCount()) local scoreData = DataSheetManager.HeroPictorialScore:GetDataByLevelID(1) for _, attrData in ipairs (scoreData.Attr_Table) do private.levelZeroAttrs[attrData.AttrType] = 0 end private.levelScoreAttr = LuaExt.CreateTable(DataSheetManager.HeroPictorialScore:GetDataCount()) -- 累加统计每个等级的积分属性 for _, v in DataSheetManager.HeroPictorialScore:GetEnumerator() do local attrs = LuaExt.CreateTable(DataSheetManager.AttrData:GetDataCount()) local formerAttrs = private.levelScoreAttr[v.LevelID - 1] if formerAttrs then for attrType, attrNum in pairs (formerAttrs) do if not attrs[attrType] then attrs[attrType] = attrNum else attrs[attrType] = attrs[attrType] + attrNum end end end for _, attrData in ipairs (v.Attr_Table) do if not attrs[attrData.AttrType] then attrs[attrData.AttrType] = attrData.AttrNum else attrs[attrData.AttrType] = attrs[attrData.AttrType] + attrData.AttrNum end end table.insert(private.levelScoreAttr, attrs) end end function HeroLibrary_Model.OnShutdown() private.shuHeros = nil private.weiHeros = nil private.wuHeros = nil private.qunHeros = nil private.heroAttrs = nil table.clearArray(private.levelScoreAttr) private.levelScoreAttr = nil private.levelZeroAttrs = nil end ----------------------------------------------------------------------------------------------- -- 协议处理 function HeroLibrary_Model.SetLibraryInfo(libraryInfoArray) if not IsServerDataNotNil(libraryInfoArray) then return end --获取武将图鉴信息 local libraryInfo = {} for i,v in ipairs(libraryInfoArray) do if v.type == LuaConst.PictorialType.Hero then libraryInfo = v break end end if IsServerDataNotNil(libraryInfo) then private.libraryLevel = libraryInfo.level private.libraryScore = libraryInfo.score end -- 初始化 if not private.isInit then private.CalAttrs() private.isInit = true end -- 升级弹出提示 CTL.HeroLibrary.ShowLeveUpTipPanel(private.formerLibraryLevel, private.libraryLevel) private.formerLibraryLevel = private.libraryLevel --保存上次图鉴积分等级 EventSystem.Dispatch(EventID.UI_Illustration_HeroLibrary_RefreshBase) end function HeroLibrary_Model.RequestUpdateHeroLevel(heroId) private.isInfoDirty = false private.formerLibraryLevel = private.libraryLevel --保存上次图鉴积分等级 local msg = pictorial_book.PictorialLevelUpReq() msg.id = heroId msg.type = LuaConst.PictorialType.Hero NetManager.SendMessage(MessageEnums.MessagePictorialLevelUp, msg) end function private.ResponseUpdateLevel(msgResp) if msgResp.Resp.Code ~= 0 then return end --因为这里图鉴只有一个Req,而Response不能注册多个,在这里做图鉴的统一转发 if msgResp.type == LuaConst.PictorialType.Hero then private.lastUpdateId = msgResp.id private.UpdateInfoAfterUpdateLevel() else --其他图鉴走 转发 EventSystem.Dispatch(EventID.Illustration_AssignUpdateLevelResponse,msgResp) end CTL.Sound.PlayGameSound("UI_equipment_02") end --图鉴信息变化了 function private.SetInfoDirty() private.isInfoDirty = true private.UpdateInfoAfterUpdateLevel() CTL.HeroLibrary.CheckRedPoint() end --激活/升级后更新图鉴数据 --等升级和playerchange消息都回来以后执行 function private.UpdateInfoAfterUpdateLevel() if private.lastUpdateId ==nil then return end if not private.isInfoDirty then return end local heroNum = DataSheetManager.HeroNum:GetDataByID(private.lastUpdateId) local libraryLevel = HeroLibrary_Model.GetHeroLevel(private.lastUpdateId) if libraryLevel == 0 then -- 解锁 if heroNum.Kingdom == 1 then private.weiUnlockHeroCount = private.weiUnlockHeroCount + 1 elseif heroNum.Kingdom == 2 then private.shuUnlockHeroCount = private.shuUnlockHeroCount + 1 elseif heroNum.Kingdom == 3 then private.wuUnlockHeroCount = private.wuUnlockHeroCount + 1 elseif heroNum.Kingdom == 4 then private.qunUnlockHeroCount = private.qunUnlockHeroCount + 1 end CTL.Tips.AddTipsMsg(string.FormatByIdsKey("IDS_Handbook_Hero_Activate_Tips", UIUtils.GetLocalizedTxt(Const_IDS[heroNum.NameIDS]))) else CTL.Tips.AddTipsMsg(string.FormatByIdsKey("IDS_Handbook_Hero_LevelUp_Tips", UIUtils.GetLocalizedTxt(Const_IDS[heroNum.NameIDS]))) end local curCfg = DataSheetManager.HeroPictorialType:GetDataByHeroPictorialTypeID_PictorialLevel(heroNum.HeroPictorialType, libraryLevel) for i, v in ipairs (curCfg.Attr_Table) do if not private.heroAttrs[v.AttrType] then private.heroAttrs[v.AttrType] = curCfg.Attr_Table[i].AttrNum else private.heroAttrs[v.AttrType] = private.heroAttrs[v.AttrType] + curCfg.Attr_Table[i].AttrNum end end if libraryLevel >= 1 then local formerCfg = DataSheetManager.HeroPictorialType:GetDataByHeroPictorialTypeID_PictorialLevel(heroNum.HeroPictorialType, libraryLevel - 1) for i, v in ipairs (formerCfg.Attr_Table) do if private.heroAttrs[v.AttrType] then private.heroAttrs[v.AttrType] = private.heroAttrs[v.AttrType] - formerCfg.Attr_Table[i].AttrNum end end end EventSystem.Dispatch(EventID.UI_Illustration_HeroLibrary_RefreshBase) EventSystem.Dispatch(EventID.UI_Illustration_HeroLibrary_RefreshPopUp, true) CTL.HeroLibrary.CheckRedPoint() private.lastUpdateId = nil private.isInfoDirty = false end -- function HeroLibrary_Model.GetLibraryLevelAndScore() return private.libraryLevel, private.libraryScore end function HeroLibrary_Model.GetUnlockAndAmountHeroCount(countryTab) local kingdom = TabToKingom[countryTab] if kingdom == LuaConst.Kingdom.Wei then return private.weiUnlockHeroCount, #private.weiHeros elseif kingdom == LuaConst.Kingdom.Shu then return private.shuUnlockHeroCount, #private.shuHeros elseif kingdom == LuaConst.Kingdom.Wu then return private.wuUnlockHeroCount, #private.wuHeros elseif kingdom == LuaConst.Kingdom.Qun then return private.qunUnlockHeroCount, #private.qunHeros end return 0, 0 end function HeroLibrary_Model.GetHeroList(countryTab) local kingdom = TabToKingom[countryTab] if kingdom == LuaConst.Kingdom.Wei then return private.weiHeros elseif kingdom == LuaConst.Kingdom.Shu then return private.shuHeros elseif kingdom == LuaConst.Kingdom.Wu then return private.wuHeros elseif kingdom == LuaConst.Kingdom.Qun then return private.qunHeros end return nil end function HeroLibrary_Model.GetAttrs(isGetScore) if isGetScore then if not private.levelScoreAttr[private.libraryLevel] then return private.levelZeroAttrs end return private.levelScoreAttr[private.libraryLevel] end return private.heroAttrs end function HeroLibrary_Model.IsShowRPByTab(kingdom) if not kingdom then return false end for _, v in ipairs (HeroLibrary_Model.GetHeroList(kingdom)) do if HeroLibrary_Model.IsHeroCanUpdate(v.ID) then return true end end return false end function HeroLibrary_Model.GetAttrValue(attrType, isGetScore) if isGetScore then if not private.levelScoreAttr[private.libraryLevel] then return private.levelZeroAttrs[attrType] end return private.levelScoreAttr[private.libraryLevel][attrType] end return private.heroAttrs[attrType] end function HeroLibrary_Model.GetScoreAttrByLevel(libraryLevel, attrType) return private.levelScoreAttr[libraryLevel][attrType] end function HeroLibrary_Model.GetHeroLevel(heroId) if not heroId then return -1 end local heroInfo = MDL.HeroSelect.GetHeroInfo(heroId) if not heroInfo then return -1 end return heroInfo.pictorialLevel end function HeroLibrary_Model.IsHeroCanUpdate(heroId) local libraryLevel = HeroLibrary_Model.GetHeroLevel(heroId) if libraryLevel == -1 then -- 可解锁 return MDL.HeroSelect.IsHasHero(heroId) else local heroCfg = DataSheetManager.HeroNum:GetDataByID(heroId) local _, nextCfg = DataSheetManager.HeroPictorialType:TryGetDataByHeroPictorialTypeID_PictorialLevel(heroCfg.HeroPictorialType, libraryLevel + 1) if nextCfg then local awakenLevel = 0 if MDL.HeroAwaken.GetIsHeroAwaken(heroId) then awakenLevel = 1 + MDL.HeroAwaken.GetCurStar(heroId) end return MDL.HeroStar.GetHeroStarLevel(heroId) + awakenLevel >= nextCfg.StarLevel end end return false end function private.SortByQualityAndLevel(a, b) -- 按照品质排序 local qualityA = a.HeroQuality local qualityB = b.HeroQuality if qualityA ~= qualityB then return qualityA > qualityB end return a.Rank < b.Rank end function private.OnRecastSuccess(typeId) if typeId == MDL.Reborn.RebornType.Hero then private.CalAttrs() end end function private.OnOneKeyUpLevel(type) if type == LuaConst.PictorialType.Hero then table.clearArray(private.shuHeros) table.clearArray(private.weiHeros) table.clearArray(private.wuHeros) table.clearArray(private.qunHeros) private.weiUnlockHeroCount = 0 private.shuUnlockHeroCount = 0 private.wuUnlockHeroCount = 0 private.qunUnlockHeroCount = 0 private.CalAttrs(true) EventSystem.Dispatch(EventID.UI_Illustration_HeroLibrary_RefreshBase) end end function private.CalAttrs(isForce) private.heroAttrs = LuaExt.CreateTable(DataSheetManager.AttrData:GetDataCount()) for _, t in DataSheetManager.HeroNum:GetEnumerator() do local libraryLevel = HeroLibrary_Model.GetHeroLevel(t.ID) local isUnlock = libraryLevel >= 0 local heros = nil if not private.isInit or isForce then if t.Kingdom == 1 then heros = private.weiHeros private.weiUnlockHeroCount = isUnlock and private.weiUnlockHeroCount + 1 or private.weiUnlockHeroCount elseif t.Kingdom == 2 then heros = private.shuHeros private.shuUnlockHeroCount = isUnlock and private.shuUnlockHeroCount + 1 or private.shuUnlockHeroCount elseif t.Kingdom == 3 then heros = private.wuHeros private.wuUnlockHeroCount = isUnlock and private.wuUnlockHeroCount + 1 or private.wuUnlockHeroCount elseif t.Kingdom == 4 then heros = private.qunHeros private.qunUnlockHeroCount = isUnlock and private.qunUnlockHeroCount + 1 or private.qunUnlockHeroCount end if heros then table.insert(heros, t) end end if isUnlock then local curCfg = DataSheetManager.HeroPictorialType:GetDataByHeroPictorialTypeID_PictorialLevel(t.HeroPictorialType, libraryLevel) for i, v in ipairs (curCfg.Attr_Table) do if not private.heroAttrs[v.AttrType] then private.heroAttrs[v.AttrType] = curCfg.Attr_Table[i].AttrNum else private.heroAttrs[v.AttrType] = private.heroAttrs[v.AttrType] + curCfg.Attr_Table[i].AttrNum end end else -- 初始化0 local curCfg = DataSheetManager.HeroPictorialType:GetDataByHeroPictorialTypeID_PictorialLevel(t.HeroPictorialType, 0) for i, v in ipairs (curCfg.Attr_Table) do if not private.heroAttrs[v.AttrType] then private.heroAttrs[v.AttrType] = 0 end end end end table.sort(private.shuHeros, private.SortByQualityAndLevel) table.sort(private.weiHeros, private.SortByQualityAndLevel) table.sort(private.wuHeros, private.SortByQualityAndLevel) table.sort(private.qunHeros, private.SortByQualityAndLevel) CTL.HeroLibrary.CheckRedPoint() end --武将置换成功,英雄图鉴需重新计算 function private.OnHeroSubstituteSuccess() private.shuUnlockHeroCount = 0 private.weiUnlockHeroCount = 0 private.wuUnlockHeroCount = 0 private.qunUnlockHeroCount = 0 private.shuHeros = {} private.weiHeros = {} private.wuHeros = {} private.qunHeros = {} private.isInit = false private.CalAttrs() private.isInit = true end function HeroLibrary_Model.OneKeyPictorialLevelUpReq(type) local msg = NetManager.GetPB("pictorial_book").OneKeyPictorialLevelUpReq() msg.type = type NetManager.SendMessage(MessageEnums.MessageOneKeyPictorialLevelUp, msg) end function private.OnOneKeyPictorialLevelUpResp(msgResp) if msgResp.Resp.Code == 0 then CTL.Tips.AddTipsMsg(Const_IDS.IDS_Appearance_ShengJiChengGong) EventSystem.Dispatch(EventID.UI_Illustration_OneKeyUpLevel, msgResp.type) end end return HeroLibrary_Model