Skip to content

Commit

Permalink
[ME2] Implement Goblin Ski Patrol (#13285)
Browse files Browse the repository at this point in the history
  • Loading branch information
tiera3 authored Feb 13, 2025
1 parent 815d032 commit e57098b
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 0 deletions.
71 changes: 71 additions & 0 deletions Mage.Sets/src/mage/cards/g/GoblinSkiPatrol.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
1 change: 1 addition & 0 deletions Mage.Sets/src/mage/sets/IceAge.java
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,7 @@ private IceAge() {
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));
Expand Down
1 change: 1 addition & 0 deletions Mage.Sets/src/mage/sets/MastersEditionII.java
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ private MastersEditionII() {
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));
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -15,8 +16,21 @@ public ActivateOncePerGameActivatedAbility(Effect effect, Cost cost) {
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;
}
Expand All @@ -34,6 +48,10 @@ public ActivateOncePerGameActivatedAbility copy() {
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 ");
}
Expand Down

0 comments on commit e57098b

Please sign in to comment.