Skip to content

Ciclo Día-Noche

Construye un sistema de tiempo que avanza automáticamente — cada 3 turnos, el tiempo avanza (Mañana → Mediodía → Atardecer → Noche → Mañana). Diferentes horas del día activan diferentes entradas de lore y música de fondo, cambiando la atmósfera de escritura de la IA para que coincida. El jugador no tiene que hacer nada — el tiempo simplemente fluye.


Lo que vas a construir

Un sistema de ciclo día-noche integrado en el chat:

  • Conteo automático — en cada turno de diálogo, un contador interno se incrementa en 1. En el 3er turno, el tiempo avanza una hora del día
  • Cuatro horas del día — Mañana → Mediodía → Atardecer → Noche → Mañana (y así sucesivamente)
  • Cambio de atmósfera — cada hora del día tiene su propia entrada de lore que describe la iluminación, temperatura, comportamiento de los NPCs, etc. Cuando cambia la hora del día, la entrada antigua se deshabilita y la nueva se habilita
  • Cambio de BGM — la Mañana reproduce cantos de pájaros, la Noche cambia a grillos y ranas. Las transiciones usan crossfade para que no haya corte abrupto
  • Distintivo de tiempo — un pequeño icono en el último mensaje del chat (☀️🌤️🌅🌙) para que el jugador siempre sepa qué hora es

Cómo funciona

Todo el sistema se reduce a: contador +1 cada turno → contador llega a 3 → cambiar la hora del día → reiniciar contador → alternar entradas y música.

El jugador envía un mensaje → la IA responde → el turno termina
  → el comportamiento "every turn +1" se dispara: turn_counter va de 0 a 1
  → siguiente turno: turn_counter va de 1 a 2
  → siguiente turno: turn_counter va de 2 a 3
  → el comportamiento "variable crossed threshold" se dispara: turn_counter sube por encima de 2
  → se ejecutan acciones: time_period se establece a la siguiente hora del día, turn_counter se reinicia a 0
  → entrada de la hora del día antigua deshabilitada, entrada de la nueva hora del día habilitada
  → crossfade a la BGM de la nueva hora del día
  → el Root Component lee la variable y actualiza el distintivo de tiempo

Hay dos formas de implementar esto. Mismo resultado, modelos mentales distintos:

EnfoqueDisparadores usadosNúmero de comportamientosMejor para
Enfoque A: every-turn +1 + variable crossedevery-turn + variable-crossed2Personas que quieren entender la mecánica subyacente
Enfoque B: disparar directamente cada N turnosturn-count (everyNTurns=3)1Personas que solo quieren que funcione

Esta receta enseña el Enfoque A (más versátil, y te ayuda a entender cómo los comportamientos se encadenan). El Enfoque B se cubre brevemente al final.


Paso a paso

Paso 1: Crea variables

Necesitamos 2 variables — una para seguir la hora del día actual, una como contador.

Editor → barra lateral → pestaña Variables → haz clic en "Add Variable" para cada una

Variable 1: Hora del día actual

CampoValorPor qué
NombreHora del día actualPara tu propia referencia
IDtime_periodLos comportamientos y el Root Component leen/escriben este ID
TipoStringPorque los valores son texto ("Morning", "Noon", "Evening", "Night")
Valor por defectoMorningLas nuevas sesiones empiezan por la mañana
CategoríaCustomCategoría dedicada para el sistema de tiempo
Reglas de comportamientoNo modifiques esta variable. Está controlada automáticamente por el sistema de ciclo día-noche. Su valor actual representa la hora del día dentro del juego.Le dice a la IA que no cambie el tiempo por su cuenta — solo los comportamientos pueden

Variable 2: Contador de turnos

CampoValorPor qué
NombreContador de turnosPara tu propia referencia
IDturn_counterSe incrementa cada turno, se reinicia en 3
TipoNumberNecesita aritmética
Valor por defecto0Empieza a contar desde 0
CategoríaCustomCategoría dedicada para el sistema de tiempo
Reglas de comportamientoNo modifiques esta variable. Está controlada automáticamente por el sistema de ciclo día-noche.Evita que la IA lo manipule

¿Por qué usar un contador en lugar de dispararse cada 3 turnos directamente?

El enfoque de contador + variable-crossed es más flexible. Digamos que más tarde quieres "3 turnos durante el día, 5 turnos por la noche" — solo añades una comprobación de condición al comportamiento. El disparador turn-count es más simple pero menos adaptable. Ambos enfoques tienen sus fortalezas; elige el que se ajuste a tus necesidades.


Paso 2: Crea cuatro entradas de lore para las horas del día

Cada hora del día necesita una entrada de lore que describa su atmósfera. Solo "Morning" está habilitada por defecto; las otras tres empiezan deshabilitadas.

Editor → pestaña Lore → crea entradas una por una

Entrada 1: Atmósfera matutina

CampoValorPor qué
NombreAtmósfera matutinaPara tu propia referencia
SecciónPresetsLas entradas preestablecidas se envían a la IA cada vez
Habilitada (activado)El juego empieza por la mañana, por lo que esta está activa por defecto

Contenido:

[Período actual: Mañana]
Es temprano por la mañana. Refleja la siguiente atmósfera al describir la escena:
- Una luz suave de la mañana se cuela desde el este; el aire es fresco y frío
- Las gotas de rocío se aferran a las hojas de hierba y a los pétalos de las flores, refractando pequeños destellos de luz
- Los pájaros cantan en las ramas; un gallo canta a lo lejos
- Los NPCs apenas se están despertando, las tiendas abren una a una, el tránsito de gente empieza a aumentar
- El ambiente general es apacible y lleno de esperanza

Entrada 2: Atmósfera del mediodía

CampoValorPor qué
NombreAtmósfera del mediodíaPara tu propia referencia
SecciónPresetsSección de presets
HabilitadaNo (desactivado)Los comportamientos la habilitarán cuando cambie la hora del día

Contenido:

[Período actual: Mediodía]
Es mediodía. Refleja la siguiente atmósfera al describir la escena:
- El sol cae a plomo directamente arriba; la luz es abrasadora y brillante, el suelo refleja un resplandor blanco cegador
- El aire es sofocante; el paisaje distante tiembla y se deforma en la bruma del calor
- La mayoría de la gente se ha refugiado a la sombra para descansar; las calles están más silenciosas que por la mañana
- Las tabernas y los comedores están en su momento más concurrido, el olor a comida flota en el aire
- El ambiente general es lánguido y bochornoso

Entrada 3: Atmósfera del atardecer

CampoValorPor qué
NombreAtmósfera del atardecerPara tu propia referencia
SecciónPresetsSección de presets
HabilitadaNo (desactivado)Los comportamientos la habilitarán

Contenido:

[Período actual: Atardecer]
Es el atardecer. Refleja la siguiente atmósfera al describir la escena:
- El sol poniente pinta el cielo en tonos de naranja-rojo y púrpura, las nubes bordeadas de oro
- Largas sombras se extienden desde los edificios y los árboles
- Bandadas de pájaros cruzan el cielo de vuelta a casa; volutas de humo de cocina se alzan desde los tejados
- Los NPCs están terminando la jornada, regresando a casa; los niños se persiguen por las calles
- El ambiente general es cálido, nostálgico, teñido de una melancolía suave

Entrada 4: Atmósfera nocturna

CampoValorPor qué
NombreAtmósfera nocturnaPara tu propia referencia
SecciónPresetsSección de presets
HabilitadaNo (desactivado)Los comportamientos la habilitarán

Contenido:

[Período actual: Noche]
Es noche cerrada. Refleja la siguiente atmósfera al describir la escena:
- La luz de la luna y las estrellas son las únicas fuentes naturales de iluminación, derramando un brillo plateado sobre todo
- La mayoría de los edificios se han apagado; alguna ventana ocasional brilla con la luz tenue de una vela
- Una brisa nocturna fresca arrastra el coro de grillos y ranas
- Las calles están casi desiertas; guardias de la ronda nocturna pasan despacio, con antorchas en la mano
- El peligro puede acechar en las sombras — bestias salvajes, ladrones o algo aún más extraño
- El ambiente general es misterioso, silencioso y cargado de peligros ocultos

¿Por qué solo "Morning" está habilitada por defecto? Porque el juego empieza por la mañana. Si las cuatro entradas estuvieran habilitadas a la vez, la IA recibiría las descripciones de mañana, mediodía, atardecer y noche simultáneamente y no sabría cuál seguir. Habilitar solo una a la vez mantiene a la IA bloqueada en la atmósfera correcta.


Paso 3: (Opcional) Sube BGM para las horas del día

Si quieres que cada hora del día tenga su propia música de fondo, sube primero los archivos de audio.

Editor → pestaña Audio → añadir pistas

ID de pistaNombreTipoBucleFade InFade Out
bgm_morningMorning ThemeBGM2s2s
bgm_noonAfternoon ThemeBGM2s2s
bgm_eveningDusk ThemeBGM2s2s
bgm_nightNight ThemeBGM2s2s

¿No tienes archivos de audio? Omite este paso. El núcleo del ciclo día-noche es el cambio de entradas de lore — la BGM es un bonus agradable. Siempre puedes añadirla después.

En la playlist de BGM, establece autoPlay a true y por defecto a bgm_morning. Cuando la hora del día cambie más tarde, los comportamientos usarán la acción crossfade para una transición suave entre pistas.


Paso 4: Crea comportamientos

Este es el corazón del sistema. Necesitamos 2 comportamientos — bueno, en realidad 6. Sigue leyendo.

Editor → pestaña Behaviors → añade comportamientos uno por uno

Comportamiento 1: Contar cada turno

Este es muy simple — tras cada turno de diálogo, el contador sube en 1.

WHEN (cuándo comprobar):

CampoValorPor qué
Trigger typeEvery turnSe dispara automáticamente tras cada intercambio jugador-IA

DO (qué hacer):

Tipo de acciónConfiguraciónEfecto
Modificar variableturn_counter add 1Contador +1

Esa es la única acción. Sin condiciones, sin configuración extra. Fielmente añade 1 cada turno.

¿Por qué no comprobar "¿ya llegó a 3?" aquí mismo? Porque la filosofía de diseño del sistema de comportamientos es un comportamiento, una tarea. Incrementar el contador es el trabajo de un comportamiento; comprobar si llegó a 3 es el trabajo de otro. El motor los encadena automáticamente — tras incrementar el contador, si el valor cruza el umbral, el otro comportamiento se dispara.


Comportamiento 2: Avanzar la hora del día

Este comportamiento se dispara cuando el contador llega a 3 y ejecuta toda la lógica de cambio.

WHEN (cuándo comprobar):

CampoValorPor qué
Trigger typeVariable crossed thresholdSe dispara cuando turn_counter sube por encima del umbral
Variableturn_counterLa variable que estamos vigilando
DirectionRises aboveSe dispara cuando el valor pasa de estar por debajo del umbral a por encima
Threshold2Se dispara cuando turn_counter va de 2 a 3 (sube por encima de 2)

¿Por qué el umbral es 2, no 3? La dirección "rises above" en variable-crossed detecta el momento en que un valor pasa de <= umbral a > umbral. Cuando turn_counter va de 2 a 3, "rises above 2" — es decir, va de <=2 a >2. Si pones el umbral a 3, necesitarías que turn_counter pase de 3 a 4 antes de dispararse, y eso no es lo que queremos.

DO (qué hacer):

Este comportamiento necesita hacer mucho. Añade estas acciones en orden:

#Tipo de acciónConfiguraciónEfecto
1Modificar variableturn_counter set a 0Reinicia el contador para la siguiente cuenta atrás de 3 turnos
2Deshabilitar entrada de loreMorning AtmosphereApaga todas las entradas de las horas del día
3Deshabilitar entrada de loreNoon AtmosphereApaga todas
4Deshabilitar entrada de loreEvening AtmosphereApaga todas
5Deshabilitar entrada de loreNight AtmosphereApaga todas

Espera — eso apaga las cuatro. ¿Cómo sabe cuál habilitar?

Buena pregunta. Aquí es donde entran en juego las condiciones ONLY IF para la ramificación. Pero un único comportamiento solo puede tener un conjunto de acciones. Así que dividimos "avanzar la hora del día" en 5 comportamientos: 1 para reiniciar el contador y deshabilitar todas las entradas, y 4 para habilitar la hora del día correspondiente.

Déjame reorganizar:


Lista completa de comportamientos (6 en total):

Comportamiento 1: Contar cada turno

(Igual que arriba — no se repite.)

Comportamiento 2: Avanzar — Mañana → Mediodía

WHEN:

CampoValor
Trigger typeVariable crossed threshold
Variableturn_counter
DirectionRises above
Threshold2

ONLY IF:

VariableOperadorValor
time_periodigual (eq)Morning

DO:

#Tipo de acciónConfiguraciónEfecto
1Modificar variableturn_counter set a 0Reinicia el contador
2Modificar variabletime_period set a NoonAvanza a la siguiente hora del día
3Deshabilitar entrada de loreMorning AtmosphereApaga la entrada de la hora del día antigua
4Habilitar entrada de loreNoon AtmosphereEnciende la entrada de la nueva hora del día
5Reproducir músicabgm_noon, acción: crossfade, duración 3sCrossfade a la BGM del mediodía
6Tell AIContenido: El tiempo ha avanzado de Mañana a Mediodía. Refleja naturalmente este cambio de tiempo en tus próximas descripciones.Permite a la IA una transición suave

Comportamiento 3: Avanzar — Mediodía → Atardecer

WHEN: Igual que el Comportamiento 2 (variable crossed threshold, turn_counter sube por encima de 2)

ONLY IF:

VariableOperadorValor
time_periodigual (eq)Noon

DO:

#Tipo de acciónConfiguraciónEfecto
1Modificar variableturn_counter set a 0Reinicia el contador
2Modificar variabletime_period set a EveningAvanza a Atardecer
3Deshabilitar entrada de loreNoon AtmosphereApaga la entrada del mediodía
4Habilitar entrada de loreEvening AtmosphereEnciende la entrada del atardecer
5Reproducir músicabgm_evening, acción: crossfade, duración 3sCrossfade BGM
6Tell AIContenido: El tiempo ha avanzado de Mediodía a Atardecer. Refleja naturalmente este cambio de tiempo en tus próximas descripciones.Transición de IA

Comportamiento 4: Avanzar — Atardecer → Noche

WHEN: Igual que arriba

ONLY IF:

VariableOperadorValor
time_periodigual (eq)Evening

DO:

#Tipo de acciónConfiguraciónEfecto
1Modificar variableturn_counter set a 0Reinicia el contador
2Modificar variabletime_period set a NightAvanza a Noche
3Deshabilitar entrada de loreEvening AtmosphereApaga la entrada del atardecer
4Habilitar entrada de loreNight AtmosphereEnciende la entrada de la noche
5Reproducir músicabgm_night, acción: crossfade, duración 3sCrossfade BGM
6Tell AIContenido: El tiempo ha avanzado de Atardecer a Noche. Refleja naturalmente este cambio de tiempo en tus próximas descripciones.Transición de IA

Comportamiento 5: Avanzar — Noche → Mañana

WHEN: Igual que arriba

ONLY IF:

VariableOperadorValor
time_periodigual (eq)Night

DO:

#Tipo de acciónConfiguraciónEfecto
1Modificar variableturn_counter set a 0Reinicia el contador
2Modificar variabletime_period set a MorningCicla de vuelta a Mañana
3Deshabilitar entrada de loreNight AtmosphereApaga la entrada de la noche
4Habilitar entrada de loreMorning AtmosphereEnciende la entrada de la mañana
5Reproducir músicabgm_morning, acción: crossfade, duración 3sCrossfade BGM
6Tell AIContenido: El tiempo ha avanzado de Noche a Mañana — un nuevo día comienza. Refleja naturalmente este cambio de tiempo en tus próximas descripciones.Transición de IA

¿Por qué dividir en 4 comportamientos? Porque cada transición de hora del día necesita habilitar una entrada diferente y reproducir una BGM diferente. Un único comportamiento solo puede tener un conjunto de condiciones y un conjunto de acciones — no soporta ramificación if-else. Así que usamos 4 comportamientos con diferentes condiciones ONLY IF para simular la ramificación: cuando se dispara el mismo disparador (contador sube por encima de 2), el motor los comprueba todos, pero solo el que coincide con time_period se ejecutará.

Comportamiento 6: Inicialización de sesión

Este comportamiento establece el estado inicial cuando comienza una sesión, asegurando que las variables estén en los valores iniciales correctos para nuevas sesiones o reentradas.

WHEN:

CampoValorPor qué
Trigger typeSession start (session-start)Se dispara una vez automáticamente cuando comienza una nueva sesión

DO:

#Tipo de acciónConfiguraciónEfecto
1Modificar variabletime_period set a MorningAsegura que empiece en Mañana
2Modificar variableturn_counter set a 0Reinicia el contador de turnos

¿Por qué necesitamos un comportamiento de inicialización de sesión? Los valores predeterminados de las variables solo surten efecto cuando se crean por primera vez. Si un jugador sale a mitad de sesión e inicia una nueva, las variables podrían retener sus valores anteriores (por ejemplo, time_period atascado en "Night", turn_counter atascado en 2). El comportamiento de inicialización de sesión asegura que cada nueva sesión empiece desde Mañana con el contador en 0.

Prioridad de comportamientos

Los 4 comportamientos de avance pueden mantener la prioridad predeterminada (0). Sus condiciones ONLY IF son mutuamente exclusivas — la hora del día actual solo puede coincidir con uno de ellos, así que no hay conflicto.


Paso 5: Añade el distintivo de tiempo al Root Component

Muestra el icono de la hora del día actual en el último mensaje del chat, para que el jugador siempre sepa de un vistazo qué hora es.

Editor → sección Custom UI → abre index.tsx → pega lo siguiente (reemplaza el predeterminado return <Chat />):

tsx
export default function MyWorld() {
  const api = useYumina();

  // ---- Lee la variable ----
  const timePeriod = String(api.variables.time_period || "Morning");

  // ---- Icono y mapa de colores por hora ----
  const timeConfig = {
    "Morning": { icon: "☀️", label: "Morning", color: "#fbbf24", bg: "rgba(251,191,36,0.15)" },
    "Noon": { icon: "🌤️", label: "Noon", color: "#f59e0b", bg: "rgba(245,158,11,0.15)" },
    "Evening": { icon: "🌅", label: "Evening", color: "#f97316", bg: "rgba(249,115,22,0.15)" },
    "Night": { icon: "🌙", label: "Night", color: "#818cf8", bg: "rgba(129,140,248,0.15)" },
  };

  const current = timeConfig[timePeriod] || timeConfig["Morning"];
  const msgs = api.messages || [];

  return (
    <Chat renderBubble={(msg) => {
      const isLastMsg = msg.messageIndex === msgs.length - 1;

      return (
        <div>
          {/* Renderiza el texto del mensaje normalmente — contentHtml ya es HTML renderizado */}
          <div
            style={{ color: "#e2e8f0", lineHeight: 1.7 }}
            dangerouslySetInnerHTML={{ __html: msg.contentHtml }}
          />

          {/* Distintivo de hora — solo en el último mensaje */}
          {isLastMsg && (
            <div style={{
              display: "inline-flex",
              alignItems: "center",
              gap: "6px",
              marginTop: "12px",
              padding: "4px 12px",
              background: current.bg,
              border: `1px solid ${current.color}33`,
              borderRadius: "999px",
              fontSize: "13px",
              color: current.color,
              fontWeight: "600",
            }}>
              <span style={{ fontSize: "16px" }}>{current.icon}</span>
              <span>{current.label}</span>
            </div>
          )}
        </div>
      );
    }} />
  );
}

Desglose línea por línea:

  • api.variables.time_period — lee la variable de la hora del día actual
  • timeConfig — una tabla de búsqueda que mapea cada hora del día a un icono, etiqueta de texto y color. Siéntete libre de cambiar los colores para que coincidan con el estilo de tu mundo
  • isLastMsg — solo muestra el distintivo en el último mensaje, no en cada mensaje
  • El distintivo usa inline-flex + border-radius: 999px para una forma de píldora — sutil pero inmediatamente visible

¿Quieres mostrar el tiempo en cada mensaje?

Quita la comprobación {isLastMsg && ...} y pon el distintivo directamente en el return. Cada mensaje llevará entonces un sello de tiempo, como las marcas de tiempo en un registro de chat.


Paso 6: Guarda y prueba

  1. Haz clic en Save en la parte superior del editor
  2. Haz clic en Start Game o vuelve a la página de inicio y abre una nueva sesión
  3. Chatea normalmente con la IA. Durante los primeros 2 turnos, el distintivo de tiempo muestra "☀️ Morning" y nada cambia
  4. Tras el turno 3 — el tiempo avanza a "🌤️ Noon", y la próxima respuesta de la IA refleja naturalmente el cambio de tiempo
  5. 3 turnos más — avanza a "🌅 Evening"
  6. 3 turnos más — avanza a "🌙 Night". Si configuraste BGM, deberías escuchar el crossfade
  7. 3 turnos más — cicla de vuelta a "☀️ Morning", comienza un nuevo día

Si algo sale mal:

SíntomaCausa probableSolución
El tiempo nunca cambiaEl comportamiento "Count each turn" no se está disparandoComprueba que el disparador del Comportamiento 1 esté establecido en "Every turn" y el comportamiento esté habilitado
No hay cambio en el turno 3El umbral es incorrectoConfirma que el umbral de "variable crossed threshold" sea 2 (no 3), dirección "rises above"
Las entradas no cambian tras el cambioLos nombres de las entradas no coincidenComprueba que las acciones "Enable lore entry" / "Disable lore entry" en tus comportamientos hagan referencia a los nombres correctos de las entradas
Los 4 comportamientos se disparan a la vezFaltan las condiciones ONLY IFCada comportamiento de avance debe tener una condición ONLY IF que restrinja el valor actual de time_period
Distintivo de tiempo no visibleError de sintaxis en el Root ComponentComprueba el estado de compilación en la parte inferior del panel Custom UI — debería mostrar un "OK" verde
La BGM no cambiaID de pista no coincide o no hay audio subidoConfirma que el trackId en el comportamiento coincida con el ID de pista en la pestaña Audio

Comparación del Enfoque B: usando el disparador turn-count

Si el Enfoque A te parece demasiados comportamientos, puedes usar el Enfoque B más simple.

Diferencias:

Enfoque A (esta receta)Enfoque B
Disparadoresevery-turn + variable-crossedturn-count (everyNTurns=3)
Necesita variable turn_counterNo
Número de comportamientos6 (1 conteo + 4 avance + 1 inicialización opcional)4 (4 avance)
FlexibilidadAlta (el intervalo se puede ajustar dinámicamente)Baja (intervalo fijo en N)
Mejor paraMundos que necesitan velocidad de flujo de tiempo dinámicaMundos con un ritmo fijo

Cómo hacer el Enfoque B:

Elimina la variable turn_counter y el comportamiento "Count each turn". Cambia el disparador en los 4 comportamientos de avance a:

CampoValor
Trigger typeEvery N turns
everyNTurns3

Todo lo demás (condiciones ONLY IF, acciones DO) se mantiene exactamente igual que el Enfoque A. El disparador turn-count se dispara automáticamente cada 3 turnos — no se necesita conteo manual.

Cómo funciona el disparador turn-count: El motor mantiene un conteo de turnos global interno. Cuando estableces everyNTurns: 3, el motor dispara automáticamente el comportamiento en los turnos 3, 6, 9, 12 y así sucesivamente. No necesitas gestionar tú mismo una variable de contador.


Referencia rápida

Qué quieresCómo hacerlo
Hacer algo cada turnoDisparador del comportamiento: "Every turn" (every-turn)
Hacer algo cada N turnosDisparador del comportamiento: "Every N turns" (turn-count), establece everyNTurns
Detectar que una variable cruza un valorDisparador del comportamiento: "Variable crossed threshold" (variable-crossed), establece variable, dirección y umbral
Cambiar entradas de loreAcciones: "Enable lore entry" / "Disable lore entry"
Crossfade de músicaAcción: "Play music", operación: crossfade, establece duración de fade
Hacer saber a la IA que algo pasóAcción: "Tell AI", escribe una instrucción de sistema temporal
Mostrar un distintivo de estado en un mensajeLee una variable dentro del <Chat renderBubble> del Root Component y renderiza con JSX
Simular ramificación if-elseMúltiples comportamientos compartiendo el mismo disparador + diferentes condiciones ONLY IF

Pruébalo tú mismo — mundo demo importable

Descarga este JSON e impórtalo como un nuevo mundo para ver todo en acción:

recipe-9-demo.json

Cómo importar:

  1. Ve a Yumina → My WorldsCreate New World
  2. En el editor, haz clic en More ActionsImport Package
  3. Selecciona el archivo .json descargado
  4. Se crea un nuevo mundo con todas las variables, entradas, comportamientos y el Root Component preconfigurados
  5. Inicia una nueva sesión y pruébalo

Qué incluye:

  • 2 variables (time_period sigue la hora del día actual, turn_counter como contador de turnos)
  • 4 entradas de lore (atmósfera de Mañana / Mediodía / Atardecer / Noche, solo Mañana habilitada por defecto)
  • 6 comportamientos (1 de conteo por turno + 4 de avance de hora del día + 1 de inicialización de sesión)
  • Un Root Component (distintivo de icono de la hora del día en <Chat renderBubble>)
  • 4 pistas de BGM (tendrás que subir tus propios archivos de audio para reemplazar las URLs)

Esta es la Receta #9

Esta receta muestra el poder del encadenamiento del sistema de comportamientos — con un simple contador + disparador de umbral + ramificación condicional, puedes construir un sistema de tiempo totalmente automático. El mismo patrón funciona para cambios de clima, ciclos estacionales, cambios de humor de NPCs, o cualquier otra cosa que "cambie automáticamente en un ritmo".