local RunesData = class("RunesData", BaseData) local RunesEntity = require "app/userdata/runes/runes_entity" function RunesData:ctor() self.data.isDirty = false end function RunesData:clear() DataManager:unregisterTryOpenFunc("RunesData") end function RunesData:init(data) data = data or GConst.EMPTY_TABLE if EDITOR_MODE then Logger.logHighlight("符文初始化数据") Logger.printTable(data) end self.level = data.level or 1 self.exp = data.exp or 0 if data.heroes_grids then for heroId, grids in pairs(data.heroes_grids) do self:addEquip(heroId, grids.grids) end -- 处理上报 local formation = DataManager.FormationData:getStageFormation() local runesChapter = {} for elementType, heroId in pairs(formation) do runesChapter[heroId] = data.heroes_grids[heroId] end BIReport:postRunes(BIReport.RUNES_FORMATION.CHAPTER, runesChapter) end -- 活动开启 DataManager:registerTryOpenFunc("RunesData", function() if self:isOpen() then DataManager:unregisterTryOpenFunc("RunesData") self:setDirty() end end) self:setDirty() end function RunesData:setDirty() self.data.isDirty = not self.data.isDirty end function RunesData:isOpen(showToast) if not ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.RUNES_OPEN, not showToast) then return false end return true end function RunesData:addEquip(heroId, grids) if self.runes == nil then self.runes = {} end if self.runes[heroId] == nil then self.runes[heroId] = self:createEntity(heroId, grids) else self.runes[heroId]:updateGrids(grids) end end function RunesData:createEntity(heroId, grids) return RunesEntity:create(heroId, grids) end function RunesData:getRunes(heroId) if self.runes == nil then self.runes = {} end if self.runes[heroId] == nil then self.runes[heroId] = self:createEntity(heroId) end return self.runes[heroId] end -- 是否有红点 function RunesData:hasRedPoint(tempCount) return (tempCount or self:getMaterialCount()) > GFunc.getConstIntValue("runes_red_point") end -- 获取等级配置 function RunesData:getLevelConfig() if self.RuneCfg == nil then self.RuneCfg = ConfigManager:getConfig("runes_level") end return self.RuneCfg end -- 获取铸台最大等级 function RunesData:getMaxLevel() return #self:getLevelConfig() end -- 获取符文铸台等级 function RunesData:getLevel() return self.level end -- 获取等级当前经验 function RunesData:getLevelExp() return self.exp - (self:getLevelConfig()[self:getLevel()].cost or 0) end -- 获取总经验值 function RunesData:getExp() return self.exp end -- 根据经验获取等级 function RunesData:getLevelByExp(exp) local level for index, value in ipairs(self:getLevelConfig()) do if exp >= (value.cost or 0) then level = index else return level end end return level end -- 获取到下一档的总经验 function RunesData:getNextLevelTotalExp() local nextExp local cfg = self:getLevelConfig()[self:getLevel() + 1] if cfg then nextExp = cfg.cost or 0 end local curExp = self:getLevelConfig()[self:getLevel()].cost or 0 return nextExp - curExp end -- 获取相应铸台等级的品质概率 function RunesData:getQualityRate(level, quality) local cfg = self:getLevelConfig()[level] local total = 0 for i = 1, GConst.RunesConst.MAX_QUALITY_COUNT do total = total + (cfg["weight_"..i] or 0) end local value = cfg["weight_"..quality] if value then return string.format("%.2f",(value / total) * 100) else return 0 end end -- 获取相应套装的相应属性 function RunesData:getSuitAttr(id, heroType, suitLevel) local data = ConfigManager:getConfig("runes_suit")[id] local attrs if heroType == GConst.HeroConst.MATCH_TYPE.RED then attrs = data.red_suit_attr elseif heroType == GConst.HeroConst.MATCH_TYPE.YELLOW then attrs = data.yellow_suit_attr elseif heroType == GConst.HeroConst.MATCH_TYPE.GREEN then attrs = data.green_suit_attr elseif heroType == GConst.HeroConst.MATCH_TYPE.BLUE then attrs = data.blue_suit_attr elseif heroType == GConst.HeroConst.MATCH_TYPE.PURPLE then attrs = data.purple_suit_attr end if attrs ~= nil and attrs[suitLevel] then return attrs[suitLevel] end return nil end -- 获取锻造材料基础消耗个数 function RunesData:getMaterialCostBaseNum() if self.baseCostNum == nil then self.baseCostNum = GFunc.getConstReward("runes_cost_base").num end return self.baseCostNum end -- 获取锻造材料额外单个锁定消耗个数 function RunesData:getMaterialCostAddNum() if self.addCostNum == nil then self.addCostNum = GFunc.getConstReward("runes_cost_add").num end return self.addCostNum end -- 获取锻造材料个数 function RunesData:getMaterialCount() return DataManager.BagData.ItemData:getItemNumById(GConst.ItemConst.ITEM_ID_RUNES) end -- 是否可以一键铸造 function RunesData:canAutoMake() local cfg = self:getLevelConfig()[self:getLevel()] return cfg.auto and cfg.auto == 1 end -- 获取自动铸造的开启等级 function RunesData:getAutoMakeOpenLevel() for level, data in ipairs(self:getLevelConfig()) do if data.auto and data.auto == 1 then return level end end return nil end -- 符文栏是否解锁 function RunesData:isUnlock(index) local level = self:getLevel() return index <= self:getLevelConfig()[level].grid end -- 获取符文栏解锁个数 function RunesData:getUnlockCount() local unlock = 0 for i = 1, GConst.RunesConst.MAX_ATTR_GRID_COUNT do if self:isUnlock(i) then unlock = unlock + 1 end end return unlock end -- 获取符文栏解锁等级要求 function RunesData:getUnlockLevel(index) for level, data in ipairs(self:getLevelConfig()) do if data.grid >= index then return level end end return 0 end -- 获取套装名 function RunesData:getSuitName(index) if index == 1 then return I18N:getGlobalText(I18N.GlobalConst.RUNES_DESC_10) elseif index == 2 then return I18N:getGlobalText(I18N.GlobalConst.RUNES_DESC_11) elseif index == 3 then return I18N:getGlobalText(I18N.GlobalConst.RUNES_DESC_14) elseif index == 4 then return I18N:getGlobalText(I18N.GlobalConst.RUNES_DESC_12) elseif index == 5 then return I18N:getGlobalText(I18N.GlobalConst.RUNES_DESC_13) end return nil end -- 改变属性栏锁定状态成功 function RunesData:onGridLockSuccess(heroId, grids) self.runes[heroId]:updateGrids(grids) self:setDirty() end -- 获取随机一套grids数据 function RunesData:getRandomGrids() if self.fakeGrids == nil then self.fakeGrids = {} for i = 1, GConst.RunesConst.FAKE_DATA_COUNT do self.fakeGrids[i] = {} for j = 1, GConst.RunesConst.MAX_ATTR_GRID_COUNT do local grid = {} grid.quality = math.random(GConst.RunesConst.MAX_QUALITY_COUNT - 2) grid.attr = math.random(GConst.RunesConst.MAX_ATTR_COUNT) grid.suit = math.random(GConst.RunesConst.MAX_SUITS_COUNT) table.insert(self.fakeGrids[i], grid) end end Logger.logHighlight("轮播假数据:") Logger.printTable(self.fakeGrids) end return self.fakeGrids[math.random(GConst.RunesConst.FAKE_DATA_COUNT)] end -- 获取本次同步已执行的自动淬炼次数 function RunesData:getExecutedAutoCount() return self.executedAutoCount end -- 获取当前自动淬炼的英雄 function RunesData:getAutoHeroId() return self.autoHeroId end -- 自动淬炼次数增加 function RunesData:onAutoQuenchingOnce() self.executedTotalAutoCount = self.executedTotalAutoCount + 1 self.executedAutoCount = self.executedAutoCount + 1 end -- 检查自动次数是否足够 function RunesData:checkAutoTime() if self.executedTotalAutoCount >= self.autoTotalCount then -- 剩余自动次数不足,同步并请求数据 ModuleManager.RunesManager:reqSyncQuenching(self.isCountEnd) end end -- 淬炼成功 function RunesData:onQuenchingSuccess(level, exp, heroId, grids) self.level = level self.exp = exp self.runes[heroId]:updateGrids(grids) self:setDirty() end -- 自动淬炼数据获取成功 function RunesData:onGetAutoQuenchingDataSuccess(heroId, count, isCountEnd) self.autoHeroId = heroId self.autoTotalCount = count self.executedTotalAutoCount = 0 self.executedAutoCount = 0 self.isCountEnd = isCountEnd self:setDirty() end -- 自动淬炼成功 function RunesData:onAutoQuenchingSuccess(level, exp, grids) self.level = level self.exp = exp self.runes[self:getAutoHeroId()]:updateGrids(grids) self.executedAutoCount = 0 self:setDirty() end -- 自动淬炼失败 function RunesData:onAutoQuenchingFailed() self:setDirty() end return RunesData