From 13cea7341025e99147babf763e706bbe2c36e024 Mon Sep 17 00:00:00 2001 From: "marcins78@gmail.com" Date: Wed, 12 Oct 2011 22:05:32 +0000 Subject: [PATCH] First preparation to fully animated UI. --- .../DiscardCardAtRandomFromHandEffect.java | 2 +- .../effects/DiscardCardFromDeckEffect.java | 4 +- .../effects/DiscardStackedCardsEffect.java | 2 +- .../cards/effects/LiberateASiteEffect.java | 2 +- .../lotro/cards/effects/PlaySiteEffect.java | 3 +- ...utCardFromDeckIntoHandOrDiscardEffect.java | 6 +- .../PutCardFromDeckOnBottomOfDeckEffect.java | 4 +- .../PutCardFromDiscardIntoHandEffect.java | 4 +- ...utCardFromDiscardOnBottomOfDeckEffect.java | 4 +- .../PutCardFromHandOnBottomOfDeckEffect.java | 4 +- .../PutCardFromHandOnTopOfDeckEffect.java | 4 +- .../PutCardFromStackedIntoHandEffect.java | 4 +- .../effects/RemoveCardFromZoneEffect.java | 4 +- .../effects/ReturnCardsToHandEffect.java | 11 +- .../effects/StackCardFromDiscardEffect.java | 4 +- .../effects/StackCardFromHandEffect.java | 4 +- .../effects/StackCardFromPlayEffect.java | 7 +- .../lotro/cards/set1/dwarven/Card1_018.java | 6 +- .../lotro/cards/set4/dwarven/Card4_054.java | 5 +- .../lotro/cards/set4/dwarven/Card4_055.java | 6 +- .../communication/GameStateListener.java | 2 +- .../gempukku/lotro/game/state/GameState.java | 88 ++++++----- .../effects/DiscardCardsFromHandEffect.java | 2 +- .../effects/DiscardCardsFromPlayEffect.java | 11 +- .../lotro/logic/effects/KillEffect.java | 10 +- .../FirstPlayerPlaysSiteGameProcess.java | 3 +- ...ingBearerRingAndAddBurdersGameProcess.java | 5 +- ...yerPlaysNextSiteIfNotThereGameProcess.java | 4 +- ...heringParticipantCommunicationChannel.java | 7 +- .../gemp-lotr-web/src/main/webapp/game.html | 4 +- .../src/main/webapp/js/gameAnimations.js | 101 +++++++------ .../src/main/webapp/js/gameUi.js | 143 ++++++++++-------- 32 files changed, 265 insertions(+), 205 deletions(-) diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/DiscardCardAtRandomFromHandEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/DiscardCardAtRandomFromHandEffect.java index f4d1ab181..a32c230a4 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/DiscardCardAtRandomFromHandEffect.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/DiscardCardAtRandomFromHandEffect.java @@ -44,7 +44,7 @@ public class DiscardCardAtRandomFromHandEffect extends AbstractEffect { if (hand.size() > 0) { PhysicalCard randomCard = hand.get(new Random().nextInt(hand.size())); gameState.sendMessage(_playerId + " randomly discards " + GameUtils.getCardLink(randomCard)); - gameState.removeCardFromZone(randomCard); + gameState.removeCardsFromZone(Collections.singleton(randomCard)); gameState.addCardToZone(randomCard, Zone.DISCARD); return new FullEffectResult(new EffectResult[]{new DiscardCardsFromHandResult(_source, Collections.singleton(randomCard))}, true, true); } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/DiscardCardFromDeckEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/DiscardCardFromDeckEffect.java index dcef0972c..14847e3b5 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/DiscardCardFromDeckEffect.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/DiscardCardFromDeckEffect.java @@ -8,6 +8,8 @@ import com.gempukku.lotro.logic.GameUtils; import com.gempukku.lotro.logic.timing.AbstractEffect; import com.gempukku.lotro.logic.timing.EffectResult; +import java.util.Collections; + public class DiscardCardFromDeckEffect extends AbstractEffect { private PhysicalCard _card; @@ -35,7 +37,7 @@ public class DiscardCardFromDeckEffect extends AbstractEffect { if (isPlayableInFull(game)) { GameState gameState = game.getGameState(); gameState.sendMessage(GameUtils.getCardLink(_card) + " gets discarded from deck"); - gameState.removeCardFromZone(_card); + gameState.removeCardsFromZone(Collections.singleton(_card)); gameState.addCardToZone(_card, Zone.DISCARD); return new FullEffectResult(null, true, true); } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/DiscardStackedCardsEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/DiscardStackedCardsEffect.java index 0d0a40702..2195f3c19 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/DiscardStackedCardsEffect.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/DiscardStackedCardsEffect.java @@ -41,8 +41,8 @@ public class DiscardStackedCardsEffect extends AbstractEffect { protected FullEffectResult playEffectReturningResult(LotroGame game) { GameState gameState = game.getGameState(); gameState.sendMessage(getAppendedNames(_cards) + " is/are discarded from being stacked"); + gameState.removeCardsFromZone(_cards); for (PhysicalCard card : _cards) { - gameState.removeCardFromZone(card); gameState.addCardToZone(card, Zone.DISCARD); } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/LiberateASiteEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/LiberateASiteEffect.java index c27887bf2..0e70baab9 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/LiberateASiteEffect.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/LiberateASiteEffect.java @@ -52,8 +52,8 @@ public class LiberateASiteEffect extends AbstractEffect { if (siteToLiberate != null) { List stackedCards = game.getGameState().getStackedCards(siteToLiberate); + game.getGameState().removeCardsFromZone(stackedCards); for (PhysicalCard stackedCard : stackedCards) { - game.getGameState().removeCardFromZone(stackedCard); game.getGameState().addCardToZone(stackedCard, Zone.DISCARD); } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PlaySiteEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PlaySiteEffect.java index 260dc896c..76e73aa8e 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PlaySiteEffect.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PlaySiteEffect.java @@ -11,6 +11,7 @@ import com.gempukku.lotro.logic.timing.AbstractEffect; import com.gempukku.lotro.logic.timing.EffectResult; import java.util.Collection; +import java.util.Collections; import java.util.LinkedList; import java.util.List; @@ -67,7 +68,7 @@ public class PlaySiteEffect extends AbstractEffect { if (gameState.getCurrentSiteNumber() == _siteNumber) gameState.stopAffecting(card); - gameState.removeCardFromZone(card); + gameState.removeCardsFromZone(Collections.singleton(card)); gameState.addCardToZone(card, Zone.DECK); } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutCardFromDeckIntoHandOrDiscardEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutCardFromDeckIntoHandOrDiscardEffect.java index 05dfc5889..5a4ae7952 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutCardFromDeckIntoHandOrDiscardEffect.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutCardFromDeckIntoHandOrDiscardEffect.java @@ -8,6 +8,8 @@ import com.gempukku.lotro.logic.timing.AbstractEffect; import com.gempukku.lotro.logic.timing.EffectResult; import com.gempukku.lotro.logic.timing.results.DrawCardOrPutIntoHandResult; +import java.util.Collections; + public class PutCardFromDeckIntoHandOrDiscardEffect extends AbstractEffect { private PhysicalCard _physicalCard; @@ -39,12 +41,12 @@ public class PutCardFromDeckIntoHandOrDiscardEffect extends AbstractEffect { if (_physicalCard.getZone() == Zone.DECK) { if (game.getModifiersQuerying().canDrawCardAndIncrement(game.getGameState(), _physicalCard.getOwner())) { game.getGameState().sendMessage(_physicalCard.getOwner() + " puts card from deck into his or her hand"); - game.getGameState().removeCardFromZone(_physicalCard); + game.getGameState().removeCardsFromZone(Collections.singleton(_physicalCard)); game.getGameState().addCardToZone(_physicalCard, Zone.HAND); return new FullEffectResult(new EffectResult[]{new DrawCardOrPutIntoHandResult(_physicalCard.getOwner(), 1)}, true, true); } else { game.getGameState().sendMessage(_physicalCard.getOwner() + " discards " + GameUtils.getCardLink(_physicalCard) + " from deck due to Rule of 4"); - game.getGameState().removeCardFromZone(_physicalCard); + game.getGameState().removeCardsFromZone(Collections.singleton(_physicalCard)); game.getGameState().addCardToZone(_physicalCard, Zone.DISCARD); } } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutCardFromDeckOnBottomOfDeckEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutCardFromDeckOnBottomOfDeckEffect.java index 2f2694919..c2c6997cd 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutCardFromDeckOnBottomOfDeckEffect.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutCardFromDeckOnBottomOfDeckEffect.java @@ -8,6 +8,8 @@ import com.gempukku.lotro.logic.GameUtils; import com.gempukku.lotro.logic.timing.AbstractEffect; import com.gempukku.lotro.logic.timing.EffectResult; +import java.util.Collections; + public class PutCardFromDeckOnBottomOfDeckEffect extends AbstractEffect { private PhysicalCard _source; private PhysicalCard _physicalCard; @@ -37,7 +39,7 @@ public class PutCardFromDeckOnBottomOfDeckEffect extends AbstractEffect { if (isPlayableInFull(game)) { GameState gameState = game.getGameState(); gameState.sendMessage(_physicalCard.getOwner() + " puts " + GameUtils.getCardLink(_physicalCard) + " from deck on the bottom of deck"); - gameState.removeCardFromZone(_physicalCard); + gameState.removeCardsFromZone(Collections.singleton(_physicalCard)); gameState.putCardOnBottomOfDeck(_physicalCard); return new FullEffectResult(null, true, true); } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutCardFromDiscardIntoHandEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutCardFromDiscardIntoHandEffect.java index c3c6117f5..31b08124c 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutCardFromDiscardIntoHandEffect.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutCardFromDiscardIntoHandEffect.java @@ -9,6 +9,8 @@ import com.gempukku.lotro.logic.timing.AbstractEffect; import com.gempukku.lotro.logic.timing.EffectResult; import com.gempukku.lotro.logic.timing.results.DrawCardOrPutIntoHandResult; +import java.util.Collections; + public class PutCardFromDiscardIntoHandEffect extends AbstractEffect { private PhysicalCard _card; @@ -37,7 +39,7 @@ public class PutCardFromDiscardIntoHandEffect extends AbstractEffect { && _card.getZone() == Zone.DISCARD) { GameState gameState = game.getGameState(); gameState.sendMessage(_card.getOwner() + " puts " + GameUtils.getCardLink(_card) + " from discard into his or her hand"); - gameState.removeCardFromZone(_card); + gameState.removeCardsFromZone(Collections.singleton(_card)); gameState.addCardToZone(_card, Zone.HAND); return new FullEffectResult(new EffectResult[]{new DrawCardOrPutIntoHandResult(_card.getOwner(), 1)}, true, true); diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutCardFromDiscardOnBottomOfDeckEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutCardFromDiscardOnBottomOfDeckEffect.java index 8d3cbfb6f..fb3be9bab 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutCardFromDiscardOnBottomOfDeckEffect.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutCardFromDiscardOnBottomOfDeckEffect.java @@ -8,6 +8,8 @@ import com.gempukku.lotro.logic.GameUtils; import com.gempukku.lotro.logic.timing.AbstractEffect; import com.gempukku.lotro.logic.timing.EffectResult; +import java.util.Collections; + public class PutCardFromDiscardOnBottomOfDeckEffect extends AbstractEffect { private PhysicalCard _physicalCard; @@ -25,7 +27,7 @@ public class PutCardFromDiscardOnBottomOfDeckEffect extends AbstractEffect { if (isPlayableInFull(game)) { GameState gameState = game.getGameState(); gameState.sendMessage(_physicalCard.getOwner() + " puts " + GameUtils.getCardLink(_physicalCard) + " from discard on the bottom of deck"); - gameState.removeCardFromZone(_physicalCard); + gameState.removeCardsFromZone(Collections.singleton(_physicalCard)); gameState.putCardOnBottomOfDeck(_physicalCard); return new FullEffectResult(null, true, true); } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutCardFromHandOnBottomOfDeckEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutCardFromHandOnBottomOfDeckEffect.java index fc1948578..1680f9893 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutCardFromHandOnBottomOfDeckEffect.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutCardFromHandOnBottomOfDeckEffect.java @@ -7,6 +7,8 @@ import com.gempukku.lotro.game.state.LotroGame; import com.gempukku.lotro.logic.timing.AbstractEffect; import com.gempukku.lotro.logic.timing.EffectResult; +import java.util.Collections; + public class PutCardFromHandOnBottomOfDeckEffect extends AbstractEffect { private PhysicalCard _physicalCard; @@ -34,7 +36,7 @@ public class PutCardFromHandOnBottomOfDeckEffect extends AbstractEffect { if (isPlayableInFull(game)) { GameState gameState = game.getGameState(); gameState.sendMessage(_physicalCard.getOwner() + " puts a card from hand on bottom of his or her deck"); - gameState.removeCardFromZone(_physicalCard); + gameState.removeCardsFromZone(Collections.singleton(_physicalCard)); gameState.putCardOnBottomOfDeck(_physicalCard); return new FullEffectResult(null, true, true); diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutCardFromHandOnTopOfDeckEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutCardFromHandOnTopOfDeckEffect.java index 403b97cfc..71d752476 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutCardFromHandOnTopOfDeckEffect.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutCardFromHandOnTopOfDeckEffect.java @@ -8,6 +8,8 @@ import com.gempukku.lotro.logic.GameUtils; import com.gempukku.lotro.logic.timing.AbstractEffect; import com.gempukku.lotro.logic.timing.EffectResult; +import java.util.Collections; + public class PutCardFromHandOnTopOfDeckEffect extends AbstractEffect { private PhysicalCard _physicalCard; @@ -35,7 +37,7 @@ public class PutCardFromHandOnTopOfDeckEffect extends AbstractEffect { if (isPlayableInFull(game)) { GameState gameState = game.getGameState(); gameState.sendMessage(_physicalCard.getOwner() + " puts a card from hand on top of his or her deck"); - gameState.removeCardFromZone(_physicalCard); + gameState.removeCardsFromZone(Collections.singleton(_physicalCard)); gameState.putCardOnTopOfDeck(_physicalCard); return new FullEffectResult(null, true, true); } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutCardFromStackedIntoHandEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutCardFromStackedIntoHandEffect.java index c4c43059d..216d27f1e 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutCardFromStackedIntoHandEffect.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/PutCardFromStackedIntoHandEffect.java @@ -9,6 +9,8 @@ import com.gempukku.lotro.logic.timing.AbstractEffect; import com.gempukku.lotro.logic.timing.EffectResult; import com.gempukku.lotro.logic.timing.results.DrawCardOrPutIntoHandResult; +import java.util.Collections; + public class PutCardFromStackedIntoHandEffect extends AbstractEffect { private PhysicalCard _card; @@ -37,7 +39,7 @@ public class PutCardFromStackedIntoHandEffect extends AbstractEffect { && game.getModifiersQuerying().canDrawCardAndIncrement(game.getGameState(), _card.getOwner())) { GameState gameState = game.getGameState(); gameState.sendMessage(_card.getOwner() + " puts " + GameUtils.getCardLink(_card) + " from stacked on another card into his or her hand"); - gameState.removeCardFromZone(_card); + gameState.removeCardsFromZone(Collections.singleton(_card)); gameState.addCardToZone(_card, Zone.HAND); return new FullEffectResult(new EffectResult[]{new DrawCardOrPutIntoHandResult(_card.getOwner(), 1)}, true, true); diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/RemoveCardFromZoneEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/RemoveCardFromZoneEffect.java index 3520f4407..1596b30f9 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/RemoveCardFromZoneEffect.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/RemoveCardFromZoneEffect.java @@ -4,6 +4,8 @@ import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.game.state.LotroGame; import com.gempukku.lotro.logic.timing.UnrespondableEffect; +import java.util.Collections; + public class RemoveCardFromZoneEffect extends UnrespondableEffect { private PhysicalCard _physicalCard; @@ -13,6 +15,6 @@ public class RemoveCardFromZoneEffect extends UnrespondableEffect { @Override public void doPlayEffect(LotroGame game) { - game.getGameState().removeCardFromZone(_physicalCard); + game.getGameState().removeCardsFromZone(Collections.singleton(_physicalCard)); } } \ No newline at end of file diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/ReturnCardsToHandEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/ReturnCardsToHandEffect.java index 09d27f27b..d1c31cda9 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/ReturnCardsToHandEffect.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/ReturnCardsToHandEffect.java @@ -10,10 +10,7 @@ import com.gempukku.lotro.logic.timing.AbstractEffect; import com.gempukku.lotro.logic.timing.EffectResult; import com.gempukku.lotro.logic.timing.results.DiscardCardsFromPlayResult; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; public class ReturnCardsToHandEffect extends AbstractEffect { private PhysicalCard _source; @@ -48,7 +45,7 @@ public class ReturnCardsToHandEffect extends AbstractEffect { GameState gameState = game.getGameState(); gameState.stopAffecting(card); - gameState.removeCardFromZone(card); + gameState.removeCardsFromZone(Collections.singleton(card)); gameState.addCardToZone(card, Zone.HAND); List attachedCards = gameState.getAttachedCards(card); @@ -56,13 +53,13 @@ public class ReturnCardsToHandEffect extends AbstractEffect { discardedCards.add(attachedCard); gameState.stopAffecting(attachedCard); - gameState.removeCardFromZone(attachedCard); + gameState.removeCardsFromZone(Collections.singleton(attachedCard)); gameState.addCardToZone(attachedCard, Zone.DISCARD); } List stackedCards = gameState.getStackedCards(card); for (PhysicalCard stackedCard : stackedCards) { - gameState.removeCardFromZone(stackedCard); + gameState.removeCardsFromZone(Collections.singleton(stackedCard)); gameState.addCardToZone(stackedCard, Zone.DISCARD); } } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/StackCardFromDiscardEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/StackCardFromDiscardEffect.java index 5afdb23ea..2acebfb2e 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/StackCardFromDiscardEffect.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/StackCardFromDiscardEffect.java @@ -7,6 +7,8 @@ import com.gempukku.lotro.logic.GameUtils; import com.gempukku.lotro.logic.timing.AbstractEffect; import com.gempukku.lotro.logic.timing.EffectResult; +import java.util.Collections; + public class StackCardFromDiscardEffect extends AbstractEffect { private PhysicalCard _card; private PhysicalCard _stackOn; @@ -35,7 +37,7 @@ public class StackCardFromDiscardEffect extends AbstractEffect { protected FullEffectResult playEffectReturningResult(LotroGame game) { if (isPlayableInFull(game)) { game.getGameState().sendMessage(_card.getOwner() + " stacks " + GameUtils.getCardLink(_card) + " from discard on " + GameUtils.getCardLink(_stackOn)); - game.getGameState().removeCardFromZone(_card); + game.getGameState().removeCardsFromZone(Collections.singleton(_card)); game.getGameState().stackCard(_card, _stackOn); return new FullEffectResult(null, true, true); } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/StackCardFromHandEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/StackCardFromHandEffect.java index 6f0d36bd0..e3640dd5c 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/StackCardFromHandEffect.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/StackCardFromHandEffect.java @@ -7,6 +7,8 @@ import com.gempukku.lotro.logic.GameUtils; import com.gempukku.lotro.logic.timing.AbstractEffect; import com.gempukku.lotro.logic.timing.EffectResult; +import java.util.Collections; + public class StackCardFromHandEffect extends AbstractEffect { private PhysicalCard _card; private PhysicalCard _stackOn; @@ -20,7 +22,7 @@ public class StackCardFromHandEffect extends AbstractEffect { protected FullEffectResult playEffectReturningResult(LotroGame game) { if (isPlayableInFull(game)) { game.getGameState().sendMessage(_card.getOwner() + " stacks " + GameUtils.getCardLink(_card) + " from hand on " + GameUtils.getCardLink(_stackOn)); - game.getGameState().removeCardFromZone(_card); + game.getGameState().removeCardsFromZone(Collections.singleton(_card)); game.getGameState().stackCard(_card, _stackOn); return new FullEffectResult(null, true, true); } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/StackCardFromPlayEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/StackCardFromPlayEffect.java index 74fb29656..f5162fa8d 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/StackCardFromPlayEffect.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/StackCardFromPlayEffect.java @@ -8,6 +8,7 @@ import com.gempukku.lotro.logic.GameUtils; import com.gempukku.lotro.logic.timing.AbstractEffect; import com.gempukku.lotro.logic.timing.EffectResult; +import java.util.Collections; import java.util.List; public class StackCardFromPlayEffect extends AbstractEffect { @@ -38,20 +39,20 @@ public class StackCardFromPlayEffect extends AbstractEffect { protected FullEffectResult playEffectReturningResult(LotroGame game) { if (isPlayableInFull(game)) { game.getGameState().stopAffecting(_card); - game.getGameState().removeCardFromZone(_card); + game.getGameState().removeCardsFromZone(Collections.singleton(_card)); GameState gameState = game.getGameState(); List attachedCards = gameState.getAttachedCards(_card); for (PhysicalCard attachedCard : attachedCards) { gameState.stopAffecting(attachedCard); - gameState.removeCardFromZone(attachedCard); + gameState.removeCardsFromZone(Collections.singleton(attachedCard)); gameState.addCardToZone(attachedCard, Zone.DISCARD); } List stackedCards = gameState.getStackedCards(_card); for (PhysicalCard stackedCard : stackedCards) { - gameState.removeCardFromZone(stackedCard); + gameState.removeCardsFromZone(Collections.singleton(stackedCard)); gameState.addCardToZone(stackedCard, Zone.DISCARD); } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/dwarven/Card1_018.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/dwarven/Card1_018.java index 3aced5419..1d00e5304 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/dwarven/Card1_018.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/dwarven/Card1_018.java @@ -75,10 +75,8 @@ public class Card1_018 extends AbstractEvent { topDeckCards.removeAll(selectedCards); } - if (topDeckCards.size() > 0) { - for (PhysicalCard topDeckCard : topDeckCards) - game.getGameState().removeCardFromZone(topDeckCard); - } + if (topDeckCards.size() > 0) + game.getGameState().removeCardsFromZone(topDeckCards); } }); } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/dwarven/Card4_054.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/dwarven/Card4_054.java index 4549453a5..119910d15 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/dwarven/Card4_054.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/dwarven/Card4_054.java @@ -13,6 +13,7 @@ import com.gempukku.lotro.game.state.LotroGame; import com.gempukku.lotro.logic.effects.ChooseActiveCardsEffect; import java.util.Collection; +import java.util.Collections; /** * Set: The Two Towers @@ -40,11 +41,11 @@ public class Card4_054 extends AbstractEvent { @Override protected void cardsSelected(LotroGame game, Collection cards) { for (PhysicalCard card : cards) { + game.getGameState().removeCardsFromZone(game.getGameState().getStackedCards(card)); for (PhysicalCard stackedCard : game.getGameState().getStackedCards(card)) { - game.getGameState().removeCardFromZone(stackedCard); game.getGameState().putCardOnBottomOfDeck(stackedCard); } - game.getGameState().removeCardFromZone(card); + game.getGameState().removeCardsFromZone(Collections.singleton(card)); game.getGameState().putCardOnBottomOfDeck(card); } action.appendEffect( diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/dwarven/Card4_055.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/dwarven/Card4_055.java index 4b127d36c..d62c9b08c 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/dwarven/Card4_055.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/dwarven/Card4_055.java @@ -11,6 +11,8 @@ import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.game.state.LotroGame; import com.gempukku.lotro.logic.effects.ChooseActiveCardEffect; +import java.util.Collections; + /** * Set: The Two Towers * Side: Free @@ -46,12 +48,12 @@ public class Card4_055 extends AbstractEvent { @Override protected void cardSelected(PhysicalCard card) { int count = 0; + game.getGameState().removeCardsFromZone(game.getGameState().getStackedCards(card)); for (PhysicalCard stackedCard : game.getGameState().getStackedCards(card)) { - game.getGameState().removeCardFromZone(stackedCard); game.getGameState().putCardOnBottomOfDeck(stackedCard); count++; } - game.getGameState().removeCardFromZone(card); + game.getGameState().removeCardsFromZone(Collections.singleton(card)); game.getGameState().putCardOnBottomOfDeck(card); count++; 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 665889cf3..0856a8bed 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 @@ -13,7 +13,7 @@ public interface GameStateListener { public void cardMoved(PhysicalCard card); - public void cardRemoved(PhysicalCard card); + public void cardsRemoved(Collection cards); public void setPlayerOrder(List playerIds); 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 b406077fd..ed39a3dc8 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 @@ -106,7 +106,7 @@ public class GameState { String owner = physicalCard.getOwner(); GameStateListener result = _gameStateListeners.get(owner); if (result != null) - return Collections.singletonList(result); + return Collections.singleton(result); else return Collections.emptyList(); } @@ -200,7 +200,7 @@ public class GameState { public void transferCard(PhysicalCard card, PhysicalCard transferTo) { if (card.getZone() != Zone.ATTACHED) { - removeCardFromZone(card); + removeCardsFromZone(Collections.singleton(card)); addCardToZone(card, Zone.ATTACHED); } ((PhysicalCardImpl) card).attachTo((PhysicalCardImpl) transferTo); @@ -267,45 +267,63 @@ public class GameState { return _inPlay; } - public void removeCardFromZone(PhysicalCard card) { - Zone zone = card.getZone(); + public void removeCardsFromZone(Collection cards) { + Map> listenerCards = new HashMap>(); - List zoneCards = getZoneCards(card.getOwner(), card.getBlueprint().getCardType(), zone); - boolean b = zoneCards.remove(card); - if (!b) - throw new RuntimeException("Card was not found in the expected zone"); + for (PhysicalCard card : cards) { + Zone zone = card.getZone(); - if (zone == Zone.ATTACHED) - ((PhysicalCardImpl) card).attachTo(null); + List zoneCards = getZoneCards(card.getOwner(), card.getBlueprint().getCardType(), zone); + boolean b = zoneCards.remove(card); + if (!b) + throw new RuntimeException("Card was not found in the expected zone"); - if (zone == Zone.STACKED) - ((PhysicalCardImpl) card).stackOn(null); + if (zone == Zone.ATTACHED) + ((PhysicalCardImpl) card).attachTo(null); - for (Skirmish assignment : new LinkedList(_assignments)) { - if (assignment.getFellowshipCharacter() == card) - removeAssignment(assignment); - if (assignment.getShadowCharacters().remove(card)) - removeAssignment(assignment); + if (zone == Zone.STACKED) + ((PhysicalCardImpl) card).stackOn(null); + + for (Skirmish assignment : new LinkedList(_assignments)) { + if (assignment.getFellowshipCharacter() == card) + removeAssignment(assignment); + if (assignment.getShadowCharacters().remove(card)) + removeAssignment(assignment); + } + + if (_skirmish != null) { + if (_skirmish.getFellowshipCharacter() == card) + _skirmish.setFellowshipCharacter(null); + _skirmish.getShadowCharacters().remove(card); + } + + removeAllTokens(card); + + if (isZonePublic(zone)) + for (GameStateListener listener : getAllGameStateListeners()) { + getValue(listenerCards, listener).add(card); + } + else if (isZonePrivate(zone)) + for (GameStateListener listener : getPrivateGameStateListeners(card)) { + getValue(listenerCards, listener).add(card); + } + + if ((zone == Zone.DECK && card.getBlueprint().getCardType() != CardType.SITE) || zone == Zone.HAND || zone == Zone.DISCARD || zone == Zone.DEAD) + for (GameStateListener listener : getAllGameStateListeners()) + listener.setZoneSize(card.getOwner(), zone, zoneCards.size()); } - if (_skirmish != null) { - if (_skirmish.getFellowshipCharacter() == card) - _skirmish.setFellowshipCharacter(null); - _skirmish.getShadowCharacters().remove(card); + for (Map.Entry> gameStateListenerSetEntry : listenerCards.entrySet()) + gameStateListenerSetEntry.getKey().cardsRemoved(gameStateListenerSetEntry.getValue()); + } + + private Set getValue(Map> map, GameStateListener listener) { + Set result = map.get(listener); + if (result == null) { + result = new HashSet(); + map.put(listener, result); } - - removeAllTokens(card); - - if (isZonePublic(zone)) - for (GameStateListener listener : getAllGameStateListeners()) - listener.cardRemoved(card); - else if (isZonePrivate(zone)) - for (GameStateListener listener : getPrivateGameStateListeners(card)) - listener.cardRemoved(card); - - if ((zone == Zone.DECK && card.getBlueprint().getCardType() != CardType.SITE) || zone == Zone.HAND || zone == Zone.DISCARD || zone == Zone.DEAD) - for (GameStateListener listener : getAllGameStateListeners()) - listener.setZoneSize(card.getOwner(), zone, zoneCards.size()); + return result; } public void addCardToZone(PhysicalCard card, Zone zone) { @@ -724,7 +742,7 @@ public class GameState { List deck = _decks.get(player); if (deck.size() > 0) { PhysicalCard card = deck.get(0); - removeCardFromZone(card); + removeCardsFromZone(Collections.singleton(card)); addCardToZone(card, Zone.HAND); } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardCardsFromHandEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardCardsFromHandEffect.java index 16e68afeb..7f1401653 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardCardsFromHandEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardCardsFromHandEffect.java @@ -42,8 +42,8 @@ public class DiscardCardsFromHandEffect extends AbstractEffect { protected FullEffectResult playEffectReturningResult(LotroGame game) { GameState gameState = game.getGameState(); gameState.sendMessage(getAppendedNames(_cards) + " is/are discarded from hand"); + gameState.removeCardsFromZone(_cards); for (PhysicalCard card : _cards) { - gameState.removeCardFromZone(card); gameState.addCardToZone(card, Zone.DISCARD); } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardCardsFromPlayEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardCardsFromPlayEffect.java index 68c45c9e9..be55d99cb 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardCardsFromPlayEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardCardsFromPlayEffect.java @@ -10,10 +10,7 @@ import com.gempukku.lotro.logic.modifiers.ModifiersQuerying; import com.gempukku.lotro.logic.timing.EffectResult; import com.gempukku.lotro.logic.timing.results.DiscardCardsFromPlayResult; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; public class DiscardCardsFromPlayEffect extends AbstractPreventableCardEffect { private PhysicalCard _source; @@ -62,7 +59,7 @@ public class DiscardCardsFromPlayEffect extends AbstractPreventableCardEffect { GameState gameState = game.getGameState(); gameState.stopAffecting(card); - gameState.removeCardFromZone(card); + gameState.removeCardsFromZone(Collections.singleton(card)); gameState.addCardToZone(card, Zone.DISCARD); List attachedCards = gameState.getAttachedCards(card); @@ -70,13 +67,13 @@ public class DiscardCardsFromPlayEffect extends AbstractPreventableCardEffect { discardedCards.add(attachedCard); gameState.stopAffecting(attachedCard); - gameState.removeCardFromZone(attachedCard); + gameState.removeCardsFromZone(Collections.singleton(attachedCard)); gameState.addCardToZone(attachedCard, Zone.DISCARD); } List stackedCards = gameState.getStackedCards(card); for (PhysicalCard stackedCard : stackedCards) { - gameState.removeCardFromZone(stackedCard); + gameState.removeCardsFromZone(Collections.singleton(stackedCard)); gameState.addCardToZone(stackedCard, Zone.DISCARD); } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/KillEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/KillEffect.java index e1822a8b3..5b3dc4ae2 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/KillEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/KillEffect.java @@ -11,6 +11,7 @@ import com.gempukku.lotro.logic.timing.EffectResult; import com.gempukku.lotro.logic.timing.results.DiscardCardsFromPlayResult; import com.gempukku.lotro.logic.timing.results.KillResult; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -42,11 +43,12 @@ public class KillEffect extends AbstractSuccessfulEffect { Set discardedCards = new HashSet(); Set killedCards = new HashSet(); + GameState gameState = game.getGameState(); + for (PhysicalCard card : _cards) { - GameState gameState = game.getGameState(); gameState.sendMessage(GameUtils.getCardLink(card) + " gets killed"); gameState.stopAffecting(card); - gameState.removeCardFromZone(card); + gameState.removeCardsFromZone(Collections.singleton(card)); if (card.getBlueprint().getSide() == Side.FREE_PEOPLE) { killedCards.add(card); gameState.addCardToZone(card, Zone.DEAD); @@ -61,13 +63,13 @@ public class KillEffect extends AbstractSuccessfulEffect { discardedCards.add(attachedCard); gameState.stopAffecting(attachedCard); - gameState.removeCardFromZone(attachedCard); + gameState.removeCardsFromZone(Collections.singleton(attachedCard)); gameState.addCardToZone(attachedCard, Zone.DISCARD); } List stackedCards = gameState.getStackedCards(card); for (PhysicalCard stackedCard : stackedCards) { - gameState.removeCardFromZone(stackedCard); + gameState.removeCardsFromZone(Collections.singleton(stackedCard)); gameState.addCardToZone(stackedCard, Zone.DISCARD); } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/pregame/FirstPlayerPlaysSiteGameProcess.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/pregame/FirstPlayerPlaysSiteGameProcess.java index 5e0cc32ef..d0b2a804e 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/pregame/FirstPlayerPlaysSiteGameProcess.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/pregame/FirstPlayerPlaysSiteGameProcess.java @@ -7,6 +7,7 @@ import com.gempukku.lotro.game.state.GameState; import com.gempukku.lotro.game.state.LotroGame; import com.gempukku.lotro.logic.timing.processes.GameProcess; +import java.util.Collections; import java.util.Map; public class FirstPlayerPlaysSiteGameProcess implements GameProcess { @@ -24,7 +25,7 @@ public class FirstPlayerPlaysSiteGameProcess implements GameProcess { public void process() { GameState gameState = _game.getGameState(); PhysicalCard firstSite = Filters.filter(gameState.getAdventureDeck(_firstPlayer), gameState, _game.getModifiersQuerying(), Filters.siteNumber(1)).iterator().next(); - gameState.removeCardFromZone(firstSite); + gameState.removeCardsFromZone(Collections.singleton(firstSite)); gameState.addCardToZone(firstSite, Zone.ADVENTURE_PATH); for (String playerId : gameState.getPlayerOrder().getAllPlayers()) diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/pregame/PlayRingBearerRingAndAddBurdersGameProcess.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/pregame/PlayRingBearerRingAndAddBurdersGameProcess.java index 040f1cd2f..4ef3f0894 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/pregame/PlayRingBearerRingAndAddBurdersGameProcess.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/pregame/PlayRingBearerRingAndAddBurdersGameProcess.java @@ -9,6 +9,7 @@ import com.gempukku.lotro.game.state.GameState; import com.gempukku.lotro.game.state.LotroGame; import com.gempukku.lotro.logic.timing.processes.GameProcess; +import java.util.Collections; import java.util.Map; public class PlayRingBearerRingAndAddBurdersGameProcess implements GameProcess { @@ -27,12 +28,12 @@ public class PlayRingBearerRingAndAddBurdersGameProcess implements GameProcess { GameState gameState = _game.getGameState(); for (String playerId : gameState.getPlayerOrder().getAllPlayers()) { PhysicalCard ringBearer = Filters.filter(gameState.getDeck(playerId), gameState, _game.getModifiersQuerying(), Filters.keyword(Keyword.RING_BEARER)).iterator().next(); - gameState.removeCardFromZone(ringBearer); + gameState.removeCardsFromZone(Collections.singleton(ringBearer)); gameState.addCardToZone(ringBearer, Zone.FREE_CHARACTERS); gameState.setRingBearer(ringBearer); PhysicalCard ring = Filters.filter(gameState.getDeck(playerId), gameState, _game.getModifiersQuerying(), Filters.type(CardType.THE_ONE_RING)).iterator().next(); - gameState.removeCardFromZone(ring); + gameState.removeCardsFromZone(Collections.singleton(ring)); gameState.attachCard(ring, ringBearer); gameState.startPlayerTurn(playerId); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/move/PlayerPlaysNextSiteIfNotThereGameProcess.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/move/PlayerPlaysNextSiteIfNotThereGameProcess.java index 0f4686dbb..446d1860c 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/move/PlayerPlaysNextSiteIfNotThereGameProcess.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/move/PlayerPlaysNextSiteIfNotThereGameProcess.java @@ -15,6 +15,8 @@ import com.gempukku.lotro.logic.timing.results.WhenMoveFromResult; import com.gempukku.lotro.logic.timing.results.WhenMoveToResult; import com.gempukku.lotro.logic.timing.results.WhenMovesResult; +import java.util.Collections; + public class PlayerPlaysNextSiteIfNotThereGameProcess implements GameProcess { private LotroGame _game; private GameProcess _afterMoveGameProcess; @@ -49,7 +51,7 @@ public class PlayerPlaysNextSiteIfNotThereGameProcess implements GameProcess { nextSite = Filters.filter(gameState.getAdventureDeck(playerToPlaySite), gameState, _game.getModifiersQuerying(), Filters.siteNumber(nextSiteNumber)).iterator().next(); - gameState.removeCardFromZone(nextSite); + gameState.removeCardsFromZone(Collections.singleton(nextSite)); gameState.addCardToZone(nextSite, Zone.ADVENTURE_PATH); final PhysicalCard site = nextSite; 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 07e7ba36a..6326c8515 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 @@ -4,14 +4,13 @@ import com.gempukku.lotro.common.Phase; import com.gempukku.lotro.common.Token; import com.gempukku.lotro.common.Zone; import com.gempukku.lotro.communication.GameStateListener; +import static com.gempukku.lotro.game.GameEvent.Type.*; import java.util.Collection; import java.util.Date; import java.util.LinkedList; import java.util.List; -import static com.gempukku.lotro.game.GameEvent.Type.*; - public class GatheringParticipantCommunicationChannel implements GameStateListener { private List _events = new LinkedList(); private String _self; @@ -78,8 +77,8 @@ public class GatheringParticipantCommunicationChannel implements GameStateListen } @Override - public void cardRemoved(PhysicalCard card) { - _events.add(new GameEvent(REMOVE_CARD_FROM_PLAY).card(card)); + public void cardsRemoved(Collection cards) { + _events.add(new GameEvent(REMOVE_CARD_FROM_PLAY).otherCardIds(getCardIds(cards))); } @Override diff --git a/gemp-lotr/gemp-lotr-web/src/main/webapp/game.html b/gemp-lotr/gemp-lotr-web/src/main/webapp/game.html index 4c99b343a..277ec2984 100644 --- a/gemp-lotr/gemp-lotr-web/src/main/webapp/game.html +++ b/gemp-lotr/gemp-lotr-web/src/main/webapp/game.html @@ -177,10 +177,10 @@ ui = new GempLotrGameUI("/gemp-lotr/server"); $(window).resize(function() { - ui.layoutUI(); + ui.windowResized(); }); - ui.layoutUI(); + ui.layoutUI(true); ui.startGameSession(); }); 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 3f50e78a7..b1ffed240 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 @@ -30,40 +30,40 @@ var GameAnimations = Class.extend({ var cardWidth = card.getWidthForHeight(cardHeight); $(cardDiv).css( - { - position: "absolute", - left: (gameWidth / 2 - cardWidth / 4), - top: gameHeight * (3 / 8), - width: cardWidth / 2, - height: cardHeight / 2, - "z-index": 100, - opacity: 0}); + { + position: "absolute", + left: (gameWidth / 2 - cardWidth / 4), + top: gameHeight * (3 / 8), + width: cardWidth / 2, + height: cardHeight / 2, + "z-index": 100, + opacity: 0}); $(cardDiv).animate( - { - left: "-=" + cardWidth / 4, - top: "-=" + (gameHeight / 8), - width: "+=" + (cardWidth / 2), - height: "+=" + (cardHeight / 2), - opacity: 1}, - { - duration: that.playEventDuration / 8, - easing: "linear", - queue: false, - complete: next}); + { + left: "-=" + cardWidth / 4, + top: "-=" + (gameHeight / 8), + width: "+=" + (cardWidth / 2), + height: "+=" + (cardHeight / 2), + opacity: 1}, + { + duration: that.playEventDuration / 8, + easing: "linear", + queue: false, + complete: next}); }).queue( function(next) { setTimeout(next, that.playEventDuration * (5 / 8)); }).queue( function(next) { $(cardDiv).animate( - { - opacity: 0}, - { - duration: that.playEventDuration / 4, - easing: "easeOutQuart", - queue: false, - complete: next}); + { + opacity: 0}, + { + duration: that.playEventDuration / 4, + easing: "easeOutQuart", + queue: false, + complete: next}); }).queue( function(next) { $(cardDiv).remove(); @@ -99,26 +99,26 @@ var GameAnimations = Class.extend({ var targetCardHeight = $(targetCard).height(); $(cardDiv).css( - { - position: "absolute", - left: $(targetCard).position().left, - top: $(targetCard).position().top, - width: targetCardWidth, - height: targetCardHeight, - "z-index": 100, - opacity: 1}); + { + position: "absolute", + left: $(targetCard).position().left, + top: $(targetCard).position().top, + width: targetCardWidth, + height: targetCardHeight, + "z-index": 100, + opacity: 1}); $(cardDiv).animate( - { - opacity: 0, - left: "-=" + (targetCardWidth / 2), - top: "-=" + (targetCardHeight / 2), - width: "+=" + targetCardWidth, - height: "+=" + targetCardHeight}, - { - duration: that.cardAffectsCardDuration, - easing: "easeInQuart", - queue: false, - complete: null}); + { + opacity: 0, + left: "-=" + (targetCardWidth / 2), + top: "-=" + (targetCardHeight / 2), + width: "+=" + targetCardWidth, + height: "+=" + targetCardHeight}, + { + duration: that.cardAffectsCardDuration, + easing: "easeInQuart", + queue: false, + complete: null}); } setTimeout(next, that.cardAffectsCardDuration); @@ -132,9 +132,18 @@ var GameAnimations = Class.extend({ $(this).remove(); } } - ); + ); next(); }); } + }, + + windowResized: function() { + var that = this; + $("#main").queue( + function(next) { + that.game.layoutUI(true); + next(); + }); } }); \ No newline at end of file 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 a50b532fc..48fe17ae2 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 @@ -273,21 +273,21 @@ var GempLotrGameUI = Class.extend({ initializeDialogs: function() { this.smallDialog = $("
") .dialog({ - autoOpen: false, - closeOnEscape: false, - resizable: false, - width: 400, - height: 200 - }); + autoOpen: false, + closeOnEscape: false, + resizable: false, + width: 400, + height: 200 + }); this.cardActionDialog = $("
") .dialog({ - autoOpen: false, - closeOnEscape: false, - resizable: true, - width: 600, - height: 300 - }); + autoOpen: false, + closeOnEscape: false, + resizable: true, + width: 600, + height: 300 + }); var that = this; @@ -302,15 +302,15 @@ var GempLotrGameUI = Class.extend({ this.infoDialog = $("
") .dialog({ - autoOpen: false, - closeOnEscape: true, - resizable: true, - title: "Card information", - minHeight: 80, - minWidth: 200, - width: Math.max(600, width * 0.75), - height: Math.max(300, height * 0.75) - }); + autoOpen: false, + closeOnEscape: true, + resizable: true, + title: "Card information", + minHeight: 80, + minWidth: 200, + width: Math.max(600, width * 0.75), + height: Math.max(300, height * 0.75) + }); var swipeOptions = { threshold: 20, @@ -326,16 +326,20 @@ var GempLotrGameUI = Class.extend({ this.infoDialog.swipe(swipeOptions); }, - layoutUI: function(sizeNotChanged) { + windowResized: function() { + this.animations.windowResized(); + }, + + layoutUI: function(sizeChanged) { var padding = this.padding; var width = $(window).width(); var height = $(window).height(); - if (sizeNotChanged) { - width = this.windowWidth; - height = this.windowHeight; - } else { + if (sizeChanged) { this.windowWidth = width; this.windowHeight = height; + } else { + width = this.windowWidth; + height = this.windowHeight; } var heightScales; @@ -521,7 +525,7 @@ var GempLotrGameUI = Class.extend({ } if (gameEvents.length > 0) - this.layoutUI(true); + this.layoutUI(false); // Then the strictly animation events for (var i = 0; i < gameEvents.length; i++) { @@ -603,9 +607,9 @@ var GempLotrGameUI = Class.extend({ else if (zone == "DISCARD") $("#discard" + this.getPlayerIndex(playerId)).text("Discard: " + count); else if (zone == "DEAD") - $("#deadPile" + this.getPlayerIndex(playerId)).text("Dead pile: " + count); - else if (zone == "DECK") - $("#deck" + this.getPlayerIndex(playerId)).text("Deck: " + count); + $("#deadPile" + this.getPlayerIndex(playerId)).text("Dead pile: " + count); + else if (zone == "DECK") + $("#deck" + this.getPlayerIndex(playerId)).text("Deck: " + count); }, playerPosition: function(element) { @@ -773,7 +777,7 @@ var GempLotrGameUI = Class.extend({ if (index != -1) cardData.attachedCards.splice(index, 1); } - ); + ); var card = $(".card:cardId(" + cardId + ")"); var cardData = card.data("card"); @@ -873,32 +877,37 @@ var GempLotrGameUI = Class.extend({ } this.initializeGameUI(); - this.layoutUI(); + this.layoutUI(true); }, removeCardFromPlay: function(element) { - var cardId = element.getAttribute("cardId"); - var zone = element.getAttribute("zone"); + var cardRemovedIds = element.getAttribute("otherCardIds").split(","); - var card = $(".card:cardId(" + cardId + ")"); + for (var i = 0; i < cardRemovedIds.length; i++) { + var cardId = cardRemovedIds[i]; + var card = $(".card:cardId(" + cardId + ")"); - if (zone == "ATTACHED" || zone == "STACKED") { - $(".card").each( - function() { - var cardData = $(this).data("card"); - var index = -1; - for (var i = 0; i < cardData.attachedCards.length; i++) - if (cardData.attachedCards[i].data("card").cardId == cardId) { - index = i; - break; + if (card != null) { + var cardData = card.data("card"); + if (cardData.zone == "ATTACHED" || cardData.zone == "STACKED") { + $(".card").each( + function() { + var cardData = $(this).data("card"); + var index = -1; + for (var i = 0; i < cardData.attachedCards.length; i++) + if (cardData.attachedCards[i].data("card").cardId == cardId) { + index = i; + break; + } + if (index != -1) + cardData.attachedCards.splice(index, 1); } - if (index != -1) - cardData.attachedCards.splice(index, 1); - } - ); - } + ); + } - card.remove(); + card.remove(); + } + } }, gamePhaseChange: function(element) { @@ -967,13 +976,13 @@ var GempLotrGameUI = Class.extend({ this.smallDialog .html(text + "
") .dialog("option", "buttons", - { - "OK": function() { - $(this).dialog("close"); - that.decisionFunction(id, $("#integerDecision").val()); - } - } - ); + { + "OK": function() { + $(this).dialog("close"); + that.decisionFunction(id, $("#integerDecision").val()); + } + } + ); $("#integerDecision").SpinnerControl({ type: 'range', typedata: { @@ -1005,13 +1014,13 @@ var GempLotrGameUI = Class.extend({ this.smallDialog .html(html) .dialog("option", "buttons", - { - "OK": function() { - $(this).dialog("close"); - that.decisionFunction(id, $("#multipleChoiceDecision").val()); - } - } - ); + { + "OK": function() { + $(this).dialog("close"); + that.decisionFunction(id, $("#multipleChoiceDecision").val()); + } + } + ); this.smallDialog.dialog("open"); }, @@ -1260,8 +1269,8 @@ var GempLotrGameUI = Class.extend({ $(div).find('LI.hover').removeClass('hover'); $(this).parent().addClass('hover'); }).mouseout(function() { - $(div).find('LI.hover').removeClass('hover'); - }); + $(div).find('LI.hover').removeClass('hover'); + }); var getRidOfContextMenu = function() { $(div).remove(); @@ -1530,7 +1539,7 @@ var GempLotrGameUI = Class.extend({ } else { that.unassignMinion(cardId); } - that.layoutUI(true); + that.layoutUI(false); that.doAssignments(freeCharacters, minions); };