From 8968ea3382adaa77d487fe0478e40d51c95ea7bf Mon Sep 17 00:00:00 2001 From: Hanmac Date: Tue, 6 Dec 2016 06:32:02 +0000 Subject: [PATCH] add new TriggerRevealed to use it for Miracle --- .gitattributes | 1 + .../game/ability/effects/RevealEffect.java | 24 ++++++---- .../java/forge/game/card/CardFactoryUtil.java | 25 ++++++++--- .../forge/game/trigger/TriggerRevealed.java | 44 +++++++++++++++++++ .../java/forge/game/trigger/TriggerType.java | 1 + 5 files changed, 79 insertions(+), 16 deletions(-) create mode 100644 forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java diff --git a/.gitattributes b/.gitattributes index 17f461e4788..d743c5e2b9b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -721,6 +721,7 @@ forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java -text forge-game/src/main/java/forge/game/trigger/TriggerPlanarDice.java -text forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedFrom.java -text forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedTo.java -text +forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java -text svneol=unset#text/plain forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java svneol=native#text/plain forge-game/src/main/java/forge/game/trigger/TriggerScry.java -text forge-game/src/main/java/forge/game/trigger/TriggerSearchedLibrary.java -text diff --git a/forge-game/src/main/java/forge/game/ability/effects/RevealEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RevealEffect.java index a1480081d35..70957abaeb5 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RevealEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RevealEffect.java @@ -9,25 +9,26 @@ import forge.game.card.CardCollectionView; import forge.game.card.CardLists; import forge.game.player.Player; import forge.game.spellability.SpellAbility; -import forge.game.spellability.TargetRestrictions; +import forge.game.trigger.TriggerType; import forge.game.zone.ZoneType; import forge.util.Aggregates; import java.util.List; +import java.util.Map; + +import com.google.common.collect.Maps; public class RevealEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { final Card host = sa.getHostCard(); + final Game game = host.getGame(); final boolean anyNumber = sa.hasParam("AnyNumber"); int cnt = sa.hasParam("NumCards") ? AbilityUtils.calculateAmount(host, sa.getParam("NumCards"), sa) : 1; - final TargetRestrictions tgt = sa.getTargetRestrictions(); - for (final Player p : getTargetPlayers(sa)) { - final Game game = p.getGame(); - if (tgt == null || p.canBeTargetedBy(sa)) { + if (!sa.usesTargeting() || p.canBeTargetedBy(sa)) { final CardCollectionView cardsInHand = p.getZone(ZoneType.Hand).getCards(); if (cardsInHand.isEmpty()) { continue; @@ -71,10 +72,15 @@ public class RevealEffect extends SpellAbilityEffect { } game.getAction().reveal(revealed, p); - - if (sa.hasParam("RememberRevealed")) { - for (final Card rem : revealed) { - host.addRemembered(rem); + for (final Card c : revealed) { + Map runParams = Maps.newHashMap(); + runParams.put("Card", c); + if (sa.hasParam("MiracleCost")) { + runParams.put("Miracle", true); + } + game.getTriggerHandler().runTrigger(TriggerType.Revealed, runParams, false); + if (sa.hasParam("RememberRevealed")) { + host.addRemembered(c); } } } diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 8096c89aba5..a9983abc121 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -3027,18 +3027,29 @@ public class CardFactoryUtil { } else if (keyword.startsWith("Miracle")) { final String[] k = keyword.split(":"); final String manacost = k[1]; - final String abStr = "DB$ Play | Defined$ Self | PlayCost$ " + manacost; + final String abStrReveal = "DB$ Reveal | Defined$ You | RevealDefined$ Self | MiracleCost$ " + manacost; + final String abStrPlay = "DB$ Play | Defined$ Self | PlayCost$ " + manacost; - final String trigStr = "Mode$ Drawn | ValidCard$ Card.Self | Miracle$ True | Secondary$ True " - + "| Static$ True | TriggerDescription$ CARDNAME - Miracle"; + final String trigStrDrawn = "Mode$ Drawn | ValidCard$ Card.Self | Miracle$ True | Secondary$ True" + + " | OptionalDecider$ You | Static$ True | TriggerDescription$ CARDNAME - Miracle"; - final Trigger trigger = TriggerHandler.parseTrigger(trigStr, card, intrinsic); + final String trigStrRevealed = "Mode$ Revealed | ValidCard$ Card.Self | Miracle$ True" + + " | IsPresent$ Card.Self | PresentZone$ Hand | Secondary$ True" + + " | TriggerDescription$ CARDNAME - Miracle"; - trigger.setOverridingAbility(AbilityFactory.getAbility(abStr, card)); + final Trigger triggerDrawn = TriggerHandler.parseTrigger(trigStrDrawn, card, intrinsic); - final Trigger cardTrigger = card.addTrigger(trigger); + triggerDrawn.setOverridingAbility(AbilityFactory.getAbility(abStrReveal, card)); + + final Trigger triggerRevealed = TriggerHandler.parseTrigger(trigStrRevealed, card, intrinsic); + + triggerRevealed.setOverridingAbility(AbilityFactory.getAbility(abStrPlay, card)); + + final Trigger cardTriggerDrawn = card.addTrigger(triggerDrawn); + final Trigger cardTriggerRevealed = card.addTrigger(triggerRevealed); if (!intrinsic) { - kws.addTrigger(cardTrigger); + kws.addTrigger(cardTriggerDrawn); + kws.addTrigger(cardTriggerRevealed); } } else if (keyword.startsWith("Modular")) { final String abStr = "AB$ PutCounter | Cost$ 0 | ValidTgts$ Artifact.Creature | " + diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java b/forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java new file mode 100644 index 00000000000..59d8d29d926 --- /dev/null +++ b/forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java @@ -0,0 +1,44 @@ +package forge.game.trigger; + +import java.util.Map; + +import forge.game.card.Card; +import forge.game.spellability.SpellAbility; + +public class TriggerRevealed extends Trigger { + + public TriggerRevealed(Map params, Card host, boolean intrinsic) { + super(params, host, intrinsic); + } + + @Override + public boolean performTest(Map runParams2) { + if (this.mapParams.containsKey("ValidCard")) { + final Card moved = (Card) runParams2.get("Card"); + if (!moved.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), + this.getHostCard(), null)) { + return false; + } + } + if (this.mapParams.containsKey("Miracle")) { + Boolean madness = (Boolean) runParams2.get("Miracle"); + if (this.mapParams.get("Miracle").equals("True") ^ madness) { + return false; + } + } + return true; + } + + @Override + public void setTriggeringObjects(SpellAbility sa) { + sa.setTriggeringObject("Card", this.getRunParams().get("Card")); + } + + @Override + public String getImportantStackObjects(SpellAbility sa) { + StringBuilder sb = new StringBuilder(); + sb.append("Revealed: ").append(sa.getTriggeringObject("Card")); + return sb.toString(); + } + +} diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerType.java b/forge-game/src/main/java/forge/game/trigger/TriggerType.java index c4850cc1177..9d8bf03180d 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerType.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerType.java @@ -62,6 +62,7 @@ public enum TriggerType { PlanarDice(TriggerPlanarDice.class), PlaneswalkedFrom(TriggerPlaneswalkedFrom.class), PlaneswalkedTo(TriggerPlaneswalkedTo.class), + Revealed(TriggerRevealed.class), Sacrificed(TriggerSacrificed.class), Scry(TriggerScry.class), SearchedLibrary(TriggerSearchedLibrary.class),