Ir al contenido

Señales y pilas remotas

Las pilas son independientes: cada baldosa es su propio programa. Las señales son la forma normal de conectarlas.

Intervienen tres piezas:

  1. Una antena: un furni de la sala que hace de canal. Lo normal es usar una Antena Wired (Grande o Pequeña), que existen para esto — ver La antena.
  2. Un efecto Enviar Señal, que apunta a esa antena.
  3. Un causante Recibir Señal, en otra baldosa, que escucha esa misma antena.

Cuando la primera pila ejecuta el efecto de enviar, todas las pilas cuyo causante escuche esa antena arrancan.

Baldosa (3,3) Baldosa (10,7)
Causante: alguien pisa Causante: recibir señal [antena X]
Efecto: enviar señal → X ──► Efecto: abrir la puerta

Una señal necesita un receptor. Enviar Señal no es un efecto que haga algo por sí mismo: si ninguna pila de la sala tiene un Recibir Señal escuchando esa misma antena, el envío no dispara nada: la antena parpadea igual (y el envío se paga igual), pero no hay aviso ni error y la señal se pierde. Antes de montar el Enviar, monta la pila que lo va a recibir. Vale lo mismo para las señales lanzadas a mano con doble clic en la antena.

Una antena puede tener muchos oyentes. Un solo envío dispara todas las pilas que la escuchen, lo que la convierte en la herramienta natural para “que pasen diez cosas a la vez en sitios distintos”.

Como se explica en El orden de ejecución, enviar señal es de las últimas cosas que hace una pila, después de todos sus demás efectos.

Esto no es un detalle interno: es la garantía que hace útiles las señales. Cuando la pila remota arranca, ve el mundo ya modificado por la pila que la llamó. Si mueves un furni y envías una señal, la pila que recibe encuentra el furni en su sitio nuevo.

Por eso, cuando necesites que dos cosas ocurran en un orden garantizado, la respuesta es encadenar con señal, no apilar dos efectos.

Una señal no es solo un aviso: puede llevarse consigo el usuario y los furnis con los que estaba trabajando la pila que la envía.

En la pila que recibe, los efectos pueden elegir “la señal” como fuente, y entonces actúan sobre lo que vino de la otra baldosa. Es la manera de pasar información entre pilas sin usar variables.

Ejemplo típico: la pila A detecta quién pisó, envía señal; la pila B recibe y teletransporta “al usuario de la señal”. La pila B nunca supo quién era, y no le hace falta.

Cuando una antena tiene varios oyentes, todos ellos evalúan sus condiciones antes de que ninguno ejecute sus efectos. Todos ven el mismo estado de la sala.

Y va más allá: si un efecto envía varias señales seguidas –una por cada usuario de un grupo, por ejemplo– todas las pilas que reciben evalúan contra el mismo estado inicial. La señal del segundo usuario no ve lo que hizo la del primero.

Esto es deliberado y casi siempre es lo que quieres: evita que el primero de la lista se “coma” el recurso y deje a los demás sin cumplir la condición.

Nada te impide que la pila B envíe una señal que despierte a la pila A. Y nada te impide que eso se repita para siempre.

No vas a tumbar el hotel, pero tu cadena se parará a mitad de camino: una misma pila no puede ejecutarse más de 100 veces en medio segundo, y lo que sobra se descarta en silencio. La regla entera, y cómo ampliar ese cupo cuando un montaje legítimo lo necesita, está en Límites y rendimiento. Si lo que quieres es un ciclo, móntalo con un causante periódico, que está pensado para eso.

La antena no es un wired: no tiene ventana, no se configura y no está en ninguna pila. Es un furni que se pone en cualquier baldosa y al que apuntan dos wireds: el Enviar Señal lo marca en Antenas y el Recibir Señal lo marca en Elige Furni. La señal viaja de uno a otro porque los dos señalan el mismo furni; nada más los une.

Como antena vale cualquier furni de la sala: la señal se empareja por el furni concreto, no por su tipo, así que hace de antena tanto el que marques a mano en Antenas como el que llegue por una fuente (furnis del selector, furnis de la señal, furni desencadenante). Usa de todas formas una Antena Wired Grande o Pequeña, por tres motivos:

  • Cada señal que pasa por la antena le cambia el estado (parpadea). Es el aviso visual de “por aquí ha pasado una señal”, y en la Antena Wired no molesta. Si usas de antena una lámpara, un portón o cualquier furni con estados, cada señal lo encenderá y apagará.
  • Un doble clic en una Antena Wired lanza la señal a mano (hace falta tener derechos en la sala). Es el botón de prueba: dispara todas las pilas que la escuchan sin tener que provocar el causante original. Esa señal manual va vacía —sin furnis ni usuarios adjuntos— y el desencadenante es quien hizo el clic; los efectos puestos a “furnis de la señal” o “usuarios de la señal” no tendrán sobre qué actuar.
  • Es 1x1 y no hace nada por sí misma: se puede esconder en un rincón o apilar sin que estorbe.

Cosas que conviene saber:

  • Si recoges la antena, las pilas que la referencian dejan de encontrarse; moverla no importa.
  • Usar antenas distintas para propósitos distintos es lo que mantiene una sala entendible. Una sola antena para todo convierte cualquier envío en un disparo global.
  • La pila que recibe puede saber por qué antena le entró la señal con la interna @event.signal.antenna_id (ver Internas de contexto), que vale el id de ese furni. Es la base de las retrollamadas.

Cómo se escribe todo esto por texto está en Wired Code › Antenas y señales.

Normalmente la antena a la que contesta una pila está clavada en el montaje: el Enviar Señal la tiene marcada. Una retrollamada (callback) le da la vuelta: la antena de respuesta es un dato que viaja con la ejecución, y la pila contesta a quien le digan.

Se monta con lo que ya conoces:

  1. Una antena es un furni, y un furni cabe en una variable (ver Referencias e identificadores). Quien llama guarda el @id de la antena a la que quiere que le contesten en una variable de contexto —por ejemplo antena_retorno— antes de enviar la señal.
  2. Esa variable acompaña a toda la cadena de señales (ver Hasta dónde llega), así que la pila que hace el trabajo la ve aunque esté tres señales más allá.
  3. Al terminar, esa pila envía la señal a la antena cuyo id vale antena_retorno: pon en la pila un selector Furnis con Variable que resuelva esa variable y elige furnis del selector como fuente de Antenas del Enviar Señal. (También sirve pasar la antena dentro de la propia señal y usar furnis de la señal.)

Lo que consigues es un montaje reutilizable: la misma cadena sirve a varios llamantes distintos, cada uno con su antena de vuelta, y todas las llamadas pueden correr en paralelo sin estorbarse porque cada ejecución lleva su propia variable de contexto.

Sirve para dos cosas:

  • Devolver un resultado a quien llamó: la respuesta va con la señal (o en otra variable de contexto), y quien la recibe decide qué hacer con ella. Si además el llamante le pasa parámetros en más variables de contexto, tienes una función con entrada y salida.
  • Avisar de que una cadena ha terminado, para que otra pila no arranque antes de tiempo.

Dos cosas a tener en cuenta:

  • Las variables de contexto del montaje siguen vivas hasta que acaba la ejecución. Si el mismo llamante lo llama dos veces dentro de una misma ejecución, la segunda vez se encuentra los valores de la primera: marca Sobrescribir variable existente al darlas (ver Tiempo de vida).
  • Un grupo de furnis o de usuarios no cabe en una variable de contexto; si el resultado es un conjunto, tiene que viajar dentro de la propia señal.