Ir al contenido
Wiki Hartico

Guía para generar scripts

Esta página es para quien escribe scripts enteros —a mano o con una IA que lea esta documentación— y no para quien retoca un campo. Son convenciones, no reglas de la gramática: un script que no las siga compila igual, pero cuesta más aplicarlo, leerlo y mantenerlo. Las reglas que sí son de la gramática están en Sintaxis y las del flujo de aplicar en Crear, borrar y mover.

1. La antena es siempre wf_antenna2

Para señales entre pilas usa la Antena Wired Pequeña, wf_antenna2. Como antena vale cualquier furni —la señal se empareja por el furni concreto, no por su tipo (ver La antena)—, pero en un script generado usa siempre wf_antenna2: es 1x1, no hace nada por sí misma, cada señal solo la hace parpadear y se reconoce a simple vista como "canal de señal". Con wf_antenna2 como única opción no hay nada que decidir.

Declárala con etiqueta y sin #id al final de la pila que la emite (punto 5), y referénciala por esa etiqueta desde antennas (Enviar Señal) y desde furnis (Recibir Señal):

stack (3, 1) {
    trigger.says {
        text = ":empezar"
    }
    effect.send_signal {
        antenna_source = selected
        users_to_advance = triggering
        antennas = [ ant_ronda ]
    }
    furni ant_ronda "wf_antenna2"
}

Si la pila receptora tiene que actuar sobre quien habló, no te dejes users_to_advance = triggering: omitido, la señal lleva los usuarios que haya elegido un selector de la pila (ninguno, si no hay).

2. Todas las pilas en una sola fila

Las pilas de wireds del sistema van en fila: misma y, x creciente de una en una —stack (1, 1), stack (2, 1), stack (3, 1)…—. No repartas el sistema en varias filas ni lo dobles en un rectángulo: una fila se recorre de izquierda a derecha con el cursor y cada pila está donde se espera. Cambia de disposición solo si quien pide el script te da una, o si la sala no tiene sitio en esa fila.

No hay excepciones: las antenas no ocupan pila propia —van dentro de la pila que las emite (punto 5)— y las pilas de cajas de variable (punto 4) van en esa misma fila, a la izquierda del todo.

3. Orden de apilado por tipo

Dentro de cada pila escribe los bloques en este orden:

  1. Causantes (trigger.*)
  2. Complementos (extra.*)
  3. Selectores (selector.*)
  4. Condiciones (condition.*)
  5. Efectos (effect.*)
  6. Efectos negativos (effect.neg_*)

Es un orden de lectura, no de ejecución: estén como estén apilados, al dispararse el servidor resuelve los selectores, aplica los complementos, evalúa las condiciones y ejecuta los efectos, y los efectos no corren en el orden en que los apilas sino por escalones: Dar variable, por ejemplo, corre después de los movimientos de furnis (ver Orden de ejecución). Ordenar por tipo es solo una convención para que todas las pilas se lean igual.

La excepción es Ejecutar en orden (extra.exec_in_order). Con ese complemento en la pila, los efectos se ejecutan en el orden en que están apilados —de abajo arriba en la sala, que en el texto es el orden en que los escribes—, así que ahí el orden de los efectos entre sí ya no es cosmético: escríbelos en el orden en que tienen que pasar. Los bloques que no son efectos siguen la regla general.

4. Cada tipo de caja de variable en su propia pila; el conector aísla

Las cajas de variable van en pilas aparte, agrupadas por tipo: una pila para las de sala, otra para las de usuario, otra para las de furni, otra para las de contexto — nunca mezcladas con los wireds que las usan (ver las cajas de variable van en pilas aparte).

Y una caja que lleve Conector de texto va sola en su pila, con el conector: el conector se aplica a todas las cajas de variable de la baldosa que comparte (salvo a las variable.reference y a las variable.pointer, que no lo usan), así que si la dejas con las demás, todas heredan su tabla. Lo mismo con Compartir (extra.var_addon_share), que sincroniza todas las compartidas entre salas de su baldosa y va sola con la suya, y con Importar (extra.var_addon_import), que se aplica a todas las variable.reference de su baldosa y va sola con la suya.

stack (1, 1) {
    variable.room { name = "fase" }
    variable.room { name = "ronda" }
}

stack (2, 1) {
    variable.room { name = "color" }
    extra.var_text_connector {
        table = "1=rojo\n2=verde\n3=azul"
    }
}

Y cuando una condición compruebe una variable de furni, de usuario o de contexto, escribe siempre su ámbito: condition.has_var y condition.neg_has_var miran furni si no escribes scope, así que para una variable de usuario o de contexto pon scope = user o scope = context (las de sala no se comprueban con has_var: no tiene ámbito para ellas). Si el ámbito no es el de la caja, el editor lo marca como error.

Una Variable puntero (variable.pointer) es una caja más: va en su propia pila, con su scope y con accessor_variable apuntando a una variable.context que tenga has_value = true. Su ámbito cuenta como el de cualquier otra caja para la regla de arriba. Y la variable de acceso se da en la pila que manda la señal, con el @id de la caja de destino; el puntero se usa en la pila que la recibe. Dársela en la misma pila que usa el puntero no lo apunta.

stack (3, 1) {
    variable.context {
        name = "caja_equipo"
        has_value = true
    }
}

stack (4, 1) {
    variable.pointer {
        name = "puntos_equipo"
        scope = global
        accessor_variable = "caja_equipo"
    }
}

5. La antena, al final de la pila que la emite

No pongas las antenas todas juntas en un rincón ni en una fila aparte: cada antena va en la misma pila que la emite —la del effect.send_signal o del effect.neg_send_signal que la selecciona—, escrita al final del bloque, después de los wireds. Así no queda ningún furni suelto por la sala que haya que ir a buscar, y en el texto se ve de un vistazo qué pila dispara qué señal.

La pila que recibe no necesita nada: el trigger.recv_signal referencia esa antena por su etiqueta, esté en la pila que esté.

Si una misma pila emite por dos antenas (el envío positivo y el negativo, por ejemplo), las dos van al final de esa pila.

Al volcar la sala salen arriba

El editor escribe todas las líneas furni al principio del bloque cuando vuelca una sala. Es el mismo sitio y funciona igual: solo cambia dónde aparecen en el texto.

6. Los saltos de línea de un conector se escriben \n

En la tabla de un Conector de texto las parejas van en una sola cadena separadas por los dos caracteres \n. Un salto de línea de verdad dentro de las comillas rompe el script (Cadena sin cerrar en cascada):

table = "0=blanco\n1=amarillo\n2=naranja"      // así

Ver Escapes dentro de las comillas.

7. El estilo del mensaje dice algo

effect.show_message tiene un notification_style con un significado visual cada uno. No uses el mismo para todo: elige el que corresponde a lo que el mensaje cuenta.

notification_styleEstilo en el clienteÚsalo para
default (34)Notificación por defectoSin marcar; solo si ninguno de abajo encaja
red (53)Notificación rojaNegativo: perdiste, eliminado, prohibido
green (54)Notificación verdePositivo: ganaste, conseguido, aceptado
blue (55)Notificación azulNeutro: anuncios, "empieza la partida", estados
alert (56)AlertaAlgo urgente que hay que atender ya
info (57)InformaciónExplicaciones, ayuda, instrucciones
warning (58)AdvertenciaAvisos previos: "3 segundos", "última ronda"
wrong (59) / wrong_circle (60)Incorrecto / Incorrecto (círculo)Respuesta o acción equivocada
correct (61) / correct_circle (62)Correcto / Correcto (círculo)Respuesta o acción acertada
question (63) / question_circle (64)Interrogación / Interrogación (círculo)Preguntas al jugador
arrow_up (65) / arrow_up_circle (66)Flecha arriba / (círculo)Subir, más, siguiente nivel
arrow_down (67) / arrow_down_circle (68)Flecha abajo / (círculo)Bajar, menos, retroceso
skull (69) / skull_2 (70)Calavera / Calavera 2Muerte, eliminación definitiva, peligro
magnifier (71)LupaBuscar, pista, investigar

Las variantes "(círculo)" son el mismo icono dentro de un círculo: sirven para distinguir dos mensajes de la misma familia (por ejemplo, acierto normal y acierto final).

8. La menor cantidad de pilas posible

Monta el sistema con las menos pilas que puedas: menos pilas es menos furnis, menos antenas, menos coste al aplicar y un sistema que se entiende de un vistazo. Antes de añadir otra pila, busca el wired que te ahorra el rodeo: casi siempre hay uno que hace en un bloque lo que ibas a montar en tres —una condición en vez de una pila que comprueba y reenvía, un selector en vez de una cadena de señales, un contador o una variable en vez de tres pilas encadenadas.

Con el sistema escrito, repásalo una vez con esta pregunta: ¿qué pilas se pueden fundir? Dos pilas con el mismo causante y condiciones compatibles son una; una señal que solo existe para saltar a otra pila sobra si los efectos caben en la primera; una cadena de tres señales suele poder ser de una o dos. Si una pila no se puede fundir sin exec_in_order ni sin romper el orden que el juego necesita, déjala.

9. Los límites de una pila

A diferencia de las convenciones de arriba, estos límites son de verdad: si un script se pasa, o el editor no te deja aplicar, o el wired se guarda y no hace lo que esperas. Con un solo error en el documento, Aplicar no se activa para ningún bloque. Las nueve primeras filas las comprueba el editor y dan error; las demás las decide el servidor, al aplicar o al ejecutarse la pila, y el editor, como mucho, avisa.

QuéLímiteQué pasa si te pasas
Furnis de una lista30, o 50 con permiso de Super Wired (ver El tope de furnis seleccionados). En un bloque nuevo el editor no sabe si tienes ese permiso: aplica el mayor tope que anuncie algún wired de la sala, y 30 si ninguno anuncia nadaError: demasiados furnis (31, máximo 30); el máximo que dice es el que vale para esa lista
Retardo de un efectoDe 0 a 120 pulsos de 0,5 s o, en el modo Preciso, de -50 a -60000 ms en múltiplos de 50 (ver El retardo de un efecto). En el script, delay = 4 son 2 s y delay = -250, 250 msError: no es un retraso válido o está fuera de rango
Datos de un wired100 por guardado: cada opción numérica y, en los wireds con dos listas de furnis, cada #id de esas listasError: lleva 107 datos y el servidor solo lee 100 por guardado
Texto de un wired1000 caracteres (algunos campos tienen su propio tope, más bajo: ver la Referencia)Error: el texto ocupa 1001 caracteres y el servidor guarda como mucho 1000
Mensaje, Mensaje de Bot y Bot habla o susurra a usuario400 caracteres y 8 líneasError: en Mensaje, texto demasiado largo (401 > 400) o demasiadas líneas (9 > 8); en los de bot, el mensaje tiene 401 caracteres y el servidor lo corta a 400 o el mensaje tiene 9 líneas y el servidor lo corta a 8
Nombre de una caja de variableDe 1 a 40 letras sin tildes, números o _Error: nombre de variable no válido
Nombre del identificador (identifier_name) de los tres complementos que declaran un $(nombre)No uses trigger_text, con las mayúsculas que sea, en Identificar Nombres (extra.text_output_username), Identificar Nombres de Furni (extra.text_output_furni_name) ni Marcador de posición de variable (extra.text_output_variable): ya es el nombre del mensaje completo que activó un causante «Clave»Error: está reservado para el mensaje del causante «Clave»
Wireds que no se pueden creareffect.give_reward, effect.bot_follow_avatar, condition.conditionstatepos y condition.conditionuserhasfurni: los que ya están en una sala se leen y se editan, pero no se pueden crearError: ya no se puede crear con Wired Code
Usuario clicado o alcanzadouser_source = clicked solo con trigger.click_user en la misma pila, y user_source = reached solo con trigger.bot_reached_avtr; el causante puede ser nuevo, del mismo scriptError: 'user_source': 'clicked' necesita 'trigger.click_user' en la misma pila
Variable FX en una baldosa5 (ver Hasta cinco por baldosa)Aviso ℹ: el sexto se coloca, pero queda inerte
Controladores de salaUno de cada tipo por sala; la Zona Oculta es la excepción (ver Controladores de sala)La vista previa rechaza el que sobra: solo cabe uno de este tipo por sala y ya hay uno puesto (o … y esta tanda ya crea otro)
Furnis que no se crean por textoCofres, teletransportadores y Nexos de Sala: una línea furni sin #id de cualquiera de ellos no se compraLa vista previa rechaza la fila con su motivo (por ejemplo, es un teletransportador: se compra por parejas, cómpralo y colócalo a mano); se compran y se colocan a mano
CréditosLo que compra la tanda entera no puede pasar de los créditos de quien aplicaLa vista previa avisa con no tienes créditos suficientes: la tanda cuesta X créditos y tienes Y y no deja aplicar
Furnis de suelo en la sala7000 (ver Límites duros)La vista previa rechaza la pieza: la sala está llena (máx 7000 furnis)
Cambios en un solo Aplicar2000 creaciones, 2000 recogidas, 2000 movimientos y 2000 cambios de altura o de rotaciónLa vista previa rechaza la tanda entera, con un mensaje por tipo: Demasiados bloques nuevos de una vez., Demasiadas recogidas de una vez., Demasiados movimientos de una vez. o Demasiadas alturas de una vez.; aplica el sistema en varias veces
Uso wired de la sala20.000 (ver El uso wired)El servidor corta lo que iba a ejecutar
Causantes periódicos en una pilaUn solo Periodos Cortos (trigger.period_short) por baldosa; de Periodos (trigger.periodically) y de Periodos Largos (trigger.period_long), hasta once de cada (ver Límites duros)No hay error ni aviso: el que sobra se coloca, pero no dispara nunca
Efectos desde un causante periódicoAlgunos (Mensaje, Expulsar Usuario, ¡Adiós!…) no corren desde uno si no usan los usuarios de un selector; desde Periodos Cortos, algunos no corren nunca (ver Hay efectos que se niegan a correr desde un periódico)No hay error: ese efecto no se ejecuta (el resto de la pila, sí)

Recomendaciones

Si vas a generar un sistema entero a partir de esta wiki, estas son las recomendaciones a seguir:

  1. Que la antena a utilizar en los sistemas de wired sea la wf_antenna2.
  2. Que las pilas de wired siempre vayan en una sola fila y que no crees varias filas.
  3. Que el orden sugerido para apilar wireds sea por tipo, de esta forma: causantes, complementos, selectores, condiciones, efectos, efectos negativos. El orden sugerido solo es para pilas que no tienen el complemento Ejecutar en orden, ya que cuando se usa este complemento la ejecución de los efectos cambia según cómo estén apilados en la pila.
  4. Que las cajas de variable se apilen en pilas diferentes según su tipo, pero recordando que si se usa un conector de texto hay que aislar esa caja de variable en otra pila. Y recordando que el conector de texto afecta a todas las cajas de variable de la pila, salvo a las variable.reference y a las variable.pointer; Compartir, a todas las compartidas entre salas de la pila, e Importar, a todas las variable.reference. Y que condition.has_var y condition.neg_has_var lleven siempre su scope, porque sin él miran furni. Y que la variable de contexto que apunta un variable.pointer se dé en la pila que manda la señal, no en la que usa el puntero.
  5. Que las antenas a utilizar vayan al final de la misma pila, así no las tenemos en otro lado y las podemos identificar correctamente.
  6. Que en los conectores de texto los saltos de línea de verdad pueden romper el código, por lo que se usa \n para los saltos de línea.
  7. Que se usen lógicamente los estilos del wired Mensaje, ya que hay varios tipos y cada uno tiene un significado visual diferente.
  8. Que se use la menor cantidad de pilas posible para armar el sistema propuesto, y que siempre se busquen wireds que puedan optimizar más el proceso en vez de alargarlo.
  9. Que se respeten los límites del punto 9: listas de hasta 30 furnis (50 con Super Wired; en un bloque nuevo, el máximo que diga el editor), retardos válidos, mensajes de hasta 400 caracteres y 8 líneas, nombres de variable de 1 a 40 letras sin tildes, como mucho cinco Variable FX por baldosa y un uso wired por debajo de 20.000, y sin effect.give_reward, effect.bot_follow_avatar, condition.conditionstatepos ni condition.conditionuserhasfurni, ni líneas furni nuevas de cofres, teletransportadores o Nexos de Sala.

En esta página