Jogar a fase 1
Cloud Strike · Capítulo 1

Vinte minutos até o primeiro voo

Uma homenagem ao Desert Strike, construída inteiramente com o Claude. O nome mistura os dois. Comecei num sábado ao meio-dia. Às 12h22 ele já estava no ar.

10 de setembro de 2026 · leitura longa · primeiro de uma série
20 min
até rodar no browser
1h47
até a primeira versão
9
frases minhas
1.240
tool use
US$ 11
custo real

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.

O deserto do Cloud Strike no primeiro dia
O primeiro dia. Deserto inteiro gerado por 1,6 KB de código de ruído — nenhuma textura, nenhum arquivo de arte.

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ãoPara quêO que é
Uma conversa de ideiaspensar o mecanismo, discutir, decidirmétodo
Uma sessão de controlepreparar o ambiente, construir a ferramentainstrumentação
Uma sessão fechada, isoladaproduzir, com autonomia longaprodução

Medi as três:

OndeFrases minhasTool useTool use por frase
Pensar o método28361,3
Construir a ferramenta2021810,9
Fazer o jogo91.240137,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.

noise.jsruído determinístico ruído terrain.js getHeight(x, z) todos chamam a mesma função heli.jso helicópteroentities.jso que há no mapaprojectiles.jstiros e mísseisparticles.jsfogo e fumaçahud.jspainel e minimapa mission.jsobjetivos e zonas main.jso laço de quadro e o pós-processamento input.jsteclado e mouse audio.jssom sintetizado
Onze arquivos. As setas em areia mostram os cinco módulos que importam o terreno para chamar a mesma função. Nenhum módulo da fila do meio conhece o vizinho — quem os costura é o 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:

SubsistemaO que faz
Terrenogera relevo, estradas, oásis e zonas planas a partir do ruído
Renderdesenha a cena e passa por uma cadeia de pós-processamento com bloom — o brilho que vaza das fontes de luz
Áudiosintetiza tudo em tempo real: rotor, armas, explosões, alarme
Partículasfogo, fumaça, poeira e destroços, com um estoque fixo reaproveitado
Projéteistrajetória, alcance e o teste de colisão contra o chão e os alvos
Entidadesradar, bateria antiaérea, tanque, jipe, soldado, refém, suprimento, zona de pouso
Missãoobjetivos, contagem, e o estado de vitória
Entradateclado 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.

12:07 — index.html, 8 KB
O esqueleto. Uma página, uma tela cheia, um <canvas>, e o mapa de importação apontando para a biblioteca 3D. Nada acontece ainda.
12:08 — noise.js, 1,6 KB
Aqui mora o deserto inteiro. Ruído determinístico com soma de oitavas — você pede a altura de qualquer ponto do mundo e a função devolve sempre o mesmo valor, sem guardar nada. É como funciona quase todo terreno procedural: não existe um mapa de alturas em disco, existe uma fórmula. Escrito no minuto seis e nunca mais tocado.
12:08 — audio.js, 5,5 KB
O som, também no minuto seis. Não há um único arquivo de áudio no jogo. O ronco do rotor é ruído branco puro, filtrado para deixar passar só os graves, e depois picotado treze vezes por segundo por uma onda quadrada. É isso: barulho aleatório, cortado num ritmo. Seu ouvido monta o resto e escuta um helicóptero. Armas, explosões e o alarme de travamento saem do mesmo lugar.
12:22 — o jogo roda
Vinte minutos depois da primeira frase, a página carrega sem um erro no console. Já dá para ver os problemas — a câmera está vertical demais, o terreno não tem grão, a sombra das montanhas invade o mapa — mas é um jogo.
12:23 — o primeiro bug bom
O tempo do jogo congela. A causa é uma daquelas coisas que só se aprende apanhando: o navegador não desenha quadros quando a aba não está visível. A função que pede o próximo quadro simplesmente não é chamada. A solução foi expor um botão invisível que avança a simulação na mão — que virou, por acidente, a ferramenta de teste mais útil do projeto.
12:23 – 12:26 — os testes
Movimento, tiro, combate. Depois o guincho, a zona de pouso, os mísseis antiaéreos. Um defeito real aparece: a mira cai no modo de emergência em vez de mirar de verdade.
12:47 – 13:11 — missão, helicóptero, projéteis, controles
A missão (objetivos, zonas, estradas), o helicóptero com sua inércia e inclinação, os projéteis, e a leitura de teclado e mouse. Quatro arquivos, 36 KB.
13:39 – 13:40 — partículas, entidades, HUD, terreno
O último ajuste geral. 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.
13:42 — build.mjs, 1,4 KB
Um empacotador de trinta linhas que costura tudo num único arquivo HTML de 218 KB. Você baixa um arquivo, abre no navegador, joga. Sem instalação, sem servidor.
A zona de pouso, primeiro dia
Voo sobre o deserto, primeiro dia
O jogo do primeiro dia: zona de pouso e voo raso. Tudo o que você vê é geometria gerada em código — nenhum modelo 3D importado, nenhuma textura.

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.

Uma nota sobre a barra

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:

sensação de controle  ·  VENCE
recursos, transporte, armamento, missão  ·  EMPATA
tática do combate  ·  PERDEmí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:

"uma areia só"  ·  "árvores-pirulito"  ·  "soldados-bloco"
"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:

A base, primeira rodada com assets
A base, rodada intermediária
A base, rodada final
Esquerda: as primeiras texturas entrando. Meio: solo e construções ganhando variação. Direita: o estado no fim do capítulo.

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

Bateria antiaérea, antes
Bateria antiaérea, depois
O mesmo alvo, o mesmo ângulo, rodadas de distância.
Oásis
Instalação de radar
Oásis e instalação de radar no fim do capítulo.

Em movimento

Explosão de bateria antiaérea
Soldado atingido
Quadros reais capturados durante as rodadas de avaliação — explosão de uma bateria antiaérea e um soldado sendo atingido.
Seis defeitos que só apareceram porque alguém olhou

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étodoFerramentaJogoTotal
Frases minhas2820957
Respostas da máquina32152564748
Tool use362181.2401.494
Tempo ativo2,4 h4,3 h8,7 h15,4 h
Tokens processados≈ 370M

E o custo, que precisa de duas linhas para não enganar ninguém:

US$ 16
o que eu paguei de fato
(fatia da assinatura)
US$ 822
o que teria custado
por API avulsa
52×
a diferença

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.2  ·  primeira subida
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úblicotirar 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çanenhuma variável global vazando, nenhuma leitura de endereço, nenhum trecho de desenvolvimento sobrando
Dieta de assetsde 8,7 MB para 5 MB por jogador — quem abre uma página não espera esperar
Licençauma decisão que eu não sabia que teria de tomar tão cedo
Hospedagem, decidida duas vezesa primeira escolha foi desfeita quando o itch.io se mostrou melhor para um jogo de navegador
Três renomeaçõeso 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 idiomasno 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 textoescrito, 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úmeroscontados 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 imagenso 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 idiomaso 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 sitedomínio, hospedagem, e a página que vai juntar os capítulos conforme eles saírem
Mediçãosaber quantos chegam, quantos leem até o fim, e quantos trocam de idioma. Mais o aviso de cookies que a lei exige
Lista de e-mailescolher o serviço, montar o formulário, e escrever a linha que diz o que acontece com o que você me manda
Contasuma 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
Janela04/09 18h39
→ 06/09 19h18
06/09 23h05
→ 10/09 23h05
Tempo de relógio48,6 h96 h144,7 h
Trabalho ativo15,4 h35,9 h51,3 h
Falas minhas57303360
Respostas da máquina7482.6853.433
Tool use1.4942.5244.018
Custo em assinaturaUS$ 16US$ 25US$ 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.

Jogar a fase 1 Receber os próximos capítulos