From e85f9e08be83c29aaa8ff3c5fbb69d1328a9da93 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 22 Dec 2018 08:27:53 +0100 Subject: [PATCH] Keyword: add Afterlife --- .../src/main/java/forge/item/PaperToken.java | 6 ++++-- forge-core/src/main/java/forge/token/TokenDb.java | 2 +- .../forge/game/ability/effects/TokenEffect.java | 2 ++ forge-game/src/main/java/forge/game/card/Card.java | 3 ++- .../main/java/forge/game/card/CardFactoryUtil.java | 14 ++++++++++++++ .../src/main/java/forge/game/keyword/Keyword.java | 1 + .../cardsfolder/upcoming/imperious_oligarch.txt | 7 +++++++ .../res/tokenscripts/wb_1_1_spirit_flying.txt | 7 +++++++ 8 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/imperious_oligarch.txt create mode 100644 forge-gui/res/tokenscripts/wb_1_1_spirit_flying.txt diff --git a/forge-core/src/main/java/forge/item/PaperToken.java b/forge-core/src/main/java/forge/item/PaperToken.java index 59e2e0015ae..bc709dace7a 100644 --- a/forge-core/src/main/java/forge/item/PaperToken.java +++ b/forge-core/src/main/java/forge/item/PaperToken.java @@ -96,7 +96,9 @@ public class PaperToken implements InventoryItemFromSet, IPaperCard { build.add(keyword); } - build.add(edition.getCode()); + if (edition != null) { + build.add(edition.getCode()); + } // Should future image file names be all lower case? Instead of Up case sets? return StringUtils.join(build, "_").toLowerCase(); @@ -121,7 +123,7 @@ public class PaperToken implements InventoryItemFromSet, IPaperCard { @Override public String getName() { return name; } @Override public String toString() { return name; } - @Override public String getEdition() { return edition.getCode(); } + @Override public String getEdition() { return edition != null ? edition.getCode() : "???"; } @Override public int getArtIndex() { return 0; } // This might change however @Override public boolean isFoil() { return false; } @Override public CardRules getRules() { return card; } diff --git a/forge-core/src/main/java/forge/token/TokenDb.java b/forge-core/src/main/java/forge/token/TokenDb.java index f4275e4c86b..9c0ab01bec6 100644 --- a/forge-core/src/main/java/forge/token/TokenDb.java +++ b/forge-core/src/main/java/forge/token/TokenDb.java @@ -47,7 +47,7 @@ public class TokenDb implements ITokenDatabase { tokensByName.put(fullName, pt); return pt; } catch(Exception e) { - return null; + throw e; } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java b/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java index 6ff9d2e7d4e..1636c8f6cc7 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java @@ -207,6 +207,8 @@ public class TokenEffect extends SpellAbilityEffect { if (result != null) { tokenName = result.getName(); + } else { + throw new RuntimeException("don't find Token for TokenScript: " + sa.getParam("TokenScript")); } return result; 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 70b7dd66a2d..4463c639640 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -1622,7 +1622,8 @@ public class Card extends GameEntity implements Comparable { || keyword.startsWith("Fabricate") || keyword.startsWith("Soulshift") || keyword.startsWith("Bushido") || keyword.startsWith("Crew") || keyword.startsWith("Tribute") || keyword.startsWith("Absorb") || keyword.startsWith("Graft") || keyword.startsWith("Fading") || keyword.startsWith("Vanishing") - || keyword.startsWith ("Afflict") || keyword.startsWith ("Poisonous") || keyword.startsWith("Rampage") + || keyword.startsWith("Afterlife") + || keyword.startsWith("Afflict") || keyword.startsWith ("Poisonous") || keyword.startsWith("Rampage") || keyword.startsWith("Renown") || keyword.startsWith("Annihilator") || keyword.startsWith("Devour")) { final String[] k = keyword.split(":"); sbLong.append(k[0] + " " + k[1] + " (" + inst.getReminderText() + ")"); diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 9dcf81f51a9..2fba1dfd121 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -2137,6 +2137,20 @@ public class CardFactoryUtil { afflictTrigger.setOverridingAbility(AbilityFactory.getAbility(abStringAfflict, card)); inst.addTrigger(afflictTrigger); + } else if (keyword.startsWith("Afterlife")) { + final String k[] = keyword.split(":"); + final String name = StringUtils.join(k, " "); + + final StringBuilder sb = new StringBuilder(); + sb.append("Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self "); + sb.append("| Secondary$ True | TriggerDescription$ ").append(name); + sb.append(" (").append(inst.getReminderText()).append(")"); + final String effect = "DB$ Token | TokenAmount$ " + k[1] + " | TokenScript$ wb_1_1_spirit_flying"; + + final Trigger trigger = TriggerHandler.parseTrigger(sb.toString(), card, intrinsic); + + trigger.setOverridingAbility(AbilityFactory.getAbility(effect, card)); + inst.addTrigger(trigger); } else if (keyword.startsWith("Annihilator")) { final String[] k = keyword.split(":"); final String n = k[1]; 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 72c45bc8589..b5272d5199d 100644 --- a/forge-game/src/main/java/forge/game/keyword/Keyword.java +++ b/forge-game/src/main/java/forge/game/keyword/Keyword.java @@ -15,6 +15,7 @@ public enum Keyword { ABSORB(KeywordWithAmount.class, false, "If a source would deal damage to this creature, prevent %d of that damage."), AFFINITY(KeywordWithType.class, false, "This spell costs you {1} less to cast for each %s you control."), AFFLICT(KeywordWithAmount.class, false, "Whenever this creature becomes blocked, defending player loses %d life."), + AFTERLIFE(KeywordWithAmount.class, false, "When this creature dies, create {%1$d:1/1 white and black Spirit creature token} with flying."), AFTERMATH(SimpleKeyword.class, false, "Cast this spell only from your graveyard. Then exile it."), AMPLIFY(KeywordWithAmountAndType.class, false, "As this creature enters the battlefield, put {%d:+1/+1 counter} on it for each %s card you reveal in your hand."), ANNIHILATOR(KeywordWithAmount.class, false, "Whenever this creature attacks, defending player sacrifices {%d:permanent}."), diff --git a/forge-gui/res/cardsfolder/upcoming/imperious_oligarch.txt b/forge-gui/res/cardsfolder/upcoming/imperious_oligarch.txt new file mode 100644 index 00000000000..13e0bc6549e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/imperious_oligarch.txt @@ -0,0 +1,7 @@ +Name:Imperious Oligarch +ManaCost:W B +Types:Creature Human Cleric +PT:2/1 +K:Vigilance +K:Afterlife:1 +Oracle:Vigilance\nAfterlife 1 (When this creature dies, create a 1/1 white and black Spirit creature token with flying.) diff --git a/forge-gui/res/tokenscripts/wb_1_1_spirit_flying.txt b/forge-gui/res/tokenscripts/wb_1_1_spirit_flying.txt new file mode 100644 index 00000000000..9fe27496ea8 --- /dev/null +++ b/forge-gui/res/tokenscripts/wb_1_1_spirit_flying.txt @@ -0,0 +1,7 @@ +Name:Spirit +ManaCost:no cost +Types:Creature Spirit +Colors:white,black +PT:1/1 +K:Flying +Oracle:Flying