From d041744b851421dc1764bd16325ea56dc2bef97e Mon Sep 17 00:00:00 2001 From: Troy Biesterfeld Date: Sat, 5 Jun 2021 21:30:13 -0500 Subject: [PATCH] Add some of Movie block balancing errata to playtesting --- .../cards/errata/set02-errata-playtest.json | 6 +- .../cards/errata/set03-errata-playtest.json | 4 +- .../cards/errata/set08-errata-playtest.json | 152 ++++++++++++++++++ .../src/main/web/js/gemp-022/PC_Cards.js | 4 + .../field/effect/filter/FilterFactory.java | 22 +++ .../modifier/ModifierSourceFactory.java | 3 +- .../effect/modifier/ShadowHasInitiative.java | 18 +++ .../src/main/resources/lotrFormats.json | 8 +- 8 files changed, 208 insertions(+), 9 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ShadowHasInitiative.java diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/errata/set02-errata-playtest.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/errata/set02-errata-playtest.json index 538deb0d0..63353c9e7 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/cards/errata/set02-errata-playtest.json +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/errata/set02-errata-playtest.json @@ -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", diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/errata/set03-errata-playtest.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/errata/set03-errata-playtest.json index 3d22715c4..b00247bc0 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/cards/errata/set03-errata-playtest.json +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/errata/set03-errata-playtest.json @@ -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", diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/errata/set08-errata-playtest.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/errata/set08-errata-playtest.json index 2c63c0851..6c1da2efa 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/cards/errata/set08-errata-playtest.json +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/errata/set08-errata-playtest.json @@ -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" + } + ] + } + ] + } } diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/PC_Cards.js b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/PC_Cards.js index 5e2d42ee2..760a11af5 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/PC_Cards.js +++ b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/PC_Cards.js @@ -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 diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/filter/FilterFactory.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/filter/FilterFactory.java index 41de133f4..ffc69626e 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/filter/FilterFactory.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/filter/FilterFactory.java @@ -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); 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 dc6529c9f..50ce61b86 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 @@ -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 { diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ShadowHasInitiative.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ShadowHasInitiative.java new file mode 100644 index 000000000..da10e6dad --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ShadowHasInitiative.java @@ -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); + } +} diff --git a/gemp-lotr/gemp-lotr-server/src/main/resources/lotrFormats.json b/gemp-lotr/gemp-lotr-server/src/main/resources/lotrFormats.json index 443fb33c2..26d56609f 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/resources/lotrFormats.json +++ b/gemp-lotr/gemp-lotr-server/src/main/resources/lotrFormats.json @@ -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"} } ]