⬅️ 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.
| 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.
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.
La batería cubre exactamente lo que se puede romper en silencio:
null.a_dict() comparado antes y después).29.25 para el caso de referencia.STACK, IGNORAR e INDEPENDIENTE; daño periódico independiente del framerate; residuo cero al expirar.== 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.
Ser exacto con esto vale más que una lista de promesas:
ranura_cambiada(i) y nadie escucha. Dibujarlo es el ejercicio 6 de la clase 295.