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.
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ón | Para qué | Qué es |
|---|---|---|
| Una conversación sobre ideas | pensar el mecanismo, decidir | método |
| Una sesión de control | preparar el entorno, construir la herramienta | instrumentación |
| Una sesión sellada y aislada | producir, con autonomía larga | producción |
Medí las tres:
| Dónde | Frases mías | Tool use | Tool use por frase |
|---|---|---|---|
| Pensar el método | 28 | 36 | 1,3 |
| Construir la herramienta | 20 | 218 | 10,9 |
| Hacer el juego | 9 | 1.240 | 137,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.
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:
| Subsistema | Qué hace |
|---|---|
| Terreno | genera relieve, caminos, oasis y zonas llanas a partir del ruido |
| Render | dibuja la escena y la pasa por una cadena de posprocesado con bloom — el resplandor que se derrama desde las fuentes de luz |
| Audio | sintetiza todo en tiempo real: rotor, armas, explosiones, alarma |
| Partículas | fuego, humo, polvo y escombros, desde un conjunto fijo que se recicla |
| Proyectiles | trayectoria, alcance, y la prueba de colisión contra el suelo y los objetivos |
| Entidades | radar, batería antiaérea, tanque, jeep, soldado, rehén, caja de suministros, zona de aterrizaje |
| Misión | objetivos, recuentos, y el estado de victoria |
| Entrada | teclado 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.
<canvas> a pantalla
completa, y un mapa de importación apuntando a la biblioteca 3D. Todavía no pasa
nada.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.

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.
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:
recursos, transporte, armamento, misión · EMPATA
táctica del combate · PIERDE — misil 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:
"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:



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




En movimiento


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étodo | Herramienta | Juego | Total | |
|---|---|---|---|---|
| Frases mías | 28 | 20 | 9 | 57 |
| Respuestas de la máquina | 32 | 152 | 564 | 748 |
| Tool use | 36 | 218 | 1.240 | 1.494 |
| Tiempo activo | 2,4 h | 4,3 h | 8,7 h | 15,4 h |
| Tokens procesados | — | — | — | ≈ 370M |
Y el costo, que necesita dos renglones para no engañar a nadie:
(porción de la suscripción)
por API medida
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.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úblico | sacar 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 seguridad | ninguna variable global filtrándose, ninguna lectura de dirección, ninguna rama de desarrollo olvidada |
| Dieta de assets | de 8,7 MB a 5 MB por jugador — quien abre una página no está dispuesto a esperar |
| Una licencia | una decisión que no sabía que tendría que tomar tan temprano |
| Hospedaje, decidido dos veces | la primera elección se deshizo cuando itch.io resultó mejor para un juego de navegador |
| Tres cambios de nombre | el 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 idiomas | en 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 texto | escrito, 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úmeros | contados 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ágenes | el 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 idiomas | el 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 sitio | dominio, hospedaje, y la página que va a juntar los capítulos a medida que salgan |
| Medición | saber 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 correo | elegir el servicio, armar el formulario, y escribir la línea que dice qué pasa con lo que me mandas |
| Cuentas | una 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 | |
|---|---|---|---|
| Ventana | 04/09 18:39 → 06/09 19:18 | 06/09 23:05 → 10/09 23:05 | — |
| Tiempo de reloj | 48,6 h | 96 h | 144,7 h |
| Trabajo activo | 15,4 h | 35,9 h | 51,3 h |
| Frases mías | 57 | 303 | 360 |
| Respuestas de la máquina | 748 | 2.685 | 3.433 |
| Tool use | 1.494 | 2.524 | 4.018 |
| Costo en suscripción | US$ 16 | US$ 25 | US$ 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.