- "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.actions.PlayEventAction;
import com.gempukku.lotro.cards.effects.AddUntilEndOfPhaseModifierEffect; import com.gempukku.lotro.cards.effects.AddUntilEndOfPhaseModifierEffect;
import com.gempukku.lotro.cards.effects.AddUntilStartOfPhaseActionProxyEffect; 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.Culture;
import com.gempukku.lotro.common.Phase; import com.gempukku.lotro.common.Phase;
import com.gempukku.lotro.common.Race; 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()); List<Assignment> assignments = new LinkedList<Assignment>(game.getGameState().getAssignments());
for (Assignment assignment : assignments) for (Assignment assignment : assignments)
game.getGameState().removeAssignment(assignment); 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( 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 @Override
protected void cardSelected(LotroGame game, PhysicalCard nazgul) { 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( action.appendEffect(
new AddUntilStartOfPhaseActionProxyEffect( new AddUntilStartOfPhaseActionProxyEffect(
new AbstractActionProxy() { new AbstractActionProxy() {
@@ -79,6 +74,8 @@ public class Card1_224 extends AbstractResponseOldEvent {
return null; return null;
} }
}, Phase.SKIRMISH)); }, 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.PlayConditions;
import com.gempukku.lotro.cards.TriggerConditions; import com.gempukku.lotro.cards.TriggerConditions;
import com.gempukku.lotro.cards.actions.PlayEventAction; 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.ChoiceEffect;
import com.gempukku.lotro.cards.effects.choose.ChooseAndPlayCardFromDiscardEffect; import com.gempukku.lotro.cards.effects.choose.ChooseAndPlayCardFromDiscardEffect;
import com.gempukku.lotro.cards.effects.choose.ChooseAndPlayCardFromHandEffect; import com.gempukku.lotro.cards.effects.choose.ChooseAndPlayCardFromHandEffect;
import com.gempukku.lotro.common.CardType; import com.gempukku.lotro.common.CardType;
import com.gempukku.lotro.common.Culture; import com.gempukku.lotro.common.Culture;
import com.gempukku.lotro.common.Phase;
import com.gempukku.lotro.common.Side; import com.gempukku.lotro.common.Side;
import com.gempukku.lotro.filters.Filters; import com.gempukku.lotro.filters.Filters;
import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame; 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.Effect;
import com.gempukku.lotro.logic.timing.EffectResult; 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 com.gempukku.lotro.logic.timing.results.PlayCardResult;
import java.util.Collections; import java.util.Collections;
@@ -49,20 +46,22 @@ public class Card10_019 extends AbstractResponseEvent {
if (playResult.getPlayedCard().getOwner().equals(game.getGameState().getCurrentPlayerId())) { if (playResult.getPlayedCard().getOwner().equals(game.getGameState().getCurrentPlayerId())) {
final PhysicalCard playedOn = playResult.getAttachedTo(); final PhysicalCard playedOn = playResult.getAttachedTo();
if (playedOn != null && playedOn.getBlueprint().getCardType() == CardType.COMPANION) { 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>(); List<Effect> possibleEffects = new LinkedList<Effect>();
possibleEffects.add( possibleEffects.add(
new ChooseAndPlayCardFromDiscardEffect(playerId, game, -2, Filters.gollum) { new ChooseAndPlayCardFromDiscardEffect(playerId, game, -2, Filters.gollum) {
@Override @Override
protected void afterCardPlayed(PhysicalCard cardPlayed) { protected void afterCardPlayed(PhysicalCard cardPlayed) {
gollumPlayed(game, playedOn, cardPlayed); action.appendEffect(
new AdditionalSkirmishPhaseEffect(playedOn, Collections.singleton(cardPlayed)));
} }
}); });
possibleEffects.add( possibleEffects.add(
new ChooseAndPlayCardFromHandEffect(playerId, game, -2, Filters.gollum) { new ChooseAndPlayCardFromHandEffect(playerId, game, -2, Filters.gollum) {
@Override @Override
protected void afterCardPlayed(PhysicalCard cardPlayed) { protected void afterCardPlayed(PhysicalCard cardPlayed) {
gollumPlayed(game, playedOn, cardPlayed); action.appendEffect(
new AdditionalSkirmishPhaseEffect(playedOn, Collections.singleton(cardPlayed)));
} }
}); });
action.appendEffect( action.appendEffect(
@@ -73,34 +72,4 @@ public class Card10_019 extends AbstractResponseEvent {
} }
return null; 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); 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) { public static Filter assignableToSkirmishAgainst(final Side assignedBySide, final Filterable againstFilter, final boolean ignoreUnassigned, final boolean allowAllyToSkirmish) {
return Filters.and( return Filters.and(
assignableToSkirmish(assignedBySide, ignoreUnassigned, allowAllyToSkirmish), assignableToSkirmish(assignedBySide, ignoreUnassigned, allowAllyToSkirmish),

View File

@@ -704,9 +704,6 @@ public class IndividualCardAtTest extends AbstractAtTest {
AwaitingDecision playeReturnDecision = _userFeedback.getAwaitingDecision(P2); AwaitingDecision playeReturnDecision = _userFeedback.getAwaitingDecision(P2);
playerDecided(P2, getCardActionId(playeReturnDecision, "Play Return")); 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(_game.getGameState().getRingBearer(P1), _game.getGameState().getSkirmish().getFellowshipCharacter());
assertEquals(1, _game.getGameState().getSkirmish().getShadowCharacters().size()); assertEquals(1, _game.getGameState().getSkirmish().getShadowCharacters().size());
assertEquals(nelya, _game.getGameState().getSkirmish().getShadowCharacters().iterator().next()); assertEquals(nelya, _game.getGameState().getSkirmish().getShadowCharacters().iterator().next());

View File

@@ -1,4 +1,7 @@
<pre style="font-size:80%"> <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> <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. - "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 - Another change to Muster. Now to USE Muster, you have to click the card shadow showing above the panel used to drive