Traducido por IA desde el original en portugués.Jugar el nivel 1
Cloud Strike · Capítulo 1

Veinte minutos hasta el primer vuelo

Un homenaje a Desert Strike, construido enteramente con Claude. El nombre mezcla los dos. Empecé un sábado al mediodía. A las 12:22 ya estaba en el aire.

10 de septiembre de 2026 · lectura larga · primero de una serie
20 min
hasta correr en el navegador
1h47
hasta la primera versión
9
frases mías
1.240
tool use
US$ 11
costo real

El juego de abajo — terreno, helicóptero, enemigos, misiles, sonido y misión — salió de nueve instrucciones mías, en una tarde de sábado.

Los números de arriba son de esa primera versión. Lo que está en línea para jugar es la misma idea con arte, sonido y trece rondas de crítica encima.

El desierto de Cloud Strike el primer día
El primer día. Un desierto entero generado por 1,6 KB de código de ruido — ninguna textura, ningún archivo de arte.

Por qué este juego

Un homenaje y un ancla

Hay un juego de 1992 llamado Desert Strike. Pilotas un helicóptero de combate en vista isométrica, administras munición y combustible, rescatas rehenes con un cabrestante y eliges el orden en que atacas los objetivos. Fue uno de los juegos de mi infancia.

Treinta y cuatro años después quise construir mi homenaje. Y el juego se volvió además un proyecto ancla: una buena excusa para aprender desarrollo de juegos, programación asistida por IA, y esto de trabajar en público, que nunca había hecho.

Un ancla resuelve un problema real. Es fácil "aprender sobre" algo y no llegar a ninguna parte. Se vuelve difícil engañarse cuando hay un artefacto que funciona o no funciona. El juez es el juego.

Cómo se divide el trabajo

Tres sesiones en paralelo

No trabajo en una sesión. Trabajo en tres, a la vez, cada una con una tarea distinta:

La sesiónPara quéQué es
Una conversación sobre ideaspensar el mecanismo, decidirmétodo
Una sesión de controlpreparar el entorno, construir la herramientainstrumentación
Una sesión sellada y aisladaproducir, con autonomía largaproducción

Medí las tres:

DóndeFrases míasTool useTool use por frase
Pensar el método28361,3
Construir la herramienta2021810,9
Hacer el juego91.240137,8

Dos órdenes de magnitud entre una punta y la otra. Pensar es conversación: una frase mía, una respuesta. Construir herramientas ya anda en casi once pasos por instrucción. Producir es arrancar el motor y salir del camino.

Hablé tres veces más para inventar el método que para construir el juego entero.


Cómo funciona por dentro

Una función en el centro

Once archivos, 133 KB de JavaScript, ningún motor de juego.

noise.jsruido determinístico ruido terrain.js getHeight(x, z) todos llaman a la misma función heli.jsel helicópteroentities.jslo que hay en el mapaprojectiles.jsdisparos y misilesparticles.jsfuego y humohud.jspanel y minimapa mission.jsobjetivos y zonas main.jsel bucle de cuadro y el posprocesado input.jsteclado y mouse audio.jssonido sintetizado
Once archivos. Las flechas color arena muestran los cinco módulos que importan el terreno para llamar a la misma función. Ningún módulo de la fila del medio conoce a su vecino — quien los cose es main.js. No es que sea la mejor arquitectura posible, ni que no necesite refactorización: es lo que generó la IA, y por ahora no la voy a refactorizar.

Todo empieza en el ruido. noise.js tiene 1,6 KB y ninguna dependencia: funciones matemáticas que, dado un punto, siempre devuelven el mismo valor pseudoaleatorio. Sumadas en varias frecuencias, se vuelven relieve del terreno.

Y todo converge en una sola función. terrain.js toma ese ruido y expone getHeight(x, z) — dado un punto del mapa, la altura del suelo ahí. Cinco módulos importan el terreno, y lo que todos quieren de él es esa función. El helicóptero, para saber a qué altura vuela. Las entidades, para apoyarse en el suelo. Los proyectiles, para saber que impactaron. Las partículas, para reventar en la superficie correcta. El panel, para dibujar el minimapa. Ningún motor de física, ninguna consulta al grafo de escena — una función pura que cualquiera puede llamar.

Y nadie conoce a su vecino. Helicóptero, entidades, proyectiles, partículas y panel están en la misma fila y no se importan entre sí. Quien los cose es main.js, solo al final. Por eso seis archivos pudieron reescribirse de una vez, en una sola pasada, sin romper nada — a cada uno le bastaba con seguir respondiéndole al terreno.

Los subsistemas

Lo que un motor ya hecho te daría de fábrica, aquí es código:

SubsistemaQué hace
Terrenogenera relieve, caminos, oasis y zonas llanas a partir del ruido
Renderdibuja la escena y la pasa por una cadena de posprocesado con bloom — el resplandor que se derrama desde las fuentes de luz
Audiosintetiza todo en tiempo real: rotor, armas, explosiones, alarma
Partículasfuego, humo, polvo y escombros, desde un conjunto fijo que se recicla
Proyectilestrayectoria, alcance, y la prueba de colisión contra el suelo y los objetivos
Entidadesradar, batería antiaérea, tanque, jeep, soldado, rehén, caja de suministros, zona de aterrizaje
Misiónobjetivos, recuentos, y el estado de victoria
Entradateclado y mouse, con la puntería derivada de la posición del cursor en el mundo

La construcción, minuto a minuto

Sábado, 12:02

Lo que sigue es el orden real en que las cosas fueron naciendo, sin reordenar prolijamente por tema después. Tomé las fechas de modificación de los archivos y el registro de la sesión. Es literalmente el juego armándose solo.

12:07 — index.html, 8 KB
El esqueleto. Una página, un <canvas> a pantalla completa, y un mapa de importación apuntando a la biblioteca 3D. Todavía no pasa nada.
12:08 — noise.js, 1,6 KB
El desierto entero vive aquí. Ruido determinístico sumado en octavas — pides la altura en cualquier punto del mundo y la función siempre devuelve el mismo valor, sin guardar nada. Así funciona casi todo terreno procedural: no hay un mapa de alturas en disco, hay una fórmula. Escrito en el minuto seis y nunca más tocado.
12:08 — audio.js, 5,5 KB
El sonido, también en el minuto seis. No hay un solo archivo de audio en el juego. El golpeteo del rotor es ruido blanco puro, filtrado para dejar pasar solo los graves, y después picado trece veces por segundo por una onda cuadrada. Eso es todo: ruido aleatorio, cortado a un ritmo. Tu oído arma el resto y escucha un helicóptero. Armas, explosiones y el aviso de fijación de blanco salen del mismo lugar.
12:22 — el juego corre
Veinte minutos después de la primera frase, la página carga sin un solo error en la consola. Los problemas ya se ven — cámara demasiado vertical, terreno sin grano, sombras de montaña derramándose por el mapa — pero es un juego.
12:23 — el primer buen error
El tiempo del juego se congela. La causa es una de esas cosas que se aprenden a los golpes: los navegadores no dibujan cuadros cuando la pestaña no está visible. La función que pide el cuadro siguiente sencillamente nunca se llama. El arreglo fue exponer un botón invisible que hace avanzar la simulación a mano — que por accidente se volvió la herramienta de prueba más útil del proyecto.
12:23 – 12:26 — las pruebas
Movimiento, disparo, combate. Después el cabrestante, la zona de aterrizaje, los misiles antiaéreos. Aparece un defecto real: la puntería cae en modo de emergencia en vez de apuntar de verdad.
12:47 – 13:11 — misión, helicóptero, proyectiles, controles
La misión (objetivos, zonas, caminos), el helicóptero con su inercia y su alabeo, los proyectiles, y la lectura de teclado y mouse. Cuatro archivos, 36 KB.
13:39 – 13:40 — partículas, entidades, HUD, terreno
La última pasada general. entities.js por sí solo ya tiene 40 KB: es el archivo que sabe qué es un radar, una batería antiaérea, un soldado, un rehén, un puesto de mando. Es el mundo.
13:42 — build.mjs, 1,4 KB
Un empaquetador de treinta líneas que cose todo en un único archivo HTML de 218 KB. Bajas un archivo, lo abres en el navegador, juegas. Sin instalación, sin servidor.
La zona de aterrizaje, el primer día
Vuelo bajo sobre el desierto, el primer día
El juego del primer día: zona de aterrizaje y vuelo bajo. Todo lo que se ve es geometría generada en código — ningún modelo 3D importado, ninguna textura.

La stack

Me impuse una restricción desde el arranque: tiene que correr en el navegador, en 3D, sin nada para instalar. Eso llevó a una biblioteca 3D para la web y JavaScript pelado, sin motor de juego. Sin editor visual, sin física ya hecha, sin sistema de partículas ya hecho — todo escrito a mano.

Fue la decisión correcta para el primer capítulo, y en algún momento probablemente sea la equivocada.


El motor de calidad

Quien construye no juzga

El problema de construir junto a una IA es que te da la razón. Le pides una explosión, hace una explosión, y le parece excelente. Si quien construye también evalúa, la vara se desliza hacia abajo hasta apoyarse en lo que ya estaba hecho.

Así que, siguiendo el gauntlet loop — la idea de poner a un constructor y a un crítico en veredas opuestas, con contexto fresco en cada vuelta —, separé los papeles. De un lado, el constructor. Del otro, un crítico que nunca vio el código, no sabe qué se intentó, y recibe solo dos imágenes lado a lado — la mía y una referencia de calidad — con una pregunta: cuál de las dos es mejor, y por qué, en cada aspecto por separado. Paleta. Luz. Movimiento. Siluetas. Cámara. Cada aspecto recibe su propio veredicto.

Una nota sobre la vara

Las referencias que recibía el crítico nunca fueron la meta. Son un instrumento de dirección: a un evaluador le resulta muchísimo más fácil decir "esta es peor porque la paleta es monocroma" que decir "esto está bien". La comparación existe para producir crítica específica y accionable.

El primer veredicto visual fue brutal: cinco aspectos a cero en mi contra. Y fue útil, porque venía con nombres: paleta monocroma, sol demasiado alto con la exposición quemada, explosiones chatas, cámara que se anticipa de más al movimiento, enemigos sin marca visual.

El crítico de jugabilidad, corriendo en paralelo, fue más amable y más duro a la vez:

sensación de control  ·  GANA
recursos, transporte, armamento, misión  ·  EMPATA
táctica del combate  ·  PIERDEmisil antiaéreo imposible de esquivar, 0 de 8 esquives

Las seis carencias que nombraron los dos críticos se corrigieron de una sola vez, en seis archivos. En el medio hubo un tropiezo: el filtro de seguridad del modelo rechazó uno de los comandos — justo el que cambiaba el color del cielo y el de la luz del sol. Reenviado sin cambiarle nada, treinta y cinco segundos después, pasó.

El misil que no se podía esquivar

En la segunda ronda el crítico volvió con mediciones en vez de opiniones: el aviso "DODGE!" aparecía 0,20 segundos antes del impacto — el tiempo de reacción humano no existe ahí — el tiempo de recarga de la maniobra era de 2,2 segundos, que no cubría una andanada de tres misiles, y dos tipos de arma enemiga no daban aviso alguno.

Tres números, tres correcciones. En la ronda siguiente: ventana de 0,62 segundos, 6 esquives en 6 intentos, y una andanada de tres misiles sobrevivida. De imposible a justo en dos iteraciones — y ninguna de ellas salió de mí. Yo ni siquiera estaba mirando.

La cámara, que perdía en las dos primeras rondas, empató en la tercera y se quedó ahí. Meta cumplida, aspecto trabado, nadie lo toca de nuevo.

Dónde se detuvo

"Una sola arena, árboles de chupetín"

Cinco rondas después, cuatro aspectos visuales no se movían: paleta, luz, movimiento y siluetas. Y el crítico, que no tenía idea de lo que yo había intentado, seguía diciendo lo mismo con palabras cada vez más precisas:

"una sola arena"  ·  "árboles de chupetín"  ·  "soldados de bloques"
"las clases de enemigo solo se distinguen por el anillo de color en el suelo"

Tenía razón. Mira otra vez la primera imagen de este texto: es un desierto de un solo color, con arbustos que son esferas verdes achatadas.

Y entonces vino la decisión que considero la mejor del capítulo, y fue parar.

Cuando un aspecto no converge durante tres rondas seguidas, la regla es reportar la causa en vez de bajar la vara. La causa aquí era estructural y obvia en retrospectiva: no se llega a riqueza visual generando arte con código procedural. Cada ronda ajustaba un parámetro en un sistema que no tenía manera de producir el resultado pedido.

Así que el bucle se detuvo solo, anotó "bloqueado por falta de medios" en los cuatro aspectos, y me devolvió el problema. Una hora y cuarenta y siete minutos después de empezar, yo tenía un juego jugable, un diagnóstico honesto de lo que faltaba, y ninguna mentira en el registro.


La pausa

Dos horas y media construyendo una herramienta

El diagnóstico era que faltaba un medio para producir arte. El juego estuvo quieto casi doce horas — dormí durante una parte — y dentro de esa ventana hubo dos horas y media de trabajo continuo construyendo un pipeline de assets: una pieza que toma un pedido ("suelo de desierto que se repita sin costura", "palmera baja", "vehículo militar") y devuelve un archivo terminado, sacado de bibliotecas de arte libre o generado a medida, con su procedencia registrada.

Y "construí" es una manera de decir. Quien trabajó de madrugada fue Claude, suelto en yolo mode — sin parar a pedirme permiso a cada paso — dentro del recinto aislado donde puede equivocarse sin llevarse nada más por delante.

Antes de eso, un paso decisivo: ir a buscar referencias visuales de verdad. No se puede pedir "hazlo lindo". Sí se pueden tomar imágenes del género, sacarles una paleta y una dirección de luz, y usar eso como material de trabajo. Buena parte de la calidad que vino después nació en esa media hora aburrida de juntar fotos.

Y hubo un fracaso que yo no habría anticipado. Para recortar el fondo de las texturas generadas, le pedí al generador que lo pintara de magenta puro — un color que no aparece en nada natural, justamente para que fuera fácil de encontrar y borrar después. Devolvió un magenta casi puro.

Al ojo, idéntico. Para el recorte, que buscaba un valor de color exacto, no había magenta alguno: no se borraba nada, y cada textura salía envuelta en un rectángulo chillón. El arreglo fue dejar de suponer el color y empezar a medirlo en el borde de cada imagen.

Es un fracaso que solo existe cuando se automatiza sobre un generador. Acierta en lo que un humano juzgaría y falla en lo que una máquina exige — y la distancia entre las dos cosas es invisible hasta que la máquina se rompe.

El antes y el después

El desierto gana textura

Con la herramienta lista, el bucle volvió a empezar. Trece rondas de crítica, diecisiete texturas generadas, y modelos tridimensionales de verdad entrando en lugar de las cajas.

La misma base militar, en tres momentos del proceso:

La base, primera ronda con assets
La base, ronda intermedia
La base, ronda final
Izquierda: las primeras texturas llegando. Centro: suelo y estructuras ganando variación. Derecha: el estado al final del capítulo.

Y la batería antiaérea — la misma que antes era imposible de esquivar — antes y después:

Batería antiaérea, antes
Batería antiaérea, después
El mismo blanco, el mismo ángulo, rondas de distancia.
Oasis
Instalación de radar
Oasis e instalación de radar al final del capítulo.

En movimiento

Batería antiaérea explotando
Soldado alcanzado
Cuadros reales capturados durante las rondas de evaluación — una batería antiaérea explotando y un soldado alcanzado.
Seis defectos que solo aparecieron porque alguien miró

A lo largo de las rondas se atraparon seis regresiones silenciosas: la base tapando la bola de fuego de la explosión, un filtro oscureciendo los cuadros de fuego, el conjunto de partículas agotándose en medio de un combate, granadas detonando durante la captura de imagen, comentarios de código comiéndose líneas por error, y la mitad de cada bola de fuego desapareciendo porque el motor descarta la cara trasera de los polígonos. Ninguna rompía el juego. Todas aparecieron porque había un evaluador mirando cuadro por cuadro.


La cuenta

Dieciséis dólares

Estaba todo registrado desde el arranque, así que la cuenta cierra renglón por renglón.

 MétodoHerramientaJuegoTotal
Frases mías2820957
Respuestas de la máquina32152564748
Tool use362181.2401.494
Tiempo activo2,4 h4,3 h8,7 h15,4 h
Tokens procesados≈ 370M

Y el costo, que necesita dos renglones para no engañar a nadie:

US$ 16
lo que pagué de verdad
(porción de la suscripción)
US$ 822
lo que habría costado
por API medida
52×
la diferencia

La suscripción mensual es de US$ 200. La prorrateé por semana y medí qué porción de mi consumo total fue este capítulo: 34%. Da dieciséis dólares. El otro número es el mismo trabajo cobrado como servicio medido.


Un detalle que vas a escuchar. En la radio, el helicóptero responde al nombre Sandstorm. Es un fósil: ese fue el primer nombre del juego, hasta que descubrí que ya existía un juego publicado con él. El nombre cambió; el indicativo quedó.


Después del juego terminado

La otra mitad del trabajo

El juego quedó jugable en 1h47. Ponerlo donde alguien pudiera abrirlo, y contar cómo fue hecho, llevó cuatro días y 35,9 horas de trabajo.

Esa parte no entra en los números de la sección anterior porque trata de otra cosa: convertir una carpeta que corre en mi máquina en algo que se abre en la de un desconocido — y después explicar lo que pasó adentro.

Cuatro versiones hasta poder jugarlo en itch.io

El juego ya corría. Abres el archivo y juegas — así jugué yo el capítulo entero. Publicarlo llevó cuatro intentos.

v0.1.2  ·  primera subida
v0.1.3  ·  el botón de jugar daba 404 — el servidor de itch.io no resuelve direcciones de carpeta
v0.1.3  ·  el juego abría en portugués para todo el mundo
v0.1.4  ·  dentro del marco de itch.io la rueda del mouse desplazaba la página de atrás, el teclado nunca recibía el foco, y la pantalla se ponía negra y temblaba hasta estabilizarse

Entre la primera y la última no cambió ninguna regla, ningún arte, ningún audio. Lo que cambió fue lo que hace que un juego funcione dentro de la página de otra persona.

El último punto exigió código nuevo en el juego. Sin él, los primeros segundos dentro del marco de itch.io eran una pantalla negra que temblaba hasta estabilizarse — la tarjeta de video compilando, en plena partida, los programitas que usa para dibujar. La corrección fue el precalentamiento de shaders: mandar a compilar todo antes, mientras LOADING sigue en pantalla. Es práctica corriente en los juegos, y lo que la trajo hasta aquí fue la publicación.

Y antes de eso, lo que nadie ve

QuéPor qué
Una compilación aparte para el públicosacar del paquete los ganchos de prueba, incrustar la biblioteca 3D en vez de traerla de un CDN, bajar la precisión de las mallas
Revisión de seguridadninguna variable global filtrándose, ninguna lectura de dirección, ninguna rama de desarrollo olvidada
Dieta de assetsde 8,7 MB a 5 MB por jugador — quien abre una página no está dispuesto a esperar
Una licenciauna decisión que no sabía que tendría que tomar tan temprano
Hospedaje, decidido dos vecesla primera elección se deshizo cuando itch.io resultó mejor para un juego de navegador
Tres cambios de nombreel primero chocaba con un juego publicado; el segundo lo abandoné por mi cuenta. Cada cambio tocó el título, la pantalla de apertura, la licencia y la clave de idioma
Dos idiomasen el juego y en este texto, decididos por separado y llegando a la misma respuesta: inglés por defecto, portugués a un clic

La dieta rindió más de lo que yo esperaba, porque el peso estaba concentrado. El juego salía con 8,7 MB por jugador, y un solo archivo representaba más de un tercio: el soldado, con 3,6 MB. Casi todo eso eran animaciones — veinticuatro secuencias de movimiento, de las cuales el juego usa ocho. Quitadas las dieciséis que nadie ve y comprimida la geometría, bajó a 1,4 MB.

El cielo, guardado en una resolución que nadie alcanza a distinguir jugando, pasó de 1,5 MB a medio mega. Sumados los vehículos, el total cerró en 5 MB — y el paquete pasó a llevar solo los archivos que el juego de verdad pide: nueve que ningún archivo referencia quedaron afuera.

Y el frente que estás leyendo ahora mismo

Publicar el juego es la mitad. La otra es esto — el texto, el sitio que lo aloja, y todo lo que hace que un texto exista para alguien además de mí.

QuéQué exigió
Este textoescrito, medido y reescrito más veces de las que conté — la primera versión salió con todos los vicios de la prosa de máquina
Los númeroscontados uno por uno en los registros de las sesiones. El primer conteo salió inflado hasta cuatro veces y media, y hubo que rehacerlo desde cero
Las imágenesel juego del primer día fue recuperado de una carpeta que nunca llegó a ser repositorio, y corrido de nuevo solo para capturar cómo era
Los idiomasel texto entero traducido, con una dirección para cada idioma y la marca que le avisa al buscador que son la misma página
El sitiodominio, hospedaje, y la página que va a juntar los capítulos a medida que salgan
Mediciónsaber cuántos llegan, cuántos leen hasta el final, y cuántos cambian de idioma. Más el aviso de cookies que exige la ley
Lista de correoelegir el servicio, armar el formulario, y escribir la línea que dice qué pasa con lo que me mandas
Cuentasuna en itch.io, una en X, un dominio — cada una con un nombre que tenía que estar libre

La primera versión de este texto estaba llena de lo que ya apodaron AI slop: frases que le avisan al lector que algo ahí es interesante en vez de mostrarlo, simetrías bonitas que contradicen el número de más abajo, preguntas retóricas que el texto nunca responde. Pedir "escribe mejor" no saca nada de eso. Lo que funcionó fue pinzar los pasajes malos uno por uno y convertir cada uno en una regla — y la lista que salió de ahí vale para los próximos capítulos.

La segunda cuenta

Las dos mitades — hacer el juego y después volverlo público — medidas de la misma manera. La primera columna es la cuenta entera de la sección anterior: método, herramientas y juego. La segunda es lo que vino después: el paquete público, la tienda, el sitio y este texto en cuatro idiomas.

 Hacer el juego
método, herramientas y juego
Publicar y contar
después del corte
Las dos
Ventana04/09 18:39
→ 06/09 19:18
06/09 23:05
→ 10/09 23:05
Tiempo de reloj48,6 h96 h144,7 h
Trabajo activo15,4 h35,9 h51,3 h
Frases mías57303360
Respuestas de la máquina7482.6853.433
Tool use1.4942.5244.018
Costo en suscripciónUS$ 16US$ 25US$ 41

En dinero las dos casi empatan — US$ 16 contra US$ 25. La diferencia está en cuánto de mí exigió cada una: 57 frases para hacer el juego, 303 para publicarlo.

Lo que viene

Capítulo 2, ya en marcha

Cuando este texto salió, el capítulo siguiente ya había empezado. Lo que está en el banco de trabajo ahora:

Sonido en serio. El audio por osciladores del primer día cumplió su función, pero es hora de un motor de audio de verdad — sonido disparado por eventos, mezcla, y un evaluador juzgando si el arma suena como el arma que debería ser.

Rendimiento. Niveles de calidad que se adaptan a la máquina del jugador, fusión de geometrías, y un presupuesto de cuadro que el juego respete en vez de cruzar los dedos.

Assets un escalón arriba. Terreno esculpido a partir de datos reales de elevación, materiales basados en física (PBR) por modelo, destrucción, y efectos volumétricos.

Y lo que más quiero: poner esto en línea para que lo juegues. Un nivel, en el navegador, sin nada para instalar.

Sobre el código y las herramientas

Por ahora decidí no abrir el código, los prompts que usé, ni las herramientas que construí. Quizá más adelante lo haga. Por el momento me voy a concentrar en compartir mi proceso: la lógica, las decisiones, los errores, los números y la trastienda. Es lo que tengo para contar.

Si quieres seguir esto

El juego crece en público, con los errores a la vista y los números abiertos, capítulo a capítulo. Y quiero saber qué te parece — no sobre el código, sobre el juego. ¿La dificultad se siente justa? ¿El helicóptero responde como debería? ¿Qué le faltó a este primer nivel? Cuéntamelo aquí, o responde en mi perfil de X.

Jugar el nivel 1 Recibir los próximos capítulos