Fixed Barrows of Edoras not working. Also fixed PutCardsFromXonTop/BottomOfDeck not iterating properly in the choice window.

This commit is contained in:
Christian 'ketura' McCarty
2024-09-24 11:59:19 -05:00
parent 2dfc6d94c9
commit d2547c0f7b
13 changed files with 152 additions and 23 deletions

View File

@@ -753,6 +753,13 @@
{
type: activated
phase: fellowship
requires: {
type: IsGreaterThan
firstNumber: {
type: ForEachInHand
}
secondNumber: 0
}
effect: [
{
type: putCardsFromHandOnBottomOfDeck

View File

@@ -83,7 +83,6 @@ public class EffectAppenderFactory {
effectAppenderProducers.put("filtercardsinmemory", new FilterCardsInMemory());
effectAppenderProducers.put("getcardsfromtopofdeck", new GetCardsFromTopOfDeck());
effectAppenderProducers.put("heal", new Heal());
effectAppenderProducers.put("if", new IfEffect());
effectAppenderProducers.put("incrementperphaselimit", new IncrementPerPhaseLimit());
effectAppenderProducers.put("incrementperturnlimit", new IncrementPerTurnLimit());
effectAppenderProducers.put("incrementtoil", new IncrementToil());

View File

@@ -47,7 +47,9 @@ public class PutCardsFromDeckOnBottomOfDeck implements EffectAppenderProducer {
protected void cardsSelected(LotroGame game, Collection<PhysicalCard> selectedCards) {
PhysicalCard card = selectedCards.iterator().next();
// Removed from remaining
cards.remove(card);
for(var effect : result) {
((ChooseArbitraryCardsEffect)effect).removeCard(card);
}
GameState gameState = game.getGameState();
if (reveal) {

View File

@@ -47,7 +47,9 @@ public class PutCardsFromDeckOnTopOfDeck implements EffectAppenderProducer {
protected void cardsSelected(LotroGame game, Collection<PhysicalCard> selectedCards) {
PhysicalCard card = selectedCards.iterator().next();
// Removed from remaining
cards.remove(card);
for(var effect : result) {
((ChooseArbitraryCardsEffect)effect).removeCard(card);
}
GameState gameState = game.getGameState();
if (reveal) {

View File

@@ -46,7 +46,9 @@ public class PutCardsFromDiscardOnBottomOfDeck implements EffectAppenderProducer
protected void cardsSelected(LotroGame game, Collection<PhysicalCard> selectedCards) {
PhysicalCard card = selectedCards.iterator().next();
// Removed from remaining
cards.remove(card);
for(var effect : result) {
((ChooseArbitraryCardsEffect)effect).removeCard(card);
}
GameState gameState = game.getGameState();
gameState.sendMessage(card.getOwner() + " puts " + GameUtils.getCardLink(card) + " from discard on the bottom of deck");

View File

@@ -46,7 +46,9 @@ public class PutCardsFromDiscardOnTopOfDeck implements EffectAppenderProducer {
protected void cardsSelected(LotroGame game, Collection<PhysicalCard> selectedCards) {
PhysicalCard card = selectedCards.iterator().next();
// Removed from remaining
cards.remove(card);
for(var effect : result) {
((ChooseArbitraryCardsEffect)effect).removeCard(card);
}
GameState gameState = game.getGameState();
gameState.sendMessage(card.getOwner() + " puts " + GameUtils.getCardLink(card) + " from discard on the top of deck");

View File

@@ -49,7 +49,9 @@ public class PutCardsFromHandOnBottomOfDeck implements EffectAppenderProducer {
protected void cardsSelected(LotroGame game, Collection<PhysicalCard> selectedCards) {
PhysicalCard card = selectedCards.iterator().next();
// Removed from remaining
cards.remove(card);
for(var effect : result) {
((ChooseArbitraryCardsEffect)effect).removeCard(card);
}
GameState gameState = game.getGameState();
if (reveal) {

View File

@@ -50,7 +50,9 @@ public class PutCardsFromHandOnTopOfDeck implements EffectAppenderProducer {
protected void cardsSelected(LotroGame game, Collection<PhysicalCard> selectedCards) {
PhysicalCard card = selectedCards.iterator().next();
// Removed from remaining
cards.remove(card);
for(var effect : result) {
((ChooseArbitraryCardsEffect)effect).removeCard(card);
}
GameState gameState = game.getGameState();
if (reveal) {

View File

@@ -47,7 +47,9 @@ public class PutCardsFromPlayOnBottomOfDeck implements EffectAppenderProducer {
protected void cardsSelected(LotroGame game, Collection<PhysicalCard> selectedCards) {
PhysicalCard card = selectedCards.iterator().next();
// Removed from remaining
cards.remove(card);
for(var effect : result) {
((ChooseArbitraryCardsEffect)effect).removeCard(card);
}
GameState gameState = game.getGameState();
gameState.sendMessage(card.getOwner() + " puts " + GameUtils.getCardLink(card) + " from play on the bottom of deck");

View File

@@ -47,7 +47,9 @@ public class PutCardsFromPlayOnTopOfDeck implements EffectAppenderProducer {
protected void cardsSelected(LotroGame game, Collection<PhysicalCard> selectedCards) {
PhysicalCard card = selectedCards.iterator().next();
// Removed from remaining
cards.remove(card);
for(var effect : result) {
((ChooseArbitraryCardsEffect)effect).removeCard(card);
}
GameState gameState = game.getGameState();
gameState.sendMessage(card.getOwner() + " puts " + GameUtils.getCardLink(card) + " from play on the top of deck");

View File

@@ -497,7 +497,7 @@ public class GameState {
if (assignment.getFellowshipCharacter() == card)
removeAssignment(assignment);
if (assignment.getShadowCharacters().remove(card))
if (assignment.getShadowCharacters().size() == 0)
if (assignment.getShadowCharacters().isEmpty())
removeAssignment(assignment);
}
@@ -534,7 +534,7 @@ public class GameState {
if (end)
zoneCards.add((PhysicalCardImpl) card);
else
zoneCards.add(0, (PhysicalCardImpl) card);
zoneCards.addFirst((PhysicalCardImpl) card);
if (card.getZone() != null)
_log.error("Card was in " + card.getZone() + " when tried to add to zone: " + zone);

View File

@@ -87,5 +87,9 @@ public abstract class ChooseArbitraryCardsEffect extends AbstractEffect {
return new FullEffectResult(success);
}
public void removeCard(PhysicalCard card) {
_cards.remove(card);
}
protected abstract void cardsSelected(LotroGame game, Collection<PhysicalCard> selectedCards);
}

View File

@@ -17,10 +17,38 @@ public class Card_04_337_Tests
return new GenericCardTestHelper(
new HashMap<>()
{{
put("card", "4_337");
// put other cards in here as needed for the test case
put("fodder01", "5_1");
put("fodder02", "5_2");
put("fodder03", "5_3");
put("fodder04", "5_4");
put("fodder05", "5_5");
put("fodder06", "5_6");
put("fodder07", "5_7");
put("fodder08", "5_8");
put("fodder09", "5_9");
put("fodder10", "5_10");
put("fodder11", "5_11");
put("fodder12", "5_12");
put("fodder13", "5_13");
put("fodder14", "5_14");
put("fodder15", "5_15");
put("fodder16", "5_16");
put("fodder17", "5_17");
put("fodder18", "5_18");
put("fodder19", "5_19");
put("fodder20", "5_20");
}},
new HashMap<>() {{
put("site1", "1_319");
put("site2", "1_327");
put("site3", "4_337");
put("site4", "1_343");
put("site5", "1_349");
put("site6", "101_61");
put("site7", "3_118");
put("site8", "1_356");
put("site9", "1_360");
}},
GenericCardTestHelper.FellowshipSites,
GenericCardTestHelper.FOTRFrodo,
GenericCardTestHelper.RulingRing
);
@@ -45,8 +73,8 @@ public class Card_04_337_Tests
var scn = GetScenario();
//Use this once you have set the deck up properly
//var card = scn.GetFreepsSite(3);
var card = scn.GetFreepsCard("card");
var card = scn.GetFreepsSite(3);
//var card = scn.GetFreepsCard("barrows");
assertEquals("Barrows of Edoras", card.getBlueprint().getTitle());
assertNull(card.getBlueprint().getSubtitle());
@@ -57,18 +85,93 @@ public class Card_04_337_Tests
assertEquals(3, card.getBlueprint().getSiteNumber());
}
// Uncomment any @Test markers below once this is ready to be used
//@Test
public void BarrowsofEdorasTest1() throws DecisionResultInvalidException, CardNotFoundException {
@Test
public void BarrowsofEdorasAbilityPutsCardsOnBottomOfDeckAndDraws4TheFirstTimeItIsActivated() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
var card = scn.GetFreepsCard("card");
scn.FreepsMoveCardToHand(card);
var barrows = scn.GetShadowSite(3);
var fodder01 = scn.GetFreepsCard("fodder01");
var fodder02 = scn.GetFreepsCard("fodder02");
var fodder03 = scn.GetFreepsCard("fodder03");
var fodder04 = scn.GetFreepsCard("fodder04");
var fodder05 = scn.GetFreepsCard("fodder05");
var fodder06 = scn.GetFreepsCard("fodder06");
var fodder07 = scn.GetFreepsCard("fodder07");
var fodder08 = scn.GetFreepsCard("fodder08");
var fodder09 = scn.GetFreepsCard("fodder09");
var fodder10 = scn.GetFreepsCard("fodder10");
var fodder11 = scn.GetFreepsCard("fodder11");
var fodder12 = scn.GetFreepsCard("fodder12");
var fodder13 = scn.GetFreepsCard("fodder13");
var fodder14 = scn.GetFreepsCard("fodder14");
var fodder15 = scn.GetFreepsCard("fodder15");
var fodder16 = scn.GetFreepsCard("fodder16");
var fodder17 = scn.GetFreepsCard("fodder17");
var fodder18 = scn.GetFreepsCard("fodder18");
var fodder19 = scn.GetFreepsCard("fodder19");
var fodder20 = scn.GetFreepsCard("fodder20");
scn.FreepsMoveCardToHand(fodder01, fodder02, fodder03, fodder04, fodder05, fodder06, fodder07, fodder08);
scn.FreepsMoveCardsToTopOfDeck(fodder20, fodder19, fodder18, fodder17, fodder16, fodder15, fodder14, fodder13, fodder12, fodder11, fodder10, fodder09);
scn.StartGame();
scn.FreepsPlayCard(card);
assertEquals(0, scn.GetTwilight());
assertEquals(8, scn.GetFreepsHandCount());
scn.SkipToSite(3);
assertEquals(Phase.FELLOWSHIP, scn.GetCurrentPhase());
assertEquals(3, (long)scn.GetCurrentSite().getSiteNumber());
assertTrue(scn.FreepsActionAvailable(barrows));
scn.FreepsUseCardAction(barrows);
scn.FreepsChooseCardBPFromSelection(fodder08);
scn.FreepsChooseCardBPFromSelection(fodder07);
scn.FreepsChooseCardBPFromSelection(fodder06);
scn.FreepsChooseCardBPFromSelection(fodder05);
scn.FreepsChooseCardBPFromSelection(fodder04);
scn.FreepsChooseCardBPFromSelection(fodder03);
scn.FreepsChooseCardBPFromSelection(fodder02);
//No player choice for the last card as Gemp performs a choice of 1 automatically
assertEquals(scn.GetFromBottomOfFreepsDeck(1), fodder01);
assertEquals(scn.GetFromBottomOfFreepsDeck(2), fodder02);
assertEquals(scn.GetFromBottomOfFreepsDeck(3), fodder03);
assertEquals(scn.GetFromBottomOfFreepsDeck(4), fodder04);
assertEquals(scn.GetFromBottomOfFreepsDeck(5), fodder05);
assertEquals(scn.GetFromBottomOfFreepsDeck(6), fodder06);
assertEquals(scn.GetFromBottomOfFreepsDeck(7), fodder07);
assertEquals(scn.GetFromBottomOfFreepsDeck(8), fodder08);
assertEquals(4, scn.GetFreepsHandCount());
assertEquals(Zone.HAND, fodder09.getZone());
assertEquals(Zone.HAND, fodder10.getZone());
assertEquals(Zone.HAND, fodder11.getZone());
assertEquals(Zone.HAND, fodder12.getZone());
//Do it again, Sam
assertTrue(scn.FreepsActionAvailable(barrows));
scn.FreepsUseCardAction(barrows);
scn.FreepsChooseCardBPFromSelection(fodder12);
scn.FreepsChooseCardBPFromSelection(fodder11);
scn.FreepsChooseCardBPFromSelection(fodder10);
//No player choice for the last card as Gemp performs a choice of 1 automatically
assertEquals(scn.GetFromBottomOfFreepsDeck(1), fodder09);
assertEquals(scn.GetFromBottomOfFreepsDeck(2), fodder10);
assertEquals(scn.GetFromBottomOfFreepsDeck(3), fodder11);
assertEquals(scn.GetFromBottomOfFreepsDeck(4), fodder12);
//Psyche! Rule of 4 means you can only really do this once
assertEquals(0, scn.GetFreepsHandCount());
assertFalse(scn.FreepsActionAvailable(barrows));
}
}