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 d7b07c9ed75..ec8905e7404 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -1520,7 +1520,9 @@ public class Card extends GameEntity implements Comparable { } else if (keyword.startsWith("Provoke") || keyword.startsWith("Ingest") || keyword.equals("Unleash") || keyword.startsWith("Soulbond") || keyword.equals("Partner") || keyword.equals("Retrace") || keyword.equals("Living Weapon") || keyword.equals("Myriad") || keyword.equals("Exploit") - || keyword.equals("Changeling")) { + || keyword.equals("Changeling") || keyword.equals("Delve") || keyword.startsWith("Dredge") + || (keyword.startsWith("Split second") && !sb.toString().contains("Split second")) + || keyword.startsWith("Devoid")){ sbLong.append(keyword + " (" + Keyword.getInstance(keyword).getReminderText() + ")"); } else if (keyword.startsWith("Modular") || keyword.startsWith("Bloodthirst") || keyword.startsWith("Fabricate") || keyword.startsWith("Soulshift") @@ -1538,13 +1540,15 @@ public class Card extends GameEntity implements Comparable { sb.append("exile it haunting target creature."); } sb.append(")"); - } else if (keyword.equals("Convoke") || keyword.equals("Dethrone")|| keyword.equals("Fear") + } else if (keyword.equals("Convoke") || keyword.equals("Dethrone")|| keyword.equals("Fear") || keyword.equals("Melee") || keyword.equals("Improvise")|| keyword.equals("Shroud") - || keyword.equals("Banding") || keyword.equals("Intimidate")|| keyword.equals("Evolve") + || keyword.equals("Banding") || keyword.equals("Intimidate")|| keyword.equals("Evolve") || keyword.equals("Exalted") || keyword.equals("Extort")|| keyword.equals("Flanking") || keyword.equals("Horsemanship") || keyword.equals("Infect")|| keyword.equals("Persist") || keyword.equals("Phasing") || keyword.equals("Shadow")|| keyword.equals("Skulk") - || keyword.equals("Undying") || keyword.equals("Wither") || keyword.equals("Totem Armor")) { + || keyword.equals("Undying") || keyword.equals("Wither") || keyword.equals("Totem armor") + || keyword.startsWith ("Afflict") || keyword.startsWith("Bushido") || keyword.startsWith ("Poisonous") + || keyword.startsWith ("Rampage") || keyword.startsWith("Cascade")) { if (sb.length() != 0) { sb.append("\r\n"); } @@ -1958,7 +1962,8 @@ public class Card extends GameEntity implements Comparable { // keyword descriptions for (final String keyword : kw) { if ((keyword.startsWith("Ripple") && !sb.toString().contains("Ripple")) - || (keyword.startsWith("Dredge") && !sb.toString().contains("Dredge")) + //|| (keyword.startsWith("Dredge") && !sb.toString().contains("Dredge")) | Replaced with + // keyword.startsWith("Dredge") Hopefully that doesn't break anything. -Indigo Dragon 8/9/2017 || (keyword.startsWith("CARDNAME is ") && !sb.toString().contains("CARDNAME is "))) { sb.append(keyword.replace(":", " ")).append("\r\n"); } else if (keyword.startsWith("Madness") @@ -1967,15 +1972,19 @@ public class Card extends GameEntity implements Comparable { String[] parts = keyword.split(":"); sb.append(parts[0]).append(" ").append(ManaCostParser.parse(parts[1])) .append(" (").append(Keyword.getInstance(keyword).getReminderText()).append(")").append("\r\n"); - } else if (keyword.equals("CARDNAME can't be countered.") - || keyword.startsWith("Conspire") + } else if (keyword.equals("CARDNAME can't be countered.")) { + sb.append(keyword).append("\r\n"); + } else if (keyword.equals("Aftermath")) { + sb.append(Keyword.getInstance(keyword).getReminderText()).append("\r\n"); + } else if (keyword.startsWith("Conspire") || keyword.startsWith("Dredge") || keyword.startsWith("Cascade") || keyword.startsWith("Wither") || (keyword.startsWith("Epic") && !sb.toString().contains("Epic")) || (keyword.startsWith("Split second") && !sb.toString().contains("Split second")) || (keyword.startsWith("Devoid"))) { - sb.append(keyword).append("\r\n"); - } else if (keyword.equals("Aftermath")) { - sb.append(Keyword.getInstance(keyword).getReminderText()).append("\r\n"); + if (sb.length() != 0) { + sb.append("\r\n"); + sb.append(keyword + " (" + Keyword.getInstance(keyword).getReminderText() + ")"); + } } else if (keyword.equals("You may cast CARDNAME as though it had flash if you pay {2} more to cast it.")) { sb.append(keyword).append("\r\n"); } else if (keyword.startsWith("Flashback")) { @@ -1983,12 +1992,16 @@ public class Card extends GameEntity implements Comparable { if (keyword.contains(" ")) { final Cost fbCost = new Cost(keyword.substring(10), true); if (!fbCost.isOnlyManaCost()) { - sb.append(" -"); + sb.append("—"); } - sb.append(" ").append(fbCost.toString()).delete(sb.length() - 2, sb.length()); + if (fbCost.isOnlyManaCost()) { + sb.append(" "); + } + sb.append(fbCost.toString()).delete(sb.length() - 2, sb.length()); if (!fbCost.isOnlyManaCost()) { sb.append("."); } + sb.append(" (You may cast this card from your graveyard for its flashback cost. Then exile it.)"); } sb.append("\r\n"); } else if (keyword.startsWith("Splice")) { diff --git a/forge-game/src/main/java/forge/game/keyword/Keyword.java b/forge-game/src/main/java/forge/game/keyword/Keyword.java index 1a6275349e1..4b4d44db06d 100644 --- a/forge-game/src/main/java/forge/game/keyword/Keyword.java +++ b/forge-game/src/main/java/forge/game/keyword/Keyword.java @@ -39,8 +39,9 @@ public enum Keyword { DELVE(SimpleKeyword.class, true, "As an additional cost to cast this spell, you may exile any number of cards from your graveyard. Each card exiled this way reduces the cost to cast this spell by {1}."), DETHRONE(SimpleKeyword.class, false, "Whenever this creature attacks the player with the most life or tied for the most life, put a +1/+1 counter on it."), DEVOUR(KeywordWithAmount.class, true, "As this creature enters the battlefield, you may sacrifice any number of creatures. This creature enters the battlefield with {%d:+1/+1 counter} on it for each creature sacrificed this way."), + DEVOID(SimpleKeyword.class, true, "This card has no color."), DOUBLE_STRIKE(SimpleKeyword.class, true, "This creature deals both first-strike and regular combat damage."), - DREDGE(KeywordWithAmount.class, true, "If you would draw a card, you may instead put %d cards from the top of your library into your graveyard and return this card from your graveyard to your hand."), + DREDGE(KeywordWithAmount.class, true, "If you would draw a card, instead you may put exactly %d cards from the top of your library into your graveyard. If you do, return this card from your graveyard to your hand. Otherwise, draw a card."), ECHO(KeywordWithCost.class, false, "At the beginning of your upkeep, if this permanent came under your control since the beginning of your last upkeep, sacrifice it unless you pay %s."), EMBALM(KeywordWithCost.class, false, "Create a token that's a copy of this card, except it's white, it has no mana cost, and it's a Zombie in addition to its other types. Embalm only as a sorcery."), EMERGE(KeywordWithCost.class, true, "You may cast this spell by sacrificing a creature and paying the emerge cost reduced by that creature's converted mana cost."),