diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set03/set03-Gandalf.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set03/set03-Gandalf.hjson index 60f1e2ad0..9e9607339 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set03/set03-Gandalf.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set03/set03-Gandalf.hjson @@ -240,7 +240,7 @@ { type: If check: { - type: hasInMemory + type: HasCardInMemory memory: revealedCard } true: { diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set03/set03-Sauron.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set03/set03-Sauron.hjson index 9f6aa4758..dbf3a132b 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set03/set03-Sauron.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set03/set03-Sauron.hjson @@ -29,7 +29,7 @@ { type: If check: { - type: hasInMemory + type: HasCardInMemory memory: revealedCard } true: { diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set07/set07-Sauron.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set07/set07-Sauron.hjson index aeaf93115..458fd2ed1 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set07/set07-Sauron.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set07/set07-Sauron.hjson @@ -277,7 +277,7 @@ type: If check: [ { - type: HasInMemory + type: HasCardInMemory memory: discardedCard } { diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set08/set08-Sites.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set08/set08-Sites.hjson index d03e870fa..eb9c145f8 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set08/set08-Sites.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set08/set08-Sites.hjson @@ -120,18 +120,31 @@ phase: regroup } player: free people - effect: { - type: choice - texts: [ - Add 3 threats - Opponent takes control of site - ] - effects: [ - { - type: addThreats - amount: 3 + effect: [ + { + type: choice + texts: [ + Add 3 threats + Choose an opponent to take control of a site + ] + effects: [ + { + type: addThreats + amount: 3 + } + { + type: ChooseOpponent + memorize: opponent + } + ] + } + { + type: If + check: { + type: HasMemory + memory: opponent } - { + true: { type: Optional player: shadow text: Would you like to take control of a site? @@ -140,8 +153,8 @@ player: shadow } } - ] - } + } + ] } ] gametext: At the start of the regroup phase, the Free Peoples player must add 3 threats or choose an opponent who may take control of a site. 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 84f672b38..f2cca63a5 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 @@ -58,6 +58,7 @@ public class EffectAppenderFactory { effectAppenderProducers.put("choosehowmanytospot", new ChooseHowManyToSpot()); effectAppenderProducers.put("choosehowmanythreatstospot", new ChooseHowManyThreatsToSpot()); effectAppenderProducers.put("choosehowmanytwilighttokenstospot", new ChooseHowManyTwilightTokensToSpot()); + effectAppenderProducers.put("chooseopponent", new ChooseOpponent()); effectAppenderProducers.put("chooseyesorno", new ChooseYesOrNo()); effectAppenderProducers.put("consumesurplusdamage", new ConsumeSurplusDamage()); effectAppenderProducers.put("corruptringbearer", new CorruptRingBearer()); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ChooseOpponent.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ChooseOpponent.java new file mode 100644 index 000000000..370b5cf7d --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ChooseOpponent.java @@ -0,0 +1,34 @@ +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.field.FieldUtils; +import com.gempukku.lotro.cards.build.field.effect.EffectAppender; +import com.gempukku.lotro.cards.build.field.effect.EffectAppenderProducer; +import com.gempukku.lotro.logic.actions.CostToEffectAction; +import com.gempukku.lotro.logic.effects.choose.ChooseOpponentEffect; +import com.gempukku.lotro.logic.timing.Effect; +import org.json.simple.JSONObject; + +public class ChooseOpponent implements EffectAppenderProducer { + @Override + public EffectAppender createEffectAppender(boolean cost, JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(effectObject, "memorize"); + + final String memorize = FieldUtils.getString(effectObject.get("memorize"), "memorize"); + + return new DelayedAppender() { + @Override + protected Effect createEffect(boolean cost, CostToEffectAction action, ActionContext actionContext) { + return new ChooseOpponentEffect(actionContext.getPerformingPlayer()) { + @Override + protected void opponentChosen(String opponentId) { + actionContext.setValueToMemory(memorize, opponentId); + } + }; + } + }; + } + +} \ No newline at end of file diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/HasInMemory.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/HasCardInMemory.java similarity index 63% rename from gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/HasInMemory.java rename to gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/HasCardInMemory.java index 78778afd2..ac92235d3 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/HasInMemory.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/HasCardInMemory.java @@ -1,6 +1,5 @@ package com.gempukku.lotro.cards.build.field.effect.requirement; -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.Requirement; @@ -10,19 +9,16 @@ import org.json.simple.JSONObject; import java.util.Collection; -public class HasInMemory implements RequirementProducer { +public class HasCardInMemory implements RequirementProducer { @Override public Requirement getPlayRequirement(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { FieldUtils.validateAllowedFields(object, "memory"); final String memory = FieldUtils.getString(object.get("memory"), "memory"); - return new Requirement() { - @Override - public boolean accepts(ActionContext actionContext) { - Collection cardsFromMemory = actionContext.getCardsFromMemory(memory); - return cardsFromMemory.size() > 0; - } - }; + return actionContext -> { + Collection cardsFromMemory = actionContext.getCardsFromMemory(memory); + return !cardsFromMemory.isEmpty(); + }; } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/HasMemory.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/HasMemory.java new file mode 100644 index 000000000..f7c296c99 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/HasMemory.java @@ -0,0 +1,23 @@ +package com.gempukku.lotro.cards.build.field.effect.requirement; + +import com.gempukku.lotro.cards.build.CardGenerationEnvironment; +import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; +import com.gempukku.lotro.cards.build.Requirement; +import com.gempukku.lotro.cards.build.field.FieldUtils; +import org.json.simple.JSONObject; + +public class HasMemory implements RequirementProducer { + + @Override + public Requirement getPlayRequirement( + JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(object, "memory"); + + final String memory = FieldUtils.getString(object.get("memory"), "memory"); + + return actionContext -> + actionContext.getValueFromMemory(memory) != null && actionContext.getCardsFromMemory(memory) != null; + } +} + + diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/RequirementFactory.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/RequirementFactory.java index 3b0bbf6e4..15599f503 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/RequirementFactory.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/RequirementFactory.java @@ -48,7 +48,8 @@ public class RequirementFactory { requirementProducers.put("hascardinhand", new HasCardInHand()); requirementProducers.put("hascardinremoved", new HasCardInRemoved()); requirementProducers.put("hascardstacked", new HasCardStacked()); - requirementProducers.put("hasinmemory", new HasInMemory()); + requirementProducers.put("hascardinmemory", new HasCardInMemory()); + requirementProducers.put("hasmemory", new HasMemory()); requirementProducers.put("hasinzonedata", new HasInZoneData()); requirementProducers.put("haveinitiative", new HaveInitiative()); requirementProducers.put("isahead", new IsAhead()); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/choose/ChooseOpponentEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/choose/ChooseOpponentEffect.java new file mode 100644 index 000000000..797659a95 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/choose/ChooseOpponentEffect.java @@ -0,0 +1,31 @@ +package com.gempukku.lotro.logic.effects.choose; + +import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.logic.GameUtils; +import com.gempukku.lotro.logic.decisions.MultipleChoiceAwaitingDecision; +import com.gempukku.lotro.logic.timing.UnrespondableEffect; + +public abstract class ChooseOpponentEffect extends UnrespondableEffect { + private final String _playerId; + + public ChooseOpponentEffect(String playerId) { + _playerId = playerId; + } + + @Override + public void doPlayEffect(LotroGame game) { + String[] opponents = GameUtils.getOpponents(game, _playerId); + if (opponents.length == 1) + opponentChosen(opponents[0]); + else + game.getUserFeedback().sendAwaitingDecision(_playerId, + new MultipleChoiceAwaitingDecision(1, "Choose an opponent", opponents) { + @Override + protected void validDecisionMade(int index, String result) { + opponentChosen(result); + } + }); + } + + protected abstract void opponentChosen(String opponentId); +} diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/RequirementsAtTest.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/RequirementsAtTest.java index 3ee963a33..e2ecea6ef 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/RequirementsAtTest.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/RequirementsAtTest.java @@ -270,7 +270,7 @@ public class RequirementsAtTest extends AbstractAtTest { obj.put("memory", "m"); DefaultActionContext actionContext = new DefaultActionContext(P1, _game, null, null, null); - Requirement requirement = new HasInMemory().getPlayRequirement(obj, lotroCardBlueprintBuilder); + Requirement requirement = new HasCardInMemory().getPlayRequirement(obj, lotroCardBlueprintBuilder); assertFalse(requirement.accepts(actionContext)); actionContext.setCardMemory("m", createCard(P1, "1_3")); assertTrue(requirement.accepts(actionContext)); diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set17/Card_17_007_ErrataTests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set17/Card_17_007_ErrataTests.java index 6fbb7277a..fb406c38e 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set17/Card_17_007_ErrataTests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set17/Card_17_007_ErrataTests.java @@ -3,7 +3,6 @@ package com.gempukku.lotro.cards.unofficial.pc.errata.set17; 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; @@ -58,6 +57,8 @@ public class Card_17_007_ErrataTests assertEquals(CardType.COMPANION, card.getBlueprint().getCardType()); assertEquals(Race.ELF, card.getBlueprint().getRace()); assertTrue(scn.hasKeyword(card, Keyword.VALIANT)); + assertTrue(scn.hasKeyword(card, Keyword.HUNTER)); + assertEquals(1, scn.GetKeywordCount(card, Keyword.HUNTER)); assertEquals(2, card.getBlueprint().getTwilightCost()); assertEquals(6, card.getBlueprint().getStrength()); assertEquals(3, card.getBlueprint().getVitality());