From cdea3d3a11ff4ea95d40c995f3a4e87cc6442588 Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Wed, 27 Feb 2013 14:40:26 +0000 Subject: [PATCH] change of Card.getKeywords() return type into List cleanup in callers of getKeywords - some were calling toString() of String, others used for with counter to iterate. --- src/main/java/forge/Card.java | 18 +-- .../cardfactory/CardFactoryCreatures.java | 135 ++++++++---------- .../card/cardfactory/CardFactoryUtil.java | 30 ++-- .../forge/control/input/InputMulligan.java | 10 +- src/main/java/forge/game/GameActionUtil.java | 71 +++++---- .../java/forge/game/phase/CombatUtil.java | 36 ++--- src/main/java/forge/game/phase/Upkeep.java | 4 +- 7 files changed, 123 insertions(+), 181 deletions(-) diff --git a/src/main/java/forge/Card.java b/src/main/java/forge/Card.java index 656ced90669..da9c5799804 100644 --- a/src/main/java/forge/Card.java +++ b/src/main/java/forge/Card.java @@ -2492,7 +2492,7 @@ public class Card extends GameEntity implements Comparable { } // Add Keywords - final ArrayList kw = this.getKeyword(); + final List kw = this.getKeyword(); // Triggered abilities for (final Trigger trig : this.getCharacteristics().getTriggers()) { @@ -4878,7 +4878,7 @@ public class Card extends GameEntity implements Comparable { * * @return a {@link java.util.ArrayList} object. */ - public final ArrayList getKeyword() { + public final List getKeyword() { final ArrayList keywords = this.getUnhiddenKeyword(); keywords.addAll(this.getHiddenExtrinsicKeyword()); @@ -5978,7 +5978,7 @@ public class Card extends GameEntity implements Comparable { * @return a boolean. */ public final boolean hasStartOfKeyword(final String keyword) { - final ArrayList a = this.getKeyword(); + final List a = this.getKeyword(); for (int i = 0; i < a.size(); i++) { if (a.get(i).toString().startsWith(keyword)) { return true; @@ -6016,7 +6016,7 @@ public class Card extends GameEntity implements Comparable { * @return a int. */ public final int getKeywordPosition(final String k) { - final ArrayList a = this.getKeyword(); + final List a = this.getKeyword(); for (int i = 0; i < a.size(); i++) { if (a.get(i).toString().startsWith(k)) { return i; @@ -6097,8 +6097,7 @@ public class Card extends GameEntity implements Comparable { */ public final int getKeywordMagnitude(final String k) { int count = 0; - final ArrayList keywords = this.getKeyword(); - for (final String kw : keywords) { + for (final String kw : this.getKeyword()) { if (kw.startsWith(k)) { final String[] parse = kw.split(" "); final String s = parse[1]; @@ -8691,7 +8690,7 @@ public class Card extends GameEntity implements Comparable { } if (this.getKeyword() != null) { - final ArrayList list = this.getKeyword(); + final List list = this.getKeyword(); String kw = ""; for (int i = 0; i < list.size(); i++) { @@ -8829,12 +8828,9 @@ public class Card extends GameEntity implements Comparable { } if (this.getKeyword() != null) { - final ArrayList list = this.getKeyword(); final Card source = sa.getSourceCard(); - String kw = ""; - for (int i = 0; i < list.size(); i++) { - kw = list.get(i); + for (String kw : this.getKeyword()) { if (kw.equals("Shroud")) { return false; } diff --git a/src/main/java/forge/card/cardfactory/CardFactoryCreatures.java b/src/main/java/forge/card/cardfactory/CardFactoryCreatures.java index 24b3c92438f..4950e234fd7 100644 --- a/src/main/java/forge/card/cardfactory/CardFactoryCreatures.java +++ b/src/main/java/forge/card/cardfactory/CardFactoryCreatures.java @@ -750,89 +750,66 @@ public class CardFactoryCreatures { // end of card specific code // *************************************************** - if ((CardFactoryCreatures.hasKeyword(card, "Level up") != -1) - && (CardFactoryCreatures.hasKeyword(card, "maxLevel") != -1)) { - final int n = CardFactoryCreatures.hasKeyword(card, "Level up"); - final int m = CardFactoryCreatures.hasKeyword(card, "maxLevel"); - if (n != -1) { - final String parse = card.getKeyword().get(n).toString(); - final String parseMax = card.getKeyword().get(m).toString(); - - card.removeIntrinsicKeyword(parse); - card.removeIntrinsicKeyword(parseMax); - - final String[] k = parse.split(":"); - final String manacost = k[1]; - - final String[] l = parseMax.split(":"); - final int maxLevel = Integer.parseInt(l[1]); - - class LevelUpAbility extends AbilityActivated { - public LevelUpAbility(final Card ca, final String s) { - super(ca, new Cost(ca, manacost, true), null); - } - - @Override - public AbilityActivated getCopy() { - AbilityActivated levelUp = new LevelUpAbility(getSourceCard(), getPayCosts().toString()); - levelUp.getRestrictions().setSorcerySpeed(true); - return levelUp; - } - - private static final long serialVersionUID = 3998280279949548652L; - - @Override - public void resolve() { - card.addCounter(CounterType.LEVEL, 1, true); - } - - @Override - public boolean canPlayAI() { - // Todo: Improve Level up code - return card.getCounters(CounterType.LEVEL) < maxLevel; - } - - @Override - public String getDescription() { - final StringBuilder sbDesc = new StringBuilder(); - sbDesc.append("Level up ").append(manacost).append(" (").append(manacost); - sbDesc.append(": Put a level counter on this. Level up only as a sorcery.)"); - return sbDesc.toString(); - } - } - final SpellAbility levelUp = new LevelUpAbility(card, manacost); - levelUp.getRestrictions().setSorcerySpeed(true); - card.addSpellAbility(levelUp); - - final StringBuilder sbStack = new StringBuilder(); - sbStack.append(card).append(" - put a level counter on this."); - levelUp.setStackDescription(sbStack.toString()); - - card.setLevelUp(true); - - } + final int iLvlUp = CardFactoryUtil.hasKeyword(card, "Level up"); + final int iLvlMax = CardFactoryUtil.hasKeyword(card, "maxLevel"); + + if (iLvlUp != -1 && iLvlMax != -1) { + final String parse = card.getKeyword().get(iLvlUp); + final String parseMax = card.getKeyword().get(iLvlMax); + card.addSpellAbility(makeLevellerAbility(card, parse, parseMax)); + card.setLevelUp(true); } // level up } - /** - *

- * hasKeyword. - *

- * - * @param c - * a {@link forge.Card} object. - * @param k - * a {@link java.lang.String} object. - * @return a int. - */ - private static int hasKeyword(final Card c, final String k) { - final ArrayList a = c.getKeyword(); - for (int i = 0; i < a.size(); i++) { - if (a.get(i).toString().startsWith(k)) { - return i; + + private static SpellAbility makeLevellerAbility(final Card card, final String strLevelCost, final String strMaxLevel) { + card.removeIntrinsicKeyword(strLevelCost); + card.removeIntrinsicKeyword(strMaxLevel); + + final String[] k = strLevelCost.split(":"); + final String manacost = k[1]; + + final String[] l = strMaxLevel.split(":"); + final int maxLevel = Integer.parseInt(l[1]); + + class LevelUpAbility extends AbilityActivated { + public LevelUpAbility(final Card ca, final String s) { + super(ca, new Cost(ca, manacost, true), null); + } + + @Override + public AbilityActivated getCopy() { + AbilityActivated levelUp = new LevelUpAbility(getSourceCard(), getPayCosts().toString()); + levelUp.getRestrictions().setSorcerySpeed(true); + return levelUp; + } + + private static final long serialVersionUID = 3998280279949548652L; + + @Override + public void resolve() { + card.addCounter(CounterType.LEVEL, 1, true); + } + + @Override + public boolean canPlayAI() { + // Todo: Improve Level up code + return card.getCounters(CounterType.LEVEL) < maxLevel; + } + + @Override + public String getDescription() { + final StringBuilder sbDesc = new StringBuilder(); + sbDesc.append("Level up ").append(manacost).append(" (").append(manacost); + sbDesc.append(": Put a level counter on this. Level up only as a sorcery.)"); + return sbDesc.toString(); } } - - return -1; + final SpellAbility levelUp = new LevelUpAbility(card, manacost); + levelUp.getRestrictions().setSorcerySpeed(true); + final StringBuilder sbStack = new StringBuilder(); + sbStack.append(card).append(" - put a level counter on this."); + levelUp.setStackDescription(sbStack.toString()); + return levelUp; } } diff --git a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java index 1b06277f2cc..b1160a280a3 100644 --- a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java +++ b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java @@ -40,7 +40,6 @@ import forge.CounterType; import forge.GameEntity; import forge.Singletons; import forge.card.CardCharacteristics; -import forge.card.MagicColor; import forge.card.ability.AbilityFactory; import forge.card.ability.AbilityUtils; import forge.card.ability.ApiType; @@ -1822,9 +1821,8 @@ public class CardFactoryUtil { // Count$BushidoPoint if (sq[0].contains("BushidoPoint")) { - final ArrayList keywords = c.getKeyword(); int magnitude = 0; - for (final String kw : keywords) { + for (final String kw : c.getKeyword()) { if (kw.contains("Bushido")) { final String[] parse = kw.split(" "); final String num = parse[1]; @@ -2528,12 +2526,11 @@ public class CardFactoryUtil { * @return a {@link java.util.ArrayList} object. */ public static ArrayList getBushidoEffects(final Card c) { - final ArrayList keywords = c.getKeyword(); final ArrayList list = new ArrayList(); final Card crd = c; - for (final String kw : keywords) { + for (final String kw : c.getKeyword()) { if (kw.contains("Bushido")) { final String[] parse = kw.split(" "); final String s = parse[1]; @@ -2862,11 +2859,9 @@ public class CardFactoryUtil { if (CardFactoryUtil.hasKeyword(card, "Transmute") != -1) { final int n = CardFactoryUtil.hasKeyword(card, "Transmute"); if (n != -1) { - final String parse = card.getKeyword().get(n).toString(); + final String parse = card.getKeyword().get(n); card.removeIntrinsicKeyword(parse); - - final String[] k = parse.split(":"); - final String manacost = k[1]; + final String manacost = parse.split(":")[1]; card.addSpellAbility(CardFactoryUtil.abilityTransmute(card, manacost)); } @@ -2895,8 +2890,7 @@ public class CardFactoryUtil { final int echoPos = CardFactoryUtil.hasKeyword(card, "Echo"); if (echoPos != -1) { // card.removeIntrinsicKeyword(parse); - final String parse = card.getKeyword().get(echoPos); - final String[] k = parse.split(":"); + final String[] k = card.getKeyword().get(echoPos).split(":"); final String manacost = k[1]; card.setEchoCost(manacost); @@ -2918,7 +2912,7 @@ public class CardFactoryUtil { // Suspend:: final int n = CardFactoryUtil.hasKeyword(card, "Suspend"); if (n != -1) { - final String parse = card.getKeyword().get(n).toString(); + final String parse = card.getKeyword().get(n); card.removeIntrinsicKeyword(parse); card.setSuspend(true); final String[] k = parse.split(":"); @@ -2939,9 +2933,7 @@ public class CardFactoryUtil { if (CardFactoryUtil.hasKeyword(card, "Fading") != -1) { final int n = CardFactoryUtil.hasKeyword(card, "Fading"); if (n != -1) { - final String parse = card.getKeyword().get(n).toString(); - - final String[] k = parse.split(":"); + final String[] k = card.getKeyword().get(n).split(":"); final int power = Integer.parseInt(k[1]); card.addComesIntoPlayCommand(CardFactoryUtil.fading(card, power)); @@ -2951,9 +2943,7 @@ public class CardFactoryUtil { if (CardFactoryUtil.hasKeyword(card, "Vanishing") != -1) { final int n = CardFactoryUtil.hasKeyword(card, "Vanishing"); if (n != -1) { - final String parse = card.getKeyword().get(n).toString(); - - final String[] k = parse.split(":"); + final String[] k = card.getKeyword().get(n).split(":"); final int power = Integer.parseInt(k[1]); card.addComesIntoPlayCommand(CardFactoryUtil.vanishing(card, power)); @@ -3591,7 +3581,7 @@ public class CardFactoryUtil { * @return a int. */ public static final int hasKeyword(final Card c, final String k) { - final ArrayList a = c.getKeyword(); + final List a = c.getKeyword(); for (int i = 0; i < a.size(); i++) { if (a.get(i).startsWith(k)) { return i; @@ -3615,7 +3605,7 @@ public class CardFactoryUtil { * @return a int. */ static final int hasKeyword(final Card c, final String k, final int startPos) { - final ArrayList a = c.getKeyword(); + final List a = c.getKeyword(); for (int i = startPos; i < a.size(); i++) { if (a.get(i).startsWith(k)) { return i; diff --git a/src/main/java/forge/control/input/InputMulligan.java b/src/main/java/forge/control/input/InputMulligan.java index 6cbf4102b6a..85c82714684 100644 --- a/src/main/java/forge/control/input/InputMulligan.java +++ b/src/main/java/forge/control/input/InputMulligan.java @@ -121,10 +121,7 @@ public class InputMulligan extends Input { for (final Card c : openingHand) { if (p.isHuman()) { - final ArrayList kws = c.getKeyword(); - for (int i = 0; i < kws.size(); i++) { - final String kw = kws.get(i); - + for (String kw : c.getKeyword()) { if (kw.startsWith("MayEffectFromOpeningHand")) { final String effName = kw.split(":")[1]; @@ -143,10 +140,7 @@ public class InputMulligan extends Input { } } else { // Computer Leylines & Chancellors if (!c.getName().startsWith("Leyline of")) { - final ArrayList kws = c.getKeyword(); - for (int i = 0; i < kws.size(); i++) { - final String kw = kws.get(i); - + for (String kw : c.getKeyword()) { if (kw.startsWith("MayEffectFromOpeningHand")) { final String effName = kw.split(":")[1]; diff --git a/src/main/java/forge/game/GameActionUtil.java b/src/main/java/forge/game/GameActionUtil.java index 052abed5e85..a0bc94e467a 100644 --- a/src/main/java/forge/game/GameActionUtil.java +++ b/src/main/java/forge/game/GameActionUtil.java @@ -333,7 +333,7 @@ public final class GameActionUtil { c.addExtrinsicKeyword("Ripple:4"); } - final ArrayList a = c.getKeyword(); + final List a = c.getKeyword(); for (int x = 0; x < a.size(); x++) { if (a.get(x).toString().startsWith("Ripple")) { final String parse = c.getKeyword().get(x).toString(); @@ -713,41 +713,38 @@ public final class GameActionUtil { * a {@link forge.Card} object. */ public static void executeVampiricEffects(final Card c) { - final ArrayList a = c.getKeyword(); - for (int i = 0; i < a.size(); i++) { - if (c.isInPlay() - && a.get(i) - .toString() - .startsWith( - "Whenever a creature dealt damage by CARDNAME " - + "this turn is put into a graveyard, put")) { - final Card thisCard = c; - final String kw = a.get(i).toString(); - final Ability ability2 = new Ability(c, ManaCost.ZERO) { - @Override - public void resolve() { - CounterType counter = CounterType.P1P1; - if (kw.contains("+2/+2")) { - counter = CounterType.P2P2; - } - if (thisCard.isInPlay()) { - thisCard.addCounter(counter, 1, true); - } - } - }; // ability2 - - final StringBuilder sb = new StringBuilder(); - sb.append(c.getName()); - if (kw.contains("+2/+2")) { - sb.append(" - gets a +2/+2 counter"); - } else { - sb.append(" - gets a +1/+1 counter"); - } - ability2.setStackDescription(sb.toString()); - - Singletons.getModel().getGame().getStack().addSimultaneousStackEntry(ability2); + if (!c.isInPlay()) return; + for (final String kw : c.getKeyword()) { + if(!kw.startsWith("Whenever a creature dealt damage by CARDNAME this turn is put into a graveyard, put")) { + continue; } + final Card thisCard = c; + + final Ability ability2 = new Ability(c, ManaCost.ZERO) { + @Override + public void resolve() { + CounterType counter = CounterType.P1P1; + if (kw.contains("+2/+2")) { + counter = CounterType.P2P2; + } + if (thisCard.isInPlay()) { + thisCard.addCounter(counter, 1, true); + } + } + }; // ability2 + + final StringBuilder sb = new StringBuilder(); + sb.append(c.getName()); + if (kw.contains("+2/+2")) { + sb.append(" - gets a +2/+2 counter"); + } else { + sb.append(" - gets a +1/+1 counter"); + } + ability2.setStackDescription(sb.toString()); + + Singletons.getModel().getGame().getStack().addSimultaneousStackEntry(ability2); + } } @@ -823,13 +820,11 @@ public final class GameActionUtil { sb.append("."); ability.setStackDescription(sb.toString()); - final ArrayList keywords = c.getKeyword(); - for (int i = 0; i < keywords.size(); i++) { - if (keywords.get(i).startsWith("Poisonous")) { + for (String kw : c.getKeyword()) { + if (kw.startsWith("Poisonous")) { Singletons.getModel().getGame().getStack().addSimultaneousStackEntry(ability); } - } } diff --git a/src/main/java/forge/game/phase/CombatUtil.java b/src/main/java/forge/game/phase/CombatUtil.java index 246421679b5..9525c72a756 100644 --- a/src/main/java/forge/game/phase/CombatUtil.java +++ b/src/main/java/forge/game/phase/CombatUtil.java @@ -880,36 +880,32 @@ public class CombatUtil { // CARDNAME can't attack if defending player controls an untapped // creature with power ... final int[] powerLimit = { 0 }; - int keywordPosition = 0; - boolean hasKeyword = false; + String cantAttackKw = null; - final ArrayList attackerKeywords = c.getKeyword(); - for (int i = 0; i < attackerKeywords.size(); i++) { - if (attackerKeywords.get(i).toString() - .startsWith("CARDNAME can't attack if defending player controls an untapped creature with power")) { - hasKeyword = true; - keywordPosition = i; + + for( String kw : c.getKeyword()) { + if (kw.startsWith("CARDNAME can't attack if defending player controls an untapped creature with power")) { + cantAttackKw = kw; } } // The keyword // "CARDNAME can't attack if defending player controls an untapped creature with power" // ... is present - if (hasKeyword) { - final String tmpString = c.getKeyword().get(keywordPosition).toString(); - final String[] asSeparateWords = tmpString.trim().split(" "); + if (cantAttackKw != null) { + final String[] asSeparateWords = cantAttackKw.trim().split(" "); if (asSeparateWords.length >= 15) { - if (asSeparateWords[12].matches("[0-9][0-9]?")) { + if (StringUtils.isNumeric(asSeparateWords[12])) { powerLimit[0] = Integer.parseInt((asSeparateWords[12]).trim()); List list = defendingPlayer.getCreaturesInPlay(); list = CardLists.filter(list, new Predicate() { @Override public boolean apply(final Card ct) { - return ((ct.isUntapped() && (ct.getNetAttack() >= powerLimit[0]) && asSeparateWords[14] - .contains("greater")) || (ct.isUntapped() && (ct.getNetAttack() <= powerLimit[0]) && asSeparateWords[14] - .contains("less"))); + return (ct.isUntapped() + && ((ct.getNetAttack() >= powerLimit[0] && asSeparateWords[14].contains("greater")) + || (ct.getNetAttack() <= powerLimit[0] && asSeparateWords[14].contains("less")))); } }); if (!list.isEmpty()) { @@ -1247,8 +1243,7 @@ public class CombatUtil { // Annihilator: if (!c.getDamageHistory().getCreatureAttackedThisCombat()) { - final ArrayList kws = c.getKeyword(); - for (final String key : kws) { + for (final String key : c.getKeyword()) { if( !key.startsWith("Annihilator ") ) continue; final String[] k = key.split(" ", 2); final int a = Integer.valueOf(k[1]); @@ -1419,7 +1414,7 @@ public class CombatUtil { } // Rampage - final ArrayList keywords = a.getKeyword(); + final List keywords = a.getKeyword(); final Pattern p = Pattern.compile("Rampage [0-9]+"); Matcher m; for (final String keyword : keywords) { @@ -1437,11 +1432,8 @@ public class CombatUtil { if (a.hasKeyword("Flanking") && !b.hasKeyword("Flanking")) { int flankingMagnitude = 0; - String kw = ""; - final ArrayList list = a.getKeyword(); - for (int i = 0; i < list.size(); i++) { - kw = list.get(i); + for (String kw : a.getKeyword()) { if (kw.equals("Flanking")) { flankingMagnitude++; } diff --git a/src/main/java/forge/game/phase/Upkeep.java b/src/main/java/forge/game/phase/Upkeep.java index 076f377e199..c60178f46ec 100644 --- a/src/main/java/forge/game/phase/Upkeep.java +++ b/src/main/java/forge/game/phase/Upkeep.java @@ -268,9 +268,7 @@ public class Upkeep extends Phase { for (int i = 0; i < list.size(); i++) { final Card c = list.get(i); final Player controller = c.getController(); - final ArrayList a = c.getKeyword(); - for (int j = 0; j < a.size(); j++) { - final String ability = a.get(j); + for (String ability : c.getKeyword()) { // destroy if (ability.startsWith("At the beginning of your upkeep, destroy CARDNAME")) {