From 10fdf5b82a192fc32ce69cb5f589622fd3110b69 Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Fri, 15 Mar 2013 21:06:17 +0000 Subject: [PATCH 1/5] eliminated duplicate code of requirementsCheck() in Trigger and ReplacementEffect some references changed to basic class --- src/main/java/forge/StaticEffects.java | 3 +- .../forge/card/TriggerReplacementBase.java | 179 +++++++++++++++ .../ability/effects/AnimateAllEffect.java | 3 +- .../card/ability/effects/AnimateEffect.java | 3 +- .../card/replacement/ReplacementEffect.java | 209 +----------------- .../StaticAbilityContinuous.java | 3 +- src/main/java/forge/card/trigger/Trigger.java | 200 +---------------- src/main/java/forge/game/GameAction.java | 4 +- 8 files changed, 203 insertions(+), 401 deletions(-) diff --git a/src/main/java/forge/StaticEffects.java b/src/main/java/forge/StaticEffects.java index 0ddbb669f96..3f54e1effdb 100644 --- a/src/main/java/forge/StaticEffects.java +++ b/src/main/java/forge/StaticEffects.java @@ -25,6 +25,7 @@ import java.util.List; import com.esotericsoftware.minlog.Log; +import forge.card.TriggerReplacementBase; import forge.card.replacement.ReplacementEffect; import forge.card.spellability.SpellAbility; import forge.card.staticability.StaticAbility; @@ -236,7 +237,7 @@ public class StaticEffects { stA.setTemporarilySuppressed(false); } final ArrayList replacementEffects = affectedCard.getReplacementEffects(); - for (final ReplacementEffect rE : replacementEffects) { + for (final TriggerReplacementBase rE : replacementEffects) { rE.setTemporarilySuppressed(false); } } diff --git a/src/main/java/forge/card/TriggerReplacementBase.java b/src/main/java/forge/card/TriggerReplacementBase.java index 1ab478a4d51..1b4e7a713db 100644 --- a/src/main/java/forge/card/TriggerReplacementBase.java +++ b/src/main/java/forge/card/TriggerReplacementBase.java @@ -1,13 +1,22 @@ package forge.card; +import java.util.ArrayList; import java.util.EnumSet; +import java.util.List; +import java.util.Map; import forge.Card; +import forge.CardLists; +import forge.CardUtil; import forge.GameEntity; +import forge.Singletons; +import forge.card.ability.AbilityUtils; import forge.card.cardfactory.CardFactoryUtil; import forge.card.spellability.SpellAbility; +import forge.game.player.Player; import forge.game.zone.Zone; import forge.game.zone.ZoneType; +import forge.util.Expressions; /** * Base class for Triggers and ReplacementEffects. @@ -144,4 +153,174 @@ public abstract class TriggerReplacementBase { public final boolean isSuppressed() { return (this.suppressed || this.temporarilySuppressed); } + + protected boolean meetsCommonRequirements(Map params) { + + Player hostController = this.getHostCard().getController(); + + if ("True".equalsIgnoreCase(params.get("Metalcraft")) && !hostController.hasMetalcraft()) return false; + if ("True".equalsIgnoreCase(params.get("Threshold")) && !hostController.hasThreshold()) return false; + if ("True".equalsIgnoreCase(params.get("Hellbent")) && !hostController.hasHellbent()) return false; + if ("True".equalsIgnoreCase(params.get("Bloodthirst")) && !hostController.hasBloodthirst()) return false; + if ("True".equalsIgnoreCase(params.get("FatefulHour")) && hostController.getLife() > 5) return false; + + if ("You".equalsIgnoreCase(params.get("PlayersPoisoned")) && hostController.getPoisonCounters() == 0) return false; + if ("Opponent".equalsIgnoreCase(params.get("PlayersPoisoned")) && hostController.getOpponent().getPoisonCounters() == 0) return false; + if ("Each".equalsIgnoreCase(params.get("PlayersPoisoned"))) { + for( Player p : Singletons.getModel().getGame().getPlayers()) + if( p.getPoisonCounters() == 0 ) + return false; + } + + if (params.containsKey("LifeTotal")) { + final String player = params.get("LifeTotal"); + String lifeCompare = "GE1"; + int life = 1; + + if (player.equals("You")) { + life = hostController.getLife(); + } + if (player.equals("Opponent")) { + life = hostController.getOpponent().getLife(); + } + + if (params.containsKey("LifeAmount")) { + lifeCompare = params.get("LifeAmount"); + } + + int right = 1; + final String rightString = lifeCompare.substring(2); + try { + right = Integer.parseInt(rightString); + } catch (final NumberFormatException nfe) { + right = CardFactoryUtil.xCount(this.getHostCard(), this.getHostCard().getSVar(rightString)); + } + + if (!Expressions.compare(life, lifeCompare, right)) { + return false; + } + } + + + if (params.containsKey("IsPresent")) { + final String sIsPresent = params.get("IsPresent"); + String presentCompare = "GE1"; + ZoneType presentZone = ZoneType.Battlefield; + String presentPlayer = "Any"; + if (params.containsKey("PresentCompare")) { + presentCompare = params.get("PresentCompare"); + } + if (params.containsKey("PresentZone")) { + presentZone = ZoneType.smartValueOf(params.get("PresentZone")); + } + if (params.containsKey("PresentPlayer")) { + presentPlayer = params.get("PresentPlayer"); + } + List list = new ArrayList(); + if (presentPlayer.equals("You") || presentPlayer.equals("Any")) { + list.addAll(this.getHostCard().getController().getCardsIn(presentZone)); + } + if (presentPlayer.equals("Opponent") || presentPlayer.equals("Any")) { + list.addAll(this.getHostCard().getController().getOpponent().getCardsIn(presentZone)); + } + + list = CardLists.getValidCards(list, sIsPresent.split(","), this.getHostCard().getController(), this.getHostCard()); + + int right = 1; + final String rightString = presentCompare.substring(2); + if (rightString.equals("X")) { + right = CardFactoryUtil.xCount(this.getHostCard(), this.getHostCard().getSVar("X")); + } else { + right = Integer.parseInt(presentCompare.substring(2)); + } + final int left = list.size(); + + if (!Expressions.compare(left, presentCompare, right)) { + return false; + } + + } + + if (params.containsKey("IsPresent2")) { + final String sIsPresent = params.get("IsPresent2"); + String presentCompare = "GE1"; + ZoneType presentZone = ZoneType.Battlefield; + String presentPlayer = "Any"; + if (params.containsKey("PresentCompare2")) { + presentCompare = params.get("PresentCompare2"); + } + if (params.containsKey("PresentZone2")) { + presentZone = ZoneType.smartValueOf(params.get("PresentZone2")); + } + if (params.containsKey("PresentPlayer2")) { + presentPlayer = params.get("PresentPlayer2"); + } + List list = new ArrayList(); + if (presentPlayer.equals("You") || presentPlayer.equals("Any")) { + list.addAll(this.getHostCard().getController().getCardsIn(presentZone)); + } + if (presentPlayer.equals("Opponent") || presentPlayer.equals("Any")) { + list.addAll(this.getHostCard().getController().getOpponent().getCardsIn(presentZone)); + } + + list = CardLists.getValidCards(list, sIsPresent.split(","), this.getHostCard().getController(), this.getHostCard()); + + int right = 1; + final String rightString = presentCompare.substring(2); + if (rightString.equals("X")) { + right = CardFactoryUtil.xCount(this.getHostCard(), this.getHostCard().getSVar("X")); + } else { + right = Integer.parseInt(presentCompare.substring(2)); + } + final int left = list.size(); + + if (!Expressions.compare(left, presentCompare, right)) { + return false; + } + + } + + if (params.containsKey("CheckSVar")) { + final int sVar = AbilityUtils.calculateAmount(Singletons.getModel().getGame().getCardState(this.getHostCard()), params.get("CheckSVar"), null); + String comparator = "GE1"; + if (params.containsKey("SVarCompare")) { + comparator = params.get("SVarCompare"); + } + final String svarOperator = comparator.substring(0, 2); + final String svarOperand = comparator.substring(2); + final int operandValue = AbilityUtils.calculateAmount(Singletons.getModel().getGame().getCardState(this.getHostCard()), + svarOperand, null); + if (!Expressions.compare(sVar, svarOperator, operandValue)) { + return false; + } + } + + if (params.containsKey("ManaSpent")) { + if (!this.getHostCard().getColorsPaid().contains(params.get("ManaSpent"))) { + return false; + } + } + + if (params.containsKey("ManaNotSpent")) { + if (this.getHostCard().getColorsPaid().contains(params.get("ManaNotSpent"))) { + return false; + } + } + + if (params.containsKey("WerewolfTransformCondition")) { + if (CardUtil.getLastTurnCast("Card", this.getHostCard()).size() > 0) { + return false; + } + } + + if (params.containsKey("WerewolfUntransformCondition")) { + final List you = CardUtil.getLastTurnCast("Card.YouCtrl", this.getHostCard()); + final List opp = CardUtil.getLastTurnCast("Card.YouDontCtrl", this.getHostCard()); + if (!((you.size() > 1) || (opp.size() > 1))) { + return false; + } + } + + return true; + } } diff --git a/src/main/java/forge/card/ability/effects/AnimateAllEffect.java b/src/main/java/forge/card/ability/effects/AnimateAllEffect.java index ed715ec7bad..79eb919bc8b 100644 --- a/src/main/java/forge/card/ability/effects/AnimateAllEffect.java +++ b/src/main/java/forge/card/ability/effects/AnimateAllEffect.java @@ -10,6 +10,7 @@ import forge.CardLists; import forge.CardUtil; import forge.Command; import forge.Singletons; +import forge.card.TriggerReplacementBase; import forge.card.ability.AbilityFactory; import forge.card.ability.AbilityUtils; import forge.card.replacement.ReplacementEffect; @@ -234,7 +235,7 @@ public class AnimateAllEffect extends AnimateEffectBase { } // give back suppressed replacement effects - for (final ReplacementEffect re : removedReplacements) { + for (final TriggerReplacementBase re : removedReplacements) { re.setTemporarilySuppressed(false); } } diff --git a/src/main/java/forge/card/ability/effects/AnimateEffect.java b/src/main/java/forge/card/ability/effects/AnimateEffect.java index 6617731251f..34600c9e16b 100644 --- a/src/main/java/forge/card/ability/effects/AnimateEffect.java +++ b/src/main/java/forge/card/ability/effects/AnimateEffect.java @@ -9,6 +9,7 @@ import forge.Card; import forge.CardUtil; import forge.Command; import forge.Singletons; +import forge.card.TriggerReplacementBase; import forge.card.ability.AbilityFactory; import forge.card.ability.AbilityUtils; import forge.card.replacement.ReplacementEffect; @@ -255,7 +256,7 @@ public class AnimateEffect extends AnimateEffectBase { } // give back suppressed replacement effects - for (final ReplacementEffect re : removedReplacements) { + for (final TriggerReplacementBase re : removedReplacements) { re.setTemporarilySuppressed(false); } } diff --git a/src/main/java/forge/card/replacement/ReplacementEffect.java b/src/main/java/forge/card/replacement/ReplacementEffect.java index bd15431911d..6e35ad5008f 100644 --- a/src/main/java/forge/card/replacement/ReplacementEffect.java +++ b/src/main/java/forge/card/replacement/ReplacementEffect.java @@ -17,13 +17,11 @@ */ package forge.card.replacement; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Map; import forge.Card; -import forge.CardLists; -import forge.CardUtil; import forge.Singletons; import forge.card.TriggerReplacementBase; import forge.card.ability.AbilityUtils; @@ -31,7 +29,6 @@ import forge.card.cardfactory.CardFactoryUtil; import forge.card.spellability.SpellAbility; import forge.game.phase.PhaseType; import forge.game.player.AIPlayer; -import forge.game.zone.ZoneType; import forge.util.Expressions; /** @@ -175,46 +172,24 @@ public abstract class ReplacementEffect extends TriggerReplacementBase { * @return a boolean. */ public boolean requirementsCheck() { + return this.requirementsCheck(this.getMapParams()); + } + + public boolean requirementsCheck(Map params) { if (this.isSuppressed()) { return false; // Effect removed by effect } - if (this.getMapParams().containsKey("Metalcraft")) { - if (this.getMapParams().get("Metalcraft").equals("True") - && !this.getHostCard().getController().hasMetalcraft()) { + if (params.containsKey("PlayerTurn")) { + if (params.get("PlayerTurn").equals("True") && !Singletons.getModel().getGame().getPhaseHandler().isPlayerTurn(this.getHostCard().getController())) { return false; } } - if (this.getMapParams().containsKey("Threshold")) { - if (this.getMapParams().get("Threshold").equals("True") - && !this.getHostCard().getController().hasThreshold()) { - return false; - } - } - - if (this.getMapParams().containsKey("Hellbent")) { - if (this.getMapParams().get("Hellbent").equals("True") && !this.getHostCard().getController().hasHellbent()) { - return false; - } - } - - if (this.getMapParams().containsKey("Bloodthirst")) { - if (this.getMapParams().get("Bloodthirst").equals("True") && !this.getHostCard().getController().hasBloodthirst()) { - return false; - } - } - - if (this.getMapParams().containsKey("PlayerTurn")) { - if (this.getMapParams().get("PlayerTurn").equals("True") && !Singletons.getModel().getGame().getPhaseHandler().isPlayerTurn(this.getHostCard().getController())) { - return false; - } - } - - if (this.getMapParams().containsKey("ActivePhases")) { + if (params.containsKey("ActivePhases")) { boolean isPhase = false; - List aPhases = PhaseType.parseRange(this.getMapParams().get("ActivePhases")); + List aPhases = PhaseType.parseRange(params.get("ActivePhases")); final PhaseType currPhase = Singletons.getModel().getGame().getPhaseHandler().getPhase(); for (final PhaseType s : aPhases) { if (s == currPhase) { @@ -226,171 +201,7 @@ public abstract class ReplacementEffect extends TriggerReplacementBase { return isPhase; } - if (this.getMapParams().containsKey("PlayersPoisoned")) { - if (this.getMapParams().get("PlayersPoisoned").equals("You") - && (this.getHostCard().getController().getPoisonCounters() == 0)) { - return false; - } else if (this.getMapParams().get("PlayersPoisoned").equals("Opponent") - && (this.getHostCard().getController().getOpponent().getPoisonCounters() == 0)) { - return false; - } else if (this.getMapParams().get("PlayersPoisoned").equals("Each") - && !((this.getHostCard().getController().getPoisonCounters() != 0) && (this.getHostCard() - .getController().getPoisonCounters() != 0))) { - return false; - } - } - - if (this.getMapParams().containsKey("LifeTotal")) { - final String player = this.getMapParams().get("LifeTotal"); - String lifeCompare = "GE1"; - int life = 1; - - if (player.equals("You")) { - life = this.getHostCard().getController().getLife(); - } - if (player.equals("Opponent")) { - life = this.getHostCard().getController().getOpponent().getLife(); - } - - if (this.getMapParams().containsKey("LifeAmount")) { - lifeCompare = this.getMapParams().get("LifeAmount"); - } - - int right = 1; - final String rightString = lifeCompare.substring(2); - try { - right = Integer.parseInt(rightString); - } catch (final NumberFormatException nfe) { - right = CardFactoryUtil.xCount(this.getHostCard(), this.getHostCard().getSVar(rightString)); - } - - if (!Expressions.compare(life, lifeCompare, right)) { - return false; - } - - } - - if (this.getMapParams().containsKey("IsPresent")) { - final String sIsPresent = this.getMapParams().get("IsPresent"); - String presentCompare = "GE1"; - ZoneType presentZone = ZoneType.Battlefield; - String presentPlayer = "Any"; - if (this.getMapParams().containsKey("PresentCompare")) { - presentCompare = this.getMapParams().get("PresentCompare"); - } - if (this.getMapParams().containsKey("PresentZone")) { - presentZone = ZoneType.smartValueOf(this.getMapParams().get("PresentZone")); - } - if (this.getMapParams().containsKey("PresentPlayer")) { - presentPlayer = this.getMapParams().get("PresentPlayer"); - } - List list = new ArrayList(); - if (presentPlayer.equals("You") || presentPlayer.equals("Any")) { - list.addAll(this.getHostCard().getController().getCardsIn(presentZone)); - } - if (presentPlayer.equals("Opponent") || presentPlayer.equals("Any")) { - list.addAll(this.getHostCard().getController().getOpponent().getCardsIn(presentZone)); - } - - list = CardLists.getValidCards(list, sIsPresent.split(","), this.getHostCard().getController(), this.getHostCard()); - - int right = 1; - final String rightString = presentCompare.substring(2); - if (rightString.equals("X")) { - right = CardFactoryUtil.xCount(this.getHostCard(), this.getHostCard().getSVar("X")); - } else { - right = Integer.parseInt(presentCompare.substring(2)); - } - final int left = list.size(); - - if (!Expressions.compare(left, presentCompare, right)) { - return false; - } - - } - - if (this.getMapParams().containsKey("IsPresent2")) { - final String sIsPresent = this.getMapParams().get("IsPresent2"); - String presentCompare = "GE1"; - ZoneType presentZone = ZoneType.Battlefield; - String presentPlayer = "Any"; - if (this.getMapParams().containsKey("PresentCompare2")) { - presentCompare = this.getMapParams().get("PresentCompare2"); - } - if (this.getMapParams().containsKey("PresentZone2")) { - presentZone = ZoneType.smartValueOf(this.getMapParams().get("PresentZone2")); - } - if (this.getMapParams().containsKey("PresentPlayer2")) { - presentPlayer = this.getMapParams().get("PresentPlayer2"); - } - List list = new ArrayList(); - if (presentPlayer.equals("You") || presentPlayer.equals("Any")) { - list.addAll(this.getHostCard().getController().getCardsIn(presentZone)); - } - if (presentPlayer.equals("Opponent") || presentPlayer.equals("Any")) { - list.addAll(this.getHostCard().getController().getOpponent().getCardsIn(presentZone)); - } - - list = CardLists.getValidCards(list, sIsPresent.split(","), this.getHostCard().getController(), this.getHostCard()); - - int right = 1; - final String rightString = presentCompare.substring(2); - if (rightString.equals("X")) { - right = CardFactoryUtil.xCount(this.getHostCard(), this.getHostCard().getSVar("X")); - } else { - right = Integer.parseInt(presentCompare.substring(2)); - } - final int left = list.size(); - - if (!Expressions.compare(left, presentCompare, right)) { - return false; - } - - } - - if (this.getMapParams().containsKey("CheckSVar")) { - final int sVar = AbilityUtils.calculateAmount(Singletons.getModel().getGame().getCardState(this.getHostCard()), this - .getMapParams().get("CheckSVar"), null); - String comparator = "GE1"; - if (this.getMapParams().containsKey("SVarCompare")) { - comparator = this.getMapParams().get("SVarCompare"); - } - final String svarOperator = comparator.substring(0, 2); - final String svarOperand = comparator.substring(2); - final int operandValue = AbilityUtils.calculateAmount(Singletons.getModel().getGame().getCardState(this.getHostCard()), - svarOperand, null); - if (!Expressions.compare(sVar, svarOperator, operandValue)) { - return false; - } - } - - if (this.getMapParams().containsKey("ManaSpent")) { - if (!this.getHostCard().getColorsPaid().contains(this.getMapParams().get("ManaSpent"))) { - return false; - } - } - - if (this.getMapParams().containsKey("ManaNotSpent")) { - if (this.getHostCard().getColorsPaid().contains(this.getMapParams().get("ManaNotSpent"))) { - return false; - } - } - - if (this.getMapParams().containsKey("WerewolfTransformCondition")) { - if (CardUtil.getLastTurnCast("Card", this.getHostCard()).size() > 0) { - return false; - } - } - - if (this.getMapParams().containsKey("WerewolfUntransformCondition")) { - final List you = CardUtil.getLastTurnCast("Card.YouCtrl", this.getHostCard()); - final List opp = CardUtil.getLastTurnCast("Card.YouDontCtrl", this.getHostCard()); - if (!((you.size() > 1) || (opp.size() > 1))) { - return false; - } - } - - return true; + return meetsCommonRequirements(params); } /** diff --git a/src/main/java/forge/card/staticability/StaticAbilityContinuous.java b/src/main/java/forge/card/staticability/StaticAbilityContinuous.java index 7b689b093c9..71e8894d120 100644 --- a/src/main/java/forge/card/staticability/StaticAbilityContinuous.java +++ b/src/main/java/forge/card/staticability/StaticAbilityContinuous.java @@ -30,6 +30,7 @@ import forge.CardUtil; import forge.StaticEffect; import forge.StaticEffects; import forge.card.CardType; +import forge.card.TriggerReplacementBase; import forge.card.ability.AbilityFactory; import forge.card.ability.AbilityUtils; import forge.card.cardfactory.CardFactoryUtil; @@ -436,7 +437,7 @@ public class StaticAbilityContinuous { stA.setTemporarilySuppressed(true); } final ArrayList replacementEffects = affectedCard.getReplacementEffects(); - for (final ReplacementEffect rE : replacementEffects) { + for (final TriggerReplacementBase rE : replacementEffects) { rE.setTemporarilySuppressed(true); } } diff --git a/src/main/java/forge/card/trigger/Trigger.java b/src/main/java/forge/card/trigger/Trigger.java index 354b35c2ab8..4a49542f52a 100644 --- a/src/main/java/forge/card/trigger/Trigger.java +++ b/src/main/java/forge/card/trigger/Trigger.java @@ -24,19 +24,14 @@ import java.util.Map; import forge.Card; -import forge.CardLists; -import forge.CardUtil; import forge.Singletons; import forge.card.TriggerReplacementBase; -import forge.card.ability.AbilityUtils; -import forge.card.cardfactory.CardFactoryUtil; import forge.card.spellability.Ability; import forge.card.spellability.SpellAbility; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.zone.ZoneType; -import forge.util.Expressions; /** *

@@ -276,77 +271,7 @@ public abstract class Trigger extends TriggerReplacementBase { * a {@link java.util.HashMap} object. * @return a boolean. */ - public final boolean requirementsCheck(final java.util.Map runParams2) { - if (this.getMapParams().containsKey("FatefulHour")) { - if (this.getMapParams().get("FatefulHour").equals("True") - && !(this.getHostCard().getController().getLife() <= 5)) { - return false; - } - } - - if (this.getMapParams().containsKey("Metalcraft")) { - if (this.getMapParams().get("Metalcraft").equals("True") - && !this.getHostCard().getController().hasMetalcraft()) { - return false; - } - } - - if (this.getMapParams().containsKey("Threshold")) { - if (this.getMapParams().get("Threshold").equals("True") - && !this.getHostCard().getController().hasThreshold()) { - return false; - } - } - - if (this.getMapParams().containsKey("Hellbent")) { - if (this.getMapParams().get("Hellbent").equals("True") && !this.getHostCard().getController().hasHellbent()) { - return false; - } - } - - if (this.getMapParams().containsKey("PlayersPoisoned")) { - if (this.getMapParams().get("PlayersPoisoned").equals("You") - && (this.getHostCard().getController().getPoisonCounters() == 0)) { - return false; - } else if (this.getMapParams().get("PlayersPoisoned").equals("Opponent") - && (this.getHostCard().getController().getOpponent().getPoisonCounters() == 0)) { - return false; - } else if (this.getMapParams().get("PlayersPoisoned").equals("Each") - && !((this.getHostCard().getController().getPoisonCounters() != 0) && (this.getHostCard() - .getController().getPoisonCounters() != 0))) { - return false; - } - } - - if (this.getMapParams().containsKey("LifeTotal")) { - final String player = this.getMapParams().get("LifeTotal"); - String lifeCompare = "GE1"; - int life = 1; - - if (player.equals("You")) { - life = this.getHostCard().getController().getLife(); - } - if (player.equals("Opponent")) { - life = this.getHostCard().getController().getOpponent().getLife(); - } - - if (this.getMapParams().containsKey("LifeAmount")) { - lifeCompare = this.getMapParams().get("LifeAmount"); - } - - int right = 1; - final String rightString = lifeCompare.substring(2); - try { - right = Integer.parseInt(rightString); - } catch (final NumberFormatException nfe) { - right = CardFactoryUtil.xCount(this.getHostCard(), this.getHostCard().getSVar(rightString)); - } - - if (!Expressions.compare(life, lifeCompare, right)) { - return false; - } - - } + public final boolean requirementsCheck(final Map runParams2) { if (this.getMapParams().containsKey("APlayerHasMoreLifeThanEachOther")) { int highestLife = -50; // Negative base just in case a few Lich's or Platinum Angels are running around @@ -387,126 +312,9 @@ public abstract class Trigger extends TriggerReplacementBase { return false; } } - - if (this.getMapParams().containsKey("IsPresent")) { - final String sIsPresent = this.getMapParams().get("IsPresent"); - String presentCompare = "GE1"; - ZoneType presentZone = ZoneType.Battlefield; - String presentPlayer = "Any"; - if (this.getMapParams().containsKey("PresentCompare")) { - presentCompare = this.getMapParams().get("PresentCompare"); - } - if (this.getMapParams().containsKey("PresentZone")) { - presentZone = ZoneType.smartValueOf(this.getMapParams().get("PresentZone")); - } - if (this.getMapParams().containsKey("PresentPlayer")) { - presentPlayer = this.getMapParams().get("PresentPlayer"); - } - List list = new ArrayList(); - if (presentPlayer.equals("You") || presentPlayer.equals("Any")) { - list.addAll(this.getHostCard().getController().getCardsIn(presentZone)); - } - if (presentPlayer.equals("Opponent") || presentPlayer.equals("Any")) { - list.addAll(this.getHostCard().getController().getOpponent().getCardsIn(presentZone)); - } - - list = CardLists.getValidCards(list, sIsPresent.split(","), this.getHostCard().getController(), this.getHostCard()); - - int right = 1; - final String rightString = presentCompare.substring(2); - if (rightString.equals("X")) { - right = CardFactoryUtil.xCount(this.getHostCard(), this.getHostCard().getSVar("X")); - } else { - right = Integer.parseInt(presentCompare.substring(2)); - } - final int left = list.size(); - - if (!Expressions.compare(left, presentCompare, right)) { - return false; - } - - } - - if (this.getMapParams().containsKey("IsPresent2")) { - final String sIsPresent = this.getMapParams().get("IsPresent2"); - String presentCompare = "GE1"; - ZoneType presentZone = ZoneType.Battlefield; - String presentPlayer = "Any"; - if (this.getMapParams().containsKey("PresentCompare2")) { - presentCompare = this.getMapParams().get("PresentCompare2"); - } - if (this.getMapParams().containsKey("PresentZone2")) { - presentZone = ZoneType.smartValueOf(this.getMapParams().get("PresentZone2")); - } - if (this.getMapParams().containsKey("PresentPlayer2")) { - presentPlayer = this.getMapParams().get("PresentPlayer2"); - } - List list = new ArrayList(); - if (presentPlayer.equals("You") || presentPlayer.equals("Any")) { - list.addAll(this.getHostCard().getController().getCardsIn(presentZone)); - } - if (presentPlayer.equals("Opponent") || presentPlayer.equals("Any")) { - list.addAll(this.getHostCard().getController().getOpponent().getCardsIn(presentZone)); - } - - list = CardLists.getValidCards(list, sIsPresent.split(","), this.getHostCard().getController(), this.getHostCard()); - - int right = 1; - final String rightString = presentCompare.substring(2); - if (rightString.equals("X")) { - right = CardFactoryUtil.xCount(this.getHostCard(), this.getHostCard().getSVar("X")); - } else { - right = Integer.parseInt(presentCompare.substring(2)); - } - final int left = list.size(); - - if (!Expressions.compare(left, presentCompare, right)) { - return false; - } - - } - - if (this.getMapParams().containsKey("CheckSVar")) { - final int sVar = AbilityUtils.calculateAmount(Singletons.getModel().getGame().getCardState(this.getHostCard()), this - .getMapParams().get("CheckSVar"), null); - String comparator = "GE1"; - if (this.getMapParams().containsKey("SVarCompare")) { - comparator = this.getMapParams().get("SVarCompare"); - } - final String svarOperator = comparator.substring(0, 2); - final String svarOperand = comparator.substring(2); - final int operandValue = AbilityUtils.calculateAmount(Singletons.getModel().getGame().getCardState(this.getHostCard()), - svarOperand, null); - if (!Expressions.compare(sVar, svarOperator, operandValue)) { - return false; - } - } - - if (this.getMapParams().containsKey("ManaSpent")) { - if (!this.getHostCard().getColorsPaid().contains(this.getMapParams().get("ManaSpent"))) { - return false; - } - } - - if (this.getMapParams().containsKey("ManaNotSpent")) { - if (this.getHostCard().getColorsPaid().contains(this.getMapParams().get("ManaNotSpent"))) { - return false; - } - } - - if (this.getMapParams().containsKey("WerewolfTransformCondition")) { - if (CardUtil.getLastTurnCast("Card", this.getHostCard()).size() > 0) { - return false; - } - } - - if (this.getMapParams().containsKey("WerewolfUntransformCondition")) { - final List you = CardUtil.getLastTurnCast("Card.YouCtrl", this.getHostCard()); - final List opp = CardUtil.getLastTurnCast("Card.YouDontCtrl", this.getHostCard()); - if (!((you.size() > 1) || (opp.size() > 1))) { - return false; - } - } + + if ( !meetsCommonRequirements(getMapParams())) + return false; if (this.getMapParams().containsKey("EvolveCondition")) { if (this.getMapParams().get("EvolveCondition").equals("True")) { diff --git a/src/main/java/forge/game/GameAction.java b/src/main/java/forge/game/GameAction.java index 6f1937d9ab0..d2be61d4351 100644 --- a/src/main/java/forge/game/GameAction.java +++ b/src/main/java/forge/game/GameAction.java @@ -35,11 +35,11 @@ import forge.CounterType; import forge.GameEntity; import forge.card.CardSplitType; import forge.card.CardType; +import forge.card.TriggerReplacementBase; import forge.card.ability.effects.AttachEffect; import forge.card.cardfactory.CardFactory; import forge.card.cost.Cost; import forge.card.mana.ManaCost; -import forge.card.replacement.ReplacementEffect; import forge.card.replacement.ReplacementResult; import forge.card.spellability.Ability; import forge.card.spellability.AbilityActivated; @@ -164,7 +164,7 @@ public class GameAction { for (final Trigger trigger : copied.getTriggers()) { trigger.setHostCard(copied); } - for (final ReplacementEffect repl : copied.getReplacementEffects()) { + for (final TriggerReplacementBase repl : copied.getReplacementEffects()) { repl.setHostCard(copied); } if (c.getName().equals("Skullbriar, the Walking Grave")) { From 9c3497c7f4939ede035afa9c7379d3cf5afbae45 Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Fri, 15 Mar 2013 21:21:34 +0000 Subject: [PATCH 2/5] removed duplicate preferences validation from QuestPreferencesHandler & CSubmenuQuestPrefs --- .../gui/home/quest/CSubmenuQuestPrefs.java | 75 +--------- .../home/quest/QuestPreferencesHandler.java | 139 +++++++++--------- 2 files changed, 75 insertions(+), 139 deletions(-) diff --git a/src/main/java/forge/gui/home/quest/CSubmenuQuestPrefs.java b/src/main/java/forge/gui/home/quest/CSubmenuQuestPrefs.java index 3cb05e041e7..10a1bb6de7e 100644 --- a/src/main/java/forge/gui/home/quest/CSubmenuQuestPrefs.java +++ b/src/main/java/forge/gui/home/quest/CSubmenuQuestPrefs.java @@ -7,7 +7,6 @@ import forge.Singletons; import forge.gui.framework.ICDoc; import forge.gui.home.quest.VSubmenuQuestPrefs.PrefInput; import forge.quest.data.QuestPreferences; -import forge.quest.data.QuestPreferences.QPref; /** * Controls the quest preferences submenu in the home UI. @@ -43,79 +42,15 @@ public enum CSubmenuQuestPrefs implements ICDoc { public static void validateAndSave(PrefInput i0) { if (i0.getText().equals(i0.getPreviousText())) { return; } final QuestPreferences prefs = Singletons.getModel().getQuestPreferences(); - int temp1, temp2; int val = Integer.parseInt(i0.getText()); resetErrors(); - switch (i0.getQPref()) { - case STARTING_CREDITS_EASY: case STARTING_CREDITS_MEDIUM: - case STARTING_CREDITS_HARD: case STARTING_CREDITS_EXPERT: - case REWARDS_MILLED: case REWARDS_MULLIGAN0: - case REWARDS_ALTERNATIVE: case REWARDS_TURN5: - if (val > 500) { - showError(i0, "Value too large (maximum 500)."); - return; - } - break; - case BOOSTER_COMMONS: - temp1 = prefs.getPreferenceInt(QPref.BOOSTER_UNCOMMONS); - temp2 = prefs.getPreferenceInt(QPref.BOOSTER_RARES); - - if (temp1 + temp2 + val > 15) { - showError(i0, "Booster packs must have maximum 15 cards."); - return; - } - break; - case BOOSTER_UNCOMMONS: - temp1 = prefs.getPreferenceInt(QPref.BOOSTER_COMMONS); - temp2 = prefs.getPreferenceInt(QPref.BOOSTER_RARES); - - if (temp1 + temp2 + val > 15) { - showError(i0, "Booster packs must have maximum 15 cards."); - return; - } - break; - case BOOSTER_RARES: - temp1 = prefs.getPreferenceInt(QPref.BOOSTER_COMMONS); - temp2 = prefs.getPreferenceInt(QPref.BOOSTER_UNCOMMONS); - - if (temp1 + temp2 + val > 15) { - showError(i0, "Booster packs must have maximum 15 cards."); - return; - } - break; - case REWARDS_TURN1: - if (val > 2000) { - showError(i0, "Value too large (maximum 2000)."); - return; - } - break; - case SHOP_STARTING_PACKS: - case SHOP_SINGLES_COMMON: case SHOP_SINGLES_UNCOMMON: case SHOP_SINGLES_RARE: - if (val < 0) { - showError(i0, "Value too small (minimum 0)."); - return; - } else if (val > 15) { - showError(i0, "Value too large (maximum 15)."); - return; - } - break; - case SHOP_WINS_FOR_ADDITIONAL_PACK: case SHOP_MAX_PACKS: - if (val < 1) { - showError(i0, "Value too small (minimum 1)."); - return; - } else if (val > 25) { - showError(i0, "Value too large (maximum 25)."); - return; - } - break; - default: - if (val > 100) { - showError(i0, "Value too large (maximum 100)."); - return; - } - break; + String validationError = QuestPreferencesHandler.validatePreference(i0.getQPref(), val, prefs); + if( null != validationError) + { + showError(i0, validationError); + return; } prefs.setPreference(i0.getQPref(), i0.getText()); diff --git a/src/main/java/forge/gui/home/quest/QuestPreferencesHandler.java b/src/main/java/forge/gui/home/quest/QuestPreferencesHandler.java index 91e4c428457..84c76123449 100644 --- a/src/main/java/forge/gui/home/quest/QuestPreferencesHandler.java +++ b/src/main/java/forge/gui/home/quest/QuestPreferencesHandler.java @@ -323,7 +323,7 @@ public class QuestPreferencesHandler extends JPanel { } } - private int temp1, temp2; + /** * Checks validity of values entered into prefInputs. * @param i0   a PrefInput object @@ -334,74 +334,11 @@ public class QuestPreferencesHandler extends JPanel { int val = Integer.parseInt(i0.getText()); resetErrors(); - switch (i0.getQPref()) { - case STARTING_CREDITS_EASY: case STARTING_CREDITS_MEDIUM: - case STARTING_CREDITS_HARD: case STARTING_CREDITS_EXPERT: - case REWARDS_MILLED: case REWARDS_MULLIGAN0: - case REWARDS_ALTERNATIVE: case REWARDS_TURN5: - if (val > 500) { - showError(i0, "Value too large (maximum 500)."); - return; - } - break; - case BOOSTER_COMMONS: - temp1 = prefs.getPreferenceInt(QPref.BOOSTER_UNCOMMONS); - temp2 = prefs.getPreferenceInt(QPref.BOOSTER_RARES); - - if (temp1 + temp2 + val > 15) { - showError(i0, "Booster packs must have maximum 15 cards."); - return; - } - break; - case BOOSTER_UNCOMMONS: - temp1 = prefs.getPreferenceInt(QPref.BOOSTER_COMMONS); - temp2 = prefs.getPreferenceInt(QPref.BOOSTER_RARES); - - if (temp1 + temp2 + val > 15) { - showError(i0, "Booster packs must have maximum 15 cards."); - return; - } - break; - case BOOSTER_RARES: - temp1 = prefs.getPreferenceInt(QPref.BOOSTER_COMMONS); - temp2 = prefs.getPreferenceInt(QPref.BOOSTER_UNCOMMONS); - - if (temp1 + temp2 + val > 15) { - showError(i0, "Booster packs must have maximum 15 cards."); - return; - } - break; - case REWARDS_TURN1: - if (val > 2000) { - showError(i0, "Value too large (maximum 2000)."); - return; - } - break; - case SHOP_STARTING_PACKS: - case SHOP_SINGLES_COMMON: case SHOP_SINGLES_UNCOMMON: case SHOP_SINGLES_RARE: - if (val < 0) { - showError(i0, "Value too small (minimum 0)."); - return; - } else if (val > 15) { - showError(i0, "Value too large (maximum 15)."); - return; - } - break; - case SHOP_WINS_FOR_ADDITIONAL_PACK: case SHOP_MAX_PACKS: - if (val < 1) { - showError(i0, "Value too small (minimum 1)."); - return; - } else if (val > 25) { - showError(i0, "Value too large (maximum 25)."); - return; - } - break; - default: - if (val > 100) { - showError(i0, "Value too large (maximum 100)."); - return; - } - break; + String validationError = validatePreference(i0.getQPref(), val, prefs); + if( null != validationError) + { + showError(i0, validationError); + return; } prefs.setPreference(i0.getQPref(), i0.getText()); @@ -409,6 +346,70 @@ public class QuestPreferencesHandler extends JPanel { i0.setPreviousText(i0.getText()); } + public static String validatePreference(QPref qpref, int val, QuestPreferences current) { + int temp1, temp2; + switch (qpref) { + case STARTING_CREDITS_EASY: case STARTING_CREDITS_MEDIUM: + case STARTING_CREDITS_HARD: case STARTING_CREDITS_EXPERT: + case REWARDS_MILLED: case REWARDS_MULLIGAN0: + case REWARDS_ALTERNATIVE: case REWARDS_TURN5: + if (val > 500) { + return "Value too large (maximum 500)."; + } + break; + case BOOSTER_COMMONS: + temp1 = current.getPreferenceInt(QPref.BOOSTER_UNCOMMONS); + temp2 = current.getPreferenceInt(QPref.BOOSTER_RARES); + + if (temp1 + temp2 + val > 15) { + return "Booster packs must have maximum 15 cards."; + } + break; + case BOOSTER_UNCOMMONS: + temp1 = current.getPreferenceInt(QPref.BOOSTER_COMMONS); + temp2 = current.getPreferenceInt(QPref.BOOSTER_RARES); + + if (temp1 + temp2 + val > 15) { + return "Booster packs must have maximum 15 cards."; + } + break; + case BOOSTER_RARES: + temp1 = current.getPreferenceInt(QPref.BOOSTER_COMMONS); + temp2 = current.getPreferenceInt(QPref.BOOSTER_UNCOMMONS); + + if (temp1 + temp2 + val > 15) { + return "Booster packs must have maximum 15 cards."; + } + break; + case REWARDS_TURN1: + if (val > 2000) { + return "Value too large (maximum 2000)."; + } + break; + case SHOP_STARTING_PACKS: + case SHOP_SINGLES_COMMON: case SHOP_SINGLES_UNCOMMON: case SHOP_SINGLES_RARE: + if (val < 0) { + return "Value too small (minimum 0)."; + } else if (val > 15) { + return "Value too large (maximum 15)."; + } + break; + case SHOP_WINS_FOR_ADDITIONAL_PACK: case SHOP_MAX_PACKS: + if (val < 1) { + return "Value too small (minimum 1)."; + } else if (val > 25) { + return "Value too large (maximum 25)."; + } + break; + default: + if (val > 100) { + return "Value too large (maximum 100)."; + } + break; + } + return null; + } + private void showError(PrefInput i0, String s0) { String s = "Save failed: " + s0; switch(i0.getErrType()) { From 5b4c6e849078b4c6266851fa2c66181d2ec08bab Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Fri, 15 Mar 2013 21:28:18 +0000 Subject: [PATCH 3/5] moved some duplicate methods to base class --- .../java/forge/card/ability/ai/TapAi.java | 57 ++----------------- .../java/forge/card/ability/ai/TapAiBase.java | 47 +++++++++++++++ .../forge/card/ability/ai/TapOrUntapAi.java | 43 -------------- 3 files changed, 53 insertions(+), 94 deletions(-) diff --git a/src/main/java/forge/card/ability/ai/TapAi.java b/src/main/java/forge/card/ability/ai/TapAi.java index 957ea63cbb1..29f40ffb98c 100644 --- a/src/main/java/forge/card/ability/ai/TapAi.java +++ b/src/main/java/forge/card/ability/ai/TapAi.java @@ -18,11 +18,6 @@ import forge.util.MyRandom; public class TapAi extends TapAiBase { @Override protected boolean canPlayAI(AIPlayer ai, SpellAbility sa) { - final Target tgt = sa.getTarget(); - final Card source = sa.getSourceCard(); - - final Random r = MyRandom.getRandom(); - boolean randomReturn = r.nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn()); final PhaseHandler phase = Singletons.getModel().getGame().getPhaseHandler(); final Player turn = phase.getPlayerTurn(); @@ -37,6 +32,12 @@ public class TapAi extends TapAiBase { // Generally don't want to tap things with an Instant during AI turn outside of combat return false; } + + final Target tgt = sa.getTarget(); + final Card source = sa.getSourceCard(); + + final Random r = MyRandom.getRandom(); + boolean randomReturn = r.nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn()); if (tgt == null) { final List defined = AbilityUtils.getDefinedCards(source, sa.getParam("Defined"), sa); @@ -59,50 +60,4 @@ public class TapAi extends TapAiBase { return randomReturn; } - @Override - protected boolean doTriggerAINoCost(AIPlayer ai, SpellAbility sa, boolean mandatory) { - - final Target tgt = sa.getTarget(); - final Card source = sa.getSourceCard(); - - if (tgt == null) { - if (mandatory) { - return true; - } - - // TODO: use Defined to determine, if this is an unfavorable result - - return true; - } else { - if (tapPrefTargeting(ai, source, tgt, sa, mandatory)) { - return true; - } else if (mandatory) { - // not enough preferred targets, but mandatory so keep going: - return tapUnpreferredTargeting(ai, sa, mandatory); - } - } - - return false; - } - - @Override - public boolean chkAIDrawback(SpellAbility sa, AIPlayer ai) { - final Target tgt = sa.getTarget(); - final Card source = sa.getSourceCard(); - - boolean randomReturn = true; - - if (tgt == null) { - // either self or defined, either way should be fine - } else { - // target section, maybe pull this out? - tgt.resetTargets(); - if (!tapPrefTargeting(ai, source, tgt, sa, false)) { - return false; - } - } - - return randomReturn; - } - } diff --git a/src/main/java/forge/card/ability/ai/TapAiBase.java b/src/main/java/forge/card/ability/ai/TapAiBase.java index 396a03f36e3..01f2a7a6cb0 100644 --- a/src/main/java/forge/card/ability/ai/TapAiBase.java +++ b/src/main/java/forge/card/ability/ai/TapAiBase.java @@ -18,6 +18,7 @@ import forge.game.ai.ComputerUtilCard; import forge.game.phase.CombatUtil; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; +import forge.game.player.AIPlayer; import forge.game.player.Player; import forge.game.zone.ZoneType; @@ -269,4 +270,50 @@ public abstract class TapAiBase extends SpellAbilityAi { return false; } + @Override + protected boolean doTriggerAINoCost(AIPlayer ai, SpellAbility sa, boolean mandatory) { + + final Target tgt = sa.getTarget(); + final Card source = sa.getSourceCard(); + + if (tgt == null) { + if (mandatory) { + return true; + } + + // TODO: use Defined to determine, if this is an unfavorable result + + return true; + } else { + if (tapPrefTargeting(ai, source, tgt, sa, mandatory)) { + return true; + } else if (mandatory) { + // not enough preferred targets, but mandatory so keep going: + return tapUnpreferredTargeting(ai, sa, mandatory); + } + } + + return false; + } + + @Override + public boolean chkAIDrawback(SpellAbility sa, AIPlayer ai) { + final Target tgt = sa.getTarget(); + final Card source = sa.getSourceCard(); + + boolean randomReturn = true; + + if (tgt == null) { + // either self or defined, either way should be fine + } else { + // target section, maybe pull this out? + tgt.resetTargets(); + if (!tapPrefTargeting(ai, source, tgt, sa, false)) { + return false; + } + } + + return randomReturn; + } + } diff --git a/src/main/java/forge/card/ability/ai/TapOrUntapAi.java b/src/main/java/forge/card/ability/ai/TapOrUntapAi.java index f2e62218454..7bdc958adc8 100644 --- a/src/main/java/forge/card/ability/ai/TapOrUntapAi.java +++ b/src/main/java/forge/card/ability/ai/TapOrUntapAi.java @@ -47,49 +47,6 @@ public class TapOrUntapAi extends TapAiBase { return randomReturn; } - @Override - protected boolean doTriggerAINoCost(AIPlayer ai, SpellAbility sa, boolean mandatory) { - final Target tgt = sa.getTarget(); - final Card source = sa.getSourceCard(); - if (tgt == null) { - if (mandatory) { - return true; - } - - // TODO: use Defined to determine if this is an unfavorable result - - return true; - } else { - if (tapPrefTargeting(ai, source, tgt, sa, mandatory)) { - return true; - } else if (mandatory) { - // not enough preferred targets, but mandatory so keep going: - return tapUnpreferredTargeting(ai, sa, mandatory); - } - } - - return false; - } - - @Override - public boolean chkAIDrawback(SpellAbility sa, AIPlayer ai) { - final Target tgt = sa.getTarget(); - final Card source = sa.getSourceCard(); - - boolean randomReturn = true; - - if (tgt == null) { - // either self or defined, either way should be fine - } else { - // target section, maybe pull this out? - tgt.resetTargets(); - if (!tapPrefTargeting(ai, source, tgt, sa, false)) { - return false; - } - } - - return randomReturn; - } } From 5f0e660d18b3bbfd7372feba4794f34beb78931e Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Fri, 15 Mar 2013 21:31:52 +0000 Subject: [PATCH 4/5] removed unneeded final modifiers from methods (class is final anyway) --- src/main/java/forge/card/CardFace.java | 56 +++++++++++++------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/src/main/java/forge/card/CardFace.java b/src/main/java/forge/card/CardFace.java index 3c474f9a5a5..da406256ae8 100644 --- a/src/main/java/forge/card/CardFace.java +++ b/src/main/java/forge/card/CardFace.java @@ -48,25 +48,25 @@ final class CardFace implements ICardFace { // these implement ICardCharacteristics - @Override public final String getOracleText() { return oracleText; } - @Override public final int getIntPower() { return iPower; } - @Override public final int getIntToughness() { return iToughness; } - @Override public final String getPower() { return power; } - @Override public final String getToughness() { return toughness; } + @Override public String getOracleText() { return oracleText; } + @Override public int getIntPower() { return iPower; } + @Override public int getIntToughness() { return iToughness; } + @Override public String getPower() { return power; } + @Override public String getToughness() { return toughness; } @Override public int getInitialLoyalty() { return initialLoyalty; } - @Override public final String getName() { return this.name; } - @Override public final CardType getType() { return this.type; } - @Override public final ManaCost getManaCost() { return this.manaCost; } - @Override public final ColorSet getColor() { return this.color; } + @Override public String getName() { return this.name; } + @Override public CardType getType() { return this.type; } + @Override public ManaCost getManaCost() { return this.manaCost; } + @Override public ColorSet getColor() { return this.color; } // these are raw and unparsed used for Card creation - @Override public final Iterable getKeywords() { return keywords; } - @Override public final Iterable getAbilities() { return abilities; } - @Override public final Iterable getStaticAbilities() { return staticAbilities; } - @Override public final Iterable getTriggers() { return triggers; } - @Override public final Iterable getReplacements() { return replacements; } - @Override public final String getNonAbilityText() { return nonAbilityText; } - @Override public final Iterable> getVariables() { return variables.entrySet(); } + @Override public Iterable getKeywords() { return keywords; } + @Override public Iterable getAbilities() { return abilities; } + @Override public Iterable getStaticAbilities() { return staticAbilities; } + @Override public Iterable getTriggers() { return triggers; } + @Override public Iterable getReplacements() { return replacements; } + @Override public String getNonAbilityText() { return nonAbilityText; } + @Override public Iterable> getVariables() { return variables.entrySet(); } public CardFace(String name0) { this.name = name0; @@ -74,11 +74,11 @@ final class CardFace implements ICardFace { throw new RuntimeException("Card name is empty"); } // Here come setters to allow parser supply values - public final void setType(CardType type0) { this.type = type0; } - public final void setManaCost(ManaCost manaCost0) { this.manaCost = manaCost0; } - public final void setColor(ColorSet color0) { this.color = color0; } - public final void setOracleText(String text) { this.oracleText = text; } - public final void setInitialLoyalty(int value) { this.initialLoyalty = value; } + public void setType(CardType type0) { this.type = type0; } + public void setManaCost(ManaCost manaCost0) { this.manaCost = manaCost0; } + public void setColor(ColorSet color0) { this.color = color0; } + public void setOracleText(String text) { this.oracleText = text; } + public void setInitialLoyalty(int value) { this.initialLoyalty = value; } public void setPtText(String value) { final int slashPos = value.indexOf('/'); @@ -92,13 +92,13 @@ final class CardFace implements ICardFace { } // Raw fields used for Card creation - public final void setNonAbilityText(String value) { this.nonAbilityText = value; } - public final void addKeyword(String value) { if (null == this.keywords) { this.keywords = new ArrayList(); } this.keywords.add(value); } - public final void addAbility(String value) { if (null == this.abilities) { this.abilities = new ArrayList(); } this.abilities.add(value);} - public final void addTrigger(String value) { if (null == this.triggers) { this.triggers = new ArrayList(); } this.triggers.add(value);} - public final void addStaticAbility(String value) { if (null == this.staticAbilities) { this.staticAbilities = new ArrayList(); } this.staticAbilities.add(value);} - public final void addReplacementEffect(String value) { if (null == this.replacements) { this.replacements = new ArrayList(); } this.replacements.add(value);} - public final void addSVar(String key, String value) { if (null == this.variables) { this.variables = new TreeMap(String.CASE_INSENSITIVE_ORDER); } this.variables.put(key, value); } + public void setNonAbilityText(String value) { this.nonAbilityText = value; } + public void addKeyword(String value) { if (null == this.keywords) { this.keywords = new ArrayList(); } this.keywords.add(value); } + public void addAbility(String value) { if (null == this.abilities) { this.abilities = new ArrayList(); } this.abilities.add(value);} + public void addTrigger(String value) { if (null == this.triggers) { this.triggers = new ArrayList(); } this.triggers.add(value);} + public void addStaticAbility(String value) { if (null == this.staticAbilities) { this.staticAbilities = new ArrayList(); } this.staticAbilities.add(value);} + public void addReplacementEffect(String value) { if (null == this.replacements) { this.replacements = new ArrayList(); } this.replacements.add(value);} + public void addSVar(String key, String value) { if (null == this.variables) { this.variables = new TreeMap(String.CASE_INSENSITIVE_ORDER); } this.variables.put(key, value); } public void assignMissingFields() { // Most scripts do not specify color explicitly From 9af799a88ec9dd8464c9af4ac1aaa20f4800c43d Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Fri, 15 Mar 2013 21:51:52 +0000 Subject: [PATCH 5/5] Changed some public final static arrays into guava's ImmutableList in Card class changed members to be just List instances (instead of ArrayList) --- src/main/java/forge/Card.java | 49 ++++++++++--------- src/main/java/forge/CardUtil.java | 2 +- src/main/java/forge/Constant.java | 6 ++- .../java/forge/card/ability/AbilityUtils.java | 2 +- .../java/forge/card/ability/ai/ProtectAi.java | 3 +- .../ability/effects/ChooseColorEffect.java | 6 ++- .../card/ability/effects/ManaEffect.java | 13 ++--- src/main/java/forge/card/mana/ManaPool.java | 4 +- .../StaticAbilityContinuous.java | 2 +- src/main/java/forge/game/GameActionUtil.java | 2 +- .../java/forge/game/limited/SealedDeck.java | 5 +- src/main/java/forge/game/phase/Untap.java | 4 +- 12 files changed, 51 insertions(+), 47 deletions(-) diff --git a/src/main/java/forge/Card.java b/src/main/java/forge/Card.java index a7896117816..d9d2909b8d6 100644 --- a/src/main/java/forge/Card.java +++ b/src/main/java/forge/Card.java @@ -31,6 +31,7 @@ import java.util.Set; import java.util.TreeMap; import com.esotericsoftware.minlog.Log; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import forge.CardPredicates.Presets; @@ -207,28 +208,28 @@ public class Card extends GameEntity implements Comparable { private String miracleCost = null; private String chosenType = ""; // private String chosenColor = ""; - private ArrayList chosenColor = new ArrayList(); + private List chosenColor = new ArrayList(); private String namedCard = ""; private int chosenNumber; private Player chosenPlayer; - private ArrayList chosenCard = new ArrayList(); + private List chosenCard = new ArrayList(); private Card cloneOrigin = null; - private final ArrayList clones = new ArrayList(); - private final ArrayList gainControlTargets = new ArrayList(); - private final ArrayList gainControlReleaseCommands = new ArrayList(); + private final List clones = new ArrayList(); + private final List gainControlTargets = new ArrayList(); + private final List gainControlReleaseCommands = new ArrayList(); - private final ArrayList zcTriggers = new ArrayList(); - private final ArrayList equipCommandList = new ArrayList(); - private final ArrayList unEquipCommandList = new ArrayList(); - private final ArrayList enchantCommandList = new ArrayList(); - private final ArrayList unEnchantCommandList = new ArrayList(); - private final ArrayList untapCommandList = new ArrayList(); - private final ArrayList changeControllerCommandList = new ArrayList(); + private final List zcTriggers = new ArrayList(); + private final List equipCommandList = new ArrayList(); + private final List unEquipCommandList = new ArrayList(); + private final List enchantCommandList = new ArrayList(); + private final List unEnchantCommandList = new ArrayList(); + private final List untapCommandList = new ArrayList(); + private final List changeControllerCommandList = new ArrayList(); - private static String[] storableSVars = { "ChosenX", "ChosenY" }; + private final static ImmutableList storableSVars = ImmutableList.of("ChosenX", "ChosenY" ); - private final ArrayList hauntedBy = new ArrayList(); + private final List hauntedBy = new ArrayList(); private Card haunting = null; private Card effectSource = null; @@ -565,7 +566,7 @@ public class Card extends GameEntity implements Comparable { * * @return a String array */ - public static String[] getStorableSVars() { + public static List getStorableSVars() { return Card.storableSVars; } @@ -1162,7 +1163,7 @@ public class Card extends GameEntity implements Comparable { * * @return a {@link java.util.ArrayList} object. */ - public final ArrayList getClones() { + public final List getClones() { return this.clones; } @@ -1174,7 +1175,7 @@ public class Card extends GameEntity implements Comparable { * @param c * a {@link java.util.ArrayList} object. */ - public final void setClones(final ArrayList c) { + public final void setClones(final Collection c) { this.clones.clear(); this.clones.addAll(c); } @@ -1912,7 +1913,7 @@ public class Card extends GameEntity implements Comparable { * * @return an ArrayList object. */ - public final ArrayList getChosenColor() { + public final List getChosenColor() { return this.chosenColor; } @@ -1924,7 +1925,7 @@ public class Card extends GameEntity implements Comparable { * @param s * an ArrayList object. */ - public final void setChosenColor(final ArrayList s) { + public final void setChosenColor(final List s) { this.chosenColor = s; } @@ -1935,7 +1936,7 @@ public class Card extends GameEntity implements Comparable { * * @return an ArrayList object. */ - public final ArrayList getChosenCard() { + public final List getChosenCard() { return this.chosenCard; } @@ -2005,7 +2006,7 @@ public class Card extends GameEntity implements Comparable { * * @return a list of cards this card has gained control of */ - public final ArrayList getGainControlTargets() { + public final List getGainControlTargets() { return this.gainControlTargets; } @@ -2039,7 +2040,7 @@ public class Card extends GameEntity implements Comparable { * * @return a {@link java.util.ArrayList} object. */ - public final ArrayList getGainControlReleaseCommands() { + public final List getGainControlReleaseCommands() { return this.gainControlReleaseCommands; } @@ -6003,7 +6004,7 @@ public class Card extends GameEntity implements Comparable { */ @Override public final boolean hasKeyword(final String keyword) { - String kw = new String(keyword); + String kw = keyword; if (kw.startsWith("HIDDEN")) { kw = kw.substring(7); } @@ -8646,7 +8647,7 @@ public class Card extends GameEntity implements Comparable { * * @return the haunted by */ - public final ArrayList getHauntedBy() { + public final List getHauntedBy() { return this.hauntedBy; } diff --git a/src/main/java/forge/CardUtil.java b/src/main/java/forge/CardUtil.java index a5a46807d69..117157d6011 100644 --- a/src/main/java/forge/CardUtil.java +++ b/src/main/java/forge/CardUtil.java @@ -226,7 +226,7 @@ public final class CardUtil { * a {@link java.util.ArrayList} object. * @return a {@link java.lang.String} object. */ - public static String getShortColorsString(final ArrayList colors) { + public static String getShortColorsString(final Iterable colors) { String colorDesc = ""; for (final String col : colors) { if (col.equalsIgnoreCase("White")) { diff --git a/src/main/java/forge/Constant.java b/src/main/java/forge/Constant.java index dedcda1983a..a86b36fbcfa 100644 --- a/src/main/java/forge/Constant.java +++ b/src/main/java/forge/Constant.java @@ -22,6 +22,8 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import com.google.common.collect.ImmutableList; + import forge.properties.ForgeProps; import forge.properties.NewConstants; @@ -85,10 +87,10 @@ public final class Constant { public static final String COLORLESS = "colorless"; // color order "wubrg" /** The Colors. */ - public static final String[] COLORS = { Color.WHITE, Color.BLUE, Color.BLACK, Color.RED, Color.GREEN, Color.COLORLESS }; + public static final ImmutableList COLORS = ImmutableList.of(Color.WHITE, Color.BLUE, Color.BLACK, Color.RED, Color.GREEN, Color.COLORLESS); /** The only colors. */ - public static final String[] ONLY_COLORS = { Color.WHITE, Color.BLUE, Color.BLACK, Color.RED, Color.GREEN }; + public static final ImmutableList ONLY_COLORS = ImmutableList.of(Color.WHITE, Color.BLUE, Color.BLACK, Color.RED, Color.GREEN); /** The Snow. */ public static final String SNOW = "snow"; diff --git a/src/main/java/forge/card/ability/AbilityUtils.java b/src/main/java/forge/card/ability/AbilityUtils.java index 61507715edb..09e877e7fa4 100644 --- a/src/main/java/forge/card/ability/AbilityUtils.java +++ b/src/main/java/forge/card/ability/AbilityUtils.java @@ -980,7 +980,7 @@ public class AbilityUtils { // Replace AnyColor with the 5 colors if (choices.contains("AnyColor")) { - gains.addAll(Arrays.asList(Constant.Color.ONLY_COLORS)); + gains.addAll(Constant.Color.ONLY_COLORS); choices = choices.replaceAll("AnyColor,?", ""); } // Add any remaining choices diff --git a/src/main/java/forge/card/ability/ai/ProtectAi.java b/src/main/java/forge/card/ability/ai/ProtectAi.java index 507b60f36e8..4b798bed343 100644 --- a/src/main/java/forge/card/ability/ai/ProtectAi.java +++ b/src/main/java/forge/card/ability/ai/ProtectAi.java @@ -1,7 +1,6 @@ package forge.card.ability.ai; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import com.google.common.base.Predicate; @@ -25,7 +24,7 @@ import forge.game.zone.ZoneType; public class ProtectAi extends SpellAbilityAi { private static boolean hasProtectionFrom(final Card card, final String color) { - final ArrayList onlyColors = new ArrayList(Arrays.asList(Constant.Color.ONLY_COLORS)); + final ArrayList onlyColors = new ArrayList(Constant.Color.ONLY_COLORS); // make sure we have a valid color if (!onlyColors.contains(color)) { diff --git a/src/main/java/forge/card/ability/effects/ChooseColorEffect.java b/src/main/java/forge/card/ability/effects/ChooseColorEffect.java index 5b03e7ba09e..5a89059afd1 100644 --- a/src/main/java/forge/card/ability/effects/ChooseColorEffect.java +++ b/src/main/java/forge/card/ability/effects/ChooseColorEffect.java @@ -3,6 +3,8 @@ package forge.card.ability.effects; import java.util.ArrayList; import java.util.List; +import com.google.common.collect.ImmutableList; + import forge.Card; import forge.CardLists; import forge.CardPredicates; @@ -46,8 +48,8 @@ public class ChooseColorEffect extends SpellAbilityEffect { if ((tgt == null) || p.canBeTargetedBy(sa)) { if (sa.getActivatingPlayer().isHuman()) { if (sa.hasParam("OrColors")) { - String[] choices = Constant.Color.ONLY_COLORS; - final List o = GuiChoose.getChoices("Choose a color or colors", 1, choices.length, choices); + ImmutableList choices = Constant.Color.ONLY_COLORS; + final List o = GuiChoose.getChoices("Choose a color or colors", 1, choices.size(), choices); card.setChosenColor(new ArrayList(o)); } else if (sa.hasParam("TwoColors")) { final List o = GuiChoose.getChoices("Choose two colors", 2, 2, Constant.Color.ONLY_COLORS); diff --git a/src/main/java/forge/card/ability/effects/ManaEffect.java b/src/main/java/forge/card/ability/effects/ManaEffect.java index a9ed652436d..6af32728246 100644 --- a/src/main/java/forge/card/ability/effects/ManaEffect.java +++ b/src/main/java/forge/card/ability/effects/ManaEffect.java @@ -1,5 +1,6 @@ package forge.card.ability.effects; +import java.util.ArrayList; import java.util.List; import forge.Card; @@ -47,12 +48,12 @@ public class ManaEffect extends SpellAbilityEffect { //String colorsNeeded = abMana.getExpressChoice(); String[] colorsProduced = abMana.getComboColors().split(" "); final StringBuilder choiceString = new StringBuilder(); - String[] colorMenu = null; + List colorMenu = null; if (!abMana.isAnyMana()) { - colorMenu = new String[colorsProduced.length]; + colorMenu = new ArrayList(); //loop through colors to make menu for (int nColor = 0; nColor < colorsProduced.length; nColor++) { - colorMenu[nColor] = forge.card.MagicColor.toLongString(colorsProduced[nColor]); + colorMenu.add(forge.card.MagicColor.toLongString(colorsProduced[nColor])); } } else { @@ -113,12 +114,12 @@ public class ManaEffect extends SpellAbilityEffect { choice = colorsNeeded; } else { - String[] colorMenu = null; + List colorMenu = null; if (colorsNeeded.length() > 1 && colorsNeeded.length() < 5) { - colorMenu = new String[colorsNeeded.length()]; + colorMenu = new ArrayList(); //loop through colors to make menu for (int nChar = 0; nChar < colorsNeeded.length(); nChar++) { - colorMenu[nChar] = forge.card.MagicColor.toLongString(colorsNeeded.substring(nChar, nChar + 1)); + colorMenu.add(forge.card.MagicColor.toLongString(colorsNeeded.substring(nChar, nChar + 1))); } } else { diff --git a/src/main/java/forge/card/mana/ManaPool.java b/src/main/java/forge/card/mana/ManaPool.java index 67760f09d45..d5a48fd5f25 100644 --- a/src/main/java/forge/card/mana/ManaPool.java +++ b/src/main/java/forge/card/mana/ManaPool.java @@ -337,10 +337,10 @@ public class ManaPool { totalMana += normalMana[i]; totalMana += snowMana[i]; if (normalMana[i] > 0) { - alChoice.add(Constant.Color.COLORS[i] + "(" + normalMana[i] + ")"); + alChoice.add(Constant.Color.COLORS.get(i) + "(" + normalMana[i] + ")"); } if (snowMana[i] > 0) { - alChoice.add("{S}" + Constant.Color.COLORS[i] + "(" + snowMana[i] + ")"); + alChoice.add("{S}" + Constant.Color.COLORS.get(i) + "(" + snowMana[i] + ")"); } } diff --git a/src/main/java/forge/card/staticability/StaticAbilityContinuous.java b/src/main/java/forge/card/staticability/StaticAbilityContinuous.java index 71e8894d120..77971bc032f 100644 --- a/src/main/java/forge/card/staticability/StaticAbilityContinuous.java +++ b/src/main/java/forge/card/staticability/StaticAbilityContinuous.java @@ -145,7 +145,7 @@ public class StaticAbilityContinuous { if (params.containsKey("AddKeyword")) { addKeywords = params.get("AddKeyword").split(" & "); - final ArrayList chosencolors = hostCard.getChosenColor(); + final List chosencolors = hostCard.getChosenColor(); for (final String color : chosencolors) { for (int w = 0; w < addKeywords.length; w++) { addKeywords[w] = addKeywords[w].replaceAll("ChosenColor", color.substring(0, 1).toUpperCase().concat(color.substring(1, color.length()))); diff --git a/src/main/java/forge/game/GameActionUtil.java b/src/main/java/forge/game/GameActionUtil.java index a2c551e77c7..1385b27a16f 100644 --- a/src/main/java/forge/game/GameActionUtil.java +++ b/src/main/java/forge/game/GameActionUtil.java @@ -980,7 +980,7 @@ public final class GameActionUtil { for (final Card oldman : list) { if (!oldman.getGainControlTargets().isEmpty()) { if (oldman.getNetAttack() < oldman.getGainControlTargets().get(0).getNetAttack()) { - final ArrayList coms = oldman.getGainControlReleaseCommands(); + final List coms = oldman.getGainControlReleaseCommands(); for (int i = 0; i < coms.size(); i++) { coms.get(i).execute(); } diff --git a/src/main/java/forge/game/limited/SealedDeck.java b/src/main/java/forge/game/limited/SealedDeck.java index fe71c48252b..de5db9cb4d6 100644 --- a/src/main/java/forge/game/limited/SealedDeck.java +++ b/src/main/java/forge/game/limited/SealedDeck.java @@ -60,7 +60,6 @@ public class SealedDeck extends LimitedDeck { int green = Iterables.size(Iterables.filter(rules, CardRulesPredicates.Presets.IS_GREEN)); final int[] colorCounts = { white, blue, black, red, green }; - final String[] colors = Constant.Color.ONLY_COLORS; int[] countsCopy = Arrays.copyOf(colorCounts, 5); Arrays.sort(countsCopy); @@ -68,9 +67,9 @@ public class SealedDeck extends LimitedDeck { List secondColors = new ArrayList(); for (int i = 0; i < 5; i++) { if (countsCopy[4] == colorCounts[i]) { - maxColors.add(colors[i]); + maxColors.add(Constant.Color.ONLY_COLORS.get(i)); } else if (countsCopy[3] == colorCounts[i]) { - secondColors.add(colors[i]); + secondColors.add(Constant.Color.ONLY_COLORS.get(i)); } } diff --git a/src/main/java/forge/game/phase/Untap.java b/src/main/java/forge/game/phase/Untap.java index e207107b3b9..a8f3108eed3 100644 --- a/src/main/java/forge/game/phase/Untap.java +++ b/src/main/java/forge/game/phase/Untap.java @@ -150,7 +150,7 @@ public class Untap extends Phase { String prompt = "Untap " + c.getName() + "?"; boolean defaultChoice = true; if (c.getGainControlTargets().size() > 0) { - final ArrayList targets = c.getGainControlTargets(); + final List targets = c.getGainControlTargets(); prompt += "\r\n" + c + " is controlling: "; for (final Card target : targets) { prompt += target; @@ -167,7 +167,7 @@ public class Untap extends Phase { // leave it tapped // if not, untap it if (c.getGainControlTargets().size() > 0) { - final ArrayList targets = c.getGainControlTargets(); + final List targets = c.getGainControlTargets(); boolean untap = true; for (final Card target : targets) { if (target.isInPlay()) {