diff --git a/client/battle/BattleActionsController.cpp b/client/battle/BattleActionsController.cpp index 3fcee2ce8..1aba3a286 100644 --- a/client/battle/BattleActionsController.cpp +++ b/client/battle/BattleActionsController.cpp @@ -731,15 +731,18 @@ void BattleActionsController::actionRealize(PossiblePlayerBattleAction action, c case PossiblePlayerBattleAction::MOVE_STACK: { const auto * activeStack = owner.stacksController->getActiveStack(); - const bool backwardsMove = activeStack->unitSide() == BattleSide::ATTACKER ? - targetHex.getX() < activeStack->getPosition().getX(): - targetHex.getX() > activeStack->getPosition().getX(); - if(activeStack->doubleWide() && backwardsMove) + if(activeStack->doubleWide()) { - BattleHexArray acc = owner.getBattle()->battleGetAvailableHexes(activeStack, false); + BattleHexArray availableHexes = owner.getBattle()->battleGetAvailableHexes(activeStack, false); BattleHex shiftedDest = targetHex.cloneInDirection(activeStack->destShiftDir(), false); - if(acc.contains(shiftedDest)) + const bool canMoveHeadHere = availableHexes.contains(targetHex); + const bool canMoveTailHere = availableHexes.contains(shiftedDest); + const bool backwardsMove = activeStack->unitSide() == BattleSide::ATTACKER ? + targetHex.getX() < activeStack->getPosition().getX(): + targetHex.getX() > activeStack->getPosition().getX(); + + if(canMoveTailHere && (backwardsMove || !canMoveHeadHere)) owner.giveCommand(EActionType::WALK, shiftedDest); else owner.giveCommand(EActionType::WALK, targetHex); diff --git a/client/battle/BattleFieldController.cpp b/client/battle/BattleFieldController.cpp index e71b6a7ca..f016b36d3 100644 --- a/client/battle/BattleFieldController.cpp +++ b/client/battle/BattleFieldController.cpp @@ -392,14 +392,16 @@ BattleHexArray BattleFieldController::getHighlightedHexesForMovementTarget() if (stack->doubleWide()) { + const bool canMoveHeadHere = availableHexes.contains(hoveredHex); + const bool canMoveTailHere = availableHexes.contains(hoveredHex.cloneInDirection(stack->destShiftDir())); const bool backwardsMove = stack->unitSide() == BattleSide::ATTACKER ? - hoveredHex.getX() < stack->getPosition().getX(): - hoveredHex.getX() > stack->getPosition().getX(); + hoveredHex.getX() < stack->getPosition().getX(): + hoveredHex.getX() > stack->getPosition().getX(); - if (backwardsMove && availableHexes.contains(hoveredHex.cloneInDirection(stack->destShiftDir()))) + if(canMoveTailHere && (backwardsMove || !canMoveHeadHere)) return {hoveredHex, hoveredHex.cloneInDirection(stack->destShiftDir())}; - if (availableHexes.contains(hoveredHex)) + if (canMoveHeadHere) return {hoveredHex, stack->occupiedHex(hoveredHex)}; return {};