Dev Log — Clima, mundo vivo e bastidores da infra

Faz tempo que não escrevo um dev log aqui. Os últimos meses foram intensos
em duas frentes que andam juntas: o mundo do jogo ficou mais vivo e a
infraestrutura por trás dele virou uma máquina decente. Esse post é uma
volta rápida pelos dois lados.


O mundo ganhou clima — e estações de verdade

A primeira coisa que dá pra notar quando você abre o jogo agora é que o
céu não é mais um cenário estático. Tel-Annat tem um ciclo diurno e
noturno suave; as árvores balançam quando o vento sopra; e quando chove,
chove de verdade.

Tel-Annat ao entardecer — o céu agora segue o nascer e o pôr do sol calculados por latitude e estação.
Tel-Annat ao entardecer — o céu agora segue o nascer e o pôr do sol calculados por latitude e estação.

A virada técnica foi simples na descrição, mas longa na execução: cada
mapa carrega coordenadas geográficas (latitude/longitude) vindas direto do
CMS. Com isso o motor calcula em que hemisfério o jogador está e qual
estação do ano está rolando. O clima de cada bioma é só um default
dá pra forçar uma tempestade num deserto via console se eu quiser
testar uma cena específica.

Chuva caindo sobre o mapa, com partículas e as árvores balançando ao vento.
Chuva caindo sobre o mapa, com partículas e as árvores balançando ao vento.

As árvores tiveram um capítulo à parte. Foram várias iterações de shader
até o vento ficar visível sem que as folhas “estourassem” pra fora do
quadro do sprite. Coisa de uns 8 commits seguidos só pra ajustar
amplitude, frequência e o ponto onde a base do tronco fica parada.

O *sway* das árvores em movimento — o vento deforma o topo da copa sem cortar o sprite.
O sway das árvores em movimento — o vento deforma o topo da copa sem cortar o sprite.

Um console pra debugar o mundo

Junto com o sistema de clima veio um console interno no jogo. Hoje eu
abro ele e mando coisas tipo “qual é o clima atual?”, “troca a estação
pra inverno”, “amostra os próximos eventos meteorológicos”. Pra mim, como
dev solo, isso economiza bastante tempo — testar uma nevasca específica
antes exigia um vai-e-vem de save/load; agora é uma linha de comando.

O console interno respondendo ao comando `weather`: nuvens, precipitação, vento, estação e a geolocalização do mapa.
O console interno respondendo ao comando weather: nuvens, precipitação, vento, estação e a geolocalização do mapa.

Também resolvi um bug bobo mas chato: abrir o console pausava o jogo, e
fechar o console despausava — mesmo se o jogo já estivesse pausado
antes por outro motivo. Agora o estado anterior é preservado.


Bastidores: a reestruturação da infra

Essa parte é menos visual, mas foi uma das mudanças mais importantes dos
últimos meses. O servidor que roda o backend do jogo (API, CMS, auth)
saiu de um setup meio improvisado pra uma estrutura que eu confio em
deixar rodando sozinha.

Backup de verdade, todo dia

Antes eu tinha aquela sensação de “ah, se o HD pifar agora…”. Hoje
existe um pipeline de backup que roda automaticamente todo dia às 01h
da manhã. Ele:

  • Congela uploads por alguns segundos pra garantir consistência
  • Faz um snapshot do banco e dos arquivos do CMS
  • Deduplica e criptografa tudo (usando uma ferramenta chamada restic)
  • Manda cópias pro Google Drive e pro Amazon S3 ao mesmo tempo
  • Aplica retenção grandfather-father-son (diários, semanais, mensais)

E o mais importante: tem um drill trimestral agendado, ou seja, de
três em três meses eu efetivamente restauro o backup num ambiente de
teste pra confirmar que ele funciona. Backup que ninguém testa não é
backup, é fé.

O painel de backups no CMS: data, status e histórico do último snapshot enviado pro Drive e pro S3.
O painel de backups no CMS: data, status e histórico do último snapshot enviado pro Drive e pro S3.

Monitoramento em três camadas

Agora o servidor avisa quando alguma coisa para de funcionar — e o aviso
chega antes de eu perceber pelo jogo travado. O esquema é em três
camadas:

  1. Heartbeat interno — cada job crítico (backup, worker de
    brainstorms, etc.) bate num endpoint dizendo “tô vivo” a cada
    execução. Se ficar mudo por muito tempo, alerta.
  2. Health checks contínuos — o site público faz um poll de saúde
    da API a cada 30 segundos. Aquele indicador discreto de “Servidor:
    online/offline” no canto da página vem daí.
  3. Banner público de alerta — se o último backup falhou ou está
    atrasado por mais de 26h, um aviso aparece automaticamente no painel administrativo, além de disparar um e-mail para os administradores da infra.

Login unificado

Outra coisa que parecia pequena, mas ajudou bastante: jogo, site e
backend agora compartilham o mesmo sistema de login (rodando em cima
de um servidor de identidade dedicado). Se você entra no painel admin
do site, o jogo já sabe quem você é. Se a sessão expira, aparece um
overlay pedindo pra reentrar — sem perder o trabalho que estava em
andamento.

Login unificado: jogo, site e painel admin compartilham o mesmo acesso.
Login unificado: jogo, site e painel admin compartilham o mesmo acesso.

Conteúdo no lugar certo

Um princípio que virou regra: todo conteúdo do jogo nasce no CMS.
Item, monstro, NPC, mapa, bioma, missão, diálogo — tudo. O jogo lê isso
em runtime e monta os recursos sozinho. Isso significa que eu (ou
qualquer pessoa colaborando) consigo editar uma habilidade ou ajustar
uma loot table direto pelo painel web, sem mexer no código do jogo.

O painel do CMS listando o conteúdo do jogo — tudo editável pelo navegador, sem tocar no código.
O painel do CMS listando o conteúdo do jogo — tudo editável pelo navegador, sem tocar no código.

Junto disso veio um sistema de planos no próprio CMS — onde eu
quebro cada empreitada grande em fases e atividades, marco progresso e
consigo “retomar” o trabalho de onde parei (inclusive com ajuda da IA).
É meio meta: estou usando o CMS pra gerenciar o desenvolvimento do
próprio jogo que o CMS alimenta.


O que vem por aí

A próxima frente é a wiki pública — um espaço dentro do site onde
quem joga pode ler sobre o mundo, a lore, os personagens, sem precisar
descobrir tudo dentro do jogo. O backend dela já foi pro ar; agora
falta o visual.

Em paralelo, continuo polindo o ciclo dia/noite (quero que a luz das
fogueiras tenha mais presença à noite), e quero experimentar clima
afetando gameplay
— chuva apagando tochas, frio diminuindo
stamina, esse tipo de coisa.

Noite em Tel-Annat: a tocha do personagem e uma fogueira iluminam o chão, enquanto o resto do mundo fica no escuro.
Noite em Tel-Annat: a tocha do personagem e uma fogueira iluminam o chão, enquanto o resto do mundo fica no escuro.

Se você leu até aqui, obrigado. Mensageiros do Vento é um
projeto solo feito nos cantos das madrugadas, e cada comentário,
seguidor ou compartilhamento faz diferença.

Até o próximo log.

𒀀𒀀