From 7f056d4d994719cb0e68bf8812e9b76da092a1c1 Mon Sep 17 00:00:00 2001 From: Christian 'ketura' McCarty Date: Wed, 16 Apr 2025 23:56:38 -0500 Subject: [PATCH] Implementing Legacy Ruling #2: The last removed character from a skirmish counts as a loser --- .../gempukku/lotro/game/state/Skirmish.java | 4 +- .../logic/effects/ResolveSkirmishEffect.java | 13 ++++ .../official/set12/Card_12_132_Tests.java | 71 ++++++++++++++++--- 3 files changed, 76 insertions(+), 12 deletions(-) diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/Skirmish.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/Skirmish.java index ca5a529b9..b5e1b5014 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/Skirmish.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/Skirmish.java @@ -3,7 +3,7 @@ package com.gempukku.lotro.game.state; import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.logic.modifiers.evaluator.Evaluator; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.Set; public class Skirmish { @@ -14,7 +14,7 @@ public class Skirmish { private Evaluator _fpStrengthOverrideEvaluator; private Evaluator _shadowStrengthOverrideEvaluator; - private final Set _removedFromSkirmish = new HashSet<>(); + private final Set _removedFromSkirmish = new LinkedHashSet<>(); public Skirmish(PhysicalCard fellowshipCharacter, Set shadowCharacters) { _fellowshipCharacter = fellowshipCharacter; diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/ResolveSkirmishEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/ResolveSkirmishEffect.java index 440915d3f..77e4d183e 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/ResolveSkirmishEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/ResolveSkirmishEffect.java @@ -78,6 +78,7 @@ public class ResolveSkirmishEffect extends AbstractEffect { var shadow = skirmish.getShadowCharacters(); var freeps = fpList(skirmish.getFellowshipCharacter()); + var removed = skirmish.getRemovedFromSkirmish(); Set involving = new HashSet<>(); involving.addAll(freeps); @@ -125,10 +126,22 @@ public class ResolveSkirmishEffect extends AbstractEffect { for (PhysicalCard loser : losers) { game.getActionsEnvironment().emitEffectResult(new CharacterLostSkirmishResult(skirmishType, loser, involving)); } + // Legacy Ruling #2: The final removed character from a skirmish counts as a loser + // https://wiki.lotrtcgpc.net/wiki/Legacy_Ruling_2 + if(losers.isEmpty()) { + PhysicalCard finalRemoved = null; + for(var card : removed) { + finalRemoved = card; + } + if(finalRemoved != null) { + game.getActionsEnvironment().emitEffectResult(new CharacterLostSkirmishResult(skirmishType, finalRemoved, involving)); + } + } for (PhysicalCard winner : winners) { game.getActionsEnvironment().emitEffectResult(new CharacterWonSkirmishResult(skirmishType, winner, involving)); } + return new FullEffectResult(true); } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set12/Card_12_132_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set12/Card_12_132_Tests.java index 1a5559442..8733270b2 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set12/Card_12_132_Tests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set12/Card_12_132_Tests.java @@ -17,8 +17,10 @@ public class Card_12_132_Tests return new GenericCardTestHelper( new HashMap<>() {{ - put("card", "12_132"); - // put other cards in here as needed for the test case + put("fury", "12_132"); + put("merry", "4_310"); + + put("savage", "1_151"); }}, GenericCardTestHelper.FellowshipSites, GenericCardTestHelper.FOTRFrodo, @@ -38,12 +40,13 @@ public class Card_12_132_Tests * Twilight Cost: 2 * Type: Condition * Subtype: Support area - * Game Text: Each time a [shire] companion loses a skirmish, add a [shire] token here.
Skirmish: Remove a [shire] token from here to make a [shire] companion strength +1. + * Game Text: Each time a [shire] companion loses a skirmish, add a [shire] token here. + * Skirmish: Remove a [shire] token from here to make a [shire] companion strength +1. */ var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); + var card = scn.GetFreepsCard("fury"); assertEquals("Sudden Fury", card.getBlueprint().getTitle()); assertNull(card.getBlueprint().getSubtitle()); @@ -55,17 +58,65 @@ public class Card_12_132_Tests assertEquals(2, card.getBlueprint().getTwilightCost()); } - // Uncomment any @Test markers below once this is ready to be used - //@Test - public void SuddenFuryTest1() throws DecisionResultInvalidException, CardNotFoundException { + @Test + public void SuddenFuryAddsATokenWhenAHobbitLosesAStandardSkirmish() throws DecisionResultInvalidException, CardNotFoundException { //Pre-game setup var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); - scn.FreepsMoveCardToHand(card); + var fury = scn.GetFreepsCard("fury"); + var merry = scn.GetFreepsCard("merry"); + scn.FreepsMoveCardToSupportArea(fury); + scn.FreepsMoveCharToTable(merry); + + var savage = scn.GetShadowCard("savage"); + scn.ShadowMoveCharToTable(savage); scn.StartGame(); - scn.FreepsPlayCard(card); + + scn.SkipToAssignments(); + scn.FreepsAssignAndResolve(merry, savage); + + assertEquals(0, scn.GetCultureTokensOn(fury)); + scn.PassSkirmishActions(); + scn.FreepsResolveRuleFirst(); + assertEquals(1, scn.GetCultureTokensOn(fury)); + } + + @Test + public void SuddenFuryAddsATokenWhenAHobbitIsTheLastFreepsSkirmisherAndIsRemoved() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var fury = scn.GetFreepsCard("fury"); + var merry = scn.GetFreepsCard("merry"); + scn.FreepsMoveCardToSupportArea(fury); + scn.FreepsMoveCharToTable(merry); + + var savage = scn.GetShadowCard("savage"); + scn.ShadowMoveCharToTable(savage); + + scn.StartGame(); + + scn.SkipToAssignments(); + scn.FreepsAssignAndResolve(merry, savage); + + assertEquals(0, scn.GetCultureTokensOn(fury)); + scn.FreepsUseCardAction(merry); + scn.ShadowChooseNo(); + scn.FreepsResolveRuleFirst(); + assertEquals(1, scn.GetCultureTokensOn(fury)); + } + + @Test + public void SuddenFuryDoesNotAddTokenWhenHobbitRemovedBeforeSkirmishBegins() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var fury = scn.GetFreepsCard("fury"); + scn.FreepsMoveCardToHand(fury); + + scn.StartGame(); + scn.FreepsPlayCard(fury); assertEquals(2, scn.GetTwilight()); }