c1_lua/lua/app/userdata/formation/formation_data.lua
2025-11-11 10:45:44 +08:00

239 lines
7.2 KiB
Lua

local FormationData = class("FormationData", BaseData)
function FormationData:ctor()
self.data.dirty = false
self.formations = {}
end
-- 初始化阵容
function FormationData:init(data)
data = data or {}
self.formations = self.formations or {}
for i = 1, 5 do
if data[i] and data[i].heroes then
local clientFormation = {}
for matchType, heroId in pairs(data[i].heroes) do
clientFormation[tonumber(matchType)] = heroId
end
self.formations[tostring(i)] = clientFormation
else
self.formations[tostring(i)] = {0,0,0,0,0}
end
end
self:setDirty()
end
-- 初始化主线阵容
function FormationData:initStage(data)
self.formations = self.formations or {}
self.formations[GConst.BattleConst.FORMATION_TYPE.STAGE] = data or {0,0,0,0,0}
self:setDirty()
end
-- 初始化竞技场阵容
function FormationData:initArena(attack, defend)
self.formations = self.formations or {}
-- 位置顺序特殊处理
self.formations[GConst.BattleConst.FORMATION_TYPE.ARENA_ATTACK] = {0,0,0,0,0}
self.formations[GConst.BattleConst.FORMATION_TYPE.ARENA_DEFEND] = {0,0,0,0,0}
for idx, id in pairs(attack) do
if id and id ~= 0 then
local type = DataManager.HeroData:getHeroById(id):getMatchType()
self.formations[GConst.BattleConst.FORMATION_TYPE.ARENA_ATTACK][type] = id
end
end
for idx, id in pairs(defend) do
if id and id ~= 0 then
local type = DataManager.HeroData:getHeroById(id):getMatchType()
self.formations[GConst.BattleConst.FORMATION_TYPE.ARENA_DEFEND][type] = id
end
end
self:setDirty()
end
-- function FormationData:initDungeonWeapon(heroes)
-- if self.formations == nil then
-- self.formations = {}
-- end
-- self.formations[GConst.BattleConst.FORMATION_TYPE.DUNGEON_WEAPON] = {}
-- for idx, id in pairs(heroes) do
-- if id and id ~= 0 then
-- local matchType = DataManager.HeroData:getHeroById(id):getMatchType()
-- self.formations[GConst.BattleConst.FORMATION_TYPE.DUNGEON_WEAPON][matchType] = id
-- end
-- end
-- end
-- function FormationData:initDungeonArmor(heroes)
-- if self.formations == nil then
-- self.formations = {}
-- end
-- self.formations[GConst.BattleConst.FORMATION_TYPE.DUNGEON_ARMOR] = {}
-- for idx, id in pairs(heroes) do
-- if id and id ~= 0 then
-- local matchType = DataManager.HeroData:getHeroById(id):getMatchType()
-- self.formations[GConst.BattleConst.FORMATION_TYPE.DUNGEON_ARMOR][matchType] = id
-- end
-- end
-- end
function FormationData:initFormationByType(formationType, heroes)
if self.formations == nil then
self.formations = {}
end
self.formations[formationType] = {}
for idx, id in pairs(heroes) do
if id and id ~= 0 then
local matchType = DataManager.HeroData:getHeroById(id):getMatchType()
self.formations[formationType][matchType] = id
end
end
end
function FormationData:getStageFormation()
return self:getFormation(GConst.BattleConst.FORMATION_TYPE.STAGE)
end
function FormationData:getArenaAttackFormation()
return self:getFormation(GConst.BattleConst.FORMATION_TYPE.ARENA_ATTACK)
end
function FormationData:getArenaDefendFormation()
return self:getFormation(GConst.BattleConst.FORMATION_TYPE.ARENA_DEFEND)
end
function FormationData:getDungeonRuneFormation()
return self:getFormation(GConst.BattleConst.FORMATION_TYPE.DUNGEON_RUNE)
end
-- function FormationData:getDungeonWeaponFormation()
-- local formation = self:getFormation(GConst.BattleConst.FORMATION_TYPE.DUNGEON_WEAPON)
-- if table.nums(formation) <= 0 then
-- self:setFormation(GConst.BattleConst.FORMATION_TYPE.DUNGEON_WEAPON, self:getFormation(GConst.BattleConst.FORMATION_TYPE.STAGE)) -- 如果没有,则用默认关卡
-- formation = self:getFormation(GConst.BattleConst.FORMATION_TYPE.DUNGEON_WEAPON)
-- end
-- return formation
-- end
-- function FormationData:getDungeonArmorFormation()
-- local formation = self:getFormation(GConst.BattleConst.FORMATION_TYPE.DUNGEON_ARMOR)
-- if table.nums(formation) <= 0 then
-- self:setFormation(GConst.BattleConst.FORMATION_TYPE.DUNGEON_ARMOR, self:getFormation(GConst.BattleConst.FORMATION_TYPE.STAGE)) -- 如果没有,则用默认关卡
-- formation = self:getFormation(GConst.BattleConst.FORMATION_TYPE.DUNGEON_ARMOR)
-- end
-- return formation
-- end
-- function FormationData:getBossRushFormation()
-- local formation = self:getFormation(GConst.BattleConst.FORMATION_TYPE.BOSS_RUSH)
-- if table.nums(formation) <= 0 then
-- self:setFormation(GConst.BattleConst.FORMATION_TYPE.BOSS_RUSH, self:getFormation(GConst.BattleConst.FORMATION_TYPE.STAGE)) -- 如果没有,则用默认关卡
-- formation = self:getFormation(GConst.BattleConst.FORMATION_TYPE.BOSS_RUSH)
-- end
-- return formation
-- end
-- function FormationData:getDungeonRuneFormation()
-- local formation = self:getFormation(GConst.BattleConst.FORMATION_TYPE.DUNGEON_RUNE)
-- if table.nums(formation) <= 0 then
-- self:setFormation(GConst.BattleConst.FORMATION_TYPE.DUNGEON_RUNE, self:getFormation(GConst.BattleConst.FORMATION_TYPE.STAGE)) -- 如果没有,则用默认关卡
-- formation = self:getFormation(GConst.BattleConst.FORMATION_TYPE.DUNGEON_RUNE)
-- end
-- return formation
-- end
function FormationData:getFormation(formationType)
formationType = formationType or GConst.BattleConst.FORMATION_TYPE.STAGE
local formation = self.formations[formationType]
if formation == nil then
formation = {}
self.formations[formationType] = formation
end
return formation
end
function FormationData:setFormation(formationType, formation)
self.formations[formationType] = GFunc.getTable(formation)
self:setDirty()
end
function FormationData:upHeroToFormation(formationType, matchType, heroId)
local formation = self:getFormation(formationType)
if formation[matchType] == heroId then
return
end
formation[matchType] = heroId
self:setDirty()
end
function FormationData:heroInFormation(formationType, heroId)
local formation = self:getFormation(formationType)
if not formation then
return false
end
for matchType, id in pairs(formation) do
if id == heroId then
return true
end
end
return false
end
function FormationData:formationIsFull(formationType)
local actvieMap = DataManager.HeroData:getMatchActiveHeroMap()
local formation = self:getFormation(formationType)
local count = 0
for matchtype = 1, GConst.BattleConst.ELEMENT_TYPE_COUNT do
if not formation[matchtype] or formation[matchtype] <= 0 then
if actvieMap[matchtype] and table.nums(actvieMap[matchtype]) > 0 then
return false
end
else
count = count + 1
end
end
if count <= 0 then
return false
end
return true
end
function FormationData:setDirty()
self.data.dirty = not self.data.dirty
end
function FormationData:getStageFormationBIStr()
local str
local totalLevel = 0
local allAtk = 0
local allHp = 0
for matchType, heroId in pairs(self:getStageFormation()) do
local entity = DataManager.HeroData:getHeroById(heroId)
if entity then
if str then
str = str .. "|"
else
str = GConst.EMPTY_STRING
end
str = str .. heroId .. ":" .. entity:getLv()
totalLevel = totalLevel + entity:getLv()
allAtk = allAtk + entity:getAtk()
allHp = allHp + entity:getHp()
end
end
allAtk = allAtk // GConst.BattleConst.DEFAULT_FACTOR
allHp = allHp // GConst.BattleConst.DEFAULT_FACTOR
return str, totalLevel, allAtk, allHp
end
return FormationData