From cbbf22f34ab09e124793d1362912ccfe26ce98ac Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Wed, 13 Mar 2013 08:31:49 +0000 Subject: [PATCH] added reveal method to PlayerController (should probably add one to game? to reveal to all players) AI mulligan decision code moved to ComputerUtil --- .../forge/card/ability/effects/DigEffect.java | 6 ++-- .../forge/control/input/InputMulligan.java | 28 +++++-------------- src/main/java/forge/game/ai/ComputerUtil.java | 11 ++++++++ .../forge/game/player/PlayerController.java | 4 +++ .../forge/game/player/PlayerControllerAi.java | 9 ++++++ .../game/player/PlayerControllerHuman.java | 14 ++++++++++ 6 files changed, 48 insertions(+), 24 deletions(-) diff --git a/src/main/java/forge/card/ability/effects/DigEffect.java b/src/main/java/forge/card/ability/effects/DigEffect.java index 6d143710bab..e681d344949 100644 --- a/src/main/java/forge/card/ability/effects/DigEffect.java +++ b/src/main/java/forge/card/ability/effects/DigEffect.java @@ -143,9 +143,9 @@ public class DigEffect extends SpellAbilityEffect { } // Singletons.getModel().getGameAction().revealToCopmuter(top.toArray()); // - for when it exists - } else if (choser.isHuman() && !sa.hasParam("NoLooking")) { + } else if (!sa.hasParam("NoLooking")) { // show the user the revealed cards - GuiChoose.one("Looking at cards from library", top); + choser.getController().reveal("Looking at cards from library", top, library.getZoneType(), library.getPlayer()); } if ((sa.hasParam("RememberRevealed")) && !sa.hasParam("RevealValid")) { @@ -251,7 +251,7 @@ public class DigEffect extends SpellAbilityEffect { } for (j = 0; j < changeNum; j++) { Card chosen = ComputerUtilCard.getBestAI(valid); - if (sa.getActivatingPlayer().isHuman() && p.isHuman()) { + if (sa.getActivatingPlayer().isOpponentOf(choser) && p.isOpponentOf(choser)) { chosen = ComputerUtilCard.getWorstAI(valid); } if (chosen == null) { diff --git a/src/main/java/forge/control/input/InputMulligan.java b/src/main/java/forge/control/input/InputMulligan.java index 6524268240d..c1d10ecb0aa 100644 --- a/src/main/java/forge/control/input/InputMulligan.java +++ b/src/main/java/forge/control/input/InputMulligan.java @@ -23,7 +23,6 @@ import java.util.List; import com.google.common.collect.Iterables; import forge.Card; -import forge.CardLists; import forge.CardPredicates; import forge.Singletons; import forge.card.ability.AbilityFactory; @@ -54,8 +53,6 @@ public class InputMulligan extends Input { /** Constant serialVersionUID=-8112954303001155622L. */ private static final long serialVersionUID = -8112954303001155622L; - private static final int AI_MULLIGAN_THRESHOLD = 5; - /** {@inheritDoc} */ @Override public final void showMessage() { @@ -100,24 +97,13 @@ public class InputMulligan extends Input { GameState game = Singletons.getModel().getGame(); // Computer mulligan - for (Player ai : game.getPlayers()) { - if (ai.isHuman()) { + for (Player p : game.getPlayers()) { + if (!(p instanceof AIPlayer)) { continue; } - - boolean aiTakesMulligan = true; - - // Computer mulligans if there are no cards with converted mana cost of - // 0 in its hand - while (aiTakesMulligan) { - - final List handList = ai.getCardsIn(ZoneType.Hand); - final boolean hasLittleCmc0Cards = CardLists.getValidCards(handList, "Card.cmcEQ0", ai, null).size() < 2; - aiTakesMulligan = (handList.size() > InputMulligan.AI_MULLIGAN_THRESHOLD) && hasLittleCmc0Cards; - - if (aiTakesMulligan) { - ai.doMulligan(); - } + AIPlayer ai = (AIPlayer) p; + while (ComputerUtil.wantMulligan(ai)) { + ai.doMulligan(); } } @@ -135,7 +121,7 @@ public class InputMulligan extends Input { final String effName = kw.split(":")[1]; final SpellAbility effect = AbilityFactory.getAbility(c.getSVar(effName), c); - if (GuiDialog.confirm(c, "Use this card's ability?")) { + if (GuiDialog.confirm(c, "Use " + c +"'s ability?")) { // If we ever let the AI memorize cards in the players // hand, this would be a place to do so. game.getActionPlay().playSpellAbilityNoStack(p, effect, false); @@ -143,7 +129,7 @@ public class InputMulligan extends Input { } } if (c.getName().startsWith("Leyline of")) { - if (GuiDialog.confirm(c, "Use this card's ability?")) { + if (GuiDialog.confirm(c, "Use " + c + "'s ability?")) { ga.moveToPlay(c); } } diff --git a/src/main/java/forge/game/ai/ComputerUtil.java b/src/main/java/forge/game/ai/ComputerUtil.java index 4820a5e2c87..5d3cf8d97f9 100644 --- a/src/main/java/forge/game/ai/ComputerUtil.java +++ b/src/main/java/forge/game/ai/ComputerUtil.java @@ -1212,4 +1212,15 @@ public class ComputerUtil { threatened.addAll(ComputerUtil.predictThreatenedObjects(aiPlayer, saviour, topStack.getSubAbility())); return threatened; } + + // Computer mulligans if there are no cards with converted mana cost of + // 0 in its hand + public static boolean wantMulligan(AIPlayer ai) { + final int AI_MULLIGAN_THRESHOLD = 5; + + final List handList = ai.getCardsIn(ZoneType.Hand); + final boolean hasLittleCmc0Cards = CardLists.getValidCards(handList, "Card.cmcEQ0", ai, null).size() < 2; + return (handList.size() > AI_MULLIGAN_THRESHOLD) && hasLittleCmc0Cards; + + } } diff --git a/src/main/java/forge/game/player/PlayerController.java b/src/main/java/forge/game/player/PlayerController.java index 91092f71e57..bc3fc07cb41 100644 --- a/src/main/java/forge/game/player/PlayerController.java +++ b/src/main/java/forge/game/player/PlayerController.java @@ -12,6 +12,7 @@ import forge.game.GameState; import forge.game.GameType; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; +import forge.game.zone.ZoneType; /** @@ -100,4 +101,7 @@ public abstract class PlayerController { public abstract List orderBlockers(Card attacker, List blockers); 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); } diff --git a/src/main/java/forge/game/player/PlayerControllerAi.java b/src/main/java/forge/game/player/PlayerControllerAi.java index de9e1477167..696043136cc 100644 --- a/src/main/java/forge/game/player/PlayerControllerAi.java +++ b/src/main/java/forge/game/player/PlayerControllerAi.java @@ -17,6 +17,7 @@ import forge.game.ai.AiInputCommon; import forge.game.ai.ComputerUtil; import forge.game.ai.ComputerUtilBlock; import forge.game.ai.ComputerUtilCombat; +import forge.game.zone.ZoneType; import forge.gui.GuiChoose; @@ -219,4 +220,12 @@ public class PlayerControllerAi extends PlayerController { return ComputerUtilBlock.orderAttackers(blocker, attackers); } + /* (non-Javadoc) + * @see forge.game.player.PlayerController#reveal(java.lang.String, java.util.List) + */ + @Override + public void reveal(String string, List 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 0282bde6975..1bd07544911 100644 --- a/src/main/java/forge/game/player/PlayerControllerHuman.java +++ b/src/main/java/forge/game/player/PlayerControllerHuman.java @@ -7,6 +7,8 @@ import java.util.Map; import javax.swing.JOptionPane; +import org.apache.commons.lang3.StringUtils; + import forge.Card; import forge.GameEntity; import forge.card.spellability.SpellAbility; @@ -20,6 +22,7 @@ import forge.deck.DeckSection; import forge.game.GameState; import forge.game.GameType; import forge.game.phase.PhaseType; +import forge.game.zone.ZoneType; import forge.gui.GuiChoose; import forge.gui.GuiDialog; import forge.gui.GuiUtils; @@ -274,4 +277,15 @@ public class PlayerControllerHuman extends PlayerController { GuiUtils.setPanelSelection(blocker); return GuiChoose.order("Choose Blocking Order", "Damaged First", 0, attackers, null, blocker); } + + /* (non-Javadoc) + * @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) { + String message = string; + if ( StringUtils.isBlank(message) ) + message = String.format("Looking at %s's %s", owner, zone); + GuiChoose.oneOrNone(message, cards); + } }