From 03b9440cf8d68020eebb9693147cc1554182be90 Mon Sep 17 00:00:00 2001 From: MarcinSc Date: Sat, 18 May 2024 19:06:13 +0700 Subject: [PATCH] Migrated Isengard cards in set 12 to hjson --- .../cards/set12/isengard/Card12_054.java | 97 ------------------- .../official/set12}/set12-Isengard.hjson | 29 ++++++ .../field/effect/EffectAppenderFactory.java | 2 + .../field/effect/appender/ChooseACulture.java | 47 +++++++++ .../field/effect/appender/StoreCulture.java | 40 ++++++++ .../field/effect/filter/FilterFactory.java | 7 ++ 6 files changed, 125 insertions(+), 97 deletions(-) delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set12/isengard/Card12_054.java rename gemp-lotr/gemp-lotr-cards/src/main/resources/{card-stubs => cards/official/set12}/set12-Isengard.hjson (56%) create mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ChooseACulture.java create mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/StoreCulture.java diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set12/isengard/Card12_054.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set12/isengard/Card12_054.java deleted file mode 100644 index eacbee6f0..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set12/isengard/Card12_054.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.gempukku.lotro.cards.set12.isengard; - -import com.gempukku.lotro.common.CardType; -import com.gempukku.lotro.common.Culture; -import com.gempukku.lotro.common.Keyword; -import com.gempukku.lotro.common.Race; -import com.gempukku.lotro.filters.Filter; -import com.gempukku.lotro.filters.Filters; -import com.gempukku.lotro.game.PhysicalCard; -import com.gempukku.lotro.game.ReadableStringWhileInZoneData; -import com.gempukku.lotro.game.state.LotroGame; -import com.gempukku.lotro.logic.actions.RequiredTriggerAction; -import com.gempukku.lotro.logic.cardtype.AbstractMinion; -import com.gempukku.lotro.logic.decisions.MultipleChoiceAwaitingDecision; -import com.gempukku.lotro.logic.effects.PlayoutDecisionEffect; -import com.gempukku.lotro.logic.modifiers.Modifier; -import com.gempukku.lotro.logic.modifiers.StrengthModifier; -import com.gempukku.lotro.logic.timing.EffectResult; -import com.gempukku.lotro.logic.timing.TriggerConditions; - -import java.util.Collections; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; - -/** - * Set: Black Rider - * Side: Shadow - * Culture: Isengard - * Twilight Cost: 4 - * Type: Minion • Wizard - * Strength: 8 - * Vitality: 4 - * Site: 4 - * Game Text: Damage +1. Fierce. Lurker. (Skirmishes involving lurker minions must be resolved after any others.) When - * you play Saruman, name a culture. Each companion of the named culture is strength -1. - */ -public class Card12_054 extends AbstractMinion { - public Card12_054() { - super(4, 8, 4, 4, Race.WIZARD, Culture.ISENGARD, "Saruman", "Of Many Colours", true); - addKeyword(Keyword.DAMAGE, 1); - addKeyword(Keyword.FIERCE); - addKeyword(Keyword.LURKER); - } - - @Override - public List getInPlayModifiers(LotroGame game, final PhysicalCard self) { - return Collections.singletonList(new StrengthModifier(self, Filters.and(CardType.COMPANION, - new Filter() { - @Override - public boolean accepts(LotroGame game, PhysicalCard physicalCard) { - return self.getWhileInZoneData() != null && physicalCard.getBlueprint().getCulture() == fromData(self.getWhileInZoneData()); - } - }), -1)); - } - - @Override - public String getDisplayableInformation(PhysicalCard self) { - if (self.getWhileInZoneData() != null) - return "Chosen culture is " + self.getWhileInZoneData().getHumanReadable(); - return null; - } - - @Override - public List getRequiredAfterTriggers(final LotroGame game, EffectResult effectResult, final PhysicalCard self) { - if (TriggerConditions.played(game, effectResult, self)) { - RequiredTriggerAction action = new RequiredTriggerAction(self); - - final Set possibleCultures = new LinkedHashSet<>(); - for (Culture culture : Culture.values()) - if (culture.isOfficial()) - possibleCultures.add(culture.getHumanReadable()); - - action.appendEffect( - new PlayoutDecisionEffect(self.getOwner(), - new MultipleChoiceAwaitingDecision(1, "Choose a culture", possibleCultures.toArray(new String[possibleCultures.size()])) { - @Override - protected void validDecisionMade(int index, String result) { - self.setWhileInZoneData(toData(Culture.findCultureByHumanReadable(result))); - game.getGameState().sendMessage(self.getOwner() +" has chosen "+ result); - } - })); - return Collections.singletonList(action); - } - return null; - } - - private Culture fromData(PhysicalCard.WhileInZoneData data) { - if (data == null) - return null; - return Culture.valueOf(data.getValue()); - } - - private PhysicalCard.WhileInZoneData toData(Culture culture) { - return new ReadableStringWhileInZoneData(culture.name(), culture.getHumanReadable()); - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/card-stubs/set12-Isengard.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set12/set12-Isengard.hjson similarity index 56% rename from gemp-lotr/gemp-lotr-cards/src/main/resources/card-stubs/set12-Isengard.hjson rename to gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set12/set12-Isengard.hjson index 908e6643d..15ca9f9bc 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/card-stubs/set12-Isengard.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set12/set12-Isengard.hjson @@ -32,6 +32,35 @@ Lurker ] effects: [ + { + type: trigger + trigger: { + type: played + filter: self + } + effect: [ + { + type: chooseACulture + memorize: chosenCulture + } + { + type: storeCulture + memory: chosenCulture + } + ] + } + { + type: displayableInformation + text: Chosen culture - {stored} + } + { + type: modifier + modifier: { + type: modifyStrength + filter: companion,storedCulture + amount: -1 + } + } ] gametext: Damage +1. Fierce. Lurker. (Skirmishes involving lurker minions must be resolved after any others.)
When you play Saruman, name a culture. Each companion of the named culture is strength -1. lore: White!" he sneered. "It serves as a beginning."'" 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 bbabf876b..9f71f2c55 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 @@ -31,6 +31,7 @@ public class EffectAppenderFactory { effectAppenderProducers.put("canplaynextaction", new CanPlayNextAction()); effectAppenderProducers.put("choice", new Choice()); effectAppenderProducers.put("chooseactivecards", new ChooseActiveCards()); + effectAppenderProducers.put("chooseaculture", new ChooseACulture()); effectAppenderProducers.put("chooseakeyword", new ChooseAKeyword()); effectAppenderProducers.put("chooseandaddtwilight", new ChooseAndAddTwilight()); effectAppenderProducers.put("chooseandheal", new ChooseAndHeal()); @@ -180,6 +181,7 @@ public class EffectAppenderFactory { effectAppenderProducers.put("stackplayedevent", new StackPlayedEvent()); effectAppenderProducers.put("stacktopcardsofdrawdeck", new StackTopCardsOfDrawDeck()); effectAppenderProducers.put("startskirmish", new StartSkirmish()); + effectAppenderProducers.put("storeculture", new StoreCulture()); effectAppenderProducers.put("storekeyword", new StoreKeyword()); effectAppenderProducers.put("storewhileinzone", new StoreWhileInZone()); effectAppenderProducers.put("takecontrolofsite", new TakeControlOfSite()); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ChooseACulture.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ChooseACulture.java new file mode 100644 index 000000000..74e0d1853 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ChooseACulture.java @@ -0,0 +1,47 @@ +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.common.Culture; +import com.gempukku.lotro.logic.actions.CostToEffectAction; +import com.gempukku.lotro.logic.decisions.MultipleChoiceAwaitingDecision; +import com.gempukku.lotro.logic.effects.PlayoutDecisionEffect; +import com.gempukku.lotro.logic.timing.Effect; +import org.json.simple.JSONObject; + +import java.util.Set; +import java.util.TreeSet; + +public class ChooseACulture implements EffectAppenderProducer { + @Override + public EffectAppender createEffectAppender(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) { + final Set possibleCultures = new TreeSet<>(); + for (Culture culture : Culture.values()) { + possibleCultures.add(culture.getHumanReadable()); + } + + return new PlayoutDecisionEffect( + actionContext.getPerformingPlayer(), + new MultipleChoiceAwaitingDecision(1, "Choose a culture", + possibleCultures.toArray(new String[0])) { + @Override + protected void validDecisionMade(int index, String result) { + actionContext.setValueToMemory(memorize, Culture.findCultureByHumanReadable(result).toString()); + actionContext.getGame().getGameState().sendMessage(actionContext.getPerformingPlayer() + " has chosen " + result); + } + }); + } + }; + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/StoreCulture.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/StoreCulture.java new file mode 100644 index 000000000..756820bc5 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/StoreCulture.java @@ -0,0 +1,40 @@ +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.common.Culture; +import com.gempukku.lotro.game.ReadableStringWhileInZoneData; +import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.logic.actions.CostToEffectAction; +import com.gempukku.lotro.logic.timing.Effect; +import com.gempukku.lotro.logic.timing.UnrespondableEffect; +import org.json.simple.JSONObject; + +public class StoreCulture implements EffectAppenderProducer { + @Override + public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(effectObject, "memory"); + + final String memory = FieldUtils.getString(effectObject.get("memory"), "memory"); + + return new DelayedAppender() { + @Override + protected Effect createEffect(boolean cost, CostToEffectAction action, ActionContext actionContext) { + return new UnrespondableEffect() { + @Override + protected void doPlayEffect(LotroGame game) { + String valueFromMemory = actionContext.getValueFromMemory(memory); + if (valueFromMemory != null) { + Culture keyword = Culture.valueOf(valueFromMemory); + actionContext.getSource().setWhileInZoneData(new ReadableStringWhileInZoneData(keyword.name(), keyword.getHumanReadable())); + } + } + }; + } + }; + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/filter/FilterFactory.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/filter/FilterFactory.java index 26206c815..ea78dcae5 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/filter/FilterFactory.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/filter/FilterFactory.java @@ -143,6 +143,13 @@ public class FilterFactory { final CharacterLostSkirmishResult lostSkirmish = (CharacterLostSkirmishResult) actionContext.getEffectResult(); return lostSkirmish.getLoser(); }); + simpleFilters.put("storedculture", + (actionContext) -> { + PhysicalCard.WhileInZoneData data = actionContext.getSource().getWhileInZoneData(); + if (data == null) + return Filters.none; + return Culture.valueOf(data.getValue()); + }); simpleFilters.put("storedkeyword", (actionContext) -> { PhysicalCard.WhileInZoneData data = actionContext.getSource().getWhileInZoneData();