diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractAttachable.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractAttachable.java index 41adde022..fc73a61a3 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractAttachable.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractAttachable.java @@ -34,7 +34,7 @@ public class AbstractAttachable extends AbstractLotroCardBlueprint { GameState gameState = game.getGameState(); LotroCardBlueprint blueprint = self.getBlueprint(); if (gameState.getCurrentPhase() == ((getSide() == Side.FREE_PEOPLE) ? Phase.FELLOWSHIP : Phase.SHADOW) - && self.getZone() == Zone.HAND + && (self.getZone() == Zone.HAND || self.getZone() == Zone.DECK) && (!blueprint.isUnique() || !Filters.canSpot(gameState, game.getModifiersQuerying(), Filters.name(blueprint.getName()))) && Filters.canSpot(gameState, game.getModifiersQuerying(), validTargetFilter)) { diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/dwarven/Card1_017.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/dwarven/Card1_017.java index 351ed44f4..86ae11685 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/dwarven/Card1_017.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/dwarven/Card1_017.java @@ -3,10 +3,7 @@ package com.gempukku.lotro.cards.set1.dwarven; import com.gempukku.lotro.cards.AbstractAlly; import com.gempukku.lotro.cards.PlayConditions; import com.gempukku.lotro.cards.effects.ExertCharacterEffect; -import com.gempukku.lotro.common.CardType; -import com.gempukku.lotro.common.Culture; -import com.gempukku.lotro.common.Phase; -import com.gempukku.lotro.common.Zone; +import com.gempukku.lotro.common.*; import com.gempukku.lotro.filters.Filters; import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.game.state.LotroGame; @@ -31,6 +28,7 @@ import java.util.List; public class Card1_017 extends AbstractAlly { public Card1_017() { super(1, 3, 3, 3, Culture.DWARVEN, "Grimir", "1_17", true); + addKeyword(Keyword.DWARF); } @Override @@ -53,6 +51,7 @@ public class Card1_017 extends AbstractAlly { } } ); + actions.add(action); } return actions; diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/dwarven/Card1_019.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/dwarven/Card1_019.java index 3720f7946..83d6d5638 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/dwarven/Card1_019.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/dwarven/Card1_019.java @@ -37,7 +37,7 @@ public class Card1_019 extends AbstractLotroCardBlueprint { @Override public List getPlayablePhaseActions(String playerId, LotroGame game, PhysicalCard self) { if (game.getGameState().getCurrentPhase() == Phase.MANEUVER - && Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), Filters.canExert(), Filters.keyword(Keyword.DWARF))) { + && Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), Filters.keyword(Keyword.DWARF), Filters.canExert())) { final PlayEventFromHandAction action = new PlayEventFromHandAction(self); action.addCost( new ChooseActiveCardEffect(playerId, "Choose Dwarf to exert", Filters.canExert(), Filters.keyword(Keyword.DWARF)) { diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/dwarven/Card1_022.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/dwarven/Card1_022.java index c9e89e225..9ae44f23d 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/dwarven/Card1_022.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/dwarven/Card1_022.java @@ -1,6 +1,7 @@ package com.gempukku.lotro.cards.set1.dwarven; import com.gempukku.lotro.cards.AbstractLotroCardBlueprint; +import com.gempukku.lotro.cards.actions.PlayEventFromHandAction; import com.gempukku.lotro.cards.effects.ExertCharacterEffect; import com.gempukku.lotro.common.*; import com.gempukku.lotro.filters.Filters; @@ -41,8 +42,7 @@ public class Card1_022 extends AbstractLotroCardBlueprint { public List getPlayablePhaseActions(String playerId, LotroGame game, PhysicalCard self) { if (game.getGameState().getCurrentPhase() == Phase.MANEUVER && Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), Filters.keyword(Keyword.DWARF), Filters.canExert())) { - final CostToEffectAction action = new CostToEffectAction(self, "Discard cards from the top of your draw deck until you choose to stop" + - " (limit 5). Add (1) for each card discarded in this way. Take the last card discarded into hand."); + final PlayEventFromHandAction action = new PlayEventFromHandAction(self); action.addCost( new ChooseActiveCardEffect(playerId, "Choose Dwarf to exert", Filters.keyword(Keyword.DWARF), Filters.canExert()) { @Override diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/elven/Card1_030.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/elven/Card1_030.java index 069234c95..8628adb4d 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/elven/Card1_030.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/elven/Card1_030.java @@ -29,6 +29,7 @@ public class Card1_030 extends AbstractCompanion { public Card1_030() { super(2, 6, 3, Culture.ELVEN, "Arwen", "1_30", true); addKeyword(Keyword.RANGER); + addKeyword(Keyword.ELF); setSignet(Signet.ARAGORN); } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/elven/Card1_035.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/elven/Card1_035.java index b4e62a5d3..2736a5a3e 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/elven/Card1_035.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/elven/Card1_035.java @@ -3,15 +3,17 @@ package com.gempukku.lotro.cards.set1.elven; import com.gempukku.lotro.cards.AbstractLotroCardBlueprint; import com.gempukku.lotro.cards.PlayConditions; import com.gempukku.lotro.cards.actions.PlayEventFromHandAction; -import com.gempukku.lotro.cards.actions.PlayPermanentFromDeckAction; import com.gempukku.lotro.cards.effects.SpotEffect; import com.gempukku.lotro.common.*; +import com.gempukku.lotro.filters.Filter; import com.gempukku.lotro.filters.Filters; import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.GameState; import com.gempukku.lotro.game.state.LotroGame; import com.gempukku.lotro.logic.decisions.ArbitraryCardsSelectionDecision; import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; import com.gempukku.lotro.logic.effects.PlayoutDecisionEffect; +import com.gempukku.lotro.logic.modifiers.ModifiersQuerying; import com.gempukku.lotro.logic.timing.Action; import java.util.Collections; @@ -37,19 +39,27 @@ public class Card1_035 extends AbstractLotroCardBlueprint { } @Override - public List getPlayablePhaseActions(String playerId, final LotroGame game, PhysicalCard self) { + public List getPlayablePhaseActions(final String playerId, final LotroGame game, PhysicalCard self) { if (PlayConditions.canPlayFromHandDuringPhase(game.getGameState(), Phase.FELLOWSHIP, self) && Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), Filters.keyword(Keyword.ELF))) { final PlayEventFromHandAction action = new PlayEventFromHandAction(self); action.addCost(new SpotEffect(Filters.keyword(Keyword.ELF))); action.addEffect( new PlayoutDecisionEffect(game.getUserFeedback(), playerId, - new ArbitraryCardsSelectionDecision(1, "Choose Tale to play from your deck", Filters.filter(game.getGameState().getDeck(playerId), game.getGameState(), game.getModifiersQuerying(), Filters.keyword(Keyword.TALE)), 0, 1) { + new ArbitraryCardsSelectionDecision(1, "Choose Tale to play from your deck", Filters.filter(game.getGameState().getDeck(playerId), game.getGameState(), game.getModifiersQuerying(), Filters.keyword(Keyword.TALE), + new Filter() { + @Override + public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { + List playableActions = physicalCard.getBlueprint().getPlayablePhaseActions(playerId, game, physicalCard); + return (playableActions.size() > 0); + } + }), 0, 1) { @Override public void decisionMade(String result) throws DecisionResultInvalidException { - List selectedCard = getSelectedCardsByResponse(result); - if (selectedCard.size() > 0) { - game.getActionsEnvironment().addActionToStack(new PlayPermanentFromDeckAction(selectedCard.get(0), Zone.FREE_SUPPORT)); + List selectedCards = getSelectedCardsByResponse(result); + if (selectedCards.size() > 0) { + PhysicalCard selectedCard = selectedCards.get(0); + game.getActionsEnvironment().addActionToStack(selectedCard.getBlueprint().getPlayablePhaseActions(playerId, game, selectedCard).get(0)); } } }) diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/elven/Card1_050.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/elven/Card1_050.java index 94b0c642e..770daaf5f 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/elven/Card1_050.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/elven/Card1_050.java @@ -14,7 +14,6 @@ import com.gempukku.lotro.logic.effects.ChooseActiveCardEffect; import com.gempukku.lotro.logic.effects.WoundEffect; import com.gempukku.lotro.logic.timing.Action; -import java.util.Collections; import java.util.LinkedList; import java.util.List; @@ -61,9 +60,9 @@ public class Card1_050 extends AbstractCompanion { } }); - return Collections.singletonList(action); + actions.add(action); } - return null; + return actions; } } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/elven/Card1_054.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/elven/Card1_054.java index d2382a481..1dea10f86 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/elven/Card1_054.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/elven/Card1_054.java @@ -29,6 +29,11 @@ public class Card1_054 extends AbstractLotroCardBlueprint { super(Side.FREE_PEOPLE, CardType.CONDITION, Culture.ELVEN, "Mallorn-trees", "1_54"); } + @Override + public int getTwilightCost() { + return 1; + } + @Override public List getPlayablePhaseActions(String playerId, LotroGame game, PhysicalCard self) { 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 cb19e2c34..de55030c0 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 @@ -134,9 +134,9 @@ public class GameState { } public void attachCard(PhysicalCard card, PhysicalCard attachTo) { - removeCardFromZone(card); ((PhysicalCardImpl) card).attachTo((PhysicalCardImpl) attachTo); - addCardToZone(card, Zone.ATTACHED); + if (card.getZone() != Zone.ATTACHED) + addCardToZone(card, Zone.ATTACHED); } public void setRingBearer(PhysicalCard card) { @@ -160,6 +160,9 @@ public class GameState { public void removeCardFromZone(PhysicalCard card) { Zone zone = card.getZone(); + + removeAllTokens(card); + boolean b = getZoneCards(card.getOwner(), card.getBlueprint().getCardType(), zone).remove(card); if (!b) throw new RuntimeException("Card was not found in the expected zone"); @@ -182,6 +185,18 @@ public class GameState { listener.cardCreated(card); } + private void removeAllTokens(PhysicalCard card) { + Map map = _cardTokens.get(card); + if (map != null) { + for (Map.Entry tokenIntegerEntry : map.entrySet()) + if (tokenIntegerEntry.getValue() > 0) + for (GameStateListener listener : getAllGameStateListeners()) + listener.removeTokens(card, tokenIntegerEntry.getKey(), tokenIntegerEntry.getValue()); + + map.clear(); + } + } + public void putCardOnBottomOfDeck(PhysicalCard card) { addCardToZone(card, Zone.DECK); } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/pregame/PlayerPlaysStartingFellowshipGameProcess.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/pregame/PlayerPlaysStartingFellowshipGameProcess.java index 3070ceb92..a1fbc5389 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/pregame/PlayerPlaysStartingFellowshipGameProcess.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/pregame/PlayerPlaysStartingFellowshipGameProcess.java @@ -43,7 +43,8 @@ public class PlayerPlaysStartingFellowshipGameProcess implements GameProcess { new Filter() { @Override public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { - return (physicalCard.getBlueprint().getPlayablePhaseActions(playerId, _game, physicalCard).size() > 0); + List playableActions = physicalCard.getBlueprint().getPlayablePhaseActions(playerId, _game, physicalCard); + return (playableActions != null && playableActions.size() > 0); } }); } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/archery/ArcheryFireGameProcess.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/archery/ArcheryFireGameProcess.java index 54e941699..713309514 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/archery/ArcheryFireGameProcess.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/archery/ArcheryFireGameProcess.java @@ -28,6 +28,12 @@ public class ArcheryFireGameProcess implements GameProcess { GameState gameState = _game.getGameState(); _fellowshipArcheryTotal = Filters.countActive(gameState, _game.getModifiersQuerying(), Filters.keyword(Keyword.ARCHER), + new Filter() { + @Override + public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { + return modifiersQuerying.addsToArcheryTotal(gameState, physicalCard); + } + }, Filters.or( Filters.type(CardType.COMPANION), new Filter() { @@ -40,7 +46,14 @@ public class ArcheryFireGameProcess implements GameProcess { _fellowshipArcheryTotal = _game.getModifiersQuerying().getArcheryTotal(gameState, Side.FREE_PEOPLE, _fellowshipArcheryTotal); _shadowArcheryTotal = Filters.countActive(gameState, _game.getModifiersQuerying(), - Filters.keyword(Keyword.ARCHER), Filters.type(CardType.MINION)); + Filters.keyword(Keyword.ARCHER), + new Filter() { + @Override + public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { + return modifiersQuerying.addsToArcheryTotal(gameState, physicalCard); + } + }, + Filters.type(CardType.MINION)); _shadowArcheryTotal = _game.getModifiersQuerying().getArcheryTotal(gameState, Side.SHADOW, _shadowArcheryTotal); } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/LotroServer.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/LotroServer.java index c7f84184f..ff6419604 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/LotroServer.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/LotroServer.java @@ -53,6 +53,10 @@ public class LotroServer { lotroDeck.setRing(_lotroCardBlueprintLibrary.getLotroCardBlueprint("1_1")); lotroDeck.setRingBearer(_lotroCardBlueprintLibrary.getLotroCardBlueprint("1_290")); + for (int i = 3; i < 58; i++) + lotroDeck.addCard(_lotroCardBlueprintLibrary.getLotroCardBlueprint("1_" + i)); + + // Sites lotroDeck.addCard(_lotroCardBlueprintLibrary.getLotroCardBlueprint("1_326")); lotroDeck.addCard(_lotroCardBlueprintLibrary.getLotroCardBlueprint("1_331")); lotroDeck.addCard(_lotroCardBlueprintLibrary.getLotroCardBlueprint("1_337")); @@ -63,10 +67,6 @@ public class LotroServer { lotroDeck.addCard(_lotroCardBlueprintLibrary.getLotroCardBlueprint("1_356")); lotroDeck.addCard(_lotroCardBlueprintLibrary.getLotroCardBlueprint("1_362")); - lotroDeck.addCard(_lotroCardBlueprintLibrary.getLotroCardBlueprint("1_12")); - lotroDeck.addCard(_lotroCardBlueprintLibrary.getLotroCardBlueprint("1_13")); - lotroDeck.addCard(_lotroCardBlueprintLibrary.getLotroCardBlueprint("1_51")); - for (int i = 0; i < 4; i++) { lotroDeck.addCard(_lotroCardBlueprintLibrary.getLotroCardBlueprint("1_145")); lotroDeck.addCard(_lotroCardBlueprintLibrary.getLotroCardBlueprint("1_146")); diff --git a/gemp-lotr/gemp-lotr-web/src/main/webapp/js/ui.js b/gemp-lotr/gemp-lotr-web/src/main/webapp/js/ui.js index f3b787238..d04016458 100644 --- a/gemp-lotr/gemp-lotr-web/src/main/webapp/js/ui.js +++ b/gemp-lotr/gemp-lotr-web/src/main/webapp/js/ui.js @@ -331,6 +331,7 @@ var GempLotrUI = Class.extend({ cardData.tokens[token] += count; this.layoutZone(zone); + this.assignmentsChanged(); }, removeTokens: function(element) { @@ -347,6 +348,7 @@ var GempLotrUI = Class.extend({ cardData.tokens[token] -= count; this.layoutZone(zone); + this.assignmentsChanged(); }, startSkirmish: function(element) { @@ -444,10 +446,16 @@ var GempLotrUI = Class.extend({ } else if (zone == "FREE_CHARACTERS") { this.charactersPlayer.layoutCards(); this.charactersOpponent.layoutCards(); + } else if (zone == "FREE_SUPPORT") { + this.supportPlayer.layoutCards(); + this.supportOpponent.layoutCards(); } else if (zone == "HAND") { this.hand.layoutCards(); } else if (zone == "SHADOW_CHARACTERS") { this.shadow.layoutCards(); + } else if (zone == "SHADOW_SUPPORT") { + this.shadowPlayer.layoutCards(); + this.shadowOpponent.layoutCards(); } },