c1_lua/lua/app/userdata/formation/formation_data.lua
2023-07-20 17:41:42 +08:00

193 lines
5.4 KiB
Lua

local FormationData = class("FormationData", BaseData)
function FormationData:ctor()
self.data.dirty = false
self.formations = {}
end
-- 初始化主线阵容
function FormationData:init(data)
if self.formations == nil then
self.formations = {}
end
if data and data.heroes then
local clientFormation = {}
for matchType, heroId in pairs(data.heroes) do
clientFormation[tonumber(matchType)] = heroId
end
self.formations[GConst.BattleConst.FORMATION_TYPE.STAGE] = clientFormation
end
self:setDirty()
end
-- 初始化竞技场阵容
function FormationData:initArena(attack, defend)
if self.formations == nil then
self.formations = {}
end
-- 位置顺序特殊处理
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: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: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:getFormation(formationType)
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