
Durante la tercera semana de octubre yo jugaba a Enshrouded con el mando mientras en segundo plano corrían las pruebas con pantalla del juego. Lo que no sabía es que ese mando, conectado por escritorio remoto, alimentaba las pruebas aunque la ventana no tuviera el foco, y que llegó a abrir el teclado en pantalla de la pantalla de perfil en plena captura. Es la clase de cosa que solo se descubre cuando una máquina se pone a mirar imágenes, y de eso va esta entrega, que es corta.
1 - La matriz
¿Qué es una prueba de regresión visual? Grosso modo, una captura de cada pantalla comparada con otra captura que alguien aprobó antes; si difieren más de lo tolerado, la prueba falla. El 18 de octubre entró la matriz: cada pantalla del juego se captura con los paquetes de prueba en cuatro tamaños de ventana (1280x720, 1280x800, que es la Deck, 1920x1080 y 2560x1080) y en tres idiomas, inglés, castellano y un pseudoidioma con los textos un 40 por ciento más largos, para pillar los cuadros de texto que no caben antes de que los pille un traductor. Primero se comprueba la geometría de cada captura [la arena entera y centrada, sin recorte y sin controles táctiles encima] y después se compara la imagen con las referencias que yo he aprobado, con una tolerancia de 8 sobre 255 por canal y un 0,1 por ciento de píxeles distintos. Hoy son unas 275 capturas y 39 referencias, y el trabajo de integración continuaUn servidor que, con cada cambio del código, lo compila y le pasa las pruebas sin que nadie se lo pida. Si algo falla, el cambio no entra. En inglés, CI. es bloqueante: sin verde no hay fusiónIntegrar en la rama principal los cambios preparados en una rama aparte. En inglés, merge..

Imagen 1. La tubería: de las pantallas a las referencias aprobadas.
Lo que más me costó entender es que una captura no sale igual en dos máquinas, porque depende del controlador gráfico, de la versión de la biblioteca que dibuja y hasta de la fuente del sistema. Así que las referencias se generan solo dentro de un contenedorProceso empaquetado con sus dependencias que corre aislado sobre el kernel del anfitrión, sin virtualizar una máquina entera. En el homelab los servicios van en contenedores con Docker. Linux con una versión fijada de MesaLa implementación libre de OpenGL y Vulkan que usa Linux. Su controlador de software dibuja con la CPU, sin tarjeta gráfica, y por eso dibuja siempre igual., el controlador de software, donde la matriz salió determinista byte a byte. En Windows se comparan con tolerancia, y dentro del contenedor se exige que salgan idénticas.
2 - Lo que apareció al mirar
Las primeras capturas trajeron un rectángulo negro sobre cada luchador de la arena, que llevaba días en las imágenes sin que nadie lo hubiera visto. Era la línea de orientación de la figura: su grosor estaba fijado en 2 unidades de mundoLas unidades internas en que el motor mide el espacio de la arena, independientes de los píxeles de la pantalla., y como la casilla del paquete de pruebas mide 7 unidades y la del producto 32, en el de pruebas salían barras de 26 píxeles. Pasó a ser una fracción de la casilla y se regeneraron las ocho referencias de la arena.

Imagen 2. Antes: el rectángulo negro de la línea de orientación.

Imagen 3. Después: la línea como fracción de la casilla.
La segunda cosa que apareció fue una prueba intermitente, que fallaba una de cada tantas veces sin que hubiera cambiado nada: era Godot cayéndose al importar audio Ogg en frío, siete de cada cuarenta importaciones, con un fallo nativoUn error dentro del propio motor, en su código en C++, que tira el proceso entero en lugar de dar un mensaje.. La matriz ganó un reintento de la importación en frío y la prueba dejó de ser intermitente. Me parecía increíble que un caso de uso tan básico fallase así, y me lo sigue pareciendo.
Y la tercera fue la noche. Los tintes del paquete de pruebas apagaban el tablero por completo al anochecer y de noche; en mi primera partida, de la que hablo en la siguiente entrega, no pude hacer otra cosa que pasar el turno hasta que amaneció. Se corrigió el 19: el tablero ya no es negro, aunque la noche sintética sigue siendo muy oscura, porque es un paquete de pruebas y el aspecto del juego vendrá con el arte.

Imagen 4. La noche del paquete de pruebas, antes.

Imagen 5. Y después. Sigue muy oscura: es un paquete de pruebas.
Y lo del mando, que ya os conté arriba, se resolvió haciendo que la matriz ignore la entrada real, así que sigo jugando a otras cosas mientras corren las pruebas.
3 - Mantener las referencias
Las referencias las apruebo yo mirándolas, y mantenerlas cuesta: cuando la CI pasó una temporada a lanzarse a mano, tres fusiones con cambios visibles dejaron veinticuatro referencias sin actualizar, y hubo que redibujarlas desde el contenedor. A cambio, nada de lo que cambia en pantalla pasa sin que alguien lo mire, aunque ese alguien sea un trabajo de integración continua comparando píxeles, y de paso las referencias son las primeras imágenes de la historia del proyecto.
4 - Palabras finales
Hasta aquí la píldora. Si hacéis pruebas de regresión visual en Godot o en otro motor, me interesa con qué tolerancias trabajáis y cómo generáis las referencias para que salgan iguales en todas partes.
4.1 - Para el futuro
La siguiente entrega es la primera vez que alguien jugó al juego, que fui yo, y lo que los tests no veían: un ejército que no se podía colocar, una pantalla en negro, una figura que murió porque sí y cuarenta turnos paseando.
Orbafall Legions es un proyecto personal no oficial, no afiliado con Silicon Knights, SSI, Mindscape ni Ubisoft.
Versión 1.0R1 (02/11/2026)
Changelog
- Versión 1.0R1 (02/11/2026)
- Enlace al juego que se cita. Repaso de redacción.
- Versión 1.0R0 (20/10/2026)
- Versión inicial.