Create common implementation for predefined tokens (#11065)

* adds token abilities

* updated cards to use new abilities
This commit is contained in:
Vivian Greenslade 2023-08-29 21:58:21 -02:30 committed by GitHub
parent d67539746e
commit 2cd8bc6f6c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
19 changed files with 112 additions and 134 deletions

View file

@ -3,12 +3,9 @@ package mage.cards.a;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.token.ClueAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.choices.Choice;
@ -16,7 +13,6 @@ import mage.choices.ChoiceImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.filter.StaticFilters;
import mage.game.Game;
@ -51,9 +47,7 @@ public class AgentsToolkit extends CardImpl {
));
// {2}, Sacrifice Agents Toolkit: Draw a card.
Ability drawAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), new GenericManaCost(2));
drawAbility.addCost(new SacrificeSourceCost());
this.addAbility(drawAbility);
this.addAbility(new ClueAbility(true));
}
private AgentsToolkit(final AgentsToolkit card) {

View file

@ -8,7 +8,7 @@ import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.mana.AnyColorManaAbility;
import mage.abilities.token.TreasureAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@ -31,12 +31,10 @@ public final class CouriersBriefcase extends CardImpl {
this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new CitizenGreenWhiteToken())));
// {T}, Sacrifice Courier's Briefcase: Add one mana of any color.
Ability ability = new AnyColorManaAbility();
ability.addCost(new SacrificeSourceCost());
this.addAbility(ability);
this.addAbility(new TreasureAbility(true));
// {W}{U}{B}{R}{G}, {T}, Sacrifice Courier's Briefcase: Draw three cards.
ability = new SimpleActivatedAbility(
Ability ability = new SimpleActivatedAbility(
new DrawCardSourceControllerEffect(3), new ManaCostsImpl<>("{W}{U}{B}{R}{G}")
);
ability.addCost(new TapSourceCost());

View file

@ -1,12 +1,10 @@
package mage.cards.d;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect;
import mage.abilities.keyword.FlashAbility;
import mage.abilities.mana.AnyColorManaAbility;
import mage.abilities.token.TreasureAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@ -30,9 +28,7 @@ public final class DireMimic extends CardImpl {
this.addAbility(FlashAbility.getInstance());
// {T}, Sacrifice Dire Mimic: Add one mana of any color.
Ability ability = new AnyColorManaAbility();
ability.addCost(new SacrificeSourceCost());
this.addAbility(ability);
this.addAbility(new TreasureAbility(true));
// {3}: Dire Mimic becomes a Shapeshifter artifact creature with base power and toughness 5/5 until end of turn.
this.addAbility(new SimpleActivatedAbility(new BecomesCreatureSourceEffect(

View file

@ -6,12 +6,12 @@ import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.LoseLifeTargetEffect;
import mage.abilities.effects.common.UntapTargetEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.effects.common.continuous.GainControlTargetEffect;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.token.FoodAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@ -42,10 +42,7 @@ public final class EriettesTemptingApple extends CardImpl {
this.addAbility(ability);
// {2}, {T}, Sacrifice Eriette's Tempting Apple: You gain 3 life.
ability = new SimpleActivatedAbility(new GainLifeEffect(3), new GenericManaCost(2));
ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeSourceCost());
this.addAbility(ability);
this.addAbility(new FoodAbility(true));
// {2}, {T}, Sacrifice Eriette's Tempting Apple: Target opponent loses 3 life.
ability = new SimpleActivatedAbility(new LoseLifeTargetEffect(3), new GenericManaCost(2));

View file

@ -1,14 +1,11 @@
package mage.cards.g;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.token.FoodAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@ -49,10 +46,7 @@ public final class Gingerbrute extends CardImpl {
));
// {2}, {T}, Sacrifice Gingerbrute: You gain 3 life.
Ability ability = new SimpleActivatedAbility(new GainLifeEffect(3), new GenericManaCost(2));
ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeSourceCost());
this.addAbility(ability);
this.addAbility(new FoodAbility(true));
}
private Gingerbrute(final Gingerbrute card) {

View file

@ -2,20 +2,16 @@ package mage.cards.g;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.mana.AnyColorManaAbility;
import mage.abilities.token.FoodAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
import java.util.UUID;
/**
@ -38,10 +34,7 @@ public final class GoldenEgg extends CardImpl {
this.addAbility(ability);
// {2}, {T}, Sacrifice Golden Egg: You gain 3 life.
Ability ability1 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainLifeEffect(3), new ManaCostsImpl<>("{2}"));
ability1.addCost(new TapSourceCost());
ability1.addCost(new SacrificeSourceCost());
this.addAbility(ability1);
this.addAbility(new FoodAbility(true));
}
private GoldenEgg(final GoldenEgg card) {

View file

@ -2,12 +2,9 @@
package mage.cards.g;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.keyword.FirstStrikeAbility;
import mage.abilities.keyword.MenaceAbility;
import mage.abilities.mana.AnyColorManaAbility;
import mage.abilities.mana.GreenManaAbility;
import mage.abilities.token.TreasureAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@ -36,9 +33,7 @@ public final class Goldhound extends CardImpl {
this.addAbility(new MenaceAbility(true));
// {T}, Sacrifice Goldhound: Add one mana of any color.
Ability ability = new AnyColorManaAbility();
ability.addCost(new SacrificeSourceCost());
this.addAbility(ability);
this.addAbility(new TreasureAbility(true));
}
private Goldhound(final Goldhound card) {

View file

@ -1,19 +1,18 @@
package mage.cards.i;
import java.util.HashMap;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.token.ClueAbility;
import mage.constants.SubType;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@ -21,7 +20,6 @@ import mage.constants.CardType;
import mage.counters.CounterType;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
/**
@ -48,9 +46,7 @@ public final class InvestigatorsJournal extends CardImpl {
this.addAbility(ability);
// {2}, Sacrifice Investigator's Journal: Draw a card.
ability = new SimpleActivatedAbility(new DrawCardSourceControllerEffect(1), new GenericManaCost(2));
ability.addCost(new SacrificeSourceCost());
this.addAbility(ability);
this.addAbility(new ClueAbility(true));
}
private InvestigatorsJournal(final InvestigatorsJournal card) {

View file

@ -3,14 +3,10 @@ package mage.cards.l;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.ShuffleIntoLibrarySourceEffect;
import mage.abilities.effects.keyword.ScryEffect;
import mage.abilities.token.FoodAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@ -34,10 +30,7 @@ public final class Lembas extends CardImpl {
this.addAbility(ability);
// {2}, {T}, Sacrifice Lembas: You gain 3 life.
ability = new SimpleActivatedAbility(new GainLifeEffect(3), new GenericManaCost(2));
ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeSourceCost());
this.addAbility(ability);
this.addAbility(new FoodAbility(true));
// When Lembas is put into a graveyard from the battlefield, its owner shuffles it into their library.
this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(

View file

@ -1,11 +1,9 @@
package mage.cards.m;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect;
import mage.abilities.mana.AnyColorManaAbility;
import mage.abilities.token.TreasureAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@ -26,9 +24,7 @@ public final class Mimic extends CardImpl {
this.subtype.add(SubType.TREASURE);
// {T}, Sacrifice Mimic: Add one mana of any color.
Ability ability = new AnyColorManaAbility();
ability.addCost(new SacrificeSourceCost());
this.addAbility(ability);
this.addAbility(new TreasureAbility(true));
// {2}: Mimic becomes a Shapeshifter artifact creature with base power and toughness 3/3 until end of turn.
this.addAbility(new SimpleActivatedAbility(new BecomesCreatureSourceEffect(

View file

@ -1,11 +1,7 @@
package mage.cards.p;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.token.ClueAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@ -27,11 +23,7 @@ public final class ParcelMyr extends CardImpl {
this.toughness = new MageInt(1);
// {2}, Sacrifice Parcel Myr: Draw a card
Ability ability = new SimpleActivatedAbility(
new DrawCardSourceControllerEffect(1), new GenericManaCost(2)
);
ability.addCost(new SacrificeSourceCost());
this.addAbility(ability);
this.addAbility(new ClueAbility(true));
}
private ParcelMyr(final ParcelMyr card) {

View file

@ -4,19 +4,15 @@ import mage.MageInt;
import mage.MageObjectReference;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateTokenCopyTargetEffect;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.keyword.DeathtouchAbility;
import mage.abilities.keyword.WardAbility;
import mage.abilities.token.FoodAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
@ -225,12 +221,7 @@ class ShelobChildOfUngoliantEffect extends OneShotEffect {
token.addSubType(SubType.FOOD);
// {2}, {T}, Sacrifice this artifact: You gain 3 life.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainLifeEffect(3), new GenericManaCost(2));
ability.addCost(new TapSourceCost());
SacrificeSourceCost cost = new SacrificeSourceCost();
cost.setText("Sacrifice this artifact");
ability.addCost(cost);
token.addAbility(ability);
token.addAbility(new FoodAbility(false));
}).apply(game, source);
}
}

View file

@ -4,14 +4,11 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.continuous.AddCardTypeTargetEffect;
import mage.abilities.effects.common.continuous.SetBasePowerToughnessTargetEffect;
import mage.abilities.token.FoodAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@ -59,10 +56,7 @@ public final class ToughCookie extends CardImpl {
this.addAbility(ability);
// {2}, {T}, Sacrifice Tough Cookie: You gain 3 life.
ability = new SimpleActivatedAbility(new GainLifeEffect(3), new GenericManaCost(2));
ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeSourceCost());
this.addAbility(ability);
this.addAbility(new FoodAbility(true));
}
private ToughCookie(final ToughCookie card) {

View file

@ -0,0 +1,25 @@
package mage.abilities.token;
import mage.abilities.ActivatedAbilityImpl;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.constants.Zone;
public class ClueAbility extends ActivatedAbilityImpl {
public ClueAbility(boolean named) {
super(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), new GenericManaCost(2));
// {2}, Sacrifice this artifact: You draw a card.
this.addCost(new SacrificeSourceCost().setText("sacrifice " + (named ? "{this}" : "this artifact")));
}
private ClueAbility(final ClueAbility ability) {
super(ability);
}
@Override
public ClueAbility copy() {
return new ClueAbility(this);
}
}

View file

@ -0,0 +1,28 @@
package mage.abilities.token;
import mage.abilities.ActivatedAbilityImpl;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.GainLifeEffect;
import mage.constants.Zone;
public class FoodAbility extends ActivatedAbilityImpl {
public FoodAbility(boolean named) {
super(Zone.BATTLEFIELD, new GainLifeEffect(3), new GenericManaCost(2));
// {2}, {T}, Sacrifice this artifact: You gain 3 life.
this.addCost(new TapSourceCost());
this.addCost(new SacrificeSourceCost().setText("sacrifice " + (named ? "{this}" : "this artifact")));
}
private FoodAbility(final FoodAbility ability) {
super(ability);
}
@Override
public FoodAbility copy() {
return new FoodAbility(this);
}
}

View file

@ -0,0 +1,25 @@
package mage.abilities.token;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.mana.AddManaOfAnyColorEffect;
import mage.abilities.mana.ActivatedManaAbilityImpl;
import mage.constants.Zone;
public class TreasureAbility extends ActivatedManaAbilityImpl {
public TreasureAbility(boolean named) {
super(Zone.BATTLEFIELD, new AddManaOfAnyColorEffect(), new TapSourceCost());
this.addCost(new SacrificeSourceCost().setText("sacrifice " + (named ? "{this}" : "this artifact")));
}
private TreasureAbility(final TreasureAbility ability) {
super(ability);
}
@Override
public TreasureAbility copy() {
return new TreasureAbility(this);
}
}

View file

@ -1,13 +1,8 @@
package mage.game.permanent.token;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.token.ClueAbility;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
/**
*
@ -15,16 +10,12 @@ import mage.constants.Zone;
public final class ClueArtifactToken extends TokenImpl {
public ClueArtifactToken() {
super("Clue Token", "colorless Clue artifact token with \"{2}, Sacrifice this artifact: Draw a card.\"");
super("Clue Token", "Clue token");
cardType.add(CardType.ARTIFACT);
subtype.add(SubType.CLUE);
// {2}, Sacrifice this artifact: Draw a card.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), new GenericManaCost(2));
SacrificeSourceCost cost = new SacrificeSourceCost();
cost.setText("Sacrifice this artifact");
ability.addCost(cost);
this.addAbility(ability);
this.addAbility(new ClueAbility(false));
}
protected ClueArtifactToken(final ClueArtifactToken token) {

View file

@ -1,14 +1,8 @@
package mage.game.permanent.token;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.token.FoodAbility;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
/**
* @author jmharmon
@ -21,13 +15,7 @@ public final class FoodToken extends TokenImpl {
cardType.add(CardType.ARTIFACT);
subtype.add(SubType.FOOD);
// {2}, {T}, Sacrifice this artifact: You gain 3 life.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainLifeEffect(3), new GenericManaCost(2));
ability.addCost(new TapSourceCost());
SacrificeSourceCost cost = new SacrificeSourceCost();
cost.setText("Sacrifice this artifact");
ability.addCost(cost);
this.addAbility(ability);
this.addAbility(new FoodAbility(false));
}
protected FoodToken(final FoodToken token) {

View file

@ -1,13 +1,8 @@
package mage.game.permanent.token;
import mage.abilities.Ability;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.mana.AddManaOfAnyColorEffect;
import mage.abilities.mana.SimpleManaAbility;
import mage.abilities.token.TreasureAbility;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
/**
* @author TheElk801
@ -19,10 +14,7 @@ public final class TreasureToken extends TokenImpl {
cardType.add(CardType.ARTIFACT);
subtype.add(SubType.TREASURE);
// {T}, Sacrifice this artifact: Add one mana of any color.
Ability ability = new SimpleManaAbility(Zone.BATTLEFIELD, new AddManaOfAnyColorEffect(), new TapSourceCost());
ability.addCost(new SacrificeSourceCost().setText("sacrifice this artifact"));
this.addAbility(ability);
this.addAbility(new TreasureAbility(false));
}
protected TreasureToken(final TreasureToken token) {