package magic.model.event; import magic.data.CardDefinitions; import magic.model.MagicCard; import magic.model.MagicCardDefinition; import magic.model.MagicColor; import magic.model.MagicGame; import magic.model.MagicAbility; import magic.model.MagicLocationType; import magic.model.MagicManaCost; import magic.model.MagicSource; import magic.model.MagicSubType; import magic.model.MagicType; import magic.model.MagicPayedCost; import magic.model.MagicMessage; import magic.model.condition.MagicCondition; import magic.model.stack.MagicCardOnStack; import magic.model.action.MagicPlayMod; import magic.model.action.PutItemOnStackAction; import magic.model.action.RemoveCardAction; import magic.model.action.PlayCardFromStackAction; import java.util.Arrays; public class MagicMorphCastActivation extends MagicHandCastActivation { public static final MagicMorphCastActivation Morph = new MagicMorphCastActivation("Morph"); public static final MagicMorphCastActivation Megamorph = new MagicMorphCastActivation("Megamorph"); private MagicMorphCastActivation(final String name) { super( new MagicCondition[]{ MagicCondition.SORCERY_CONDITION }, new MagicActivationHints(MagicTiming.Main, true), name ); } @Override public Iterable<? extends MagicEvent> getCostEvent(final MagicCard source) { final MagicCardOnStack morphSpell = genMorphSpell(source); final MagicManaCost modCost = source.getGame().modCost( MagicCard.createTokenCard(morphSpell, morphSpell.getController()), MagicManaCost.create("{3}") ); return Arrays.asList( new MagicPayManaCostEvent( morphSpell, modCost ) ); } @Override public MagicEvent getEvent(final MagicSource source) { return new MagicEvent( source, EVENT_ACTION, "Play a face-down card." ); } private MagicCardOnStack genMorphSpell(final MagicCard card) { final MagicCardDefinition morph = CardDefinitions.getCard("Morph"); return new MagicCardOnStack( card, MagicMorphCastActivation.this, card.getGame().getPayedCost() ) { @Override public MagicCardDefinition getCardDefinition() { return morph; } @Override public boolean hasColor(final MagicColor color) { return morph.hasColor(color); } @Override public boolean hasAbility(final MagicAbility ability) { return morph.hasAbility(ability); } @Override public boolean hasSubType(final MagicSubType subType) { return morph.hasSubType(subType); } @Override public boolean hasType(final MagicType type) { return morph.hasType(type); } @Override public boolean canBeCountered() { return hasAbility(MagicAbility.CannotBeCountered) == false; } @Override public int getConvertedCost() { return 0; } @Override public String getName() { return "Face-down creature spell #" + (getId() % 1000); } @Override public boolean isFaceDown() { return true; } }; } private final MagicEventAction EVENT_ACTION = (final MagicGame game, final MagicEvent event) -> { final MagicCard card = event.getCard(); game.doAction(new RemoveCardAction(card,MagicLocationType.OwnersHand)); game.doAction(new PutItemOnStackAction(genMorphSpell(card))); }; @Override public MagicEvent getEvent(final MagicCardOnStack cardOnStack,final MagicPayedCost payedCost) { return new MagicEvent( cardOnStack, this, "Put " + MagicMessage.getCardToken("face-down creature", cardOnStack.getCard()) + " onto the battlefield." ); } @Override public void executeEvent(final MagicGame game, final MagicEvent event) { final MagicCardOnStack spell = event.getCardOnStack(); final MagicCardDefinition carddef = spell.getSource().getCardDefinition(); game.doAction(new PlayCardFromStackAction(spell, carddef, MagicPlayMod.MORPH)); } }