| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383 |
- local CardData = class("CardData", require("DataBase"))
- function CardData:ctor()
- self.data = {}
- self.cardSuitMap = {}
- end
- local function SortRule(a, b)
- if a.CardType == b.CardType then
- return a.cfgId < b.cfgId
- else
- return a.CardType > b.CardType
- end
- end
- function CardData:InitCardData(data)
- local cardMap = {}
- local cardTypes = {}
- local cfgMgr = ManagerContainer.CfgMgr
- if data and data.card_list then
- for i = 1, #data.card_list do
- local cardData = data.card_list[i]
- if cardData and cardData.num > 0 then
- local card, type = self:ProtocalDataToCardData(cardData)
- local itemCfgData = cfgMgr:GetItemById(card.cfgId)
- if not itemCfgData then
- LogError("[Wboy] ".. tostring(card.cfgId) .. " 道具ID不存在")
- else
- cardMap[card.cfgId] = card
- if cardTypes[type] == nil then
- cardTypes[type] = {}
- end
- cardTypes[type][#cardTypes[type] + 1] = card
- end
- end
- end
- end
- self.data.cardMap = cardMap
- self.data.cardTypes = cardTypes
- for _,v in pairs(self.data.cardTypes) do
- CommonUtil.ArraySortSelections(v, Enum.TableSortRule.Down, "CardType", "CardLevel", "cfgId")
- --table.sort(v, SortRule)
- end
- for i = 1, 6 do
- self:RefreshEquipedCardSuitData(i)
- end
- ManagerContainer.RedPointMgr.HeroRPCtr:InitCardSlotState(data.card_slot_list)
- end
- function CardData:RefreshEquipedCardSuitData(id)
- if not self.cardSuitMap[id] then
- self.cardSuitMap[id] = {0,{}, {}, false, 0}
- else
- if not self:GetCardSuitStateById(id) then
- self.cardSuitMap[id][5] = self.cardSuitMap[id][1] - 1
- else
- self.cardSuitMap[id][5] = self.cardSuitMap[id][1]
- end
- end
- local slot = ManagerContainer.DataMgr.UserData:GetSlotInfoById(id)
- if not slot then
- return
- end
- local equipedCards = {}
- for _,v in pairs(slot.slot_list) do
- local cardList = v.card_id_list
- for _,v1 in pairs(cardList) do
- if v1 and v1 > 0 then
- equipedCards[#equipedCards + 1] = v1
- end
- end
- end
- local cloneEquips
- local allCfgDatas = ManagerContainer.CfgMgr:GetAllCardSuitNewCfg()
- for i = #allCfgDatas, 1, -1 do
- local cfgData = allCfgDatas[i]
- local enoughCount = {}
- local count = {}
- cloneEquips = clone(equipedCards)
- for j = #cfgData.TriggerConditions, 1, -1 do
- local condition = cfgData.TriggerConditions[j]
- local type = condition[1]
- local lv = condition[2]
- local num = condition[3]
- enoughCount[j] = num
- count[j] = 0
- for m = #cloneEquips, 1, -1 do
- local cfgId = cloneEquips[m]
- local cardCfgData = ManagerContainer.CfgMgr:GetCardDataById(cfgId)
- if cardCfgData and cardCfgData.CardType >= type and cardCfgData.CardLevel >= lv then
- count[j] = count[j] + 1
- table.remove(cloneEquips, m)
- if count[j] >= enoughCount[j] then
- break
- end
- end
- end
- count[j] = math.min(count[j], enoughCount[j])
- self.cardSuitMap[id] = {cfgData.Id, count, enoughCount, false, self.cardSuitMap[id][5]}
- end
- local result = true
- for j = 1,#count do
- if count[j] < enoughCount[j] then
- result = false
- break
- end
- end
- if result then
- self.cardSuitMap[id][4] = true
- return
- end
- end
- end
- function CardData:RefreshAllEquipedCardSuitData()
- if self.cardSuitMap then
- for key, value in pairs(self.cardSuitMap) do
- self:RefreshEquipedCardSuitData(key)
- end
- end
- end
- function CardData:GetCardSuitLvById(id)
- return self.cardSuitMap[id] and self.cardSuitMap[id][1] or 0
- end
- function CardData:GetCardSuitLastLvById(id)
- return self.cardSuitMap[id] and self.cardSuitMap[id][5] or 0
- end
- function CardData:GetCardSuitCountById(id)
- return self.cardSuitMap[id] and self.cardSuitMap[id][2] or 0, self.cardSuitMap[id] and self.cardSuitMap[id][3] or 0
- end
- function CardData:GetCardSuitStateById(id)
- return self.cardSuitMap[id] and self.cardSuitMap[id][4] or false
- end
- function CardData:GetAllCardDataMap()
- return self.data.cardMap
- end
- function CardData:GetCardById(id)
- return self.data.cardMap[id]
- end
- function CardData:GetCardCountById(id)
- return self.data.cardMap[id] and self.data.cardMap[id].num or 0
- end
- function CardData:GetAllCardDatasByType(type)
- return self.data.cardTypes[type]
- end
- function CardData:RefreshCardDatas(card_list)
- if card_list == nil then return nil end
- -- 是否为新增道具, 默认为新增
- local addCards = {}
- local cardMap = self.data.cardMap
- local cardTypes = self.data.cardTypes
- local isNeedSort = {false,false,false,false,false,false}
- local cfgMgr = ManagerContainer.CfgMgr
- for _,item in ipairs(card_list) do
- local cfgId = item.config_id
- local itemCfgData = cfgMgr:GetItemById(cfgId)
- if not itemCfgData then
- LogError("[Wboy] ".. cfgId .. " 道具ID不存在")
- else
- local num = item.num
- local card = cardMap[cfgId]
- if num <= 0 then
- -- 删除装备
- if card then
- cardMap[cfgId] = nil
- for i = 1, 6 do
- local cardList = cardTypes[i]
- if cardList ~= nil then
- for i,v in ipairs(cardList) do
- if v.cfgId == card.cfgId then
- table.remove(cardList, i)
- end
- end
- end
- end
- end
- else
- -- 更新装备
- local lastnum = card and card.num or 0
- if card then
- card.num = num
- else
- local type = 1
- card, type = self:ProtocalDataToCardData(item)
- cardMap[cfgId] = card
- if cardTypes[type] == nil then
- cardTypes[type] = {}
- end
- cardTypes[type][#cardTypes[type] + 1] = card
- isNeedSort[type] = true
- end
- local addNum = num - lastnum
- if addNum > 0 then
- if addCards[cfgId] then
- addCards[cfgId] = addCards[cfgId] + addNum
- else
- addCards[cfgId] = addNum
- end
- end
- end
- end
- end
- for _,v in pairs(self.data.cardTypes) do
- CommonUtil.ArraySortSelections(v, Enum.TableSortRule.Down, "CardType", "CardLevel", "cfgId")
- --table.sort(v, SortRule)
- end
- return addCards
- end
- function CardData:RegisterNetEvents()
- ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_STARTUP_INFO_CARD_NTF, function(data)
- self:InitCardData(data.role_card_info)
- end)
- ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_CARD_CHANGE_NTF, function(data)
- local addCards = self:RefreshCardDatas(data.card_list)
- ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.CARD_CHANGE)
- ManagerContainer.RedPointMgr.HeroRPCtr:RefreshRoleCardRP()
- if data.ignore then
- else
- ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.EID_EQUIP_AND_ITEM_ADD, addCards)
- end
- end)
- ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_CARD_MOUNT_ACK, function(data)
- if data.error == Enum.NetErrorCode.ERROR_OK then
- self:RefreshAllEquipedCardSuitData()
- ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.CARD_LIST_REFRESH)
- ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.REFRESH_CARD_SUIT)
- end
- end)
- ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_CARD_DOWN_ACK, function(data)
- if data.error == Enum.NetErrorCode.ERROR_OK then
- self:RefreshAllEquipedCardSuitData()
- ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.CARD_LIST_REFRESH)
- ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.REFRESH_CARD_SUIT)
- end
- end)
- ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_CARD_COMPOSE_ACK, function(data)
- if data.error == Enum.NetErrorCode.ERROR_OK then
- ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.GET_ONE_BIG_CARD_AFTER_RECREATE, data.new_card_id)
- --ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.CARD_RECREATE_REFRESH, data.new_card_id)
- end
- end)
- ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_CARD_DECOMPOSE_ACK, function(data)
- if data.error == Enum.NetErrorCode.ERROR_OK then
- ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.CARD_RECREATE_REFRESH)
- end
- end)
- ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_CARD_UP_GRADE_ACK, function(data)
- if data.error == Enum.NetErrorCode.ERROR_OK then
- --ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.GET_ONE_BIG_CARD_AFTER_COMPOSE, data.config_ids[1])
- ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.CARD_RECREATE_REFRESH)
- CommonUtil.ACKShowRewardList(data.config_ids);
- end
- end)
- ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_CARD_EQUIP_ALL_ACK, function (data)
- if data.error == Enum.NetErrorCode.ERROR_OK then
- ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.HERO_EQUIP_REFRESH)
- ManagerContainer.RedPointMgr.HeroRPCtr:RefreshRoleCardSlotRP(data.hero_id)
- end
- end)
- ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_CARD_EQUIP_DOWN_ACK, function (data)
- if data.error == Enum.NetErrorCode.ERROR_OK then
- ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.HERO_EQUIP_REFRESH)
- end
- end)
- ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_CARD_UP_GRADE_ALL_ACK, function (data)
- if data.error == Enum.NetErrorCode.ERROR_OK then
- ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.HERO_EQUIP_REFRESH)
- end
- end)
- ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_CARD_LEVEL_EXCHANGE_ACK, function (data)
- if data.error == Enum.NetErrorCode.ERROR_OK then
- ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.CARD_TRANS_REFRESH,{leftId = data.source_card_id ,rightId = data.target_card_id})
- end
- end)
- end
- function CardData:SendMvpCardTransReq(leftId,rightId)
- ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_CARD_LEVEL_EXCHANGE_REQ,{source_card_id = leftId,target_card_id = rightId})
- end
- function CardData:Clear()
- self.data = {}
- self.cardSuitMap = {}
- end
- function CardData:Destroy()
- if self.Clear then
- self:Clear()
- end
- self:UnRegisterNetEvents()
- end
- function CardData:UnRegisterNetEvents()
- end
- function CardData:ProtocalDataToCardData(protocalData)
- local cardCfgData = ManagerContainer.CfgMgr:GetCardDataById(protocalData.config_id)
- local cardData = {}
- cardData.cfgId = protocalData.config_id
- cardData.num = protocalData.num
- cardData.timeStamp = protocalData.time_stamp
- cardData.CardType = cardCfgData.CardType
- cardData.CardLevel = cardCfgData.CardLevel
- cardData.FightPower = cardCfgData.FightPower
- cardData.Profession = cardCfgData.Profession
- cardData.Attribute2 = cardCfgData.Attribute2
- cardData.CardLocation = cardCfgData.CardLocation
- return cardData, cardCfgData.CardLocation
- end
- function CardData:CanCurCardUp(cfgId, needNum, remainRes, equiped)
- local cardCfgData = ManagerContainer.CfgMgr:GetCardDataById(cfgId)
- local nextLevelCfgData = ManagerContainer.CfgMgr:GetCardDataById(cfgId + 100)
- if not nextLevelCfgData then
- return false, 3
- end
- local cardLogicData = ManagerContainer.DataMgr.CardData:GetCardById(cfgId)
- if cardCfgData == nil then
- return false, 3
- end
- local totalNum = 0
- if cardLogicData ~= nil then
- totalNum = cardLogicData.num
- end
- local cost = cardCfgData.UpCost * needNum
- if cardCfgData.ToCardId > 0 and cost <= remainRes then
- remainRes = remainRes - cost
- local num = needNum * 3
- if equiped then
- num = num - 1
- end
- if totalNum >= num then
- return true, remainRes, cardCfgData.CardType >= 3
- else
- local num1 = num - totalNum
- if cardCfgData.FromCardId > 0 then
- return self:CanCurCardUp(cardCfgData.FromCardId, num1, remainRes)
- else
- return false, 2
- end
- end
- else
- return false, 1
- end
- end
- return CardData
|