diff --git a/Mage.Sets/src/mage/cards/c/ChanceEncounter.java b/Mage.Sets/src/mage/cards/c/ChanceEncounter.java index 547ec691c43..856140a4c0f 100644 --- a/Mage.Sets/src/mage/cards/c/ChanceEncounter.java +++ b/Mage.Sets/src/mage/cards/c/ChanceEncounter.java @@ -1,21 +1,15 @@ - package mage.cards.c; -import mage.abilities.TriggeredAbility; -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.WonCoinFlipControllerTriggeredAbility; +import mage.abilities.condition.Condition; import mage.abilities.condition.common.SourceHasCounterCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.WinGameSourceControllerEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Zone; import mage.counters.CounterType; -import mage.game.Game; -import mage.game.events.CoinFlippedEvent; -import mage.game.events.GameEvent; import java.util.UUID; @@ -24,16 +18,18 @@ import java.util.UUID; */ public final class ChanceEncounter extends CardImpl { + private static final Condition condition = new SourceHasCounterCondition(CounterType.LUCK, 10); + public ChanceEncounter(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}{R}"); // Whenever you win a coin flip, put a luck counter on Chance Encounter. - this.addAbility(new ChanceEncounterTriggeredAbility()); + this.addAbility(new WonCoinFlipControllerTriggeredAbility( + new AddCountersSourceEffect(CounterType.LUCK.createInstance()) + )); // At the beginning of your upkeep, if Chance Encounter has ten or more luck counters on it, you win the game. - TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(new WinGameSourceControllerEffect()); - this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, new SourceHasCounterCondition(CounterType.LUCK, 10, Integer.MAX_VALUE), - "At the beginning of your upkeep, if {this} has ten or more luck counters on it, you win the game.")); + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new WinGameSourceControllerEffect()).withInterveningIf(condition)); } private ChanceEncounter(final ChanceEncounter card) { @@ -45,33 +41,3 @@ public final class ChanceEncounter extends CardImpl { return new ChanceEncounter(this); } } - -class ChanceEncounterTriggeredAbility extends TriggeredAbilityImpl { - - ChanceEncounterTriggeredAbility() { - super(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.LUCK.createInstance()), false); - setTriggerPhrase("Whenever you win a coin flip, "); - } - - private ChanceEncounterTriggeredAbility(final ChanceEncounterTriggeredAbility ability) { - super(ability); - } - - @Override - public ChanceEncounterTriggeredAbility copy() { - return new ChanceEncounterTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.COIN_FLIPPED; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - CoinFlippedEvent flipEvent = (CoinFlippedEvent) event; - return flipEvent.getPlayerId().equals(controllerId) - && flipEvent.isWinnable() - && (flipEvent.getChosen() == flipEvent.getResult()); - } -} diff --git a/Mage.Sets/src/mage/cards/k/KarplusanMinotaur.java b/Mage.Sets/src/mage/cards/k/KarplusanMinotaur.java index 36ffdbc9158..f99c473102d 100644 --- a/Mage.Sets/src/mage/cards/k/KarplusanMinotaur.java +++ b/Mage.Sets/src/mage/cards/k/KarplusanMinotaur.java @@ -1,9 +1,9 @@ - package mage.cards.k; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.WonCoinFlipControllerTriggeredAbility; import mage.abilities.costs.Cost; import mage.abilities.costs.CostImpl; import mage.abilities.effects.common.DamageTargetEffect; @@ -41,7 +41,9 @@ public final class KarplusanMinotaur extends CardImpl { this.addAbility(new CumulativeUpkeepAbility(new KarplusanMinotaurCost())); // Whenever you win a coin flip, Karplusan Minotaur deals 1 damage to any target. - this.addAbility(new KarplusanMinotaurFlipWinTriggeredAbility()); + Ability ability = new WonCoinFlipControllerTriggeredAbility(new DamageTargetEffect(1)); + ability.addTarget(new TargetAnyTarget()); + this.addAbility(ability); // Whenever you lose a coin flip, Karplusan Minotaur deals 1 damage to any target of an opponent's choice. this.addAbility(new KarplusanMinotaurFlipLoseTriggeredAbility()); @@ -57,41 +59,6 @@ public final class KarplusanMinotaur extends CardImpl { } } -class KarplusanMinotaurFlipWinTriggeredAbility extends TriggeredAbilityImpl { - - public KarplusanMinotaurFlipWinTriggeredAbility() { - super(Zone.BATTLEFIELD, new DamageTargetEffect(1), false); - this.addTarget(new TargetAnyTarget()); - } - - private KarplusanMinotaurFlipWinTriggeredAbility(final KarplusanMinotaurFlipWinTriggeredAbility ability) { - super(ability); - } - - @Override - public KarplusanMinotaurFlipWinTriggeredAbility copy() { - return new KarplusanMinotaurFlipWinTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.COIN_FLIPPED; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - CoinFlippedEvent flipEvent = (CoinFlippedEvent) event; - return flipEvent.getPlayerId().equals(controllerId) - && flipEvent.isWinnable() - && (flipEvent.getChosen() == flipEvent.getResult()); - } - - @Override - public String getRule() { - return "Whenever you win a coin flip, {this} deals 1 damage to any target."; - } -} - class KarplusanMinotaurFlipLoseTriggeredAbility extends TriggeredAbilityImpl { public KarplusanMinotaurFlipLoseTriggeredAbility() { @@ -117,9 +84,7 @@ class KarplusanMinotaurFlipLoseTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { CoinFlippedEvent flipEvent = (CoinFlippedEvent) event; - return flipEvent.getPlayerId().equals(controllerId) - && flipEvent.isWinnable() - && (flipEvent.getChosen() != flipEvent.getResult()); + return isControlledBy(event.getPlayerId()) && flipEvent.isWinnable() && !flipEvent.wasWon(); } @Override diff --git a/Mage.Sets/src/mage/cards/s/SetzerWanderingGambler.java b/Mage.Sets/src/mage/cards/s/SetzerWanderingGambler.java new file mode 100644 index 00000000000..e16db94ae8e --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SetzerWanderingGambler.java @@ -0,0 +1,61 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.common.DealsDamageToAPlayerAllTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.WonCoinFlipControllerTriggeredAbility; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.FlipCoinEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SetTargetPointer; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.game.permanent.token.TheBlackjackToken; +import mage.game.permanent.token.TreasureToken; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class SetzerWanderingGambler extends CardImpl { + + private static final FilterPermanent filter = new FilterControlledPermanent(SubType.VEHICLE); + + public SetzerWanderingGambler(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{R}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.ROGUE); + this.subtype.add(SubType.PILOT); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // When Setzer enters, create The Blackjack, a legendary 3/3 colorless Vehicle artifact token with flying and crew 2. + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new TheBlackjackToken()))); + + // Whenever a Vehicle you control deals combat damage to a player, flip a coin. + this.addAbility(new DealsDamageToAPlayerAllTriggeredAbility( + new FlipCoinEffect(), filter, false, SetTargetPointer.NONE, true + )); + + // Whenever you win a coin flip, create two tapped Treasure tokens. + this.addAbility(new WonCoinFlipControllerTriggeredAbility( + new CreateTokenEffect(new TreasureToken(), 2, true) + )); + } + + private SetzerWanderingGambler(final SetzerWanderingGambler card) { + super(card); + } + + @Override + public SetzerWanderingGambler copy() { + return new SetzerWanderingGambler(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/TavernScoundrel.java b/Mage.Sets/src/mage/cards/t/TavernScoundrel.java index cb37ed04daf..d60a97629f8 100644 --- a/Mage.Sets/src/mage/cards/t/TavernScoundrel.java +++ b/Mage.Sets/src/mage/cards/t/TavernScoundrel.java @@ -2,8 +2,8 @@ package mage.cards.t; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.WonCoinFlipControllerTriggeredAbility; import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; @@ -13,14 +13,9 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.Zone; import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.mageobject.AnotherPredicate; -import mage.game.Game; -import mage.game.events.CoinFlippedEvent; -import mage.game.events.GameEvent; import mage.game.permanent.token.TreasureToken; -import mage.target.common.TargetControlledPermanent; import java.util.UUID; @@ -44,7 +39,7 @@ public final class TavernScoundrel extends CardImpl { this.toughness = new MageInt(3); // Whenever you win a coin flip, create two Treasure tokens. - this.addAbility(new TavernScoundrelTriggeredAbility()); + this.addAbility(new WonCoinFlipControllerTriggeredAbility(new CreateTokenEffect(new TreasureToken(), 2))); // {1}, {T}, Sacrifice another permanent: Flip a coin. Ability ability = new SimpleActivatedAbility(new FlipCoinEffect(), new GenericManaCost(1)); @@ -62,37 +57,3 @@ public final class TavernScoundrel extends CardImpl { return new TavernScoundrel(this); } } - -class TavernScoundrelTriggeredAbility extends TriggeredAbilityImpl { - - TavernScoundrelTriggeredAbility() { - super(Zone.BATTLEFIELD, new CreateTokenEffect(new TreasureToken(), 2), false); - } - - private TavernScoundrelTriggeredAbility(final TavernScoundrelTriggeredAbility ability) { - super(ability); - } - - @Override - public TavernScoundrelTriggeredAbility copy() { - return new TavernScoundrelTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.COIN_FLIPPED; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - CoinFlippedEvent flipEvent = (CoinFlippedEvent) event; - return isControlledBy(event.getPlayerId()) - && flipEvent.isWinnable() - && flipEvent.wasWon(); - } - - @Override - public String getRule() { - return "Whenever you win a coin flip, create two Treasure tokens."; - } -} diff --git a/Mage.Sets/src/mage/sets/FinalFantasyCommander.java b/Mage.Sets/src/mage/sets/FinalFantasyCommander.java index 6f0b6703667..0ae3600156b 100644 --- a/Mage.Sets/src/mage/sets/FinalFantasyCommander.java +++ b/Mage.Sets/src/mage/sets/FinalFantasyCommander.java @@ -203,6 +203,7 @@ public final class FinalFantasyCommander extends ExpansionSet { cards.add(new SetCardInfo("Sephiroth, Fallen Hero", 182, Rarity.RARE, mage.cards.s.SephirothFallenHero.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sephiroth, Fallen Hero", 92, Rarity.RARE, mage.cards.s.SephirothFallenHero.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sepulchral Primordial", 284, Rarity.RARE, mage.cards.s.SepulchralPrimordial.class)); + cards.add(new SetCardInfo("Setzer, Wandering Gambler", 93, Rarity.RARE, mage.cards.s.SetzerWanderingGambler.class)); cards.add(new SetCardInfo("Shadowblood Ridge", 421, Rarity.RARE, mage.cards.s.ShadowbloodRidge.class)); cards.add(new SetCardInfo("Shineshadow Snarl", 422, Rarity.RARE, mage.cards.s.ShineshadowSnarl.class)); cards.add(new SetCardInfo("Skullclamp", 355, Rarity.UNCOMMON, mage.cards.s.Skullclamp.class)); diff --git a/Mage/src/main/java/mage/abilities/common/WonCoinFlipControllerTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/WonCoinFlipControllerTriggeredAbility.java new file mode 100644 index 00000000000..2510d4f8c4e --- /dev/null +++ b/Mage/src/main/java/mage/abilities/common/WonCoinFlipControllerTriggeredAbility.java @@ -0,0 +1,46 @@ +package mage.abilities.common; + +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.Effect; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.CoinFlippedEvent; +import mage.game.events.GameEvent; + +/** + * @author TheElk801 + */ +public class WonCoinFlipControllerTriggeredAbility extends TriggeredAbilityImpl { + + public WonCoinFlipControllerTriggeredAbility(Effect effect) { + this(effect, false); + } + + public WonCoinFlipControllerTriggeredAbility(Effect effect, boolean optional) { + this(Zone.BATTLEFIELD, effect, optional); + } + + public WonCoinFlipControllerTriggeredAbility(Zone zone, Effect effect, boolean optional) { + super(zone, effect, optional); + } + + private WonCoinFlipControllerTriggeredAbility(final WonCoinFlipControllerTriggeredAbility ability) { + super(ability); + } + + @Override + public WonCoinFlipControllerTriggeredAbility copy() { + return new WonCoinFlipControllerTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.COIN_FLIPPED; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + CoinFlippedEvent flipEvent = (CoinFlippedEvent) event; + return isControlledBy(event.getPlayerId()) && flipEvent.isWinnable() && flipEvent.wasWon(); + } +} diff --git a/Mage/src/main/java/mage/game/permanent/token/TheBlackjackToken.java b/Mage/src/main/java/mage/game/permanent/token/TheBlackjackToken.java new file mode 100644 index 00000000000..cd0c2212c73 --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/TheBlackjackToken.java @@ -0,0 +1,34 @@ +package mage.game.permanent.token; + +import mage.MageInt; +import mage.abilities.keyword.CrewAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SuperType; + +/** + * @author TheElk801 + */ +public final class TheBlackjackToken extends TokenImpl { + + public TheBlackjackToken() { + super("The Blackjack", "The Blackjack, a legendary 3/3 colorless Vehicle artifact token with flying and crew 2"); + supertype.add(SuperType.LEGENDARY); + cardType.add(CardType.ARTIFACT); + subtype.add(SubType.VEHICLE); + power = new MageInt(3); + toughness = new MageInt(3); + + this.addAbility(FlyingAbility.getInstance()); + this.addAbility(new CrewAbility(2)); + } + + private TheBlackjackToken(final TheBlackjackToken token) { + super(token); + } + + public TheBlackjackToken copy() { + return new TheBlackjackToken(this); + } +}