package magic.model.mstatic; import java.util.Set; import magic.model.MagicAmount; import magic.model.MagicCardDefinition; import magic.model.MagicChangeCardDefinition; import magic.model.MagicGame; import magic.model.MagicPermanent; import magic.model.MagicPlayer; import magic.model.MagicPowerToughness; import magic.model.MagicSubType; /* 604.3a A static ability is a characteristic-defining ability if it meets the following criteria: (1) It defines an object's colors, subtypes, power, or toughness; (2) it is printed on the card it affects, it was granted to the token it affects by the effect that created the token, or it was acquired by the object it affects as the result of a copy effect or text-changing effect; (3) it does not directly affect the characteristics of any other objects; (4) it is not an ability that an object grants to itself; and (5) it does not set the values of such characteristics only if certain conditions are met. */ public abstract class MagicCDA implements MagicChangeCardDefinition { public static final MagicCDA Changeling = new MagicCDA() { @Override public void getSubTypeFlags(final MagicGame game, final MagicPlayer player, final Set<MagicSubType> flags) { flags.addAll(MagicSubType.ALL_CREATURES); } }; public static final MagicCDA Devoid = new MagicCDA() { @Override public int getColorFlags(final MagicGame game, final MagicPlayer player,final int flags) { return 0; } }; public static MagicCDA setPT(final int base, final MagicAmount count) { return new MagicCDA() { @Override public void modPowerToughness(final MagicGame game, final MagicPlayer player, final MagicPermanent permanent, final MagicPowerToughness pt) { final int amount = count.getAmount(permanent, player); pt.set(base + amount, base + amount); } }; } public static MagicCDA setPower(final int base, final MagicAmount count) { return new MagicCDA() { @Override public void modPowerToughness(final MagicGame game, final MagicPlayer player, final MagicPermanent permanent, final MagicPowerToughness pt) { final int amount = count.getAmount(permanent, player); pt.setPower(base + amount); } }; } public static MagicCDA setToughness(final int base, final MagicAmount count) { return new MagicCDA() { @Override public void modPowerToughness(final MagicGame game, final MagicPlayer player, final MagicPermanent permanent, final MagicPowerToughness pt) { final int amount = count.getAmount(permanent, player); pt.setToughness(base + amount); } }; } public int getColorFlags(final MagicGame game, final MagicPlayer player,final int flags) { return flags; } public void getSubTypeFlags(final MagicGame game, final MagicPlayer player, final Set<MagicSubType> flags) {} public void modPowerToughness(final MagicGame game, final MagicPlayer player, final MagicPermanent permanent, final MagicPowerToughness pt) {} @Override public void change(final MagicCardDefinition cdef) { cdef.addCDA(this); } }