diff --git a/Mage.Sets/src/mage/cards/g/GoblinSkiPatrol.java b/Mage.Sets/src/mage/cards/g/GoblinSkiPatrol.java new file mode 100644 index 00000000000..81f10212c55 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GoblinSkiPatrol.java @@ -0,0 +1,71 @@ +package mage.cards.g; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.effects.Effect; +import mage.abilities.common.ActivateOncePerGameActivatedAbility; +import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.SacrificeSourceEffect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.hint.ConditionHint; +import mage.abilities.hint.Hint; +import mage.filter.common.FilterControlledPermanent; +import mage.constants.*; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; + +/** + * + * @author tiera3 - based on PyricSalamander, ArmorOfThorns, AkroanLineBreaker, RonomSerpent, GeneralsEnforcer, MildManneredLibrarian, BlazemireVerge + */ +public final class GoblinSkiPatrol extends CardImpl { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent("a snow-covered Mountain"); + + static { + filter.add(SubType.MOUNTAIN.getPredicate()); + filter.add(SuperType.SNOW.getPredicate()); + } + + private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter); + private static final Hint hint = new ConditionHint(condition, "You control a snow-covered Mountain"); + + + public GoblinSkiPatrol(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); + + this.subtype.add(SubType.GOBLIN); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {1}{R}: Goblin Ski Patrol gets +2/+0 and gains flying. Its controller sacrifices it at the beginning of the next end step. Activate only once and only if you control a snow Mountain. + Effect effect = new BoostSourceEffect(2, 0, Duration.EndOfTurn); + effect.setText("{this} gets +2/+0"); + Ability ability = new ActivateOncePerGameActivatedAbility(effect, new ManaCostsImpl<>("{1}{R}"), condition); + effect = new GainAbilitySourceEffect(FlyingAbility.getInstance(), Duration.EndOfTurn); + effect.setText("and gains flying"); + ability.addEffect(effect); + ability.addEffect(new CreateDelayedTriggeredAbilityEffect( + new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new SacrificeSourceEffect(true)) + ).setText("Its controller sacrifices it at the beginning of the next end step.")); + this.addAbility(ability); + } + + private GoblinSkiPatrol(final GoblinSkiPatrol card) { + super(card); + } + + @Override + public GoblinSkiPatrol copy() { + return new GoblinSkiPatrol(this); + } +} diff --git a/Mage.Sets/src/mage/sets/IceAge.java b/Mage.Sets/src/mage/sets/IceAge.java index 515fc93367e..e3d4da5491c 100644 --- a/Mage.Sets/src/mage/sets/IceAge.java +++ b/Mage.Sets/src/mage/sets/IceAge.java @@ -152,6 +152,7 @@ public final class IceAge extends ExpansionSet { cards.add(new SetCardInfo("Goblin Lyre", 319, Rarity.RARE, mage.cards.g.GoblinLyre.class)); cards.add(new SetCardInfo("Goblin Mutant", 188, Rarity.UNCOMMON, mage.cards.g.GoblinMutant.class)); cards.add(new SetCardInfo("Goblin Sappers", 189, Rarity.COMMON, mage.cards.g.GoblinSappers.class)); + cards.add(new SetCardInfo("Goblin Ski Patrol", 190, Rarity.COMMON, mage.cards.g.GoblinSkiPatrol.class)); cards.add(new SetCardInfo("Goblin Snowman", 191, Rarity.UNCOMMON, mage.cards.g.GoblinSnowman.class)); cards.add(new SetCardInfo("Gorilla Pack", 247, Rarity.COMMON, mage.cards.g.GorillaPack.class)); cards.add(new SetCardInfo("Gravebind", 129, Rarity.RARE, mage.cards.g.Gravebind.class)); diff --git a/Mage.Sets/src/mage/sets/MastersEditionII.java b/Mage.Sets/src/mage/sets/MastersEditionII.java index bd1ce1f5d68..876a75df748 100644 --- a/Mage.Sets/src/mage/sets/MastersEditionII.java +++ b/Mage.Sets/src/mage/sets/MastersEditionII.java @@ -112,6 +112,7 @@ public final class MastersEditionII extends ExpansionSet { cards.add(new SetCardInfo("Giant Trap Door Spider", 195, Rarity.UNCOMMON, mage.cards.g.GiantTrapDoorSpider.class)); cards.add(new SetCardInfo("Glacial Chasm", 229, Rarity.RARE, mage.cards.g.GlacialChasm.class)); cards.add(new SetCardInfo("Glacial Crevasses", 127, Rarity.RARE, mage.cards.g.GlacialCrevasses.class)); + cards.add(new SetCardInfo("Goblin Ski Patrol", 128, Rarity.COMMON, mage.cards.g.GoblinSkiPatrol.class)); cards.add(new SetCardInfo("Gorilla Shaman", 129, Rarity.UNCOMMON, mage.cards.g.GorillaShaman.class)); cards.add(new SetCardInfo("Grandmother Sengir", 93, Rarity.RARE, mage.cards.g.GrandmotherSengir.class)); cards.add(new SetCardInfo("Gustha's Scepter", 209, Rarity.RARE, mage.cards.g.GusthasScepter.class)); diff --git a/Mage/src/main/java/mage/abilities/common/ActivateOncePerGameActivatedAbility.java b/Mage/src/main/java/mage/abilities/common/ActivateOncePerGameActivatedAbility.java index 0391eefea0a..143c54266c3 100644 --- a/Mage/src/main/java/mage/abilities/common/ActivateOncePerGameActivatedAbility.java +++ b/Mage/src/main/java/mage/abilities/common/ActivateOncePerGameActivatedAbility.java @@ -1,6 +1,7 @@ package mage.abilities.common; import mage.abilities.ActivatedAbilityImpl; +import mage.abilities.condition.Condition; import mage.abilities.costs.Cost; import mage.abilities.effects.Effect; import mage.constants.TimingRule; @@ -15,8 +16,21 @@ public class ActivateOncePerGameActivatedAbility extends ActivatedAbilityImpl { this(Zone.BATTLEFIELD, effect, cost, TimingRule.INSTANT); } + public ActivateOncePerGameActivatedAbility(Effect effect, Cost cost, Condition condition) { + this(Zone.BATTLEFIELD, effect, cost, condition, TimingRule.INSTANT); + } + + public ActivateOncePerGameActivatedAbility(Zone zone, Effect effect, Cost cost, Condition condition) { + this(zone, effect, cost, condition, TimingRule.INSTANT); + } + public ActivateOncePerGameActivatedAbility(Zone zone, Effect effect, Cost cost, TimingRule timingRule) { + this(zone, effect, cost, null, timingRule); + } + + public ActivateOncePerGameActivatedAbility(Zone zone, Effect effect, Cost cost, Condition condition, TimingRule timingRule) { super(zone, effect, cost); + this.condition = condition; this.timing = timingRule; this.maxActivationsPerGame = 1; } @@ -34,6 +48,10 @@ public class ActivateOncePerGameActivatedAbility extends ActivatedAbilityImpl { public String getRule() { StringBuilder sb = new StringBuilder(super.getRule()); sb.append(" Activate "); + if (condition != null) { + String message = condition.toString(); + sb.append("only ").append(message.startsWith("if ") || message.startsWith("during") ? message : "if " + message).append(" and "); + } if (this.timing == TimingRule.SORCERY) { sb.append("only as a sorcery and "); }