Fixed assignment abilities causing issues with defender +1. Fixed Shadow assignment abilities making the Shadow player re-assign those minions later (which causes an error).

This commit is contained in:
Christian 'ketura' McCarty
2024-12-17 00:13:56 -06:00
parent f3cf5bf79c
commit 13ff6be1d0
5 changed files with 76 additions and 22 deletions

View File

@@ -256,7 +256,8 @@ public class Filters {
(Filter) (game, physicalCard) -> {
if (!ignoreExistingAssignments) {
boolean assignedToSkirmish = Filters.assignedToSkirmish.accepts(game, physicalCard);
if (assignedToSkirmish)
int defender = game.getModifiersQuerying().getKeywordCount(game, physicalCard, Keyword.DEFENDER);
if (assignedToSkirmish && defender == 0)
return false;
}
return game.getModifiersQuerying().canBeAssignedToSkirmish(game, assignedBySide, physicalCard);

View File

@@ -36,8 +36,8 @@ public class ShadowPlayerAssignsHisMinionsGameProcess implements GameProcess {
GameState gameState = game.getGameState();
Filter minionFilter = Filters.and(CardType.MINION, Filters.owner(_playerId), Filters.in(_leftoverMinions));
final Collection<PhysicalCard> minions = Filters.filterActive(game, minionFilter, Filters.assignableToSkirmish(Side.SHADOW, true, false));
if (minions.size() > 0) {
final Collection<PhysicalCard> minions = Filters.filterActive(game, minionFilter, Filters.assignableToSkirmish(Side.SHADOW, false, false));
if (!minions.isEmpty()) {
final Collection<PhysicalCard> freePeopleTargets =
Filters.filterActive(game,
Filters.and(

View File

@@ -265,13 +265,8 @@ public abstract class AbstractAtTest {
}
public void validateContents(String[] array1, String[] array2) {
if (array1.length != array2.length)
fail("Array sizes differ");
List<String> values = new ArrayList<>(Arrays.asList(array1));
for (String s : array2) {
if (!values.remove(s))
fail("Arrays contents differ");
}
assertEquals("Array sizes differ", array1.length, array2.length);
assertArrayEquals("Array contents differ", Arrays.stream(array1).sorted().toArray(), Arrays.stream(array2).sorted().toArray());
}
public String[] toCardIdArray(PhysicalCard... cards) {

View File

@@ -19,7 +19,7 @@ public class Card_01_262_Tests
{{
put("assassin", "1_262");
put("runner", "1_178");
put("sam", "1_310");
put("sam", "2_114");
}},
GenericCardTestHelper.FellowshipSites,
GenericCardTestHelper.FOTRFrodo,
@@ -96,4 +96,47 @@ public class Card_01_262_Tests
// is unassigned, which isn't right.
scn.FreepsResolveSkirmish(sam);
}
@Test
public void OrcAssassinDoesNotPreventDefenderBonusFromBeingUsed() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
var assassin = scn.GetShadowCard("assassin");
var runner = scn.GetShadowCard("runner");
scn.ShadowMoveCharToTable(assassin, runner);
var frodo = scn.GetRingBearer();
var sam = scn.GetFreepsCard("sam");
scn.FreepsMoveCharToTable(sam);
scn.StartGame();
scn.SkipToPhase(Phase.MANEUVER);
scn.FreepsUseCardAction(sam);
scn.SkipToPhase(Phase.ASSIGNMENT);
scn.FreepsPassCurrentPhaseAction();
assertTrue(scn.ShadowActionAvailable(assassin));
scn.ShadowUseCardAction(assassin);
assertEquals(2, scn.GetFreepsCardChoiceCount());
assertTrue(scn.CanBeAssigned(sam));
scn.FreepsChooseCard(sam);
assertTrue(scn.IsCharAssigned(sam));
assertTrue(scn.IsCharAssigned(assassin));
scn.PassCurrentPhaseActions();
assertTrue(scn.hasKeyword(sam, Keyword.DEFENDER));
assertEquals(1, scn.GetKeywordCount(sam, Keyword.DEFENDER));
scn.CanBeAssigned(sam);
scn.FreepsAssignToMinions(sam, runner);
assertTrue(scn.IsCharAssigned(sam));
assertTrue(scn.IsCharAssigned(assassin));
assertTrue(scn.IsCharAssigned(runner));
// If beginning skirmishes now fails, then there is some issue with defender, which isn't right
scn.FreepsResolveSkirmish(sam);
}
}

View File

@@ -3,7 +3,6 @@ package com.gempukku.lotro.cards.official.set03;
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_03_069_Tests
return new GenericCardTestHelper(
new HashMap<>()
{{
put("card", "3_69");
// put other cards in here as needed for the test case
put("saruman", "3_69");
put("savage", "1_151");
put("sam", "2_114");
}},
GenericCardTestHelper.FellowshipSites,
GenericCardTestHelper.FOTRFrodo,
@@ -47,7 +49,7 @@ public class Card_03_069_Tests
var scn = GetScenario();
var card = scn.GetFreepsCard("card");
var card = scn.GetFreepsCard("saruman");
assertEquals("Saruman", card.getBlueprint().getTitle());
assertEquals("Servant of the Eye", card.getBlueprint().getSubtitle());
@@ -62,18 +64,31 @@ public class Card_03_069_Tests
assertEquals(4, card.getBlueprint().getSiteNumber());
}
// Uncomment any @Test markers below once this is ready to be used
//@Test
public void SarumanTest1() throws DecisionResultInvalidException, CardNotFoundException {
@Test
public void SarumanCanAssignWithoutErrors() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
var card = scn.GetFreepsCard("card");
scn.FreepsMoveCardToHand(card);
var saruman = scn.GetShadowCard("saruman");
var savage = scn.GetShadowCard("savage");
scn.ShadowMoveCharToTable(saruman, savage);
var sam = scn.GetFreepsCard("sam");
scn.FreepsMoveCharToTable(sam);
scn.StartGame();
scn.FreepsPlayCard(card);
assertEquals(4, scn.GetTwilight());
scn.SkipToPhase(Phase.ASSIGNMENT);
scn.FreepsPassCurrentPhaseAction();
assertTrue(scn.ShadowActionAvailable(saruman));
assertTrue(scn.CanBeAssigned(sam));
assertTrue(scn.CanBeAssigned(savage));
scn.ShadowUseCardAction(saruman);
scn.FreepsChooseNo();
scn.PassCurrentPhaseActions();
scn.FreepsResolveSkirmish(sam);
}
}