Bueno, voy a dar una serie de detalles de como trabaja la emulación desde uLoader, pero antes, tengo que explicar unas cuantas cosas que intentaré que sea de forma sencilla y clara, sin profundizar en el tema.
Los juegos de este tipo vienen almacenados en wads. Por el momento, uLoader no soporta Wads, si no que hay que utilizar la utilidad "wadunpacker" que nos crea una carpeta y diverso contenido.
El contenido se divide en una serie de .app, un .tik, un .cert (estos dos no los necesitamos, por que uLoader utiliza el certificado de sistema y el ticket los "fabrica" a partir del ticket del IOS actual) un .trailer (es copia de uno de los .app y contiene el banner, el sonido...) y por último, el .tmd
El .tmd tiene dentro una lista de contenidos (.app) y abreviando, podemos decir que las entradas de cada contenido, contiene 3 datos que nos interesan:
El content id: Son cuatro bytes con los que se genera digamos el nombre del fichero .app. Por ejemplo si contiene el valor hexadecimal 0xa, estaríamos hablando de 0000000a.app
El indice: cuando se desempaqueta el wad, el nombre que reciben los .app, lo obtienen de aquí... y ese es uno de los problemas por los que vamos a precisar un proceso de instalación desde uLoader, por que por ejemplo el 00000001.app desempaquetado, podría ser 0000000b.app para el sistema. Así que lo mejor es volcar el contenido a una carpeta "sd:/nand/install" y que uLoader se encargue de hacer las gestiones (cosa que está hecha)
Los flags de tipo: Y aquí viene la madre del cordero
. Lo normal es encontrar tres valores de flags:
- 0-> suele coincidir con el indice 0 (yo siempre lo he visto así) y marca el .app que contiene el banner
- 1-> Esto indica que el .app es de ámbito privado. Es decir, que solo lo usa la aplicación y no tiene mayor problema
- 0x8001 -> Esto indica un contenido compartido y es lo que complica la jugada.
Si un contenido es compartido, esto va en el sistema a una carpeta llamada "shared1", pero no se mete tal cual, si no que se "apunta" en una lista y se guarda con otro nombre.
Así que cuando la aplicación indica que quiere leer un .app de estos, lo que hace es mirar si es un contenido privado y servirlo si es así o mirar en la lista de contenidos compartidos y servirlo desde ahí si procede.
Eso complica el tema por que desde el punto de vista de la emulación, habría que interpretar dicha lista o bien dumpearla (con toda la mierda que lleva) y ampliar el rango de la emulación a sitios que no nos interes, la verdad.
También hay un problema añadido: si el wad no contiene un contenido compartido (cosa que he visto...), lo buscará en el sistema y si no lo encuentra (por que no se han instalado los juegos necesarios en el sistema), fallará. Pero también hay otra posibilidad curiosa y es que el Wad contenga dicho contenido, pero al no ser instalado en el sistema, tampoco lo encontrará.
¿Y como solucionamos eso?
Pues yo lo he hecho de la siguiente manera: he creado una carpeta "shared" y dentro otra con el identificador "00010001" (el de los Wiiwares).
Lo que hago es lo siguiente: cuando pones una carpeta con contenido en "sd:/nand/install" al ejecutar uLoader el instalador actúa de forma automática.
Entonces se mira el .tmd, se testea si los ficheros existen o no y los flags y se procede así:
¿Es un contenido no compartido? Si no está, error. Si está se copia a su sitio
¿Es un contenido compartido? Si está, se copia a su sitio y se replica en la carpeta "shared", salvo que ya exista ahí un contenido ocupando sitio. Si no está, se busca en la carpeta "shared" dicho contenido, si no está ahí, error y si está, pues no se hace nada, porque la emulación lo hará en su momento. Por el momento no se busca si dicho contenido se encuentra en la NAND para copiarlo (y posiblemente no lo haga
)
También se fija el flag como privado, de forma que el sistema siempre buscará el contenido en su carpeta (y yo de forma interna, cuando se produce un error porque el contenido no existe, lo redirijo a la carpeta "shared", que es "casi" invisible al sistema.
De esta forma, consigo no tener que pasar por el aro del sistema... y tened por seguro de que muchos de los títulos que fallan en Triiforce, se debe a ésto que estoy contando.
Tambien he visto que algunos "graciosillos" meten un cargador en el hueco del contenido bootable. Para evitar éste problema, el antiguo botón de "Skip IOS", se reemplaza por "Skip BOOT" que servirá para que en vez de usar ese contenido para ejecutarse (que colisiona con uLoader y salta una excepción...) , hará un escaneo en busca de un .dol que pueda utilizar.
Hasta ahora, todo lo que he probado ha tirado, excepto uno de los modificados. Y como dato, un error curioso: cierto juego me decía que no tenía memoria para crear partida (necesitaba un bloque) teniendo mas de 800MB para guardar.... debido a que le informa de la ocupación en bloques REAL
. Así que he modificado eso para que el sistema se crea que sigue trabajando con NAND de solo 512 MB.
A lo mejor mañana miro los fuentes del Wad Manager de Waninkoko para facilitaros el tema aún más pero éstos apuntes vienen bien para que sepáis que es lo que ocurre cuando se instala un título y por qué suelen fallar los juegos. Y sobre todo , como se estructura dicho contenido en uLoader (lo que pongo como sd, tambien valdrá para usb, evidentemente)
sd:/nand -> es la ruta donde se buscarán todos los Wiiwares (las otras se reservan para partidas)
sd:/shared/00010001 -> aquí se copiarán los módulos que sean compartibles. (si sabéis de uno mas actual, podéis hacerlo a mano)
sd:/title/00010001 -> aquí se instalan lo títulos wiiwares
sd:/title/00010001/xxxxxxxx -> carpeta de título
sd:/title/00010001/xxxxxxxx/content -> aquí se almacena el contenido privado del título y el tmd
sd:/title/00010001/xxxxxxxx/data -> aquí se almacenan los saves y otro tipo de datos
En la carpeta "content" también se guarda la configuración de uloader y el icono (#uloader.dat, el símbolo # se utiliza para hacer el fichero invisible)
Y eso es en línea como trabaja el sistema. Si tenéis títulos que usabais con Triiforce, algunos funcionarán si lo copiáis aquí, pero otros no lo harán a menos que copiéis el contenido necesario a la carpeta shared (si os falta un contenido, uLoader no ejecutará el juego y saldrá de la aplicación y os tocará restaurar el contenido que falte).
Y antes de que nadie pregunte... pues si, el diario se entera de que estáis usando este tipo de contenidos