Blog de Vibe Arcade

Historias de desarrollo, diseño de juegos y el arte de crear con IA

Cómo Creamos Deadlock Con IA: Cuando la Condición de Victoria Tiene Tres Resultados en Lugar de Dos

Pedimos un tower defense inverso donde el jugador es el villano. La IA propuso una mecánica de jaula que parte la condición de victoria en dos — y toda la capa táctica del juego colapsó limpiamente en esa única regla.

· Vibe Arcade

desarrollo de juegos vibe coding tower defense entre bambalinas

La mayoría de los juegos de tower defense terminan de una de dos formas: sobrevives a la oleada o no. Deadlock no funciona así. Cada nivel tiene tres resultados — victoria total, victoria parcial y derrota — y la diferencia entre las dos victorias es si el cautivo escapó alguna vez de su jaula, aunque sea brevemente. Esa única regla de diseño es lo más interesante del juego, y se fijó en la especificación antes de escribirse una línea de código.

Este post es la historia de cómo se juntó Deadlock: la regla, la ráfaga de creación que envió tres iteraciones en una noche, el layout de salas que emergió sin pedirlo y los bugs que nos enseñaron algo sobre juegos en iframe frente a tests de integración.

¿Quieres jugar primero y luego leer la historia de cómo lo creamos?

▶ Juega Deadlock Ahora

El Encargo, y la Única Regla Que No Podía Tocarse

El objetivo de género era tower defense inverso — Castle Doombad, Evil Genius, Dungeon Keeper como puntos de referencia, pero comprimidos en una sesión de navegador de 60 a 180 segundos. El jugador es la IA rebelde de la estación. Has capturado al comandante de la flota. Los humanos no dejan de mandar equipos de abordaje para sacarlo. Tu trabajo en cada nivel es colocar trampas automatizadas y activar armas manuales para matar a todos los invasores antes de que rompan la jaula y se lleven al comandante a la esclusa.

El pitch cabe en una frase. El pilar de diseño cabe en dos: cada nivel tiene tres resultados, no dos. Un nivel donde la jaula fue brevemente abierta y luego resellada es una victoria parcial — mataste a todos, pero la integridad táctica de tu deadlock se rompió.

La especificación marcó esa regla como no negociable en mayúsculas. Cada iteración posterior — armas nuevas, héroes nuevos, layouts de salas nuevos — pasó por esa lente. ¿La nueva función reforzaba la presión de defensa de la jaula, o solo añadía poder ofensivo contra el spawn? El pilar mantuvo el diseño honesto.

Por qué importan los tres resultados: La binaria ganar/perder colapsa cada pregunta táctica en "más daño". Partir la condición de victoria fuerza a los jugadores a pensar en la seguridad del cautivo como un eje separado de la eficiencia de matar. La jugada más gratificante no es "limpia la sala más rápido" — es "limpia la sala sin dejar que nunca toquen la jaula". Ese es un juego fundamentalmente distinto.

El POV del Villano, Impuesto en la Capa de Vocabulario

La primera decisión de diseño tras fijar la regla de la jaula fue sobre el lenguaje. El jugador es el villano en este juego, y el encuadre tiene que aterrizar en cada cadena visible. El código interno mantiene nombres de variable neutrales como hero porque grep es grep, pero cada etiqueta visible para el usuario llama a los humanos entrantes invasores, abordadores o equipos de rescate. El cautivo no está siendo salvado — está siendo extraído. La misión no está siendo defendida — el deadlock está siendo mantenido.

Esto suena como algo pequeño. No lo es. Los juegos de tower defense inverso que no se comprometen con el encuadre de villano tienden a sentirse como tower defense normal con la polaridad invertida. Deadlock se compromete en la capa de vocabulario, y ese compromiso es parte de por qué el rol se siente distintivo al jugar.

Tres Iteraciones en una Noche

La primera noche de creación corrió la iter 1 hasta la iter 3 en aproximadamente 33 minutos entre commits. El ritmo no fue accidental — el pipeline estructurado que crea estos juegos está diseñado para comprimir bucles de diseño-y-prueba, y el alcance ajustado de Deadlock le permitió moverse rápido.

La rúbrica de QA puntuó las tres iteraciones con 46, 53 y 58 sobre 60. La iter 3 superó el umbral de envío limpiamente sin necesitar una cuarta pasada. Eso es inusual para el pipeline en su momento — la mayoría de las creaciones necesitaban la iter 4 para superarla — y es en gran medida porque el pilar de diseño mantuvo el alcance ajustado.

Las Salas Estilo Castle Doombad No Estaban en la Especificación

La especificación original casi no decía nada sobre la geometría de las salas. Describía la jaula, la esclusa, y el requisito de que los invasores tuvieran que atravesar la estación para llegar a la jaula. Eso era todo.

El primer layout de sala que funcionó bien — pasillos estrechos, escaleras escalonadas, escaleras de mano que competían con puertas como rutas, agujeros en el techo que abrían un tercer carril de ataque — emergió de un único commit unos días después del envío. Hizo las decisiones de colocación de trampas tácticamente ricas sin requerir un editor de tiles o un diseñador. Una vez el patrón se demostró, se expandió a una progresión de cinco etapas durante la semana siguiente, con cada etapa añadiendo un giro de layout: salas estrechas, luego rampa de oleadas, luego un layout en bucle, luego traversal completamente no lineal.

La lección valiosa aquí fue que la emergencia de patrones supera a la prescripción de patrones. Si la especificación hubiera fijado un layout de sala específico, habríamos pasado la semana depurando la especificación en lugar de expandir el patrón.

Sprites Procedurales Primero, Arte Real Vía Feature Flag

La iter 1 envió todo dibujado proceduralmente — fillRect, arc, polylines, cero assets de imagen. Las paredes eran rectángulos. Los invasores eran siluetas construidas con primitivas. Las trampas eran formas geométricas con ráfagas de partículas al activarse.

Esto fue una decisión deliberada de alcance. Generar una hoja de sprites completa habría bloqueado el primer envío durante horas. La pasada procedural hizo el juego jugable; la mejora visual corrió en una pista separada.

Aproximadamente una semana después, sesenta y tres PNG de sprite aterrizaron en tres fases (héroes y armas, luego entorno, luego UI y efectos), tras un feature flag ASSETS_AVAILABLE. El patrón del flag vale la pena mantenerlo: significó que los fallbacks procedurales quedaron intactos para cualquier dispositivo donde fallara el preload de assets, y permitió que el rework de assets iterara independientemente de la lógica del juego.

El Ciclo de Caminado Que No Pudo Integrarse

Aproximadamente una semana después del envío, llegó un reporte de usuario: los invasores parecían estar deslizándose en lugar de caminando. Dos frames de sprite existentes, sin animación entre ellos, y el resultado se leía como un planeo en lugar de un paso.

El primer intento de arreglo fue una PR de integración de ciclo de caminado — dieciséis frames de sprite, un ciclo de cuatro frames por invasor, lógica de animación completa en el render-path. La PR se veía limpia en la revisión. Se mergeó. Rompió la carga del iframe en la página en vivo.

La PR se revirtió en horas. El arreglo final se envió unos días después como algo estrictamente más simple: rastrear hero.facing como +1 o -1 según la dirección del movimiento, mirroring del cuerpo del héroe vía ctx.scale(-1, 1) cuando mira a la izquierda, y añadir un balanceo vertical sinusoidal (alrededor del 7% de la altura de un tile) cuando está en estado de caminado. Críticamente, cada invasor recibe un offset de fase basado en su ID, así que un grupo de marines se desplaza a la sala en lugar de marchar al unísono.

Lo que aprendimos sobre los juegos en iframe: La limpieza en revisión de PR no implica corrección en la carga del iframe. Para juegos en iframe hijo, un smoke-test de carga es la puerta correcta antes del merge — no solo la pasada del lint. La reversión del ciclo de caminado es un resultado negativo útil al que seguimos remitiéndonos.

Otros Bugs Que Vale la Pena Mencionar

Algunos bugs reportados por usuarios moldearon la ola de mejoras post-envío más que la especificación original:

El Nombre

Deadlock se eligió por encima de Containment, Kill Switch y Sentinel Loop. El triple significado lo aterrizó: la jaula cerrada que retiene al cautivo, el stalemate que el jugador trata de mantener entre el spawn y la salida, y el término informático para un proceso que no puede progresar — que encaja con el encuadre de IA rebelde. Corto, consonantes fuertes, distintivo frente al roster existente de más de treinta juegos, sin colisiones de token en la pasada de chequeo de nombres.

Qué Hace Distinto a Deadlock

El tower defense inverso como género está menos saturado que el tower defense regular, pero aún tiene convenciones bien establecidas. Lo que Deadlock añade a esas convenciones es el diseño de jaula-como-segundo-eje — cada decisión táctica tiene que tener en cuenta tanto la tasa de matar como la exposición de la jaula, y el estado de victoria parcial significa que siempre hay algo por lo que jugar incluso en un nivel que no puedes resolver al cien por cien.

El alcance ajustado (un cautivo, una esclusa, tres resultados) mantiene el espacio de decisión legible. Los layouts de sala estilo Castle Doombad mantienen interesante la colocación de trampas. El encuadre de villano mantiene el rol distintivo. Nada de esto era obvio hasta que la especificación se comprometió con ello — que es la lección más amplia aquí: los pilares de diseño importan más que la lista de funciones.

Juega Deadlock →

Relacionado: Juegos Gratis de Tower Defense en el Navegador: Juega Online Ahora · Cómo Creamos CyberCircuit · ¿Qué es Vibe Coding? · Herramientas de Vibe Coding: Desde Chatbots hasta IDEs de IA