Estructuras comunes

Contenido

  1. Introducción
  2. Definiciones
  3. Encabezado de archivo
  4. Encabezado de sección
  5. Tabla de nombres
  6. Relleno
  7. Referencias

Introducción

Los tipos de archivos en SMG son variados. A veces hay estructuras que se repiten entre los archivos por lo que esta página va a exponer esas extructuras que me he conseguido.

Definiciones

Encabezado de archivo

Los encabezados de archivos, en general, tienen un tamaño de 32 bytes y contienen los siguientes datos, en orden:


Nombre Tamaño Descripción
Magia 4 bytes Cadena de bytes que indica el tipo general de un archivo.
Tipo 4 bytes Cadena de bytes que indica el tipo específico de un archivo.
Tamaño 4 bytes Entero que contiene el tamaño, en bytes, del archivo. Incluye el tamaño del encabezado del archivo.
Número de secciones 4 bytes Entero que contiene el número de secciones del archivo.
Desconocido 1 16 bytes Cadena de bytes cuyo propósito se desconoce. Está mayormente lleno de 0xFF.

Fig. 1: Encabezado de un archivo BDL visto en ImHex.

Encabezado de sección

Los encabezados de las secciones tienen un tamaño de 8 bytes y contienen los siguientes datos, en orden:


Nombre Tamaño Descripción
Magia 4 bytes Cadena de bytes que indica identifica el tipo de la sección.
Tamaño 4 bytes Entero que contiene el tamaño, en bytes, de la sección. Incluye el tamaño del encabezado de la sección.

Fig. 2: Encabezado de una sección de un archivo BDL visto en ImHex.

Tabla de nombres

Las tablas de nombres son de tamaño variable (depende de los nombres almacenados). Estas tablas almacenan varias cadenas de caracteres (codificadas en Shift-JIS) que pueden representar los nombres de huesos/texturas/materiales en un modelo 3D de SMG. Estas tablas contienen los siguientes datos, en orden:


Nombre Tamaño Descripción
Número de nombres 2 bytes Entero que contiene el número de nombres en la tabla de nombres.
Desconocido 1 2 bytes Siempre 0xFFFF ¿Puede ser la máscara de los hashes que vienen después?
Inicio: Información de los nombres (4 * Número de nombres) bytes
Hash[i] 2 bytes Hash del i-ésimo nombre truncado a 16 bits. Rutina de cálculo.
Índice[i] 2 bytes Posición del i-ésimo nombre respecto al inicio de la tabla de nombres en bytes.
Final: Información de los nombres
Inicio: Nombres Número de bytes de todas las cadenas de caracteres
Nombre[i] Tamaño en bytes de la cadena Nombre en la posición i-ésima. Cadena de caracteres Shift-JIS que termina en el caracter nulo (0x00).
Final: Información de los nombres

Fig. 3: Tabla de nombres de una sección de un archivo BTP vista en ImHex.


Rutina de calculo del hash de la tabla de nombres

HASH = [FIRST_BYTE_VALUE] * (3^(STRING_BYTE_LENGTH - 1)) 
       + [SECOND_BYTE_VALUE] * (3^(STRING_BYTE_LENGTH - 2))
       + [THIRD_BYTE_VALUE] * (3^(STRING_BYTE_LENGTH - 3))
       + ...
       + [LAST_BYTE_VALUE] * (3^(0))

Los valores de los bytes tienen que interpretarse como un entero con signo de 8 bits y la longitud de la cadena de caracteres no debe incluir el caracter nulo.

Relleno

Hay un relleno genérico que se encuentra en los archivos de SMG que se puede leer. Es una cadena de caracteres que se usa para alinear los pedazos de datos siguientes a una dirección en la posición del byte multiplo de 4 o 32 respecto al inicio de una sección o al inicio del archivo. El máximo tamaño en el que se ha conseguido este relleno es de 31 bytes:


This is padding data to alignme


Fig. 4: Rellenos de diferente tamaño de un archivo BTP vistos en ImHex.


Referencias