Los mejores roguelikes no solo te matan. Hacen que quieras morir.
Suena extraño, pero cualquiera que haya perdido una partida a medianoche y haya empezado otra a las 12:03 conoce la sensación. La muerte duele. Tu salud cae a cero. La pantalla se inunda de fracaso. Sin embargo, tu dedo ya está sobre el botón de jugar. Algo en los últimos veinte minutos importó lo suficiente como para que no puedas dejar el juego donde terminó.
Este es el bucle de "una partida más", y no es accidental. Está diseñado. Si estás construyendo un roguelike o cualquier juego con muerte permanente (permadeath), todo tu trabajo consiste en equilibrar dos fuerzas opuestas. El jugador debe perder lo suficiente para sentir tensión. Debe conservar lo suficiente para sentir esperanza.
La moneda del fracaso
En mi último proyecto, Neon Survivor, quería exactamente esa tensión. Cuando el jugador muere, todo lo recolectado durante la partida desaparece excepto una cosa: el oro. Ese oro se guarda automáticamente en el banco. De vuelta en el menú, lo gastan en mejoras permanentes. Luego saltan de nuevo a la acción, un poco más fuertes que antes.
Este sencillo bucle sostiene todo el juego. Sin él, la muerte es un punto final. El jugador se marcha porque la última partida no le dio nada. Con él, la muerte es una coma. La partida se convirtió en una sesión de farmeo. La pérdida duele, pero también pagó el mañana.
El truco es sencillo. Conservas algo incluso cuando lo pierdes todo. La dificultad reside en asegurarse de que lo que conservas importe sin destruir el desafío. Si las mejoras son demasiado débiles, al jugador deja de importarle. Si son demasiado fuertes, el juego se juega solo. El bucle colapsa de cualquier manera.
Dos relojes, cero confusión
Para construir esto correctamente, tuve que gestionar dos líneas de tiempo separadas.
El Run Clock se reinicia cada vez que pulsas jugar. Rastrea la salud, la puntuación actual, el recuento de oleadas de enemigos y cualquier potenciador temporal recogido durante la sesión. Cuando el personaje muere, este reloj vuelve a cero.
El Meta Clock nunca se reinicia. Contiene el oro total ganado en cada intento, la oleada más alta alcanzada y cada mejora permanente comprada. Este reloj sigue avanzando sin importar cuántas veces se refresque el navegador.
Mezcla estos dos y obtendrás errores difíciles de rastrear y dolorosos de corregir. He visto desarrolladores borrar accidentalmente el progreso del jugador durante un reinicio de escena rutinario porque una función de limpieza tocó el almacén de datos equivocado. Los datos del Meta Clock se evaporan. El jugador vuelve a cero oro y cero mejoras. En ese punto, la relación entre tú y tu jugador se rompe. No están empezando una nueva partida; están empezando un nuevo rencor.
Mantener los relojes separados no es solo una elección de estilo. Es una estrategia de supervivencia.
Cómo Phaser v4 gestiona la división
Construí Neon Survivor en Phaser v4, que ofrece dos herramientas específicas para este problema.
El Registry contiene datos en vivo en la memoria para la sesión actual. Es rápido. Es sencillo. También se evapora en el momento en que el jugador refresca la página.
LocalStorage guarda los datos en el propio navegador. Sobrevive al cierre de pestañas, reinicios del navegador y cortes de energía. También es más lento y menos fiable. Los navegadores pueden bloquearlo, limitarlo o borrarlo si las cuotas de almacenamiento se llenan.
Mi elección de diseño fue estricta. El Registry es la única fuente de verdad durante la partida. El juego lee de él, escribe en él y confía plenamente en él. LocalStorage no actúa como coautor. Actúa como un espejo.
Así es como funciona el flujo. El juego escribe una compra de mejora en el Registry. Una única clase gestora vigila el Registry. Cuando es apropiado, ese gestor refleja los datos del Registry en LocalStorage. Si el navegador bloquea la escritura, el juego no se entrecorta. Si el almacenamiento falla, la sesión actual sigue funcionando perfectamente. El jugador podría perder el progreso solo si cierra la pestaña en el mismo segundo exacto, pero la sesión en sí nunca falla.
Este patrón evita un desastre sutil. Si permites que cada sistema escriba directamente en LocalStorage, creas dependencias de una API frágil. Un jugador con la configuración de privacidad al máximo o un dispositivo con poco almacenamiento podría ver que el juego se ralentiza o se congela durante el combate porque alguna función en segundo plano intentó guardar estadísticas. Al hacer del Registry la única fuente de verdad, mantienes la acción rápida y el riesgo contenido.
Deja que el código respire
También utilicé eventos para desacoplar los sistemas. Cuando una partida termina, el GameScene no gestiona su propio funeral. No llama a una función de guardado. No importa una utilidad de almacenamiento. Simplemente emite un evento "run-ended" con un payload con los datos relevantes.
Un listener separado se encarga de la contabilidad. Recibe el evento, actualiza el Meta Clock y le indica al manager que refleje los nuevos totales en el LocalStorage.
Esta separación rinde frutos de inmediato. Puedo reescribir toda la GameScene, cambiar el personaje del jugador, modificar el ángulo de la cámara o incluso cambiar el género de supervivencia a bullet hell sin tocar el sistema de guardado. Los sistemas son independientes. Se comunican a través de eventos, no mediante llamadas directas a funciones. Eso significa menos conflictos de fusión (merge conflicts), menos errores y una base de código que no se convierte en espagueti después de seis meses.
Mejoras que cambian el juego
Tener un respaldo técnico es inútil si las recompensas parecen una hoja de cálculo. Dediqué mucho tiempo a cómo se sienten realmente las mejoras al jugar.
Algunas mejoras son seguras. Velocidad de movimiento extra. Salud adicional. Recarga más rápida. Estas le dan al jugador más margen de error. Son reconfortantes. Reducen la dificultad del juego sin cambiar sus reglas.
Otras mejoras reescriben las reglas por completo. En Neon Survivor, añadí "Piercing Rounds". Antes de esta mejora, una bala se detenía al impactar con el primer enemigo. Después de la mejora, atraviesa a los enemigos, pudiendo limpiar líneas enteras de un solo disparo.
La diferencia es drástica. La velocidad y la salud pueden permitirte sobrevivir más tiempo, pero Piercing Rounds cambia tu forma de posicionarte. Empiezas a alinear enemigos. Dejas de moverte en círculos por los bordes y empiezas a abrirte paso por el centro. El espacio de decisión del juego se expande.
Una buena progresión debe cambiar las decisiones del jugador, no solo aumentar sus números. Si cada mejora es un incremento porcentual, el jugador deja de leer las descripciones. Hace clic, mejora y se olvida. Si una mejora le obliga a replantear su estrategia, la recuerda. Habla de ella. Vuelve para ver qué otra cosa podría darle la vuelta al juego.
La verdadera recompensa
El bucle de "una partida más" no es un sistema único. Es una relación entre pérdida y ganancia, construida sobre una arquitectura limpia y recompensas significativas.
Crea dos líneas de tiempo distintas y protege el Meta Clock como si contuviera la confianza de tus jugadores, porque así es. Utiliza las herramientas de tu motor para mantener los datos en vivo rápidos y los datos persistentes seguros. Desacopla tus escenas de tu almacenamiento para que puedas iterar sin miedo. Y cuando diseñes mejoras, pregúntate si le dan al jugador más tiempo o decisiones más interesantes.
Haz esto bien y tus jugadores no solo tolerarán la muerte. Dependerán de ella. Cada partida se convierte en un pago inicial para la siguiente. El juego deja de ser una serie de reinicios y se convierte en un ascenso único y continuo.
