diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/errata/set11-errata-playtest.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/errata/set11-errata-playtest.json new file mode 100644 index 000000000..3ff05a29a --- /dev/null +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/errata/set11-errata-playtest.json @@ -0,0 +1,108 @@ +{ + "81_31": { + "title": "Final Account", + "culture": "gandalf", + "cost": 1, + "type": "event", + "keyword": "fellowship", + "effects": { + "type": "event", + "cost": [ + { + "type": "exert", + "filter": "choose(culture(gandalf),wizard)" + }, + { + "type": "discardFromHand", + "forced": false + } + ], + "effect": { + "type": "putCardsFromDiscardIntoHand", + "filter": "choose(side(shadow))" + } + } + }, + "81_100": { + "title": "Strange-looking Men", + "culture": "men", + "cost": 4, + "type": "minion", + "race": "man", + "strength": 10, + "vitality": 2, + "site": 4, + "effects": { + "type": "trigger", + "optional": true, + "trigger": { + "type": "startOfPhase", + "phase": "maneuver" + }, + "cost": { + "type": "exert", + "filter": "self" + }, + "effect": { + "type": "transfer", + "filter": "choose(or(possession,condition)),attachedTo(character)", + "where": "choose(any)", + "checkTarget": true + } + } + }, + "81_114": { + "title": "*Demoralized", + "culture": "orc", + "cost": 1, + "type": "condition", + "keyword": "support area", + "condition": { + "type": "canSpot", + "filter": "culture(orc),minion" + }, + "effects": { + "type": "trigger", + "trigger": { + "type": "exerts", + "filter": "companion" + }, + "effect": { + "type": "addTwilight", + "amount": { + "type": "condition", + "condition": { + "type": "canSpot", + "filter": "companion", + "count": 6 + }, + "true": 2, + "false": 1 + } + } + } + }, + "81_132": { + "title": "Orkish Smith", + "culture": "orc", + "cost": 2, + "type": "minion", + "race": "orc", + "strength": 6, + "vitality": 1, + "site": 4, + "effects": { + "type": "trigger", + "optional": true, + "trigger": { + "type": "played", + "filter": "self" + }, + "effect": { + "type": "shuffleCardsFromDiscardIntoDrawDeck", + "filter": "choose(culture(orc),condition)", + "count": "0-2" + } + } + } +} diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/errata/set13-errata-playtest.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/errata/set13-errata-playtest.json new file mode 100644 index 000000000..ca76995ad --- /dev/null +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/errata/set13-errata-playtest.json @@ -0,0 +1,33 @@ +{ + "83_188": { + "title": "Courtyard Parapet", + "type": "site", + "block": "Shadows and onwards", + "cost": 0, + "keyword": "Dwelling", + "direction": "left", + "effects": [ + { + "type": "trigger", + "trigger": { + "type": "movesTo", + "filter": "self" + }, + "condition": { + "type": "location", + "filter": "siteinregion2" + }, + "cost": { + "type": "discardFromHand", + "hand": "shadowPlayer", + "player": "shadowPlayer", + "forced": false, + "count": 2 + }, + "effect": { + "type": "addBurdens" + } + } + ] + } +} diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/errata/set15-errata-playtest.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/errata/set15-errata-playtest.json new file mode 100644 index 000000000..94ec53e59 --- /dev/null +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/errata/set15-errata-playtest.json @@ -0,0 +1,45 @@ +{ + "85_64": { + "title": "*Madril", + "subtitle": "Defender of Osgiliath", + "culture": "gondor", + "cost": 2, + "type": "companion", + "race": "man", + "strength": 5, + "vitality": 3, + "resistance": 6, + "keyword": [ + "Ranger", + "Hunter" + ], + "effects": [ + { + "type": "modifyOwnCost", + "condition": { + "type": "canSpot", + "count": 2, + "filter": "culture(gondor),ranger" + }, + "amount": -2 + }, + { + "type": "trigger", + "optional": true, + "trigger": { + "type": "startOfPhase", + "phase": "maneuver" + }, + "condition": { + "type": "canSpotThreats" + }, + "effect": { + "type": "modifySiteNumber", + "filter": "all(minion)", + "amount": 1, + "until": "start(regroup)" + } + } + ] + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/Transfer.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/Transfer.java index 2d4baba24..ceac09a90 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/Transfer.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/Transfer.java @@ -16,6 +16,7 @@ import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.logic.actions.CostToEffectAction; import com.gempukku.lotro.logic.effects.TransferPermanentEffect; import com.gempukku.lotro.logic.timing.Effect; +import com.gempukku.lotro.logic.timing.RuleUtils; import org.json.simple.JSONObject; import java.util.Collection; @@ -25,10 +26,11 @@ import java.util.List; public class Transfer implements EffectAppenderProducer { @Override public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { - FieldUtils.validateAllowedFields(effectObject, "filter", "where"); + FieldUtils.validateAllowedFields(effectObject, "filter", "where", "checkTarget"); final String filter = FieldUtils.getString(effectObject.get("filter"), "filter"); final String where = FieldUtils.getString(effectObject.get("where"), "where"); + final boolean checkTarget = FieldUtils.getBoolean(effectObject.get("checkTarget"), "checkTarget", false); MultiEffectAppender result = new MultiEffectAppender(); @@ -44,6 +46,10 @@ public class Transfer implements EffectAppenderProducer { // Can't be transferred to card it's already attached to if (transferredCard.getAttachedTo() == physicalCard) return false; + // Optionally check target against original target filter + if (checkTarget && !RuleUtils.getFullValidTargetFilter(transferredCard.getOwner(), game, transferredCard).accepts(game, physicalCard)) + return false; + return actionContext.getGame().getModifiersQuerying().canHaveTransferredOn(game, transferredCard, physicalCard); }, actionContext -> Filters.any, ValueResolver.resolveEvaluator(1, environment), "_temp2", "you", "Choose cards to transfer to", environment)); 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 406c318c8..41de133f4 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 @@ -67,6 +67,8 @@ public class FilterFactory { (actionContext -> Filters.siteNumber(actionContext.getGame().getGameState().getCurrentSiteNumber()))); simpleFilters.put("siteincurrentregion", (actionContext) -> Filters.siteInCurrentRegion); + simpleFilters.put("siteinregion2", + (actionContext) -> Filters.and(CardType.SITE, Filters.region(2))); simpleFilters.put("idinstored", (actionContext -> new Filter() {