package forge.card.spellability; import forge.*; import forge.error.ErrorViewer; /** * <p>Abstract Spell class.</p> * * @author Forge * @version $Id: $ */ abstract public class Spell extends SpellAbility implements java.io.Serializable, Cloneable { /** Constant <code>serialVersionUID=-7930920571482203460L</code> */ private static final long serialVersionUID = -7930920571482203460L; /** * <p>Constructor for Spell.</p> * * @param sourceCard a {@link forge.Card} object. */ public Spell(Card sourceCard) { super(SpellAbility.Spell, sourceCard); setManaCost(sourceCard.getManaCost()); setStackDescription(sourceCard.getSpellText()); getRestrictions().setZone(Constant.Zone.Hand); } /** * <p>Constructor for Spell.</p> * * @param sourceCard a {@link forge.Card} object. * @param abCost a {@link forge.card.spellability.Cost} object. * @param abTgt a {@link forge.card.spellability.Target} object. */ public Spell(Card sourceCard, Cost abCost, Target abTgt) { super(SpellAbility.Spell, sourceCard); setManaCost(sourceCard.getManaCost()); setPayCosts(abCost); setTarget(abTgt); setStackDescription(sourceCard.getSpellText()); getRestrictions().setZone(Constant.Zone.Hand); } /** {@inheritDoc} */ @Override public boolean canPlay() { if (AllZone.getStack().isSplitSecondOnStack()) return false; Card card = getSourceCard(); if (card.isUnCastable()) return false; if (payCosts != null) if (!Cost_Payment.canPayAdditionalCosts(payCosts, this)) return false; if (!this.getRestrictions().canPlay(card, this)) return false; return (card.isInstant() || card.hasKeyword("Flash") || Phase.canCastSorcery(card.getController())); }//canPlay() /** {@inheritDoc} */ @Override public boolean canPlayAI() { Card card = getSourceCard(); if (card.getSVar("NeedsToPlay").length() > 0) { String needsToPlay = card.getSVar("NeedsToPlay"); CardList list = AllZoneUtil.getCardsInPlay(); list = list.getValidCards(needsToPlay.split(","), card.getController(), card); if (list.isEmpty()) return false; } return super.canPlayAI(); } /** {@inheritDoc} */ @Override public String getStackDescription() { return super.getStackDescription(); } /** {@inheritDoc} */ @Override public Object clone() { try { return super.clone(); } catch (Exception ex) { ErrorViewer.showError(ex); throw new RuntimeException("Spell : clone() error, " + ex); } } }