From d7b5c21894ad90668397ab7591357e55a880b78c Mon Sep 17 00:00:00 2001 From: theelk801 Date: Wed, 12 Nov 2025 10:50:21 -0500 Subject: [PATCH] [TLA] Implement Zhao, the Moon Slayer --- Mage.Sets/src/mage/cards/b/BloodMoon.java | 65 +----------------- .../src/mage/cards/m/MagusOfTheMoon.java | 67 ++----------------- .../src/mage/cards/z/ZhaoTheMoonSlayer.java | 66 ++++++++++++++++++ .../src/mage/sets/AvatarTheLastAirbender.java | 2 + .../NonbasicLandsAreMountainsEffect.java | 45 +++++++++++++ .../main/java/mage/counters/CounterType.java | 1 + 6 files changed, 121 insertions(+), 125 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/z/ZhaoTheMoonSlayer.java create mode 100644 Mage/src/main/java/mage/abilities/effects/common/continuous/NonbasicLandsAreMountainsEffect.java diff --git a/Mage.Sets/src/mage/cards/b/BloodMoon.java b/Mage.Sets/src/mage/cards/b/BloodMoon.java index 40b3f9a2b23..04ef447040d 100644 --- a/Mage.Sets/src/mage/cards/b/BloodMoon.java +++ b/Mage.Sets/src/mage/cards/b/BloodMoon.java @@ -1,16 +1,10 @@ package mage.cards.b; -import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.ContinuousEffectImpl; -import mage.abilities.mana.RedManaAbility; +import mage.abilities.effects.common.continuous.NonbasicLandsAreMountainsEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; -import mage.filter.common.FilterLandPermanent; -import mage.filter.predicate.Predicates; -import mage.game.Game; -import mage.game.permanent.Permanent; +import mage.constants.CardType; import java.util.UUID; @@ -23,7 +17,7 @@ public final class BloodMoon extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}"); // Nonbasic lands are Mountains. - this.addAbility(new SimpleStaticAbility(new BloodMoonEffect())); + this.addAbility(new SimpleStaticAbility(new NonbasicLandsAreMountainsEffect())); } private BloodMoon(final BloodMoon card) { @@ -34,57 +28,4 @@ public final class BloodMoon extends CardImpl { public BloodMoon copy() { return new BloodMoon(this); } - - static class BloodMoonEffect extends ContinuousEffectImpl { - - private static final FilterLandPermanent filter = new FilterLandPermanent(); - - static { - filter.add(Predicates.not(SuperType.BASIC.getPredicate())); - } - - BloodMoonEffect() { - super(Duration.WhileOnBattlefield, Outcome.Detriment); - this.staticText = "Nonbasic lands are Mountains"; - this.dependencyTypes.add(DependencyType.BecomeMountain); - this.dependendToTypes.add(DependencyType.BecomeNonbasicLand); - } - - private BloodMoonEffect(final BloodMoonEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - return false; - } - - @Override - public BloodMoonEffect copy() { - return new BloodMoonEffect(this); - } - - @Override - public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { - for (Permanent land : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), game)) { - switch (layer) { - case TypeChangingEffects_4: - // 305.7 Note that this doesn't remove any abilities that were granted to the land by other effects - // So the ability removing has to be done before Layer 6 - // Lands have their mana ability intrinsically, so that is added in layer 4 - land.removeAllSubTypes(game, SubTypeSet.NonBasicLandType); - land.addSubType(game, SubType.MOUNTAIN); - land.removeAllAbilities(source.getSourceId(), game); - land.addAbility(new RedManaAbility(), source.getSourceId(), game); - break; - } - } - return true; - } - - @Override - public boolean hasLayer(Layer layer) { - return layer == Layer.TypeChangingEffects_4; - } - } } diff --git a/Mage.Sets/src/mage/cards/m/MagusOfTheMoon.java b/Mage.Sets/src/mage/cards/m/MagusOfTheMoon.java index e07c277a4e8..2fa259f8e8f 100644 --- a/Mage.Sets/src/mage/cards/m/MagusOfTheMoon.java +++ b/Mage.Sets/src/mage/cards/m/MagusOfTheMoon.java @@ -1,17 +1,12 @@ package mage.cards.m; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.ContinuousEffectImpl; -import mage.abilities.mana.RedManaAbility; +import mage.abilities.effects.common.continuous.NonbasicLandsAreMountainsEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; -import mage.filter.common.FilterLandPermanent; -import mage.filter.predicate.Predicates; -import mage.game.Game; -import mage.game.permanent.Permanent; +import mage.constants.CardType; +import mage.constants.SubType; import java.util.UUID; @@ -29,7 +24,7 @@ public final class MagusOfTheMoon extends CardImpl { this.toughness = new MageInt(2); // Nonbasic lands are Mountains. - this.addAbility(new SimpleStaticAbility(new MagusOfTheMoonEffect())); + this.addAbility(new SimpleStaticAbility(new NonbasicLandsAreMountainsEffect())); } private MagusOfTheMoon(final MagusOfTheMoon card) { @@ -40,58 +35,4 @@ public final class MagusOfTheMoon extends CardImpl { public MagusOfTheMoon copy() { return new MagusOfTheMoon(this); } - -} - -class MagusOfTheMoonEffect extends ContinuousEffectImpl { - - private static final FilterLandPermanent filter = new FilterLandPermanent(); - - static { - filter.add(Predicates.not(SuperType.BASIC.getPredicate())); - } - - MagusOfTheMoonEffect() { - super(Duration.WhileOnBattlefield, Outcome.Detriment); - this.staticText = "Nonbasic lands are Mountains"; - dependendToTypes.add(DependencyType.BecomeNonbasicLand); - dependencyTypes.add(DependencyType.BecomeMountain); - } - - private MagusOfTheMoonEffect(final MagusOfTheMoonEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - return false; - } - - @Override - public MagusOfTheMoonEffect copy() { - return new MagusOfTheMoonEffect(this); - } - - @Override - public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { - for (Permanent land : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), game)) { - switch (layer) { - case TypeChangingEffects_4: - // 305.7 Note that this doesn't remove any abilities that were granted to the land by other effects - // So the ability removing has to be done before Layer 6 - land.removeAllAbilities(source.getSourceId(), game); - land.removeAllSubTypes(game, SubTypeSet.NonBasicLandType); - land.addSubType(game, SubType.MOUNTAIN); - // Mountains have the red mana ability intrinsically so the ability must be added in this layer - land.addAbility(new RedManaAbility(), source.getSourceId(), game); - break; - } - } - return true; - } - - @Override - public boolean hasLayer(Layer layer) { - return layer == Layer.TypeChangingEffects_4; - } } diff --git a/Mage.Sets/src/mage/cards/z/ZhaoTheMoonSlayer.java b/Mage.Sets/src/mage/cards/z/ZhaoTheMoonSlayer.java new file mode 100644 index 00000000000..eea55758eee --- /dev/null +++ b/Mage.Sets/src/mage/cards/z/ZhaoTheMoonSlayer.java @@ -0,0 +1,66 @@ +package mage.cards.z; + +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.SourceHasCounterCondition; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.common.PermanentsEnterBattlefieldTappedEffect; +import mage.abilities.effects.common.continuous.NonbasicLandsAreMountainsEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.MenaceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.counters.CounterType; +import mage.filter.StaticFilters; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class ZhaoTheMoonSlayer extends CardImpl { + + private static final Condition condition = new SourceHasCounterCondition(CounterType.CONQUEROR); + + public ZhaoTheMoonSlayer(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.SOLDIER); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Menace + this.addAbility(new MenaceAbility()); + + // Nonbasic lands enter tapped. + this.addAbility(new SimpleStaticAbility(new PermanentsEnterBattlefieldTappedEffect(StaticFilters.FILTER_LANDS_NONBASIC))); + + // {7}: Put a conqueror counter on Zhao. + this.addAbility(new SimpleActivatedAbility( + new AddCountersSourceEffect(CounterType.CONQUEROR.createInstance()), new GenericManaCost(7) + )); + + // As long as Zhao has a conqueror counter on him, nonbasic lands are Mountains. + this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect( + new NonbasicLandsAreMountainsEffect(), condition, + "as long as {this} has a conqueror counter on him, nonbasic lands are Mountains" + ))); + } + + private ZhaoTheMoonSlayer(final ZhaoTheMoonSlayer card) { + super(card); + } + + @Override + public ZhaoTheMoonSlayer copy() { + return new ZhaoTheMoonSlayer(this); + } +} diff --git a/Mage.Sets/src/mage/sets/AvatarTheLastAirbender.java b/Mage.Sets/src/mage/sets/AvatarTheLastAirbender.java index 8b44d6a3ac8..010c7d4ba6c 100644 --- a/Mage.Sets/src/mage/sets/AvatarTheLastAirbender.java +++ b/Mage.Sets/src/mage/sets/AvatarTheLastAirbender.java @@ -341,6 +341,8 @@ public final class AvatarTheLastAirbender extends ExpansionSet { cards.add(new SetCardInfo("Yue, the Moon Spirit", 83, Rarity.RARE, mage.cards.y.YueTheMoonSpirit.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Yuyan Archers", 161, Rarity.COMMON, mage.cards.y.YuyanArchers.class)); cards.add(new SetCardInfo("Zhao, Ruthless Admiral", 252, Rarity.UNCOMMON, mage.cards.z.ZhaoRuthlessAdmiral.class)); + cards.add(new SetCardInfo("Zhao, the Moon Slayer", 162, Rarity.RARE, mage.cards.z.ZhaoTheMoonSlayer.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Zhao, the Moon Slayer", 376, Rarity.RARE, mage.cards.z.ZhaoTheMoonSlayer.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Zuko's Conviction", 123, Rarity.UNCOMMON, mage.cards.z.ZukosConviction.class)); cards.add(new SetCardInfo("Zuko's Exile", 3, Rarity.COMMON, mage.cards.z.ZukosExile.class)); cards.add(new SetCardInfo("Zuko, Exiled Prince", 163, Rarity.UNCOMMON, mage.cards.z.ZukoExiledPrince.class)); diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/NonbasicLandsAreMountainsEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/NonbasicLandsAreMountainsEffect.java new file mode 100644 index 00000000000..0136982dbb9 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/NonbasicLandsAreMountainsEffect.java @@ -0,0 +1,45 @@ +package mage.abilities.effects.common.continuous; + +import mage.abilities.Ability; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.mana.RedManaAbility; +import mage.constants.*; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.permanent.Permanent; + +/** + * @author LevelX2 + */ +public class NonbasicLandsAreMountainsEffect extends ContinuousEffectImpl { + + public NonbasicLandsAreMountainsEffect() { + super(Duration.WhileOnBattlefield, Layer.TypeChangingEffects_4, SubLayer.NA, Outcome.Detriment); + this.staticText = "nonbasic lands are Mountains"; + this.dependencyTypes.add(DependencyType.BecomeMountain); + this.dependendToTypes.add(DependencyType.BecomeNonbasicLand); + } + + private NonbasicLandsAreMountainsEffect(final NonbasicLandsAreMountainsEffect effect) { + super(effect); + } + + @Override + public NonbasicLandsAreMountainsEffect copy() { + return new NonbasicLandsAreMountainsEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + for (Permanent land : game.getBattlefield().getActivePermanents(StaticFilters.FILTER_LANDS_NONBASIC, source.getControllerId(), game)) { + // 305.7 Note that this doesn't remove any abilities that were granted to the land by other effects + // So the ability removing has to be done before Layer 6 + // Lands have their mana ability intrinsically, so that is added in layer 4 + land.removeAllSubTypes(game, SubTypeSet.NonBasicLandType); + land.addSubType(game, SubType.MOUNTAIN); + land.removeAllAbilities(source.getSourceId(), game); + land.addAbility(new RedManaAbility(), source.getSourceId(), game); + } + return true; + } +} diff --git a/Mage/src/main/java/mage/counters/CounterType.java b/Mage/src/main/java/mage/counters/CounterType.java index c774348bd19..b5b5a74d71a 100644 --- a/Mage/src/main/java/mage/counters/CounterType.java +++ b/Mage/src/main/java/mage/counters/CounterType.java @@ -46,6 +46,7 @@ public enum CounterType { COLLECTION("collection"), COMPONENT("component"), CONTESTED("contested"), + CONQUEROR("conqueror"), CORPSE("corpse"), CORRUPTION("corruption"), CREDIT("credit"),