From 3af00b2375c6f0f72b32fa721861f80d066d1366 Mon Sep 17 00:00:00 2001 From: "marcins78@gmail.com" Date: Thu, 9 Feb 2012 21:57:24 +0000 Subject: [PATCH] "Balin Avenged" --- .../cards/AbstractLotroCardBlueprint.java | 3 + .../lotro/cards/AbstractPermanent.java | 5 ++ .../AbstractExtraPlayCostModifier.java | 30 ++++++++ .../CanSpotCultureTokensCondition.java | 9 ++- .../lotro/cards/set17/dwarven/Card17_002.java | 70 +++++++++++++++++++ .../logic/modifiers/AbstractModifier.java | 11 +++ .../lotro/logic/modifiers/Modifier.java | 5 ++ .../lotro/logic/modifiers/ModifierEffect.java | 3 +- .../lotro/logic/modifiers/ModifiersLogic.java | 24 +++++++ .../logic/modifiers/ModifiersQuerying.java | 5 ++ 10 files changed, 163 insertions(+), 2 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/AbstractExtraPlayCostModifier.java create mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set17/dwarven/Card17_002.java diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractLotroCardBlueprint.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractLotroCardBlueprint.java index 9279adaff..310cb9c8e 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractLotroCardBlueprint.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractLotroCardBlueprint.java @@ -41,6 +41,9 @@ public abstract class AbstractLotroCardBlueprint implements LotroCardBlueprint { @Override public boolean checkPlayRequirements(String playerId, LotroGame game, PhysicalCard self, int withTwilightRemoved, int twilightModifier, boolean ignoreRoamingPenalty, boolean ignoreCheckingDeadPile) { + if (!game.getModifiersQuerying().canPayExtraCostsToPlay(game.getGameState(), self)) + return false; + int toilCount = game.getModifiersQuerying().getKeywordCount(game.getGameState(), self, Keyword.TOIL); if (toilCount > 0) twilightModifier -= toilCount * Filters.countActive(game.getGameState(), game.getModifiersQuerying(), Filters.owner(playerId), getCulture(), Filters.character, Filters.canExert(self)); diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractPermanent.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractPermanent.java index 7e22289ea..0443a67e8 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractPermanent.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractPermanent.java @@ -35,6 +35,11 @@ public class AbstractPermanent extends AbstractLotroCardBlueprint { DiscountEffect discountEffect = getDiscountEffect(action, playerId, game, self); if (discountEffect != null) action.setDiscountEffect(discountEffect); + + List extraCosts = game.getModifiersQuerying().getExtraCostsToPlay(game.getGameState(), self); + for (Effect extraCost : extraCosts) + action.appendCost(extraCost); + return action; } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/AbstractExtraPlayCostModifier.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/AbstractExtraPlayCostModifier.java new file mode 100644 index 000000000..45ec62dea --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/AbstractExtraPlayCostModifier.java @@ -0,0 +1,30 @@ +package com.gempukku.lotro.cards.modifiers; + +import com.gempukku.lotro.common.Filterable; +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.GameState; +import com.gempukku.lotro.logic.modifiers.AbstractModifier; +import com.gempukku.lotro.logic.modifiers.Condition; +import com.gempukku.lotro.logic.modifiers.ModifierEffect; +import com.gempukku.lotro.logic.modifiers.ModifiersQuerying; +import com.gempukku.lotro.logic.timing.Action; +import com.gempukku.lotro.logic.timing.Effect; + +import java.util.List; + +public abstract class AbstractExtraPlayCostModifier extends AbstractModifier { + + public AbstractExtraPlayCostModifier(PhysicalCard source, String text, Filterable affectFilter) { + super(source, text, affectFilter, ModifierEffect.EXTRA_COST_MODIFIER); + } + + public AbstractExtraPlayCostModifier(PhysicalCard source, String text, Filterable affectFilter, Condition condition) { + super(source, text, affectFilter, condition, ModifierEffect.EXTRA_COST_MODIFIER); + } + + @Override + public abstract List getExtraCostsToPlay(GameState gameState, ModifiersQuerying modifiersQueirying, Action action, PhysicalCard card); + + @Override + public abstract boolean canPayExtraCostsToPlay(GameState gameState, ModifiersQuerying modifiersQueirying, PhysicalCard card); +} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/conditions/CanSpotCultureTokensCondition.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/conditions/CanSpotCultureTokensCondition.java index 82d9924df..3b95f2fc6 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/conditions/CanSpotCultureTokensCondition.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/conditions/CanSpotCultureTokensCondition.java @@ -11,17 +11,24 @@ import java.util.Map; public class CanSpotCultureTokensCondition implements Condition { private int _count; + private Token _token; public CanSpotCultureTokensCondition(int count) { _count = count; } + public CanSpotCultureTokensCondition(int count, Token token) { + _count = count; + _token = token; + } + @Override public boolean isFullfilled(GameState gameState, ModifiersQuerying modifiersQuerying) { int count = 0; for (PhysicalCard physicalCard : Filters.filterActive(gameState, modifiersQuerying, Filters.hasAnyCultureTokens(1))) { for (Map.Entry tokenCountEntry : gameState.getTokens(physicalCard).entrySet()) { - if (tokenCountEntry.getKey().getCulture() != null) { + if ((_token == null && tokenCountEntry.getKey().getCulture() != null) + || (tokenCountEntry.getKey() == _token)) { count += tokenCountEntry.getValue(); if (count >= _count) return true; diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set17/dwarven/Card17_002.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set17/dwarven/Card17_002.java new file mode 100644 index 000000000..7b2353816 --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set17/dwarven/Card17_002.java @@ -0,0 +1,70 @@ +package com.gempukku.lotro.cards.set17.dwarven; + +import com.gempukku.lotro.cards.AbstractPermanent; +import com.gempukku.lotro.cards.TriggerConditions; +import com.gempukku.lotro.cards.effects.AddTokenEffect; +import com.gempukku.lotro.cards.effects.choose.ChooseAndRemoveFromTheGameCardsInDiscardEffect; +import com.gempukku.lotro.cards.modifiers.AbstractExtraPlayCostModifier; +import com.gempukku.lotro.cards.modifiers.conditions.AndCondition; +import com.gempukku.lotro.cards.modifiers.conditions.CanSpotCultureTokensCondition; +import com.gempukku.lotro.common.*; +import com.gempukku.lotro.filters.Filters; +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.GameState; +import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.logic.actions.OptionalTriggerAction; +import com.gempukku.lotro.logic.modifiers.Modifier; +import com.gempukku.lotro.logic.modifiers.ModifiersQuerying; +import com.gempukku.lotro.logic.modifiers.SpotCondition; +import com.gempukku.lotro.logic.timing.Action; +import com.gempukku.lotro.logic.timing.Effect; +import com.gempukku.lotro.logic.timing.EffectResult; + +import java.util.Collections; +import java.util.List; + +/** + * Set: Rise of Saruman + * Side: Free + * Culture: Dwarven + * Twilight Cost: 4 + * Type: Condition • Support Area + * Game Text: When you play this condition, you may add a [DWARVEN] token here. While you can spot 4 [DWARVEN] tokens + * and 2 Dwarves, each [ORC] Orc gains this text 'To play, remove an [ORC] card from your discard pile from the game.' + * Skirmish: Discard this condition to exert a minion for each Dwarf you can spot. + */ +public class Card17_002 extends AbstractPermanent { + public Card17_002() { + super(Side.FREE_PEOPLE, 4, CardType.CONDITION, Culture.DWARVEN, Zone.SUPPORT, "Balin Avenged", true); + } + + @Override + public List getOptionalAfterTriggers(String playerId, LotroGame game, EffectResult effectResult, PhysicalCard self) { + if (TriggerConditions.played(game, effectResult, self)) { + OptionalTriggerAction action = new OptionalTriggerAction(self); + action.appendEffect( + new AddTokenEffect(self, self, Token.DWARVEN)); + return Collections.singletonList(action); + } + return null; + } + + @Override + public Modifier getAlwaysOnModifier(final PhysicalCard self) { + return new AbstractExtraPlayCostModifier(self, "To play, remove an ORC card from your discard pile from the game.", Filters.and(Culture.ORC, Race.ORC), + new AndCondition( + new CanSpotCultureTokensCondition(4, Token.DWARVEN), + new SpotCondition(2, Race.DWARF))) { + @Override + public boolean canPayExtraCostsToPlay(GameState gameState, ModifiersQuerying modifiersQueirying, PhysicalCard card) { + return Filters.filter(gameState.getDiscard(card.getOwner()), gameState, modifiersQueirying, Culture.ORC).size() > 0; + } + + @Override + public List getExtraCostsToPlay(GameState gameState, ModifiersQuerying modifiersQueirying, Action action, PhysicalCard card) { + return Collections.singletonList( + new ChooseAndRemoveFromTheGameCardsInDiscardEffect(action, self, self.getOwner(), 1, 1, Culture.ORC)); + } + }; + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/AbstractModifier.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/AbstractModifier.java index 43abe3648..04670f85e 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/AbstractModifier.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/AbstractModifier.java @@ -7,6 +7,7 @@ import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.game.state.GameState; import com.gempukku.lotro.logic.actions.ActivateCardAction; import com.gempukku.lotro.logic.timing.Action; +import com.gempukku.lotro.logic.timing.Effect; import java.util.List; import java.util.Map; @@ -206,6 +207,16 @@ public abstract class AbstractModifier implements Modifier { return null; } + @Override + public boolean canPayExtraCostsToPlay(GameState gameState, ModifiersQuerying modifiersQueirying, PhysicalCard card) { + return true; + } + + @Override + public List getExtraCostsToPlay(GameState gameState, ModifiersQuerying modifiersQueirying, Action action, PhysicalCard card) { + return null; + } + @Override public boolean canHavePlayedOn(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard playedCard, PhysicalCard target) { return true; diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/Modifier.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/Modifier.java index d4d1777ca..55c35c974 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/Modifier.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/Modifier.java @@ -6,6 +6,7 @@ import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.game.state.GameState; import com.gempukku.lotro.logic.actions.ActivateCardAction; import com.gempukku.lotro.logic.timing.Action; +import com.gempukku.lotro.logic.timing.Effect; import java.util.List; import java.util.Map; @@ -84,6 +85,10 @@ public interface Modifier { public List getExtraPhaseActionFromStacked(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card); + public boolean canPayExtraCostsToPlay(GameState gameState, ModifiersQuerying modifiersQueirying, PhysicalCard card); + + public List getExtraCostsToPlay(GameState gameState, ModifiersQuerying modifiersQueirying, Action action, PhysicalCard card); + public boolean canHavePlayedOn(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard playedCard, PhysicalCard target); public boolean canHaveTransferredOn(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard playedCard, PhysicalCard target); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifierEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifierEffect.java index 6af58d7c5..939fae936 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifierEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifierEffect.java @@ -9,7 +9,8 @@ public enum ModifierEffect { PRESENCE_MODIFIER, ARCHERY_MODIFIER, MOVE_LIMIT_MODIFIER, ACTION_MODIFIER, ASSIGNMENT_MODIFIER, DISCARD_FROM_PLAY_MODIFIER, DISCARD_NOT_FROM_PLAY, LOOK_OR_REVEAL_MODIFIER, SPOT_MODIFIER, TARGET_MODIFIER, RETURN_TO_HAND_MODIFIER, - EXTRA_ACTION_MODIFIER, INITIATIVE_MODIFIER, TEXT_MODIFIER, + EXTRA_ACTION_MODIFIER, EXTRA_COST_MODIFIER, + INITIATIVE_MODIFIER, TEXT_MODIFIER, SPECIAL_FLAG_MODIFIER, REPLACE_SITE_MODIFIER, diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersLogic.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersLogic.java index f7f103479..e089811a7 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersLogic.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersLogic.java @@ -6,6 +6,7 @@ import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.game.state.GameState; import com.gempukku.lotro.logic.actions.ActivateCardAction; import com.gempukku.lotro.logic.timing.Action; +import com.gempukku.lotro.logic.timing.Effect; import java.util.*; @@ -651,6 +652,29 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying { return activateCardActions; } + @Override + public boolean canPayExtraCostsToPlay(GameState gameState, PhysicalCard target) { + for (Modifier modifier : getModifiersAffectingCard(gameState, ModifierEffect.EXTRA_COST_MODIFIER, target)) { + if (!modifier.canPayExtraCostsToPlay(gameState, this, target)) + return false; + } + + return true; + } + + @Override + public List getExtraCostsToPlay(GameState gameState, Action action, PhysicalCard target) { + List extraCardActions = new LinkedList(); + + for (Modifier modifier : getModifiersAffectingCard(gameState, ModifierEffect.EXTRA_COST_MODIFIER, target)) { + List effects = modifier.getExtraCostsToPlay(gameState, this, action, target); + if (effects != null) + extraCardActions.addAll(effects); + } + + return extraCardActions; + } + @Override public boolean isValidAssignments(GameState gameState, Side side, Map> assignments) { for (Modifier modifier : getModifiers(gameState, ModifierEffect.ASSIGNMENT_MODIFIER)) { diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersQuerying.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersQuerying.java index 2cc3ea7a1..b779f8abd 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersQuerying.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersQuerying.java @@ -6,6 +6,7 @@ import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.game.state.GameState; import com.gempukku.lotro.logic.actions.ActivateCardAction; import com.gempukku.lotro.logic.timing.Action; +import com.gempukku.lotro.logic.timing.Effect; import java.util.Collection; import java.util.List; @@ -95,6 +96,10 @@ public interface ModifiersQuerying { public List getExtraPhaseActionsFromStacked(GameState gameState, PhysicalCard target); + public boolean canPayExtraCostsToPlay(GameState gameState, PhysicalCard target); + + public List getExtraCostsToPlay(GameState gameState, Action action, PhysicalCard target); + // Others public boolean canBeDiscardedFromPlay(GameState gameState, PhysicalCard card, PhysicalCard source);