From 9096476b73d7387a8cf65251ed78226759cabc2f Mon Sep 17 00:00:00 2001 From: Christian 'ketura' McCarty Date: Fri, 6 Dec 2024 19:09:49 -0600 Subject: [PATCH] Fixed Fanatic not triggering --- .../unofficial/pc/setV02/V2-Isengard.hjson | 5 +- .../effect/KilledTriggerEffectProcessor.java | 11 ++- .../field/effect/filter/FilterFactory.java | 5 ++ .../com/gempukku/lotro/filters/Filters.java | 12 +++ .../pc/vsets/set_v02/Card_V2_020_Tests.java | 77 ++++++++++++++++--- 5 files changed, 96 insertions(+), 14 deletions(-) diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/V2-Isengard.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/V2-Isengard.hjson index 40aea8e47..af48dfb7c 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/V2-Isengard.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/V2-Isengard.hjson @@ -139,9 +139,10 @@ { type: KilledTrigger optional: true + player: owner requires: { type: CanSpot - filter: self,InSkirmish + filter: RecentlyInSkirmishAgainst(self) } cost: { type: RemoveCultureTokens @@ -151,7 +152,7 @@ } effect: { type: wound - select: choose(companion,inSkirmishAgainst(self)) + select: choose(companion,RecentlyInSkirmishAgainst(self)) } } ] diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/KilledTriggerEffectProcessor.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/KilledTriggerEffectProcessor.java index 3271e51bf..4fdbe24ba 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/KilledTriggerEffectProcessor.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/KilledTriggerEffectProcessor.java @@ -3,18 +3,27 @@ package com.gempukku.lotro.cards.build.field.effect; import com.gempukku.lotro.cards.build.BuiltLotroCardBlueprint; import com.gempukku.lotro.cards.build.CardGenerationEnvironment; import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; +import com.gempukku.lotro.cards.build.PlayerSource; import com.gempukku.lotro.cards.build.field.EffectProcessor; import com.gempukku.lotro.cards.build.field.FieldUtils; +import com.gempukku.lotro.cards.build.field.effect.appender.resolver.PlayerResolver; import org.json.simple.JSONObject; public class KilledTriggerEffectProcessor implements EffectProcessor { @Override public void processEffect(JSONObject value, BuiltLotroCardBlueprint blueprint, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { - FieldUtils.validateAllowedFields(value, "optional", "requires", "cost", "effect"); + FieldUtils.validateAllowedFields(value, "optional", "player", "requires", "cost", "effect"); final boolean optional = FieldUtils.getBoolean(value.get("optional"), "optional", false); + final String player = FieldUtils.getString(value.get("player"), "player"); + PlayerSource playerSource = (player != null) ? PlayerResolver.resolvePlayer(player) : null; + DefaultActionSource triggerActionSource = new DefaultActionSource(); + if (playerSource != null) { + triggerActionSource.setPlayingPlayer(playerSource); + } + EffectUtils.processRequirementsCostsAndEffects(value, environment, triggerActionSource); if (optional) blueprint.setKilledOptionalTriggerAction(triggerActionSource); 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 8f87d1e2e..24d8b551f 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 @@ -414,6 +414,11 @@ public class FilterFactory { final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(parameter, environment); return (actionContext) -> Filters.inSkirmishAgainst(filterableSource.getFilterable(actionContext)); }); + parameterFilters.put("recentlyinskirmishagainst", + (parameter, environment) -> { + final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(parameter, environment); + return (actionContext) -> Filters.recentlyInSkirmishAgainst(filterableSource.getFilterable(actionContext)); + }); parameterFilters.put("inskirmishagainstatleast", (parameter, environment) -> { String[] split = parameter.split(",", 2); 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 3d3d9d6fc..6ffc0f5bc 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 @@ -317,6 +317,18 @@ public class Filters { }; } + public static Filter recentlyInSkirmishAgainst(final Filterable... againstFilter) { + return (game, physicalCard) -> { + Skirmish skirmish = game.getGameState().getSkirmish(); + if (skirmish != null && skirmish.getFellowshipCharacter() != null) { + return (skirmish.getFellowshipCharacter() == physicalCard && (Filters.acceptsAny(game, skirmish.getShadowCharacters(), Filters.and(againstFilter)) || Filters.acceptsAny(game, skirmish.getRemovedFromSkirmish(), Filters.and(againstFilter)))) + || (skirmish.getShadowCharacters().contains(physicalCard) && Filters.and(againstFilter).accepts(game, skirmish.getFellowshipCharacter())); + + } + return false; + }; + } + public static Filter canBeReturnedToHand(final PhysicalCard source) { return (game, physicalCard) -> game.getModifiersQuerying().canBeReturnedToHand(game, physicalCard, source); } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_020_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_020_Tests.java index f13918ddf..19852fba5 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_020_Tests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_020_Tests.java @@ -3,7 +3,6 @@ package com.gempukku.lotro.cards.unofficial.pc.vsets.set_v02; import com.gempukku.lotro.cards.GenericCardTestHelper; import com.gempukku.lotro.common.*; import com.gempukku.lotro.game.CardNotFoundException; -import com.gempukku.lotro.game.PhysicalCardImpl; import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; import org.junit.Test; @@ -18,8 +17,11 @@ public class Card_V2_020_Tests return new GenericCardTestHelper( new HashMap<>() {{ - put("card", "102_20"); - // put other cards in here as needed for the test case + put("fanatic", "102_20"); + put("savage", "1_151"); + put("machine", "5_60"); + + put("treebeard", "10_18"); }}, GenericCardTestHelper.FellowshipSites, GenericCardTestHelper.FOTRFrodo, @@ -49,7 +51,7 @@ public class Card_V2_020_Tests var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); + var card = scn.GetFreepsCard("fanatic"); assertEquals("Berserk Fanatic", card.getBlueprint().getTitle()); assertNull(card.getBlueprint().getSubtitle()); @@ -66,18 +68,71 @@ public class Card_V2_020_Tests assertEquals(5, card.getBlueprint().getSiteNumber()); } - // Uncomment any @Test markers below once this is ready to be used - //@Test - public void BerserkFanaticTest1() throws DecisionResultInvalidException, CardNotFoundException { + @Test + public void BerserkFanaticIsStrenghtPlus1ForEachWoundOnEachCharacterInSkirmish() throws DecisionResultInvalidException, CardNotFoundException { //Pre-game setup var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); - scn.FreepsMoveCardToHand(card); + var fanatic = scn.GetShadowCard("fanatic"); + var savage = scn.GetShadowCard("savage"); + var machine = scn.GetShadowCard("machine"); + scn.ShadowMoveCharToTable(fanatic, savage); + scn.ShadowMoveCardToSupportArea(machine); + + var frodo = scn.GetRingBearer(); scn.StartGame(); - scn.FreepsPlayCard(card); - assertEquals(3, scn.GetTwilight()); + scn.addWounds(frodo, 1); + scn.addWounds(fanatic, 1); + scn.addWounds(savage, 1); + + //not in skirmish, should be base + assertEquals(8, scn.getStrength(fanatic)); + + scn.SkipToAssignments(); + scn.FreepsDeclineAssignments(); + scn.ShadowAssignToMinions(frodo, fanatic, savage); + scn.FreepsResolveSkirmish(frodo); + + //Base strength of 8, +1 strength for the single wound on each of itself, the savage, and frodo + assertEquals(11, scn.getStrength(fanatic)); + } + + @Test + public void BerserkFanaticDyingInSkirmishCanRemove2TokensFromMachineToWoundSkirmisher() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var fanatic = scn.GetShadowCard("fanatic"); + var machine = scn.GetShadowCard("machine"); + scn.ShadowMoveCharToTable(fanatic); + scn.ShadowMoveCardToSupportArea(machine); + + var treebeard = scn.GetFreepsCard("treebeard"); + scn.FreepsMoveCharToTable(treebeard); + + scn.StartGame(); + + scn.addWounds(fanatic, 2); + scn.AddTokensToCard(machine, 2); + + scn.SkipToAssignments(); + scn.FreepsAssignToMinions(treebeard, fanatic); + scn.FreepsResolveSkirmish(treebeard); + + assertEquals(1, scn.GetVitality(fanatic)); + assertEquals(0, scn.GetWoundsOn(treebeard)); + assertEquals(2, scn.GetCultureTokensOn(machine)); + assertEquals(Zone.SHADOW_CHARACTERS, fanatic.getZone()); + + scn.PassCurrentPhaseActions(); + + assertTrue(scn.ShadowHasOptionalTriggerAvailable()); + scn.ShadowAcceptOptionalTrigger(); + + assertEquals(1, scn.GetWoundsOn(treebeard)); + assertEquals(0, scn.GetCultureTokensOn(machine)); + assertEquals(Zone.DISCARD, fanatic.getZone()); } }