[TLA] Implement Kyoshi Island Plaza

This commit is contained in:
theelk801 2025-11-12 10:10:03 -05:00
parent 6efb4e5df4
commit c602edeca3
24 changed files with 243 additions and 302 deletions

View file

@ -1,22 +1,18 @@
package mage.cards.g; package mage.cards.g;
import mage.MageInt; import mage.MageInt;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.delayed.ReflexiveTriggeredAbility; import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.ShrinesYouControlCount;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.effects.common.DoWhenCostPaid; import mage.abilities.effects.common.DoWhenCostPaid;
import mage.abilities.hint.Hint;
import mage.abilities.hint.ValueHint;
import mage.abilities.keyword.FirstStrikeAbility; import mage.abilities.keyword.FirstStrikeAbility;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.SuperType; import mage.constants.SuperType;
import mage.filter.common.FilterControlledPermanent;
import mage.target.common.TargetPlayerOrPlaneswalker; import mage.target.common.TargetPlayerOrPlaneswalker;
import java.util.UUID; import java.util.UUID;
@ -26,11 +22,6 @@ import java.util.UUID;
*/ */
public final class GoShintaiOfAncientWars extends CardImpl { public final class GoShintaiOfAncientWars extends CardImpl {
private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(
new FilterControlledPermanent(SubType.SHRINE)
);
private static final Hint hint = new ValueHint("Shrines you control", xValue);
public GoShintaiOfAncientWars(UUID ownerId, CardSetInfo setInfo) { public GoShintaiOfAncientWars(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "{2}{R}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "{2}{R}");
@ -44,13 +35,13 @@ public final class GoShintaiOfAncientWars extends CardImpl {
// At the beginning of your end step, you may pay {1}. When you do, Go-Shintai of Ancient Wars deals X damage to target player or planeswalker, where X is the number of Shrines you control. // At the beginning of your end step, you may pay {1}. When you do, Go-Shintai of Ancient Wars deals X damage to target player or planeswalker, where X is the number of Shrines you control.
ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility( ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility(
new DamageTargetEffect(xValue), false, "{this} deals X damage to target " + new DamageTargetEffect(ShrinesYouControlCount.WHERE_X), false, "{this} deals X damage " +
"player or planeswalker, where X is the number of Shrines you control" "to target player or planeswalker, where X is the number of Shrines you control"
); );
ability.addTarget(new TargetPlayerOrPlaneswalker()); ability.addTarget(new TargetPlayerOrPlaneswalker());
this.addAbility(new BeginningOfEndStepTriggeredAbility( this.addAbility(new BeginningOfEndStepTriggeredAbility(
new DoWhenCostPaid(ability, new GenericManaCost(1), "Pay {1}?") new DoWhenCostPaid(ability, new GenericManaCost(1), "Pay {1}?")
).addHint(hint)); ).addHint(ShrinesYouControlCount.getHint()));
} }
private GoShintaiOfAncientWars(final GoShintaiOfAncientWars card) { private GoShintaiOfAncientWars(final GoShintaiOfAncientWars card) {

View file

@ -1,16 +1,13 @@
package mage.cards.g; package mage.cards.g;
import mage.MageInt; import mage.MageInt;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.delayed.ReflexiveTriggeredAbility; import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.ShrinesYouControlCount;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.DoWhenCostPaid; import mage.abilities.effects.common.DoWhenCostPaid;
import mage.abilities.effects.common.counter.AddCountersTargetEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect;
import mage.abilities.hint.Hint;
import mage.abilities.hint.ValueHint;
import mage.abilities.keyword.TrampleAbility; import mage.abilities.keyword.TrampleAbility;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
@ -18,7 +15,6 @@ import mage.constants.SubType;
import mage.constants.SuperType; import mage.constants.SuperType;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.filter.FilterPermanent; import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
import java.util.UUID; import java.util.UUID;
@ -28,11 +24,7 @@ import java.util.UUID;
*/ */
public final class GoShintaiOfBoundlessVigor extends CardImpl { public final class GoShintaiOfBoundlessVigor extends CardImpl {
private static final FilterPermanent filter private static final FilterPermanent filter = new FilterPermanent(SubType.SHRINE, "Shrine");
= new FilterPermanent(SubType.SHRINE, "Shrine");
private static final DynamicValue xValue
= new PermanentsOnBattlefieldCount(new FilterControlledPermanent(SubType.SHRINE));
private static final Hint hint = new ValueHint("Shrines you control", xValue);
public GoShintaiOfBoundlessVigor(UUID ownerId, CardSetInfo setInfo) { public GoShintaiOfBoundlessVigor(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "{1}{G}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "{1}{G}");
@ -46,15 +38,13 @@ public final class GoShintaiOfBoundlessVigor extends CardImpl {
this.addAbility(TrampleAbility.getInstance()); this.addAbility(TrampleAbility.getInstance());
// At the beginning of your end step, you may pay {1}. When you do, put a +1/+1 counter on target Shrine for each Shrine you control. // At the beginning of your end step, you may pay {1}. When you do, put a +1/+1 counter on target Shrine for each Shrine you control.
ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility( ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility(new AddCountersTargetEffect(
new AddCountersTargetEffect( CounterType.P1P1.createInstance(0), ShrinesYouControlCount.FOR_EACH
CounterType.P1P1.createInstance(0), xValue ), false);
), false
);
ability.addTarget(new TargetPermanent(filter)); ability.addTarget(new TargetPermanent(filter));
this.addAbility(new BeginningOfEndStepTriggeredAbility(new DoWhenCostPaid( this.addAbility(new BeginningOfEndStepTriggeredAbility(new DoWhenCostPaid(
ability, new GenericManaCost(1), "Pay {1}?" ability, new GenericManaCost(1), "Pay {1}?"
)).addHint(hint)); )).addHint(ShrinesYouControlCount.getHint()));
} }
private GoShintaiOfBoundlessVigor(final GoShintaiOfBoundlessVigor card) { private GoShintaiOfBoundlessVigor(final GoShintaiOfBoundlessVigor card) {

View file

@ -1,15 +1,13 @@
package mage.cards.g; package mage.cards.g;
import mage.MageInt; import mage.MageInt;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.delayed.ReflexiveTriggeredAbility; import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.dynamicvalue.common.ShrinesYouControlCount;
import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.DestroyTargetEffect;
import mage.abilities.effects.common.DoWhenCostPaid; import mage.abilities.effects.common.DoWhenCostPaid;
import mage.abilities.hint.Hint;
import mage.abilities.hint.ValueHint;
import mage.abilities.keyword.DeathtouchAbility; import mage.abilities.keyword.DeathtouchAbility;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
@ -58,7 +56,7 @@ public final class GoShintaiOfHiddenCruelty extends CardImpl {
ability.addTarget(new TargetPermanent(filter)); ability.addTarget(new TargetPermanent(filter));
this.addAbility(new BeginningOfEndStepTriggeredAbility( this.addAbility(new BeginningOfEndStepTriggeredAbility(
new DoWhenCostPaid(ability, new GenericManaCost(1), "Pay {1}?") new DoWhenCostPaid(ability, new GenericManaCost(1), "Pay {1}?")
).addHint(GoShintaiOfHiddenCrueltyPredicate.getHint())); ).addHint(ShrinesYouControlCount.getHint()));
} }
private GoShintaiOfHiddenCruelty(final GoShintaiOfHiddenCruelty card) { private GoShintaiOfHiddenCruelty(final GoShintaiOfHiddenCruelty card) {
@ -74,13 +72,6 @@ public final class GoShintaiOfHiddenCruelty extends CardImpl {
enum GoShintaiOfHiddenCrueltyPredicate implements ObjectSourcePlayerPredicate<Permanent> { enum GoShintaiOfHiddenCrueltyPredicate implements ObjectSourcePlayerPredicate<Permanent> {
instance; instance;
private static final FilterPermanent filter = new FilterControlledPermanent(SubType.SHRINE); private static final FilterPermanent filter = new FilterControlledPermanent(SubType.SHRINE);
private static final Hint hint = new ValueHint(
"Shrines you control", new PermanentsOnBattlefieldCount(filter)
);
public static Hint getHint() {
return hint;
}
@Override @Override
public boolean apply(ObjectSourcePlayer<Permanent> input, Game game) { public boolean apply(ObjectSourcePlayer<Permanent> input, Game game) {

View file

@ -1,22 +1,18 @@
package mage.cards.g; package mage.cards.g;
import mage.MageInt; import mage.MageInt;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.delayed.ReflexiveTriggeredAbility; import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.ShrinesYouControlCount;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.DoWhenCostPaid; import mage.abilities.effects.common.DoWhenCostPaid;
import mage.abilities.effects.common.MillCardsTargetEffect; import mage.abilities.effects.common.MillCardsTargetEffect;
import mage.abilities.hint.Hint;
import mage.abilities.hint.ValueHint;
import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.FlyingAbility;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.SuperType; import mage.constants.SuperType;
import mage.filter.common.FilterControlledPermanent;
import mage.target.TargetPlayer; import mage.target.TargetPlayer;
import java.util.UUID; import java.util.UUID;
@ -26,11 +22,6 @@ import java.util.UUID;
*/ */
public final class GoShintaiOfLostWisdom extends CardImpl { public final class GoShintaiOfLostWisdom extends CardImpl {
private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(
new FilterControlledPermanent(SubType.SHRINE)
);
private static final Hint hint = new ValueHint("Shrines you control", xValue);
public GoShintaiOfLostWisdom(UUID ownerId, CardSetInfo setInfo) { public GoShintaiOfLostWisdom(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "{1}{U}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "{1}{U}");
@ -44,13 +35,13 @@ public final class GoShintaiOfLostWisdom extends CardImpl {
// At the beginning of your end step, you may pay {1}. When you do, target player mills X cards, where X is the number of Shrines you control. // At the beginning of your end step, you may pay {1}. When you do, target player mills X cards, where X is the number of Shrines you control.
ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility( ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility(
new MillCardsTargetEffect(xValue), false, new MillCardsTargetEffect(ShrinesYouControlCount.WHERE_X), false,
"target player mills X cards, where X is the number of Shrines you control" "target player mills X cards, where X is the number of Shrines you control"
); );
ability.addTarget(new TargetPlayer()); ability.addTarget(new TargetPlayer());
this.addAbility(new BeginningOfEndStepTriggeredAbility(new DoWhenCostPaid( this.addAbility(new BeginningOfEndStepTriggeredAbility(new DoWhenCostPaid(
ability, new GenericManaCost(1), "Pay {1}?" ability, new GenericManaCost(1), "Pay {1}?"
)).addHint(hint)); )).addHint(ShrinesYouControlCount.getHint()));
} }
private GoShintaiOfLostWisdom(final GoShintaiOfLostWisdom card) { private GoShintaiOfLostWisdom(final GoShintaiOfLostWisdom card) {

View file

@ -1,21 +1,17 @@
package mage.cards.g; package mage.cards.g;
import mage.MageInt; import mage.MageInt;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.ShrinesYouControlCount;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DoIfCostPaid; import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.hint.Hint;
import mage.abilities.hint.ValueHint;
import mage.abilities.keyword.VigilanceAbility; import mage.abilities.keyword.VigilanceAbility;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.SuperType; import mage.constants.SuperType;
import mage.filter.common.FilterControlledPermanent;
import mage.game.permanent.token.SpiritToken; import mage.game.permanent.token.SpiritToken;
import java.util.UUID; import java.util.UUID;
@ -25,11 +21,6 @@ import java.util.UUID;
*/ */
public final class GoShintaiOfSharedPurpose extends CardImpl { public final class GoShintaiOfSharedPurpose extends CardImpl {
private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(
new FilterControlledPermanent(SubType.SHRINE)
);
private static final Hint hint = new ValueHint("Shrines you control", xValue);
public GoShintaiOfSharedPurpose(UUID ownerId, CardSetInfo setInfo) { public GoShintaiOfSharedPurpose(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "{3}{W}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "{3}{W}");
@ -42,12 +33,9 @@ public final class GoShintaiOfSharedPurpose extends CardImpl {
this.addAbility(VigilanceAbility.getInstance()); this.addAbility(VigilanceAbility.getInstance());
// At the beginning of your end step, you may pay {1}. If you do, create a 1/1 colorless Spirit creature token for each Shrine you control. // At the beginning of your end step, you may pay {1}. If you do, create a 1/1 colorless Spirit creature token for each Shrine you control.
this.addAbility(new BeginningOfEndStepTriggeredAbility( this.addAbility(new BeginningOfEndStepTriggeredAbility(new DoIfCostPaid(
new DoIfCostPaid( new CreateTokenEffect(new SpiritToken(), ShrinesYouControlCount.FOR_EACH), new GenericManaCost(1)
new CreateTokenEffect(new SpiritToken(), xValue), )).addHint(ShrinesYouControlCount.getHint()));
new GenericManaCost(1)
)
).addHint(hint));
} }
private GoShintaiOfSharedPurpose(final GoShintaiOfSharedPurpose card) { private GoShintaiOfSharedPurpose(final GoShintaiOfSharedPurpose card) {

View file

@ -1,20 +1,15 @@
package mage.cards.h; package mage.cards.h;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.MultipliedValue; import mage.abilities.dynamicvalue.MultipliedValue;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.dynamicvalue.common.ShrinesYouControlCount;
import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.hint.Hint; import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.hint.ValueHint;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.SuperType; import mage.constants.SuperType;
import mage.filter.common.FilterControlledPermanent;
import java.util.UUID; import java.util.UUID;
@ -23,19 +18,15 @@ import java.util.UUID;
*/ */
public final class HondenOfCleansingFire extends CardImpl { public final class HondenOfCleansingFire extends CardImpl {
private static final DynamicValue xValue = new PermanentsOnBattlefieldCount( private static final DynamicValue xValue = new MultipliedValue(ShrinesYouControlCount.FOR_EACH, 2);
new FilterControlledPermanent(SubType.SHRINE)
);
private static final Hint hint = new ValueHint("Shrines you control", xValue);
public HondenOfCleansingFire(UUID ownerId, CardSetInfo setInfo) { public HondenOfCleansingFire(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}");
this.supertype.add(SuperType.LEGENDARY); this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.SHRINE); this.subtype.add(SubType.SHRINE);
// At the beginning of your upkeep, you gain 2 life for each Shrine you control. // At the beginning of your upkeep, you gain 2 life for each Shrine you control.
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new GainLifeEffect(new MultipliedValue(xValue, 2))).addHint(hint)); this.addAbility(new BeginningOfUpkeepTriggeredAbility(new GainLifeEffect(xValue)).addHint(ShrinesYouControlCount.getHint()));
} }
private HondenOfCleansingFire(final HondenOfCleansingFire card) { private HondenOfCleansingFire(final HondenOfCleansingFire card) {

View file

@ -1,39 +1,33 @@
package mage.cards.h; package mage.cards.h;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.abilities.dynamicvalue.common.ShrinesYouControlCount;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.hint.Hint; import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.hint.ValueHint;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.SuperType; import mage.constants.SuperType;
import mage.filter.common.FilterControlledPermanent;
import mage.target.common.TargetAnyTarget; import mage.target.common.TargetAnyTarget;
import java.util.UUID;
/** /**
*
* @author Loki * @author Loki
*/ */
public final class HondenOfInfiniteRage extends CardImpl { public final class HondenOfInfiniteRage extends CardImpl {
private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(
new FilterControlledPermanent(SubType.SHRINE)
);
private static final Hint hint = new ValueHint("Shrines you control", xValue);
public HondenOfInfiniteRage(UUID ownerId, CardSetInfo setInfo) { public HondenOfInfiniteRage(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}");
this.supertype.add(SuperType.LEGENDARY); this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.SHRINE); this.subtype.add(SubType.SHRINE);
// At the beginning of your upkeep, Honden of Infinite Rage deals damage to any target equal to the number of Shrines you control. // At the beginning of your upkeep, Honden of Infinite Rage deals damage to any target equal to the number of Shrines you control.
Ability ability = new BeginningOfUpkeepTriggeredAbility(new DamageTargetEffect(xValue)).addHint(hint); Ability ability = new BeginningOfUpkeepTriggeredAbility(
new DamageTargetEffect(ShrinesYouControlCount.WHERE_X)
.setText("{this} deals damage to any target equal to the number of Shrines you control")
).addHint(ShrinesYouControlCount.getHint());
ability.addTarget(new TargetAnyTarget()); ability.addTarget(new TargetAnyTarget());
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -1,19 +1,13 @@
package mage.cards.h; package mage.cards.h;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.abilities.dynamicvalue.common.ShrinesYouControlCount;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.hint.Hint; import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.hint.ValueHint;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.SuperType; import mage.constants.SuperType;
import mage.filter.common.FilterControlledPermanent;
import mage.game.permanent.token.SpiritToken; import mage.game.permanent.token.SpiritToken;
import java.util.UUID; import java.util.UUID;
@ -23,17 +17,14 @@ import java.util.UUID;
*/ */
public final class HondenOfLifesWeb extends CardImpl { public final class HondenOfLifesWeb extends CardImpl {
private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(
new FilterControlledPermanent(SubType.SHRINE)
);
private static final Hint hint = new ValueHint("Shrines you control", xValue);
public HondenOfLifesWeb(UUID ownerId, CardSetInfo setInfo) { public HondenOfLifesWeb(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{G}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{G}");
this.supertype.add(SuperType.LEGENDARY); this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.SHRINE); this.subtype.add(SubType.SHRINE);
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new CreateTokenEffect(new SpiritToken(), xValue)).addHint(hint)); this.addAbility(new BeginningOfUpkeepTriggeredAbility(
new CreateTokenEffect(new SpiritToken(), ShrinesYouControlCount.FOR_EACH)
).addHint(ShrinesYouControlCount.getHint()));
} }
private HondenOfLifesWeb(final HondenOfLifesWeb card) { private HondenOfLifesWeb(final HondenOfLifesWeb card) {

View file

@ -1,38 +1,30 @@
package mage.cards.h; package mage.cards.h;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.abilities.dynamicvalue.common.ShrinesYouControlCount;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.discard.DiscardTargetEffect; import mage.abilities.effects.common.discard.DiscardTargetEffect;
import mage.abilities.hint.Hint; import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.hint.ValueHint;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.SuperType; import mage.constants.SuperType;
import mage.filter.common.FilterControlledPermanent;
import mage.target.common.TargetOpponent; import mage.target.common.TargetOpponent;
import java.util.UUID;
/** /**
* @author Loki * @author Loki
*/ */
public final class HondenOfNightsReach extends CardImpl { public final class HondenOfNightsReach extends CardImpl {
private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(
new FilterControlledPermanent(SubType.SHRINE)
);
private static final Hint hint = new ValueHint("Shrines you control", xValue);
public HondenOfNightsReach(UUID ownerId, CardSetInfo setInfo) { public HondenOfNightsReach(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}");
this.supertype.add(SuperType.LEGENDARY); this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.SHRINE); this.subtype.add(SubType.SHRINE);
// At the beginning of your upkeep, target opponent discards a card for each Shrine you control. // At the beginning of your upkeep, target opponent discards a card for each Shrine you control.
Ability ability = new BeginningOfUpkeepTriggeredAbility(new DiscardTargetEffect(xValue)).addHint(hint); Ability ability = new BeginningOfUpkeepTriggeredAbility(new DiscardTargetEffect(ShrinesYouControlCount.FOR_EACH)).addHint(ShrinesYouControlCount.getHint());
ability.addTarget(new TargetOpponent()); ability.addTarget(new TargetOpponent());
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -1,19 +1,13 @@
package mage.cards.h; package mage.cards.h;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.abilities.dynamicvalue.common.ShrinesYouControlCount;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.hint.Hint; import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.hint.ValueHint;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.SuperType; import mage.constants.SuperType;
import mage.filter.common.FilterControlledPermanent;
import java.util.UUID; import java.util.UUID;
@ -22,19 +16,13 @@ import java.util.UUID;
*/ */
public final class HondenOfSeeingWinds extends CardImpl { public final class HondenOfSeeingWinds extends CardImpl {
private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(
new FilterControlledPermanent(SubType.SHRINE)
);
private static final Hint hint = new ValueHint("Shrines you control", xValue);
public HondenOfSeeingWinds(UUID ownerId, CardSetInfo setInfo) { public HondenOfSeeingWinds(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{U}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{U}");
this.supertype.add(SuperType.LEGENDARY); this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.SHRINE); this.subtype.add(SubType.SHRINE);
// At the beginning of your upkeep, draw a card for each Shrine you control. // At the beginning of your upkeep, draw a card for each Shrine you control.
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new DrawCardSourceControllerEffect(xValue)).addHint(hint)); this.addAbility(new BeginningOfUpkeepTriggeredAbility(new DrawCardSourceControllerEffect(ShrinesYouControlCount.FOR_EACH)).addHint(ShrinesYouControlCount.getHint()));
} }
private HondenOfSeeingWinds(final HondenOfSeeingWinds card) { private HondenOfSeeingWinds(final HondenOfSeeingWinds card) {

View file

@ -0,0 +1,76 @@
package mage.cards.k;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.dynamicvalue.common.ShrinesYouControlCount;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.target.common.TargetCardInLibrary;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class KyoshiIslandPlaza extends CardImpl {
public KyoshiIslandPlaza(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{G}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.SHRINE);
// When Kyoshi Island Plaza enters, search your library for up to X basic land cards, where X is the number of Shrines you control. Put those cards onto the battlefield tapped, then shuffle.
this.addAbility(new EntersBattlefieldTriggeredAbility(new KyoshiIslandPlazaEffect())
.addHint(ShrinesYouControlCount.getHint()));
// Whenever another Shrine you control enters, search your library for a basic land card, put it onto the battlefield tapped, then shuffle.
this.addAbility(new EntersBattlefieldAllTriggeredAbility(new SearchLibraryPutInPlayEffect(
new TargetCardInLibrary(StaticFilters.FILTER_CARD_BASIC_LAND), true
), StaticFilters.FILTER_ANOTHER_CONTROLLED_SHRINE));
}
private KyoshiIslandPlaza(final KyoshiIslandPlaza card) {
super(card);
}
@Override
public KyoshiIslandPlaza copy() {
return new KyoshiIslandPlaza(this);
}
}
class KyoshiIslandPlazaEffect extends OneShotEffect {
KyoshiIslandPlazaEffect() {
super(Outcome.Benefit);
staticText = "search your library for up to X basic land cards, where X is the number of Shrines you control. " +
"Put those cards onto the battlefield tapped, then shuffle";
}
private KyoshiIslandPlazaEffect(final KyoshiIslandPlazaEffect effect) {
super(effect);
}
@Override
public KyoshiIslandPlazaEffect copy() {
return new KyoshiIslandPlazaEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
int count = ShrinesYouControlCount.WHERE_X.calculate(game, source, this);
return new SearchLibraryPutInPlayEffect(
new TargetCardInLibrary(0, count, StaticFilters.FILTER_CARD_BASIC_LANDS), true
).apply(game, source);
}
}

View file

@ -3,20 +3,15 @@ package mage.cards.n;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.ShrinesYouControlCount;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.LoseLifeOpponentsEffect; import mage.abilities.effects.common.LoseLifeOpponentsEffect;
import mage.abilities.hint.Hint;
import mage.abilities.hint.ValueHint;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.SuperType; import mage.constants.SuperType;
import mage.filter.FilterPermanent; import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import java.util.UUID; import java.util.UUID;
@ -25,14 +20,6 @@ import java.util.UUID;
*/ */
public final class NorthernAirTemple extends CardImpl { public final class NorthernAirTemple extends CardImpl {
private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(new FilterControlledPermanent(SubType.SHRINE), null);
private static final Hint hint = new ValueHint("Shrines you control", xValue);
private static final FilterPermanent filter = new FilterControlledPermanent(SubType.SHRINE, "another Shrine you control");
static {
filter.add(AnotherPredicate.instance);
}
public NorthernAirTemple(UUID ownerId, CardSetInfo setInfo) { public NorthernAirTemple(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{B}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{B}");
@ -40,13 +27,13 @@ public final class NorthernAirTemple extends CardImpl {
this.subtype.add(SubType.SHRINE); this.subtype.add(SubType.SHRINE);
// When Northern Air Temple enters, each opponent loses X life and you gain X life, where X is the number of Shrines you control. // When Northern Air Temple enters, each opponent loses X life and you gain X life, where X is the number of Shrines you control.
Ability ability = new EntersBattlefieldTriggeredAbility(new LoseLifeOpponentsEffect(xValue) Ability ability = new EntersBattlefieldTriggeredAbility(new LoseLifeOpponentsEffect(ShrinesYouControlCount.WHERE_X)
.setText("each opponent loses X life")); .setText("each opponent loses X life"));
ability.addEffect(new GainLifeEffect(xValue).concatBy("and")); ability.addEffect(new GainLifeEffect(ShrinesYouControlCount.WHERE_X).setText("and you gain X life, where X is the number of Shrines you control"));
this.addAbility(ability.addHint(hint)); this.addAbility(ability.addHint(ShrinesYouControlCount.getHint()));
// Whenever another Shrine you control enters, each opponent loses 1 life and you gain 1 life. // Whenever another Shrine you control enters, each opponent loses 1 life and you gain 1 life.
ability = new EntersBattlefieldAllTriggeredAbility(new LoseLifeOpponentsEffect(1), filter); ability = new EntersBattlefieldAllTriggeredAbility(new LoseLifeOpponentsEffect(1), StaticFilters.FILTER_ANOTHER_CONTROLLED_SHRINE);
ability.addEffect(new GainLifeEffect(1).concatBy("and")); ability.addEffect(new GainLifeEffect(1).concatBy("and"));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -1,22 +1,15 @@
package mage.cards.s; package mage.cards.s;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.dynamicvalue.common.ShrinesYouControlCount;
import mage.abilities.effects.ReplacementEffectImpl; import mage.abilities.effects.ReplacementEffectImpl;
import mage.abilities.effects.common.search.SearchLibraryGraveyardPutOntoBattlefieldEffect; import mage.abilities.effects.common.search.SearchLibraryGraveyardPutOntoBattlefieldEffect;
import mage.abilities.hint.ValueHint; import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.*;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.filter.FilterCard; import mage.filter.FilterCard;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.game.Game; import mage.game.Game;
import mage.game.events.GameEvent; import mage.game.events.GameEvent;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
@ -24,18 +17,13 @@ import mage.game.permanent.Permanent;
import java.util.UUID; import java.util.UUID;
/** /**
*
* @author htrajan * @author htrajan
*/ */
public final class SanctumOfAll extends CardImpl { public final class SanctumOfAll extends CardImpl {
private static final FilterPermanent filter = new FilterControlledPermanent();
private static final FilterCard filterCard = new FilterCard("Shrine card"); private static final FilterCard filterCard = new FilterCard("Shrine card");
static final PermanentsOnBattlefieldCount count = new PermanentsOnBattlefieldCount(filter);
static { static {
filter.add(SubType.SHRINE.getPredicate());
filterCard.add(SubType.SHRINE.getPredicate()); filterCard.add(SubType.SHRINE.getPredicate());
} }
@ -49,7 +37,7 @@ public final class SanctumOfAll extends CardImpl {
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SearchLibraryGraveyardPutOntoBattlefieldEffect(filterCard), true)); this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SearchLibraryGraveyardPutOntoBattlefieldEffect(filterCard), true));
// If an ability of another Shrine you control triggers while you control six or more Shrines, that ability triggers an additional time. // If an ability of another Shrine you control triggers while you control six or more Shrines, that ability triggers an additional time.
this.addAbility(new SimpleStaticAbility(new SanctumOfAllTriggerEffect()).addHint(new ValueHint("Shrines you control", count))); this.addAbility(new SimpleStaticAbility(new SanctumOfAllTriggerEffect()).addHint(ShrinesYouControlCount.getHint()));
} }
private SanctumOfAll(final SanctumOfAll card) { private SanctumOfAll(final SanctumOfAll card) {
@ -94,7 +82,7 @@ class SanctumOfAllTriggerEffect extends ReplacementEffectImpl {
// Only triggers of the controller of Sanctum of All // Only triggers of the controller of Sanctum of All
if (source.isControlledBy(event.getPlayerId())) { if (source.isControlledBy(event.getPlayerId())) {
// Only trigger while you control six or more Shrines // Only trigger while you control six or more Shrines
int numShrines = SanctumOfAll.count.calculate(game, source, this); int numShrines = ShrinesYouControlCount.FOR_EACH.calculate(game, source, this);
if (numShrines >= 6) { if (numShrines >= 6) {
// Only for triggers of other Shrines // Only for triggers of other Shrines
Permanent permanent = game.getPermanent(event.getSourceId()); Permanent permanent = game.getPermanent(event.getSourceId());

View file

@ -1,34 +1,23 @@
package mage.cards.s; package mage.cards.s;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfFirstMainTriggeredAbility; import mage.abilities.dynamicvalue.common.ShrinesYouControlCount;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.discard.DiscardControllerEffect; import mage.abilities.effects.common.discard.DiscardControllerEffect;
import mage.abilities.hint.ValueHint; import mage.abilities.triggers.BeginningOfFirstMainTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.SuperType; import mage.constants.SuperType;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
import java.util.UUID; import java.util.UUID;
/** /**
* @author jmharmon * @author jmharmon
*/ */
public final class SanctumOfCalmWaters extends CardImpl { public final class SanctumOfCalmWaters extends CardImpl {
private static final FilterPermanent filter = new FilterControlledPermanent();
private static final PermanentsOnBattlefieldCount xValue = new PermanentsOnBattlefieldCount(filter);
static {
filter.add(SubType.SHRINE.getPredicate());
}
public SanctumOfCalmWaters(UUID ownerId, CardSetInfo setInfo) { public SanctumOfCalmWaters(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{U}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{U}");
@ -36,10 +25,9 @@ public final class SanctumOfCalmWaters extends CardImpl {
this.subtype.add(SubType.SHRINE); this.subtype.add(SubType.SHRINE);
// At the beginning of your precombat main phase, you may draw X cards, where X is the number of Shrines you control. If you do, discard a card. // At the beginning of your precombat main phase, you may draw X cards, where X is the number of Shrines you control. If you do, discard a card.
Ability ability = new BeginningOfFirstMainTriggeredAbility(new DrawCardSourceControllerEffect(xValue) Ability ability = new BeginningOfFirstMainTriggeredAbility(
.setText("you may draw X cards, where X is the number of Shrines you control"), true new DrawCardSourceControllerEffect(ShrinesYouControlCount.WHERE_X), true
) ).addHint(ShrinesYouControlCount.getHint());
.addHint(new ValueHint("Shrines you control", xValue));
ability.addEffect(new DiscardControllerEffect(1).setText("If you do, discard a card")); ability.addEffect(new DiscardControllerEffect(1).setText("If you do, discard a card"));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -1,33 +1,22 @@
package mage.cards.s; package mage.cards.s;
import mage.Mana; import mage.Mana;
import mage.abilities.triggers.BeginningOfFirstMainTriggeredAbility; import mage.abilities.dynamicvalue.common.ShrinesYouControlCount;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.mana.DynamicManaEffect; import mage.abilities.effects.mana.DynamicManaEffect;
import mage.abilities.hint.ValueHint; import mage.abilities.triggers.BeginningOfFirstMainTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.SuperType; import mage.constants.SuperType;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
import java.util.UUID; import java.util.UUID;
/** /**
*
* @author htrajan * @author htrajan
*/ */
public final class SanctumOfFruitfulHarvest extends CardImpl { public final class SanctumOfFruitfulHarvest extends CardImpl {
private static final FilterPermanent filter = new FilterControlledPermanent();
private static final PermanentsOnBattlefieldCount xValue = new PermanentsOnBattlefieldCount(filter);
static {
filter.add(SubType.SHRINE.getPredicate());
}
public SanctumOfFruitfulHarvest(UUID ownerId, CardSetInfo setInfo) { public SanctumOfFruitfulHarvest(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}");
@ -35,14 +24,10 @@ public final class SanctumOfFruitfulHarvest extends CardImpl {
this.subtype.add(SubType.SHRINE); this.subtype.add(SubType.SHRINE);
// At the beginning of your precombat main phase, add X mana of any one color, where X is the number of Shrines you control. // At the beginning of your precombat main phase, add X mana of any one color, where X is the number of Shrines you control.
this.addAbility(new BeginningOfFirstMainTriggeredAbility( this.addAbility(new BeginningOfFirstMainTriggeredAbility(new DynamicManaEffect(
new DynamicManaEffect( Mana.AnyMana(1), ShrinesYouControlCount.WHERE_X,
Mana.AnyMana(1), "add X mana of any one color, where X is the number of Shrines you control", true
xValue, )).addHint(ShrinesYouControlCount.getHint()));
"add X mana of any one color, where X is the number of Shrines you control",
true)
)
.addHint(new ValueHint("Shrines you control", xValue)));
} }
private SanctumOfFruitfulHarvest(final SanctumOfFruitfulHarvest card) { private SanctumOfFruitfulHarvest(final SanctumOfFruitfulHarvest card) {

View file

@ -3,18 +3,15 @@ package mage.cards.s;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.DiscardTargetCost; import mage.abilities.costs.common.DiscardTargetCost;
import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.dynamicvalue.common.ShrinesYouControlCount;
import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.hint.ValueHint;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.SuperType; import mage.constants.SuperType;
import mage.filter.FilterCard; import mage.filter.FilterCard;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.Predicates; import mage.filter.predicate.Predicates;
import mage.target.common.TargetCardInHand; import mage.target.common.TargetCardInHand;
import mage.target.common.TargetCreatureOrPlaneswalker; import mage.target.common.TargetCreatureOrPlaneswalker;
@ -28,12 +25,12 @@ import java.util.UUID;
public final class SanctumOfShatteredHeights extends CardImpl { public final class SanctumOfShatteredHeights extends CardImpl {
private static final FilterCard filter = new FilterCard("a land card or Shrine card"); private static final FilterCard filter = new FilterCard("a land card or Shrine card");
private static final FilterPermanent filterShrinesOnly = new FilterControlledPermanent("Shrine you control");
private static final PermanentsOnBattlefieldCount xValue = new PermanentsOnBattlefieldCount(filterShrinesOnly);
static { static {
filter.add(Predicates.or(CardType.LAND.getPredicate(), SubType.SHRINE.getPredicate())); filter.add(Predicates.or(
filterShrinesOnly.add(SubType.SHRINE.getPredicate()); CardType.LAND.getPredicate(),
SubType.SHRINE.getPredicate()
));
} }
public SanctumOfShatteredHeights(UUID ownerId, CardSetInfo setInfo) { public SanctumOfShatteredHeights(UUID ownerId, CardSetInfo setInfo) {
@ -43,10 +40,11 @@ public final class SanctumOfShatteredHeights extends CardImpl {
this.subtype.add(SubType.SHRINE); this.subtype.add(SubType.SHRINE);
// {1}, Discard a land card or Shrine card: Sanctum of Shattered Heights deals X damage to target creature or planeswalker, where X is the number of Shrines you control. // {1}, Discard a land card or Shrine card: Sanctum of Shattered Heights deals X damage to target creature or planeswalker, where X is the number of Shrines you control.
Ability ability = new SimpleActivatedAbility(new DamageTargetEffect(xValue) Ability ability = new SimpleActivatedAbility(
new DamageTargetEffect(ShrinesYouControlCount.WHERE_X)
.setText("{this} deals X damage to target creature or planeswalker, where X is the number of Shrines you control"), .setText("{this} deals X damage to target creature or planeswalker, where X is the number of Shrines you control"),
new ManaCostsImpl<>("{1}")) new GenericManaCost(1)
.addHint(new ValueHint("Shrines you control", xValue)); ).addHint(ShrinesYouControlCount.getHint());
ability.addCost(new DiscardTargetCost(new TargetCardInHand(filter))); ability.addCost(new DiscardTargetCost(new TargetCardInHand(filter)));
ability.addTarget(new TargetCreatureOrPlaneswalker()); ability.addTarget(new TargetCreatureOrPlaneswalker());
this.addAbility(ability); this.addAbility(ability);

View file

@ -1,34 +1,23 @@
package mage.cards.s; package mage.cards.s;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfFirstMainTriggeredAbility; import mage.abilities.dynamicvalue.common.ShrinesYouControlCount;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.LoseLifeOpponentsEffect; import mage.abilities.effects.common.LoseLifeOpponentsEffect;
import mage.abilities.hint.ValueHint; import mage.abilities.triggers.BeginningOfFirstMainTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.SuperType; import mage.constants.SuperType;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
import java.util.UUID; import java.util.UUID;
/** /**
*
* @author htrajan * @author htrajan
*/ */
public final class SanctumOfStoneFangs extends CardImpl { public final class SanctumOfStoneFangs extends CardImpl {
private static final FilterPermanent filter = new FilterControlledPermanent("");
private static final PermanentsOnBattlefieldCount xValue = new PermanentsOnBattlefieldCount(filter, null);
static {
filter.add(SubType.SHRINE.getPredicate());
}
public SanctumOfStoneFangs(UUID ownerId, CardSetInfo setInfo) { public SanctumOfStoneFangs(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}");
@ -37,10 +26,9 @@ public final class SanctumOfStoneFangs extends CardImpl {
// At the beginning of your precombat main phase, each opponent loses X life and you gain X life, where X is the number of Shrines you control. // At the beginning of your precombat main phase, each opponent loses X life and you gain X life, where X is the number of Shrines you control.
Ability ability = new BeginningOfFirstMainTriggeredAbility( Ability ability = new BeginningOfFirstMainTriggeredAbility(
new LoseLifeOpponentsEffect(xValue).setText("each opponent loses X life") new LoseLifeOpponentsEffect(ShrinesYouControlCount.WHERE_X).setText("each opponent loses X life")
) ).addHint(ShrinesYouControlCount.getHint());
.addHint(new ValueHint("Shrines you control", xValue)); ability.addEffect(new GainLifeEffect(ShrinesYouControlCount.WHERE_X).setText("and you gain X life, where X is the number of Shrines you control"));
ability.addEffect(new GainLifeEffect(xValue).setText("and you gain X life, where X is the number of Shrines you control"));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -4,19 +4,14 @@ import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.CostAdjuster; import mage.abilities.costs.CostAdjuster;
import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.ShrinesYouControlCount;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.InfoEffect; import mage.abilities.effects.common.InfoEffect;
import mage.abilities.effects.common.TapTargetEffect; import mage.abilities.effects.common.TapTargetEffect;
import mage.abilities.hint.Hint;
import mage.abilities.hint.ValueHint;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.SuperType; import mage.constants.SuperType;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.game.Game; import mage.game.Game;
import mage.players.Player; import mage.players.Player;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
@ -40,7 +35,7 @@ public final class SanctumOfTranquilLight extends CardImpl {
ability.addEffect(new InfoEffect("This ability costs {1} less to activate for each Shrine you control")); ability.addEffect(new InfoEffect("This ability costs {1} less to activate for each Shrine you control"));
ability.addTarget(new TargetCreaturePermanent()); ability.addTarget(new TargetCreaturePermanent());
ability.setCostAdjuster(SanctumOfTranquilLightAdjuster.instance); ability.setCostAdjuster(SanctumOfTranquilLightAdjuster.instance);
this.addAbility(ability.addHint(SanctumOfTranquilLightAdjuster.getHint())); this.addAbility(ability.addHint(ShrinesYouControlCount.getHint()));
} }
private SanctumOfTranquilLight(final SanctumOfTranquilLight card) { private SanctumOfTranquilLight(final SanctumOfTranquilLight card) {
@ -56,19 +51,11 @@ public final class SanctumOfTranquilLight extends CardImpl {
enum SanctumOfTranquilLightAdjuster implements CostAdjuster { enum SanctumOfTranquilLightAdjuster implements CostAdjuster {
instance; instance;
private static final FilterPermanent filter = new FilterControlledPermanent(SubType.SHRINE);
private static final DynamicValue count = new PermanentsOnBattlefieldCount(filter);
private static final Hint hint = new ValueHint("Shrines you control", count);
public static Hint getHint() {
return hint;
}
@Override @Override
public void reduceCost(Ability ability, Game game) { public void reduceCost(Ability ability, Game game) {
Player controller = game.getPlayer(ability.getControllerId()); Player controller = game.getPlayer(ability.getControllerId());
if (controller != null) { if (controller != null) {
CardUtil.reduceCost(ability, count.calculate(game, ability, null)); CardUtil.reduceCost(ability, ShrinesYouControlCount.FOR_EACH.calculate(game, ability, null));
} }
} }
} }

View file

@ -2,21 +2,15 @@ package mage.cards.s;
import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.ShrinesYouControlCount;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.counter.AddCountersAllEffect; import mage.abilities.effects.common.counter.AddCountersAllEffect;
import mage.abilities.hint.Hint;
import mage.abilities.hint.ValueHint;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.SuperType; import mage.constants.SuperType;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.filter.FilterPermanent;
import mage.filter.StaticFilters; import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import java.util.UUID; import java.util.UUID;
@ -25,14 +19,6 @@ import java.util.UUID;
*/ */
public final class SouthernAirTemple extends CardImpl { public final class SouthernAirTemple extends CardImpl {
private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(new FilterControlledPermanent(SubType.SHRINE));
private static final Hint hint = new ValueHint("Shrines you control", xValue);
private static final FilterPermanent filter = new FilterControlledPermanent(SubType.SHRINE, "another Shrine you control");
static {
filter.add(AnotherPredicate.instance);
}
public SouthernAirTemple(UUID ownerId, CardSetInfo setInfo) { public SouthernAirTemple(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}");
@ -41,13 +27,13 @@ public final class SouthernAirTemple extends CardImpl {
// When Southern Air Temple enters, put X +1/+1 counters on each creature you control, where X is the number of Shrines you control. // When Southern Air Temple enters, put X +1/+1 counters on each creature you control, where X is the number of Shrines you control.
this.addAbility(new EntersBattlefieldTriggeredAbility(new AddCountersAllEffect( this.addAbility(new EntersBattlefieldTriggeredAbility(new AddCountersAllEffect(
CounterType.P1P1.createInstance(), xValue, StaticFilters.FILTER_CONTROLLED_CREATURE CounterType.P1P1.createInstance(), ShrinesYouControlCount.WHERE_X, StaticFilters.FILTER_CONTROLLED_CREATURE
).setText("put X +1/+1 counters on each creature you control, where X is the number of Shrines you control")).addHint(hint)); ).setText("put X +1/+1 counters on each creature you control, where X is the number of Shrines you control")).addHint(ShrinesYouControlCount.getHint()));
// Whenever another Shrine you control enters, put a +1/+1 counter on each creature you control. // Whenever another Shrine you control enters, put a +1/+1 counter on each creature you control.
this.addAbility(new EntersBattlefieldAllTriggeredAbility(new AddCountersAllEffect( this.addAbility(new EntersBattlefieldAllTriggeredAbility(new AddCountersAllEffect(
CounterType.P1P1.createInstance(), StaticFilters.FILTER_CONTROLLED_CREATURE CounterType.P1P1.createInstance(), StaticFilters.FILTER_CONTROLLED_CREATURE
), filter)); ), StaticFilters.FILTER_ANOTHER_CONTROLLED_SHRINE));
} }
private SouthernAirTemple(final SouthernAirTemple card) { private SouthernAirTemple(final SouthernAirTemple card) {

View file

@ -2,19 +2,14 @@ package mage.cards.t;
import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.ShrinesYouControlCount;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.hint.Hint;
import mage.abilities.hint.ValueHint;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.SuperType; import mage.constants.SuperType;
import mage.filter.FilterPermanent; import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import java.util.UUID; import java.util.UUID;
@ -23,14 +18,6 @@ import java.util.UUID;
*/ */
public final class TheSpiritOasis extends CardImpl { public final class TheSpiritOasis extends CardImpl {
private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(new FilterControlledPermanent(SubType.SHRINE));
private static final Hint hint = new ValueHint("Shrines you control", xValue);
private static final FilterPermanent filter = new FilterControlledPermanent(SubType.SHRINE, "another Shrine you control");
static {
filter.add(AnotherPredicate.instance);
}
public TheSpiritOasis(UUID ownerId, CardSetInfo setInfo) { public TheSpiritOasis(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}");
@ -38,10 +25,10 @@ public final class TheSpiritOasis extends CardImpl {
this.subtype.add(SubType.SHRINE); this.subtype.add(SubType.SHRINE);
// When The Spirit Oasis enters, draw a card for each Shrine you control. // When The Spirit Oasis enters, draw a card for each Shrine you control.
this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(xValue))); this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(ShrinesYouControlCount.FOR_EACH)));
// Whenever another Shrine you control enters, draw a card. // Whenever another Shrine you control enters, draw a card.
this.addAbility(new EntersBattlefieldAllTriggeredAbility(new DrawCardSourceControllerEffect(1), filter)); this.addAbility(new EntersBattlefieldAllTriggeredAbility(new DrawCardSourceControllerEffect(1), StaticFilters.FILTER_ANOTHER_CONTROLLED_SHRINE));
} }
private TheSpiritOasis(final TheSpiritOasis card) { private TheSpiritOasis(final TheSpiritOasis card) {

View file

@ -198,6 +198,7 @@ public final class AvatarTheLastAirbender extends ExpansionSet {
cards.add(new SetCardInfo("Katara, the Fearless", 361, Rarity.RARE, mage.cards.k.KataraTheFearless.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Katara, the Fearless", 361, Rarity.RARE, mage.cards.k.KataraTheFearless.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Knowledge Seeker", 60, Rarity.UNCOMMON, mage.cards.k.KnowledgeSeeker.class)); cards.add(new SetCardInfo("Knowledge Seeker", 60, Rarity.UNCOMMON, mage.cards.k.KnowledgeSeeker.class));
cards.add(new SetCardInfo("Kyoshi Battle Fan", 257, Rarity.COMMON, mage.cards.k.KyoshiBattleFan.class)); cards.add(new SetCardInfo("Kyoshi Battle Fan", 257, Rarity.COMMON, mage.cards.k.KyoshiBattleFan.class));
cards.add(new SetCardInfo("Kyoshi Island Plaza", 184, Rarity.UNCOMMON, mage.cards.k.KyoshiIslandPlaza.class));
cards.add(new SetCardInfo("Kyoshi Village", 271, Rarity.COMMON, mage.cards.k.KyoshiVillage.class)); cards.add(new SetCardInfo("Kyoshi Village", 271, Rarity.COMMON, mage.cards.k.KyoshiVillage.class));
cards.add(new SetCardInfo("Kyoshi Warriors", 26, Rarity.COMMON, mage.cards.k.KyoshiWarriors.class)); cards.add(new SetCardInfo("Kyoshi Warriors", 26, Rarity.COMMON, mage.cards.k.KyoshiWarriors.class));
cards.add(new SetCardInfo("Leaves from the Vine", 185, Rarity.UNCOMMON, mage.cards.l.LeavesFromTheVine.class)); cards.add(new SetCardInfo("Leaves from the Vine", 185, Rarity.UNCOMMON, mage.cards.l.LeavesFromTheVine.class));

View file

@ -0,0 +1,55 @@
package mage.abilities.dynamicvalue.common;
import mage.abilities.Ability;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.effects.Effect;
import mage.abilities.hint.Hint;
import mage.abilities.hint.ValueHint;
import mage.constants.SubType;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.game.Game;
/**
* @author TheElk801
*/
public enum ShrinesYouControlCount implements DynamicValue {
WHERE_X("X", "the number of Shrines you control"),
FOR_EACH("1", "Shrine you control");
private static final Hint hint = new ValueHint("Shrines you control", WHERE_X);
public static Hint getHint() {
return hint;
}
private static final FilterPermanent filter = new FilterControlledPermanent(SubType.SHRINE);
private final String number;
private final String message;
ShrinesYouControlCount(String number, String message) {
this.number = number;
this.message = message;
}
@Override
public int calculate(Game game, Ability sourceAbility, Effect effect) {
return game.getBattlefield().count(filter, sourceAbility.getControllerId(), sourceAbility, game);
}
@Override
public ShrinesYouControlCount copy() {
return this;
}
@Override
public String getMessage() {
return message;
}
@Override
public String toString() {
return number;
}
}

View file

@ -54,6 +54,7 @@ public class GainLifeEffect extends OneShotEffect {
@Override @Override
public String getText(Mode mode) { public String getText(Mode mode) {
// TODO: this text generation probably needs reworking
if (staticText != null && !staticText.isEmpty()) { if (staticText != null && !staticText.isEmpty()) {
return staticText; return staticText;
} }

View file

@ -902,6 +902,13 @@ public final class StaticFilters {
FILTER_CONTROLLED_SAMURAI_OR_WARRIOR.setLockedFilter(true); FILTER_CONTROLLED_SAMURAI_OR_WARRIOR.setLockedFilter(true);
} }
public static final FilterControlledPermanent FILTER_ANOTHER_CONTROLLED_SHRINE = new FilterControlledPermanent(SubType.SHRINE, "another Shrine you control");
static {
FILTER_ANOTHER_CONTROLLED_SHRINE.add(AnotherPredicate.instance);
FILTER_ANOTHER_CONTROLLED_SHRINE.setLockedFilter(true);
}
public static final FilterPlaneswalkerPermanent FILTER_PERMANENT_PLANESWALKER = new FilterPlaneswalkerPermanent(); public static final FilterPlaneswalkerPermanent FILTER_PERMANENT_PLANESWALKER = new FilterPlaneswalkerPermanent();
static { static {