package vooga.rts.manager;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Observable;
import java.util.Observer;
import vooga.rts.player.HumanPlayer;
import vooga.rts.player.Player;
import vooga.rts.player.Team;
import vooga.rts.state.GameOver;
public class PlayerManager extends Observable implements Observer {
private List<Player> myPlayers;
private Map<Integer, Team> myTeams;
private HumanPlayer myHuman;
public PlayerManager () {
myTeams = new HashMap<Integer, Team>();
myPlayers = new ArrayList<Player>();
}
/**
* Adds a player to the game
*
* @param player to add
* @param teamID of the player.
*/
public void addPlayer (Player player, int teamID) {
myPlayers.add(player);
if (myTeams.get(teamID) == null) {
addTeam(teamID);
}
myTeams.get(teamID).addPlayer(player);
}
private void addTeam (int teamID) {
myTeams.put(teamID, new Team(teamID));
}
/**
* Creates a new player with the specified team ID
*
* @param teamID the team ID of the player.
*/
public void addPlayer (int teamID) {
Player result;
if (myPlayers.size() == 0) {
myHuman = new HumanPlayer(0, teamID);
result = myHuman;
}
else {
result = new Player(myPlayers.size(), teamID);
}
result.addObserver(this);
addPlayer(result, teamID);
}
/**
* Returns a team corresponding to the team ID
*
* @param teamid The Team ID
* @return The Team
*/
public Team getTeam (int teamid) {
return myTeams.get(teamid);
}
/**
* Returns the player that corresponds to the player ID
*
* @param playerID the id of the player
* @return
*/
public Player getPlayer (int playerID) {
return myPlayers.get(playerID);
}
/**
* Returns the Human Player
*
* @return The Human Player
*/
public HumanPlayer getHuman () {
return myHuman;
}
public List<Player> getAll () {
return myPlayers;
}
public void update (double elapsedTime) {
for (Player p : getAll()) {
p.update(elapsedTime);
}
}
public int getTeamID (int playerID) {
return myPlayers.get(playerID).getTeamID();
}
@Override
public void update (Observable arg0, Object arg1) {
if (arg1 instanceof GameOver) {
setChanged();
if (arg1 == GameOver.QUIT) {
notifyObservers(arg1);
return;
}
if (arg0.equals(myHuman)) {
notifyObservers(GameOver.LOSE);
}
else
{
notifyObservers(GameOver.WIN);
}
}
}
}