Gameplay
Temática
Referencias
Integrantes
La partida se puede jugar en modo individual o modo cooperativo, en ambos modos se explorara el área jugable a través de una vista cenital. Los jugadores pueden desplazarse, atacar y accionar palancas y otros mecanismos, así como recibir daño por parte de ataques enemigos o del ataque descuidado de otro jugador.
Al principio planteamos el área jugable como un conjunto de salas interconectadas y agrupadas en múltiples zonas. Para avanzar por la zona, los jugadores deberían desbloquear u obtener herramientas o poderes que permitan sortear ciertos obstáculos. Estos obstáculos bloquearían el paso a varias secciones del juego que serían inaccesibles hasta obtener dichas herramientas, ofreciendo una experiencia más o menos lineal en un entorno que hay que explorar. Existiría una zona central que, además de suponer un desafío similar al de las otras zonas, permite navegar entre las demás zonas del juego.
En el juego tal y como está actualmente es solo una de las zonas que habíamos pensado en un principio (las alcantarillas). En ella hay multitud de enemigos que aparecen alentoriamente por el mapa. El jugador deberá enfrentarse a los enemigos que se le interpongan en su camino, o evitarlos, para avanzar.
Además, el jugador deberá desbloquear la parte del mapa que lleva a la meta accionando una palanca. Esto le obligará a recorrer el escenario y enontrarse con más enemigos. La salida es una escalera que desciende, esto viene de nuestro planteamiento inicial en el que el jugador debería descender para enfrentarse a un enemigo más fuerte que los demás y pasar a la siguiente zona.
La cooperación de los jugadores en la partida facilita el avance por el mapa. Los jugadores deberan ayudarse entre sí, ya que hay un mayor número de enemigos repartidos por el mapa en el modo multijugador. Los jugadores pueden ir por separado. Cuando un jugador llega a la meta ganan todos los jugadores de la partida.
La ambientación del juego es urbana y cotidiana. La partida transcurre en una ciudad que ha caído víctima de un suceso paranormal indefinido. Los enemigos a eliminar son elementos del entorno alterados por dicho suceso. Las zonas a explorar son lugares habituales de una ciudad, por ejemplo: un supermercado, una estación de metro, unas alcantarillas, etc. La zona central sería la plaza principal de la ciudad.
El ángulo de visión sería similar a Graveyard Keeper
La estética estaría inspirada en Punch Club
El planteamiento del diseño de nivel para las distintas zonas del juego estarían basadas en juegos como Metroid o Hollow Knight
Se ha añadido el Menú Multijugador, en el que los usuarios que quieren partida multijugador se conectan. Cuando todos estén listos se empieza la partida.
Se ha añadido la pantalla de victoria entre otras cosas.
La clase SocketManager tiene un evento para cuando se establece el socket, otro para cuando se cierra, y otro para cuando recibe un mensaje. Los mensajes se usan de una manera muy concreta, se envían siempre pares así: {operation, value}. Cuando se recibe un mensaje, SocketManager procesa la petición del cliente y la respuesta del server. Las peticiones del cliente pueden ser las siguientes operaciones: LINK_USER, SYNC_NPC, SYNC_PLAYER, ENTER_LOBBY, EXIT_LOBBY, LOBBY_START. El servidor también puede mandar operaciones de ese tipo al cliente que sea necesario. Las opreaciones del server que los clientes pueden entender: SYNC_NPC, SYNC_PLAYER, SET_MOD, START_GAME. Esto se procesa en la clase Connection.
LINK_USER (Un jugador se conecta): El procedimiento para conectar a un jugador es el siguiente: -El jugador pone nombre de usuario y contraseña, lo manda al servidor para iniciar sesión o crear su cuenta (con api rest). -El servidor dice si es válido o no. -Si no es válido el servidor le envía una notificación indicando la razón por la que no es válido. -Si está bien, el cliente abre el websocket. -Con el websocket abierto, le manda al server una operación LINK_USER. -La operación LINK_USER enlaza al usuario creado anteriormente con api rest a la sesión de websocket que ha enviado eso. -El usuario no está en ningún lobby cuando entra y en este punto puede intentar conectarse a uno. Pero solo puede conectarse a los que el servidor indica que están libres.
ENTER_LOBBY: Si la opción de conectarse a un lobby está disponible y el jugador se conecta, el cliente envia esta operación al servidor indicando cual es el lobby solicitado. El servidor asociará el usuario que ha enviado esa operación al lobby y, por tanto, empezará a recibir los datos emitidos a través del lobby, como por ejemplo el chat. Con EXIT_LOBBY se sale del lobby. El primer usuario en entrar en un lobby es considerado como el moderador de ese lobby. Esto implica que es el cliente que lleva el procesamiento de los npcs. Si el usuario abandona la partida por la razón que sea, el status de moderador se transfiere a otro usuario del mismo lobby al azar. El servidor notifica a un cliente que es el moderador mediante la operación SET_MOD. Los juagadores no necesitan saber cual es el moderador para evitar trampas.
SYNC_PLAYER (Se sincronizan los jugadores): La clase player está ejecutando cada intervalo de 50 ms una función que envía una operación SYNC_PLAYER(operación de servidor) al server con los datos relevantes (la posición, la animación, etc) y el server manda esos datos (en los que va incluido el usuario que lo ha mandado) a todos los demás clientes en otra operación SYNC_PLAYER(operación de cliente). En cada cliente hay una instancia de remoteplayer por cada usuario conectado en el lobby (aparte del mismo), cada remoteplayer guarda el uuid del usuario que representa. Así, cuando un cliente recibe una operación SYNC_PLAYER, le asigna los datos al remoteplayer que corresponda. El server debe confirmar que a un remoteplayer no le queda vida para que el cliente lo de por muerto. No se puede morir automaticamente cuando su vida llega a 0.
SYNC_NPC (Se diferencia al player que usa el usuario de los que no puede controlar): La clase npcsync se encarga de registrar quién es un npc sincronizable y cuándo hay que hacerlo. Las clases que se pueden registrar como npc, que tienen un senddata y un receivedata, deben implementar la interfaz inpcsyncable, y estas clases ejecutan una función npcsync.register(this) para registrarse como npcs. npcsync se activa cuendo el cliente recibe la operación START_GAME y se desactiva cuando la conexión se cierra (por victoria, derrota o error de conexión) y cuando se desactiva, los npc sincronizados se dan de baja para que puedan eliminarse sin errores. Mientras dure el juego, npcsync se encarga de enviar los datos mediante la función senddata y usando la operación de servidor SYNC_NPC.
Para compilar el proyecto, habría que instalar jdk y maven, configurar la herramienta spring-boot y ejecutar el comando mvn clean package en la carpeta del proyecto. Para ejecutar el jar, habría que entrar en la carpeta del proyecto y ejecutar el comando java -jar Sweeper-0.3.jar. Hace falta instalar en la máquina Java 8. Para el cliente, se usa la url que sale en el terminal y el server.
El juego no puede ejecutarse correctamente si la pantalla está minimizada o en una pestaña de fondo. La tecla F2 muestra información de depuración, a saber los targets de las entidades y las rutas de las entidades que utilicen IA. El juego te avisa si se pierde la conexión con el servidor mientras se está jugando, pero no se plantea la posiblidad de seguir jugando en este punto porque el cliente no se puede seguir descargando los assets necesarios para el juego.
WASD: moverse por el escenario. R: atacar. E: activar palanca. F2: depuración.
Al iniciar el juego se ve la pantalla inicial, la cual solicita una tecla para empezar:
Tras pulsar un tecla, la pantalla de inicio nos lleva al menu inicial que nos deja elegir el modo de juego. Options no esta implementada:
Si en el menú eliges Solo, se inicia una partida con un solo jugador:

Si en el menú eliges Coop, te manda a un menú en el que esperas hasta que los demás usuarios estén listos.
Primero, el usuario debe iniciar sesión (si otro usuario ya ha iniciado la misma sesión no le dejará entrar):
Después el usuario se conecta en un lobby que no esté lleno (con menos de 4 jugadores) u ocupado (los usuarios están "Playing"):
Tras elegir un lobby se puede ver acceder al chat y, cuando todos los jugadores del lobby esten listos(aparece con un tick), iniciar la partida:
Cuando todos los usuarios pulsen Ready (estén listos), se inicia una partida con hasta 4 jugadores:
En Coop hay más enemigos para que cooperen los jugadores.
Al morir el jugador local se acaba la partida y te lleva a la pantalla Game Over:

Al ganar se acaba la partida y te lleva a la pantalla Victory (en Coop solo uno necesita llegar a la meta para que todos ganen):
Decidimos que al ganar o al perder se cierra la sesión del usuario.
En caso de que se pierda la conexión con el servidor te lleva a la siguiente pantalla:
-
Nombre y Apellidos: Pablo Alconchel Palma
Correo universidad: [email protected]
Cuenta Github: https://github.com/Poxterx -
Nombre y Apellidos: Raquel Pizarro Expósito
Correo universidad: [email protected]
Cuenta Github: https://github.com/RaquelURJC -
Nombre y Apellidos: Carlos González Cruz
Correo universidad: [email protected]
Cuenta Github: https://github.com/CarlosGonzalezCruz -
Nombre y Apellidos: Xabier Villanueva Loureiro
Correo universidad: [email protected]
Cuenta Github: https://github.com/Voidtekvla
Link Trello: https://trello.com/b/bTIkqQ83/game-de-jer


