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] 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/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 } } ] 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))) } } ] 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..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 @@ -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("revealcardsfromdrawdeck", 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/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; } }; } 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"); 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