diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set13/site/Card13_185.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set13/site/Card13_185.java deleted file mode 100644 index d27822142..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set13/site/Card13_185.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.gempukku.lotro.cards.set13.site; - -import com.gempukku.lotro.logic.cardtype.AbstractShadowsSite; -import com.gempukku.lotro.logic.timing.PlayConditions; -import com.gempukku.lotro.logic.timing.TriggerConditions; -import com.gempukku.lotro.logic.effects.AddBurdenEffect; -import com.gempukku.lotro.common.Keyword; -import com.gempukku.lotro.common.Phase; -import com.gempukku.lotro.filters.Filters; -import com.gempukku.lotro.game.PhysicalCard; -import com.gempukku.lotro.game.state.LotroGame; -import com.gempukku.lotro.logic.actions.RequiredTriggerAction; -import com.gempukku.lotro.logic.timing.EffectResult; - -import java.util.Collections; -import java.util.List; - -/** - * Set: Bloodlines - * Twilight Cost: 0 - * Type: Site - * Game Text: Underground. If this site is not in region 1 when the fellowship moves from here during the regroup phase, - * add a burden. - */ -public class Card13_185 extends AbstractShadowsSite { - public Card13_185() { - super("Abandoned Mine Shaft", 0, Direction.LEFT); - addKeyword(Keyword.UNDERGROUND); - } - - @Override - public List getRequiredAfterTriggers(LotroGame game, EffectResult effectResult, PhysicalCard self) { - if (TriggerConditions.movesFrom(game, effectResult, self, Filters.not(Filters.region(1))) - && PlayConditions.isPhase(game, Phase.REGROUP)) { - RequiredTriggerAction action = new RequiredTriggerAction(self); - action.appendEffect( - new AddBurdenEffect(self.getOwner(), self, 1)); - return Collections.singletonList(action); - } - return null; - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set13/site/Card13_186.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set13/site/Card13_186.java deleted file mode 100644 index b00b77621..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set13/site/Card13_186.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.gempukku.lotro.cards.set13.site; - -import com.gempukku.lotro.logic.cardtype.AbstractShadowsSite; -import com.gempukku.lotro.logic.timing.PlayConditions; -import com.gempukku.lotro.logic.timing.TriggerConditions; -import com.gempukku.lotro.logic.effects.RemoveBurdenEffect; -import com.gempukku.lotro.common.Keyword; -import com.gempukku.lotro.common.Phase; -import com.gempukku.lotro.game.PhysicalCard; -import com.gempukku.lotro.game.state.LotroGame; -import com.gempukku.lotro.logic.actions.OptionalTriggerAction; -import com.gempukku.lotro.logic.timing.EffectResult; - -import java.util.Collections; -import java.util.List; - -/** - * Set: Bloodlines - * Twilight Cost: 3 - * Type: Site - * Game Text: Underground. When the fellowship moves to this site during the regroup phase, the Free Peoples player may - * remove 2 burdens. - */ -public class Card13_186 extends AbstractShadowsSite { - public Card13_186() { - super("Caves of Aglarond", 3, Direction.RIGHT); - addKeyword(Keyword.UNDERGROUND); - } - - @Override - public List getOptionalAfterTriggers(String playerId, LotroGame game, EffectResult effectResult, PhysicalCard self) { - if (TriggerConditions.movesTo(game, effectResult, self) - && PlayConditions.isPhase(game, Phase.REGROUP) - && playerId.equals(game.getGameState().getCurrentPlayerId())) { - OptionalTriggerAction action = new OptionalTriggerAction(self); - action.appendEffect( - new RemoveBurdenEffect(playerId, self, 2)); - return Collections.singletonList(action); - } - return null; - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set13/site/Card13_187.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set13/site/Card13_187.java deleted file mode 100644 index f941edcf8..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set13/site/Card13_187.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.gempukku.lotro.cards.set13.site; - -import com.gempukku.lotro.logic.cardtype.AbstractShadowsSite; -import com.gempukku.lotro.logic.timing.PlayConditions; -import com.gempukku.lotro.logic.timing.TriggerConditions; -import com.gempukku.lotro.common.Keyword; -import com.gempukku.lotro.common.Phase; -import com.gempukku.lotro.game.PhysicalCard; -import com.gempukku.lotro.game.state.LotroGame; -import com.gempukku.lotro.logic.actions.OptionalTriggerAction; -import com.gempukku.lotro.logic.effects.DrawCardsEffect; -import com.gempukku.lotro.logic.timing.EffectResult; - -import java.util.Collections; -import java.util.List; - -/** - * Set: Bloodlines - * Twilight Cost: 3 - * Type: Site - * Game Text: Battleground. When the fellowship moves to this site during the regroup phase, the Free Peoples player may - * draw a card. - */ -public class Card13_187 extends AbstractShadowsSite { - public Card13_187() { - super("City of Kings", 3, Direction.RIGHT); - addKeyword(Keyword.BATTLEGROUND); - } - - @Override - public List getOptionalAfterTriggers(String playerId, LotroGame game, EffectResult effectResult, PhysicalCard self) { - if (TriggerConditions.movesTo(game, effectResult, self) - && PlayConditions.isPhase(game, Phase.REGROUP) - && playerId.equals(game.getGameState().getCurrentPlayerId())) { - OptionalTriggerAction action = new OptionalTriggerAction(self); - action.appendEffect( - new DrawCardsEffect(action, playerId, 1)); - return Collections.singletonList(action); - } - return null; - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set13/site/Card13_188.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set13/site/Card13_188.java deleted file mode 100644 index 46eb265c5..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set13/site/Card13_188.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.gempukku.lotro.cards.set13.site; - -import com.gempukku.lotro.logic.cardtype.AbstractShadowsSite; -import com.gempukku.lotro.logic.timing.PlayConditions; -import com.gempukku.lotro.logic.timing.TriggerConditions; -import com.gempukku.lotro.logic.effects.AddBurdenEffect; -import com.gempukku.lotro.common.Keyword; -import com.gempukku.lotro.filters.Filters; -import com.gempukku.lotro.game.PhysicalCard; -import com.gempukku.lotro.game.state.LotroGame; -import com.gempukku.lotro.logic.GameUtils; -import com.gempukku.lotro.logic.actions.OptionalTriggerAction; -import com.gempukku.lotro.logic.effects.ChooseAndDiscardCardsFromHandEffect; -import com.gempukku.lotro.logic.timing.EffectResult; - -import java.util.Collections; -import java.util.List; - -/** - * Set: Bloodlines - * Twilight Cost: 0 - * Type: Site - * Game Text: Dwelling. When the fellowship moves to this site, the first Shadow player may discard 2 cards from hand - * to add a burden. - */ -public class Card13_188 extends AbstractShadowsSite { - public Card13_188() { - super("Courtyard Parapet", 0, Direction.LEFT); - addKeyword(Keyword.DWELLING); - } - - @Override - public List getOptionalAfterTriggers(String playerId, LotroGame game, EffectResult effectResult, PhysicalCard self) { - String firstShadow = GameUtils.getFirstShadowPlayer(game); - if (TriggerConditions.movesTo(game, effectResult, self) - && playerId.equals(firstShadow) - && PlayConditions.canDiscardFromHand(game, playerId, 2, Filters.any)) { - OptionalTriggerAction action = new OptionalTriggerAction(self); - action.appendCost( - new ChooseAndDiscardCardsFromHandEffect(action, playerId, false, 2)); - action.appendEffect( - new AddBurdenEffect(playerId, self, 1)); - return Collections.singletonList(action); - } - return null; - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set13/site/Card13_189.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set13/site/Card13_189.java deleted file mode 100644 index b6ab22261..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set13/site/Card13_189.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.gempukku.lotro.cards.set13.site; - -import com.gempukku.lotro.logic.cardtype.AbstractShadowsSite; -import com.gempukku.lotro.logic.timing.PlayConditions; -import com.gempukku.lotro.logic.timing.TriggerConditions; -import com.gempukku.lotro.common.CardType; -import com.gempukku.lotro.common.Culture; -import com.gempukku.lotro.common.Keyword; -import com.gempukku.lotro.common.Phase; -import com.gempukku.lotro.filters.Filters; -import com.gempukku.lotro.game.PhysicalCard; -import com.gempukku.lotro.game.state.LotroGame; -import com.gempukku.lotro.logic.actions.OptionalTriggerAction; -import com.gempukku.lotro.logic.effects.ChooseActiveCardEffect; -import com.gempukku.lotro.logic.effects.HealCharactersEffect; -import com.gempukku.lotro.logic.timing.EffectResult; -import com.gempukku.lotro.logic.timing.UnrespondableEffect; - -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -/** - * Set: Bloodlines - * Twilight Cost: 3 - * Type: Site - * Game Text: Forest. When the fellowship moves to this site during the regroup phase, the Free Peoples player may heal - * a companion of each culture. - */ -public class Card13_189 extends AbstractShadowsSite { - public Card13_189() { - super("Crossroads of the Fallen Kings", 3, Direction.RIGHT); - addKeyword(Keyword.FOREST); - } - - @Override - public List getOptionalAfterTriggers(String playerId, LotroGame game, EffectResult effectResult, final PhysicalCard self) { - if (TriggerConditions.movesTo(game, effectResult, self) - && PlayConditions.isPhase(game, Phase.REGROUP) - && playerId.equals(game.getGameState().getCurrentPlayerId())) { - final OptionalTriggerAction action = new OptionalTriggerAction(self); - Set companionCultures = new HashSet<>(); - for (PhysicalCard companion : Filters.filterActive(game, CardType.COMPANION)) { - if (companion.getBlueprint().getCulture() != null) - companionCultures.add(companion.getBlueprint().getCulture()); - } - - final Set companionsToHeal = new HashSet<>(); - - for (Culture companionCulture : companionCultures) { - action.appendEffect( - new ChooseActiveCardEffect(self, playerId, "Choose a companion to heal", CardType.COMPANION, companionCulture, Filters.canHeal) { - @Override - protected void cardSelected(LotroGame game, PhysicalCard card) { - companionsToHeal.add(card); - } - }); - } - - action.appendEffect( - new UnrespondableEffect() { - @Override - protected void doPlayEffect(LotroGame game) { - action.appendEffect( - new HealCharactersEffect(self, self.getOwner(), Filters.in(companionsToHeal))); - } - }); - return Collections.singletonList(action); - } - return null; - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set13/site/Card13_190.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set13/site/Card13_190.java deleted file mode 100644 index 5d4dfd710..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set13/site/Card13_190.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.gempukku.lotro.cards.set13.site; - -import com.gempukku.lotro.common.CardType; -import com.gempukku.lotro.common.Keyword; -import com.gempukku.lotro.common.Phase; -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.state.LotroGame; -import com.gempukku.lotro.logic.cardtype.AbstractShadowsSite; -import com.gempukku.lotro.logic.modifiers.Modifier; -import com.gempukku.lotro.logic.modifiers.StrengthModifier; -import com.gempukku.lotro.logic.modifiers.condition.NotCondition; -import com.gempukku.lotro.logic.modifiers.condition.PhaseCondition; - -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Set: Bloodlines - * Twilight Cost: 0 - * Type: Site - * Game Text: Marsh. Each companion of a race that has the most companions is strength -1 until the regroup phase. - */ -public class Card13_190 extends AbstractShadowsSite { - public Card13_190() { - super("Doors of Durin", 0, Direction.LEFT); - addKeyword(Keyword.MARSH); - } - - @Override - public List getInPlayModifiers(LotroGame game, PhysicalCard self) { - return Collections.singletonList(new StrengthModifier(self, - Filters.and(CardType.COMPANION, - new Filter() { - @Override - public boolean accepts(LotroGame game, PhysicalCard physicalCard) { - final Race race = physicalCard.getBlueprint().getRace(); - if (race != null && isRaceMostCommonRaceAmongCompanions(game, race)) - return true; - return false; - } - }), new NotCondition(new PhaseCondition(Phase.REGROUP)), -1)); - } - - private boolean isRaceMostCommonRaceAmongCompanions(LotroGame game, Race race) { - if (race == null) - return false; - - Map counts = new HashMap<>(); - for (PhysicalCard companion : Filters.filterActive(game, CardType.COMPANION)) { - final Race companionRace = companion.getBlueprint().getRace(); - if (companionRace != null) { - Integer count = counts.get(companionRace); - if (count == null) - count = 0; - counts.put(companionRace, count + 1); - } - } - - final Integer thisRaceCount = counts.get(race); - if (thisRaceCount == null) - return false; - for (Map.Entry raceCount : counts.entrySet()) { - if (raceCount.getValue() > thisRaceCount) - return false; - } - return true; - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set13/site/Card13_191.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set13/site/Card13_191.java deleted file mode 100644 index d2dff0f3f..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set13/site/Card13_191.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.gempukku.lotro.cards.set13.site; - -import com.gempukku.lotro.common.Keyword; -import com.gempukku.lotro.filters.Filters; -import com.gempukku.lotro.game.PhysicalCard; -import com.gempukku.lotro.game.state.LotroGame; -import com.gempukku.lotro.logic.cardtype.AbstractShadowsSite; -import com.gempukku.lotro.logic.modifiers.Modifier; -import com.gempukku.lotro.logic.modifiers.StrengthModifier; -import com.gempukku.lotro.logic.modifiers.evaluator.Evaluator; - -import java.util.Collections; -import java.util.List; - -/** - * Set: Bloodlines - * Twilight Cost: 2 - * Type: Site - * Game Text: River. Each character is strength +1 for each card borne by that character. - */ -public class Card13_191 extends AbstractShadowsSite { - public Card13_191() { - super("Fords of Isen", 2, Direction.LEFT); - addKeyword(Keyword.RIVER); - } - - @Override - public List getInPlayModifiers(LotroGame game, PhysicalCard self) { - return Collections.singletonList(new StrengthModifier(self, Filters.character, null, - new Evaluator() { - @Override - public int evaluateExpression(LotroGame game, PhysicalCard cardAffected) { - return Filters.countActive(game, Filters.attachedTo(cardAffected)); - } - })); - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set13/site/Card13_192.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set13/site/Card13_192.java deleted file mode 100644 index 994da883a..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set13/site/Card13_192.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.gempukku.lotro.cards.set13.site; - -import com.gempukku.lotro.common.CardType; -import com.gempukku.lotro.common.Keyword; -import com.gempukku.lotro.filters.Filters; -import com.gempukku.lotro.game.PhysicalCard; -import com.gempukku.lotro.game.state.LotroGame; -import com.gempukku.lotro.logic.cardtype.AbstractShadowsSite; -import com.gempukku.lotro.logic.modifiers.Condition; -import com.gempukku.lotro.logic.modifiers.Modifier; -import com.gempukku.lotro.logic.modifiers.StrengthModifier; - -import java.util.Collections; -import java.util.List; - -/** - * Set: Bloodlines - * Twilight Cost: 0 - * Type: Site - * Game Text: Battleground. While a player can spot more companions than minions, each minion is strength +1. - */ -public class Card13_192 extends AbstractShadowsSite { - public Card13_192() { - super("The Great Gates", 0, Direction.LEFT); - addKeyword(Keyword.BATTLEGROUND); - } - - @Override - public List getInPlayModifiers(LotroGame game, PhysicalCard self) { - return Collections.singletonList(new StrengthModifier(self, CardType.MINION, - new Condition() { - @Override - public boolean isFullfilled(LotroGame game) { - return Filters.countActive(game, CardType.COMPANION) - > Filters.countActive(game, CardType.MINION); - } - }, 1)); - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set13/site/Card13_193.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set13/site/Card13_193.java deleted file mode 100644 index 921b3d33d..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set13/site/Card13_193.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.gempukku.lotro.cards.set13.site; - -import com.gempukku.lotro.logic.cardtype.AbstractShadowsSite; -import com.gempukku.lotro.logic.timing.PlayConditions; -import com.gempukku.lotro.logic.timing.TriggerConditions; -import com.gempukku.lotro.logic.effects.choose.ChooseAndExertCharactersEffect; -import com.gempukku.lotro.common.CardType; -import com.gempukku.lotro.common.Keyword; -import com.gempukku.lotro.common.Phase; -import com.gempukku.lotro.game.PhysicalCard; -import com.gempukku.lotro.game.state.LotroGame; -import com.gempukku.lotro.logic.actions.OptionalTriggerAction; -import com.gempukku.lotro.logic.timing.EffectResult; - -import java.util.Collections; -import java.util.List; - -/** - * Set: Bloodlines - * Twilight Cost: 0 - * Type: Site - * Game Text: Battleground. Plains. At the start of the regroup phase, each Shadow player may exert a minion to exert - * a companion. - */ -public class Card13_193 extends AbstractShadowsSite { - public Card13_193() { - super("Isenwash", 0, Direction.LEFT); - addKeyword(Keyword.BATTLEGROUND); - addKeyword(Keyword.PLAINS); - } - - @Override - public List getOptionalAfterTriggers(String playerId, LotroGame game, EffectResult effectResult, PhysicalCard self) { - if (TriggerConditions.startOfPhase(game, effectResult, Phase.REGROUP) - && !playerId.equals(game.getGameState().getCurrentPlayerId()) - && PlayConditions.canExert(self, game, CardType.MINION)) { - OptionalTriggerAction action = new OptionalTriggerAction(self); - action.appendCost( - new ChooseAndExertCharactersEffect(action, playerId, 1, 1, CardType.MINION)); - action.appendEffect( - new ChooseAndExertCharactersEffect(action, playerId, 1, 1, CardType.COMPANION)); - return Collections.singletonList(action); - } - return null; - } -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set13/site/Card13_194.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set13/site/Card13_194.java deleted file mode 100644 index cc67222c4..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set13/site/Card13_194.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.gempukku.lotro.cards.set13.site; - -import com.gempukku.lotro.common.Keyword; -import com.gempukku.lotro.game.PhysicalCard; -import com.gempukku.lotro.game.state.LotroGame; -import com.gempukku.lotro.logic.cardtype.AbstractShadowsSite; -import com.gempukku.lotro.logic.modifiers.Modifier; -import com.gempukku.lotro.logic.modifiers.ModifierFlag; -import com.gempukku.lotro.logic.modifiers.SpecialFlagModifier; - -import java.util.Collections; -import java.util.List; - -/** - * Set: Bloodlines - * Twilight Cost: 2 - * Type: Site - * Game Text: Mountain. Culture tokens cannot be added, removed, or reinforced. - */ -public class Card13_194 extends AbstractShadowsSite { - public Card13_194() { - super("Redhorn Pass", 2, Direction.LEFT); - addKeyword(Keyword.MOUNTAIN); - } - - @Override - public List getInPlayModifiers(LotroGame game, PhysicalCard self) { -return Collections.singletonList(new SpecialFlagModifier(self, ModifierFlag.CANT_TOUCH_CULTURE_TOKENS)); -} -} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/card-stubs/set13-Sites.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set13/set13-Sites.hjson similarity index 61% rename from gemp-lotr/gemp-lotr-cards/src/main/resources/card-stubs/set13-Sites.hjson rename to gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set13/set13-Sites.hjson index 066f838fc..49d823268 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/card-stubs/set13-Sites.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set13/set13-Sites.hjson @@ -23,6 +23,20 @@ direction: Left keywords: Underground effects: [ + { + type: trigger + trigger: { + type: movesFrom + filter: self,not(regionNumber(1)) + } + requires: { + type: phase + phase: regroup + } + effect: { + type: addBurdens + } + } ] gametext: Underground. If this site is not in region 1 when the fellowship moves from here during the regroup phase, add a burden. lore: "" @@ -58,6 +72,23 @@ direction: Right keywords: Underground effects: [ + { + type: trigger + optional: true + player: free people + trigger: { + type: movesTo + filter: self + } + requires: { + type: phase + phase: regroup + } + effect: { + type: removeBurdens + amount: 2 + } + } ] gametext: Underground. When the fellowship moves to this site during the regroup phase, the Free Peoples player may remove 2 burdens. lore: "" @@ -93,6 +124,23 @@ direction: Right keywords: Battleground effects: [ + { + type: trigger + optional: true + player: free people + trigger: { + type: movesTo + filter: self + } + requires: { + type: phase + phase: regroup + } + effect: { + type: drawCards + player: free people + } + } ] gametext: Battleground. When the fellowship moves to this site during the regroup phase, the Free Peoples player may draw a card. lore: "" @@ -128,6 +176,23 @@ direction: Left keywords: Dwelling effects: [ + { + type: trigger + optional: true + player: shadow + trigger: { + type: movesTo + filter: self + } + cost: { + type: discardFromHand + forced: false + count: 2 + } + effect: { + type: addBurdens + } + } ] gametext: Dwelling. When the fellowship moves to this site, the first Shadow player may discard 2 cards from hand to add a burden. lore: "" @@ -162,6 +227,53 @@ block: Shadows direction: Right effects: [ + { + type: trigger + optional: true + player: free people + trigger: { + type: movesTo + filter: self + } + requires: { + type: phase + phase: regroup + } + effect: [ + { + type: heal + filter: choose(companion,culture(dwarven)) + } + { + type: heal + filter: choose(companion,culture(elven)) + } + { + type: heal + filter: choose(companion,culture(gandalf)) + } + { + type: heal + filter: choose(companion,culture(gollum)) + } + { + type: heal + filter: choose(companion,culture(gondor)) + } + { + type: heal + filter: choose(companion,culture(rohan)) + } + { + type: heal + filter: choose(companion,culture(shire)) + } + { + type: heal + filter: choose(companion,culture(esgaroth)) + } + ] + } ] gametext: Forest. When the fellowship moves to this site during the regroup phase, the Free Peoples player may heal a companion of each culture. lore: "" @@ -197,6 +309,14 @@ direction: Left keywords: Marsh effects: [ + { + type: modifier + modifier: { + type: modifyStrength + filter: companion,highestRaceCount(companion) + amount: -1 + } + } ] gametext: Marsh. Each companion of each race that has the most companions is strength -1. lore: "" @@ -232,6 +352,17 @@ direction: Left keywords: River effects: [ + { + type: modifier + modifier: { + type: modifyStrength + filter: character + amount: { + type: forEachHasAttached + filter: any + } + } + } ] gametext: River. Each character is strength +1 for each card borne by that character. lore: "" @@ -267,6 +398,25 @@ direction: Left keywords: Battleground effects: [ + { + type: modifier + modifier: { + type: modifyStrength + requires: { + type: isGreaterThan + firstNumber: { + type: forEachYouCanSpot + filter: companion + } + secondNumber: { + type: forEachYouCanSpot + filter: minion + } + } + filter: minion + amount: 1 + } + } ] gametext: Battleground. While a player can spot more companions than minions, each minion is strength +1. lore: "" @@ -305,6 +455,23 @@ Plains ] effects: [ + { + type: trigger + optional: true + player: shadow + trigger: { + type: startOfPhase + phase: regroup + } + cost: { + type: exert + filter: choose(minion) + } + effect: { + type: exert + filter: choose(companion) + } + } ] gametext: Battleground. Plains. At the start of the regroup phase, each Shadow player may exert a minion to exert a companion. lore: "" @@ -340,6 +507,12 @@ direction: Left keywords: Mountain effects: [ + { + type: modifier + modifier: { + type: cantTouchTokens + } + } ] gametext: Mountain. Culture tokens cannot be added, removed, or reinforced. lore: "" 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 d7e43968c..3f0a356c0 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 @@ -297,6 +297,38 @@ public class FilterFactory { return Filters.filter(game.getGameState().getSkirmish().getShadowCharacters(), game, filterable).size() >= count; }); }); + parameterFilters.put("highestracecount", + (parameter, environment) -> { + final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(parameter, environment); + return actionContext -> { + final Filterable sourceFilterable = filterableSource.getFilterable(actionContext); + + Map counts = new HashMap<>(); + for (PhysicalCard card : Filters.filterActive(actionContext.getGame(), sourceFilterable)) { + final Race race = card.getBlueprint().getRace(); + if (race != null) { + Integer count = counts.get(race); + if (count == null) + count = 0; + counts.put(race, count + 1); + } + } + + int highestCount = 0; + for (Integer value : counts.values()) { + if (value > highestCount) + highestCount = value; + } + + Set highestNumberRaces = new HashSet<>(); + for (Map.Entry raceIntegerEntry : counts.entrySet()) { + if (raceIntegerEntry.getValue() == highestCount) + highestNumberRaces.add(raceIntegerEntry.getKey()); + } + + return Filters.or(highestNumberRaces.toArray(new Race[0])); + }; + }); parameterFilters.put("higheststrength", (parameter, environment) -> { final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(parameter, environment); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceFactory.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceFactory.java index b49e409a6..0c91c93a2 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceFactory.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceFactory.java @@ -53,6 +53,7 @@ public class ModifierSourceFactory { modifierProducers.put("canttakearcherywounds", new CantTakeArcheryWounds()); modifierProducers.put("canttakemorewoundsthan", new CantTakeMoreWoundsThan()); modifierProducers.put("canttakewounds", new CantTakeWounds()); + modifierProducers.put("canttouchtokens", new AddModifierFlag(ModifierFlag.CANT_TOUCH_CULTURE_TOKENS)); modifierProducers.put("cantusespecialabilities", new CantUseSpecialAbilities()); modifierProducers.put("disablegametext", new DisableGameText()); modifierProducers.put("doesnotaddtoarcherytotal", new DoesNotAddToArcheryTotal());