From 37d865ab4af475ecb401dd63f96b701ac7caa0b3 Mon Sep 17 00:00:00 2001 From: "marcins78@gmail.com" Date: Sun, 16 Oct 2011 19:17:28 +0000 Subject: [PATCH] "Merry" --- .../gempukku/lotro/cards/PlayConditions.java | 4 ++ .../RemoveCharacterFromSkirmishEffect.java | 40 +++++++++++++ .../lotro/cards/set4/shire/Card4_311.java | 59 +++++++++++++++++++ .../communication/GameStateListener.java | 2 + .../gempukku/lotro/game/state/GameState.java | 19 ++++-- .../com/gempukku/lotro/game/GameEvent.java | 2 +- ...heringParticipantCommunicationChannel.java | 5 ++ .../src/main/webapp/js/gameAnimations.js | 14 +++++ .../src/main/webapp/js/gameUi.js | 2 + 9 files changed, 141 insertions(+), 6 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/RemoveCharacterFromSkirmishEffect.java create mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/shire/Card4_311.java diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/PlayConditions.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/PlayConditions.java index 6fde9c975..f2cbfc184 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/PlayConditions.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/PlayConditions.java @@ -147,6 +147,10 @@ public class PlayConditions { return Filters.filter(game.getGameState().getDiscard(playerId), game.getGameState(), game.getModifiersQuerying(), Filters.and(filters, Filters.playable(game))).size() > 0; } + public static boolean canBeDiscarded(final PhysicalCard source, LotroGame game, final PhysicalCard card) { + return game.getModifiersQuerying().canBeDiscardedFromPlay(game.getGameState(), card, source); + } + public static boolean canExert(final PhysicalCard source, final GameState gameState, final ModifiersQuerying modifiersQuerying, Filterable... filters) { return canExert(source, gameState, modifiersQuerying, 1, filters); } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/RemoveCharacterFromSkirmishEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/RemoveCharacterFromSkirmishEffect.java new file mode 100644 index 000000000..1f81da30d --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/RemoveCharacterFromSkirmishEffect.java @@ -0,0 +1,40 @@ +package com.gempukku.lotro.cards.effects; + +import com.gempukku.lotro.filters.Filters; +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.logic.timing.AbstractEffect; +import com.gempukku.lotro.logic.timing.EffectResult; + +public class RemoveCharacterFromSkirmishEffect extends AbstractEffect { + private PhysicalCard _source; + private PhysicalCard _toRemove; + + public RemoveCharacterFromSkirmishEffect(PhysicalCard source, PhysicalCard toRemove) { + _source = source; + _toRemove = toRemove; + } + + @Override + public boolean isPlayableInFull(LotroGame game) { + return Filters.inSkirmish.accepts(game.getGameState(), game.getModifiersQuerying(), _toRemove); + } + + @Override + public String getText(LotroGame game) { + return null; + } + + @Override + public EffectResult.Type getType() { + return null; + } + + @Override + protected FullEffectResult playEffectReturningResult(LotroGame game) { + if (isPlayableInFull(game)) { + game.getGameState().removeFromSkirmish(_toRemove); + } + return new FullEffectResult(null, false, false); + } +} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/shire/Card4_311.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/shire/Card4_311.java new file mode 100644 index 000000000..03ea4bed2 --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/shire/Card4_311.java @@ -0,0 +1,59 @@ +package com.gempukku.lotro.cards.set4.shire; + +import com.gempukku.lotro.cards.AbstractCompanion; +import com.gempukku.lotro.cards.PlayConditions; +import com.gempukku.lotro.cards.effects.RemoveCharacterFromSkirmishEffect; +import com.gempukku.lotro.common.Culture; +import com.gempukku.lotro.common.Phase; +import com.gempukku.lotro.common.Race; +import com.gempukku.lotro.common.Signet; +import com.gempukku.lotro.filters.Filters; +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.logic.actions.ActivateCardAction; +import com.gempukku.lotro.logic.effects.ChooseActiveCardEffect; +import com.gempukku.lotro.logic.effects.DiscardCardsFromPlayEffect; +import com.gempukku.lotro.logic.timing.Action; + +import java.util.Collections; +import java.util.List; + +/** + * Set: The Two Towers + * Side: Free + * Culture: Shire + * Twilight Cost: 1 + * Type: Companion • Hobbit + * Strength: 3 + * Vitality: 4 + * Resistance: 6 + * Signet: Gandalf + * Game Text: Skirmish: If Merry is not assigned to a skirmish, discard him to remove a [SAURON] Orc from a skirmish + * involving an unbound companion. + */ +public class Card4_311 extends AbstractCompanion { + public Card4_311() { + super(1, 3, 4, Culture.SHIRE, Race.HOBBIT, Signet.GANDALF, "Merry", true); + } + + @Override + protected List getExtraInPlayPhaseActions(String playerId, LotroGame game, final PhysicalCard self) { + if (PlayConditions.canUseFPCardDuringPhase(game.getGameState(), Phase.SKIRMISH, self) + && Filters.notAssignedToSkirmish.accepts(game.getGameState(), game.getModifiersQuerying(), self) + && PlayConditions.canBeDiscarded(self, game, self)) { + final ActivateCardAction action = new ActivateCardAction(self); + action.appendCost( + new DiscardCardsFromPlayEffect(self, self)); + action.appendEffect( + new ChooseActiveCardEffect(self, playerId, "Choose SAURON Orc", Culture.SAURON, Race.ORC, Filters.inSkirmishAgainst(Filters.unboundCompanion)) { + @Override + protected void cardSelected(LotroGame game, PhysicalCard card) { + action.insertEffect( + new RemoveCharacterFromSkirmishEffect(self, card)); + } + }); + return Collections.singletonList(action); + } + return null; + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/communication/GameStateListener.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/communication/GameStateListener.java index 0856a8bed..857748b23 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/communication/GameStateListener.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/communication/GameStateListener.java @@ -31,6 +31,8 @@ public interface GameStateListener { public void startSkirmish(PhysicalCard fp, List minions); + public void removeFromSkirmish(PhysicalCard card); + public void finishSkirmish(); public void addTokens(PhysicalCard card, Token token, int count); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameState.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameState.java index 4caf88dff..549e3be64 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameState.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameState.java @@ -267,6 +267,18 @@ public class GameState { return _inPlay; } + public void removeFromSkirmish(PhysicalCard card) { + if (_skirmish.getFellowshipCharacter() == card) { + _skirmish.setFellowshipCharacter(null); + for (GameStateListener listener : getAllGameStateListeners()) + listener.removeFromSkirmish(card); + } + if (_skirmish.getShadowCharacters().remove(card)) { + for (GameStateListener listener : getAllGameStateListeners()) + listener.removeFromSkirmish(card); + } + } + public void removeCardsFromZone(Collection cards) { Map> listenerCards = new HashMap>(); @@ -291,11 +303,8 @@ public class GameState { removeAssignment(assignment); } - if (_skirmish != null) { - if (_skirmish.getFellowshipCharacter() == card) - _skirmish.setFellowshipCharacter(null); - _skirmish.getShadowCharacters().remove(card); - } + if (_skirmish != null) + removeFromSkirmish(card); removeAllTokens(card); diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/GameEvent.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/GameEvent.java index 4475fa38f..ad9b4417d 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/GameEvent.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/GameEvent.java @@ -12,7 +12,7 @@ public class GameEvent { PARTICIPANT, GAME_PHASE_CHANGE, TURN_CHANGE, PLAYER_POSITION, TWILIGHT_POOL, PUT_CARD_IN_PLAY, MOVE_CARD_IN_PLAY, REMOVE_CARD_FROM_PLAY, ADD_ASSIGNMENT, REMOVE_ASSIGNMENT, - START_SKIRMISH, END_SKIRMISH, + START_SKIRMISH, REMOVE_FROM_SKIRMISH, END_SKIRMISH, ADD_TOKENS, REMOVE_TOKENS, MESSAGE, WARNING, ZONE_SIZE, diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/GatheringParticipantCommunicationChannel.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/GatheringParticipantCommunicationChannel.java index 6326c8515..d05c129db 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/GatheringParticipantCommunicationChannel.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/GatheringParticipantCommunicationChannel.java @@ -56,6 +56,11 @@ public class GatheringParticipantCommunicationChannel implements GameStateListen _events.add(gameEvent); } + @Override + public void removeFromSkirmish(PhysicalCard card) { + _events.add(new GameEvent(REMOVE_FROM_SKIRMISH).card(card)); + } + @Override public void finishSkirmish() { _events.add(new GameEvent(END_SKIRMISH)); diff --git a/gemp-lotr/gemp-lotr-web/src/main/webapp/js/gameAnimations.js b/gemp-lotr/gemp-lotr-web/src/main/webapp/js/gameAnimations.js index 1663eb2be..99b0a9ebc 100644 --- a/gemp-lotr/gemp-lotr-web/src/main/webapp/js/gameAnimations.js +++ b/gemp-lotr/gemp-lotr-web/src/main/webapp/js/gameAnimations.js @@ -452,6 +452,20 @@ var GameAnimations = Class.extend({ }); }, + removeFromSkirmish: function(element, animate) { + var that = this; + $("#main").queue( + function(next) { + var cardId = element.getAttribute("cardId"); + + $(".card:cardId(" + cardId + ")").each(function() { + $(this).data("card").skirmish = false; + }); + + next(); + }); + }, + endSkirmish: function(animate) { var that = this; $("#main").queue( diff --git a/gemp-lotr/gemp-lotr-web/src/main/webapp/js/gameUi.js b/gemp-lotr/gemp-lotr-web/src/main/webapp/js/gameUi.js index 3cbece2d6..44dc0e519 100644 --- a/gemp-lotr/gemp-lotr-web/src/main/webapp/js/gameUi.js +++ b/gemp-lotr/gemp-lotr-web/src/main/webapp/js/gameUi.js @@ -507,6 +507,8 @@ var GempLotrGameUI = Class.extend({ this.animations.removeAssignment(gameEvent, animate); } else if (eventType == "START_SKIRMISH") { this.animations.startSkirmish(gameEvent, animate); + } else if (eventType == "REMOVE_FROM_SKIRMISH") { + this.animations.removeFromSkirmish(gameEvent, animate); } else if (eventType == "END_SKIRMISH") { this.animations.endSkirmish(animate); } else if (eventType == "ADD_TOKENS") {