Bläddra i källkod

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

Ivan Savenko 5 månader sedan
förälder
incheckning
bc4a1b06fc
2 ändrade filer med 15 tillägg och 10 borttagningar
  1. 9 6
      client/battle/BattleActionsController.cpp
  2. 6 4
      client/battle/BattleFieldController.cpp

+ 9 - 6
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);

+ 6 - 4
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 {};