- "Return to Its Master" now creates an additional Skirmish Phase.

This commit is contained in:
marcins78
2012-11-09 16:14:46 +00:00
parent f9e0197fa4
commit d4e0907bfb
6 changed files with 82 additions and 48 deletions

View File

@@ -0,0 +1,51 @@
package com.gempukku.lotro.cards.effects;
import com.gempukku.lotro.common.Phase;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.game.state.Skirmish;
import com.gempukku.lotro.logic.timing.UnrespondableEffect;
import com.gempukku.lotro.logic.timing.actions.SkirmishPhaseAction;
import java.util.Set;
public class AdditionalSkirmishPhaseEffect extends UnrespondableEffect {
private PhysicalCard _fpCard;
private Set<PhysicalCard> _shadowCards;
public AdditionalSkirmishPhaseEffect(PhysicalCard fpCard, Set<PhysicalCard> shadowCards) {
_fpCard = fpCard;
_shadowCards = shadowCards;
}
@Override
protected void doPlayEffect(LotroGame game) {
final Phase currentPhase = game.getGameState().getCurrentPhase();
final Skirmish skirmish = game.getGameState().getSkirmish();
final boolean fierce = game.getGameState().isFierceSkirmishes();
final boolean extra = game.getGameState().isExtraSkirmishes();
if (skirmish != null)
game.getGameState().finishSkirmish();
final SkirmishPhaseAction skirmishPhaseAction = new SkirmishPhaseAction(_fpCard, _shadowCards);
// We have to reset the phase, to whatever it was before
skirmishPhaseAction.appendEffect(
new UnrespondableEffect() {
@Override
protected void doPlayEffect(LotroGame game) {
// We might have to restart an existing skirmish
if (skirmish != null)
game.getGameState().restartSkirmish(skirmish);
game.getGameState().setCurrentPhase(currentPhase);
game.getGameState().setFierceSkirmishes(fierce);
game.getGameState().setExtraSkirmishes(extra);
}
});
game.getGameState().setFierceSkirmishes(false);
game.getGameState().setExtraSkirmishes(true);
game.getActionsEnvironment().addActionToStack(
skirmishPhaseAction);
}
}

View File

@@ -5,7 +5,7 @@ import com.gempukku.lotro.cards.TriggerConditions;
import com.gempukku.lotro.cards.actions.PlayEventAction;
import com.gempukku.lotro.cards.effects.AddUntilEndOfPhaseModifierEffect;
import com.gempukku.lotro.cards.effects.AddUntilStartOfPhaseActionProxyEffect;
import com.gempukku.lotro.cards.effects.choose.ChooseAndAssignMinionToCompanionEffect;
import com.gempukku.lotro.cards.effects.AdditionalSkirmishPhaseEffect;
import com.gempukku.lotro.common.Culture;
import com.gempukku.lotro.common.Phase;
import com.gempukku.lotro.common.Race;
@@ -53,17 +53,12 @@ public class Card1_224 extends AbstractResponseOldEvent {
List<Assignment> assignments = new LinkedList<Assignment>(game.getGameState().getAssignments());
for (Assignment assignment : assignments)
game.getGameState().removeAssignment(assignment);
game.getGameState().finishSkirmish();
PhysicalCard ringBearer = game.getGameState().getRingBearer(game.getGameState().getCurrentPlayerId());
final PhysicalCard ringBearer = game.getGameState().getRingBearer(game.getGameState().getCurrentPlayerId());
action.appendEffect(
new ChooseActiveCardEffect(self, playerId, "Choose a Nazgul to skirmish the Ring-Bearer", Race.NAZGUL, Filters.assignableToSkirmishAgainst(Side.SHADOW, ringBearer)) {
new ChooseActiveCardEffect(self, playerId, "Choose a Nazgul to skirmish the Ring-Bearer", Race.NAZGUL, Filters.notPreventedByEffectToAssign(Side.SHADOW, ringBearer)) {
@Override
protected void cardSelected(LotroGame game, PhysicalCard nazgul) {
PhysicalCard ringBearer = game.getGameState().getRingBearer(game.getGameState().getCurrentPlayerId());
action.appendEffect(
new ChooseAndAssignMinionToCompanionEffect(action, playerId, ringBearer, Race.NAZGUL));
action.appendEffect(
new AddUntilStartOfPhaseActionProxyEffect(
new AbstractActionProxy() {
@@ -79,6 +74,8 @@ public class Card1_224 extends AbstractResponseOldEvent {
return null;
}
}, Phase.SKIRMISH));
action.appendEffect(
new AdditionalSkirmishPhaseEffect(ringBearer, Collections.singleton(nazgul)));
}
});
}

View File

@@ -4,21 +4,18 @@ import com.gempukku.lotro.cards.AbstractResponseEvent;
import com.gempukku.lotro.cards.PlayConditions;
import com.gempukku.lotro.cards.TriggerConditions;
import com.gempukku.lotro.cards.actions.PlayEventAction;
import com.gempukku.lotro.cards.effects.AdditionalSkirmishPhaseEffect;
import com.gempukku.lotro.cards.effects.ChoiceEffect;
import com.gempukku.lotro.cards.effects.choose.ChooseAndPlayCardFromDiscardEffect;
import com.gempukku.lotro.cards.effects.choose.ChooseAndPlayCardFromHandEffect;
import com.gempukku.lotro.common.CardType;
import com.gempukku.lotro.common.Culture;
import com.gempukku.lotro.common.Phase;
import com.gempukku.lotro.common.Side;
import com.gempukku.lotro.filters.Filters;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.game.state.Skirmish;
import com.gempukku.lotro.logic.timing.Effect;
import com.gempukku.lotro.logic.timing.EffectResult;
import com.gempukku.lotro.logic.timing.UnrespondableEffect;
import com.gempukku.lotro.logic.timing.actions.SkirmishPhaseAction;
import com.gempukku.lotro.logic.timing.results.PlayCardResult;
import java.util.Collections;
@@ -49,20 +46,22 @@ public class Card10_019 extends AbstractResponseEvent {
if (playResult.getPlayedCard().getOwner().equals(game.getGameState().getCurrentPlayerId())) {
final PhysicalCard playedOn = playResult.getAttachedTo();
if (playedOn != null && playedOn.getBlueprint().getCardType() == CardType.COMPANION) {
PlayEventAction action = new PlayEventAction(self);
final PlayEventAction action = new PlayEventAction(self);
List<Effect> possibleEffects = new LinkedList<Effect>();
possibleEffects.add(
new ChooseAndPlayCardFromDiscardEffect(playerId, game, -2, Filters.gollum) {
@Override
protected void afterCardPlayed(PhysicalCard cardPlayed) {
gollumPlayed(game, playedOn, cardPlayed);
action.appendEffect(
new AdditionalSkirmishPhaseEffect(playedOn, Collections.singleton(cardPlayed)));
}
});
possibleEffects.add(
new ChooseAndPlayCardFromHandEffect(playerId, game, -2, Filters.gollum) {
@Override
protected void afterCardPlayed(PhysicalCard cardPlayed) {
gollumPlayed(game, playedOn, cardPlayed);
action.appendEffect(
new AdditionalSkirmishPhaseEffect(playedOn, Collections.singleton(cardPlayed)));
}
});
action.appendEffect(
@@ -73,34 +72,4 @@ public class Card10_019 extends AbstractResponseEvent {
}
return null;
}
private void gollumPlayed(LotroGame game, PhysicalCard character, PhysicalCard gollum) {
final Phase currentPhase = game.getGameState().getCurrentPhase();
final Skirmish skirmish = game.getGameState().getSkirmish();
if (skirmish != null)
game.getGameState().finishSkirmish();
final SkirmishPhaseAction skirmishPhaseAction = new SkirmishPhaseAction(character, Collections.singleton(gollum));
// We might have to restart the skirmish, if the possession was played during it
if (skirmish != null) {
skirmishPhaseAction.appendEffect(
new UnrespondableEffect() {
@Override
protected void doPlayEffect(LotroGame game) {
game.getGameState().restartSkirmish(skirmish);
}
});
}
// We have to reset the phase, to whatever it was before
skirmishPhaseAction.appendEffect(
new UnrespondableEffect() {
@Override
protected void doPlayEffect(LotroGame game) {
game.getGameState().setCurrentPhase(currentPhase);
}
});
game.getActionsEnvironment().addActionToStack(
skirmishPhaseAction);
}
}

View File

@@ -251,6 +251,23 @@ public class Filters {
return assignableToSkirmishAgainst(assignedBySide, againstFilter, false, false);
}
public static Filter notPreventedByEffectToAssign(final Side assignedBySide, final PhysicalCard againstCard) {
return new Filter() {
@Override
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
if (againstCard.getBlueprint().getSide() == Side.FREE_PEOPLE) {
Map<PhysicalCard, Set<PhysicalCard>> assignment = new HashMap<PhysicalCard, Set<PhysicalCard>>();
assignment.put(againstCard, Collections.singleton(physicalCard));
return modifiersQuerying.isValidAssignments(gameState, assignedBySide, assignment);
} else {
Map<PhysicalCard, Set<PhysicalCard>> assignment = new HashMap<PhysicalCard, Set<PhysicalCard>>();
assignment.put(physicalCard, Collections.singleton(againstCard));
return modifiersQuerying.isValidAssignments(gameState, assignedBySide, assignment);
}
}
};
}
public static Filter assignableToSkirmishAgainst(final Side assignedBySide, final Filterable againstFilter, final boolean ignoreUnassigned, final boolean allowAllyToSkirmish) {
return Filters.and(
assignableToSkirmish(assignedBySide, ignoreUnassigned, allowAllyToSkirmish),

View File

@@ -704,9 +704,6 @@ public class IndividualCardAtTest extends AbstractAtTest {
AwaitingDecision playeReturnDecision = _userFeedback.getAwaitingDecision(P2);
playerDecided(P2, getCardActionId(playeReturnDecision, "Play Return"));
// Choose skirmish to resolve
playerDecided(P1, ""+_game.getGameState().getRingBearer(P1).getCardId());
assertEquals(_game.getGameState().getRingBearer(P1), _game.getGameState().getSkirmish().getFellowshipCharacter());
assertEquals(1, _game.getGameState().getSkirmish().getShadowCharacters().size());
assertEquals(nelya, _game.getGameState().getSkirmish().getShadowCharacters().iterator().next());

View File

@@ -1,4 +1,7 @@
<pre style="font-size:80%">
<b>9 Nov. 2012</b>
- "Return to Its Master" now creates an additional Skirmish Phase.
<b>7 Nov. 2012</b>
- "King's Board" now correctly allows to exert the named characters for the effect, if you do not control Eomer.
- Another change to Muster. Now to USE Muster, you have to click the card shadow showing above the panel used to drive