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 ec71702ff23..4af756d23d3 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -1432,10 +1432,11 @@ public class Card extends GameEntity implements Comparable { sbLong.append(keyword).append("\r\n"); } else if (keyword.startsWith("Sunburst") && hasStartOfKeyword("Modular")) { } else if (keyword.startsWith("Modular") || keyword.startsWith("Bloodthirst") - || keyword.startsWith("Strive") || keyword.startsWith("Escalate") - || keyword.startsWith("Cycling") || keyword.startsWith("TypeCycling") + || keyword.startsWith("Strive") || keyword.startsWith("Escalate") + || keyword.startsWith("Cycling") || keyword.startsWith("TypeCycling") || keyword.startsWith("ETBReplacement") || keyword.startsWith("MayEffectFromOpeningHand") - || keyword.equals("Undaunted") || keyword.startsWith("Monstrosity")) { + || keyword.equals("Undaunted") || keyword.startsWith("Monstrosity") + || keyword.startsWith("Graft")) { } else if (keyword.startsWith("Provoke") || keyword.startsWith("Devour") || keyword.equals("Unleash") || keyword.startsWith("Soulbond") || keyword.equals("Partner") || keyword.equals("Retrace") || keyword.equals("Living Weapon") || keyword.equals("Myriad")) { 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 f65213c86fe..4100b1091a2 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -2055,6 +2055,10 @@ public class CardFactoryUtil { else if (keyword.startsWith("Surge")) { addSpellAbility(keyword, card, null); } + else if (keyword.startsWith("Graft")) { + addReplacementEffect(keyword, card, null); + addTriggerAbility(keyword, card, null); + } else if (keyword.equals("Melee")) { addTriggerAbility(keyword, card, null); } @@ -2798,6 +2802,26 @@ public class CardFactoryUtil { final Trigger cardTrigger = card.addTrigger(flankingTrigger); card.setSVar("FlankingPump", abStringFlanking); + if (!intrinsic) { + kws.addTrigger(cardTrigger); + } + } else if (keyword.startsWith("Graft")) { + final String abStr = "DB$ MoveCounter | Source$ Self | " + + "Defined$ TriggeredCardLKICopy | CounterType$ P1P1 | CounterNum$ 1"; + + String trigStr = "Mode$ ChangesZone | ValidCard$ Creature.Other" + + "| Origin$ Any | Destination$ Battlefield " + + "| TriggerZones$ Battlefield | OptionalDecider$ You " + + "| IsPresent$ Card.Self+counters_GE1_P1P1" + + "| Secondary$ True | TriggerDescription$ " + + "Whenever another creature enters the battlefield, you " + + "may move a +1/+1 counter from this creature onto it."; + final Trigger trigger = TriggerHandler.parseTrigger(trigStr, card, intrinsic); + + trigger.setOverridingAbility(AbilityFactory.getAbility(abStr, card)); + + final Trigger cardTrigger = card.addTrigger(trigger); + if (!intrinsic) { kws.addTrigger(cardTrigger); } @@ -3187,6 +3211,21 @@ public class CardFactoryUtil { if (!intrinsic) { kws.addReplacement(cardre); } + } else if (keyword.startsWith("Graft")) { + final String[] k = keyword.split(":"); + final String m = k[1]; + + StringBuilder sb = new StringBuilder("etbCounter:P1P1:"); + sb.append(m).append(":no Condition:"); + sb.append("Graft "); + sb.append(m); + sb.append(" (").append(Keyword.getInstance(keyword).getReminderText()).append(")"); + + if (intrinsic) { + card.addIntrinsicKeyword(sb.toString()); + } else { + kws.addReplacement(makeEtbCounter(sb.toString(), card, intrinsic)); + } } else if (keyword.startsWith("Madness")) { // Set Madness Replacement effects String repeffstr = "Event$ Discard | ActiveZones$ Hand | ValidCard$ Card.Self | " + @@ -4020,27 +4059,6 @@ public class CardFactoryUtil { * WARNING: must keep this keyword processing before etbCounter keyword * processing. */ - final int graft = hasKeyword(card, "Graft"); - if (graft != -1) { - final String parse = card.getKeywords().get(graft).toString(); - - final int m = Integer.parseInt(parse.substring(6)); - final String abStr = "AB$ MoveCounter | Cost$ 0 | Source$ Self | " - + "Defined$ TriggeredCardLKICopy | CounterType$ P1P1 | CounterNum$ 1"; - card.setSVar("GraftTrig", abStr); - - String trigStr = "Mode$ ChangesZone | ValidCard$ Creature.Other | " - + "Origin$ Any | Destination$ Battlefield" - + " | TriggerZones$ Battlefield | OptionalDecider$ You | " - + "IsPresent$ Card.Self+counters_GE1_P1P1 | " - + "Execute$ GraftTrig | TriggerDescription$ " - + "Whenever another creature enters the battlefield, you " - + "may move a +1/+1 counter from this creature onto it."; - final Trigger myTrigger = TriggerHandler.parseTrigger(trigStr, card, true); - card.addTrigger(myTrigger); - - card.addIntrinsicKeyword("etbCounter:P1P1:" + m); - } final int bloodthirst = hasKeyword(card, "Bloodthirst"); if (bloodthirst != -1) {