Migrated Site cards in set 18 to hjson
This commit is contained in:
@@ -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<String, Map<String, LotroCardBlueprint>> cardsByFileName = new HashMap<>();
|
|
||||||
|
|
||||||
SetDefinition setDefinition = library.getSetDefinitions().get("" + set);
|
|
||||||
if (setDefinition.NeedsLoading()) {
|
|
||||||
final Set<String> allCards = setDefinition.getAllCards();
|
|
||||||
for (String blueprintId : allCards) {
|
|
||||||
blueprintId = stripBlueprintModifiers(blueprintId);
|
|
||||||
try {
|
|
||||||
// Ensure it's loaded
|
|
||||||
LotroCardBlueprint cardBlueprint = getBlueprint(blueprintId);
|
|
||||||
String key = getKey(cardBlueprint);
|
|
||||||
Map<String, LotroCardBlueprint> list = cardsByFileName.computeIfAbsent(key, k -> new LinkedHashMap<>());
|
|
||||||
list.put(blueprintId, cardBlueprint);
|
|
||||||
} catch (CardNotFoundException exp) {
|
|
||||||
// Ignore card that is not defined
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Map.Entry<String, Map<String, LotroCardBlueprint>> cardsOfType : cardsByFileName.entrySet()) {
|
|
||||||
String type = cardsOfType.getKey();
|
|
||||||
File typePath = new File(setPath, "set" + set + "-" + type + ".hjson");
|
|
||||||
if (!typePath.exists()) {
|
|
||||||
Map<String, JsonObject> cardJsons = new TreeMap<>();
|
|
||||||
|
|
||||||
Map<String, LotroCardBlueprint> cards = cardsOfType.getValue();
|
|
||||||
for (Map.Entry<String, LotroCardBlueprint> 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<String, JsonObject> 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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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<RequiredTriggerAction> 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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<? extends Modifier> getInPlayModifiers(LotroGame game, PhysicalCard self) {
|
|
||||||
return Collections.singletonList(new SpecialFlagModifier(self, ModifierFlag.REMOVE_CARDS_GOING_TO_DISCARD));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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<RequiredTriggerAction> 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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<RequiredTriggerAction> 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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<? extends Modifier> getInPlayModifiers(LotroGame game, PhysicalCard self) {
|
|
||||||
List<Modifier> 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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<? extends Modifier> getInPlayModifiers(LotroGame game, PhysicalCard self) {
|
|
||||||
return Collections.singletonList(new CantBeTransferredModifier(self, CardType.FOLLOWER));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -23,6 +23,27 @@
|
|||||||
direction: Right
|
direction: Right
|
||||||
keywords: Mountain
|
keywords: Mountain
|
||||||
effects: [
|
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: <b>Mountain</b>. When the fellowship moves to this site, each player wounds two of his or her characters.
|
gametext: <b>Mountain</b>. When the fellowship moves to this site, each player wounds two of his or her characters.
|
||||||
lore: ""
|
lore: ""
|
||||||
@@ -58,6 +79,12 @@
|
|||||||
direction: Left
|
direction: Left
|
||||||
keywords: Mountain
|
keywords: Mountain
|
||||||
effects: [
|
effects: [
|
||||||
|
{
|
||||||
|
type: modifier
|
||||||
|
modifier: {
|
||||||
|
type: removeCardsGoingToDiscard
|
||||||
|
}
|
||||||
|
}
|
||||||
]
|
]
|
||||||
gametext: <b>Mountain</b>. Each card that is about to be placed into the discard pile is removed from the game instead.
|
gametext: <b>Mountain</b>. Each card that is about to be placed into the discard pile is removed from the game instead.
|
||||||
lore: ""
|
lore: ""
|
||||||
@@ -93,6 +120,25 @@
|
|||||||
direction: Left
|
direction: Left
|
||||||
keywords: River
|
keywords: River
|
||||||
effects: [
|
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: <b>River</b>. When the fellowship moves to this site, each player heals each of his or her characters.
|
gametext: <b>River</b>. When the fellowship moves to this site, each player heals each of his or her characters.
|
||||||
lore: ""
|
lore: ""
|
||||||
@@ -131,6 +177,33 @@
|
|||||||
Plains
|
Plains
|
||||||
]
|
]
|
||||||
effects: [
|
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: <b>Battleground</b>. <b>Plains</b>. When the fellowship moves to this site, each player may reinforce a culture token.
|
gametext: <b>Battleground</b>. <b>Plains</b>. When the fellowship moves to this site, each player may reinforce a culture token.
|
||||||
lore: ""
|
lore: ""
|
||||||
@@ -165,8 +238,6 @@
|
|||||||
block: Shadows
|
block: Shadows
|
||||||
direction: Right
|
direction: Right
|
||||||
keywords: River
|
keywords: River
|
||||||
effects: [
|
|
||||||
]
|
|
||||||
gametext: <b>River</b>.
|
gametext: <b>River</b>.
|
||||||
lore: ""
|
lore: ""
|
||||||
promotext: ""
|
promotext: ""
|
||||||
@@ -200,6 +271,25 @@
|
|||||||
block: Shadows
|
block: Shadows
|
||||||
direction: Right
|
direction: Right
|
||||||
effects: [
|
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.
|
gametext: Wounds cannot be prevented or healed. Burdens cannot be removed.
|
||||||
lore: ""
|
lore: ""
|
||||||
@@ -235,6 +325,13 @@
|
|||||||
direction: Left
|
direction: Left
|
||||||
keywords: Dwelling
|
keywords: Dwelling
|
||||||
effects: [
|
effects: [
|
||||||
|
{
|
||||||
|
type: modifier
|
||||||
|
modifier: {
|
||||||
|
type: cantBeTransferred
|
||||||
|
filter: follower
|
||||||
|
}
|
||||||
|
}
|
||||||
]
|
]
|
||||||
gametext: <b>Dwelling</b>. While the fellowship is at this site, followers cannot be transferred to a character.
|
gametext: <b>Dwelling</b>. While the fellowship is at this site, followers cannot be transferred to a character.
|
||||||
lore: ""
|
lore: ""
|
||||||
@@ -29,13 +29,14 @@ import java.util.Map;
|
|||||||
public class ReinforceTokens implements EffectAppenderProducer {
|
public class ReinforceTokens implements EffectAppenderProducer {
|
||||||
@Override
|
@Override
|
||||||
public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
|
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 Culture culture = FieldUtils.getEnum(Culture.class, effectObject.get("culture"), "culture");
|
||||||
final Token token = Token.findTokenForCulture(culture);
|
final Token token = Token.findTokenForCulture(culture);
|
||||||
final String filter = FieldUtils.getString(effectObject.get("filter"), "filter", "self");
|
final String filter = FieldUtils.getString(effectObject.get("filter"), "filter", "self");
|
||||||
final String memory = FieldUtils.getString(effectObject.get("memorize"), "memorize", "_temp");
|
final String memory = FieldUtils.getString(effectObject.get("memorize"), "memorize", "_temp");
|
||||||
final ValueSource valueSource = ValueResolver.resolveEvaluator(effectObject.get("times"), 1, environment);
|
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);
|
Filter tokenFilter = token != null ? Filters.hasToken(token, 1) : Filters.hasAnyCultureTokens(1);
|
||||||
|
|
||||||
@@ -43,7 +44,7 @@ public class ReinforceTokens implements EffectAppenderProducer {
|
|||||||
|
|
||||||
result.addEffectAppender(
|
result.addEffectAppender(
|
||||||
CardResolver.resolveCard(filter, (actionContext) -> tokenFilter,
|
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(
|
result.addEffectAppender(
|
||||||
new DelayedAppender() {
|
new DelayedAppender() {
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -82,6 +82,7 @@ public class ModifierSourceFactory {
|
|||||||
modifierProducers.put("nomorethanoneminionmaybeassignedtoeachskirmish", new NoMorethanOneMinionMayBeAssignedToEachSkirmish());
|
modifierProducers.put("nomorethanoneminionmaybeassignedtoeachskirmish", new NoMorethanOneMinionMayBeAssignedToEachSkirmish());
|
||||||
modifierProducers.put("opponentmaynotdiscard", new OpponentMayNotDiscard());
|
modifierProducers.put("opponentmaynotdiscard", new OpponentMayNotDiscard());
|
||||||
modifierProducers.put("removeallkeywords", new RemoveAllKeywords());
|
modifierProducers.put("removeallkeywords", new RemoveAllKeywords());
|
||||||
|
modifierProducers.put("removecardsgoingtodiscard", new AddModifierFlag(ModifierFlag.REMOVE_CARDS_GOING_TO_DISCARD));
|
||||||
modifierProducers.put("removekeyword", new RemoveKeyword());
|
modifierProducers.put("removekeyword", new RemoveKeyword());
|
||||||
modifierProducers.put("removetext", new RemoveText());
|
modifierProducers.put("removetext", new RemoveText());
|
||||||
modifierProducers.put("ringbearercanttakethreatwounds", new AddModifierFlag(ModifierFlag.RING_BEARER_CANT_TAKE_THREAT_WOUNDS));
|
modifierProducers.put("ringbearercanttakethreatwounds", new AddModifierFlag(ModifierFlag.RING_BEARER_CANT_TAKE_THREAT_WOUNDS));
|
||||||
|
|||||||
Reference in New Issue
Block a user