Diseño de entrega 3 - PabloFederico/template-tp-grupal GitHub Wiki

El diseño de la entrega 3 se detalla a continuacion:

Engine

Containers y Commands

Se cuenta con dos componentes basicos: Containers y Commands.

Los Containers son las entidades del juego, cada Container tiene un identificador y puede contener a otros Containers.

Por otro lado, los Commands son las acciones del juego, además de tener un identificador, especifican que pasará cuando se los ejecute. Estos Commands modifican a los Containers según sea necesario, para especificar este comportamiento lo que decidimos es hacer uso de funciones lambdas de la siguiente manera: Al crear el juego, es necesario crear los Commands y a cada uno es posible pasarle una función lambda con su comportamiento. Luego, al recibir un mensaje de algún jugador, el engine se encarga de ver si el contenido de ese mensaje corresponde al identificador de algún comando, y de ser asi, se ejecuta dicha funcion lambda.

Es posible que el comportamiento de una acción dependa del jugador que la ejecute, o que esta quiera hacer alguna modificacion sobre ese jugador. Para lograr esto, lo que hicimos fue crear un Command particular llamado PlayerCommand, al cual al ejecutarlo se le pasa como parametro el jugador que la accionó, de esta manera, es posible accederlo al definir la funcion lambda. Mas sobre commands

Multiples jugadores

El engine permite agregar o remover jugadores en cualquier momento del juego. Al agregar un jugador, este se guarda en un array interno y se agrega un nuevo Container al juego en la posicion que se especifico como inicial (esta posicion tambien es un Container).

Este Container perteneciente al jugador siempre tendra un identificador del formato "player [ID]" y permenacerá en el juego, hasta que el jugador se retire. Al ser un Container, esto posibilita que los jugadores interactuen entre ellos de la misma forma que lo harían con objetos del juego, por ejemplo, al ejecutar el comando look arround, se listan todos los jugadores y objetos presentes en esa ubicacion.

Finalmente, es posible limitar la cantidad de jugadores que pueden estar jugando consecutivamente, si se desea que el juego sea singleplayer, basta con poner a un jugador como maximo.

Eventos automáticos temporalizados

[Documentacion eventos automaticos] (https://github.com/PabloFederico/template-tp-grupal/wiki/Entrega-3--Dise%C3%B1o-acciones-automaticas)


Server

El server cuenta con un thread principal el cual espera el input del administrador para la carga o descarga de juegos. Al cargarse un juego ingresando load game X, se crea un nuevo GameThread para ese juego. Este GameThread, escucha y acepta en un puerto determinado connecciones entrantes de los clientes. Al conectarse un cliente, se crea un PlayerConnection con un id único y se agrega un nuevo personaje al juego. Este PlayerConnection se utiliza para el envio y recepcion de mensajes con ese único cliente y una vez terminada la conección, se destruye.