package forge.card.trigger; import forge.Card; import forge.AllZone; import forge.AllZoneUtil; import forge.CardList; import forge.Player; import forge.card.abilityFactory.AbilityFactory; import forge.card.cardFactory.CardFactoryUtil; import forge.card.spellability.SpellAbility; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; /** *

Abstract Trigger class.

* * @author Forge * @version $Id$ */ public abstract class Trigger { /** Constant nextID=0 */ private static int nextID = 0; /** *

resetIDs.

*/ public static void resetIDs() { nextID = 50000; } protected int ID = nextID++; protected String name; /** *

Getter for the field name.

* * @return a {@link java.lang.String} object. */ public String getName() { return name; } /** *

Setter for the field name.

* * @param n a {@link java.lang.String} object. */ public void setName(String n) { name = n; } /** *

setID.

* * @param id a int. */ public void setID(int id) { ID = id; } protected HashMap mapParams = new HashMap(); /** *

Getter for the field mapParams.

* * @return a {@link java.util.HashMap} object. */ public HashMap getMapParams() { return mapParams; } protected Map runParams; /** *

Setter for the field runParams.

* * @param runParams2 a {@link java.util.Map} object. */ public void setRunParams(Map runParams2) { runParams = runParams2; } /** *

Getter for the field runParams.

* * @return a {@link java.util.Map} object. */ public Map getRunParams() { return runParams; } protected SpellAbility overridingAbility = null; /** *

Getter for the field overridingAbility.

* * @return a {@link forge.card.spellability.SpellAbility} object. */ public SpellAbility getOverridingAbility() { return overridingAbility; } /** *

Setter for the field overridingAbility.

* * @param sa a {@link forge.card.spellability.SpellAbility} object. */ public void setOverridingAbility(SpellAbility sa) { overridingAbility = sa; } private HashMap storedTriggeredObjects = null; /** *

Setter for the field storedTriggeredObjects.

* * @param storedTriggeredObjects a {@link java.util.HashMap} object. * @since 1.0.15 */ public void setStoredTriggeredObjects(HashMap storedTriggeredObjects) { this.storedTriggeredObjects = storedTriggeredObjects; } /** *

Getter for the field storedTriggeredObjects.

* * @return a {@link java.util.HashMap} object. * @since 1.0.15 */ public HashMap getStoredTriggeredObjects() { return storedTriggeredObjects; } protected Card hostCard; /** *

Getter for the field hostCard.

* * @return a {@link forge.Card} object. */ public Card getHostCard() { return hostCard; } /** *

Setter for the field hostCard.

* * @param c a {@link forge.Card} object. */ public void setHostCard(Card c) { hostCard = c; } protected boolean isIntrinsic; public boolean getIsIntrinsic() { return isIntrinsic; } public void setIsIntrinsic(boolean b) { isIntrinsic = b; } /** *

Constructor for Trigger.

* * @param n a {@link java.lang.String} object. * @param params a {@link java.util.HashMap} object. * @param host a {@link forge.Card} object. */ public Trigger(String n, HashMap params, Card host, boolean intrinsic) { name = n; mapParams = new HashMap(); for (Map.Entry entry : params.entrySet()) { mapParams.put(entry.getKey(), entry.getValue()); } hostCard = host; isIntrinsic = intrinsic; } /** *

Constructor for Trigger.

* * @param params a {@link java.util.HashMap} object. * @param host a {@link forge.Card} object. */ public Trigger(HashMap params, Card host, boolean intrinsic) { mapParams = new HashMap(); for (Map.Entry entry : params.entrySet()) { mapParams.put(entry.getKey(), entry.getValue()); } hostCard = host; isIntrinsic = intrinsic; } /** *

toString.

* * @return a {@link java.lang.String} object. */ public String toString() { if (mapParams.containsKey("TriggerDescription") && !isSuppressed()) { return mapParams.get("TriggerDescription").replace("CARDNAME", hostCard.getName()); } else return ""; } /** *

zonesCheck.

* * @return a boolean. */ public boolean zonesCheck() { if (mapParams.containsKey("TriggerZones")) { ArrayList triggerZones = new ArrayList(); for (String s : mapParams.get("TriggerZones").split(",")) { triggerZones.add(s); } if (AllZone.getZone(hostCard) == null) { return false; } if (!triggerZones.contains(AllZone.getZone(hostCard).getZoneName())) { return false; } } return true; } /** *

phasesCheck.

* * @return a boolean. */ public boolean phasesCheck() { if (mapParams.containsKey("TriggerPhases")) { String phases = mapParams.get("TriggerPhases"); 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]); } ArrayList triggerPhases = new ArrayList(); for (String s : phases.split(",")) { triggerPhases.add(s); } if (!triggerPhases.contains(AllZone.getPhase().getPhase())) { return false; } } if (mapParams.containsKey("PlayerTurn")) if (!AllZone.getPhase().isPlayerTurn(hostCard.getController())) return false; if (mapParams.containsKey("OpponentTurn")) if (AllZone.getPhase().isPlayerTurn(hostCard.getController())) return false; return true; } /** *

requirementsCheck.

* * @return a boolean. */ public boolean requirementsCheck() { if (mapParams.containsKey("Metalcraft")) { if (mapParams.get("Metalcraft").equals("True") && !hostCard.getController().hasMetalcraft()) { return false; } } if (mapParams.containsKey("Threshold")) { if (mapParams.get("Threshold").equals("True") && !hostCard.getController().hasThreshold()) { return false; } } if (mapParams.containsKey("Hellbent")) { if (mapParams.get("Hellbent").equals("True") && !hostCard.getController().hasHellbent()) { return false; } } if (mapParams.containsKey("PlayersPoisoned")) { if (mapParams.get("PlayersPoisoned").equals("You") && hostCard.getController().getPoisonCounters() == 0) { return false; } else if (mapParams.get("PlayersPoisoned").equals("Opponent") && hostCard.getController().getOpponent().getPoisonCounters() == 0) { return false; } else if (mapParams.get("PlayersPoisoned").equals("Each") && !(hostCard.getController().getPoisonCounters() != 0 && hostCard.getController().getPoisonCounters() != 0)) { return false; } } if (mapParams.containsKey("LifeTotal")) { String player = mapParams.get("LifeTotal"); String lifeCompare = "GE1"; int life = 1; if (player.equals("You")) { life = hostCard.getController().getLife(); } if (player.equals("Opponent")) { life = hostCard.getController().getOpponent().getLife(); } if (mapParams.containsKey("LifeAmount")) { lifeCompare = mapParams.get("LifeAmount"); } int right = 1; String rightString = lifeCompare.substring(2); if (rightString.equals("X")) { right = CardFactoryUtil.xCount(hostCard, hostCard.getSVar("X")); } else { right = Integer.parseInt(lifeCompare.substring(2)); } if (!AllZoneUtil.compare(life, lifeCompare, right)) { return false; } } if (mapParams.containsKey("IsPresent")) { String sIsPresent = mapParams.get("IsPresent"); String presentCompare = "GE1"; String presentZone = "Battlefield"; String presentPlayer = "Any"; if (mapParams.containsKey("PresentCompare")) { presentCompare = mapParams.get("PresentCompare"); } if (mapParams.containsKey("PresentZone")) { presentZone = mapParams.get("PresentZone"); } if (mapParams.containsKey("PresentPlayer")) { presentPlayer = mapParams.get("PresentPlayer"); } CardList list = new CardList(); if (presentPlayer.equals("You") || presentPlayer.equals("Any")) { list.addAll(AllZoneUtil.getCardsInZone(presentZone, hostCard.getController())); } if (presentPlayer.equals("Opponent") || presentPlayer.equals("Any")) { list.addAll(AllZoneUtil.getCardsInZone(presentZone, hostCard.getController().getOpponent())); } list = list.getValidCards(sIsPresent.split(","), hostCard.getController(), hostCard); int right = 1; String rightString = presentCompare.substring(2); if (rightString.equals("X")) { right = CardFactoryUtil.xCount(hostCard, hostCard.getSVar("X")); } else { right = Integer.parseInt(presentCompare.substring(2)); } int left = list.size(); if (!AllZoneUtil.compare(left, presentCompare, right)) { return false; } } if (mapParams.containsKey("IsPresent2")) { String sIsPresent = mapParams.get("IsPresent2"); String presentCompare = "GE1"; String presentZone = "Battlefield"; String presentPlayer = "Any"; if (mapParams.containsKey("PresentCompare2")) { presentCompare = mapParams.get("PresentCompare2"); } if (mapParams.containsKey("PresentZone2")) { presentZone = mapParams.get("PresentZone2"); } if (mapParams.containsKey("PresentPlayer2")) { presentPlayer = mapParams.get("PresentPlayer2"); } CardList list = new CardList(); if (presentPlayer.equals("You") || presentPlayer.equals("Any")) { list.addAll(AllZoneUtil.getCardsInZone(presentZone, hostCard.getController())); } if (presentPlayer.equals("Opponent") || presentPlayer.equals("Any")) { list.addAll(AllZoneUtil.getCardsInZone(presentZone, hostCard.getController().getOpponent())); } list = list.getValidCards(sIsPresent.split(","), hostCard.getController(), hostCard); int right = 1; String rightString = presentCompare.substring(2); if (rightString.equals("X")) { right = CardFactoryUtil.xCount(hostCard, hostCard.getSVar("X")); } else { right = Integer.parseInt(presentCompare.substring(2)); } int left = list.size(); if (!AllZoneUtil.compare(left, presentCompare, right)) { return false; } } if (mapParams.containsKey("CheckSVar")) { int sVar = AbilityFactory.calculateAmount(AllZoneUtil.getCardState(hostCard), mapParams.get("CheckSVar"), null); String comparator = "GE1"; if (mapParams.containsKey("SVarCompare")) { comparator = mapParams.get("SVarCompare"); } String svarOperator = comparator.substring(0, 2); String svarOperand = comparator.substring(2); int operandValue = AbilityFactory.calculateAmount(AllZoneUtil.getCardState(hostCard), svarOperand, null); if (!AllZoneUtil.compare(sVar, svarOperator, operandValue)) { return false; } } return true; } /** *

matchesValid.

* * @param o a {@link java.lang.Object} object. * @param valids an array of {@link java.lang.String} objects. * @param srcCard a {@link forge.Card} object. * @return a boolean. */ public boolean matchesValid(Object o, String[] valids, Card srcCard) { if (o instanceof Card) { Card c = (Card) o; return c.isValidCard(valids, srcCard.getController(), srcCard); } if (o instanceof Player) { for (String v : valids) { if (v.equalsIgnoreCase("Player") || v.equalsIgnoreCase("Each")) { return true; } if (v.equalsIgnoreCase("Opponent")) { if (o.equals(srcCard.getController().getOpponent())) { return true; } } if (v.equalsIgnoreCase("You")) { return o.equals(srcCard.getController()); } if (v.equalsIgnoreCase("EnchantedController")) { return ((Player) o).isPlayer(srcCard.getEnchantingCard().getController()); } } } return false; } /** *

isSecondary.

* * @return a boolean. */ public boolean isSecondary() { if (mapParams.containsKey("Secondary")) { if (mapParams.get("Secondary").equals("True")) return true; } return false; } /** {@inheritDoc} */ @Override public boolean equals(Object o) { if (!(o instanceof Trigger)) return false; return this.ID == ((Trigger) o).ID; } /** *

performTest.

* * @param runParams2 a {@link java.util.HashMap} object. * @return a boolean. */ public abstract boolean performTest(java.util.Map runParams2); /** *

getCopy.

* * @return a {@link forge.card.trigger.Trigger} object. */ public abstract Trigger getCopy(); /** *

setTriggeringObjects.

* * @param sa a {@link forge.card.spellability.SpellAbility} object. */ public abstract void setTriggeringObjects(SpellAbility sa); protected boolean temporary = false; public void setTemporary(boolean temp) { temporary = temp; } public boolean isTemporary() { return temporary; } protected boolean suppressed = false; protected boolean temporarilySuppressed = false; /*public void setSuppressed(boolean supp) { suppressed = supp; }*/ public void setTemporarilySuppressed(boolean supp) { temporarilySuppressed = supp; } public boolean isSuppressed() { return (suppressed || temporarilySuppressed); } }