MediEvil Recomp ESP

MediEvil Recomp ESP is a native PC port of MediEvil for the Spanish PlayStation version, featuring widescreen and improved rendering.

README

MediEvilRecomp ESP

Recompilación estática de MediEvil para PlayStation, versión PAL española (SCES-01495), para jugarlo de forma nativa en ordenadores modernos, con panorámico y renderizado mejorado.

immagine

Este repositorio parte de MediEvilRecomp-ITA, el port a la versión PAL italiana (SCES-01494), que a su vez es un fork de MediEvilRecomp de BlackLabelHQ (versión USA). Todo el trabajo base (recompilación, parches de renderizado y panorámico, runtime RecompOne) es suyo.

Todas las correcciones PAL ya hechas para la versión italiana (callbacks del CD, reproducción de vídeos, fundido en iris, pantalla PAL de 256 líneas, voces XA) se portan a la versión española recalculando las direcciones. La lógica de las correcciones no cambia, y una sola copia del código sirve para las dos versiones.

Proyecto en beta. Puede haber errores, incluso graves. Repórtalos en las issues de este repositorio.

El README original en italiano está en README.it.md.


Qué contiene

Italiana (por defecto)Española
JuegoPAL Italia, SCES-01494PAL España, SCES-01495
Configuración del recompiladorconfig/MediEvil.jsonconfig/es/MediEvil.json
Funcmapsconfig/funcmaps/config/es/funcmaps/
Código generadogenerated/generated-es/
Compilacióndotnet builddotnet build -p:Lingua=es
Salidabin/, obj/bin-es/, obj-es/
Scripts de Windowswindows_*.batwindows_*_es.bat
Discodisc/MediEvil (Italy).cuedisc/MediEvil (Spain).cue

La configuración, el código generado y la compilación por defecto de la versión italiana no cambian: los valores italianos de la tabla de direcciones son exactamente los que antes estaban escritos en el código.


Requisitos

  • GPU compatible con OpenGL 2.1 como mínimo
  • .NET 10 SDK
  • OpenAL
  • Git
  • Una copia original de MediEvil PAL España, de la que sacar un volcado limpio en formato bin/cue. Lee disc/LEEME.md.
  • Opcional, solo para las herramientas de port: Python 3.8 o superior, sin paquetes externos.

Este repositorio no contiene archivos del juego ni distribuye su código: todo se genera en tu ordenador a partir de tu disco.


Compilación (versión española)

Windows: script automático
  1. Clona el repositorio con los submódulos:
    git clone --recursive https://github.com/Leproide/MediEvilRecomp-ESP
    cd MediEvilRecomp-ESP
    
  2. Copia en disc\ los archivos de tu disco con estos nombres:
    • MediEvil (Spain) (Track 1).bin
    • MediEvil (Spain) (Track 2).bin
    • MediEvil (Spain).cue
  3. Ejecuta windows_initial_build_es.bat. El script:
    • actualiza los submódulos;
    • aplica a RecompOne la corrección de recompone-fixes\;
    • compila RecompOne;
    • genera el código del juego en generated-es\ a partir de config\es\MediEvil.json;
    • compila el juego con -p:Lingua=es.
Windows: comandos a mano

Desde la carpeta del repositorio (cmd o PowerShell):

git submodule update --init --recursive
git -C RecompOne apply ../recompone-fixes/cd-whole-sector-mode.patch
dotnet build RecompOne/RecompOne.sln
dotnet run --project RecompOne/RecompOne.Recompiler config/es/MediEvil.json
dotnet build RecompOne.MediEvil.csproj -p:Lingua=es
dotnet run --project RecompOne.MediEvil.csproj -p:Lingua=es

git apply solo hace falta la primera vez. Si la corrección ya está aplicada, da un error que puedes ignorar. Los mismos comandos sirven en Linux y macOS.

Para la versión italiana, en el mismo repositorio: dotnet run --project RecompOne/RecompOne.Recompiler config/MediEvil.json y luego dotnet run, sin -p:Lingua. También puedes usar los scripts windows_*.bat sin _es.


Ejecución

  • Windows: windows_run_es.bat. Si el juego todavía no está compilado, la primera compilación arranca sola.
  • Inicio rápido sin recompilar: windows_run_no_build_es.bat.
  • Desde terminal: dotnet run --project RecompOne.MediEvil.csproj -p:Lingua=es.

Cuando el juego pida el disco, elige disc\MediEvil (Spain).cue.

Las dos versiones comparten settings.json si se ejecutan desde la misma carpeta. La versión española comprueba que el disco elegido arranque SCES_014.95. Si no es así, por ejemplo porque el ajuste apunta todavía al disco italiano, vuelve a pedir el disco.

Después de cambiar config/es/ hay que regenerar el código: borra generated-es y vuelve a ejecutar windows_initial_build_es.bat.


Cómo se ha hecho el port ITA → ESP

Las dos versiones se han comparado instrucción por instrucción con las herramientas de tools/pal-port/, usando el proyecto italiano como origen. Resultado (detalle en tools/pal-port/PORT_REPORT_ES.md):

ImagenFuncionesCódigoNotas
SCES_014.95 (arranque)338idénticoel archivo es igual byte a byte que SCES_014.94
MEDIEVIL.EXE1845mismas direcciones98 funciones aligned: cambian direcciones de datos y una constante de pista XA; $gp 0x800ED848 → 0x800ED8C8
23 overlays2071mismas direccionescambian solo los datos que siguen al código
TL.BIN98+0x8textos españoles más largos al principio del archivo
LANDMAP.BIN33−0x8
CREDITS.BIN14−0x38

Las 4399 funciones son exact o aligned: no hay ninguna función fuzzy ni ninguna sin pareja. En las funciones aligned casi todos los inmediatos que cambian son direcciones de datos. Las únicas constantes distintas son dos números de pista XA (MEDIEVIL.EXE 0x80065930 y TL.BIN 0x8001174C), y ninguna está en las funciones parcheadas o enganchadas. Los datos de MEDIEVIL.EXE se desplazan por zonas: −0x18 (hasta ~0x800D8xxx), +0x80 (hasta ~0x800ED9FC) y +0x78 (el resto). Por eso los offsets $gp de las variables cercanas a $gp bajan 8 bytes.

Tabla de direcciones por versión

Todas las direcciones que cambian entre versiones están en config/versions.json:

SecciónContenido
hookslos 67 hooks de config/*/MediEvil.json (dirección ITA / ESP)
entryPointspuntos de entrada declarados en overlays[].functions
relocationsarrays reubicados (gapsPolySquaresCaptured)
constantsdirecciones y offsets $gp con nombre, usados por los parches escritos a mano (PalCdCallbacks, PalMovies, TerrainPatch, TerrainCapture, mod Trucchi)
literalsinmediatos de las copias de funciones recompiladas (CullPatch, EntityFloatFunctions, LandMapPatch), identificados por la instrucción italiana que los produce

A partir de la tabla se generan:

  • patches/GameAddresses.cs: clases GameVersion, Addr y RAddr con constantes GameVersion.Spanish ? ESP : ITA. La versión se elige al compilar: -p:Lingua=es define el símbolo LINGUA_ES. Los parches usan Addr.CdCbSync, RAddr.Game_80021DA4, etc. en lugar de números.
  • config/es/MediEvil.json: la configuración española, derivada de la italiana. Los nombres de los métodos de los parches siguen siendo los italianos (por ejemplo LandMapPatch.func_80012BBC se engancha en ESP en 0x80012BB4).

La tabla también recoge el título de la ventana y el repositorio de las actualizaciones automáticas (Leproide/MediEvilRecomp-ESP para la versión española). Las mods Trucchi y Filmati a schermo intero reconocen la versión en tiempo de ejecución por la posición de las tablas de trucos, que son datos constantes del ejecutable.

Herramientas

tools/pal-port/version_port.py (Python 3, sin dependencias):

py tools\pal-port\version_port.py check --ita CARPETA_ITA --dst CARPETA_ESP
py tools\pal-port\version_port.py gen-cs
py tools\pal-port\version_port.py gen-config
py tools\pal-port\version_port.py convert --ita CARPETA_ITA --dst CARPETA_ESP --force
  • check comprueba la tabla, las dos configuraciones y GameAddresses.cs. Si se le pasan las carpetas con los archivos extraídos de los dos discos (SYSTEM.CNF, ejecutable de arranque, MEDIEVIL.EXE, OVERLAYS/), además verifica:
    • que cada hook y cada destino de jal sea el inicio de una función en las funcmaps de las dos versiones;
    • que cada valor de literals coincida con el inmediato de la instrucción en los dos binarios;
    • que cada constante con nombre corresponda en el mapa de direcciones ITA → ESP;
    • que los destinos de llamada de los parches (PalDispatch, Dispatcher.Call) se comporten igual en las dos versiones.
  • gen-cs / gen-config regeneran GameAddresses.cs y config/es/MediEvil.json después de editar la tabla.
  • convert es el paso único que creó la tabla. Necesita los fuentes C# originales con los números escritos a mano, así que solo sirve para rehacer el port desde el repositorio italiano.

Resultado de check sobre los dos discos:

ita: 67 hooks (61 en inicios de funcmap, 6 en puntos de entrada declarados); jal: 6109 en su imagen + 6866 hacia game/main, 0 fuera de inicio de función
esp: 67 hooks (61 en inicios de funcmap, 6 en puntos de entrada declarados); jal: 6109 en su imagen + 6866 hacia game/main, 0 fuera de inicio de función
114 literals y 26 constantes verificados
RESULT: OK

Los 6 hooks en "puntos de entrada declarados" son los mismos que en la versión italiana: puntos de entrada internos (por ejemplo func_80021E5C) declarados en overlays[].functions de la configuración. Hay una sola llamada de los parches que no apunta a un punto de entrada (Dispatcher.Call a 0x80013D88 ITA / 0x80013D80 ESP en LandMapPatch). También pasa en la versión italiana: RecompOne la resuelve en tiempo de ejecución (Dispatcher.Tolerant), así que el comportamiento es el mismo.

Los archivos extraídos de los discos están protegidos por derechos de autor: no los subas nunca al repositorio.


Debug

patches/PalDebug.cs activa los logs internos de RecompOne cuando está definida la variable MEDIEVIL_DEBUG. Los canales disponibles son cd, irq, bios, sdk, vsync, gpu, dma, spu, mdec o all. Si la variable no está definida, no cambia nada.

Símbolo del sistema (cmd):

set MEDIEVIL_DEBUG=cd,irq
dotnet run --project RecompOne.MediEvil.csproj -p:Lingua=es > debug.txt 2>&1

PowerShell:

$env:MEDIEVIL_DEBUG = "cd,irq"
dotnet run --project RecompOne.MediEvil.csproj -p:Lingua=es > debug.txt 2>&1

Adjunta debug.txt a las issues cuando informes de un bloqueo o un cierre inesperado.


Trucos

El juego tiene dos menús de trucos integrados, y en el recomp funcionan igual que en la consola. En pausa, mantén pulsado L2 y pulsa:

  • Modo trucos: Abajo, Arriba, Cuadrado, Triángulo, Triángulo, Círculo, Abajo, Arriba, Cuadrado, Triángulo
  • Modo trucos ampliado: Triángulo, Círculo, Triángulo, Círculo, Círculo, Triángulo, Izquierda, Círculo, Arriba, Abajo, Derecha, Círculo, Izquierda, Izquierda, Triángulo, Derecha, Círculo, Izquierda, Izquierda, Triángulo, Círculo, Abajo, Círculo, Círculo, Derecha

La versión española usa las mismas secuencias que la italiana: las dos tablas de MEDIEVIL.EXE tienen el mismo contenido y solo cambia su posición. La mod incluida Trucchi los activa desde el panel de mods, sin combinaciones, y funciona en las dos versiones. Detalles en el README de la mod (en italiano).

immagine

immagine


Vídeos a pantalla completa

La mod opcional Filmati a schermo intero amplía los vídeos: muestra solo el área del vídeo y la adapta a la ventana sin deformarla. Se activa desde el panel de mods y funciona en las dos versiones. Detalles en el README de la mod (en italiano).


Estructura

config/MediEvil.json       configuración del recompilador, versión italiana
config/funcmaps/           funcmaps italianas
config/es/                 configuración y funcmaps españolas
config/versions.json       tabla de direcciones por versión (ITA / ESP)
patches/                   parches C# de renderizado, panorámico y soporte PAL
patches/GameAddresses.cs   tabla de direcciones en C# (generada desde versions.json)
patches/GameDisc.cs        comprobación del disco en la versión española
recompone-fixes/           correcciones para el submódulo RecompOne
mods/Trucchi/              mod para activar los menús de trucos
mods/FilmatiSchermoIntero/ mod opcional para los vídeos a pantalla completa
disc/                      aquí van los archivos de tu disco (no incluidos)
tools/pal-port/            herramientas de port, informes y tabla por versión
BACKUP_Dipendenze/         copia de reserva de RecompOne y ShaderMod
misc/                      actualización automática
assets/                    icono e idiomas de la interfaz
Directory.Build.props      carpetas de salida bin-es/obj-es con -p:Lingua=es

Créditos

  • BlackLabelHQ (Derp Princess, flaffymg): MediEvilRecomp y RecompOne, es decir, todo el trabajo de recompilación en el que se basa este proyecto.
  • El equipo de la decompilación de MediEvil, cuyas referencias usó el proyecto original.
  • Port PAL italiano y español: https://github.com/Leproide

License

Los cambios introducidos por este fork (port PAL italiano y español, config/es/, config/versions.json, herramientas de tools/pal-port/, scripts, PalDispatch.cs, PalDebug.cs, GameAddresses.cs, GameDisc.cs, recompone-fixes/, mods mods/Trucchi/ y mods/FilmatiSchermoIntero/, parches PAL de patches/) se publican bajo GPL-3.0-or-later. El texto completo está en tools/pal-port/LICENSE.

El código original de MediEvilRecomp y RecompOne pertenece a BlackLabelHQ y sigue sujeto a sus términos. MediEvil es una marca de sus respectivos propietarios: este proyecto no está afiliado ni aprobado por Sony Interactive Entertainment.


Author

https://github.com/Leproide