🍺 CONKER64: RECOMPILED 🐿️
Motor nativo en C++20 y pipeline de assets para Conker's Bad Fur Day (Nintendo 64)
Lee un volcado real de cartucho, desencripta y descomprime los archivos RZIP de Rareware,
y renderiza una escena 3D explorable con los datos que recupera.
---
## ⚡ Qué es esto realmente
Esto **no es una recompilación estática terminada** de *Conker's Bad Fur Day*, y no permite
jugar al juego. Mejor dejarlo claro desde el principio.
Lo que **sí** es: un conjunto de herramientas de ingeniería inversa y un motor 3D escritos
desde cero en C++20 sobre SDL2, que:
- Carga un volcado real de cartucho de 64 MB y valida su cabecera.
- Rompe el formato contenedor RZIP de Rareware — tabla de offsets cifrada con XOR
(clave `0x8039CCCA`) más cargas útiles en deflate crudo — y recupera **507 de 508
subsegmentos de código ejecutable** (~2 MB de MIPS) en una RDRAM emulada de 8 MB.
- Indexa y reproduce **453 pistas de audio MP3** incrustadas en el cartucho.
- Decodifica todos los formatos de textura nativos de N64 (RGBA16/32, IA16/8, CI8/4, I8).
- Renderiza una escena 3D explorable con su propio rasterizador por software: sombreado
Gouraud, back-face culling, ordenación por profundidad (algoritmo del pintor), niebla
por distancia y un sistema de animación esquelética procedural para el personaje.
El código MIPS recuperado reside en RDRAM pero **todavía no se ejecuta**. Conectar
N64Recomp para que corra es el problema abierto central del proyecto — ver la hoja de ruta.
---
## 📊 Estado actual
### Funciona
| Área | Detalle |
|---|---|
| Carga de ROM | Detección de orden de bytes `.z64` / `.v64` / `.n64`, normalizado a big-endian. Cabecera parseada campo a campo. |
| Desencriptación RZIP | 508 offsets desencriptados, 507 subsegmentos de código descomprimidos en RDRAM. |
| Paquetes de assets | Los 29 paquetes de Rareware (`assets00`–`assets1C`) localizados y enumerados. |
| Audio | 453 pistas MP3 indexadas desde `assets16`, decodificadas con `minimp3` y remuestreadas al dispositivo de salida vía `SDL_AudioStream`. |
| Decodificación de texturas | RGBA16, RGBA32, IA16, IA8, CI8, CI4, I8 → RGBA8888. |
| Guardado | EEPROM de 16 Kbit (256 bloques × 8 bytes) persistida en `%APPDATA%\ConkerRecompiled\Saves\conker.eep`, tras los hooks `osEeprom*`. |
| Renderer | `SDL_RenderGeometry` por lotes — una llamada de dibujo por malla en vez de una por triángulo. Medido: 50–90 FPS a 1280×720 con una escena de 35 k triángulos. |
| Control del jugador | Movimiento relativo a cámara, gravedad, salto, colisión con muros y repisas, y el característico planeo con la cola. |
### Parcial
- **Modelos 3D extraídos.** Se recuperaron 750 archivos `.obj` de los paquetes, pero el
extractor busca patrones de bytes en lugar de recorrer display lists F3DEX2 de verdad:
**590 de ellos tienen menos de 10 caras**, y solo 20 superan las 100. El
`conker_character.obj` incluido son 4 triángulos, así que el motor recurre a un modelo
procedural para el personaje.
- **Materiales.** Existen 749 archivos `.mtl`, pero **todos apuntan a la misma textura**
(`assets00_tex_006_32x32.png`). La asignación real por malla debe deducirse de los
comandos `G_SETTIMG` / `G_SETTILE`.
- **Secuencia de intro.** Una máquina de estados de relleno con rectángulos de colores,
no la cinemática real de Rareware.
### Sin empezar
- **Ejecución del código MIPS recompilado.** `conker.us.toml` y `conker.symbols.toml`
están escritos, pero N64Recomp no se ha ejecutado nunca y `recomp/src/generated/`
está vacío.
- **Integración de RT64.** `rt64.dll` compila y se copia junto al ejecutable, y
`rt64_bridge.hpp` está escrito contra la interfaz de renderer de `ultramodern` — pero
ningún archivo lo incluye todavía, así que todo el renderizado pasa por el rasterizador
software. Ray tracing, DLSS/FSR/XeSS y escalado por hardware **no** están disponibles.
- Lógica de juego, enemigos, NPCs, niveles, HUD.
---
## 🏛️ Arquitectura
```mermaid
graph TD
ROM["Volcado de cartucho (64 MB)"] --> ORDER["Normalizacion de orden de bytes"]
ORDER --> RZIP["Desencriptacion RZIP / XOR"]
ORDER --> PKG["29 paquetes de assets"]
RZIP --> CODE["507 subsegmentos MIPS -> RDRAM"]
CODE -.->|aun no se ejecuta| RECOMP["N64Recomp (planeado)"]
PKG --> AUD["453 pistas MP3"]
PKG --> TEX["Texturas RGBA16 / CI8 / IA8"]
DISK["exported_assets/ (OBJ + MTL + PNG)"] --> MESH["Cargador de modelos"]
AUD --> EXE["Conker.exe"]
TEX --> EXE
MESH --> RAST["Rasterizador software (SDL2)"]
RAST --> EXE
RT64["rt64.dll (compilado, sin conectar)"] -.-> EXE
```
---
## 🛠️ Compilación
### Requisitos
- Windows 10 / 11 (x64)
- Visual Studio 2022 o superior, con la carga de trabajo de Desarrollo para escritorio con C++
- CMake 3.20+
- Un volcado obtenido legalmente de *Conker's Bad Fur Day (USA)*
— SHA-1 `4cbadd3c4e0729dec46af64ad018050eada4f47a`
SDL2 y zlib los descarga CMake automáticamente; no hay que configurar nada a mano.
### Compilar
```powershell
cd recomp
.\build_game.bat
```
`build_game.bat` hace una configuración y compilación limpias. Para recompilaciones
incrementales después:
```powershell
.\quick_build.bat
```
### Ejecutar
Coloca tu ROM en la raíz del repositorio como `baserom.us.z64` y luego:
```powershell
.\build\Conker.exe
```
Sirve cualquiera de `.z64`, `.v64` o `.n64` — el cargador detecta el orden de bytes por la
firma en lugar de fiarse de la extensión del archivo. También puedes arrastrar una ROM a la
ventana, o pulsar O para buscarla.
Los assets se localizan respecto al ejecutable, así que funciona desde cualquier directorio
de trabajo.
---
## 🎮 Controles
| Acción | Teclado | Mando |
|---|---|---|
| Moverse | W A S D | Stick izquierdo |
| Rotar cámara | Q / E | C-Izquierda / C-Derecha |
| Saltar — mantener en el aire para planear | Espacio / X | A |
| Atacar | C / Z | X |
| Cambiar textura de la ROM | Tab / 1–9 | — |
| Abrir ROM | O | — |
| Salir | Esc | — |
El movimiento es relativo a la cámara: «adelante» sigue la dirección hacia la que hayas
girado la vista.
---
## 🗺️ Hoja de ruta
1. **Arreglar el extractor de assets.** Recorrer display lists F3DEX2 correctamente
(`G_VTX` → pila de matrices → `G_TRI1`/`G_TRI2`) en vez de buscar patrones de bytes, y
leer las texturas reales por malla desde `G_SETTIMG`/`G_SETTILE`. Esto es lo que
desbloquea el ~98% de geometría restante.
2. **Ejecutar el código recompilado.** Inicializar los submódulos, compilar N64Recomp,
traducir `code_full.bin` con los TOML existentes y compilar el C generado dentro del
ejecutable.
3. **Conectar RT64.** `rt64_bridge.hpp` está escrito pero no lo referencia nadie;
conectarlo requiere `N64ModernRuntime` compilado y un pipeline de display lists que le
entregue comandos F3DEX2 reales.
4. **Sistemas de juego.** Enemigos, NPCs, carga de niveles, HUD.
---
## 🤝 Contribuir
La contribución más valiosa ahora mismo es el punto 1 de la hoja de ruta: el extractor de
assets. Todo lo demás está limitado por la calidad de la geometría extraída.
Para obtener los submódulos (necesarios para los puntos 2 y 3):
```powershell
git submodule update --init --recursive
```
---
## ⚖️ Aviso legal
Este proyecto es un trabajo de ingeniería inversa y preservación digital con fines
educativos y de interoperabilidad.
- **No se distribuye ningún asset con derechos de autor.** Este repositorio no contiene
ROMs, ni código propietario del juego, ni pistas de audio.
- **Cada usuario debe aportar su propio volcado de cartucho obtenido legalmente.**
- Todas las marcas y derechos pertenecen a sus respectivos dueños (Rare Ltd. / Microsoft /
Nintendo).
Licencia MIT — ver [LICENSE](LICENSE).