From 8196ee531af1d59c85f728a14f2f9f1a080a116c Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Fri, 23 Apr 2021 22:43:14 +0200 Subject: [PATCH] AI: basic support playing MDFC lands --- forge-ai/src/main/java/forge/ai/AiController.java | 7 +++++++ forge-game/src/main/java/forge/game/card/Card.java | 2 +- .../src/main/java/forge/game/card/CardPredicates.java | 3 ++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index ede9f756fde..20d7ce7d787 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -34,6 +34,7 @@ import forge.ai.ability.ChangeZoneAi; import forge.ai.ability.ExploreAi; import forge.ai.ability.LearnAi; import forge.ai.simulation.SpellAbilityPicker; +import forge.card.CardStateName; import forge.card.MagicColor; import forge.card.mana.ManaCost; import forge.deck.CardPool; @@ -1454,6 +1455,12 @@ public class AiController { if (!game.getPhaseHandler().is(PhaseType.MAIN1) || !isSafeToHoldLandDropForMain2(land)) { final List abilities = Lists.newArrayList(); + // TODO extend this logic to evaluate MDFC with both sides land + // this can only happen if its a MDFC land + if (!land.isLand()) { + land.setState(CardStateName.Modal, false); + } + LandAbility la = new LandAbility(land, player, null); la.setCardState(land.getCurrentState()); if (la.canPlay()) { diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 00342d79ea4..adba1f04516 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -4529,7 +4529,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { public final boolean isShrine() { return getType().hasSubtype("Shrine"); } public final boolean isAttachment() { return isAura() || isEquipment() || isFortification(); } - public final boolean isHistoric() {return getType().isLegendary() || isArtifact() || getType().hasSubtype("Saga");} + public final boolean isHistoric() { return getType().isLegendary() || isArtifact() || getType().hasSubtype("Saga"); } public final boolean isScheme() { return getType().isScheme(); } public final boolean isPhenomenon() { return getType().isPhenomenon(); } diff --git a/forge-game/src/main/java/forge/game/card/CardPredicates.java b/forge-game/src/main/java/forge/game/card/CardPredicates.java index 8db9d7bb215..9dff8d1bfb7 100644 --- a/forge-game/src/main/java/forge/game/card/CardPredicates.java +++ b/forge-game/src/main/java/forge/game/card/CardPredicates.java @@ -22,6 +22,7 @@ import java.util.Comparator; import com.google.common.base.Function; import com.google.common.base.Predicate; +import forge.card.CardStateName; import forge.game.CardTraitBase; import forge.game.combat.CombatUtil; import forge.game.keyword.Keyword; @@ -653,7 +654,7 @@ public final class CardPredicates { public static final Predicate LANDS = new Predicate() { @Override public boolean apply(Card c) { - return c.isLand(); + return c.isLand() || (!c.isInZone(ZoneType.Battlefield) && c.isModal() && c.getState(CardStateName.Modal).getType().isLand()); } }; /**