c1_lua/lua/app/userdata/hero/hero_data.lua
2025-09-28 14:42:58 +08:00

461 lines
12 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local HeroEntity = require "app/userdata/hero/hero_entity"
local HeroData = class("HeroData", BaseData)
local HeroCfg = ConfigManager:getConfig("hero")
local HeroLevelCfg = ConfigManager:getConfig("hero_level")
function HeroData:ctor()
self.heroes = {}
self.data.activeCount = 0
self.data.isDirty = false
self.data.isPowerDirty = false
self.matchActiveHeroMap = {}
self.maxHeroLvOnInit = 0
self.allAtkpAttr = {}
self.allAtkpAttrByHero = {}
self.allAtkpAttrByTalent = {}
end
function HeroData:clear()
self.heroes = {}
end
function HeroData:init(data)
self.heroes = {}
if data then
for id, heroInfo in pairs(data) do
self:addHero(heroInfo)
if self.maxHeroLvOnInit < heroInfo.level then
self.maxHeroLvOnInit = heroInfo.level
end
end
end
for heroId, entity in pairs(self.heroes) do
if entity and entity:isActived() then
local matchType = entity:getMatchType()
if not self.matchActiveHeroMap[matchType] then
self.matchActiveHeroMap[matchType] = {}
end
self.matchActiveHeroMap[matchType][entity:getCfgId()] = true
end
end
self:calcPower()
end
-- 是否是合法的英雄
function HeroData:isExistHeroById(id)
if not id or id == 0 then
return false
end
return HeroCfg[id] ~= nil
end
function HeroData:addHero(heroStruct)
if self.heroes[heroStruct.id] then
return
end
local entity = self:getEntity(heroStruct)
self.heroes[heroStruct.id] = entity
self.data.activeCount = self.data.activeCount + 1
end
function HeroData:getEntity(heroStruct)
return HeroEntity:create(heroStruct.id, heroStruct.level, heroStruct.skin, heroStruct.star)
end
function HeroData:getHeroById(id)
if not self:isExistHeroById(id) then
return
end
if not self.heroes[id] then
self.heroes[id] = self:getEntity({id = id, level = 0, skin = 0, star = 0})
end
return self.heroes[id]
end
function HeroData:getAllHeroes()
return self.heroes
end
function HeroData:getActiveHeroCount()
return self.data.activeCount
end
function HeroData:getHeroIsActive(id)
local entity = self.heroes[id]
if entity == nil then
return false
end
return entity:isActived()
end
function HeroData:getHeroIsUnlock(id)
local entity = self.heroes[id]
if entity == nil then
return false
end
return entity:isUnlock()
end
function HeroData:getUnlockHeroCount(elementType)
local count = 0
for id, entity in pairs(self.heroes) do
if entity:isUnlock() and (not elementType or elementType == 0 or entity:getMatchType() == elementType) then
count = count + 1
end
end
return count
end
function HeroData:setHeroLv(id, lv)
local entity = self:getHeroById(id)
local activeBefore = true
if not entity:isActived() then
self.data.activeCount = self.data.activeCount + 1
ModuleManager.TaskManager:addTaskProgress(GConst.TaskConst.TASK_TYPE.X_NEW_HERO_GOT)
ModuleManager.PlayerManager:checkUnlockAvatar(id)
activeBefore = false
BIReport:postFirstGetHero(self.data.activeCount)
end
local beforeLv = entity:getLv()
entity:setLv(lv)
if entity:isActived() then
local matchType = entity:getMatchType()
if not self.matchActiveHeroMap[matchType] then
self.matchActiveHeroMap[matchType] = {}
end
self.matchActiveHeroMap[matchType][entity:getCfgId()] = true
end
if activeBefore then
BIReport:postHeroOpt(id, BIReport.HERO_OPT_TYPE.LEVEL_UP)
else
if not entity:getUnlcokChapter() then
BIReport:postHeroOpt(id, BIReport.HERO_OPT_TYPE.UNLOCK)
end
BIReport:postHeroOpt(id, BIReport.HERO_OPT_TYPE.ACTIVE)
end
BIReport:postHeroLev(beforeLv, lv)
BIReport:postFirstDayHeroLevel(id)
end
function HeroData:getHeroIsNew(id)
local entity = self:getHeroById(id)
return entity and entity:getIsNew() or false
end
function HeroData:getMatchActiveHeroMap()
return self.matchActiveHeroMap
end
function HeroData:setDirty()
self.data.isDirty = not self.data.isDirty
end
function HeroData:getRp()
local formationMap = DataManager.FormationData:getStageFormation()
if not formationMap then
return false
end
local heroMap = {}
for _, heroId in pairs(formationMap) do
heroMap[heroId] = true
end
for id, entity in pairs(self.heroes) do
if entity:canLvUp() then
if heroMap[id] or not entity:isActived() then
return true
end
end
end
-- if DataManager.CollectionData:hasRedPoint() then
-- return true
-- end
return false
end
function HeroData:getMaxHeroLvOnInit()
return self.maxHeroLvOnInit
end
function HeroData:getAllHeroesBIStr()
local str
for heroId, entity in pairs(self:getAllHeroes()) do
if str then
str = str .. "|"
else
str = GConst.EMPTY_STRING
end
str = str .. heroId .. ":" .. entity:getLv()
end
return str
end
-- 获取所有英雄列表(等级>品质>id
function HeroData:getAllHeroesSort(formationType, elementType)
local formationMap
if formationType then
local formation = DataManager.FormationData:getFormation(formationType)
formationMap = {}
for _, heroId in pairs(formation) do
formationMap[heroId] = true
end
end
local result = {}
for id, v in pairs(HeroCfg) do
if not elementType or elementType == 0 or elementType == v.position then
table.insert(result, {cfgId = id, sort = id, elementType = v.position})
end
end
for _, info in ipairs(result) do
local heroEntity = self:getHeroById(info.cfgId)
local sort = info.cfgId -- id 预留6位
sort = sort + (10 - info.elementType) * 1000000 -- 位置预留1位
sort = sort + 10000000000 * heroEntity:getQlt() -- 品质1位
sort = sort + 10000000 * heroEntity:getLv() -- 预留3位
if formationMap and formationMap[info.cfgId] then --在布阵中
sort = sort + 10000000000000
end
if not heroEntity:isActived() and heroEntity:canLvUp() then
sort = sort + 1000000000000
else
if heroEntity:isUnlock() then
sort = sort + 300000000000
if heroEntity:isActived() then
sort = sort + 400000000000
else
sort = sort + 300000000000
end
elseif DataManager.BagData.ItemData:getItemNumById(heroEntity:getFragmentId()) > 0 then
sort = sort + 200000000000
else
sort = sort + 100000000000
end
end
info.sort = sort
end
table.sort(result, function(a, b)
return a.sort > b.sort
end)
return result
end
-- region 配置相关
function HeroData:getHeroConfig(id)
if id then
return HeroCfg[id]
else
return HeroCfg
end
end
function HeroData:getHeroQlt(id)
local cfg = self:getHeroConfig(id)
if cfg then
return cfg.qlt
end
end
function HeroData:getHeroLevelConfig(lv)
if lv then
return HeroLevelCfg[lv]
else
return HeroLevelCfg
end
end
-- 升级目前跟质量无关
function HeroData:getHeroLevelCost(lv, qlt)
local cfg = self:getHeroLevelConfig(lv)
if cfg then
return cfg.cost
end
end
-- endregion
-- region 升星相关
function HeroData:isStarOpen()
return true
end
function HeroData:getStarById(id)
local hero = self.heroes[id]
if hero then
return hero:getStar()
end
return 0
end
function HeroData:onHeroStarUp(id)
local entity = self:getHeroById(id)
if entity then
entity:onHeroStarUp()
end
-- BIReport:postHeroLev(beforeLv, lv)
-- BIReport:postFirstDayHeroLevel(id)
end
-- endregion
-- region 皮肤相关
function HeroData:isSkinOpen()
return true
end
-- endregion
-- region 属性相关
function HeroData:setAllHeroesDitry()
for k,v in pairs(self.heroes) do
v:setAttrDirty()
end
end
function HeroData:getAttrByMatchType(matchType, attrType)
self.allAtkpAttr[matchType] = self.allAtkpAttr[matchType] or {}
return self.allAtkpAttr[matchType][attrType] or 0
end
function HeroData:setHeroAttr(heroId, attr)
self.allAtkpAttrByHero[heroId] = attr
self:calcAttr()
self:setAllHeroesDitry()
end
function HeroData:setTalentAttr(attr)
self.allAtkpAttrByTalent = attr
self:calcAttr()
self:setAllHeroesDitry()
end
function HeroData:calcAttr()
self.allAtkpAttr = {}
for heroId, attrs in pairs(self.allAtkpAttrByHero) do
-- self.baseAttrOriginal[ATTR_NAME.ATK_RED] = 0
local matchType = self.heroes[heroId]:getMatchType()
self.allAtkpAttr[matchType] = self.allAtkpAttr[matchType] or {}
for k,v in pairs(attrs) do
self.allAtkpAttr[matchType][k] = (self.allAtkpAttr[matchType][k] or 0) + v
end
end
for k, v in pairs(self.allAtkpAttrByTalent) do
for matchType = 1, 5 do
self.allAtkpAttr[matchType] = self.allAtkpAttr[matchType] or {}
self.allAtkpAttr[matchType][k] = (self.allAtkpAttr[matchType][k] or 0) + v
end
end
end
-- endregion
--@region 战斗力
function HeroData:getShowPower()
if self.curPower == nil then
self:calcPower()
end
return self.curPower
end
function HeroData:getLastPower()
return self.lastPower or 0
end
function HeroData:clearLastPower()
self.lastPower = nil
end
-- 计算战斗力
function HeroData:calcPower()
if self.lastPower then
self.lastPower = self.curPower
end
local attrPower = 0
local formation = DataManager.FormationData:getStageFormation()
for _, heroId in pairs(formation) do
local heroEntity = DataManager.HeroData:getHeroById(heroId)
if heroEntity then
attrPower = attrPower + heroEntity:getPower()
end
end
-- -- 天赋战力
-- local talentPower = DataManager.TalentData:getPower()
-- -- 英雄战力
-- local forcePower = DataManager.ForceData:getPower()
-- -- 英雄皮肤战力
-- local forceSkinPower = DataManager.ForceData:getSkinPower()
-- -- 英雄装备战力
-- local equipPower = DataManager.ForceEquipData:getPower()
-- -- 领主时装战力
-- local skinPower = DataManager.SkinData:getPower()
-- -- 宝物战力
-- local collectionPower = DataManager.CollectionData:getPower()
-- -- 防线战力
-- local defenseLinePower = DataManager.DefenseLineData:getPower()
-- -- 防线皮肤战力
-- local defenseLineSkinPower = DataManager.DefenseLineData:getSkinPower()
-- -- 宠物战力
-- local petPower = DataManager.PetData:getPower()
-- -- 魔法书战力
-- local magicBookPower = DataManager.MagicBookData:getPower()
-- -- 魔法阵战力
-- local magicCirclePower = DataManager.MagicCircleData:getPower()
self.curPower = 0
self.curPower = self.curPower + attrPower
-- self.curPower = self.curPower + talentPower
-- self.curPower = self.curPower + forcePower
-- self.curPower = self.curPower + forceSkinPower
-- self.curPower = self.curPower + equipPower
-- self.curPower = self.curPower + skinPower
-- self.curPower = self.curPower + collectionPower
-- self.curPower = self.curPower + defenseLinePower
-- self.curPower = self.curPower + defenseLineSkinPower
-- self.curPower = self.curPower + petPower
-- self.curPower = self.curPower + magicBookPower
-- self.curPower = self.curPower + magicCirclePower
-- if EDITOR_MODE and self:getIsSelf() then
-- Logger.logHighlight("PlayerEntity 总战力:" .. self.curPower)
-- Logger.logHighlight("PlayerEntity 属性战力:" .. attrPower)
-- Logger.logHighlight("PlayerEntity 天赋战力:" .. talentPower)
-- Logger.logHighlight("PlayerEntity 英雄战力:" .. forcePower)
-- Logger.logHighlight("PlayerEntity 英雄皮肤战力:" .. forceSkinPower)
-- Logger.logHighlight("PlayerEntity 英雄装备战力:" .. equipPower)
-- Logger.logHighlight("PlayerEntity 领主时装战力:" .. skinPower)
-- Logger.logHighlight("PlayerEntity 宝物战力:" .. collectionPower)
-- Logger.logHighlight("PlayerEntity 防线战力:" .. defenseLinePower)
-- Logger.logHighlight("PlayerEntity 防线皮肤战力:" .. defenseLineSkinPower)
-- Logger.logHighlight("PlayerEntity 宠物战力:" .. petPower)
-- Logger.logHighlight("PlayerEntity 魔法书战力:" .. magicBookPower)
-- Logger.logHighlight("PlayerEntity 魔法阵战力:" .. magicCirclePower)
-- end
if not self.lastPower then
self.lastPower = self.curPower
end
if self.lastPower ~= self.curPower then
self:setPowerDirty()
end
end
function HeroData:setPowerDirty()
self.data.isPowerDirty = not self.data.isPowerDirty
end
--@endregion
return HeroData