c1_lua/lua/app/userdata/battle/battle_grid_entity.lua
xiekaidong ad0ab2b8ba 宝箱
2023-05-17 18:17:09 +08:00

393 lines
10 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 BattleGridEntity = class("BattleGridEntity", BaseData)
local BattleConst = GConst.BattleConst
local GRID_TYPE_CFG = ConfigManager:getConfig("grid_type")
function BattleGridEntity:ctor(data)
self:clear()
self.posId = data.posId or 0
self.gridType = data.gridType or BattleConst.GRID_TYPE.EMPTY
self.elementType = data.elementType or BattleConst.ELEMENT_TYPE.NONE
self.skillId = data.skillId
self.linkSkillCount = data.linkSkillCount or 0 -- 任意链接技能激活次数
self.isIdle = false
self.breakCount = 0
self.data.isDirty = false
self:determineIdleStatus()
end
function BattleGridEntity:clear()
self.gridType = BattleConst.GRID_TYPE.EMPTY
self.elementType = BattleConst.ELEMENT_TYPE.RED
self.skillId = nil
self.linkSkillCount = 0 -- 任意链接技能激活次数
self.isIdle = false
self.breakCount = 0
self.data.isDirty = false
end
function BattleGridEntity:getSnapshoptInfo()
return {
posId = self.posId,
gridType = self.gridType,
elementType = self.elementType,
isIdle = self.isIdle,
skillId = self.skillId,
linkSkillCount = self.linkSkillCount,
breakCount = self.breakCount,
}
end
function BattleGridEntity:setInfoBySnapshop(snapshot)
self.posId = snapshot.posId or 0
self.gridType = snapshot.gridType or BattleConst.GRID_TYPE.EMPTY
self.elementType = snapshot.elementType or BattleConst.ELEMENT_TYPE.RED
self.isIdle = snapshot.isIdle
self.skillId = snapshot.skillId
self.linkSkillCount = snapshot.linkSkillCount
self.breakCount = snapshot.breakCount
self:setDirty()
end
function BattleGridEntity:setDirty()
self.data.isDirty = not self.data.isDirty
end
function BattleGridEntity:getPosId()
return self.posId
end
function BattleGridEntity:setPosId(posId)
self.posId = posId
end
function BattleGridEntity:getGridType()
return self.gridType
end
function BattleGridEntity:getElementType(skillEntity)
if skillEntity and skillEntity:getIgnoreElementType() and self.linkSkillCount <= 0 then
return nil
end
return self.elementType
end
function BattleGridEntity:isCantFallType()
return self:getGridTypeConfig().can_fall ~= 1
end
function BattleGridEntity:isObstacleType()
return self.gridType == BattleConst.GRID_TYPE.OBSTACLE
end
function BattleGridEntity:isEmptyType()
return self.gridType == BattleConst.GRID_TYPE.EMPTY
end
function BattleGridEntity:isElmentTypeInvalid()
return self:getGridTypeConfig().element_invalid == 1
end
---- 返回值1为true 返回值2为是否为idle状态返回值1为false时没有返回值2
function BattleGridEntity:tryBreakGrid(condition, onlyCheck)
if self:getIsIdle() then
if not onlyCheck then
self:setGridType(BattleConst.GRID_TYPE.EMPTY)
end
return false
end
local nextGridType = self:getNextGridType()
local isIdle = false
if nextGridType then
if not self:canBreakByThisCondition(condition) then
return false
end
if not onlyCheck then
self:addBreakCount(1)
if self:getBreakCount() < self:getCfgBreakCount() then
self:setDirty()
return false
end
local breakStayElement = self:getBreakStayElement()
self:setGridType(nextGridType)
if nextGridType == BattleConst.GRID_TYPE.EMPTY and not breakStayElement then
isIdle = true
end
else
if self:getBreakCount() + 1 < self:getCfgBreakCount() then
return false
end
local breakStayElement = self:getBreakStayElement()
if nextGridType == BattleConst.GRID_TYPE.EMPTY and not breakStayElement then
isIdle = true
end
end
else
if self:getSkillId() then
if condition == BattleConst.GRID_BREAK_CONDITION.LINE then -- 技能破碎逻辑为,链接消除
isIdle = true
else
return false
end
else
if self:isEmptyIdle() and (condition == BattleConst.GRID_BREAK_CONDITION.LINE or condition == BattleConst.GRID_BREAK_CONDITION.SKILL) then -- 空类型/带技能破碎逻辑为,链接消除 置为闲置即消除
isIdle = true
else -- 不可破碎类型
return false
end
end
end
if not onlyCheck then
self:setIsIdle(isIdle)
self:setDirty()
end
return true, isIdle
end
function BattleGridEntity:getPos()
return ModuleManager.BattleManager:getPosInfo(self.posId)
end
function BattleGridEntity:setCell(cell)
self.gridCell = cell
end
function BattleGridEntity:getCell()
return self.gridCell
end
function BattleGridEntity:getIsIdle()
return self.isIdle
end
function BattleGridEntity:setIsIdle(isIdle)
self.isIdle = isIdle == true
end
function BattleGridEntity:canLink()
if self:getIsIdle() then
return false
end
return self:getGridTypeConfig().cant_link ~= 1
end
function BattleGridEntity:addPath(singlePath)
self:getPath()
table.insert(self.pathList, singlePath)
end
function BattleGridEntity:getPath()
if not self.pathList then
self.pathList = {}
end
return self.pathList
end
function BattleGridEntity:clearPath()
self.pathList = {}
end
function BattleGridEntity:setGridType(gridType)
if self.gridType ~= gridType then
self.gridType = gridType
self.breakCount = 0
self:setDirty()
end
end
function BattleGridEntity:setElementType(elementType)
self.elementType = elementType
if DataManager.BattleData:getCacheLockedElement(self.elementType) then
self:setGridType(BattleConst.GRID_TYPE.LOCK)
end
self:setDirty()
end
function BattleGridEntity:getSkillId()
if not self.skillId or self.skillId <= 0 then
return
end
return self.skillId
end
function BattleGridEntity:setSkilId(skillId)
self.skillId = skillId
self.linkSkillCount = 0
self:setDirty()
end
function BattleGridEntity:canChangeInfo()
if self:canLink() and not self:getSkillId() then
return true
end
return false
end
function BattleGridEntity:isEmptyIdle()
if self:isEmptyType() and not self:getSkillId() and not self:getIsIdle() then
return true
end
return false
end
function BattleGridEntity:isNotObstacleIdle()
if not self:isObstacleType() and not self:getSkillId() and not self:getIsIdle() then
return true
end
return false
end
function BattleGridEntity:isCanFallStatus()
if not self:isCantFallType() and not self:getIsIdle() then
return true
end
return false
end
function BattleGridEntity:isLock()
return self.gridType == BattleConst.GRID_TYPE.LOCK
end
function BattleGridEntity:getNeedElimination()
return self.needElimination
end
function BattleGridEntity:getNeedChangePos()
if not self:getSkillId() then
return false
end
local skillEntity = DataManager.BattleData:getSkillEntityBySkillId(self:getSkillId())
if not skillEntity then
return false
end
local cfg = ModuleManager.BattleManager.SKILL_CFG[skillEntity:getSkillId()]
if cfg and cfg.method == BattleConst.SKILL_METHOD_TYPE.ON_FINAL then
return true
end
return false
end
function BattleGridEntity:addLinkSkillCount(count)
self.linkSkillCount = self.linkSkillCount + (count or 1)
end
function BattleGridEntity:setLinkSkillCount(count)
self.linkSkillCount = count or 0
end
function BattleGridEntity:getLinkSkillCount()
return self.linkSkillCount
end
function BattleGridEntity:determineIdleStatus()
if not self.isIdle and self.gridType == BattleConst.GRID_TYPE.EMPTY and self.elementType == BattleConst.ELEMENT_TYPE.NONE then
self.isIdle = true
end
end
function BattleGridEntity:getObstacleIcon()
if not self.obstacleIcon then
return "battle_hinder_1"
end
return self.obstacleIcon
end
function BattleGridEntity:setObstacleIcon(icon)
self.obstacleIcon = icon
end
function BattleGridEntity:getGridTypeConfig()
if not self.gridCfg or self.lastGridType ~= self.gridType then
self.lastGridType = self.gridType
self.gridCfg = GRID_TYPE_CFG[self.lastGridType]
self.breakConditionMap = {}
if self.gridCfg.break_condition then
for _, condition in ipairs(self.gridCfg.break_condition) do
self.breakConditionMap[condition] = true
end
end
end
return self.gridCfg
end
function BattleGridEntity:getNextGridType()
return self:getGridTypeConfig().next_type
end
function BattleGridEntity:getIcon()
local icon = self:getGridTypeConfig().icon
if not icon then
return GConst.ATLAS_PATH.COMMON, "common_alpha"
end
return GConst.ATLAS_PATH.BATTLE, icon
end
function BattleGridEntity:getBreakSfx()
local sfxName = self:getGridTypeConfig().break_sfx
if not sfxName then
return
end
if not self.cacheBreakSfxPaths then
self.cacheBreakSfxPaths = {}
end
if not self.cacheBreakSfxPaths[sfxName] then
self.cacheBreakSfxPaths[sfxName] = "assets/prefabs/effects/battle/" .. sfxName .. ".prefab"
end
return self.cacheBreakSfxPaths[sfxName]
end
function BattleGridEntity:getBreakConditionMap()
self:getGridTypeConfig()
return self.breakConditionMap
end
function BattleGridEntity:canBreakByThisCondition(condition)
self:getGridTypeConfig()
if not self.breakConditionMap then
return false
end
return self.breakConditionMap[condition] == true
end
function BattleGridEntity:getBreakStayElement()
return self:getGridTypeConfig().break_stay_element == 1
end
function BattleGridEntity:getCfgBreakCount()
return self:getGridTypeConfig().break_count or 0
end
function BattleGridEntity:getBreakCount()
return self.breakCount
end
function BattleGridEntity:addBreakCount(count)
self.breakCount = self.breakCount + count
end
function BattleGridEntity:getEffectType()
return self:getGridTypeConfig().effect
end
function BattleGridEntity:getEffectParams()
return self:getGridTypeConfig().effect_params
end
function BattleGridEntity:getEffectTrigger()
return self:getGridTypeConfig().effect_trigger
end
function BattleGridEntity:getBreakFlyToCharacter()
return self:getGridTypeConfig().break_fly_to_character == 1
end
return BattleGridEntity