diff --git a/.gitattributes b/.gitattributes index 7bddc958fd3..df3295e498d 100644 --- a/.gitattributes +++ b/.gitattributes @@ -14058,6 +14058,9 @@ src/main/java/forge/game/player/AIPlayer.java svneol=native#text/plain src/main/java/forge/game/player/GameLossReason.java -text 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/LobbyPlayerAi.java -text +src/main/java/forge/game/player/LobbyPlayerHuman.java -text +src/main/java/forge/game/player/LobbyPlayerRemote.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 diff --git a/src/main/java/forge/control/Lobby.java b/src/main/java/forge/control/Lobby.java index cc072b03102..cc8ffb68bc5 100644 --- a/src/main/java/forge/control/Lobby.java +++ b/src/main/java/forge/control/Lobby.java @@ -5,7 +5,9 @@ import java.util.Random; import java.util.concurrent.ConcurrentHashMap; import forge.game.player.LobbyPlayer; -import forge.game.player.PlayerType; +import forge.game.player.LobbyPlayerAi; +import forge.game.player.LobbyPlayerHuman; +import forge.game.player.LobbyPlayerRemote; import forge.gui.toolbox.FSkin; import forge.util.MyRandom; @@ -57,17 +59,17 @@ public class Lobby { "Walter", "Wilfred", "William", "Winston" }; - private Map remotePlayers = new ConcurrentHashMap(); - private final LobbyPlayer guiPlayer = new LobbyPlayer(PlayerType.HUMAN, "Human"); + private Map remotePlayers = new ConcurrentHashMap(); + private final LobbyPlayerHuman guiPlayer = new LobbyPlayerHuman("Human"); - public final LobbyPlayer getGuiPlayer() { + public final LobbyPlayerHuman getGuiPlayer() { return guiPlayer; } public final LobbyPlayer getAiPlayer() { return getAiPlayer(getRandomName()); } public final LobbyPlayer getAiPlayer(String name) { - LobbyPlayer player = new LobbyPlayer(PlayerType.COMPUTER, name); + LobbyPlayer player = new LobbyPlayerAi(name); player.setAvatarIndex(MyRandom.getRandom().nextInt(FSkin.getAvatars().size())); return player; } @@ -101,7 +103,7 @@ public class Lobby { if (remotePlayers.containsKey(name)) return remotePlayers.get(name); - LobbyPlayer res = new LobbyPlayer(PlayerType.REMOTE, name); + LobbyPlayerRemote res = new LobbyPlayerRemote(name); // have to load avatar from remote user's preferences here remotePlayers.put(name, res); return res; diff --git a/src/main/java/forge/game/GameAction.java b/src/main/java/forge/game/GameAction.java index 172964fca2e..5df1d169402 100644 --- a/src/main/java/forge/game/GameAction.java +++ b/src/main/java/forge/game/GameAction.java @@ -35,7 +35,6 @@ import forge.CardPredicates; import forge.CardUtil; import forge.Command; import forge.CounterType; -import forge.FThreads; import forge.GameEntity; import forge.card.CardType; import forge.card.TriggerReplacementBase; diff --git a/src/main/java/forge/game/GameState.java b/src/main/java/forge/game/GameState.java index 87cf911b319..42f4d91de6d 100644 --- a/src/main/java/forge/game/GameState.java +++ b/src/main/java/forge/game/GameState.java @@ -45,11 +45,8 @@ import forge.game.phase.EndOfTurn; import forge.game.phase.PhaseHandler; import forge.game.phase.Untap; import forge.game.phase.Upkeep; -import forge.game.player.AIPlayer; -import forge.game.player.HumanPlayer; import forge.game.player.LobbyPlayer; import forge.game.player.Player; -import forge.game.player.PlayerType; import forge.game.zone.MagicStack; import forge.game.zone.PlayerZone; import forge.game.zone.Zone; @@ -99,7 +96,7 @@ public class GameState { type = t; List players = new ArrayList(); for (LobbyPlayer p : players2) { - Player pl = getIngamePlayer(p); + Player pl = p.getPlayer(this); players.add(pl); ingamePlayers.add(pl); } @@ -495,19 +492,6 @@ public class GameState { return position; } - /** - * Only game knows how to get suitable players out of just connected clients. - * @return - */ - public Player getIngamePlayer(LobbyPlayer player) { - if (player.getType() == PlayerType.HUMAN) { - return new HumanPlayer(player, this); - } else { - return new AIPlayer(player, this); - - } - } - /** * TODO: Write javadoc for this method. * @param p diff --git a/src/main/java/forge/game/MatchController.java b/src/main/java/forge/game/MatchController.java index 61ec630ba1f..e7e83b4c325 100644 --- a/src/main/java/forge/game/MatchController.java +++ b/src/main/java/forge/game/MatchController.java @@ -7,6 +7,8 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import com.google.common.collect.Iterables; + import forge.Constant.Preferences; import forge.FThreads; @@ -21,6 +23,7 @@ import forge.game.event.DuelOutcomeEvent; import forge.game.player.AIPlayer; import forge.game.player.HumanPlayer; import forge.game.player.LobbyPlayer; +import forge.game.player.LobbyPlayerHuman; import forge.game.player.Player; import forge.game.player.PlayerStatistics; import forge.game.player.PlayerType; @@ -102,7 +105,7 @@ public class MatchController { game.getGameLog().add("Final", result.getWinner() + " won", 0); // add result entries to the game log - final LobbyPlayer human = Singletons.getControl().getPlayer().getLobbyPlayer(); + final LobbyPlayerHuman human = Singletons.getControl().getLobby().getGuiPlayer(); final List outcomes = new ArrayList(); @@ -146,9 +149,10 @@ public class MatchController { for (Player p : currentGame.getPlayers()) { if ( !(p instanceof AIPlayer)) continue; + AIPlayer ai = (AIPlayer) p; String currentAiProfile = Singletons.getModel().getPreferences().getPref(FPref.UI_CURRENT_AI_PROFILE); - String lastProfileChosen = this.getPlayedGames().isEmpty() ? currentAiProfile : p.getLobbyPlayer().getAiProfile(); + String lastProfileChosen = this.getPlayedGames().isEmpty() ? currentAiProfile : ai.getLobbyPlayer().getAiProfile(); // TODO: implement specific AI profiles for quest mode. boolean wantRandomProfile = currentAiProfile.equals(AiProfileUtil.AI_PROFILE_RANDOM_DUEL) @@ -156,11 +160,10 @@ public class MatchController { String profileToSet = wantRandomProfile ? AiProfileUtil.getRandomProfile() : lastProfileChosen; - p.getLobbyPlayer().setAiProfile(profileToSet); - System.out.println(String.format("AI profile %s was chosen for the lobby player %s.", p.getLobbyPlayer().getAiProfile(), p.getLobbyPlayer().getName())); + ai.getLobbyPlayer().setAiProfile(profileToSet); + System.out.println(String.format("AI profile %s was chosen for the lobby player %s.", ai.getLobbyPlayer().getAiProfile(), ai.getLobbyPlayer().getName())); } - - + try { HumanPlayer localHuman = (HumanPlayer) Aggregates.firstFieldEquals(currentGame.getPlayers(), Player.Accessors.FN_GET_TYPE, PlayerType.HUMAN); FControl.SINGLETON_INSTANCE.setPlayer(localHuman); diff --git a/src/main/java/forge/game/ai/AiProfileUtil.java b/src/main/java/forge/game/ai/AiProfileUtil.java index 3db912f0a0a..070c3cb28b7 100644 --- a/src/main/java/forge/game/ai/AiProfileUtil.java +++ b/src/main/java/forge/game/ai/AiProfileUtil.java @@ -17,8 +17,7 @@ */ package forge.game.ai; -import forge.Singletons; -import forge.game.player.LobbyPlayer; +import forge.game.player.LobbyPlayerAi; import forge.util.Aggregates; import forge.util.FileUtil; @@ -97,7 +96,7 @@ public class AiProfileUtil { * @param fp0 an AI property. * @return String */ - public static String getAIProp(final LobbyPlayer p, final AiProps fp0) { + public static String getAIProp(final LobbyPlayerAi p, final AiProps fp0) { String val = null; String profile = p.getAiProfile(); @@ -159,7 +158,7 @@ public class AiProfileUtil { /** * Simple class test facility for AiProfileUtil. - */ + *-/ public static void selfTest() { final LobbyPlayer activePlayer = Singletons.getControl().getPlayer().getLobbyPlayer(); System.out.println(String.format("Current profile = %s", activePlayer.getAiProfile())); @@ -181,4 +180,5 @@ public class AiProfileUtil { } } } + */ } diff --git a/src/main/java/forge/game/player/AIPlayer.java b/src/main/java/forge/game/player/AIPlayer.java index 78c82cb5ded..a3afd97bc68 100644 --- a/src/main/java/forge/game/player/AIPlayer.java +++ b/src/main/java/forge/game/player/AIPlayer.java @@ -39,6 +39,7 @@ import forge.util.Aggregates; public class AIPlayer extends Player { private final PlayerControllerAi controller; + private final LobbyPlayerAi lobbyPlayer; /** *

* Constructor for AIPlayer. @@ -48,9 +49,11 @@ public class AIPlayer extends Player { * @param myName * a {@link java.lang.String} object. */ - public AIPlayer(final LobbyPlayer player, final GameState game) { - super(player, game); + public AIPlayer(final LobbyPlayerAi player, final GameState game) { + super(player.getName(), game); + lobbyPlayer = player; controller = new PlayerControllerAi(game, this); + } public AiController getAi() { @@ -99,7 +102,16 @@ public class AIPlayer extends Player { * @see forge.game.player.Player#getController() */ @Override - public PlayerController getController() { + public PlayerControllerAi getController() { return controller; } + + /* (non-Javadoc) + * @see forge.game.player.Player#getLobbyPlayer() + */ + @Override + public LobbyPlayerAi getLobbyPlayer() { + // TODO Auto-generated method stub + return lobbyPlayer; + } } // end AIPlayer class diff --git a/src/main/java/forge/game/player/HumanPlayer.java b/src/main/java/forge/game/player/HumanPlayer.java index f5ac92dd695..af3845e2e93 100644 --- a/src/main/java/forge/game/player/HumanPlayer.java +++ b/src/main/java/forge/game/player/HumanPlayer.java @@ -40,10 +40,12 @@ import forge.game.GameState; import forge.game.zone.ZoneType; public class HumanPlayer extends Player { - private PlayerControllerHuman controller; + private final PlayerControllerHuman controller; + private final LobbyPlayerHuman lobbyPlayer; - public HumanPlayer(final LobbyPlayer player, GameState game) { - super(player, game); + public HumanPlayer(final LobbyPlayerHuman player, GameState game) { + super(player.getName(), game); + lobbyPlayer = player; controller = new PlayerControllerHuman(game, this); } @@ -84,10 +86,7 @@ public class HumanPlayer extends Player { } @Override - public PlayerType getType() { - return PlayerType.HUMAN; - } - public PlayerController getController() { + public PlayerControllerHuman getController() { return controller; } @@ -269,4 +268,9 @@ public class HumanPlayer extends Player { game.getStack().add(sa, x); } } + + @Override + public LobbyPlayerHuman getLobbyPlayer() { + return lobbyPlayer; + } } // end HumanPlayer class diff --git a/src/main/java/forge/game/player/LobbyPlayer.java b/src/main/java/forge/game/player/LobbyPlayer.java index c5d461cd081..1adf0a33553 100644 --- a/src/main/java/forge/game/player/LobbyPlayer.java +++ b/src/main/java/forge/game/player/LobbyPlayer.java @@ -1,28 +1,25 @@ package forge.game.player; +import forge.game.GameState; + /** * This means a player's part unchanged for all games. * * May store player's assets here. * */ -public class LobbyPlayer implements IHasIcon { +public abstract class LobbyPlayer implements IHasIcon { - protected final PlayerType type; - public final PlayerType getType() { - return type; - } + public abstract PlayerType getType(); protected final String name; protected String imageKey; private int avatarIndex = -1; /** The AI profile. */ - private String aiProfile = ""; - public LobbyPlayer(PlayerType type, String name) { - this.type = type; + public LobbyPlayer(String name) { this.name = name; } @@ -44,8 +41,8 @@ public class LobbyPlayer implements IHasIcon { public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + ((name == null) ? 0 : name.hashCode()); - result = prime * result + ((type == null) ? 0 : type.hashCode()); + result = prime * result + name.hashCode(); + result = prime * result + getType().hashCode(); return result; } @@ -68,7 +65,7 @@ public class LobbyPlayer implements IHasIcon { } else if (!name.equals(other.name)) { return false; } - return type == other.type; + return getType() == other.getType(); } public int getAvatarIndex() { @@ -79,11 +76,5 @@ public class LobbyPlayer implements IHasIcon { this.avatarIndex = avatarIndex; } - public void setAiProfile(String profileName) { - aiProfile = profileName; - } - - public String getAiProfile() { - return aiProfile; - } + public abstract Player getPlayer(GameState gameState); // factory method to create player } diff --git a/src/main/java/forge/game/player/LobbyPlayerAi.java b/src/main/java/forge/game/player/LobbyPlayerAi.java new file mode 100644 index 00000000000..57e504fb269 --- /dev/null +++ b/src/main/java/forge/game/player/LobbyPlayerAi.java @@ -0,0 +1,32 @@ +package forge.game.player; + +import forge.game.GameState; + +public class LobbyPlayerAi extends LobbyPlayer { + public LobbyPlayerAi(String name) { + super(name); + } + + private String aiProfile = ""; + + public void setAiProfile(String profileName) { + aiProfile = profileName; + } + + public String getAiProfile() { + return aiProfile; + } + + @Override + public PlayerType getType() { + return PlayerType.COMPUTER; + } + + /* (non-Javadoc) + * @see forge.game.player.LobbyPlayer#getPlayer(forge.game.GameState) + */ + @Override + public Player getPlayer(GameState game) { + return new AIPlayer(this, game); + } +} \ No newline at end of file diff --git a/src/main/java/forge/game/player/LobbyPlayerHuman.java b/src/main/java/forge/game/player/LobbyPlayerHuman.java new file mode 100644 index 00000000000..ff19175733e --- /dev/null +++ b/src/main/java/forge/game/player/LobbyPlayerHuman.java @@ -0,0 +1,19 @@ +package forge.game.player; + +import forge.game.GameState; + +public class LobbyPlayerHuman extends LobbyPlayer { + public LobbyPlayerHuman(String name) { + super(name); + } + + @Override + public PlayerType getType() { + return PlayerType.HUMAN; + } + + @Override + public Player getPlayer(GameState game) { + return new HumanPlayer(this, game); + } +} \ No newline at end of file diff --git a/src/main/java/forge/game/player/LobbyPlayerRemote.java b/src/main/java/forge/game/player/LobbyPlayerRemote.java new file mode 100644 index 00000000000..25eff93ba38 --- /dev/null +++ b/src/main/java/forge/game/player/LobbyPlayerRemote.java @@ -0,0 +1,25 @@ +package forge.game.player; + +import org.apache.commons.lang.NotImplementedException; + +import forge.game.GameState; + +public class LobbyPlayerRemote extends LobbyPlayer { + public LobbyPlayerRemote(String name) { + super(name); + } + + @Override + public PlayerType getType() { + return PlayerType.REMOTE; + } + + /* (non-Javadoc) + * @see forge.game.player.LobbyPlayer#getPlayer(forge.game.GameState) + */ + @Override + public Player getPlayer(GameState gameState) { + // Cannot create remote players yet + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/src/main/java/forge/game/player/Player.java b/src/main/java/forge/game/player/Player.java index 1326d4f2d78..76d524c4be7 100644 --- a/src/main/java/forge/game/player/Player.java +++ b/src/main/java/forge/game/player/Player.java @@ -164,7 +164,6 @@ public abstract class Player extends GameEntity implements Comparable { ZoneType.Library, ZoneType.Graveyard, ZoneType.Hand, ZoneType.Exile, ZoneType.Command, ZoneType.Ante, ZoneType.Sideboard)); - protected final LobbyPlayer lobbyPlayer; protected final GameState game; public final PlayerOutcome getOutcome() { @@ -183,8 +182,7 @@ public abstract class Player extends GameEntity implements Comparable { * @param myPoisonCounters * a int. */ - public Player(LobbyPlayer lobbyPlayer0, GameState game0) { - lobbyPlayer = lobbyPlayer0; + public Player(String name, GameState game0) { game = game0; for (final ZoneType z : Player.ALL_ZONES) { final PlayerZone toPut = z == ZoneType.Battlefield @@ -192,7 +190,7 @@ public abstract class Player extends GameEntity implements Comparable { : new PlayerZone(z, this); this.zones.put(z, toPut); } - this.setName(lobbyPlayer.getName()); + this.setName(name); } public GameState getGame() { // I'll probably regret about this @@ -207,7 +205,9 @@ public abstract class Player extends GameEntity implements Comparable { public boolean isHuman() { return getType() == PlayerType.HUMAN; } @Deprecated public boolean isComputer() { return getType() == PlayerType.COMPUTER; } - public abstract PlayerType getType(); + public PlayerType getType() { + return getLobbyPlayer().getType(); + } public List getSchemeDeck() { @@ -2727,9 +2727,7 @@ public abstract class Player extends GameEntity implements Comparable { * TODO: Write javadoc for this method. * @return */ - public LobbyPlayer getLobbyPlayer() { - return lobbyPlayer; - } + public abstract LobbyPlayer getLobbyPlayer(); private void setOutcome(PlayerOutcome outcome) { stats.setOutcome(outcome); diff --git a/src/main/java/forge/gui/GuiDisplayUtil.java b/src/main/java/forge/gui/GuiDisplayUtil.java index 5648033c35f..d29d0c27606 100644 --- a/src/main/java/forge/gui/GuiDisplayUtil.java +++ b/src/main/java/forge/gui/GuiDisplayUtil.java @@ -52,6 +52,7 @@ import forge.card.spellability.SpellAbility; import forge.card.trigger.TriggerType; import forge.game.GameState; import forge.game.PlanarDice; +import forge.game.player.HumanPlayer; import forge.game.player.Player; import forge.game.zone.PlayerZone; import forge.game.zone.ZoneType; @@ -285,7 +286,7 @@ public final class GuiDisplayUtil { List humanDevExileSetup = new ArrayList(); List computerDevExileSetup = new ArrayList(); - final Player human = Singletons.getControl().getPlayer(); + final HumanPlayer human = Singletons.getControl().getPlayer(); final Player ai = human.getOpponents().get(0); if (!tChangePlayer.trim().toLowerCase().equals("none")) {