lobbyPlayers have strict types, this is used to provide separate code paths to deliver messages to GUI player and remote one.

lobbyPlayer has a factory method to build concrete player.
This commit is contained in:
Maxmtg
2013-04-17 12:44:28 +00:00
parent f1b1100c89
commit a4743c1035
14 changed files with 144 additions and 71 deletions

3
.gitattributes vendored
View File

@@ -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

View File

@@ -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<String, LobbyPlayer> remotePlayers = new ConcurrentHashMap<String, LobbyPlayer>();
private final LobbyPlayer guiPlayer = new LobbyPlayer(PlayerType.HUMAN, "Human");
private Map<String, LobbyPlayerRemote> remotePlayers = new ConcurrentHashMap<String, LobbyPlayerRemote>();
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;

View File

@@ -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;

View File

@@ -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<Player> players = new ArrayList<Player>();
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

View File

@@ -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<String> outcomes = new ArrayList<String>();
@@ -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);

View File

@@ -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 {
}
}
}
*/
}

View File

@@ -39,6 +39,7 @@ import forge.util.Aggregates;
public class AIPlayer extends Player {
private final PlayerControllerAi controller;
private final LobbyPlayerAi lobbyPlayer;
/**
* <p>
* 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

View File

@@ -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

View File

@@ -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
}

View File

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

View File

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

View File

@@ -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();
}
}

View File

@@ -164,7 +164,6 @@ public abstract class Player extends GameEntity implements Comparable<Player> {
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<Player> {
* @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<Player> {
: 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<Player> {
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<Card> getSchemeDeck() {
@@ -2727,9 +2727,7 @@ public abstract class Player extends GameEntity implements Comparable<Player> {
* TODO: Write javadoc for this method.
* @return
*/
public LobbyPlayer getLobbyPlayer() {
return lobbyPlayer;
}
public abstract LobbyPlayer getLobbyPlayer();
private void setOutcome(PlayerOutcome outcome) {
stats.setOutcome(outcome);

View File

@@ -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<Card> humanDevExileSetup = new ArrayList<Card>();
List<Card> computerDevExileSetup = new ArrayList<Card>();
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")) {