Por
Dekuwa
Wii System Menu Extractor & Normalizer es una herramienta avanzada de ingeniería inversa escrita en Rust, diseñada para extraer, descomprimir y normalizar la mayor cantidad posible de recursos del Menú de Sistema de la Wii a formatos estándar y abiertos (glTF, PNG, JSON, WAV).
También puede, aunque no sea su objetivo principal, extraer/convertir archivos de ciertos juegos de Wii.
Meta y Propósito
Este proyecto está dedicado a la preservación digital y al análisis histórico, con el objetivo de realizar una reescritura completa de USB Loader GX y otros proyectos de homebrew de Wii para SteamOS y, en general, Linux para PC.
El Menú de Sistema de Wii (y sus canales asociados) depende de formatos de archivo propietarios (U8, TPL, BRLYT, ASH, BRSAR, BRRES) que las herramientas estándar no pueden leer. Para el análisis, la emulación de la interfaz, la personalización o la preservación histórica, es esencial transformar estos datos binarios en activos utilizables por plataformas que dependen de formatos de archivo documentados.
Este programa no se limita a extraer archivos: los convierte y normaliza de forma recursiva.
Metodología de Normalización
La herramienta ejecuta hasta 20 pasadas recursivas para resolver dependencias anidadas (por ejemplo, un archivo .app que contiene un .ash comprimido, que contiene un .arc U8, que a su vez contiene un .brres lleno de texturas TEX0). La recursividad se detiene automáticamente tras dos pasadas sin extracciones nuevas para garantizar la fiabilidad del proceso.
1. Acceso a Datos (Motores de Extracción)
ASH (.ash): Máquina virtual integrada personalizada de Huffman/LZ77 para una descompresión con precisión de bits (bit-perfect).
LZ77 (.LZ, .lz7): Soporte completo para variantes 0x10 con detección robusta.
Yaz0 (.szs): Descompresor LZSS de alto rendimiento para archivos de canales.
Archivos Estándar (.app, .arc, .zip): Extracción completa de árboles de directorios U8 y ZIP.
Contenedores NW4R (.brres, .breft): Escaneo de patrones heurísticos para extraer sub-archivos.
2. Normalización de Activos (Grado de Museo)
Gráficos (Precisión de Píxel):
TEX0 / TPL / BTI -> PNG: Decodificación completa de GX. Mejora única: Estrategia de gestión de "Alfa Blanco" para formatos de intensidad (I4, IA4), evitando artefactos negros en elementos de la interfaz. Soporte completo para RGBA8 (planar) y CMPR (Wii BC1/DXT1).
Soporte de Paletas (PLT0): Aplicación automática a texturas indexadas (CI4/CI8).
Interfaz (Dependiente de la UI):
BRLYT -> JSON: Reconstrucción del complejo árbol jerárquico de la escena.
BRLAN -> JSON: Extracción de curvas de animación.
Modelos 3D:
MDL0 -> glTF 2.0: Exportación de geometría completa (v1 a v11).
Tipografía:
BRFNT -> JSON & PNG: Decodificación perfecta incluyendo el tiling 8x4 específico de Wii utilizado por las fuentes (Rodin). Extracción de métricas de glifos (CWDH) y mapas Unicode (CMAP).
Audio y Música:
BWAV -> WAV: Soporte para estos archivos del Menú de Sistema.
RWAV/RWSD/RBNK -> WAV: Decodificación DSP-ADPCM por hardware de 16 bits.
BRSEQ -> MIDI & JSON: Secuencias musicales (Trabajo en progreso).
Ingeniería Inversa:
SEL -> JSON: Soporte para archivos binarios (Static Executable Linker). Recuperación de la ruta de compilación original (.elf) y de la tabla de símbolos completa (nombres internos de funciones).
Uso
Compilación
cargo build --release
Ejecución
./target/release/wii_system_menu_extractor <RUTA_CARPETA_TITLE_O_ARCHIVO>
El programa procesa los archivos de forma idempotente: detecta extracciones ya realizadas y solo procesa archivos nuevos o modificaciones. Ejecutar el programa directamente (sin terminal) en el directorio actual tiene el mismo efecto sobre su contenido, incluso sin salida gráfica. Aún no existe un lanzamiento oficial ni número de versión, ya que el programa sigue en desarrollo, pero es funcional y efectivo para la mayoría de las necesidades.
AppImage
Se incluye un script de creación de AppImage en la carpeta scripts, y también hay una AppImage lista para usar en la carpeta packages. Este programa fue compilado en Debian 13 y requerirá, como mínimo, las versiones de ciertas librerías incluidas en dicha distribución de referencia. Lógicamente, esta AppImage debería funcionar en todas las distribuciones de Linux actualizadas.
Estado de Soporte (Objetivos)
Formato
Normalización
Estado
TEX0 / TPL
PNG
💎 Ultra-Fidelidad (Alfa Blanco)
BRLYT / BRLAN
JSON
💎 100% (Estructura de árbol)
BRFNT
PNG + JSON
💎 Precisión de Píxel (Rodin en mosaico)
SEL
JSON
🔍 Símbolos y ruta ELF
BWAV / RWAV
WAV
✅ Precisión de Bits (Bit-Perfect)
MDL0
glTF 2.0
✅ Geometría + UVs
BMG
JSON
✅ Multilingüe
Glosario de Formatos y JSON Normalizado
📦 Archivos y Compresión
ASH / LZ77 / Yaz0: Formatos de compresión propietarios. Normalización: Descomprimidos en los archivos originales (.arc, .brres).
U8 / ARC / APP: Archivos de ficheros sin comprimir. Normalización: Extraídos en subcarpetas _extracted.
🖼️ Gráficos y Tipografía
TPL / TEX0 / BTI (Texturas de Wii) -> PNG: Almacenamiento en mosaico (tiled) de GX. Los formatos IA4/IA8 se normalizan usando "Alfa Blanco" para la interfaz.
BRFNT (Fuente binaria) -> Atlas PNG + JSON: El JSON contiene métricas (altura, línea base) y mapeo Unicode (código -> índice_glifo). Campos JSON: ascent (altura sobre la línea base), widths (ancho por glifo).
📐 Interfaz y Animación
BRLYT (Layout) -> JSON: Almacena el árbol jerárquico de la interfaz (Panes). Campos JSON: root contiene la pila de Pane con name, x/y/z, scale, rotation, y children para la jerarquía.
BRLAN (Layout Animation) -> JSON: Secuencias de animación para los Panes de BRLYT. Campos JSON: animations enumera los objetivos, keyframes contiene los valores de tiempo (frame) y propiedad.
🔊 Audio
RWAV / BWAV -> WAV: Archivos de audio crudo, a menudo DSP-ADPCM (comprimido a 4 bits por hardware) o PCM16.
BRSAR / RWSD -> WAV + JSON: El JSON enumera los sonidos (sounds) y sus propiedades (volumen, tono).
🔍 Ingeniería Inversa
SEL (Tabla de Símbolos) -> JSON: Contiene metadatos de enlace para el código de Wii. Campos JSON: internal_path (ruta original en el PC del desarrollador de Nintendo), symbols (lista de todos los nombres de funciones C++ recuperados).
BMG (Message Group) -> JSON: Tabla de texto localizado. Campos JSON: messages mapea un ID numérico a la cadena traducida.
Wii System Menu Extractor & Normalizer ha sido creado por Tikilou.