This commit is contained in:
marcins78@gmail.com
2011-11-20 00:31:42 +00:00
parent 9ca8060c52
commit a8fd81e326
8 changed files with 116 additions and 33 deletions

View File

@@ -0,0 +1,50 @@
package com.gempukku.lotro.cards.set9.dwarven;
import com.gempukku.lotro.cards.AbstractCompanion;
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.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.modifiers.AbstractModifier;
import com.gempukku.lotro.logic.modifiers.Modifier;
import com.gempukku.lotro.logic.modifiers.ModifierEffect;
import com.gempukku.lotro.logic.modifiers.ModifiersQuerying;
import com.gempukku.lotro.logic.timing.Action;
import java.util.Collections;
import java.util.List;
/**
* Set: Reflections
* Side: Free
* Culture: Dwarven
* Twilight Cost: 2
* Type: Companion • Dwarf
* Strength: 6
* Vitality: 3
* Resistance: 6
* Game Text: You may play [DWARVEN] skirmish events stacked on [DWARVEN] conditions as if from hand.
*/
public class Card9_010 extends AbstractCompanion {
public Card9_010() {
super(2, 6, 3, Culture.DWARVEN, Race.DWARF, null, "Sindri", true);
}
@Override
public List<? extends Modifier> getAlwaysOnModifiers(final LotroGame game, PhysicalCard self) {
return Collections.singletonList(
new AbstractModifier(self, null, Filters.and(Culture.DWARVEN, CardType.EVENT, Keyword.SKIRMISH, Filters.stackedOn(Culture.DWARVEN, CardType.CONDITION)), ModifierEffect.EXTRA_ACTION_MODIFIER) {
@Override
public List<? extends Action> getExtraPhaseActionFromStacked(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card) {
if (card.getBlueprint().checkPlayRequirements(card.getOwner(), game, card, 0, false))
return Collections.singletonList(
card.getBlueprint().getPlayCardAction(card.getOwner(), game, card, 0, false));
return null;
}
});
}
}

View File

@@ -580,6 +580,15 @@ public class Filters {
};
}
public static Filter stackedOn(final Filterable... filters) {
return new Filter() {
@Override
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
return physicalCard.getStackedOn() != null && Filters.and(filters).accepts(gameState, modifiersQuerying, physicalCard.getStackedOn());
}
};
}
public static Filter siteControlledByShadowPlayer(final String fellowshipPlayer) {
return new Filter() {
@Override

View File

@@ -11,7 +11,6 @@ import com.gempukku.lotro.logic.timing.ActionStack;
import com.gempukku.lotro.logic.timing.Effect;
import com.gempukku.lotro.logic.timing.EffectResult;
import com.gempukku.lotro.logic.timing.processes.GatherPlayableActionsFromDiscardVisitor;
import com.gempukku.lotro.logic.timing.processes.GatherPlayableActionsFromStackedVisitor;
import com.gempukku.lotro.logic.timing.results.PlayCardResult;
import com.gempukku.lotro.logic.timing.rules.CharacterDeathRule;
@@ -445,4 +444,37 @@ public class DefaultActionsEnvironment implements ActionsEnvironment {
return _actions;
}
}
private class GatherPlayableActionsFromStackedVisitor extends CompletePhysicalCardVisitor {
private LotroGame _game;
private String _playerId;
private List<Action> _actions = new LinkedList<Action>();
public GatherPlayableActionsFromStackedVisitor(LotroGame game, String playerId) {
_game = game;
_playerId = playerId;
}
@Override
protected void doVisitPhysicalCard(PhysicalCard physicalCard) {
List<? extends Action> list = physicalCard.getBlueprint().getPhaseActionsFromStacked(_playerId, _game, physicalCard);
if (list != null)
_actions.addAll(list);
final List<? extends Action> extraActions = _game.getModifiersQuerying().getExtraPhaseActionsFromStacked(_game.getGameState(), physicalCard);
if (extraActions != null) {
for (Action action : extraActions) {
if (action != null)
_actions.add(action);
else
System.out.println("Null action from: " + physicalCard.getBlueprint().getName());
}
}
}
public List<? extends Action> getActions() {
return _actions;
}
}
}

View File

@@ -178,6 +178,11 @@ public abstract class AbstractModifier implements Modifier {
return null;
}
@Override
public List<? extends Action> getExtraPhaseActionFromStacked(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card) {
return null;
}
@Override
public boolean canHavePlayedOn(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard playedCard, PhysicalCard target) {
return true;

View File

@@ -73,6 +73,8 @@ public interface Modifier {
public List<? extends ActivateCardAction> getExtraPhaseAction(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card);
public List<? extends Action> getExtraPhaseActionFromStacked(GameState gameState, ModifiersQuerying modifiersQuerying, 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

@@ -572,6 +572,21 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
return activateCardActions;
}
@Override
public List<? extends Action> getExtraPhaseActionsFromStacked(GameState gameState, PhysicalCard target) {
List<Action> activateCardActions = new LinkedList<Action>();
for (Modifier modifier : getModifiers(gameState, ModifierEffect.EXTRA_ACTION_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, target, modifier)) {
List<? extends Action> actions = modifier.getExtraPhaseActionFromStacked(gameState, this, target);
if (actions != null)
activateCardActions.addAll(actions);
}
}
return activateCardActions;
}
@Override
public boolean isValidAssignments(GameState gameState, Side side, Map<PhysicalCard, List<PhysicalCard>> assignments) {

View File

@@ -86,6 +86,8 @@ public interface ModifiersQuerying {
public List<? extends ActivateCardAction> getExtraPhaseActions(GameState gameState, PhysicalCard target);
public List<? extends Action> getExtraPhaseActionsFromStacked(GameState gameState, PhysicalCard target);
// Others
public boolean canBeDiscardedFromPlay(GameState gameState, PhysicalCard card, PhysicalCard source);

View File

@@ -1,32 +0,0 @@
package com.gempukku.lotro.logic.timing.processes;
import com.gempukku.lotro.game.CompletePhysicalCardVisitor;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.timing.Action;
import java.util.LinkedList;
import java.util.List;
public class GatherPlayableActionsFromStackedVisitor extends CompletePhysicalCardVisitor {
private LotroGame _game;
private String _playerId;
private List<Action> _actions = new LinkedList<Action>();
public GatherPlayableActionsFromStackedVisitor(LotroGame game, String playerId) {
_game = game;
_playerId = playerId;
}
@Override
protected void doVisitPhysicalCard(PhysicalCard physicalCard) {
List<? extends Action> list = physicalCard.getBlueprint().getPhaseActionsFromStacked(_playerId, _game, physicalCard);
if (list != null)
_actions.addAll(list);
}
public List<? extends Action> getActions() {
return _actions;
}
}