From 01a3660cf2afdc7e174e681808ebfebb477542f6 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 17 Feb 2013 01:14:42 +0100 Subject: [PATCH] Changed a lot of cards to use ENTERS_THE_BATTLEFIELD event instead of ZONE_CHANGE event. --- .../mage/sets/alarareborn/GlassdustHulk.java | 63 ++++++------------- .../avacynrestored/CaptainOfTheMists.java | 62 +++++------------- .../sets/avacynrestored/KruinStriker.java | 60 +++++------------- .../sets/avacynrestored/SeraphSanctuary.java | 44 +++---------- .../sets/avacynrestored/SoulOfTheHarvest.java | 60 +++++------------- .../betrayersofkamigawa/RoninWarclub.java | 29 +++++---- .../championsofkamigawa/ZoZuThePunisher.java | 25 ++++---- .../darkascension/FlayerOfTheHatebound.java | 6 +- .../darkascension/HuntmasterOfTheFells.java | 17 +++-- .../sets/darkascension/MidnightGuard.java | 56 +++-------------- .../mage/sets/gatecrash/GruulRagebeast.java | 6 +- .../sets/innistrad/ChampionOfTheParish.java | 57 ++++------------- .../mage/sets/innistrad/MentorOfTheMeek.java | 58 +++++------------ .../src/mage/sets/magic2010/SoulWarden.java | 54 ++++------------ .../src/mage/sets/magic2011/FrostTitan.java | 7 +-- .../sets/magic2011/GarruksPackleader.java | 57 +++++------------ .../src/mage/sets/magic2011/GraveTitan.java | 7 +-- .../src/mage/sets/magic2011/InfernoTitan.java | 7 +-- .../mage/sets/magic2011/PrimevalTitan.java | 7 +-- .../src/mage/sets/magic2011/SunTitan.java | 7 +-- .../src/mage/sets/magic2012/AegisAngel.java | 9 +-- .../mage/sets/magic2012/WarstormSurge.java | 5 +- .../sets/magic2013/HamletbackGoliath.java | 6 +- .../mage/sets/magic2013/VeilbornGhoul.java | 47 ++++---------- .../sets/mirrodinbesieged/Mirrorworks.java | 15 ++--- .../sets/newphyrexia/InvaderParasite.java | 23 +++---- .../sets/newphyrexia/PuresteelPaladin.java | 54 +++------------- .../mage/sets/newphyrexia/ShatteredAngel.java | 55 +++++----------- .../mage/sets/newphyrexia/SuturePriest.java | 56 +++++++---------- .../src/mage/sets/newphyrexia/TorporOrb.java | 13 ++-- .../TrostaniSelesnyasVoice.java | 5 +- .../RenegadeDoppelganger.java | 15 ++--- .../sets/scarsofmirrodin/GlintHawkIdol.java | 62 ++++++------------ .../sets/scarsofmirrodin/TunnelIgnus.java | 4 +- .../src/mage/sets/shadowmoor/ReaperKing.java | 55 +++------------- .../mage/sets/stronghold/IntruderAlarm.java | 44 +------------ .../src/mage/sets/stronghold/MoxDiamond.java | 6 +- .../mage/sets/urzassaga/AngelicChorus.java | 5 +- .../mage/sets/weatherlight/CallOfTheWild.java | 2 +- .../mage/sets/worldwake/AmuletOfVigor.java | 21 +++---- .../sets/worldwake/ArchonOfRedemption.java | 6 +- .../mage/sets/worldwake/PermafrostTrap.java | 2 +- .../sets/worldwake/QuestForTheGoblinLord.java | 46 +++----------- .../src/mage/sets/worldwake/TalusPaladin.java | 7 +-- .../mage/sets/worldwake/TuktukScrapper.java | 21 +++---- .../mage/sets/zendikar/BalothCageTrap.java | 2 +- .../mage/sets/zendikar/Electropotence.java | 5 +- .../src/mage/sets/zendikar/Gigantiform.java | 3 +- .../src/mage/sets/zendikar/LavaballTrap.java | 2 +- .../zendikar/ValakutTheMoltenPinnacle.java | 2 +- .../src/mage/sets/zendikar/WhiplashTrap.java | 2 +- .../continuous/GoblinBushwhackerTest.java | 2 + .../src/mage/game/events/ZoneChangeEvent.java | 2 +- 53 files changed, 358 insertions(+), 935 deletions(-) diff --git a/Mage.Sets/src/mage/sets/alarareborn/GlassdustHulk.java b/Mage.Sets/src/mage/sets/alarareborn/GlassdustHulk.java index a06b3d4c208..58e6d99e6a0 100644 --- a/Mage.Sets/src/mage/sets/alarareborn/GlassdustHulk.java +++ b/Mage.Sets/src/mage/sets/alarareborn/GlassdustHulk.java @@ -31,18 +31,19 @@ import java.util.UUID; import mage.Constants.CardType; import mage.Constants.Duration; import mage.Constants.Rarity; -import mage.Constants.Zone; +import mage.Constants.TargetController; import mage.MageInt; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.UnblockableSourceEffect; import mage.abilities.effects.common.continious.BoostSourceEffect; import mage.abilities.keyword.CyclingAbility; import mage.cards.CardImpl; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.ZoneChangeEvent; -import mage.game.permanent.Permanent; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterArtifactPermanent; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.filter.predicate.permanent.ControllerPredicate; /** * @@ -50,6 +51,13 @@ import mage.game.permanent.Permanent; */ public class GlassdustHulk extends CardImpl { + private static final FilterPermanent filter = new FilterArtifactPermanent("another artifact"); + + static { + filter.add(new ControllerPredicate(TargetController.YOU)); + filter.add(new AnotherPredicate()); + } + public GlassdustHulk(UUID ownerId) { super(ownerId, 7, "Glassdust Hulk", Rarity.COMMON, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}{W}{U}"); this.expansionSetCode = "ARB"; @@ -61,7 +69,11 @@ public class GlassdustHulk extends CardImpl { this.toughness = new MageInt(4); // Whenever another artifact enters the battlefield under your control, Glassdust Hulk gets +1/+1 until end of turn and is unblockable this turn. - this.addAbility(new GlassdustHulkTriggeredAbility()); + Ability ability = new EntersBattlefieldControlledTriggeredAbility(new BoostSourceEffect(1, 1, Duration.EndOfTurn), filter, + "Whenever another artifact enters the battlefield under your control, Glassdust Hulk gets +1/+1 until end of turn and is unblockable this turn."); + ability.addEffect(new UnblockableSourceEffect(Duration.EndOfTurn)); + this.addAbility(ability); + this.addAbility(new CyclingAbility(new ManaCostsImpl("{W/U}"))); } @@ -74,40 +86,3 @@ public class GlassdustHulk extends CardImpl { return new GlassdustHulk(this); } } - -class GlassdustHulkTriggeredAbility extends TriggeredAbilityImpl { - GlassdustHulkTriggeredAbility() { - super(Zone.BATTLEFIELD, new BoostSourceEffect(1, 1, Duration.EndOfTurn)); - this.addEffect(new UnblockableSourceEffect(Duration.EndOfTurn)); - } - - GlassdustHulkTriggeredAbility(final GlassdustHulkTriggeredAbility ability) { - super(ability); - } - - @Override - public GlassdustHulkTriggeredAbility copy() { - return new GlassdustHulkTriggeredAbility(this); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.ZONE_CHANGE && !event.getTargetId().equals(this.getSourceId())) { - ZoneChangeEvent zEvent = (ZoneChangeEvent)event; - if (zEvent.getToZone() == Zone.BATTLEFIELD) { - Permanent permanent = game.getPermanent(event.getTargetId()); - if (permanent != null && permanent.getCardType().contains(CardType.ARTIFACT) - && permanent.getControllerId().equals(this.controllerId)) { - return true; - } - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever another artifact enters the battlefield under your control, {this} gets +1/+1 until end of turn and is unblockable this turn."; - } -} - diff --git a/Mage.Sets/src/mage/sets/avacynrestored/CaptainOfTheMists.java b/Mage.Sets/src/mage/sets/avacynrestored/CaptainOfTheMists.java index a6a47dacde6..3a015cb662d 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/CaptainOfTheMists.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/CaptainOfTheMists.java @@ -27,26 +27,25 @@ */ package mage.sets.avacynrestored; -import mage.Constants; +import java.util.UUID; import mage.Constants.CardType; import mage.Constants.Rarity; +import mage.Constants.Zone; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.MayTapOrUntapTargetEffect; import mage.abilities.effects.common.UntapSourceEffect; import mage.cards.CardImpl; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.ZoneChangeEvent; -import mage.game.permanent.Permanent; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.filter.predicate.permanent.AnotherPredicate; import mage.target.TargetPermanent; -import java.util.UUID; /** * @@ -54,6 +53,13 @@ import java.util.UUID; */ public class CaptainOfTheMists extends CardImpl { + private static final FilterPermanent filter = new FilterControlledCreaturePermanent("another Human"); + + static { + filter.add(new AnotherPredicate()); + filter.add(new SubtypePredicate("Human")); + } + public CaptainOfTheMists(UUID ownerId) { super(ownerId, 45, "Captain of the Mists", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{U}"); this.expansionSetCode = "AVR"; @@ -65,10 +71,10 @@ public class CaptainOfTheMists extends CardImpl { this.toughness = new MageInt(3); // Whenever another Human enters the battlefield under your control, untap Captain of the Mists. - this.addAbility(new HumanEntersBattlefieldTriggeredAbility(new UntapSourceEffect(), false)); + this.addAbility(new EntersBattlefieldControlledTriggeredAbility(new UntapSourceEffect(), filter)); // {1}{U}, {tap}: You may tap or untap target permanent. - Ability ability = new SimpleActivatedAbility(Constants.Zone.BATTLEFIELD, new MayTapOrUntapTargetEffect(), new ManaCostsImpl("{1}{U}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new MayTapOrUntapTargetEffect(), new ManaCostsImpl("{1}{U}")); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetPermanent()); this.addAbility(ability); @@ -83,39 +89,3 @@ public class CaptainOfTheMists extends CardImpl { return new CaptainOfTheMists(this); } } - -class HumanEntersBattlefieldTriggeredAbility extends TriggeredAbilityImpl { - - public HumanEntersBattlefieldTriggeredAbility(Effect effect, boolean optional) { - super(Constants.Zone.BATTLEFIELD, effect, optional); - } - - public HumanEntersBattlefieldTriggeredAbility(HumanEntersBattlefieldTriggeredAbility ability) { - super(ability); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.ZONE_CHANGE) { - UUID targetId = event.getTargetId(); - Permanent permanent = game.getPermanent(targetId); - ZoneChangeEvent zEvent = (ZoneChangeEvent) event; - if (zEvent.getToZone() == Constants.Zone.BATTLEFIELD - && permanent.getControllerId().equals(this.controllerId) - && (permanent.hasSubtype("Human") && !targetId.equals(this.getSourceId()))) { - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever another Human enters the battlefield under your control, " + super.getRule(); - } - - @Override - public HumanEntersBattlefieldTriggeredAbility copy() { - return new HumanEntersBattlefieldTriggeredAbility(this); - } -} diff --git a/Mage.Sets/src/mage/sets/avacynrestored/KruinStriker.java b/Mage.Sets/src/mage/sets/avacynrestored/KruinStriker.java index b0d1799fe79..cc3e108a3bb 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/KruinStriker.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/KruinStriker.java @@ -28,20 +28,19 @@ package mage.sets.avacynrestored; import java.util.UUID; - -import mage.Constants; import mage.Constants.CardType; +import mage.Constants.Duration; import mage.Constants.Rarity; import mage.MageInt; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; import mage.abilities.effects.common.continious.BoostSourceEffect; import mage.abilities.effects.common.continious.GainAbilitySourceEffect; import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.ZoneChangeEvent; -import mage.game.permanent.Permanent; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.permanent.AnotherPredicate; /** * @@ -49,6 +48,11 @@ import mage.game.permanent.Permanent; */ public class KruinStriker extends CardImpl { + private static final FilterPermanent filter = new FilterControlledCreaturePermanent("another creature"); + static { + filter.add(new AnotherPredicate()); + } + public KruinStriker(UUID ownerId) { super(ownerId, 143, "Kruin Striker", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{R}"); this.expansionSetCode = "AVR"; @@ -60,7 +64,10 @@ public class KruinStriker extends CardImpl { this.toughness = new MageInt(1); // Whenever another creature enters the battlefield under your control, Kruin Striker gets +1/+0 and gains trample until end of turn. - this.addAbility(new KruinStrikerAbility()); + Ability ability = new EntersBattlefieldAllTriggeredAbility(new BoostSourceEffect(1, 0, Duration.EndOfTurn), filter, + "Whenever another creature enters the battlefield under your control, Kruin Striker gets +1/+0 and gains trample until end of turn."); + ability.addEffect(new GainAbilitySourceEffect(TrampleAbility.getInstance(), Duration.EndOfTurn)); + this.addAbility(ability); } public KruinStriker(final KruinStriker card) { @@ -72,40 +79,3 @@ public class KruinStriker extends CardImpl { return new KruinStriker(this); } } - -class KruinStrikerAbility extends TriggeredAbilityImpl { - - public KruinStrikerAbility() { - super(Constants.Zone.BATTLEFIELD, new BoostSourceEffect(1, 0, Constants.Duration.EndOfTurn)); - this.addEffect(new GainAbilitySourceEffect(TrampleAbility.getInstance(), Constants.Duration.EndOfTurn)); - } - - public KruinStrikerAbility(final KruinStrikerAbility ability) { - super(ability); - } - - @Override - public KruinStrikerAbility copy() { - return new KruinStrikerAbility(this); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.ZONE_CHANGE && !event.getTargetId().equals(this.getSourceId())) { - ZoneChangeEvent zEvent = (ZoneChangeEvent)event; - if (zEvent.getToZone() == Constants.Zone.BATTLEFIELD) { - Permanent permanent = game.getPermanent(event.getTargetId()); - if (permanent != null && permanent.getCardType().contains(CardType.CREATURE) && permanent.getControllerId().equals(this.getControllerId())) { - return true; - } - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever another creature enters the battlefield under your control, {this} gets +1/+0 and gains trample until end of turn."; - } - -} diff --git a/Mage.Sets/src/mage/sets/avacynrestored/SeraphSanctuary.java b/Mage.Sets/src/mage/sets/avacynrestored/SeraphSanctuary.java index a73e92455c8..78bce62a19d 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/SeraphSanctuary.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/SeraphSanctuary.java @@ -32,10 +32,14 @@ import mage.Constants.CardType; import mage.Constants.Rarity; import mage.Constants.Zone; import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.mana.ColorlessManaAbility; import mage.cards.CardImpl; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; @@ -48,6 +52,10 @@ import mage.game.permanent.Permanent; */ public class SeraphSanctuary extends CardImpl { + private static final FilterPermanent filter = new FilterControlledCreaturePermanent("an Angel"); + static { + filter.add(new SubtypePredicate("Angel")); + } public SeraphSanctuary(UUID ownerId) { super(ownerId, 228, "Seraph Sanctuary", Rarity.COMMON, new CardType[]{CardType.LAND}, ""); this.expansionSetCode = "AVR"; @@ -55,7 +63,7 @@ public class SeraphSanctuary extends CardImpl { // When Seraph Sanctuary enters the battlefield, you gain 1 life. this.addAbility(new EntersBattlefieldTriggeredAbility(new GainLifeEffect(1))); // Whenever an Angel enters the battlefield under your control, you gain 1 life. - this.addAbility(new SeraphSanctuaryTriggeredAbility()); + this.addAbility(new EntersBattlefieldControlledTriggeredAbility(new GainLifeEffect(1), filter)); // {tap}: Add {1} to your mana pool. this.addAbility(new ColorlessManaAbility()); } @@ -69,37 +77,3 @@ public class SeraphSanctuary extends CardImpl { return new SeraphSanctuary(this); } } - -class SeraphSanctuaryTriggeredAbility extends TriggeredAbilityImpl { - - public SeraphSanctuaryTriggeredAbility() { - super(Zone.BATTLEFIELD, new GainLifeEffect(1)); - } - - public SeraphSanctuaryTriggeredAbility(SeraphSanctuaryTriggeredAbility ability) { - super(ability); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == EventType.ZONE_CHANGE) { - Permanent permanent = game.getPermanent(event.getTargetId()); - if (((ZoneChangeEvent) event).getToZone() == Zone.BATTLEFIELD - && permanent.hasSubtype("Angel") - && permanent.getControllerId().equals(this.controllerId)) { - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever an Angel enters the battlefield under your control, you gain 1 life."; - } - - @Override - public SeraphSanctuaryTriggeredAbility copy() { - return new SeraphSanctuaryTriggeredAbility(this); - } -} diff --git a/Mage.Sets/src/mage/sets/avacynrestored/SoulOfTheHarvest.java b/Mage.Sets/src/mage/sets/avacynrestored/SoulOfTheHarvest.java index 57f6e748917..62e30b378c0 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/SoulOfTheHarvest.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/SoulOfTheHarvest.java @@ -27,27 +27,33 @@ */ package mage.sets.avacynrestored; -import mage.Constants; +import java.util.UUID; import mage.Constants.CardType; import mage.Constants.Rarity; +import mage.Constants.Zone; import mage.MageInt; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; import mage.abilities.effects.common.DrawCardControllerEffect; import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.ZoneChangeEvent; -import mage.game.permanent.Permanent; -import mage.game.permanent.PermanentToken; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.filter.predicate.permanent.TokenPredicate; -import java.util.UUID; /** * @author noxx */ public class SoulOfTheHarvest extends CardImpl { + private static final FilterPermanent filter = new FilterControlledCreaturePermanent("another nontoken creature"); + static { + filter.add(new AnotherPredicate()); + filter.add(Predicates.not(new TokenPredicate())); + } + public SoulOfTheHarvest(UUID ownerId) { super(ownerId, 195, "Soul of the Harvest", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{G}{G}"); this.expansionSetCode = "AVR"; @@ -60,7 +66,7 @@ public class SoulOfTheHarvest extends CardImpl { this.addAbility(TrampleAbility.getInstance()); // Whenever another nontoken creature enters the battlefield under your control, you may draw a card. - this.addAbility(new SoulOfTheHarvestAbility()); + this.addAbility(new EntersBattlefieldControlledTriggeredAbility(Zone.BATTLEFIELD, new DrawCardControllerEffect(1), filter, true)); } public SoulOfTheHarvest(final SoulOfTheHarvest card) { @@ -72,39 +78,3 @@ public class SoulOfTheHarvest extends CardImpl { return new SoulOfTheHarvest(this); } } - -class SoulOfTheHarvestAbility extends TriggeredAbilityImpl { - - public SoulOfTheHarvestAbility() { - super(Constants.Zone.BATTLEFIELD, new DrawCardControllerEffect(1), true); - } - - public SoulOfTheHarvestAbility(final SoulOfTheHarvestAbility ability) { - super(ability); - } - - @Override - public SoulOfTheHarvestAbility copy() { - return new SoulOfTheHarvestAbility(this); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.ZONE_CHANGE && !event.getTargetId().equals(this.getSourceId())) { - ZoneChangeEvent zEvent = (ZoneChangeEvent)event; - if (zEvent.getToZone() == Constants.Zone.BATTLEFIELD) { - Permanent permanent = game.getPermanent(event.getTargetId()); - if (permanent != null && permanent.getControllerId().equals(this.controllerId) && !(permanent instanceof PermanentToken) && permanent.getCardType().contains(CardType.CREATURE)) { - return true; - } - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever another nontoken creature enters the battlefield under your control, you may draw a card"; - } - -} diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/RoninWarclub.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/RoninWarclub.java index a69ed091012..c3fc1893fc9 100644 --- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/RoninWarclub.java +++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/RoninWarclub.java @@ -28,10 +28,10 @@ package mage.sets.betrayersofkamigawa; import java.util.UUID; - -import mage.Constants; import mage.Constants.CardType; +import mage.Constants.Outcome; import mage.Constants.Rarity; +import mage.Constants.Zone; import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.SimpleStaticAbility; @@ -42,7 +42,6 @@ import mage.abilities.keyword.EquipAbility; import mage.cards.CardImpl; import mage.game.Game; import mage.game.events.GameEvent; -import mage.game.events.ZoneChangeEvent; import mage.game.permanent.Permanent; import mage.target.Target; import mage.target.common.TargetCreaturePermanent; @@ -58,7 +57,7 @@ public class RoninWarclub extends CardImpl { this.expansionSetCode = "BOK"; this.subtype.add("Equipment"); // Equipped creature gets +2/+1. - this.addAbility(new SimpleStaticAbility(Constants.Zone.BATTLEFIELD, new BoostEquippedEffect(2, 1))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEquippedEffect(2, 1))); // Whenever a creature enters the battlefield under your control, attach Ronin Warclub to that creature. Ability ability = new RoninWarclubTriggeredAbility(); @@ -66,7 +65,7 @@ public class RoninWarclub extends CardImpl { this.addAbility(ability); // Equip {5} ({5}: Attach to target creature you control. Equip only as a sorcery.) - this.addAbility(new EquipAbility(Constants.Outcome.BoostCreature, new GenericManaCost(5))); + this.addAbility(new EquipAbility(Outcome.BoostCreature, new GenericManaCost(5))); } public RoninWarclub(final RoninWarclub card) { @@ -81,7 +80,7 @@ public class RoninWarclub extends CardImpl { private class RoninWarclubTriggeredAbility extends TriggeredAbilityImpl { public RoninWarclubTriggeredAbility() { - super(Constants.Zone.BATTLEFIELD, new RoninWarclubAttachEffect(), false); + super(Zone.BATTLEFIELD, new RoninWarclubAttachEffect(), false); } public RoninWarclubTriggeredAbility(RoninWarclubTriggeredAbility ability) { @@ -90,10 +89,9 @@ public class RoninWarclub extends CardImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.ZONE_CHANGE) { + if (event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD) { Permanent permanent = game.getPermanent(event.getTargetId()); - if (((ZoneChangeEvent) event).getToZone() == Constants.Zone.BATTLEFIELD - && permanent.getCardType().contains(CardType.CREATURE) + if (permanent.getCardType().contains(CardType.CREATURE) && (permanent.getControllerId().equals(this.controllerId))) { if (!this.getTargets().isEmpty()) { @@ -122,7 +120,7 @@ public class RoninWarclub extends CardImpl { private class RoninWarclubAttachEffect extends OneShotEffect { public RoninWarclubAttachEffect() { - super(Constants.Outcome.BoostCreature); + super(Outcome.BoostCreature); this.staticText = "Whenever a creature enters the battlefield under your control, attach {this} to that creature"; } @@ -138,13 +136,20 @@ public class RoninWarclub extends CardImpl { @Override public boolean apply(Game game, Ability source) { Permanent permanent = game.getPermanent(source.getFirstTarget()); - if (permanent != null) { + Permanent attachment = game.getPermanent(source.getSourceId()); + if (permanent != null && attachment != null) { + if (attachment.getAttachedTo() != null) { + Permanent oldTarget = game.getPermanent(attachment.getAttachedTo()); + if (oldTarget != null) { + oldTarget.removeAttachment(source.getSourceId(), game); + } + } boolean result; result = permanent.addAttachment(source.getSourceId(), game); return result; } return false; } - } + } diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/ZoZuThePunisher.java b/Mage.Sets/src/mage/sets/championsofkamigawa/ZoZuThePunisher.java index 268b0a95ed6..5005e36b446 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/ZoZuThePunisher.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/ZoZuThePunisher.java @@ -41,7 +41,6 @@ import mage.filter.FilterCard; import mage.filter.predicate.mageobject.SupertypePredicate; import mage.game.Game; import mage.game.events.GameEvent; -import mage.game.events.ZoneChangeEvent; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.targetpointer.FixedTarget; @@ -98,19 +97,19 @@ class ZoZuThePunisherAbility extends TriggeredAbilityImpl { public RavagerOfTheFellsTarget copy() { return new RavagerOfTheFellsTarget(this); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/darkascension/MidnightGuard.java b/Mage.Sets/src/mage/sets/darkascension/MidnightGuard.java index 54a87d54c31..771fc8a2025 100644 --- a/Mage.Sets/src/mage/sets/darkascension/MidnightGuard.java +++ b/Mage.Sets/src/mage/sets/darkascension/MidnightGuard.java @@ -30,16 +30,13 @@ package mage.sets.darkascension; import java.util.UUID; import mage.Constants.CardType; import mage.Constants.Rarity; -import mage.Constants.Zone; import mage.MageInt; -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.Effect; +import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; import mage.abilities.effects.common.UntapSourceEffect; import mage.cards.CardImpl; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; -import mage.game.events.ZoneChangeEvent; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.AnotherPredicate; /** * @@ -47,6 +44,11 @@ import mage.game.events.ZoneChangeEvent; */ public class MidnightGuard extends CardImpl { + private static final FilterPermanent filter = new FilterCreaturePermanent("another creature"); + static { + filter.add(new AnotherPredicate()); + } + public MidnightGuard(UUID ownerId) { super(ownerId, 14, "Midnight Guard", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{W}"); this.expansionSetCode = "DKA"; @@ -58,7 +60,7 @@ public class MidnightGuard extends CardImpl { this.toughness = new MageInt(3); // Whenever another creature enters the battlefield, untap Midnight Guard. - this.addAbility(new MidnightGuardTriggeredAbility(new UntapSourceEffect())); + this.addAbility(new EntersBattlefieldAllTriggeredAbility(new UntapSourceEffect(), filter)); } public MidnightGuard(final MidnightGuard card) { @@ -70,41 +72,3 @@ public class MidnightGuard extends CardImpl { return new MidnightGuard(this); } } - -class MidnightGuardTriggeredAbility extends TriggeredAbilityImpl { - - public MidnightGuardTriggeredAbility(Effect effect) { - this(effect, false); - } - - public MidnightGuardTriggeredAbility(Effect effect, boolean optional) { - super(Zone.BATTLEFIELD, effect, optional); - } - - public MidnightGuardTriggeredAbility(MidnightGuardTriggeredAbility ability) { - super(ability); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == EventType.ZONE_CHANGE) { - ZoneChangeEvent zEvent = (ZoneChangeEvent) event; - if (zEvent.getToZone() == Zone.BATTLEFIELD - && zEvent.getTarget().getCardType().contains(CardType.CREATURE) - && zEvent.getTargetId() != this.getSourceId()) { - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever another creature enters the battlefield, " + super.getRule(); - } - - @Override - public MidnightGuardTriggeredAbility copy() { - return new MidnightGuardTriggeredAbility(this); - } -} diff --git a/Mage.Sets/src/mage/sets/gatecrash/GruulRagebeast.java b/Mage.Sets/src/mage/sets/gatecrash/GruulRagebeast.java index 39670d20855..24aa23b2a01 100644 --- a/Mage.Sets/src/mage/sets/gatecrash/GruulRagebeast.java +++ b/Mage.Sets/src/mage/sets/gatecrash/GruulRagebeast.java @@ -106,12 +106,10 @@ class GruulRagebeastTriggeredAbility extends TriggeredAbilityImpl { + private static final FilterPermanent filter = new FilterControlledCreaturePermanent("another Human"); + static { + filter.add(new SubtypePredicate("Human")); + filter.add(new AnotherPredicate()); + } + public ChampionOfTheParish(UUID ownerId) { super(ownerId, 6, "Champion of the Parish", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{W}"); this.expansionSetCode = "ISD"; @@ -60,7 +63,7 @@ public class ChampionOfTheParish extends CardImpl { this.toughness = new MageInt(1); // Whenever another Human enters the battlefield under your control, put a +1/+1 counter on Champion of the Parish. - this.addAbility(new HumanEntersBattlefieldTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false)); + this.addAbility(new EntersBattlefieldControlledTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), filter)); } public ChampionOfTheParish(final ChampionOfTheParish card) { @@ -72,39 +75,3 @@ public class ChampionOfTheParish extends CardImpl { return new ChampionOfTheParish(this); } } - -class HumanEntersBattlefieldTriggeredAbility extends TriggeredAbilityImpl { - - public HumanEntersBattlefieldTriggeredAbility(Effect effect, boolean optional) { - super(Constants.Zone.BATTLEFIELD, effect, optional); - } - - public HumanEntersBattlefieldTriggeredAbility(HumanEntersBattlefieldTriggeredAbility ability) { - super(ability); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.ZONE_CHANGE) { - UUID targetId = event.getTargetId(); - Permanent permanent = game.getPermanent(targetId); - ZoneChangeEvent zEvent = (ZoneChangeEvent) event; - if (zEvent.getToZone() == Constants.Zone.BATTLEFIELD - && permanent.getControllerId().equals(this.controllerId) - && (permanent.hasSubtype("Human") && !targetId.equals(this.getSourceId()))) { - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever another Human enters the battlefield under your control, " + super.getRule(); - } - - @Override - public HumanEntersBattlefieldTriggeredAbility copy() { - return new HumanEntersBattlefieldTriggeredAbility(this); - } -} diff --git a/Mage.Sets/src/mage/sets/innistrad/MentorOfTheMeek.java b/Mage.Sets/src/mage/sets/innistrad/MentorOfTheMeek.java index e241cd10824..ce4700aa4cc 100644 --- a/Mage.Sets/src/mage/sets/innistrad/MentorOfTheMeek.java +++ b/Mage.Sets/src/mage/sets/innistrad/MentorOfTheMeek.java @@ -33,21 +33,28 @@ import mage.Constants.CardType; import mage.Constants.Rarity; import mage.Constants.Zone; import mage.MageInt; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.DoIfCostPaid; import mage.abilities.effects.common.DrawCardControllerEffect; import mage.cards.CardImpl; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.ZoneChangeEvent; -import mage.game.permanent.Permanent; +import mage.filter.Filter; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.mageobject.PowerPredicate; +import mage.filter.predicate.permanent.AnotherPredicate; /** * @author Loki */ public class MentorOfTheMeek extends CardImpl { + private static final FilterPermanent filter = new FilterControlledCreaturePermanent("another creature with power 2 or less"); + static { + filter.add(new AnotherPredicate()); + filter.add(new PowerPredicate(Filter.ComparisonType.LessThan, 3)); + } + public MentorOfTheMeek(UUID ownerId) { super(ownerId, 21, "Mentor of the Meek", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{W}"); this.expansionSetCode = "ISD"; @@ -58,7 +65,8 @@ public class MentorOfTheMeek extends CardImpl { this.toughness = new MageInt(2); //Whenever another creature with power 2 or less enters the battlefield under your control, you may pay 1. If you do, draw a card. - this.addAbility(new MentorOfTheMeekAbility()); + this.addAbility(new EntersBattlefieldControlledTriggeredAbility( + Zone.BATTLEFIELD, new DoIfCostPaid(new DrawCardControllerEffect(1), new ManaCostsImpl("{1}")),filter, true)); } @@ -72,41 +80,3 @@ public class MentorOfTheMeek extends CardImpl { } } - -class MentorOfTheMeekAbility extends TriggeredAbilityImpl { - - public MentorOfTheMeekAbility() { - super(Zone.BATTLEFIELD, new DoIfCostPaid(new DrawCardControllerEffect(1), new ManaCostsImpl("{1}")), true); - } - - public MentorOfTheMeekAbility(final MentorOfTheMeekAbility ability) { - super(ability); - } - - @Override - public MentorOfTheMeekAbility copy() { - return new MentorOfTheMeekAbility(this); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.ZONE_CHANGE && !event.getTargetId().equals(this.getSourceId())) { - ZoneChangeEvent zEvent = (ZoneChangeEvent)event; - if (zEvent.getToZone() == Zone.BATTLEFIELD) { - Permanent permanent = game.getPermanent(event.getTargetId()); - if (permanent != null && permanent.getCardType().contains(CardType.CREATURE) - && permanent.getControllerId().equals(this.getControllerId()) - && permanent.getPower().getValue() <= 2) { - return true; - } - } - } - return false; - } - - @Override - public String getRule() { - return new StringBuilder("Whenever another creature with power 2 or less enters the battlefield under your control, ").append(super.getRule()).toString(); - } - -} diff --git a/Mage.Sets/src/mage/sets/magic2010/SoulWarden.java b/Mage.Sets/src/mage/sets/magic2010/SoulWarden.java index 79ff844242c..5714d95b153 100644 --- a/Mage.Sets/src/mage/sets/magic2010/SoulWarden.java +++ b/Mage.Sets/src/mage/sets/magic2010/SoulWarden.java @@ -28,20 +28,17 @@ package mage.sets.magic2010; +import java.util.UUID; import mage.Constants.CardType; import mage.Constants.Rarity; -import mage.Constants.Zone; import mage.MageInt; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; import mage.abilities.effects.common.GainLifeEffect; import mage.cards.CardImpl; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; -import mage.game.events.ZoneChangeEvent; -import mage.game.permanent.Permanent; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.AnotherPredicate; -import java.util.UUID; /** * @@ -49,6 +46,11 @@ import java.util.UUID; */ public class SoulWarden extends CardImpl { + private static final FilterPermanent filter = new FilterCreaturePermanent("another creature"); + static { + filter.add(new AnotherPredicate()); + } + public SoulWarden(UUID ownerId) { super(ownerId, 34, "Soul Warden", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{W}"); this.expansionSetCode = "M10"; @@ -57,7 +59,8 @@ public class SoulWarden extends CardImpl { this.color.setWhite(true); this.power = new MageInt(1); this.toughness = new MageInt(1); - this.addAbility(new SoulWardenAbility()); + + this.addAbility(new EntersBattlefieldAllTriggeredAbility(new GainLifeEffect(1), filter)); } public SoulWarden(final SoulWarden card) { @@ -70,36 +73,3 @@ public class SoulWarden extends CardImpl { } } - -class SoulWardenAbility extends TriggeredAbilityImpl { - - public SoulWardenAbility() { - super(Zone.BATTLEFIELD, new GainLifeEffect(1)); - } - - public SoulWardenAbility(final SoulWardenAbility ability) { - super(ability); - } - - @Override - public SoulWardenAbility copy() { - return new SoulWardenAbility(this); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == EventType.ZONE_CHANGE && ((ZoneChangeEvent)event).getToZone() == Zone.BATTLEFIELD) { - Permanent permanent = game.getPermanent(event.getTargetId()); - if (permanent.getCardType().contains(CardType.CREATURE) && !permanent.getId().equals(this.getSourceId())) { - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever another creature enters the battlefield, " + super.getRule(); - } - -} diff --git a/Mage.Sets/src/mage/sets/magic2011/FrostTitan.java b/Mage.Sets/src/mage/sets/magic2011/FrostTitan.java index 105fd9fd815..fdfa36931e3 100644 --- a/Mage.Sets/src/mage/sets/magic2011/FrostTitan.java +++ b/Mage.Sets/src/mage/sets/magic2011/FrostTitan.java @@ -131,11 +131,8 @@ class FrostTitanAbility2 extends TriggeredAbilityImpl { if (event.getType() == EventType.ATTACKER_DECLARED && event.getSourceId().equals(this.getSourceId())) { return true; } - if (event.getType() == EventType.ZONE_CHANGE && event.getTargetId().equals(this.getSourceId()) ) { - ZoneChangeEvent zEvent = (ZoneChangeEvent)event; - if (zEvent.getToZone() == Zone.BATTLEFIELD) { - return true; - } + if (event.getType() == EventType.ENTERS_THE_BATTLEFIELD && event.getTargetId().equals(this.getSourceId()) ) { + return true; } return false; } diff --git a/Mage.Sets/src/mage/sets/magic2011/GarruksPackleader.java b/Mage.Sets/src/mage/sets/magic2011/GarruksPackleader.java index 67e6bc5b01e..0991592693b 100644 --- a/Mage.Sets/src/mage/sets/magic2011/GarruksPackleader.java +++ b/Mage.Sets/src/mage/sets/magic2011/GarruksPackleader.java @@ -33,14 +33,14 @@ import mage.Constants.CardType; import mage.Constants.Rarity; import mage.Constants.Zone; import mage.MageInt; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; import mage.abilities.effects.common.DrawCardControllerEffect; import mage.cards.CardImpl; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; -import mage.game.events.ZoneChangeEvent; -import mage.game.permanent.Permanent; +import mage.filter.Filter; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.mageobject.PowerPredicate; +import mage.filter.predicate.permanent.AnotherPredicate; /** * @@ -48,6 +48,12 @@ import mage.game.permanent.Permanent; */ public class GarruksPackleader extends CardImpl { + private static final FilterPermanent filter = new FilterControlledCreaturePermanent("another creature with power 3 or greater"); + static { + filter.add(new AnotherPredicate()); + filter.add(new PowerPredicate(Filter.ComparisonType.GreaterThan, 2)); + } + public GarruksPackleader(UUID ownerId) { super(ownerId, 177, "Garruk's Packleader", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{4}{G}"); this.expansionSetCode = "M11"; @@ -56,7 +62,8 @@ public class GarruksPackleader extends CardImpl { this.power = new MageInt(4); this.toughness = new MageInt(4); - this.addAbility(new GarruksPackleaderAbility()); + this.addAbility(new EntersBattlefieldControlledTriggeredAbility( + Zone.BATTLEFIELD, new DrawCardControllerEffect(1), filter, true)); } public GarruksPackleader(final GarruksPackleader card) { @@ -69,39 +76,3 @@ public class GarruksPackleader extends CardImpl { } } - -class GarruksPackleaderAbility extends TriggeredAbilityImpl { - - public GarruksPackleaderAbility() { - super(Zone.BATTLEFIELD, new DrawCardControllerEffect(1), true); - } - - public GarruksPackleaderAbility(final GarruksPackleaderAbility ability) { - super(ability); - } - - @Override - public GarruksPackleaderAbility copy() { - return new GarruksPackleaderAbility(this); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == EventType.ZONE_CHANGE && !event.getTargetId().equals(this.getSourceId())) { - ZoneChangeEvent zEvent = (ZoneChangeEvent)event; - if (zEvent.getToZone() == Zone.BATTLEFIELD) { - Permanent permanent = game.getPermanent(event.getTargetId()); - if (permanent != null && permanent.getCardType().contains(CardType.CREATURE) && permanent.getControllerId().equals(this.getControllerId()) && permanent.getPower().getValue() > 2) { - return true; - } - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever another creature with power 3 or greater enters the battlefield under your control, you may draw a card"; - } - -} diff --git a/Mage.Sets/src/mage/sets/magic2011/GraveTitan.java b/Mage.Sets/src/mage/sets/magic2011/GraveTitan.java index 5d16fd1a5d0..8f16a78905e 100644 --- a/Mage.Sets/src/mage/sets/magic2011/GraveTitan.java +++ b/Mage.Sets/src/mage/sets/magic2011/GraveTitan.java @@ -92,11 +92,8 @@ class GraveTitanAbility extends TriggeredAbilityImpl { if (event.getType() == EventType.ATTACKER_DECLARED && event.getSourceId().equals(this.getSourceId())) { return true; } - if (event.getType() == EventType.ZONE_CHANGE && event.getTargetId().equals(this.getSourceId()) ) { - ZoneChangeEvent zEvent = (ZoneChangeEvent)event; - if (zEvent.getToZone() == Zone.BATTLEFIELD) { - return true; - } + if (event.getType() == EventType.ENTERS_THE_BATTLEFIELD && event.getTargetId().equals(this.getSourceId()) ) { + return true; } return false; } diff --git a/Mage.Sets/src/mage/sets/magic2011/InfernoTitan.java b/Mage.Sets/src/mage/sets/magic2011/InfernoTitan.java index 6981868b044..47b20ce5983 100644 --- a/Mage.Sets/src/mage/sets/magic2011/InfernoTitan.java +++ b/Mage.Sets/src/mage/sets/magic2011/InfernoTitan.java @@ -96,11 +96,8 @@ class InfernoTitanAbility extends TriggeredAbilityImpl { if (event.getType() == EventType.ATTACKER_DECLARED && event.getSourceId().equals(this.getSourceId())) { return true; } - if (event.getType() == EventType.ZONE_CHANGE && event.getTargetId().equals(this.getSourceId()) ) { - ZoneChangeEvent zEvent = (ZoneChangeEvent)event; - if (zEvent.getToZone() == Zone.BATTLEFIELD) { - return true; - } + if (event.getType() == EventType.ENTERS_THE_BATTLEFIELD && event.getTargetId().equals(this.getSourceId()) ) { + return true; } return false; } diff --git a/Mage.Sets/src/mage/sets/magic2011/PrimevalTitan.java b/Mage.Sets/src/mage/sets/magic2011/PrimevalTitan.java index cd8808b46e2..01544df5fca 100644 --- a/Mage.Sets/src/mage/sets/magic2011/PrimevalTitan.java +++ b/Mage.Sets/src/mage/sets/magic2011/PrimevalTitan.java @@ -96,11 +96,8 @@ class PrimevalTitanAbility extends TriggeredAbilityImpl { if (event.getType() == EventType.ATTACKER_DECLARED && event.getSourceId().equals(this.getSourceId())) { return true; } - if (event.getType() == EventType.ZONE_CHANGE && event.getTargetId().equals(this.getSourceId()) ) { - ZoneChangeEvent zEvent = (ZoneChangeEvent)event; - if (zEvent.getToZone() == Zone.BATTLEFIELD) { - return true; - } + if (event.getType() == EventType.ENTERS_THE_BATTLEFIELD && event.getTargetId().equals(this.getSourceId()) ) { + return true; } return false; } diff --git a/Mage.Sets/src/mage/sets/magic2011/SunTitan.java b/Mage.Sets/src/mage/sets/magic2011/SunTitan.java index 7eda529558c..cb0661421f4 100644 --- a/Mage.Sets/src/mage/sets/magic2011/SunTitan.java +++ b/Mage.Sets/src/mage/sets/magic2011/SunTitan.java @@ -111,11 +111,8 @@ class SunTitanAbility extends TriggeredAbilityImpl { if (event.getType() == EventType.ATTACKER_DECLARED && event.getSourceId().equals(this.getSourceId())) { return true; } - if (event.getType() == EventType.ZONE_CHANGE && event.getTargetId().equals(this.getSourceId()) ) { - ZoneChangeEvent zEvent = (ZoneChangeEvent)event; - if (zEvent.getToZone() == Zone.BATTLEFIELD) { - return true; - } + if (event.getType() == EventType.ENTERS_THE_BATTLEFIELD && event.getTargetId().equals(this.getSourceId()) ) { + return true; } return false; } diff --git a/Mage.Sets/src/mage/sets/magic2012/AegisAngel.java b/Mage.Sets/src/mage/sets/magic2012/AegisAngel.java index bf0bd9cc049..e0ed366ba1a 100644 --- a/Mage.Sets/src/mage/sets/magic2012/AegisAngel.java +++ b/Mage.Sets/src/mage/sets/magic2012/AegisAngel.java @@ -127,12 +127,9 @@ class AegisAngelEffect extends ReplacementEffectImpl { return false; } } - if (event.getType() == GameEvent.EventType.ZONE_CHANGE && event.getTargetId().equals(source.getSourceId())) { - ZoneChangeEvent zEvent = (ZoneChangeEvent) event; - if (zEvent.getFromZone() == Zone.BATTLEFIELD) { - this.used = true; - return false; - } + if (event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD && event.getTargetId().equals(source.getSourceId())) { + this.used = true; + return false; } return event.getType().equals(GameEvent.EventType.DESTROY_PERMANENT) diff --git a/Mage.Sets/src/mage/sets/magic2012/WarstormSurge.java b/Mage.Sets/src/mage/sets/magic2012/WarstormSurge.java index 4ba516f8da2..ca2a8d9309e 100644 --- a/Mage.Sets/src/mage/sets/magic2012/WarstormSurge.java +++ b/Mage.Sets/src/mage/sets/magic2012/WarstormSurge.java @@ -84,10 +84,9 @@ class WarstormSurgeTriggeredAbility extends TriggeredAbilityImpl { + private static final FilterPermanent filter = new FilterControlledLandPermanent("a Swamp"); + static { + filter.add(new SubtypePredicate("Swamp")); + } + public VeilbornGhoul(UUID ownerId) { super(ownerId, 114, "Veilborn Ghoul", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{4}{B}"); this.expansionSetCode = "M13"; @@ -60,7 +70,9 @@ public class VeilbornGhoul extends CardImpl { this.addAbility(new CantBlockAbility()); // Whenever a Swamp enters the battlefield under your control, you may return Veilborn Ghoul from your graveyard to your hand. - this.addAbility(new VeilbornGhoulTriggeredAbility()); + this.addAbility(new EntersBattlefieldControlledTriggeredAbility( + Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), filter, true)); + } public VeilbornGhoul(final VeilbornGhoul card) { @@ -72,36 +84,3 @@ public class VeilbornGhoul extends CardImpl { return new VeilbornGhoul(this); } } - -class VeilbornGhoulTriggeredAbility extends TriggeredAbilityImpl { - - VeilbornGhoulTriggeredAbility() { - super(Constants.Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), true); - } - - VeilbornGhoulTriggeredAbility(VeilbornGhoulTriggeredAbility ability) { - super(ability); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.ZONE_CHANGE && ((ZoneChangeEvent)event).getToZone() == Constants.Zone.BATTLEFIELD) { - Permanent permanent = game.getPermanent(event.getTargetId()); - if (permanent.getCardType().contains(CardType.LAND) && permanent.getControllerId().equals(this.controllerId)) { - if(permanent.hasSubtype("Swamp")){ - return true; - } - } - } - return false; - } - @Override - public VeilbornGhoulTriggeredAbility copy() { - return new VeilbornGhoulTriggeredAbility(this); - } - - @Override - public String getRule() { - return "Whenever a Swamp enters the battlefield under your control, you may return Veilborn Ghoul from your graveyard to your hand."; - } -} diff --git a/Mage.Sets/src/mage/sets/mirrodinbesieged/Mirrorworks.java b/Mage.Sets/src/mage/sets/mirrodinbesieged/Mirrorworks.java index 2112c65770a..7bc775882d8 100644 --- a/Mage.Sets/src/mage/sets/mirrodinbesieged/Mirrorworks.java +++ b/Mage.Sets/src/mage/sets/mirrodinbesieged/Mirrorworks.java @@ -40,7 +40,6 @@ import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; import mage.game.Game; import mage.game.events.GameEvent; -import mage.game.events.ZoneChangeEvent; import mage.game.permanent.Permanent; import mage.game.permanent.PermanentToken; import mage.players.Player; @@ -88,14 +87,11 @@ class MirrorworksAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.ZONE_CHANGE && !event.getTargetId().equals(this.getSourceId())) { - ZoneChangeEvent zEvent = (ZoneChangeEvent)event; - if (zEvent.getToZone() == Constants.Zone.BATTLEFIELD) { - Permanent permanent = game.getPermanent(event.getTargetId()); - if (permanent != null && !(permanent instanceof PermanentToken) && permanent.getCardType().contains(CardType.ARTIFACT)) { - getEffects().get(0).setTargetPointer(new FixedTarget(permanent.getId())); - return true; - } + if (event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD && !event.getTargetId().equals(this.getSourceId())) { + Permanent permanent = game.getPermanent(event.getTargetId()); + if (permanent != null && !(permanent instanceof PermanentToken) && permanent.getCardType().contains(CardType.ARTIFACT)) { + getEffects().get(0).setTargetPointer(new FixedTarget(permanent.getId())); + return true; } } return false; @@ -149,4 +145,3 @@ class MirrorworksEffect extends OneShotEffect { } } - diff --git a/Mage.Sets/src/mage/sets/newphyrexia/InvaderParasite.java b/Mage.Sets/src/mage/sets/newphyrexia/InvaderParasite.java index ec1b7b3a9aa..f49d3426cd5 100644 --- a/Mage.Sets/src/mage/sets/newphyrexia/InvaderParasite.java +++ b/Mage.Sets/src/mage/sets/newphyrexia/InvaderParasite.java @@ -121,20 +121,17 @@ class InvaderParasiteTriggeredAbility extends TriggeredAbilityImpl 0) { - Card imprintedCard = game.getCard(sourcePermanent.getImprinted().get(0)); - if (p.getName().equals(imprintedCard.getName())) { - for (Effect effect : this.getEffects()) { - effect.setTargetPointer(new FixedTarget(event.getPlayerId())); - } - return true; + if (event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD && game.getOpponents(this.controllerId).contains(event.getPlayerId())) { + Permanent p = game.getPermanent(event.getTargetId()); + Permanent sourcePermanent = game.getPermanent(getSourceId()); + if (p != null && sourcePermanent != null) { + if (sourcePermanent.getImprinted().size() > 0) { + Card imprintedCard = game.getCard(sourcePermanent.getImprinted().get(0)); + if (p.getName().equals(imprintedCard.getName())) { + for (Effect effect : this.getEffects()) { + effect.setTargetPointer(new FixedTarget(event.getPlayerId())); } + return true; } } } diff --git a/Mage.Sets/src/mage/sets/newphyrexia/PuresteelPaladin.java b/Mage.Sets/src/mage/sets/newphyrexia/PuresteelPaladin.java index ddaef509ce4..7065b6ef342 100644 --- a/Mage.Sets/src/mage/sets/newphyrexia/PuresteelPaladin.java +++ b/Mage.Sets/src/mage/sets/newphyrexia/PuresteelPaladin.java @@ -29,14 +29,13 @@ package mage.sets.newphyrexia; import java.util.UUID; - -import mage.Constants; import mage.Constants.CardType; import mage.Constants.Duration; import mage.Constants.Outcome; import mage.Constants.Rarity; +import mage.Constants.Zone; import mage.MageInt; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.common.MetalcraftCondition; import mage.abilities.costs.mana.GenericManaCost; @@ -46,17 +45,14 @@ import mage.abilities.effects.common.continious.GainAbilityControlledEffect; import mage.abilities.keyword.EquipAbility; import mage.cards.CardImpl; import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.mageobject.SubtypePredicate; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.ZoneChangeEvent; -import mage.game.permanent.Permanent; /** * @author Loki */ public class PuresteelPaladin extends CardImpl { - private static final FilterPermanent filter = new FilterPermanent("Equipment"); + private static final FilterPermanent filter = new FilterControlledPermanent("Equipment"); static { filter.add(new SubtypePredicate("Equipment")); @@ -70,8 +66,11 @@ public class PuresteelPaladin extends CardImpl { this.color.setWhite(true); this.power = new MageInt(2); this.toughness = new MageInt(2); - this.addAbility(new PuresteelPaladinTriggeredAbility()); - this.addAbility(new SimpleStaticAbility(Constants.Zone.BATTLEFIELD, new ConditionalContinousEffect( + + // Whenever an Equipment enters the battlefield under your control, you may draw a card. + this.addAbility(new EntersBattlefieldControlledTriggeredAbility(Zone.BATTLEFIELD, new DrawCardControllerEffect(1), filter, true)); + // Metalcraft - Equipment you control have equip {0} as long as you control three or more artifacts + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinousEffect( new GainAbilityControlledEffect(new EquipAbility(Outcome.AddAbility, new GenericManaCost(0)), Duration.WhileOnBattlefield, filter), MetalcraftCondition.getInstance(), "Metalcraft - Equipment you control have equip {0} as long as you control three or more artifacts"))); @@ -86,38 +85,3 @@ public class PuresteelPaladin extends CardImpl { return new PuresteelPaladin(this); } } - -class PuresteelPaladinTriggeredAbility extends TriggeredAbilityImpl { - PuresteelPaladinTriggeredAbility() { - super(Constants.Zone.BATTLEFIELD, new DrawCardControllerEffect(1), true); - } - - PuresteelPaladinTriggeredAbility(final PuresteelPaladinTriggeredAbility ability) { - super(ability); - } - - @Override - public PuresteelPaladinTriggeredAbility copy() { - return new PuresteelPaladinTriggeredAbility(this); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.ZONE_CHANGE) { - ZoneChangeEvent zEvent = (ZoneChangeEvent) event; - if (zEvent.getToZone() == Constants.Zone.BATTLEFIELD) { - Permanent permanent = game.getPermanent(event.getTargetId()); - if (permanent != null && permanent.getSubtype().contains("Equipment") - && permanent.getControllerId().equals(this.controllerId)) { - return true; - } - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever an Equipment enters the battlefield under your control, you may draw a card."; - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/newphyrexia/ShatteredAngel.java b/Mage.Sets/src/mage/sets/newphyrexia/ShatteredAngel.java index 7b4e87b2357..37ed307507c 100644 --- a/Mage.Sets/src/mage/sets/newphyrexia/ShatteredAngel.java +++ b/Mage.Sets/src/mage/sets/newphyrexia/ShatteredAngel.java @@ -29,19 +29,18 @@ package mage.sets.newphyrexia; import java.util.UUID; - -import mage.Constants; import mage.Constants.CardType; import mage.Constants.Rarity; +import mage.Constants.TargetController; +import mage.Constants.Zone; import mage.MageInt; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.ZoneChangeEvent; -import mage.game.permanent.Permanent; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.permanent.ControllerPredicate; /** * @@ -49,6 +48,11 @@ import mage.game.permanent.Permanent; */ public class ShatteredAngel extends CardImpl { + private static final FilterPermanent filter = new FilterLandPermanent("a land"); + static { + filter.add(new ControllerPredicate(TargetController.OPPONENT)); + } + public ShatteredAngel (UUID ownerId) { super(ownerId, 23, "Shattered Angel", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{W}{W}"); this.expansionSetCode = "NPH"; @@ -56,8 +60,12 @@ public class ShatteredAngel extends CardImpl { this.color.setWhite(true); this.power = new MageInt(3); this.toughness = new MageInt(3); + + // Flying this.addAbility(FlyingAbility.getInstance()); - this.addAbility(new ShatteredAngelTriggeredAbility()); + // Whenever a land enters the battlefield under an opponent's control, you may gain 3 life. + this.addAbility(new EntersBattlefieldAllTriggeredAbility( + Zone.BATTLEFIELD, new GainLifeEffect(3), filter, true, "Whenever a land enters the battlefield under an opponent's control, you may gain 3 life.")); } public ShatteredAngel (final ShatteredAngel card) { @@ -70,34 +78,3 @@ public class ShatteredAngel extends CardImpl { } } - -class ShatteredAngelTriggeredAbility extends TriggeredAbilityImpl { - ShatteredAngelTriggeredAbility() { - super(Constants.Zone.BATTLEFIELD, new GainLifeEffect(3), true); - } - - ShatteredAngelTriggeredAbility(final ShatteredAngelTriggeredAbility ability) { - super(ability); - } - - @Override - public ShatteredAngelTriggeredAbility copy() { - return new ShatteredAngelTriggeredAbility(this); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.ZONE_CHANGE && ((ZoneChangeEvent)event).getToZone() == Constants.Zone.BATTLEFIELD) { - Permanent permanent = game.getPermanent(event.getTargetId()); - if (permanent != null && permanent.getCardType().contains(CardType.LAND) && game.getOpponents(this.controllerId).contains(permanent.getControllerId())) { - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever a land enters the battlefield under an opponent's control, you may gain 3 life."; - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/newphyrexia/SuturePriest.java b/Mage.Sets/src/mage/sets/newphyrexia/SuturePriest.java index a374eff6468..8751a33faa8 100644 --- a/Mage.Sets/src/mage/sets/newphyrexia/SuturePriest.java +++ b/Mage.Sets/src/mage/sets/newphyrexia/SuturePriest.java @@ -33,13 +33,21 @@ import java.util.UUID; import mage.Constants; import mage.Constants.CardType; import mage.Constants.Rarity; +import mage.Constants.Zone; import mage.MageInt; import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.LoseLifeTargetEffect; import mage.cards.Card; import mage.cards.CardImpl; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.filter.predicate.permanent.ControllerPredicate; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.ZoneChangeEvent; @@ -51,6 +59,11 @@ import mage.target.targetpointer.FixedTarget; */ public class SuturePriest extends CardImpl { + private static final FilterPermanent filter = new FilterControlledCreaturePermanent("another creature"); + static { + filter.add(new AnotherPredicate()); + } + public SuturePriest (UUID ownerId) { super(ownerId, 25, "Suture Priest", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{W}"); this.expansionSetCode = "NPH"; @@ -58,8 +71,13 @@ public class SuturePriest extends CardImpl { this.color.setWhite(true); this.power = new MageInt(1); this.toughness = new MageInt(1); - this.addAbility(new SuturePriestFirstTriggeredAbility()); + + // Whenever another creature enters the battlefield under your control,you gain 1 life. + this.addAbility(new EntersBattlefieldControlledTriggeredAbility(new GainLifeEffect(1), filter)); + + // Whenever a creature enters the battlefield under an opponent's control, you may have that player lose 1 life. this.addAbility(new SuturePriestSecondTriggeredAbility()); + } public SuturePriest (final SuturePriest card) { @@ -72,38 +90,6 @@ public class SuturePriest extends CardImpl { } } -class SuturePriestFirstTriggeredAbility extends TriggeredAbilityImpl { - SuturePriestFirstTriggeredAbility() { - super(Constants.Zone.BATTLEFIELD, new GainLifeEffect(1), true); - } - - SuturePriestFirstTriggeredAbility(final SuturePriestFirstTriggeredAbility ability) { - super(ability); - } - - @Override - public SuturePriestFirstTriggeredAbility copy() { - return new SuturePriestFirstTriggeredAbility(this); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.ZONE_CHANGE && !event.getTargetId().equals(this.getSourceId()) && event.getPlayerId().equals(this.controllerId)) { - ZoneChangeEvent zEvent = (ZoneChangeEvent)event; - Card card = zEvent.getTarget(); - if (zEvent.getToZone() == Constants.Zone.BATTLEFIELD && card != null && card.getCardType().contains(CardType.CREATURE)) { - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever another creature enters the battlefield under your control, " + modes.getText(); - } -} - class SuturePriestSecondTriggeredAbility extends TriggeredAbilityImpl { SuturePriestSecondTriggeredAbility() { super(Constants.Zone.BATTLEFIELD, new LoseLifeTargetEffect(1), true); @@ -120,10 +106,10 @@ class SuturePriestSecondTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean applies(GameEvent event, Ability source, Game game) { - if (event.getType() == GameEvent.EventType.ZONE_CHANGE) { - ZoneChangeEvent zEvent = (ZoneChangeEvent)event; - if (zEvent.getToZone() == Constants.Zone.BATTLEFIELD) { - Permanent p = game.getPermanent(event.getTargetId()); - if (p != null && p.getCardType().contains(CardType.CREATURE)) { - return true; - } + if (event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD) { + Permanent p = game.getPermanent(event.getTargetId()); + if (p != null && p.getCardType().contains(CardType.CREATURE)) { + return true; } } return false; diff --git a/Mage.Sets/src/mage/sets/returntoravnica/TrostaniSelesnyasVoice.java b/Mage.Sets/src/mage/sets/returntoravnica/TrostaniSelesnyasVoice.java index 41b3efaf684..01c75987168 100644 --- a/Mage.Sets/src/mage/sets/returntoravnica/TrostaniSelesnyasVoice.java +++ b/Mage.Sets/src/mage/sets/returntoravnica/TrostaniSelesnyasVoice.java @@ -96,10 +96,9 @@ class TrostaniSelesnyasVoiceTriggeredAbility extends TriggeredAbilityImpl { + private static final FilterPermanent filter = new FilterArtifactPermanent("another artifact"); + static { + filter.add(new ControllerPredicate(TargetController.YOU)); + filter.add(new AnotherPredicate()); + } + public GlintHawkIdol (UUID ownerId) { super(ownerId, 156, "Glint Hawk Idol", Rarity.COMMON, new CardType[]{CardType.ARTIFACT}, "{2}"); this.expansionSetCode = "SOM"; - this.addAbility(new GlintHawkIdolTriggeredAbility()); + + // Whenever another artifact enters the battlefield under your control, you may have {this} become a 2/2 Bird artifact creature with flying until end of turn. + this.addAbility(new EntersBattlefieldControlledTriggeredAbility( + Zone.BATTLEFIELD, new BecomesCreatureSourceEffect(new GlintHawkIdolToken(), "", Duration.EndOfTurn), filter, true)); + this.addAbility(new SimpleActivatedAbility(Constants.Zone.BATTLEFIELD, new BecomesCreatureSourceEffect(new GlintHawkIdolToken(), "", Duration.EndOfTurn), new ColoredManaCost(Constants.ColoredManaSymbol.W))); } @@ -71,41 +82,6 @@ public class GlintHawkIdol extends CardImpl { } -class GlintHawkIdolTriggeredAbility extends TriggeredAbilityImpl { - GlintHawkIdolTriggeredAbility() { - super(Constants.Zone.BATTLEFIELD, new BecomesCreatureSourceEffect(new GlintHawkIdolToken(), "", Duration.EndOfTurn), true); - } - - GlintHawkIdolTriggeredAbility(final GlintHawkIdolTriggeredAbility ability) { - super(ability); - } - - @Override - public GlintHawkIdolTriggeredAbility copy() { - return new GlintHawkIdolTriggeredAbility(this); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.ZONE_CHANGE && !event.getTargetId().equals(this.getSourceId())) { - ZoneChangeEvent zEvent = (ZoneChangeEvent)event; - if (zEvent.getToZone() == Constants.Zone.BATTLEFIELD) { - Permanent permanent = game.getPermanent(event.getTargetId()); - if (permanent != null && permanent.getCardType().contains(CardType.ARTIFACT) - && permanent.getControllerId().equals(this.controllerId)) { - return true; - } - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever another artifact enters the battlefield under your control, you may have {this} become a 2/2 Bird artifact creature with flying until end of turn."; - } -} - class GlintHawkIdolToken extends Token { GlintHawkIdolToken() { super("", "a 2/2 Bird artifact creature with flying"); @@ -116,4 +92,4 @@ class GlintHawkIdolToken extends Token { toughness = new MageInt(2); addAbility(FlyingAbility.getInstance()); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/TunnelIgnus.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/TunnelIgnus.java index e2d16a5640a..354244aa02f 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/TunnelIgnus.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/TunnelIgnus.java @@ -97,7 +97,7 @@ class TunnelIgnusWatcher extends WatcherImpl { @Override public void watch(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.ZONE_CHANGE && ((ZoneChangeEvent) event).getToZone() == Constants.Zone.BATTLEFIELD) { + if (event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD) { Permanent permanent = game.getPermanent(event.getTargetId()); if (permanent.getCardType().contains(CardType.LAND) && game.getOpponents(this.controllerId).contains(permanent.getControllerId())) { int count = 1; @@ -132,7 +132,7 @@ class TunnelIgnusTriggeredAbility extends TriggeredAbilityImpl { private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Scarecrow creatures"); + private static final FilterCreaturePermanent filterTrigger = new FilterCreaturePermanent("another Scarecrow"); static { filter.add(new SubtypePredicate("Scarecrow")); + filterTrigger.add(new AnotherPredicate()); + filterTrigger.add(new SubtypePredicate("Scarecrow")); } public ReaperKing(UUID ownerId) { @@ -76,7 +76,9 @@ public class ReaperKing extends CardImpl { // Other Scarecrow creatures you control get +1/+1. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostControlledEffect(1, 1, Duration.WhileOnBattlefield, filter, true))); // Whenever another Scarecrow enters the battlefield under your control, destroy target permanent. - this.addAbility(new ReaperKingAbility()); + Ability ability = new EntersBattlefieldControlledTriggeredAbility(new DestroyTargetEffect(), filterTrigger); + ability.addTarget(new TargetPermanent()); + this.addAbility(ability); } @@ -89,42 +91,3 @@ public class ReaperKing extends CardImpl { return new ReaperKing(this); } } - -class ReaperKingAbility extends TriggeredAbilityImpl { - - public ReaperKingAbility() { - super(Zone.BATTLEFIELD, new DestroyTargetEffect(), false); - this.addTarget(new TargetPermanent()); - } - - public ReaperKingAbility(ReaperKingAbility ability) { - super(ability); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == EventType.ZONE_CHANGE) { - if (((ZoneChangeEvent) event).getToZone() == Zone.BATTLEFIELD) { - UUID targetId = event.getTargetId(); - Permanent permanent = game.getPermanent(targetId); - if (permanent.getControllerId().equals(this.controllerId) - && permanent.getCardType().contains(CardType.CREATURE) - && permanent.hasSubtype("Scarecrow") - && !targetId.equals(this.getSourceId())) { - return true; - } - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever another Scarecrow enters the battlefield under your control, " + super.getRule(); - } - - @Override - public ReaperKingAbility copy() { - return new ReaperKingAbility(this); - } -} diff --git a/Mage.Sets/src/mage/sets/stronghold/IntruderAlarm.java b/Mage.Sets/src/mage/sets/stronghold/IntruderAlarm.java index c8526ba2001..0a81b83306a 100644 --- a/Mage.Sets/src/mage/sets/stronghold/IntruderAlarm.java +++ b/Mage.Sets/src/mage/sets/stronghold/IntruderAlarm.java @@ -36,9 +36,8 @@ import mage.Constants.PhaseStep; import mage.Constants.Rarity; import mage.abilities.Ability; import mage.abilities.Mode; +import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.common.ZoneChangeTriggeredAbility; -import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.ReplacementEffectImpl; import mage.cards.CardImpl; @@ -46,7 +45,6 @@ import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; -import mage.game.events.ZoneChangeEvent; import mage.game.permanent.Permanent; import mage.players.Player; @@ -65,7 +63,7 @@ public class IntruderAlarm extends CardImpl { // Creatures don't untap during their controllers' untap steps. this.addAbility(new SimpleStaticAbility(Constants.Zone.BATTLEFIELD, new IntruderAlarmEffect())); // Whenever a creature enters the battlefield, untap all creatures. - this.addAbility(new IntruderAlarmTriggeredAbility(new UntapAllCreatureEffect())); + this.addAbility(new EntersBattlefieldAllTriggeredAbility(new UntapAllCreatureEffect(), new FilterCreaturePermanent())); } public IntruderAlarm(final IntruderAlarm card) { @@ -120,47 +118,11 @@ class IntruderAlarmEffect extends ReplacementEffectImpl { public String getText(Mode mode) { return "Creatures don't untap during their controllers' untap steps"; } - - - -} - -class IntruderAlarmTriggeredAbility extends ZoneChangeTriggeredAbility { - - public IntruderAlarmTriggeredAbility(Effect effect) { - super(Constants.Zone.BATTLEFIELD, effect, "Whenever a creature enters the battlefield, ", false); - } - - - - public IntruderAlarmTriggeredAbility(IntruderAlarmTriggeredAbility ability) { - super(ability); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.ZONE_CHANGE && !event.getTargetId().equals(this.getSourceId())) { - ZoneChangeEvent zEvent = (ZoneChangeEvent) event; - if (zEvent.getToZone() == Constants.Zone.BATTLEFIELD) { - Permanent permanent = game.getPermanent(event.getTargetId()); - if (permanent != null && permanent.getCardType().contains(Constants.CardType.CREATURE)) { - return true; - } - } - } - return false; - } - - @Override - public IntruderAlarmTriggeredAbility copy() { - return new IntruderAlarmTriggeredAbility(this); - } } class UntapAllCreatureEffect extends OneShotEffect { - public UntapAllCreatureEffect() { super(Outcome.Untap); staticText = "untap all creatures"; @@ -187,4 +149,4 @@ class UntapAllCreatureEffect extends OneShotEffect { return new UntapAllCreatureEffect(this); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/stronghold/MoxDiamond.java b/Mage.Sets/src/mage/sets/stronghold/MoxDiamond.java index 591cb5420b2..cabde1a36db 100644 --- a/Mage.Sets/src/mage/sets/stronghold/MoxDiamond.java +++ b/Mage.Sets/src/mage/sets/stronghold/MoxDiamond.java @@ -42,7 +42,6 @@ import mage.cards.CardImpl; import mage.filter.common.FilterLandCard; import mage.game.Game; import mage.game.events.GameEvent; -import mage.game.events.ZoneChangeEvent; import mage.players.Player; import mage.target.common.TargetCardInHand; @@ -117,9 +116,8 @@ class MoxDiamondReplacementEffect extends ReplacementEffectImpl { if (card != null) { if (card.getCardType().contains(CardType.CREATURE)) { - card.putOntoBattlefield(game, Zone.HAND, source.getId(), source.getControllerId()); + card.putOntoBattlefield(game, Zone.LIBRARY, source.getId(), source.getControllerId()); } else { card.moveToZone(Zone.GRAVEYARD, source.getId(), game, false); } diff --git a/Mage.Sets/src/mage/sets/worldwake/AmuletOfVigor.java b/Mage.Sets/src/mage/sets/worldwake/AmuletOfVigor.java index 26b3c724700..c2daf83433b 100644 --- a/Mage.Sets/src/mage/sets/worldwake/AmuletOfVigor.java +++ b/Mage.Sets/src/mage/sets/worldwake/AmuletOfVigor.java @@ -28,17 +28,15 @@ package mage.sets.worldwake; import java.util.UUID; - -import mage.Constants; import mage.Constants.CardType; import mage.Constants.Rarity; +import mage.Constants.Zone; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.Effect; import mage.abilities.effects.common.UntapTargetEffect; import mage.cards.CardImpl; import mage.game.Game; import mage.game.events.GameEvent; -import mage.game.events.ZoneChangeEvent; import mage.game.permanent.Permanent; import mage.target.targetpointer.FixedTarget; @@ -66,7 +64,7 @@ public class AmuletOfVigor extends CardImpl { class AmuletOfVigorTriggeredAbility extends TriggeredAbilityImpl { AmuletOfVigorTriggeredAbility() { - super(Constants.Zone.BATTLEFIELD, new UntapTargetEffect()); + super(Zone.BATTLEFIELD, new UntapTargetEffect()); } AmuletOfVigorTriggeredAbility(final AmuletOfVigorTriggeredAbility ability) { @@ -80,16 +78,13 @@ class AmuletOfVigorTriggeredAbility extends TriggeredAbilityImpl { if (condition == true) { // no need to check - condition has already occured return; } - if (event.getType() == GameEvent.EventType.ZONE_CHANGE && ((ZoneChangeEvent) event).getToZone() == Constants.Zone.BATTLEFIELD) { + if (event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD) { Permanent perm = game.getPermanent(event.getTargetId()); if (perm.getCardType().contains(CardType.CREATURE) && perm.getColor().contains(ObjectColor.GREEN) && !perm.getControllerId().equals(controllerId)) { condition = true; diff --git a/Mage.Sets/src/mage/sets/worldwake/QuestForTheGoblinLord.java b/Mage.Sets/src/mage/sets/worldwake/QuestForTheGoblinLord.java index 28239eceade..9a65cbd1895 100644 --- a/Mage.Sets/src/mage/sets/worldwake/QuestForTheGoblinLord.java +++ b/Mage.Sets/src/mage/sets/worldwake/QuestForTheGoblinLord.java @@ -32,7 +32,8 @@ import mage.Constants; import mage.Constants.CardType; import mage.Constants.Rarity; import mage.Constants.TargetController; -import mage.abilities.TriggeredAbilityImpl; +import mage.Constants.Zone; +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.common.HasCounterCondition; import mage.abilities.decorator.ConditionalContinousEffect; @@ -40,12 +41,11 @@ import mage.abilities.effects.common.continious.BoostAllEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.CardImpl; import mage.counters.CounterType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; import mage.filter.predicate.permanent.ControllerPredicate; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.ZoneChangeEvent; -import mage.game.permanent.Permanent; /** * @@ -55,9 +55,11 @@ public class QuestForTheGoblinLord extends CardImpl { private static final String rule = "As long as Quest for the Goblin Lord has five or more quest counters on it, creatures you control get +2/+0."; private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(); + private static final FilterPermanent goblinFilter = new FilterControlledCreaturePermanent(); static { filter.add(new ControllerPredicate(TargetController.YOU)); + goblinFilter.add(new SubtypePredicate("Goblin")); } public QuestForTheGoblinLord(UUID ownerId) { @@ -67,7 +69,7 @@ public class QuestForTheGoblinLord extends CardImpl { this.color.setRed(true); // Whenever a Goblin enters the battlefield under your control, you may put a quest counter on Quest for the Goblin Lord. - this.addAbility(new QuestForTheGoblinLordTriggeredAbility()); + this.addAbility(new EntersBattlefieldControlledTriggeredAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.QUEST.createInstance()), goblinFilter, true)); // As long as Quest for the Goblin Lord has five or more quest counters on it, creatures you control get +2/+0. this.addAbility(new SimpleStaticAbility(Constants.Zone.BATTLEFIELD, new ConditionalContinousEffect(new BoostAllEffect(2, 0, Constants.Duration.WhileOnBattlefield, filter, false), new HasCounterCondition(CounterType.QUEST, 5, Integer.MAX_VALUE), rule))); @@ -82,35 +84,3 @@ public class QuestForTheGoblinLord extends CardImpl { return new QuestForTheGoblinLord(this); } } - -class QuestForTheGoblinLordTriggeredAbility extends TriggeredAbilityImpl { - - QuestForTheGoblinLordTriggeredAbility() { - super(Constants.Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.QUEST.createInstance()), true); - } - - QuestForTheGoblinLordTriggeredAbility(final QuestForTheGoblinLordTriggeredAbility ability) { - super(ability); - } - - @Override - public QuestForTheGoblinLordTriggeredAbility copy() { - return new QuestForTheGoblinLordTriggeredAbility(this); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.ZONE_CHANGE && ((ZoneChangeEvent) event).getToZone() == Constants.Zone.BATTLEFIELD) { - Permanent permanent = game.getPermanent(event.getTargetId()); - if (permanent != null && permanent.hasSubtype("Goblin") && permanent.getControllerId().equals(super.getControllerId())) { - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever a Goblin enters the battlefield under your control, you may put a quest counter on {this}."; - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/worldwake/TalusPaladin.java b/Mage.Sets/src/mage/sets/worldwake/TalusPaladin.java index 7ce027f38ee..af27ce1b29a 100644 --- a/Mage.Sets/src/mage/sets/worldwake/TalusPaladin.java +++ b/Mage.Sets/src/mage/sets/worldwake/TalusPaladin.java @@ -104,17 +104,14 @@ class TalusPaladinTriggeredAbility extends TriggeredAbilityImpl { if (condition == true) { // no need to check - condition has already occured return; } - if (event.getType() == GameEvent.EventType.ZONE_CHANGE && ((ZoneChangeEvent) event).getToZone() == Constants.Zone.BATTLEFIELD) { + if (event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD) { Permanent perm = game.getPermanent(event.getTargetId()); if (perm.getCardType().contains(CardType.ARTIFACT) && !perm.getControllerId().equals(controllerId)) { condition = true; diff --git a/Mage.Sets/src/mage/sets/zendikar/Electropotence.java b/Mage.Sets/src/mage/sets/zendikar/Electropotence.java index 9cba0f9ecd7..4ee7656b458 100644 --- a/Mage.Sets/src/mage/sets/zendikar/Electropotence.java +++ b/Mage.Sets/src/mage/sets/zendikar/Electropotence.java @@ -86,10 +86,9 @@ class ElectropotenceTriggeredAbility extends TriggeredAbilityImpl { @Override public void watch(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.ZONE_CHANGE && ((ZoneChangeEvent) event).getToZone() == Constants.Zone.BATTLEFIELD) { + if (event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD) { Permanent perm = game.getPermanent(event.getTargetId()); if (perm.getCardType().contains(CardType.LAND)) { Integer amount = amountOfLandsPlayedThisTurn.get(perm.getControllerId()); diff --git a/Mage.Sets/src/mage/sets/zendikar/ValakutTheMoltenPinnacle.java b/Mage.Sets/src/mage/sets/zendikar/ValakutTheMoltenPinnacle.java index 06b194f596e..c1a7adc39b9 100644 --- a/Mage.Sets/src/mage/sets/zendikar/ValakutTheMoltenPinnacle.java +++ b/Mage.Sets/src/mage/sets/zendikar/ValakutTheMoltenPinnacle.java @@ -95,7 +95,7 @@ class ValakutTheMoltenPinnacleTriggeredAbility extends TriggeredAbilityImpl { @Override public void watch(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.ZONE_CHANGE && ((ZoneChangeEvent) event).getToZone() == Constants.Zone.BATTLEFIELD) { + if (event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD) { Permanent perm = game.getPermanent(event.getTargetId()); if (perm.getCardType().contains(CardType.CREATURE)) { Integer amount = amountOfCreaturesPlayedThisTurn.get(perm.getControllerId()); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/continuous/GoblinBushwhackerTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/continuous/GoblinBushwhackerTest.java index 63ef964b469..23b19bb7042 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/continuous/GoblinBushwhackerTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/continuous/GoblinBushwhackerTest.java @@ -12,6 +12,8 @@ public class GoblinBushwhackerTest extends CardTestPlayerBase { @Test public void testKicker() { addCard(Constants.Zone.BATTLEFIELD, playerA, "Mountain", 2); + // Goblin Bushwhacker - Creature — Goblin Warrior 1/1, R - Kicker {R} (You may pay an additional {R} as you cast this spell.) + // When Goblin Bushwhacker enters the battlefield, if it was kicked, creatures you control get +1/+0 and gain haste until end of turn. addCard(Constants.Zone.HAND, playerA, "Goblin Bushwhacker"); addCard(Constants.Zone.BATTLEFIELD, playerA, "Elite Vanguard"); diff --git a/Mage/src/mage/game/events/ZoneChangeEvent.java b/Mage/src/mage/game/events/ZoneChangeEvent.java index 495fd30fcb8..4b89d16245a 100644 --- a/Mage/src/mage/game/events/ZoneChangeEvent.java +++ b/Mage/src/mage/game/events/ZoneChangeEvent.java @@ -57,7 +57,7 @@ public class ZoneChangeEvent extends GameEvent { this.target = target; if (appliedEffects != null) { this.appliedEffects = appliedEffects; - }; + } } public ZoneChangeEvent(UUID targetId, UUID sourceId, UUID playerId, Zone fromZone, Zone toZone) {