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 409961a7a31..8a618ee8e4f 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -1415,7 +1415,7 @@ public class Card extends GameEntity implements Comparable { } else if (keyword.startsWith("Provoke") || keyword.startsWith("Devour") || keyword.equals("Unleash") || keyword.startsWith("Soulbond")) { sbLong.append(keyword + " (" + Keyword.getInstance(keyword).getReminderText() + ")"); - } else if (keyword.startsWith("Soulshift")) { + } else if (keyword.startsWith("Fabricate") || keyword.startsWith("Soulshift")) { final String[] k = keyword.split(":"); sbLong.append(k[0] + " " + k[1] + " (" + Keyword.getInstance(keyword).getReminderText() + ")"); } else if (keyword.contains("Haunt")) { 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 ca3e0aec872..b82cc3e40e3 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -2525,6 +2525,9 @@ public class CardFactoryUtil { else if (keyword.startsWith("Escalate")) { addStaticAbility(keyword, card, null); } + else if (keyword.startsWith("Fabricate")) { + addTriggerAbility(keyword, card, null); + } else if (keyword.startsWith("Rampage")) { addTriggerAbility(keyword, card, null); } @@ -3019,6 +3022,34 @@ public class CardFactoryUtil { card.setSVar("ExtortOpps", abString); card.setSVar("ExtortGainLife", dbString); card.setSVar("AFLifeLost", "Number$0"); + if (!intrinsic) { + kws.addTrigger(cardTrigger); + } + } else if (keyword.startsWith("Fabricate")) { + final String[] k = keyword.split(":"); + final String n = k[1]; + + final String name = StringUtils.join(k); + + final String trigStr = "Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield " + + " | Execute$ " + name + "Choose | ValidCard$ Card.Self | Secondary$ True" + + " | TriggerDescription$ Fabricate " + n + " (" + Keyword.getInstance(keyword).getReminderText() + ")"; + + final String choose = "DB$ GenericChoice | Choices$ DB" + name + "Counter,DB" + name + "Token | ConditionPresent$ Card.StrictlySelf | SubAbility$ DB" + name + "Token2 | AILogic$ " + name; + final String counter = "DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ " + n + " | SpellDescription$ put " + + Lang.nounWithNumeral(n, "+1/+1 counter") + " on it"; + final String token = "DB$ Token | TokenAmount$ " + n + " | TokenName$ Servo | TokenTypes$ Artifact,Creature,Servo " + + " | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | TokenImage$ c 1 1 servo KLD | SpellDescription$ Create " + + Lang.nounWithNumeral(n, "1/1 colorless Servo artifact creature token") + "."; + + final Trigger trigger = TriggerHandler.parseTrigger(trigStr, card, intrinsic); + final Trigger cardTrigger = card.addTrigger(trigger); + + card.setSVar(name + "Choose", choose); + card.setSVar("DB" + name + "Counter", counter); + card.setSVar("DB" + name + "Token", token); + card.setSVar("DB" + name + "Token2", token + " | ConditionPresent$ Card.StrictlySelf | ConditionCompare$ EQ0"); + if (!intrinsic) { kws.addTrigger(cardTrigger); } 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 0635a26d710..d086630c770 100644 --- a/forge-game/src/main/java/forge/game/keyword/Keyword.java +++ b/forge-game/src/main/java/forge/game/keyword/Keyword.java @@ -49,6 +49,7 @@ public enum Keyword { EXALTED(SimpleKeyword.class, false, "Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn."), EXTORT(SimpleKeyword.class, false, "Whenever you cast a spell, you may pay {W/B}. If you do, each opponent loses 1 life and you gain that much life."), EXPLOIT(SimpleKeyword.class, false, "When this creature enters the battlefield, you may sacrifice a creature."), + FABRICATE(KeywordWithAmount.class, false, "When this creature enters the battlefield, put {%1$d:+1/+1 counter} on it, or create {%1$d:1/1 colorless Servo artifact creature token}."), FADING(KeywordWithAmount.class, false, "This permanent enters the battlefield with %d fade counters on it. At the beginning of your upkeep, remove a fade counter from it. If you can't, sacrifice it."), FATESEAL(KeywordWithAmount.class, false, "Look at the top %d cards of an opponent's library, then put any number of them on the bottom of that player's library and the rest on top in any order."), FEAR(SimpleKeyword.class, true, "This creature can't be blocked except by artifact creatures and/or black creatures."), diff --git a/forge-game/src/main/java/forge/game/keyword/KeywordInstance.java b/forge-game/src/main/java/forge/game/keyword/KeywordInstance.java index 2fd4c6a26bb..247f8ca8c64 100644 --- a/forge-game/src/main/java/forge/game/keyword/KeywordInstance.java +++ b/forge-game/src/main/java/forge/game/keyword/KeywordInstance.java @@ -13,7 +13,7 @@ public abstract class KeywordInstance> { } public String getReminderText() { String result = formatReminderText(keyword.reminderText); - Matcher m = Pattern.compile("\\{(\\w):(.+)\\}").matcher(result); + Matcher m = Pattern.compile("\\{(\\w):(.+?)\\}").matcher(result); StringBuffer sb = new StringBuffer(); while (m.find()) {