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);
+ }
+
+
+
+}