{
  "schema": "imperivm-format-article/v1",
  "language": "es",
  "scope": "Imperivm HD",
  "status": "partial",
  "slug": "pak",
  "title": "PAK · paquetes de recursos",
  "summary": "Contenedor de recursos con una cabecera de 40 bytes y un directorio de nombres que comparte prefijos entre entradas.",
  "sections": [
    {
      "id": "purpose",
      "title": "Para qué sirve",
      "paragraphs": [
        "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."
      ]
    },
    {
      "id": "header",
      "title": "Cabecera",
      "table": {
        "columns": [
          "Posición en bytes",
          "Tamaño",
          "Contenido"
        ],
        "rows": [
          [
            "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"
          ]
        ]
      },
      "paragraphs": [
        "LE significa little-endian. Las posiciones de esta tabla son desplazamientos dentro del archivo, contados desde cero."
      ]
    },
    {
      "id": "directory",
      "title": "Entradas del directorio",
      "list": [
        "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."
      ],
      "paragraphs": [
        "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."
      ]
    },
    {
      "id": "workflow",
      "title": "Al consultar o extraer",
      "list": [
        "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."
      ]
    },
    {
      "id": "limits",
      "title": "Límites conocidos",
      "paragraphs": [
        "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."
      ]
    }
  ]
}