From 8311daada40c7ad8f14e2ac788fd54065083eb1b Mon Sep 17 00:00:00 2001 From: Myrd Date: Mon, 27 Feb 2017 00:05:31 +0000 Subject: [PATCH] [Simulated AI] Don't de-dupe creatures involved in combat when evaluating potential targets. Makes an exception if two identical creatures are attacking the same entity and haven't been blocked yet. --- .../ai/simulation/PossibleTargetSelector.java | 22 ++++++++++++++++++- .../ai/simulation/SpellAbilityPickerTest.java | 2 +- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/simulation/PossibleTargetSelector.java b/forge-ai/src/main/java/forge/ai/simulation/PossibleTargetSelector.java index 205fb65342e..cb5c726b6a2 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/PossibleTargetSelector.java +++ b/forge-ai/src/main/java/forge/ai/simulation/PossibleTargetSelector.java @@ -10,6 +10,7 @@ import forge.ai.ComputerUtilCard; import forge.game.GameObject; import forge.game.ability.AbilityUtils; import forge.game.card.Card; +import forge.game.combat.Combat; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; @@ -115,6 +116,7 @@ public class PossibleTargetSelector { } Card c = (Card) o; + Combat combat = c.getGame().getCombat(); for (Card existingTarget : validTargetsMap.get(c.getName())) { // Note: Checks are ordered from cheapest to more expensive ones. For example, type equals() // ends up calling toString() on the type object and is more expensive than the checks above it. @@ -130,7 +132,25 @@ public class PossibleTargetSelector { if (!getTypeString(existingTarget).equals(getTypeString(c))) { continue; } - if (c.isCreature() && getCreatureScore(c) != getCreatureScore(existingTarget)) { + if (c.isCreature()) { + if (!existingTarget.isCreature()) { + continue; + } + if (getCreatureScore(c) != getCreatureScore(existingTarget)) { + continue; + } + if (combat != null) { + if (combat.getDefenderByAttacker(c) != combat.getDefenderByAttacker(existingTarget)) { + // Either attacking different entities or one is attacking and the other is not. + continue; + } + + if (combat.isBlocked(c) || combat.isBlocked(existingTarget) || + combat.isBlocking(c) || combat.isBlocking(existingTarget)) { + // If either is blocked or blocking, consider them separately as well. + continue; + } + } continue; } return true; diff --git a/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerTest.java b/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerTest.java index b768b5d228c..52b7e4fb888 100644 --- a/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerTest.java +++ b/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerTest.java @@ -303,7 +303,7 @@ public class SpellAbilityPickerTest extends SimulationTestCase { Card blocker = addCard("Fugitive Wizard", opponent); Card attacker1 = addCard("Dwarven Trader", p); attacker1.setSickness(false); - Card attacker2 = addCard("Kird Ape", p); + Card attacker2 = addCard("Dwarven Trader", p); attacker2.setSickness(false); addCard("Mountain", p); addCardToZone("Brute Force", p, ZoneType.Hand);