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 — unPICKUPsin objeto otorga el id del propio hotspot,CLEARTEXTsin id limpia todos los textos en pantalla,SETVALsin valor vacía el buffer, y las colas despeed/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_OFFactivan 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_OFFactivan 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_OFFprenden 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. - speed —
speed=<píxeles-por-segundo>odur=<milisegundos>para el trayecto; es un override temporal, y la velocidad normal del personaje se restaura al llegar. - block — agrega
block(oblock=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 (
WALKTOconblock, 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, usaNARRATE. - 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. DejaXfromvací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).Xfromsolo, sinXto, 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.loopcorta en seco al inicio en cada ciclo;pingpongtoca la rampa de ida y después espejada de vuelta, que es lo que hace que un pulse desacelere en los dos extremos — usainOutQuadpara pulses.Xdur=<ms>,Xspeed=<unidades/s>y (solo escala)scframes=<n>— cuánto dura cada tramo.framessuma 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.durle gana aframesyframesaspeed.Xease=<curva>— la misma lista de curvas que usaMOVEHOTSPOT.outBackse 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=showmantiene 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=hidees 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.0es 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|nearest— area 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. Elmaxopcional 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 ponesmax, el valor crece sin límite. Una caja de texto donde el jugador escribe tiene su propio ajuste de largo máximo;maxes 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.npuede ser negativo para descontar (ADDVAL:intentos|-1). El resultado se guarda como texto, así quecompareyvalueEqualslo siguen leyendo; un flag ausente o no numérico cuenta como0.RANDVAL:<flag>|<min>|<max>escribe un número entero aleatorio entreminymax(inclusive) en un flag — luego ramificas concompare/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 (enVOICEtambién multiplica el slider de volumen de voz del jugador); el pan mueve izquierda/derecha, con0centrado. Si omites alguno, queda en su valor por defecto (volumen completo, centrado) — unSOUND:door_creaka secas sigue funcionando exactamente igual que antes.|xfade=<s>|xfadeat=<s>— solo enMUSICyAMBIENCE— convierte el loop de una pista en un crossfade suave en vez de saltar de golpe al inicio.xfadeson los segundos que se superponen la copia saliente y la entrante;xfadeates el punto donde arranca ese crossfade, y de paso define cada cuánto repite la pista (una pista de 60 segundos conxfadeat=52repite 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.