Ya estoy de nuevo trabajando en el proyecto después de una larga pausa, pero con fuerzas renovadas. He montado el circuito del tablero Helvetios sobre un entrenador que hice hace tiempo: un maletín con una RaspberryPi, una pantalla LCD, unas baterías y un sistema de fuentes de alimentación. De esta forma puedo desarrollar el software de control del tablero sin necesidad de un PC. El proyecto de este maletín lo puedes consultar en Hackaday.
En este entrenador estoy desarrollando la aplicación GamMa (Game Master) que conecta con el tablero. Es una aplicación en C++, no porque sea especialmente necesario sino como una forma de mejorar en este lenguaje que no suelo usar demasiado en mis proyectos, se podría hacer en C o Python sin problemas.
Esta aplicación se encargará de comunicar con el tablero y servir de interfaz entre el jugador y el ‘Director de juego’ virtual. Este director de juego será el código del programa que irá guiando al jugador a las acciones a realizar en las fases de cada turno (mover, defender, atacar, recolectar, minar, comerciar, etc…) y mostrará los resultados de esas acciones. Esto lo hará usando una pequeña pantalla donde mostrará las opciones de cada fase y mostrando en el tablero iluminando las celdas afectadas que rango, dirección u objetivo que afecta a la acción seleccionada. El jugador, además de poder seleccionar la acción a realizar mediante unos botones de selección, de aceptar y cancelar, dispone de un navegador en forma de 6 botones que permiten seleccionar el rango o dirección de esa acción. El interfaz de jugador simplificado sería tal que así:
Por ahora a día de hoy esta aplicación solo comunica con el tablero por USB, siendo capaz de controlar el color de las celdas y leer si hay una pieza conectada. Se encargará además de gestionar el flujo del juego entre los varios jugadores y decidir el resultado de las acciones seleccionadas por cada jugador en base a unas reglas preestablecidas, ponderando por parámetros de cada pieza/jugador como velocidad, energía, fuerza, rango, escudo, capacidad de transporte, precios de materiales, etc….
Se pretende que todo el texto, acciones y reglas sean programables y editables de forma externa al código, de modo que las partidas puedan ser totalmente adaptadas a una historia y convertir el tablero en un campo de juego colaborativo o de batalla según se establezca en la configuración por el usuario del tablero sin tener conocimientos de programación. De esta forma podremos establecer múltiples juegos en cada tablero, cambiando totalmente la historia y los objetivos del juego, pudiendo ser un juego de minado de asteroides, recolección de recursos, batallas de tanques, naves, barcos, soldados, orcos, marines espaciales…, o simplemente juegos de lógica abstractos o puzzles. Todo queda en mi habilidad a la hora de programar las lógicas de juego y el sistema de edición de menús, fases y reglas.
El código de esta aplicación usa la librería HidAPI para comunicar con el tablero, con una velocidad más que aceptable para la aplicación. El microcontrolador STM32F103 es capaz de gestionar una conexión USB FS de 12Mbits, pero en el protocolo USB hay una gran cantidad de overhead y la velocidad efectiva queda reducida considerablemente. Igualmente, según las pruebas es más que suficiente para transmitir una actualización del estado de las celdas. Las animaciones serán programadas y se ejecutarán del lado del microcontrolador, quedando libre las comunicaciones para actualizaciones de estados (color y animación de la celda, detección de pieza en cada celda). Esta aplicación estará disponible en mi Github mas adelante, para que pueda ser usada por cualquiera como base para desarrollar otros interfaces o modificarla para incluir otras funcionalidades.
La representación del interfaz está realizada con GTK3, que es lo suficientemente ligero para ejecutarse en cualquier sistema, así como el código en C++ también será lo suficientemente rápido sin necesitar mucha capacidad de proceso o memoria, si se desarrollase en Python o QT seguramente el consumo de recursos sea mayor. Se desarrollará un interfaz sencillo en GTK para que se pueda conectar el tablero a cualquier PC con linux o sistema embebido tipo Raspberry, pero el objetivo es recrear el interfaz por hardware para cada jugador del tablero. Esto es: varias pantallas OLED de 128×64 pixeles en principio, si es requerido se usará una mayor, una botonera de navegación por menús y tablero, una barra led que identifique el turno o estado de cada jugador y unos leds que identifiquen en que fase de su turno se encuentra:
De esta forma el tablero es independiente de un ordenador, y usando un sistema embebido de bajos recursos como la Raspberry Pi Zero 2W sería suficiente para controlar varios de estos interfaces de jugador para un mismo tablero. Y con un desarrollo más avanzado, este sistema embebido puede ejercer como rival para poder jugar partidas en solitario, y conectarse a internet para poder conectar varios tableros o jugar partidas remotas con otros jugadores. También permitiría un interfaz del estado de la partida mucha más avanzado mediante un servidor web y mostrar el desarrollo o incluso poder interactuar con el tablero desde un dispositivo móvil con un interfaz de jugador vía web.
Además de lo descrito para cada jugador, se pretende incluir un lector de NFC que permita identificar las fichas (meeples, nave, soldado, etc..) de cada jugador o leer tarjetas. En la fabricación de las fichas se puede insertar una etiqueta NFC como las micro tag de Murata. De esta forma la propia ficha puede ir ganando habilidades o cambiar características, y quedar registrada esta evolución en la propia ficha, pudiendo usar esas mejoras en siguientes partidas. También se ha pensado incluir un pequeño altavoz que pueda generar algunos efectos de sonido de resolución de las acciones (batalla ganada/perdida, recurso obtenido/gastado, movimiento, etc..).
Y aquí una pequeña demo de la comunicación USB con el tablero:


