瀏覽代碼

Fix possible crash on hovering over inaccessible hexes on other side of
the battlefield when war machine is making turn

Ivan Savenko 3 月之前
父節點
當前提交
1daf9d3a44
共有 2 個文件被更改,包括 14 次插入5 次删除
  1. 3 3
      client/battle/BattleFieldController.cpp
  2. 11 2
      lib/battle/BattleHex.h

+ 3 - 3
client/battle/BattleFieldController.cpp

@@ -392,8 +392,8 @@ BattleHexArray BattleFieldController::getHighlightedHexesForMovementTarget()
 
 	if (stack->doubleWide())
 	{
-		const bool canMoveHeadHere = availableHexes.contains(hoveredHex);
-		const bool canMoveTailHere = availableHexes.contains(hoveredHex.cloneInDirection(stack->destShiftDir()));
+		const bool canMoveHeadHere = hoveredHex.isAvailable() && availableHexes.contains(hoveredHex);
+		const bool canMoveTailHere = hoveredHex.isAvailable() && availableHexes.contains(hoveredHex.cloneInDirection(stack->destShiftDir()));
 		const bool backwardsMove = stack->unitSide() == BattleSide::ATTACKER ?
 									   hoveredHex.getX() < stack->getPosition().getX():
 									   hoveredHex.getX() > stack->getPosition().getX();
@@ -822,7 +822,7 @@ bool BattleFieldController::isTileAttackable(const BattleHex & number) const
 
 	for (auto & elem : occupiableHexes)
 	{
-		if (BattleHex::mutualPosition(elem, number) != -1 || elem == number)
+		if (BattleHex::mutualPosition(elem, number) != BattleHex::EDir::NONE || elem == number)
 			return true;
 	}
 	return false;

+ 11 - 2
lib/battle/BattleHex.h

@@ -212,8 +212,17 @@ public:
 	[[nodiscard]] static EDir mutualPosition(const BattleHex & hex1, const BattleHex & hex2)
 	{
 		for(auto dir : hexagonalDirections())
-			if(hex2 == hex1.cloneInDirection(dir, false))
-				return dir;
+		{
+			try
+			{
+				if(hex2 == hex1.cloneInDirection(dir, true))
+					return dir;
+			}
+			catch (const std::out_of_range &)
+			{
+				continue;
+			}
+		}
 		return NONE;
 	}