local Stratagem_Model = {} local private = {} local stratagem_opt_pb = require "Proto.stratagem_opt_pb" local stratagemInfo = nil local StratagemDataList = {} local EventSystem = require('Event/EventSystem') private.talentSortedList = {} Stratagem_Model.TalentStateEnum = { HasFinish = 0,--已满级 UnableActivePre = 1,--尚无法激活,因为前置满足 UnableActiveCost = 2,--尚无法激活,因为感悟消耗不够 AbleActive = 3,--当前可激活 } function Stratagem_Model.OnStartup() NetManager.RegisterMsgCB(MessageEnums.MessageStratagemActivate, private.OnStratagemActivateResp) NetManager.RegisterMsgCB(MessageEnums.MessageStratagemLearnLv, private.OnStratagemLearnLvResp) NetManager.RegisterMsgCB(MessageEnums.MessageStratagemTalentLv, private.OnStratagemTalentLvResp) NetManager.RegisterMsgCB(MessageEnums.MessageStratagemResetTalent, private.OnStratagemResetTalentResp) NetManager.RegisterMsgCB(MessageEnums.MessageStratagemEquip, private.OnStratagemEquipResp) NetManager.RegisterMsgCB(MessageEnums.MessageStratagem, private.OnStratagemResp) local list = {} for _,data in DataSheetManager.StratagemData:GetEnumerator() do table.insert(StratagemDataList, data) end end function Stratagem_Model.StratagemReq() local msg = stratagem_opt_pb.StratagemReq() NetManager.SendMessage(MessageEnums.MessageStratagem, msg) end function Stratagem_Model.StratagemActivateReq(id) local msg = stratagem_opt_pb.StratagemActivateReq() msg.StratagemID = id NetManager.SendMessage(MessageEnums.MessageStratagemActivate, msg) end function Stratagem_Model.StratagemLearnLvReq(id) local msg = stratagem_opt_pb.StratagemLearnLvReq() msg.StratagemID = id NetManager.SendMessage(MessageEnums.MessageStratagemLearnLv, msg) end function Stratagem_Model.StratagemEquipReq(slots) local msg = stratagem_opt_pb.StratagemEquipReq() local isChange = false local count = 0 for k,v in pairs(slots) do table.insert(msg.SlotID, k) table.insert(msg.SlotStratagemID, v) if Stratagem_Model.GetSlotId(v) ~= k then isChange = true end count = count + 1 end if isChange or count ~= #stratagemInfo.Equip.StratagemID then NetManager.SendMessage(MessageEnums.MessageStratagemEquip, msg) else CTL.Tips.AddTipsMsgAndPlaySound(Const_IDS.IDS_GuildWar_NothingToSave) return true end end function Stratagem_Model.StratagemTalentLvReq(stratagemID, pointID) local msg = stratagem_opt_pb.StratagemTalentLvReq() msg.StratagemID = stratagemID msg.PointID = pointID NetManager.SendMessage(MessageEnums.MessageStratagemTalentLv, msg) end function Stratagem_Model.StratagemResetTalentReq(stratagemID) local msg = stratagem_opt_pb.StratagemResetTalentReq() msg.StratagemID = stratagemID NetManager.SendMessage(MessageEnums.MessageStratagemResetTalent, msg) end function Stratagem_Model.GetStratagemInfo(id) if stratagemInfo and stratagemInfo.Infos then for i,v in ipairs(stratagemInfo.Infos) do if v.StratagemID == id then return v end end end end --获取当前感悟点 function Stratagem_Model.GetCurrTalentPoint(id) local info = Stratagem_Model.GetStratagemInfo(id) if info then return info.CurrTalentPoint, info.CurrUsedTalentPoint end return 0, 0 end --获取下一个感悟状态,参数是StratagemTalent中的前两个主键 function Stratagem_Model.GetTalentState(id, pointId) local curLev = Stratagem_Model.GetTalentPointLevel(id, pointId) local _, nextData = DataSheetManager.StratagemTalent:TryGetDataByID_PointID_PointLevel(id, pointId, curLev + 1) if nextData == nil then return Stratagem_Model.TalentStateEnum.HasFinish end --前置是否已完成 local curPoint, curUsedPoint = Stratagem_Model.GetCurrTalentPoint(id) if curUsedPoint < nextData.TalentLimit then return Stratagem_Model.TalentStateEnum.UnableActivePre end for i, v in ipairs(nextData.NeedPoint_Table) do local lev = Stratagem_Model.GetTalentPointLevel(id, v.NeedPointID) if lev < v.NeedPointLevel then return Stratagem_Model.TalentStateEnum.UnableActivePre end end --感悟消耗是否足够 if curPoint < nextData.TalentCost then return Stratagem_Model.TalentStateEnum.UnableActiveCost end return Stratagem_Model.TalentStateEnum.AbleActive end --获取感悟等级 function Stratagem_Model.GetTalentPointLevel(id, pointId) local info = Stratagem_Model.GetStratagemInfo(id) if info then local talent = info.Talent for i, v in ipairs(talent.PointID) do if v == pointId then return talent.PointLv[i] end end end return 0 end function private.OnStratagemResp(msgResp) if msgResp.Resp.Code == 0 then stratagemInfo = msgResp CTL.Stratagem.CheckRedPoint() -- 纳灵系统刷新 MDL.Reborn.SyncRFMaterialDic(MDL.Reborn.RFMaterialType.Stratagem) --计略图鉴初始化依赖这儿的计略数据,这里补充初始化(Init里只会执行一次) MDL.StratagemLibrary.Init() end end function Stratagem_Model.IsInfoInit() return stratagemInfo ~= nil end function private.OnStratagemActivateResp(msgResp) if msgResp.Resp.Code == 0 then table.insert(stratagemInfo.Infos, msgResp.Info) private.CopyEquip(msgResp) UIManager.OpenAndPushAll(Const_UI_Lua.UIEnum.UIStratagemActiveSuccess, msgResp.Info) EventSystem.Dispatch(EventID.UI_Stratagem_Active, msgResp.Info) CTL.Stratagem.CheckRedPoint() CTL.StratagemLibrary.CheckRedPoint() -- 纳灵系统刷新 MDL.Reborn.SyncRFMaterialDic(MDL.Reborn.RFMaterialType.Stratagem) end end function private.OnStratagemLearnLvResp(msgResp) if msgResp.Resp.Code == 0 then for i,v in ipairs(stratagemInfo.Infos) do if v.StratagemID == msgResp.Info.StratagemID then v.Learn.CurrLvID = msgResp.Info.Learn.CurrLvID v.Learn.CurrPointID = msgResp.Info.Learn.CurrPointID v.CurrTalentPoint = msgResp.Info.CurrTalentPoint v.StratagemGS = msgResp.Info.StratagemGS v.pictorialLevel = msgResp.Info.pictorialLevel EventSystem.Dispatch(EventID.UI_Stratagem_LearnRefresh, msgResp.Info) CTL.StratagemLibrary.CheckRedPoint() private.ShowLearnLvTips(msgResp.Info) break end end CTL.Stratagem.CheckRedPoint() -- 纳灵系统刷新 MDL.Reborn.SyncRFMaterialDic(MDL.Reborn.RFMaterialType.Stratagem) end end --region 计略图鉴详细数据,放这儿了。图鉴模块只放整体数据 --获得激活的图鉴数 function Stratagem_Model.GetUnlockPictorialCount() local count = 0 if stratagemInfo and stratagemInfo.Infos then for _, v in ipairs(stratagemInfo.Infos) do if v.pictorialLevel > 0 then count = count + 1 end end end return count end --获取图鉴等级.注意和其他图鉴不一样,0是未激活,大于0是激活且对应等级。即计略没有0级的激活状态 function Stratagem_Model.GetPictorialLevel(id) if stratagemInfo and stratagemInfo.Infos then for _,v in ipairs(stratagemInfo.Infos) do if v.StratagemID == id then return v.pictorialLevel end end end return 0 end --更新图鉴详情数据。是的,图鉴信息需要开放给计略图鉴模块升级并触发playerChange的时候更新,图鉴信息还可以被本模块激活或钻研的时候更新。 --因为不像其他图鉴系统升级的时候可以通过playerChange先触发母系统的更新,图鉴信息直接在母系统维护好了。 --这里先让计略的图鉴等级数据通过两个模块来更新,其实并不优雅。 function Stratagem_Model.SyncPictorialLevelInfo(id, level) if stratagemInfo and stratagemInfo.Infos then for _, v in ipairs(stratagemInfo.Infos) do if v.StratagemID == id then v.pictorialLevel = level break end end end end --endregion function private.ShowLearnLvTips(info) local levelId = info.Learn.CurrLvID local pointId = info.Learn.CurrPointID local learnData = DataSheetManager.StratagemLearn:GetDataByID_LevelID_PointId(info.StratagemID, levelId, pointId) local maxCount = DataSheetManager.StratagemLearn:GetDataLengthByID_LevelID_PointId(info.StratagemID, levelId) if pointId == maxCount then CTL.StratagemLibrary.CheckRedPoint()--图鉴可升级,检查红点 UIManager.OpenView(Const_UI_Lua.UIEnum.UIStratagemActivePopUp, info) else UIManager.OpenView(Const_UI_Lua.UIEnum.UIHeroAdvancedTips, {isStratagem = true, attr = learnData.Attr_Table}) end end function private.OnStratagemTalentLvResp(msgResp) if msgResp.Resp.Code == 0 then CTL.Tips.AddTipsMsg(Const_IDS["IDS_Stratagem_TalentSucceed"]) for i,v in ipairs(stratagemInfo.Infos) do if v.StratagemID == msgResp.Info.StratagemID then table.remove(stratagemInfo.Infos, i) table.insert(stratagemInfo.Infos, i, msgResp.Info) EventSystem.Dispatch(EventID.UI_Stratagem_TalentRefresh, true) break end end CTL.Stratagem.CheckRedPoint() -- 纳灵系统刷新 MDL.Reborn.SyncRFMaterialDic(MDL.Reborn.RFMaterialType.Stratagem) end end function private.OnStratagemResetTalentResp(msgResp) if msgResp.Resp.Code == 0 then for i,v in ipairs(stratagemInfo.Infos) do if v.StratagemID == msgResp.Info.StratagemID then table.remove(stratagemInfo.Infos, i) table.insert(stratagemInfo.Infos, i, msgResp.Info) EventSystem.Dispatch(EventID.UI_Stratagem_TalentRefresh, false) break end end CTL.Stratagem.CheckRedPoint() -- 纳灵系统刷新 MDL.Reborn.SyncRFMaterialDic(MDL.Reborn.RFMaterialType.Stratagem) end end function private.OnStratagemEquipResp(msgResp) if msgResp.Resp.Code == 0 then private.CopyEquip(msgResp) CTL.Stratagem.CheckRedPoint() EventSystem.Dispatch(EventID.UI_Stratagem_EquipRefresh) end end function private.CopyEquip(msgResp) table.clear(stratagemInfo.Equip.SlotID) table.clear(stratagemInfo.Equip.StratagemID) for i,v in ipairs(msgResp.Equip.SlotID) do table.insert(stratagemInfo.Equip.SlotID, v) end for i,v in ipairs(msgResp.Equip.StratagemID) do table.insert(stratagemInfo.Equip.StratagemID, v) end end function Stratagem_Model.GetSlotId(stratagemID) for i,v in ipairs(stratagemInfo.Equip.StratagemID) do if v == stratagemID then return stratagemInfo.Equip.SlotID[i] end end end function Stratagem_Model.GetStratagemIdBySlotId(slotId) for i,v in ipairs(stratagemInfo.Equip.SlotID) do if v == slotId then return stratagemInfo.Equip.StratagemID[i] end end end function Stratagem_Model.GetSortList() table.sort(StratagemDataList, private.SortData) return StratagemDataList end function Stratagem_Model.IsCanActive(data) for i,v in ipairs(data.Item_Table) do local itemId = v.ItemID local num = v.ItemNum local haveCount = MDL.Bag.GetItemCount(itemId) if haveCount < num then return false end end return true end function Stratagem_Model.IsCanLearnLv(data) local info = Stratagem_Model.GetStratagemInfo(data.ID) if info then local levelId, pointId = Stratagem_Model.GetLearnNextId(data.ID) if levelId then local learnData = DataSheetManager.StratagemLearn:GetDataByID_LevelID_PointId(data.ID, levelId, pointId) for i,v in ipairs(learnData.Item_Table) do local ItemID = v.ItemID local num = v.ItemNum local haveCount = CTL.Bag.GetHasCountByItemCfgID(ItemID) if haveCount < num then return false end end return true end else return false end return false end function private.TalentSortRule(talent1, talent2) return talent1.sortID < talent2.sortID end function Stratagem_Model.GetTalentSortedList(talentID) table.clearArray(private.talentSortedList) for i, v in DataSheetManager.StratagemTalent:GetDataByID_PointID_PointLevel(talentID) do if v.PointLevel == 1 then local curLev = Stratagem_Model.GetTalentPointLevel(talentID, v.PointID) if curLev > 0 then local data = DataSheetManager.StratagemTalent:GetDataByID_PointID_PointLevel(talentID, v.PointID, curLev) table.insert(private.talentSortedList, data) end end end if #private.talentSortedList > 0 then table.sort(private.talentSortedList, private.TalentSortRule) end return private.talentSortedList end function Stratagem_Model.IsCanTalentLv(data) for i, v in DataSheetManager.StratagemTalent:GetDataByID_PointID_PointLevel(data.ID) do if v.PointLevel == 1 then local state = Stratagem_Model.GetTalentState(data.ID, v.PointID) if state == Stratagem_Model.TalentStateEnum.AbleActive then return true end end end return false end --按照设计 两个情况 --1、当钻研阶段X非韬略模板ID最大的时候,其对应的点ID最大即视为到了下一阶X+1 --2、当钻研阶段X是韬略模板ID最大的时候,其对应的点ID最大仍为当前阶,存在一个X阶满(Max)的状态 function Stratagem_Model.GetLearnNextId(id) local stratagemInfo = MDL.Stratagem.GetStratagemInfo(id) local levelId = stratagemInfo.Learn.CurrLvID local pointId = stratagemInfo.Learn.CurrPointID local maxCount = DataSheetManager.StratagemLearn:GetDataLengthByID_LevelID_PointId(id, levelId) local maxLevel = 0 for i,v in DataSheetManager.StratagemLearn:GetDataByID_LevelID_PointId(id) do maxLevel = v.LevelID end if maxLevel == levelId and pointId >= maxCount then --对应2的情况 return nil elseif maxCount <= pointId then --对应1的情况 levelId = levelId + 1 pointId = 1 else pointId = pointId + 1 end return levelId, pointId end function Stratagem_Model.IsCanEquip() if stratagemInfo then local activeCount = #stratagemInfo.Infos local equipCount = private.GetEquipCount() local soltActiveCount = private.GetEquipSoltActiveCount() return equipCount < soltActiveCount and activeCount > equipCount end end function Stratagem_Model.GetActiveCount() return #stratagemInfo.Infos end function private.GetEquipCount() local count = 0 for i,v in ipairs(stratagemInfo.Equip.StratagemID) do if v > 0 then count = count + 1 end end return count end function private.GetEquipSoltActiveCount() local count = 0 for _,data in DataSheetManager.StratagemEquip:GetEnumerator() do if MDL.Unlock.IsTriggerIdComplete(data.TriggerID) then count = count + 1 end end return count end function private.SortData(a, b) local aInfo = Stratagem_Model.GetStratagemInfo(a.ID) local bInfo = Stratagem_Model.GetStratagemInfo(b.ID) if not aInfo and not bInfo then if Stratagem_Model.IsCanActive(a) and not Stratagem_Model.IsCanActive(b) then return true elseif not Stratagem_Model.IsCanActive(a) and Stratagem_Model.IsCanActive(b) then return false end elseif not aInfo or not bInfo then if not aInfo then if Stratagem_Model.IsCanActive(a) then return true end else if Stratagem_Model.IsCanActive(b) then return false end end end local slotA = Stratagem_Model.GetSlotId(a.ID) local slotB = Stratagem_Model.GetSlotId(b.ID) if slotA and slotB then return slotA < slotB else if slotA then return true elseif slotB then return false end end if bInfo and aInfo then return a.SortId > b.SortId elseif bInfo then return false elseif aInfo then return true end return a.SortId > b.SortId end return Stratagem_Model