Login y juego son dos puertos de un mismo proceso desde el primer día. Todo lo de abajo existe en el repositorio con pruebas encima; todo lo que no está abajo no existe, y el roadmap lo dice sin rodeos.
✔
La conversación de login
El handshake heredado completo: bloque RSA de credenciales, flujo Blowfish, módulo revuelto. Contraseñas con Argon2id, límite de tasa por dirección y por cuenta, retroceso ante cada fallo.
✔
El paso al mundo
Lista de servidores, token de sesión de un solo uso y un puerto de juego que caduca el token la primera vez que lo acepta. Las cuentas nacen de un comando, nunca del puerto.
✔
Códec generado
Cada paquete, enum y primitiva de buffer sale de los archivos de esquema. schema.lock rompe el build si un campo se elimina, se reordena o cambia de tipo, o si un opcode se renumera.
✔
Entrar y salir del mundo
Creación, selección y entrada de personaje contra Postgres, con plantillas y objetos iniciales del datapack — y el camino de vuelta, a la lista de personajes o a la pantalla de login.
✔
Tick y zonas
Un platform thread por zona, un escritor, dos encuentros por tick. Un mensaje publicado en el tick N se aplica en el tick N+1, siempre.
✔
Movimiento sobre suelo real
Movimiento resuelto celda a celda contra una rejilla de colisión convertida, mapeada en memoria fuera del heap. A* sobre la misma rejilla para las rutas.
✔
Gestión de interés
Aparecer, moverse y desaparecer salen como CharInfo, MoveToLocation y DeleteObject, decididos por una rejilla de celdas y nunca por un barrido de la zona.
✔
Chat y equipo
Una línea de chat y un cambio de equipo salen por el mismo tres por tres de celdas. Al público se le responde en el hilo que lo posee, no reuniéndolo en el borde.
✔
Recoger y soltar
El cliente nombra lo que intenta alcanzar y dónde cree que está; lo segundo se descarta. La zona mide la distancia y decide cuál de dos jugadores llegó primero.
✔
Inventario que sobrevive a un reinicio
Lo que un personaje lleva se escribe en Postgres y se lee de vuelta al entrar. El contador que da identidad a cada objeto también sobrevive a un reinicio, así que la numeración sigue en lugar de empezar de nuevo.
✔
El dinero como saldo
La moneda es un saldo y no una fila en la bolsa, así que el dinero en el suelo dejó de leerse como dinero destruido. Y dos paquetes ya no tocan la misma bolsa en el mismo instante.
✔
Libro mayor y transacciones
Nada puede añadirse, quitarse ni moverse sin decir adónde va el registro y por qué. Las transacciones se aplican juntas o se deshacen hacia atrás dentro de un tick.
✔
Catálogos del datapack
El catálogo de habilidades y las tablas de atributos por clase se convierten del contenido del cliente y se cargan en el arranque en estructuras inmutables. El combate necesita ambas antes de poder escribirse.
✔
Selección de objetivo
Un jugador puede apuntar a algo, y el servidor es quien decide a qué se apuntó. Todo aquello para lo que sirve un objetivo, daño, habilidades y muerte, sigue por delante.
✔
Determinismo y replay
Quinientos ticks sobre sesenta y cuatro entidades, con semilla, producen el mismo hash de estado en cada ejecución; dos zonas intercambiando tráfico durante cuatrocientos ticks también.
✔
La sonda
Instrumentación sobre cada costura que la simulación ya expone, para que un silencio deje de parecer una respuesta. No decide nada y solo se conecta en nivel de depuración.