{
  "schema": "imperivm-format-library/v1",
  "version": 1,
  "name": "Imperivm Modding Wiki — file formats",
  "maintainer": "Upercat",
  "scope": "Imperivm HD",
  "updated": "2026-10-15",
  "license": "GPL-3.0-or-later",
  "languages": [
    "es",
    "en"
  ],
  "limitations": "Partial reference for Imperivm HD. Do not assume compatibility with other editions or infer undocumented fields or behavior.",
  "articles": [
    {
      "slug": "pak",
      "kind": "archives",
      "extensions": [
        ".pak"
      ],
      "related": [
        "bfhp",
        "lzis"
      ],
      "title": {
        "es": "PAK · paquetes de recursos",
        "en": "PAK · resource packages"
      },
      "summary": {
        "es": "Contenedor de recursos con una cabecera de 40 bytes y un directorio de nombres que comparte prefijos entre entradas.",
        "en": "Resource container with a 40-byte header and a directory whose names share prefixes between entries."
      },
      "sections": [
        {
          "id": "purpose",
          "title": {
            "es": "Para qué sirve",
            "en": "Purpose"
          },
          "paragraphs": {
            "es": [
              "Un archivo .pak reúne archivos de recursos. La extensión identifica aquí el contenedor HMMSYS PackFile de Imperivm; no debe confundirse con otros formatos PAK que usan juegos distintos.",
              "La firma completa ocupa 18 bytes: el texto HMMSYS PackFile seguido de salto de línea, el byte 26 y el byte cero. Identificar el contenedor es el primer paso antes de interpretar su directorio."
            ],
            "en": [
              "A .pak file groups resource files. Here the extension refers to Imperivm's HMMSYS PackFile container; other games use different formats with the same PAK extension.",
              "The complete signature is 18 bytes: the text HMMSYS PackFile followed by a newline, byte 26 and a zero byte. Identify the container before interpreting its directory."
            ]
          }
        },
        {
          "id": "header",
          "title": {
            "es": "Cabecera",
            "en": "Header"
          },
          "table": {
            "columns": {
              "es": [
                "Posición en bytes",
                "Tamaño",
                "Contenido"
              ],
              "en": [
                "Byte position",
                "Size",
                "Contents"
              ]
            },
            "rows": {
              "es": [
                [
                  "0",
                  "18 bytes",
                  "Firma HMMSYS PackFile y sus tres bytes finales"
                ],
                [
                  "18",
                  "14 bytes",
                  "Zona cuyo significado completo no se documenta aquí"
                ],
                [
                  "32",
                  "uint32 LE",
                  "Número de entradas"
                ],
                [
                  "36",
                  "uint32 LE",
                  "Longitud en bytes del directorio"
                ],
                [
                  "40",
                  "Variable",
                  "Comienzo del directorio"
                ]
              ],
              "en": [
                [
                  "0",
                  "18 bytes",
                  "HMMSYS PackFile signature and its three trailing bytes"
                ],
                [
                  "18",
                  "14 bytes",
                  "Area whose complete meaning is not documented here"
                ],
                [
                  "32",
                  "uint32 LE",
                  "Entry count"
                ],
                [
                  "36",
                  "uint32 LE",
                  "Directory length in bytes"
                ],
                [
                  "40",
                  "Variable",
                  "Directory start"
                ]
              ]
            }
          },
          "paragraphs": {
            "es": [
              "LE significa little-endian. Las posiciones de esta tabla son desplazamientos dentro del archivo, contados desde cero."
            ],
            "en": [
              "LE means little-endian. Positions in this table are zero-based offsets within the file."
            ]
          }
        },
        {
          "id": "directory",
          "title": {
            "es": "Entradas del directorio",
            "en": "Directory entries"
          },
          "list": {
            "es": [
              "TotalLen: 1 byte con la longitud total del nombre.",
              "PrefixLen: 1 byte con la longitud del prefijo compartido con el nombre anterior.",
              "Suffix: TotalLen − PrefixLen bytes con la parte restante del nombre.",
              "Offset: entero de 32 bits little-endian con la posición absoluta de los datos en el archivo PAK.",
              "Size: entero de 32 bits little-endian con el tamaño de la entrada."
            ],
            "en": [
              "TotalLen: one byte containing the complete name length.",
              "PrefixLen: one byte containing the length of the prefix shared with the previous name.",
              "Suffix: TotalLen − PrefixLen bytes containing the remaining name.",
              "Offset: a 32-bit little-endian integer containing the absolute position of the entry data in the PAK file.",
              "Size: a 32-bit little-endian integer containing the entry size."
            ]
          },
          "paragraphs": {
            "es": [
              "La reconstrucción del nombre utiliza el prefijo indicado del nombre anterior y añade el sufijo de la entrada actual. No sumes el campo de la posición 36 a Offset: ese campo mide el directorio y los offsets de las entradas son absolutos."
            ],
            "en": [
              "Reconstruct a name using the indicated prefix of the previous name followed by the current suffix. Do not add the field at position 36 to Offset: that field measures the directory, and entry offsets are absolute."
            ]
          }
        },
        {
          "id": "workflow",
          "title": {
            "es": "Al consultar o extraer",
            "en": "When inspecting or extracting"
          },
          "list": {
            "es": [
              "Comprueba la firma y que el archivo contenga la cabecera completa.",
              "Valida longitudes y posiciones antes de leer cada entrada; no aceptes un prefijo mayor que el nombre anterior.",
              "Comprueba que Offset y Size describan un rango contenido en el archivo.",
              "Al extraer, conserva la jerarquía relativa y rechaza rutas absolutas o recorridos mediante .. fuera del directorio de salida."
            ],
            "en": [
              "Check the signature and that the complete header is present.",
              "Validate lengths and positions before reading each entry; do not accept a prefix longer than the previous name.",
              "Check that Offset and Size describe a range within the file.",
              "When extracting, preserve the relative hierarchy and reject absolute paths or .. traversal outside the output directory."
            ]
          }
        },
        {
          "id": "limits",
          "title": {
            "es": "Límites conocidos",
            "en": "Known limits"
          },
          "paragraphs": {
            "es": [
              "Esta ficha describe la cabecera, la forma del directorio y la interpretación actual de sus offsets. No es una especificación completa del comportamiento ante archivos dañados ni de todas las variantes posibles.",
              "El contenido de la zona entre el final del directorio y la primera entrada no queda caracterizado aquí. Tampoco se documenta un proceso completo de reempaquetado compatible con el juego."
            ],
            "en": [
              "This entry describes the header, directory shape and current interpretation of its offsets. It is not a complete specification of malformed-file behavior or every possible variant.",
              "The area between the end of the directory and the first entry is not characterized here. A complete game-compatible repacking workflow is not documented either."
            ]
          }
        }
      ],
      "status": "partial",
      "urls": {
        "es": {
          "html": "https://selu.es/imperivm/formatos/pak/",
          "markdown": "https://selu.es/imperivm/formatos/pak/index.md",
          "json": "https://selu.es/imperivm/formatos/pak/index.json"
        },
        "en": {
          "html": "https://selu.es/imperivm/formatos/en/pak/",
          "markdown": "https://selu.es/imperivm/formatos/en/pak/index.md",
          "json": "https://selu.es/imperivm/formatos/en/pak/index.json"
        }
      }
    },
    {
      "slug": "bfhp",
      "kind": "archives",
      "extensions": [
        ".bfhp"
      ],
      "related": [
        "map-xml",
        "map-objects",
        "terrain-grids",
        "lzis",
        "pak"
      ],
      "title": {
        "es": "BFHP / HPFS · contenedores de mapas",
        "en": "BFHP / HPFS · map containers"
      },
      "summary": {
        "es": "Volumen de archivos identificado por HPFS, utilizado en mapas guardados y paquetes de contenido. Algunos archivos llevan una envoltura LZIS.",
        "en": "File volume identified by HPFS, used in saved maps and content packs. Some files have an LZIS wrapper."
      },
      "sections": [
        {
          "id": "purpose",
          "title": {
            "es": "Contenedor y contenido",
            "en": "Container and contents"
          },
          "paragraphs": {
            "es": [
              "BFHP es el archivo contenedor; el volumen de archivos se identifica por la firma ASCII HPFS. No es el mismo formato que PAK.",
              "Un mapa guardado reúne varias capas: metadatos, objetos y rejillas del terreno, además de otros archivos del contexto de juego. Por eso no debe tratarse como un único XML ni como una sola imagen de terreno."
            ],
            "en": [
              "BFHP is the container file; the file volume is identified by the ASCII signature HPFS. It is a different format from PAK.",
              "A saved map combines metadata, objects and terrain grids with other game-context files. It should therefore not be treated as a single XML file or terrain image."
            ]
          }
        },
        {
          "id": "identification",
          "title": {
            "es": "Cómo identificarlo",
            "en": "Identification"
          },
          "list": {
            "es": [
              "HPFS al principio: estás ante un volumen sin esa envoltura de compresión.",
              "LZIS al principio: hay que interpretar primero el flujo comprimido y después identificar el contenido lógico resultante.",
              "La biblioteca Packs/RandomMapSettlements.bfhp es un caso documentado de LZIS que contiene un volumen HPFS."
            ],
            "en": [
              "HPFS at the start identifies a volume without that compression wrapper.",
              "LZIS at the start requires interpreting the compressed stream first, then identifying its decoded logical contents.",
              "The library Packs/RandomMapSettlements.bfhp is a documented example of LZIS containing an HPFS volume."
            ]
          }
        },
        {
          "id": "map-layout",
          "title": {
            "es": "Organización observada en mapas",
            "en": "Observed map organization"
          },
          "code": "Maps/1/\n  map.xml\n  map.obj.xml\n  Terrain.terrain.grid\n  Terrain.height.grid\n  Terrain.light.grid\n  Terrain.trans.grid\n  Terrain.decor.grid\n  Terrain.pass.grid\n  Notes.xml\n  warehouse.rle\n  Sequences/sequences.xml",
          "paragraphs": {
            "es": [
              "Este árbol describe archivos observados en mapas guardados con el editor; no define una lista universal de archivos obligatorios. En la raíz del volumen también pueden aparecer game.xml, env.42, itemsCustom.xml y archivos player0.xml a player15.xml.",
              "Las páginas relacionadas explican por separado map.xml, map.obj.xml y las rejillas .grid."
            ],
            "en": [
              "This tree describes files observed in editor-saved maps; it is not a universal list of required files. The volume root can also contain game.xml, env.42, itemsCustom.xml and player0.xml through player15.xml.",
              "Related pages describe map.xml, map.obj.xml and .grid layers separately."
            ]
          }
        },
        {
          "id": "workflow",
          "title": {
            "es": "Cómo abordar una modificación",
            "en": "Approaching a modification"
          },
          "list": {
            "es": [
              "Identifica la firma real antes de elegir una herramienta de extracción.",
              "Trabaja con una copia y conserva tanto la estructura de carpetas como los archivos asociados al mapa.",
              "Distingue el volumen que contiene los archivos de cada formato almacenado dentro de él.",
              "Comprueba por separado la extracción, la modificación y el guardado; poder leer un volumen no demuestra que pueda reempaquetarse correctamente."
            ],
            "en": [
              "Identify the actual signature before selecting an extraction tool.",
              "Work on a copy and preserve both the folder hierarchy and the files associated with the map.",
              "Distinguish the volume holding the files from the individual formats inside it.",
              "Verify extraction, editing and saving separately; the ability to read a volume does not establish that it can be repacked correctly."
            ]
          }
        },
        {
          "id": "limits",
          "title": {
            "es": "Límites conocidos",
            "en": "Known limits"
          },
          "paragraphs": {
            "es": [
              "Esta entrada no publica una especificación completa de directorios, asignación de sectores ni escritura HPFS. No presupone equivalencia con .mmp ni compatibilidad entre todas las ediciones del juego.",
              "Los guardados del editor pueden conservar sectores libres con contenido previo. Extraer archivos accesibles y copiar todos los bytes del volumen son operaciones distintas."
            ],
            "en": [
              "This entry does not provide a complete HPFS directory, sector-allocation or writing specification. It does not assume equivalence with .mmp or compatibility across all game editions.",
              "Editor saves can retain free sectors containing earlier data. Extracting accessible files and copying every byte of the volume are different operations."
            ]
          }
        }
      ],
      "status": "partial",
      "urls": {
        "es": {
          "html": "https://selu.es/imperivm/formatos/bfhp/",
          "markdown": "https://selu.es/imperivm/formatos/bfhp/index.md",
          "json": "https://selu.es/imperivm/formatos/bfhp/index.json"
        },
        "en": {
          "html": "https://selu.es/imperivm/formatos/en/bfhp/",
          "markdown": "https://selu.es/imperivm/formatos/en/bfhp/index.md",
          "json": "https://selu.es/imperivm/formatos/en/bfhp/index.json"
        }
      }
    },
    {
      "slug": "map-xml",
      "kind": "maps",
      "extensions": [
        "map.xml"
      ],
      "related": [
        "bfhp",
        "map-objects",
        "terrain-grids"
      ],
      "title": {
        "es": "map.xml · metadatos del mapa",
        "en": "map.xml · map metadata"
      },
      "summary": {
        "es": "XML que describe metadatos y parámetros del mapa. Se complementa con los objetos de map.obj.xml y las capas Terrain.*.grid.",
        "en": "XML describing map metadata and parameters. It works alongside map.obj.xml objects and Terrain.*.grid layers."
      },
      "sections": [
        {
          "id": "purpose",
          "title": {
            "es": "Qué contiene",
            "en": "Contents"
          },
          "paragraphs": {
            "es": [
              "map.xml contiene información descriptiva y parámetros del mapa. El conjunto documentado incluye el nombre, la descripción, las dimensiones, opciones de exploración y un punto de inicio.",
              "Cambiar este archivo no cambia por sí solo los objetos ni reconstruye las rejillas del terreno. Un mapa completo necesita que sus archivos relacionados sean coherentes entre sí."
            ],
            "en": [
              "map.xml contains descriptive information and map parameters. The documented subset includes the name, description, dimensions, exploration options and a starting point.",
              "Changing this file alone does not change objects or rebuild terrain grids. A complete map requires consistency between its related files."
            ]
          }
        },
        {
          "id": "fields",
          "title": {
            "es": "Elementos y campos documentados",
            "en": "Documented elements and fields"
          },
          "table": {
            "columns": {
              "es": [
                "Elemento",
                "Campos",
                "Alcance conocido"
              ],
              "en": [
                "Element",
                "Fields",
                "Known scope"
              ]
            },
            "rows": {
              "es": [
                [
                  "map (raíz)",
                  "name, displayname, descr, persist_state",
                  "Metadatos y estado de persistencia; no se atribuyen aquí significados adicionales a persist_state"
                ],
                [
                  "size",
                  "x, y",
                  "Enteros no nulos e iguales en el lector documentado"
                ],
                [
                  "user_art",
                  "explored",
                  "Texto cuya codificación interna no está descrita"
                ],
                [
                  "expl",
                  "NoFog, NoExplore",
                  "Valores enteros usados como opciones booleanas"
                ],
                [
                  "start_pt",
                  "x, y",
                  "Coordenadas enteras del punto de inicio"
                ]
              ],
              "en": [
                [
                  "map (root)",
                  "name, displayname, descr, persist_state",
                  "Metadata and persistence state; no additional persist_state semantics are assigned here"
                ],
                [
                  "size",
                  "x, y",
                  "Nonzero, equal integers in the documented reader"
                ],
                [
                  "user_art",
                  "explored",
                  "Text whose internal encoding is not described"
                ],
                [
                  "expl",
                  "NoFog, NoExplore",
                  "Integer values used as Boolean-like options"
                ],
                [
                  "start_pt",
                  "x, y",
                  "Integer starting-point coordinates"
                ]
              ]
            }
          }
        },
        {
          "id": "editing",
          "title": {
            "es": "Antes de editar",
            "en": "Before editing"
          },
          "list": {
            "es": [
              "Conserva los nombres y la capitalización de los elementos y atributos documentados.",
              "No cambies solo size para intentar ampliar el mapa: también existen capas de terreno y otros datos dependientes de las dimensiones.",
              "Conserva los campos desconocidos de un archivo existente; esta ficha documenta un subconjunto, no un esquema completo.",
              "Al generar XML, utiliza escape XML para los textos de atributos."
            ],
            "en": [
              "Preserve the spelling and capitalization of documented elements and attributes.",
              "Do not change size alone to enlarge a map: terrain layers and other dimension-dependent data also exist.",
              "Preserve unknown fields in an existing file; this entry documents a subset rather than a complete schema.",
              "Use XML escaping when generating attribute text."
            ]
          }
        },
        {
          "id": "limits",
          "title": {
            "es": "Límites conocidos",
            "en": "Known limits"
          },
          "paragraphs": {
            "es": [
              "No se documentan aquí la tolerancia al orden, el tratamiento de elementos desconocidos, la codificación completa de caracteres ni un esquema externo versionado.",
              "La condición de dimensiones iguales no implica que cualquier tamaño cuadrado sea válido o esté soportado. No debe deducirse una lista de tamaños admitidos a partir de esta ficha."
            ],
            "en": [
              "Element-order tolerance, handling of unknown elements, complete character encoding and an external versioned schema are not documented here.",
              "The equal-dimensions condition does not establish that any square size is valid or supported. Do not derive a list of supported sizes from this entry."
            ]
          }
        }
      ],
      "status": "partial",
      "urls": {
        "es": {
          "html": "https://selu.es/imperivm/formatos/map-xml/",
          "markdown": "https://selu.es/imperivm/formatos/map-xml/index.md",
          "json": "https://selu.es/imperivm/formatos/map-xml/index.json"
        },
        "en": {
          "html": "https://selu.es/imperivm/formatos/en/map-xml/",
          "markdown": "https://selu.es/imperivm/formatos/en/map-xml/index.md",
          "json": "https://selu.es/imperivm/formatos/en/map-xml/index.json"
        }
      }
    },
    {
      "slug": "map-objects",
      "kind": "maps",
      "extensions": [
        "map.obj.xml"
      ],
      "related": [
        "map-xml",
        "bfhp",
        "terrain-grids"
      ],
      "title": {
        "es": "map.obj.xml · objetos del mapa",
        "en": "map.obj.xml · map objects"
      },
      "summary": {
        "es": "XML de la capa de objetos del mapa: objetos sueltos, asentamientos y referencias a grupos y unidades.",
        "en": "XML for the map's object layer: loose objects, settlements and references to groups and units."
      },
      "sections": [
        {
          "id": "purpose",
          "title": {
            "es": "Cómo se relaciona con el mapa",
            "en": "Role in the map"
          },
          "paragraphs": {
            "es": [
              "map.obj.xml describe la capa de objetos de un mapa guardado. Se diferencia de map.xml, que contiene metadatos, y de las rejillas del terreno.",
              "La raíz del documento es mapobject. La estructura de escritura documentada incluye objetos scriptobj, bloques settlement con sus objetos y secciones group y partyunit."
            ],
            "en": [
              "map.obj.xml describes the object layer of a saved map. It differs from map.xml metadata and terrain grid files.",
              "The document root is mapobject. The documented writing structure includes scriptobj objects, settlement blocks containing their objects, and group and partyunit sections."
            ]
          }
        },
        {
          "id": "objects",
          "title": {
            "es": "Campos de los objetos",
            "en": "Object fields"
          },
          "table": {
            "columns": {
              "es": [
                "Campo",
                "Descripción documentada"
              ],
              "en": [
                "Field",
                "Documented description"
              ]
            },
            "rows": {
              "es": [
                [
                  "class",
                  "Nombre de clase del objeto"
                ],
                [
                  "num",
                  "Contador global de escritura, comenzando en cero, en el orden del documento"
                ],
                [
                  "player",
                  "Índice del propietario más uno; no debe tratarse como un índice comenzando en cero"
                ],
                [
                  "healthperc, stamina",
                  "Campos de estado del objeto; no se generalizan aquí sus rangos o unidades"
                ],
                [
                  "inventorysize, slotN",
                  "Datos del inventario y sus casillas"
                ],
                [
                  "x, y",
                  "Posición del objeto"
                ],
                [
                  "flags",
                  "Indicadores del objeto; el significado de todos sus bits no se publica aquí"
                ],
                [
                  "dir.x, dir.y",
                  "Componentes de dirección del objeto"
                ]
              ],
              "en": [
                [
                  "class",
                  "Object class name"
                ],
                [
                  "num",
                  "Global writing counter, starting at zero, in document order"
                ],
                [
                  "player",
                  "Owner index plus one; do not treat it as a zero-based index"
                ],
                [
                  "healthperc, stamina",
                  "Object state fields; their complete ranges and units are not generalized here"
                ],
                [
                  "inventorysize, slotN",
                  "Inventory size and slot data"
                ],
                [
                  "x, y",
                  "Object position"
                ],
                [
                  "flags",
                  "Object flags; not every bit's meaning is described here"
                ],
                [
                  "dir.x, dir.y",
                  "Object direction components"
                ]
              ]
            }
          }
        },
        {
          "id": "settlements",
          "title": {
            "es": "Asentamientos y referencias",
            "en": "Settlements and references"
          },
          "paragraphs": {
            "es": [
              "Los bloques settlement pueden incluir id, player, classoffirstbuilding, maxpopulation, extrasentries, maxgold, maxfood, population, gold, food, icon y name, además de sus objetos scriptobj.",
              "Las secciones group contienen referencias obj mediante num, y partyunit también usa num. Al modificar numeración y objetos hay que conservar la coherencia de esas referencias."
            ],
            "en": [
              "Settlement blocks can include id, player, classoffirstbuilding, maxpopulation, extrasentries, maxgold, maxfood, population, gold, food, icon and name, together with their scriptobj objects.",
              "Group sections contain obj references through num, and partyunit also uses num. Keep those references consistent when changing numbering or objects."
            ]
          }
        },
        {
          "id": "limits",
          "title": {
            "es": "Límites conocidos",
            "en": "Known limits"
          },
          "paragraphs": {
            "es": [
              "Esta es una descripción parcial de la escritura del mapa, no de la serialización completa de una partida guardada. No intercambies automáticamente atributos de asentamientos entre esos dos contextos.",
              "No se documenta aquí todo el lector. Las secciones de grupos y partyunit no están cubiertas por los mismos ejemplos de archivos que los objetos y asentamientos, y algunos objetos pueden omitir player. Conserva esa ausencia cuando no conozcas su significado."
            ],
            "en": [
              "This is a partial description of map writing, not complete saved-game serialization. Do not automatically transfer settlement attributes between those contexts.",
              "The complete reader is not documented here. Group and partyunit sections are not covered by the same file examples as objects and settlements, and some objects can omit player. Preserve that omission when its meaning is unknown."
            ]
          }
        }
      ],
      "status": "partial",
      "urls": {
        "es": {
          "html": "https://selu.es/imperivm/formatos/map-objects/",
          "markdown": "https://selu.es/imperivm/formatos/map-objects/index.md",
          "json": "https://selu.es/imperivm/formatos/map-objects/index.json"
        },
        "en": {
          "html": "https://selu.es/imperivm/formatos/en/map-objects/",
          "markdown": "https://selu.es/imperivm/formatos/en/map-objects/index.md",
          "json": "https://selu.es/imperivm/formatos/en/map-objects/index.json"
        }
      }
    },
    {
      "slug": "terrain-grids",
      "kind": "maps",
      "extensions": [
        ".grid",
        "Terrain.*.grid",
        ".pass"
      ],
      "related": [
        "map-xml",
        "map-objects",
        "bfhp"
      ],
      "title": {
        "es": "GRID · capas del terreno",
        "en": "GRID · terrain layers"
      },
      "summary": {
        "es": "Familia de rejillas binarias con una cabecera común de 20 bytes. Cada capa tiene su propio tamaño de celda y profundidad.",
        "en": "Binary grid family with a shared 20-byte header. Each layer has its own cell size and bit depth."
      },
      "sections": [
        {
          "id": "purpose",
          "title": {
            "es": "Un mapa, varias rejillas",
            "en": "One map, several grids"
          },
          "paragraphs": {
            "es": [
              "El mapa utiliza capas separadas para terreno, altura, iluminación, transiciones, decoración y transitabilidad. Comparten una cabecera, pero no son intercambiables.",
              "La firma visible al leer los cuatro primeros bytes es DIRG. El nombre GRID se refiere a la familia del formato; escribir literalmente GRID como firma produciría otros bytes."
            ],
            "en": [
              "The map uses separate layers for terrain, height, lighting, transitions, decoration and passability. They share a header but are not interchangeable.",
              "The visible signature in the first four file bytes is DIRG. GRID names the format family; writing literal GRID as the signature would produce different bytes."
            ]
          }
        },
        {
          "id": "header",
          "title": {
            "es": "Cabecera común",
            "en": "Shared header"
          },
          "table": {
            "columns": {
              "es": [
                "Posición en bytes",
                "Tipo",
                "Campo"
              ],
              "en": [
                "Byte position",
                "Type",
                "Field"
              ]
            },
            "rows": {
              "es": [
                [
                  "0",
                  "4 bytes",
                  "Firma ASCII DIRG"
                ],
                [
                  "4",
                  "uint32 LE",
                  "cell_size: dimensión de celda"
                ],
                [
                  "8",
                  "uint32 LE",
                  "bits_per_cell: bits por celda"
                ],
                [
                  "12",
                  "uint32 LE",
                  "width: anchura lógica"
                ],
                [
                  "16",
                  "uint32 LE",
                  "height: altura lógica"
                ]
              ],
              "en": [
                [
                  "0",
                  "4 bytes",
                  "ASCII signature DIRG"
                ],
                [
                  "4",
                  "uint32 LE",
                  "cell_size: cell dimension"
                ],
                [
                  "8",
                  "uint32 LE",
                  "bits_per_cell: bits per cell"
                ],
                [
                  "12",
                  "uint32 LE",
                  "width: logical width"
                ],
                [
                  "16",
                  "uint32 LE",
                  "height: logical height"
                ]
              ]
            }
          },
          "paragraphs": {
            "es": [
              "LE significa little-endian. Los datos de la capa comienzan después de los 20 bytes de cabecera. width y height son dimensiones lógicas: no deben confundirse directamente con el número de columnas y filas de celdas."
            ],
            "en": [
              "LE means little-endian. Layer data follows the 20-byte header. Width and height are logical dimensions, not directly the number of cell columns and rows."
            ]
          }
        },
        {
          "id": "layers",
          "title": {
            "es": "Valores por capa",
            "en": "Per-layer values"
          },
          "table": {
            "columns": {
              "es": [
                "Archivo",
                "cell_size",
                "bits_per_cell"
              ],
              "en": [
                "File",
                "cell_size",
                "bits_per_cell"
              ]
            },
            "rows": {
              "es": [
                [
                  "Terrain.terrain.grid",
                  "64",
                  "8"
                ],
                [
                  "Terrain.height.grid",
                  "32",
                  "8"
                ],
                [
                  "Terrain.light.grid",
                  "32",
                  "8"
                ],
                [
                  "Terrain.trans.grid",
                  "64",
                  "4"
                ],
                [
                  "Terrain.decor.grid",
                  "64",
                  "16"
                ],
                [
                  "Terrain.pass.grid",
                  "16",
                  "1"
                ]
              ],
              "en": [
                [
                  "Terrain.terrain.grid",
                  "64",
                  "8"
                ],
                [
                  "Terrain.height.grid",
                  "32",
                  "8"
                ],
                [
                  "Terrain.light.grid",
                  "32",
                  "8"
                ],
                [
                  "Terrain.trans.grid",
                  "64",
                  "4"
                ],
                [
                  "Terrain.decor.grid",
                  "64",
                  "16"
                ],
                [
                  "Terrain.pass.grid",
                  "16",
                  "1"
                ]
              ]
            }
          },
          "paragraphs": {
            "es": [
              "En dimensiones divisibles por cell_size, las columnas y filas de celdas se obtienen dividiendo width y height por ese valor. Estos valores son propios de cada variante; cambiar la profundidad en la cabecera no convierte automáticamente los datos.",
              "La variante de transitabilidad utiliza un bit por celda de 16 unidades. Los archivos .pass de huellas de entidades comparten esa cabecera y variante, aunque sus dimensiones y su uso sean diferentes."
            ],
            "en": [
              "For dimensions divisible by cell_size, divide width and height by that value to obtain cell columns and rows. These values belong to each variant; changing the header's bit depth does not automatically convert its data.",
              "The passability variant uses one bit per 16-unit cell. Entity footprint .pass files share that header and variant, even though their dimensions and use differ."
            ]
          }
        },
        {
          "id": "limits",
          "title": {
            "es": "Límites conocidos",
            "en": "Known limits"
          },
          "paragraphs": {
            "es": [
              "La cabecera no explica por sí sola el significado completo de cada valor del terreno, altura, luz o decoración. Tampoco se especifican aquí todos los detalles de empaquetado, alineación o del orden de los bits de cada capa.",
              "No deduzcas el rango de alturas, la unidad de iluminación, el significado de cada índice ni los tamaños de mapa admitidos únicamente a partir del tipo de celda."
            ],
            "en": [
              "The header alone does not fully explain terrain, height, lighting or decoration values. This entry also does not specify every layer's packing, alignment or bit-order details.",
              "Do not infer height ranges, lighting units, index meanings or supported map sizes from the cell type alone."
            ]
          }
        }
      ],
      "status": "partial",
      "urls": {
        "es": {
          "html": "https://selu.es/imperivm/formatos/terrain-grids/",
          "markdown": "https://selu.es/imperivm/formatos/terrain-grids/index.md",
          "json": "https://selu.es/imperivm/formatos/terrain-grids/index.json"
        },
        "en": {
          "html": "https://selu.es/imperivm/formatos/en/terrain-grids/",
          "markdown": "https://selu.es/imperivm/formatos/en/terrain-grids/index.md",
          "json": "https://selu.es/imperivm/formatos/en/terrain-grids/index.json"
        }
      }
    },
    {
      "slug": "lzis",
      "kind": "compression",
      "extensions": [
        "LZIS",
        ".snr",
        ".dmo",
        ".bfhp"
      ],
      "related": [
        "bfhp",
        "pak"
      ],
      "title": {
        "es": "LZIS · flujo de bloques",
        "en": "LZIS · block stream"
      },
      "summary": {
        "es": "Envoltura de compresión por bloques con un índice físico. El contenido descomprimido debe identificarse de forma independiente.",
        "en": "Block-compression wrapper with a physical index. Its decoded contents must be identified separately."
      },
      "sections": [
        {
          "id": "purpose",
          "title": {
            "es": "La envoltura no define el contenido",
            "en": "The wrapper does not define the contents"
          },
          "paragraphs": {
            "es": [
              "LZIS puede aparecer en partidas, perfiles, repeticiones y paquetes de contenido. La firma describe el flujo de bloques, no el tipo final de documento.",
              "Después de descomprimir, identifica de nuevo el contenido. Por ejemplo, la biblioteca de asentamientos RandomMapSettlements.bfhp contiene un volumen HPFS. Un archivo con LZIS no debe tratarse automáticamente como un mapa ni como un archivo ZIP."
            ],
            "en": [
              "LZIS can occur in saved games, profiles, replays and content packs. Its signature describes the block stream rather than the final document type.",
              "Identify the contents again after decoding. For example, the RandomMapSettlements.bfhp settlement library contains an HPFS volume. Do not automatically treat an LZIS file as a map or ZIP archive."
            ]
          }
        },
        {
          "id": "header",
          "title": {
            "es": "Cabecera e índice",
            "en": "Header and index"
          },
          "table": {
            "columns": {
              "es": [
                "Posición en bytes",
                "Tamaño",
                "Contenido"
              ],
              "en": [
                "Byte position",
                "Size",
                "Contents"
              ]
            },
            "rows": {
              "es": [
                [
                  "0",
                  "4 bytes",
                  "Firma ASCII LZIS"
                ],
                [
                  "4",
                  "4 bytes",
                  "Tamaño lógico descomprimido"
                ],
                [
                  "8",
                  "4 bytes",
                  "Tamaño lógico de bloque"
                ],
                [
                  "12",
                  "1 byte",
                  "Modo"
                ],
                [
                  "13",
                  "1 byte",
                  "Byte sin significado completo documentado"
                ],
                [
                  "14",
                  "4 × n bytes",
                  "Posición física de cada bloque"
                ]
              ],
              "en": [
                [
                  "0",
                  "4 bytes",
                  "ASCII signature LZIS"
                ],
                [
                  "4",
                  "4 bytes",
                  "Decoded logical size"
                ],
                [
                  "8",
                  "4 bytes",
                  "Logical block size"
                ],
                [
                  "12",
                  "1 byte",
                  "Mode"
                ],
                [
                  "13",
                  "1 byte",
                  "Byte without a completely documented meaning"
                ],
                [
                  "14",
                  "4 × n bytes",
                  "Physical position of each block"
                ]
              ]
            }
          },
          "paragraphs": {
            "es": [
              "El número de offsets almacenados es n = max(1, ceil(tamaño lógico / tamaño de bloque)). No se guarda un offset final adicional: el último bloque termina en la longitud del flujo físico."
            ],
            "en": [
              "The number of stored offsets is n = max(1, ceil(logical size / block size)). No additional final offset is stored: the last block ends at the physical stream length."
            ]
          }
        },
        {
          "id": "blocks",
          "title": {
            "es": "Interpretación de bloques",
            "en": "Interpreting blocks"
          },
          "paragraphs": {
            "es": [
              "Un tramo físico menor que la longitud lógica de su bloque se interpreta como comprimido. Si alcanza esa longitud sin exceder el tamaño de bloque, contiene bytes sin comprimir. Un tramo mayor que el tamaño de bloque no cumple esa regla de lectura.",
              "La compresión usa códigos canónicos de prefijo y referencias a datos anteriores. La semejanza de algunas tablas con Deflate no convierte el flujo en un archivo zlib o Deflate estándar."
            ],
            "en": [
              "A physical span shorter than its block's logical length is interpreted as compressed. If it reaches that length without exceeding the block size, it contains raw bytes. A span exceeding the block size does not satisfy that reading rule.",
              "Compression uses canonical prefix codes and references to earlier data. Similarity between some tables and Deflate does not make the stream a standard zlib or Deflate file."
            ]
          }
        },
        {
          "id": "limits",
          "title": {
            "es": "Límites conocidos",
            "en": "Known limits"
          },
          "paragraphs": {
            "es": [
              "El modo cubierto por los archivos decodificados es el 2. Otros modos y la escritura o recompresión compatible no quedan documentados como procesos completos en esta ficha.",
              "No deduzcas el contenido solo por la extensión del archivo, ni asumas un único tamaño de bloque para todos los usos. Esta entrada resume el contenedor y sus reglas de lectura; no incluye una implementación del códec."
            ],
            "en": [
              "Decoded-file coverage is for mode 2. Other modes and compatible writing or recompression are not documented as complete workflows in this entry.",
              "Do not infer contents from the extension alone or assume one block size across all uses. This entry summarizes the container and its reading rules; it does not include a codec implementation."
            ]
          }
        }
      ],
      "status": "partial",
      "urls": {
        "es": {
          "html": "https://selu.es/imperivm/formatos/lzis/",
          "markdown": "https://selu.es/imperivm/formatos/lzis/index.md",
          "json": "https://selu.es/imperivm/formatos/lzis/index.json"
        },
        "en": {
          "html": "https://selu.es/imperivm/formatos/en/lzis/",
          "markdown": "https://selu.es/imperivm/formatos/en/lzis/index.md",
          "json": "https://selu.es/imperivm/formatos/en/lzis/index.json"
        }
      }
    }
  ]
}
