From d409d5749cc97965fed7df152fd0d144ea10c8a5 Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Thu, 24 Jan 2013 22:20:28 +0000 Subject: [PATCH] InputControl is invariant of player type --- .gitattributes | 1 + .../java/forge/control/input/InputAttack.java | 2 +- .../java/forge/control/input/InputBlock.java | 8 ++-- .../forge/control/input/InputControl.java | 43 ++++++++----------- .../java/forge/game/phase/PhaseHandler.java | 32 +++++++------- src/main/java/forge/game/phase/PhaseUtil.java | 4 +- src/main/java/forge/game/player/AIPlayer.java | 5 ++- src/main/java/forge/game/player/Computer.java | 7 --- .../forge/game/player/ComputerAIGeneral.java | 22 +--------- .../game/player/ComputerAiInputBlock.java | 42 ++++++++++++++++++ .../java/forge/game/player/HumanPlayer.java | 6 ++- src/main/java/forge/game/player/Player.java | 6 ++- .../forge/game/player/PlayerController.java | 35 +++++++++------ src/main/java/forge/game/zone/MagicStack.java | 2 +- src/main/java/forge/gui/GuiInput.java | 2 +- 15 files changed, 124 insertions(+), 93 deletions(-) create mode 100644 src/main/java/forge/game/player/ComputerAiInputBlock.java diff --git a/.gitattributes b/.gitattributes index 5beadee1fd7..aa2e913c3b3 100644 --- a/.gitattributes +++ b/.gitattributes @@ -13679,6 +13679,7 @@ src/main/java/forge/game/player/AIPlayer.java svneol=native#text/plain src/main/java/forge/game/player/Computer.java svneol=native#text/plain src/main/java/forge/game/player/ComputerAIGeneral.java svneol=native#text/plain src/main/java/forge/game/player/ComputerAIInput.java svneol=native#text/plain +src/main/java/forge/game/player/ComputerAiInputBlock.java -text src/main/java/forge/game/player/ComputerUtil.java svneol=native#text/plain src/main/java/forge/game/player/ComputerUtilAttack.java svneol=native#text/plain src/main/java/forge/game/player/ComputerUtilBlock.java svneol=native#text/plain diff --git a/src/main/java/forge/control/input/InputAttack.java b/src/main/java/forge/control/input/InputAttack.java index 89b0d460eb4..0903328083a 100644 --- a/src/main/java/forge/control/input/InputAttack.java +++ b/src/main/java/forge/control/input/InputAttack.java @@ -88,7 +88,7 @@ public class InputAttack extends Input { Singletons.getModel().getGame().getPhaseHandler().repeatPhase(); } - Singletons.getModel().getGame().getPhaseHandler().setPlayerMayHavePriority(false); + Singletons.getModel().getGame().getPhaseHandler().setPlayersPriorityPermission(false); Singletons.getModel().getMatch().getInput().resetInput(); } diff --git a/src/main/java/forge/control/input/InputBlock.java b/src/main/java/forge/control/input/InputBlock.java index 220dc6af385..ce609e6ae80 100644 --- a/src/main/java/forge/control/input/InputBlock.java +++ b/src/main/java/forge/control/input/InputBlock.java @@ -24,6 +24,7 @@ import java.util.List; import forge.Card; import forge.Singletons; +import forge.game.GameState; import forge.game.phase.CombatUtil; import forge.game.player.Player; import forge.game.zone.Zone; @@ -96,12 +97,13 @@ public class InputBlock extends Input { /** {@inheritDoc} */ @Override public final void selectButtonOK() { - if (CombatUtil.finishedMandatoryBlocks(Singletons.getModel().getGame().getCombat(), defender)) { + final GameState game = Singletons.getModel().getGame(); + if (CombatUtil.finishedMandatoryBlocks(game.getCombat(), defender)) { // Done blocking ButtonUtil.reset(); - CombatUtil.orderMultipleCombatants(Singletons.getModel().getGame().getCombat()); + CombatUtil.orderMultipleCombatants(game.getCombat()); - Singletons.getModel().getGame().getPhaseHandler().passPriority(); + game.getPhaseHandler().passPriority(); } } diff --git a/src/main/java/forge/control/input/InputControl.java b/src/main/java/forge/control/input/InputControl.java index 5d1328137e3..ed77e526e64 100644 --- a/src/main/java/forge/control/input/InputControl.java +++ b/src/main/java/forge/control/input/InputControl.java @@ -23,6 +23,7 @@ import forge.game.GameState; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.player.Player; +import forge.game.player.PlayerController; import forge.game.zone.MagicStack; import forge.util.MyObservable; @@ -189,7 +190,7 @@ public class InputControl extends MyObservable implements java.io.Serializable { // If the Phase we're in doesn't allow for Priority, return null to move // to next phase - if (!handler.mayPlayerHavePriority()) { + if (!handler.isPlayerPriorityAllowed()) { return null; } @@ -205,18 +206,13 @@ public class InputControl extends MyObservable implements java.io.Serializable { case COMBAT_DECLARE_BLOCKERS: stack.freezeStack(); - boolean isUnderAttack = game.getCombat().isPlayerAttacked(priority); - if (!isUnderAttack) { // noone attacks you - handler.passPriority(); - return null; + + if (game.getCombat().isPlayerAttacked(priority)) { + return priority.getController().getBlockInput(); } - if (priority.isHuman()) { - return new InputBlock(priority); - } - - // ai is under attack - priority.getController().getAiInput().getComputer().declareBlockers(); + // noone attacks you + handler.passPriority(); return null; case CLEANUP: @@ -234,20 +230,19 @@ public class InputControl extends MyObservable implements java.io.Serializable { // ********************* // Special phases handled above, everything else is handled simply by // priority - if (priority == null) { + if (priority == null) return null; - } else if (priority.isHuman()) { - boolean prioritySkip = priority.getController().mayAutoPass(phase) - || priority.getController().isUiSetToSkipPhase(playerTurn, phase); - if (this.game.getStack().isEmpty() && prioritySkip) { - handler.passPriority(); - return null; - } else { - priority.getController().autoPassCancel(); // probably cancel, since something has happened - return new InputPassPriority(); - } - } else // if (playerTurn.isComputer()) { - return priority.getController().getAiInput(); + + PlayerController pc = priority.getController(); + + boolean prioritySkip = pc.mayAutoPass(phase) || pc.isUiSetToSkipPhase(playerTurn, phase); + if (this.game.getStack().isEmpty() && prioritySkip) { + handler.passPriority(); + return null; + } else + pc.autoPassCancel(); // probably cancel, since something has happened + + return pc.getDefaultInput(); } // getInput() } // InputControl diff --git a/src/main/java/forge/game/phase/PhaseHandler.java b/src/main/java/forge/game/phase/PhaseHandler.java index 953da4604c6..afe9d5b6276 100644 --- a/src/main/java/forge/game/phase/PhaseHandler.java +++ b/src/main/java/forge/game/phase/PhaseHandler.java @@ -258,7 +258,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { for (Player p : game.getPlayers()) { p.clearSlowtripList(); } - this.setPlayerMayHavePriority(false); + this.setPlayersPriorityPermission(false); } else { game.getUpkeep().executeUntil(this.getPlayerTurn()); game.getUpkeep().executeAt(); @@ -267,7 +267,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { case DRAW: if (getTurn() == 1 || PhaseUtil.skipDraw(this.getPlayerTurn())) { - this.setPlayerMayHavePriority(false); + this.setPlayersPriorityPermission(false); } else { this.getPlayerTurn().drawCards(1, true); } @@ -282,13 +282,13 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { case COMBAT_BEGIN: //PhaseUtil.verifyCombat(); if (playerTurn.isSkippingCombat()) { - this.setPlayerMayHavePriority(false); + this.setPlayersPriorityPermission(false); } break; case COMBAT_DECLARE_ATTACKERS: if (playerTurn.isSkippingCombat()) { - this.setPlayerMayHavePriority(false); + this.setPlayersPriorityPermission(false); playerTurn.removeKeyword("Skip your next combat phase."); } break; @@ -298,7 +298,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { PhaseUtil.handleDeclareAttackers(game.getCombat()); CombatUtil.showCombat(); } else { - this.setPlayerMayHavePriority(false); + this.setPlayersPriorityPermission(false); } break; // we can skip AfterBlockers and AfterAttackers if necessary @@ -307,7 +307,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { game.getCombat().verifyCreaturesInPlay(); CombatUtil.showCombat(); } else { - this.setPlayerMayHavePriority(false); + this.setPlayersPriorityPermission(false); } break; @@ -318,19 +318,19 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { PhaseUtil.handleDeclareBlockers(game); CombatUtil.showCombat(); } else { - this.setPlayerMayHavePriority(false); + this.setPlayersPriorityPermission(false); } break; case COMBAT_FIRST_STRIKE_DAMAGE: if (!this.inCombat()) { - this.setPlayerMayHavePriority(false); + this.setPlayersPriorityPermission(false); } else { game.getCombat().verifyCreaturesInPlay(); // no first strikers, skip this step if (!game.getCombat().assignCombatDamage(true)) { - this.setPlayerMayHavePriority(false); + this.setPlayersPriorityPermission(false); } else { game.getCombat().dealAssignedDamage(); game.getAction().checkStateEffects(); @@ -341,12 +341,12 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { case COMBAT_DAMAGE: if (!this.inCombat()) { - this.setPlayerMayHavePriority(false); + this.setPlayersPriorityPermission(false); } else { game.getCombat().verifyCreaturesInPlay(); if (!game.getCombat().assignCombatDamage(false)) { - this.setPlayerMayHavePriority(false); + this.setPlayersPriorityPermission(false); } else { game.getCombat().dealAssignedDamage(); game.getAction().checkStateEffects(); @@ -392,7 +392,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { break; } - if (this.mayPlayerHavePriority()) { + if (this.isPlayerPriorityAllowed()) { // Run triggers if phase isn't being skipped final HashMap runParams = new HashMap(); runParams.put("Phase", this.getPhase().Name); @@ -427,7 +427,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { */ public final void nextPhase() { - this.setPlayerMayHavePriority(true); // PlayerPriorityAllowed = false; + this.setPlayersPriorityPermission(true); // PlayerPriorityAllowed = false; // If the Stack isn't empty why is nextPhase being called? if (game.getStack().size() != 0) { @@ -787,7 +787,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { if (game.getStack().isEmpty()) { this.setPriority(this.getPlayerTurn()); // this needs to be set early as we exit the phase // end phase - setPlayerMayHavePriority(true); + setPlayersPriorityPermission(true); nextPhase(); return; } else if (!game.getStack().hasSimultaneousStackEntries()) { @@ -810,7 +810,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { * @param needToNextPhase * a boolean. */ - public final void setPlayerMayHavePriority(final boolean mayHavePriority) { + public final void setPlayersPriorityPermission(final boolean mayHavePriority) { this.isPlayerPriorityAllowed = mayHavePriority; } @@ -821,7 +821,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { * * @return a boolean. */ - public final boolean mayPlayerHavePriority() { + public final boolean isPlayerPriorityAllowed() { return this.isPlayerPriorityAllowed; } diff --git a/src/main/java/forge/game/phase/PhaseUtil.java b/src/main/java/forge/game/phase/PhaseUtil.java index 1c51b778181..ee1e14b0668 100644 --- a/src/main/java/forge/game/phase/PhaseUtil.java +++ b/src/main/java/forge/game/phase/PhaseUtil.java @@ -101,7 +101,7 @@ public class PhaseUtil { // phase is skipped if (PhaseUtil.skipUntap(turn)) { - game.getPhaseHandler().setPlayerMayHavePriority(false); + game.getPhaseHandler().setPlayersPriorityPermission(false); return; } @@ -111,7 +111,7 @@ public class PhaseUtil { // otherwise land seems to stay tapped when it is really untapped // AllZone.getHumanPlayer().getZone(ZoneType.Battlefield).updateObservers(); - game.getPhaseHandler().setPlayerMayHavePriority(false); + game.getPhaseHandler().setPlayersPriorityPermission(false); } /** diff --git a/src/main/java/forge/game/player/AIPlayer.java b/src/main/java/forge/game/player/AIPlayer.java index e8e6f7a645e..316e8c9be81 100644 --- a/src/main/java/forge/game/player/AIPlayer.java +++ b/src/main/java/forge/game/player/AIPlayer.java @@ -52,8 +52,9 @@ public class AIPlayer extends Player { * a {@link java.lang.String} object. */ public AIPlayer(final LobbyPlayer player, final GameState game) { - super(player, game); - getController().setAiInput(new ComputerAIInput(new ComputerAIGeneral(this, game))); + super(player, game, new PlayerController()); + getController().setDefaultInput(new ComputerAIInput(new ComputerAIGeneral(this, game))); + getController().setBlockInput(new ComputerAiInputBlock(game, this)); } diff --git a/src/main/java/forge/game/player/Computer.java b/src/main/java/forge/game/player/Computer.java index eabb175b6ca..2a8a7371011 100644 --- a/src/main/java/forge/game/player/Computer.java +++ b/src/main/java/forge/game/player/Computer.java @@ -38,13 +38,6 @@ public interface Computer { */ void declareAttackers(); - /** - *

- * declare_blockers. - *

- */ - void declareBlockers(); // this is called after when the Human or Computer - // blocks /** *

diff --git a/src/main/java/forge/game/player/ComputerAIGeneral.java b/src/main/java/forge/game/player/ComputerAIGeneral.java index d76e83ca399..3e0ec91b1cd 100644 --- a/src/main/java/forge/game/player/ComputerAIGeneral.java +++ b/src/main/java/forge/game/player/ComputerAIGeneral.java @@ -33,7 +33,6 @@ import forge.card.spellability.SpellPermanent; import forge.card.trigger.Trigger; import forge.card.trigger.TriggerType; import forge.game.GameState; -import forge.game.phase.CombatUtil; import forge.game.zone.ZoneType; /** @@ -285,14 +284,13 @@ public class ComputerAIGeneral implements Computer { for (final Card element : att) { // tapping of attackers happens after Propaganda is paid for final StringBuilder sb = new StringBuilder(); - sb.append("Computer just assigned "); - sb.append(element.getName()).append(" as an attacker."); + sb.append("Computer just assigned ").append(element.getName()).append(" as an attacker."); Log.debug(sb.toString()); } player.getZone(ZoneType.Battlefield).updateObservers(); - game.getPhaseHandler().setPlayerMayHavePriority(false); + game.getPhaseHandler().setPlayersPriorityPermission(false); // ai is about to attack, cancel all phase skipping for (Player p : game.getPlayers()) { @@ -300,22 +298,6 @@ public class ComputerAIGeneral implements Computer { } } - /** - *

- * declare_blockers. - *

- */ - @Override - public final void declareBlockers() { - final List blockers = player.getCreaturesInPlay(); - - game.setCombat(ComputerUtilBlock.getBlockers(player, game.getCombat(), blockers)); - - CombatUtil.orderMultipleCombatants(game.getCombat()); - - game.getPhaseHandler().setPlayerMayHavePriority(false); - } - /** *

diff --git a/src/main/java/forge/game/player/ComputerAiInputBlock.java b/src/main/java/forge/game/player/ComputerAiInputBlock.java new file mode 100644 index 00000000000..604d59c4199 --- /dev/null +++ b/src/main/java/forge/game/player/ComputerAiInputBlock.java @@ -0,0 +1,42 @@ +package forge.game.player; + +import java.util.List; + +import forge.Card; +import forge.control.input.Input; +import forge.game.GameState; +import forge.game.phase.CombatUtil; + +/** + * TODO: Write javadoc for this type. + * + */ +public class ComputerAiInputBlock extends Input { + + private final GameState game; + /** + * TODO: Write javadoc for Constructor. + * @param game + * @param player + */ + public ComputerAiInputBlock(GameState game, Player player) { + super(); + this.game = game; + this.player = player; + } + + private final Player player; + + private static final long serialVersionUID = -2253562658069995572L; + + @Override + public void showMessage() { + // TODO Auto-generated method stub + final List blockers = player.getCreaturesInPlay(); + game.setCombat(ComputerUtilBlock.getBlockers(player, game.getCombat(), blockers)); + CombatUtil.orderMultipleCombatants(game.getCombat()); + game.getPhaseHandler().setPlayersPriorityPermission(false); + + stop(); + } +} diff --git a/src/main/java/forge/game/player/HumanPlayer.java b/src/main/java/forge/game/player/HumanPlayer.java index c90424f6083..ed7e53d1ec4 100644 --- a/src/main/java/forge/game/player/HumanPlayer.java +++ b/src/main/java/forge/game/player/HumanPlayer.java @@ -24,6 +24,8 @@ import forge.Card; import forge.Singletons; import forge.card.spellability.SpellAbility; import forge.control.input.Input; +import forge.control.input.InputBlock; +import forge.control.input.InputPassPriority; import forge.game.GameType; import forge.game.GameState; import forge.game.zone.ZoneType; @@ -51,7 +53,9 @@ public class HumanPlayer extends Player { * a {@link java.lang.String} object. */ public HumanPlayer(final LobbyPlayer player, GameState game) { - super(player, game); + super(player, game, new PlayerController()); + getController().setDefaultInput(new InputPassPriority()); + getController().setBlockInput(new InputBlock(this)); } // ////////////// diff --git a/src/main/java/forge/game/player/Player.java b/src/main/java/forge/game/player/Player.java index 3996569fcf3..6c7079144e6 100644 --- a/src/main/java/forge/game/player/Player.java +++ b/src/main/java/forge/game/player/Player.java @@ -178,7 +178,7 @@ public abstract class Player extends GameEntity implements Comparable { * @param myPoisonCounters * a int. */ - public Player(LobbyPlayer lobbyPlayer0, GameState game0) { + public Player(LobbyPlayer lobbyPlayer0, GameState game0, PlayerController pc) { lobbyPlayer = lobbyPlayer0; game = game0; for (final ZoneType z : Player.ALL_ZONES) { @@ -188,7 +188,9 @@ public abstract class Player extends GameEntity implements Comparable { this.zones.put(z, toPut); } this.setName(lobbyPlayer.getName()); - controller = new PlayerController(this); + pc.setPlayer(this); + controller = pc; + } public final PlayerStatistics getStats() { diff --git a/src/main/java/forge/game/player/PlayerController.java b/src/main/java/forge/game/player/PlayerController.java index 74caa258f49..8e86f8135e6 100644 --- a/src/main/java/forge/game/player/PlayerController.java +++ b/src/main/java/forge/game/player/PlayerController.java @@ -4,6 +4,7 @@ import java.util.List; import forge.Singletons; import forge.card.spellability.SpellAbility; +import forge.control.input.Input; import forge.game.phase.PhaseType; import forge.gui.GuiChoose; import forge.gui.match.CMatchUI; @@ -18,18 +19,20 @@ public class PlayerController { // Should keep some 'Model' of player here. // Yet I have little idea of what is model now. - private final Player player; + private Player player; private PhaseType autoPassUntil = null; - private ComputerAIInput aiInput; + private Input defaultInput; + private Input blockInput; - public final ComputerAIInput getAiInput() { - return aiInput; + public final Input getDefaultInput() { + return defaultInput; } - public PlayerController(Player player0) { - player = player0; + public PlayerController() {} + void setPlayer(Player p) { + player = p; } /** @@ -51,15 +54,12 @@ public class PlayerController { public boolean isUiSetToSkipPhase(final Player turn, final PhaseType phase) { - return player.equals(Singletons.getControl().getPlayer()) && !CMatchUI.SINGLETON_INSTANCE.stopAtPhase(turn, phase); + boolean isLocalPlayer = player.equals(Singletons.getControl().getPlayer()); + return isLocalPlayer && !CMatchUI.SINGLETON_INSTANCE.stopAtPhase(turn, phase); } - /** - * TODO: Write javadoc for this method. - * @param computerAIInput - */ - public void setAiInput(ComputerAIInput computerAIInput) { - aiInput = computerAIInput; + void setDefaultInput(Input input) { + defaultInput = input; } /** @@ -75,4 +75,13 @@ public class PlayerController { } } + /** Input to use when player has to declare blockers */ + public Input getBlockInput() { + return blockInput; + } + + void setBlockInput(Input blockInput0) { + this.blockInput = blockInput0; + } + } diff --git a/src/main/java/forge/game/zone/MagicStack.java b/src/main/java/forge/game/zone/MagicStack.java index 13c108abc7f..0aeff14037c 100644 --- a/src/main/java/forge/game/zone/MagicStack.java +++ b/src/main/java/forge/game/zone/MagicStack.java @@ -1033,7 +1033,7 @@ public class MagicStack extends MyObservable { game.getAction().checkStateEffects(); - game.getPhaseHandler().setPlayerMayHavePriority(true); + game.getPhaseHandler().setPlayersPriorityPermission(true); this.curResolvingCard = null; diff --git a/src/main/java/forge/gui/GuiInput.java b/src/main/java/forge/gui/GuiInput.java index 58309405027..787f195b2c1 100644 --- a/src/main/java/forge/gui/GuiInput.java +++ b/src/main/java/forge/gui/GuiInput.java @@ -52,7 +52,7 @@ public class GuiInput extends MyObservable implements Observer { if (tmp != null) { // System.out.println(ph.getPlayerTurn() + "'s " + ph.getPhase() + ", priority of " + ph.getPriorityPlayer() + " @ input is " + tmp.getClass().getName() ); this.setInput(tmp); - } else if (!ph.mayPlayerHavePriority()) { + } else if (!ph.isPlayerPriorityAllowed()) { //System.out.println("cannot have priority, forced to pass"); ph.passPriority(); }