From 93c438c24baa29166b3fa2686bb4daef2c121f0f Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Fri, 29 Mar 2013 04:39:41 +0000 Subject: [PATCH] reveal cost payment will really reveal cards to players. --- .../forge/card/cost/CostPartWithList.java | 10 +- src/main/java/forge/card/cost/CostReveal.java | 109 ++++-------------- src/main/java/forge/game/GameAction.java | 13 +++ .../forge/game/player/PlayerController.java | 3 +- .../forge/game/player/PlayerControllerAi.java | 3 +- .../game/player/PlayerControllerHuman.java | 3 +- 6 files changed, 48 insertions(+), 93 deletions(-) diff --git a/src/main/java/forge/card/cost/CostPartWithList.java b/src/main/java/forge/card/cost/CostPartWithList.java index 7c09df82bf5..866590345cc 100644 --- a/src/main/java/forge/card/cost/CostPartWithList.java +++ b/src/main/java/forge/card/cost/CostPartWithList.java @@ -91,19 +91,27 @@ public abstract class CostPartWithList extends CostPart { } public final boolean executePayment(SpellAbility ability, Card targetCard) { - addToList(targetCard); + this.list.add(targetCard); doPayment(ability, targetCard); return true; } // always returns true, made this to inline with return public final boolean executePayment(SpellAbility ability, Collection targetCards) { + if(canPayListAtOnce()) { // This is used by reveal. Without it when opponent would reveal hand, you'll get N message boxes. + this.list.addAll(targetCards); + doListPayment(ability, targetCards); + return true; + } for(Card c: targetCards) executePayment(ability, c); return true; } protected abstract void doPayment(SpellAbility ability, Card targetCard); + // Overload these two only together, set to true and perform payment on list + protected boolean canPayListAtOnce() { return false; } + protected void doListPayment(SpellAbility ability, Collection targetCards) { }; /** * TODO: Write javadoc for this method. diff --git a/src/main/java/forge/card/cost/CostReveal.java b/src/main/java/forge/card/cost/CostReveal.java index 34454f54042..870a6516ea3 100644 --- a/src/main/java/forge/card/cost/CostReveal.java +++ b/src/main/java/forge/card/cost/CostReveal.java @@ -18,20 +18,22 @@ package forge.card.cost; import java.util.ArrayList; +import java.util.Collection; import java.util.List; + +import com.google.common.collect.Lists; + import forge.Card; import forge.CardLists; import forge.FThreads; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.spellability.SpellAbility; -import forge.control.input.InputPayment; +import forge.control.input.InputSelectCards; +import forge.control.input.InputSelectCardsFromList; import forge.game.GameState; import forge.game.player.AIPlayer; import forge.game.player.Player; -import forge.game.zone.Zone; import forge.game.zone.ZoneType; -import forge.view.ButtonUtil; /** * The Class CostReveal. @@ -39,87 +41,6 @@ import forge.view.ButtonUtil; public class CostReveal extends CostPartWithList { // Reveal - /** - * TODO: Write javadoc for this type. - * - */ - public static final class InputPayReveal extends InputPayCostBase { - private final CostReveal part; - private final String discType; - private final List handList; - private final SpellAbility sa; - private final int nNeeded; - private static final long serialVersionUID = -329993322080934435L; - private int nReveal = 0; - - - /** - * TODO: Write javadoc for Constructor. - * @param part - * @param discType - * @param handList - * @param sa - * @param payment - * @param nNeeded - */ - public InputPayReveal(CostReveal part, String discType, List handList, SpellAbility sa, int nNeeded) { - this.part = part; - this.discType = discType; - this.handList = handList; - this.sa = sa; - this.nNeeded = nNeeded; - } - - @Override - public void showMessage() { - if (nNeeded == 0) { - this.done(); - } - - /*if (handList.size() + this.nReveal < nNeeded) { - this.stop(); - }*/ - final StringBuilder type = new StringBuilder(""); - if (!discType.equals("Card")) { - type.append(" ").append(discType); - } - final StringBuilder sb = new StringBuilder(); - sb.append("Select a "); - sb.append(part.getDescriptiveType()); - sb.append(" to reveal."); - if (nNeeded > 1) { - sb.append(" You have "); - sb.append(nNeeded - this.nReveal); - sb.append(" remaining."); - } - showMessage(sb.toString()); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectCard(final Card card) { - Zone zone = Singletons.getModel().getGame().getZoneOf(card); - if (zone.is(ZoneType.Hand) && handList.contains(card)) { - // send in List for Typing - handList.remove(card); - part.executePayment(sa, card); - this.nReveal++; - - // in case no more cards in hand - if (this.nReveal == nNeeded) { - this.done(); - } else if (sa.getActivatingPlayer().getZone(ZoneType.Hand).size() == 0) { - // really - // shouldn't - // happen - this.cancel(); - } else { - this.showMessage(); - } - } - } - } - /** * Instantiates a new cost reveal. * @@ -239,10 +160,13 @@ public class CostReveal extends CostPartWithList { } } if ( num == 0 ) return true; - - InputPayment inp = new InputPayReveal(this, this.getType(), handList, ability, num); + InputSelectCards inp = new InputSelectCardsFromList(num, num, handList); + inp.setMessage("Select %d more " + getDescriptiveType() + " card(s) to reveal."); FThreads.setInputAndWait(inp); - return inp.isPaid(); + if ( inp.hasCancelled() ) + return false; + + return executePayment(ability, inp.getSelected()); } } @@ -284,9 +208,16 @@ public class CostReveal extends CostPartWithList { */ @Override protected void doPayment(SpellAbility ability, Card targetCard) { - // write code to actually reveal card + ability.getActivatingPlayer().getGame().getAction().reveal(Lists.newArrayList(targetCard), ability.getActivatingPlayer()); } + + @Override protected boolean canPayListAtOnce() { return true; } + @Override + protected void doListPayment(SpellAbility ability, Collection targetCards) { + ability.getActivatingPlayer().getGame().getAction().reveal(targetCards, ability.getActivatingPlayer()); + } + /* (non-Javadoc) * @see forge.card.cost.CostPartWithList#getHashForList() */ diff --git a/src/main/java/forge/game/GameAction.java b/src/main/java/forge/game/GameAction.java index 33e88682d77..91510ac8824 100644 --- a/src/main/java/forge/game/GameAction.java +++ b/src/main/java/forge/game/GameAction.java @@ -18,6 +18,7 @@ package forge.game; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; @@ -1394,6 +1395,18 @@ public class GameAction { return true; } // sacrificeDestroy() + /** + * TODO: Write javadoc for this method. + * @param targetCard + * @param activatingPlayer + */ + public void reveal(Collection cards, Player cardOwner) { + for(Player p : game.getPlayers()) { + if ( cardOwner == p) continue; + p.getController().reveal(cardOwner + " reveals card", cards, ZoneType.Hand, cardOwner); + } + } + /** *

* playCardWithoutManaCost. diff --git a/src/main/java/forge/game/player/PlayerController.java b/src/main/java/forge/game/player/PlayerController.java index 2986d93896a..728d000af4a 100644 --- a/src/main/java/forge/game/player/PlayerController.java +++ b/src/main/java/forge/game/player/PlayerController.java @@ -1,5 +1,6 @@ package forge.game.player; +import java.util.Collection; import java.util.List; import java.util.Map; @@ -105,7 +106,7 @@ public abstract class PlayerController { public abstract List orderAttackers(Card blocker, List attackers); /** Shows the card to this player*/ - public abstract void reveal(String string, List cards, ZoneType zone, Player owner); + public abstract void reveal(String string, Collection cards, ZoneType zone, Player owner); public abstract ImmutablePair, List> arrangeForScry(List topN); public abstract boolean willPutCardOnTop(Card c); diff --git a/src/main/java/forge/game/player/PlayerControllerAi.java b/src/main/java/forge/game/player/PlayerControllerAi.java index 27907610bb7..242ffed7898 100644 --- a/src/main/java/forge/game/player/PlayerControllerAi.java +++ b/src/main/java/forge/game/player/PlayerControllerAi.java @@ -1,6 +1,7 @@ package forge.game.player; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; @@ -184,7 +185,7 @@ public class PlayerControllerAi extends PlayerController { * @see forge.game.player.PlayerController#reveal(java.lang.String, java.util.List) */ @Override - public void reveal(String string, List cards, ZoneType zone, Player owner) { + public void reveal(String string, Collection cards, ZoneType zone, Player owner) { // We don't know how to reveal cards to AI } diff --git a/src/main/java/forge/game/player/PlayerControllerHuman.java b/src/main/java/forge/game/player/PlayerControllerHuman.java index d3e31f50810..5d657c79e74 100644 --- a/src/main/java/forge/game/player/PlayerControllerHuman.java +++ b/src/main/java/forge/game/player/PlayerControllerHuman.java @@ -1,6 +1,7 @@ package forge.game.player; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -278,7 +279,7 @@ public class PlayerControllerHuman extends PlayerController { * @see forge.game.player.PlayerController#reveal(java.lang.String, java.util.List, forge.game.zone.ZoneType, forge.game.player.Player) */ @Override - public void reveal(String string, List cards, ZoneType zone, Player owner) { + public void reveal(String string, Collection cards, ZoneType zone, Player owner) { String message = string; if ( StringUtils.isBlank(message) ) message = String.format("Looking at %s's %s", owner, zone);