package forge.card.spellability; import forge.*; import forge.card.abilityFactory.AbilityFactory; import forge.card.cardFactory.CardFactoryUtil; import java.util.HashMap; /** * <p>SpellAbility_Restriction class.</p> * * @author Forge * @version $Id: $ */ public class SpellAbility_Restriction extends SpellAbility_Variables { // A class for handling SpellAbility Restrictions. These restrictions include: // Zone, Phase, OwnTurn, Speed (instant/sorcery), Amount per Turn, Player, // Threshold, Metalcraft, LevelRange, etc // Each value will have a default, that can be overridden (mostly by AbilityFactory) // The canPlay function will use these values to determine if the current game state is ok with these restrictions /** * <p>Constructor for SpellAbility_Restriction.</p> */ public SpellAbility_Restriction() { } /** * <p>setRestrictions.</p> * * @param params a {@link java.util.HashMap} object. * @since 1.0.15 */ public void setRestrictions(HashMap<String, String> params) { if (params.containsKey("Activation")) { String value = params.get("Activation"); if (value.equals("Threshold")) setThreshold(true); if (value.equals("Metalcraft")) setMetalcraft(true); if (value.equals("Hellbent")) setHellbent(true); } if (params.containsKey("ActivationZone")) setZone(params.get("ActivationZone")); if (params.containsKey("Flashback")) { setZone("Graveyard"); } if (params.containsKey("SorcerySpeed")) setSorcerySpeed(true); if (params.containsKey("PlayerTurn")) setPlayerTurn(true); if (params.containsKey("OpponentTurn")) setOpponentTurn(true); if (params.containsKey("AnyPlayer")) setAnyPlayer(true); if (params.containsKey("ActivationLimit")) setActivationLimit(Integer.parseInt(params.get("ActivationLimit"))); if (params.containsKey("ActivationNumberSacrifice")) setActivationNumberSacrifice(Integer.parseInt(params.get("ActivationNumberSacrifice"))); if (params.containsKey("ActivationPhases")) { String phases = params.get("ActivationPhases"); if (phases.contains("->")) { // If phases lists a Range, split and Build Activate String // Combat_Begin->Combat_End (During Combat) // Draw-> (After Upkeep) // Upkeep->Combat_Begin (Before Declare Attackers) String[] split = phases.split("->", 2); phases = AllZone.getPhase().buildActivateString(split[0], split[1]); } setPhases(phases); } if (params.containsKey("ActivationCardsInHand")) setActivateCardsInHand(Integer.parseInt(params.get("ActivationCardsInHand"))); if (params.containsKey("Planeswalker")) setPlaneswalker(true); if (params.containsKey("IsPresent")) { setIsPresent(params.get("IsPresent")); if (params.containsKey("PresentCompare")) setPresentCompare(params.get("PresentCompare")); } if (params.containsKey("IsNotPresent")) { setIsPresent(params.get("IsNotPresent")); setPresentCompare("EQ0"); } //basically PresentCompare for life totals: if (params.containsKey("ActivationLifeTotal")) { lifeTotal = params.get("ActivationLifeTotal"); if (params.containsKey("ActivationLifeAmount")) { lifeAmount = params.get("ActivationLifeAmount"); } } if (params.containsKey("CheckSVar")) { setSvarToCheck(params.get("CheckSVar")); } if (params.containsKey("SVarCompare")) { setSvarOperator(params.get("SVarCompare").substring(0, 2)); setSvarOperand(params.get("SVarCompare").substring(2)); } }//end setRestrictions() /** * <p>canPlay.</p> * * @param c a {@link forge.Card} object. * @param sa a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ public boolean canPlay(Card c, SpellAbility sa) { if (!AllZone.getZone(c).getZoneName().equals(zone)) return false; Player activator = sa.getActivatingPlayer(); if (activator == null) { activator = c.getController(); System.out.println(c.getName() + " Did not have activator set in SpellAbility_Restriction.canPlay()"); } if (bSorcerySpeed && !Phase.canCastSorcery(activator)) return false; if (bPlayerTurn && !AllZone.getPhase().isPlayerTurn(activator)) return false; if (bOpponentTurn && AllZone.getPhase().isPlayerTurn(activator)) return false; if (!bAnyPlayer && !activator.equals(c.getController())) return false; if (activationLimit != -1 && numberTurnActivations >= activationLimit) return false; if (phases.size() > 0) { boolean isPhase = false; String currPhase = AllZone.getPhase().getPhase(); for (String s : phases) { if (s.equals(currPhase)) { isPhase = true; break; } } if (!isPhase) return false; } if (nCardsInHand != -1) { if (AllZoneUtil.getPlayerHand(activator).size() != nCardsInHand) return false; } if (hellbent) { if (!activator.hasHellbent()) return false; } if (threshold) { if (!activator.hasThreshold()) return false; } if (metalcraft) { if (!activator.hasMetalcraft()) return false; } if (sIsPresent != null) { CardList list = AllZoneUtil.getCardsInPlay(); list = list.getValidCards(sIsPresent.split(","), activator, c); int right = 1; String rightString = presentCompare.substring(2); if (rightString.equals("X")) { right = CardFactoryUtil.xCount(c, c.getSVar("X")); } else { right = Integer.parseInt(presentCompare.substring(2)); } int left = list.size(); if (!AllZoneUtil.compare(left, presentCompare, right)) return false; } if (lifeTotal != null) { int life = 1; if (lifeTotal.equals("You")) { life = activator.getLife(); } if (lifeTotal.equals("Opponent")) { life = activator.getOpponent().getLife(); } int right = 1; String rightString = lifeAmount.substring(2); if (rightString.equals("X")) { right = CardFactoryUtil.xCount(sa.getSourceCard(), sa.getSourceCard().getSVar("X")); } else { right = Integer.parseInt(lifeAmount.substring(2)); } if (!AllZoneUtil.compare(life, lifeAmount, right)) { return false; } } if (pwAbility) { // Planeswalker abilities can only be activated as Sorceries if (!Phase.canCastSorcery(activator)) return false; for (SpellAbility pwAbs : c.getSpellAbility()) { // check all abilities on card that have their planeswalker restriction set to confirm they haven't been activated SpellAbility_Restriction restrict = pwAbs.getRestrictions(); if (restrict.getPlaneswalker() && restrict.getNumberTurnActivations() > 0) return false; } } if (svarToCheck != null) { int svarValue = AbilityFactory.calculateAmount(c, svarToCheck, sa); int operandValue = AbilityFactory.calculateAmount(c, svarOperand, sa); if (!AllZoneUtil.compare(svarValue, svarOperator, operandValue)) return false; } return true; }//canPlay() }//end class SpellAbility_Restriction