package fr.lyrgard.hexScape.listener;
import java.util.Iterator;
import com.google.common.eventbus.Subscribe;
import fr.lyrgard.hexScape.HexScapeCore;
import fr.lyrgard.hexScape.bus.CoreMessageBus;
import fr.lyrgard.hexScape.bus.GuiMessageBus;
import fr.lyrgard.hexScape.message.CreateGameMessage;
import fr.lyrgard.hexScape.message.GameCreatedMessage;
import fr.lyrgard.hexScape.message.GameEndedMessage;
import fr.lyrgard.hexScape.message.GameJoinedMessage;
import fr.lyrgard.hexScape.message.GameLeftMessage;
import fr.lyrgard.hexScape.message.GameObservedMessage;
import fr.lyrgard.hexScape.message.GameStartedMessage;
import fr.lyrgard.hexScape.message.JoinGameMessage;
import fr.lyrgard.hexScape.message.LeaveGameMessage;
import fr.lyrgard.hexScape.message.ObserveGameMessage;
import fr.lyrgard.hexScape.message.RestoreGameMessage;
import fr.lyrgard.hexScape.message.StartGameMessage;
import fr.lyrgard.hexScape.model.CurrentUserInfo;
import fr.lyrgard.hexScape.model.IdGenerator;
import fr.lyrgard.hexScape.model.Universe;
import fr.lyrgard.hexScape.model.game.Game;
import fr.lyrgard.hexScape.model.map.Map;
import fr.lyrgard.hexScape.model.player.ColorEnum;
import fr.lyrgard.hexScape.model.player.Player;
import fr.lyrgard.hexScape.model.player.User;
import fr.lyrgard.hexScape.model.room.Room;
import fr.lyrgard.hexScape.service.MarkerService;
import fr.lyrgard.hexscape.client.network.ClientNetwork;
public class GameMessageListener {
private static GameMessageListener instance;
public static void start() {
if (instance == null) {
instance = new GameMessageListener();
CoreMessageBus.register(instance);
}
}
private GameMessageListener() {
}
@Subscribe public void onRestoreGame(RestoreGameMessage message) {
if (HexScapeCore.getInstance().isOnline()) {
ClientNetwork.getInstance().send(message);
} else {
Game game = message.getGame();
String gameId = IdGenerator.getInstance().getNewGameId();
game.setId(gameId);
GameCreatedMessage resultMessage = new GameCreatedMessage(CurrentUserInfo.getInstance().getId(), game);
CoreMessageBus.post(resultMessage);
}
}
@Subscribe public void onCreateGame(CreateGameMessage message) {
if (HexScapeCore.getInstance().isOnline()) {
ClientNetwork.getInstance().send(message);
} else {
String name = message.getName();
Map map = message.getMap();
int playerNumber = message.getPlayerNumber();
String gameId = "1";
Game game = new Game();
game.setId(gameId);
game.setName(name);
game.setMap(map);
game.setPlayerNumber(playerNumber);
for (int i = 1; i <= playerNumber; i++) {
Player player = new Player();
player.setId(Integer.toString(i));
player.setName("Player " + i);
player.setColor(ColorEnum.values()[(i-1) % ColorEnum.values().length]);
game.getPlayers().add(player);
}
GameCreatedMessage resultMessage = new GameCreatedMessage(CurrentUserInfo.getInstance().getId(), game);
CoreMessageBus.post(resultMessage);
}
}
@Subscribe public void onGameCreated(GameCreatedMessage message) {
Game game = message.getGame();
MarkerService.getInstance().normalizeMarkers(game);
Universe.getInstance().getGamesByGameIds().put(game.getId(), game);
GuiMessageBus.post(message);
}
@Subscribe public void onStartGame(StartGameMessage message) {
if (HexScapeCore.getInstance().isOnline()) {
ClientNetwork.getInstance().send(message);
} else {
String userId = message.getUserId();
String gameId = message.getGameId();
GameStartedMessage resultMessage = new GameStartedMessage(userId, gameId);
CoreMessageBus.post(resultMessage);
}
}
@Subscribe public void onGameStarted(GameStartedMessage message) {
String gameId = message.getGameId();
Game game = Universe.getInstance().getGamesByGameIds().get(gameId);
if (game != null) {
game.setStarted(true);
GuiMessageBus.post(message);
}
}
@Subscribe public void onObserveGame(ObserveGameMessage message) {
if (HexScapeCore.getInstance().isOnline()) {
ClientNetwork.getInstance().send(message);
} else {
String userId = message.getUserId();
String gameId = message.getGameId();
GameObservedMessage resultMessage = new GameObservedMessage(userId, gameId);
CoreMessageBus.post(resultMessage);
}
}
@Subscribe public void onGameObserved(GameObservedMessage message) {
String userId = message.getUserId();
String gameId = message.getGameId();
Game game = Universe.getInstance().getGamesByGameIds().get(gameId);
User user = Universe.getInstance().getUsersByIds().get(userId);
if (game != null && user != null) {
user.setGame(game);
GuiMessageBus.post(message);
if (HexScapeCore.getInstance().isOnline()) {
if (CurrentUserInfo.getInstance().getId().equals(userId)) {
if (game.isStarted()) {
GuiMessageBus.post(new GameObservedMessage(userId, game.getId()));
}
}
}
}
}
@Subscribe public void onGameEnded(GameEndedMessage message) {
String gameId = message.getGameId();
Game game = Universe.getInstance().getGamesByGameIds().get(gameId);
if (game != null) {
GuiMessageBus.post(message);
Room room = CurrentUserInfo.getInstance().getRoom();
if (room != null) {
Iterator<Game> it = room.getGames().iterator();
while (it.hasNext()) {
Game roomGame = it.next();
if (roomGame.getId().equals(gameId)) {
it.remove();
break;
}
}
}
Universe.getInstance().getGamesByGameIds().remove(gameId);
}
}
@Subscribe public void onJoinGame(JoinGameMessage message) {
if (HexScapeCore.getInstance().isOnline()) {
ClientNetwork.getInstance().send(message);
} else {
String userId = message.getUserId();
String gameId = message.getGameId();
String playerId = message.getPlayerId();
Game game = Universe.getInstance().getGamesByGameIds().get(gameId);
if (game != null) {
CoreMessageBus.post(new GameJoinedMessage(userId, game, playerId));
}
}
}
@Subscribe public void onGameJoined(GameJoinedMessage message) {
String userId = message.getUserId();
Game game = message.getGame();
String playerId = message.getPlayerId();
User user = Universe.getInstance().getUsersByIds().get(userId);
if (game != null && user != null) {
Player player = game.getPlayer(playerId);
if (player != null) {
player.setUserId(user.getId());
MarkerService.getInstance().normalizeMarkers(game);
user.setGame(game);
user.setPlayer(player);
if (CurrentUserInfo.getInstance().getId().equals(userId)) {
CurrentUserInfo.getInstance().setGame(game);
CurrentUserInfo.getInstance().setPlayer(player);
}
Universe.getInstance().getGamesByGameIds().put(game.getId(), game);
GuiMessageBus.post(message);
if (HexScapeCore.getInstance().isOnline()) {
if (CurrentUserInfo.getInstance().getId().equals(userId)) {
if (game.isStarted()) {
GuiMessageBus.post(new GameStartedMessage(userId, game.getId()));
}
}
}
}
}
}
@Subscribe public void onLeaveGame(LeaveGameMessage message) {
if (HexScapeCore.getInstance().isOnline()) {
ClientNetwork.getInstance().send(message);
} else {
User user = CurrentUserInfo.getInstance();
GameLeftMessage resultMessage = new GameLeftMessage(user.getId(), user.getPlayerId(), user.getGameId());
CoreMessageBus.post(resultMessage);
GameEndedMessage resultMessage2 = new GameEndedMessage(user.getGameId());
CoreMessageBus.post(resultMessage2);
}
}
@Subscribe public void onGameLeft(GameLeftMessage message) {
String userId = message.getUserId();
String gameId = message.getGameId();
String playerId = message.getPlayerId();
Game game = Universe.getInstance().getGamesByGameIds().get(gameId);
if (game != null) {
if (playerId == null) {
game.getObserversIds().remove(userId);
} else {
Player player = game.getPlayer(playerId);
if (player != null && player.getUserId() != null) {
User user = Universe.getInstance().getUsersByIds().get(player.getUserId());
user.setGame(null);
user.setPlayer(null);
player.setUserId(null);
}
}
GuiMessageBus.post(message);
}
}
}