package fr.lyrgard.hexScape.server.listener; import java.io.IOException; import com.google.common.eventbus.Subscribe; import fr.lyrgard.hexScape.bus.CoreMessageBus; import fr.lyrgard.hexScape.message.ArmyLoadedMessage; import fr.lyrgard.hexScape.message.CreateGameMessage; import fr.lyrgard.hexScape.message.ErrorMessage; 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.GameMessagePostedMessage; 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.IdGenerator; import fr.lyrgard.hexScape.model.Universe; import fr.lyrgard.hexScape.model.card.Army; 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.server.service.GameService; import fr.lyrgard.hexscape.server.network.ServerNetwork; 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) { Game game = message.getGame(); String userId = message.getSessionUserId(); String gameId = IdGenerator.getInstance().getNewGameId(); game.setId(gameId); game.setStarted(false); User user = Universe.getInstance().getUsersByIds().get(userId); if (user != null) { Universe.getInstance().getGamesByGameIds().put(gameId, game); user.getRoom().getGames().add(game); GameCreatedMessage resultMessage = new GameCreatedMessage(user.getId(), game); ServerNetwork.getInstance().sendMessageToRoom(resultMessage, user.getRoom().getId()); } } @Subscribe public void onCreateGame(CreateGameMessage message) { String userId = message.getSessionUserId(); String name = message.getName(); Map map = message.getMap(); int playerNumber = message.getPlayerNumber(); User user = Universe.getInstance().getUsersByIds().get(userId); if (user != null && user.getRoom() != null) { String gameId = IdGenerator.getInstance().getNewGameId(); 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(IdGenerator.getInstance().getNewPlayerId()); player.setName("PLAYER " + i); player.setColor(ColorEnum.values()[(i-1) % ColorEnum.values().length]); game.getPlayers().add(player); } Universe.getInstance().getGamesByGameIds().put(gameId, game); user.getRoom().getGames().add(game); GameCreatedMessage resultMessage = new GameCreatedMessage(user.getId(), game); ServerNetwork.getInstance().sendMessageToRoom(resultMessage, user.getRoom().getId()); } } @Subscribe public void onStartGame(StartGameMessage message) { String userId = message.getSessionUserId(); String gameId = message.getGameId(); User user = Universe.getInstance().getUsersByIds().get(userId); if (user != null) { Game game = user.getGame(); if (user != null && user.getRoom() != null && game != null) { if (!game.isStarted()) { game.setStarted(true); GameStartedMessage resultMessage = new GameStartedMessage(user.getId(), gameId); ServerNetwork.getInstance().sendMessageToRoom(resultMessage, user.getRoom().getId()); } else { ErrorMessage resultMessage = new ErrorMessage(user.getId(), "Unable to start the game : the game has already started"); ServerNetwork.getInstance().sendMessageToUser(resultMessage, user.getId()); } } } } @Subscribe public void onObserveGame(ObserveGameMessage message) { String userId = message.getSessionUserId(); String gameId = message.getGameId(); User user = Universe.getInstance().getUsersByIds().get(userId); Game game = Universe.getInstance().getGamesByGameIds().get(gameId); if (user != null && game != null && user.getRoom() != null ) { if (game.isStarted()) { user.setGame(game); game.getObserversIds().add(userId); GameObservedMessage resultMessage = new GameObservedMessage(user.getId(), gameId); ServerNetwork.getInstance().sendMessageToRoom(resultMessage, user.getRoom().getId()); } else { ErrorMessage resultMessage = new ErrorMessage(user.getId(), "Unable to observe the game : the game has not started yet"); ServerNetwork.getInstance().sendMessageToUser(resultMessage, user.getId()); } } } @Subscribe public void onJoinGame(JoinGameMessage message) { String userId = message.getSessionUserId(); String gameId = message.getGameId(); String playerId = message.getPlayerId(); User user = Universe.getInstance().getUsersByIds().get(userId); Game game = Universe.getInstance().getGamesByGameIds().get(gameId); if (user != null && game != null) { Player player = game.getPlayer(playerId); if (user.getPlayer() == null && player.getUserId() == null) { player.setUserId(user.getId()); user.setPlayer(player); user.setGame(game); try { for (User userInRoom : user.getRoom().getUsers()) { Game clone = Game.fromJson(game.toJson()); GameService.removeUnseeableHiddenMarkersInfos(clone, userInRoom.getId()); GameJoinedMessage resultMessage = new GameJoinedMessage(user.getId(), clone, player.getId()); ServerNetwork.getInstance().sendMessageToUser(resultMessage, userInRoom.getId()); } } catch (IOException e) { e.printStackTrace(); } } else { if (user.getPlayer() != null) { ErrorMessage resultMessage = new ErrorMessage(playerId, "Unable to join the game : you already joined another game"); ServerNetwork.getInstance().sendMessageToUser(resultMessage, userId); } else if (player.getUserId() != null) { ErrorMessage resultMessage = new ErrorMessage(playerId, "Unable to join the game as player " + player.getName() + " : another user already took this player"); ServerNetwork.getInstance().sendMessageToUser(resultMessage, userId); } } } } @Subscribe public void onLeaveGame(LeaveGameMessage message) { String userId = message.getSessionUserId(); User user = Universe.getInstance().getUsersByIds().get(userId); if (user != null) { Game game = user.getGame(); if (game != null) { String playerId = null; if (user.getPlayer() != null && game.getPlayers().contains(user.getPlayer())) { Player player = user.getPlayer(); playerId = player.getId(); player.setUserId(null); user.setPlayer(null); } else if (game.getObserversIds().contains(userId)) { game.getObserversIds().remove(userId); } user.setGame(null); GameLeftMessage resultMessage = new GameLeftMessage(user.getId(), playerId, game.getId()); ServerNetwork.getInstance().sendMessageToRoom(resultMessage, user.getRoom().getId()); if (game.getFreePlayers().size() == game.getPlayers().size()) { user.getRoom().getGames().remove(game); Universe.getInstance().getGamesByGameIds().remove(game.getId()); GameEndedMessage returnMessage2 = new GameEndedMessage(game.getId()); ServerNetwork.getInstance().sendMessageToRoom(returnMessage2, user.getRoom().getId()); } } } } @Subscribe public void onMessagePosted(GameMessagePostedMessage message) { String userId = message.getSessionUserId(); String messageContent = message.getMessage(); User user = Universe.getInstance().getUsersByIds().get(userId); if (user != null && user.getGameId() != null) { ServerNetwork.getInstance().sendMessageToGame(new GameMessagePostedMessage(userId, messageContent), user.getGameId()); } } @Subscribe public void onArmyLoaded(ArmyLoadedMessage message) { String userId = message.getSessionUserId(); String playerId = message.getPlayerId(); Army army = message.getArmy(); User user = Universe.getInstance().getUsersByIds().get(userId); if (user != null && user.getGameId() != null) { Player owner = user.getGame().getPlayer(playerId); if (owner != null) { owner.setArmy(army); ServerNetwork.getInstance().sendMessageToGame(message, user.getGameId()); } } } }