Un Simple Servidor de Juegos

Desde hace unos meses, vengo pensando en desarrollar un servidor simple de juegos, donde el cliente puede ser implementando en varias tecnologías, en especial en el browser. Mi idea es que el servidor pudiera configurarse para distintos juegos. Cada uno de los juegos a definir y configurar tendría:

- Un solo jugador

- El juego tiene un estado

Es decir, un jugador tiene un juego asociado, y va operando sobre el estado del juego, tipo Farmville. No quiero encarar juego de tiempo real o juego multijugador. Para que no sea siempre el mismo juego, pienso implementar lo básico, y que se pueda configurar, logrando así distintos tipos de juegos. Cada tipo de juego podría manejar:

- Uno o varios mundos (en principio de dos dimensiones)

- En cada celda del mundo, podría haber elementos. Por ejemplo, el suelo del elemento (como en una celda de Farmville)

- El jugador tiene a su disposición distintos verbos/comandos/herramientas.

- Puede aplicar una herramienta o verbo a una celda. El estado del juego determinará si es válida esa acción. Por ejemplo, siguiendo con la idea de un Farmville simple, el jugador puede decidir arar una parcela (celda, cambiar el elemento suelo) pero el estado del juego se lo impide porque no tiene el suficiente puntaje, o porque la celda está ocupada y no es arable.

- Tener cero, uno o varios valores (puntajes, acumulación de distintas monedas/fuerzas)

- Tener cero, uno o varias colecciones (como un “bag” o inventario, cada una con un nombre)

- El servidor se encarga de procesar las acciones del cliente, validarlas, y cambiar el estado.

- El programa cliente podría mostrar el estado de distintas maneras. Me imagino un cliente HTML5/Canvas que muestre una porción del mundo en dos dimensiones, y otro que lo muestre en isométrico

- Los elementos gráficos se pueden configurar por tipo de juego y por tipo de cliente (no es lo mismo a mostrar en el mundo dos dimensiones, que en un cliente con mundo isométrico).

- Las reglas y acciones del juego (como la regla que determina si se puede aplicar el verbo “arar” a una celda o no; o la acción “arar” que decrementa un puntaje y cambia el elemento suelo de una celda), deberían poder configurarse. Pienso en un simple lenguaje de scripting, pero primero, usaría javascript cargado dinámicamente, en el cliente y en el servidor.

- A decidir: serialización del estado (podría ser un NoSql, un blob storage en la nube, etc)

- Trataría en algún momento de usar autenticación social (Facebook, Twitter, etc…) para que el jugador comience a jugar.

El principal lenguaje de implementación sería Javascript, en el cliente y el servidor, con lo que seguramente empezaré usando Node.js cuando llegue a la parte de programar el servidor. Pero podría adoptar en algún momento otro lenguaje y otra tecnología para el servidor. Todo esto quiero armarlo con “baby steps”, e irme adaptando a cualquier “feedback” que reciba.

- Experimentos en el cliente, como manejo de canvas, animación, alguna librería auxiliar.

- Un juego no configurable (es decir, fijo, predeterminado), con estado volátil, en el cliente.

- Un juego no configurable, con estado volátil, pero con cliente y servidor. Es decir, cada acción pedida por el cliente, se envía al servidor y éste responde.

- Un juego no configurable, con lógica en el cliente, replicada en el servidor. El servidor revalida las acciones, y puede interrumpir al cliente si ve que alguna operación no es válida. Esto aceleraría la experiencia del jugador con el programa cliente (cada acción se procesa ahí, sin esperar al servidor; al servidor se envía la acción en paralelo, para validarla) e impediría que el programa cliente fuera manipulado para permitir operaciones no válidas.

- Juego configurable: las reglas, el estado inicial del mundo, las acciones posibles, se podrían configurar, desde programas javascript, archivos json, o pequeños programas/rutinas en un lenguaje de scripting neutro y controlado.

- Juego configurable, con estado no volátil, y autenticación del jugador. Sería el primer paso para poder ofrecerlo como servicio. Pienso que gran parte del desarrollo de un juego de este tipo es la idea, las reglas, la parte gráfica, la música, la animación, la adaptación a distintos clientes. Con el programa que quiero ir armando, todo eso es configurable, lo que permitiría a otros armar sus propios juegos simples sin necesidad de adaptar código o escribir todo desde cero. Quisiera tomar ya ese nivel como un servicio que resuelva un problema, y explotarlo comercialmente. Una especie de “your game as a service” :-) Estoy trabajando con gente que sabe más que yo del tema emprender y diseño, para conseguir un “Minimal Viable Product”.

He visto que hay ideas más avanzadas que éstas, ya implementadas. Pero me gusta explorar por mí mismo, viendo qué es lo que se puede hacer fácil, qué es lo que se complica, y tratando de agregar el valor de la abstracción: descubrir los elementos genéricos que están por debajo de toda una clase de juegos. Como siempre, estos experimentos quedarán en mi cuenta de Github, ya hoy empecé a jugar con canvas :-). Si puedo, escribiré sobre la experiencia, pero no prometo nada. Ya el código será bastante evidencia. Temas para más adelante: 3 dimensiones, WebGL, ¿un Minecraft?

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

This entry was posted in 14005, 15035, 15550, 16105. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>