Login e jogo são duas portas de um mesmo processo desde o primeiro dia. Tudo abaixo existe no repositório com testes em cima; tudo que não está abaixo não existe, e o roadmap diz isso sem rodeios.
✔
A conversa de login
O handshake herdado por inteiro: bloco RSA de credenciais, fluxo Blowfish, módulo embaralhado. Senhas com Argon2id, limite de taxa por endereço e por conta, recuo a cada falha.
✔
A passagem para o mundo
Lista de servidores, token de sessão de uso único e uma porta de jogo que expira o token na primeira vez que o aceita. Contas nascem de um comando, nunca da porta.
✔
Codec gerado
Cada pacote, enum e primitiva de buffer sai dos arquivos de schema. O schema.lock quebra o build se um campo é removido, reordenado ou muda de tipo, ou se um opcode é renumerado.
✔
Entrar e sair do mundo
Criação, seleção e entrada de personagem contra o Postgres, com templates e itens iniciais do datapack — e o caminho de volta, para a lista de personagens ou para a tela de login.
✔
Tick e zonas
Uma platform thread por zona, um escritor, dois encontros por tick. Uma mensagem postada no tick N é aplicada no tick N+1, sempre.
✔
Movimento em chão real
Movimento resolvido célula a célula contra uma grade de colisão convertida, mapeada em memória fora da heap. A* sobre a mesma grade para as rotas.
✔
Gestão de interesse
Aparecer, mover e sumir saem como CharInfo, MoveToLocation e DeleteObject, decididos por uma grade de células e nunca por uma varredura da zona.
✔
Chat e equipamento
Uma linha de chat e uma troca de equipamento saem pelo mesmo três por três de células. A plateia é respondida na thread que a possui, não juntada na borda.
✔
Pegar e largar
O cliente diz o que está tentando alcançar e onde acha que está; a segunda informação é descartada. A zona mede a distância e decide qual dos dois jogadores chegou primeiro.
✔
Inventário que sobrevive ao restart
O que um personagem carrega é gravado no Postgres e lido de volta na entrada. O contador que dá identidade a cada item também sobrevive ao restart, então a numeração continua em vez de recomeçar.
✔
Dinheiro como saldo
Moeda é um saldo, não uma linha na bolsa, então dinheiro no chão deixou de parecer dinheiro destruído. E dois pacotes não mexem mais na mesma bolsa no mesmo instante.
✔
Razão e transações
Nada pode ser adicionado, removido ou movido sem dizer para onde vai o registro e por quê. Transações se aplicam juntas ou se desfazem de trás para frente dentro de um tick.
✔
Catálogos do datapack
O catálogo de skills e as tabelas de atributos por classe são convertidos do conteúdo do cliente e carregados no boot em estruturas imutáveis. O combate precisa dos dois antes de poder ser escrito.
✔
Alvo
Um jogador consegue mirar em algo, e quem decide no que foi mirado é o servidor. Tudo para que um alvo serve, dano, skills e morte, ainda está pela frente.
✔
Determinismo e replay
Quinhentos ticks sobre sessenta e quatro entidades, com semente, produzem o mesmo hash de estado em toda execução; duas zonas trocando tráfego por quatrocentos ticks também.
✔
A sonda
Instrumentação sobre cada costura que a simulação já expõe, para que um silêncio pare de parecer uma resposta. Não decide nada e só é ligada em nível de debug.