package com.rzg.zombieland.cliente.meta; import java.util.ArrayList; import java.util.List; import javax.swing.DefaultComboBoxModel; import com.rzg.zombieland.comunes.comunicacion.ProyeccionTablero; import com.rzg.zombieland.comunes.comunicacion.pojo.POJOPartida; import com.rzg.zombieland.comunes.comunicacion.pojo.POJOResultadoRonda; import com.rzg.zombieland.comunes.comunicacion.respuesta.POJOListadoPartidas; /** * Almacena estado que se debe compartir entre pantallas. * @author nicolas * */ public class Estado { public static final DefaultComboBoxModel<String> preguntas = new DefaultComboBoxModel<String> (new String[] { "", "Cual es su color favorito?", "Mejor amigo de la infancia?", "A que escuela primaria fue?", "Nombre de su primer mascota?" }); /** * Interfaz para escuchar cambios de estado del lobby. * @author nicolas * */ public interface EscuchadorEstadoLobby { /** * Se dispara cuando se cambie el estado del lobby. * @param pojo */ public void notificarLobbyActualizado(POJOPartida pojo); } /** * Interfaz para escuchar cambios de estado de listado de partidas. * @author nicolas * */ public interface EscuchadorPartidas { /** * Se dispara cuando se cambie el estado del lobby. * @param respuesta */ public void notificarPartidasActualizadas(POJOListadoPartidas respuesta); } /** * Interfaz para escuchar cambios de estado de tablero. * @author nicolas * */ public interface EscuchadorProyeccion { /** * Se dispara cuando se cambie el estado del tablero. * @param proyeccion */ public void notificarProyeccionActualizada(ProyeccionTablero proyeccion); /** * Se dispara cuando se arranca una nueva partida. * @param espectador */ public void notificarCambioEstadoEspectador(boolean espectador); } /** * Escuchador para los mensajes de chat. * @author nicolas * */ public interface EscuchadorChat { /** * Indica que se recibi� un mensaje de chat. * @param mensaje */ public void recibidoMensaje(String mensaje); } /** * Escuchador para las actualizaciones de puntaje. * @author nicolas * */ public interface EscuchadorPuntaje { /** * Indica que se recibi� una actualizaci�n de puntaje. * @param mensaje */ public void recibidoPuntaje(POJOResultadoRonda puntaje); } private static Estado instancia; private POJOPartida estadoLobby; private String jugador; private List<EscuchadorEstadoLobby> escuchadoresLobby; private List<EscuchadorPartidas> escuchadoresPartidas; private List<EscuchadorProyeccion> escuchadoresProyeccion; private EscuchadorChat escuchadorChat; // True si se est� observando una partida, false de lo contrario. private boolean espectador; private EscuchadorPuntaje escuchadorPuntaje; public Estado() { escuchadoresLobby = new ArrayList<EscuchadorEstadoLobby>(); escuchadoresPartidas = new ArrayList<EscuchadorPartidas>(); escuchadoresProyeccion = new ArrayList<EscuchadorProyeccion>(); estadoLobby = POJOPartida.PARTIDA_VACIA; } /** * @return la instancia de estado. */ public static Estado getInstancia() { if (instancia == null) instancia = new Estado(); return instancia; } /** * Agrega un escuchador de estado de lobby. * @param escuchador */ public void addEscuchadorLobby(EscuchadorEstadoLobby escuchador) { this.escuchadoresLobby.add(escuchador); } /** * Agrega un escuchador de estado de partida. * @param escuchador */ public void addEscuchadorProyeccion(EscuchadorProyeccion escuchador) { this.escuchadoresProyeccion.add(escuchador); } /** * Establece el escuchador de chat. * @param escuchador */ public void setEscuchadorChat(EscuchadorChat escuchador) { this.escuchadorChat = escuchador; } /** * Establece el estado del lobby a partir de su POJO. * @param pojo */ public void setEstadoLobby(POJOPartida pojo) { estadoLobby = pojo; for (EscuchadorEstadoLobby escuchador : escuchadoresLobby) escuchador.notificarLobbyActualizado(pojo); if (pojo.getProyeccion() != null) for (EscuchadorProyeccion escuchador : escuchadoresProyeccion) escuchador.notificarProyeccionActualizada(pojo.getProyeccion()); } /** * Establece el nombre de un jugador. * @param nombreJugador */ public void setNombreJugador(String nombreJugador) { jugador = nombreJugador; } /** * @return el estado del lobby. */ public POJOPartida getEstadoLobby() { return estadoLobby; } /** * @return el nombre del jugador actual. */ public String getNombreJugador() { return jugador; } public void addEscuchadorPartidas(EscuchadorPartidas escuchador) { this.escuchadoresPartidas.add(escuchador); } public void setEscuchadorPuntaje(EscuchadorPuntaje escuchador) { escuchadorPuntaje = escuchador; } public void setListadoPartidas(POJOListadoPartidas listado) { for (EscuchadorPartidas escuchador : escuchadoresPartidas) escuchador.notificarPartidasActualizadas(listado); } public void setEspectador(boolean espectador) { this.espectador = espectador; for (EscuchadorProyeccion escuchador : escuchadoresProyeccion) escuchador.notificarCambioEstadoEspectador(espectador); } public void setProyeccion(ProyeccionTablero proyeccion) { estadoLobby.setProyeccion(proyeccion); for (EscuchadorProyeccion escuchador : escuchadoresProyeccion) escuchador.notificarProyeccionActualizada(proyeccion); } /** * @return true si se est� observando una partida, false de lo contrario. */ public boolean isEspectador() { return espectador; } /** * Indica que se recibi� un mensaje de chat. * @param mensaje */ public void recibidoMensajeChat(String mensaje) { escuchadorChat.recibidoMensaje(mensaje); } /** * Indica que se recibi� una actualizaci�n de puntaje. * @param resultado */ public void recibidoPuntaje(POJOResultadoRonda puntaje) { escuchadorPuntaje.recibidoPuntaje(puntaje); } }