From 68cfb0d23c4a03a8df59a6104d9d5230d1e66d2b Mon Sep 17 00:00:00 2001 From: Christian 'ketura' McCarty Date: Wed, 23 Apr 2025 21:54:10 -0500 Subject: [PATCH 1/7] Fixing Estel's image link being missing --- gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/PC_Cards.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/PC_Cards.js b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/PC_Cards.js index a0fb042d3..7807bde00 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/PC_Cards.js +++ b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/PC_Cards.js @@ -921,7 +921,7 @@ var PCCards = { // Saved From the Fire (8R20) [Errata] '58_20' : 'https://i.lotrtcgpc.net/errata/LOTR-EN08E020.1_card.jpg', // Aragorn, Estel (V1R19) [Errata] - //'101_19' : 'https://i.lotrtcgpc.net/sets/vset1/LOTR-ENV1E019.2_card.jpg', + '101_19' : 'https://i.lotrtcgpc.net/sets/vset1/LOTR-ENV1E019.2_card.jpg', // Elendil, The Tall (9R+32) [Errata] '59_32' : 'https://i.lotrtcgpc.net/errata/LOTR-EN09E032.1_card.jpg', // Sapling of the White Tree (9R35) [Errata] From 70594665882b2d9a72beb1612fc5a24072d14aae Mon Sep 17 00:00:00 2001 From: Christian 'ketura' McCarty Date: Wed, 23 Apr 2025 21:55:41 -0500 Subject: [PATCH 2/7] Fixed Eastern Emyn Muil exerting once instead of twice --- .../src/main/resources/cards/official/set04/set04-Raider.hjson | 1 + 1 file changed, 1 insertion(+) diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set04/set04-Raider.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set04/set04-Raider.hjson index 7f708bc1a..9da9441a7 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set04/set04-Raider.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set04/set04-Raider.hjson @@ -861,6 +861,7 @@ effect: { type: exert select: choose(ringBound,companion) + times: 2 } } ] From a8910811ed77685e56bd22e6387432b238427273 Mon Sep 17 00:00:00 2001 From: Christian 'ketura' McCarty Date: Wed, 23 Apr 2025 21:56:29 -0500 Subject: [PATCH 3/7] Fixed Gnawing, Biting, Hacking, Burning permitting selection of the 2 cards discarded as a cost during its action. --- .../main/resources/cards/official/set06/set06-Isengard.hjson | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set06/set06-Isengard.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set06/set06-Isengard.hjson index 6d9eaef8b..0c3f1b8e2 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set06/set06-Isengard.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set06/set06-Isengard.hjson @@ -363,6 +363,7 @@ type: discardStackedCards on: self count: 2 + memorize: discardedCards } { type: removeTwilight @@ -372,7 +373,7 @@ effect: { type: playCardFromDiscard removedTwilight: 1 - select: choose(culture(isengard),orc) + select: choose(culture(isengard),orc,not(memory(discardedCards))) } } ] From 0dfe74cde37eea82e541ad47a15618e6eda78c02 Mon Sep 17 00:00:00 2001 From: Christian 'ketura' McCarty Date: Wed, 23 Apr 2025 22:14:19 -0500 Subject: [PATCH 4/7] Fixed Borne Far Away (and other "exchange card in hand for X" effects) permitting the exchange with no actual valid target in hand, resulting in a free transfer to hand. --- .../ExchangeCardsInHandWithCardsInDeadPile.java | 10 +++++++++- .../ExchangeCardsInHandWithCardsInDiscard.java | 9 ++++++++- .../appender/ExchangeCardsInHandWithCardsStacked.java | 9 ++++++++- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ExchangeCardsInHandWithCardsInDeadPile.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ExchangeCardsInHandWithCardsInDeadPile.java index f6df60969..716df2f2e 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ExchangeCardsInHandWithCardsInDeadPile.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ExchangeCardsInHandWithCardsInDeadPile.java @@ -50,6 +50,13 @@ public class ExchangeCardsInHandWithCardsInDeadPile implements EffectAppenderPro return new AbstractEffect() { @Override protected FullEffectResult playEffectReturningResult(LotroGame game) { + + int hand = countHand.getEvaluator(actionContext).evaluateExpression(game, null); + if(handCards.size() < hand) { + game.getGameState().sendMessage(performingPlayer + " did not have " + hand + " card in hand to exchange."); + return new FullEffectResult(false); + } + Set cardsToRemove = new HashSet<>(); cardsToRemove.addAll(handCards); cardsToRemove.addAll(deadPileCards); @@ -66,7 +73,8 @@ public class ExchangeCardsInHandWithCardsInDeadPile implements EffectAppenderPro @Override public boolean isPlayableInFull(LotroGame game) { - return true; + int hand = countHand.getEvaluator(actionContext).evaluateExpression(game, null); + return handCards.size() >= hand; } }; } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ExchangeCardsInHandWithCardsInDiscard.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ExchangeCardsInHandWithCardsInDiscard.java index 03410be00..dd3b0f3f6 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ExchangeCardsInHandWithCardsInDiscard.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ExchangeCardsInHandWithCardsInDiscard.java @@ -48,6 +48,12 @@ public class ExchangeCardsInHandWithCardsInDiscard implements EffectAppenderProd return new AbstractEffect() { @Override protected FullEffectResult playEffectReturningResult(LotroGame game) { + int hand = countHand.getEvaluator(actionContext).evaluateExpression(game, null); + if(handCards.size() < hand) { + game.getGameState().sendMessage(performingPlayer + " did not have " + hand + " card in hand to exchange."); + return new FullEffectResult(false); + } + Set cardsToRemove = new HashSet<>(); cardsToRemove.addAll(handCards); cardsToRemove.addAll(discardCards); @@ -64,7 +70,8 @@ public class ExchangeCardsInHandWithCardsInDiscard implements EffectAppenderProd @Override public boolean isPlayableInFull(LotroGame game) { - return true; + int hand = countHand.getEvaluator(actionContext).evaluateExpression(game, null); + return handCards.size() >= hand; } }; } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ExchangeCardsInHandWithCardsStacked.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ExchangeCardsInHandWithCardsStacked.java index 90e957392..4db6c7533 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ExchangeCardsInHandWithCardsStacked.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ExchangeCardsInHandWithCardsStacked.java @@ -53,6 +53,12 @@ public class ExchangeCardsInHandWithCardsStacked implements EffectAppenderProduc return new AbstractEffect() { @Override protected FullEffectResult playEffectReturningResult(LotroGame game) { + int hand = countHand.getEvaluator(actionContext).evaluateExpression(game, null); + if(handCards.size() < hand) { + game.getGameState().sendMessage(performingPlayer + " did not have " + hand + " card in hand to exchange."); + return new FullEffectResult(false); + } + Set cardsToRemove = new HashSet<>(); cardsToRemove.addAll(handCards); cardsToRemove.addAll(stackedCards); @@ -69,7 +75,8 @@ public class ExchangeCardsInHandWithCardsStacked implements EffectAppenderProduc @Override public boolean isPlayableInFull(LotroGame game) { - return true; + int hand = countHand.getEvaluator(actionContext).evaluateExpression(game, null); + return handCards.size() >= hand; } }; } From f3fa33658c4db8c9bc7b81c901f603b9e1b2d6c4 Mon Sep 17 00:00:00 2001 From: Christian 'ketura' McCarty Date: Wed, 23 Apr 2025 22:26:27 -0500 Subject: [PATCH 5/7] Fixed cards using RevealCards not actually working, as that *only* works when revealing cards from play (rather useless) --- .../cards/official/set02/set02-Gandalf.hjson | 2 +- .../cards/official/set12/set12-Elven.hjson | 2 +- .../field/effect/EffectAppenderFactory.java | 4 +- .../appender/RevealCardsFromDiscard.java | 46 +++++++++++++++++++ .../appender/RevealCardsFromDrawDeck.java | 46 +++++++++++++++++++ ...ealCards.java => RevealCardsFromPlay.java} | 2 +- 6 files changed, 98 insertions(+), 4 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/RevealCardsFromDiscard.java create mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/RevealCardsFromDrawDeck.java rename gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/{RevealCards.java => RevealCardsFromPlay.java} (97%) diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set02/set02-Gandalf.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set02/set02-Gandalf.hjson index 233ddee11..055e4f07c 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set02/set02-Gandalf.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set02/set02-Gandalf.hjson @@ -167,7 +167,7 @@ text: Choose card to reveal and put beneath your deck } { - type: revealCards + type: RevealCardsFromDiscard select: memory(chosenCard) } { diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set12/set12-Elven.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set12/set12-Elven.hjson index e84c637a6..1d9150526 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set12/set12-Elven.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set12/set12-Elven.hjson @@ -34,7 +34,7 @@ memory: topCards } { - type: RevealCards + type: RevealCardsFromDrawDeck select: memory(topCards) count: memory(cardCount) } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/EffectAppenderFactory.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/EffectAppenderFactory.java index f2cca63a5..ea5b22a7e 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/EffectAppenderFactory.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/EffectAppenderFactory.java @@ -162,7 +162,9 @@ public class EffectAppenderFactory { effectAppenderProducers.put("resetwhileinzonedata", new ResetWhileInZoneData()); effectAppenderProducers.put("returntohand", new ReturnToHand()); effectAppenderProducers.put("revealbottomcardsofdrawdeck", new RevealBottomCardsOfDrawDeck()); - effectAppenderProducers.put("revealcards", new RevealCards()); + effectAppenderProducers.put("revealcards", new RevealCardsFromPlay()); + effectAppenderProducers.put("revealcardsfromdiscard", new RevealCardsFromDiscard()); + effectAppenderProducers.put("revealcardsfromdeck", new RevealCardsFromDrawDeck()); effectAppenderProducers.put("revealcardsfromadventuredeck", new RevealCardsFromAdventureDeck()); effectAppenderProducers.put("revealcardsfromhand", new RevealCardsFromHand()); effectAppenderProducers.put("revealhand", new RevealHand()); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/RevealCardsFromDiscard.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/RevealCardsFromDiscard.java new file mode 100644 index 000000000..ae940bfb2 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/RevealCardsFromDiscard.java @@ -0,0 +1,46 @@ +package com.gempukku.lotro.cards.build.field.effect.appender; + +import com.gempukku.lotro.cards.build.ActionContext; +import com.gempukku.lotro.cards.build.CardGenerationEnvironment; +import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; +import com.gempukku.lotro.cards.build.ValueSource; +import com.gempukku.lotro.cards.build.field.FieldUtils; +import com.gempukku.lotro.cards.build.field.effect.EffectAppender; +import com.gempukku.lotro.cards.build.field.effect.EffectAppenderProducer; +import com.gempukku.lotro.cards.build.field.effect.appender.resolver.CardResolver; +import com.gempukku.lotro.cards.build.field.effect.appender.resolver.ValueResolver; +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.logic.actions.CostToEffectAction; +import com.gempukku.lotro.logic.effects.RevealCardEffect; +import com.gempukku.lotro.logic.timing.Effect; +import org.json.simple.JSONObject; + +import java.util.Collection; + +public class RevealCardsFromDiscard implements EffectAppenderProducer { + @Override + public EffectAppender createEffectAppender(boolean cost, JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(effectObject, "count", "select", "memorize"); + + final String select = FieldUtils.getString(effectObject.get("select"), "select", "choose(any)"); + final String memorize = FieldUtils.getString(effectObject.get("memorize"), "memorize", "_temp"); + + final ValueSource countSource = ValueResolver.resolveEvaluator(effectObject.get("count"), 1, environment); + + MultiEffectAppender result = new MultiEffectAppender(); + + result.addEffectAppender( + CardResolver.resolveCardsInDiscard(select, countSource, memorize, "you", "Choose cards to reveal", environment)); + result.addEffectAppender( + new DelayedAppender() { + @Override + protected Effect createEffect(boolean cost, CostToEffectAction action, ActionContext actionContext) { + final Collection cardsToReveal = actionContext.getCardsFromMemory(memorize); + return new RevealCardEffect(actionContext.getSource(), cardsToReveal); + } + }); + + return result; + } + +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/RevealCardsFromDrawDeck.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/RevealCardsFromDrawDeck.java new file mode 100644 index 000000000..ddec12d6f --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/RevealCardsFromDrawDeck.java @@ -0,0 +1,46 @@ +package com.gempukku.lotro.cards.build.field.effect.appender; + +import com.gempukku.lotro.cards.build.ActionContext; +import com.gempukku.lotro.cards.build.CardGenerationEnvironment; +import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; +import com.gempukku.lotro.cards.build.ValueSource; +import com.gempukku.lotro.cards.build.field.FieldUtils; +import com.gempukku.lotro.cards.build.field.effect.EffectAppender; +import com.gempukku.lotro.cards.build.field.effect.EffectAppenderProducer; +import com.gempukku.lotro.cards.build.field.effect.appender.resolver.CardResolver; +import com.gempukku.lotro.cards.build.field.effect.appender.resolver.ValueResolver; +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.logic.actions.CostToEffectAction; +import com.gempukku.lotro.logic.effects.RevealCardEffect; +import com.gempukku.lotro.logic.timing.Effect; +import org.json.simple.JSONObject; + +import java.util.Collection; + +public class RevealCardsFromDrawDeck implements EffectAppenderProducer { + @Override + public EffectAppender createEffectAppender(boolean cost, JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(effectObject, "count", "select", "memorize"); + + final String select = FieldUtils.getString(effectObject.get("select"), "select", "choose(any)"); + final String memorize = FieldUtils.getString(effectObject.get("memorize"), "memorize", "_temp"); + + final ValueSource countSource = ValueResolver.resolveEvaluator(effectObject.get("count"), 1, environment); + + MultiEffectAppender result = new MultiEffectAppender(); + + result.addEffectAppender( + CardResolver.resolveCardsInDeck(select, null, countSource, memorize, "you", "you",false, "Choose cards to reveal", environment)); + result.addEffectAppender( + new DelayedAppender() { + @Override + protected Effect createEffect(boolean cost, CostToEffectAction action, ActionContext actionContext) { + final Collection cardsToReveal = actionContext.getCardsFromMemory(memorize); + return new RevealCardEffect(actionContext.getSource(), cardsToReveal); + } + }); + + return result; + } + +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/RevealCards.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/RevealCardsFromPlay.java similarity index 97% rename from gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/RevealCards.java rename to gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/RevealCardsFromPlay.java index aac01c64f..6e6cdae85 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/RevealCards.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/RevealCardsFromPlay.java @@ -17,7 +17,7 @@ import org.json.simple.JSONObject; import java.util.Collection; -public class RevealCards implements EffectAppenderProducer { +public class RevealCardsFromPlay implements EffectAppenderProducer { @Override public EffectAppender createEffectAppender(boolean cost, JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { FieldUtils.validateAllowedFields(effectObject, "count", "select", "memorize"); From c8ee8f1d54741ecb63789691a8d48c58d7ba425e Mon Sep 17 00:00:00 2001 From: Christian 'ketura' McCarty Date: Wed, 23 Apr 2025 23:02:43 -0500 Subject: [PATCH 6/7] Fixed class name typo --- .../lotro/cards/build/field/effect/EffectAppenderFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/EffectAppenderFactory.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/EffectAppenderFactory.java index ea5b22a7e..eb63f1a3c 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/EffectAppenderFactory.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/EffectAppenderFactory.java @@ -164,7 +164,7 @@ public class EffectAppenderFactory { effectAppenderProducers.put("revealbottomcardsofdrawdeck", new RevealBottomCardsOfDrawDeck()); effectAppenderProducers.put("revealcards", new RevealCardsFromPlay()); effectAppenderProducers.put("revealcardsfromdiscard", new RevealCardsFromDiscard()); - effectAppenderProducers.put("revealcardsfromdeck", new RevealCardsFromDrawDeck()); + effectAppenderProducers.put("revealcardsfromdrawdeck", new RevealCardsFromDrawDeck()); effectAppenderProducers.put("revealcardsfromadventuredeck", new RevealCardsFromAdventureDeck()); effectAppenderProducers.put("revealcardsfromhand", new RevealCardsFromHand()); effectAppenderProducers.put("revealhand", new RevealHand()); From 01edae1109ea28601dc5a8382c1046250db34a61 Mon Sep 17 00:00:00 2001 From: Christian 'ketura' McCarty Date: Fri, 25 Apr 2025 20:50:43 -0500 Subject: [PATCH 7/7] Fixed scheduled tournaments not marking themselves as started properly --- .../com/gempukku/lotro/tournament/ScheduledTournamentQueue.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/ScheduledTournamentQueue.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/ScheduledTournamentQueue.java index 698960792..65e1112e4 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/ScheduledTournamentQueue.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/ScheduledTournamentQueue.java @@ -46,8 +46,8 @@ public class ScheduledTournamentQueue extends AbstractTournamentQueue implements if (now.isAfter(_startTime)) { if (_players.size() >= _tournamentInfo.Parameters().minimumPlayers) { startTournament(); - } else { _tournamentService.recordScheduledTournamentStarted(_tournamentInfo.Parameters().tournamentId); + } else { leaveAllPlayers(); } return true; //destroy the queue now that the tournament has started