Cómo modelé el sueño para que una noche mala no hunda al personaje
En HeroPath, lo que haces en tu día real mueve los estados de un personaje. El sueño es la entrada más peligrosa de todas, porque no toca un estado: toca cuatro. Energía, Concentración, Ánimo y Salud dependen en alguna medida de cuánto has dormido.
Eso convierte una noche mala en un problema de diseño. Si la traslado tal cual, un día de insomnio tumba al personaje entero y la app se convierte en lo que no quiero que sea: un sitio donde te asomas después de dormir cinco horas y te encuentras todo en rojo. Pero si la amortiguo demasiado, dormir deja de significar nada y entonces sobra la mecánica.
La regla que quería cumplir cabe en una línea:
Una noche mala no es una crisis. Tres seguidas, sí.
Lo demás de este post es cómo se convierte esa frase en números, de dónde salen esos números — y el momento, escribiendo este mismo texto, en que descubrí que los de mi propio documento estaban mal.
Capa 1: el estado no es la noche de ayer
El primer error que cometí fue el obvio: que el estado Sueño fuese la última noche. Con eso, cada mañana el personaje empieza de cero y una sola noche rara borra dos semanas de descanso decente. La memoria del sistema es tan corta que ninguna racha significa nada.
Ahora las horas se convierten primero a una nota de 0 a 100 — 7 a 9 horas ronda el 90–100, 6 horas es un 65, 5 horas un 40, por debajo de 4 un 15 — y esa nota no sustituye al estado: lo empuja.
Un cuarto de peso a lo de anoche y tres cuartos a lo que ya había. Con eso, los números cuentan la regla sin que yo tenga que explicarla:
- Una noche de 5 horas sobre un Sueño de 85 lo deja en 74. Se nota, no es una crisis.
- Tres seguidas: 85 → 74 → 66 → 60. Ahí sí duele, y debe doler.
Hay un detalle pequeño que me gusta más de lo que debería: si te acuestas a menos de media hora de la noche anterior, la nota sube 5 puntos. No premia dormir mucho, premia dormir parecido, que es lo que de verdad sostiene el descanso a largo plazo. Con horario regular, esas tres noches malas caen a 62 en vez de a 60.
El suelo que no había calculado
Si duermes cinco horas todas las noches, ¿dónde acaba el Sueño? Mi intuición decía 40, que es la nota de una noche de cinco horas. Es lo que pasa cuando una media móvil persigue un valor fijo: se acerca sin llegar.
Pero la app redondea en cada paso, y con el redondeo la media se planta en 42 al cabo de once noches. Para bajar de ahí hay que dormir menos de cinco horas. No es un matiz de contable: la tabla de la segunda capa está escrita para «Sueño = 40», y resulta que ese 40 no significa «duermo poco» — significa «llevo días durmiendo muy poco». Un usuario normal casi nunca lo ve.
Capa 2: el sueño empuja, no multiplica
La segunda tentación era multiplicar: que la energía fuese «su valor × el factor de sueño». Descartado por la misma razón que lo anterior. Un multiplicador convierte una mala noche en un castigo proporcional a todo lo demás que hiciste bien, y eso es exactamente lo que no quiero que sienta alguien que además madrugó para entrenar.
Así que el sueño no manda sobre los otros estados: les suma o les resta alrededor de un punto neutro, el 70.
Cada estado tiene su propia k, y ahí es donde se decide qué clase de app es esta. Con el Sueño hundido en 40:
- Energía (k = 0,40): −12. El golpe más fuerte, y aun así no es demoledor.
- Concentración (k = 0,35): −10.
- Ánimo (k = 0,20): −6. Apenas se mueve por el sueño solo, porque el ánimo tiene muchos otros motores. Es realista: se puede dormir fatal y tener un buen día.
- Salud (k = 0,10): −3. La salud no se arruina en una semana.
El personaje rinde menos esos días. No queda roto. Esa es toda la diferencia entre un sistema que te acompaña y uno que te pasa factura.
Donde me equivoqué, parte uno: mi documento mentía
Este post estaba anunciado para el 15 de septiembre y salió hoy. El motivo es que, al escribirlo, fui a comprobar los números del ejemplo — los de arriba — y no me salían.
En el documento de diseño llevaban meses escritas otras: una noche mala dejaba el Sueño en ~73, y tres seguidas lo llevaban a 74 → 65 → 58. Las de verdad son 74, y 74 → 66 → 60. La diferencia es que el código redondea en cada paso y mi ejemplo no; nadie lo había notado porque nadie recalcula un ejemplo que ya está escrito. Eran tres cifras mal en la sección que explica la mecánica más delicada de la app.
Las recalculé contra las dos funciones que se ejecutan de verdad en el móvil, corregí el documento el 16 de septiembre y solo entonces seguí escribiendo. Y dejé una regla apuntada en esa misma sección, que es lo único que evita que vuelva a pasar:
Cualquier cifra de esta sección que se cite en público se comprueba antes contra el código.
Es la segunda vez que me pasa lo mismo en este diario: la entrada anterior iba de una regla de tono que llevaba siete semanas rota en la app sin que yo lo supiera. Empiezo a pensar que el valor de escribir esto en público no es contar lo que hago, sino que obliga a comprobarlo.
Donde me equivoqué, parte dos: casi cuento esto al revés
Tenía escrito, en el borrador, que tres noches malas «te hunden la energía». Es falso para mucha gente, y lo es por una decisión que tomé yo hace meses.
HeroPath te pregunta una vez al día cómo está tu cuerpo y cómo estás de ánimo. Cuando contestas, tu respuesta pesa 0,70 y la fórmula solo 0,30: la app no puede contradecir en la misma pantalla lo que acabas de decirle. De modo que una mala racha de sueño se nota entera en Concentración y en Salud, pero en Energía y en Ánimo solo mientras no reportes. Si cada mañana dices que estás bien, la app te cree.
Lo cuento porque es justo el tipo de frase que uno publica sin querer: suena bien, es coherente con el resto del post y está mal. El documento lo avisa con todas las letras — «cualquier texto público que diga que tres noches malas hunden la energía es falso para quien reporta cada día» — y lo escribí ahí precisamente para tropezarme con ello el día que escribiera esto.
Lo que la app no hace, y me cuesta
HeroPath no mide tu sueño. No lee sensores, no se conecta a una pulsera, no pide permisos de actividad física. Las horas que registra son las que hay entre que confirmas la alarma por la noche y la hora a la que vas a levantarte: son horas previstas, no medidas, y el estado se recalcula en ese momento y no al despertar.
El coste es obvio: si te desvelas a las cuatro, la app no se entera. Si te quedas dormido una hora más, tampoco. A cambio no hay ni un permiso que justificar, ni un dato de salud saliendo del móvil, ni una dependencia de un dispositivo que la mayoría no tiene. Para una app que promete que tus datos se quedan contigo, esa es la parte que no estoy dispuesto a negociar — aunque signifique que el número sea el que tú decides, con lo que eso tiene de imperfecto.
Las siestas, por cierto, no entran en la media. Suman 4 puntos sueltos y no tocan tu hora de referencia para acostarte. Una siesta de veinte minutos no debería contar como «has dormido poco» ni arreglar una noche de cuatro horas, y con la media entera no había forma de que no hiciera una de las dos cosas.
Lo que queda
El sueño es el único sitio de la app donde una sola pantalla mueve cuatro estados a la vez, y por eso es donde más me ha costado no pasarme de listo. La versión que quedó es deliberadamente sosa: una media, un punto neutro y cuatro coeficientes pequeños.
Si dentro de seis meses alguien me dice que su personaje se hunde por dormir mal, tendré dos sitios donde mirar y los dos estarán escritos. Eso, cuando trabajas solo, vale más que acertar a la primera.
HeroPath es un gestor de hábitos con mecánicas de RPG: lo que haces en tu día real alimenta a un personaje con estados, áreas de vida y misiones. Funciona sin conexión, sin anuncios, y por defecto tus datos se quedan en tu móvil.
Ya está publicada en Google Play. Si quieres además las novedades por correo, déjame tu correo.
Si te interesa cómo se cuentan estas cosas sin castigar a nadie, la entrada anterior va de eso: la regla que no rompo.