188 lines
6.6 KiB
Lua
188 lines
6.6 KiB
Lua
local BattleController = class("BattleController")
|
|
|
|
local ELIMINATION_TOUCH_EVENT = GConst.ELIMINATION_TOUCH_EVENT
|
|
local BattleConst = GConst.BattleConst
|
|
|
|
-- 战斗对应的ui
|
|
function BattleController:getBattleUIPath()
|
|
return "app/ui/battle/battle_ui"
|
|
end
|
|
|
|
function BattleController:ctor()
|
|
|
|
end
|
|
|
|
function BattleController:init(params)
|
|
params = params or {}
|
|
self.initGridList = params.initGridList or {}
|
|
self.randomGridList = params.randomGridList or {}
|
|
DataManager.BattleData:init()
|
|
|
|
UIManager:closeAllUI()
|
|
self.battleUI = UIManager:showUI(self:getBattleUIPath())
|
|
self.battleUI:setController(self)
|
|
self.battleUI:addLoadUICompleteListener(function()
|
|
end)
|
|
end
|
|
|
|
function BattleController:onTouchEvent(eventType, posId)
|
|
local entity = DataManager.BattleData:getGridEntity(posId)
|
|
if not entity:canLink() then
|
|
return
|
|
end
|
|
|
|
if eventType == ELIMINATION_TOUCH_EVENT.DOWN then
|
|
if #DataManager.BattleData:getGridSequence() > 0 then
|
|
DataManager.BattleData:clearGridSequence()
|
|
end
|
|
DataManager.BattleData:insertGridSequence(posId)
|
|
self.battleUI:showBoardMask(entity:getElementType())
|
|
elseif eventType == ELIMINATION_TOUCH_EVENT.ENTER then
|
|
local sequence = DataManager.BattleData:getGridSequence()
|
|
local lastPosId = sequence[#sequence]
|
|
if not lastPosId then
|
|
return
|
|
end
|
|
local outLineMap = BattleConst.GRID_OUT_LINE_POS_ID[lastPosId]
|
|
if not outLineMap or not outLineMap[posId] then
|
|
return
|
|
end
|
|
local lastEntity = DataManager.BattleData:getGridEntity(lastPosId)
|
|
if lastEntity:getElementType() ~= entity:getElementType() then
|
|
return
|
|
end
|
|
if not DataManager.BattleData:insertGridSequence(posId) then
|
|
local beforePosId = sequence[#sequence - 1]
|
|
if not beforePosId then
|
|
return
|
|
end
|
|
if beforePosId == posId then -- 进入的是倒数第二个,则移除倒数第一个
|
|
DataManager.BattleData:removeGridSequence(lastPosId)
|
|
end
|
|
end
|
|
elseif eventType == ELIMINATION_TOUCH_EVENT.EXIT then
|
|
|
|
else -- 取消和抬起
|
|
self.battleUI:showBoardMask(nil)
|
|
local sequence = DataManager.BattleData:getGridSequence()
|
|
local count = #sequence
|
|
if count < BattleConst.ELIMINATION_MIN_COUNT then
|
|
return
|
|
end
|
|
local cellList = {}
|
|
for _, posId in ipairs(sequence) do
|
|
local entity = DataManager.BattleData:getGridEntity(posId)
|
|
table.insert(cellList, entity:getCell())
|
|
end
|
|
self.battleUI:eliminationAni(cellList, function()
|
|
for _, posId in ipairs(sequence) do
|
|
local entity = DataManager.BattleData:getGridEntity(posId)
|
|
entity:setIsIdle(true)
|
|
end
|
|
self:fillBoard()
|
|
DataManager.BattleData:clearGridSequence()
|
|
end)
|
|
end
|
|
end
|
|
|
|
function BattleController:fillBoard()
|
|
-- todo临时暴力求解
|
|
local pathMap = {}
|
|
local columnCount = {}
|
|
|
|
for c = 1, BattleConst.COLUMN_COUNT do
|
|
for r = BattleConst.ROW_COUNT, 1, -1 do
|
|
local posId = ModuleManager.BattleManager:getPosId(r, c)
|
|
local entity = DataManager.BattleData:getGridEntity(posId)
|
|
if entity:getIsIdle() then
|
|
self:fillThisPos(posId, columnCount)
|
|
end
|
|
end
|
|
end
|
|
|
|
for c = 1, BattleConst.COLUMN_COUNT do
|
|
for r = BattleConst.ROW_COUNT, 1, -1 do
|
|
local posId = ModuleManager.BattleManager:getPosId(r, c)
|
|
local entity = DataManager.BattleData:getGridEntity(posId)
|
|
if #entity:getPath() > 0 then
|
|
pathMap[posId] = entity:getPath()
|
|
entity:clearPath()
|
|
end
|
|
end
|
|
end
|
|
|
|
self.battleUI:fallGrid(pathMap)
|
|
end
|
|
|
|
---- 从一个点直接遍历所有相关的路径
|
|
function BattleController:fillThisPos(posId, columnCount)
|
|
local entity = DataManager.BattleData:getGridEntity(posId)
|
|
if not entity or not entity:getIsIdle() then
|
|
return
|
|
end
|
|
|
|
local list = BattleConst.UP_LINE_FILL_LIST[posId]
|
|
if not list[1] then -- 第一排
|
|
local rc = ModuleManager.BattleManager:getPosRC(posId)
|
|
local c = rc.c
|
|
if not columnCount[c] then
|
|
columnCount[c] = 0
|
|
end
|
|
columnCount[c] = columnCount[c] + 1
|
|
|
|
local fallPosId = posId
|
|
local fallEntity = DataManager.BattleData:getGridEntity(fallPosId)
|
|
if not fallEntity then -- 异常情况,理论上不可能不存在
|
|
return
|
|
end
|
|
|
|
local newStartPosId
|
|
for i = columnCount[c], 1, -1 do
|
|
newStartPosId = ModuleManager.BattleManager:getFirstLineLastRowPosId(i, c)
|
|
local curPos = ModuleManager.BattleManager:getPosInfo(newStartPosId)
|
|
fallEntity:addPath({x = curPos.x, y = curPos.y})
|
|
end
|
|
|
|
local curPos = ModuleManager.BattleManager:getPosInfo(posId)
|
|
fallEntity:addPath({x = curPos.x, y = curPos.y})
|
|
|
|
DataManager.BattleData:exchangeGridEntities(posId, fallPosId)
|
|
DataManager.BattleData:setGridInfo(posId, self:getRandomGridInfo())
|
|
else
|
|
for index, fallPosId in ipairs(list) do
|
|
local fallEntity = DataManager.BattleData:getGridEntity(fallPosId)
|
|
if not fallEntity then -- 异常情况,理论上不可能不存在
|
|
return
|
|
end
|
|
if fallEntity then
|
|
if not fallEntity:isCantFallType() then
|
|
if fallEntity:getIsIdle() then
|
|
self:fillThisPos(fallPosId, columnCount)
|
|
end
|
|
fallEntity = DataManager.BattleData:getGridEntity(fallPosId)
|
|
if not fallEntity:getIsIdle() then
|
|
if not fallEntity:getPath()[1] then
|
|
local curPos = ModuleManager.BattleManager:getPosInfo(fallPosId)
|
|
fallEntity:addPath({x = curPos.x, y = curPos.y})
|
|
end
|
|
|
|
local curPos = ModuleManager.BattleManager:getPosInfo(posId)
|
|
fallEntity:addPath({x = curPos.x, y = curPos.y})
|
|
|
|
DataManager.BattleData:exchangeGridEntities(posId, fallPosId)
|
|
self:fillThisPos(fallPosId, columnCount)
|
|
return
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function BattleController:getRandomGridInfo()
|
|
local gridType = 0
|
|
local elementType = math.random(1, 4)
|
|
return {gridType = gridType, elementType = elementType}
|
|
end
|
|
|
|
return BattleController |