"Balin Avenged"

This commit is contained in:
marcins78@gmail.com
2012-02-09 21:57:24 +00:00
parent dc3fd4548d
commit 3af00b2375
10 changed files with 163 additions and 2 deletions

View File

@@ -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));

View File

@@ -35,6 +35,11 @@ public class AbstractPermanent extends AbstractLotroCardBlueprint {
DiscountEffect discountEffect = getDiscountEffect(action, playerId, game, self);
if (discountEffect != null)
action.setDiscountEffect(discountEffect);
List<? extends Effect> extraCosts = game.getModifiersQuerying().getExtraCostsToPlay(game.getGameState(), self);
for (Effect extraCost : extraCosts)
action.appendCost(extraCost);
return action;
}

View File

@@ -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<? extends Effect> getExtraCostsToPlay(GameState gameState, ModifiersQuerying modifiersQueirying, Action action, PhysicalCard card);
@Override
public abstract boolean canPayExtraCostsToPlay(GameState gameState, ModifiersQuerying modifiersQueirying, PhysicalCard card);
}

View File

@@ -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<Token, Integer> 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;

View File

@@ -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<OptionalTriggerAction> 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<? extends Effect> getExtraCostsToPlay(GameState gameState, ModifiersQuerying modifiersQueirying, Action action, PhysicalCard card) {
return Collections.singletonList(
new ChooseAndRemoveFromTheGameCardsInDiscardEffect(action, self, self.getOwner(), 1, 1, Culture.ORC));
}
};
}
}

View File

@@ -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<? extends Effect> 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;

View File

@@ -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<? extends Action> getExtraPhaseActionFromStacked(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card);
public boolean canPayExtraCostsToPlay(GameState gameState, ModifiersQuerying modifiersQueirying, PhysicalCard card);
public List<? extends Effect> 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);

View File

@@ -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,

View File

@@ -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<? extends Effect> getExtraCostsToPlay(GameState gameState, Action action, PhysicalCard target) {
List<Effect> extraCardActions = new LinkedList<Effect>();
for (Modifier modifier : getModifiersAffectingCard(gameState, ModifierEffect.EXTRA_COST_MODIFIER, target)) {
List<? extends Effect> effects = modifier.getExtraCostsToPlay(gameState, this, action, target);
if (effects != null)
extraCardActions.addAll(effects);
}
return extraCardActions;
}
@Override
public boolean isValidAssignments(GameState gameState, Side side, Map<PhysicalCard, Set<PhysicalCard>> assignments) {
for (Modifier modifier : getModifiers(gameState, ModifierEffect.ASSIGNMENT_MODIFIER)) {

View File

@@ -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<? extends Action> getExtraPhaseActionsFromStacked(GameState gameState, PhysicalCard target);
public boolean canPayExtraCostsToPlay(GameState gameState, PhysicalCard target);
public List<? extends Effect> getExtraCostsToPlay(GameState gameState, Action action, PhysicalCard target);
// Others
public boolean canBeDiscardedFromPlay(GameState gameState, PhysicalCard card, PhysicalCard source);