From 357eeb284b4cee72bcb96df5dd73f3be48a620b7 Mon Sep 17 00:00:00 2001 From: Ada Joule Date: Wed, 16 Jan 2019 03:58:06 +0700 Subject: [PATCH 1/3] Add Spectacle mechanic --- src/magic/model/MagicAbility.java | 8 +++ src/magic/model/condition/MagicCondition.java | 8 +++ .../model/event/MagicSpectacleActivation.java | 49 +++++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 src/magic/model/event/MagicSpectacleActivation.java diff --git a/src/magic/model/MagicAbility.java b/src/magic/model/MagicAbility.java index 163f1d801f..f9252fd6fd 100644 --- a/src/magic/model/MagicAbility.java +++ b/src/magic/model/MagicAbility.java @@ -675,6 +675,14 @@ public enum MagicAbility { card.add(ThisDiesTrigger.Afterlife(n)); } }, + Spectacle("spectacle( |—)" + ARG.COST, 10) { + @Override + protected void addAbilityImpl(final MagicAbilityStore card, final Matcher arg) { + final MagicCardDefinition cardDef = (MagicCardDefinition)card; + final List matchedCostEvents = MagicRegularCostEvent.buildCast(ARG.cost(arg)); + card.add(new MagicSpectacleActivation(cardDef, matchedCostEvents)); + } + }, // abilities that involve SN ShockLand("As SN enters the battlefield, you may " + ARG.COST + "\\. If you don't, SN enters the battlefield tapped\\.", -10) { diff --git a/src/magic/model/condition/MagicCondition.java b/src/magic/model/condition/MagicCondition.java index 867e001aff..e5ee6eeeb0 100644 --- a/src/magic/model/condition/MagicCondition.java +++ b/src/magic/model/condition/MagicCondition.java @@ -950,4 +950,12 @@ public abstract class MagicCondition implements MagicMatchedCostEvent { return player.controlsPermanent(MagicTargetFilterFactory.LEGENDARY_CREATURE_OR_PLANESWALKER); } }; + + public static MagicCondition SPECTACLE = new MagicCondition() { + @Override + public boolean accept(final MagicSource source) { + final MagicPlayer opponent = source.getOpponent(); + return opponent.getLifeLossThisTurn() > 0; + } + }; } diff --git a/src/magic/model/event/MagicSpectacleActivation.java b/src/magic/model/event/MagicSpectacleActivation.java new file mode 100644 index 0000000000..a25e0e2be7 --- /dev/null +++ b/src/magic/model/event/MagicSpectacleActivation.java @@ -0,0 +1,49 @@ +package magic.model.event; + +import java.util.Collections; + +import magic.model.MagicCard; +import magic.model.MagicCardDefinition; +import magic.model.MagicGame; +import magic.model.MagicPayedCost; +import magic.model.condition.MagicCondition; + +public class MagicSpectacleActivation extends MagicHandCastActivation { + + private final List matchedCostEvents; + + public MagicSpectacleActivation(final MagicCardDefinition cdef, final List aMatchedCostEvents) { + super( + new MagicCondition[]{ + MagicCondition.CARD_CONDITION, + MagicCondition.SPECTACLE + }, + cdef.getActivationHints(), + "Spectacle" + ); + matchedCostEvents = aMatchedCostEvents; + } + + @Override + public Iterable getCostEvent(final MagicCard source) { + return MagicMatchedCostEvent.getCostEvent(matchedCostEvents, source); + } + + @Override + public MagicEvent getEvent(final MagicCardOnStack cardOnStack,final MagicPayedCost payedCost) { + return new MagicEvent( + cardOnStack, + this, + "Put SN onto the battlefield, " + + "it gains haste and it's returned from the battlefield to its owner's hand at the beginning of the next end step." + ); + } + + @Override + public void executeEvent(final MagicGame game, final MagicEvent event) { + game.doAction(new PlayCardFromStackAction( + event.getCardOnStack(), + MagicPlayMod.HASTE, MagicPlayMod.RETURN_AT_END_OF_TURN + )); + } +} From 542cbb9c89f103de6a5b8df0c10738e44d7a464b Mon Sep 17 00:00:00 2001 From: Ada Joule Date: Wed, 16 Jan 2019 17:40:44 +0700 Subject: [PATCH 2/3] Change Spectacle cost to mana cost instead of just cost --- src/magic/model/MagicAbility.java | 6 ++-- .../model/event/MagicSpectacleActivation.java | 36 ++++++------------- 2 files changed, 14 insertions(+), 28 deletions(-) diff --git a/src/magic/model/MagicAbility.java b/src/magic/model/MagicAbility.java index f9252fd6fd..563e606657 100644 --- a/src/magic/model/MagicAbility.java +++ b/src/magic/model/MagicAbility.java @@ -675,12 +675,12 @@ public enum MagicAbility { card.add(ThisDiesTrigger.Afterlife(n)); } }, - Spectacle("spectacle( |—)" + ARG.COST, 10) { + Spectacle("spectacle( |—)" + ARG.MANACOST, 10) { @Override protected void addAbilityImpl(final MagicAbilityStore card, final Matcher arg) { final MagicCardDefinition cardDef = (MagicCardDefinition)card; - final List matchedCostEvents = MagicRegularCostEvent.buildCast(ARG.cost(arg)); - card.add(new MagicSpectacleActivation(cardDef, matchedCostEvents)); + final MagicManaCost manaCost = MagicManaCost.create(ARG.manacost(arg)); + card.add(new MagicSpectacleActivation(cardDef, manaCost)); } }, diff --git a/src/magic/model/event/MagicSpectacleActivation.java b/src/magic/model/event/MagicSpectacleActivation.java index a25e0e2be7..1c956361ed 100644 --- a/src/magic/model/event/MagicSpectacleActivation.java +++ b/src/magic/model/event/MagicSpectacleActivation.java @@ -1,18 +1,16 @@ package magic.model.event; -import java.util.Collections; - +import java.util.Arrays; import magic.model.MagicCard; import magic.model.MagicCardDefinition; -import magic.model.MagicGame; -import magic.model.MagicPayedCost; +import magic.model.MagicManaCost; import magic.model.condition.MagicCondition; public class MagicSpectacleActivation extends MagicHandCastActivation { - private final List matchedCostEvents; + final MagicManaCost cost; - public MagicSpectacleActivation(final MagicCardDefinition cdef, final List aMatchedCostEvents) { + public MagicSpectacleActivation(final MagicCardDefinition cdef, final MagicManaCost aCost) { super( new MagicCondition[]{ MagicCondition.CARD_CONDITION, @@ -21,29 +19,17 @@ public class MagicSpectacleActivation extends MagicHandCastActivation { cdef.getActivationHints(), "Spectacle" ); - matchedCostEvents = aMatchedCostEvents; + cost = aCost; } @Override public Iterable getCostEvent(final MagicCard source) { - return MagicMatchedCostEvent.getCostEvent(matchedCostEvents, source); - } - - @Override - public MagicEvent getEvent(final MagicCardOnStack cardOnStack,final MagicPayedCost payedCost) { - return new MagicEvent( - cardOnStack, - this, - "Put SN onto the battlefield, " + - "it gains haste and it's returned from the battlefield to its owner's hand at the beginning of the next end step." + return Arrays.asList( + MagicPayManaCostEvent.Cast( + source, + cost + ), + new MagicEvokeEvent(source) ); } - - @Override - public void executeEvent(final MagicGame game, final MagicEvent event) { - game.doAction(new PlayCardFromStackAction( - event.getCardOnStack(), - MagicPlayMod.HASTE, MagicPlayMod.RETURN_AT_END_OF_TURN - )); - } } From 0b35c1d5578ab4f0060005e6b1037c29b70143d1 Mon Sep 17 00:00:00 2001 From: Ada Joule Date: Wed, 16 Jan 2019 17:43:57 +0700 Subject: [PATCH 3/3] Add EntersSpectacleEffect to MagicAbility --- src/magic/model/MagicAbility.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/magic/model/MagicAbility.java b/src/magic/model/MagicAbility.java index 563e606657..ed49fe280a 100644 --- a/src/magic/model/MagicAbility.java +++ b/src/magic/model/MagicAbility.java @@ -732,6 +732,12 @@ public enum MagicAbility { EntersKickedEffect.addAbilityImpl(card, arg); } }, + EntersSpectacleEffect("When SN enters the battlefield, if its spectacle cost was paid, " + ARG.EFFECT, 10) { + @Override + protected void addAbilityImpl(final MagicAbilityStore card, final Matcher arg) { + EntersKickedEffect.addAbilityImpl(card, arg); + } + }, EntersEffect("When SN enters the battlefield, " + ARG.EFFECT, 10) { @Override protected void addAbilityImpl(final MagicAbilityStore card, final Matcher arg) {