diff --git a/Mage.Sets/src/mage/cards/c/CelesRuneKnight.java b/Mage.Sets/src/mage/cards/c/CelesRuneKnight.java new file mode 100644 index 00000000000..746d854fa3a --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CelesRuneKnight.java @@ -0,0 +1,121 @@ +package mage.cards.c; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldOneOrMoreTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.counter.AddCountersAllEffect; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.events.ZoneChangeEvent; +import mage.game.permanent.Permanent; +import mage.game.stack.Spell; +import mage.players.Player; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; + +/** + * @author balazskristof + */ +public final class CelesRuneKnight extends CardImpl { + + public CelesRuneKnight(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{W}{B}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.WIZARD); + this.subtype.add(SubType.KNIGHT); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // When Celes enters, discard any number of cards, then draw that many cards plus one. + this.addAbility(new EntersBattlefieldTriggeredAbility(new CelesRuneKnightEffect())); + + // Whenever one or more other creatures you control enter, if one or more of them entered from a graveyard or was cast from a graveyard, put a +1/+1 counter on each creature you control. + this.addAbility(new CelesRuneKnightTriggeredAbility()); + } + + private CelesRuneKnight(final CelesRuneKnight card) { + super(card); + } + + @Override + public CelesRuneKnight copy() { + return new CelesRuneKnight(this); + } +} + +class CelesRuneKnightEffect extends OneShotEffect { + + CelesRuneKnightEffect() { + super(Outcome.DrawCard); + staticText = "discard any number of cards, then draw that many cards plus one"; + } + + private CelesRuneKnightEffect(final CelesRuneKnightEffect effect) { + super(effect); + } + + @Override + public CelesRuneKnightEffect copy() { + return new CelesRuneKnightEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return false; + } + int discarded = player.discard(0, Integer.MAX_VALUE, false, source, game).size(); + game.processAction(); + player.drawCards(discarded + 1, source, game); + return true; + } +} + +class CelesRuneKnightTriggeredAbility extends EntersBattlefieldOneOrMoreTriggeredAbility { + + CelesRuneKnightTriggeredAbility() { + super(new AddCountersAllEffect(CounterType.P1P1.createInstance(), StaticFilters.FILTER_CONTROLLED_CREATURE), StaticFilters.FILTER_OTHER_CONTROLLED_CREATURES, TargetController.YOU); + setTriggerPhrase("Whenever one or more other creatures you control enter, " + + "if one or more of them entered from a graveyard or was cast from a graveyard, "); + } + + private CelesRuneKnightTriggeredAbility(final CelesRuneKnightTriggeredAbility ability) { + super(ability); + } + + @Override + public CelesRuneKnightTriggeredAbility copy() { + return new CelesRuneKnightTriggeredAbility(this); + } + + @Override + public boolean checkEvent(ZoneChangeEvent event, Game game) { + if (super.checkEvent(event, game)) { + Zone fromZone = event.getFromZone(); + if (fromZone == Zone.GRAVEYARD) { + return true; + } + if (fromZone == Zone.STACK) { + Permanent permanent = event.getTarget(); + Spell spell = game.getSpellOrLKIStack(permanent.getId()); + if (spell != null && spell.getFromZone() == Zone.GRAVEYARD) { + return true; + } + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/FinalFantasyCommander.java b/Mage.Sets/src/mage/sets/FinalFantasyCommander.java index 757f5c0cc62..618587f8498 100644 --- a/Mage.Sets/src/mage/sets/FinalFantasyCommander.java +++ b/Mage.Sets/src/mage/sets/FinalFantasyCommander.java @@ -19,6 +19,9 @@ public final class FinalFantasyCommander extends ExpansionSet { super("Final Fantasy Commander", "FIC", ExpansionSet.buildDate(2025, 6, 13), SetType.SUPPLEMENTAL); this.hasBasicLands = false; + cards.add(new SetCardInfo("Celes, Rune Knight", 1, Rarity.MYTHIC, mage.cards.c.CelesRuneKnight.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Celes, Rune Knight", 201, Rarity.MYTHIC, mage.cards.c.CelesRuneKnight.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Celes, Rune Knight", 220, Rarity.MYTHIC, mage.cards.c.CelesRuneKnight.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Cloud, Ex-SOLDIER", 2, Rarity.MYTHIC, mage.cards.c.CloudExSOLDIER.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Cloud, Ex-SOLDIER", 168, Rarity.MYTHIC, mage.cards.c.CloudExSOLDIER.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Cloud, Ex-SOLDIER", 202, Rarity.MYTHIC, mage.cards.c.CloudExSOLDIER.class, NON_FULL_USE_VARIOUS)); diff --git a/Mage/src/main/java/mage/abilities/common/EntersBattlefieldOneOrMoreTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/EntersBattlefieldOneOrMoreTriggeredAbility.java index 093aa5ea88a..ec32ead1748 100644 --- a/Mage/src/main/java/mage/abilities/common/EntersBattlefieldOneOrMoreTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/EntersBattlefieldOneOrMoreTriggeredAbility.java @@ -29,7 +29,7 @@ public class EntersBattlefieldOneOrMoreTriggeredAbility extends TriggeredAbility setTriggerPhrase(generateTriggerPhrase()); } - private EntersBattlefieldOneOrMoreTriggeredAbility(final EntersBattlefieldOneOrMoreTriggeredAbility ability) { + protected EntersBattlefieldOneOrMoreTriggeredAbility(final EntersBattlefieldOneOrMoreTriggeredAbility ability) { super(ability); this.filter = ability.filter; this.targetController = ability.targetController; diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index c2214fd736e..7431ebbb8e7 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -57177,6 +57177,7 @@ Underground River|Aetherdrift Commander|181|R||Land|||{T}: Add {C}.${T}: Add {U} Unholy Grotto|Aetherdrift Commander|182|R||Land|||{T}: Add {C}.${B}, {T}: Put target Zombie card from your graveyard on top of your library.| Vineglimmer Snarl|Aetherdrift Commander|183|R||Land|||As Vineglimmer Snarl enters, you may reveal a Forest or Island card from your hand. If you don't, Vineglimmer Snarl enters tapped.${T}: Add {G} or {U}.| Yavimaya Coast|Aetherdrift Commander|184|R||Land|||{T}: Add {C}.${T}: Add {G} or {U}. Yavimaya Coast deals 1 damage to you.| +Celes, Rune Knight|Final Fantasy Commander|1|M|{1}{R}{W}{B}|Legendary Creature - Human Wizard Knight|4|4|When Celes enters, discard any number of cards, then draw that many cards plus one.$Whenever one or more other creatures you control enter, if one or more of them entered from a graveyard or was cast from a graveyard, put a +1/+1 counter on each creature you control.| Cloud, Ex-SOLDIER|Final Fantasy Commander|2|M|{2}{R}{G}{W}|Legendary Creature - Human Soldier Mercenary|4|4|Haste$When Cloud enters, attach up to one target Equipment you control to it.$Whenever Cloud attacks, draw a card for each equipped attacking creature you control. Then if Cloud has power 7 or greater, create two Treasure tokens.| Terra, Herald of Hope|Final Fantasy Commander|4|M|{R}{W}{B}|Legendary Creature - Human Wizard Warrior|3|3|Trance -- At the beginning of combat on your turn, mill two cards. Terra gains flying until end of turn.$Whenever Terra deals combat damage to a player, you may pay {2}. When you do, return target creature card with power 3 or less from your graveyard to the battlefield tapped.| Tidus, Yuna's Guardian|Final Fantasy Commander|5|M|{G}{W}{U}|Legendary Creature - Human Warrior|3|3|At the beginning of combat on your turn, you may move a counter from target creature you control onto a second target creature you control.$Cheer - Whenever one or more creatures you control with counters on them deal combat damage to a player, you may draw a card and proliferate. Do this only once each turn.|