From 3518dba4de25da9783dbc36d60326d8df8bec7af Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 23 Sep 2017 11:47:57 +0000 Subject: [PATCH] basic Explore Effect git-svn-id: http://svn.slightlymagic.net/forge/trunk@35721 269b9781-a132-4a9b-9d4e-f004f1b56b58 --- .../src/main/java/forge/ai/SpellApiToAi.java | 1 + .../main/java/forge/game/ability/ApiType.java | 1 + .../game/ability/effects/ExploreEffect.java | 78 +++++++++++++++++++ .../forge/game/trigger/TriggerExplores.java | 4 +- 4 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 forge-game/src/main/java/forge/game/ability/effects/ExploreEffect.java diff --git a/forge-ai/src/main/java/forge/ai/SpellApiToAi.java b/forge-ai/src/main/java/forge/ai/SpellApiToAi.java index 35eb2784..93447e40 100644 --- a/forge-ai/src/main/java/forge/ai/SpellApiToAi.java +++ b/forge-ai/src/main/java/forge/ai/SpellApiToAi.java @@ -72,6 +72,7 @@ public enum SpellApiToAi { .put(ApiType.ExchangeControlVariant, CannotPlayAi.class) .put(ApiType.ExchangePower, PowerExchangeAi.class) .put(ApiType.ExchangeZone, ZoneExchangeAi.class) + .put(ApiType.Explore, AlwaysPlayAi.class) .put(ApiType.Fight, FightAi.class) .put(ApiType.FlipACoin, FlipACoinAi.class) .put(ApiType.Fog, FogAi.class) diff --git a/forge-game/src/main/java/forge/game/ability/ApiType.java b/forge-game/src/main/java/forge/game/ability/ApiType.java index 6e619b26..ba311a9a 100644 --- a/forge-game/src/main/java/forge/game/ability/ApiType.java +++ b/forge-game/src/main/java/forge/game/ability/ApiType.java @@ -69,6 +69,7 @@ public enum ApiType { ExchangeControlVariant (ControlExchangeVariantEffect.class), ExchangePower (PowerExchangeEffect.class), ExchangeZone (ZoneExchangeEffect.class), + Explore (ExploreEffect.class), Fight (FightEffect.class), FlipACoin (FlipCoinEffect.class), Fog (FogEffect.class), 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 new file mode 100644 index 00000000..c695995d --- /dev/null +++ b/forge-game/src/main/java/forge/game/ability/effects/ExploreEffect.java @@ -0,0 +1,78 @@ +package forge.game.ability.effects; + +import java.util.List; +import java.util.Map; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; + +import forge.game.Game; +import forge.game.ability.SpellAbilityEffect; +import forge.game.card.Card; +import forge.game.card.CardCollection; +import forge.game.card.CounterType; +import forge.game.player.Player; +import forge.game.player.PlayerController; +import forge.game.spellability.SpellAbility; +import forge.game.trigger.TriggerType; +import forge.game.zone.ZoneType; + +public class ExploreEffect extends SpellAbilityEffect { + + + + /* (non-Javadoc) + * @see forge.game.ability.SpellAbilityEffect#getStackDescription(forge.game.spellability.SpellAbility) + */ + @Override + protected String getStackDescription(SpellAbility sa) { + final Card host = sa.getHostCard(); + return host.getName() + " explores."; + } + + /* (non-Javadoc) + * @see forge.game.ability.SpellAbilityEffect#resolve(forge.game.spellability.SpellAbility) + */ + @Override + public void resolve(SpellAbility sa) { + // check if only the activating player counts + final Card card = sa.getHostCard(); + final Player pl = sa.getActivatingPlayer(); + final PlayerController pc = pl.getController(); + final Game game = pl.getGame(); + List tgt = getTargetCards(sa); + + for (final Card c : tgt) { + // revealed land card + boolean revealedLand = false; + CardCollection top = pl.getTopXCardsFromLibrary(1); + if (!top.isEmpty()) { + pl.getController().reveal(top, ZoneType.Library, pl, "Revealed for Explore"); + final Card r = top.getFirst(); + if (r.isLand()) { + game.getAction().moveTo(ZoneType.Hand, r, sa); + revealedLand = true; + } else { + // TODO find better way to choose optional send away + final Card choosen = pc.chooseSingleCardForZoneChange( + ZoneType.Graveyard, Lists.newArrayList(ZoneType.Library), sa, top, null, + "send to graveyard?", true, pl); + if (choosen != null) { + game.getAction().moveTo(ZoneType.Graveyard, choosen, sa); + } + } + } + if (revealedLand) { + // TODO need to check if card didn't blick while that was happening, + // probably need strictlySelf in the Defined + if (game.getZoneOf(c).is(ZoneType.Battlefield)) { + c.addCounter(CounterType.P1P1, 1, card, true); + final Map runParams = Maps.newHashMap(); + runParams.put("Card", c); + game.getTriggerHandler().runTrigger(TriggerType.Explores, runParams, false); + } + } + } + } + +} diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java b/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java index 92f63407..5b15c7db 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java @@ -51,7 +51,7 @@ public class TriggerExplores extends Trigger { @Override public final boolean performTest(final Map runParams2) { if (this.mapParams.containsKey("ValidCard")) { - if (!matchesValid(runParams2.get("Explorer"), this.mapParams.get("ValidCard").split(","), + if (!matchesValid(runParams2.get("Card"), this.mapParams.get("ValidCard").split(","), this.getHostCard())) { return false; } @@ -63,7 +63,7 @@ public class TriggerExplores extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject("Explorer", this.getRunParams().get("Explorer")); + sa.setTriggeringObject("Explorer", this.getRunParams().get("Card")); } @Override