From 35bd02fa29698468e1fe545fc6baa82258d91bac Mon Sep 17 00:00:00 2001 From: Troy Biesterfeld Date: Sat, 5 Jun 2021 19:13:28 -0500 Subject: [PATCH] Add Fellowship block balancing errata to playtesting --- .../web/cards-stub/set15/set15-gollum.json | 2 +- .../cards/errata/set01-errata-playtest.json | 189 ++++++++++++++++++ .../cards/errata/set02-errata-playtest.json | 97 +++++++++ .../cards/errata/set03-errata-playtest.json | 91 +++++++++ .../src/main/web/js/gemp-022/PC_Cards.js | 12 ++ .../src/main/web/js/gemp-022/jCards.js | 2 + .../effect/trigger/TriggerCheckerFactory.java | 1 + .../effect/trigger/UsesSpecialAbility.java | 32 +++ .../src/main/resources/lotrFormats.json | 27 ++- 9 files changed, 449 insertions(+), 4 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/UsesSpecialAbility.java diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards-stub/set15/set15-gollum.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards-stub/set15/set15-gollum.json index cf547d117..b787f4391 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/cards-stub/set15/set15-gollum.json +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards-stub/set15/set15-gollum.json @@ -15,7 +15,7 @@ "side": "free_people", "cost": 1, "culture": "Gollum", - "title": "Called to Mordor", + "title": " Mordor", "type": "condition" }, "15_45": { diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/errata/set01-errata-playtest.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/errata/set01-errata-playtest.json index 2c63c0851..b4f233809 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/cards/errata/set01-errata-playtest.json +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/errata/set01-errata-playtest.json @@ -1,2 +1,191 @@ { + "1_7": { + "title": "Dwarf Guard", + "culture": "dwarven", + "cost": 1, + "type": "companion", + "race": "dwarf", + "strength": 5, + "vitality": 2, + "resistance": 6, + "condition": { + "type": "canSpot", + "filter": "dwarf" + } + }, + "1_11": { + "title": "*Farin", + "subtitle": "Dwarven Emissary", + "culture": "dwarven", + "cost": 2, + "type": "companion", + "race": "dwarf", + "strength": 6, + "vitality": 3, + "resistance": 6, + "condition": { + "type": "canSpot", + "filter": "dwarf" + }, + "effects": { + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "filter": "self,inSkirmishAgainst(orc)", + "amount": 2 + } + } + }, + "1_12": { + "title": "*Gimli", + "subtitle": "Dwarf of Erebor", + "culture": "dwarven", + "cost": 2, + "type": "companion", + "race": "dwarf", + "strength": 6, + "vitality": 3, + "resistance": 6, + "signet": "aragorn", + "keyword": "damage+1", + "effects": { + "type": "activated", + "phase": "fellowship", + "condition": { + "type": "twilightPoolLessThan", + "amount": 2 + }, + "cost": [ + { + "type": "addTwilight", + "amount": 2 + }, + { + "type": "putCardsFromHandOnBottomOfDeck" + } + ], + "effect": { + "type": "drawCards" + } + } + }, + "1_53": { + "title": "Lorien Elf", + "culture": "elven", + "cost": 1, + "type": "companion", + "race": "elf", + "strength": 5, + "vitality": 2, + "resistance": 6, + "condition": { + "type": "canSpot", + "filter": "elf" + } + }, + "1_55": { + "title": "*The Mirror of Galadriel", + "culture": "elven", + "cost": 2, + "type": "possession", + "keyword": "support area", + "effects": [ + { + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "filter": "elf,ally,allyHome(fellowship,6)", + "amount": 1 + } + }, + { + "type": "activated", + "phase": "maneuver", + "condition": { + "type": "cardsInHandMoreThan", + "player": "shadowPlayer", + "count": 6 + }, + "cost": { + "type": "exert", + "filter": "choose(name(Galadriel))" + }, + "effect": [ + { + "type": "revealRandomCardsFromHand", + "forced": true, + "hand": "fp", + "count": 4, + "memorize": "revealedCards" + }, + { + "type": "putCardsFromHandOnTopOfDeck", + "filter": "choose(memory(revealedCards))", + "player": "fp" + } + ] + } + ] + }, + "1_254": { + "title": "Mordor Enraged", + "culture": "sauron", + "cost": 0, + "type": "condition", + "target": "archer,companion", + "effects": [ + { + "type": "extraCost", + "cost": { + "type": "exert", + "filter": "choose(culture(sauron),orc)" + } + }, + { + "type": "activatedTrigger", + "trigger": { + "type": "usesspecialability", + "filter": "side(free people)" + }, + "condition": { + "type": "phase", + "phase": "archery" + }, + "effect": { + "type": "exert", + "filter": "bearer" + } + } + ] + }, + "1_282": { + "title": "The Weight of a Legacy", + "culture": "sauron", + "cost": 0, + "type": "condition", + "strength": -1, + "target": "culture(gondor),companion,not(hasAttached(name(The Weight of a Legacy)))", + "effects": [ + { + "type": "extraCost", + "cost": { + "type": "exert", + "filter": "choose(culture(sauron),orc)" + } + }, + { + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "condition": { + "type": "canSpot", + "count": 2, + "filter": "tale" + }, + "filter": "bearer", + "amount": -2 + } + } + ] + } } 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 2c63c0851..538deb0d0 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,2 +1,99 @@ { + "2_6": { + "title": "*Fror", + "subtitle": "Gimli's Kinsman", + "culture": "dwarven", + "cost": 2, + "type": "companion", + "race": "dwarf", + "strength": 6, + "vitality": 3, + "resistance": 6, + "condition": { + "type": "canSpot", + "filter": "dwarf" + }, + "effects": { + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "filter": "self,inSkirmishAgainst(uruk-hai)", + "amount": 3 + } + } + }, + "2_7": { + "title": "*Gloin", + "subtitle": "Friend to Thorin", + "culture": "dwarven", + "cost": 2, + "type": "companion", + "race": "dwarf", + "strength": 6, + "vitality": 3, + "resistance": 6, + "effects": { + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "filter": "self", + "amount": { + "type": "forEachYouCanSpot", + "filter": "culture(dwarven),tale", + "limit": 4 + } + } + } + }, + "2_55": { + "side": "shadow", + "cost": 1, + "culture": "Moria", + "title": "Dark Places", + "type": "condition", + "keyword": "Support Area", + "effects": [ + { + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "filter": "unique,culture(moria),minion", + "amount": 1 + } + }, + { + "type": "modifier", + "modifier": { + "type": "addKeyword", + "filter": "currentSite", + "keyword": "marsh" + } + }, + { + "type": "activated", + "phase": "shadow", + "condition": { + "type": "canSpot", + "filter": "not(your),site" + }, + "effect": [ + { + "type": "chooseActiveCards", + "text": "Choose opponent's site", + "filter": "choose(not(your),site)", + "memorize": "chosenSite" + }, + { + "type": "playSite", + "block": "fellowship", + "number": { + "type": "siteNumberInMemory", + "memory": "chosenSite" + }, + "filter": "or(marsh,underground)" + } + ] + } + ] + } } 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 2c63c0851..3d22715c4 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,2 +1,93 @@ { + "3_54": { + "title": "Hollowing of Isengard", + "culture": "isengard", + "cost": 2, + "type": "condition", + "keyword": "support area", + "effects": [ + { + "type": "activated", + "phase": "shadow", + "condition": { + "type": "canSpot", + "count": 2, + "filter": "culture(isengard),orc" + }, + "cost": { + "type": "discardFromHand", + "forced": false, + "count": 2 + }, + "effect": { + "type": "addTwilight", + "amount": 1 + } + }, + { + "type": "activated", + "phase": "regroup", + "cost": [ + { + "type": "removeTwilight", + "amount": 1 + }, + { + "type": "discard", + "filter": "choose(culture(isengard),orc)" + } + ], + "effect": { + "type": "wound", + "player": "fp", + "filter": "choose(companion)" + } + } + ] + }, + "3_120": { + "title": "Wastes of Emyn Muil", + "cost": 9, + "type": "site", + "site": 9, + "block": "fellowship", + "effects": { + "type": "activated", + "phase": "skirmish", + "cost": { + "type": "exert", + "filter": "choose(your,culture(isengard),orc)" + }, + "effect": { + "type": "choice", + "texts": [ + "Make Free Peoples player wound a companion", + "Make Free Peoples player wound 2 companions" + ], + "effects": [ + { + "type": "wound", + "player": "fp", + "filter": "choose(companion)" + }, + { + "type": "conditional", + "condition": { + "type": "canSpot", + "count": 6, + "filter": "companion" + }, + "effect": [ + { + "type": "wound", + "count": 2, + "player": "fp", + "filter": "choose(companion)" + } + ] + } + ] + } + } + } } 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 da6890823..5e2d42ee2 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 @@ -117,6 +117,18 @@ var PCCards = { '65_64': 'https://i.lotrtcgpc.net/errata/xlist/65_064.jpg', // Future Errata + '71_7': 'https://i.lotrtcgpc.net/errata/xlist/71_007.jpg', + '71_11': 'https://i.lotrtcgpc.net/errata/xlist/71_011.jpg', + '71_12': 'https://i.lotrtcgpc.net/errata/xlist/71_012.jpg', + '71_53': 'https://i.lotrtcgpc.net/errata/xlist/71_053.jpg', + '71_55': 'https://i.lotrtcgpc.net/errata/xlist/71_055.jpg', + '71_254': 'https://i.lotrtcgpc.net/errata/xlist/71_254.jpg', + '71_282': 'https://i.lotrtcgpc.net/errata/xlist/71_282.jpg', + '72_6': 'https://i.lotrtcgpc.net/errata/xlist/72_6.jpg', + '72_7': 'https://i.lotrtcgpc.net/errata/xlist/72_7.jpg', + '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', /// Player's Council League Promos // April 2021 diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/jCards.js b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/jCards.js index 71bc0910d..33a3f7031 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/jCards.js +++ b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/jCards.js @@ -295,6 +295,8 @@ var Card = Class.extend({ return (cardNo >= 273 && cardNo <= 309); if (setNo == 63) return (cardNo == 188); + if (setNo == 73) + return (cardNo == 120); return false; }, diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/TriggerCheckerFactory.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/TriggerCheckerFactory.java index eb7a61b36..2b4e69dc9 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/TriggerCheckerFactory.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/TriggerCheckerFactory.java @@ -44,6 +44,7 @@ public class TriggerCheckerFactory { triggerCheckers.put("transferred", new Transferred()); triggerCheckers.put("killed", new Killed()); triggerCheckers.put("reconciles", new Reconciles()); + triggerCheckers.put("usesspecialability", new UsesSpecialAbility()); } public TriggerChecker getTriggerChecker(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/UsesSpecialAbility.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/UsesSpecialAbility.java new file mode 100644 index 000000000..1097f8f4b --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/UsesSpecialAbility.java @@ -0,0 +1,32 @@ +package com.gempukku.lotro.cards.build.field.effect.trigger; + +import com.gempukku.lotro.cards.build.ActionContext; +import com.gempukku.lotro.cards.build.CardGenerationEnvironment; +import com.gempukku.lotro.cards.build.FilterableSource; +import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; +import com.gempukku.lotro.cards.build.field.FieldUtils; +import com.gempukku.lotro.common.Side; +import com.gempukku.lotro.logic.timing.TriggerConditions; +import org.json.simple.JSONObject; + +public class UsesSpecialAbility implements TriggerCheckerProducer { + @Override + public TriggerChecker getTriggerChecker(JSONObject value, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(value, "filter"); + String filter = FieldUtils.getString(value.get("filter"), "filter", "any"); + + final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment); + + return new TriggerChecker() { + @Override + public boolean isBefore() { + return false; + } + + @Override + public boolean accepts(ActionContext actionContext) { + return TriggerConditions.activated(actionContext.getGame(), actionContext.getEffectResult(), filterableSource.getFilterable(actionContext)); + } + }; + } +} 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 4b54d34e0..443fb33c2 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/resources/lotrFormats.json +++ b/gemp-lotr/gemp-lotr-server/src/main/resources/lotrFormats.json @@ -439,7 +439,13 @@ "cancelRingBearerSkirmish":true, "hall":true, "playtest":true, - "set":[1, 2, 3] + "set":[1, 2, 3], + "errata":{"1_7":"71_7", "1_11":"71_11", "1_12":"71_12", "1_40":"51_40", "1_45":"51_45", "1_53":"71_53", "1_55":"71_55", + "1_80":"51_80", "1_108":"51_108", "1_138":"51_138", "1_139":"51_139", "1_195":"51_195", "1_234":"51_234", "1_248":"51_248", + "1_254":"71_254", "1_282":"71_282", "1_311":"51_311", "1_313":"51_313", "1_316":"51_316", "2_6":"72_6", "2_7":"72_7", + "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"} }, { "name":"PLAYTEST - Movie block (PC)", @@ -447,7 +453,14 @@ "sites":"KING", "hall":true, "playtest":true, - "set":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] + "set":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "errata":{"1_7":"71_7", "1_11":"71_11", "1_12":"71_12", "1_40":"51_40", "1_45":"51_45", "1_53":"71_53", "1_55":"71_55", + "1_80":"51_80", "1_108":"51_108", "1_138":"51_138", "1_139":"51_139", "1_195":"51_195", "1_234":"51_234", "1_248":"51_248", + "1_254":"71_254", "1_282":"71_282", "1_311":"51_311", "1_313":"51_313", "1_316":"51_316", "2_6":"72_6", "2_7":"72_7", + "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"} }, { "name":"PLAYTEST - Expanded (PC)", @@ -455,6 +468,14 @@ "sites":"SHADOWS", "hall":true, "playtest":true, - "set":[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] + "set":[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], + "errata":{"1_7":"71_7", "1_11":"71_11", "1_12":"71_12", "1_40":"51_40", "1_45":"51_45", "1_53":"71_53", "1_55":"71_55", + "1_80":"51_80", "1_108":"51_108", "1_138":"51_138", "1_139":"51_139", "1_195":"51_195", "1_234":"51_234", "1_248":"51_248", + "1_254":"71_254", "1_282":"71_282", "1_311":"51_311", "1_313":"51_313", "1_316":"51_316", "2_6":"72_6", "2_7":"72_7", + "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"} } ]