c1_lua/lua/app/userdata/battle/battle_base_data.lua
2025-11-04 15:31:16 +08:00

1097 lines
33 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 BattleTeamEntity = require "app/userdata/battle/team/battle_team_entity"
local BattleSkillEntity = require "app/userdata/battle/skill/battle_skill_entity"
local ATTR_NAME = GConst.BattleConst.ATTR_NAME
local BattleBaseData = class("BattleBaseData", BaseData)
local SKILL_CFG = ConfigManager:getConfig("skill")
local BattleConst = GConst.BattleConst
local BATTLE_GRID_ENTITY = require "app/userdata/battle/battle_grid_entity"
local BATTLE_BOARD_SKILL_ENTITY = require "app/userdata/battle/skill/battle_board_skill_entity"
local BATTLE_GRID_EDGE_ENTITY = require "app/userdata/battle/grid_edge_entity"
local DEFAULT_FACTOR = BattleConst.DEFAULT_FACTOR
local TIME_SPEED_LEVEL_0 = 0
local TIME_SPEED_LEVEL_1 = 1
local TIME_SPEED_LEVEL_2 = 2
local TIME_SPEED_LEVEL_3 = 3
local TIME_SPEED_LEVEL_SKILL = 100
local SIDE_ATK = BattleConst.SIDE_ATK
local SIDE_DEF = BattleConst.SIDE_DEF
----------------------------------按需重写的方法-------------------------------
function BattleBaseData:getRowCount()
return BattleConst.PVP_ROW_COUNT
end
function BattleBaseData:getTimeScaleBase()
return self.timeScaleTab[self.timeScaleIdx]
end
function BattleBaseData:setTimeScaleBase(idx)
if self.timeScaleIdx == idx then
return
end
self.timeScale = self.baseTimeScaleLevel * self:getTimeScaleBase()
end
--@region 倍速
function BattleBaseData:getTimeScaleIdx()
return self.timeScaleIdx
end
function BattleBaseData:updateTimeSpeed()
if self.timeScaleIdx == #self.timeScaleTab then
self.timeScaleIdx = 1
else
self.timeScaleIdx = self.timeScaleIdx + 1
end
self.timeScale = self.baseTimeScaleLevel * self:getTimeScaleBase()
if EDITOR_MODE then
Logger.logHighlight("======================= self.timeScaleIdx = %s self.timeScale = %s", self.timeScaleIdx, self.timeScale)
end
end
--@endregion
---------------------------------end按需重写的方法-------------------------------
function BattleBaseData:init(params, snapInfo)
self:clear()
self.timeScaleIdx = 1
self.timeScaleTab = {1, 2}
self.battleLv = snapInfo and snapInfo.battleLv or 1
self.curBattleExp = snapInfo and snapInfo.curBattleExp or 0
self.needBattleExp = self:getLvNeedExp()
self.addLvCount = snapInfo and snapInfo.addLvCount or 0
self.commonSelectSkillCount = snapInfo and snapInfo.commonSelectSkillCount or 0
self.baseTimeScaleLevel = BattleConst.TIME_SCALE.LEVEL_1
self.timeScale = self.baseTimeScaleLevel * self:getTimeScaleBase()
self.lockElementMap = {}
self.data.timeSpeed = 1
self.data.lvDirty = false
self.adRefreshSkillCount = snapInfo and snapInfo.adRefreshSkillCount or 0
self.refreshSkillCount = snapInfo and snapInfo.refreshSkillCount or 0
self.adGetAllSkillCount = snapInfo and snapInfo.adGetAllSkillCount or 0
self.adDeityCount = snapInfo and snapInfo.adDeityCount or 0
self.adGetDoubleBoxCount = snapInfo and snapInfo.adGetDoubleBoxCount or 0
self.isRevive = snapInfo and snapInfo.isRevive or false
self.talentSelectCount = snapInfo and snapInfo.talentSelectCount or DataManager.TalentData:getSelectSkillBegin()
BattleSkillEntity.sid = 0
self.atkTeam = self:initTeam(SIDE_ATK, params.atkFormation)
self.defTeam = self:initTeam(SIDE_DEF, params.defFormation)
self:initRogueSkills(SIDE_ATK, params.atkFormation)
self:initRogueSkills(SIDE_DEF, params.defFormation)
self.atkFormation = params.atkFormation or {}
self.defFormation = params.defFormation or {}
self:setMaxBattleLv(nil)
if not ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.AD, true) then
self.isRevive = true
end
if snapInfo then
if snapInfo.cacheSkillList then
self.cacheSkillList = snapInfo.cacheSkillList
self.cacheSkillCount = #self.cacheSkillList
end
end
end
function BattleBaseData:getSnapshoptInfo()
return {
battleLv = self.battleLv,
curBattleExp = self.curBattleExp,
addLvCount = self.addLvCount,
commonSelectSkillCount = self.commonSelectSkillCount,
adRefreshSkillCount = self.adRefreshSkillCount,
adGetAllSkillCount = self.adGetAllSkillCount,
adDeityCount = self.adDeityCount,
adGetDoubleBoxCount = self.adGetDoubleBoxCount,
refreshSkillCount = self.refreshSkillCount,
isRevive = self.isRevive,
talentSelectCount = self.talentSelectCount,
cacheSkillList = self.cacheSkillList,
}
end
function BattleBaseData:getTimeScale()
return self.timeScale
end
function BattleBaseData:pauseBattle()
self.cacheSpeed = self.data.timeSpeed
self.cacheTimeScale = self.timeScale
self:setTimeSpeed(TIME_SPEED_LEVEL_0)
end
function BattleBaseData:resumeBattle()
if self.cacheSpeed == nil then
return
end
if self.data.timeSpeed ~= TIME_SPEED_LEVEL_0 then
return
end
self:setTimeSpeed(self.cacheSpeed or TIME_SPEED_LEVEL_1, self.cacheTimeScale)
end
function BattleBaseData:resetTimeSpeed()
if self.cacheSpeed then -- 目前处于暂停状态
self.cacheSpeed = TIME_SPEED_LEVEL_1
return
end
if self.data.timeSpeed <= TIME_SPEED_LEVEL_1 then
return
end
self:setTimeSpeed(TIME_SPEED_LEVEL_1)
end
function BattleBaseData:addTimeSpeed()
if self.data.timeSpeed >= TIME_SPEED_LEVEL_3 then
return
end
if self.cacheSpeed then -- 目前处于暂停状态
if self.cacheSpeed < TIME_SPEED_LEVEL_3 then
self.cacheSpeed = self.cacheSpeed + 1
end
return
end
local timeSpeed = self.data.timeSpeed + 1
self:setTimeSpeed(timeSpeed)
end
function BattleBaseData:setSkillTimeSpeed(timeScale)
self:setTimeSpeed(TIME_SPEED_LEVEL_SKILL, timeScale)
end
function BattleBaseData:setTimeSpeed(timeSpeed, timeScale)
if timeSpeed == self.data.timeSpeed then
return
end
if timeSpeed == TIME_SPEED_LEVEL_0 then
self.timeScale = 0
self.baseTimeScaleLevel = 0
elseif timeSpeed == TIME_SPEED_LEVEL_1 then
self.timeScale = BattleConst.TIME_SCALE.LEVEL_1
self.baseTimeScaleLevel = BattleConst.TIME_SCALE.LEVEL_1
elseif timeSpeed == TIME_SPEED_LEVEL_2 then
self.timeScale = BattleConst.TIME_SCALE.LEVEL_2
self.baseTimeScaleLevel = BattleConst.TIME_SCALE.LEVEL_2
elseif timeSpeed == TIME_SPEED_LEVEL_3 then
self.timeScale = BattleConst.TIME_SCALE.LEVEL_3
self.baseTimeScaleLevel = BattleConst.TIME_SCALE.LEVEL_3
else
self.timeScale = timeScale or BattleConst.TIME_SCALE.LEVEL_1
self.baseTimeScaleLevel = timeScale or BattleConst.TIME_SCALE.LEVEL_1
end
self.timeScale = self.timeScale * self:getTimeScaleBase()
self.data.timeSpeed = timeSpeed
end
-- function BattleBaseData:getActiveRogueSkills(heroEntity)
-- return heroEntity:getActiveRogueSkills()
-- end
function BattleBaseData:initRogueSkills(side, formation)
self.skillPool = self.skillPool or {}
self.skillMap = self.skillMap or {}
self.skillPool[side] = self.skillPool[side] or {}
self.skillMap[side] = self.skillMap[side] or {}
if not formation then
return
end
local skillmap = {}
for matchType, heroEntity in pairs(formation) do
local skillId = heroEntity:getBaseSkill()
local cfg = SKILL_CFG[skillId]
self.skillMap[side][cfg.position] = BATTLE_BOARD_SKILL_ENTITY:create(skillId, side)
self.skillMap[side][cfg.position]:addUpSkills(heroEntity:getRogueSkillListBattle())
self.skillMap[side][cfg.position]:setUnlockId(heroEntity:getUnlockRogueId())
for _, id in ipairs(heroEntity:getActiveRogueSkills()) do
if not skillmap[id] then
if not self.skillPool[side][cfg.position] then
self.skillPool[side][cfg.position] = {}
end
table.insert(self.skillPool[side][cfg.position], id)
skillmap[id] = true
end
end
end
end
function BattleBaseData:refreshBoard(board, boardEdge, blockIcon, snapshot)
local r = 1
local c = 1
for i, info in ipairs(board) do
if c > BattleConst.COLUMN_COUNT then
c = c - BattleConst.COLUMN_COUNT
r = r + 1
end
local posId = ModuleManager.BattleManager:getPosId(r, c)
local data = {
posId = posId,
gridType = info[1] or BattleConst.GRID_TYPE.EMPTY,
elementType = info[2] or BattleConst.ELEMENT_TYPE.RED
}
if not self.gridEntities then
self.gridEntities = {}
end
if self.gridEntities[data.posId] then
self.gridEntities[data.posId]:clear()
self.gridEntities[data.posId]:setGridType(data.gridType)
self.gridEntities[data.posId]:setElementType(data.elementType)
else
self.gridEntities[data.posId] = self:getNewGridEntity(data.posId, data.gridType, data.elementType)
end
self.gridEntities[data.posId]:determineIdleStatus()
self.gridEntities[data.posId]:setObstacleIcon(blockIcon)
c = c + 1
end
if not self.gridEdgeEntities then
self.gridEdgeEntities = {}
else
for posId, info in pairs(self.gridEdgeEntities) do
for direction, entity in pairs(info) do
entity:setIsIdle(true)
end
end
end
if snapshot and snapshot.gridEdge then
boardEdge = snapshot.gridEdge
end
if boardEdge then
for _, info in pairs(boardEdge) do
local initInfo = {
posId = info.pos,
edgeType = info.type,
direction = info.direction,
battleData = self
}
if not self.gridEdgeEntities[initInfo.posId] then
self.gridEdgeEntities[initInfo.posId] = {}
end
if self.gridEdgeEntities[initInfo.posId][initInfo.direction] then
self.gridEdgeEntities[initInfo.posId][initInfo.direction]:ctor(initInfo)
else
self.gridEdgeEntities[initInfo.posId][initInfo.direction] = self:getNewGridEdgeEntity(initInfo)
end
end
end
if snapshot and snapshot.boardSnapInfo then
for posIdStr, snap in pairs(snapshot.boardSnapInfo) do
local posId = tonumber(posIdStr)
if self.gridEntities[posId] and snap then
self.gridEntities[posId]:setInfoBySnapshop(snap)
end
end
end
end
function BattleBaseData:getNewGridEntity(posId, gridType, elementType)
local data = {
posId = posId or 0,
gridType = gridType or BattleConst.GRID_TYPE.EMPTY,
elementType = elementType or BattleConst.ELEMENT_TYPE.RED,
battleData = self
}
return BATTLE_GRID_ENTITY:create(data)
end
function BattleBaseData:getNewGridEdgeEntity(data)
return BATTLE_GRID_EDGE_ENTITY:create(data)
end
function BattleBaseData:clear()
self:clearGridSequence()
self:clearCacheBoardSkill()
self.gridEntities = {}
self.gridEdgeEntities = {}
self.skillMap = {}
self.skillPool = {}
self.selectSkillMap = {}
end
function BattleBaseData:getElementTypeMap()
local elementTypeMap = {}
if self.gridEntities then
for posId, entity in pairs(self.gridEntities) do
if entity:canLink() then
local elementType = entity:getElementType()
elementTypeMap[elementType] = (elementTypeMap[elementType] or 0) + 1
end
end
end
return elementTypeMap
end
function BattleBaseData:getGridSequence()
return self.gridSequence
end
function BattleBaseData:alreadyInsertSequence(posId)
return self.gridSequenceMap[posId] == true
end
function BattleBaseData:getIsVirtual()
return self.isVirtual
end
function BattleBaseData:getSequenceHadSkill()
for _, info in ipairs(self:getGridSequence()) do
local entity = self.gridEntities[info.posId]
if entity and entity:getSkillId() then
return entity:getSkillId(), entity:getPosId()
end
end
return
end
function BattleBaseData:insertGridSequence(posId, snapshot, isVirtual)
if self:alreadyInsertSequence(posId) then
return false
end
self.gridSequenceMap[posId] = true
self.isVirtual = isVirtual
table.insert(self.gridSequence, {posId = posId, snapshot = snapshot})
return true
end
function BattleBaseData:removeGridSequence(posId)
if not self:alreadyInsertSequence(posId) then
return
end
local count = #self.gridSequence
local lastPosId = self.gridSequence[count].posId
local snapshot = self.gridSequence[count].snapshot
if lastPosId ~= posId then
return
end
table.remove(self.gridSequence, count)
self.gridSequenceMap[lastPosId] = false
return snapshot
end
function BattleBaseData:removeGridSequenceByIndex(index)
local count = #self.gridSequence
if count < index then
return
end
local snapshot
for i = count, index, -1 do
local info = table.remove(self.gridSequence, i)
self.gridSequenceMap[info.posId] = false
snapshot = info.snapshot
end
return snapshot
end
function BattleBaseData:getFirstSequenceSnapshot()
if not self.gridSequence[1] then
return
end
local snapshot = self.gridSequence[1].snapshot
return snapshot
end
function BattleBaseData:cacheSkillInfluenceGrids(grids)
if not self.skillInfluenceGrids then
self.skillInfluenceGrids = {}
end
for posId, info in pairs(grids) do
self.skillInfluenceGrids[posId] = info
end
end
function BattleBaseData:getSkillInfluenceGrids()
return self.skillInfluenceGrids or {}
end
function BattleBaseData:clearSkillInfluenceGrids()
local grids = self:getSkillInfluenceGrids()
self.skillInfluenceGrids = {} -- 技能影响的格子
return grids
end
function BattleBaseData:clearGridSequence()
if self.gridSequence then
self.lastSequenceLinkNum = #self.gridSequence
end
self.gridSequence = {} -- 格子队列
self.gridSequenceMap = {} -- 格子队列对应的map方面查找
self.isVirtual = nil
self:clearSkillInfluenceGrids()
end
function BattleBaseData:getLastSequenceLinkNum()
return self.lastSequenceLinkNum
end
function BattleBaseData:clearLastSequenceLinkNum()
self.lastSequenceLinkNum = nil
end
function BattleBaseData:getGridEnties()
return self.gridEntities or {}
end
function BattleBaseData:getGridEntity(posId)
return self.gridEntities[posId]
end
function BattleBaseData:hadUniversalGrid()
for k,v in pairs(self.gridEntities) do
if v:getIsUniversal() then
return true
end
end
return false
end
function BattleBaseData:exchangeGridEntities(posId1, posId2)
local e1 = self.gridEntities[posId1]
local e2 = self.gridEntities[posId2]
e1:setPosId(posId2)
e2:setPosId(posId1)
e2:setIsIdle(false)
self.gridEntities[posId1] = e2
self.gridEntities[posId2] = e1
end
function BattleBaseData:setGridEntitiesPosId(changeInfo)
local map = {}
for posId, targetPosId in pairs(changeInfo) do
local entity = self.gridEntities[posId]
entity:setPosId(targetPosId)
map[targetPosId] = entity
end
for posId, entity in pairs(map) do
self.gridEntities[posId] = entity
end
end
function BattleBaseData:setGridInfo(posId, gridInfo)
local entity = self.gridEntities[posId]
if not entity then
return
end
if gridInfo.gridType then
entity:setGridType(gridInfo.gridType)
end
if gridInfo.elementType then
entity:setElementType(gridInfo.elementType)
end
entity:setSkilId() -- 清除skillId
entity:setUniversal(gridInfo.isUniversal) -- 清除万能地块
entity:determineIdleStatus()
end
function BattleBaseData:setInfoBySnapshop(posId, snapInfo)
local entity = self.gridEntities[posId]
if not entity then
return
end
entity:setInfoBySnapshop(snapInfo)
end
function BattleBaseData:setGridType(posId, gridType, noDirty)
local entity = self.gridEntities[posId]
if not entity then
return
end
entity:setGridType(gridType, noDirty)
entity:determineIdleStatus()
end
function BattleBaseData:setGridDirty(posId)
local entity = self.gridEntities[posId]
if not entity then
return
end
entity:setDirty()
end
function BattleBaseData:lockAllSkillGrid(lock, side)
side = side or SIDE_ATK
if not self.gridEntities then
return
end
for posId, entity in pairs(self.gridEntities) do
if entity:getSkillId() and (not entity:getSkillSide() or entity:getSkillSide() == side) then
local gridType = GConst.BattleConst.GRID_TYPE.EMPTY
if lock then
gridType = GConst.BattleConst.GRID_TYPE.LOCK
end
self:setGridType(posId, gridType)
end
end
end
function BattleBaseData:getSkillEntities(side)
side = side or SIDE_ATK
if self.skillMap then
return self.skillMap[side] or {}
end
end
function BattleBaseData:getSkillEntityByElement(elementType, side)
local skillMap = self:getSkillEntities(side)
if not skillMap then
return
end
return skillMap[elementType]
end
function BattleBaseData:getSkillEntityBySkillId(skillId, side)
local skillMap = self:getSkillEntities(side)
if not skillMap or not skillId then
return
end
local cfg = SKILL_CFG[skillId]
if not cfg then
return
end
return skillMap[cfg.position]
end
function BattleBaseData:unlockSkillEntity(elementType, side)
local skillMap = self:getSkillEntities(side)
if skillMap and skillMap[elementType] then
skillMap[elementType]:setUnlock()
end
end
function BattleBaseData:isUnlockedSkillElementType(elementType, side)
local skillMap = self:getSkillEntities(side)
if not skillMap or not skillMap[elementType] then
return false
end
return skillMap[elementType]:getUnlocked()
end
function BattleBaseData:getShowSkillEffect()
local tmp = self.showSkillEffect
self.showSkillEffect = nil
return tmp
end
function BattleBaseData:addSkillEnergy(elementMap, side, markEffect)
local skillMap = self:getSkillEntities(side)
if not skillMap then
return
end
for elementType, entity in pairs(skillMap) do
if entity:getUnlocked() then
entity:addEnergy(elementMap[elementType] or 0)
end
end
if markEffect then
self.showSkillEffect = {}
for k,v in pairs(elementMap) do
self.showSkillEffect[k] = true
end
end
end
function BattleBaseData:addSkillCount(skillId, value, side)
side = side or SIDE_ATK
if not self.selectSkillMap then
self.selectSkillMap = {}
end
if not self.selectSkillMap[side] then
self.selectSkillMap[side] = {}
end
if not self.selectSkillMap[side][skillId] then
self.selectSkillMap[side][skillId] = {
count = 0,
value = 0
}
end
self.selectSkillMap[side][skillId].count = self.selectSkillMap[side][skillId].count + 1
if value then
self.selectSkillMap[side][skillId].value = (self.selectSkillMap[side][skillId].value) + value
end
end
function BattleBaseData:setSkillCount(skillId, value, side, count)
side = side or SIDE_ATK
if not self.selectSkillMap then
self.selectSkillMap = {}
end
if not self.selectSkillMap[side] then
self.selectSkillMap[side] = {}
end
if not self.selectSkillMap[side][skillId] then
self.selectSkillMap[side][skillId] = {
count = 0,
value = 0
}
end
self.selectSkillMap[side][skillId].count = count
if value then
self.selectSkillMap[side][skillId].value = value
end
end
function BattleBaseData:getSkillCount(skillId, side)
side = side or SIDE_ATK
if self.selectSkillMap[side] and self.selectSkillMap[side][skillId] then
return self.selectSkillMap[side][skillId].count
end
return 0
end
function BattleBaseData:getSelectSkillMap(side)
side = side or SIDE_ATK
return self.selectSkillMap and self.selectSkillMap[side] or {}
end
function BattleBaseData:getSkillPool(side)
side = side or SIDE_ATK
return self.skillPool and self.skillPool[side] or {}
end
function BattleBaseData:changeSkillId(elementType, newId, side)
if not newId then
return
end
local entity = self:getSkillEntityByElement(elementType, side)
if entity then
entity:refreshSkillId(newId)
end
end
function BattleBaseData:cacheLockElement(elementType, status)
self.lockElementMap[elementType] = status
end
function BattleBaseData:getCacheLockedElement(elementType)
return self.lockElementMap[elementType]
end
function BattleBaseData:clearAllCacheLockElement()
self.lockElementMap = table.clearOrCreate(self.lockElementMap)
end
function BattleBaseData:cacheBoardSkill()
self.cacheSkillList = {}
self.cacheSkillCount = 0
local list
local count = 0
for posId, entity in pairs(self:getGridEnties()) do
if entity:getSkillId() then
if not list then
list = {}
end
table.insert(list, {skillId = entity:getSkillId(), posId = posId})
count = count + 1
end
end
if list then
if count > BattleConst.MAX_CACHE_SKILL_COUNT then
count = BattleConst.MAX_CACHE_SKILL_COUNT
end
for i = 1, count do
if not list[1] then
break
end
local info = table.remove(list, math.random(1, #list))
table.insert(self.cacheSkillList, info)
self.cacheSkillCount = self.cacheSkillCount + 1
end
end
end
function BattleBaseData:getCacheBoardSkill()
if not self.cacheSkillList then
return self.cacheSkillList, 0
end
return self.cacheSkillList, self.cacheSkillCount
end
function BattleBaseData:clearCacheBoardSkill()
self.cacheSkillList = {}
self.cacheSkillCount = 0
end
function BattleBaseData:getBattleLv()
return self.battleLv
end
function BattleBaseData:getBattleExp()
return self.curBattleExp
end
function BattleBaseData:getBattleNeedExp()
return self.needBattleExp
end
function BattleBaseData:getLvNeedExp(lv)
lv = lv or self.battleLv
local cfg = ConfigManager:getConfig("battle_exp")
if not cfg[lv] then
return cfg[ConfigManager:getConfigNum("battle_exp")].exp
end
return cfg[lv].exp
end
function BattleBaseData:setMaxBattleLv(maxLv)
self.maxBattleLv = maxLv
end
function BattleBaseData:addExp(exp)
exp = math.floor(exp + 0.0000001)
self.curBattleExp = self.curBattleExp + exp
while self.curBattleExp >= self.needBattleExp do
if self.maxBattleLv then -- 超过最大等级后跳出
if self.maxBattleLv <= self.battleLv then
break
end
end
self.curBattleExp = self.curBattleExp - self.needBattleExp
self.addLvCount = self.addLvCount + 1
self.battleLv = self.battleLv + 1
self.needBattleExp = self:getLvNeedExp()
end
self.data.lvDirty = not self.data.lvDirty
end
function BattleBaseData:useAddlvCount()
if self.addLvCount <= 0 then
self.addLvCount = 0
return false
end
self.addLvCount = self.addLvCount - 1
return true
end
function BattleBaseData:addBattleLvCount(count)
self.addLvCount = self.addLvCount + count
self.battleLv = self.battleLv + count
self.data.lvDirty = not self.data.lvDirty
end
function BattleBaseData:addCommonSelectSkillCount(count)
self.commonSelectSkillCount = self.commonSelectSkillCount + (count or 1)
end
function BattleBaseData:useCommonSelectSkillCount()
if self.commonSelectSkillCount <= 0 then
self.commonSelectSkillCount = 0
return false
end
self.commonSelectSkillCount = self.commonSelectSkillCount - 1
return true
end
function BattleBaseData:addRefreshSkillCount(isAd)
if isAd then
self.adRefreshSkillCount = self.adRefreshSkillCount + 1
end
self.refreshSkillCount = self.refreshSkillCount + 1
end
function BattleBaseData:getRefreshSkillCount()
return self.refreshSkillCount
end
function BattleBaseData:getADRefreshSkillCount()
return self.adRefreshSkillCount
end
function BattleBaseData:addGetAllSkillCount()
self.adGetAllSkillCount = self.adGetAllSkillCount + 1
end
function BattleBaseData:getAllSkillCount()
return self.adGetAllSkillCount
end
function BattleBaseData:addAdDeityCount()
self.adDeityCount = self.adDeityCount + 1
end
function BattleBaseData:getAdDeityCount()
return self.adDeityCount
end
function BattleBaseData:addGetDoubleBoxCount()
self.adGetDoubleBoxCount = self.adGetDoubleBoxCount + 1
end
function BattleBaseData:getDoubleBoxCount()
return self.adGetDoubleBoxCount
end
function BattleBaseData:setIsRevive(revive)
self.isRevive = revive
end
function BattleBaseData:getIsRevive()
return self.isRevive
end
function BattleBaseData:setTalentSelect(talentSelectCount)
self.talentSelectCount = talentSelectCount
end
function BattleBaseData:getTalentSelect()
return self.talentSelectCount
end
function BattleBaseData:initTeam(side, formation)
local data = nil
data = self:initHeroData(formation)
local team = BattleTeamEntity:create()
team:init(side, data)
return team
end
function BattleBaseData:getTeamBySide(side)
if side == SIDE_ATK then
return self.atkTeam
else
return self.defTeam
end
end
function BattleBaseData:getAtkTeam()
return self.atkTeam
end
function BattleBaseData:getDefTeam()
return self.defTeam
end
function BattleBaseData:getHeroEntity(elementType, side)
if side == SIDE_DEF then
return self.defFormation[elementType]
else
return self.atkFormation[elementType]
end
end
function BattleBaseData:initHeroData(formation)
local units = {}
if formation then
local skillCfg = ConfigManager:getConfig("skill")
for matchType, heroEntity in pairs(formation) do
heroEntity:getAllAttr()
local skillId = heroEntity:getBaseSkill()
local hp = heroEntity:getHp() // DEFAULT_FACTOR
local unitData = {
id = heroEntity:getCfgId(),
modelId = heroEntity:getModelId(),
matchType = matchType,
normalSkills = heroEntity:getHurtSkill(),
-- assistingSkill = heroEntity:getAssistingSkill(),
body = 2, -- 英雄默认是中体型
skin = heroEntity:getSkinId(),
attr = {
hp = hp,
max_hp = hp,
}
}
---- 攻击力
for matchType, attrName in pairs(GConst.MATCH_ATTACK_NAME) do
unitData.attr[attrName] = heroEntity:getTotalAttrValue(attrName) // DEFAULT_FACTOR
end
---- 暴击率
for matchType, attrName in pairs(GConst.MATCH_CRIT_NAME) do
unitData.attr[attrName] = heroEntity:getTotalAttrValue(attrName)
end
---- 暴击伤害
for matchType, attrName in pairs(GConst.MATCH_CRIT_TIME_NAME) do
unitData.attr[attrName] = heroEntity:getTotalAttrValue(attrName)
end
---- 治疗效果
for matchType, attrName in pairs(GConst.MATCH_CURED_NAME) do
unitData.attr[attrName] = heroEntity:getTotalAttrValue(attrName)
end
---- 普攻增伤固定值
for matchType, attrName in pairs(GConst.MATCH_NORMAL_HURT_NAME) do
unitData.attr[attrName] = heroEntity:getTotalAttrValue(attrName) // DEFAULT_FACTOR
end
---- 普攻增伤百分比
for matchType, attrName in pairs(GConst.MATCH_NORMAL_HURTP_NAME) do
unitData.attr[attrName] = heroEntity:getTotalAttrValue(attrName)
end
---- 技能增伤固定值
for matchType, attrName in pairs(GConst.MATCH_SKILL_HURT_NAME) do
unitData.attr[attrName] = heroEntity:getTotalAttrValue(attrName) // DEFAULT_FACTOR
end
---- 技能增伤百分比
for matchType, attrName in pairs(GConst.MATCH_SKILL_HURTP_NAME) do
unitData.attr[attrName] = heroEntity:getTotalAttrValue(attrName)
end
---- 普攻\技能增伤百分比
for matchType, attrName in pairs(GConst.MATCH_ALL_HURTP_NAME) do
unitData.attr[attrName] = heroEntity:getTotalAttrValue(attrName)
end
unitData.attr[BattleConst.ATTR_NAME.ATTR_MONSTER_DMG] = heroEntity:getTotalAttrValue(BattleConst.ATTR_NAME.ATTR_MONSTER_DMG)
unitData.attr[BattleConst.ATTR_NAME.ATTR_BOSS_DMG] = heroEntity:getTotalAttrValue(BattleConst.ATTR_NAME.ATTR_BOSS_DMG)
unitData.attr[BattleConst.ATTR_NAME.DMGDEC] = heroEntity:getTotalAttrValue(BattleConst.ATTR_NAME.DMGDEC)
unitData.attr[BattleConst.ATTR_NAME.ATTR_NORMAL_HURT] = heroEntity:getTotalAttrValue(BattleConst.ATTR_NAME.ATTR_NORMAL_HURT)
unitData.attr[BattleConst.ATTR_NAME.ATTR_SKILL_HURT] = heroEntity:getTotalAttrValue(BattleConst.ATTR_NAME.ATTR_SKILL_HURT)
local skillInfo = skillCfg[skillId]
if skillInfo then
if skillInfo.effect_type == 1 then -- 主动
unitData.activeSkills = {skillId}
elseif skillInfo.effect_type == 2 then -- 被动
unitData.passiveSkills = {skillId}
end
end
table.insert(units, unitData)
end
end
local data = {
units = units
}
return data
end
function BattleBaseData:addMonster(monsterId, newTeam, battleController)
local monsterInfo = ConfigManager:getConfig("monster")[monsterId]
local hp = monsterInfo.hp // DEFAULT_FACTOR
local atk = monsterInfo.atk // DEFAULT_FACTOR
if battleController then
hp = hp * (DEFAULT_FACTOR + battleController:getMonsterHpAddition()) // DEFAULT_FACTOR
atk = atk * (DEFAULT_FACTOR + battleController:getMonsterAtkAddition()) // DEFAULT_FACTOR
local atkFixed = battleController:getMonsterAtkFixed()
local hpFixed = battleController:getMonsterHpFixed()
if atkFixed > 0 then
atk = atkFixed // DEFAULT_FACTOR
end
if hpFixed > 0 then
hp = hpFixed // DEFAULT_FACTOR
end
end
local unitData = {
id = monsterId,
modelId = monsterInfo.model_id,
matchType = 0,
normalSkills = monsterInfo.hurt_skill,
normalSkillCount = monsterInfo.atk_times or 0,
activeSkills = monsterInfo.skill,
passiveSkills = monsterInfo.passive_skill,
assistingSkill = nil,
isBoss = monsterInfo.is_boss,
exp = monsterInfo.monster_exp or 0,
body = monsterInfo.body,
hpSkinHp = monsterInfo.monster_hp,
hpSkinSkin = monsterInfo.monster_hp_skin,
hpExp = monsterInfo.monster_hp_exp,
attr = {
hp = hp,
max_hp = hp,
atk = atk,
atk_red = 0,
atk_yellow = 0,
atk_green = 0,
atk_blue = 0,
atk_purple = 0,
}
}
if newTeam then
self.defTeam:init(BattleConst.SIDE_DEF)
end
return self.defTeam:addUnit(unitData)
end
function BattleBaseData:getNormalAttackName(index)
if self.normalAttackName == nil then
self.normalAttackName = {}
end
local name = self.normalAttackName[index]
if name == nil then
name = string.format("attack%02d", index)
self.normalAttackName[index] = name
end
return name
end
function BattleBaseData:getGridEdgeEntities()
return self.gridEdgeEntities
end
function BattleBaseData:getGridEdgeEntity(posId, direction)
if not self.gridEdgeEntities then
return
end
if not self.gridEdgeEntities[posId] then
return
end
return self.gridEdgeEntities[posId][direction]
end
function BattleBaseData:breakGridEdge(posId, direction)
if not self.breakGridEdgeTag then
self.breakGridEdgeTag = {}
end
if not self.breakGridEdgeTag[posId] then
self.breakGridEdgeTag[posId] = {}
end
if self.breakGridEdgeTag[posId][direction] then -- 已经标记过了
return
end
self.breakGridEdgeTag[posId][direction] = true
if not self.gridEdgeEntities[posId] then
return
end
if not self.gridEdgeEntities[posId][direction] then
return
end
self.breakGridEdgeTagCount = (self.breakGridEdgeTagCount or 0) + 1
local breakSfx = self.gridEdgeEntities[posId][direction]:getBreakSfx()
self.gridEdgeEntities[posId][direction]:tryBreak()
return true, breakSfx, self.breakGridEdgeTagCount, self.gridEdgeEntities[posId][direction]:getCell()
end
function BattleBaseData:getBreakGridEdgeTagCount()
return self.breakGridEdgeTagCount
end
function BattleBaseData:clearBreakGridEdgeTag()
self.breakGridEdgeTagCount = 0
if not self.breakGridEdgeTag then
return
end
for posId, info in pairs(self.breakGridEdgeTag) do
self.breakGridEdgeTag[posId] = table.clearOrCreate(self.breakGridEdgeTag[posId])
end
end
return BattleBaseData