Introducing an extra sub-step for cards that require cost to be able to assign them by player.
This commit is contained in:
@@ -29,10 +29,6 @@ public class AssignmentPhaseEffect extends AbstractEffect {
|
||||
_text = text;
|
||||
}
|
||||
|
||||
public AssignmentPhaseEffect(String playerId, PhysicalCard fpChar, List<PhysicalCard> minions, String text) {
|
||||
this(playerId, Collections.singletonMap(fpChar, minions), text);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Effect.Type getType() {
|
||||
return null;
|
||||
|
||||
@@ -4,6 +4,8 @@ public abstract class EffectResult {
|
||||
public enum Type {
|
||||
WOUND, KILL, HEAL, EXERT, DISCARD_FROM_PLAY, DISCARD_FROM_HAND,
|
||||
|
||||
FREE_PEOPLE_PLAYER_STARTS_ASSIGNING,
|
||||
|
||||
ASSIGNMENT, OVERWHELM_IN_SKIRMISH, RESOLVE_SKIRMISH,
|
||||
|
||||
ADD_TWILIGHT,
|
||||
|
||||
@@ -12,8 +12,11 @@ import com.gempukku.lotro.logic.actions.SystemQueueAction;
|
||||
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.UnrespondableEffect;
|
||||
import com.gempukku.lotro.logic.timing.processes.GameProcess;
|
||||
import com.gempukku.lotro.logic.timing.results.FreePlayerStartsAssigningResult;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.LinkedList;
|
||||
@@ -21,87 +24,94 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class FreePeoplePlayerAssignsMinionsGameProcess implements GameProcess {
|
||||
private LotroGame _game;
|
||||
private GameProcess _followingGameProcess;
|
||||
|
||||
public FreePeoplePlayerAssignsMinionsGameProcess(LotroGame game, GameProcess followingGameProcess) {
|
||||
_game = game;
|
||||
_followingGameProcess = followingGameProcess;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(LotroGame game) {
|
||||
final GameState gameState = _game.getGameState();
|
||||
final SystemQueueAction action = new SystemQueueAction();
|
||||
action.appendEffect(
|
||||
new TriggeringResultEffect(new FreePlayerStartsAssigningResult(), "Free people player starts assigning"));
|
||||
action.appendEffect(
|
||||
new UnrespondableEffect() {
|
||||
@Override
|
||||
protected void doPlayEffect(final LotroGame game) {
|
||||
final GameState gameState = game.getGameState();
|
||||
|
||||
Filter minionFilter = Filters.type(CardType.MINION);
|
||||
if (gameState.isFierceSkirmishes())
|
||||
minionFilter = Filters.and(
|
||||
Filters.keyword(Keyword.FIERCE),
|
||||
minionFilter);
|
||||
Filter minionFilter = Filters.type(CardType.MINION);
|
||||
if (gameState.isFierceSkirmishes())
|
||||
minionFilter = Filters.and(
|
||||
Filters.keyword(Keyword.FIERCE),
|
||||
minionFilter);
|
||||
|
||||
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(
|
||||
Filters.type(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(
|
||||
Filters.type(CardType.ALLY),
|
||||
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(
|
||||
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.type(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(
|
||||
Filters.type(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));
|
||||
|
||||
game.getUserFeedback().sendAwaitingDecision(gameState.getCurrentPlayerId(),
|
||||
new PlayerAssignMinionsDecision(1, "Assign minions to companions or allies at home", freePeopleTargets, minions) {
|
||||
@Override
|
||||
public void decisionMade(String result) throws DecisionResultInvalidException {
|
||||
Map<PhysicalCard, List<PhysicalCard>> assignments = getAssignmentsBasedOnResponse(result);
|
||||
|
||||
List<PhysicalCard> unassignedMinions = new LinkedList<PhysicalCard>(minions);
|
||||
// Validate minion count (Defender)
|
||||
for (PhysicalCard freeCard : assignments.keySet()) {
|
||||
List<PhysicalCard> minionsAssigned = assignments.get(freeCard);
|
||||
if (minionsAssigned.size() > 1 + game.getModifiersQuerying().getKeywordCount(game.getGameState(), freeCard, Keyword.DEFENDER))
|
||||
throw new DecisionResultInvalidException(freeCard.getBlueprint().getName() + " can't have so many minions assigned");
|
||||
unassignedMinions.removeAll(minionsAssigned);
|
||||
}
|
||||
)
|
||||
)
|
||||
),
|
||||
Filters.canBeAssignedToSkirmish(Side.FREE_PEOPLE));
|
||||
|
||||
_game.getUserFeedback().sendAwaitingDecision(gameState.getCurrentPlayerId(),
|
||||
new PlayerAssignMinionsDecision(1, "Assign minions to companions or allies at home", freePeopleTargets, minions) {
|
||||
@Override
|
||||
public void decisionMade(String result) throws DecisionResultInvalidException {
|
||||
Map<PhysicalCard, List<PhysicalCard>> assignments = getAssignmentsBasedOnResponse(result);
|
||||
if (!game.getModifiersQuerying().isValidAssignments(game.getGameState(), Side.FREE_PEOPLE, assignments))
|
||||
throw new DecisionResultInvalidException("Assignments are not valid for the effects affecting the cards");
|
||||
|
||||
List<PhysicalCard> unassignedMinions = new LinkedList<PhysicalCard>(minions);
|
||||
// Validate minion count (Defender)
|
||||
for (PhysicalCard freeCard : assignments.keySet()) {
|
||||
List<PhysicalCard> minionsAssigned = assignments.get(freeCard);
|
||||
if (minionsAssigned.size() > 1 + _game.getModifiersQuerying().getKeywordCount(_game.getGameState(), freeCard, Keyword.DEFENDER))
|
||||
throw new DecisionResultInvalidException(freeCard.getBlueprint().getName() + " can't have so many minions assigned");
|
||||
unassignedMinions.removeAll(minionsAssigned);
|
||||
}
|
||||
|
||||
if (!_game.getModifiersQuerying().isValidAssignments(_game.getGameState(), Side.FREE_PEOPLE, assignments))
|
||||
throw new DecisionResultInvalidException("Assignments are not valid for the effects affecting the cards");
|
||||
|
||||
SystemQueueAction action = new SystemQueueAction();
|
||||
action.appendEffect(
|
||||
new AssignmentPhaseEffect(gameState.getCurrentPlayerId(), assignments, "Free People player assignments"));
|
||||
_game.getActionsEnvironment().addActionToStack(action);
|
||||
action.appendEffect(
|
||||
new AssignmentPhaseEffect(gameState.getCurrentPlayerId(), assignments, "Free People player assignments"));
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
game.getActionsEnvironment().addActionToStack(action);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
package com.gempukku.lotro.logic.timing.results;
|
||||
|
||||
import com.gempukku.lotro.logic.timing.EffectResult;
|
||||
|
||||
public class FreePlayerStartsAssigningResult extends EffectResult {
|
||||
public FreePlayerStartsAssigningResult() {
|
||||
super(Type.FREE_PEOPLE_PLAYER_STARTS_ASSIGNING);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user