From 584eefbfe7fe451e2d5a6aa7f436ad4e9a32abf7 Mon Sep 17 00:00:00 2001 From: elcnesh Date: Mon, 11 Aug 2014 21:31:11 +0000 Subject: [PATCH] Add Swirl the Mists (plus some general text change cleanup). --- .gitattributes | 1 + .../main/java/forge/game/StaticEffects.java | 11 ++++++++ .../java/forge/game/ability/AbilityUtils.java | 9 ++++++- .../ability/effects/ChangeTextEffect.java | 20 ++++---------- .../src/main/java/forge/game/card/Card.java | 10 +++---- .../forge/game/card/CardChangedWords.java | 4 ++- .../game/staticability/StaticAbility.java | 2 +- .../StaticAbilityContinuous.java | 26 +++++++++++++++++++ .../res/cardsfolder/s/swirl_the_mists.txt | 8 ++++++ 9 files changed, 67 insertions(+), 24 deletions(-) create mode 100644 forge-gui/res/cardsfolder/s/swirl_the_mists.txt diff --git a/.gitattributes b/.gitattributes index 6d1d4d08932..52ebf1153b8 100644 --- a/.gitattributes +++ b/.gitattributes @@ -13219,6 +13219,7 @@ forge-gui/res/cardsfolder/s/swift_justice.txt -text forge-gui/res/cardsfolder/s/swift_maneuver.txt svneol=native#text/plain forge-gui/res/cardsfolder/s/swift_silence.txt -text forge-gui/res/cardsfolder/s/swiftfoot_boots.txt svneol=native#text/plain +forge-gui/res/cardsfolder/s/swirl_the_mists.txt -text forge-gui/res/cardsfolder/s/swirling_sandstorm.txt svneol=native#text/plain forge-gui/res/cardsfolder/s/swirling_spriggan.txt -text forge-gui/res/cardsfolder/s/switcheroo.txt -text diff --git a/forge-game/src/main/java/forge/game/StaticEffects.java b/forge-game/src/main/java/forge/game/StaticEffects.java index 698b63c35b3..59edaf89174 100644 --- a/forge-game/src/main/java/forge/game/StaticEffects.java +++ b/forge-game/src/main/java/forge/game/StaticEffects.java @@ -87,6 +87,8 @@ public class StaticEffects implements IGameStateObject { final ArrayList affectedPlayers = se.getAffectedPlayers(); final Map params = se.getParams(); + String changeColorWordsTo = null; + int powerBonus = 0; String addP = ""; int toughnessBonus = 0; @@ -97,6 +99,10 @@ public class StaticEffects implements IGameStateObject { String[] addHiddenKeywords = null; String addColors = null; + if (params.containsKey("ChangeColorWordsTo")) { + changeColorWordsTo = params.get("ChangeColorWordsTo"); + } + if (params.containsKey("SetPower") || params.containsKey("SetToughness")) { setPT = true; } @@ -188,6 +194,11 @@ public class StaticEffects implements IGameStateObject { affectedCard.removeTempController(se.getTimestamp()); } + // Revert changed color words + if (changeColorWordsTo != null) { + affectedCard.removeChangedTextColorWord(se.getTimestamp()); + } + // remove set P/T if (!params.containsKey("CharacteristicDefining") && setPT) { affectedCard.removeNewPT(se.getTimestamp()); diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index 6a3b9332f4f..cf1900e9d03 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -1517,7 +1517,14 @@ public class AbilityUtils { public static final String applyTextChangeEffects(final String def, final Card hostCard) { String replaced = def; for (final Entry e : hostCard.getChangedTextColorWords().entrySet()) { - replaced = replaced.replace(e.getKey(), e.getValue()); + if (e.getKey().equals("Any")) { + for (final byte c : MagicColor.WUBRG) { + replaced = replaced.replace(MagicColor.toLongString(c), e.getValue()) + .replace(StringUtils.capitalize(MagicColor.toLongString(c)), StringUtils.capitalize(e.getValue())); + } + } else { + replaced = replaced.replace(e.getKey(), e.getValue()); + } } for (final Entry e : hostCard.getChangedTextTypeWords().entrySet()) { replaced = replaced.replace(e.getKey(), e.getValue()); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeTextEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeTextEffect.java index e0d4cdbacac..9dbae9ac01c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeTextEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeTextEffect.java @@ -24,6 +24,7 @@ public class ChangeTextEffect extends SpellAbilityEffect { public void resolve(final SpellAbility sa) { final Card source = sa.getHostCard(); final Game game = source.getGame(); + final Long timestamp = Long.valueOf(game.getNextTimestamp()); final boolean permanent = sa.hasParam("Permanent"); final String changedColorWordOriginal, changedColorWordNew; @@ -97,19 +98,8 @@ public class ChangeTextEffect extends SpellAbilityEffect { final List tgts = getTargetCards(sa); for (final Card c : tgts) { - final Long colorTimestamp; - if (changedColorWordNew != null) { - colorTimestamp = c.addChangedTextColorWord(changedColorWordOriginal, changedColorWordNew); - } else { - colorTimestamp = null; - } - - final Long typeTimestamp; - if (changedTypeWordNew != null) { - typeTimestamp = c.addChangedTextTypeWord(changedTypeWordOriginal, changedTypeWordNew); - } else { - typeTimestamp = null; - } + c.addChangedTextColorWord(changedColorWordOriginal, changedColorWordNew, timestamp); + c.addChangedTextTypeWord(changedTypeWordOriginal, changedTypeWordNew, timestamp); if (!permanent) { final GameCommand revert = new GameCommand() { @@ -117,10 +107,10 @@ public class ChangeTextEffect extends SpellAbilityEffect { @Override public void run() { if (changedColorWordNew != null) { - c.removeChangedTextColorWord(colorTimestamp); + c.removeChangedTextColorWord(timestamp); } if (changedTypeWordNew != null) { - c.removeChangedTextTypeWord(typeTimestamp); + c.removeChangedTextTypeWord(timestamp); } } }; diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 88f3929d65c..cbc230e189c 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -4544,14 +4544,13 @@ public class Card extends GameEntity implements Comparable { * @throws RuntimeException if either of the strings is not a valid Magic * color. */ - public final Long addChangedTextColorWord(final String originalWord, final String newWord) { + public final void addChangedTextColorWord(final String originalWord, final String newWord, final Long timestamp) { if (MagicColor.fromName(newWord) == 0) { throw new RuntimeException("Not a color: " + newWord); } - final Long timestamp = this.changedTextColors.add(this.getGame().getNextTimestamp(), originalWord, newWord); + this.changedTextColors.add(timestamp, StringUtils.capitalize(originalWord), StringUtils.capitalize(newWord)); this.updateKeywordsChangedText(originalWord, newWord, timestamp); this.updateChangedText(); - return timestamp; } public final void removeChangedTextColorWord(final Long timestamp) { @@ -4566,14 +4565,13 @@ public class Card extends GameEntity implements Comparable { * @param originalWord the original type word. * @param newWord the new type word. */ - public final Long addChangedTextTypeWord(final String originalWord, final String newWord) { - final Long timestamp = this.changedTextTypes.add(this.getGame().getNextTimestamp(), originalWord, newWord); + public final void addChangedTextTypeWord(final String originalWord, final String newWord, final Long timestamp) { + this.changedTextTypes.add(timestamp, originalWord, newWord); if (this.getType().contains(originalWord)) { this.addChangedCardTypes(Lists.newArrayList(newWord), Lists.newArrayList(originalWord), false, false, false, false, timestamp); } this.updateKeywordsChangedText(originalWord, newWord, timestamp); this.updateChangedText(); - return timestamp; } public final void removeChangedTextTypeWord(final Long timestamp) { diff --git a/forge-game/src/main/java/forge/game/card/CardChangedWords.java b/forge-game/src/main/java/forge/game/card/CardChangedWords.java index 0a7ba531a90..a7d5cad6eca 100644 --- a/forge-game/src/main/java/forge/game/card/CardChangedWords.java +++ b/forge-game/src/main/java/forge/game/card/CardChangedWords.java @@ -53,7 +53,9 @@ public final class CardChangedWords { resultCache.put(ccw.getOriginalWord(), ccw.getNewWord()); } for (final String key : ImmutableList.copyOf(resultCache.keySet())) { - resultCache.put(key.toLowerCase(), resultCache.get(key).toLowerCase()); + if (!key.equals("Any")) { + resultCache.put(key.toLowerCase(), resultCache.get(key).toLowerCase()); + } } isDirty = false; } diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java index 0cb17ce94f3..879ff9786b4 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java @@ -111,7 +111,7 @@ public class StaticAbility extends CardTraitBase { return 2; } - if (this.mapParams.containsKey("ChangeText")) { + if (this.mapParams.containsKey("ChangeColorWordsTo")) { return 3; } diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java index a01b66b65c9..d8401e47510 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java @@ -22,6 +22,7 @@ import com.google.common.collect.Lists; import forge.GameCommand; import forge.card.CardType; import forge.card.ColorSet; +import forge.card.MagicColor; import forge.card.mana.ManaCostShard; import forge.game.*; import forge.game.ability.AbilityFactory; @@ -79,6 +80,8 @@ public class StaticAbilityContinuous { se.setTimestamp(hostCard.getTimestamp()); game.getStaticEffects().addStaticEffect(se); + String changeColorWordsTo = null; + String addP = ""; int powerBonus = 0; String addT = ""; @@ -113,6 +116,10 @@ public class StaticAbilityContinuous { effects.setGlobalRuleChange(GlobalRuleChange.fromString(params.get("GlobalRule"))); } + if (params.containsKey("ChangeColorWordsTo")) { + changeColorWordsTo = params.get("ChangeColorWordsTo"); + } + if (params.containsKey("SetPower")) { setP = params.get("SetPower"); setPower = AbilityUtils.calculateAmount(hostCard, setP, null); @@ -367,6 +374,25 @@ public class StaticAbilityContinuous { affectedCard.addTempController(hostCard.getController(), hostCard.getTimestamp()); } + // Change color words + if (changeColorWordsTo != null) { + final byte color; + if (changeColorWordsTo.equals("ChosenColor")) { + if (hostCard.getChosenColor().size() > 0) { + color = MagicColor.fromName(hostCard.getChosenColor().get(0)); + } else { + color = 0; + } + } else { + color = MagicColor.fromName(changeColorWordsTo); + } + + if (color != 0) { + final String colorName = MagicColor.toLongString(color); + affectedCard.addChangedTextColorWord("Any", colorName, se.getTimestamp()); + } + } + // set P/T if (params.containsKey("CharacteristicDefining")) { if (setPower != -1) { diff --git a/forge-gui/res/cardsfolder/s/swirl_the_mists.txt b/forge-gui/res/cardsfolder/s/swirl_the_mists.txt new file mode 100644 index 00000000000..2d81a227584 --- /dev/null +++ b/forge-gui/res/cardsfolder/s/swirl_the_mists.txt @@ -0,0 +1,8 @@ +Name:Swirl the Mists +ManaCost:2 U U +Types:Enchantment +K:ETBReplacement:Other:ChooseColor +SVar:ChooseColor:DB$ ChooseColor | Defined$ You | SpellDescription$ As CARDNAME enters the battlefield, choose a color word. +S:Mode$ Continuous | Affected$ Spell,Permanent | AffectedZone$ Stack,Battlefield | ChangeColorWordsTo$ ChosenColor | Description$ All instances of color words in the text of spells and permanents are changed to the chosen color word. +SVar:Picture:http://www.wizards.com/global/images/magic/general/swirl_the_mists.jpg +Oracle:As Swirl the Mists enters the battlefield, choose a color word.\nAll instances of color words in the text of spells and permanents are changed to the chosen color word.