Referencias e identificadores
Una variable solo guarda números. Pero como cada furni y cada persona de la sala tienen un número que los identifica, eso basta para que una variable guarde a quién se refiere.
Es el patrón que separa un montaje que funciona con un jugador de uno que funciona con veinte.
Guardar y recuperar
Son siempre los mismos dos pasos:
- Guardar: copiar el identificador del objeto —
@idsi es un furni,@indexsi es una persona— dentro de una variable, con Cambiar valor de variable, poniendo ese identificador en su Valor de referencia. - Recuperar: reunir con Furnis con variable o Usuarios con variable a los que tengan esa variable con ese valor.
Nunca "sacas" el objeto de la variable. Lo que haces es buscar quién coincide.
Las dos direcciones no son iguales
Y esa es la parte que hay que decidir bien desde el principio, porque no se puede cambiar después sin rehacer el montaje.
Furni → usuario, cuando son muchos
Un jugador puede haber recogido treinta casillas. Treinta ids no caben en una sola variable, así
que la marca va en cada furni y su valor es el @index de la persona.
Caja de variable:
Variable de furni [dueño · mientras la sala esté activa · tiene valor]
Pila A — marcar la casilla que alguien pisa
│
├─ Causante: Sobre un Furni
│ └─ Elige Furni ............................. Casilla de presión
│
├─ Efecto: Dar variable
│ ├─ Escoge una variable ..................... dueño (ámbito furni)
│ ├─ Sobreescribir la variable existente ..... marcada
│ └─ Escoge el objetivo de la variable ....... Furni desencadenante
│
└─ Efecto: Cambiar valor de variable
├─ Escoge una variable ..................... dueño (ámbito furni)
├─ Escoge una operación .................... Asignar
├─ Valor de referencia ..................... @index (ámbito usuario)
│ └─ Escoge la fuente de la variable .... Usuario desencadenante
└─ Escoge el objetivo de la variable ....... Usar furni desencadenanteY para reunir "las casillas de esta persona", el selector compara la variable del furni contra el índice de quien disparó:
Pila B — que las casillas de cada uno le sigan
│
├─ Causante: Click en Furni
│ └─ Elige Furni ............................. Botón de recoger
│
├─ Selector: Furnis con variable
│ ├─ Escoge una variable ..................... dueño (ámbito furni)
│ ├─ Seleccionar por valor ................... marcada
│ ├─ Opciones ................................ =
│ └─ Valor de referencia ..................... @index (ámbito usuario)
│ └─ Escoge la fuente de la variable .... Usar usuario desencadenante
│
└─ Efecto: Mover Furni a Usuario
├─ Furnis a mover .......................... Usar furnis de Selector
└─ Usuarios a mover ........................ Usar usuario desencadenanteUsuario → furni, cuando es uno solo
Al revés: cada jugador tiene un bloque invisible, una baldosa caminable. Eso sí cabe en una
variable de usuario cuyo valor es el @id del furni.
Caja de variable:
Variable de usuario [mi_bloque · mientras esté en la sala · tiene valor]Se rellena igual que antes, con la referencia al revés —@id del furni, guardado en el usuario— y
para recuperar el mueble se compara el @id de cada furni contra esa variable:
├─ Selector: Furnis con variable
│ ├─ Escoge una variable ..................... @id (ámbito furni)
│ ├─ Seleccionar por valor ................... marcada
│ ├─ Opciones ................................ =
│ └─ Valor de referencia ..................... mi_bloque (ámbito usuario)
│ └─ Escoge la fuente de la variable .... Usar usuario desencadenanteLa regla en una línea: si la relación es de uno, la variable va en el usuario; si es de muchos, va en el furni.
El selector de furnis solo mira el suelo
Furnis con variable no alcanza los muebles de pared. Si tu referencia apunta a un cuadro, no vas a poder recuperarlo por esta vía.
Qué identificador usar
Cada persona de la sala tiene hasta cuatro números, y elegir mal es la causa de bugs que solo aparecen cuando entra la segunda persona.
| Identificador | Lo tiene | Único entre |
|---|---|---|
@index | Todo lo que hay en la sala: personas, bots y mascotas | Toda la sala |
@user_id | Solo las personas | Todo el hotel |
@bot_id | Solo los bots | Todos los bots |
@pet_id | Solo las mascotas | Todas las mascotas |
Los tres últimos colisionan entre sí
@user_id, @bot_id y @pet_id son listas distintas. Puede existir a la vez el bot 1000 y la
persona 1000, y comparar sus números diría que son el mismo. Si tu juego mezcla personas con bots o
mascotas, el único identificador que no colisiona es @index.
Nunca guardes @index en una variable permanente
El índice se reparte por orden de llegada: el primero que entra es el 0, el segundo el 1. Al descargarse la sala vuelven a empezar en 0, así que un índice guardado ayer apunta hoy a otra persona — y tu juego le entrega el progreso de otro sin dar ningún error.
La regla: @index para lo que dura una partida, @user_id para lo que se guarda.
Nunca escribas una coordenada a mano
Es la misma idea aplicada al espacio, y el error más caro de todos porque tarda semanas en aparecer.
@position.x y @position.y son la baldosa de la cuadrícula de la sala, y esa cuadrícula no
empieza en (0,0): casi todas las salas tienen un desfase, y la baldosa de arriba puede ser la (4,1).
Puedes verlo abriendo :floor → Importar/Exportar.
Lo grave no es el desfase. Lo grave es que las coordenadas cambian si alguien edita el plano de la
sala. Una fila que hoy es X=5 puede ser X=7 después de un :floorplan, y todos los wireds que
tenían el 5 escrito a mano quedan apuntando a otro sitio. No fallan: hacen lo que les pediste, en el
lugar equivocado.
La solución es un furni de referencia. Colocas un furni —uno invisible vale— en la fila que te
importa, y en vez de escribir el número, operas contra su @position.x:
└─ Efecto: Cambiar valor de variable
├─ Escoge una variable ..................... @position.x (ámbito furni)
├─ Escoge una operación .................... Asignar
├─ Valor de referencia ..................... @position.x (ámbito furni)
│ └─ Escoge la fuente de la variable .... Selección de furnis secundarios
└─ Escoge el objetivo de la variable ....... Usar furnis seleccionadosEl furni que se mueve es el que marcas en Usar furnis seleccionados; el de referencia, el que marcas en la Selección de furnis secundarios. Los dos se marcan clicándolos en la sala.
Sale dos cosas gratis: el montaje sobrevive a los cambios de plano, y puedes reubicar la zona entera moviendo el furni de referencia, sin abrir un solo wired.
Si necesitas las dos coordenadas, copia @position. Los furnis y las personas tienen una variable
@position que lleva la baldosa entera —x e y— en un solo número, y escribirla los manda a las dos
coordenadas de una vez. Con la @position del furni de referencia en el Valor de referencia, lo
que se mueve —un furni o una persona— llega a su misma baldosa sin que escribas ni una coordenada; si
no puede estar ahí, se queda donde estaba. Cómo está formado ese número lo tienes en
Las empaquetadas.
Y tampoco escribas un id a mano
Por lo mismo. @id y @class_id son números que el hotel reparte, y no son estables ni entre salas
ni entre hoteles: un montaje copiado de otro sitio con ids escritos a dedo apunta a muebles que aquí
no existen.
Los identificadores se leen, no se escriben. Si necesitas señalar un furni concreto, señálalo en la ventana del wired, que para eso está; si necesitas señalar "el mismo que antes", guárdalo en una variable como se explica arriba.
Limpia las referencias
Una referencia es un número que apunta a algo que puede desaparecer. Si el jugador se va y su bloque sigue marcado con su índice, el siguiente que entre con ese índice hereda el bloque.
Por eso el causante Salida es parte de este patrón, no un extra: es donde se borran las marcas que los furnis guardaban de quien se acaba de ir. Las variables de usuario «mientras esté en la sala» no hace falta tocarlas: el sistema las borra solo al salir, y de hecho ya no existen cuando corre tu pila de Salida — no cuentes con leerlas ahí.
Lo siguiente
- Variables internas de usuario – la lista de identificadores.
- Retrollamadas – qué se puede montar encima de esto.
- Identificar Nombres – no confundas estos identificadores
numéricos con los de texto,
$(nombre), que meten el nombre de una persona dentro de un mensaje.