Kastle: el motor que comparten los cuatro juegos

Un motor de casa es una decisión costosa, y la tomamos por una razón sencilla: tres juegos en una semana, cada uno con la misma necesidad de un mundo 3D, las mismas criaturas, el mismo sonido, el mismo HUD, el mismo Steam, las mismas partidas guardadas y el mismo multijugador determinista. Kastle es todo eso, extraído de Castle Survivors el 9 de octubre, y ninguna regla de juego. Un juego es una carpeta al lado, con su propia simulación, contenido y palabras. El motor nunca importa un juego, y una comprobación automática falla si algún día lo hace.
Lo que contiene el motor
El shell: título, menús, opciones, créditos, la sala con puestos, colores, equipos y chat, la vida de una partida, las repeticiones y el bucle de fotogramas. La red: salas a través de Steam, LAN o sin conexión, y lockstep determinista con sumas de verificación, puesta al día, reconexión y migración de anfitrión. La simulación: un bucle de paso fijo, un azar sembrado, una tabla espacial de búsqueda, navegación con campos de flujo y A*, y el entorno de ejecución de Warcraft III, con la tabla de daño por tipo de ataque y de armadura, potenciadores, ataques y proyectiles. El renderizador: cielo, clima, día y noche, terreno de isla, escenario, fauna, postprocesado, criaturas, disparos y cada efecto. El audio, la interfaz con sus cuatro diseños de HUD, las partidas guardadas con migraciones de esquema, Steam, mods y el Workshop. Y la biblioteca de recursos: 164 modelos de criaturas con 705 skins, 1115 modelos de escenario en nueve paquetes, 17 temas de isla, 4 cielos de nebulosa y espacio profundo, 235 efectos y 74 sonidos. Los paquetes que compraron los juegos pasaron a esta biblioteca, y cada juego solo distribuye las carpetas que carga.
Las dos primeras semanas
Kastle nació con repeticiones e informes de desincronización, animación de criaturas en la GPU, un atlas de efectos para torres, sonidos posicionales de armas, y soporte para mando y Steam Deck. Al día siguiente pasó a ser un paquete propio, con pruebas, herramientas, texturas comprimidas, mods de contenido, un juego de ejemplo llamado Kastle Skirmish, y portugués. Ganó un importador de mapas de Warcraft III que lee entradas cifradas, y las reglas de héroes del juego.
El 24 de octubre salieron las versiones 0.2.0 y 0.3.0, y con ellas la integración continua: tipos, el límite entre motor y juego, pruebas con mínimos de cobertura, linter, el ejemplo ejecutado dentro de Electron, una auditoría y las versiones. La sala y el lockstep se endurecieron frente a pares hostiles, con una clave secreta por puesto; la seguridad de la ventana ahora la aplica el motor, y la suma de verificación cubre el mundo entero. El renderizador ganó una tabla única de niveles de calidad, descarte de escenario por celda de suelo, partículas que vuelan en la GPU, detalle de criaturas según el tamaño en pantalla y la superposición de niebla de guerra. La simulación ganó separación de multitudes, niebla y disparadores. Una partida sin conexión puede guardarse y reanudarse, un jugador que se reconecta empieza desde un punto de control en lugar de repetir toda la partida, y los observadores pueden ver una sala o una partida en curso. Los archivos grandes ahora pasan por Git LFS.
Y los efectos, que son lo que se ve: tajos de espada, una ráfaga de 19 proyectiles mágicos, la escuela de fuego de un RPG, 18 misiles brillantes, 16 ultimates de héroes MOBA, auras ki en ocho niveles hasta dragones de luz, 15 proyectiles de dibujos animados y un atlas nuevo con flipbooks. Todo es procedural, y el golpe de cada clip de ataque cae en el instante en que la hoja toca.
La ronda del 25 de octubre
La última ronda fue la más grande, en siete frentes a la vez. El entorno de ejecución de Warcraft III ganó órdenes (detener, mantener posición, mover, atacar, atacar en movimiento, patrullar, seguir, cola con mayúsculas), habilidades como datos (aproximación, punto de lanzamiento, maná y enfriamiento que se pagan ahí, retroceso o canalización, interrupciones) y un inventario de seis ranuras, que no reserva memoria durante el paso. La navegación aprendió tamaños de unidad, costes de congestión y un giro que une el flujo con la separación.
En el lockstep, los comandos de un jugador desconectado sobreviven a la reconexión, y la suma de verificación se divide en partes con nombre: un informe de desincronización dice qué sistema divergió, y la pestaña Repeticiones de Studio marca el primero. Un linter de determinismo señala, en el código de la simulación, todo lo que hace que dos ordenadores discrepen: un azar sin semilla, el reloj de pared, una ordenación sin comparador, iteración dependiente del orden. Un soak ejecuta partidas completas sobre redes simuladas, con latencia, pérdidas, reordenamiento y particiones, y ya encontró un error real: un invitado cuya cuenta atrás empezó después que la del anfitrión perdía los primeros turnos. Una puerta de rendimiento mide el ejemplo y una multitud de 500 cuerpos frente a una línea base, en local, porque los minutos de CI cuestan. Se midió una simulación dentro de un worker: ahorra entre 0,1 y 0,2 ms por fotograma con 5000 unidades, y ningún juego la ha adoptado todavía. Las paletas de equipo para daltónicos mantienen cada par de colores a una distancia mínima, tanto en visión normal como simulada. Y las pantallas del motor hablan español y chino simplificado, además de inglés y portugués.
Al cerrar el día, la CI volvió a estar en verde en servidores sin GPU: un renderizador por software dibuja el nivel más bajo, y las imágenes de referencia de la regresión visual ahora son las del propio servidor.
Quién usa qué
Line Tower y Custom Hero Survival funcionan por completo sobre Kastle y han adoptado la nueva ronda. Castle Survivors usa solo el renderizador, por decisión propia: su simulación, red, interfaz, partidas guardadas y repeticiones siguen siendo suyas. Castle Arena tiene su propio lockstep y no usa el motor, pero habla con Kastle Studio igual que los otros tres. El motor tiene 948 pruebas propias hoy, que cada juego ejecuta junto con las suyas.
— El equipo





