"Balin Avenged"
This commit is contained in:
@@ -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));
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user