package magic.model.action; import magic.model.MagicGame; import magic.model.MagicLocationType; import magic.model.MagicPermanent; import magic.model.MagicPlayer; import magic.model.MagicPlayerState; import magic.model.trigger.MagicTriggerType; public class RemoveFromPlayAction extends MagicAction { private final MagicPermanent permanent; private MagicLocationType toLocation; private boolean valid; private boolean update; private RemoveFromPlayAction(final MagicPermanent aPermanent, final MagicLocationType aToLocation, final boolean aUpdate) { permanent = aPermanent; toLocation = aToLocation; update = aUpdate; } // default to update after remove public RemoveFromPlayAction(final MagicPermanent aPermanent, final MagicLocationType aToLocation) { this(aPermanent, aToLocation, true); } // version that doesn't update, caller should call update public static RemoveFromPlayAction NoUpdate(final MagicPermanent aPermanent, final MagicLocationType aToLocation) { return new RemoveFromPlayAction(aPermanent, aToLocation, false); } public boolean isValid() { return valid; } public boolean isPermanent(final MagicPermanent aPermanent) { return permanent == aPermanent; } public MagicPermanent getPermanent() { return permanent; } public boolean to(final MagicLocationType loc) { return toLocation == loc; } public void setToLocation(final MagicLocationType aToLocation) { toLocation = aToLocation; } @Override public void doAction(final MagicGame game) { final MagicPlayer controller=permanent.getController(); // Check if this is still a valid action. valid = permanent.isValid(); if (!valid) { return; } final int score=permanent.getScore()+permanent.getStaticScore(); // Execute trigger here so that full permanent state is preserved. game.executeTrigger(MagicTriggerType.WhenLeavesPlay, this); if (toLocation==MagicLocationType.Graveyard) { game.executeTrigger(MagicTriggerType.WhenOtherDies,permanent); if (permanent.isCreature()) { game.setCreatureDiedThisTurn(true); } } // Equipment if (permanent.getEquippedCreature().isValid()) { permanent.getEquippedCreature().removeEquipment(permanent); } for (final MagicPermanent equipment : permanent.getEquipmentPermanents()) { equipment.setEquippedCreature(MagicPermanent.NONE); } // Aura if (permanent.getEnchantedPermanent().isValid()) { permanent.getEnchantedPermanent().removeAura(permanent); } for (final MagicPermanent aura : permanent.getAuraPermanents()) { aura.setEnchantedPermanent(MagicPermanent.NONE); } // Soulbond if (permanent.getPairedCreature().isValid()) { game.doAction(new SoulbondAction(permanent,permanent.getPairedCreature(),false)); } game.doAction(new RemoveFromCombatAction(permanent)); controller.removePermanent(permanent); setScore(controller,permanent.getStaticScore()-score); game.doAction(new MoveCardAction(permanent,toLocation)); game.addDelayedAction(new RemoveTriggersStaticsAction(permanent)); game.doAction(new ChangePlayerStateAction(controller, MagicPlayerState.Revolt)); if (permanent.isFaceDown()) { game.doAction(new RevealAction(permanent.getCard())); } if (update) { game.update(); } game.setStateCheckRequired(); } @Override public void undoAction(final MagicGame game) { if (!valid) { return; } permanent.getController().addPermanent(permanent); // Equipment if (permanent.getEquippedCreature().isValid()) { permanent.getEquippedCreature().addEquipment(permanent); } for (final MagicPermanent equipment : permanent.getEquipmentPermanents()) { equipment.setEquippedCreature(permanent); } // Aura if (permanent.getEnchantedPermanent().isValid()) { permanent.getEnchantedPermanent().addAura(permanent); } for (final MagicPermanent aura : permanent.getAuraPermanents()) { aura.setEnchantedPermanent(permanent); } } @Override public String toString() { return super.toString()+" ("+permanent.getName()+','+permanent.getAuraPermanents().size()+')'; } }