Contenido
Introducción
En SMG la mayoria de los archivos de interés del juego se encuentran dentro de archivos RARC. Ellos actuan de la misma forma que un archivo ZIP (sin compresión) conteniendo una estructura de carpetas y archivos dentro. Realmente, RARC es un sistema de archivos guardado en un archivo que a su vez está guardado en otro sistema de archivos.
Archivo MarioAnime.arc en Blender 2.79.7 (Blenxy)
Funcionamiento
Como se mencionó arriba, los archivos RARC son sistemas de archivos. Lo que se necesita para entenderlos son los conceptos de archivo, carpeta y entrada. Históricamente los primeros 2 términos mencionados vienen del pasado. Los archivadores/archivos son contenedores de carpetas que pueden guardar documentos de forma organizada. En la siguiente figura se puede ver uno de ellos.
Archivador con carpetas y documentos.
En la jerga de programación/computación, un archivo puede referirse a una carpeta o a un documento, sin embargo esta definición es ambigua y puede generar confusión. En los siguientes enlaces se puede ver esta confusión: 1 - 2 - 3. Con esto, y con las definiciones de sistemas de archivos, lo que me parece más fácil es asumir la confusión de un archivo como un documento, de una carpeta como algo que contiene archivos y de una entrada (entry en inglés) como algo que puede referirse a un archivo y una carpeta a la vez. Por lo tanto las definiciones quedan de la siguiente forma:
- Sistema de archivos: Conjunto de elementos y/o instrucciones que permiten almacenar/acceder de forma ordenada a carpetas o archivos.
- Entrada: Un elemento en el sistema de archivos. Puede ser un archivo o una carpeta.
- Archivo: Un elemento guardado en el sistema de archivos que contiene información y que puede ser leído.
- Carpeta: Un elemento del sistema de archivos que se usa para categorizar/ordenar los archivos en un sistema de archivos.
Como puede verse, los términos mencionados aquí se refieren o tienen que ver con estructuras de árboles binarios, jerarquía, etc. que tienen poco que ver con el juego y más con el mundo de la programación/organización. Esto hace al formato un poco aburrido de aprender.
Definiciones
- Información del sistema de archivos RARC: Una pequeña sección después del encabezado que contiene información sobre como leer el resto del formato.
- Lista de información de carpetas: Una lista que contiene la información sobre las carpetas en el sistema de archivos RARC. Tiene los nombres de las carpetas, el número de elementos que contiene, etc.
- Lista de información de entradas: Una lista que contiene la información sobre todas las entradas contenidas en el sistema de archivos RARC. Usando la información en la lista de información de las carpetas se puede leer esta lista para identificar a los archivos.
- Piscina de cadenas de caracteres: Contiene los nombres de todas las entradas en el sistema de archivos RARC. Por contexto, asumo que su codificación es CP932. Todas las cadenas de caracteres terminan en el caracter nulo.
- Piscina de datos de archivos: Es como la piscina de cadenas de caracteres pero aquí se guarda la información de los archivos guardados en el sistema de archivos RARC.
-
Atributos de las entradas: Cada entrada en el sistema de archivos (carpetas/archivos) posee caracteristicas codificadas en 8 bits. Cada una de ellas se describe a continuación:
Valor (binario) Descripción Aplica a Nombre acuñado 00000001La entrada es un archivo Archivos IS_FILE00000010La entrada es una carpeta Carpetas IS_FOLDER00000100La entrada está comprimida (Yaz0 o Yay0) Archivos IS_COMPRESSED00001000Desconocido Desconocido UNKNOWN_100010000Precargar la entrada a la RAM principal Archivos LOAD_TO_MRAM00100000Precargar la entrada a la RAM auxiliar (GameCube) Archivos LOAD_TO_ARAM01000000Leer el archivo del disco cuando se necesite Archivos LOAD_FROM_DVD10000000La entrada está comprimida con Yaz0 Archivos IS_YAZ0_COMPRESSED
Las opciones, como se menciona, se almacenan en un byte de 8 bits. La opción
UNKNOWN_1no se ha visto en ningun archivo original de SMG. Las opcionesLOAD_TO_MRAM,LOAD_TO_ARAMyLOAD_FROM_DVDparecen ser de opción única, es decir, si se escoge una no se puede escoger ninguna de las otras 2 pero tiene que escogerse al menos una de ellas (verificar). - Carpeta raíz: Todos los archivos RARC tienen una carpeta principal o raíz que contiene todas las entradas almacenadas en él.
Estructura
La estructura del archivo descrita aquí es la estructura que se ha conseguido en los archivos originales de SMG. Esta información no significa que la estructura tenga que ser exactamente como se describe en la página.
Encabezado -- 0x20 bytes
| Nombre | Tamaño | Descripción |
|---|---|---|
| Magia | 4 bytes | RARC en big endian CRAR en little endian. |
| Tamaño del archivo | 4 bytes | Tamaño en bytes. |
| Posición de la información del sistema de archivos | 4 bytes | Respecto al inicio del archivo, en bytes. |
| Posición de la piscina de datos de archivos | 4 bytes | Respecto al inicio de la información del sistema de archivos, en bytes. |
| Tamaño de la piscina de datos de archivos | 4 bytes | Tamaño en bytes. |
| Tamaño de la piscina de datos de archivos asignada a la RAM principal | 4 bytes | Tamaño en bytes. |
| Tamaño de la piscina de datos de archivos asignada a la RAM auxiliar | 4 bytes | Tamaño en bytes. Aplica a la GameCube. |
| Tamaño de la piscina de datos de archivos a ser leida directamente del DVD | 4 bytes | Tamaño en bytes. |
Encabezado de ObjectData/MarioAnime.arc.
Información del sistema de archivos -- 0x20 bytes
| Nombre | Tamaño | Descripción |
|---|---|---|
| Número de carpetas | 4 bytes | Número de carpetas en el sistema de archivos. |
| Posición de la información de las carpetas | 4 bytes | Respecto al inicio de esta sección, en bytes. |
| Número de entradas | 4 bytes | Número de entradas en el sistema de archivos. |
| Posición de la información de las entradas | 4 bytes | Respecto al inicio de esta sección, en bytes. |
| Tamaño de la piscina de cadenas de caracteres | 4 bytes | Tamaño en bytes. |
| Posición de la piscina de cadenas de caracteres | 4 bytes | Respecto al inicio de esta sección, en bytes. |
| Número de archivos | 2 bytes | Número de archivos en el sistema de archivos. Cuenta a las carpetas en algunos casos. Ver las notas para más información. |
| El identificador de la entrada es su índice en la lista de entradas | 1 byte | Este dato no lo puedo verificar, viene de las referencias. Parece indicar que cada archivo o entrada tiene un identificador único y cuando este dato vale 1 el índice del archivo o entrada es el valor del indentificador. De otra forma, el archivo es ubicado por el juego a través de su nombre. |
| Desconocido 1 | 5 bytes | Parece ser siempre 5 bytes todos en 0x00. |
Información del sistema de archivos de ObjectData/MarioAnime.arc.
Lista de información de las carpetas -- 0x10 * Número de carpetas bytes
| Nombre | Tamaño | Descripción |
|---|---|---|
| Magia de la carpeta | 4 bytes | Se usan los 4 primeros caracteres del nombre de la carpeta en mayúsculas. Si el nombre de la carpeta es menor que 4 caracteres entonces lo que falta se rellena con caracteres de espacio. Es afectado por el ordenamiento de los bytes. La carpeta principal (carpeta raíz) tiene magia igual a ROOT (big endian) o TOOR (little endian). |
| Posición del nombre de la carpeta | 4 bytes | Respecto al inicio de la piscina de cadenas de caracteres. |
| Hash del nombre de la carpeta | 2 bytes | Este hash se calcula de la misma forma que el hash que se usa en la tabla de nombres. |
| Número de entradas en la carpeta | 2 bytes | Número de entradas hijas que están contenidas en la carpeta. |
| Índice de la primera entrada en la carpeta | 4 bytes | Índice de la primera entrada contenida en la carpeta en la lista de información de las entradas. |
Información de las carpetas de ObjectData/MarioAnime.arc.
En la imagen mostrada se puede ver la ultima fila marcada con rosado. Esta fila se marca porque en los archivos RARC originales las diferentes secciones estan alineadas con posiciones múltiplo de 32 bytes. En las notas se puede leer más al respecto.
Lista de información de las entradas -- 0x14 * Número de entradas bytes
| Nombre | Tamaño | Descripción |
|---|---|---|
| Índice de archivo | 2 bytes | No es lo mismo que el índice de entrada, se contabiliza con el número de archivos. Si esta entrada es una carpeta, este índice vale 0xFFFF. Uno de los pocos ejemplos en donde este índice se usa es para ubicar los sonidos en el archivo AudioRes/Seqs/JaiSeq.arc. |
| Hash del nombre de la entrada | 2 bytes | Este hash se calcula de la misma forma que el hash que se usa en la tabla de nombres. |
| Atributos + Posición del nombre de la entrada | 4 bytes | El byte más significativo especifica las propiedades asignadas a esta entrada. Ver definiciones para más información. Los otros 3 especifican la posición del nombre de la entrada en la piscina de cadenas de caracteres. |
| Posición de los datos del archivo o índice de la carpeta | 4 bytes |
|
| Tamaño de los datos del archivo o tamaño de la carpeta | 4 bytes |
|
| Desconocido 1 | 4 bytes | Parece ser siempre 4 bytes todos en 0x00 |
Información de las entradas de ObjectData/MarioAnime.arc. Este archivo RARC tiene muchas entradas, sólo salen marcadas las primeras 3.
Piscina de cadenas de caracteres
- Las cadenas de caracteres deberían estan codificadas en CP932.
- Todas terminan en el caracter nulo.
- Todas las cadenas que se encuentran aquí tienen su offset especificado en la lista de información de las carpetas/entradas. Este offset es con respecto al inicio de la piscina de caracteres.
- El tamaño de esta estructura no se puede determinar.
- Al final de la piscina usualmente se encuentra un "relleno" de bytes
0x00para hacer que el tamaño de la piscina en bytes sea múltiplo de 32.
Inicio de la piscina de cadena de caracteres de ObjectData/MarioAnime.arc.
Piscina de datos de archivos
- Es como la piscina de cadena de caracteres pero contiene los datos de todos los archivos contenidos en el archivo RARC.
- En los archivos originales de SMG todos los datos al registrarse se rellenan con
0x00al final para alinear los bytes del archivo próximo a registrar a una posición múltiplo de 32 bytes. - Todos los datos que se encuentran aquí tienen su offset especificado en la lista de información de las entradas. Este offset es con respecto al inicio de la piscina de datos de archivos.
- El tamaño de esta estructura no se puede determinar.
Inicio de la piscina de datos de archivos de ObjectData/MarioAnime.arc.
Notas
- Todas las secciones de este formato parecen estar alineadas en posiciones múltiplo de 32 bytes, al menos de manera original.
- Los archivos RARC, en su mayoria, estan comprimidos en Yaz0. Existen algunos que no estan comprimidos originalmente. Al juego parece no importarle si estan comprimidos o no. Lo más probable es que la compresión se haya implementado después para ahorrar espacio.
- Al juego no parece gustarle mucho el cambiarle los offsets/posiciones a las estructuras del formato. Se necesitan más pruebas.
-
En la sección de la información del sistema de archivos, el número de archivos es igual al número de entradas en varios casos. Esto es raro porque se cuentan las rutas
.y..como archivos de interés.
Lo que pienso en relación a esto es lo siguiente (teoría): Puede que en el proceso de desarrollo del juego todos estos archivos contenidos en los archivos RARC estaban en carpetas normales del sistema operativo (si estoy en lo correcto, en Windows). Cuando uno lista los archivos en un directorio en Windows usando el CMD con el comando
DIR, las rutas.y..son las primeras que salen como entradas de interés en la carpeta.
Si los archivos RARC empacaban todo el contenido de una carpeta en base a la lógica del comando
DIRentonces es posible que empaquetaran las rutas.y..como archivos ya que en el sistema operativo son "archivos reales". Si empaquetaban ciertos archivos de una carpeta, entonces ya no tendrían acceso a las rutas.y..por lo que las entradas asociadas dentro del archivo RARC resultante serían virtuales o no existentes y no se contarian como archivos. Esto explicaría más o menos esa inconsistencia en el valor numérico almacenado en el formato pero, como todo, puede significar otra cosa completamente diferente. - La carpeta raíz tiene que estar al principio de la lista de información de las carpetas.