🧩 Lab: Sistemas de gameplay

⬅️ Volver a los laboratorios · 📚 Parte 18 · 🎓 Clase 310 (capstone)

Los sistemas que aparecen en cuanto un juego pasa de tres escenas a treinta: catálogo de objetos, inventario, equipo, estadísticas con modificadores, habilidades, efectos de estado, loot, progresión, economía, misiones y guardado versionado. Todos funcionando juntos y verificados por una máquina.

No hay gráficos, y es a propósito: este laboratorio se juzga por sus 122 comprobaciones, no por su aspecto. Todo el dominio son clases RefCounted sin nodos, así que la batería entera corre headless en menos de un segundo.

📦 Qué hay dentro

Sistema Archivo Clase
Catálogo de items con validación dominio/base_items.gd 294
Inventario por ranuras y transacciones dominio/inventario.gd 295
Estadísticas con modificadores dominio/estadistica.gd, stats.gd 296
Equipamiento con slots y restricciones dominio/equipo.gd 296
Habilidades con fases, coste y cooldown dominio/habilidades.gd 297
Efectos de estado y apilamiento dominio/efectos.gd 298
Tablas de loot deterministas dominio/loot.gd 300
Progresión y desbloqueos dominio/progresion.gd 302
Monedero con punto único de mutación dominio/monedero.gd 303
Misiones por eventos dominio/quests.gd, eventos.gd 305
Guardado con migraciones y backups infraestructura/guardado.gd 307

El pegamento está en scripts/juego.gd, el composition root: el único archivo que conoce a todos los sistemas. Lo comparten la escena principal y las pruebas, así que lo que se verifica es exactamente lo que se ejecuta.

🚀 Cómo usarlo

godot --path labs/gameplay-systems/inicio
godot --headless --path labs/gameplay-systems/solucion --script res://pruebas/sistemas_test.gd

La versión inicio/ trae la misma estructura con los TODO marcados en el código: inventario (cabe, agregar, quitar, mover), equipo (equipar, desequipar), efectos (tick), misiones (_avanzar) y las dos migraciones de guardado. Arranca y construye el mundo igual, pero sus sistemas no hacen nada todavía — y las pruebas lo dicen.

✅ Qué verifica la CI

La batería cubre exactamente lo que se puede romper en silencio:

== 122 comprobaciones, 0 fallos ==

Y una comprobación que no está en la lista pero importa igual: al terminar, no queda ni una instancia filtrada. Los ciclos de referencia entre sistemas conectados por señales se rompen explícitamente en Juego.liberar() — es el problema de la clase 340, y aquí se ve de verdad.

🔍 Qué NO cubre

Ser exacto con esto vale más que una lista de promesas: