Cómo usar esta hoja de trucos#

XPath, MD y Lua expresan intenciones similares de manera diferente. Esta es una selección útil para leer estos ejemplos y código del proyecto, no un ranking estadístico o una referencia completa del idioma. cómo funciona el código de X4 Los nuevos fragmentos son ejemplos de aprendizaje, no se reclaman pruebas en el juego.

Cuatro conceptos básicos#

Una variable almacena un valor. Una condición elige si hacer algo. Una función recibe argumentos y realiza trabajo, a veces devuelve un resultado. Un manejador de eventos es una función o nodo MD que se ejecuta para un evento en particular. getName, llamando getName() y almacenar su valor devuelto.

Elementos XML, atributos y selectores#

Forma Significado
<hull max="1800" /> Un elemento con un atributo y sin contenido secundario
<actions> ... </actions> Un contenedor comienza y termina
<!-- comment --> Comentario XML
replace, add, remove Operaciones Diff para reemplazar, añadir o eliminar el contenido seleccionado
/properties/hull/@max XPath a un atributo
[@name='example'] Filtro de atributo XPath

Dentro de un atributo XML, ampersands escape como &amp; y menos que como &lt;. XML se analiza antes de las expresiones MD, por lo que lt/le/gt/ge son comparaciones convenientes. Un lector diff se y una expresión do_if usan diferentes gramáticas.

MD: Una acción pequeña cada vez#

Construir Finalidad
set_value Asignar o actualizar un valor
do_if, do_elseif, do_else Seleccionar una rama
do_for_each Elementos de la lista de procesos
append_to_list Añadir un elemento
remove_value Eliminar una variable o registro
debug_text Escribir diagnósticos
run_actions Ejecute una biblioteca de acción apropiada
event_ui_triggered Recibir un evento de la UI en condiciones de entrada
raise_lua_event Enviar un evento a Lua

Estos son nombres de elementos MD, no funciones XML estándar. El motor define atributos y contexto válido. El ejemplo de acciones a continuación crea su propia lista y termina con Count igual a 2. operation=add exact=1 aumenta; El elemento denota el elemento actual.

XML
<set_value name="$Items" exact="['Корпус', 'Двигатель']" />
<set_value name="$Count" exact="0" />
<do_for_each name="$Item" in="$Items">
  <set_value name="$Count" operation="add" exact="1" />
</do_for_each>
<do_if value="$Count == 2">
  <debug_text text="'Обработано два элемента'" />
</do_if>

Expresiones MD#

Forma Significado
$Count, Init.$States Una variable, o una variable en un contexto de entrada explícito
==, != Igual, no igual
lt, le, gt, ge Menos, menos o igual, más, más o menos igual
and, or, not Operaciones lógicas
+, -, *, /, % Aritmético; porcentaje es el resto
'Name: ' + $Label Concatenación de cadenas
$Value?, $Object.exists Resolución de variables/property versus existencia de objetos
typeof $D == datatype.list Ensayo de tipo de valor
$D.{1}, $D.count Primera lista de elementos y elementos
table[], [] Tabla vacía y lista vacía
if $Ready then 'yes' else 'no' Una expresión de valor condicional

Las listas de MD mostradas comienzan en 1. Una variable revocable puede contener falso; la existencia y la verdad son diferentes. contexto de la variable, especialmente con cues instantáneos.

Lua: Leer una función normal#

El ejemplo independiente a continuación no utiliza funciones X4. Su resultado es 8, asumiendo que cada elemento tiene un campo de cantidad de la moneda. {} crea una tabla, utilizada para ambas secuencias y registros con nombre. item.amount significa item["amount"]. In for _, item, la primera variable recibe el índice; el subrayado es un nombre ordinario que marca convencionalmente un valor no utilizado.

LUA
local function total(items)
    if type(items) ~= "table" then
        return 0
    end
    local result = 0
    for _, item in ipairs(items) do
        result = result + item.amount
    end
    return result
end

local amount = total({{amount = 3}, {amount = 5}})

Operadores Lua#

Forma Significado
= Asignación
==, ~= Igual, no igual
<, <=, >, >= Comparaciones
and, or, not Operaciones lógicas
+, -, *, /, % Aritmético
.. Concatenación de cadenas
#value Longitud del byte de cadena o límite de secuencia
object.field Acceso al campo de la tabla
object:method(x) Equivalente a object.method(object, x)

#table no es un recuento de teclas arbitrarias. Las teclas de agujeros y cadenas no forman una secuencia densa. Las longitudes de cadena cuentan bytes, lo que importa para UTF-8. Sólo las falsas y las niles son falsas en Lua; 0 y una cadena vacía son verdaderas. value or fallback También reemplaza false. Lógica y/o devuelve un valor seleccionado, no necesariamente un booleano.

Funciones estándar de Lua#

type informa de un tipo de valor; tostring formatos de un valor; tonumber intenta la conversión y puede devolver nil. ipairs camina índices densos desde 1 hasta un elemento que falta; pairs no tiene garantía de orden. table.insert, table.remove y table.concat manipular secuencias. string.format construye texto formateado; match/gsub usa patrones Lua. math.min y math.max seleccionar límites de la condicional. pcall capturas de errores de Lua; require carga módulos bajo reglas ambientales.

No todos los módulos están disponibles en la UI del juego. No asumas el acceso a los archivos o debug. Revisa la bandera de pcall y el error en lugar de ocultar silenciosamente un fallo. Una llamada Lua protegida no hace que una llamada nativa no sea válida. Vea las referencias primarias Lua 5.1 y LuaJIT abajo.

Funciones X4 versus funciones mod#

Un número aleatorio, nombre de la nave, ID de red, mango de la UI y UniverseID no son intercambiables: Precisión del ID.

Cinco errores que puedes detectar mientras lees#

  1. Usos de Lua ~=, mientras que MD utiliza != por la desigualdad.
  2. Lua une cadenas con ..; Usos de MD + en los formularios mostrados.
  3. La asignación Lua es =, comparación es ==.
  4. Cambiar el texto de la ventana no prueba cambiar el objeto del mundo.
  5. Una definición de controlador todavía necesita un archivo cargado, un evento recibido y una entrada validada.

Lee Lua ↔ MD y explicar cada línea antes de instalar el ejemplo en un perfil de prueba.