beasty-visual-novel / world / character-routines.md
Rutinas de personajes
Personajes que están donde deben estar, cuando deben estar. Una rutina dice: dado el día, el momento del día y el estado del mundo, en qué sala está este personaje — o si no está en ninguna parte. Esta página es para guionistas y diseñadores.
Las rutinas necesitan tiempo de juego. Sin un Time Config asignado al BeastyManager, toda condición de tiempo es falsa y toda rutina cae en su respaldo.
Dónde vive una rutina
Una rutina por personaje, guardada en el FreeRoam Map Graph — el mismo asset que contiene tus salas. Editas
las rutinas en la pestaña FreeRoam de la ventana Beasty VN (Tools > Beasty VN > Editor), ya sea desde
dentro de una sala (su línea de tiempo) o desde la grilla Routines.
Una rutina se compone de tres cosas, de fuera hacia dentro:
- Perfiles — horarios con nombre. Solo uno está activo a la vez.
- Reglas — dentro de un perfil, una lista ordenada de “si esta condición se cumple, está en esta sala”.
- Lo visual — cómo se dibuja al personaje en la sala una vez colocado.
Perfiles: cambiar todo un horario de un solo bloque
Un personaje tiene uno o más perfiles con nombre (Default, Working, Fired, Sick) más un nombre de perfil
por defecto. El perfil activo es el que coincide con la variable de modo de rutina del personaje
(@char:<id>:@routineMode, mostrada en el selector de condiciones como maya.routineMode). Si esa variable está vacía,
o nombra un perfil que no existe, se usa el perfil por defecto; y si tampoco existe, el primero.

Este es el sentido de los perfiles: cuando la historia da un giro, cambias toda la semana de un personaje con un único bloque. La despiden, él cae enfermo, se mudan a la costa — un bloque, no treinta ediciones de reglas.
Dos formas de escribirlo:
- el bloque Routine override (categoría de paleta World): elige el personaje, elige el nombre del perfil. Deja el perfil vacío para volver al perfil por defecto.
- un bloque Set variable sobre
maya.routineMode, que hace exactamente lo mismo. El bloque es la versión tipada, guiada por selector.
En el script .vnbeasty, lo mismo es una línea:
routine maya Fired
routine maya # back to the default profile
Como el modo de rutina es una variable ordinaria, se guarda, se carga y se rebobina con todo lo demás.
Un perfil que ya no necesitas se puede eliminar desde el selector de perfil (Delete profile…, con
confirmación); el perfil Default integrado se queda. Una rutina de personaje que queda completamente
vacía — sin colocaciones, sin respaldo, sin diálogos de interacción — se poda automáticamente del grafo del
mapa, en el mismo paso de deshacer que la eliminación que la vació.
Reglas: gana la primera coincidencia
Un perfil contiene una lista ordenada de reglas y un respaldo. Cada regla es una condición más una sala.

El resolutor recorre las reglas desde arriba y se detiene en la primera regla cuya condición se cumpla. Si ninguna regla coincide, se usa el respaldo.
Importante Una regla con una sala vacía significa que el personaje está ausente — no en esa sala, no en ninguna sala, no en el mapa en absoluto. Así se escribe “ella no está por aquí de noche”: deja vacía la sala del respaldo.
Una condición vacía siempre se cumple, así que una regla sin condición colocada por encima de otras anula todas las que están debajo. El orden importa.
El editor de grilla de rutinas
La pestaña FreeRoam tiene un interruptor Map / Routines en su barra de herramientas. Cambia a Routines y obtienes un solo lienzo: las columnas son días de la semana, las filas son momentos del día, más una fila General arriba y una fila Fallback al final.

Una barra de filtros controla qué muestra la grilla y qué edita:
| Filtro | Efecto |
|---|---|
| Character | Elige uno y la grilla edita la semana de ese personaje. Este es el modo de edición. |
| Room | Resalta las celdas que resuelven a esa sala, así puedes ver quién está en la panadería toda la semana. |
| Day | Reduce la grilla a un día de la semana. |
| Profile | Cuál de los perfiles del personaje estás editando. |
Haz clic en una celda vacía y elige una sala del menú; haz clic en una celda ocupada para seleccionarla y editar su colocación en el inspector de la derecha (su sala, su arte, su posición). Arrastra sobre las celdas para pintar la misma sala en varias de una vez. Clear (absent) vacía una celda.
La fila General es para colocaciones que no dependen del día de la semana. Una regla creada ahí se aplica a todos los días, lo que mantiene corta la lista de reglas: un panadero que está en la panadería cada mañana es una regla, no siete.
Nota La grilla es una lente sobre la lista de reglas, no un segundo modelo. Lee las reglas, las muestra como celdas, y las vuelve a escribir como reglas. Una regla escrita a mano con una condición que la grilla no puede dibujar (digamos, una que también comprueba el estado de una misión) se conserva intacta y se marca como avanzada — la grilla no la destruirá en silencio. Las reglas siguen siendo la verdad.
La grilla también saca a la luz los conflictos: un personaje colocado en dos salas en el mismo momento del día en días superpuestos. Soltar a un personaje en una sala elimina automáticamente su colocación en otras salas en ese momento del día, así que rara vez creas uno a mano — pero las reglas escritas a mano sí pueden crearlos, y la grilla te lo indica.
Las salas no son la única forma de estar en algún sitio
Hay una segunda forma, centrada en la sala, de crear los mismos datos: entra en una sala en la vista Map y usa su
línea de tiempo, que tiene un carril por momento del día y un botón + Character por carril. Añadir un personaje al
carril de Morning de la Panadería escribe exactamente la regla que habría escrito la grilla. Los dos editores son dos vistas de
una misma lista de reglas; usa el que encaje con cómo estás pensando — “qué hace Maya esta semana” o “quién está en la panadería
por la mañana”.

Cómo se ve el personaje en la sala
Una vez que una regla coloca a un personaje en una sala, el runtime tiene que dibujarlo. Usa el primero de estos que exista:
- El sprite marcador del paso de la misión, cuando una anulación de rutina de misión lo movió ahí y ese paso define un marcador.
- Lo visual propio de la regla — el sprite, la posición, la escala, el orden de dibujado y la respuesta al pasar el cursor definidos en la propia colocación (el inspector de la grilla, o la línea de tiempo de la sala).
- Un punto de personaje libre en el prefab de la sala, usando el sprite de mundo libre del personaje.
- El centro de la sala, si no quedan puntos.
El arte propio del personaje proviene del sprite de mundo libre en la Character Definition; si está vacío, se usa su sprite de expresión base.
Puntos de personaje
Un punto es un objeto hijo dentro de un prefab de sala que lleva un componente FreeRoamCharacterSpot. Marca dónde
se para alguien. Su posición y escala son decisiones del prefab, no datos en la rutina — lo colocas
en la escena, a ojo, con las propias herramientas de Unity.
Cada personaje colocado de forma genérica ocupa el siguiente punto libre de la sala. Por eso dos personajes nunca comparten un punto: el primero toma el primer punto, el segundo toma el segundo. Si a la sala se le acaban los puntos, el siguiente personaje cae al centro de la sala — así que dale a cada sala tantos puntos como personajes pueda llegar a albergar a la vez. Consulta Salas de mundo libre para saber cómo añadir uno.
Las poses ganan a los marcadores
Si creas una pose de personaje en una sala — un objeto de sala cuyo propietario es ese personaje — la pose gana y el marcador genérico se suprime, de modo que el personaje nunca se dibuja dos veces. Las poses son la forma de darle a un personaje un aspecto concreto en una sala concreta. Consulta Interactuables y puertas.
Cuándo se recalculan las rutinas
En cada entrada a una sala, y siempre que cambia el almacén de variables compartido — lo que incluye cada bloque Advance time, cada bloque Set variable, cada misión que se completa. Nunca disparas un recálculo tú mismo.
Cada recálculo publica tres variables reservadas por personaje:
| Clave del almacén | Etiqueta del selector | Valor |
|---|---|---|
@char:<id>:@routineLocation | maya.location | El id de la sala en la que está, o vacío cuando está ausente. |
@char:<id>:@routineSpot | maya.spot | El id del punto dentro de esa sala, o vacío. |
@char:<id>:@routineMode | maya.routineMode | El nombre del perfil activo. Escribir esto cambia su horario. |
Eso significa que puedes escribir condiciones sobre dónde está la gente, en cualquier sitio donde se acepten condiciones:
maya.location == Bakery
maya.spot == Counter
maya.routineMode == Working
Un fondo de sala que cambia cuando hay alguien en la sala, una elección que solo aparece cuando el tendero está presente, una misión que empieza cuando el jugador la encuentra en el parque — todo eso es una sola condición.
Hacer clic en un personaje en una sala
Al hacer clic en un personaje en una sala se ejecuta, en este orden:
- la lista de on interact de la rutina — el primer caso cuya condición se cumpla reproduce su escena;
- si no, el menú de conversación del personaje, si resuelve en alguna entrada;
- si no, la escena de interacción por defecto de la rutina.
Así que en cuanto le das a un personaje un menú de conversación, hacer clic en él lo abre. No hay que conectar nada.
Anulaciones de rutina por misión
Una misión puede mover a un personaje. Mientras una misión está activa y uno de sus pasos de conversación es el
actual, ese paso puede colocar a su personaje en otra sala — opcionalmente solo en ciertos días de la semana y durante
ciertos momentos del día. Se impone por completo a la rutina mientras se aplique, y la variable location del personaje
la sigue, así que toda condición del juego concuerda con lo que ve el jugador.
Gana el primer paso que coincida (orden del catálogo). Se define en el objetivo, bajo Talk step > Move character while current. Consulta Misiones.
El calendario de rutina dentro del juego
Los jugadores pueden ver el horario de un personaje. La pantalla Character Routine muestra el calendario del personaje seleccionado en vista de día (una fila por momento del día de hoy) o vista de semana (una fila por día de la semana y momento del día). Solo se rellena cuando el indicador Show routine del personaje está activado, así que un extraño misterioso sigue siendo misterioso. Consulta Pantallas de personaje.

Ejemplo trabajado: una panadera
Objetivo. Maya hornea por la mañana, pasea por el parque por la tarde, y no está por ningún lado de noche.
- Tiempo. Crea un Time Config (
Create > Beasty VN > Config > Time Config), modoSlotsOnly, momentos del díaMorning,Afternoon,Evening,Night. Arrástralo al campo Time Config del BeastyManager. - Salas. En la pestaña FreeRoam, crea las salas
BakeryyPark(cada una recibe su prefab; consulta Salas de mundo libre). - Puntos. Abre el prefab de Bakery, añade un objeto hijo llamado
Counterdonde Maya debería estar de pie, y ponle un componenteFreeRoamCharacterSpot. Haz lo mismo para unBenchen el prefab de Park. - Rutina. Cambia la pestaña FreeRoam a Routines y filtra por el personaje Maya. En la grilla:
- La fila General no es lo que quieres aquí (la colocación depende del momento del día), así que usa las filas de cada momento del día.
- Fila Morning, todos los días de la semana: elige Bakery.
- Fila Evening, todos los días de la semana: elige Park.
- Afternoon y Night: déjalas vacías.
- Fallback: deja la sala vacía, así todo lo que no esté cubierto significa ausente.
- Sprite. En la Character Definition de Maya, define el sprite de mundo libre.
- El tiempo tiene que moverse. Dale al jugador algo que lo avance: una cama con advance time on click, o un bloque Advance time en una escena por la que pase.
- Pulsa Play. Por la mañana, la Bakery tiene a Maya en el mostrador; por la tarde está en el banco del parque; de noche no hay nadie en casa.
Ahora el giro de la historia. La despiden en el capítulo 3:
- En la grilla de Routines, usa el filtro Profile para crear un segundo perfil llamado
Fired, y complétalo: Morning en elPark, todo lo demás vacío. - De vuelta en la historia, en el momento en que la despiden, coloca un bloque Routine override: personaje
maya, perfilFired.
A partir de esa línea, toda la semana de Maya es distinta, en cada sala, en cada condición, en su pantalla de calendario — y se rebobina correctamente si el jugador retrocede más allá de ese punto.
Ver también
- Tiempo de juego — momentos del día, el reloj, y cómo se mueve el tiempo.
- Salas de mundo libre — salas, prefabs de sala, puntos de personaje.
- Interactuables y puertas — poses de personaje.
- Misiones — anulaciones de rutina por misión.
- Pantallas de personaje — el calendario de rutina dentro del juego.
- API de gameplay —
BeastyRoutinespara programadores.