O jogo abaixo — terreno, helicóptero, inimigos, mísseis, som e missão — saiu de nove instruções minhas, numa tarde de sábado.
Os números acima são dessa primeira versão. O que está no ar para jogar é a mesma ideia depois de arte, som e treze rodadas de crítica em cima.
Por que este jogo
Uma homenagem e uma âncora
Existe um jogo de 1992 chamado Desert Strike. Você pilota um helicóptero de combate em vista isométrica, gerencia munição e combustível, resgata reféns com um guincho e escolhe a ordem em que ataca os alvos. Foi um dos jogos da minha infância.
Trinta e quatro anos depois eu quis fazer a minha homenagem. E o jogo virou também projeto-âncora: a desculpa boa para aprender ao mesmo tempo desenvolvimento de jogos, programação assistida por IA, e essa coisa de trabalhar em público, que eu nunca tinha feito.
Uma âncora resolve um problema real. É fácil "aprender sobre" alguma coisa e não chegar a lugar nenhum. Fica difícil enganar a si mesmo quando existe um artefato que ou roda ou não roda. O jogo é o juiz.
Como o trabalho é dividido
Três sessões em paralelo
Eu não trabalho numa sessão só. Trabalho em três, ao mesmo tempo, e cada uma tem uma função diferente:
| A sessão | Para quê | O que é |
|---|---|---|
| Uma conversa de ideias | pensar o mecanismo, discutir, decidir | método |
| Uma sessão de controle | preparar o ambiente, construir a ferramenta | instrumentação |
| Uma sessão fechada, isolada | produzir, com autonomia longa | produção |
Medi as três:
| Onde | Frases minhas | Tool use | Tool use por frase |
|---|---|---|---|
| Pensar o método | 28 | 36 | 1,3 |
| Construir a ferramenta | 20 | 218 | 10,9 |
| Fazer o jogo | 9 | 1.240 | 137,8 |
Duas ordens de grandeza entre uma ponta e outra. Pensar é conversa: uma frase minha, uma resposta. Construir ferramenta já anda quase onze passos por instrução. Produzir é dar a partida e sair do caminho.
Eu falei três vezes mais para inventar o método do que para construir o jogo inteiro.
Como ele é feito por dentro
Uma função no meio de tudo
Onze arquivos, 133 KB de JavaScript, nenhum motor de jogo.
main.js. Não que seja a melhor arquitetura possível, ou que não precise de refatoração: foi isso o que a IA gerou, e por enquanto não vou refatorar.Tudo começa em ruído. O noise.js tem 1,6 KB e nenhuma
dependência: são funções matemáticas que, dado um ponto, devolvem sempre o mesmo valor
pseudo-aleatório. Somadas em várias frequências, viram relevo.
E converge numa função só. O terrain.js pega esse ruído e
expõe getHeight(x, z) — dado um ponto do mapa, a altura do chão ali. Cinco
módulos importam o terreno, e o que todos querem dele é essa função. O helicóptero, para
saber a que altura voa. As entidades, para assentar no solo. Os projéteis, para saber que
colidiram. As partículas, para estourar na superfície certa. O painel, para desenhar o
minimapa. Nenhum motor de física, nenhum grafo de cena — uma função pura que
qualquer um chama.
E ninguém conhece o vizinho. Helicóptero, entidades, projéteis,
partículas e painel estão na mesma fila e não se importam entre si. Quem os costura é o
main.js, sozinho no fim. Por isso deu para reescrever seis arquivos ao mesmo
tempo, numa única passada, sem quebrar nada — cada um só precisava continuar respondendo
ao terreno.
Os subsistemas
O que num motor de jogo pronto viria de fábrica, aqui é código:
| Subsistema | O que faz |
|---|---|
| Terreno | gera relevo, estradas, oásis e zonas planas a partir do ruído |
| Render | desenha a cena e passa por uma cadeia de pós-processamento com bloom — o brilho que vaza das fontes de luz |
| Áudio | sintetiza tudo em tempo real: rotor, armas, explosões, alarme |
| Partículas | fogo, fumaça, poeira e destroços, com um estoque fixo reaproveitado |
| Projéteis | trajetória, alcance e o teste de colisão contra o chão e os alvos |
| Entidades | radar, bateria antiaérea, tanque, jipe, soldado, refém, suprimento, zona de pouso |
| Missão | objetivos, contagem, e o estado de vitória |
| Entrada | teclado e mouse, com a mira derivada da posição do cursor no mundo |
A construção, minuto a minuto
Sábado, 12h02
O que vem agora é a ordem real em que as coisas nasceram — não uma arrumação posterior por assunto. Peguei os horários de modificação dos arquivos e o registro da sessão. É literalmente o jogo se montando.
<canvas>,
e o mapa de importação apontando para a biblioteca 3D. Nada acontece ainda.entities.js sozinho tem 40 KB: é o
arquivo que sabe o que é um radar, uma bateria antiaérea, um soldado, um refém, um
posto de comando. É o mundo.

A stack
Eu impus uma restrição no começo: tem que rodar no navegador, em 3D, sem instalar nada. Isso levou a uma biblioteca 3D para web e a JavaScript puro, sem motor de jogo. Sem editor visual, sem física pronta, sem sistema de partículas pronto — tudo escrito.
Foi a escolha certa para o primeiro capítulo, e provavelmente será a errada em algum momento.
O motor de qualidade
Quem constrói não julga
O problema de construir com IA é que ela concorda com você. Peça uma explosão, ela faz uma explosão, e ela acha ótima. Se quem constrói também avalia, a régua desce sozinha até bater no que já foi feito.
Então, inspirado no gauntlet loop — a ideia de pôr um construtor e um crítico em lados opostos, com contexto fresco a cada volta —, separei os papéis. De um lado, quem constrói. Do outro, um crítico que nunca viu o código, não sabe o que foi tentado, e recebe só duas imagens lado a lado — a minha e uma referência de qualidade — com a pergunta: qual das duas é melhor, e por quê, em cada aspecto separadamente? Paleta. Luz. Movimento. Silhuetas. Câmera. Cada aspecto recebe o seu próprio veredito.
As referências fornecidas ao crítico nunca foram o objetivo. Elas são um instrumento de direção: é muito mais fácil um avaliador dizer "esta está pior porque a paleta é monocromática" do que "isto está bom". A comparação existe para gerar crítica específica e acionável.
O primeiro veredito visual foi brutal: cinco aspectos a zero contra mim. E foi útil, porque veio com nomes: paleta monocromática, sol alto demais com exposição estourada, explosões chapadas, câmera antecipando demais o movimento, inimigos sem marcador visual.
O crítico de jogabilidade, rodando em paralelo, foi mais generoso e mais duro ao mesmo tempo:
recursos, transporte, armamento, missão · EMPATA
tática do combate · PERDE — míssil antiaéreo indefensável, 0 de 8 esquivas
As seis lacunas apontadas pelos dois críticos foram corrigidas de uma vez, em seis arquivos. No meio delas houve um percalço: o filtro de segurança do modelo recusou um dos comandos — justamente o que trocava a cor do céu e a da luz do sol. Reenviado sem alteração nenhuma, trinta e cinco segundos depois, passou.
O míssil que não dava para desviar
Na segunda rodada o crítico voltou com medidas em vez de opinião: o aviso "DESVIE!" aparecia 0,20 segundo antes do impacto — tempo de reação humano não existe aí — o tempo de recarga da manobra era de 2,2 segundos, o que não cobria uma salva de três mísseis, e dois tipos de arma inimiga não davam aviso nenhum.
Três números, três correções. Na rodada seguinte: janela de 0,62 segundo, 6 esquivas em 6 tentativas, e uma salva de três mísseis sobrevivida. De indefensável a justo em duas iterações — e nenhuma delas partiu de mim. Eu não estava nem olhando.
A câmera, que perdia nas duas primeiras rodadas, empatou na terceira e ficou lá. Meta atingida, aspecto travado, ninguém mexe mais.
Onde parou
"Uma areia só, árvores-pirulito"
Cinco rodadas depois, quatro aspectos visuais não saíam do lugar: paleta, luz, movimento e silhuetas. E o crítico, que não sabia o que eu tinha tentado, repetia a mesma coisa com palavras cada vez mais precisas:
"as classes de inimigo só se distinguem pelo anel colorido no chão"
Ele estava certo. Olhe de novo a primeira imagem deste post: é um deserto de uma cor só, com arbustos que são esferas verdes achatadas.
E aí veio a decisão que eu considero a melhor do capítulo, e ela foi de parar.
Quando um aspecto não converge por três rodadas seguidas, a regra é reportar a causa em vez de baixar a régua. A causa aqui era estrutural e óbvia em retrospecto: não dá para chegar em riqueza visual gerando arte com código procedural. Cada rodada estava ajustando um parâmetro num sistema que não tinha como produzir o resultado pedido.
Então o loop parou sozinho, registrou "bloqueado por falta de meios" nos quatro aspectos, e me devolveu o problema. Uma hora e quarenta e sete minutos depois de começar, eu tinha um jogo jogável, um diagnóstico honesto do que faltava, e nenhuma mentira no registro.
A pausa
Duas horas e meia construindo uma ferramenta
Diagnóstico era falta de meio para produzir arte. O jogo ficou parado quase doze horas — eu também dormi nesse intervalo —, e dentro dessa janela houve duas horas e meia de trabalho contínuo construindo um pipeline de assets: uma peça que recebe um pedido ("solo desértico repetível", "palmeira baixa", "veículo militar") e devolve o arquivo pronto, vindo de bancos de arte livre ou gerado sob medida, com registro de origem.
E "eu construí" é força de expressão. Quem passou a madrugada trabalhando foi o Claude, solto em yolo mode — sem parar para me pedir confirmação a cada passo — dentro do sandbox onde ela pode errar sem levar mais nada junto.
Antes disso, uma etapa decisiva: ir atrás de referências visuais de verdade. Não dá para pedir "faça bonito". Dá para pegar imagens do gênero, extrair delas uma paleta e uma direção de luz, e usar isso como material de trabalho. Boa parte da qualidade que veio depois nasceu dessa meia hora chata de coletar imagens.
E teve um erro que eu não teria previsto. Para recortar o fundo das texturas geradas, pedi ao gerador que pintasse tudo de magenta puro — uma cor que não aparece em nada natural, justamente para ser fácil de achar e apagar depois. Ele devolveu um magenta quase puro.
A olho nu, idêntico. Para o recorte, que procurava um valor exato de cor, não havia magenta nenhum: nada era apagado, e cada textura saía com um retângulo berrante em volta. A correção foi parar de presumir a cor e passar a medi-la na borda de cada imagem.
É um erro que só existe quando se automatiza em cima de um gerador. Ele acerta o que um humano julgaria e erra o que uma máquina exige — e a diferença entre os dois é invisível até a máquina falhar.
O antes e o depois
O deserto ganha textura
Com a ferramenta pronta, o loop recomeçou. Treze rodadas de crítica, dezessete texturas geradas, e modelos tridimensionais de verdade entrando no lugar das caixas.
A mesma base militar, em três momentos do processo:



E a bateria antiaérea — a mesma que era indefensável lá atrás — antes e depois:




Em movimento


Ao longo das rodadas, seis regressões silenciosas foram pegas: a base tapando a bola de fogo da explosão, um filtro escurecendo os quadros de fogo, o estoque de partículas esgotando no meio de um combate, granadas detonando durante a captura de imagem, comentários de código cortando linhas por engano, e metade de cada bola de fogo sumindo porque o motor descarta a face de trás dos polígonos. Nenhuma quebrava o jogo. Todas apareceram porque havia um avaliador olhando quadro a quadro.
A conta
Dezesseis dólares
Está tudo registrado, então a conta fecha item a item.
| Método | Ferramenta | Jogo | Total | |
|---|---|---|---|---|
| Frases minhas | 28 | 20 | 9 | 57 |
| Respostas da máquina | 32 | 152 | 564 | 748 |
| Tool use | 36 | 218 | 1.240 | 1.494 |
| Tempo ativo | 2,4 h | 4,3 h | 8,7 h | 15,4 h |
| Tokens processados | — | — | — | ≈ 370M |
E o custo, que precisa de duas linhas para não enganar ninguém:
(fatia da assinatura)
por API avulsa
A assinatura mensal é de US$ 200. Rateei pela semana e medi que fatia do meu consumo total foi este capítulo: 34%. Dá dezesseis dólares. O outro número é o mesmo trabalho cobrado como serviço avulso.
Um detalhe que você vai ouvir. No rádio, o helicóptero atende por Sandstorm. É fóssil: foi o primeiro nome do jogo, até eu descobrir que já existia um jogo publicado com ele. O nome mudou, o indicativo ficou.
Depois do jogo pronto
A outra metade do trabalho
O jogo ficou jogável em 1h47. Colocá-lo onde alguém pudesse abrir, e contar como ele foi feito, levou quatro dias e 35,9 horas de trabalho.
Essa parte não entra nos números da seção anterior porque ela trata de outra coisa: transformar uma pasta que roda na minha máquina em algo que abre na máquina de um desconhecido — e depois explicar o que aconteceu ali dentro.
Quatro versões até dar para jogar no itch.io
O jogo já rodava. Era abrir o arquivo e jogar — foi assim que eu joguei o capítulo inteiro. Publicar exigiu quatro tentativas.
v0.1.3 · o botão de jogar dava 404 — o servidor do itch.io não resolve endereço de pasta
v0.1.3 · o jogo abria em português para todo mundo
v0.1.4 · dentro da moldura do itch.io a roda do mouse rolava a página de fora, o teclado não recebia foco, e a tela ficava preta e tremia até estabilizar
Entre a primeira e a última, nada de regra, arte ou áudio mudou. Mudou o que faz um jogo funcionar dentro da página de outra pessoa.
O último item exigiu código novo no jogo. Sem ele, os primeiros segundos dentro da moldura
do itch.io eram uma tela preta que tremia até estabilizar — a placa de vídeo
compilando, em plena partida, os programinhas que ela usa para desenhar. A correção foi o
pré-aquecimento de shaders: mandar compilar tudo antes, enquanto o
LOADING ainda está na tela. É prática corriqueira em jogos, e o que a trouxe
para cá foi a publicação.
E antes disso, o que não aparece
| O quê | Por quê |
|---|---|
| Um build separado para o público | tirar do pacote os ganchos de teste, embutir a biblioteca 3D em vez de buscá-la num CDN, reduzir a precisão das malhas |
| Revisão de segurança | nenhuma variável global vazando, nenhuma leitura de endereço, nenhum trecho de desenvolvimento sobrando |
| Dieta de assets | de 8,7 MB para 5 MB por jogador — quem abre uma página não espera esperar |
| Licença | uma decisão que eu não sabia que teria de tomar tão cedo |
| Hospedagem, decidida duas vezes | a primeira escolha foi desfeita quando o itch.io se mostrou melhor para um jogo de navegador |
| Três renomeações | o primeiro nome colidia com um jogo publicado; o segundo eu abandonei por conta própria. Cada troca tocou título, abertura, licença e chave de idioma |
| Dois idiomas | no jogo e neste texto, decididos em separado e chegando à mesma conclusão: inglês por padrão, português a um clique |
A dieta rendeu mais do que eu esperava, porque o peso estava concentrado. O jogo saía com 8,7 MB por jogador, e um único arquivo respondia por mais de um terço: o soldado, com 3,6 MB. Quase tudo ali eram animações — vinte e quatro sequências de movimento, das quais o jogo usa oito. Removidas as dezesseis que ninguém vê e comprimida a geometria, ele caiu para 1,4 MB.
O céu, guardado numa resolução que ninguém consegue enxergar em jogo, caiu de 1,5 MB para meio mega. Somados os veículos, o total fechou em 5 MB — e o pacote passou a levar só os arquivos que o jogo de fato pede — nove que ninguém referencia ficaram de fora do pacote.
E a frente que você está lendo agora
Publicar o jogo é metade. A outra é isto aqui — o texto, o site que o hospeda, e tudo o que faz um post existir para alguém além de mim.
| O quê | O que exigiu |
|---|---|
| Este texto | escrito, medido e reescrito mais vezes do que eu contei — a primeira versão saiu com todos os vícios de texto de máquina |
| Os números | contados um a um nos registros das sessões. A primeira contagem saiu inflada em até quatro vezes e meia, e teve de ser refeita do zero |
| As imagens | o jogo do primeiro dia foi recuperado de uma pasta que nunca virou repositório, e rodado de novo só para render as capturas de como ele era |
| Os idiomas | o texto inteiro traduzido, com um endereço para cada idioma e a marcação que avisa ao buscador que são a mesma página |
| O site | domínio, hospedagem, e a página que vai juntar os capítulos conforme eles saírem |
| Medição | saber quantos chegam, quantos leem até o fim, e quantos trocam de idioma. Mais o aviso de cookies que a lei exige |
| Lista de e-mail | escolher o serviço, montar o formulário, e escrever a linha que diz o que acontece com o que você me manda |
| Contas | uma no itch.io, uma no X, um domínio — cada uma com um nome que precisava estar livre |
A primeira versão deste post estava cheia do que já apelidaram de AI slop: frases que avisam ao leitor que algo ali é interessante em vez de mostrar, simetrias bonitas que contradizem o número logo abaixo, perguntas retóricas que o texto nunca responde. Pedir "escreva melhor" não tira nada disso. O que funcionou foi pinçar as passagens ruins uma a uma e transformar cada uma numa regra — e a lista que saiu daí vale para os próximos capítulos.
A segunda conta
As duas metades — fazer o jogo e depois torná-lo público — medidas do mesmo jeito. A primeira coluna é a conta da seção anterior, inteira: método, ferramentas e jogo. A segunda é o que veio depois: o pacote público, a loja, o site e este texto em quatro idiomas.
| Fazer o jogo método, ferramentas e jogo | Publicar e contar depois do corte | As duas | |
|---|---|---|---|
| Janela | 04/09 18h39 → 06/09 19h18 | 06/09 23h05 → 10/09 23h05 | — |
| Tempo de relógio | 48,6 h | 96 h | 144,7 h |
| Trabalho ativo | 15,4 h | 35,9 h | 51,3 h |
| Falas minhas | 57 | 303 | 360 |
| Respostas da máquina | 748 | 2.685 | 3.433 |
| Tool use | 1.494 | 2.524 | 4.018 |
| Custo em assinatura | US$ 16 | US$ 25 | US$ 41 |
Em dinheiro as duas quase empatam — US$ 16 contra US$ 25. A diferença está em quanto de mim cada uma exigiu: 57 falas para fazer o jogo, 303 para publicá-lo.
O que vem
Capítulo 2, já em andamento
Quando este post saiu, o capítulo seguinte já tinha começado. O que está na bancada agora:
Som para valer. O áudio de osciladores do primeiro dia cumpriu seu papel, mas é hora de um motor de áudio de verdade — som por evento, mixagem, e um avaliador julgando se o tiro soa como o tiro que deveria ser.
Desempenho. Níveis de qualidade que se adaptam à máquina de quem joga, fusão de geometria, e um orçamento de quadro que o jogo respeita em vez de esperar o melhor.
Assets de outro patamar. Terreno esculpido a partir de dados de elevação reais, materiais com propriedades físicas por modelo, destruição, e efeitos volumétricos.
E a coisa que eu mais quero: colocar isto no ar para vocês jogarem. Uma fase, no navegador, sem instalar nada.
Sobre código e ferramentas
Por ora eu decidi não abrir o código, os prompts que usei, nem as ferramentas que construí. Quem sabe mais pra frente eu faça. Por enquanto, vou focar em compartilhar o meu processo, a lógica, as decisões, os erros, os números e os bastidores. É o que eu tenho para contar.
Se você quer acompanhar
O jogo vai crescendo em público, com os erros à mostra e os números abertos, capítulo por capítulo. E eu quero ouvir você — não sobre o código, sobre o jogo. A dificuldade parece justa? O helicóptero responde do jeito que deveria? O que faltou nesta primeira fase? Manda por aqui, ou responde no meu perfil no X.