[TLA] Implement Zhao, the Moon Slayer

This commit is contained in:
theelk801 2025-11-12 10:50:21 -05:00
parent 70444ba7de
commit d7b5c21894
6 changed files with 121 additions and 125 deletions

View file

@ -1,16 +1,10 @@
package mage.cards.b; package mage.cards.b;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.common.continuous.NonbasicLandsAreMountainsEffect;
import mage.abilities.mana.RedManaAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.*; import mage.constants.CardType;
import mage.filter.common.FilterLandPermanent;
import mage.filter.predicate.Predicates;
import mage.game.Game;
import mage.game.permanent.Permanent;
import java.util.UUID; import java.util.UUID;
@ -23,7 +17,7 @@ public final class BloodMoon extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}");
// Nonbasic lands are Mountains. // Nonbasic lands are Mountains.
this.addAbility(new SimpleStaticAbility(new BloodMoonEffect())); this.addAbility(new SimpleStaticAbility(new NonbasicLandsAreMountainsEffect()));
} }
private BloodMoon(final BloodMoon card) { private BloodMoon(final BloodMoon card) {
@ -34,57 +28,4 @@ public final class BloodMoon extends CardImpl {
public BloodMoon copy() { public BloodMoon copy() {
return new BloodMoon(this); 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;
}
}
} }

View file

@ -1,17 +1,12 @@
package mage.cards.m; package mage.cards.m;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.common.continuous.NonbasicLandsAreMountainsEffect;
import mage.abilities.mana.RedManaAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.*; import mage.constants.CardType;
import mage.filter.common.FilterLandPermanent; import mage.constants.SubType;
import mage.filter.predicate.Predicates;
import mage.game.Game;
import mage.game.permanent.Permanent;
import java.util.UUID; import java.util.UUID;
@ -29,7 +24,7 @@ public final class MagusOfTheMoon extends CardImpl {
this.toughness = new MageInt(2); this.toughness = new MageInt(2);
// Nonbasic lands are Mountains. // Nonbasic lands are Mountains.
this.addAbility(new SimpleStaticAbility(new MagusOfTheMoonEffect())); this.addAbility(new SimpleStaticAbility(new NonbasicLandsAreMountainsEffect()));
} }
private MagusOfTheMoon(final MagusOfTheMoon card) { private MagusOfTheMoon(final MagusOfTheMoon card) {
@ -40,58 +35,4 @@ public final class MagusOfTheMoon extends CardImpl {
public MagusOfTheMoon copy() { public MagusOfTheMoon copy() {
return new MagusOfTheMoon(this); 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;
}
} }

View file

@ -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);
}
}

View file

@ -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("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("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, 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 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'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)); cards.add(new SetCardInfo("Zuko, Exiled Prince", 163, Rarity.UNCOMMON, mage.cards.z.ZukoExiledPrince.class));

View file

@ -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;
}
}

View file

@ -46,6 +46,7 @@ public enum CounterType {
COLLECTION("collection"), COLLECTION("collection"),
COMPONENT("component"), COMPONENT("component"),
CONTESTED("contested"), CONTESTED("contested"),
CONQUEROR("conqueror"),
CORPSE("corpse"), CORPSE("corpse"),
CORRUPTION("corruption"), CORRUPTION("corruption"),
CREDIT("credit"), CREDIT("credit"),