Merge pull request #489 from PlayersCouncil/bug/corsair-boatswain

Fixing Corsair Boatswain being a little too inclusive
This commit is contained in:
Christian McCarty
2025-02-09 15:32:51 -06:00
committed by GitHub
4 changed files with 112 additions and 17 deletions

View File

@@ -81,7 +81,7 @@
} }
effect: { effect: {
type: playCardFromDrawDeck type: playCardFromDrawDeck
select: choose(support area,possession) select: choose(culture(raider),support area,possession)
showAll: true showAll: true
shuffle: true shuffle: true
} }

View File

@@ -248,7 +248,7 @@ public class DefaultLotroGame implements LotroGame {
if (_losers.size() + 1 == _allPlayers.size()) { if (_losers.size() + 1 == _allPlayers.size()) {
List<String> allPlayers = new LinkedList<>(_allPlayers); List<String> allPlayers = new LinkedList<>(_allPlayers);
allPlayers.removeAll(_losers.keySet()); allPlayers.removeAll(_losers.keySet());
gameWon(allPlayers.get(0), "Last remaining player in game"); gameWon(allPlayers.getFirst(), "Last remaining player in game");
} }
} }
} }

View File

@@ -1,10 +1,7 @@
package com.gempukku.lotro.cards.official.set04; package com.gempukku.lotro.cards.official.set04;
import com.gempukku.lotro.cards.GenericCardTestHelper; import com.gempukku.lotro.cards.GenericCardTestHelper;
import com.gempukku.lotro.common.CardType; import com.gempukku.lotro.common.*;
import com.gempukku.lotro.common.Culture;
import com.gempukku.lotro.common.Side;
import com.gempukku.lotro.common.Timeword;
import com.gempukku.lotro.game.CardNotFoundException; import com.gempukku.lotro.game.CardNotFoundException;
import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException;
import org.junit.Test; import org.junit.Test;
@@ -20,8 +17,13 @@ public class Card_04_032_Tests
return new GenericCardTestHelper( return new GenericCardTestHelper(
new HashMap<>() new HashMap<>()
{{ {{
put("card", "4_32"); put("ravage", "4_32");
// put other cards in here as needed for the test case put("brigand", "4_10");
put("weary", "4_212");
put("sword", "1_299");
put("coat", "2_105");
put("stone", "1_314");
}}, }},
GenericCardTestHelper.FellowshipSites, GenericCardTestHelper.FellowshipSites,
GenericCardTestHelper.FOTRFrodo, GenericCardTestHelper.FOTRFrodo,
@@ -46,7 +48,7 @@ public class Card_04_032_Tests
var scn = GetScenario(); var scn = GetScenario();
var card = scn.GetFreepsCard("card"); var card = scn.GetFreepsCard("ravage");
assertEquals("Ravage the Defeated", card.getBlueprint().getTitle()); assertEquals("Ravage the Defeated", card.getBlueprint().getTitle());
assertNull(card.getBlueprint().getSubtitle()); assertNull(card.getBlueprint().getSubtitle());
@@ -58,18 +60,50 @@ public class Card_04_032_Tests
assertEquals(1, card.getBlueprint().getTwilightCost()); assertEquals(1, card.getBlueprint().getTwilightCost());
} }
// Uncomment any @Test markers below once this is ready to be used @Test
//@Test public void RavagetheDefeatedDiscardsFreepsCardsAttachedToLoser() throws DecisionResultInvalidException, CardNotFoundException {
public void RavagetheDefeatedTest1() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup //Pre-game setup
var scn = GetScenario(); var scn = GetScenario();
var card = scn.GetFreepsCard("card"); //A freeps possession, artifact, and condition
scn.FreepsMoveCardToHand(card); var sword = scn.GetFreepsCard("sword");
var coat = scn.GetFreepsCard("coat");
var stone = scn.GetFreepsCard("stone");
var frodo = scn.GetRingBearer();
scn.AttachCardsTo(frodo, sword, coat, stone);
var ravage = scn.GetShadowCard("ravage");
var brigand = scn.GetShadowCard("brigand");
var weary = scn.GetShadowCard("weary");
scn.ShadowMoveCardToHand(ravage);
scn.AttachCardsTo(frodo, weary);
scn.ShadowMoveCharToTable(brigand);
scn.StartGame(); scn.StartGame();
scn.FreepsPlayCard(card); scn.SkipToAssignments();
scn.FreepsAssignToMinions(frodo, brigand);
scn.FreepsResolveSkirmish(frodo);
assertEquals(1, scn.GetTwilight()); assertEquals(Zone.ATTACHED, sword.getZone());
assertEquals(frodo, sword.getAttachedTo());
assertEquals(Zone.ATTACHED, coat.getZone());
assertEquals(frodo, coat.getAttachedTo());
assertEquals(Zone.ATTACHED, stone.getZone());
assertEquals(frodo, stone.getAttachedTo());
assertEquals(Zone.ATTACHED, weary.getZone());
assertEquals(frodo, weary.getAttachedTo());
scn.FreepsPassCurrentPhaseAction();
scn.ShadowPassCurrentPhaseAction();
scn.FreepsDeclineOptionalTrigger(); //One Ring converting wound on frodo
assertTrue(scn.ShadowPlayAvailable(ravage));
scn.ShadowPlayCard(ravage);
assertEquals(Zone.DISCARD, sword.getZone());
assertEquals(Zone.DISCARD, coat.getZone());
assertEquals(Zone.DISCARD, stone.getZone());
assertEquals(Zone.ATTACHED, weary.getZone());
assertEquals(frodo, weary.getAttachedTo());
} }
} }

View File

@@ -20,8 +20,9 @@ public class Card_01_311_ErrataTests
put("rosie", "1_309"); put("rosie", "1_309");
put("proudfoot", "1_301"); put("proudfoot", "1_301");
put("gaffer", "1_291"); put("gaffer", "1_291");
put("stealth", "1_298");
put("orc", "1_272"); put("twk", "1_237");
}}, }},
GenericCardTestHelper.FellowshipSites, GenericCardTestHelper.FellowshipSites,
GenericCardTestHelper.FOTRFrodo, GenericCardTestHelper.FOTRFrodo,
@@ -167,4 +168,64 @@ public class Card_01_311_ErrataTests
assertSame(scn.GetRingBearer(), sam); assertSame(scn.GetRingBearer(), sam);
assertFalse(scn.GameIsFinished()); assertFalse(scn.GameIsFinished());
} }
@Test
public void RBOverwhelmMakesSamTheRB() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
var frodo = scn.GetRingBearer();
var sam = scn.GetFreepsCard("sam");
scn.FreepsMoveCharToTable(sam);
var twk = scn.GetShadowCard("twk");
scn.ShadowMoveCharToTable(twk);
scn.StartGame();
scn.SkipToAssignments();
scn.FreepsAssignToMinions(frodo, twk);
scn.FreepsResolveSkirmish(frodo);
scn.PassCurrentPhaseActions();
assertNotSame(scn.GetRingBearer(), sam);
assertTrue(scn.FreepsHasOptionalTriggerAvailable());
scn.FreepsAcceptOptionalTrigger();
assertSame(scn.GetRingBearer(), sam);
assertFalse(scn.GameIsFinished());
}
@Test
public void RBFierceOverwhelmMakesSamTheRB() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
var frodo = scn.GetRingBearer();
var sam = scn.GetFreepsCard("sam");
var stealth = scn.GetFreepsCard("stealth");
scn.FreepsMoveCharToTable(sam);
scn.FreepsMoveCardToHand(stealth);
var twk = scn.GetShadowCard("twk");
scn.ShadowMoveCharToTable(twk);
scn.StartGame();
scn.SkipToAssignments();
scn.FreepsAssignToMinions(sam, twk);
scn.FreepsResolveSkirmish(sam);
scn.FreepsPlayCard(stealth);
//Fierce
scn.PassCurrentPhaseActions();
scn.FreepsAssignToMinions(frodo, twk);
scn.FreepsResolveSkirmish(frodo);
scn.PassCurrentPhaseActions();
assertNotSame(scn.GetRingBearer(), sam);
assertTrue(scn.FreepsHasOptionalTriggerAvailable());
scn.FreepsAcceptOptionalTrigger();
assertSame(scn.GetRingBearer(), sam);
assertFalse(scn.GameIsFinished());
}
} }