[LTC] Implement Banquet Guests (#10706)

* make a StaticFilter for "a food"

* [LTC] Implement Banquet Guests

Made a Static Filters for controlled food, with the next eldraine set we'll certaintly see more of that.

* future proof static text for mulitplier > 2
This commit is contained in:
Susucre 2023-07-31 01:26:26 +02:00 committed by GitHub
parent 53b270fc36
commit fbc0cd61dd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 122 additions and 47 deletions

View file

@ -0,0 +1,78 @@
package mage.cards.b;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.AffinityEffect;
import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.hint.Hint;
import mage.abilities.hint.ValueHint;
import mage.abilities.keyword.IndestructibleAbility;
import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.filter.StaticFilters;
import mage.target.common.TargetControlledPermanent;
import java.util.UUID;
/**
* @author Susucr
*/
public final class BanquetGuests extends CardImpl {
private static final Hint hint = new ValueHint("Food you control", new PermanentsOnBattlefieldCount(StaticFilters.FILTER_CONTROLLED_FOOD));
public BanquetGuests(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{X}{G}{W}");
this.subtype.add(SubType.HALFLING);
this.subtype.add(SubType.CITIZEN);
this.power = new MageInt(0);
this.toughness = new MageInt(0);
// Affinity for Food
this.addAbility(
new SimpleStaticAbility(
Zone.ALL,
new AffinityEffect(StaticFilters.FILTER_CONTROLLED_FOOD)
).addHint(hint)
);
// Trample
this.addAbility(TrampleAbility.getInstance());
// Banquet Guests enters the battlefield with twice X +1/+1 counters on it.
this.addAbility(new EntersBattlefieldAbility(
new EntersBattlefieldWithXCountersEffect(CounterType.P1P1.createInstance(), 2)
));
// {2}, Sacrifice a Food: Banquet Guests gains indestructible until end of turn.
Ability ability = new SimpleActivatedAbility(
new GainAbilitySourceEffect(IndestructibleAbility.getInstance(), Duration.EndOfTurn),
new GenericManaCost(2)
);
ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_FOOD)));
this.addAbility(ability);
}
private BanquetGuests(final BanquetGuests card) {
super(card);
}
@Override
public BanquetGuests copy() {
return new BanquetGuests(this);
}
}

View file

@ -30,8 +30,6 @@ import mage.target.common.TargetControlledPermanent;
*/
public final class BillThePony extends CardImpl {
private static final FilterControlledPermanent foodFilter = new FilterControlledPermanent(SubType.FOOD, "a Food");;
public BillThePony(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}");
@ -46,7 +44,7 @@ public final class BillThePony extends CardImpl {
// Sacrifice a Food: Until end of turn, target creature you control assigns combat damage equal to its toughness rather than its power.
Ability ability = new SimpleActivatedAbility(
new BillThePonyEffect(),
new SacrificeTargetCost(new TargetControlledPermanent(foodFilter))
new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_FOOD))
);
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_CONTROLLED_CREATURE));

View file

@ -12,7 +12,7 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.StaticFilters;
import mage.target.common.TargetControlledPermanent;
import mage.target.common.TargetCreaturePermanent;
@ -23,8 +23,6 @@ import java.util.UUID;
*/
public final class BogNaughty extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent(SubType.FOOD, "a Food");
public BogNaughty(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{B}");
@ -39,7 +37,7 @@ public final class BogNaughty extends CardImpl {
Ability ability = new SimpleActivatedAbility(
new BoostTargetEffect(-3, -3, Duration.EndOfTurn), new ManaCostsImpl<>("{2}{B}")
);
ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter)));
ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_FOOD)));
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability);
}

View file

@ -13,7 +13,7 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.StaticFilters;
import mage.target.common.TargetControlledPermanent;
import java.util.UUID;
@ -23,8 +23,6 @@ import java.util.UUID;
*/
public final class CauldronFamiliar extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent(SubType.FOOD, "a Food");
public CauldronFamiliar(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B}");
@ -41,7 +39,7 @@ public final class CauldronFamiliar extends CardImpl {
this.addAbility(new SimpleActivatedAbility(
Zone.GRAVEYARD,
new ReturnSourceFromGraveyardToBattlefieldEffect(false, false),
new SacrificeTargetCost(new TargetControlledPermanent(filter))
new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_FOOD))
));
}

View file

@ -16,7 +16,7 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.StaticFilters;
import mage.game.permanent.token.FoodToken;
import mage.target.common.TargetControlledPermanent;
@ -27,13 +27,7 @@ import java.util.UUID;
*/
public final class GildedGoose extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("a Food");
static {
filter.add(SubType.FOOD.getPredicate());
}
public GildedGoose(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}");
this.subtype.add(SubType.BIRD);
@ -54,7 +48,7 @@ public final class GildedGoose extends CardImpl {
// {T}, Sacrifice a Food: Add one mana of any color.
ActivatedManaAbilityImpl ability1 = new AnyColorManaAbility(new TapSourceCost());
ability1.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter)));
ability1.addCost(new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_FOOD)));
this.addAbility(ability1);
}

View file

@ -18,7 +18,7 @@ import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.events.EntersTheBattlefieldEvent;
import mage.game.events.GameEvent;
@ -39,7 +39,6 @@ import java.util.UUID;
*/
public final class GyomeMasterChef extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent(SubType.FOOD, "a Food");
private static final Hint hint = new ValueHint("Nontoken creatures entered this turn", GyomeMasterChefValue.instance);
public GyomeMasterChef(UUID ownerId, CardSetInfo setInfo) {
@ -67,7 +66,7 @@ public final class GyomeMasterChef extends CardImpl {
Ability ability = new SimpleActivatedAbility(new GainAbilityTargetEffect(
IndestructibleAbility.getInstance(), Duration.EndOfTurn
), new GenericManaCost(1));
ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter)));
ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_FOOD)));
ability.addEffect(new TapTargetEffect("tap it"));
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability);

View file

@ -7,8 +7,7 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.StaticFilters;
import mage.target.common.TargetControlledPermanent;
import mage.target.common.TargetCreaturePermanent;
@ -19,8 +18,6 @@ import java.util.UUID;
*/
public final class InsatiableAppetite extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent(SubType.FOOD, "a Food");
public InsatiableAppetite(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{G}");
@ -28,7 +25,7 @@ public final class InsatiableAppetite extends CardImpl {
this.getSpellAbility().addEffect(new DoIfCostPaid(
new BoostTargetEffect(5, 5, Duration.EndOfTurn),
new BoostTargetEffect(3, 3, Duration.EndOfTurn),
new SacrificeTargetCost(new TargetControlledPermanent(filter))
new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_FOOD))
).setText("You may sacrifice a Food. If you do, target creature gets +5/+5 until end of turn. " +
"Otherwise, that creature gets +3/+3 until end of turn."));
this.getSpellAbility().addTarget(new TargetCreaturePermanent());

View file

@ -9,7 +9,7 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.StaticFilters;
import mage.target.common.TargetControlledPermanent;
import mage.target.common.TargetCreaturePermanent;
@ -20,8 +20,6 @@ import java.util.UUID;
*/
public final class MaraleafRider extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent(SubType.FOOD, "a Food");
public MaraleafRider(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}");
@ -32,7 +30,7 @@ public final class MaraleafRider extends CardImpl {
// Sacrifice a Food: Target creature blocks Maraleaf Rider this turn if able.
Ability ability = new SimpleActivatedAbility(
new MustBeBlockedByTargetSourceEffect(), new SacrificeTargetCost(new TargetControlledPermanent(filter))
new MustBeBlockedByTargetSourceEffect(), new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_FOOD))
);
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability);

View file

@ -13,7 +13,7 @@ import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.counters.CounterType;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.StaticFilters;
import java.util.UUID;
@ -22,8 +22,6 @@ import java.util.UUID;
*/
public final class MushroomWatchdogs extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent(SubType.FOOD, "a Food");
public MushroomWatchdogs(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}");
@ -33,7 +31,7 @@ public final class MushroomWatchdogs extends CardImpl {
// Sacrifice a Food: Put a +1/+1 counter on Mushroom Watchdogs. It gains vigilance until end of turn. Activate only as a sorcery.
Ability ability = new ActivateAsSorceryActivatedAbility(
new AddCountersSourceEffect(CounterType.P1P1.createInstance()), new SacrificeTargetCost(filter)
new AddCountersSourceEffect(CounterType.P1P1.createInstance()), new SacrificeTargetCost(StaticFilters.FILTER_CONTROLLED_FOOD)
);
ability.addEffect(new GainAbilitySourceEffect(
VigilanceAbility.getInstance(), Duration.EndOfTurn

View file

@ -13,7 +13,7 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.StaticFilters;
import mage.game.permanent.token.FoodToken;
import mage.target.TargetPlayer;
import mage.target.common.TargetControlledPermanent;
@ -25,8 +25,6 @@ import java.util.UUID;
*/
public final class TemptingWitch extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent(SubType.FOOD, "a Food");
public TemptingWitch(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}");
@ -43,7 +41,7 @@ public final class TemptingWitch extends CardImpl {
new LoseLifeTargetEffect(3), new GenericManaCost(2)
);
ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter)));
ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_FOOD)));
ability.addTarget(new TargetPlayer());
this.addAbility(ability);
}

View file

@ -17,7 +17,6 @@ import mage.constants.Duration;
import mage.constants.SubType;
import mage.counters.CounterType;
import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledPermanent;
import mage.target.TargetPermanent;
import mage.target.common.TargetControlledPermanent;
@ -28,9 +27,6 @@ import java.util.UUID;
*/
public final class WickedWolf extends CardImpl {
private static final FilterControlledPermanent filter
= new FilterControlledPermanent(SubType.FOOD, "a Food");
public WickedWolf(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{G}");
@ -48,7 +44,7 @@ public final class WickedWolf extends CardImpl {
// Sacrifice a Food: Put a +1/+1 counter on Wicked Wolf. It gains indestructible until end of turn. Tap it.
ability = new SimpleActivatedAbility(
new AddCountersSourceEffect(CounterType.P1P1.createInstance()),
new SacrificeTargetCost(new TargetControlledPermanent(filter))
new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_FOOD))
);
ability.addEffect(new GainAbilitySourceEffect(
IndestructibleAbility.getInstance(), Duration.EndOfTurn

View file

@ -29,6 +29,7 @@ public final class TalesOfMiddleEarthCommander extends ExpansionSet {
cards.add(new SetCardInfo("Asceticism", 233, Rarity.RARE, mage.cards.a.Asceticism.class));
cards.add(new SetCardInfo("Ash Barrens", 295, Rarity.UNCOMMON, mage.cards.a.AshBarrens.class));
cards.add(new SetCardInfo("Banishing Light", 161, Rarity.UNCOMMON, mage.cards.b.BanishingLight.class));
cards.add(new SetCardInfo("Banquet Guests", 47, Rarity.RARE, mage.cards.b.BanquetGuests.class));
cards.add(new SetCardInfo("Basalt Monolith", 274, Rarity.UNCOMMON, mage.cards.b.BasaltMonolith.class));
cards.add(new SetCardInfo("Bastion Protector", 162, Rarity.RARE, mage.cards.b.BastionProtector.class));
cards.add(new SetCardInfo("Battlefield Forge", 296, Rarity.RARE, mage.cards.b.BattlefieldForge.class));

View file

@ -9,6 +9,7 @@ import mage.constants.Outcome;
import mage.counters.Counter;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.util.CardUtil;
import java.util.ArrayList;
import java.util.List;
@ -22,16 +23,31 @@ import java.util.UUID;
public class EntersBattlefieldWithXCountersEffect extends OneShotEffect {
protected final Counter counter;
private final int multiplier;
public EntersBattlefieldWithXCountersEffect(Counter counter) {
this(counter, 1);
}
public EntersBattlefieldWithXCountersEffect(Counter counter, int multiplier) {
super(Outcome.BoostCreature);
this.counter = counter;
staticText = "with X " + counter.getName() + " counters on it";
this.multiplier = multiplier;
String countText = "X";
if (multiplier == 2) {
countText = "twice " + countText;
}
if (multiplier > 2) {
countText = CardUtil.numberToText(multiplier) + " times " + countText;
}
staticText = "with " + countText + " " + counter.getName() + " counters on it";
}
public EntersBattlefieldWithXCountersEffect(final EntersBattlefieldWithXCountersEffect effect) {
super(effect);
this.counter = effect.counter.copy();
this.multiplier = effect.multiplier;
}
@Override
@ -48,7 +64,7 @@ public class EntersBattlefieldWithXCountersEffect extends OneShotEffect {
&& spellAbility.getSourceId().equals(source.getSourceId())
&& permanent.getZoneChangeCounter(game) == spellAbility.getSourceObjectZoneChangeCounter()) {
if (spellAbility.getSourceId().equals(source.getSourceId())) { // put into play by normal cast
int amount = spellAbility.getManaCostsToPay().getX();
int amount = spellAbility.getManaCostsToPay().getX() * this.multiplier;
if (amount > 0) {
Counter counterToAdd = counter.copy();
counterToAdd.add(amount - counter.getCount());

View file

@ -1202,4 +1202,10 @@ public final class StaticFilters {
FILTER_PLAYER_CONTROLLER.add(TargetController.YOU.getPlayerPredicate());
FILTER_PLAYER_CONTROLLER.setLockedFilter(true);
}
public static final FilterControlledPermanent FILTER_CONTROLLED_FOOD = new FilterControlledPermanent(SubType.FOOD, "Food");
static {
FILTER_CONTROLLED_FOOD.setLockedFilter(true);
}
}