Ignitor Docs ← getignitor.com
🇺🇸 EN 🇪🇸 ES

Tokens de efecto#

Los tokens de efecto son los verbos que encadenas en interacciones, reglas de puzzle y cutscenes para cambiar el juego — activar un flag, dar un item, mover un NPC, alternar un área caminable. Cada token se escribe como VERB:arg1|arg2 (o un VERB a secas cuando no lleva argumento), y los editores te autowirean los argumentos.

Token Qué hace Argumentos
SETFLAG Recuerda que algo pasó (enciende un interruptor). Flag
CLEARFLAG Olvida que algo pasó (apaga un interruptor). Flag
TOGGLEFLAG Invierte un interruptor recordado al estado contrario. Flag
SETVAL Guarda un valor como una clave o número (vacío lo borra). Flag, Value (blank = clear)
APPENDVAL Añade un trozo a un valor guardado, como un dígito del teclado. Flag, Append, Max length (blank = no cap)
ADDVAL Suma a un contador (usa un negativo para restar). Flag, Amount (+/-)
RANDVAL Saca un número al azar y lo guarda, como un dado. Flag, Min, Max
BACKSPACEVAL Borra el último carácter de un valor guardado. Flag
CATCHTARGET Elige a cuál de tus personajes atrapa un perseguidor. Antagonist NPC, Candidate chars, Mode, Out flag (def caughtChar)
PARTYTOGGLE Añade o quita un personaje de tu equipo elegido. Character
PICKUP Coge un objeto de la escena y lo pone en tu inventario. Hotspot to remove, Item to grant (blank = same id)
REMOVEITEM Quita un objeto de tu inventario. Item
GIVEITEM Entrega un objeto a un personaje concreto. Item, Target character
RESTOREHOTSPOT Devuelve a la escena un objeto que se había quitado. Hotspot id
WALKABLE_ON Abre un camino transitable en una habitación. Walkable area
WALKABLE_OFF Bloquea un camino transitable en una habitación. Walkable area
REGION_ON Activa una zona que se dispara al pasar por encima. Region
REGION_OFF Desactiva una zona que se dispara al pasar por encima. Region
LIGHTZONE_ON Enciende una zona de luz, que ilumina o tiñe a quien esté dentro. Light zone
LIGHTZONE_OFF Apaga una zona de luz y deja el área sin iluminar. Light zone
NPCEXIT Envía a un personaje caminando a otra habitación. NPC, Dest room, Walk-to
NPCWALKTO Camina a un personaje hasta un punto y lo deja esperando ahí. NPC, Destination, Facing (opt), Speed (dur=ms | speed=px/s), Options
NPCRETURN Trae de vuelta a un personaje desde otra habitación. NPC, Dest room
NPCWARPTOROOM Coloca al instante a un personaje en una habitación. NPC, Room, At, Facing (opt)
FOLLOW Hace que un personaje siga a otro. NPC, Target, Stop distance px (opt)
UNFOLLOW Hace que un personaje deje de seguir. NPC
DETACHCOMPANION Aparca a un compañero para que deje de acompañarte. Companion
ATTACHCOMPANION Trae de vuelta a un compañero para que te acompañe. Companion
NPCSTOP Detiene a un personaje en seco. NPC
NPCWAIT Hace que un personaje espere unos segundos. NPC, Seconds
BEHAVIOUR Inicia la rutina de un personaje mientras deambula por su cuenta. Behaviour
STOPBEHAVIOUR Detiene la rutina de deambular de un personaje. NPC
STARTTIMER Inicia una cuenta atrás a la que puedes reaccionar. Timer name, Seconds
CLEARTIMER Cancela una cuenta atrás en marcha. Timer name
CLEARWATCHER Permite que una regla de una sola vez vuelva a dispararse. Watcher id
SELECTVERB Preselecciona uno de los nueve verbos, como Usar. Verb
SETCURSOR Toma el control del cursor del mouse — qué cursor, frame o posición, incluso visible durante una cinemática. Cursor overrides
INVENTORY_UP Desplaza el inventario una fila hacia arriba. (ninguno — token a secas)
INVENTORY_DOWN Desplaza el inventario una fila hacia abajo. (ninguno — token a secas)
SETSENTENCE Fija tu propio texto en la línea de acción de abajo (la barra de 'Caminar a…'). Sentence (#lid | text, {flag})
CLEARSENTENCE Quita el texto fijado de la línea de acción y vuelve a lo normal. (ninguno — token a secas)
SAY Hace que tu personaje o el narrador diga una frase. Text ({flag})
NPCSAY Hace que un personaje concreto diga una frase. NPC, Text ({flag})
NARRATE Muestra un texto de narrador, sin atarlo a ningún personaje. Narrator text ({flag})
CLEARNARRATE Quita el texto del narrador antes de tiempo. (ninguno — token a secas)
SETFRAME Cambia la imagen de un objeto por otra. Sprite path, Display text (opt)
SETANIMFRAME Salta una animación a un fotograma concreto. Frame index, Options
STARTANIM Reproduce o reanuda una animación en un personaje u objeto. Target, Animation (opt), Facing (opt)
STOPANIM Detiene a un personaje u objeto a mitad de animación, en una pose fija. Target, Animation (opt), Facing (opt)
SHOWHOTSPOT Hace que un objeto aparezca en la escena. Hotspot id
HIDEHOTSPOT Hace que un objeto desaparezca de la escena. Hotspot id
ENABLEHOTSPOT Vuelve a hacer que un objeto se pueda pulsar. Hotspot id
DISABLEHOTSPOT Hace que un objeto deje de responder a los clics. Hotspot id
TOGGLELIGHT Enciende o apaga la luz de la habitación. Options (dur=ms)
FADEOUT Desvanece un objeto hasta que desaparece, con un texto opcional. Caption
MOVEHOTSPOT Desliza un objeto a un nuevo lugar de la escena. Hotspot, Destination, Speed (dur=ms | speed=px/s), Options
SETHOTSPOTMOTION Anima escala, rotación y opacidad de un objeto — cada canal loopeable (pulse, giro, fade). Hotspot, Motion channels
SETHOTSPOTFX Reestiliza el sprite de un objeto en runtime — sombra, glow, blur, opacidad o contorno. Hotspot, FX overrides
MOVEGUI Desliza un elemento del panel en pantalla a otro lugar. GUI widget (gui.widget), Destination, Speed (dur=ms | speed=px/s), Options
MODIFYWIDGET Reestiliza un elemento del panel en runtime — color, borde o texto. GUI widget (gui.widget), Overrides
DIALOG Inicia una conversación con ramas de diálogo. Dialog id
CUTSCENE Reproduce una secuencia guionizada dentro de la habitación. Cutscene
WARPTOROOM Lleva al jugador a otra habitación. Room id
WALKTO Camina a tu personaje activo hasta un punto de la habitación. Destination, Facing (opt), Speed (dur=ms | speed=px/s), Options
HIDEPLAYER Saca de pantalla el sprite del jugador; sigue caminando y recibiendo clics. (ninguno — token a secas)
SHOWPLAYER Vuelve a mostrar en pantalla el sprite del jugador. (ninguno — token a secas)
OPENGUI Abre un panel en pantalla. GUI id, Options
CLOSEGUI Cierra el panel en pantalla abierto — o sólo el que nombres. GUI id (opt)
OPENCOIN Hace aparecer la moneda de verbos sobre un hotspot. hotspot id
CLOSECOIN Descarta la moneda de verbos. (ninguno — token a secas)
HIDEGUI Oculta de la vista todos los paneles en pantalla. (ninguno — token a secas)
SHOWGUI Vuelve a mostrar los paneles en pantalla. (ninguno — token a secas)
SETLANG Cambia el idioma del juego. Language
SWITCHCHAR Cambia qué personaje controlas. Target character
SWITCHPARTYSLOT Cambia el control al miembro del equipo en una ranura. Party slot (1-based)
SAVEGAME Guarda la partida en una ranura. Slot (0-5)
LOADGAME Carga la partida desde una ranura. Slot (0-5)
SOUND Reproduce un efecto de sonido puntual. Sound id
STOPSOUND Detiene un efecto de sonido que sigue sonando — la forma de terminar uno puesto en bucle. Sound id
VOICE Reproduce una línea de voz con subtítulo. Voice line
MUSIC Cambia la música de fondo. Music id
STOPMUSIC Funde y detiene la música de fondo. (ninguno — token a secas)
AMBIENCE Inicia un sonido de fondo en bucle, como un ventilador. Ambient id
STOPAMBIENCE Detiene un sonido de fondo en bucle. Ambient id
TOGGLEHOTSPOTAUDIO Enciende o apaga el sonido en bucle de un objeto, como una radio. Hotspot id
SETHOTSPOTOPEN Pone una puerta o recipiente en abierto o cerrado. Open state
PLAYSCENE Reproduce un clip cinemático a pantalla completa. Scene
REWINDSCENE Reproduce un clip cinemático al revés, como un rebobinado. Scene (|speed=N)
PLAYARCADE Lanza un minijuego para jugar. Arcade stage
PLAYFX Reproduce un efecto visual, como un destello o un temblor. FX name, Params (key=val|…)
ADJUST Aplica un filtro de ambiente a pantalla completa, como noche o sepia. Screen FX preset, Pixelate params
TOGGLEROOMFX Enciende o apaga un efecto de superficie, como un reflejo. Room FX type
UNLOCK Concede un logro al jugador. Achievement
NEXTCHAPTER Lleva la historia al siguiente capítulo. (ninguno — token a secas)
NEXTBLOCK Lleva la historia a la siguiente parte. (ninguno — token a secas)
GOTOBLOCK Salta la historia a la parte que elijas — de vuelta al principio, o a una pantalla extra. Block
RESETGAME Borra la partida en curso para que la siguiente arranque limpia. Los achievements se conservan. (ninguno — token a secas)
WAIT Retiene el resto de la cadena unos segundos, para que una línea dé tiempo a leerse. Seconds
PARTYCOMMIT Confirma el equipo elegido y continúa. (ninguno — token a secas)
WAITFOR Retiene el resto de la cadena hasta que termina la línea en pantalla, sin adivinar segundos. Event
QUITGAME Cierra el juego, como corresponde en cada plataforma (ventana o app). (ninguno — token a secas)
SHOWTEXT Muestra texto libre en cualquier parte de la pantalla. Pos, Color, Size px, Font, Dur seg (0=fijo), Id (opt), Text ({flag})
CLEARTEXT Quita el texto en pantalla que mostraste antes. Id (blank=all)

Notas#

  • Los IDs de token son literales y siempre en inglés (SETFLAG, GIVEITEM…), aunque la UI del editor esté en español — renombrarlos rompería cada regla guardada.
  • GIVEITEM:<item>|<personaje> es el único token que mueve un item entre personajes jugables.
  • Algunos tokens no llevan argumento y serializan como verbo a secas (p. ej. INVENTORY_UP).
  • La mayoría de los argumentos son obligatorios, y dejar uno vacío es un error de autoría del que el motor no puede avisarte: SETFLAG: sin nombre activa la bandera vacía, una que ninguna condición puede leer jamás. Validar, en el Editor de Puzzles, ahora agarra justo eso y bloquea Guardar. Otros argumentos son opcionales a propósito y pueden ir vacíos — un PICKUP sin objeto otorga el id del propio hotspot, CLEARTEXT sin id limpia todos los textos en pantalla, SETVAL sin valor vacía el buffer, y las colas de speed / options / volumen-paneo de un token se pueden omitir por completo.

Cerrar un paso, un trigger o una luz con un puzzle#

Tres pares de tokens — WALKABLE_ON/WALKABLE_OFF, REGION_ON/REGION_OFF y LIGHTZONE_ON/LIGHTZONE_OFF — prenden y apagan en runtime las áreas caminables, las regiones de pisada y las zonas de luz de una sala, para que un puzzle pueda abrir un paso, armar un trigger o prender una lámpara. Los tres comparten la misma forma: TOKEN:<id> apunta a esa entidad en la sala actual, y TOKEN:<id>|<roomId> llega hasta otra sala — una palanca en una sala que abre un paso, arma un trigger o prende una luz en otro lado completamente distinto.

  • WALKABLE_ON/WALKABLE_OFF activan o desactivan un área caminable — un piso donde un personaje realmente puede pararse — como un pasadizo secreto que queda cerrado hasta que se acciona una palanca.
  • REGION_ON/REGION_OFF activan o desactivan una región de pisada — un trigger que un puzzle necesita armar o desarmar, para que una trampa no dispare antes de su cutscene, o para que un beat de introducción no vuelva a dispararse una vez que ya se reprodujo.
  • LIGHTZONE_ON/LIGHTZONE_OFF prenden o apagan una zona de luz — una lámpara, un spotlight, un área con tinte. Es solo visual: las zonas de luz están desacopladas a propósito de las áreas caminables, así que apagar una nunca mueve el piso, y apagar un área caminable nunca atenúa una luz.

Los tres son overrides, no toggles de un solo uso: el estado se recuerda por sala, tiene prioridad sobre lo que el autor de la sala haya puesto como default, y se reaplica cada vez que el jugador vuelve a entrar a esa sala — así que un paso que abrió un puzzle, un trigger que armó, o una lámpara que apagó, queda exactamente como el jugador lo dejó a través de un cambio de sala, y sobrevive a guardar/cargar.

Para leer ese estado de vuelta, están los predicados equivalentes — isWalkableOn, isRegionOn e isLightZoneOn — en la condición de una regla de puzzle; la lista completa de predicados está en la página del Editor de Puzzles.

Prender y apagar la luz de la sala#

TOGGLELIGHT cambia la sala entera entre iluminada y a oscuras — la llave de luz junto a la puerta, el fusible que el jugador baja. Es el velo de oscuridad de toda la sala, así que es otra cosa que LIGHTZONE_ON/LIGHTZONE_OFF, que prenden o apagan el resplandor de una lámpara concreta dentro de una sala.

Qué tan oscura queda la sala lo decide su propio ajuste Oscuridad al apagarse. Qué tan rápido llega ahí lo decide Duración del fundido, el fader justo debajo — ponélo en 0 y la luz cambia al instante, como una llave de verdad. Ese es el ajuste al que conviene ir primero: se autora una vez y todas las llaves de esa sala lo obedecen.

Cuando una llave puntual necesita comportarse distinto — una lámpara que se funde despacio mientras el resto de la sala cambia de golpe — dale al token su propia duración:

TOGGLELIGHT:dur=0        instantáneo, diga lo que diga la sala
TOGGLELIGHT:dur=1500     un fundido lento de un segundo y medio
TOGGLELIGHT              sin opinión — usa el fader de la sala

Déjalo en blanco y decide la sala, que es lo que vas a querer casi siempre.

Caminar a un personaje hasta un punto#

Dos tokens caminan a un personaje hasta un punto del piso desde cualquier regla, reacción o watcher — sin abrir una cutscene. WALKTO:<x>|<y> camina al jugador activo; NPCWALKTO:<personaje>|<x>|<y> camina a un personaje concreto y lo deja parado ahí. Ambos usan el mismo pathfinding de click-para-caminar que usa el jugador, así que el personaje esquiva obstáculos y se detiene igual que con un click normal.

Ambos comparten la misma cola opcional, y sus partes pueden ir en cualquier orden:

  • facing — una dirección (up/down/left/right) que se aplica al llegar; mientras camina, el personaje mira hacia donde se mueve.
  • speedspeed=<píxeles-por-segundo> o dur=<milisegundos> para el trayecto; es un override temporal, y la velocidad normal del personaje se restaura al llegar.
  • block — agrega block (o block=true) para congelar el juego hasta que el personaje llegue, como espera un paso de cutscene. Sin eso, la caminata es fire-and-forget: el juego queda interactivo y un click del jugador puede re-apuntar al personaje activo a mitad de camino.

Por ejemplo, WALKTO:120|340|left|block camina al jugador a (120, 340), retiene el input hasta que llega, y lo pone mirando a la izquierda al arribar.

Pausar entre tokens#

Todos los tokens de una cadena se disparan en el mismo instante, que casi siempre es lo que quieres — salvo cuando uno de ellos necesita un momento para verse. El caso más claro es una línea hablada: SAY pone la línea en pantalla y le pasa el turno al token siguiente de inmediato, así que un SAY seguido de un token que cambia la escena hace que la línea nunca llegue a leerse.

WAIT:<segundos> retiene el resto de la cadena y después sigue donde había quedado. Pon uno entre la línea y el salto — SAY:…, WAIT:2, GOTOBLOCK:creditos — y la línea se lleva sus dos segundos antes de que el juego avance.

WAITFOR:say hace lo mismo sin que tengas que poner un número: retiene la cadena hasta que la línea que está en pantalla desaparece, hable quien hable — el jugador, un NPC o el narrador. Escribe SAY:…, WAITFOR:say, GOTOBLOCK:creditos y el salto cae justo cuando cae la burbuja, aunque después reescribas la línea, o le grabes una voz y dejes que el subtítulo se estire al audio. Usalo siempre que el número que ibas a escribir en WAIT sea en realidad "lo que tarde esa línea". Si no hay nada dicho, sigue de largo.

El juego se queda quieto mientras espera: el input queda bloqueado, igual que durante una cutscene, y el jugador no puede saltearlo — así que conviene que las esperas sean cortas y deliberadas. Pausar sigue funcionando, y una espera en pausa deja de correr hasta que el jugador despausa.

Dónde funciona: en cualquier cadena de tokens del juego en vivo — reacciones de hotspot y de personaje, interacciones de ítems, botones del panel, opciones de diálogo, eventos de entrada a la sala y regiones que se pisan. Las líneas de tiempo de escena no aceptan ninguno de los dos, y el editor de escenas no los ofrece: una escena ya es una línea de tiempo, así que sus tiempos se espacian moviendo los beats, no con un token. Las cutscenes tienen su propio paso Wait que hace lo mismo. Cada espera tiene un tope de 60 segundos, y el juego se niega a guardar mientras haya una corriendo.

Sacar al jugador de pantalla#

A veces el personaje se tiene que ir sin ir a ningún lado — meterse en un portal justo antes de los créditos, salirse del cuadro para que una escena corra sobre la sala vacía, o simplemente no estar en una toma que arruinaría.

HIDEPLAYER saca de pantalla el sprite del jugador, y SHOWPLAYER lo devuelve. Los dos son tokens pelados, sin argumento. El beat del portal se lee tal como lo dirías en voz alta: WALKTO:588|816|up|block, HIDEPLAYER, WAIT:1, PLAYSCENE:creditos.

Dos cosas que conviene saber antes de usarlo:

  • Solo esconde — no apaga al personaje. Un jugador oculto sigue caminando, sigue chocando y sigue recibiendo clics. Si además quieres que se quede quieto, dilo con los tokens que ya hacen eso (WALKTO con block, o una cutscene). Lo que sí acompaña al sprite es su sombra y su reflejo en un charco o un espejo — se van con él —, y una línea hablada deja de dibujar la burbuja en vez de colgarla de una cabeza invisible. Para una voz sin nadie en pantalla, usa NARRATE.
  • Se recuerda. El estado oculto entra al save, así que quien deja el juego a mitad de un puzzle y vuelve encuentra la sala tal como la dejó. Empezar una partida nueva siempre devuelve al jugador, así que no hay forma de dejar a nadie invisible para siempre.

Mostrar un panel — o la moneda de verbos — desde una cutscene#

Una cutscene esconde el HUD, pero un panel que la cutscene misma abre está para verse: OPENGUI:<gui> en un paso de cutscene dibuja y anima su modal sobre la sala. Es un escaparate — la cutscene conserva el input, así que un click sigue avanzando la línea en vez de apretar un botón. Ponle detrás un WAIT y un cierre, y un recorrido guiado puede mostrar el inventario o un teclado en vez de sólo hablar de ellos.

CLOSEGUI acepta un objetivo opcional. A secas cierra el modal que esté abierto — lo que hace cualquier botón de cerrar. CLOSEGUI:<gui> cierra sólo si ese es el que está en pantalla, así una cutscene ordena su propio panel sin arrebatarle un menú que el jugador abrió mientras tanto.

La moneda de verbos emergente no se puede direccionar por id (se construye fresca en cada click, donde clickeaste), así que tiene su propio par. OPENCOIN:<hotspot> hace aparecer la moneda real centrada en el arte de ese hotspot — no en el punto de piso al que caminarías — y CLOSECOIN la descarta. Dentro de una cutscene es un escaparate como cualquier panel; fuera de una queda armada, y elegir un verbo ejecuta la acción normal sobre ese hotspot.

Reestilizar un elemento del panel al vuelo#

MODIFYWIDGET:<gui>.<widget> sobrescribe el aspecto de un solo widget de GUI en runtime — su color de fondo y opacidad, su borde (ancho y color), o su texto — sin tocar la GUI autorada. Como los otros tokens de panel es un overlay en tiempo de dibujo, así que el descriptor y el layout propios de la GUI nunca se mutan; pero a diferencia de un efecto visual puntual es durable: el override viaja con save/load, así que un cambio de color o texto puede representar estado recordado (un panel de palanca que se pone verde una vez que la tiraste). La cola son pares clave=valor en cualquier orden, cada uno opcional, y disparar el token de nuevo fusiona sobre el mismo override en vez de reemplazarlo. reset=true limpia el override y restaura el aspecto autorado del widget. El override de texto tiene prioridad sobre las otras fuentes de texto de una etiqueta y acepta un literal o un #lid (una entrada de la tabla de strings, para que siga localizándose).

El objetivo no se limita a tus propios paneles. La barra HUD principal del juego y la moneda de verbos emergente son GUIs normales por debajo, así que MODIFYWIDGET:mainBar.verb-look|bg=#a00 tiñe un botón de verbo y MODIFYWIDGET:verbCoin.coin-talk|text=Grita re-etiqueta una celda de la moneda — los editores sugieren ambos bajo sus ids reales (mainBar.*, verbCoin.*), defaults del engine incluidos cuando el proyecto no autoró los suyos. La moneda se reconstruye fresca en cada click, pero el override se re-aplica en cada apertura; como todo override de widget son durables, viajan en save/load, y reset=true devuelve el widget al look default configurado del juego. Un caveat: un botón dibujado con arte de sprite ignora los overrides de fondo, borde y texto — aplican a botones de etiqueta de texto (la barra clásica de nueve verbos y la moneda default son todos texto).

Cuando un panel ya lleva encima un puñado de estos, devolverlo a su sitio con un reset=true por widget se vuelve tedioso — así que omite el widget y el reset cubre el panel entero: MODIFYWIDGET:<gui>|reset=true tira de una sola vez todos los overrides de esa GUI. Lo mismo está disponible en el momento en que el panel se abre, como OPENGUI:<gui>|reset=true, para el caso común de "esta pantalla debería salir siempre limpia". Ambos son opt-in a propósito: como los overrides de widget son durables y pueden hacer las veces de estado recordado, un OPENGUI pelado nunca los limpia — si no, un panel que recuerda algo lo olvidaría en cada apertura.

Reestilizar el sprite de un hotspot al vuelo#

SETHOTSPOTFX:<hotspot> es la misma idea apuntada a la room: sobrescribe los FX visuales de un hotspot con sprite — sombra, glow, blur, opacidad y contorno de silueta — encima de lo que autoró el room editor, sin tocar el archivo de la room. La cola son pares clave=valor en cualquier orden (glowsize=8|glowcolor=#f0a03c, blur=3, opacity=0.5, strokew=2|strokecolor=#fff), cada uno opcional; disparar el token de nuevo fusiona sobre el mismo override, y es durable a través de save/load — un amuleto que conserva su glow una vez activado, un retrato que sigue desvanecido después de la sesión de espiritismo. reset=true restaura el aspecto autorado.

Las claves de sombra eligen entre los dos estilos del panel Sprite FX del room editor: shadow=basic con shdx/shdy/shblur/shcolor/shalpha para una drop shadow simple, o shadow=cast con shangle/shlen/shsoft/shalpha para la sombra de silueta real que proyectan los personajes — omite los números del cast y hereda la iluminación de la room, así la sombra del hotspot apunta hacia donde apuntan las de todos los demás. shadow=off mata la sombra por completo, la autorada incluida. Los tamaños en cero apagan el efecto (glowsize=0, strokew=0, blur=0), igual que los knobs "0 = off" del editor. Solo los hotspots con sprite aceptan FX — no hay nada que contornear ni hacer brillar en un polígono pelón.

Animar un hotspot, no solo un personaje#

El grupo Animaciones reúne los tres tokens que controlan la reproducción, y los tres son polimórficos: el mismo verbo apunta a un personaje o a la animación de objeto de un hotspot, así que hay un solo STOPANIM que recordar en vez de uno por cada tipo de cosa.

STARTANIM:<target> reanuda lo que el target estuviera reproduciendo y STOPANIM:<target> lo congela donde está — sin saltar de frame, que es justo la ergonomía que SETANIMFRAME no tiene. Apuntado a un personaje, STARTANIM acepta además un clip y un facing opcionales (STARTANIM:bernard|talk|left) para sostener una pose. Apuntado a un hotspot, el clip opcional cambia qué animación toca el prop: STARTANIM:grandfatherclock|clock_chime pasa al reloj de su loop de tictac a su campanada, y un STARTANIM:grandfatherclock posterior sin clip lo devuelve a lo que autoró la room. El facing es solo de personajes — un prop no tiene facing, y el editor esconde el campo en cuanto eliges un hotspot.

El selector de clip sigue a tu target: elige un personaje y te ofrece los clips de ese personaje por su nombre corto (talk, blink); elige un hotspot y te ofrece las animaciones de objeto y room del proyecto por su nombre completo (grandfatherclock_ticktock). Si nombras un clip que no existe, el prop vuelve a su animación autorada en lugar de congelarse — un prop congelado se ve idéntico a un token que no hizo nada.

El cambio es solo de runtime: se olvida cuando el jugador sale de la room, y no se guarda. El archivo de la room sigue siendo la verdad sobre qué toca un hotspot por defecto.

Pulsar, girar y desvanecer un prop — sin el editor de animaciones#

Un clip de FX horneado casi siempre ya loopea limpio desde el frame 0. Que además creciera al abrirse, pulsara mientras espera o se desvaneciera obligaba a hornear más clips — y nada de eso es animación: una rampa es una curva.

SETHOTSPOTMOTION:<hotspot>|clave=valor|… anima tres canales del sprite de un hotspot en runtime — escala (claves sc*), rotación (rot*, grados sobre el centro del sprite) y opacidad (op*, 0–1) — cada uno con su propia rampa, curva y modo de bucle. La cola no tiene orden y toda clave es opcional; un token reemplaza solo los canales que nombra, así que un pulse de escala sigue corriendo mientras un token posterior retoca la opacidad.

SETHOTSPOTMOTION:cofre|scfrom=1|scto=1.15|scdur=400|scease=inOutQuad|scloop=pingpong
SETHOTSPOTMOTION:molino|rotspeed=180
SETHOTSPOTMOTION:fantasma|opfrom=0.4|opto=1|opdur=900|oploop=pingpong

Cada canal toma la misma familia de claves, con prefijo sc / rot / op:

  • Xfrom= / Xto= — los extremos de la rampa. Deja Xfrom vacío y la rampa arranca desde donde el canal ya esté, así que dos tokens seguidos encadenan sin saltos; escríbelo y el sprite salta ahí primero — la forma del pop-in (scfrom=0.2|scto=1). Xfrom solo, sin Xto, es un set instantáneo.
  • Xloop=loop|pingpong — sin esta clave es un one-shot que corre una vez y se congela en el destino. loop corta en seco al inicio en cada ciclo; pingpong toca la rampa de ida y después espejada de vuelta, que es lo que hace que un pulse desacelere en los dos extremos — usa inOutQuad para pulses.
  • Xdur=<ms>, Xspeed=<unidades/s> y (solo escala) scframes=<n> — cuánto dura cada tramo. frames suma el tiempo real de cada frame del clip que el hotspot está tocando en ese momento, así que si re-tempeas la animación la rampa la sigue. dur le gana a frames y frames a speed.
  • Xease=<curva> — la misma lista de curvas que usa MOVEHOTSPOT. outBack se pasa un poquito antes de asentarse, que es lo que hace que un portal se lea abriéndose y no inflándose.
  • Xstop=true — mata ese canal y congela su valor donde está (exactamente lo que deja un one-shot terminado). Para volver a reposo con suavizado, manda un one-shot: scto=1|scdur=300.
  • origin=bottom — mantiene el pie del sprite clavado mientras escala. Por defecto escala respecto del ancla, que está bien para lo que flota y mal para lo que se apoya en el piso, que parecería hundirse y después subir.
  • reset=true — los tres canales apagados y de vuelta a reposo (escala 1, rotación 0, opacidad 1).

Dos canales tienen su truco. rotspeed= sin rotto= gira para siempre a esa velocidad en grados por segundo — la forma de hacer que un ventilador o un molino giren en su lugar. Y el canal de opacidad multiplica la opacidad durable de SETHOTSPOTFX en vez de pisarla: la del FX es el look base del prop ("este fantasma es 50% translúcido"), la del motion es una modulación animada encima, y cuando el canal se resetea el look base vuelve intacto.

Una escala de 1 es el tamaño autorado del sprite, y 0 es válido: significa "todavía no está", que es el punto de partida natural de un pop-in.

Dos cosas que conviene saber. La escala es uniforme: para un achatado permanente y no uniforme está el panel de distorsión de sprite del editor de rooms, que es autorado y no animado. Y el polígono del hotspot no escala — un portal dibujado al 20% se sigue pudiendo clickear en todo su polígono autorado, la misma generosidad que ya rige con un sprite rotado. Igual que MOVEHOTSPOT, el motion es solo de runtime: se olvida al cambiar de room y no se guarda. Para un pulse que sobreviva la re-entrada, re-dispáralo desde una regla de entrada a la room.

Tomar el control del cursor#

SETCURSOR sobrescribe el cursor del mouse en sí — qué cursor (y con él, qué animación) se dibuja, en qué frame queda congelado, dónde se posa y si se muestra siquiera. La cola son pares clave=valor en cualquier orden, todos opcionales; disparar el token de nuevo mergea en el mismo override, y reset=true restaura el comportamiento normal. A diferencia de sus dos hermanos de arriba, este override deliberadamente no se guarda: un cursor forzado es presentación, no estado de puzzle — y se limpia solo en cuanto la cutscene termina o se saltea.

  • cursor=<id> fuerza un cursor del set del proyecto — le gana al ítem armado del inventario, al verbo seleccionado y a cualquier override de hover.
  • frame=<n> congela un cursor animado en un frame; sin él, la animación corre normal.
  • x=<px>|y=<px> clava el cursor en una posición del canvas (manda los dos); sin ellos sigue al mouse real.
  • visible=show mantiene el cursor dibujado durante una cutscene, donde normalmente se oculta. El input sigue bloqueado — el jugador no puede clickear nada — así que el cursor es puramente tuyo para manejarlo desde los tokens de la propia cutscene: una "mano fantasma" de tutorial mostrando dónde clickear, un ojo siguiendo la escena. visible=hide es el espejo: oculta el cursor sprite fuera de cutscenes.

Un beat de cutscene: SETCURSOR:cursor=eye|visible=show|x=640|y=360 muestra el cursor de ojo clavado en el centro mientras la escena corre; en cuanto la cutscene termina, todo vuelve a la normalidad solo.

Cambiar el aspecto de toda la pantalla#

ADJUST:<preset> pone un filtro sobre la imagen terminada — sala, personajes, paneles y cursor juntos. Es la forma de jugar un flashback en blanco y negro, un envenenamiento en verde enfermizo o un recuerdo como un sueño suave. ADJUST:none lo limpia. El aspecto se guarda, así que un capítulo que arranca en blanco y negro sigue en blanco y negro después de que el jugador cierre el juego y vuelva.

Casi todos los presets son un aspecto y nada más: eliges el que quieres y listo. pixelate es la excepción — es el que se puede dosificar, con una cola clave=valor en cualquier orden:

  • block=<px> — de qué tamaño es cada cuadrado. La perilla principal.
  • levels=<n> — cuántos tonos por canal de color sobreviven. Bajarlo es lo que hace que se lea como pixel art y no como una foto borrosa con cuadraditos.
  • strength=<0..1> — cuánto del efecto se mezcla sobre la imagen sin tocar. 0 es una forma limpia de apagar el aspecto por un momento sin perder el resto de la configuración.
  • dither=none|b4|b8 — dispersa los saltos de color para que las zonas planas se rompan en un patrón. Necesita los niveles bajos para hacer algo.
  • down=area|nearestarea promedia y da un resultado más suave, nearest deja los bordes duros.
  • scope=world|all — hasta dónde llegan los bloques. world se detiene en el borde de la sala y deja la interfaz nítida — barra de verbos, diálogos, globos, texto en pantalla, cursor. all se lleva también los paneles y sus letras, que es lo que quieres cuando la interfaz ilegible es el efecto. A diferencia de los presets tonales de arriba, que siempre cubren la pantalla entera, el pixelado es el único al que se le puede decir dónde parar.

Todas son opcionales, y lo que no pongas conserva lo que el proyecto ya usa. Así que si el juego ya está pixelado desde Hub Config, ADJUST:pixelate|block=12 sube los bloques por un momento y deja la paleta como está; ADJUST:none lo devuelve al aspecto propio del proyecto, no apaga el pixelado.

Un bloque más grande también es más barato acá — el efecto trabaja sobre una copia más chica de la imagen, así que llevarlo más lejos pide menos, no más.

Trabajar con valores y contadores#

SETVAL, APPENDVAL y ADDVAL arman un valor dentro de un flag (una combinación, un número marcado, un contador) que luego revisas con la condición valueEquals o compare.

  • SETVAL:<flag>|<valor> escribe un valor exacto y reemplaza lo que hubiera. Si dejas el valor vacío (SETVAL:codigo|) borra el flag — ese es el botón Borrar de un teclado numérico.
  • APPENDVAL:<flag>|<texto>|<max> agrega texto al final de un flag, de a pedazos: es lo que dispara cada botón de dígito de un teclado numérico. El max opcional limita cuánto puede crecer el valor, así una cerradura de cuatro dígitos se queda en cuatro por más que el jugador machaque una tecla — las pulsaciones de más simplemente no hacen nada. Si no pones max, el valor crece sin límite. Una caja de texto donde el jugador escribe tiene su propio ajuste de largo máximo; max es la misma idea para la entrada por botones, que nunca pasa por el camino del tecleo.
  • ADDVAL:<flag>|<n> suma un número a un contador — el "+1" universal. n puede ser negativo para descontar (ADDVAL:intentos|-1). El resultado se guarda como texto, así que compare y valueEquals lo siguen leyendo; un flag ausente o no numérico cuenta como 0.
  • RANDVAL:<flag>|<min>|<max> escribe un número entero aleatorio entre min y max (inclusive) en un flag — luego ramificas con compare/valueEquals (p. ej. "di una de tres frases", una tirada de dado, un 30% de probabilidad). El azar es a propósito un efecto, nunca una condición: se tira una sola vez cuando dispara el paso, así que un watcher que lee el flag se mantiene estable. El stream está sembrado y se guarda, así que una partida es reproducible y un save/load no cambia un resultado ya tirado.

Afinar tokens de audio: volumen, paneo y loop con crossfade#

MUSIC, AMBIENCE, SOUND y VOICE aceptan una cola opcional de pares clave=valor después de su argumento principal, para ajustar un cue puntual sin tocar la mezcla general — los editores lo muestran como mini-knobs, pero por debajo es texto de token normal.

  • |vol=<0-100>|pan=<-100..100> fija el volumen y la posición estéreo de ese cue. El volumen multiplica sobre el volumen propio del jugador (en VOICE también multiplica el slider de volumen de voz del jugador); el pan mueve izquierda/derecha, con 0 centrado. Si omites alguno, queda en su valor por defecto (volumen completo, centrado) — un SOUND:door_creak a secas sigue funcionando exactamente igual que antes.
  • |xfade=<s>|xfadeat=<s> — solo en MUSIC y AMBIENCE — convierte el loop de una pista en un crossfade suave en vez de saltar de golpe al inicio. xfade son los segundos que se superponen la copia saliente y la entrante; xfadeat es el punto donde arranca ese crossfade, y de paso define cada cuánto repite la pista (una pista de 60 segundos con xfadeat=52 repite cada 52 segundos). Úsalo en música o ambiente cuyo final no cierra limpio por sí solo.

Un ejemplo con todo junto: MUSIC:theme|vol=80|pan=0|xfade=1.5|xfadeat=52.

Hacer que un efecto de sonido loopee, y pararlo#

SOUND es puntual: suena una vez y se recoge solo. Para que un sample concreto loopee no se cambia el token — se marca el sample en el Editor de Audio, que guarda los puntos y el modo de loop en projects/<id>/audio.json. A partir de ahí todo SOUND que reproduzca ese sample loopea, y STOPSOUND:<id> es lo que lo termina. STOPSOUND para todas las copias vivas de ese id, one-shots incluidos, así que también sirve como "corta ese ruido ya" para un sample largo que aún no terminó.

Dos cosas a saber antes de apoyarte en esto: un SOUND en bucle arrancado por una regla no sobrevive a un guardar/cargar (el ambiente de sala sí, porque la sala lo vuelve a disparar al entrar), y un sonido de fondo que pertenece a un lugar suele expresarse mejor como AMBIENCE, que va por clave, se superpone y se restaura solo.

Interpolación de texto en lo hablado / en pantalla#

SAY, NPCSAY, NARRATE, SETSENTENCE y SHOWTEXT sustituyen los tokens {nombreDeFlag} de su texto con los valores actuales de los flags al mostrarse — p. ej. SAY:Tienes {coins} monedas muestra Tienes 5 monedas. Un flag ausente queda como texto vacío (nunca un error); solo se tocan los nombres {...} hechos de letras, dígitos y _, así que las llaves sueltas y los montos tipo $9.99 quedan intactos. Combínalo con ADDVAL/RANDVAL para narrar contadores y tiradas en vivo.

Algunos tokens escriben un nombre en un flag justo para esto. CATCHTARGET elige uno de varios personajes candidatos (por priority o random) y guarda el id elegido en un flag de salida (por defecto caughtChar) — que luego consumes por interpolación, p. ej. SWITCHCHAR:{caughtChar} o FOLLOW:monster|{caughtChar} en la misma cutscene.