- "Orc Assassin" and other similar cards should be working correctly now, allowing to assign allies only when allies
are "on the site" (at home or allowed to participate otherwise).
This commit is contained in:
@@ -16,18 +16,24 @@ public class ChooseAndAssignCharacterToMinionEffect extends ChooseActiveCardEffe
|
||||
private Action _action;
|
||||
private String _playerId;
|
||||
private PhysicalCard _minion;
|
||||
private boolean _skipAllyLocationCheck;
|
||||
|
||||
public ChooseAndAssignCharacterToMinionEffect(Action action, String playerId, PhysicalCard minion, Filterable... filters) {
|
||||
this(action, playerId, minion, false, filters);
|
||||
}
|
||||
|
||||
public ChooseAndAssignCharacterToMinionEffect(Action action, String playerId, PhysicalCard minion, boolean skipAllyLocationCheck, Filterable... filters) {
|
||||
super(action.getActionSource(), playerId, "Choose character to assign " + GameUtils.getCardLink(minion) + " to", filters);
|
||||
_action = action;
|
||||
_playerId = playerId;
|
||||
_minion = minion;
|
||||
_skipAllyLocationCheck = skipAllyLocationCheck;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Filter getExtraFilterForPlaying(final LotroGame game) {
|
||||
final Side side = game.getGameState().getCurrentPlayerId().equals(_playerId) ? Side.FREE_PEOPLE : Side.SHADOW;
|
||||
return Filters.canBeAssignedToSkirmishByEffectAgainst(side, _minion);
|
||||
return Filters.canBeAssignedToSkirmishByEffectAgainst(side, _minion, _skipAllyLocationCheck);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -47,10 +47,10 @@ public class Card4_015 extends AbstractMinion {
|
||||
@Override
|
||||
protected List<? extends Action> getExtraPhaseActions(final String playerId, LotroGame game, final PhysicalCard self) {
|
||||
if (PlayConditions.canUseShadowCardDuringPhase(game, Phase.ASSIGNMENT, self, 0)
|
||||
&& Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), CardType.ALLY, Filters.canBeAssignedToSkirmishByEffect(Side.SHADOW))) {
|
||||
&& Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), CardType.ALLY, Filters.canBeAssignedToSkirmishByEffect(Side.SHADOW, true))) {
|
||||
final ActivateCardAction action = new ActivateCardAction(self);
|
||||
action.appendEffect(
|
||||
new ChooseAndAssignCharacterToMinionEffect(action, playerId, self, CardType.ALLY));
|
||||
new ChooseAndAssignCharacterToMinionEffect(action, playerId, self, true, CardType.ALLY));
|
||||
return Collections.singletonList(action);
|
||||
}
|
||||
return null;
|
||||
|
||||
@@ -33,10 +33,10 @@ public class Card4_018 extends AbstractMinion {
|
||||
@Override
|
||||
protected List<? extends Action> getExtraPhaseActions(final String playerId, LotroGame game, final PhysicalCard self) {
|
||||
if (PlayConditions.canUseShadowCardDuringPhase(game, Phase.ASSIGNMENT, self, 0)
|
||||
&& Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), CardType.ALLY, Filters.canBeAssignedToSkirmishByEffect(Side.SHADOW))) {
|
||||
&& Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), CardType.ALLY, Filters.canBeAssignedToSkirmishByEffect(Side.SHADOW, true))) {
|
||||
final ActivateCardAction action = new ActivateCardAction(self);
|
||||
action.appendEffect(
|
||||
new ChooseAndAssignCharacterToMinionEffect(action, playerId, self, CardType.ALLY));
|
||||
new ChooseAndAssignCharacterToMinionEffect(action, playerId, self, true, CardType.ALLY));
|
||||
return Collections.singletonList(action);
|
||||
}
|
||||
return null;
|
||||
|
||||
@@ -10,6 +10,7 @@ import com.gempukku.lotro.game.state.GameState;
|
||||
import com.gempukku.lotro.game.state.LotroGame;
|
||||
import com.gempukku.lotro.game.state.Skirmish;
|
||||
import com.gempukku.lotro.logic.modifiers.ModifiersQuerying;
|
||||
import com.gempukku.lotro.logic.timing.RuleUtils;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
@@ -208,6 +209,10 @@ public class Filters {
|
||||
}
|
||||
|
||||
public static Filter canBeAssignedToSkirmishByEffect(final Side sidePlayer) {
|
||||
return canBeAssignedToSkirmishByEffect(sidePlayer, false);
|
||||
}
|
||||
|
||||
public static Filter canBeAssignedToSkirmishByEffect(final Side sidePlayer, boolean skipAllyLocationCheck) {
|
||||
return Filters.and(
|
||||
notAssignedToSkirmish,
|
||||
Filters.or(
|
||||
@@ -219,12 +224,9 @@ public class Filters {
|
||||
return !gameState.isFierceSkirmishes();
|
||||
}
|
||||
}, Keyword.FIERCE)),
|
||||
new Filter() {
|
||||
@Override
|
||||
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
|
||||
return modifiersQuerying.canBeAssignedToSkirmish(gameState, sidePlayer, physicalCard);
|
||||
}
|
||||
});
|
||||
Filters.or(
|
||||
CardType.MINION,
|
||||
RuleUtils.getSkirmishAssignableFPCharacterFilter(sidePlayer, skipAllyLocationCheck)));
|
||||
}
|
||||
|
||||
public static Filter canBeAssignedToSkirmishByEffectIgnoreNotAssigned(final Side sidePlayer) {
|
||||
@@ -263,8 +265,12 @@ public class Filters {
|
||||
}
|
||||
|
||||
public static Filter canBeAssignedToSkirmishByEffectAgainst(final Side sidePlayer, final PhysicalCard against) {
|
||||
return canBeAssignedToSkirmishByEffectAgainst(sidePlayer, against, false);
|
||||
}
|
||||
|
||||
public static Filter canBeAssignedToSkirmishByEffectAgainst(final Side sidePlayer, final PhysicalCard against, boolean skipAllyLocationCheck) {
|
||||
return Filters.and(
|
||||
canBeAssignedToSkirmishByEffect(sidePlayer),
|
||||
canBeAssignedToSkirmishByEffect(sidePlayer, skipAllyLocationCheck),
|
||||
new Filter() {
|
||||
@Override
|
||||
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
|
||||
|
||||
@@ -59,6 +59,85 @@ public class RuleUtils {
|
||||
return game.getModifiersQuerying().getArcheryTotal(game.getGameState(), Side.SHADOW, normalArcheryTotal);
|
||||
}
|
||||
|
||||
public static Filter getSkirmishAssignableFPCharacterFilter(final Side side, final boolean skipAllyLocationCheck) {
|
||||
if (side == Side.FREE_PEOPLE) {
|
||||
return Filters.and(
|
||||
Filters.or(
|
||||
Filters.and(
|
||||
CardType.COMPANION,
|
||||
Filters.or(
|
||||
Filters.not(Keyword.UNHASTY),
|
||||
new Filter() {
|
||||
@Override
|
||||
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
|
||||
return modifiersQuerying.isAllowedToParticipateInSkirmishes(gameState, Side.FREE_PEOPLE, physicalCard);
|
||||
}
|
||||
}
|
||||
)
|
||||
),
|
||||
Filters.and(
|
||||
CardType.ALLY,
|
||||
Filters.or(
|
||||
new Filter() {
|
||||
@Override
|
||||
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
|
||||
return skipAllyLocationCheck;
|
||||
}
|
||||
},
|
||||
Filters.and(
|
||||
Filters.allyAtHome,
|
||||
new Filter() {
|
||||
@Override
|
||||
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
|
||||
return !modifiersQuerying.isAllyPreventedFromParticipatingInSkirmishes(gameState, Side.FREE_PEOPLE, physicalCard);
|
||||
}
|
||||
}),
|
||||
new Filter() {
|
||||
@Override
|
||||
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
|
||||
return modifiersQuerying.isAllowedToParticipateInSkirmishes(gameState, Side.FREE_PEOPLE, physicalCard);
|
||||
}
|
||||
}
|
||||
)
|
||||
)
|
||||
),
|
||||
Filters.canBeAssignedToSkirmish(Side.FREE_PEOPLE));
|
||||
} else {
|
||||
return Filters.and(
|
||||
Filters.or(
|
||||
Filters.and(
|
||||
CardType.COMPANION,
|
||||
new Filter() {
|
||||
@Override
|
||||
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
|
||||
return modifiersQuerying.isAllowedToParticipateInSkirmishes(gameState, Side.SHADOW, physicalCard);
|
||||
}
|
||||
}
|
||||
),
|
||||
Filters.and(
|
||||
CardType.ALLY,
|
||||
Filters.or(
|
||||
Filters.and(
|
||||
Filters.allyAtHome,
|
||||
new Filter() {
|
||||
@Override
|
||||
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
|
||||
return !modifiersQuerying.isAllyPreventedFromParticipatingInSkirmishes(gameState, Side.SHADOW, physicalCard);
|
||||
}
|
||||
}),
|
||||
new Filter() {
|
||||
@Override
|
||||
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
|
||||
return modifiersQuerying.isAllowedToParticipateInSkirmishes(gameState, Side.SHADOW, physicalCard);
|
||||
}
|
||||
}
|
||||
)
|
||||
)
|
||||
),
|
||||
Filters.canBeAssignedToSkirmish(Side.SHADOW));
|
||||
}
|
||||
}
|
||||
|
||||
public static int calculateMoveLimit(LotroGame game) {
|
||||
return game.getModifiersQuerying().getMoveLimit(game.getGameState(), 2);
|
||||
}
|
||||
|
||||
@@ -4,7 +4,6 @@ import com.gempukku.lotro.common.CardType;
|
||||
import com.gempukku.lotro.common.Filterable;
|
||||
import com.gempukku.lotro.common.Keyword;
|
||||
import com.gempukku.lotro.common.Side;
|
||||
import com.gempukku.lotro.filters.Filter;
|
||||
import com.gempukku.lotro.filters.Filters;
|
||||
import com.gempukku.lotro.game.PhysicalCard;
|
||||
import com.gempukku.lotro.game.state.Assignment;
|
||||
@@ -15,7 +14,7 @@ import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException;
|
||||
import com.gempukku.lotro.logic.decisions.PlayerAssignMinionsDecision;
|
||||
import com.gempukku.lotro.logic.effects.AssignmentPhaseEffect;
|
||||
import com.gempukku.lotro.logic.effects.TriggeringResultEffect;
|
||||
import com.gempukku.lotro.logic.modifiers.ModifiersQuerying;
|
||||
import com.gempukku.lotro.logic.timing.RuleUtils;
|
||||
import com.gempukku.lotro.logic.timing.UnrespondableEffect;
|
||||
import com.gempukku.lotro.logic.timing.processes.GameProcess;
|
||||
import com.gempukku.lotro.logic.timing.results.FreePlayerStartsAssigningResult;
|
||||
@@ -48,41 +47,7 @@ public class FreePeoplePlayerAssignsMinionsGameProcess implements GameProcess {
|
||||
|
||||
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.and(
|
||||
CardType.COMPANION,
|
||||
Filters.or(
|
||||
Filters.not(Keyword.UNHASTY),
|
||||
new Filter() {
|
||||
@Override
|
||||
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
|
||||
return modifiersQuerying.isAllowedToParticipateInSkirmishes(gameState, Side.FREE_PEOPLE, physicalCard);
|
||||
}
|
||||
}
|
||||
)
|
||||
),
|
||||
Filters.and(
|
||||
CardType.ALLY,
|
||||
Filters.or(
|
||||
Filters.and(
|
||||
Filters.allyAtHome,
|
||||
new Filter() {
|
||||
@Override
|
||||
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
|
||||
return !modifiersQuerying.isAllyPreventedFromParticipatingInSkirmishes(gameState, Side.FREE_PEOPLE, physicalCard);
|
||||
}
|
||||
}),
|
||||
new Filter() {
|
||||
@Override
|
||||
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
|
||||
return modifiersQuerying.isAllowedToParticipateInSkirmishes(gameState, Side.FREE_PEOPLE, physicalCard);
|
||||
}
|
||||
}
|
||||
)
|
||||
)
|
||||
),
|
||||
Filters.canBeAssignedToSkirmish(Side.FREE_PEOPLE));
|
||||
final Collection<PhysicalCard> freePeopleTargets = Filters.filterActive(gameState, game.getModifiersQuerying(), RuleUtils.getSkirmishAssignableFPCharacterFilter(Side.FREE_PEOPLE, false));
|
||||
|
||||
game.getUserFeedback().sendAwaitingDecision(gameState.getCurrentPlayerId(),
|
||||
new PlayerAssignMinionsDecision(1, "Assign minions to companions or allies at home", freePeopleTargets, minions) {
|
||||
|
||||
@@ -8,6 +8,7 @@ import com.gempukku.lotro.logic.decisions.AwaitingDecision;
|
||||
import com.gempukku.lotro.logic.decisions.AwaitingDecisionType;
|
||||
import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException;
|
||||
import com.gempukku.lotro.logic.vo.LotroDeck;
|
||||
import static junit.framework.Assert.assertEquals;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.Arrays;
|
||||
@@ -15,8 +16,6 @@ import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import static junit.framework.Assert.assertEquals;
|
||||
|
||||
public class IndividualCardAtTest extends AbstractAtTest {
|
||||
@Test
|
||||
public void dwarvenAxeDoesNotFreeze() throws DecisionResultInvalidException {
|
||||
@@ -351,4 +350,45 @@ public class IndividualCardAtTest extends AbstractAtTest {
|
||||
|
||||
assertEquals(2, _game.getGameState().getWounds(urukHaiRaidingParty));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void orcAssassinAssignNotToAlly() throws DecisionResultInvalidException {
|
||||
initializeSimplestGame();
|
||||
|
||||
skipMulligans();
|
||||
|
||||
PhysicalCardImpl merry = new PhysicalCardImpl(100, "1_303", P1, _library.getLotroCardBlueprint("1_303"));
|
||||
PhysicalCardImpl hobbitPartyGuest = new PhysicalCardImpl(101, "1_297", P1, _library.getLotroCardBlueprint("1_297"));
|
||||
PhysicalCardImpl orcAssassin = new PhysicalCardImpl(102, "1_262", P2, _library.getLotroCardBlueprint("1_262"));
|
||||
|
||||
_game.getGameState().addCardToZone(_game, merry, Zone.FREE_CHARACTERS);
|
||||
_game.getGameState().addCardToZone(_game, hobbitPartyGuest, Zone.SUPPORT);
|
||||
|
||||
// End fellowship phase
|
||||
playerDecided(P1, "");
|
||||
|
||||
_game.getGameState().addCardToZone(_game, orcAssassin, Zone.SHADOW_CHARACTERS);
|
||||
|
||||
// End shadow phase
|
||||
playerDecided(P2, "");
|
||||
|
||||
// End maneuvers phase
|
||||
playerDecided(P1, "");
|
||||
playerDecided(P2, "");
|
||||
|
||||
// End arhcery phase
|
||||
playerDecided(P1, "");
|
||||
playerDecided(P2, "");
|
||||
|
||||
// Assignment phase
|
||||
playerDecided(P1, "");
|
||||
|
||||
AwaitingDecision assignmentActions = _userFeedback.getAwaitingDecision(P2);
|
||||
assertEquals(AwaitingDecisionType.CARD_ACTION_CHOICE, assignmentActions.getDecisionType());
|
||||
playerDecided(P2, "0");
|
||||
|
||||
AwaitingDecision assignCharacter = _userFeedback.getAwaitingDecision(P1);
|
||||
assertEquals(AwaitingDecisionType.CARD_SELECTION, assignCharacter.getDecisionType());
|
||||
validateContents(new String[]{String.valueOf(merry.getCardId()), String.valueOf(_game.getGameState().getRingBearer(P1).getCardId())}, (String[]) assignCharacter.getDecisionParameters().get("cardId"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
<pre style="font-size:80%">
|
||||
<b>27 Dec. 2011</b>
|
||||
- "Isengard Scout Troop" now exerts itself to take control of a site.
|
||||
- "Orc Assassin" and other similar cards should be working correctly now, allowing to assign allies only when allies
|
||||
are "on the site" (at home or allowed to participate otherwise).
|
||||
|
||||
<b>26 Dec. 2011</b>
|
||||
- "Wizard Storm" should now work when fellowship moves from the site it's attached to.
|
||||
|
||||
Reference in New Issue
Block a user