diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 506b7ea930a..776b5e6a380 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -2091,9 +2091,7 @@ public class AiController { return simPicker.chooseCardToHiddenOriginChangeZone(destination, origin, sa, fetchList, player2, decider); } - if (sa.getApi() == ApiType.Explore) { - return ExploreAi.shouldPutInGraveyard(fetchList, decider); - } else if (sa.getApi() == ApiType.Learn) { + if (sa.getApi() == ApiType.Learn) { return LearnAi.chooseCardToLearn(fetchList, decider, sa); } else { return ChangeZoneAi.chooseCardToHiddenOriginChangeZone(destination, origin, sa, fetchList, player2, decider); diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index e283132a97d..0a3d3310067 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -242,7 +242,7 @@ public class PlayerControllerAi extends PlayerController { } @Override - public boolean confirmAction(SpellAbility sa, PlayerActionConfirmMode mode, String message, Map params, Card cardToShow) { + public boolean confirmAction(SpellAbility sa, PlayerActionConfirmMode mode, String message, Card cardToShow, Map params) { return getAi().confirmAction(sa, mode, message, params); } diff --git a/forge-ai/src/main/java/forge/ai/ability/ExploreAi.java b/forge-ai/src/main/java/forge/ai/ability/ExploreAi.java index 7cc4abf0dce..b755e4fd41c 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ExploreAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ExploreAi.java @@ -13,9 +13,12 @@ import forge.game.card.CardCollectionView; import forge.game.card.CardLists; import forge.game.card.CardPredicates; import forge.game.player.Player; +import forge.game.player.PlayerActionConfirmMode; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; +import java.util.Map; + public class ExploreAi extends SpellAbilityAi { /* (non-Javadoc) * @see forge.card.abilityfactory.SpellAiLogic#canPlayAI(forge.game.player.Player, java.util.Map, forge.card.spellability.SpellAbility) @@ -36,7 +39,7 @@ public class ExploreAi extends SpellAbilityAi { return true; } - public static Card shouldPutInGraveyard(CardCollection top, Player ai) { + public static boolean shouldPutInGraveyard(Card topCard, Player ai) { int predictedMana = ComputerUtilMana.getAvailableManaSources(ai, false).size(); CardCollectionView cardsOTB = ai.getCardsIn(ZoneType.Battlefield); CardCollectionView cardsInHand = ai.getCardsIn(ZoneType.Hand); @@ -52,20 +55,20 @@ public class ExploreAi extends SpellAbilityAi { numLandsToStillNeedMore = aic.getIntProperty(AiProps.EXPLORE_NUM_LANDS_TO_STILL_NEED_MORE); } - if (!top.isEmpty()) { - Card topCard = top.getFirst(); - if (landsInHand.isEmpty() && landsOTB.size() <= numLandsToStillNeedMore) { - // We need more lands to improve our mana base, explore away the non-lands - return topCard; - } - if (topCard.getCMC() - maxCMCDiff >= predictedMana && !topCard.hasSVar("DoNotDiscardIfAble")) { - // We're not casting this in foreseeable future, put it in the graveyard - return topCard; - } + if (landsInHand.isEmpty() && landsOTB.size() <= numLandsToStillNeedMore) { + // We need more lands to improve our mana base, explore away the non-lands + return true; + } else if (topCard.getCMC() - maxCMCDiff >= predictedMana && !topCard.hasSVar("DoNotDiscardIfAble")) { + // We're not casting this in foreseeable future, put it in the graveyard + return true; } // Put on top of the library (do not mark the card for placement in the graveyard) - return null; + return false; } + @Override + public boolean confirmAction(Player player, SpellAbility sa, PlayerActionConfirmMode mode, String message, Map params) { + return shouldPutInGraveyard((Card)params.get("RevealedCard"), player); + } } diff --git a/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityPicker.java b/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityPicker.java index 143ff672017..c22e2ac11ea 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityPicker.java +++ b/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityPicker.java @@ -435,9 +435,7 @@ public class SpellAbilityPicker { return card; } } - if (sa.getApi() == ApiType.Explore) { - return ExploreAi.shouldPutInGraveyard(fetchList, decider); - } else if (sa.getApi() == ApiType.Learn) { + if (sa.getApi() == ApiType.Learn) { return LearnAi.chooseCardToLearn(fetchList, decider, sa); } else { return ChangeZoneAi.chooseCardToHiddenOriginChangeZone(destination, origin, sa, fetchList, player2, decider); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ExploreEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ExploreEffect.java index 30c69e02e27..a58eeebe6af 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ExploreEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ExploreEffect.java @@ -1,5 +1,6 @@ package forge.game.ability.effects; +import com.google.common.collect.Maps; import forge.game.Game; import forge.game.GameEntityCounterTable; import forge.game.ability.AbilityKey; @@ -77,9 +78,11 @@ public class ExploreEffect extends SpellAbilityEffect { movedCard = game.getAction().moveTo(ZoneType.Hand, r, sa, moveParams); revealedLand = true; } else { + Map params = Maps.newHashMap(); + params.put("RevealedCard", r); if (pl.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblPutThisCardToYourGraveyard", - CardTranslation.getTranslatedName(r.getName())), null, r)) + CardTranslation.getTranslatedName(r.getName())), r, params)) movedCard = game.getAction().moveTo(ZoneType.Graveyard, r, sa, moveParams); } diff --git a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java index 931c545e05d..678f0da267f 100644 --- a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java +++ b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java @@ -187,7 +187,7 @@ public class PlayerControllerForTests extends PlayerController { } @Override - public boolean confirmAction(SpellAbility sa, PlayerActionConfirmMode mode, String message, Map newParam, Card cardToShow) { + public boolean confirmAction(SpellAbility sa, PlayerActionConfirmMode mode, String message, Card cardToShow, Map params) { return true; } diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 634e1fdf75a..9d68af9eb88 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -772,7 +772,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont */ @Override public boolean confirmAction(final SpellAbility sa, final PlayerActionConfirmMode mode, final String message, - Map params, Card cardToShow) { + Card cardToShow, Map params) { // Another card should be displayed in the prompt on mouse over rather than the SA source if (cardToShow != null) { tempShowCard(cardToShow);