1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-07-17 01:32:21 +02:00

Fix crash on moving double-wide units in some obstacle configurations

This commit is contained in:
Ivan Savenko
2025-07-01 12:34:53 +03:00
parent 835120237d
commit bc4a1b06fc
2 changed files with 15 additions and 10 deletions

View File

@ -731,15 +731,18 @@ void BattleActionsController::actionRealize(PossiblePlayerBattleAction action, c
case PossiblePlayerBattleAction::MOVE_STACK:
{
const auto * activeStack = owner.stacksController->getActiveStack();
if(activeStack->doubleWide())
{
BattleHexArray availableHexes = owner.getBattle()->battleGetAvailableHexes(activeStack, false);
BattleHex shiftedDest = targetHex.cloneInDirection(activeStack->destShiftDir(), false);
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(activeStack->doubleWide() && backwardsMove)
{
BattleHexArray acc = owner.getBattle()->battleGetAvailableHexes(activeStack, false);
BattleHex shiftedDest = targetHex.cloneInDirection(activeStack->destShiftDir(), false);
if(acc.contains(shiftedDest))
if(canMoveTailHere && (backwardsMove || !canMoveHeadHere))
owner.giveCommand(EActionType::WALK, shiftedDest);
else
owner.giveCommand(EActionType::WALK, targetHex);

View File

@ -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();
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 {};