Fixing assignments and archery fire.

This commit is contained in:
marcins78@gmail.com
2011-10-07 22:27:52 +00:00
parent 8645b99929
commit 205419338c
26 changed files with 157 additions and 89 deletions

View File

@@ -7,13 +7,18 @@ import com.gempukku.lotro.logic.modifiers.AbstractModifier;
import com.gempukku.lotro.logic.modifiers.ModifierEffect;
import com.gempukku.lotro.logic.modifiers.ModifiersQuerying;
public class AllyOnCurrentSiteModifier extends AbstractModifier {
public AllyOnCurrentSiteModifier(PhysicalCard source, Filter affectFilter) {
public class AllyParticipatesInArcheryFireAndSkirmishesModifier extends AbstractModifier {
public AllyParticipatesInArcheryFireAndSkirmishesModifier(PhysicalCard source, Filter affectFilter) {
super(source, "Can participate in archery and skirmishes", affectFilter, new ModifierEffect[]{ModifierEffect.PRESENCE_MODIFIER});
}
@Override
public boolean isAllyOnCurrentSite(GameState gameState, ModifiersQuerying modifiersLogic, PhysicalCard card, boolean allyOnCurrentSite) {
public boolean isAllyParticipateInArcheryFire(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card) {
return true;
}
@Override
public boolean isAllyParticipateInSkirmishes(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card) {
return true;
}
}

View File

@@ -1,5 +1,6 @@
package com.gempukku.lotro.cards.modifiers;
import com.gempukku.lotro.common.Side;
import com.gempukku.lotro.filters.Filter;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.GameState;
@@ -13,7 +14,7 @@ public class CantBeAssignedToSkirmishModifier extends AbstractModifier {
}
@Override
public boolean canBeAssignedToSkirmish(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card, boolean result) {
public boolean canBeAssignedToSkirmish(GameState gameState, Side sidePlayer, ModifiersQuerying modifiersQuerying, PhysicalCard card) {
return false;
}
}

View File

@@ -4,7 +4,7 @@ import com.gempukku.lotro.cards.AbstractAlly;
import com.gempukku.lotro.cards.PlayConditions;
import com.gempukku.lotro.cards.effects.AddUntilStartOfPhaseModifierEffect;
import com.gempukku.lotro.cards.effects.ExertCharactersEffect;
import com.gempukku.lotro.cards.modifiers.AllyOnCurrentSiteModifier;
import com.gempukku.lotro.cards.modifiers.AllyParticipatesInArcheryFireAndSkirmishesModifier;
import com.gempukku.lotro.common.*;
import com.gempukku.lotro.filters.Filters;
import com.gempukku.lotro.game.PhysicalCard;
@@ -40,7 +40,7 @@ public class Card1_027 extends AbstractAlly {
action.appendCost(new ExertCharactersEffect(self, self));
action.appendEffect(
new AddUntilStartOfPhaseModifierEffect(
new AllyOnCurrentSiteModifier(self, Filters.sameCard(self)), Phase.REGROUP));
new AllyParticipatesInArcheryFireAndSkirmishesModifier(self, Filters.sameCard(self)), Phase.REGROUP));
return Collections.singletonList(action);
}

View File

@@ -5,7 +5,7 @@ import com.gempukku.lotro.cards.PlayConditions;
import com.gempukku.lotro.cards.actions.PlayEventAction;
import com.gempukku.lotro.cards.effects.AddUntilStartOfPhaseModifierEffect;
import com.gempukku.lotro.cards.effects.ChooseAndExertCharactersEffect;
import com.gempukku.lotro.cards.modifiers.AllyOnCurrentSiteModifier;
import com.gempukku.lotro.cards.modifiers.AllyParticipatesInArcheryFireAndSkirmishesModifier;
import com.gempukku.lotro.cards.modifiers.StrengthModifier;
import com.gempukku.lotro.common.*;
import com.gempukku.lotro.filters.Filters;
@@ -50,7 +50,7 @@ public class Card1_064 extends AbstractEvent {
, Phase.REGROUP));
action.appendEffect(
new AddUntilStartOfPhaseModifierEffect(
new AllyOnCurrentSiteModifier(self, Filters.sameCard(elfAlly))
new AllyParticipatesInArcheryFireAndSkirmishesModifier(self, Filters.sameCard(elfAlly))
, Phase.REGROUP));
}
}

View File

@@ -5,7 +5,7 @@ import com.gempukku.lotro.cards.PlayConditions;
import com.gempukku.lotro.cards.actions.PlayEventAction;
import com.gempukku.lotro.cards.effects.AddUntilStartOfPhaseModifierEffect;
import com.gempukku.lotro.cards.effects.ChooseAndExertCharactersEffect;
import com.gempukku.lotro.cards.modifiers.AllyOnCurrentSiteModifier;
import com.gempukku.lotro.cards.modifiers.AllyParticipatesInArcheryFireAndSkirmishesModifier;
import com.gempukku.lotro.cards.modifiers.StrengthModifier;
import com.gempukku.lotro.common.*;
import com.gempukku.lotro.filters.Filters;
@@ -50,7 +50,7 @@ public class Card1_065 extends AbstractEvent {
, Phase.REGROUP));
action.appendEffect(
new AddUntilStartOfPhaseModifierEffect(
new AllyOnCurrentSiteModifier(self, Filters.sameCard(elfAlly))
new AllyParticipatesInArcheryFireAndSkirmishesModifier(self, Filters.sameCard(elfAlly))
, Phase.REGROUP));
}
}

View File

@@ -5,7 +5,7 @@ import com.gempukku.lotro.cards.PlayConditions;
import com.gempukku.lotro.cards.actions.PlayEventAction;
import com.gempukku.lotro.cards.effects.AddUntilStartOfPhaseModifierEffect;
import com.gempukku.lotro.cards.effects.ChooseAndExertCharactersEffect;
import com.gempukku.lotro.cards.modifiers.AllyOnCurrentSiteModifier;
import com.gempukku.lotro.cards.modifiers.AllyParticipatesInArcheryFireAndSkirmishesModifier;
import com.gempukku.lotro.cards.modifiers.StrengthModifier;
import com.gempukku.lotro.common.CardType;
import com.gempukku.lotro.common.Culture;
@@ -53,7 +53,7 @@ public class Card1_109 extends AbstractEvent {
, Phase.REGROUP));
action.appendEffect(
new AddUntilStartOfPhaseModifierEffect(
new AllyOnCurrentSiteModifier(self, Filters.sameCard(ally))
new AllyParticipatesInArcheryFireAndSkirmishesModifier(self, Filters.sameCard(ally))
, Phase.REGROUP));
}
}

View File

@@ -35,9 +35,9 @@ public class Card1_169 extends AbstractEvent {
final PlayEventAction action = new PlayEventAction(self);
final PhysicalCard ringBearer = game.getGameState().getRingBearer(game.getGameState().getCurrentPlayerId());
if (Filters.filterActive(game.getGameState(), game.getModifiersQuerying(), Filters.keyword(Keyword.RING_BEARER), Filters.canBeAssignedToSkirmish()).size() > 0) {
if (Filters.filterActive(game.getGameState(), game.getModifiersQuerying(), Filters.keyword(Keyword.RING_BEARER), Filters.canBeAssignedToSkirmish(Side.SHADOW)).size() > 0) {
action.appendEffect(
new ChooseActiveCardEffect(self, game.getGameState().getCurrentPlayerId(), "Choose minion to assign Ring-Bearer to", Filters.type(CardType.MINION), Filters.canBeAssignedToSkirmish()) {
new ChooseActiveCardEffect(self, game.getGameState().getCurrentPlayerId(), "Choose minion to assign Ring-Bearer to", Filters.type(CardType.MINION), Filters.canBeAssignedToSkirmish(Side.SHADOW)) {
@Override
protected void cardSelected(PhysicalCard minion) {
action.appendEffect(

View File

@@ -28,11 +28,11 @@ public class Card1_171 extends AbstractEvent {
public PlayEventAction getPlayCardAction(final String playerId, final LotroGame game, final PhysicalCard self, int twilightModifier) {
final PlayEventAction action = new PlayEventAction(self);
action.appendEffect(
new ChooseActiveCardEffect(self, playerId, "Choose exhausted companion", Filters.type(CardType.COMPANION), Filters.exhausted(), Filters.canBeAssignedToSkirmish()) {
new ChooseActiveCardEffect(self, playerId, "Choose exhausted companion", Filters.type(CardType.COMPANION), Filters.exhausted(), Filters.canBeAssignedToSkirmish(Side.SHADOW)) {
@Override
protected void cardSelected(final PhysicalCard companion) {
action.appendEffect(
new ChooseActiveCardEffect(self, playerId, "Choose MORIA Orc", Filters.culture(Culture.MORIA), Filters.race(Race.ORC), Filters.canBeAssignedToSkirmish()) {
new ChooseActiveCardEffect(self, playerId, "Choose MORIA Orc", Filters.culture(Culture.MORIA), Filters.race(Race.ORC), Filters.canBeAssignedToSkirmish(Side.SHADOW)) {
@Override
protected void cardSelected(PhysicalCard moriaOrc) {
action.appendEffect(

View File

@@ -43,10 +43,10 @@ public class Card1_262 extends AbstractMinion {
protected List<? extends Action> getExtraPhaseActions(final String playerId, LotroGame game, final PhysicalCard self) {
if (PlayConditions.canUseShadowCardDuringPhase(game.getGameState(), Phase.ASSIGNMENT, self, 0)
&& Filters.countSpottable(game.getGameState(), game.getModifiersQuerying(), Filters.race(Race.HOBBIT), Filters.type(CardType.COMPANION)) >= 2
&& Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), Filters.sameCard(self), Filters.canBeAssignedToSkirmish())) {
&& Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), Filters.sameCard(self), Filters.canBeAssignedToSkirmish(Side.SHADOW))) {
final ActivateCardAction action = new ActivateCardAction(self, Keyword.ASSIGNMENT);
action.appendEffect(
new ChooseActiveCardEffect(self, game.getGameState().getCurrentPlayerId(), "Choose a Hobbit", Filters.race(Race.HOBBIT), Filters.type(CardType.COMPANION), Filters.canBeAssignedToSkirmish()) {
new ChooseActiveCardEffect(self, game.getGameState().getCurrentPlayerId(), "Choose a Hobbit", Filters.race(Race.HOBBIT), Filters.type(CardType.COMPANION), Filters.canBeAssignedToSkirmish(Side.SHADOW)) {
@Override
protected void cardSelected(PhysicalCard hobbit) {
action.appendEffect(new AssignmentEffect(hobbit.getOwner(), hobbit, Collections.singletonList(self), "Orc Assassin effect"));

View File

@@ -48,7 +48,7 @@ public class Card1_224 extends AbstractResponseEvent {
for (Skirmish assignment : assignments)
game.getGameState().removeAssignment(assignment);
if (Filters.countActive(game.getGameState(), game.getModifiersQuerying(), Filters.keyword(Keyword.RING_BEARER), Filters.canBeAssignedToSkirmish()) > 0) {
if (Filters.countActive(game.getGameState(), game.getModifiersQuerying(), Filters.keyword(Keyword.RING_BEARER), Filters.canBeAssignedToSkirmish(Side.SHADOW)) > 0) {
action.appendEffect(
new ChooseActiveCardEffect(self, playerId, "Choose a Nazgul to skirmish the Ring-Bearer", Filters.race(Race.NAZGUL)) {
@Override

View File

@@ -37,9 +37,9 @@ public class Card1_236 extends AbstractMinion {
if (PlayConditions.canUseShadowCardDuringPhase(game.getGameState(), Phase.ASSIGNMENT, self, 0)
&& game.getGameState().getBurdens() >= 4) {
final ActivateCardAction action = new ActivateCardAction(self, Keyword.ASSIGNMENT);
if (Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), Filters.sameCard(self), Filters.notAssigned())) {
if (Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), Filters.sameCard(self), Filters.notAssigned(), Filters.canBeAssignedToSkirmish(Side.SHADOW))) {
action.appendEffect(
new ChooseActiveCardEffect(self, playerId, "Choose a companion (except the Ring-Bearer", Filters.type(CardType.COMPANION), Filters.not(Filters.keyword(Keyword.RING_BEARER)), Filters.canBeAssignedToSkirmish()) {
new ChooseActiveCardEffect(self, playerId, "Choose a companion (except the Ring-Bearer", Filters.type(CardType.COMPANION), Filters.not(Filters.keyword(Keyword.RING_BEARER)), Filters.canBeAssignedToSkirmish(Side.SHADOW)) {
@Override
protected void cardSelected(PhysicalCard companion) {
action.appendEffect(

View File

@@ -4,7 +4,7 @@ import com.gempukku.lotro.cards.AbstractAttachableFPPossession;
import com.gempukku.lotro.cards.PlayConditions;
import com.gempukku.lotro.cards.effects.AddUntilStartOfPhaseModifierEffect;
import com.gempukku.lotro.cards.effects.ChooseAndExertCharactersEffect;
import com.gempukku.lotro.cards.modifiers.AllyOnCurrentSiteModifier;
import com.gempukku.lotro.cards.modifiers.AllyParticipatesInArcheryFireAndSkirmishesModifier;
import com.gempukku.lotro.cards.modifiers.StrengthModifier;
import com.gempukku.lotro.common.CardType;
import com.gempukku.lotro.common.Culture;
@@ -57,7 +57,7 @@ public class Card3_042 extends AbstractAttachableFPPossession {
new StrengthModifier(self, Filters.sameCard(card), 3), Phase.REGROUP));
action.insertEffect(
new AddUntilStartOfPhaseModifierEffect(
new AllyOnCurrentSiteModifier(self, Filters.sameCard(card)), Phase.REGROUP));
new AllyParticipatesInArcheryFireAndSkirmishesModifier(self, Filters.sameCard(card)), Phase.REGROUP));
}
});
return Collections.singletonList(action);

View File

@@ -67,11 +67,11 @@ public class Card3_069 extends AbstractMinion {
action.appendCost(
new ExertCharactersEffect(self, self));
action.appendEffect(
new ChooseActiveCardEffect(self, playerId, "Choose ISENGARD minion", Filters.culture(Culture.ISENGARD), Filters.type(CardType.MINION), Filters.canBeAssignedToSkirmish()) {
new ChooseActiveCardEffect(self, playerId, "Choose ISENGARD minion", Filters.culture(Culture.ISENGARD), Filters.type(CardType.MINION), Filters.canBeAssignedToSkirmish(Side.SHADOW)) {
@Override
protected void cardSelected(final PhysicalCard minion) {
action.appendEffect(
new ChooseActiveCardEffect(self, playerId, "Choose non Ring-bearer companion", Filters.type(CardType.COMPANION), Filters.not(Filters.keyword(Keyword.RING_BEARER)), Filters.canBeAssignedToSkirmish()) {
new ChooseActiveCardEffect(self, playerId, "Choose non Ring-bearer companion", Filters.type(CardType.COMPANION), Filters.not(Filters.keyword(Keyword.RING_BEARER)), Filters.canBeAssignedToSkirmish(Side.SHADOW)) {
@Override
protected void cardSelected(PhysicalCard companion) {
action.appendEffect(

View File

@@ -48,11 +48,11 @@ public class Card4_015 extends AbstractMinion {
@Override
protected List<? extends Action> getExtraPhaseActions(final String playerId, LotroGame game, final PhysicalCard self) {
if (PlayConditions.canUseShadowCardDuringPhase(game.getGameState(), Phase.ASSIGNMENT, self, 0)
&& Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), Filters.type(CardType.ALLY))) {
&& Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), Filters.type(CardType.ALLY), Filters.canBeAssignedToSkirmish(Side.SHADOW))) {
final ActivateCardAction action = new ActivateCardAction(self, Keyword.ASSIGNMENT);
if (Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), Filters.sameCard(self), Filters.notAssigned())) {
action.appendEffect(
new ChooseActiveCardEffect(self, playerId, "Choose an ally", Filters.type(CardType.ALLY), Filters.canBeAssignedToSkirmish()) {
new ChooseActiveCardEffect(self, playerId, "Choose an ally", Filters.type(CardType.ALLY), Filters.canBeAssignedToSkirmish(Side.SHADOW)) {
@Override
protected void cardSelected(PhysicalCard ally) {
action.appendEffect(

View File

@@ -38,7 +38,7 @@ public class Card4_018 extends AbstractMinion {
final ActivateCardAction action = new ActivateCardAction(self, Keyword.ASSIGNMENT);
if (Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), Filters.sameCard(self), Filters.notAssigned())) {
action.appendEffect(
new ChooseActiveCardEffect(self, playerId, "Choose an ally", Filters.type(CardType.ALLY), Filters.canBeAssignedToSkirmish()) {
new ChooseActiveCardEffect(self, playerId, "Choose an ally", Filters.type(CardType.ALLY), Filters.canBeAssignedToSkirmish(Side.SHADOW)) {
@Override
protected void cardSelected(PhysicalCard ally) {
action.appendEffect(

View File

@@ -37,11 +37,11 @@ public class Card4_031 extends AbstractPermanent {
action.appendCost(
new RemoveTwilightEffect(2));
action.appendEffect(
new ChooseActiveCardEffect(self, playerId, "Choose DUNLAND Man", Filters.culture(Culture.DUNLAND), Filters.race(Race.MAN), Filters.canBeAssignedToSkirmish()) {
new ChooseActiveCardEffect(self, playerId, "Choose DUNLAND Man", Filters.culture(Culture.DUNLAND), Filters.race(Race.MAN), Filters.canBeAssignedToSkirmish(Side.SHADOW)) {
@Override
protected void cardSelected(final PhysicalCard dunlandMan) {
action.insertEffect(
new ChooseActiveCardEffect(self, playerId, "Choose unbound companion", Filters.unboundCompanion(), Filters.canBeAssignedToSkirmish()) {
new ChooseActiveCardEffect(self, playerId, "Choose unbound companion", Filters.unboundCompanion(), Filters.canBeAssignedToSkirmish(Side.SHADOW)) {
@Override
protected void cardSelected(PhysicalCard unboundCompanion) {
action.insertEffect(

View File

@@ -3,7 +3,7 @@ package com.gempukku.lotro.cards.set4.gandalf;
import com.gempukku.lotro.cards.AbstractEvent;
import com.gempukku.lotro.cards.actions.PlayEventAction;
import com.gempukku.lotro.cards.effects.AddUntilStartOfPhaseModifierEffect;
import com.gempukku.lotro.cards.modifiers.AllyOnCurrentSiteModifier;
import com.gempukku.lotro.cards.modifiers.AllyParticipatesInArcheryFireAndSkirmishesModifier;
import com.gempukku.lotro.common.*;
import com.gempukku.lotro.filters.Filters;
import com.gempukku.lotro.game.PhysicalCard;
@@ -49,7 +49,7 @@ public class Card4_101 extends AbstractEvent {
new KeywordModifier(self, Filters.sameCard(card), Keyword.DAMAGE, 2), Phase.REGROUP));
action.appendEffect(
new AddUntilStartOfPhaseModifierEffect(
new AllyOnCurrentSiteModifier(self, Filters.sameCard(card)), Phase.REGROUP));
new AllyParticipatesInArcheryFireAndSkirmishesModifier(self, Filters.sameCard(card)), Phase.REGROUP));
}
});
return action;

View File

@@ -66,7 +66,7 @@ public class Filters {
};
}
public static Filter canBeAssignedToSkirmish() {
public static Filter canBeAssignedToSkirmish(final Side sidePlayer) {
return new Filter() {
@Override
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
@@ -77,7 +77,7 @@ public class Filters {
return false;
}
}
return modifiersQuerying.canBeAssignedToSkirmish(gameState, physicalCard);
return modifiersQuerying.canBeAssignedToSkirmish(gameState, sidePlayer, physicalCard);
}
};
}

View File

@@ -116,8 +116,13 @@ public abstract class AbstractModifier implements Modifier {
}
@Override
public boolean isAllyOnCurrentSite(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card, boolean allyOnCurrentSite) {
return allyOnCurrentSite;
public boolean isAllyParticipateInArcheryFire(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card) {
return false;
}
@Override
public boolean isAllyParticipateInSkirmishes(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card) {
return false;
}
@Override
@@ -166,7 +171,7 @@ public abstract class AbstractModifier implements Modifier {
}
@Override
public boolean canBeAssignedToSkirmish(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card, boolean result) {
public boolean canBeAssignedToSkirmish(GameState gameState, Side sidePlayer, ModifiersQuerying modifiersQuerying, PhysicalCard card) {
return true;
}

View File

@@ -48,7 +48,9 @@ public interface Modifier {
public boolean canBeExerted(GameState gameState, ModifiersLogic modifiersLogic, PhysicalCard source, PhysicalCard card, boolean result);
public boolean isAllyOnCurrentSite(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card, boolean allyOnCurrentSite);
public boolean isAllyParticipateInArcheryFire(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card);
public boolean isAllyParticipateInSkirmishes(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card);
public int getArcheryTotal(GameState gameState, ModifiersQuerying modifiersQuerying, Side side, int result);
@@ -68,7 +70,7 @@ public interface Modifier {
public boolean isValidAssignments(GameState gameState, Side Side, ModifiersQuerying modifiersQuerying, Map<PhysicalCard, List<PhysicalCard>> assignments, boolean result);
public boolean canBeAssignedToSkirmish(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card, boolean result);
public boolean canBeAssignedToSkirmish(GameState gameState, Side sidePlayer, ModifiersQuerying modifiersQuerying, PhysicalCard card);
public boolean canBeDiscardedFromPlay(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card, PhysicalCard source, boolean result);

View File

@@ -1,6 +1,5 @@
package com.gempukku.lotro.logic.modifiers;
import com.gempukku.lotro.common.CardType;
import com.gempukku.lotro.common.Keyword;
import com.gempukku.lotro.common.Phase;
import com.gempukku.lotro.common.Side;
@@ -319,15 +318,23 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
}
@Override
public boolean isAllyOnCurrentSite(GameState gameState, PhysicalCard card) {
boolean allyOnCurrentSite = (card.getBlueprint().getCardType() == CardType.ALLY
&& gameState.getCurrentSiteNumber() == card.getBlueprint().getSiteNumber()
&& gameState.getCurrentSite().getBlueprint().getSiteBlock() == card.getBlueprint().getSiteBlock());
public boolean isAllyParticipateInArcheryFire(GameState gameState, PhysicalCard card) {
for (Modifier modifier : getModifiers(ModifierEffect.PRESENCE_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, card, modifier))
allyOnCurrentSite = modifier.isAllyOnCurrentSite(gameState, this, card, allyOnCurrentSite);
if (modifier.isAllyParticipateInArcheryFire(gameState, this, card))
return true;
}
return allyOnCurrentSite;
return false;
}
@Override
public boolean isAllyParticipateInSkirmishes(GameState gameState, PhysicalCard card) {
for (Modifier modifier : getModifiers(ModifierEffect.PRESENCE_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, card, modifier))
if (modifier.isAllyParticipateInSkirmishes(gameState, this, card))
return true;
}
return false;
}
@Override
@@ -389,13 +396,12 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
}
@Override
public boolean canBeAssignedToSkirmish(GameState gameState, PhysicalCard card) {
boolean result = true;
public boolean canBeAssignedToSkirmish(GameState gameState, Side sidePlayer, PhysicalCard card) {
for (Modifier modifier : getModifiers(ModifierEffect.ASSIGNMENT_MODIFIER))
if (affectsCardWithSkipSet(gameState, card, modifier))
result = modifier.canBeAssignedToSkirmish(gameState, this, card, result);
return result;
if (!modifier.canBeAssignedToSkirmish(gameState, sidePlayer, this, card))
return false;
return true;
}
@Override

View File

@@ -15,20 +15,27 @@ import java.util.Map;
public interface ModifiersQuerying {
public Collection<Modifier> getModifiersAffecting(GameState gameState, PhysicalCard card);
// Keywords
public boolean hasKeyword(GameState gameState, PhysicalCard physicalCard, Keyword keyword);
public int getKeywordCount(GameState gameState, PhysicalCard physicalCard, Keyword keyword);
// Archery
public int getArcheryTotal(GameState gameState, Side side, int baseArcheryTotal);
public boolean addsToArcheryTotal(GameState gameState, PhysicalCard card);
public int getMoveLimit(GameState gameState, int baseMoveLimit);
// Twilight cost
public int getTwilightCost(GameState gameState, PhysicalCard physicalCard);
public int getPlayOnTwilightCost(GameState gameState, PhysicalCard physicalCard, PhysicalCard target);
public int getRoamingPenalty(GameState gameState, PhysicalCard physicalCard);
// Stats
public int getStrength(GameState gameState, PhysicalCard physicalCard);
public int getVitality(GameState gameState, PhysicalCard physicalCard);
@@ -37,14 +44,23 @@ public interface ModifiersQuerying {
public boolean isOverwhelmedByStrength(GameState gameState, PhysicalCard card, int strength, int opposingStrength);
// Wounds/exertions
public boolean canTakeWound(GameState gameState, PhysicalCard card);
public boolean canBeExerted(GameState gameState, PhysicalCard exertionSource, PhysicalCard card);
public boolean isAllyOnCurrentSite(GameState gameState, PhysicalCard card);
public boolean canBeHealed(GameState gameState, PhysicalCard card);
public boolean addsToArcheryTotal(GameState gameState, PhysicalCard card);
// Assignments
public boolean canBeAssignedToSkirmish(GameState gameState, Side playerSide, PhysicalCard card);
public boolean isAllyParticipateInSkirmishes(GameState gameState, PhysicalCard card);
public boolean isAllyParticipateInArcheryFire(GameState gameState, PhysicalCard card);
public boolean isValidAssignments(GameState gameState, Side side, Map<PhysicalCard, List<PhysicalCard>> assignments);
// Playing actions
public boolean canPlayAction(GameState gameState, Action action);
public boolean canHavePlayedOn(GameState gameState, PhysicalCard playedCard, PhysicalCard target);
@@ -53,14 +69,9 @@ public interface ModifiersQuerying {
public boolean shouldSkipPhase(GameState gameState, Phase phase, String playerId);
public boolean isValidAssignments(GameState gameState, Side side, Map<PhysicalCard, List<PhysicalCard>> assignments);
public boolean canBeAssignedToSkirmish(GameState gameState, PhysicalCard card);
// Others
public boolean canBeDiscardedFromPlay(GameState gameState, PhysicalCard card, PhysicalCard source);
public boolean canBeHealed(GameState gameState, PhysicalCard card);
public boolean canDrawCardAndIncrement(GameState gameState, String playerId);
public boolean canLookOrRevealCardsInHand(GameState gameState, String playerId);

View File

@@ -36,12 +36,20 @@ public class ArcheryFireGameProcess implements GameProcess {
},
Filters.or(
Filters.type(CardType.COMPANION),
new Filter() {
@Override
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
return modifiersQuerying.isAllyOnCurrentSite(gameState, physicalCard);
}
}));
Filters.and(
Filters.type(CardType.ALLY),
Filters.or(
Filters.and(
Filters.siteNumber(_game.getGameState().getCurrentSiteNumber()),
Filters.siteBlock(_game.getGameState().getCurrentSiteBlock()))
),
new Filter() {
@Override
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
return modifiersQuerying.isAllyParticipateInArcheryFire(gameState, physicalCard);
}
}
)));
_fellowshipArcheryTotal = _game.getModifiersQuerying().getArcheryTotal(gameState, Side.FREE_PEOPLE, _fellowshipArcheryTotal);

View File

@@ -28,14 +28,24 @@ public class FellowshipPlayerAssignsArcheryDamageGameProcess implements GameProc
public void process() {
if (_woundsToAssign > 0) {
Filter filter = Filters.or(
Filters.type(CardType.COMPANION),
new Filter() {
@Override
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
return modifiersQuerying.isAllyOnCurrentSite(gameState, physicalCard);
}
});
Filter filter =
Filters.or(
Filters.type(CardType.COMPANION),
Filters.and(
Filters.type(CardType.ALLY),
Filters.or(
Filters.and(
Filters.siteNumber(_game.getGameState().getCurrentSiteNumber()),
Filters.siteBlock(_game.getGameState().getCurrentSiteBlock()))
),
new Filter() {
@Override
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
return modifiersQuerying.isAllyParticipateInArcheryFire(gameState, physicalCard);
}
}
)
);
RequiredTriggerAction action = new RequiredTriggerAction(null) {
@Override

View File

@@ -39,18 +39,28 @@ public class FreePeoplePlayerAssignsMinionsGameProcess implements GameProcess {
Filters.keyword(Keyword.FIERCE),
minionFilter);
final Collection<PhysicalCard> minions = Filters.filterActive(gameState, _game.getModifiersQuerying(), minionFilter, Filters.canBeAssignedToSkirmish());
final Collection<PhysicalCard> minions = Filters.filterActive(gameState, _game.getModifiersQuerying(), minionFilter, Filters.canBeAssignedToSkirmish(Side.FREE_PEOPLE));
if (minions.size() > 0) {
final Collection<PhysicalCard> freePeopleTargets = Filters.filterActive(gameState, _game.getModifiersQuerying(),
Filters.or(
Filters.type(CardType.COMPANION),
new Filter() {
@Override
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
return modifiersQuerying.isAllyOnCurrentSite(gameState, physicalCard);
}
}),
Filters.canBeAssignedToSkirmish());
Filters.and(
Filters.type(CardType.ALLY),
Filters.or(
Filters.and(
Filters.siteNumber(gameState.getCurrentSiteNumber()),
Filters.siteBlock(gameState.getCurrentSiteBlock())
),
new Filter() {
@Override
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
return modifiersQuerying.isAllyParticipateInSkirmishes(gameState, physicalCard);
}
}
)
)
),
Filters.canBeAssignedToSkirmish(Side.FREE_PEOPLE));
_game.getUserFeedback().sendAwaitingDecision(gameState.getCurrentPlayerId(),
new PlayerAssignMinionsDecision(1, "Assign minions to companions or allies at home", freePeopleTargets, minions) {

View File

@@ -42,18 +42,28 @@ public class ShadowPlayerAssignsHisMinionsGameProcess implements GameProcess {
Filters.keyword(Keyword.FIERCE),
minionFilter);
final Collection<PhysicalCard> minions = Filters.filterActive(gameState, _game.getModifiersQuerying(), minionFilter, Filters.canBeAssignedToSkirmish());
final Collection<PhysicalCard> minions = Filters.filterActive(gameState, _game.getModifiersQuerying(), minionFilter, Filters.canBeAssignedToSkirmish(Side.SHADOW));
if (minions.size() > 0) {
final Collection<PhysicalCard> freePeopleTargets = Filters.filterActive(gameState, _game.getModifiersQuerying(),
Filters.or(
Filters.type(CardType.COMPANION),
new Filter() {
@Override
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
return modifiersQuerying.isAllyOnCurrentSite(gameState, physicalCard);
}
}
), Filters.canBeAssignedToSkirmish());
Filters.and(
Filters.type(CardType.ALLY),
Filters.or(
Filters.and(
Filters.siteNumber(gameState.getCurrentSiteNumber()),
Filters.siteBlock(gameState.getCurrentSiteBlock())
),
new Filter() {
@Override
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
return modifiersQuerying.isAllyParticipateInSkirmishes(gameState, physicalCard);
}
}
)
)
),
Filters.canBeAssignedToSkirmish(Side.SHADOW));
_game.getUserFeedback().sendAwaitingDecision(_playerId,
new PlayerAssignMinionsDecision(1, "Assign minions to companions or allies at home", freePeopleTargets, minions) {