From ef40d206194c5fc8436cdc8b431a9bc5fc1ea7e3 Mon Sep 17 00:00:00 2001 From: MarcinSc Date: Mon, 27 May 2024 14:25:14 +0700 Subject: [PATCH] Migrated Site cards in set 18 to hjson --- .../src/main/java/CreateCardStubs.java | 223 ------------------ .../lotro/cards/set18/site/Card18_134.java | 41 ---- .../lotro/cards/set18/site/Card18_135.java | 30 --- .../lotro/cards/set18/site/Card18_136.java | 38 --- .../lotro/cards/set18/site/Card18_137.java | 44 ---- .../lotro/cards/set18/site/Card18_138.java | 17 -- .../lotro/cards/set18/site/Card18_139.java | 34 --- .../lotro/cards/set18/site/Card18_140.java | 30 --- .../official/set18}/set18-Sites.hjson | 101 +++++++- .../effect/appender/ReinforceTokens.java | 5 +- .../modifier/ModifierSourceFactory.java | 1 + 11 files changed, 103 insertions(+), 461 deletions(-) delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/CreateCardStubs.java delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/site/Card18_134.java delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/site/Card18_135.java delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/site/Card18_136.java delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/site/Card18_137.java delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/site/Card18_138.java delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/site/Card18_139.java delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/site/Card18_140.java rename gemp-lotr/gemp-lotr-cards/src/main/resources/{card-stubs => cards/official/set18}/set18-Sites.hjson (64%) diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/CreateCardStubs.java b/gemp-lotr/gemp-lotr-cards/src/main/java/CreateCardStubs.java deleted file mode 100644 index 2ee5ee5cb..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/CreateCardStubs.java +++ /dev/null @@ -1,223 +0,0 @@ -import com.gempukku.lotro.common.CardType; -import com.gempukku.lotro.common.Keyword; -import com.gempukku.lotro.common.PossessionClass; -import com.gempukku.lotro.game.CardNotFoundException; -import com.gempukku.lotro.game.LotroCardBlueprint; -import com.gempukku.lotro.game.LotroCardBlueprintLibrary; -import com.gempukku.lotro.game.packs.SetDefinition; -import org.hjson.JsonArray; -import org.hjson.JsonObject; -import org.hjson.Stringify; - -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.lang.reflect.InvocationTargetException; -import java.util.*; - -public class CreateCardStubs { - private static final String[] _packageNames = - new String[]{ - "", ".dwarven", ".dunland", ".elven", ".fallenRealms", ".gandalf", ".gollum", ".gondor", ".isengard", ".men", ".orc", - ".raider", ".rohan", ".moria", ".wraith", ".sauron", ".shire", ".site", ".uruk_hai", - - //Additional Hobbit Draft packages - ".esgaroth", ".gundabad", ".smaug", ".spider", ".troll" - }; - - public static void main(String[] args) { - final String property = System.getProperty("user.dir"); - String projectRoot = new File(property).getAbsolutePath(); - - File path = new File(projectRoot); - - int[] sets = {3};//, 4, 5, 6, 7, 8, 10, 11, 12, 13, 15, 17, 18, 31}; - for (int set : sets) { - produceForSet(path, set); - } - } - - private static void produceForSet(File projectRoot, int set) { - File setPath = new File(projectRoot, "/gemp-lotr-cards/src/main/resources/cards-stub/set" + set); - - File cardsPath = new File(projectRoot, "/gemp-lotr-cards/src/main/resources/cards"); - File cardsMapping = new File(projectRoot, "/gemp-lotr-cards/src/main/resources/blueprintMapping.txt"); - File setConfig = new File(projectRoot, "/gemp-lotr-cards/src/main/resources/setConfig.hjson"); - File rarities = new File(projectRoot, "/gemp-lotr-cards/src/main/resources/rarities"); - - LotroCardBlueprintLibrary library = new LotroCardBlueprintLibrary(cardsPath, cardsMapping, setConfig, rarities); - Map> cardsByFileName = new HashMap<>(); - - SetDefinition setDefinition = library.getSetDefinitions().get("" + set); - if (setDefinition.NeedsLoading()) { - final Set allCards = setDefinition.getAllCards(); - for (String blueprintId : allCards) { - blueprintId = stripBlueprintModifiers(blueprintId); - try { - // Ensure it's loaded - LotroCardBlueprint cardBlueprint = getBlueprint(blueprintId); - String key = getKey(cardBlueprint); - Map list = cardsByFileName.computeIfAbsent(key, k -> new LinkedHashMap<>()); - list.put(blueprintId, cardBlueprint); - } catch (CardNotFoundException exp) { - // Ignore card that is not defined - } - } - } - - for (Map.Entry> cardsOfType : cardsByFileName.entrySet()) { - String type = cardsOfType.getKey(); - File typePath = new File(setPath, "set" + set + "-" + type + ".hjson"); - if (!typePath.exists()) { - Map cardJsons = new TreeMap<>(); - - Map cards = cardsOfType.getValue(); - for (Map.Entry cardEntry : cards.entrySet()) { - String blueprintId = cardEntry.getKey(); - LotroCardBlueprint card = cardEntry.getValue(); - - JsonObject cardJson = new JsonObject(); - cardJson.add("title", card.getTitle()); - if (card.getSubtitle() != null) - cardJson.add("subtitle", card.getSubtitle()); - if (card.isUnique()) - cardJson.add("unique", true); - if (card.getSide() != null) - cardJson.add("side", card.getSide().name().toLowerCase()); - if (card.getCulture() != null) - cardJson.add("culture", card.getCulture().getHumanReadable()); - cardJson.add("twilight", card.getTwilightCost()); - cardJson.add("type", card.getCardType().name().toLowerCase()); - if (card.getRace() != null) - cardJson.add("race", card.getRace().getHumanReadable()); - if (card.getPossessionClasses() != null) { - JsonArray array = new JsonArray(); - for (PossessionClass possessionClass : card.getPossessionClasses()) { - array.add(possessionClass.getHumanReadable()); - } - - if (array.size() == 1) - cardJson.add("itemclass", array.get(0).asString()); - else - cardJson.add("itemclass", array); - } - if (card.getSignet() != null) - cardJson.add("signet", card.getSignet().name().toLowerCase()); - if (card.getStrength() != 0) - cardJson.add("strength", card.getStrength()); - if (card.getVitality() != 0) - cardJson.add("vitality", card.getVitality()); - if (card.getResistance() != 0) - cardJson.add("resistance", card.getResistance()); - if (card.getCardType() == CardType.ALLY) { - if (card.getAllyHomeSiteBlock() != null) { - String home = card.getAllyHomeSiteBlock().getHumanReadable(); - for (int allyHomeSiteNumber : card.getAllyHomeSiteNumbers()) { - home += "," + allyHomeSiteNumber; - } - - cardJson.add("allyHome", home); - } - } - if (card.getCardType() == CardType.SITE) - cardJson.add("block", card.getSiteBlock().getHumanReadable()); - if (card.getSiteNumber() != 0) - cardJson.add("site", card.getSiteNumber()); - if (card.getCardType() == CardType.SITE) - cardJson.add("direction", card.getSiteDirection().name().toLowerCase()); - - // Keywords handling - JsonArray keywords = new JsonArray(); - for (Keyword keyword : Keyword.values()) { - if (card.hasKeyword(keyword)) { - int count = card.getKeywordCount(keyword); - if (count > 1) - keywords.add(keyword.getHumanReadable() + "+" + count); - else - keywords.add(keyword.getHumanReadable()); - } - } - - if (keywords.size() == 1) - cardJson.add("keyword", keywords.get(0).asString()); - if (keywords.size() > 1) - cardJson.add("keyword", keywords); - - cardJsons.put(blueprintId, cardJson); - } - - typePath.getParentFile().mkdirs(); - //Write JSON file - try (FileWriter file = new FileWriter(typePath)) { - file.write("{\n"); - for (Map.Entry cardJson : cardJsons.entrySet()) { - file.write(cardJson.getKey() + ": "); - file.write(cardJson.getValue().toString(Stringify.HJSON)); - file.write("\n"); - } - file.write("}\n"); - file.flush(); - - } catch (IOException e) { - e.printStackTrace(); - } - } - } - } - - private static String getKey(LotroCardBlueprint cardBlueprint) { - if (cardBlueprint.getCulture() != null) - return cardBlueprint.getCulture().getHumanReadable().toLowerCase(); - if (cardBlueprint.getCardType() == CardType.SITE) - return "site"; - return "ring"; - } - - public static String stripBlueprintModifiers(String blueprintId) { - if (blueprintId.endsWith("*")) - blueprintId = blueprintId.substring(0, blueprintId.length() - 1); - if (blueprintId.endsWith("T")) - blueprintId = blueprintId.substring(0, blueprintId.length() - 1); - return blueprintId; - } - - private static LotroCardBlueprint getBlueprint(String blueprintId) throws CardNotFoundException { - String[] blueprintParts = blueprintId.split("_"); - - String setNumber = blueprintParts[0]; - String cardNumber = blueprintParts[1]; - - for (String packageName : _packageNames) { - LotroCardBlueprint blueprint = null; - try { - blueprint = tryLoadingFromPackage(packageName, setNumber, cardNumber); - } catch (IllegalAccessException | InstantiationException | NoSuchMethodException e) { - throw new CardNotFoundException(blueprintId); - } - if (blueprint != null) - return blueprint; - } - - throw new CardNotFoundException(blueprintId); - } - - private static LotroCardBlueprint tryLoadingFromPackage(String packageName, String setNumber, String cardNumber) throws IllegalAccessException, InstantiationException, NoSuchMethodException { - try { - Class clazz = Class.forName("com.gempukku.lotro.cards.set" + setNumber + packageName + ".Card" + setNumber + "_" + normalizeId(cardNumber)); - return (LotroCardBlueprint) clazz.getDeclaredConstructor().newInstance(); - } catch (ClassNotFoundException | InvocationTargetException e) { - // Ignore - return null; - } - } - - private static String normalizeId(String blueprintPart) { - int id = Integer.parseInt(blueprintPart); - if (id < 10) - return "00" + id; - else if (id < 100) - return "0" + id; - else - return String.valueOf(id); - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/site/Card18_134.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/site/Card18_134.java deleted file mode 100644 index ec6c20f62..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/site/Card18_134.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.gempukku.lotro.cards.set18.site; - -import com.gempukku.lotro.logic.cardtype.AbstractShadowsSite; -import com.gempukku.lotro.logic.timing.TriggerConditions; -import com.gempukku.lotro.common.Keyword; -import com.gempukku.lotro.filters.Filters; -import com.gempukku.lotro.game.PhysicalCard; -import com.gempukku.lotro.game.state.LotroGame; -import com.gempukku.lotro.logic.GameUtils; -import com.gempukku.lotro.logic.actions.RequiredTriggerAction; -import com.gempukku.lotro.logic.effects.ChooseAndWoundCharactersEffect; -import com.gempukku.lotro.logic.timing.EffectResult; - -import java.util.Collections; -import java.util.List; - -/** - * Set: Treachery & Deceit - * Twilight Cost: 1 - * Type: Site - * Game Text: Mountain. When the fellowship moves to this site, each player wounds two of his characters. - */ -public class Card18_134 extends AbstractShadowsSite { - public Card18_134() { - super("Doorway to Doom", 1, Direction.RIGHT); - addKeyword(Keyword.MOUNTAIN); - } - - @Override - public List getRequiredAfterTriggers(LotroGame game, EffectResult effectResult, PhysicalCard self) { - if (TriggerConditions.movesTo(game, effectResult, self)) { - RequiredTriggerAction action = new RequiredTriggerAction(self); - for (String playerId : GameUtils.getAllPlayers(game)) { - action.appendEffect( - new ChooseAndWoundCharactersEffect(action, playerId, 2, 2, Filters.owner(playerId), Filters.character)); - } - return Collections.singletonList(action); - } - return null; - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/site/Card18_135.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/site/Card18_135.java deleted file mode 100644 index d9c49174f..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/site/Card18_135.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.gempukku.lotro.cards.set18.site; - -import com.gempukku.lotro.common.Keyword; -import com.gempukku.lotro.game.PhysicalCard; -import com.gempukku.lotro.game.state.LotroGame; -import com.gempukku.lotro.logic.cardtype.AbstractShadowsSite; -import com.gempukku.lotro.logic.modifiers.Modifier; -import com.gempukku.lotro.logic.modifiers.ModifierFlag; -import com.gempukku.lotro.logic.modifiers.SpecialFlagModifier; - -import java.util.Collections; -import java.util.List; - -/** - * Set: Treachery & Deceit - * Twilight Cost: 2 - * Type: Site - * Game Text: Mountain. Each card that is about to be placed into the discard pile is removed from the game instead. - */ -public class Card18_135 extends AbstractShadowsSite { - public Card18_135() { - super("Foot of Mount Doom", 2, Direction.LEFT); - addKeyword(Keyword.MOUNTAIN); - } - - @Override - public List getInPlayModifiers(LotroGame game, PhysicalCard self) { -return Collections.singletonList(new SpecialFlagModifier(self, ModifierFlag.REMOVE_CARDS_GOING_TO_DISCARD)); -} -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/site/Card18_136.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/site/Card18_136.java deleted file mode 100644 index 328cb56c4..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/site/Card18_136.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.gempukku.lotro.cards.set18.site; - -import com.gempukku.lotro.logic.cardtype.AbstractShadowsSite; -import com.gempukku.lotro.logic.timing.TriggerConditions; -import com.gempukku.lotro.common.Keyword; -import com.gempukku.lotro.filters.Filters; -import com.gempukku.lotro.game.PhysicalCard; -import com.gempukku.lotro.game.state.LotroGame; -import com.gempukku.lotro.logic.actions.RequiredTriggerAction; -import com.gempukku.lotro.logic.effects.HealCharactersEffect; -import com.gempukku.lotro.logic.timing.EffectResult; - -import java.util.Collections; -import java.util.List; - -/** - * Set: Treachery & Deceit - * Twilight Cost: 2 - * Type: Site - * Game Text: River. When the fellowship moves to this site, each player heals each of his or her characters. - */ -public class Card18_136 extends AbstractShadowsSite { - public Card18_136() { - super("Mithlond", 2, Direction.LEFT); - addKeyword(Keyword.RIVER); - } - - @Override - public List getRequiredAfterTriggers(LotroGame game, EffectResult effectResult, PhysicalCard self) { - if (TriggerConditions.movesTo(game, effectResult, self)) { - RequiredTriggerAction action = new RequiredTriggerAction(self); - action.appendEffect( - new HealCharactersEffect(self, null, Filters.character)); - return Collections.singletonList(action); - } - return null; - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/site/Card18_137.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/site/Card18_137.java deleted file mode 100644 index 5fc882eee..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/site/Card18_137.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.gempukku.lotro.cards.set18.site; - -import com.gempukku.lotro.logic.cardtype.AbstractShadowsSite; -import com.gempukku.lotro.logic.timing.TriggerConditions; -import com.gempukku.lotro.logic.effects.OptionalEffect; -import com.gempukku.lotro.logic.effects.ReinforceTokenEffect; -import com.gempukku.lotro.common.Keyword; -import com.gempukku.lotro.game.PhysicalCard; -import com.gempukku.lotro.game.state.LotroGame; -import com.gempukku.lotro.logic.GameUtils; -import com.gempukku.lotro.logic.actions.RequiredTriggerAction; -import com.gempukku.lotro.logic.timing.EffectResult; - -import java.util.Collections; -import java.util.List; - -/** - * Set: Treachery & Deceit - * Twilight Cost: 1 - * Type: Site - * Game Text: Battleground. Plains. When the fellowship moves to this site, each player may reinforce a culture token. - */ -public class Card18_137 extends AbstractShadowsSite { - public Card18_137() { - super("Morannon Plains", 1, Direction.RIGHT); - addKeyword(Keyword.BATTLEGROUND); - addKeyword(Keyword.PLAINS); - } - - @Override - public List getRequiredAfterTriggers(LotroGame game, EffectResult effectResult, PhysicalCard self) { - if (TriggerConditions.movesTo(game, effectResult, self)) { - RequiredTriggerAction action = new RequiredTriggerAction(self); - for (String playerId : GameUtils.getAllPlayers(game)) { - action.appendEffect( - new OptionalEffect( - action, playerId, - new ReinforceTokenEffect(self, playerId, null))); - } - return Collections.singletonList(action); - } - return null; - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/site/Card18_138.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/site/Card18_138.java deleted file mode 100644 index 6dc7c9dc0..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/site/Card18_138.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.gempukku.lotro.cards.set18.site; - -import com.gempukku.lotro.logic.cardtype.AbstractShadowsSite; -import com.gempukku.lotro.common.Keyword; - -/** - * Set: Treachery & Deceit - * Twilight Cost: 4 - * Type: Site - * Game Text: River. - */ -public class Card18_138 extends AbstractShadowsSite { - public Card18_138() { - super("Sirannon Ruins", 4, Direction.RIGHT); - addKeyword(Keyword.RIVER); - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/site/Card18_139.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/site/Card18_139.java deleted file mode 100644 index 6f4de72ee..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/site/Card18_139.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.gempukku.lotro.cards.set18.site; - -import com.gempukku.lotro.filters.Filters; -import com.gempukku.lotro.game.PhysicalCard; -import com.gempukku.lotro.game.state.LotroGame; -import com.gempukku.lotro.logic.cardtype.AbstractShadowsSite; -import com.gempukku.lotro.logic.modifiers.*; - -import java.util.LinkedList; -import java.util.List; - -/** - * Set: Treachery & Deceit - * Twilight Cost: 1 - * Type: Site - * Game Text: Wounds cannot be prevented or healed. Burdens cannot be removed. - */ -public class Card18_139 extends AbstractShadowsSite { - public Card18_139() { - super("Steward's Tomb", 1, Direction.RIGHT); - } - - @Override - public List getInPlayModifiers(LotroGame game, PhysicalCard self) { - List modifiers = new LinkedList<>(); - modifiers.add( - new SpecialFlagModifier(self, ModifierFlag.CANT_PREVENT_WOUNDS)); - modifiers.add( - new CantHealModifier(self, Filters.any)); - modifiers.add( - new CantRemoveBurdensModifier(self, null, Filters.any)); - return modifiers; - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/site/Card18_140.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/site/Card18_140.java deleted file mode 100644 index 630074739..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/site/Card18_140.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.gempukku.lotro.cards.set18.site; - -import com.gempukku.lotro.common.CardType; -import com.gempukku.lotro.common.Keyword; -import com.gempukku.lotro.game.PhysicalCard; -import com.gempukku.lotro.game.state.LotroGame; -import com.gempukku.lotro.logic.cardtype.AbstractShadowsSite; -import com.gempukku.lotro.logic.modifiers.CantBeTransferredModifier; -import com.gempukku.lotro.logic.modifiers.Modifier; - -import java.util.Collections; -import java.util.List; - -/** - * Set: Treachery & Deceit - * Twilight Cost: 0 - * Type: Site - * Game Text: Dwelling. While the fellowship is at this site, followers cannot be transfered to a character. - */ -public class Card18_140 extends AbstractShadowsSite { - public Card18_140() { - super("Streets of Bree", 0, Direction.LEFT); - addKeyword(Keyword.DWELLING); - } - - @Override - public List getInPlayModifiers(LotroGame game, PhysicalCard self) { -return Collections.singletonList(new CantBeTransferredModifier(self, CardType.FOLLOWER)); -} -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/card-stubs/set18-Sites.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set18/set18-Sites.hjson similarity index 64% rename from gemp-lotr/gemp-lotr-cards/src/main/resources/card-stubs/set18-Sites.hjson rename to gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set18/set18-Sites.hjson index a60893917..dba439021 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/card-stubs/set18-Sites.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set18/set18-Sites.hjson @@ -23,6 +23,27 @@ direction: Right keywords: Mountain effects: [ + { + type: trigger + trigger: { + type: movesTo + filter: self + } + effect: [ + { + type: wound + player: free people + filter: choose(side(free people),character) + count: 2 + } + { + type: wound + player: shadow + filter: choose(side(shadow),character) + count: 2 + } + ] + } ] gametext: Mountain. When the fellowship moves to this site, each player wounds two of his or her characters. lore: "" @@ -58,6 +79,12 @@ direction: Left keywords: Mountain effects: [ + { + type: modifier + modifier: { + type: removeCardsGoingToDiscard + } + } ] gametext: Mountain. Each card that is about to be placed into the discard pile is removed from the game instead. lore: "" @@ -93,6 +120,25 @@ direction: Left keywords: River effects: [ + { + type: trigger + trigger: { + type: movesTo + filter: self + } + effect: [ + { + type: heal + player: free people + filter: all(side(free people),character) + } + { + type: heal + player: shadow + filter: all(side(shadow),character) + } + ] + } ] gametext: River. When the fellowship moves to this site, each player heals each of his or her characters. lore: "" @@ -131,6 +177,33 @@ Plains ] effects: [ + { + type: trigger + trigger: { + type: movesTo + filter: self + } + effect: [ + { + type: optional + text: Would you like to reinforce a culture token + player: free people + effect: { + type: reinforceTokens + player: free people + } + } + { + type: optional + text: Would you like to reinforce a culture token + player: shadow + effect: { + type: reinforceTokens + player: shadow + } + } + ] + } ] gametext: Battleground. Plains. When the fellowship moves to this site, each player may reinforce a culture token. lore: "" @@ -165,8 +238,6 @@ block: Shadows direction: Right keywords: River - effects: [ - ] gametext: River. lore: "" promotext: "" @@ -200,6 +271,25 @@ block: Shadows direction: Right effects: [ + { + type: modifier + modifier: { + type: cantPreventWounds + } + } + { + type: modifier + modifier: { + type: cantHeal + filter: any + } + } + { + type: modifier + modifier: { + type: cantRemoveBurdens + } + } ] gametext: Wounds cannot be prevented or healed. Burdens cannot be removed. lore: "" @@ -235,6 +325,13 @@ direction: Left keywords: Dwelling effects: [ + { + type: modifier + modifier: { + type: cantBeTransferred + filter: follower + } + } ] gametext: Dwelling. While the fellowship is at this site, followers cannot be transferred to a character. lore: "" diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ReinforceTokens.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ReinforceTokens.java index 5f861d3f8..34163ad17 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ReinforceTokens.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ReinforceTokens.java @@ -29,13 +29,14 @@ import java.util.Map; public class ReinforceTokens implements EffectAppenderProducer { @Override public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { - FieldUtils.validateAllowedFields(effectObject, "culture", "filter", "memorize", "times"); + FieldUtils.validateAllowedFields(effectObject, "culture", "filter", "memorize", "times", "player"); final Culture culture = FieldUtils.getEnum(Culture.class, effectObject.get("culture"), "culture"); final Token token = Token.findTokenForCulture(culture); final String filter = FieldUtils.getString(effectObject.get("filter"), "filter", "self"); final String memory = FieldUtils.getString(effectObject.get("memorize"), "memorize", "_temp"); final ValueSource valueSource = ValueResolver.resolveEvaluator(effectObject.get("times"), 1, environment); + String player = FieldUtils.getString(effectObject.get("player"), "player", "you"); Filter tokenFilter = token != null ? Filters.hasToken(token, 1) : Filters.hasAnyCultureTokens(1); @@ -43,7 +44,7 @@ public class ReinforceTokens implements EffectAppenderProducer { result.addEffectAppender( CardResolver.resolveCard(filter, (actionContext) -> tokenFilter, - memory, "you", "Choose card to reinforce tokens on", environment)); + memory, player, "Choose card to reinforce tokens on", environment)); result.addEffectAppender( new DelayedAppender() { @Override diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceFactory.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceFactory.java index 849d7a626..53c203bb4 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceFactory.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceFactory.java @@ -82,6 +82,7 @@ public class ModifierSourceFactory { modifierProducers.put("nomorethanoneminionmaybeassignedtoeachskirmish", new NoMorethanOneMinionMayBeAssignedToEachSkirmish()); modifierProducers.put("opponentmaynotdiscard", new OpponentMayNotDiscard()); modifierProducers.put("removeallkeywords", new RemoveAllKeywords()); + modifierProducers.put("removecardsgoingtodiscard", new AddModifierFlag(ModifierFlag.REMOVE_CARDS_GOING_TO_DISCARD)); modifierProducers.put("removekeyword", new RemoveKeyword()); modifierProducers.put("removetext", new RemoveText()); modifierProducers.put("ringbearercanttakethreatwounds", new AddModifierFlag(ModifierFlag.RING_BEARER_CANT_TAKE_THREAT_WOUNDS));