diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set51/set01-errata.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set51/set01-errata.json index d033d0ad6..97a2a14ab 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set51/set01-errata.json +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set51/set01-errata.json @@ -66,8 +66,8 @@ }, "effect": { "type": "heal", - "filter": "choose(another,ally,allyHome(fellowship,6))", - "count": "0-2" + "filter": "choose(ally,allyHome(fellowship,6))", + "count": "0-3" } }, { @@ -92,7 +92,7 @@ "culture": "gandalf", "cost": 1, "type": "ally", - "allyHome": "fellowship,1", + "allyHome": "fellowship,3", "race": "man", "strength": 2, "vitality": 2, @@ -103,32 +103,90 @@ "effects": { "type": "activated", "phase": "fellowship", - "cost": { - "type": "exert", - "filter": "self" - }, - "effect": [ + "cost": [ { - "type": "discardFromHand", - "forced": false, - "count": "0-3", - "memorize": "discardedCards" + "type": "exert", + "filter": "self" }, { - "type": "drawCards", - "count": { - "type": "forEachInMemory", - "memory": "discardedCards" - } + "type": "discardFromHand", + "forced": false } - ] + ], + "effect": { + "type": "drawCards" + } } }, - + "51_108": { + "title": "*No Stranger to the Shadows", + "culture": "gondor", + "cost": 0, + "type": "condition", + "keyword": [ + "stealth" + ], + "target": "ranger", + "effects": { + "type": "modifier", + "modifier": { + "type": "modifyCost", + "filter": "site", + "amount": -1 + } + } + }, + "51_138": { + "title": "Saruman's Snows", + "culture": "isengard", + "cost": 2, + "type": "condition", + "keyword": [ + "spell", + "weather" + ], + "target": "site", + "effects": [ + { + "type": "extraCost", + "cost": { + "type": "exert", + "filter": "choose(culture(isengard),minion)" + } + }, + { + "type": "modifier", + "modifier": { + "type": "cantPlayPhaseEventsOrPhaseSpecialAbilities", + "condition": [ + { + "type": "location", + "filter": "hasAttached(self)" + }, + { + "type": "canSpot", + "filter": "culture(isengard),minion,inSkirmish" + } + ], + "phase": "skirmish" + } + }, + { + "type": "trigger", + "trigger": { + "type": "endOfTurn" + }, + "effect": { + "type": "discard", + "filter": "self" + } + } + ] + }, "51_139": { "title": "Savagery To Match Their Numbers", "culture": "isengard", - "cost": 0, + "cost": 1, "type": "event", "keyword": "skirmish", "effects": { @@ -137,7 +195,7 @@ "type": "choice", "texts": [ "Make an Uruk-hai strength +2", - "Make an Uruk-hai fierce until the regroup phase, and strength +4 (this skirmish)" + "Make an Uruk-hai strength +4, and fierce until the regroup phase" ], "effects": [ { @@ -171,7 +229,6 @@ } } }, - "51_195": { "title": "*Relics of Moria", "culture": "moria", @@ -192,7 +249,6 @@ } } }, - "51_234": { "title": "*Úlairë Nertëa", "subtitle": "Messenger of Dol Guldur", @@ -218,16 +274,15 @@ }, "effect": { "type": "optional", - "text": "Would you like to play minion from your discard?", + "text": "Would you like to play a wraith minion from your discard?", "effect": { "type": "playCardFromDiscard", - "filter": "choose(nazgul)" + "filter": "choose(culture(wraith),minion)" } } } } }, - "51_248": { "title": "Forces of Mordor", "culture": "sauron", @@ -240,21 +295,16 @@ "type": "exert", "filter": "choose(culture(sauron),minion)" }, - "cost": { - "type": "chooseHowManyToSpot", - "filter": "culture(sauron),minion", - "memorize": "spottedCount" - }, "effect": { "type": "addTwilight", "amount": { "type": "forEachYouCanSpot", "filter": "culture(sauron),orc", + "limit": 3 } } } }, - "51_311": { "title": "*Sam", "subtitle": "Son of Hamfast", @@ -273,13 +323,11 @@ "cost": [ { "type": "exert", - "filter": "self", - "times": 1 + "filter": "self" }, { "type": "exert", - "filter": "choose(another,companion)", - "times": 1 + "filter": "choose(another,companion)" } ], "effect": { @@ -300,32 +348,6 @@ } ] }, - - - - - - - "51_108": { - "title": "*No Stranger to the Shadows", - "culture": "gondor", - "cost": 0, - "type": "condition", - "keyword": [ - "stealth" - ], - "target": "ranger,not(hasAttached(name(No Stranger to the Shadows)))", - "effects": { - "type": "modifier", - "modifier": { - "type": "modifyCost", - "filter": "site", - "amount": -1 - } - } - }, - - "51_313": { "title": "*Sting", "culture": "shire", @@ -350,13 +372,13 @@ "hand": "shadowPlayer", "forced": true, "memorize": "revealedCards", - "count":2 + "count": 4 }, { "type": "removeTwilight", "amount": { "type": "cardPhaseLimit", - "limit": 2, + "limit": 2, "amount": { "type": "forEachMatchingInMemory", "memory": "revealedCards", @@ -368,13 +390,12 @@ ] } }, - "51_316": { - "title": "*A Talent for Not Being Seen", + "title": "A Talent for Not Being Seen", "culture": "shire", "cost": 0, "type": "condition", - "target": "or(name(Merry),name(Pippin))", + "target": "or(name(Merry),name(Pippin)),not(hasAttached(name(A Talent for Not Being Seen)))", "keyword": [ "stealth" ], @@ -383,22 +404,8 @@ "modifier": { "type": "modifyCost", "filter": "site", - "amount": { - "type": "condition", - "condition": { - "type": "cantSpot", - "filter": "companion,not(hobbit)" - }, - "true": -1, - "false": 0 - } + "amount": -1 } } - }, - - - - - - + } } \ No newline at end of file diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set51/set02-errata.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set51/set02-errata.json index 77d0acf94..115cead9d 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set51/set02-errata.json +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set51/set02-errata.json @@ -1,7 +1,7 @@ { - "52_32": { + "52_32": { "side": "free_people", - "cost": 0, + "cost": 1, "strength": 1, "culture": "Gondor", "possession": "Hand Weapon", @@ -17,7 +17,7 @@ "phase": "skirmish", "condition": { "type": "canSpot", - "filter": "bearer,inSkirmishAgainst(Nazgul)", + "filter": "bearer,inSkirmishAgainst(Nazgul)" }, "cost": [ { @@ -30,7 +30,7 @@ "filter": "self" } ], - "effect":[ + "effect": [ { "type": "modifyStrength", "filter": "memory(bearer)", @@ -42,10 +42,123 @@ "keyword": "damage+1" } ] - }, + } ] }, - + "52_75": { + "title": "*Bill Ferny", + "subtitle": "Swarthy Sneering Fellow", + "culture": "wraith", + "cost": 2, + "type": "minion", + "race": "man", + "strength": 4, + "vitality": 1, + "site": 2, + "effects": [ + { + "type": "modifier", + "modifier": { + "type": "removeKeyword", + "filter": "nazgul", + "keyword": "roaming" + } + }, + { + "type": "modifier", + "modifier": { + "type": "cantBeAssignedToSkirmishByFpPlayer", + "condition": { + "type": "canSpot", + "filter": "hobbit" + }, + "filter": "self" + } + }, + { + "type": "trigger", + "trigger": { + "type": "condition", + "condition": { + "type": "location", + "filter": "underground" + } + }, + "effect": { + "type": "discard", + "filter": "self" + } + } + ] + }, + "52_101": { + "title": "*Filibert Bolger", + "subtitle": "Wily Rascal", + "culture": "shire", + "cost": 1, + "type": "ally", + "allyHome": "fellowship,1", + "race": "hobbit", + "strength": 1, + "vitality": 2, + "effects": { + "type": "activated", + "phase": "skirmish", + "cost": [ + { + "type": "exert", + "filter": "choose(hobbit,companion,not(ring bearer))", + "times": 2, + "memorize": "exertedHobbit" + } + ], + "effect": { + "type": "cancelSkirmish", + "filter": "memory(exertedHobbit),infierceskirmish" + } + } + }, + "52_108": { + "title": "*O Elbereth! Gilthoniel!", + "culture": "shire", + "cost": 1, + "type": "condition", + "strength": 1, + "keyword": "tale", + "target": "ring bearer", + "effects": { + "type": "activated", + "phase": "skirmish", + "cost": [ + { + "type": "memorize", + "filter": "bearer", + "memory": "bearer" + }, + { + "type": "discard", + "filter": "self" + } + ], + "effect": { + "type": "choice", + "texts": [ + "Make the Ring-bearer strength +3 if skirmishing a Nazgul", + "Take off The One Ring" + ], + "effects": [ + { + "type": "modifyStrength", + "filter": "memory(bearer),inSkirmishAgainst(nazgul)", + "amount": 3 + }, + { + "type": "takeOffRing" + } + ] + } + } + }, "52_121": { "title": "*Gimli", "subtitle": "Dwarf of the Mountain-race", @@ -58,15 +171,27 @@ "resistance": 6, "signet": "frodo", "keyword": "damage+1", - "effects": { - "type": "modifier", - "modifier": { - "type": "modifyCost", - "filter": "underground,site", - "amount": -1 + "effects": [ + { + "type": "modifier", + "modifier": { + "type": "modifyCost", + "filter": "underground,site", + "amount": -1 + } + }, + { + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "amount": 1, + "condition": { + "type": "location", + "filter": "underground" + }, + "filter": "self" + } } - } - }, - - + ] + } } \ No newline at end of file diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set51/set03-errata.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set51/set03-errata.json index e8b63a883..ae7f0c940 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set51/set03-errata.json +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set51/set03-errata.json @@ -1,7 +1,73 @@ { - "53_42": { + "53_17": { + "title": "*Galadriel", + "subtitle": "Lady of the Golden Wood", + "culture": "elven", + "cost": 3, + "type": "ally", + "allyHome": "fellowship,6", + "race": "elf", + "strength": 3, + "vitality": 3, + "effects": [ + { + "type": "trigger", + "optional": true, + "trigger": { + "type": "startOfTurn" + }, + "effect": { + "type": "heal", + "filter": "another,elf" + } + }, + { + "type": "activated", + "phase": "fellowship", + "cost": { + "type": "exert", + "filter": "self", + "times": 2 + }, + "effect": { + "type": "playNextSite", + "filter": "forest" + } + } + ] + }, + "53_38": { + "title": "*Aragorn", + "subtitle": "Heir to the White City", + "culture": "Gondor", + "type": "companion", + "race": "Man", + "cost": 4, + "strength": 8, + "vitality": 4, + "resistance": 6, + "signet": "frodo", + "keyword": [ + "Ranger" + ], + "effects": { + "type": "trigger", + "trigger": { + "type": "moves" + }, + "condition": { + "type": "phase", + "phase": "fellowship" + }, + "effect": { + "type": "removeTwilight", + "amount": 1 + } + } + }, + "53_42": { "side": "free_people", - "cost": 0, + "cost": 1, "culture": "Gondor", "title": "*Horn of Boromir", "type": "possession", @@ -12,32 +78,76 @@ "cost": [ { "type": "exert", - "filter": "bearer", - "times": 1 + "filter": "bearer" }, { "type": "discard", - "filter": "self", - }, - + "filter": "self" + } ], - "effect":[ + "effect": [ { - "type": "modifyStrength", + "type": "spot", "filter": "choose(ally)", - "amount": 3, - "until": "start(regroup)", - "memorize": "summonedAlly" + "memorize": "chosenAlly" + }, + { + "type": "addModifier", + "modifier": { + "type": "modifyStrength", + "filter": "memory(chosenAlly)", + "amount": 3, + "until": "start(regroup)" + } }, { "type": "allyCanParticipateInArcheryFireAndSkirmishes", - "filter": "memory(summonedAlly)", + "filter": "memory(chosenAlly)", "until": "start(regroup)" } ] } }, - + "53_67": { + "title": "*The Palantir of Orthanc", + "culture": "isengard", + "cost": 0, + "type": "artifact", + "possession": "palantir", + "keyword": "support area", + "condition": { + "type": "canSpot", + "filter": "culture(isengard),minion" + }, + "effects": { + "type": "activated", + "phase": "shadow", + "cost": [ + { + "type": "removeTwilight", + "amount": 2 + }, + { + "type": "canSpot", + "count": 2, + "memorize": "culture(isengard),minion" + } + ], + "effect": [ + { + "type": "revealRandomCardsFromHand", + "forced": true, + "hand": "fp", + "count": 1, + "memorize": "revealedCard" + }, + { + "type": "putCardsFromHandOnTopOfDeck", + "filter": "choose(memory(revealedCard))" + } + ] + } + }, "53_68": { "side": "shadow", "site": 4, @@ -50,13 +160,6 @@ "title": "*Saruman", "type": "minion", "effects": [ - { - "type": "modifier", - "modifier": { - "type": "cantbeassignedtoskirmish", - "filter": "self" - } - }, { "type": "modifier", "modifier": { @@ -68,6 +171,27 @@ } } }, + { + "type": "modifier", + "modifier": { + "type": "cantbeassignedtoskirmish", + "filter": "self" + } + }, + { + "type": "activated", + "phase": "maneuver", + "cost": { + "type": "exert", + "filter": "self" + }, + "effect": { + "type": "addKeyword", + "filter": "choose(uruk-hai)", + "keyword": "fierce", + "until": "start(regroup)" + } + }, { "type": "activatedTrigger", "trigger": { @@ -76,73 +200,25 @@ }, "cost": { "type": "exert", - "filter": "self", - "times": 1 + "filter": "self" }, "effect": { "type": "preventWound", "filter": "choose(uruk-hai)" } - }, - { - "type": "activated", - "phase": "maneuver", - "cost": { - "type": "exert", - "filter": "self", - "times": 1 - }, - "effect": { - "type": "addKeyword", - "filter": "choose(uruk-hai)", - "keyword": "fierce", - "until": "start(regroup)" - } - }, + } ] }, - - "53_38": { - "side": "free_people", - "title": "*Aragorn", - "subtitle": "Heir to the White City", - "culture": "Gondor", - "type": "companion", - "race": "Man", - "cost": 4, - "strength": 8, - "vitality": 4, - "resistance": 6, - "signet": "frodo", - "keyword": [ - "Ranger", - ], - "effects": { - "type": "trigger", - "optional": false, - "trigger": { - "type": "movesfrom" - }, - "condition": { - "type": "phase", - "phase": "fellowship" - }, - "effect": { - "type": "removeTwilight", - "amount": 1 - } - } - }, - - "53_106": { "title": "*Bill the Pony", "culture": "Shire", "side": "free_people", "cost": 0, "type": "possession", - "possession": "Pony", + "keyword": [ + "stealth" + ], "target": "name(Sam)", "effects": [ { @@ -157,22 +233,62 @@ "type": "trigger", "trigger": { "type": "condition", - "condition": [ - { - "type": "location", - "filter": "underground" - }, - { - "type": "canSpot", - "filter": "self,attachedTo(companion)" - } - ] + "condition": { + "type": "location", + "filter": "underground" + } }, "effect": { "type": "discard", "filter": "self" } } - ] - }, + ] + }, + "53_108": { + "title": "Frying Pan", + "culture": "Shire", + "cost": 1, + "type": "possession", + "possession": "hand weapon", + "strength": 1, + "target": "hobbit", + "effects": { + "type": "activated", + "phase": "skirmish", + "cost": { + "type": "exert", + "filter": "bearer" + }, + "effect": { + "type": "wound", + "filter": "choose(orc,inSkirmishAgainst(bearer))" + } + } + }, + "53_113": { + "title": "*The Shire Countryside", + "culture": "shire", + "cost": 1, + "type": "condition", + "keyword": "support area", + "condition": { + "type": "canSpot", + "count": 2, + "filter": "culture(shire),companion" + }, + "effects": { + "type": "trigger", + "optional": true, + "trigger": { + "type": "removesBurden", + "filter": "not(hobbit)" + }, + "effect": { + "type": "heal", + "count": "0-2", + "filter": "choose(companion)" + } + } + } } \ No newline at end of file diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PlayNextSite.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PlayNextSite.java index 295da5510..0829dda5b 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PlayNextSite.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PlayNextSite.java @@ -2,10 +2,14 @@ package com.gempukku.lotro.cards.build.field.effect.appender; 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.cards.build.field.effect.EffectAppender; import com.gempukku.lotro.cards.build.field.effect.EffectAppenderProducer; +import com.gempukku.lotro.common.Filterable; +import com.gempukku.lotro.filters.Filter; +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.CostToEffectAction; @@ -16,23 +20,44 @@ import org.json.simple.JSONObject; public class PlayNextSite implements EffectAppenderProducer { @Override public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { - FieldUtils.validateAllowedFields(effectObject, "memorize"); - + FieldUtils.validateAllowedFields(effectObject, "filter", "memorize"); + final String filter = FieldUtils.getString(effectObject.get("filter"), "filter", "any"); final String memorize = FieldUtils.getString(effectObject.get("memorize"), "memorize"); + final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment); + return new DelayedAppender() { @Override public boolean isPlayableInFull(ActionContext actionContext) { final LotroGame game = actionContext.getGame(); - final int currentSiteNumber = game.getGameState().getCurrentSiteNumber(); - final PhysicalCard nextSite = game.getGameState().getSite(currentSiteNumber + 1); - return currentSiteNumber < 9 - && (nextSite == null || game.getModifiersQuerying().canReplaceSite(game, actionContext.getPerformingPlayer(), nextSite)); + final int nextSiteNumber = game.getGameState().getCurrentSiteNumber() + 1; + final PhysicalCard nextSite = game.getGameState().getSite(nextSiteNumber); + final Filterable filterable = filterableSource.getFilterable(actionContext); + final String playerId = actionContext.getPerformingPlayer(); + + if (nextSiteNumber > 9 || nextSiteNumber < 1) + return false; + + if (nextSite != null && !game.getModifiersQuerying().canReplaceSite(game, actionContext.getPerformingPlayer(), nextSite)) + return false; + + if (game.getFormat().isOrderedSites()) { + Filter printedSiteNumber = new Filter() { + @Override + public boolean accepts(LotroGame game, PhysicalCard physicalCard) { + return physicalCard.getBlueprint().getSiteNumber() == nextSiteNumber; + } + }; + return Filters.filter(game.getGameState().getAdventureDeck(playerId), game, Filters.and(filterable, printedSiteNumber)).size() > 0; + } else { + return Filters.filter(game.getGameState().getAdventureDeck(playerId), game, filterable).size() > 0; + } } @Override protected Effect createEffect(boolean cost, CostToEffectAction action, ActionContext actionContext) { - return new PlayNextSiteEffect(action, actionContext.getPerformingPlayer()) { + final Filterable filterable = filterableSource.getFilterable(actionContext); + return new PlayNextSiteEffect(action, actionContext.getPerformingPlayer(), filterable) { @Override protected void sitePlayedCallback(PhysicalCard site) { if (memorize != null) { 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 851190fb0..291c95543 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 @@ -41,6 +41,7 @@ public class FilterFactory { simpleFilters.put("unwounded", (actionContext) -> Filters.unwounded); simpleFilters.put("exhausted", (actionContext) -> Filters.exhausted); simpleFilters.put("inskirmish", (actionContext) -> Filters.inSkirmish); + simpleFilters.put("infierceskirmish", (actionContext) -> Filters.inFierceSkirmish); simpleFilters.put("inplay", (actionContext) -> Filters.inPlay); simpleFilters.put("notassignedtoskirmish", (actionContext) -> Filters.notAssignedToSkirmish); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/FreePeoplePlayerMayNotAssignCharacter.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/FreePeoplePlayerMayNotAssignCharacter.java new file mode 100644 index 000000000..6367b29ad --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/FreePeoplePlayerMayNotAssignCharacter.java @@ -0,0 +1,34 @@ +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.cards.build.field.effect.appender.MultiEffectAppender; +import com.gempukku.lotro.logic.modifiers.CantBeAssignedToSkirmishModifier; +import com.gempukku.lotro.logic.modifiers.FreePeoplePlayerMayNotAssignCharacterModifier; +import com.gempukku.lotro.logic.modifiers.Modifier; +import org.json.simple.JSONObject; + +public class FreePeoplePlayerMayNotAssignCharacter implements ModifierSourceProducer { + + @Override + public ModifierSource getModifierSource(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(effectObject, "filter", "condition"); + + final JSONObject[] conditionArray = FieldUtils.getObjectArray(effectObject.get("condition"), "condition"); + final String filter = FieldUtils.getString(effectObject.get("filter"), "filter"); + + final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment); + final Requirement[] requirements = environment.getRequirementFactory().getRequirements(conditionArray, environment); + + MultiEffectAppender result = new MultiEffectAppender(); + + return new ModifierSource() { + @Override + public Modifier getModifier(ActionContext actionContext) { + return new FreePeoplePlayerMayNotAssignCharacterModifier(actionContext.getSource(), + new RequirementCondition(requirements, actionContext), + filterableSource.getFilterable(actionContext)); + } + }; + } +} 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 076147941..680505bc7 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,6 +4,7 @@ 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; @@ -55,6 +56,7 @@ public class ModifierSourceFactory { modifierProducers.put("allycanparticipateinarcheryfireandskirmishes", new AllyCanParticipateInArcheryFireAndSkirmishes()); modifierProducers.put("cantlookorrevealhand", new CantLookOrRevealHand()); modifierProducers.put("cantbeassignedtoskirmish", new CantBeAssignedToSkirmish()); + modifierProducers.put("fpplayermaynotassigncharacter", new FreePeoplePlayerMayNotAssignCharacter()); } 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/trigger/RemovesBurden.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/RemovesBurden.java new file mode 100644 index 000000000..37a425982 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/RemovesBurden.java @@ -0,0 +1,33 @@ +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.logic.timing.TriggerConditions; +import org.json.simple.JSONObject; + +public class RemovesBurden 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 sourceFilter = environment.getFilterFactory().generateFilter(filter, environment); + + return new TriggerChecker() { + @Override + public boolean accepts(ActionContext actionContext) { + return TriggerConditions.removedBurden(actionContext.getGame(), actionContext.getEffectResult(), + sourceFilter.getFilterable(actionContext)); + } + + @Override + public boolean isBefore() { + 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 ba8cf0962..eb7a61b36 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 @@ -39,6 +39,7 @@ public class TriggerCheckerFactory { triggerCheckers.put("discardfromhand", new DiscardFromHand()); triggerCheckers.put("putsonring", new PutsOnRing()); triggerCheckers.put("addsburden", new AddsBurden()); + triggerCheckers.put("removesburden", new RemovesBurden()); triggerCheckers.put("addsthreat", new AddsThreat()); triggerCheckers.put("transferred", new Transferred()); triggerCheckers.put("killed", new Killed()); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java index 6513aa6cb..55deea50c 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java @@ -431,6 +431,18 @@ public class Filters { } }; + public static final Filter inFierceSkirmish = new Filter() { + @Override + public boolean accepts(LotroGame game, PhysicalCard physicalCard) { + Skirmish skirmish = game.getGameState().getSkirmish(); + if (skirmish != null && game.getGameState().isFierceSkirmishes()) { + return (skirmish.getFellowshipCharacter() == physicalCard) + || skirmish.getShadowCharacters().contains(physicalCard); + } + return false; + } + }; + public static final Filter inPlay = new Filter() { @Override public boolean accepts(LotroGame game, PhysicalCard physicalCard) { diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/PlayNextSiteEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/PlayNextSiteEffect.java index b792bb307..c8ad311a9 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/PlayNextSiteEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/PlayNextSiteEffect.java @@ -1,5 +1,6 @@ package com.gempukku.lotro.logic.effects; +import com.gempukku.lotro.common.Filterable; import com.gempukku.lotro.game.state.LotroGame; import com.gempukku.lotro.logic.timing.Action; @@ -8,6 +9,10 @@ public class PlayNextSiteEffect extends PlaySiteEffect { super(action, playerId, null, 0); } + public PlayNextSiteEffect(Action action, String playerId, Filterable... extraSiteFilters) { + super(action, playerId, null, 0, extraSiteFilters); + } + @Override protected int getSiteNumberToPlay(LotroGame game) { return game.getGameState().getCurrentSiteNumber() + 1; diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/TriggerConditions.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/TriggerConditions.java index d7c45f41e..a89701c00 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/TriggerConditions.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/TriggerConditions.java @@ -108,6 +108,14 @@ public class TriggerConditions { return false; } + public static boolean removedBurden(LotroGame game, EffectResult effectResult, Filterable... sourceFilters) { + if (effectResult.getType() == EffectResult.Type.REMOVE_BURDEN) { + RemoveBurdenResult burdenResult = (RemoveBurdenResult) effectResult; + return (Filters.and(sourceFilters).accepts(game, burdenResult.getSource())); + } + return false; + } + public static boolean addedThreat(LotroGame game, EffectResult effectResult, Filterable... sourceFilters) { if (effectResult.getType() == EffectResult.Type.ADD_THREAT) { AddThreatResult burdenResult = (AddThreatResult) effectResult;