From 9282ec9a4e1ec04a66d2e9e217908099acfafafd Mon Sep 17 00:00:00 2001 From: "marcins78@gmail.com" Date: Tue, 6 Sep 2011 15:35:07 +0000 Subject: [PATCH] Reveal and choose card from opponent's hand. --- ...lAndChooseCardsFromOpponentHandEffect.java | 45 +++++++ .../lotro/cards/set1/elven/Card1_044.java | 12 +- .../lotro/cards/set1/site/Card1_351.java | 7 +- .../com/gempukku/lotro/filters/Filters.java | 9 ++ .../ArbitraryCardsSelectionDecision.java | 17 ++- .../src/main/webapp/js/gameUi.js | 120 +++++++++--------- 6 files changed, 141 insertions(+), 69 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/RevealAndChooseCardsFromOpponentHandEffect.java diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/RevealAndChooseCardsFromOpponentHandEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/RevealAndChooseCardsFromOpponentHandEffect.java new file mode 100644 index 000000000..28534138a --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/RevealAndChooseCardsFromOpponentHandEffect.java @@ -0,0 +1,45 @@ +package com.gempukku.lotro.cards.effects; + +import com.gempukku.lotro.filters.Filter; +import com.gempukku.lotro.filters.Filters; +import com.gempukku.lotro.game.PhysicalCard; +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.timing.UnrespondableEffect; + +import java.util.LinkedList; +import java.util.List; + +public abstract class RevealAndChooseCardsFromOpponentHandEffect extends UnrespondableEffect { + private String _playerId; + private String _opponentId; + private Filter _selectionFilter; + private int _minChosen; + private int _maxChosen; + + protected RevealAndChooseCardsFromOpponentHandEffect(String playerId, String opponentId, Filter selectionFilter, int minChosen, int maxChosen) { + _playerId = playerId; + _opponentId = opponentId; + _selectionFilter = selectionFilter; + _minChosen = minChosen; + _maxChosen = maxChosen; + } + + @Override + public void playEffect(LotroGame game) { + List opponentHand = new LinkedList(game.getGameState().getHand(_opponentId)); + List selectable = Filters.filter(opponentHand, game.getGameState(), game.getModifiersQuerying(), _selectionFilter); + + game.getUserFeedback().sendAwaitingDecision(_playerId, + new ArbitraryCardsSelectionDecision(1, "Opponent's hand", opponentHand, selectable, Math.min(_minChosen, selectable.size()), Math.min(_maxChosen, selectable.size())) { + @Override + public void decisionMade(String result) throws DecisionResultInvalidException { + List selectedCards = getSelectedCardsByResponse(result); + cardsSelected(selectedCards); + } + }); + } + + protected abstract void cardsSelected(List selectedCards); +} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/elven/Card1_044.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/elven/Card1_044.java index f48f84033..b23f8e44b 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/elven/Card1_044.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/elven/Card1_044.java @@ -3,8 +3,8 @@ package com.gempukku.lotro.cards.set1.elven; import com.gempukku.lotro.cards.AbstractEvent; import com.gempukku.lotro.cards.actions.PlayEventAction; import com.gempukku.lotro.cards.effects.ChooseAndExertCharacterEffect; -import com.gempukku.lotro.cards.effects.ChooseArbitraryCardsEffect; import com.gempukku.lotro.cards.effects.ChooseOpponentEffect; +import com.gempukku.lotro.cards.effects.RevealAndChooseCardsFromOpponentHandEffect; import com.gempukku.lotro.common.*; import com.gempukku.lotro.filters.Filters; import com.gempukku.lotro.game.PhysicalCard; @@ -47,13 +47,11 @@ public class Card1_044 extends AbstractEvent { new ChooseOpponentEffect(playerId) { @Override protected void opponentChosen(String opponentId) { - List hand = game.getGameState().getHand(opponentId); - List isengardMinions = Filters.filter(hand, game.getGameState(), game.getModifiersQuerying(), Filters.culture(Culture.ISENGARD), Filters.type(CardType.MINION)); - action.addCost( - new ChooseArbitraryCardsEffect(playerId, "Choose ISENGARD minion to discard", isengardMinions, 1, 1) { + action.addEffect( + new RevealAndChooseCardsFromOpponentHandEffect(playerId, opponentId, Filters.and(Filters.culture(Culture.ISENGARD), Filters.type(CardType.MINION)), 1, 1) { @Override - protected void cardsSelected(List card) { - action.addEffect(new DiscardCardFromHandEffect(card.get(0))); + protected void cardsSelected(List selectedCards) { + action.addEffect(new DiscardCardFromHandEffect(selectedCards.get(0))); action.addEffect(new DrawCardEffect(playerId)); action.addEffect(new DrawCardEffect(playerId)); } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/site/Card1_351.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/site/Card1_351.java index e2f4d6da9..cf0f369f7 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/site/Card1_351.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/site/Card1_351.java @@ -3,8 +3,8 @@ package com.gempukku.lotro.cards.set1.site; import com.gempukku.lotro.cards.AbstractSite; import com.gempukku.lotro.cards.PlayConditions; import com.gempukku.lotro.cards.effects.ChooseAndExertCharacterEffect; -import com.gempukku.lotro.cards.effects.ChooseArbitraryCardsEffect; import com.gempukku.lotro.cards.effects.ChooseOpponentEffect; +import com.gempukku.lotro.cards.effects.RevealAndChooseCardsFromOpponentHandEffect; import com.gempukku.lotro.common.Keyword; import com.gempukku.lotro.common.Phase; import com.gempukku.lotro.filters.Filters; @@ -14,7 +14,6 @@ import com.gempukku.lotro.logic.actions.DefaultCostToEffectAction; import com.gempukku.lotro.logic.timing.Action; import java.util.Collections; -import java.util.LinkedList; import java.util.List; /** @@ -43,10 +42,10 @@ public class Card1_351 extends AbstractSite { @Override protected void opponentChosen(String opponentId) { action.addEffect( - new ChooseArbitraryCardsEffect(playerId, "Opponent's hand", new LinkedList(game.getGameState().getHand(opponentId)), 0, 0) { + new RevealAndChooseCardsFromOpponentHandEffect(playerId, opponentId, Filters.none(), 0, 0) { @Override protected void cardsSelected(List selectedCards) { - // TODO - Reveal hand + // Do nothing, it's just to reveal } }); } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java index 3ba0a9f8c..573f1d6a2 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java @@ -79,6 +79,15 @@ public class Filters { }; } + public static Filter none() { + return new Filter() { + @Override + public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { + return false; + } + }; + } + public static Filter signet(final Signet signet) { return new Filter() { @Override diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/decisions/ArbitraryCardsSelectionDecision.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/decisions/ArbitraryCardsSelectionDecision.java index 39c0a1177..95adb9d61 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/decisions/ArbitraryCardsSelectionDecision.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/decisions/ArbitraryCardsSelectionDecision.java @@ -7,6 +7,7 @@ import java.util.List; public abstract class ArbitraryCardsSelectionDecision extends AbstractAwaitingDecision { private List _physicalCards; + private List _selectable; private int _minimum; private int _maximum; @@ -15,14 +16,27 @@ public abstract class ArbitraryCardsSelectionDecision extends AbstractAwaitingDe } public ArbitraryCardsSelectionDecision(int id, String text, List physicalCards, int minimum, int maximum) { + this(id, text, physicalCards, physicalCards, minimum, maximum); + } + + public ArbitraryCardsSelectionDecision(int id, String text, List physicalCards, List selectable, int minimum, int maximum) { super(id, text, AwaitingDecisionType.ARBITRARY_CARDS); _physicalCards = physicalCards; + _selectable = selectable; _minimum = minimum; _maximum = maximum; setParam("min", String.valueOf(minimum)); setParam("max", String.valueOf(maximum)); setParam("cardId", getCardIds(physicalCards)); setParam("blueprintId", getBlueprintIds(physicalCards)); + setParam("selectable", getSelectable(physicalCards, selectable)); + } + + private String[] getSelectable(List physicalCards, List selectable) { + String[] result = new String[physicalCards.size()]; + for (int i = 0; i < physicalCards.size(); i++) + result[i] = String.valueOf(selectable.contains(physicalCards.get(i))); + return result; } private String[] getCardIds(List physicalCards) { @@ -53,7 +67,7 @@ public abstract class ArbitraryCardsSelectionDecision extends AbstractAwaitingDe try { for (String cardId : cardIds) { PhysicalCard card = _physicalCards.get(Integer.parseInt(cardId.substring(4))); - if (result.contains(card)) + if (result.contains(card) || !_selectable.contains(card)) throw new DecisionResultInvalidException(); result.add(card); } @@ -66,3 +80,4 @@ public abstract class ArbitraryCardsSelectionDecision extends AbstractAwaitingDe return result; } } + 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 33c9e1378..29eaa110d 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 @@ -128,7 +128,7 @@ var GempLotrGameUI = Class.extend({ if (event.which == 1) { if (event.shiftKey) { that.displayCardInfo(selectedCardElem.data("card")); - } else if (selectedCardElem.hasClass("selectableCard")) + } else if (selectedCardElem.hasClass("selectableCard")) that.selectionFunction(selectedCardElem.data("card").cardId); } } @@ -153,52 +153,52 @@ var GempLotrGameUI = Class.extend({ initializeDialogs: function() { this.dialogInstance = $("
") .dialog({ - autoOpen: false, - closeOnEscape: false, - resizable: false, - minHeight: 80 - }); + autoOpen: false, + closeOnEscape: false, + resizable: false, + minHeight: 80 + }); this.assignmentDialog = $("
") .dialog({ - autoOpen: false, - closeOnEscape: false, - title: "Assignments", - resizable: true, - minHeight: 240, - minWidth: 400, - width: 500, - height: 200, - position: ["right", "bottom"] - }); + autoOpen: false, + closeOnEscape: false, + title: "Assignments", + resizable: true, + minHeight: 240, + minWidth: 400, + width: 500, + height: 200, + position: ["right", "bottom"] + }); this.skirmishDialog = $("
") .dialog({ - autoOpen: false, - closeOnEscape: false, - title: "Skirmish", - resizable: true, - minHeight: 240, - minWidth: 400, - width: 500, - height: 200, - position: ["right", "top"] - }); + autoOpen: false, + closeOnEscape: false, + title: "Skirmish", + resizable: true, + minHeight: 240, + minWidth: 400, + width: 500, + height: 200, + position: ["right", "top"] + }); $(".ui-dialog-titlebar-close").hide(); this.infoDialog = $("
") .dialog({ - autoOpen: false, - closeOnEscape: true, - resizable: false, - title: "Card information", - minHeight: 80, - minWidth: 200, - width: 600, - height: 300, - maxHeight: 300 - }); + autoOpen: false, + closeOnEscape: true, + resizable: false, + title: "Card information", + minHeight: 80, + minWidth: 200, + width: 600, + height: 300, + maxHeight: 300 + }); }, @@ -538,13 +538,13 @@ var GempLotrGameUI = Class.extend({ this.dialogInstance .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()); + } + } + ) .dialog("option", "width", "400") .dialog("option", "height", "auto"); ; @@ -578,13 +578,13 @@ var GempLotrGameUI = Class.extend({ this.dialogInstance .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()); + } + } + ) .dialog("option", "width", "400") .dialog("option", "height", "auto"); @@ -625,11 +625,14 @@ var GempLotrGameUI = Class.extend({ var max = this.getDecisionParameter(decision, "max"); var cardIds = this.getDecisionParameters(decision, "cardId"); var blueprintIds = this.getDecisionParameters(decision, "blueprintId"); + var selectable = this.getDecisionParameters(decision, "selectable"); var that = this; var selectedCardIds = new Array(); + var selectableCardIds = new Array(); + this.dialogInstance .html("
") .dialog("option", "title", text) @@ -652,6 +655,9 @@ var GempLotrGameUI = Class.extend({ var cardId = cardIds[i]; var blueprintId = blueprintIds[i]; + if (selectable[i] == "true") + selectableCardIds.push(cardId); + var card = new Card(blueprintId, "SPECIAL", cardId, this.selfParticipantId); var cardDiv = this.createCardDiv(card); @@ -681,7 +687,7 @@ var GempLotrGameUI = Class.extend({ } }; - this.attachSelectionFunctions(cardIds); + this.attachSelectionFunctions(selectableCardIds); this.specialGroup.setBounds(10, 10, 547, 188); @@ -911,13 +917,13 @@ var GempLotrGameUI = Class.extend({ if (this.shadowAssignGroups[characterId] == null) { this.shadowAssignGroups[characterId] = new NormalCardGroup(null, this.assignmentDialog, function (card) { - return (card.zone == "SHADOW_CHARACTERS" && card.assign == characterId); - } - ); + return (card.zone == "SHADOW_CHARACTERS" && card.assign == characterId); + } + ); this.freePeopleAssignGroups[characterId] = new NormalCardGroup(null, this.assignmentDialog, function (card) { - return (card.cardId == characterId); - } - ); + return (card.cardId == characterId); + } + ); this.moveCardToElement(characterId, this.assignmentDialog); this.assignDialogResized();