diff --git a/.gitattributes b/.gitattributes index 84a3dcd9e22..eb87160f59f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -13917,6 +13917,8 @@ src/main/java/forge/game/player/HumanPlayer.java svneol=native#text/plain src/main/java/forge/game/player/LobbyPlayer.java -text src/main/java/forge/game/player/Player.java svneol=native#text/plain src/main/java/forge/game/player/PlayerController.java -text +src/main/java/forge/game/player/PlayerControllerAi.java -text +src/main/java/forge/game/player/PlayerControllerHuman.java -text src/main/java/forge/game/player/PlayerOutcome.java -text src/main/java/forge/game/player/PlayerStatistics.java -text src/main/java/forge/game/player/PlayerType.java svneol=native#text/plain diff --git a/src/main/java/forge/game/player/AIPlayer.java b/src/main/java/forge/game/player/AIPlayer.java index 20f904f8698..5a87a1c02c4 100644 --- a/src/main/java/forge/game/player/AIPlayer.java +++ b/src/main/java/forge/game/player/AIPlayer.java @@ -29,8 +29,6 @@ import forge.card.cardfactory.CardFactoryUtil; import forge.card.spellability.SpellAbility; import forge.game.GameState; import forge.game.ai.AiController; -import forge.game.ai.AiInputBlock; -import forge.game.ai.AiInputCommon; import forge.game.ai.ComputerUtil; import forge.game.zone.ZoneType; import forge.util.Aggregates; @@ -46,7 +44,7 @@ import forge.util.MyRandom; */ public class AIPlayer extends Player { - private final AiController brains; + private final PlayerControllerAi controller; /** *

* Constructor for AIPlayer. @@ -57,14 +55,14 @@ public class AIPlayer extends Player { * a {@link java.lang.String} object. */ public AIPlayer(final LobbyPlayer player, final GameState game) { - super(player, game, new PlayerController(game)); - brains = new AiController(this, game); - PlayerController pc = getController(); - pc.setDefaultInput(new AiInputCommon(brains)); - pc.setBlockInput(new AiInputBlock(game, this)); - pc.setCleanupInput(pc.getDefaultInput()); + super(player, game); + controller = new PlayerControllerAi(game, this); } + public AiController getAi() { + return controller.getAi(); + } + // ////////////// // / @@ -244,4 +242,13 @@ public class AIPlayer extends Player { public PlayerType getType() { return PlayerType.COMPUTER; } + + + /* (non-Javadoc) + * @see forge.game.player.Player#getController() + */ + @Override + public PlayerController getController() { + return controller; + } } // end AIPlayer class diff --git a/src/main/java/forge/game/player/HumanPlayer.java b/src/main/java/forge/game/player/HumanPlayer.java index 0bdbb97bd39..a3ccd00e6a1 100644 --- a/src/main/java/forge/game/player/HumanPlayer.java +++ b/src/main/java/forge/game/player/HumanPlayer.java @@ -24,9 +24,6 @@ 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.InputCleanup; -import forge.control.input.InputPassPriority; import forge.game.GameType; import forge.game.GameState; import forge.game.zone.ZoneType; @@ -44,7 +41,8 @@ import forge.quest.bazaar.QuestItemType; * @version $Id$ */ public class HumanPlayer extends Player { - + private PlayerControllerHuman controller; + /** *

* Constructor for HumanPlayer. @@ -54,10 +52,9 @@ public class HumanPlayer extends Player { * a {@link java.lang.String} object. */ public HumanPlayer(final LobbyPlayer player, GameState game) { - super(player, game, new PlayerController(game)); - getController().setDefaultInput(new InputPassPriority()); - getController().setBlockInput(new InputBlock(this)); - getController().setCleanupInput(new InputCleanup(game)); + super(player, game); + + controller = new PlayerControllerHuman(game, this); } // ////////////// @@ -78,6 +75,8 @@ public class HumanPlayer extends Player { return true; } + + /** *

* isComputer. @@ -223,4 +222,12 @@ public class HumanPlayer extends Player { } return newHand; } + + /* (non-Javadoc) + * @see forge.game.player.Player#getController() + */ + @Override + public PlayerController getController() { + return controller; + } } // end HumanPlayer class diff --git a/src/main/java/forge/game/player/Player.java b/src/main/java/forge/game/player/Player.java index 8013238ecc6..abbf52cec86 100644 --- a/src/main/java/forge/game/player/Player.java +++ b/src/main/java/forge/game/player/Player.java @@ -157,8 +157,6 @@ public abstract class Player extends GameEntity implements Comparable { ZoneType.Sideboard)); - private final PlayerController controller; - protected final LobbyPlayer lobbyPlayer; protected final GameState game; @@ -178,7 +176,7 @@ public abstract class Player extends GameEntity implements Comparable { * @param myPoisonCounters * a int. */ - public Player(LobbyPlayer lobbyPlayer0, GameState game0, PlayerController pc) { + public Player(LobbyPlayer lobbyPlayer0, GameState game0) { lobbyPlayer = lobbyPlayer0; game = game0; for (final ZoneType z : Player.ALL_ZONES) { @@ -188,9 +186,6 @@ public abstract class Player extends GameEntity implements Comparable { this.zones.put(z, toPut); } this.setName(lobbyPlayer.getName()); - pc.setPlayer(this); - controller = pc; - } public final PlayerStatistics getStats() { @@ -3079,9 +3074,7 @@ public abstract class Player extends GameEntity implements Comparable { * TODO: Write javadoc for this method. * @return */ - public PlayerController getController() { - return controller; - } + public abstract PlayerController getController(); /** *

diff --git a/src/main/java/forge/game/player/PlayerController.java b/src/main/java/forge/game/player/PlayerController.java index 0d712aa7b7c..28d8908c7a8 100644 --- a/src/main/java/forge/game/player/PlayerController.java +++ b/src/main/java/forge/game/player/PlayerController.java @@ -2,13 +2,13 @@ package forge.game.player; import java.util.List; +import forge.Card; import forge.Singletons; import forge.card.spellability.SpellAbility; import forge.control.input.Input; import forge.game.GameState; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; -import forge.gui.GuiChoose; import forge.gui.match.CMatchUI; @@ -17,31 +17,22 @@ import forge.gui.match.CMatchUI; * * Handles phase skips for now. */ -public class PlayerController { - - // Should keep some 'Model' of player here. - // Yet I have little idea of what is model now. - private Player player; +public abstract class PlayerController { + protected final Player player; + protected final GameState game; + private PhaseType autoPassUntil = null; - private Input defaultInput; - private Input blockInput; - private Input cleanupInput; - - private final GameState game; - - public final Input getDefaultInput() { - return defaultInput; - } - - public PlayerController(GameState game0) { + public PlayerController(GameState game0, Player p) { game = game0; - } - void setPlayer(Player p) { player = p; } + public abstract Input getDefaultInput(); + public abstract Input getBlockInput(); + public abstract Input getCleanupInput(); + /** * TODO: Write javadoc for this method. @@ -66,37 +57,10 @@ public class PlayerController { return isLocalPlayer && !CMatchUI.SINGLETON_INSTANCE.stopAtPhase(turn, phase); } - void setDefaultInput(Input input) { - defaultInput = input; - } - - - void setCleanupInput(Input input) { - // TODO Auto-generated method stub - cleanupInput = input; - } - /** * Uses GUI to learn which spell the player (human in our case) would like to play */ - public SpellAbility getAbilityToPlay(List abilities) { - if (abilities.size() == 0) { - return null; - } else if (abilities.size() == 1) { - return abilities.get(0); - } else { - return GuiChoose.oneOrNone("Choose", abilities); // some day network interaction will be here - } - } - - /** Input to use when player has to declare blockers */ - public Input getBlockInput() { - return blockInput; - } - - void setBlockInput(Input blockInput0) { - this.blockInput = blockInput0; - } + public abstract SpellAbility getAbilityToPlay(List abilities); /** * TODO: Write javadoc for this method. @@ -109,11 +73,12 @@ public class PlayerController { } /** - * @return the cleanupInput + * TODO: Write javadoc for this method. + * @param c */ - public Input getCleanupInput() { - return cleanupInput; - } + public abstract void playFromSuspend(Card c); + public abstract boolean playCascade(Card cascadedCard, Card sourceCard); + public abstract void mayPlaySpellAbilityForFree(SpellAbility copySA); diff --git a/src/main/java/forge/game/player/PlayerControllerAi.java b/src/main/java/forge/game/player/PlayerControllerAi.java new file mode 100644 index 00000000000..f61c2f99e27 --- /dev/null +++ b/src/main/java/forge/game/player/PlayerControllerAi.java @@ -0,0 +1,149 @@ +package forge.game.player; + +import java.util.List; + +import forge.Card; +import forge.card.spellability.Spell; +import forge.card.spellability.SpellAbility; +import forge.control.input.Input; +import forge.game.GameState; +import forge.game.ai.AiController; +import forge.game.ai.AiInputBlock; +import forge.game.ai.AiInputCommon; +import forge.game.ai.ComputerUtil; +import forge.gui.GuiChoose; + + +/** + * A prototype for player controller class + * + * Handles phase skips for now. + */ +public class PlayerControllerAi extends PlayerController { + + private Input defaultInput; + private Input blockInput; + private Input cleanupInput; + + private final AiController brains; + + + public final Input getDefaultInput() { + return defaultInput; + } + + public PlayerControllerAi(GameState game, AIPlayer p) { + super(game, p); + + brains = new AiController(player, game); + + defaultInput = new AiInputCommon(brains); + blockInput = new AiInputBlock(game, player); + cleanupInput = getDefaultInput(); + + } + + /** + * Uses GUI to learn which spell the player (human in our case) would like to play + */ + public SpellAbility getAbilityToPlay(List abilities) { + if (abilities.size() == 0) { + return null; + } else if (abilities.size() == 1) { + return abilities.get(0); + } else { + return GuiChoose.oneOrNone("Choose", abilities); // some day network interaction will be here + } + } + + /** Input to use when player has to declare blockers */ + public Input getBlockInput() { + return blockInput; + } + + /** + * @return the cleanupInput + */ + public Input getCleanupInput() { + return cleanupInput; + } + + /** + * TODO: Write javadoc for this method. + * @param c + */ + public void playFromSuspend(Card c) { + final List choices = c.getBasicSpells(); + c.setSuspendCast(true); + for (final SpellAbility sa : choices) { + //Spells + if (sa instanceof Spell) { + Spell spell = (Spell) sa; + if (!spell.canPlayFromEffectAI(true, true)) { + continue; + } + } else { + if (sa.canPlayAI()) { + continue; + } + } + + ComputerUtil.playSpellAbilityWithoutPayingManaCost(player, sa, game); + break; + } + } + + /* (non-Javadoc) + * @see forge.game.player.PlayerController#playCascade(java.util.List, forge.Card) + */ + @Override + public boolean playCascade(Card cascadedCard, Card source) { + final List choices = cascadedCard.getBasicSpells(); + + for (final SpellAbility sa : choices) { + sa.setActivatingPlayer(player); + //Spells + if (sa instanceof Spell) { + Spell spell = (Spell) sa; + if (!spell.canPlayFromEffectAI(false, true)) { + continue; + } + } else { + if (!sa.canPlayAI()) { + continue; + } + } + + + ComputerUtil.playSpellAbilityWithoutPayingManaCost(player, sa, game); + return true; + } + return false; + } + + /** + * TODO: Write javadoc for this method. + * @return + */ + public AiController getAi() { + return brains; + } + + /* (non-Javadoc) + * @see forge.game.player.PlayerController#mayPlaySpellAbilityForFree(forge.card.spellability.SpellAbility) + */ + @Override + public void mayPlaySpellAbilityForFree(SpellAbility copySA) { + if (copySA instanceof Spell) { + Spell spell = (Spell) copySA; + if (spell.canPlayFromEffectAI(false, true)) { + ComputerUtil.playStackFree(player, copySA); + } + } else if (copySA.canPlayAI()) { + ComputerUtil.playStackFree(player, copySA); + } + } + + + +} diff --git a/src/main/java/forge/game/player/PlayerControllerHuman.java b/src/main/java/forge/game/player/PlayerControllerHuman.java new file mode 100644 index 00000000000..867f2ee0a4d --- /dev/null +++ b/src/main/java/forge/game/player/PlayerControllerHuman.java @@ -0,0 +1,122 @@ +package forge.game.player; + +import java.util.List; + +import javax.swing.JOptionPane; + +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.InputCleanup; +import forge.control.input.InputPassPriority; +import forge.game.GameState; +import forge.game.phase.PhaseType; +import forge.gui.GuiChoose; +import forge.gui.match.CMatchUI; + + +/** + * A prototype for player controller class + * + * Handles phase skips for now. + */ +public class PlayerControllerHuman extends PlayerController { + + + private PhaseType autoPassUntil = null; + + private final Input defaultInput; + private final Input blockInput; + private final Input cleanupInput; + + + public final Input getDefaultInput() { + return defaultInput; + } + + public PlayerControllerHuman(GameState game0, HumanPlayer p) { + super(game0, p); + + defaultInput = new InputPassPriority(); + blockInput = new InputBlock(player); + cleanupInput = new InputCleanup(game); + } + + public boolean mayAutoPass(PhaseType phase) { + + return phase.isBefore(autoPassUntil); + } + + + public boolean isUiSetToSkipPhase(final Player turn, final PhaseType phase) { + boolean isLocalPlayer = player.equals(Singletons.getControl().getPlayer()); + return isLocalPlayer && !CMatchUI.SINGLETON_INSTANCE.stopAtPhase(turn, phase); + } + + /** + * Uses GUI to learn which spell the player (human in our case) would like to play + */ + public SpellAbility getAbilityToPlay(List abilities) { + if (abilities.size() == 0) { + return null; + } else if (abilities.size() == 1) { + return abilities.get(0); + } else { + return GuiChoose.oneOrNone("Choose", abilities); // some day network interaction will be here + } + } + + /** Input to use when player has to declare blockers */ + public Input getBlockInput() { + return blockInput; + } + + /** + * @return the cleanupInput + */ + public Input getCleanupInput() { + return cleanupInput; + } + + /** + * TODO: Write javadoc for this method. + * @param c + */ + public void playFromSuspend(Card c) { + c.setSuspend(true); + game.getAction().playCardWithoutManaCost(c, c.getOwner()); + } + + /* (non-Javadoc) + * @see forge.game.player.PlayerController#playCascade(java.util.List, forge.Card) + */ + @Override + public boolean playCascade(Card cascadedCard, Card sourceCard) { + + final StringBuilder title = new StringBuilder(); + title.append(sourceCard.getName()).append(" - Cascade Ability"); + final StringBuilder question = new StringBuilder(); + question.append("Cast ").append(cascadedCard.getName()); + question.append(" without paying its mana cost?"); + + final int answer = JOptionPane.showConfirmDialog(null, question.toString(), + title.toString(), JOptionPane.YES_NO_OPTION); + + boolean result = answer == JOptionPane.YES_OPTION; + game.getAction().playCardWithoutManaCost(cascadedCard, player); + return result; + } + + /* (non-Javadoc) + * @see forge.game.player.PlayerController#mayPlaySpellAbilityForFree(forge.card.spellability.SpellAbility) + */ + @Override + public void mayPlaySpellAbilityForFree(SpellAbility copySA) { + game.getAction().playSpellAbilityForFree(copySA); + } + + + +}