package org.scotlandyard.engine.player;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.scotlandyard.engine.Game;
import org.scotlandyard.engine.GameException;
import org.scotlandyard.engine.Token;
import org.scotlandyard.engine.User;
import org.scotlandyard.engine.boardmap.Coordinate;
import org.scotlandyard.engine.boardmap.Link;
import org.scotlandyard.engine.chat.Chat;
import org.scotlandyard.engine.constants.TransportationMethod;
import org.scotlandyard.impl.engine.GameEngine;
import org.scotlandyard.impl.engine.TokenImpl;
import org.scotlandyard.impl.engine.UserImpl;
/**
* player wrapper class
*
* @author Hussain Al-Mutawa
* @version 1.0
* @since Sun Sep 18, 2011
*/
public abstract class AbstractPlayer extends UserImpl implements Player {
//private transient final String name, email;
/**
* TODO add documentation for this field
*/
private Map<Game,EnumMap<TransportationMethod, Token>> tokens;
/**
* Construct a new player object
*/
public AbstractPlayer(final String name, final String email) {
super(name,email);
tokens=new HashMap<Game,EnumMap<TransportationMethod, Token>>();
}
/**
* TODO add documentation here
* @param user
*/
public AbstractPlayer(final User user) {
this(user.getName(), user.getEmail());
}
@Override
public int compareTo(final Player player) {
return getEmail().compareTo(player.getEmail());
}
// @Override public boolean createGame(Game game) {
// /* ODO */ throw new UnsupportedOperationException("Not supported yet.");
// }
//
// @Override public void endGame(Game game) throws Exception {
// /* ODO */ throw new UnsupportedOperationException("Not supported yet.");
// }
@Override
public List<Chat> getChatHistory(final Player withPlayer) {
/* TODO getChatHistory */
throw new UnsupportedOperationException("Not supported yet.");
}
// @Override
// public String getEmail() {
// return email;
// }
@Override
public Set<Game> getJoinedGames() {
final Set<Game>games = new HashSet<Game>();
for(Game game:GameEngine.instance().getLobby().getAvailableGames()){
if(game.hasPlayer(this.getEmail())){
games.add(game);
}
}
return games;
}
// @Override
// public String getName() {
// return name;
// }
@Override
public int getNumberOfTickets(final Game game,final TransportationMethod transportation) {
return tokens.get(game).get(transportation).getNumberOfTokens();
}
@Override
public abstract Coordinate getPosition(Game game);
@Override
public abstract void setPosition(Game game,Coordinate coordinate);
@Override
public EnumMap<TransportationMethod, Token> getTokens(final Game game){
return tokens.get(game);
}
// @Override public boolean joinGame(Game game) {
// if(this.joinedGames.get(game.getIdentifier())!=null){
// return false;
// }
// this.joinedGames.put(game.getIdentifier(), game);
// return true;
// }
//
// @Override public boolean kickPlayer(Game game, Player player) {
// /* ODO */ throw new UnsupportedOperationException("Not supported yet.");
// }
// @Override public boolean leaveGame(Game game) {
// game.removePlayer(this.getEmail());
// return !game.getPlayers().contains(this);
// }
@Override
public abstract void moveMade(Game game);
@Override
public boolean registerChat(final Chat chat) {
/* ODO */ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public boolean setTokens(final Game game,final TransportationMethod transportation, final int numberOfTickets) {
// numberOfTickets = this.getNumberOfTickets(game, transportationMethod);
// this.getTokens(game).get(transportationMethod).addTicket();
// int temp = this.getNumberOfTickets(game, transportationMethod);
// if(numberOfTickets==temp)
// {
// return false;
// }
// else
// {
// return true;
// }
//if the game has not been registered yet, add it to the hash table
if(this.tokens.get(game)==null){
this.tokens.put(game, new EnumMap<TransportationMethod, Token>(TransportationMethod.class));
}
// create new token and add it
final Token token = new TokenImpl(this,transportation);
token.setNumberOfTickets(numberOfTickets);
this.tokens.get(game).put(transportation, token);
//to make sure we got everything right
final Token tokens = this.tokens.get(game).get(transportation);
boolean result;
if(tokens.getNumberOfTokens()==numberOfTickets){
result = true;
}else{
result = false;
}
return result;
}
@Override
public boolean useTokenToMove(final Game game, final Token token, final Link link) throws GameException {
token.consumeTicket();
//current position
final Coordinate position = this.getPosition(game);
//new position
final Coordinate toPosition = link.getOtherEnd(position);
//set the new position
this.setPosition(game, toPosition);
//trigger the event move is made
moveMade(game);
//if the new position is registered, then everything is fine
return getPosition(game).equals(toPosition);
}
@Override
public String toString() {
return this.getName();
}
}