Timers y watchers#
Algunos de los mejores momentos de una aventura gráfica pasan con retraso: el jugador toca un timbre, se va a pasear, y diez segundos después alguien en el piso de arriba murmura "¡el timbre!" y baja a abrir — esté donde esté el jugador para entonces. Ignitor construye esto con dos piezas pequeñas, timers y watchers, y esta guía te enseña a cablearlas en un ciclo que funciona siempre, no solo la primera vez.
Las tres piezas, en palabras llanas#
- Un timer es un temporizador de cocina. Le das cuerda con un nombre y unos segundos
(
STARTTIMER:doorbell_timer|10), te alejas, y suena solo. No pasa nada cuando suena — se queda ahí, sonado, hasta que algo lo revise. - Un watcher es una trampa de alambre. Vigila una condición en cada frame ("¿ya
sonó
doorbell_timer?") y en el momento en que la condición es verdadera dispara sus efectos — una sola vez. Después de disparar queda desarmado: no volverá a disparar hasta que algo lo re-arme. - Un behaviour es una rutina que un personaje ejecuta por su cuenta — camina aquí, abre aquello, pasea por este pasillo — sin que el jugador intervenga.
Encadena las tres y tienes la escena del timbre: el click arranca el timer, el timer activa la trampa, el watcher lanza la reacción.
El ciclo, dibujado#
Este es el montaje real de nuestro demo tributo a Maniac Mansion — Weird Ed, arriba en su cuarto, reaccionando al timbre de la puerta principal:
El ejemplo, pieza por pieza#
Tres editores, una pieza cada uno:
1. El hotspot del timbre (Room Editor) — la reacción use toca un campaneo y le da
cuerda al timer. Eso es todo lo que el hotspot sabe; no tiene idea de que Ed existe.
SOUND:assets/audio/sfx/doorbell_chime.ogg
STARTTIMER:doorbell_timer|10
2. El watcher (Puzzle Editor, pestaña 🌐 Global Watchers) — global, porque lo más probable es que el jugador ya se haya ido a otra sala cuando el timer suene, y un watcher global escucha en todas partes:
id: weird_ed_reacts_to_doorbell
when: timerExpired · doorbell_timer
do: CLEARTIMER:doorbell_timer
CUTSCENE:weird_ed_hears_doorbell
3. La cutscene (Cutscene Editor, bucket 🌐 Global) — Ed reacciona, camina hasta su puerta y devuelve el control. Ahí entra su behaviour: una rutina que lo lleva escaleras abajo, sala por sala, hasta abrir la puerta principal. El paso final es el que hace todo repetible:
SWITCHCHAR:weird_ed
SAY:weird_ed|"¡Ah! ¡El timbre!"
WAIT:1
SAY:weird_ed|"¡A lo mejor es mi paquete!"
WALKNPCTO:weird_ed|1348|358
SWITCHCHAR:{_prevChar}
BEHAVIOUR:weird_ed|weird_ed_notices_doorbell
CLEARWATCHER:weird_ed_reacts_to_doorbell
Toca el timbre otra vez cuando Ed ya volvió a su cuarto, y la misma mecha de diez segundos arde hacia la misma reacción. Cada vuelta del ciclo se reinicia sola.
Las dos reglas de oro#
Las dos nos mordieron construyendo el demo, así que son sabiduría ganada a pulso:
Un timer expirado se queda "expirado" hasta que lo limpies. Al sonar, el timer no desaparece — se queda en su estado de sonado, y una condición
timerExpiredsigue respondiendo sí para siempre. Haz queCLEARTIMERsea el primer efecto del watcher que lo escucha, o la condición de ese watcher queda verdadera permanentemente.
Un watcher no puede re-armarse desde sus propios efectos. El motor marca al watcher como disparado después de correr su lista de efectos, así que un
CLEARWATCHERapuntándose a sí mismo dentro de su propiododes-marca algo que todavía no está marcado — un no-op, y el watcher queda muerto. Pon elCLEARWATCHERal final de la cutscene (o cadena de efectos) que el watcher lanzó. Efecto secundario bonito: mientras la reacción sigue corriendo, el watcher sigue desarmado, así que machacar el timbre no puede apilar cinco Eds.
Un timer como puerta de cooldown#
Un timer no es solo la mecha de un watcher — también puedes preguntar si sigue corriendo y usar eso como puerta. Dos condiciones leen el mismo timer desde extremos opuestos:
timerExpired— verdadera solo después de que el timer sonó (y se queda verdadera hasta que lo limpies conCLEARTIMER, según la primera regla de oro de arriba).timerRunning— verdadera mientras el timer sigue contando, y falsa en el instante en que se acaba — o antes de que siquiera arranque.
Eso convierte un cooldown en una sola línea. Arranca un timer como ventana de "enfriamiento",
luego protege la acción con timerRunning:
- Mientras
timerRunning→ no hagas nada (o di "todavía no"). La ventana sigue abierta. - De lo contrario → haz la cosa, y arranca el timer de nuevo. Eso reabre la ventana y bloquea una repetición hasta que se consuma.
Sin flag compañero, sin watcher que se re-arme — el timer mismo es la memoria de "hecho hace
poco". Usa timerExpired cuando quieras un disparo diferido de una sola vez (el timbre); usa
timerRunning cuando quieras suprimir algo durante una ventana — un botón que no se puede
machacar, un NPC que no repite una línea por un rato.
Cuando algo no dispara#
- "Mi watcher solo funciona una vez." Disparó y se desarmó solo — así es el diseño.
Agrega un
CLEARWATCHER:<id>al final de la reacción que lanza (ver regla dos). - "Mi reacción se repite cada frame." El watcher se está re-armando mientras su
condición sigue siendo verdadera — casi siempre un
timerExpiredsinCLEARTIMER. Limpia el timer en los efectos del propio watcher (ver regla uno). - "El segundo timbrazo no hace nada." El timer sí está arrancando de nuevo
(
STARTTIMERsiempre lo rebobina) — el que sigue desarmado es el watcher. Revisa que el pasoCLEARWATCHERde verdad corra: debe estar en un camino que la reacción siempre alcance, como el último paso de la cutscene. - "El timer no suena nunca." Revisa que su
STARTTIMERlleve de verdad una duración. Segundos arranca vacío y nada te obliga a rellenarlo, así que es fácil dejar un timer con nombre y sin número. UnSTARTTIMERsin duración se ignora: no arranca ningún timer, así quetimerExpirednunca se vuelve cierto y nada de lo que cuelga de él corre.
A dónde ir después#
- Puzzle Editor — donde se autorean watchers y global watchers, con el catálogo completo de condiciones.
- Cutscene Editor — el autoreo de las listas de pasos que lanzan reacciones como esta.
- Effect tokens — la tabla de referencia de
STARTTIMER,CLEARTIMER,CLEARWATCHER,BEHAVIOURy todo lo demás que ofrece el widget de efectos.