Este artículo del blog de loskutoff.com explora el uso de Model-Based Testing (MBT) para simular y verificar el complejo sistema de combate de Dungeons & Dragons (D&D). El objetivo es ir más allá de las pruebas básicas y validar la viabilidad completa del juego, especialmente en escenarios con interacciones intrincadas como cadenas de Counterspell, interrupciones de ataques y efectos de concentración.
Tradicionalmente, las pruebas en D&D se centran en casos simples, pero el verdadero desafío reside en cómo los diferentes elementos interactúan. El autor describe cómo la simulación de combate, que incluye todas las clases de personajes, condiciones, criaturas legendarias, Counterspells, ataques de oportunidad y resolución de daño, resultó ser más compleja que el código para modelar a un solo personaje (alrededor de la mitad del tamaño del código de la criatura). Esto se debe a que las interacciones crean un espacio de estado profundo y ramificado, donde cada acción puede desencadenar reacciones en cadena.
El núcleo de la técnica radica en la gestión de 'interrupt windows' o ventanas de interrupción. Un ataque no es un evento único, sino una secuencia de fases donde los participantes pueden reaccionar y modificar el resultado. Estas fases incluyen la comparación de la Clase de Armadura, la aplicación de bonificaciones de daño, la resolución de Counterspells y la activación de Legendary Resistance. El autor utiliza una estructura de datos tipo pila (stack) para representar estas interrupciones, permitiendo que se resuelvan en el orden correcto. Para facilitar la navegación y el retorno a la fase correcta después de una interrupción, se utiliza un sistema de 'tagged unions' (uniones etiquetadas) que define el punto de reanudación del estado de la máquina.
El autor utiliza el lenguaje de modelado formal Quint y la máquina de estados XState para implementar este sistema. Quint se utiliza para definir las reglas y Quint fuzzer para explorar el espacio de estados, mientras que XState se utiliza para gestionar la lógica de la máquina de estados. El MBT permite verificar que, dado un conjunto de entradas (como los resultados de los dados), la mecánica del juego se aplique correctamente. Sin embargo, el autor enfatiza que el MBT no modela todo; elementos como la interpretación de la cobertura (si un obstáculo proporciona cobertura parcial o total) quedan a la discreción del Dungeon Master (DM). En resumen, el MBT proporciona un marco robusto para probar la lógica de combate de D&D, asegurando que las interacciones complejas se resuelvan de manera consistente y predecible.
