1

Como eu fiz um tower defense 4v4 no navegador: simulação compartilhada, binário no websocket e deploy blue/green

Fiz o Brasil TD, um tower defense 4v4 inspirado no Legion TD do Warcraft 3, que roda no navegador. Aqui vai como é por baixo, o que funcionou e o que ainda está cru.

A ideia

Cada jogador defende uma lane e gasta ouro mandando tropas pro time rival. O que vaza da sua lane cai no parceiro. São 30 waves, heróis e chefes. O tema é uma sátira com facções fictícias.

Stack

Monorepo TypeScript com três pacotes: client (Preact + three.js + Vite), server (Node, http + ws, SQLite) e shared (a simulação do jogo). O cliente é uma PWA instalável no celular. O three.js é carregado sob demanda para a landing não pagar esse custo.

Uma simulação, dois lugares

A decisão que mais ajudou foi manter a simulação num pacote só. No online, o servidor é a autoridade: o cliente manda comandos ("construir aqui", "enviar tropa") e o servidor valida e roda. No modo contra bot, a mesma simulação roda localmente num worker do navegador, então dá para jogar sem conta e sem esperar fila.

Como é compartilhada, ela precisa ser determinística. Tenho um teste que joga a mesma seed duas vezes e compara um hash do estado, e outro que reexecuta o log de comandos de uma partida e confere que termina no mesmo estado.

Rede

WebSocket puro com ws. Comandos sobem como JSON. As posições das unidades descem em snapshots binários compactos, filtrados pelas lanes que aquele cliente está vendo, para não mandar o mapa inteiro a cada cliente. Se alguém cai ou sai, um bot assume a lane até a pessoa voltar.

Deploy sem derrubar partida

Uma partida de 30 waves dura bastante, então reiniciar o servidor a cada deploy não servia. O deploy é blue/green numa máquina só: o container novo sobe num slot livre, o Caddy detecta que ele está saudável (health check ativo) e passa a mandar as conexões novas para ele. O container antigo recebe um sinal, termina as partidas em andamento, avisa os clientes ociosos para recarregar e se desliga quando ninguém está jogando. Se o novo não ficar saudável, ele é removido e a versão anterior continua no ar.

O que ainda está cru

  • Pouca gente online ainda, então o 4v4 às vezes é completado com bots (a fila vota isso).
  • O balanceamento da economia (renda vs. defesa) merece mais dados de partidas reais.
  • O foco é o desktop; no celular funciona como PWA instalável, mas a experiência de toque ainda é a parte mais nova.

Quer testar?

Dá para jogar sem conta: o botão "JOGAR AGORA" abre um 1v1 contra bot de uns 10 minutos. Conta grátis só para guardar progresso (ranqueada pede login). Nada que se compra deixa unidade mais forte.

https://brasiltd.com

Se você já fez algo parecido (simulação compartilhada, deploy sem derrubar conexão), adoraria ouvir como resolveu.

Carregando publicação patrocinada...