diff --git a/src/main/java/forge/FThreads.java b/src/main/java/forge/FThreads.java index c9e4b828778..0576a25ece8 100644 --- a/src/main/java/forge/FThreads.java +++ b/src/main/java/forge/FThreads.java @@ -8,6 +8,7 @@ import java.util.concurrent.TimeUnit; import javax.swing.SwingUtilities; +import forge.control.input.InputQueue; import forge.control.input.InputSynchronized; /** @@ -104,14 +105,15 @@ public class FThreads { public static void invokeInNewThread(final Runnable proc, boolean lockUI) { Runnable toRun = proc; + final InputQueue iq = Singletons.getControl().getMatch().getInput(); if( lockUI ) { // checkEDT("FThreads.invokeInNewthread", true) - Singletons.getControl().getMatch().getInput().lock(); + iq.lock(); toRun = new Runnable() { @Override public void run() { proc.run(); - Singletons.getControl().getMatch().getInput().unlock(); + iq.unlock(); } }; } diff --git a/src/main/java/forge/card/ability/effects/DiscardEffect.java b/src/main/java/forge/card/ability/effects/DiscardEffect.java index b9453d61a93..ad52d517172 100644 --- a/src/main/java/forge/card/ability/effects/DiscardEffect.java +++ b/src/main/java/forge/card/ability/effects/DiscardEffect.java @@ -157,8 +157,12 @@ public class DiscardEffect extends RevealEffectBase { } } } else if (mode.equals("TgtChoose") && sa.hasParam("UnlessType")) { - if( numCardsInHand > 0 ) - p.discardUnless(Math.min(numCards, numCardsInHand), sa.getParam("UnlessType"), sa); + if( numCardsInHand > 0 ) { + final List hand = p.getCardsIn(ZoneType.Hand); + List toDiscard = p.getController().chooseCardsToDiscardUnlessType(Math.min(numCards, numCardsInHand), hand, sa.getParam("UnlessType"), sa); + for(Card c : toDiscard) + c.getController().discard(c, sa); + } } else if (mode.equals("RevealDiscardAll")) { // Reveal final List dPHand = p.getCardsIn(ZoneType.Hand); diff --git a/src/main/java/forge/card/ability/effects/RestartGameEffect.java b/src/main/java/forge/card/ability/effects/RestartGameEffect.java index 37f26c8a583..dde246b9c7a 100644 --- a/src/main/java/forge/card/ability/effects/RestartGameEffect.java +++ b/src/main/java/forge/card/ability/effects/RestartGameEffect.java @@ -9,7 +9,6 @@ import java.util.Map; import forge.Card; import forge.CardLists; import forge.CardPredicates; -import forge.Singletons; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; import forge.game.GameNew; diff --git a/src/main/java/forge/control/input/InputBase.java b/src/main/java/forge/control/input/InputBase.java index f48debe7ec3..7e9b81d66f2 100644 --- a/src/main/java/forge/control/input/InputBase.java +++ b/src/main/java/forge/control/input/InputBase.java @@ -64,10 +64,6 @@ public abstract class InputBase implements java.io.Serializable, Input { afterStop(); // sync inputs will release their latch there } - protected final boolean isActive() { - return Singletons.getControl().getMatch().getInput().getInput() == this; - } - protected void afterStop() { } diff --git a/src/main/java/forge/game/player/AIPlayer.java b/src/main/java/forge/game/player/AIPlayer.java index a3afd97bc68..9986532d50c 100644 --- a/src/main/java/forge/game/player/AIPlayer.java +++ b/src/main/java/forge/game/player/AIPlayer.java @@ -17,16 +17,8 @@ */ package forge.game.player; -import java.util.List; - -import forge.Card; -import forge.CardLists; -import forge.CardPredicates; -import forge.card.spellability.SpellAbility; import forge.game.GameState; import forge.game.ai.AiController; -import forge.game.zone.ZoneType; -import forge.util.Aggregates; /** *

@@ -62,31 +54,6 @@ public class AIPlayer extends Player { - // ////////////////////////////// - // / - // / replaces Singletons.getModel().getGameAction().discard* methods - // / - // ////////////////////////////// - - - /** {@inheritDoc} */ - @Override - public final void discardUnless(final int num, final String uType, final SpellAbility sa) { - final List hand = this.getCardsIn(ZoneType.Hand); - final List tHand = CardLists.getType(hand, uType); - - if (tHand.size() > 0) { - Card toDiscard = Aggregates.itemWithMin(tHand, CardPredicates.Accessors.fnGetCmc); - discard(toDiscard, sa); // this got changed to doDiscard basically - return; - } - - final List toDiscard = getAi().getCardsToDiscard(num, (String[])null, sa); - for (int i = 0; i < toDiscard.size(); i++) { - discard(toDiscard.get(i), sa); - } - } - // ///////////////////////// /* (non-Javadoc) diff --git a/src/main/java/forge/game/player/HumanPlayer.java b/src/main/java/forge/game/player/HumanPlayer.java index ae8f7d24ab7..509280dcb46 100644 --- a/src/main/java/forge/game/player/HumanPlayer.java +++ b/src/main/java/forge/game/player/HumanPlayer.java @@ -35,11 +35,8 @@ import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; import forge.control.input.InputPayManaBase; import forge.control.input.InputPayManaSimple; -import forge.control.input.InputSelectCards; -import forge.control.input.InputSelectCardsFromList; import forge.game.GameActionUtil; import forge.game.GameState; -import forge.game.zone.ZoneType; public class HumanPlayer extends Player { private final PlayerControllerHuman controller; @@ -51,28 +48,6 @@ public class HumanPlayer extends Player { controller = new PlayerControllerHuman(game, this); } - /** {@inheritDoc} */ - @Override - public final void discardUnless(final int num, final String uType, final SpellAbility sa) { - final List hand = getCardsIn(ZoneType.Hand); - final InputSelectCards target = new InputSelectCardsFromList(num, num, hand) { - private static final long serialVersionUID = -5774108410928795591L; - - @Override - protected boolean hasAllTargets() { - for(Card c : selected) { - if (c.isType(uType)) - return true; - } - return super.hasAllTargets(); - } - }; - target.setMessage("Select %d cards to discard, unless you discard a " + uType + "."); - FThreads.setInputAndWait(target); - for(Card c : target.getSelected()) - c.getController().discard(c, sa); - } // input_discardNumUnless - /** * TODO: Write javadoc for this method. * @param card diff --git a/src/main/java/forge/game/player/Player.java b/src/main/java/forge/game/player/Player.java index d092679e7c5..0a2300d33b0 100644 --- a/src/main/java/forge/game/player/Player.java +++ b/src/main/java/forge/game/player/Player.java @@ -1672,19 +1672,6 @@ public abstract class Player extends GameEntity implements Comparable { public final void resetNumDiscardedThisTurn() { this.numDiscardedThisTurn = 0; } - /** - *

- * discardUnless. - *

- * - * @param num - * a int. - * @param uType - * a {@link java.lang.String} object. - * @param sa - * a {@link forge.card.spellability.SpellAbility} object. - */ - public abstract void discardUnless(int num, String uType, SpellAbility sa); /** *

diff --git a/src/main/java/forge/game/player/PlayerController.java b/src/main/java/forge/game/player/PlayerController.java index 5991667b6aa..e76b9ac1379 100644 --- a/src/main/java/forge/game/player/PlayerController.java +++ b/src/main/java/forge/game/player/PlayerController.java @@ -125,4 +125,5 @@ public abstract class PlayerController { public abstract void playMiracle(SpellAbility miracle, Card card); public abstract void playMadness(SpellAbility madness); public abstract List chooseCardsToDelve(int colorLessAmount, List grave); + public abstract List chooseCardsToDiscardUnlessType(int min, List hand, String param, SpellAbility sa); } diff --git a/src/main/java/forge/game/player/PlayerControllerAi.java b/src/main/java/forge/game/player/PlayerControllerAi.java index 0553265f3bb..590e43f42fc 100644 --- a/src/main/java/forge/game/player/PlayerControllerAi.java +++ b/src/main/java/forge/game/player/PlayerControllerAi.java @@ -8,7 +8,11 @@ import java.util.Map; import org.apache.commons.lang3.tuple.ImmutablePair; +import com.google.common.collect.Lists; + import forge.Card; +import forge.CardLists; +import forge.CardPredicates; import forge.GameEntity; import forge.card.spellability.Spell; import forge.card.spellability.SpellAbility; @@ -26,6 +30,7 @@ import forge.game.ai.ComputerUtilBlock; import forge.game.ai.ComputerUtilCombat; import forge.game.zone.ZoneType; import forge.gui.GuiChoose; +import forge.util.Aggregates; /** @@ -299,4 +304,18 @@ public class PlayerControllerAi extends PlayerController { public void setShouldAlwaysAskTrigger(Integer trigger) { } + /* (non-Javadoc) + * @see forge.game.player.PlayerController#chooseCardsToDiscardUnlessType(int, java.util.List, java.lang.String, forge.card.spellability.SpellAbility) + */ + @Override + public List chooseCardsToDiscardUnlessType(int num, List hand, String uType, SpellAbility sa) { + final List cardsOfType = CardLists.getType(hand, uType); + if (!cardsOfType.isEmpty()) { + Card toDiscard = Aggregates.itemWithMin(cardsOfType, CardPredicates.Accessors.fnGetCmc); + return Lists.newArrayList(toDiscard); + } + return getAi().getCardsToDiscard(num, (String[])null, sa); + } + + } diff --git a/src/main/java/forge/game/player/PlayerControllerHuman.java b/src/main/java/forge/game/player/PlayerControllerHuman.java index 439e7acc31c..5dc85e72009 100644 --- a/src/main/java/forge/game/player/PlayerControllerHuman.java +++ b/src/main/java/forge/game/player/PlayerControllerHuman.java @@ -475,4 +475,26 @@ public class PlayerControllerHuman extends PlayerController { triggersAlwaysDecline.remove((Object)trigger); } + /* (non-Javadoc) + * @see forge.game.player.PlayerController#chooseCardsToDiscardUnlessType(int, java.lang.String, forge.card.spellability.SpellAbility) + */ + @Override + public List chooseCardsToDiscardUnlessType(int num, List hand, final String uType, SpellAbility sa) { + final InputSelectCards target = new InputSelectCardsFromList(num, num, hand) { + private static final long serialVersionUID = -5774108410928795591L; + + @Override + protected boolean hasAllTargets() { + for(Card c : selected) { + if (c.isType(uType)) + return true; + } + return super.hasAllTargets(); + } + }; + target.setMessage("Select %d cards to discard, unless you discard a " + uType + "."); + FThreads.setInputAndWait(target); + return target.getSelected(); + } + }