diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index c350134d40b..c7aefc1fa7f 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -173,6 +173,14 @@ public class AbilityUtils { cards.add(game.getCardState((Card) o)); } } + } else if (defined.equals("DelayTriggerRemembered")) { + if (sa.isTrigger()) { + for (Object o : sa.getTriggerRemembered()) { + if (o instanceof Card) { + cards.add(game.getCardState((Card) o)); + } + } + } } else if (defined.equals("FirstRemembered")) { Object o = Iterables.getFirst(hostCard.getRemembered(), null); if (o != null && o instanceof Card) { @@ -822,6 +830,15 @@ public class AbilityUtils { } } } + else if (defined.equals("DelayTriggerRemembered")) { + if (sa.isTrigger()) { + for (Object o : sa.getTriggerRemembered()) { + if (o instanceof Player) { + players.add((Player) o); + } + } + } + } else if (defined.equals("RememberedOpponent")) { for (final Object rem : card.getRemembered()) { if (rem instanceof Player) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/DelayedTriggerEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DelayedTriggerEffect.java index b5beb2e7527..e89fa229152 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DelayedTriggerEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DelayedTriggerEffect.java @@ -45,14 +45,14 @@ public class DelayedTriggerEffect extends SpellAbilityEffect { triggerRemembered = sa.getParam("RememberObjects"); } + final Trigger delTrig = TriggerHandler.parseTrigger(mapParams, sa.getHostCard(), true); + if (triggerRemembered != null) { for (final Object o : AbilityUtils.getDefinedObjects(sa.getHostCard(), triggerRemembered, sa)) { - sa.getHostCard().addRemembered(o); + delTrig.addRemembered(o); } } - final Trigger delTrig = TriggerHandler.parseTrigger(mapParams, sa.getHostCard(), true); - sa.getActivatingPlayer().getGame().getTriggerHandler().registerDelayedTrigger(delTrig); } } diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index a3264ed91c8..b6115e55519 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -627,6 +627,7 @@ public class CardFactory { trig.setTrigger(true); trig.setSourceTrigger(t.getId()); t.setTriggeringObjects(trig); + trig.setTriggerRemembered(t.getTriggerRemembered()); if (t.getStoredTriggeredObjects() != null) { trig.setAllTriggeringObjects(t.getStoredTriggeredObjects()); } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index 253e8afd192..2074a4d7cdc 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -81,6 +81,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit private boolean trigger = false; private boolean optionalTrigger = false; private int sourceTrigger = -1; + private List triggerRemembered = new ArrayList(); private boolean flashBackAbility = false; private boolean cycling = false; @@ -692,6 +693,19 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit this.triggeringObjects = new HashMap(); } + + public List getTriggerRemembered() { + return this.triggerRemembered; + } + + public void setTriggerRemembered(List list) { + this.triggerRemembered = list; + } + + public void resetTriggerRemembered() { + this.triggerRemembered = new ArrayList(); + } + /** * Gets the replacing objects. * @@ -735,6 +749,8 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit this.resetPaidHash(); this.resetTargets(); this.resetTriggeringObjects(); + this.resetTriggerRemembered(); + // Clear SVars for (final String store : Card.getStorableSVars()) { diff --git a/forge-game/src/main/java/forge/game/trigger/Trigger.java b/forge-game/src/main/java/forge/game/trigger/Trigger.java index 0405b55e951..42684366034 100644 --- a/forge-game/src/main/java/forge/game/trigger/Trigger.java +++ b/forge-game/src/main/java/forge/game/trigger/Trigger.java @@ -76,6 +76,8 @@ public abstract class Trigger extends TriggerReplacementBase { private TriggerType mode; private HashMap storedTriggeredObjects = null; + + private List triggerRemembered = new ArrayList(); /** *

@@ -393,6 +395,14 @@ public abstract class Trigger extends TriggerReplacementBase { this.triggeredSA = sa; } + public void addRemembered(Object o) { + this.triggerRemembered.add(o); + } + + public List getTriggerRemembered() { + return this.triggerRemembered; + } + /** * TODO: Write javadoc for this method. * @return the mode @@ -435,4 +445,5 @@ public abstract class Trigger extends TriggerReplacementBase { public void setTriggerPhases(List phases) { validPhases = phases; } + } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java index fb5b3ff42dc..15963c72792 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java @@ -376,6 +376,7 @@ public class TriggerHandler { sa.setTrigger(true); sa.setSourceTrigger(regtrig.getId()); regtrig.setTriggeringObjects(sa); + sa.setTriggerRemembered(regtrig.getTriggerRemembered()); if (regtrig.getStoredTriggeredObjects() != null) { sa.setAllTriggeringObjects(regtrig.getStoredTriggeredObjects()); } diff --git a/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java b/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java index 650d3ffc8cf..5e923a32518 100644 --- a/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java +++ b/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java @@ -8,6 +8,7 @@ import forge.game.card.Card; import forge.game.cost.Cost; import forge.game.player.Player; import forge.game.spellability.*; + import java.util.HashMap; import java.util.List; import java.util.Map; @@ -129,6 +130,21 @@ public class WrappedAbility extends Ability implements ISpellAbility { sa.resetTriggeringObjects(); } + @Override + public List getTriggerRemembered() { + return sa.getTriggerRemembered(); + } + + @Override + public void resetTriggerRemembered() { + sa.resetTriggerRemembered(); + } + + @Override + public void setTriggerRemembered(List list) { + sa.setTriggerRemembered(list); + } + @Override public boolean canPlay() { return sa.canPlay(); diff --git a/forge-gui/res/cardsfolder/n/necropotence.txt b/forge-gui/res/cardsfolder/n/necropotence.txt index 5362f81af1e..81b37ef2f0c 100644 --- a/forge-gui/res/cardsfolder/n/necropotence.txt +++ b/forge-gui/res/cardsfolder/n/necropotence.txt @@ -5,8 +5,8 @@ S:Mode$ Continuous | Affected$ You | AddKeyword$ Skip your draw step. | Descript T:Mode$ Discarded | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigChange | TriggerDescription$ Whenever you discard a card, exile that card from your graveyard. SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Exile A:AB$ ChangeZone | Cost$ PayLife<1> | Defined$ TopOfLibrary | Origin$ Library | Destination$ Exile | ExileFaceDown$ True | RememberChanged$ True | SubAbility$ DelayedReturn | SpellDescription$ Exile the top card of your library face down. Put that card into your hand at the beginning of your next end step. -SVar:DelayedReturn:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | Execute$ TrigReturn | TriggerDescription$ Put the exiled card into your hand. -SVar:TrigReturn:DB$ ChangeZone | Origin$ Exile | Destination$ Hand | Defined$ Remembered | SubAbility$ DBCleanup +SVar:DelayedReturn:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | Execute$ TrigReturn | RememberObjects$ Remembered | TriggerDescription$ Put the exiled card into your hand. | SubAbility$ DBCleanup +SVar:TrigReturn:DB$ ChangeZone | Origin$ Exile | Destination$ Hand | Defined$ DelayTriggerRemembered SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:RemAIDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/necropotence.jpg diff --git a/forge-gui/res/cardsfolder/s/sapphire_charm.txt b/forge-gui/res/cardsfolder/s/sapphire_charm.txt index a580e144cdc..f7fc9ad18b0 100644 --- a/forge-gui/res/cardsfolder/s/sapphire_charm.txt +++ b/forge-gui/res/cardsfolder/s/sapphire_charm.txt @@ -3,7 +3,7 @@ ManaCost:U Types:Instant A:SP$ Charm | Cost$ U | Choices$ DelTrigSlowtrip,Pump,Phases | CharmNum$ 1 | SpellDescription$ Choose one - Target player draws a card at the beginning of the next turn's upkeep; or target creature gains flying until end of turn; or target creature an opponent controls phases out. SVar:DelTrigSlowtrip:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidTgts$ Player | RememberObjects$ Targeted | TgtPrompt$ Select target player | Execute$ DrawSlowtrip | SpellDescription$ Target player draws a card at the beginning of the next turn's upkeep -SVar:DrawSlowtrip:DB$Draw | NumCards$ 1 | Defined$ Remembered | SpellDescription$ Draw a card. +SVar:DrawSlowtrip:DB$Draw | NumCards$ 1 | Defined$ DelayTriggerRemembered | SpellDescription$ Draw a card. SVar:Pump:DB$ Pump | ValidTgts$ Creature | KW$ Flying | TgtPrompt$ Select target creature | SpellDescription$ Target creature gains flying until end of turn. SVar:Phases:DB$ Phases | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | SpellDescription$ Target creature an opponent controls phases out. SVar:RemAIDeck:True