Add some of Movie block balancing errata to playtesting

This commit is contained in:
Troy Biesterfeld
2021-06-05 21:30:13 -05:00
parent f51137a0a0
commit d041744b85
8 changed files with 208 additions and 9 deletions

View File

@@ -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",

View File

@@ -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",

View File

@@ -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"
}
]
}
]
}
}

View File

@@ -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

View File

@@ -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);

View File

@@ -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 {

View File

@@ -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);
}
}

View File

@@ -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"}
}
]