NotíciasNotícias

Diário de desenvolvimento

25 out 2026

Kastle: o motor que os quatro jogos dividem

TECHPOST #21
O Castle Survivors no layout de HUD Dota, um dos quatro layouts que o motor compartilha
O Castle Survivors no layout de HUD Dota, um dos quatro layouts que o motor compartilha

Um motor de jogo da casa é uma decisão cara, e a tomamos por um motivo simples: três jogos em uma semana, cada um precisando do mesmo mundo 3D, das mesmas criaturas, do mesmo som, do mesmo HUD, da mesma Steam, dos mesmos saves e do mesmo multiplayer determinístico. O Kastle é tudo isso, extraído do Castle Survivors em 9 de outubro, e nenhuma regra de jogo. Um jogo é uma pasta ao lado dele, com a própria simulação, o próprio conteúdo e as próprias palavras. O motor nunca importa um jogo, e uma verificação automática falha se um dia importar.

O que o motor guarda

A concha: título, menus, opções, créditos, a sala com assentos, cores, times e chat, a vida de uma partida, os replays e o laço de quadros. A rede: salas pela Steam, por LAN ou offline, e o lockstep determinístico com checksums, recuperação de atraso, reconexão e migração de anfitrião. A simulação: laço de passo fixo, sorteio por semente, hash espacial, navegação com campos de fluxo e A*, e o runtime do Warcraft III, com a tabela de dano por tipo de ataque e armadura, buffs, ataques e projéteis. O render: céu, clima, dia e noite, terreno de ilha, cenário, fauna, pós-processamento, criaturas, projéteis e todos os efeitos. O áudio, a interface com os quatro layouts de HUD, os saves com migração por esquema, a Steam, os mods e a Oficina. E a biblioteca de arte: 164 modelos de criatura com 705 peles, 1.115 modelos de cenário em nove packs, 17 temas de ilha, 4 céus de nebulosa e o espaço profundo, 235 efeitos e 74 sons. Os packs comprados pelos jogos foram para essa biblioteca, e cada jogo entrega só as pastas que carrega.

As duas primeiras semanas

O Kastle nasceu com replays e relatórios de dessincronia, a animação de criaturas na GPU, um atlas de efeitos para torres, sons de arma posicionais, e controle e Steam Deck. No dia seguinte virou pacote próprio, com testes, ferramentas, texturas comprimidas, mods de conteúdo, um jogo de exemplo chamado Kastle Skirmish e português. Ganhou um importador de mapas do Warcraft III que lê entradas criptografadas e as regras de herói do jogo.

Em 24 de outubro saíram as versões 0.2.0 e 0.3.0, e com elas a integração contínua: tipos, a fronteira motor-jogo, testes com piso de cobertura, lint, o exemplo jogado dentro do Electron, auditoria e releases. A sala e o lockstep foram endurecidos contra pares hostis, com chave secreta por assento, a segurança da janela passou a ser imposta pelo motor, e o checksum cobre o mundo inteiro. O render ganhou uma tabela só de níveis de qualidade, seleção de cenário por célula do chão, partículas que voam na GPU, detalhe de criatura pelo tamanho na tela e a sobreposição de névoa de guerra. A simulação ganhou separação de multidão, névoa e gatilhos. Uma partida offline pode ser salva e retomada, quem reconecta parte de um ponto de verificação em vez de rever a partida inteira, e observadores assistem a uma sala ou a uma partida em andamento. Os arquivos grandes passaram a ir pelo Git LFS.

E os efeitos, que são o que se vê: golpes de espada, uma salva de 19 projéteis mágicos, uma escola de fogo de RPG, 18 mísseis luminosos, 16 ultimates de herói de MOBA, auras de ki em oito níveis até dragões de luz, 15 projéteis de desenho animado, e um atlas novo com flipbooks. Todos procedurais, e o golpe de cada clipe de ataque cai no instante em que a lâmina encosta.

A rodada de 25 de outubro

A última rodada foi a maior, em sete frentes ao mesmo tempo. O runtime do Warcraft III ganhou ordens (parar, segurar, mover, atacar, atacar-movendo, patrulhar, seguir, em fila com Shift), habilidades como dados (aproximação, ponto de conjuração, mana e recarga pagas ali, backswing ou canalização, interrupções) e inventário de seis casas, sem alocar memória durante o passo. A navegação aprendeu o tamanho das unidades, o custo do congestionamento e um guiamento que junta o fluxo com a separação.

No lockstep, os comandos de quem caiu sobrevivem à reconexão, e o checksum é dividido em partes com nome: um relatório de dessincronia diz qual sistema divergiu, e a aba de Replays do Studio marca o primeiro. Um lint de determinismo aponta, no código da simulação, tudo o que faz dois computadores discordarem: sorteio sem semente, relógio de parede, ordenação sem comparador, iteração que depende de ordem. Um soak roda partidas inteiras sob redes simuladas, com latência, perda, reordenação e partições, e já achou um bug real: um convidado cuja contagem começava depois da do anfitrião perdia os primeiros turnos. Um portão de desempenho mede o exemplo e uma multidão de 500 corpos contra uma linha de base, local, porque os minutos de CI custam. Uma simulação dentro de um worker foi medida: economiza 0,1 a 0,2 ms por quadro a 5.000 unidades, e nenhum jogo a adotou ainda. As paletas de time para daltônicos mantêm todos os pares de cor a uma distância mínima, na visão normal e na simulada. E as telas do motor falam espanhol e chinês simplificado, além de inglês e português.

Fechando o dia, a CI voltou a ficar verde nos servidores sem GPU: um renderizador por software desenha o nível mais baixo, e as imagens de referência da regressão visual passaram a ser as do próprio servidor.

Quem usa o quê

O Line Tower e o Custom Hero Survival rodam inteiros no Kastle e já adotaram a rodada nova. O Castle Survivors usa só o render, por decisão: a simulação, a rede, a interface, os saves e os replays continuam dele. O Castle Arena tem o próprio lockstep e não usa o motor, mas conversa com o Kastle Studio como os outros três. O motor tem hoje 948 testes próprios, que cada jogo roda junto com os seus.

— A equipe