--- title: Operadores y funciones comunes: XML, MD y Lua summary: Una hoja de engaño para principiantes explicando símbolos, pequeños ejemplos y errores frecuentes en lenguaje sencillo. section: scripting kind: guide status: reference updated: 2026-10-26 tags: ["X4","modding","x4","language","cheatsheet"] sources: ["https://www.lua.org/manual/5.1/","https://luajit.org/extensions.html","https://wiki.egosoft.com/X%20Rebirth%20Wiki/Modding%20support/Mission%20Director%20Guide/"] --- ## 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](wiki:x4-code-basics) 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 | | --- | --- | | `` | Un elemento con un atributo y sin contenido secundario | | ` ... ` | Un contenedor comienza y termina | | `` | 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 `&` y menos que como `<`. 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 ``` ### 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](wiki:md-variables), 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](wiki:ids-and-precision). ## 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](wiki:md-lua-bridge) y explicar cada línea antes de instalar el ejemplo en un perfil de prueba.