package fr.lyrgard.hexScape.listener; import java.util.UUID; 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.ErrorMessage; import fr.lyrgard.hexScape.message.MarkerPlacedMessage; import fr.lyrgard.hexScape.message.MarkerRemovedMessage; import fr.lyrgard.hexScape.message.MarkerRevealedMessage; import fr.lyrgard.hexScape.message.PlaceMarkerMessage; import fr.lyrgard.hexScape.message.RemoveMarkerMessage; import fr.lyrgard.hexScape.message.RevealMarkerMessage; import fr.lyrgard.hexScape.model.CurrentUserInfo; import fr.lyrgard.hexScape.model.Universe; import fr.lyrgard.hexScape.model.card.Army; import fr.lyrgard.hexScape.model.card.CardInstance; import fr.lyrgard.hexScape.model.game.Game; import fr.lyrgard.hexScape.model.marker.HiddenMarkerInstance; import fr.lyrgard.hexScape.model.marker.MarkerDefinition; import fr.lyrgard.hexScape.model.marker.MarkerInstance; import fr.lyrgard.hexScape.model.marker.MarkerType; import fr.lyrgard.hexScape.model.marker.RevealableMarkerInstance; import fr.lyrgard.hexScape.model.marker.StackableMarkerInstance; import fr.lyrgard.hexScape.model.player.Player; import fr.lyrgard.hexScape.service.MarkerService; import fr.lyrgard.hexscape.client.network.ClientNetwork; public class MarkerMessageListener extends AbstractMessageListener { private static MarkerMessageListener instance; public static void start() { if (instance == null) { instance = new MarkerMessageListener(); CoreMessageBus.register(instance); } } public static void stop() { if (instance != null) { CoreMessageBus.unregister(instance); instance = null; } } private MarkerMessageListener() { } @Subscribe public void onPlaceMarkerMessage(PlaceMarkerMessage message) { if (HexScapeCore.getInstance().isOnline()) { ClientNetwork.getInstance().send(message); } else { String cardId = message.getCardId(); String markerId = UUID.randomUUID().toString(); int number = message.getNumber(); String markerTypeId = message.getMarkerTypeId(); String hiddenMarkerTypeId = message.getHiddenMarkerTypeId(); MarkerPlacedMessage resultMessage = new MarkerPlacedMessage(CurrentUserInfo.getInstance().getPlayerId(), cardId, markerId, markerTypeId, hiddenMarkerTypeId, number); CoreMessageBus.post(resultMessage); } } @Subscribe public void onMarkerPlaced(MarkerPlacedMessage message) { String playerId = message.getPlayerId(); String cardId = message.getCardId(); String markerId = message.getMarkerId(); String markerTypeId = message.getMarkerTypeId(); int number = message.getNumber(); String hiddenMarkerTypeId = message.getHiddenMarkerTypeId(); String gameId = CurrentUserInfo.getInstance().getGameId(); Game game = Universe.getInstance().getGamesByGameIds().get(gameId); if (game == null) { CoreMessageBus.post(new ErrorMessage(playerId, "Unable to find game " + gameId)); return; } Player player = game.getPlayer(playerId); if (player == null) { CoreMessageBus.post(new ErrorMessage(playerId, "Unable to find player " + playerId)); return; } Army army = player.getArmy(); if (army == null) { CoreMessageBus.post(new ErrorMessage(playerId, "Unable to find army for player " + playerId)); return; } CardInstance card = army.getCard(cardId); if (card == null) { CoreMessageBus.post(new ErrorMessage(playerId, "Unable to find card " + cardId + " for player " + playerId + " in game " + gameId)); return; } MarkerDefinition markerDefinition = MarkerService.getInstance().getMarkersByIds().get(markerTypeId); if (markerDefinition == null) { CoreMessageBus.post(new ErrorMessage(playerId, "Unable to find marker type " + markerTypeId)); return; } MarkerInstance marker = MarkerService.getInstance().getNewMarkerInstance(markerTypeId, markerId, number, hiddenMarkerTypeId); if (marker != null) { card.addMarker(marker); } GuiMessageBus.post(message); } @Subscribe public void onRemoveMarkerMessage(RemoveMarkerMessage message) { if (HexScapeCore.getInstance().isOnline()) { ClientNetwork.getInstance().send(message); } else { String cardId = message.getCardId(); String markerId = message.getMarkerId(); int number = message.getNumber(); MarkerRemovedMessage resultMessage = new MarkerRemovedMessage(CurrentUserInfo.getInstance().getPlayerId(), cardId, markerId, number); CoreMessageBus.post(resultMessage); } } @Subscribe public void onMarkerRemoved(MarkerRemovedMessage message) { String playerId = message.getPlayerId(); String cardId = message.getCardId(); String markerId = message.getMarkerId(); int number = message.getNumber(); String gameId = CurrentUserInfo.getInstance().getGameId(); Game game = Universe.getInstance().getGamesByGameIds().get(gameId); if (game == null) { CoreMessageBus.post(new ErrorMessage(playerId, "Unable to find game " + gameId)); return; } Player player = game.getPlayer(playerId); if (player == null) { CoreMessageBus.post(new ErrorMessage(playerId, "Unable to find player " + playerId)); return; } Army army = player.getArmy(); if (army == null) { CoreMessageBus.post(new ErrorMessage(playerId, "Unable to find army for player " + playerId)); return; } CardInstance card = army.getCard(cardId); if (card == null) { CoreMessageBus.post(new ErrorMessage(playerId, "Unable to find card " + cardId + " for player " + playerId + " in game " + gameId)); return; } for (MarkerInstance marker : card.getMarkers()) { if (marker.getId().equals(markerId)) { MarkerDefinition markerDefinition = MarkerService.getInstance().getMarkersByIds().get(marker.getMarkerDefinitionId()); if (markerDefinition == null) { CoreMessageBus.post(new ErrorMessage(playerId, "Unable to find marker type " + markerId)); return; } if (markerDefinition.getType() == MarkerType.STACKABLE) { int currentNumber = ((StackableMarkerInstance)marker).getNumber(); if (currentNumber <= number) { card.getMarkers().remove(marker); } else { ((StackableMarkerInstance)marker).setNumber(currentNumber - number); } } else { card.getMarkers().remove(marker); } break; } } GuiMessageBus.post(message); } @Subscribe public void onRevealMarkerMessage(RevealMarkerMessage message) { if (HexScapeCore.getInstance().isOnline()) { ClientNetwork.getInstance().send(message); } else { String cardId = message.getCardId(); String markerId = message.getMarkerId(); String gameId = CurrentUserInfo.getInstance().getGameId(); String playerId = CurrentUserInfo.getInstance().getPlayerId(); Game game = Universe.getInstance().getGamesByGameIds().get(gameId); if (game == null) { CoreMessageBus.post(new ErrorMessage(playerId, "Unable to find game " + gameId)); return; } Player player = game.getPlayer(playerId); if (player == null) { CoreMessageBus.post(new ErrorMessage(playerId, "Unable to find player " + playerId)); return; } Army army = player.getArmy(); if (army == null) { CoreMessageBus.post(new ErrorMessage(playerId, "Unable to find army for player " + playerId)); return; } CardInstance card = army.getCard(cardId); if (card == null) { CoreMessageBus.post(new ErrorMessage(playerId, "Unable to find card " + cardId + " for player " + playerId + " in game " + gameId)); return; } for (MarkerInstance marker : card.getMarkers()) { if (marker.getId().equals(markerId)) { if (!(marker instanceof HiddenMarkerInstance)) { return; } String hiddenMarkerTypeId = ((HiddenMarkerInstance)marker).getHiddenMarkerDefinitionId(); MarkerRevealedMessage resultMessage = new MarkerRevealedMessage(playerId, cardId, markerId, hiddenMarkerTypeId); CoreMessageBus.post(resultMessage); } } } } @Subscribe public void onMarkerRevealed(MarkerRevealedMessage message) { String playerId = message.getPlayerId(); String cardId = message.getCardId(); String markerId = message.getMarkerId(); String hiddenMarkerTypeId = message.getHiddenMarkerTypeId(); String gameId = CurrentUserInfo.getInstance().getGameId(); Game game = Universe.getInstance().getGamesByGameIds().get(gameId); if (game == null) { CoreMessageBus.post(new ErrorMessage(playerId, "Unable to find game " + gameId)); return; } CardInstance card = game.getCard(cardId); if (card == null) { CoreMessageBus.post(new ErrorMessage(playerId, "Unable to find card " + cardId + " in game " + gameId)); return; } for (MarkerInstance marker : card.getMarkers()) { if (marker.getId().equals(markerId)) { if (!(marker instanceof HiddenMarkerInstance)) { return; } RevealableMarkerInstance revealedMarker = new RevealableMarkerInstance(hiddenMarkerTypeId); revealedMarker.setId(markerId); card.getMarkers().remove(marker); card.addMarker(revealedMarker); GuiMessageBus.post(message); break; } } } }