From 3c81f7bde10fa6e549bed0327ccb60c73620e99a Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 28 Oct 2021 15:06:29 -0400 Subject: [PATCH 1/5] basic cards --- .../res/cardsfolder/upcoming/apprentice_sharpshooter.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/gryff_rider.txt | 8 ++++++++ .../cardsfolder/upcoming/torens_fist_of_the_angels.txt | 9 +++++++++ 3 files changed, 25 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/apprentice_sharpshooter.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/gryff_rider.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/torens_fist_of_the_angels.txt diff --git a/forge-gui/res/cardsfolder/upcoming/apprentice_sharpshooter.txt b/forge-gui/res/cardsfolder/upcoming/apprentice_sharpshooter.txt new file mode 100644 index 00000000000..647b0249b42 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/apprentice_sharpshooter.txt @@ -0,0 +1,8 @@ +Name:Apprentice Sharpshooter +ManaCost:1 G +Types:Creature Human Archer +PT:1/4 +K:Reach +K:Training +DeckHas:Ability$Counters +Oracle:Reach\nTraining (Whenever this creature attacks with another creature with greater power, put a +1/+1 counter on this creature.) diff --git a/forge-gui/res/cardsfolder/upcoming/gryff_rider.txt b/forge-gui/res/cardsfolder/upcoming/gryff_rider.txt new file mode 100644 index 00000000000..4127701bffc --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/gryff_rider.txt @@ -0,0 +1,8 @@ +Name:Gryff Rider +ManaCost:2 W +Types:Creature Human Knight +PT:2/1 +K:Flying +K:Training +DeckHas:Ability$Counters +Oracle:Flying\nTraining (Whenever this creature attacks with another creature with greater power, put a +1/+1 counter on this creature.) diff --git a/forge-gui/res/cardsfolder/upcoming/torens_fist_of_the_angels.txt b/forge-gui/res/cardsfolder/upcoming/torens_fist_of_the_angels.txt new file mode 100644 index 00000000000..6f5a1cfd012 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/torens_fist_of_the_angels.txt @@ -0,0 +1,9 @@ +Name:Torens, Fist of the Angels +ManaCost:1 G W +Types:Legendary Creature Human Cleric +PT:2/2 +K:Training +T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a creature spell, create a 1/1 green and white Human Soldier creature token with training. +SVar:TrigToken:DB$ Token | TokenScript$ gw_1_1_human_soldier_training +DeckHas:Ability$Counters & Ability$Token +Oracle:Training (Whenever this creature attacks with another creature with greater power, put a +1/+1 counter on this creature.)\nWhenever you cast a creature spell, create a 1/1 green and white Human Soldier creature token with training. From 8dac9454c4aadd2cbe685ebfe5b94cb2842f8fd4 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 28 Oct 2021 15:07:21 -0400 Subject: [PATCH 2/5] token --- .../res/tokenscripts/gw_1_1_human_soldier_training.txt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 forge-gui/res/tokenscripts/gw_1_1_human_soldier_training.txt diff --git a/forge-gui/res/tokenscripts/gw_1_1_human_soldier_training.txt b/forge-gui/res/tokenscripts/gw_1_1_human_soldier_training.txt new file mode 100644 index 00000000000..dd45be9288e --- /dev/null +++ b/forge-gui/res/tokenscripts/gw_1_1_human_soldier_training.txt @@ -0,0 +1,7 @@ +Name:Human Soldier +ManaCost:no cost +Types:Creature Human Soldier +Colors:white,green +PT:1/1 +K:Training +Oracle:Training (Whenever this creature attacks with another creature with greater power, put a +1/+1 counter on this creature.) From 4c19a2b3f851d3043f9c03a3e802f4986cd72222 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 28 Oct 2021 15:09:23 -0400 Subject: [PATCH 3/5] Training keyword support --- .../src/main/java/forge/game/card/Card.java | 2 +- .../java/forge/game/card/CardFactoryUtil.java | 17 ++++++++++++++++- .../main/java/forge/game/keyword/Keyword.java | 1 + 3 files changed, 18 insertions(+), 2 deletions(-) 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 634ab28de32..0cf088b46a7 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -2124,7 +2124,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { || 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("Cascade") - || keyword.equals("Mentor")) { + || keyword.equals("Mentor") || keyword.equals("Training")) { if (sb.length() != 0) { sb.append("\r\n"); } 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 11166d7fad0..cd453919f9d 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -1842,7 +1842,7 @@ public class CardFactoryUtil { if (card.isPermanent()) { final String abPump = "DB$ Pump | Defined$ Remembered | KW$ Haste | PumpZone$ Stack " + "| ConditionDefined$ Remembered | ConditionPresent$ Creature | Duration$ UntilLoseControlOfHost"; - final AbilitySub saPump = (AbilitySub)AbilityFactory.getAbility(abPump, card); + final AbilitySub saPump = (AbilitySub) AbilityFactory.getAbility(abPump, card); String dbClean = "DB$ Cleanup | ClearRemembered$ True"; final AbilitySub saCleanup = (AbilitySub) AbilityFactory.getAbility(dbClean, card); @@ -1856,6 +1856,21 @@ public class CardFactoryUtil { inst.addTrigger(parsedUpkeepTrig); inst.addTrigger(parsedPlayTrigger); + } else if (keyword.equals("Training")) { + final String trigStr = "Mode$ Attacks | ValidCard$ Card.Self | Secondary$ True | " + + "IsPresent$ Creature.attacking+Other+powerGTX | TriggerDescription$ Training (" + + inst.getReminderText() + ")"; + + final String effect = "DB$ PutCounter | CounterType$ P1P1 | CounterNum$ 1 | Defined$ Self | Training$ True"; + final Trigger trigger = TriggerHandler.parseTrigger(trigStr, card, intrinsic); + + SpellAbility sa = AbilityFactory.getAbility(effect, card); + trigger.setSVar("X", "Count$CardPower"); + sa.setIntrinsic(intrinsic); + trigger.setOverridingAbility(sa); + + inst.addTrigger(trigger); + } else if (keyword.startsWith("Tribute")) { // use hardcoded ability name final String abStr = "TrigNotTribute"; 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 ca576fe253c..4881a60ac76 100644 --- a/forge-game/src/main/java/forge/game/keyword/Keyword.java +++ b/forge-game/src/main/java/forge/game/keyword/Keyword.java @@ -157,6 +157,7 @@ public enum Keyword { SURGE("Surge", KeywordWithCost.class, false, "You may cast this spell for its surge cost if you or a teammate has cast another spell this turn."), SUSPEND("Suspend", Suspend.class, false, "Rather than cast this card from your hand, you may pay %s and exile it with {%d:time counter} on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost."), TOTEM_ARMOR("Totem armor", SimpleKeyword.class, true, "If enchanted permanent would be destroyed, instead remove all damage marked on it and destroy this Aura."), + TRAINING("Training", SimpleKeyword.class, false, "Whenever this creature attacks with another creature with greater power, put a +1/+1 counter on this creature."), TRAMPLE("Trample", Trample.class, true, "This creature can deal excess combat damage to the player or planeswalker it's attacking."), TRANSFIGURE("Transfigure", KeywordWithCost.class, false, "%s, Sacrifice this creature: Search your library for a creature card with the same mana value as this creature and put that card onto the battlefield, then shuffle. Transfigure only as a sorcery."), TRANSMUTE("Transmute", KeywordWithCost.class, false, "%s, Discard this card: Search your library for a card with the same mana value as this card, reveal it, and put it into your hand, then shuffle. Transmute only as a sorcery."), From d2453eb96c070ad4e8c1245fa7dcb94cc0ce3efe Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 28 Oct 2021 15:13:44 -0400 Subject: [PATCH 4/5] savior_of_ollenbock.txt --- .../res/cardsfolder/upcoming/savior_of_ollenbock.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/savior_of_ollenbock.txt diff --git a/forge-gui/res/cardsfolder/upcoming/savior_of_ollenbock.txt b/forge-gui/res/cardsfolder/upcoming/savior_of_ollenbock.txt new file mode 100644 index 00000000000..729c1db000b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/savior_of_ollenbock.txt @@ -0,0 +1,11 @@ +Name:Savior of Ollenbock +ManaCost:1 W W +Types:Creature Human Soldier +PT:1/2 +K:Training +T:Mode$ Trains | ValidCard$ Card.Self | Execute$ TrigExile | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME trains, exile up to one other target creature from the battlefield or creature card from a graveyard. +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield,Graveyard | Destination$ Exile | ValidTgts$ Creature.Other | TgtPrompt$ Select up to one other target creature from the battlefield or creature card from a graveyard | TargetMin$ 0 | TargetMax$ 1 | TgtZone$ Battlefield,Graveyard +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME leaves the battlefield, put the exiled cards onto the battlefield under their owners' control. +SVar:TrigChange:DB$ ChangeZoneAll | ChangeType$ Card.ExiledWithSource | Origin$ Exile | Destination$ Battlefield +DeckHas:Ability$Counters +Oracle:Reach\nTraining (Whenever this creature attacks with another creature with greater power, put a +1/+1 counter on this creature.)\nWhenever Savior of Ollenbock trains, exile up to one other target creature from the battlefield or creature card from a graveyard.\nWhen Savior of Ollenbock leaves the battlefield, put the exiled cards onto the battlefield under their owners' control. From d38da4c149d6d648611de6669012ce2bd313fb84 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 28 Oct 2021 15:14:47 -0400 Subject: [PATCH 5/5] Trains Trigger --- .../ability/effects/CountersPutEffect.java | 3 + .../forge/game/trigger/TriggerTrains.java | 75 +++++++++++++++++++ .../java/forge/game/trigger/TriggerType.java | 1 + forge-gui/res/languages/de-DE.properties | 2 + forge-gui/res/languages/en-US.properties | 2 + forge-gui/res/languages/es-ES.properties | 2 + forge-gui/res/languages/it-IT.properties | 2 + forge-gui/res/languages/ja-JP.properties | 2 + forge-gui/res/languages/zh-CN.properties | 2 + 9 files changed, 91 insertions(+) create mode 100644 forge-game/src/main/java/forge/game/trigger/TriggerTrains.java diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java index 6a1521b21a0..a24d1145cf0 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java @@ -390,6 +390,9 @@ public class CountersPutEffect extends SpellAbilityEffect { if (sa.hasParam("Adapt")) { game.getTriggerHandler().runTrigger(TriggerType.Adapt, AbilityKey.mapFromCard(gameCard), false); } + if (sa.hasParam("Training")) { + game.getTriggerHandler().runTrigger(TriggerType.Trains, AbilityKey.mapFromCard(gameCard), false); + } } else { // adding counters to something like re-suspend cards // etbcounter should apply multiplier diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTrains.java b/forge-game/src/main/java/forge/game/trigger/TriggerTrains.java new file mode 100644 index 00000000000..eb349885e0d --- /dev/null +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTrains.java @@ -0,0 +1,75 @@ +/* + * Forge: Play Magic: the Gathering. + * Copyright (C) 2011 Forge Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package forge.game.trigger; + + +import forge.game.ability.AbilityKey; +import forge.game.card.Card; +import forge.game.spellability.SpellAbility; +import forge.util.Localizer; + +import java.util.Map; + +/** + *

+ * Trigger_Trains class. + *

+ * + * @author Forge + */ +public class TriggerTrains extends Trigger { + + /** + *

+ * Constructor for TriggerTrains. + *

+ * + * @param params + * a {@link java.util.HashMap} object. + * @param host + * a {@link forge.game.card.Card} object. + * @param intrinsic + * the intrinsic + */ + public TriggerTrains(final Map params, final Card host, final boolean intrinsic) { + super(params, host, intrinsic); + } + + /** {@inheritDoc} + * @param runParams*/ + @Override + public final boolean performTest(final Map runParams) { + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; + } + return true; + } + + /** {@inheritDoc} */ + @Override + public final void setTriggeringObjects(final SpellAbility sa, Map runParams) { + sa.setTriggeringObjectsFrom(runParams, AbilityKey.Card); + } + + @Override + public String getImportantStackObjects(SpellAbility sa) { + StringBuilder sb = new StringBuilder(); + sb.append(Localizer.getInstance().getMessage("lblTrains")).append(": ").append(sa.getTriggeringObject(AbilityKey.Card)); + return sb.toString(); + } +} diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerType.java b/forge-game/src/main/java/forge/game/trigger/TriggerType.java index 387b06abd38..5bf2ceac1b9 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerType.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerType.java @@ -107,6 +107,7 @@ public enum TriggerType { Taps(TriggerTaps.class), TapsForMana(TriggerTapsForMana.class), TokenCreated(TriggerTokenCreated.class), + Trains(TriggerTrains.class), Transformed(TriggerTransformed.class), TurnBegin(TriggerTurnBegin.class), TurnFaceUp(TriggerTurnFaceUp.class), diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index db2f2362579..54a1f8b80ce 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -1589,6 +1589,8 @@ lblTapped=Getappt #TriggerTapsForMana.java lblTappedForMana=für Mana getappt lblProduced=Erzeugte +#TriggerTrains.java +lblTrains=Trains #TriggerTransformed.java lblTransformed=Transformiert #TriggerTurnFaceUp.java diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index ba8270b6ab9..c22b8e08639 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -1589,6 +1589,8 @@ lblTapped=Tapped #TriggerTapsForMana.java lblTappedForMana=Tapped for Mana lblProduced=Produced +#TriggerTrains.java +lblTrains=Trains #TriggerTransformed.java lblTransformed=Transformed #TriggerTurnFaceUp.java diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index 1eb3b0f9f7d..8ea46c95fe9 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -1589,6 +1589,8 @@ lblTapped=Girado #TriggerTapsForMana.java lblTappedForMana=Girado para maná lblProduced=Producido +#TriggerTrains.java +lblTrains=Trains #TriggerTransformed.java lblTransformed=Transformado #TriggerTurnFaceUp.java diff --git a/forge-gui/res/languages/it-IT.properties b/forge-gui/res/languages/it-IT.properties index ab666128316..c089272c174 100644 --- a/forge-gui/res/languages/it-IT.properties +++ b/forge-gui/res/languages/it-IT.properties @@ -1587,6 +1587,8 @@ lblTapped=Tappato #TriggerTapsForMana.java lblTappedForMana=Tappato per produrre mana lblProduced=Prodotto +#TriggerTrains.java +lblTrains=Trains #TriggerTransformed.java lblTransformed=Trasformato #TriggerTurnFaceUp.java diff --git a/forge-gui/res/languages/ja-JP.properties b/forge-gui/res/languages/ja-JP.properties index 59a16d26854..ec920c6c054 100644 --- a/forge-gui/res/languages/ja-JP.properties +++ b/forge-gui/res/languages/ja-JP.properties @@ -1588,6 +1588,8 @@ lblTapped=タップした #TriggerTapsForMana.java lblTappedForMana=マナのためにタップした lblProduced=生産した +#TriggerTrains.java +lblTrains=Trains #TriggerTransformed.java lblTransformed=変身した #TriggerTurnFaceUp.java diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index 16fbd53f5d9..ea07de51239 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -1590,6 +1590,8 @@ lblTapped=已横置 #TriggerTapsForMana.java lblTappedForMana=为法术力横置 lblProduced=产生 +#TriggerTrains.java +lblTrains=Trains #TriggerTransformed.java lblTransformed=已转化 #TriggerTurnFaceUp.java