竞技场敌方自动战斗
This commit is contained in:
parent
52a1631ad4
commit
cae3580d2c
@ -405,6 +405,21 @@ if NOT_PUBLISH then
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if (Input.GetKeyDown(KeyCode.Space)) and Input.GetKey(KeyCode.LeftControl) then
|
||||||
|
local battleController = ModuleManager.BattleManager.battleController
|
||||||
|
if not battleController then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local heler = require "app/module/battle/helper/board_helper"
|
||||||
|
local path = heler:findPvpLinkOptimalSolution(battleController, 1, 7)
|
||||||
|
if path then
|
||||||
|
for _, id in ipairs(path) do
|
||||||
|
local entity = battleController.battleData:getGridEnties()[id]
|
||||||
|
entity:getCell():showHighLight(true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
if (Input.GetKeyDown(KeyCode.RightArrow) or Input.GetKeyDown(KeyCode.LeftArrow)) and Input.GetKey(KeyCode.LeftControl) then
|
if (Input.GetKeyDown(KeyCode.RightArrow) or Input.GetKeyDown(KeyCode.LeftArrow)) and Input.GetKey(KeyCode.LeftControl) then
|
||||||
if not ModuleManager.DevToolManager.set_board_info then
|
if not ModuleManager.DevToolManager.set_board_info then
|
||||||
Logger.logHighlight("请先去gm面板设置浏览的棋盘信息!")
|
Logger.logHighlight("请先去gm面板设置浏览的棋盘信息!")
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
local BattleHelper = require "app/module/battle/helper/battle_helper"
|
local BattleHelper = require "app/module/battle/helper/battle_helper"
|
||||||
|
local board_heler = require "app/module/battle/helper/board_helper"
|
||||||
local BattleBaseController = require "app/module/battle/controller/battle_base_controller"
|
local BattleBaseController = require "app/module/battle/controller/battle_base_controller"
|
||||||
local BattleControllerPVP = class("BattleControllerPVP", BattleBaseController)
|
local BattleControllerPVP = class("BattleControllerPVP", BattleBaseController)
|
||||||
local BattleConst = GConst.BattleConst
|
local BattleConst = GConst.BattleConst
|
||||||
@ -239,10 +240,45 @@ function BattleControllerPVP:enterElimination(needDelay)
|
|||||||
if not find then -- 如果没找到,就要打乱棋盘
|
if not find then -- 如果没找到,就要打乱棋盘
|
||||||
self:shuffleBoard(function()
|
self:shuffleBoard(function()
|
||||||
self.roundStep = BattleConst.BATTLE_ROUND_STEP.ON_ELIMINATION
|
self.roundStep = BattleConst.BATTLE_ROUND_STEP.ON_ELIMINATION
|
||||||
|
self:checkDefBoard()
|
||||||
end)
|
end)
|
||||||
else
|
else
|
||||||
self.attentionList = pathList
|
self.attentionList = pathList
|
||||||
self.roundStep = BattleConst.BATTLE_ROUND_STEP.ON_ELIMINATION
|
self.roundStep = BattleConst.BATTLE_ROUND_STEP.ON_ELIMINATION
|
||||||
|
self:checkDefBoard()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function BattleControllerPVP:checkDefBoard()
|
||||||
|
if self:getCurActionSide() == SIDE_DEF then
|
||||||
|
local path = board_heler:findPvpLinkOptimalSolution(self, self:getAtkMinRow(), 1)
|
||||||
|
if path and #path >= self:getMinEliminationCount() then
|
||||||
|
if self.showCheckDefBoardSeq then
|
||||||
|
self.showCheckDefBoardSeq:Kill()
|
||||||
|
self.showCheckDefBoardSeq = nil
|
||||||
|
end
|
||||||
|
self.showCheckDefBoardSeq = self.battleUI.root:createBindTweenSequence()
|
||||||
|
local lastPosId
|
||||||
|
for index, posId in ipairs(path) do
|
||||||
|
lastPosId = posId
|
||||||
|
local time = index * 0.3
|
||||||
|
self.showCheckDefBoardSeq:InsertCallback(time, function()
|
||||||
|
local eventType
|
||||||
|
if index == 1 then
|
||||||
|
eventType = GConst.ELIMINATION_TOUCH_EVENT.DOWN
|
||||||
|
else
|
||||||
|
eventType = GConst.ELIMINATION_TOUCH_EVENT.ENTER
|
||||||
|
end
|
||||||
|
self:onTouchEvent(eventType, posId)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
self.showCheckDefBoardSeq:AppendInterval(0.5)
|
||||||
|
self.showCheckDefBoardSeq:AppendCallback(function()
|
||||||
|
self:onTouchEvent(GConst.ELIMINATION_TOUCH_EVENT.UP, lastPosId)
|
||||||
|
end)
|
||||||
|
else -- 没有找到,直接进入下一波
|
||||||
|
self:enterNextTeamAction()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -1,18 +1,142 @@
|
|||||||
local BoardHelper = {}
|
local BoardHelper = {}
|
||||||
|
local BattleConst = GConst.BattleConst
|
||||||
|
|
||||||
function BoardHelper:findPvpLinkOptimalSolution(battleController, minRow, maxRow)
|
function BoardHelper:getEmptyTable()
|
||||||
|
if not self.tempEmptyTables then
|
||||||
|
self.tempEmptyTables = {}
|
||||||
|
end
|
||||||
|
if not self.tempEmptyTables[1] then
|
||||||
|
table.insert(self.tempEmptyTables, {})
|
||||||
|
end
|
||||||
|
return table.remove(self.tempEmptyTables)
|
||||||
|
end
|
||||||
|
|
||||||
|
function BoardHelper:recycleedEmptyTable(emptyTable)
|
||||||
|
if not emptyTable then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
emptyTable = table.clear(emptyTable)
|
||||||
|
if self.tempEmptyTables then
|
||||||
|
table.insert(self.tempEmptyTables, emptyTable)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function BoardHelper:findPvpLinkOptimalSolution(battleController, startRow, endRow)
|
||||||
local battleData = battleController.battleData
|
local battleData = battleController.battleData
|
||||||
local gridEntities = {}
|
local gridMap = BoardHelper:getEmptyTable()
|
||||||
|
local minRow = math.min(startRow, endRow)
|
||||||
|
local maxRow = math.max(startRow, endRow)
|
||||||
for row = minRow, maxRow do -- 遍历所有的可使用格子
|
for row = minRow, maxRow do -- 遍历所有的可使用格子
|
||||||
for column = 1, GConst.BattleConst.COLUMN_COUNT do
|
for column = 1, BattleConst.COLUMN_COUNT do
|
||||||
local posId = ModuleManager.BattleManager:getPosId(row, column)
|
local posId = ModuleManager.BattleManager:getPosId(row, column)
|
||||||
local gridEntity = battleData:getGridEnties()[posId]
|
local gridEntity = battleData:getGridEnties()[posId]
|
||||||
if gridEntity and gridEntity:canLink() then
|
if gridEntity and gridEntity:canLink() then
|
||||||
table.insert(gridEntities, gridEntity)
|
gridMap[posId] = gridEntity
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local maxPath
|
||||||
|
local maxPathCount = 0
|
||||||
|
for posId, entity in pairs(gridMap) do
|
||||||
|
local mainElementType
|
||||||
|
if not entity:getSkillId() then
|
||||||
|
mainElementType = entity:getElementType()
|
||||||
|
local tree = BoardHelper:getEmptyTable()
|
||||||
|
self:getCanlinkTree(posId, gridMap, tree, mainElementType)
|
||||||
|
|
||||||
|
local checked = BoardHelper:getEmptyTable()
|
||||||
|
local haveSkill = false
|
||||||
|
local path = self:findMaxPath(posId, tree, checked, haveSkill, gridMap)
|
||||||
|
local count = #path
|
||||||
|
if count > maxPathCount then
|
||||||
|
maxPath = path
|
||||||
|
maxPathCount = count
|
||||||
|
end
|
||||||
|
for posId, info in pairs(tree) do
|
||||||
|
BoardHelper:recycleedEmptyTable(info)
|
||||||
|
end
|
||||||
|
BoardHelper:recycleedEmptyTable(tree)
|
||||||
|
BoardHelper:recycleedEmptyTable(checked)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
BoardHelper:recycleedEmptyTable(gridMap)
|
||||||
|
|
||||||
|
return maxPath
|
||||||
|
end
|
||||||
|
|
||||||
|
function BoardHelper:findMaxPath(posId, tree, checked, haveSkill, gridMap)
|
||||||
|
if not checked[posId] and tree[posId] then
|
||||||
|
local newPath
|
||||||
|
local newPathCount = 0
|
||||||
|
local newHaveSkill = false
|
||||||
|
local newChecked = GFunc.getTable(checked)
|
||||||
|
newChecked[posId] = true
|
||||||
|
for nextPosId, _ in pairs(tree[posId]) do
|
||||||
|
local entity = gridMap[nextPosId]
|
||||||
|
if not entity:getSkillId() or not haveSkill then
|
||||||
|
if entity:getSkillId() then
|
||||||
|
haveSkill = true
|
||||||
|
end
|
||||||
|
local p, getSkill = self:findMaxPath(nextPosId, tree, newChecked, haveSkill, gridMap)
|
||||||
|
if p then
|
||||||
|
local count = #p
|
||||||
|
if getSkill and not newHaveSkill then
|
||||||
|
newPath = GFunc.getTable(p)
|
||||||
|
newPathCount = count
|
||||||
|
newHaveSkill = getSkill
|
||||||
|
else
|
||||||
|
if not getSkill and newHaveSkill then
|
||||||
|
BoardHelper:recycleedEmptyTable(p)
|
||||||
|
else
|
||||||
|
if count > newPathCount then
|
||||||
|
newPath = GFunc.getTable(p)
|
||||||
|
newPathCount = count
|
||||||
|
newHaveSkill = getSkill
|
||||||
|
else
|
||||||
|
BoardHelper:recycleedEmptyTable(p)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if not newPath then
|
||||||
|
newPath = BoardHelper:getEmptyTable()
|
||||||
|
end
|
||||||
|
table.insert(newPath, 1, posId)
|
||||||
|
if not newHaveSkill then
|
||||||
|
newHaveSkill = gridMap[posId]:getSkillId() ~= nil
|
||||||
|
end
|
||||||
|
|
||||||
|
return newPath, newHaveSkill
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function BoardHelper:getCanlinkTree(posId, gridMap, tree, mainElementType)
|
||||||
|
if tree[posId] then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local ids = self:getAroundPosIds(posId, gridMap, mainElementType)
|
||||||
|
tree[posId] = ids
|
||||||
|
for aroundPosId, status in pairs(ids) do
|
||||||
|
self:getCanlinkTree(aroundPosId, gridMap, tree, mainElementType)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function BoardHelper:getAroundPosIds(posId, gridMap, mainElementType)
|
||||||
|
local ids = BoardHelper:getEmptyTable()
|
||||||
|
local aroundPosIds = BattleConst.GRID_OUT_LINE_POS_ID[posId]
|
||||||
|
if aroundPosIds then
|
||||||
|
for id, status in pairs(aroundPosIds) do
|
||||||
|
if gridMap[id] and (gridMap[id]:getElementType() == mainElementType or gridMap[id]:getSkillId()) then
|
||||||
|
ids[id] = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return ids
|
||||||
end
|
end
|
||||||
|
|
||||||
return BoardHelper
|
return BoardHelper
|
||||||
@ -20,6 +20,7 @@ function BattleUIPVP:initBaseInfo()
|
|||||||
self.boardCacheBox:setAnchoredPositionX(DEFAULT_X)
|
self.boardCacheBox:setAnchoredPositionX(DEFAULT_X)
|
||||||
self.battleRoot = uiMap["battle_ui_pvp.battle_root"]
|
self.battleRoot = uiMap["battle_ui_pvp.battle_root"]
|
||||||
self.maxLayerNode = uiMap["battle_ui_pvp.battle_root.battle_node.max_layer_show_node"]
|
self.maxLayerNode = uiMap["battle_ui_pvp.battle_root.battle_node.max_layer_show_node"]
|
||||||
|
self.touchMask = uiMap["battle_ui_pvp.board_root_node.touch_mask"]
|
||||||
end
|
end
|
||||||
|
|
||||||
function BattleUIPVP:initBg()
|
function BattleUIPVP:initBg()
|
||||||
@ -209,12 +210,16 @@ function BattleUIPVP:refreshWave(wave, iconAtlas, iconName)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function BattleBaseUI:enterShowBoardAni(callback)
|
function BattleBaseUI:enterShowBoardAni(callback)
|
||||||
|
local isAtkAction = self.battleController.curActionSide == GConst.BattleConst.SIDE_ATK
|
||||||
|
if self.touchMask then
|
||||||
|
self.touchMask:setVisible(not isAtkAction)
|
||||||
|
end
|
||||||
self:clearEnterShowBoardSeq()
|
self:clearEnterShowBoardSeq()
|
||||||
self.enterShowBoardSeq = self.root:createBindTweenSequence()
|
self.enterShowBoardSeq = self.root:createBindTweenSequence()
|
||||||
self.enterShowBoardSeq:Append(self:getBoardRootNode():getTransform():DOLocalMoveX(0, 0.5))
|
self.enterShowBoardSeq:Append(self:getBoardRootNode():getTransform():DOLocalMoveX(0, 0.5))
|
||||||
self.enterShowBoardSeq:AppendCallback(function()
|
self.enterShowBoardSeq:AppendCallback(function()
|
||||||
local str
|
local str
|
||||||
if self.battleController.curActionSide == GConst.BattleConst.SIDE_ATK then
|
if isAtkAction then
|
||||||
str = I18N:getGlobalText(I18N.GlobalConst.ARENA_BATTLE_DESC_1)
|
str = I18N:getGlobalText(I18N.GlobalConst.ARENA_BATTLE_DESC_1)
|
||||||
else
|
else
|
||||||
str = I18N:getGlobalText(I18N.GlobalConst.ARENA_BATTLE_DESC_2)
|
str = I18N:getGlobalText(I18N.GlobalConst.ARENA_BATTLE_DESC_2)
|
||||||
@ -231,6 +236,7 @@ function BattleBaseUI:enterHideBoardAni(callback)
|
|||||||
self.enterShowBoardSeq = self.root:createBindTweenSequence()
|
self.enterShowBoardSeq = self.root:createBindTweenSequence()
|
||||||
local w, h = GFunc.getUIExpandScreenSize()
|
local w, h = GFunc.getUIExpandScreenSize()
|
||||||
self.enterShowBoardSeq:Append(self:getBoardRootNode():getTransform():DOLocalMoveX(w / 2 + 360, 0.5))
|
self.enterShowBoardSeq:Append(self:getBoardRootNode():getTransform():DOLocalMoveX(w / 2 + 360, 0.5))
|
||||||
|
self.enterShowBoardSeq:AppendInterval(0.5)
|
||||||
self.enterShowBoardSeq:AppendCallback(function()
|
self.enterShowBoardSeq:AppendCallback(function()
|
||||||
if callback then
|
if callback then
|
||||||
callback()
|
callback()
|
||||||
|
|||||||
@ -114,6 +114,24 @@ function GMToolUI:sendMsg(gmCommand)
|
|||||||
isMystery = args.args[4] ~= nil
|
isMystery = args.args[4] ~= nil
|
||||||
}
|
}
|
||||||
self:closeUI()
|
self:closeUI()
|
||||||
|
elseif args.args[1] == "add_skill" then -- 特殊处理
|
||||||
|
if not ModuleManager.BattleManager:isInBattle() then
|
||||||
|
Logger.logHighlight("不在战斗中")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local posId = tonumber(args.args[2])
|
||||||
|
local skillElement = tonumber(args.args[3])
|
||||||
|
local side = GConst.BattleConst.SIDE_ATK
|
||||||
|
if args.args[4] then
|
||||||
|
side = tonumber(args.args[4])
|
||||||
|
end
|
||||||
|
local controller = ModuleManager.BattleManager.battleController
|
||||||
|
local battleData = controller.battleData
|
||||||
|
local entity = battleData:getSkillEntityByElement(skillElement, side)
|
||||||
|
if entity then
|
||||||
|
battleData:getGridEnties()[posId]:setSkilId(entity:getSkillId(), false, side)
|
||||||
|
end
|
||||||
|
self:closeUI()
|
||||||
elseif args.args[1] == "check_skill_sound" then
|
elseif args.args[1] == "check_skill_sound" then
|
||||||
self:checkSkillSoundExist()
|
self:checkSkillSoundExist()
|
||||||
self:closeUI()
|
self:closeUI()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user