diff --git a/Mage.Sets/src/mage/cards/d/DramaticFinale.java b/Mage.Sets/src/mage/cards/d/DramaticFinale.java new file mode 100644 index 00000000000..4f962f0b312 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DramaticFinale.java @@ -0,0 +1,54 @@ +package mage.cards.d; + +import mage.abilities.common.DiesCreatureTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.permanent.TokenPredicate; +import mage.game.permanent.token.SilverquillToken; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class DramaticFinale extends CardImpl { + + private static final FilterPermanent filter + = new FilterControlledCreaturePermanent("one or more nontoken creatures you control"); + + static { + filter.add(Predicates.not(TokenPredicate.instance)); + } + + public DramaticFinale(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{W/B}{W/B}{W/B}{W/B}"); + + // Creature tokens you control get +1/+1. + this.addAbility(new SimpleStaticAbility(new BoostControlledEffect( + 1, 1, Duration.WhileOnBattlefield, StaticFilters.FILTER_CREATURE_TOKENS + ))); + + // Whenever one or more nontoken creatures you control die, create a 2/1 white and black Inkling creature token with flying. This ability triggers only once each turn. + this.addAbility(new DiesCreatureTriggeredAbility( + new CreateTokenEffect(new SilverquillToken()), false, filter + ).setTriggersOnce(true)); + } + + private DramaticFinale(final DramaticFinale card) { + super(card); + } + + @Override + public DramaticFinale copy() { + return new DramaticFinale(this); + } +} diff --git a/Mage.Sets/src/mage/cards/e/ElvishWarmaster.java b/Mage.Sets/src/mage/cards/e/ElvishWarmaster.java index 24a82184753..547a38b6747 100644 --- a/Mage.Sets/src/mage/cards/e/ElvishWarmaster.java +++ b/Mage.Sets/src/mage/cards/e/ElvishWarmaster.java @@ -5,7 +5,6 @@ import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.continuous.BoostControlledEffect; import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; @@ -18,10 +17,7 @@ import mage.constants.SubType; import mage.filter.FilterPermanent; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.AnotherPredicate; -import mage.game.Game; -import mage.game.events.GameEvent; import mage.game.permanent.token.ElfWarriorToken; -import mage.util.CardUtil; import java.util.UUID; @@ -46,7 +42,9 @@ public final class ElvishWarmaster extends CardImpl { this.toughness = new MageInt(2); // Whenever one or more other Elves enters the battlefield under your control, create a 1/1 green Elf Warrior creature token. This ability triggers only once each turn. - this.addAbility(new ElvishWarmasterTriggeredAbility(new CreateTokenEffect(new ElfWarriorToken()), filter)); + this.addAbility(new EntersBattlefieldControlledTriggeredAbility( + new CreateTokenEffect(new ElfWarriorToken()), filter + ).setTriggersOnce(true)); // {5}{G}{G}: Elves you control get +2/+2 and gain deathtouch until end of turn. Ability ability = new SimpleActivatedAbility(new BoostControlledEffect( @@ -67,42 +65,3 @@ public final class ElvishWarmaster extends CardImpl { return new ElvishWarmaster(this); } } - -class ElvishWarmasterTriggeredAbility extends EntersBattlefieldControlledTriggeredAbility { - - public ElvishWarmasterTriggeredAbility(Effect effect, FilterPermanent filter) { - super(effect, filter); - } - - public ElvishWarmasterTriggeredAbility(final ElvishWarmasterTriggeredAbility ability) { - super(ability); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - Integer lastTurnTriggered = (Integer) game.getState() - .getValue(CardUtil.getCardZoneString("lastTurnTriggered" + originalId, sourceId, game)); - if (lastTurnTriggered != null && lastTurnTriggered == game.getTurnNum()) { - return false; - } - return super.checkTrigger(event, game); - } - - @Override - public void trigger(Game game, UUID controllerId) { - game.getState().setValue(CardUtil - .getCardZoneString("lastTurnTriggered" + originalId, sourceId, game), game.getTurnNum()); - super.trigger(game, controllerId); - } - - @Override - public String getRule() { - return "Whenever one or more other Elves enter the battlefield under your control, " + - "create a 1/1 green Elf Warrior creature token. This ability triggers only once each turn."; - } - - @Override - public ElvishWarmasterTriggeredAbility copy() { - return new ElvishWarmasterTriggeredAbility(this); - } -} diff --git a/Mage.Sets/src/mage/cards/s/StonebindersFamiliar.java b/Mage.Sets/src/mage/cards/s/StonebindersFamiliar.java index da6f357118f..ba7c4f80108 100644 --- a/Mage.Sets/src/mage/cards/s/StonebindersFamiliar.java +++ b/Mage.Sets/src/mage/cards/s/StonebindersFamiliar.java @@ -13,9 +13,7 @@ import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.ZoneChangeEvent; import mage.game.permanent.PermanentToken; -import mage.util.CardUtil; -import java.util.Objects; import java.util.UUID; /** @@ -49,6 +47,7 @@ class StonebindersFamiliarTriggeredAbility extends TriggeredAbilityImpl { StonebindersFamiliarTriggeredAbility() { super(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.P1P1.createInstance())); + this.setTriggersOnce(true); } private StonebindersFamiliarTriggeredAbility(final StonebindersFamiliarTriggeredAbility ability) { @@ -62,11 +61,6 @@ class StonebindersFamiliarTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { - if (Objects.equals(game.getState().getValue( - CardUtil.getCardZoneString("lastTurnTriggered" + originalId, sourceId, game) - ), game.getTurnNum())) { - return false; - } ZoneChangeEvent zEvent = ((ZoneChangeEvent) event); return zEvent.getToZone() == Zone.EXILED && isControlledBy(game.getActivePlayerId()) @@ -74,14 +68,6 @@ class StonebindersFamiliarTriggeredAbility extends TriggeredAbilityImpl { || !(zEvent.getTarget() instanceof PermanentToken)); } - @Override - public void trigger(Game game, UUID controllerId) { - game.getState().setValue(CardUtil.getCardZoneString( - "lastTurnTriggered" + originalId, sourceId, game - ), game.getTurnNum()); - super.trigger(game, controllerId); - } - @Override public String getRule() { return "Whenever one or more cards are put into exile during your turn, " + diff --git a/Mage.Sets/src/mage/sets/StrixhavenSchoolOfMages.java b/Mage.Sets/src/mage/sets/StrixhavenSchoolOfMages.java index 8d60e861713..75e6ef0acd1 100644 --- a/Mage.Sets/src/mage/sets/StrixhavenSchoolOfMages.java +++ b/Mage.Sets/src/mage/sets/StrixhavenSchoolOfMages.java @@ -82,6 +82,7 @@ public final class StrixhavenSchoolOfMages extends ExpansionSet { cards.add(new SetCardInfo("Divide by Zero", 41, Rarity.UNCOMMON, mage.cards.d.DivideByZero.class)); cards.add(new SetCardInfo("Double Major", 179, Rarity.RARE, mage.cards.d.DoubleMajor.class)); cards.add(new SetCardInfo("Dragonsguard Elite", 127, Rarity.RARE, mage.cards.d.DragonsguardElite.class)); + cards.add(new SetCardInfo("Dramatic Finale", 180, Rarity.RARE, mage.cards.d.DramaticFinale.class)); cards.add(new SetCardInfo("Dream Strix", 42, Rarity.RARE, mage.cards.d.DreamStrix.class)); cards.add(new SetCardInfo("Dueling Coach", 15, Rarity.UNCOMMON, mage.cards.d.DuelingCoach.class)); cards.add(new SetCardInfo("Eager First-Year", 16, Rarity.COMMON, mage.cards.e.EagerFirstYear.class)); diff --git a/Mage/src/main/java/mage/abilities/TriggeredAbilities.java b/Mage/src/main/java/mage/abilities/TriggeredAbilities.java index cd1517868fc..af43a673d9e 100644 --- a/Mage/src/main/java/mage/abilities/TriggeredAbilities.java +++ b/Mage/src/main/java/mage/abilities/TriggeredAbilities.java @@ -2,8 +2,6 @@ package mage.abilities; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; import mage.MageObject; import mage.constants.Zone; import mage.game.Game; @@ -13,6 +11,9 @@ import mage.game.permanent.Permanent; import mage.game.stack.Spell; import org.apache.log4j.Logger; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + /** * @author BetaSteward_at_googlemail.com *

@@ -39,7 +40,7 @@ public class TriggeredAbilities extends ConcurrentHashMap it = this.values().iterator(); it.hasNext();) { + for (Iterator it = this.values().iterator(); it.hasNext(); ) { TriggeredAbility ability = it.next(); if (ability instanceof StateTriggeredAbility && ((StateTriggeredAbility) ability).canTrigger(game)) { checkTrigger(ability, null, game); @@ -48,7 +49,7 @@ public class TriggeredAbilities extends ConcurrentHashMap it = this.values().iterator(); it.hasNext();) { + for (Iterator it = this.values().iterator(); it.hasNext(); ) { TriggeredAbility ability = it.next(); if (ability.checkEventType(event, game)) { checkTrigger(ability, event, game); @@ -90,7 +91,7 @@ public class TriggeredAbilities extends ConcurrentHashMap