瀏覽代碼

Merge pull request #4259 from vcmi/fix-4203

BattleAI: fix moving to unreachable in case of back-to-back 2-hex
Andrii Danylchenko 1 年之前
父節點
當前提交
d243a2fc12
共有 1 個文件被更改,包括 17 次插入1 次删除
  1. 17 1
      lib/battle/ReachabilityInfo.cpp

+ 17 - 1
lib/battle/ReachabilityInfo.cpp

@@ -66,9 +66,25 @@ uint32_t ReachabilityInfo::distToNearestNeighbour(
 
 	if(attacker->doubleWide())
 	{
-		vstd::concatenate(attackableHexes, battle::Unit::getHexes(defender->occupiedHex(), true, attacker->unitSide()));
+		if(defender->doubleWide())
+		{
+			// It can be back to back attack  o==o  or head to head  =oo=.
+			// In case of back-to-back the distance between heads (unit positions) may be up to 3 tiles
+			vstd::concatenate(attackableHexes, battle::Unit::getHexes(defender->occupiedHex(), true, defender->unitSide()));
+		}
+		else
+		{
+			vstd::concatenate(attackableHexes, battle::Unit::getHexes(defender->getPosition(), true, defender->unitSide()));
+		}
 	}
 
+	vstd::removeDuplicates(attackableHexes);
+
+	vstd::erase_if(attackableHexes, [defender](BattleHex h) -> bool
+		{
+			return h.getY() != defender->getPosition().getY() || !h.isAvailable();
+		});
+
 	return distToNearestNeighbour(attackableHexes, chosenHex);
 }