diff --git a/Mage.Sets/src/mage/cards/a/AeonChronicler.java b/Mage.Sets/src/mage/cards/a/AeonChronicler.java index a03a113ea86..b18938e90a4 100644 --- a/Mage.Sets/src/mage/cards/a/AeonChronicler.java +++ b/Mage.Sets/src/mage/cards/a/AeonChronicler.java @@ -1,10 +1,8 @@ package mage.cards.a; -import java.util.Objects; -import java.util.UUID; import mage.MageInt; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.CounterRemovedFromSourceWhileExiledTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.dynamicvalue.common.CardsInControllerHandCount; @@ -17,17 +15,16 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; import mage.counters.CounterType; -import mage.game.Game; -import mage.game.events.GameEvent; + +import java.util.UUID; /** - * * @author LevelX2 */ public final class AeonChronicler extends CardImpl { public AeonChronicler(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{U}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}{U}"); this.subtype.add(SubType.AVATAR); this.power = new MageInt(0); @@ -35,12 +32,12 @@ public final class AeonChronicler extends CardImpl { // Aeon Chronicler's power and toughness are each equal to the number of cards in your hand. this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetBasePowerToughnessSourceEffect(CardsInControllerHandCount.instance))); - + // Suspend X-{X}{3}{U}. X can't be 0. this.addAbility(new SuspendAbility(Integer.MAX_VALUE, new ManaCostsImpl<>("{3}{U}"), this, true)); - + // Whenever a time counter is removed from Aeon Chronicler while it's exiled, draw a card. - this.addAbility(new AeonChroniclerTriggeredAbility()); + this.addAbility(new CounterRemovedFromSourceWhileExiledTriggeredAbility(CounterType.TIME, new DrawCardSourceControllerEffect(1))); } private AeonChronicler(final AeonChronicler card) { @@ -51,31 +48,4 @@ public final class AeonChronicler extends CardImpl { public AeonChronicler copy() { return new AeonChronicler(this); } -} - -class AeonChroniclerTriggeredAbility extends TriggeredAbilityImpl { - - public AeonChroniclerTriggeredAbility() { - super(Zone.EXILED, new DrawCardSourceControllerEffect(1), false); - setTriggerPhrase("Whenever a time counter is removed from {this} while it's exiled, " ); - } - - private AeonChroniclerTriggeredAbility(final AeonChroniclerTriggeredAbility ability) { - super(ability); - } - - @Override - public AeonChroniclerTriggeredAbility copy() { - return new AeonChroniclerTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.COUNTER_REMOVED; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - return Objects.equals(event.getData(), CounterType.TIME.getName()) && event.getTargetId().equals(this.getSourceId()); - } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/b/BenalishCommander.java b/Mage.Sets/src/mage/cards/b/BenalishCommander.java index c42c3a786e8..ed0a365b6f9 100644 --- a/Mage.Sets/src/mage/cards/b/BenalishCommander.java +++ b/Mage.Sets/src/mage/cards/b/BenalishCommander.java @@ -1,9 +1,8 @@ package mage.cards.b; -import java.util.UUID; import mage.MageInt; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.CounterRemovedFromSourceWhileExiledTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; @@ -17,12 +16,11 @@ import mage.constants.SubType; import mage.constants.Zone; import mage.counters.CounterType; import mage.filter.common.FilterControlledPermanent; -import mage.game.Game; -import mage.game.events.GameEvent; import mage.game.permanent.token.SoldierToken; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class BenalishCommander extends CardImpl { @@ -47,7 +45,7 @@ public final class BenalishCommander extends CardImpl { this.addAbility(new SuspendAbility(Integer.MAX_VALUE, new ManaCostsImpl<>("{W}{W}"), this, true)); // Whenever a time counter is removed from Benalish Commander while it's exiled, create a 1/1 white Soldier creature token. - this.addAbility(new BenalishCommanderTriggeredAbility()); + this.addAbility(new CounterRemovedFromSourceWhileExiledTriggeredAbility(CounterType.TIME, new CreateTokenEffect(new SoldierToken()))); } private BenalishCommander(final BenalishCommander card) { @@ -58,31 +56,4 @@ public final class BenalishCommander extends CardImpl { public BenalishCommander copy() { return new BenalishCommander(this); } -} - -class BenalishCommanderTriggeredAbility extends TriggeredAbilityImpl { - - public BenalishCommanderTriggeredAbility() { - super(Zone.EXILED, new CreateTokenEffect(new SoldierToken()), false); - setTriggerPhrase("Whenever a time counter is removed from {this} while it's exiled, "); - } - - private BenalishCommanderTriggeredAbility(final BenalishCommanderTriggeredAbility ability) { - super(ability); - } - - @Override - public BenalishCommanderTriggeredAbility copy() { - return new BenalishCommanderTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.COUNTER_REMOVED; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - return event.getData().equals(CounterType.TIME.getName()) && event.getTargetId().equals(this.getSourceId()); - } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/d/Detritivore.java b/Mage.Sets/src/mage/cards/d/Detritivore.java index af6741769c0..c00382e61c5 100644 --- a/Mage.Sets/src/mage/cards/d/Detritivore.java +++ b/Mage.Sets/src/mage/cards/d/Detritivore.java @@ -1,10 +1,9 @@ package mage.cards.d; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.CounterRemovedFromSourceWhileExiledTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.dynamicvalue.DynamicValue; @@ -22,12 +21,12 @@ import mage.counters.CounterType; import mage.filter.FilterCard; import mage.filter.predicate.Predicates; import mage.game.Game; -import mage.game.events.GameEvent; import mage.players.Player; import mage.target.common.TargetNonBasicLandPermanent; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class Detritivore extends CardImpl { @@ -46,8 +45,9 @@ public final class Detritivore extends CardImpl { this.addAbility(new SuspendAbility(Integer.MAX_VALUE, new ManaCostsImpl<>("{3}{R}"), this, true)); // Whenever a time counter is removed from Detritivore while it's exiled, destroy target nonbasic land. - this.addAbility(new DetritivoreTriggeredAbility()); - + Ability ability = new CounterRemovedFromSourceWhileExiledTriggeredAbility(CounterType.TIME, new DestroyTargetEffect()); + ability.addTarget(new TargetNonBasicLandPermanent()); + this.addAbility(ability); } private Detritivore(final Detritivore card) { @@ -60,34 +60,6 @@ public final class Detritivore extends CardImpl { } } -class DetritivoreTriggeredAbility extends TriggeredAbilityImpl { - - public DetritivoreTriggeredAbility() { - super(Zone.EXILED, new DestroyTargetEffect(), false); - this.addTarget(new TargetNonBasicLandPermanent()); - setTriggerPhrase("Whenever a time counter is removed from {this} while it's exiled, "); - } - - private DetritivoreTriggeredAbility(final DetritivoreTriggeredAbility ability) { - super(ability); - } - - @Override - public DetritivoreTriggeredAbility copy() { - return new DetritivoreTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.COUNTER_REMOVED; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - return event.getData().equals(CounterType.TIME.getName()) && event.getTargetId().equals(this.getSourceId()); - } -} - class NonBasicLandsInOpponentsGraveyards implements DynamicValue { private static final FilterCard filter = new FilterCard("nonbasic land card"); diff --git a/Mage.Sets/src/mage/cards/f/FungalBehemoth.java b/Mage.Sets/src/mage/cards/f/FungalBehemoth.java index 6f35a2ea409..72090d4ed70 100644 --- a/Mage.Sets/src/mage/cards/f/FungalBehemoth.java +++ b/Mage.Sets/src/mage/cards/f/FungalBehemoth.java @@ -1,10 +1,9 @@ package mage.cards.f; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.CounterRemovedFromSourceWhileExiledTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.dynamicvalue.DynamicValue; @@ -20,12 +19,12 @@ import mage.constants.Zone; import mage.counters.CounterType; import mage.filter.StaticFilters; import mage.game.Game; -import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class FungalBehemoth extends CardImpl { @@ -44,7 +43,13 @@ public final class FungalBehemoth extends CardImpl { this.addAbility(new SuspendAbility(Integer.MAX_VALUE, new ManaCostsImpl<>("{G}{G}"), this, true)); // Whenever a time counter is removed from Fungal Behemoth while it's exiled, you may put a +1/+1 counter on target creature. - this.addAbility(new FungalBehemothTriggeredAbility()); + Ability ability = new CounterRemovedFromSourceWhileExiledTriggeredAbility( + CounterType.TIME, + new AddCountersTargetEffect(CounterType.P1P1.createInstance()), + true + ); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); } private FungalBehemoth(final FungalBehemoth card) { @@ -57,34 +62,6 @@ public final class FungalBehemoth extends CardImpl { } } -class FungalBehemothTriggeredAbility extends TriggeredAbilityImpl { - - public FungalBehemothTriggeredAbility() { - super(Zone.EXILED, new AddCountersTargetEffect(CounterType.P1P1.createInstance()), true); - addTarget(new TargetCreaturePermanent()); - setTriggerPhrase("Whenever a time counter is removed from {this} while it's exiled, "); - } - - private FungalBehemothTriggeredAbility(final FungalBehemothTriggeredAbility ability) { - super(ability); - } - - @Override - public FungalBehemothTriggeredAbility copy() { - return new FungalBehemothTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.COUNTER_REMOVED; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - return event.getData().equals(CounterType.TIME.getName()) && event.getTargetId().equals(this.getSourceId()); - } -} - class P1P1CountersOnControlledCreaturesCount implements DynamicValue { @Override diff --git a/Mage.Sets/src/mage/cards/r/RoilingHorror.java b/Mage.Sets/src/mage/cards/r/RoilingHorror.java index 82186476da3..8ca6d3632c2 100644 --- a/Mage.Sets/src/mage/cards/r/RoilingHorror.java +++ b/Mage.Sets/src/mage/cards/r/RoilingHorror.java @@ -1,10 +1,9 @@ package mage.cards.r; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.CounterRemovedFromSourceWhileExiledTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.dynamicvalue.DynamicValue; @@ -20,12 +19,12 @@ import mage.constants.SubType; import mage.constants.Zone; import mage.counters.CounterType; import mage.game.Game; -import mage.game.events.GameEvent; import mage.players.Player; import mage.target.TargetPlayer; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class RoilingHorror extends CardImpl { @@ -46,7 +45,10 @@ public final class RoilingHorror extends CardImpl { this.addAbility(new SuspendAbility(Integer.MAX_VALUE, new ManaCostsImpl<>("{B}{B}{B}"), this, true)); // Whenever a time counter is removed from Roiling Horror while it's exiled, target player loses 1 life and you gain 1 life. - this.addAbility(new RoilingHorrorTriggeredAbility()); + Ability ability = new CounterRemovedFromSourceWhileExiledTriggeredAbility(CounterType.TIME, new LoseLifeTargetEffect(1)); + ability.addTarget(new TargetPlayer()); + ability.addEffect(new GainLifeEffect(1).concatBy("and")); + this.addAbility(ability); } @@ -60,37 +62,6 @@ public final class RoilingHorror extends CardImpl { } } -class RoilingHorrorTriggeredAbility extends TriggeredAbilityImpl { - - public RoilingHorrorTriggeredAbility() { - super(Zone.EXILED, new LoseLifeTargetEffect(1), false); - this.addTarget(new TargetPlayer()); - Effect effect = new GainLifeEffect(1); - effect.setText("and you gain 1 life"); - this.addEffect(effect); - setTriggerPhrase("Whenever a time counter is removed from {this} while it's exiled, "); - } - - private RoilingHorrorTriggeredAbility(final RoilingHorrorTriggeredAbility ability) { - super(ability); - } - - @Override - public RoilingHorrorTriggeredAbility copy() { - return new RoilingHorrorTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.COUNTER_REMOVED; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - return event.getData().equals(CounterType.TIME.getName()) && event.getTargetId().equals(this.getSourceId()); - } -} - class RoilingHorrorDynamicValue implements DynamicValue { @Override diff --git a/Mage/src/main/java/mage/abilities/common/CounterRemovedFromSourceWhileExiledTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/CounterRemovedFromSourceWhileExiledTriggeredAbility.java new file mode 100644 index 00000000000..682af94b300 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/common/CounterRemovedFromSourceWhileExiledTriggeredAbility.java @@ -0,0 +1,47 @@ + +package mage.abilities.common; + +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.Effect; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.game.Game; +import mage.game.events.GameEvent; + +/** + * @author Susucr + */ +public class CounterRemovedFromSourceWhileExiledTriggeredAbility extends TriggeredAbilityImpl { + + private final CounterType counterType; + + public CounterRemovedFromSourceWhileExiledTriggeredAbility(CounterType counterType, Effect effect) { + this(counterType, effect, false); + } + + public CounterRemovedFromSourceWhileExiledTriggeredAbility(CounterType counterType, Effect effect, boolean optional) { + super(Zone.EXILED, effect, optional); + this.counterType = counterType; + setTriggerPhrase("Whenever a " + counterType.getName() + " counter is removed from {this} while it's exiled, "); + } + + private CounterRemovedFromSourceWhileExiledTriggeredAbility(final CounterRemovedFromSourceWhileExiledTriggeredAbility ability) { + super(ability); + this.counterType = ability.counterType; + } + + @Override + public CounterRemovedFromSourceWhileExiledTriggeredAbility copy() { + return new CounterRemovedFromSourceWhileExiledTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.COUNTER_REMOVED; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + return event.getData().equals(counterType.getName()) && event.getTargetId().equals(this.getSourceId()); + } +}