From 0ec783cfdca4e72d9975b20b9922360124d52462 Mon Sep 17 00:00:00 2001 From: Grath <1895280+Grath@users.noreply.github.com> Date: Thu, 14 Aug 2025 22:18:52 -0400 Subject: [PATCH] [TLE] Implement Aang, Airbending Master --- .../mage/cards/a/AangAirbendingMaster.java | 102 ++++++++++++++++++ .../sets/AvatarTheLastAirbenderEternal.java | 1 + 2 files changed, 103 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/a/AangAirbendingMaster.java diff --git a/Mage.Sets/src/mage/cards/a/AangAirbendingMaster.java b/Mage.Sets/src/mage/cards/a/AangAirbendingMaster.java new file mode 100644 index 00000000000..93777a102f1 --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AangAirbendingMaster.java @@ -0,0 +1,102 @@ +package mage.cards.a; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.BatchTriggeredAbility; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.CountersControllerCount; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.counter.AddCountersPlayersEffect; +import mage.abilities.effects.keyword.AirbendTargetEffect; +import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; +import mage.constants.*; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.counters.CounterType; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.ZoneChangeBatchEvent; +import mage.game.events.ZoneChangeEvent; +import mage.game.permanent.Permanent; +import mage.game.permanent.token.AllyToken; +import mage.target.TargetPermanent; + +/** + * + * @author Grath + */ +public final class AangAirbendingMaster extends CardImpl { + + private static final DynamicValue xValue = new CountersControllerCount(CounterType.EXPERIENCE); + + public AangAirbendingMaster(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{W}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.AVATAR); + this.subtype.add(SubType.ALLY); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // When Aang enters, airbend another target creature. + Ability ability = new EntersBattlefieldTriggeredAbility(new AirbendTargetEffect(), false); + ability.addTarget(new TargetPermanent(StaticFilters.FILTER_ANOTHER_TARGET_CREATURE)); + this.addAbility(ability); + + // Whenever one or more creatures you control leave the battlefield without dying, you get an experience counter. + this.addAbility(new AangAirbendingMasterTriggeredAbility()); + + // At the beginning of your upkeep, create a 1/1 white Ally creature token for each experience counter you have. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new CreateTokenEffect(new AllyToken(), xValue))); + } + + private AangAirbendingMaster(final AangAirbendingMaster card) { + super(card); + } + + @Override + public AangAirbendingMaster copy() { + return new AangAirbendingMaster(this); + } +} + +class AangAirbendingMasterTriggeredAbility extends TriggeredAbilityImpl implements BatchTriggeredAbility { + + AangAirbendingMasterTriggeredAbility() { + super(Zone.BATTLEFIELD, new AddCountersPlayersEffect(CounterType.EXPERIENCE.createInstance(), TargetController.YOU)); + setTriggerPhrase("Whenever one or more creatures you control leave the battlefield without dying, "); + } + + private AangAirbendingMasterTriggeredAbility(final AangAirbendingMasterTriggeredAbility ability) { + super(ability); + } + + @Override + public AangAirbendingMasterTriggeredAbility copy() { + return new AangAirbendingMasterTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.ZONE_CHANGE_BATCH; + } + + @Override + public boolean checkEvent(ZoneChangeEvent event, Game game) { + if (event.getFromZone() != Zone.BATTLEFIELD || event.getToZone() == Zone.GRAVEYARD) { + return false; + } + Permanent permanent = game.getPermanentOrLKIBattlefield(event.getTargetId()); + return permanent != null && permanent.isCreature(game) && permanent.isControlledBy(getControllerId()); + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + return !getFilteredEvents((ZoneChangeBatchEvent) event, game).isEmpty(); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/AvatarTheLastAirbenderEternal.java b/Mage.Sets/src/mage/sets/AvatarTheLastAirbenderEternal.java index 6e4c3c65678..46ce5344889 100644 --- a/Mage.Sets/src/mage/sets/AvatarTheLastAirbenderEternal.java +++ b/Mage.Sets/src/mage/sets/AvatarTheLastAirbenderEternal.java @@ -23,6 +23,7 @@ public final class AvatarTheLastAirbenderEternal extends ExpansionSet { cards.add(new SetCardInfo("Aang's Defense", 211, Rarity.COMMON, mage.cards.a.AangsDefense.class)); cards.add(new SetCardInfo("Aang, Air Nomad", 210, Rarity.RARE, mage.cards.a.AangAirNomad.class)); + cards.add(new SetCardInfo("Aang, Airbending Master", 74, Rarity.MYTHIC, mage.cards.a.AangAirbendingMaster.class)); cards.add(new SetCardInfo("Aardvark Sloth", 212, Rarity.COMMON, mage.cards.a.AardvarkSloth.class)); cards.add(new SetCardInfo("Allied Teamwork", 213, Rarity.RARE, mage.cards.a.AlliedTeamwork.class)); cards.add(new SetCardInfo("Appa, Aang's Companion", 214, Rarity.UNCOMMON, mage.cards.a.AppaAangsCompanion.class));