package client;
import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import slimpleslickgame.Game;
import util.Logger;
/**
* Contains events for all players currently in game.
*
* @author timdolck
*
*/
public class GameStatsEvents {
private ConcurrentMap<Byte, Queue<GameEvent>> events;
private Game game;
private byte localId = -1;
public GameStatsEvents(Game game){
events = new ConcurrentHashMap<Byte, Queue<GameEvent>>();
this.game = game;
}
public GameEvent pop(byte id) {
Queue<GameEvent> queue = events.get(id);
if (queue == null) {
throw new IllegalArgumentException("Id does not exist, id: " + id);
}
if(queue.isEmpty()){
return null;
}
return queue.poll();
}
public void put(byte id, GameEvent event){
Queue<GameEvent> queue = this.events.get(id);
if(queue == null){
throw new IllegalArgumentException("Id does not exist, id: " + id);
}
queue.offer(event);
}
public boolean addOpponentPlayer(byte id){
if(!events.containsKey(id) && !game.isStarted()){
events.put(id, new LinkedList<GameEvent>());
game.addOpponentPlayer(id);
return true;
}
//TODO: handle rejected join
return false;
}
public boolean addLocalPlayer(byte id) {
if(!events.containsKey(id) && !game.isStarted()){
for(byte i = 1; i < id;i++){
addOpponentPlayer(i);
}
events.put(id, new LinkedList<GameEvent>());
game.addLocalPlayer(id);
this.localId = id;
return true;
}
//TODO: handle rejected join
return false;
}
public boolean removePlayer(byte id) {
if(!events.containsKey(id)){
game.removePlayer(id);
}
return false;
}
public void removeLocalPlayer() {
if(localId > -1)
this.removePlayer(localId);
}
public void startGame() {
game.startGame();
}
public byte getLocalID(){
return this.localId;
}
}