Add some of Movie block balancing errata to playtesting
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"2_6": {
|
||||
"72_6": {
|
||||
"title": "*Fror",
|
||||
"subtitle": "Gimli's Kinsman",
|
||||
"culture": "dwarven",
|
||||
@@ -22,7 +22,7 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"2_7": {
|
||||
"72_7": {
|
||||
"title": "*Gloin",
|
||||
"subtitle": "Friend to Thorin",
|
||||
"culture": "dwarven",
|
||||
@@ -45,7 +45,7 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"2_55": {
|
||||
"72_55": {
|
||||
"side": "shadow",
|
||||
"cost": 1,
|
||||
"culture": "Moria",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"3_54": {
|
||||
"73_54": {
|
||||
"title": "Hollowing of Isengard",
|
||||
"culture": "isengard",
|
||||
"cost": 2,
|
||||
@@ -45,7 +45,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"3_120": {
|
||||
"73_120": {
|
||||
"title": "Wastes of Emyn Muil",
|
||||
"cost": 9,
|
||||
"type": "site",
|
||||
|
||||
@@ -1,2 +1,154 @@
|
||||
{
|
||||
"78_24": {
|
||||
"title": "*Promise Keeping",
|
||||
"side": "shadow",
|
||||
"culture": "gollum",
|
||||
"cost": 4,
|
||||
"type": "condition",
|
||||
"keyword": "support area",
|
||||
"effects": {
|
||||
"type": "trigger",
|
||||
"optional": true,
|
||||
"trigger": {
|
||||
"type": "takesWound",
|
||||
"filter": "companion,inSkirmishAgainst(culture(gollum),minion)",
|
||||
"memorize": "woundedCompanion"
|
||||
},
|
||||
"effect": {
|
||||
"type": "exert",
|
||||
"filter": "choose(not(memory(woundedCompanion)),companion)"
|
||||
}
|
||||
}
|
||||
},
|
||||
"78_51": {
|
||||
"title": "*Castamir of Umbar",
|
||||
"culture": "Raider",
|
||||
"cost": 7,
|
||||
"type": "minion",
|
||||
"race": "Man",
|
||||
"strength": 14,
|
||||
"vitality": 4,
|
||||
"site": 4,
|
||||
"keyword": [
|
||||
"Fierce",
|
||||
"Corsair"
|
||||
],
|
||||
"effects": {
|
||||
"type": "activated",
|
||||
"phase": "shadow",
|
||||
"cost": [
|
||||
{
|
||||
"type": "exert",
|
||||
"filter": "self"
|
||||
},
|
||||
{
|
||||
"type": "play",
|
||||
"filter": "choose(corsair)"
|
||||
}
|
||||
],
|
||||
"effect": {
|
||||
"type": "addTokens",
|
||||
"culture": "raider",
|
||||
"filter": "choose(hasToken(raider))",
|
||||
"amount": 2
|
||||
}
|
||||
}
|
||||
},
|
||||
"78_57": {
|
||||
"title": "Corsair Marauder",
|
||||
"culture": "Raider",
|
||||
"cost": 4,
|
||||
"type": "minion",
|
||||
"race": "Man",
|
||||
"strength": 9,
|
||||
"vitality": 2,
|
||||
"site": 4,
|
||||
"keyword": "Corsair",
|
||||
"effects": {
|
||||
"type": "trigger",
|
||||
"optional": true,
|
||||
"trigger": {
|
||||
"type": "assignedToSkirmish",
|
||||
"filter": "self"
|
||||
},
|
||||
"condition": {
|
||||
"type": "canSpot",
|
||||
"filter": "not(self),corsair"
|
||||
},
|
||||
"cost": {
|
||||
"type": "discard",
|
||||
"filter": "choose(possession)"
|
||||
},
|
||||
"effect": {
|
||||
"type": "addTokens",
|
||||
"culture": "raider",
|
||||
"filter": "choose(hasToken(raider))",
|
||||
"amount": 2
|
||||
}
|
||||
}
|
||||
},
|
||||
"78_59": {
|
||||
"title": "Corsair War Galley",
|
||||
"culture": "Raider",
|
||||
"cost": 1,
|
||||
"type": "possession",
|
||||
"keyword": "Support Area",
|
||||
"effects": [
|
||||
{
|
||||
"type": "trigger",
|
||||
"optional": true,
|
||||
"trigger": {
|
||||
"type": "played",
|
||||
"filter": "self"
|
||||
},
|
||||
"effect": {
|
||||
"type": "addTokens",
|
||||
"culture": "raider",
|
||||
"filter": "self"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "modifier",
|
||||
"modifier": {
|
||||
"type": "shadowhasinitiative",
|
||||
"condition": [
|
||||
{
|
||||
"type": "canSpot",
|
||||
"filter": "self,hasTokenCount(6,raider)"
|
||||
},
|
||||
{
|
||||
"type": "canSpot",
|
||||
"filter": "culture(raider),man"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "activated",
|
||||
"phase": "regroup",
|
||||
"cost": {
|
||||
"type": "memorizeNumber",
|
||||
"memory": "numberOfTokens",
|
||||
"amount": {
|
||||
"type": "forEachToken",
|
||||
"culture": "raider",
|
||||
"filter": "self"
|
||||
}
|
||||
},
|
||||
"effect": [
|
||||
{
|
||||
"type": "addTwilight",
|
||||
"amount": {
|
||||
"type": "fromMemory",
|
||||
"memory": "numberOfTokens"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "discard",
|
||||
"filter": "self"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -129,6 +129,10 @@ var PCCards = {
|
||||
'72_55': 'https://i.lotrtcgpc.net/errata/xlist/72_55.jpg',
|
||||
'73_54': 'https://i.lotrtcgpc.net/errata/xlist/73_54.jpg',
|
||||
'73_120': 'https://i.lotrtcgpc.net/errata/xlist/73_120.jpg',
|
||||
'78_24': 'https://i.lotrtcgpc.net/errata/xlist/78_24.jpg',
|
||||
'78_51': 'https://i.lotrtcgpc.net/errata/xlist/78_51.jpg',
|
||||
'78_57': 'https://i.lotrtcgpc.net/errata/xlist/78_57.jpg',
|
||||
'78_59': 'https://i.lotrtcgpc.net/errata/xlist/78_59.jpg',
|
||||
|
||||
/// Player's Council League Promos
|
||||
// April 2021
|
||||
|
||||
@@ -116,6 +116,28 @@ public class FilterFactory {
|
||||
|
||||
return (actionContext) -> side;
|
||||
});
|
||||
parameterFilters.put("hasToken", (parameter, environment) -> {
|
||||
final Culture culture = Culture.valueOf(parameter.toUpperCase());
|
||||
if (culture == null)
|
||||
throw new InvalidCardDefinitionException("Unable to find culture for: " + parameter);
|
||||
final Token token = Token.findTokenForCulture(culture);
|
||||
if (token == null)
|
||||
throw new InvalidCardDefinitionException("Unable to find token for culture: " + parameter);
|
||||
|
||||
return (actionContext) -> Filters.hasToken(token);
|
||||
});
|
||||
parameterFilters.put("hasTokenCount", (parameter, environment) -> {
|
||||
String[] parameterSplit = parameter.split(",", 2);
|
||||
int count = Integer.parseInt(parameterSplit[0]);
|
||||
final Culture culture = Culture.valueOf(parameterSplit[1].toUpperCase());
|
||||
if (culture == null)
|
||||
throw new InvalidCardDefinitionException("Unable to find culture for: " + parameter);
|
||||
final Token token = Token.findTokenForCulture(culture);
|
||||
if (token == null)
|
||||
throw new InvalidCardDefinitionException("Unable to find token for culture: " + parameter);
|
||||
|
||||
return (actionContext) -> Filters.hasToken(token, count);
|
||||
});
|
||||
parameterFilters.put("hasAttached",
|
||||
(parameter, environment) -> {
|
||||
final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(parameter, environment);
|
||||
|
||||
@@ -4,7 +4,6 @@ import com.gempukku.lotro.cards.build.CardGenerationEnvironment;
|
||||
import com.gempukku.lotro.cards.build.InvalidCardDefinitionException;
|
||||
import com.gempukku.lotro.cards.build.ModifierSource;
|
||||
import com.gempukku.lotro.cards.build.field.FieldUtils;
|
||||
import com.gempukku.lotro.logic.modifiers.FreePeoplePlayerMayNotAssignCharacterModifier;
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
import java.util.HashMap;
|
||||
@@ -56,6 +55,8 @@ public class ModifierSourceFactory {
|
||||
modifierProducers.put("allycanparticipateinarcheryfireandskirmishes", new AllyCanParticipateInArcheryFireAndSkirmishes());
|
||||
modifierProducers.put("cantlookorrevealhand", new CantLookOrRevealHand());
|
||||
modifierProducers.put("cantbeassignedtoskirmish", new CantBeAssignedToSkirmish());
|
||||
modifierProducers.put("shadowhasinitiative", new ShadowHasInitiative());
|
||||
|
||||
}
|
||||
|
||||
public ModifierSource getModifier(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.gempukku.lotro.cards.build.field.effect.modifier;
|
||||
|
||||
import com.gempukku.lotro.cards.build.*;
|
||||
import com.gempukku.lotro.cards.build.field.FieldUtils;
|
||||
import com.gempukku.lotro.common.Side;
|
||||
import com.gempukku.lotro.logic.modifiers.HasInitiativeModifier;
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
public class ShadowHasInitiative implements ModifierSourceProducer {
|
||||
@Override
|
||||
public ModifierSource getModifierSource(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
|
||||
FieldUtils.validateAllowedFields(object, "condition");
|
||||
final JSONObject[] conditionArray = FieldUtils.getObjectArray(object.get("condition"), "condition");
|
||||
final Requirement[] requirements = environment.getRequirementFactory().getRequirements(conditionArray, environment);
|
||||
|
||||
return (actionContext) -> new HasInitiativeModifier(actionContext.getSource(), new RequirementCondition(requirements, actionContext), Side.SHADOW);
|
||||
}
|
||||
}
|
||||
@@ -460,7 +460,8 @@
|
||||
"2_32":"52_32", "2_55":"72_55", "2_75":"52_75", "2_101":"52_101", "2_108":"52_108", "2_121":"52_121", "3_17":"53_17",
|
||||
"3_38":"53_38", "3_42":"53_42", "3_54":"73_54", "3_67":"53_67", "3_68":"53_68", "3_106":"53_106", "3_108":"53_108",
|
||||
"3_113":"53_113", "3_120":"73_120", "4_73":"54_73", "4_192":"54_192", "4_276":"54_276", "4_304":"54_304", "7_49":"57_49",
|
||||
"7_96":"57_96", "8_1":"58_1", "10_2":"60_2", "10_11":"60_11", "10_91":"60_91"}
|
||||
"7_96":"57_96", "8_1":"58_1", "8_24":"58_24", "8_51":"58_51", "8_57":"58_57", "8_59":"58_59", "10_2":"60_2",
|
||||
"10_11":"60_11", "10_91":"60_91"}
|
||||
},
|
||||
{
|
||||
"name":"PLAYTEST - Expanded (PC)",
|
||||
@@ -475,7 +476,8 @@
|
||||
"2_32":"52_32", "2_55":"72_55", "2_75":"52_75", "2_101":"52_101", "2_108":"52_108", "2_121":"52_121", "3_17":"53_17",
|
||||
"3_38":"53_38", "3_42":"53_42", "3_54":"73_54", "3_67":"53_67", "3_68":"53_68", "3_106":"53_106", "3_108":"53_108",
|
||||
"3_113":"53_113", "3_120":"73_120", "4_73":"54_73", "4_192":"54_192", "4_276":"54_276", "4_304":"54_304", "7_49":"57_49",
|
||||
"7_96":"57_96", "8_1":"58_1", "10_2":"60_2", "10_11":"60_11", "10_91":"60_91", "11_31":"61_31", "11_100":"61_100",
|
||||
"11_114":"61_114", "11_132":"61_132", "13_188":"63_188", "15_64":"65_64"}
|
||||
"7_96":"57_96", "8_1":"58_1", "8_24":"58_24", "8_51":"58_51", "8_57":"58_57", "8_59":"58_59", "10_2":"60_2",
|
||||
"10_11":"60_11", "10_91":"60_91", "11_31":"61_31", "11_100":"61_100", "11_114":"61_114", "11_132":"61_132",
|
||||
"13_188":"63_188", "15_64":"65_64"}
|
||||
}
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user