Star Wars: Episode I - Racer (1999) de PC


Posiblemente lo mejor que nos dio el Episodio I después de la banda sonora de John Williams. Un juego de carreras muy entretenido y bastante fiel a la famosa escena de la carrera de vainas. 

Esta entrada del blog pretende ser el resumen de casi dos meses dedicados, en ratos libres, a pulir este juego lo máximo posible, en todos los aspectos imaginables. Lo que comenzó como la búsqueda de un widescreen fix para poder jugar en panorámico real fue, poco a poco, creciendo y ampliándose hasta niveles surrealistas: no sólo me movía la búsqueda de información y el aprender más sobre el funcionamiento de estos juegos antiguos sino, también, el afán de resolver todos los problemas que se iban presentando, uno tras otro, producto de todo tipo de carencias, incompatibilidades e infortunios.

Al grano, que hay mucha tela que cortar.


╔════════════════════════════╗
STAR WARS: EPISODE I
RACER
PC
╚════════════════════════════╝

Esta guía consta de 2 partes principales:
  • Guía pormenorizada con la máxima información posible que he sido capaz de recordar y plasmar por escrito relativa al proceso que he ido siguiendo para obtener los resultados finales.
  • Apéndices con descripciones aún más detalladas y pormenorizadas de algunos procesos específicos.
Te recomiendo seguirla en orden y no dejarte nada. Puedes pasar de los apéndices, pero no de todo el bloque principal. Sin más preámbulos, vamos con ello.


╔════════════════════════════╗
Resumen de las versiones disponibles
╚════════════════════════════╝

Podemos utilizar la versión retail, Steam o GOG:
  • Retail: el instalador de la versión original en CD no funciona en sistemas operativos de 64 bits. Para instalarla, hay varias opciones, todas ellas descritas en detalle en este enlace. No me quedo con esta versión porque me parece un poco farragoso y Steam y GOG tienen el problema resuelto de sobra.
  • Versión Steam: de base debería funcionar, pero a mí no me arranca. Arranqué los ajustes de resolución primero, tal como se menciona en algunos hilos de ayuda de Steam. Seguía sin funcionar (el juego petaba en la pantalla de carga inicial). La solución fue la propuesta en este hilo, consistente en copiar en el directorio del juego el archivo "dinput.dll" descargado de aquí. El juego arrancaba pero el problema ahora era que el juego dejaba de reconocer el gamepad. Al no encontrar solución a esto, desistí; no me gusta la idea de jugar con teclado a este tipo de juegos. Sé de algunas personas a las que les ha funcionado perfectamente el juego y el mando simplemente suprimiendo el archivo "dinput.dll" original de esta versión de Steam.
  • Versión GOG 1.0 hotfix 3: con instalador que funciona sin problemas, sin DRM, sin archivo "dinput.dll" ni rollos raros. Y con más resoluciones a escoger en la ventana de ajustes externa al juego, incluyendo 4K. Por estos detalles creo que es la versión a utilizar. De hecho, en esta versión voy a basar la presente guía.
En cuanto  estas versiones de Steam y GOG, hay que decir que en ambas el juego se ejecuta a 60fps sin inconveniente. Algunos comentan eu Discord que esto es un añadido de estas versiones, ya que, originalmente, el juego corría a 30fps. No lo tengo claro. Es más, diría que este juego siempre fue a 60fps en aquellos ordenadores capaces de moverlo a ese framerate. Lo que sí tengo entendido es que no conviene desbloquear el framerate a más de 60 ya que las físicas y el manejo se rompen.

╔════════════════════════════╗
Instalación versión GOG
╚════════════════════════════╝

¿De verdad necesitas una guía? Pues es muy sencillo. Lo primero, pilla el juego. Suele estar muy barato en GOG. En rebajas, más aún. En primer lugar, yo no lo instalaría desde GOG Galaxy. A ver, puedes hacerlo, pero se pierde la gracia "DRM free". Descarga el instalador desde tu biblioteca de juegos, ejecuta y sigue las instrucciones. Sencillísimo. A partir de aquí hay que hacer varios ajustes. Los pasos que describiré a continuación los secuenciaré en el orden que considero más lógico. El orden puede carece de importancia, salvo cuando se trata de parchear un archivo que, a su vez, ya estaba parcheado. Por eso te recomiendo seguir mi orden.


╔════════════════════════════╗
dgVoodoo
╚════════════════════════════╝

Según PCGamingWiki, las versiones de Steam y GOG vienen pre-parcheadas con un wrapper DirectDraw a DirectX 9. Se les agradece el esfuerzo, pero si de wrappers se trata, en este caso no hay nada mejor que dgVoodoo, que traducirá DirectDraw a un más actual DirectX 11, nos permitirá ejecutar el juego a la resolución que queramos (con filtrado anisotrópico de hasta 16x y Multisampling Anti-Aliasing de hasta 8x), nos ayudará a corregir algunos problemillas de Z-Fighting aumentando la precisión del depth buffer y también podremos usar ReShade. Para empezar, descargaremos la última versión de dgVoodoo de su web oficial. La última versión disponible ahora mismo es la 2.8.1. Una vez descargado el zip, coloca los siguientes archivos en la carpeta principal del juego:

dgVoodooCpl.exe
dgVoodoo.conf
MS\x86\D3DImm.dll
MS\x86\DDraw.dll

Ahora, ejecuta dgVoodoCpl.exe. Deja todas las opciones como vienen por defecto, a excepción de las siguientes:
  • Pestaña General \ Appearance \ Scaling mode: 
    • Para jugar en el aspect ratio 4:3 original -> "Stretched, 4:3 Aspect Ratio"
    • Para 16:9, ya sea con el panorámico con vFOV recortado (éste es el modo panorámico que ofrecen las versiones de GOG y Steam. A pesar de que este juego tiene mucho FOV y no queda demasiado mal el recorte que le hace a la imagen, no recomiendo jugarlo así) o usando el parche de Vogons que diré luego (recomendado) -> "Unspecified".
    • Si después de realizar todo el proceso descrito en la guía el juego peta a veces al abrirlo (no llega a salir la barra azul de carga), prueba a cambiar de "Full Screen" a "Windowed". Ejecutar el juego como administrador también puede ayudar.
  • Pestaña General \ Miscellaneous: Keep window aspect ratio: ON
  • Pestaña General \ Miscellaneous: Capture mouse: OFF
  • Pestaña DirectX \ Resolution (ejemplo para una resolución efectiva de 4K):
    • Para 4:3 -> 2880x2160 (aunque no sale en el desplegable, puedes teclear este valor y pulsar Intro).
    • Para 16:9 -> 3840x2160
  • Pestaña DirectX \ Texturing: Filtering: Force anisotropic 16x
  • Pestaña DirectX \ Antialiasing (MSAA): 4x (si te atreves y tu PC es lo bastante potente, puedes probar 8x). Por cierto: no se te ocurra crear perfil del juego en el panel de control de Nvidia que modifique el anisotrópico o el anti-aliasing, ni siquiera el de transparencia. El juego no a arrancará o, si lo hace, va a haber shimmering por todas partes. Si esto sucede, eliminar todos los ajustes de nvidia relacionados con el juego. No obstante, a diferencia de juegos como Mafia, el anti-aliasing de transparencia funciona al activar el MSAA desde los ajustes de dgVoodoo, sin necesidad de forzarlo desde el panel de control de Nvidia.
  • Ajustes avanzados: haciendo clic con el botón derecho sobre alguna zona libre de la ventana de dgVoodoo, nos saldrá un menú contextual del que seleccionaremos "Show all sections of the configuration". Nos aparecerán varias pestañas nuevas. Iremos a "DirectXExt" \ Miscellaneous \ Depth buffers y escogeremos "Force 32 bit". Con esto corregiremos los problemas de parpadeo de poligonos en la lejanía que luchan por superponerse a otros (Z-fighting).
  • Para reducir drásticamente los tiempos de carga en el juego, dgVoodoo tiene una opción que es mano de santo: en los mismos ajustes avanzados del punto anterior, misma pestaña "DirectXExt", activaremos la opción "Batched update for primary surface. Si tenemos problemas de rendimiento, iremos a la pestaña DirectX \ Miscellanneous y marcaremos la opción "Fast video memory access". Supuestamente reduce drásticamente el uso de la CPU. En mi caso, me ha ido peor, ya que experimento pequeñas bajadas cuando embisto a los rivales.
Una vez tengamos todo, haremos clic en "Apply" y en "OK" para cerrar la ventana.


╔════════════════════════════╗
Ajustes de resolución en el juego
╚════════════════════════════╝

Muchos juegos de finales de los 90 tenían los ajustes de resolución (y, a veces, el resto de ajustes gráficos) fuera del propio juego, en una ventana de ajustes propia. Si vamos a Inicio - Programas - Star Wars™ Episode I - Racer™ [GOG.com] - Tools - Video Settings podremos ajustar la resolución. Otra manera de acceder a la ventana de selección de la resolución del juego es editando el acceso directo y añadiendo -v al final de la ruta (Ejemplo: "C:\GOG Games\STAR WARS Racer\SWEP1RCR.EXE" -v). Ya sabemos que los gráficos 3D del juego se van a renderizar a la resolución que le hemos indicado en dgVoodoo, pero algunos elementos como el HUD (no particularmente en este juego pero sí en muchos otros) y las secuencias FMV (si decidimos NO usar las remasterizadas en HD) se verán más pequeñas si escogemos aquí una resolución alta. Igualmente, existe un problema importante de rendimiento si seleccionamos en la ventana de Video Settings una resolución muy alta como 4K: el juego tirará de CPU como si no hubiera un mañana y obtendremos un framerate bastante inestable. Por eso, la resolución que te recomiendo escoger en esta ventana sería:

a) Para 4:3 -> 800x600
b) Para 16:9 -> 1280x720

No importa que en esta misma ventana figure (que debería figurar) "dgVoodoo DirectX Wrapper" como tarjeta gráfica: desde aquí no controlamos a qué resolución va a renderizar dgVoodoo. Sin embargo, como digo, si escogemos aquí una resolución superior a 1080, el rendimiento se va a resentir mucho, a menos que tengas una CPU muy potente, y aun así tengo serias dudas, por lo que he podido ver en YouTube y leer en foros. Por eso escogeremos las resoluciones que he mencionado. Repito: la resolución real a la que va a renderizar dgVoodoo los elementos 3D del juego la fijaremos desde dgVoodoCpl.exe, y podremos renderizar los gráficos a 4K o incluso más, sin ninguna penalización en el framerate. Por cierto, si quieres experimentar con resoluciones que no vengan en el desplegable de la ventana de resolución del juego, puedes meter una resolución personalizada editando el registro de Windows. Los valores de resolución se encuentran en los campos "Display Height" y "Display Width" dentro de HKEY_LOCAL_MACHINE \ SOFTWARE \ WOW6432Node \ LucasArts Entertainment Company LLC \ Star Wars: Episode I Racer \ v1.0. Simplemente asegúrate de marcar el tipo de valor como decimal en vez de hexadecimal.


╔════════════════════════════╗
Parche panorámico de Vogons
╚════════════════════════════╝

Como he dicho, este juego se puede jugar en panorámico de dos maneras: bien o mal. Si queremos jugarlo bien (manteniendo el vFOV y aumentando el hFOV), necesitaremos descargar el widescreen fix de Vogons. Es curioso porque esta info no está en PCGamingWiki en el momento de escribir este texto. En este hilo llevan años buscando soluciones y traduciendo funciones a ensamblador. De todos los exes parcheados que han subido, necesitaremos el de GOG. Lo creó un tal CoolGamer y lo subió en este post de la página 2 del hilo mencionado. Enlace directo aquí y mirror aquí.


╔════════════════════════════╗
Archivos de traducción al español
╚════════════════════════════╝

En este hilo están los archivos que convierten cualquier versión en española: interfaz, audio, video... Todo. Aquí el enlace directo y aquí un mirror por cuenta de la casa.


╔════════════════════════════╗
Mod de secuencias FMV en HD
╚════════════════════════════╝

Este juego no permite por defecto usar secuencias de vídeo en HD ni en otro formato que no sea el propio. Sin embargo, gracias a un proyecto de reescalado que aún sigue en desarrollo, un tipo en GitHub llamado JeremyAnsel ha desarrollado un archivo dll que, simplemente colocándolo en el directorio principal del juego, nos permitirá reproducir archivos MP4 en HD, 4K, 60fps, etc. Llegué a su GitHub a través de un youtuber llamado Jeremy King Tech, en cuyo vídeo titulado "STAR WARS EPISODE 1 RACER HD MOD (wip)" hacía mención a dicho GitHub. Pero lo que encontré buscando un poco fue algo mejor: un pull request en el que dicho youtuber le pedía ayuda al tal JeremyAnsel para poder usar los vídeos reescalados en HD en el propio juego. A lo largo de la conversación se pueden ver las distintas versiones que el creador le va mandando para que el otro las prueba y le diga si están bien o no. La versión "Test18.zip" parece ser la última que llegó a hacer en dicha conversación de junio de 2019 aunque, por lo visto, JeremyAnsel continuó el desarrollo en un repositorio propio. La versión que allí se encuentra sí parece ser la última existente, por lo que será la que usaremos. Y un mirror aquí. Data de la misma fecha más o menos, pero el dll ocupa bastante menos tamaño. Simplemente se trata de colocar el archivo dll y el de configuración en la carpeta principal del juego.

El tal Jeremy King Tech, como he dicho, tiene su propio mod HD, pero ya tengo cierta experiencia y, por norma general, estos proyectos suelen buscar absurdamente el reescalado a resoluciones de 4K y el interpolado a 60fps. En este caso, me parecen absurdas ambas opciones; no hay una ganancia real de calidad entre los 1080p y el 4K en este caso. En cuanto a los 60fps: las secuencias originales van a 15fps, por lo que un duplicar el framerate ya supone una mejora de calidad increible, sin perder ese puntito cinematográfico. 60fps lo veo un alarde que no aporta nada. O sí: peso a los archivos, al igual que el 4K. Mis secuencias ocupan 663 MB siendo H.264 a 1080p 30fps. Hice algunas pruebas de reescalado a 4K y alguno de los archivos ocupaba más de 1 GB. Bien, el caso es que te dejo el pack para que lo descargues aquí. Tienes que meter los archivos MP4 en la carpeta data\anims. No es necesario que borres los archivos originales .znm que encontrarás allí, ya que el juego escogerá los archivos MP4 automáticamente. Por cierto: soy consciente de que el archivo "PlanetG.mp4" es una copia del "PlanetD.mp4" con el audio en inglés. Esto no es un fallo mío, sino que es así en el juego original. Ignoro el motivo y en qué momento se reproduce la secuencia "Planet G" durante el juego, y por eso he decidido respetarlo tal cual está. Las tienes para descargar aquí.

Por cierto: el uso de estas secuencias HD tiene dos efectos colaterales, uno bueno y otro malo: el malo es que, antes de comenzar una secuencia, aparecen algunos parpadeos/flashes mostrando el escritorio y el juego. Esto se produce si la resolución a la que se ejecuta el juego no coincide con la resolución de las secuencias FMV. El caso es que tampoco es demasiado molesto. Y el efecto bueno que este sistema produce de rebote es que desaparece el doble cursor en los menús del juego, algo que las versiones antiguas de dgVoodoo solucionaban y las nuevas no, incluso cuando marcamos ciertas opciones específicas para evitar que esto ocurra. Con todo, conseguiremos convertir esto:


en esto:


Si por alguna casualidad te sigue apareciendo el doble cursor, puedes descargarte el SW Racer Cursor Fix de aquí o de este mirror. Creo que el procedimiento es descomprimir los archivos a la carpeta del juego y ejecutar Install.bat.


╔════════════════════════════╗
Mod de fuentes en HD
╚════════════════════════════╝

Existe un mod creado por un tal JayFoxRox que transforma las fuentes del juego en HD.



Disponible para su descarga aquí, y en este mirror. Por desgracia, esta versión, que es la original (archivo swe1r-patcher-v1_0.zip), tiene un pequeño problema: activa un modo debug que muestra en la parte inferior izquierda de la pantalla un texto cada vez que se activa un trigger, y eso a nosotros no nos interesa verlo para nada. Por suerte, existe un fork creado por un tal louriccia (también conocido como LightningPirate en Discord) que elimina dichos mensajes. Lo podemos descargar de su GitHub o de este mirror. Se trata del archivo "swe1r-patcher.alt.v1.0.zip". Una vez descargado, tenemos varios métodos de instalación. Voy a comentar los dos más sencillos:
  • Uso de archivo dll: extraeremos a la carpeta del juego los siguientes elementos del zip: la carpeta "textures" y el archivo "dinput.dll". Método recomendado por el creador del mod. Sencillo y sin dolor. Al principio era reticente a utilizar este método por los problemas que me dio un archivo dinput.dll que usé para solucionar los problemas de cuelgues de la versión de Steam. No he probado esta versión del archivo en la versión de Steam. Quizá haga que funcione bien y me reconozca el mando. Te recuerdo que todo este tuto se basa en la versión de GOG, pero si quieres probarlo en la versión de Steam, adelante. 
Actualización 1: si usas un mando DirectInput Logitech Rumblepad 2 o un Logitech F510 conectado en modo DirectInput (lo que, a todos los efectos, equivale a un Rumblepad 2), te encontrarás con el siguiente mensaje de error a la hora de cargar el juego:


Una búsqueda rápida del archivo en Google nos indica la siguiente info:

Developer: Logitech Inc.
Product: Logitech Gaming Software
Description: Logitech Force Feedback Driver

Todos los archivos dll relacionados con la instalación de Logitech que explicaré en el apartado de mandos están almacenados en C:\ Archivos de Programa \ Archivos comunes \ Logitech \ WMDrivers, incluido WmJoyF32.dll. Si copio dicho archivo a Windows \ System32, el problema persiste. El culpable es el archivo dinput.dll del mod. Por lo tanto, si estás en esta situación, no te quedará más remedio que recurrir al segundo método, descrito a continuación.

Actualización 2: En los últimos días, mientras realizaba esta guía, he encontrado un wrapper DirectInput a XInput que solventa todos los problemas del driver de Masahiko Morii en cuanto a vibración con juegos XInput, etc. Luego explicaré todo, pero hago este inciso simplemente para comentar que dicho wrapper (llamado Xidi) requiere su propio archivo dinput.dll, por lo que, si queremos tener vibración sin bugs con este juego usando nuestro mando XInput, no queda otra que recurrir, efectivamente al segundo método, descrito, esta vez sí, a continuación.
  • Extraeremos a la carpeta del juego los siguientes elementos del zip: la carpeta "textures" y el ejecutable "swe1r-patcher.exe". A continuación, haremos una copia del ejecutable del juego (SWEP1RCR.EXE), por si lo queremos rescatar más adelante. Una vez hecho, haremos clic en el ejecutable del juego (SWEP1RCR.EXE) y, sin soltar, lo arrastraremos hasta colocarlo sobre el archivo "swe1r-patcher.exe" que acabamos de pegar. Soltaremos el ratón y comenzará el proceso de parcheo, que podremos ver en una ventana del CMD. Parece ser que el parcheador incrusta las fuentes de la carpeta "textures" dentro del ejecutable del juego, el cual pasa de pesar 852 KB a 4,83 MB. Por lo tanto, una vez parcheado, podremos deshacernos no sólo del patcher sino de la carpeta textures.
  • Existe un tercer método descrito en el README.md del zip del proyecto original (no viene README en el fork). Consiste en lanzar el juego desde un loader pero no lo he probado ya que no hay necesidad ni es el método recomendado por el creador del mod.
Por cierto, olvidaba mencionar que este parche, además de introducir las fuentes en alta resolución, produce dos cambios más, que afectan únicamente al multijugador online,  y que son muy importantes:

- Permite el uso de vainas mejoradas/modificadas.
- Desactiva las colisiones entre corredores.

Más adelante, cuando hable del modo multijugador, volveré a mencionar este asunto.


╔════════════════════════════╗
Ajustes gráficos y mod distancia dibujado
╚════════════════════════════╝

Dentro del juego hay una serie de parámetros que nos permiten aumentar o reducir la calidad gráfica, pero, ¿y si te dijera que hay un archivo desde el que puedes aumentar aún más la calidad gráfica y distancia de dibujado? Dicho archivo se encuentra en la carpeta del juego \ data \ config \ current. Abre el archivo "video.cfg" con el bloc de notas y deja tal que así los parámetros para conseguir la máxima calidad que puede ofrecer este juego:
VIDEO REFLECTIONS=ON
VIDEO ZEFFECTS=ON
VIDEO DYNAMIC_LIGHTING=ON
VIDEO VSYNC=ON
VIDEO LENSFLARE=ON
VIDEO ENGINEEXHAUST=ON
VIDEO TEXTURE_RES=3
VIDEO MODEL_DETAIL=3
VIDEO DRAWDISTANCE=3

No obstante, existe un tipo, el mismo louriccia (https://github.com/louriccia) que he mencionado antes, que ha editado el archivo "out_modelblock.bin" que se encuentra en la carpeta "data\lev01" y ha aumentado la distancia de dibujado hasta el infinito, al tiempo que ha eliminado completamente la niebla. Lo puedes descargar aquí. No tienes más que sustituir el archivo original por éste. Si bien es un gusto ver cómo el popping brilla por su ausencia, también es cierto que la ausencia total de niebla le quita, para mi gusto, mucho del aspecto y la personalidad original del título. Es como si le quitara atmósfera, se queda todo demasiado limpio y las sombras demasiado oscuras. Mira, si no, estas dos capturas:



Te estarás preguntando cómo es que la segunda captura tiene la distancia de dibujado aumentada pero retiene esa "atmósfera", ese "ambiente" (que no es más que la niebla a muy bajo nivel). Aquí tienes el archivo modificado por mí. Explicaré todos los pormenores en los apéndices para futuras consultas y por si a alguien le interesa el tema.


╔════════════════════════════╗
Recuperación del sonido
surround / 3D / DirectSound
╚════════════════════════════╝

El juego tiene un sistema de sonido 3D posicional que no es compatible con sistemas modernos. Si vamos a los ajustes de sonido del juego, veremos cómo nos indica que nuestro sistema no tiene capacidad de sonido 3D en el apartado "Sonido 3D detectado". Para restaurar el sonido 3D DirectSound en Windows modernos utilizaremos un emulador de hardware de aceleración de audio llamado IndirectSound. A día de hoy, la última versión disponible es la 0.20, de fecha 21-9-2019. La puedes descargar de aquí y de este mirror. Copiaremos los archivos "dsound.dll" y "dsound.ini" del zip en la carpeta principal del luego, es decir, donde se encuentra el ejecutable del mismo. Además de esto, necesitaremos tener instalado Microsoft Visual Studio 2010 (x86) Redistributable o el juego no arrancará, al faltarle varios archivos dll. Iremos a la web oficial de descargas de Visual Studio y descargaremos Visual Studio 2010 (VC++ 10.0) SP1 10.0.40219.325 x86 (las versiones posteriores no sirven) desde aquí o de este mirror. Una vez descargado e instalado, entraremos en el juego y comprobaremos cómo en Sonido 3D detectado ha pasado de decir "No" a decir "DirectSound". Así es como tengo yo la configuración de audio:


Aparte de esto, y al igual que sucede con los ajustes gráficos, existe un archivo en la carpeta del juego \ data \ config \ current llamado "audio.cfg" que permite ajustar algunos parámetros no presentes en el menú de ajustes del juego. Te recomiendo dejarlos así:
SYS=ON                      
HIRES=ON                    
3D=ON                       
DOPPLER=ON                  
REFLECTIONS=ON             
GAINMATCH=1.00              
VOICE=ON                    
MUSIC=ON                    
REVERB=ON


╔════════════════════════════╗
Mod de corrección de texturas
╚════════════════════════════╝

Hay unas pocas texturas en esta versión de PC que están chungas, tienen alguna fila o columna de pixels desplazada y forman extraños patrones que no deberían. Por suerte, el amigo louriccia (https://github.com/louriccia) mencionado antes pone a nuestra disposición un pack de texturas consistente en las mismas texturas oficiales pero con esas texturas chungas corregidas, dejándolas como en Nintendo 64. Descarga el archivo "out_textureblock.bin" desde el GitHub oficial, haciendo clic en out_textureblock.bin y después en Download o desde este mirror, y pégalo en la carpeta \ data\ lev01 del juego, sustituyendo el que había en ella.

Como ves, la diferencia salta a la vista:




╔════════════════════════════╗
Mod de fondos menú principal alternativos
╚════════════════════════════╝

Me he permitido crear una serie de fondos alternativos para la pantalla de menú principal a partir de imágenes que he ido encontrando por internet. Todos han sido cuidadosamente ajustados para que el propio menú no tape partes importantes de la imagen, y para que ésta no se vea estirada ni encogida. También incluyo el fondo original adaptado a una resolución panorámica de 16:9. Como bonus, se incluyen los mismos fondos adaptados a 4:3, para quien lo juegue en ese formato. Esta todo disponible en este enlace. Entra en la carpeta que corresponde al formato en el que estás jugando (16:9 o 4:3), renombra el archivo de tu elección a "GREYEDSPLASH" (recuerda que es un archivo de imagen en formato targa, por lo que ha de tener extensión .tga) y pégalo en la carpeta data \ images en el directorio de instalación del juego. Sobreescribe cuando te lo pida.


╔════════════════════════════╗
Mod de logo sin estirar
╚════════════════════════════╝

Este sencillo mod hecho por mí consiste en el logo del juego sin estirar en la pantalla del menú principal. Se presentan dos versiones: una que se ajusta a la existencia inamovible de los símbolos de TradeMark en la parte superior central de la pantalla del menú principal, y otra adaptada a la ausencia total de éstos, en cuyo caso se adjunta el archivo que hace que dichos símbolos desaparezcan. Puedes descargar el mod desde aquí. Mi recomendación es que uses la versión que elimina los símbolos de TradeMark: quedará el logo a la izquierda, donde debe estar. Además, el archivo .tab de la versión sin logos TM incluye otra modificación para corregir un fallo que se presenta en el texto en el menú de selección de parámetros de carrera. Entonces, se trata simplemente de copiar la carpeta "data" de la versión escogida al directorio principal del juego, donde ya existe una carpeta con el mismo nombre. Nos pedirá sobreescribir 4 archivos .tga y 1 archivo .tab. Aceptamos y ya lo tenemos. Más info sobre la edición de los archivos tga en los apéndices.


╔════════════════════════════╗
Controles / Esquema /
Perfil DS4Windows / Gatillos
╚════════════════════════════╝

Después de ver y probar varios esquemas de control, incluidos los oficiales de la versión remasterizada para PS4/Switch que salió hace un par de años, he decidido crear uno propio que se ajuste más a mi forma de jugar:


Aunque veas un mando de PS4, funciona exactamente igual en un mando de Xbox y, por extensión, en cualquier mando XInput. De esta imagen, por cierto, hay que hacer varias puntualizaciones:
  • He intentado ajustar el esquema de control lo máximo posible a la configuración clásica de PSX para juegos de conducción/arcade. No lo he podido asemejar en un 100% (por ejemplo, asignando la acción de cambiar de vista al botón triángulo), porque eso complica mucho el acceso a otras acciones mucho más importantes.
  • Hablando de cambiar de vista, el juego por defecto siempre nos muestra la vista en 3ª persona más cercana. A mí me gusta jugar en la vista más lejana. Existen 4 atajos de teclado para poner directamente cada una de las 4 vistas disponibles. En mi caso, F4 me serviría para mostrar la vista lejana en 3ª persona, con lo que podría asignar mediante aplicación externa de mapeo (como DS4Windows, ya que uso un DualShock 4), un botón de los menos usados del mando, como R3, a dicha tecla F4. La idea es buena, pero este juego, dentro de sus muchas peculiaridades, cambia siempre a la vista por defecto tras la destrucción de nuestra nave, pero sólo si habíamos cambiado previamente de vista usando uno de los atajos de teclado (F1 a F4). Si habíamos seleccionado nuestra vista usando el botón de cambiar de vista, ésta se mantendrá pase lo que pase. Curioso y estúpido, o simplemente un bug del juego que no corrigieron. Por eso no he asignado ningún botón del mando a dichos atajos. En resumen: si te gusta una vista que no sea la vista por defecto, tendrás que cambiarla cada vez que inicies una carrera, pero hazlo con el botón de ir rotando entre las cámaras disponibles y no con los atajos de teclado o tendrás que volver a cambiarla cada vez que te estrelles.
  • Si usamos mando con stick analógico, sea la configuración que sea, sólo podremos navegar por los menús usando dicho stick, y no la cruceta. Para solucionar esto, he mapeado la cruceta del mando a los cursores del teclado mediante DS4Windows. De paso, usando esa misma herramienta, he mapeado el botón OPTIONS, antiguamente conocido como START, a la tecla Escape. De ese modo, puedo pausar la partida en cualquier momento, saltarme las secuencias FMV, etc. Por lo demás, el juego parece asignar por defecto los botones X y Círculo a las acciones de aceptar y cancelar dentro de los menús, por lo que no es necesario mapear nada más.  Únicamente, añado que me gusta mapear R3 a la tecla que tengo asignada en ReShade para capturas de pantalla. En este caso, "Impr Pant", o "PrtSc". Con DS4Windows es muy sencillo asignar cualquier botón del mando a dicha tecla. Si no usas un mando de PS4, tu mejor apuesta es joy2key. En este caso, mapear el botón R a la tecla de "Impr Pant" es un pelín engorroso ya que el programa no registra la pulsación de dicha tecla a la hora de asignarla, sino que hay que desplegar el menú contextual sobre la casilla de registro y elegir PRINT SCREEN.
  • No he asignado el acelerador y freno a los gatillos analógicos del mando por dos motivos: el primero, como he dicho, es el de conseguir un esquema de control lo más parecido al típico juego de coches de PSX, al menos hasta el año 97-98. Y en segundo lugar, este juego, a pesar de soportar controles analógicos, joysticks, etc., tiene un control analógico de la aceleración que no parece nada progresivo, por lo que he podido ver. Es como si fuese "a tramos". Por otra parte, la frenada no puede ser controlada analógicamente, ya que actúa como un interruptor: 1 o 0, todo o nada. Si aun así quieres asignarlas a los gatillos y que la aceleración sea """analógica""", deberás editar con el bloc de notas el archivo data \ config \ current \ current_control.map. Busca las líneas relativas a los gatillos (Z es el gatillo izquierdo y RZ el derecho), y déjalas como pongo a continuación:
JOYSTICK AXIS=RZ FUNCTION=ANALOG_THROTTLE AXIS_RANGE=NEGATIVE
JOYSTICK AXIS=RZ FUNCTION=BRAKE AXIS_RANGE=POSITIVE
JOYSTICK AXIS=Z FUNCTION=ANALOG_THROTTLE AXIS_RANGE=NEGATIVE
JOYSTICK AXIS=Z FUNCTION=BRAKE AXIS_RANGE=POSITIVE

Si no quieres que la aceleración sea """analógica""", simplemente cambia "ANALOG_THROTTLE" por "THROTTLE" en ambas líneas. Guarda los cambios y ya lo tendrías.
  • La acción de "bajar morro" o "pitch dowm" no es literal, a diferencia de "subir morro" o "pitch up", ya que no se ve a la nave bajar el morro (salvo en las caídas desde una altura, si nos ponemos estrictos), sino que simplemente aumenta la velocidad en los giros a costa de perder ángulo de giro. Ese mismo botón es el de cargar el turbo. El juego no permite desligar las dos acciones en ninguna de sus configuraciones.
Si te convence este esquema de control, puedes descargar mi archivo "current_control.map" de aquí. No olvides colocarlo en \ data \ config \ current dentro del directorio de instalación del juego. Otra cosilla: este juego es propenso a descojonar el archivo "current_control.map". No siempre pasa, pero, para asegurarte de que eso no te ocurra bajo ninguna circunstancia, te recomiendo que hagas copia de seguridad del mismo o, mejor aún, que lo conviertas en archivo de sólo lectura desde las propiedades del explorador de Windows. Pero ten encuenta que, si haces alguna modificación desde dentro del juego, ésta no se guardará en el archivo. Tenlo en cuenta para quitarle o ponerle el atributo de sólo lectura según te convenga.

En los apéndices desgrano el contenido de dicho archivo, por si te interesa. Y aquí tienes mi perfil de DS4Windows.


╔════════════════════════════╗
Vibración
╚════════════════════════════╝

ACTUALIZACIÓN: Antes de nada, te recomiendo que leas todo lo que había escrito, a pesar de ser información obsoleta en lo que atañe al método para restaurar la vibración en juegos DirectInput cuando usamos un mando XInput. Si la mantengo es porque creo que es interesante ver cómo han evolucionado mis conocimientos en este tema a medida que elaboraba esta guía, y porque me gusta tener un registro detallado, no sólo de adónde he llegado, sino del punto de partida y el recorrido realizado, incluyendo los callejones sin salida que me he ido encontrando, para no perder tiempo en el futuro si me encuentro con el mismo problema pero, también, para orientar a quien esté intentando conseguir lo mismo que yo pues, con casi total seguridad, se estará enfrentando a los mismos problemas y encontrándose con los mismos escollos que yo. La información actualizada se encuentra, pues, en el siguiente apartado, dedicado a Xidi.

En cuanto a la vibración, hay que hacer un breve resumen de dónde nos encontramos: los actuales mandos de control funcionan, en su gran mayoría, con el protocolo / estándar XInput, que surgió en la época de la Xbox 360 (de hecho, el mando de 360 es el mando arquetípico del protocolo XInput). Este protocolo es, en teoría, totalmente compatible con el estándar anterior, llamado DirectInput, lo que nos asegura poder usar un mando actual en un juego antiguo (los juegos y mandos anteriores a la Xbox 360 usaban el estándar Directinput) y que todo funcione correctamente. ¿Todo? No, todo no. Parece ser que a Microsoft se le olvidó el pequeño detalle de la vibración. Es decir, si usamos un mando XInput en un juego DirectInput no podremos disfrutar de las funciones de vibración que el juego pudiera soportar originalmente. Ante esta situación, tenemos como 4 opciones:

OPCIÓN A
========
Usar un mando Directinput (comprando algún mando viejo de segunda mano. Puede que necesite su propio driver específico para que funcione la vibración, como es el caso del Logitech Rumblepad 2 clásico) (ver enlaces e instrucciones en punto B.1).

OPCIÓN B
========
Usar un mando con conmutador de protocolo XInput/DirectInput y usarlo en modo DirectInput. Puede que necesite su propio driver específico para que funcione la vibración en el modo DirectInput:

B.1
===
Como, por ejemplo, el Logitech Rumble Gamepad F510, el cual necesita tener instalado el Logitech Gaming Software. El último que existe a día de hoy, y puede que el último que existirá jamás, es la versión 5.10.127. También la tienes en este mirror. Ejecuta el instalador como administrador. La vibración con el mando en modo DirectInput en juegos DirectInput sólo funcionará si la aplicación de Logitech está corriendo en segundo plano (actualización: después de probar en dos PCs distintos, ambos con Windows 11, se da una curiosa circunstancia: si no he conectado nunca en ese equipo el Rumblepad 2 original, tendré que tener siempre la aplicación de Logitech abierta en segundo plano para que el F510 vibre en modo DirectInput con los juegos DirectInput. Sin embargo, si conecto el Rumblepad 2 original, una vez el sistema lo reconozca, ya no tendré que abrir la aplicación para que la vibración funcione, para ninguno de los dos mandos, esté el que esté conectado. Muy extraño, pero bueno. El caso es que funciona). Para que esta aplicación corra adecuadamente y cargue los drivers necesarios tendrás, al menos en Windows 11, que desactivar la integridad de memoria en los ajustes de seguridad de Windows (ve a la lupa de la barra de tareas, busca "Aislamiento del núcleo". En el menú, desactiva la opción "Integridad de memoria"):


De lo contrario, cada vez que conectemos el mando en modo DirectInput, Windows nos mostrará el siguiente mensaje de error:


Si lo hemos hecho bien y tenemos el modo conectado en modo Directinput, podremos ejecutar la (arcaica) aplicación. Así es como se ve:


Si el mando está en modo XInput, la aplicación nos avisará:


Si el mando está en modo XInput la vibración no funcionará, aunque lo mapeemos a un mando de Xbox 360 virtual con x360ce, XOutput, reWASD o cualquier otra (enseguida explicaré el motivo).

B.2
===
En el caso del genial mando 8BitDo Ultimate C Wired USB (que por ser tan nuevo entiendo que aún no tiene entrada dedicada en PCGamingWiki), la situación es peor: este mando funcionará en modo XInput y DirectInput según mantengamos pulsado el botón X o el B respectivamente al conectarlo por USB (esta operación sólo hay que hacerla una vez, pues el mando recordará el modo en que fue conectado la última vez). Pues bien, en modo XInput no vibra con los juegos DirectInput con x360ce, XOutput ni reWASD, a pesar de mapearlo a un mando virtual de 360 y de tener instalados los drivers de Masahiko Morii. Pero es que en modo DirectInput tampoco, ya que no existen drivers específicos para ello por parte del fabricante, el cual, en su propia web, afirma que la vibración sólo funciona en Windows + modo XInput. En serio, da igual lo que hagas: la vibración en los juegos DirectInput con este mando no va a funcionar, a pesar de que Gamepad Tester lo reconozca como mando de 360 y de que puedas testear la vibración y funcione. Es que puedes incluso mapearlo a un mando virtual de PS4 y gestionarlo con DS4Windows, haciendo un test de vibración desde la propia aplicación y comprobando cómo los dos motores funcionan perfectamente. Y sin embargo, una vez entras al juego, nada de nada, a pesar de que lo reconoce como un mando con capacidad de vibración. ¿Por qué pasa esto? Ni idea. ¿Tiene sentido? Ninguno.

ACTUALIZACIÓN: Hoy 19-9-2023 he probado de nuevo con el mando de 8BitDo mapeado a un mando virtual de 360 mediante XOutput y la vibración ha funcionado. Tengo que determinar si hay algún elemento más que haya tenido algo que ver, ya sea Xidi, el driver de Masahiko Morii o los propios ajustes del XOutput que quizá no supe configurar correctamente en su momento. Con lo que sea, actualizaré esta parte de la entrada en cuanto sepa el motivo.

El caso es que estos dos mandos tienen una peculiaridad en común, que creo que da una pista de por qué no vibran en modo XInput en juegos DirectInput con el driver de Masahiko Morii. Para encontrarla, tenemos que ir a la antigua pantalla de "Dispositivos e impresoras". En Windows 11 está bastante escondida, pero se puede encontrar yendo a "Ajustes - Bluetooth y dispositivos - Dispositivos - Más ajustes de dispositivos e impresoras" (los nombres pueden variar ligeramente, ya que mi Windows está en inglés). Otra forma de encontrarlo fácilmente sería crear un acceso directo en el escritorio y pegar la siguiente cadena de texto como dirección:

explorer shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}

Bueno, pues una vez en Dispositivos e impresoras, si tenemos el mando conectado veremos, para empezar, el nombre con el que figura entre la lista de "cacharros" que tengamos conectados será uno propio (marcado en amarillo en la captura inferior). Este dato no es relevante. Sin embargo, y aquí viene lo importante, si hacemos clic derecho y vamos a la primera opción (Ajustes del mando o algo similar), y hacemos, a su vez, clic en "Avanzado", observamos cómo el nombre del mando no se corresponde con el de Xbox 360 (marcado en verde):

Lo que debería poner es lo siguiente:


Y es que hay mandos XInput compatibles con el mando de 360 que, a nivel interno del sistema, y esto es lo importante, NO son un mando de 360. Y el driver de Masahiko Morii no contempla estos mandos con un nombre "interno" diferente. Se podría llegar a hacer que vibrasen si alguien se tomase la molestia de modificar el driver para incluir las IDs de hardware de dichos mandos, como alguien ha hecho con el mando de Xbox One (más sobre esto, enseguida). Por cierto, así es como se llama el 8BitDo Ultimate C Wired USB a ojos del sistema:


Y por eso no vibra en modo XInput con juegos DirectInput.

OPCIÓN C
========
Usar un mando XInput, ya sea el original de Xbox 360, One, One S o Series (conectados por cable), un clónico cutre de Aliexpress o de marca, un Dualshock 4 o DualSense (por cable o bluetooth, en ambos casos) mapeado a un mando virtual de 360 mediante una aplicación como DS4Windows, que en las propiedades del mando en el menú de Dispositivos e impresoras se muestre como "XBOX 360 For Windows" o "Xbox One For Windows" más el Force Feedback Driver for XInput by Masahiko Morii. Desde su web descargaremos el archivo correspondiente a nuestro sistema operativo: si tenemos Windows 7 o posterior, descargaremos la versión correspondiente a Windows 7 32 o 64 bits, según nuestro sistema operativo. Yo, por ejemplo, tengo Windows 11 64-bit, por lo que descargaré la versión "xi.win7.x64.en.zip" de la cual he creado este mirror (más info y enlaces de descarga aquí y aquí). Una vez descargado el zip, lo descomprimiremos y ejecutaremos el archivo "xi.win7.x64.en.msi". Lo único que hace este instalador es crear la carpeta "Force Feedback Driver for XInput" en C:\Archivos de Programa, conteniendo dos carpetas, una para cada tipo de aplicación que ejecutemos (32 o 64 bits), con un archivo "xiffd.dll" en cada una, y creo que también hace alguna modificación en el registro de Windows. Y ya estaría. No hay que hacer nada más. Cuando usemos nuestro mando XInput en cualquier juego DirectInput, tendremos la vibración plenamente operativa. Si acaso, también puedes necesitar una aplicación para mapear ciertas teclas del teclado a nuestro mando, como el propio DS4Windows o, si no tienes un Dualshock 4, joy2key, como he dicho unos párrafos más arriba.

Cualquier mando que podamos mapear a un mando virtual de 360 con cualquiera de las aplicaciones ya mencionadas vibrará en juegos DirectInput, siempre y cuando dicho en mando no se den estas dos condiciones al mismo tiempo: que el mando tenga originalmente capacidades XInput y que en las propiedades del mando en el menú de Dispositivos e impresoras NO se muestre como "XBOX 360 For Windows" o "Xbox One For Windows".

Y, por cierto: respecto al DualSense, un detalle más: tendremos que realizar un paso más para que DS4Windows lo reconozca:


Como sabemos, el mando de Xbox One S también se puede conectar por bluetooth, de ahí que añadiré un apartado dedicado a él.

Actualización: Existe una modificación del driver de Masahiko Morii por pate de un tal por un tal NUK3 TH3 WHAL35 para soportar mandos de Xbox One (USB). Lo tienes disponible aquí, concretamente en el enlace a OneDrive que allí aparece. Si ese enlace está caído, he creado un mirror aquí. Después de hacer una serie de pruebas he visto que con este driver modificado funciona la vibración tanto en el mando de 360 como en el de One. Con el driver de Masahiko original, sólo funciona el de 360.

OPCIÓN D
========
Usar un mando original de Xbox One conectado por bluetooth, como el mando de Xbox One S o Series X/S. Originalmente, los drivers de este mando para Windows no permitían hacer uso de la vibración en juegos XInput al conectarlo por bluetooth. Si querías vibración en cualquier juego, tenías que conectarlo por USB. Por suerte, Microsoft terminó sacando unos drivers que solucionaban este inconveniente. Ahora bien, con juegos DirectInput, si lo conectamos por bluetooth, empieza el calvario. A priori bastaría con mapear nuestro mando a un mando de 360 o de One virtual y ya estaría, no? Pues no. Fíjate en esto:

Como he dicho antes, si un mando tiene capacidades XInput y en las propiedades del mando en el menú de Dispositivos e impresoras NO se muestra como "XBOX 360 For Windows" o "Xbox One For Windows", entonces no va a vibrar con el driver de Masahiko Morii, modificado o no, a menos que quien lo haya modificado haya añadido su ID de hardware específica.

Para asegurarme, he probado, de nuevo, x360ce, XOutput, XInputPlus y algún otro programa similar que se me olvida. Con ninguno de ellos he conseguido hacer funcionar la vibración en juegos Directinput. Pero aquí viene la buena noticia: ha habido un programa capaz de ello. La mala noticia es que es de pago: reWASD. Con él ha sido posible, previa instalación del driver de Masahiko Mori modificación por NUK3 TH3 WHAL35 para soportar mandos de Xbox One (USB), conseguir conectar el mando de One S mediante bluetooth y que la vibración funcionase en juegos DirecInput:


Una vez mapeado automáticamente al mando virtual de 360, el original "Bluetooth LE XINPUT compatible input device" es ocultado del sistema (al igual que hace DS4Windows o aplicaciones como HidHide) apareciendo, en su lugar, el mando de 360:


Mientras nadie añada la ID de hardware del mando de One S conectado por bluetooth, me temo que reWASD es la única manera de hacerlo funcionar con vibración en juegos DirectInput. Al menos, en mi experiencia. Pero tenemos un problema: de manera totalmente aleatoria, la vibración en nuestro mando de Xbox One S o Series X/S conectado pro bluetooth puede dejar de funcionar de repente, hasta tal punto que tendremos que apagar el mando por completo y volver a encenderlo o no funcionará la vibración con ningún juego, sea éste DirectInput o XInput.

Una vez superado el escollo, es interesante mencionar que existe una variedad de eventos distintos que producirán vibración en nuestro mando. Si abrimos el archivo force.cfg que se encuentra en \ data \ config \ current, veremos todos los eventos que podemos activar o desactivar. Y es aquí cuando he encontrado un pequeño problema consecuencia del método que estamos usando para recuperar la vibración en mandos XInput (el driver de Masahiko Morii): cuando comenzamos una carrera, la vibración funciona normalmente, tal y como la hayamos configurado. Pero en cuanto nos estrellamos una vez, algunos tipos de vibración dejan de funcionar en lo que queda de carrera. He probado a jugar con un mando DirectInput real con vibración (Logitech Rumblepad 2) y confirmo que ninguno de esos problemas ocurre. Por lo tanto, el culpable es el driver de Masahiko Morii, sin duda alguna, y la actualización de NUK3 TH3 WHAL35 no lo mejora, pues únicamente se limita a añadir soporte para más mandos. Confirmo que en otros juegos como Need for Speed III: Hot Pursuit, la vibración usando el Rumblepad 2 tiene más matices y más contundencia en algunos puntos como el derrape. Igualmente, cuando saltamos la vibración casi desaparece completamente mientras estemos en el aire, cosa que con el driver de Masahiko Morii no pasa. Es como si las órdenes de vibración DirectInput no estuvieran perfectamente trasladadas a XInput.

Existe una supuesta alternativa llamada XInput Plus que no he tenido el placer de probar, que también restablece la vibración. Hay un tutorial de configuración de la aplicación aquí. ¿La pega? Que sólo implementa vibración de fuerza constante, no cuenta con soporte para efectos periódicos ni vibración direccional. De todos modos, he intentado usarlo y el juego no llega a arrancar nunca... Alguno de los archivos dll que añade a la carpeta del juego hacen que crashee. Sin embargo, en NFS3: HP sí funciona. El problema es que el nivel de vibración está tan bajo que me cuesta apreciar si realmente tiene todos los matices de usar un mando DirectInput o no. Existe una utilidad llamada "DirectInput 1-7 to 8 Wrapper", disponible en este enlace, pero no arregla los citados problemas con la vibración del juego, además de estropear el mod de fuentes HD, por lo que no te lo recomiendo bajo ningún concepto.


╔════════════════════════════╗
XIDI, o cómo conseguir que cualquier mando
XInput, por cable o no, vibre (y sin bugs)
╚════════════════════════════╝

Tanto el "Force Feedback Driver for XInput by Masahiko Morii" como su modificación por un tal por un tal NUK3 TH3 WHAL35 para soportar mandos de Xbox One (USB) presentan dos enormes inconvenientes:
  • Sólo son compatibles con los mandos XInput cuyas IDs formen parte de su lista. La modificación añade algunos mandos, entre ellos el de One (conectado por USB), pero hay mucos mandos que quedan fuera. Mandos XInput que no son clones del de 360 ni del de One (en las propiedades del mando en el menú de Dispositivos e impresoras NO se muestran como "XBOX 360 For Windows" o "Xbox One For Windows"). Y esto limita bastante el número de mandos que podemos usar, a menos que un alma caritativa los vaya registrando "a mano" en el driver", es decir, lo vaya actualizando con nuevas IDs de hardware.
  • La fidelidad de la traslación de la vibración del estándar DirectInput al XInput no es todo lo alta que cabría esperar, produciéndose fallos o inconsistencias en la misma (Star Wars: Racer), así como intensidades excesivas y pérdida de detalle fino (Need for Speed III: Hot Pursuit). Hay vibración, sí, pero es un poco burda comparada con la experiencia real de usar un mando DirectInput con capacidad de vibración.
Durante años he creído que este software era la mejor elección para poder disfrutar de la vibración en nuestros antiguos y queridos juegos de PC con un mando actual. Y es que si a un juego de por sí viejo y desfasado encima le quitas funcionalidades, pues apaga y vámonos. Por eso el driver de Masahiko Morii se antojaba como la panacea, una solución universal... Hasta que le metí mano a fondo al Star Wars: Racer y empezaron a aflorar los problemas y limitaciones que he mencionado.

Sin embargo, hasta hace unos días aún lo veía como la mejor opción; Usando el mando de PS4, PS5 (USB o Bluetooth) con DS4Windows o el mando de One / One S (USB), pensaba, la compatibilidad estaba garantizada durante años. Y eso bien valía el precio a pagar (los dos problemas mencionados anteriormente).

Pero, en un giro inesperado de los acontecimientos, la cosa cambió: buscando alternativas en GitHub, me topé por casualidad con Xidi, en principio otro wrapper DirectInput / WinMM a XInput con algunas características adicionales, pero nada más. Pero cuál fue mi sorpresa cuando, al probarlo con Star Wars: Racer, vi cómo se resolvían de un plumazo los dos problemas comentados:
  • El mando 8BitDo Ultimate C Wired USB conectado en modo XInput vibraba por fin. Puntualizo lo del modo XInput porque en modo DirectInput seguramente le ocurra lo mismo que a los mandos Logitech: necesitará drivers específicos del fabricante para producir vibración.
  • La vibración funcionaba sin ningún tipo de fallo ni bug: el turbo vibraba siempre que lo activaba, y no sólo la primera vez. Y tras estrellarme, todos los tipos de vibración seguían funcionando perfectamente, no sólo los de rodar a izquierda y derecha.
Además, el mando de Xbox One S y el de Series X/S conectados por Bluetooth también vibran, y sin necesidad de reWASD, aunque siguen perdiendo la vibración aleatoriamente al rato de estar funcionando, a menos que los conectemos por cable o con el dongle USB que trae el propio mando de Series X/S. No es culpa de XIDI ni de reWASD sino, más bien, de los propios drivers de Windows.

Sin embargo, XIDI también tiene algún pequeño inconveniente:
  • No es una solución general a nivel de sistema, que instales una vez y te olvides. En este caso tienes que instalarlo en cada juego (normalmente copiando el archivo Win32 \ dinput.dll del zip a la carpeta del juego).
  • Requiere un poco de configuración en todo caso, pues por defecto y por alguna extraña razón el mando está configurado como "StandardGamepad" y no como "XInputNative". Para poder cambiar los ajustes del wrapper tendrás que crear un archivo Xidi.ini con la siguiente estructura (lo tienes también aquí):
[Mapper]
Type                                = StandardGamepad
Type.1                              = StandardGamepad
Type.2                              = StandardGamepad
Type.3                              = StandardGamepad
Type.4                              = StandardGamepad

[Properties]
MouseSpeedScalingFactorPercent      = 100
UseBuiltInProperties                = yes
DeadzonePercentStickLeft            = 0
DeadzonePercentStickRight           = 0
DeadzonePercentTriggerLT            = 0
DeadzonePercentTriggerRT            = 0
SaturationPercentStickLeft          = 100
SaturationPercentStickRight         = 100
SaturationPercentTriggerLT          = 100
SaturationPercentTriggerRT          = 100

[Log]
Enabled                             = no
Level                               = 1

[Import]
dinput.dll                          = C:\Windows\system32\dinput.dll
dinput8.dll                         = C:\Windows\system32\dinput8.dll
winmm.dll                           = C:\Windows\system32\winmm.dll

[CustomMapper]
; This section does not exist by default.

[Workarounds]
; This section does not exist by default.

En este caso, si sólo vas a usar un mando, puedes cambiar, en la línea que comienza por "Type.1", el valor "StandardGamepad" a "XInputNative", quedando tal que así:
[Mapper]
Type = StandardGamepad
Type.1 = XInputNative
Type.2 = StandardGamepad
Type.3 = StandardGamepad
Type.4 = StandardGamepad

Si vas a usar más mandos, repite el proceso para cada uno. Si no haces este cambio el mando funcionará igualmente, pero si tenías guardado previamente algún esquema de control dentro del juego, verás que ya no te sirve porque los botones están cambiados:


  • Por último, en algunos juegos no funcionará sin más, sino que tendremos que añadir algo en el apartado [Workarounds] del archivo Xidi.ini. En este apartado de su GitHub describe las tres posibles soluciones que podemos aplicar cuando un juego decide no reconocer nuestro mando. No es el caso del juego que nos ocupa, que funciona perfecto sin hacer nada más, pero sí ocurre en juegos como el Need for Speed III: Hot Pursuit (1998). En el caso de este juego, el apartado [Workarounds] del archivo Xidi.ini deberá quedar así:
[Workarounds]
ActiveVirtualControllerMask = 0x03
PollReturnCode = 0

Con eso ya funcionará todo perfectamente. En el caso del NFS III, la vibración en mandos XInput con el driver de Masahijo Morii es bastante burda, pues apenas permite reducir la intensidad de la misma y está carente de unos cuantos matices y sutilezas que sí podemos experimentar con un mando DirectInput. Y ahora, gracias Xidi, también podremos experimentarlos en un mando XInput de cualquier tipo y con cualquier ID de hardware. 

Como añadido de última hora respecto a la vibración en el Star Rars Racer, tengo que comentar que la vibración en el Dualshock 4, por alguna extraña razón, ha empeorado y el motor produce una vibración demasiado fuerte a los pocos instantes de comenzar la carrera, haciendo que apenas se pueda percibir el resto de vibraciones. No me ha ocurrido con ningún otro mando, y sucede con DS4Windows, reWASD... Esas aplicaciones no son las culpables, pues el DualSense lo tengo conectado por DS4Windows y va perfectamente, al igual que el resto de mandos. 

El problema antes mencionado respecto al mando de Xbox One S y Series X/S conectado por bluetooth que pierde la vibración por completo hasta el punto de hacernos apagar el mando y volver a encenderlo, sigue pasando de manera idéntica con Xidi, usemos reWASD o no. La única opción que parece que queda en este caso, según he leído en foros de Microsoft, es conectar el mando por cable y, en mitad de la partida, desconectar el cable, lo que hará que el mando se conecte por bluetooth y, con un poco de suerte, el juego lo seguirá reconociendo. En fin, la verdad es que no lo sé, pero el único mando puro de consola que parece no tener ningún problema con este juego conectado por Bluetooth es el DualSense de PS5.

Por lo tanto, mi recomendación final en cuanto a mandos para jugar a este y otros juegos son: DualSense + DS4Windows en cuanto a mandos Bluetooth, y el 8bitDo Ultimate C Wired USB en cuanto a mandos conectados por cable.


╔════════════════════════════╗
Trainer menú debug de versión 
N64 y Dreamcast (opcional)
╚════════════════════════════╝

En este hilo de los foros de GOG alguien pedía un mod para hacer la AI de los rivales más complicada, ante la falta de reto que le suponía el juego. Entonces, un tal Tehelee afirmaba estar trabajando en un trainer para replicar el menú de trucos de la versión de Nintendo 64 y Dreamcast, que se encuentra también en la versión de PC pero no es accesible. Tras unos cuantos posts, el mismo Tehelee enlaza a un nuevo hilo creado por él donde afirma haberlo conseguido. Ha creado un trainer que se puede descargar de su GitHub o de este mirror. Una vez descargado, copiamos el archivo "SWEP1RCR_CM.EXE" a la carpeta del juego. Es una especie de instancia portable de CheatEngine que altera los valores en memoria (no toca para nada el ejecutable del juego) para obtener diversos propósitos. Basta con ejecutarlo antes de lanzar el juego. Se abrirá una pequeña ventana a modo de interfaz gráfica con los parámetros que podemos ajustar:


A partir de este momento, tenemos dos opciones:
  1. Modificar los valores desde esta interfaz, lo que haría los cambios permanentes gracias al archivo "SWEP1RCR_CM.cfg" que se crea automáticamente. De este modo no tenemos que cambiar parámetros cada vez que queramos usar el trainer, ya que bastará con ejecutarlo y él sólo adoptará los valores del archivo .cfg.
  2. Por el simple hecho de estar el trainer corriendo en segundo plano, cuando ejecutemos el juego y lo pausemos en medio de una carrera, nos aparecerá una nueva opción llamada "Game cheats":

Dentro de ese menú tendremos las mismas opciones del trainer, las cuales podremos modificar y ver los resultados en tiempo real:


Las únicas pegas son que cambiar los valores de las variables es bastante tedioso con el teclado, ya que no podemos teclear números, y que no hay manera de guardar los cambios. Pero siempre viene bien para hacer pruebas rápidas. No obstante, si hemos configurado dgVoodoo para que permita el cambio entre ventanas (desmarcando la opción "Disable Alt-Enter to toggle screen state" en la pestaña DirectX), lo tendremos muy fácil a la hora de cambiar valores en la ventana del trainer y ver los cambios reflejados al instante en el juego. Por cierto: si en uno de esos cambios entre ventanas volvemos al juego y nos aparece la cámara mirando hacia atrás aunque no tengamos ninguna tecla ni botón presionados, simplemente pulsaremos la tecla de mirar hacia atrás (por defecto, TAB) y la vista volverá a su posición normal.

Una cosa más: ese ajuste de dgVoodoo nos será muy útil con aplicaciones como CheatEngine.


╔════════════════════════════╗
ReShade (opcional)
╚════════════════════════════╝

Reshade es un inyector de efectos por post-procesado -tales como oclusión ambiental, profundidad de campo, aberración cromática, grano/ruido, correcciones de color, etc.- desarrollado por Crosire, que podemos aplicar a nuestro juego para cambiar y mejorar su aspecto gráfico. ReShade funciona con juegos en DirectX 9, 10, 11, 12, OpenGL y Vulkan.

Primero, descargaremos ReShade desde su web oficial. En el momento de escribir esto, la última versión disponible es la 5.8.0. Al ejecutar el archivo nos pedirá que localicemos el ejecutable del juego donde queremos inyectar ReShade. Como yo tengo instalada la versión de GOG desde el instalador standalone, es decir, sin usar GOG Galaxy, la ruta del ejecutable es "C:\ GOG Games \ STAR WARS Racer \ SWEP1RCR.EXE":


A continuación, tenemos que decirle a ReShade qué API gráfica está usando nuestro juego. El juego corre bajo DirectX 6.1, pero ya sabemos que, dgVoodoo mediante, el juego está siendo convertido a DirectX11 "al vuelo", por lo que marcaremos la segunda opción:


En el siguiente paso, podemos pasar y crear nosotros nuestro propio preset jugando con los distintos shaders y configuraciones, o importar uno ya hecho:


El que yo he creado, aparte de ser bastante liviano en cuanto a recursos, es sutil y da a la imagen un aspecto más agradable a la vista y más acorde con el look de la película, en mi opinión. Aquí imágenes del antes y el después:



Si te gusta, puedes descargarlo de aquí.

Una vez descargado, coloca el archivo en la carpeta principal del juego. Entonces, desde la ventana de instalación de ReShade que aún tienes abierta, busca el archivo y selecciónalo. Si lo has hecho así, en el siguiente paso habrá ya unos cuantos packs de shaders seleccionados:


En teoría, dejándolos tal cual vienen debería funcionar mi preset sin ningún problema, pero por algún motivo el shader "Chromaticity.fx" de dicho preset no se instala. Por ello, te recomiendo que busques y marques manualmente el pack de shaders "RSRetroArch", al que se supone que pertenece, o que marques todos e instales todo (haciendo clic en "Unckeck all" y luego en "Check all").

Una vez hecho, empezará a descargar los shaders de algún lugar de internet (algún repositorio de GitHub, imagino). Cuando haya terminado, si todo ha ido bien, saldrá esta ventana:


Hacemos clic en Finish y ya estaría. Ahora, cada vez que iniciemos el juego, nos saldrá un pequeño banner semitransparente en la parte superior de la pantalla anunciando que ReShade está cargando los shaders de nuestro preset. Una de las ventajas de las últimas versiones es que detecta cuando estamos viendo una secuencia FMV y no se aplica ahí.

En cuanto a cómo se usa ReShade, cómo modificar el preset o crear uno nuevo, cómo alterar individualmente los parámetros de cada shader, hacer capturas de pantalla con el antes y el después, activar o desactivar efectos individualmente o en conjunto, medir el impacto en milisegundos de cada shader en el pipeline global, y un largo etcétera, hay muchos tutoriales y vídeos a lo largo y ancho de la red, pero aquí tienes el tip más básico con el que empezar a toquetear: con la tecla "Inicio" o "Home" del teclado nos aparecerá, en una ventana flotante encima del propio juego, la interfaz gráfica de ReShade. A partir de ahí, el mundo es tuyo.

Otro pequeño consejo es que, si quieres utilizar shaders que necesitan acceder al buffer de profundidad (depth buffer), como por ejemplo los que alteran la profundidad de campo, etc., deberás tener desactivado el MSAA desde los ajustes de dgVoodoo, en este caso, o desde los ajustes del propio juego o del panel de control de la gráfica, en general. En el caso de mi preset, ninguno de los shaders que utiliza necesitan acceder a dicho buffer, por lo que no necesitas desactivar el anti-aliasing y todo se verá mucho más sólido.

Por cierto: el único archivo dll que introduce ReShade en la carpeta de instalación del juego es "dxgi.dll". Menciono esto porque es cierto que al instalar ReShade cambia un poco el comportamiento de las secuencias FMV en cuanto a que, antes de reproducirse, la pantalla se queda en blanco unos instantes, al menos cuando la resolución de dichas secuencias es menor a la resolución a la que estemos ejecutando el juego.


╔════════════════════════════╗
Modo multijugador online
╚════════════════════════════╝


Hay un reducto de rebeldes que aún echan carreras a este juego. He visto algunas de ellas y tengo que decir que son auténticos speedrunners profesionales. Bien, al lío: para jugar a este juego online con  otras personas necesitarás:

1.- Parchear el ejecutable del juego SWEP1RCR.EXE: Si ya has instalado el mod de fuentes en HD, ya lo tienes listo y puedes pasar directamente al punto 2. Si no, echa un vistazo arriba para ver cómo se hace.
2.- Configurar una conexión VLAN: Tendrás que descargar Radmin VPN y unirte a la red de "Star Wars Episode I: Racer".
3.- Cambiar el adaptador Ethernet: Ejecuta el archivo "ipxconfig.exe" que se encuentra en la carpeta principal del juego y cambia la "Primary interface" a "Famatech RadminVPN".
4.- Crea una sesión o únete a una ya creada: ejecuta el juego, escoge la opción de multijugador y créala o únete desde ahí.

Si necesitas ver los detalles pormenorizados de cada uno de esos apartados, en este enlace puedes ver el tutorial completo (en inglés). A día de hoy el último apartado, relativo a la resolución de problemas, está sn terminar. Por si el enlace no funcionase o hubiese cambiado, he guardado una copia local disponible en PDF y en DOCX.

Igualmente, existen un par de vídeos que te recomiendo ver si estás interesado en dominar los pormenores del manejo de los vehículos y del propio juego en sí:


Además, en la descripción proporciona enlaces al famoso Discord y al Drive de la comunidad.

El segundo vídeo contiene unos cuantos consejos interesantes:


Adicionalmente, aquí te dejo los manuales del juego en su versión PC en español y en inglés, así como el de Nintendo 64 en inglés. También un par de guías de la época en inglés: aquí y aquí.

_____________



)-------------------------------------------------(
APÉNDICES, INFORMACIÓN
ADICIONAL Y
OTRAS CUESTIONES
)-------------------------------------------------(

 

_____________


╔════════════════════════════╗
Restauración de secuencias FMV
(descripción detallada para futuras consultas)
╚════════════════════════════╝

Este juego no permite por defecto usar secuencias de vídeo en HD ni en otro formato que no sea el propio. Sin embargo, gracias a un proyecto de reescalado que aún sigue en desarrollo, un tipo en GitHub llamado JeremyAnsel ha desarrollado un archivo dll que, simplemente colocándolo en el directorio principal del juego, nos permitirá reproducir archivos MP4 en HD, 4K, 60fps, etc. Llegué a su GitHub a través de un youtuber llamado Jeremy King Tech, en cuyo vídeo titulado "STAR WARS EPISODE 1 RACER HD MOD (wip)" hacía mención a dicho GitHub. Pero lo que encontré buscando un poco fue algo mejor: un pull request en el que dicho youtuber le pedía ayuda al tal JeremyAnsel para poder usar los vídeos reescalados en HD en el propio juego. A lo largo de la conversación se pueden ver las distintas versiones que el creador le va mandando para que el otro las prueba y le diga si están bien o no. La versión "Test18.zip" parece ser la última que llegó a hacer en dicha conversación de junio de 2019 aunque, por lo visto, JeremyAnsel continuó el desarrollo en un repositorio propio. La versión que allí se encuentra sí parece ser la última existente, por lo que será la que usaremos. Data de la misma fecha más o menos, pero el dll ocupa bastante menos tamaño. Simplemente se trata de colocar el archivo dll y el de configuración en la carpeta principal del juego. Lo he probado y va perfecto.

Las secuencias FMV se encuentran en la carpeta data \ anims del juego. Son archivos con extensión .znm. Pertenece a un contenedor del formato de vídeo de Lucas Arts llamado SMUSH, del que tienes abundante información aquí, aquí y aquí:

En este caso, con 7zip podemos extraer los archivos SMUSH con extensión .snm contenidos en dichos archivos .znm. Esos archivos .snm podremos visualizarlos con reproductores multimedia como SMPlayer y MPV, pero lo interesante es poder convertirlos a otro formato que nos permita editarlos, reescalarlos, etc., y es lo que haremos a continuación.

Con FFmpeg podremos hacer la conversión a otro formato más amigable como el MP4. Pero FFmpeg es complejo de usar sin una interfaz gráfica. Una interfaz sencilla y más o menos intuitiva es "clever FFmpeg-GUI". En el momento de escribir esto, está disponible para su descarga la versión 3.1.0. El modo de funcionamiento, una vez instalado, es sencillo:
  1. En la ventana principal, haremos clic en el botón "Set Target Folder" para indicar al programa dónde queremos que guarde los archivos que genere.
  2. Una vez hecho, iremos a la sección de la derecha y haremos clic en el botón marcado en azul con la leyenda "Source file". En la nueva ventana, haremos de nuevo clic sobre el botón azul "Select Source" y buscaremos nuestro archivo .snm. 
  3. Una vez seleccionado, nos aparecerá un cuadro con la siguiente advertencia: "Scan Type Missing! Video Scan Type not found [...]". Haremos clic en "Yes" y, posteriormente, en "OK". Una vez hecho nos devolverá a la ventana en la que estábamos. Haremos clic en "Main".
  4. A continuación iremos al segundo apartado y haremos clic en "Video Stream". Después, en "Keep Resolution". A continuación, dejaremos los valores de la siguiente manera: Encoder=x264(avc); CRF=10; Preset=veryslow; Tune=no tune; Profile=auto. El resto, lo dejaremos como está y haremos clic en el botón verde "Encode". Nos generará un archivo .mkv con el vídeo.
  5. Cuando termine el proceso nos devolverá a la ventana principal, tras lo cual iremos de nuevo al segundo apartado y esta vez haremos clic en "Audio Stream". En la siguiente ventana, haremos clic en "Go to the enconder". Dejaremos todos los valores como vienen por defecto, salvo los siguientes: Encoder=pcm; PCM Codec=pcm s16le; Frequency (Hz)=48000. A continuación, haremos clic en el botón verde "Encode". Cuando haya terminado, nos habrá generado un archivo .wav en la carpeta que le hayamos indicado al programa, y donde ya se encontraba el archivo mkv generado en el punto anterior. Podemos incorporar el wav al MKV con MKVToolNix GUI. Los archivos que generemos tendrán la misma resolución y framerate originales, es decir, 640x272 y 15fps.
Ese archivo MVK lo importaremos en Topaz Video AI y lo reescalaremos con los siguientes valores:
  1. Resolución horizontal de salida: 1930 (escogerá la vertical automáticamente: 820). ¿Por qué elijo 1930 y no 1920, si con 1920 ya consigo una resolución efectiva FullHD? Porque la mierda del Topaz AI tiene un bug que hace que se genere un doble contorno en la parte inferior (como 8 filas de pixels aprox.) y en la parte derecha (como 8 columnas de pixels). Ni siquiera la propia herramienta de recorte del frame del propio Topaz permite ocultar ese problema. En el caso del Tomb Raider, como le dije al Topaz que exportase los frames individuales en formato PNG, hice una acción de Photoshop para recortar en lote esas zonas problemáticas. En esta ocasión lo haré con Adobe Premiere, como luego descubriré).
  2. Framerate: 15 FPS (original)
  3. AI Model: Proteus (Fine-Tune/Enhance)
  4. Parameters: Relative to Auto.
    1. Revert compression: 70
    2. Recover details: 24
    3. Sharpen: 0
    4. Reduce noise: 0
    5. Dehalo: 18
    6. Anti-alias/Deblur: -42
    7. Add noise: 0
  5. Encoder: ProRes 422 LT
  6. Container: mov
  7. Audio Settings: Copy
Una vez tengamos ya todos los archivos reescalados a 1930x820, los importaremos en Adobe Premiere uno por uno para recortar esas filas y columnas de pixels problemáticos. Quitaremos 10 pixels por el lado derecho, hasta dejarlo en 1920, y por abajo, hasta dejarlo en 810. No mantenemos la proporcion, pero es que hay más o menos el mismo número de filas de pixels jodidos que de columnas, y no quiero quitar más columnas de la cuenta sólo para mantener la proporción. Prefiero que sea marginalmente más panorámico que el original antes que perder más información. Procedemos con Adobe Premiere Pro 2023:
  1. Creamos un nuevo proyecto escogiendo nuestro archivo de vídeo. Siempre que queramos importar archivos de vídeo en Premiere, mi consejo es trabajar con el formato ProRes 422 LT, ya que es mucho más liviano a la hora de editar. Además, Adobe Premiere es muy selectivo con los formatos y contenedores que soporta. Por ejemplo, no nos deja trabajar con MKV. Por eso, un truco sencillo para convertir rápidamente cualquier vídeo a ProRes 422 LT es cargar el vídeo en Topaz Video AI, no cambiar resolución ni mejorar absolutamente nada y, simplemente, exportar como ProRes 422 LT (.mov) con el audio en "copiar". En segundos nos lo habrá pasado a ProRes 422, que además es un formato muy liviano para trabajar en editores de vídeo, porque lleva muy poca compresión (los archivos son más pesados, claro).
  2. Lo siguiente que haremos, una vez tengamos ya el proyecto abierto y nuestro vídeo colocado automáticamente en la línea de tiempo como secuencia, será cambiar la resolución de dicha secuencia. Para ello, primero nos aseguraremos de tener una cierta configuración de los espacios del área de trabajo. Yo suelo utilizar la configuración llamada "de edición". Eso se cambia desde Window - Workspaces. Ahí escogeremos "Editing" (el atajo de teclado Alt+Shift+6 hace lo mismo). Una vez tengamos esa configuración, nos fijaremos en el área inferior izquierda de la pantalla, donde están contenidos los archivos de vídeo y secuencias de nuestro proyecto. Haremos clic con el botón derecho sobre "Sequence 01", que es el nombre por defecto que tendrá nuestra secuencia, y en el menú que se despliega pincharemos en "Sequence settings". En la ventana que nos aparece, tenemos 3 grandes apartados: "Video", "Audio" y "Video Previews". En "Video", iremos a "Frame Size" y cambiaremos "1930" por "1920" y "820" por "810". Haremos clic abajo del todo en OK y, en la siguiente ventana de advertencia, también en OK.
  3. Con esto hemos reducido la resolución del proyecto, lo que equivaldría a reducir el tamaño del lienzo en Photoshop. Pero nuestro vídeo sigue estando a 1920x820 y a un 100% de zoom, lo que significa que ahora vemos 5 pixels menos del vídeo por cada uno de los 4 lados ya que, por defecto, lo deja centrado respecto al "lienzo". Pero lo que queremos no es eso, sino "mover" el vídeo 5 pixels más hacia la derecha y hacia abajo, de manera que, en total, hayamos ocultado 10 pixels del lado derecho y del inferior. Para eso, nos iremos a la línea de tiempo y haremos 1 clic sobre la pista de vídeo de nuestra secuencia para seleccionarla. A continuación, iremos a la parte superior izquierda de la ventana y haremos clic en la pestaña "Effect Controls". Nos aparecerán varias opciones con dos apartados principales: "Video" y "Audio". Dentro del apartado de video desplegaremos -si no lo está ya- "fx Motion" y, una vez hecho, nos fijamos en "Scale". Nos aseguraremos de que muestra un valor de 100.0. Luego, nos fijamos en "Position". Ahí nos aparecen dos valores: 960.0 y 405.0. Simplemente los cambiaremos a "965.0" y "410.0". Es decir, habremos movido el vídeo 5 pixels hacia la derecha y hacia abajo, mostrándose ahora más información por los lados izquierdo y superior, y ocultándose definitivamente 10 pixels por la derecha y por abajo: 5 pixels los hemos ocultado en el apartado anterior y, los 5 restantes, en éste. Por supuesto todos estos números pueden variar en función de las resoluciones que estemos manejando pero, incluso trabajando a 4K, esos 10 pixels siguen siendo un margen igual de seguro. Da la sensación de que el bug de Topaz Video AI siempre está en torno a ese número de pixels, indistintamente de la resolución final a la que estemos reescalando.
  4. Por último, exportaremos nuestro vídeo en un formato con la mínima pérdida de calidad posible y la máxima compatibilidad a la hora de ser manejado por cualquier programa, sea Premiere, FlowFrames o cualquier otro. Y ese formato no es otro que el ProRes 422. Para exportar nuestro vídeo recortado a 1920x810 en ProRes 422 LT, iremos, de nuevo, a la parte superior izquierda de la ventana. Vemos un icono de una casa, luego "Import", "Edit" y "Export". Hacemos clic en este último. En la ventana que se nos presenta vemos que, por defecto, va a coger el formato H.264. Hacemos clic ahí y desplegamos el listado. Bajamos hasta donde dice "QuickTime". Una vez hecho, debajo de ese desplegable vemos que hay varios apartados: VIDEO, AUDIO, CAPTIONS, etc. Desplegamos el apartado VIDEO y en "Video Codec" vemos que, por defecto, ha escogido "Apple ProRes 422 HQ". Hacemos clic en el desplegable y escogemos, en su lugar, "Apple ProRes 422 LT". En ese apartado de VIDEO vemos que hay más opciones. Nos aseguraremos de que "Quality" está al máximo. Igualmente, en la parte inferior de dicho apartado haremos clic en "...More". Nos aseguraremos de que la opción "Use Maximum Render Quality" esté marcada. Lo que no menciono, lo dejaremos como está. Una vez lo tengamos todo, nos iremos a la esquina inferior derecha de la pantalla y haremos clic en el botón azul "Export". El proceso tardará escasos segundos (siempre dependiendo de la resolución y la duración de nuestro vídeo, claro). Por defecto, lo exportará a "C:\ Users \ [Tu usuario] \ Documents \ Adobe \ Premiere Pro \ 23.0" y lo llamará "Sqeuence 01_1.mov". Este archivo resultante será un archivo en formato Apple ProRes 422 LT (QuickTime). El audio seguirá estando en PCM 48000Hz stereo. Y en cuanto a la imagen, como ya sabemos, estará a 1920x810 15fps.
Ahora duplicaremos el framerate de nuestro archivo de 15 fps a 30fps mediante interpolación por inteligencia artificial gracias al modelo "RIFE". En este caso, utilizaremos el frontend "Flowframes", que es un proyecto de un tal "N00MKRAD". En esta web tenemos una versión antigua de Flowframes. A día 7-3-2023 sigue siendo la versión 1.36.0, que contiene la también obsoleta versión de RIFE 4.0. En su patreon tiene una versión mucho más reciente, y es la que yo voy a usar: Flowframes 1.40.0, que contiene RIFE 4.6. Procedamos:

  1. Una vez instalado Flowframes, lo abrimos, vamos a la pestaña "Interpolation" y hacemos clic en "Browse (Video). Seleccionamos nuestro video.
  2. Nos aseguramos de los fps de salida (en nuestro caso, "15 x2 = 30FPS - Normal Speed"), del formato en el que queremos guardar nuestro vídeo (en nuestro caso, puesto que va a ser el archivo final para ser utilizado en el juego, iremos a lo seguro: MP4 - h264 - Very High - YUV 4:2:0 8-bit), y en el modelo de interpolado que vamos a utilizar, asegurándonos de escoger el más nuevo disponible. En este caso, RIFE 4.6.
  3. Antes de pulsar el botón "Interpolate!", iremos a la pestaña "Quick Settings" y cambiaremos el valor de sensibilidad a los cambios de escena a 0.35. Es decir, estamos haciendo al sistema menos sensible a los cambios de escena. Los cambios de escena o plano son importantes ya que el interpolador NO debe actuar sobre ellos. Si la sensibilidad es alta (número bajo), en vídeos con bajo framerate como el nuestro, donde puede haber mucha diferencia visual entre un frame y el siguiente aun perteneciendo a la misma escena, el sistema puede detectar un cambio de escena y dejar de interpolar frames, con lo que perdemos fluidez en ese preciso instante. Para que esto no pase, escoger un valor entre 0.30 y 0.35 nos solucionará el problema.
  4. Y, ahora sí, hacemos clic en "Interpolate!" y esperamos unos segundos a obtener el resultado. Si está mucho rato sin hacer nada o nos arroja un mensaje de error, nos aseguraremos de que estamos ejecutando la aplicación como Administrador, y de que tenemos suficiente espacio en el disco duro. El archivo resultante tendrá el siguiente formato: MPEG4 (H264) 1920x810 30fps para el vídeo, y AAC 48000Hz stereo 164kbps para el audio.
Una vez tengamos los 12 archivos reescalados e interpolados, los nombraremos igual que los archivos originales (dejando sin cambiar la extensión .mp4) y los meteremos en la misma carpeta "anims" donde se encuentran los originales. No es necesario eliminar ni mover estos últimos, pues el juego usará los nuevos preferentemente.

Un detalle más: el archivo original con la secuencia FMV de los clásicos títulos de crédito del comienzo presenta la música en mono. He aprovechado para cambiarla por la versión en estéreo extraída de la banda sonora y editada para que empiece y termine al mismo tiempo, con el mismo fade-out, etc.


╔════════════════════════════╗
Modificación distancia de dibujado y niebla
(descripción detallada para futuras consultas)
╚════════════════════════════╝

Podemos manejar a nuestro antojo la distancia de dibujado de los escenarios y la distancia a la que aparece la niebla frente a nosotros y modificarlas de forma permanente en el juego gracias a una herramienta creada por, de nuevo, louriccia aka LightningPirate. En su GitHub pone a nuestra disposición un par de programillas en javascript (archivos "modelblock_unpack.js" y "modelblock_repack.js") para desempaquetar y reempaquetar, respectivamente, el archivo "out_modelblock.bin" (ubicado en \ data \ lev01). A continuación voy a detallar el proceso seguido para aumentar los valores de niebla (comienzo y final) y distancia de dibujado (carga y descarga). Los comandos de empaquetar y desempaquetar los he sacado de aquí pero, sobre todo, de la ayuda que me brindó LightningPirate en el canal de soporte de Discord. Pues vamos con ello:
  1. Lo primero que haremos será crear una carpeta (por ejemplo, C:\modelblock), donde meteremos lo siguiente:
    1. Los dos archivos de javascript recién descargados.
    2. Una copia del archivo "out_modelblock.bin" (presente en el directorio de instalación del juego \ data \ lev01).
    3. Una nueva carpeta a la que llamaremos "models", que será donde el script "modelblock_unpack.js" extraiga el contenido del archivo "out_modelblock.bin" a archivos .json.
    4. Otra carpeta a la que llamaremos "out", que será donde "modelblock_repack.js" genere un nuevo archivo "out_modelblock.bin" que incorpore los cambios que hayamos efectuado en los archivos .json.
  2. Descargaremos e instalaremos el entorno de ejecución de javascript llamado "Node.js". La última versión disponible en este momento es la 18.16.0.
  3. Abriremos una ventana de CMD o de PowerShell en dicha carpeta: si no te aparece la opción en el menú contextual al hacer clic con el botón derecho del ratón dentro de la carpeta, simplemente pulsa Ctrl+L, escribe "cmd" sin las comillas y pulsa Intro (todo esto con la ventana en foco, claro).
  4. En dicha ventana escribiremos "node modelblock_unpack.js" sin las comillas, y pulsaremos Intro. Esperamos a que termine el proceso y, si todo ha ido bien, el script habrá extraído los 323 modelos (de pistas, personajes, vehículos, objetos, etc.) a archivos .json en la carpeta "models" que hemos creado en el punto 1. He creado una hoja de excel con la clasificación de los 323 modelos por tipo de dato. Puede ser interesante de cara a una modificación más profunda. Puedes consultarla aquí. Nosotros no la vamos a necesitar porque el script de reempaquetado ya sabe qué archivos son los correspondientes a las pistas. No vamos, por tanto, a modificar manualmente los archivos json, aunque sí podemos probar a abrir alguno de ellos, por curiosidad, en un editor como Notepad++. Si abrimos, por ejemplo, el archivo "1.json", podemos probar a buscar la primera cadena "fog", de las muchas que contiene el archivo:
"fog":{"flag":3,"r":220,"g":234,"b":229,"start":996,"end":1000}
Si nos fijamos, tenemos el parámetro "flag", los valores rgb para el color, y los parámetros "start" y "end" que hablan por sí solos. El archivo "out_modelblock.bin" creado por louriccia elimina por completo la niebla a base de otorgar al parámetro "flag" el valor 0. Pero eso no es lo que vamos a hacer nosotros, ya que únicamente cambiaremos los valores de "start" y "end". Pero dejemos la niebla a un lado de momento y pasemos a la cadena que aparece justo a continuación:
"lights":{"flag":0,"ambient_r":255,"ambient_g":255,"ambient_b":255,"r":255,"g":255,"b":255,"unk1":139,"unk2":96,"x":0,"y":0,"z":-1,"unk3":0,"unk4":1,"unk5":0},"flags":0,"unk2":22860,"unload":134213120,"load":4096,"triggers":0}
De ella, únicamente nos centraremos en los valores de "unload" y "load", que son los que gestionan la distancia de dibujado. La distancia de dibujado en este juego es dinámica y cambia según los datos de colisiones repartidos por el escenario, que actúan como triggers cuando pasamos por ellos, habiendo varias distancias de dibujado diferentes:


Éste es el circuito de Boonta Eve Classic (1.json). Como vemos, hay 5 zonas diferentes. Cada zona, puede tener uno o más datos de colisión que le indiquen al motor qué zonas cargar y cuáles descargar. Algunos de esos datos de colisión pueden ser comunes a dos zonas distintas. En el dibujo, dichos colliders están representados por colores. Tomemos como ejemplo el área de color rojo. Cuando entramos en él con nuestra vaina, ocurre lo que pone en la tabla: la zona 1 es cargada en su totalidad, la 2, 3 y 4 son descargadas, y la 5 permanece cargada (pues ya estaba cargada de antes). En ese caso, el parámetro "load" tomaría el valor 10001 y el "unload" 01110. En el caso de este circuito vemos 5 zonas, y por eso los parámetros load y unload vienen representados en el ejemplo por números binarios de 5 bits, indicando cada uno de los bits qué zona carga y cuál descarga, según su valor sea 1 o 0, respectivamente. Pero, en realidad, a nivel interno el juego maneja cadenas binarias de 32 bits (es decir, 32 dígitos). Por lo tanto, en teoría podríamos tener circuitos con hasta 32 zonas distintas.

En todo caso, la idea de esto es decirle al juego que cargue siempre todas las zonas y que nunca las descargue, independientemente del circuito en el que nos encontremos. Si queremos que esto sea así, el parámetro "load" deberá adoptar el valor "11111111111111111111111111111111", es decir, treinta y dos "unos". Y deberá adoptarlo para cada dato de colisión. Las áreas de colores en el dibujo son, en realidad, una simplificación de los datos de colisiones de la pista. Es decir, que hay muchos más, del orden de unos pocos cientos. Para que todo el circuito esté cargado en todo momento, habrá que otorgar dicho valor a "load" en cada una de los cientos de colisiones, en cada uno de los 25 archivos json que contienen un circuito. Lo mismo se aplica al valor "unload" que, para nuestro propósito, debería valer 0 en todos los bits para indicarle al juego que no descargue ninguna zona jamás. Siendo el valor cero, bastará con representarlo, simplemente, como "0".

Se da una circunstancia más, y es que, como puede verse en los fragmentos de texto del archivo 1.json que he pegado anteriormente, los valores que adoptan las variables mencionadas son números enteros representados en sistema decimal. En tal caso, unload valdrá igualmente "0" pero load ha de valer "4294967295", quedando nuestra cadena de ejemplo tal que así:
"lights":{"flag":0,"ambient_r":255,"ambient_g":255,"ambient_b":255,"r":255,"g":255,"b":255,"unk1":139,"unk2":96,"x":0,"y":0,"z":-1,"unk3":0,"unk4":1,"unk5":0},"flags":0,"unk2":22860,"unload":0,"load":4294967295,"triggers":0}

No obstante, para tener cero popping, no basta con eso, ya que el parámetro "fog" también influye. Los sabios del canal de Discord dedicado al modding de este juego en particular no terminan de entender cómo funcionan los parámetros de niebla y por qué afectan también a la distancia de dibujado del circuito cuando este aspecto tiene ya sus propios parámetros que lo regulan. Sea como fuere, he ido probando valores de "start" y "end" para la niebla hasta que he encontrado los que, para mí, son los mejores en cuanto al respeto de la atmósfera original (pero mejorada, pues la niebla empieza lejos de la cámara, aunque sigue estando ahí y se aprecia perfectamente), y a la obtención de una distancia de dibujado infinita sin nada de popping, lo cual es un lujo:
"fog":{"flag":3,"r":220,"g":234,"b":229,"start":3500,"end":8500}

En este caso, de los parámetros que conforman la niebla, el que influye en la distancia de dibujado y el popping es el "end". Y ojo porque poner valores demasiado altos provocan más popping. Es muy extraño, pero el caso es que con 3500 y 8500 la cosa funciona perfecta.

Y es ahora cuando llega la parte crucial del proceso: el modificar todos los valores de "start", "end", "load" y "unload" de cada dato de colisión, y de cada archivo json que representa un circuito. Estaríamos hablando de muchísimas horas de trabajo, que serán literalmente unos pocos segundos gracias al script "modelblock_repack.js" que hemos descargado antes y colocado en nuestra carpeta de trabajo. Dicho script lo vamos a modificar a nuestro antojo para que, antes de reempaquetar de vuelta todos los archivos json a un único archivo .bin, modifique éstos según nuestras indicaciones. Para ello, lo abriremos. En principio nos serviría con el Notepad++ e, incluso, con el bloc de notas de Windows, pero es mucho más bonito, elegante y visual hacerlo con la aplicación Atom. Una vez descargado e instalado Atom, lo abrimos y cargamos en él nuestro archivo de script "modelblock_repack.js". Una vez hecho, nos vamos hasta la línea 581. Allí empieza el bloque "COLLISION DATA", que es el que nos interesa. En concreto, nos interesan las líneas 590, 591, 609 y 610. A continuación, transcribo cada línea y cómo debería quedar:


590 (orig.)	    cursor = buf.writeInt16BE(node.collision.data.fog.start, cursor)
590 (modif.)	cursor = buf.writeInt16BE(3500, cursor)

591 (orig.)	    cursor = buf.writeInt16BE(node.collision.data.fog.end, cursor)
591 (modif.)	cursor = buf.writeInt16BE(8500, cursor)

609 (orig.)	    cursor = buf.writeInt32BE(node.collision.data.unload, cursor)
609 (modif.)	cursor = buf.writeInt32BE(0, cursor)

610 (orig.)	    cursor = buf.writeInt32BE(node.collision.data.load, cursor)
610 (modif.)	cursor = buf.writeUInt32BE(4294967295, cursor)

Nótese que hemos cambiado los siguientes fragmentos de código:
node.collision.data.fog.start -> 3500

node.collision.data.fog.end -> 8500

node.collision.data.unload -> 0

node.collision.data.load -> 4294967295

En la línea 610 hemos hecho, además, otra modificación: para poder escribir el mayor binario de 32 bits posible "11111111111111111111111111111111", que en decimal es "4294967295", hemos indicado en el código que se trata de un entero sin signo ("unsigned int" o "uint") colocando simplemente una "U" delante de "Int", permitiendo, así, otorgarle el valor máximo que puede tener un entero de 32 bits:
int: –2147483648 a 2147483647

uint: 0 a 4294967295

Gracias a esa "U" habremos evitado el siguiente error a la hora de ejecutar el script "modelblock_repack.js":
RangeError [ERR_OUT_OF_RANGE]: The value of "value" is out of range.
It must be >= -2147483648 and <= 2147483647. Received 4294967295

Los parámetros de niebla admiten valores de 16 bits en vez de 32, pero no tendremos ningún problema, ya que nos movemos en unos valores muy bajos como son 3500 y 8500. Por si tienes curiosidad, éstos son los rangos de valores que puede tomar un entero de 16 bits:
int: –32768 a 32767

uint: 0 a 65535

Antes he mencionado que el parámetro "end" de la niebla influye en la distancia de dibujado. Cabría pensar que otorgarle el valor 65535 solucionaría todos los problemas de popping, pero lo cierto es que no: los empeora. El, a priori, ilógico valor de 8500 está dentro del rango de valores que realmente evitan el popping. Y, ¿qué rango es ese? A día de hoy, nadie lo sabe. Al menos nadie en el mencionado servidor de Discord. Hay un proyecto de decompilado del juego que está a medias. Se llama OpenSWE1R y éste es su GitHub. A lo mejor el creador tiene más información. El proyecto parece más que muerto a estas alturas. Aquí un fork que lleva muerto menos tiempo.

Llegamos a la parte final del proceso. Volvemos a lanzar dentro de nuestra carpeta la ventana de CMD o de PowerShell, escribimos "node modelblock_repack.js" sin las comillas, y pulsamos Intro. Esperamos a que termine el proceso y, si todo ha ido bien, el script habrá empaquetado los 323 archivos json (modificándolos en el proceso con los valores que le hemos indicado en su código) en un nuevo archivo "out_modelblock.bin" que habrá colocado en la carpeta "out".

Por último, llevaremos dicho archivo a \ data \ lev01 en el directorio de instalación del juego. Confirmaremos que queremos sobreescribir el archivo original y, con esto, habremos terminado.


╔════════════════════════════╗
Sobre el archivo "current_control.map" custom
╚════════════════════════════╝

Se encuentra en \ data \ config \ current. Contiene nuestro esquema de control personalizado. Para comprender un poco mejor la estructura del archivo, lo abriremos con el bloc de notas. Todo lo que comienza por # es una línea comentada que el juego omitirá. Podemos ver un primer gran apartado donde se explican las correspondencias entre los valores numéricos con los que trabaja el juego (y el propio Windows) y los botones/sticks/gatillos de nuestro mando de PlayStation y Xbox. Ejemplo:

# 1 X/A - Gas <- Significa que el sistema considera que el botón n.º 1 de nuestro mando es la X del mando de PlayStation, o la A del mando de Xbox (que ese botón y no otro sea el n.º 1 no se puede cambiar, es así a nivel de sistema/protocolo. Y lo mismo con el resto de botones: el número asignado a cada uno es cosa del protocolo XInput/DirectInput) y que, en este caso, a ese botón se le asigna la acción  de acelerar. Nótese que todas estas líneas que comienzan por # son meramente informativas y no constituyen ningún comando ni setting en sí mismas. De hecho, podemos eliminarlas perfectamente. Si se incluyen es únicamente para clarificar el esquema de cara al usuario que decida abrir el archivo para echar un vistazo, como estamos haciendo.

En el siguiente bloque tenemos ya las asignaciones de botones y acciones propiamente dichos. Por ejemplo, el primero de ellos:

JOYSTICK BUTTON=1 FUNCTION=THRUST <- Significa que el juego asignará al botón 1 de nuestro joystick (X en el caso de un mando de PlayStation, A en el caso de un mando de Xbox) la función "THRUST", es decir, acelerar. Si miramos las siguientes líneas, observaremos distintos verbos para las acciones que se pueden realizar en el juego: SLIDE, BRAKE, REPAIR, LOOK_BACK, etc. Las cadenas de texto de estas acciones deben ser escritas literalmente, o el juego no las reconocerá.

Si nos fijamos un poco más abajo, tenemos las siguientes líneas:
JOYSTICK AXIS=X FUNCTION=TURN
JOYSTICK AXIS=Y FUNCTION=PITCH

El juego llama AXIS=X y AXIS=Y a los ejes X e Y del stick izquierdo de nuestro mando. En este caso, el juego asignará el giro a derecha o izquierda al eje X positivo y negativo respectivamente. En este caso, como coincide con lo esperado y con lo que queremos, no necesitamos realizar ningún ajuste adicional. Pero en el caso de la función PITCH (cabeceo, subir o bajar morro), por defecto va a signar subir morro al eje Y positivo, y bajar morro al eje Y negativo, justo al revés de lo que cabría esperar en el manejo de una aeronave. Para invertir eso, podemos ver escrito lo siguiente unas líneas más abajo:
JOYSTICK AXIS=Y FLIP_AXIS

Con eso, quedan los controles del eje invertidos.

Por último, un detalle sobre los gatillos: los dos gatillos forman parte de un único eje Z. Esto lo podemos ver gráficamente en llas propiedades del mando en el panel de control de Windows en Dispositivos e impresoras. Ignoro cuántas posiciones diferentes pueden registrar los gatillos analógicos, pero vamos a suponer que vaya de 0 a 256. Tendríamos, así, un eje que va del valor -256 al 256, pasando por el 0. Cuando no pulsamos ningún gatillo, el valor es 0, justo en el centro del eje. A medida que vamos pulsando el gatillo izquierdo, el valor se va aproximando a +256, y tenemos el siguiente comando:
JOYSTICK AXIS=Z FUNCTION=ROLL_LEFT AXIS_RANGE=POSITIVE
JOYSTICK AXIS=RZ FUNCTION=ROLL_LEFT AXIS_RANGE=POSITIVE

Que quiere decir que la nave rotará a la izquierda si el gatillo izquierdo está pulsado (range positive) y el derecho está sin pulsar (range positive).

Por otro lado, tenemos lo siguiente:
JOYSTICK AXIS=RZ FUNCTION=ROLL_RIGHT AXIS_RANGE=NEGATIVE
JOYSTICK AXIS=Z FUNCTION=ROLL_RIGHT AXIS_RANGE=NEGATIVE

Que significa que la nave rotará a la derecha si el gatillo derecho está pulsado (range negative) y el izquierdo, sin pulsar (range negative).

El archivo está editado por mí a partir del archivo descargado de este hilo de los foros de GOG. En realidad no hay archivo como tal, sino que habría que copiar-pegar el texto, el cual viene acompañado de esta imagen hecha por el creador del hilo:



╔════════════════════════════╗
Sobre el archivo "force.cfg"
╚════════════════════════════╝

Se encuentra en \ data \ config \ current. Contiene los ajustes y valores de vibración:
####### FORCEFEEDBACK SETTINGS

FORCEFEEDBACK               STRENGTH=3                  
FORCEFEEDBACK               AUTOCENTER=3                
FORCEFEEDBACK               COLLISIONS=2                
FORCEFEEDBACK               DAMAGE=2                    
FORCEFEEDBACK               TERRAIN=2                   
FORCEFEEDBACK               PODACTIONS=2                
FORCEFEEDBACK               GFORCES=ON                  
FORCEFEEDBACK               ENGINERUMBLE=OFF            
FORCEFEEDBACK               ENABLED=TRUE                

end.

Podemos modificar los ajustes desde este archivo o desde el menú de ajustes dentro del propio juego.


╔════════════════════════════╗
Sobre el mod de pantallas de fondo
╚════════════════════════════╝

Para conseguir que la imagen se vea bien una vez que el juego la estira de 4:3 a 16:9, tenemos que partir de una imagen que esté a 16:9. Si no lo está, haremos un recorte o ampliaremos por los lados o haremos lo que sea para obtener una imagen 16:9. Una vez la tengamos, se tratará de cambiarle la resolución a 640x480 (sin mantener aspect ratio, dejando que se deforme), que es la resolución que usa el juego para los fondos. Guardaremos como archivo targa a 26bit de profundidad de color. Recomiendo usar Paint.net para cambiar la resolución reescalando con Lanczos y para guardar el archivo final en formato targa. Mediante este cambio en el aspect ratio estamos haciendo la operación inversa que realiza el juego, es decir, estamos comprimiendo la proporción de la imagen de 16:9 a 4:3 para que, cuando el juego la vuelva a estirar a 16:9, se vea correctamente.


╔════════════════════════════╗
Sobre el mod de logo sin estirar
y el archivo "racer.tab"
╚════════════════════════════╝

Recomiendo realizar todo el proceso de edición de los archivos tga del título con Paint.net. Se trata de obtener archivos tga de las mismas dimensiones que los originales, pero con el texto comprimido en el eje horizontal para que el juego, una vez estirado, nos lo muestre con la propirción correcta. Para ello lo que haremos será:
  1. Ampliar el lienzo de cada archivo tga en la misma proporción en la que el juego estira la imagen (multiplicando la resolució horizontal por 4 y dividiéndola entre 3. ¿Por qué? Sencillo: 4:3 son 12:9, y para estirar 12:9 a 16:9, es decir, para transformar 12 en 16, tenemos que multiplicar 12 por 4/3. En el caso de uno de los archivos tga, si el archivo mide 144 pixels en horizontal, habría que ampliar el lienzo en horizontal hasta los 192 pixels (144x4/3). Los dos siguientes pasos se pueden realizar en orden indistinto. 
  2. Reducir la resolución horizontal de la imagen en la misma proporción. Ojo, que hablo de cambiar la resolución de la imagen, no del lienzo. En el caso de nuestra imagen de ejemplo, sería reducir la resolución horizontal de 192 a 144 pixels, sin mantener el aspect ratio. Con esto habremos comprimido la imagen horizontalmente manteniendo la resolución del archivo, que es fundamental.
  3. En el caso de la parte superior del logo, las palabras STAR y WARS están separadas en sendos archivos tga. A la hora de justificar el título, ya sea al margen izquierdo de la pantalla o a los símbolos TM del centro de la imagen, hemos de tener en cuenta que tenemos que llevarnos ambas palabras a la izquierda o a la derecha. Supongamos justificación a la izquierda: en este caso, la palabra STARS ya estará a la izquierda porque, a la hora de ampliar el lienzo como hemos hecho antes, lo habremos ampliado hacia la derecha, y no centrado. Pero en el caso de WARS veremos que la palabra completa no se puede quedar contenida en su archivo y tenemos que traspasar parte de ella al primer archivo. Como el texto está comprimido, ahora hay hueco de sobra. Parte de WARS (la W y un trozo de la A) las moveremos al primer archivo y lo que ha quedado en el segundo archivo lo moveremos a la izquierda dentro éste. En teoría de este modo no deberia notarse ninguna junta ni corte raro en la continuidad de STAR WARS, pero no siempre es así y puede que tengamos que volver a editar los archivos desplazando alguno de los dos archivos 1 pixel a la derecha o a la izquierda, o incluso eliminando, por ejemplo, la columna derecha de pixels del primer archivo.
  4. En todo caso, el paso final es guardar los cambios en nuestros archivos. Para que la transparencia se conserve y no acabemos con las zonas transparentes en un sólido color negro o blanco, simplemente nos aseguraremos de guardar como tga a 32 bits de profundidad de color.

Y ahora es cuando entra en juego el archivo "racer.tab" que contiene todos los textos del juego, y que está ubicado en la carpeta \ data. Pero mejor empiezo por el principio: en la versión original del juego, es decir, en el idioma de Shakespeare, ese archivo sencillamente no existe. Y no existe por la sencilla razón de que todo el texto se encuentra en otro sitio, presumiblemente dentro del exe. Para la traducción del juego a los diversos idiomas, los creadores idearon un sistema consistente en la presencia de un archivo de texto (nuestro archivo racer.tab) que obligaría al juego a adoptar los textos contenidos en él. Digamos que, aunque no tuviéramos los audios ni los vídeos en castellano, la simple presencia de este archivo en su carpeta nos garantiza la traducción de todos los textos del juego.

Y, ¿por qué es tan importante este archivo? Porque contiene los famosos símbolos de TradeMark y, además, permite editarlo de manera sencilla con el bloc de notas. Así que lo tenemos muy fácil: localizaremos la parte del archivo donde se encuentran los símbolos de TM que aparecen arriba del todo en la pantalla de menú principal, y los eliminaremos. Para ello, buscaremos las siguientes cadenas de texto dentro del archivo:
MONDOTEXT_H_0544 ~s#
MONDOTEXT_H_0545 ~s#

y las cambiaremos a:
MONDOTEXT_H_0544 ~s
MONDOTEXT_H_0545 ~s

Quitando simplemente ambas almohadillas "#" y guardando los cambios, haremos desaparecer de un plumazo los dos símbolos, lo que, combinado con el des-estiramiento del logo, nos puede hacer pasar de esto:


o esto:


o esto:


a esto (no te fijes en el fondo cambiado):


Además, editando el mismo archivo racer.tab podremos corregir este error en el texto:


y dejarlo así:


Para ello, simplemente cambiaremos la siguiente cadena:
SCREENTEXT_218	~f4~sVelocidad IA:

por ésta:
SCREENTEXT_218	~f4~sVeloc. IA:

En cuanto a la versión inglesa del juego, también se pueden borrar los símbolos de Trademark creando un archivo "racer.tab" en \data, que contenga únicamente estas dos líneas:
MONDOTEXT_H_0544 ~s
MONDOTEXT_H_0545 ~s


╔════════════════════════════╗
Cosas que dejo fuera por falta de tiempo
╚════════════════════════════╝

Hay una serie de mejoras que se pueden seguir haciendo, pero en las que no me voy a meter por falta de tiempo, y que tampoco considero cruciales para mejorar la experiencia de juego. Te las voy a dejar aquí relacionadas con algunos enlaces por si te sientes inspirado:
  • Nuevo reescalado de las secuencias FMV a 4K para evitar los parpadeos fugaces que suceden cuando el juego reproduce cualquiera de ellas. Como he mencionado antes, se produce ante la discrepancia de resolución entre la secuencia FMV (1080p) y el juego (2160p). Con unos archivos FMV que estén a la misma resolución a la que jugamos, no ocurre eso. Pero me da demasiada pereza iniciar todo el proceso otra vez. No es que sea demasiado costoso, y lo tengo todo explicado al detalle en esta guía, pero el tiempo que puedo dedicar a este juego, de momento, se ha agotado. Si sigo con él, ¡no termino nunca! A lo mejor después de destripar algún otro juego vuelvo a éste y reescalo las secuencias FMV de nuevo. Con un poco de suerte, Rife habrá evolucionado lo suficiente para no mostrar esos artefactos tan chungos en momentos puntuales de la intro.
  • Usar música en calidad CD (16bit 44.1kHz): requiere parchear el ejecutable del juego. En la guía "SWEP1R Audio File Guide" enseña cómo hacerlo. Te dejo un mirror aquí. Lo malo es que la música del juego, a pesar de ser la banda sonora original de John Williams, tiene unos cuantos edits y tendrás que perder tiempo si quieres dejarla igual utilizando como material de partida la edición Ultimate en 2 CDs y puede que alguna fuente más. De nuevo, la comunidad ha creado una guía llamada "SWEP1R Music Lookup", mirror aquí, donde señala el origen de los distintos cortes musicales del juego. Le faltaban algunos datos, así que he avisado al tipo que mantiene la hoja de cálculo para que los complete: el archivo "SebulbaLoop.wav" del juego no es exactamente el corte "Anakin Defeats Sebulba" de la banda sonora, pues tiene ciertas diferencias, como el uso de bongos. Se trataría de la pista "2-18 Anakin Defeats Sebulba (Alternate)", título de cue "4M2 Anakin Defeats Sebulba". Luego, en la celda J8 del Excel debería poner "The Tide Turns / The Death of Darth Maul". Además, en las celdas J12 y J13 debería decir "Fighting the Destroyer Droids". Aun si consigues rehacer los edits de las pistas musicales del juego con toda esta información, tengo entendido que el resto de archivos de audio del juego que están a 22kHz deberás convertirlos a 44.1kHz o sonarán al doble de velocidad.
  • Modificación de los sprites que aparecen en los menús con las caras de los personajes, contenidos en el archivo "out_spriteblock.bin", para que se vean sin estirar. Requiere extraer el archivo .bin como hemos hecho con "out_modelblock.bin" para modificar la distancia de dibujado. De hecho, los scripts para desempaquetar y empaquetar se descargan del mismo sitio, es decir, del GitHub de louriccia. Sería cuestión de desempaquetarlo, modificar los archivos png y volver a empaquetarlos. Te recomiendo seguir las instrucciones de empaquetado y desempaquetado del apartado "Modificación distancia de dibujado y niebla" de esta guía, así como del propio GitHub.
  • Parche de Peixoto para poder usar texturas HD: no tengo mucho interés en lo que haga este señor, la verdad, máxime con el oscurantismo que hay alrededor de su software. Antes ofrecía soporte en su hilo de Vogons, pero últimamente ya sólo lo ofrece en su Patreon, donde también está el enlace de descarga a la versión 0.10.10, la última a día de hoy, que sacó el 28 de febrero de este año 2023. Lo puedes descargar de su enlace oficial o de este mirror. Si te cuesta ver el enlace oficial, está aquí:

Y tienes una guía creada por la comunidad del juego, tanto aquí como en este mirror.
  • En el hilo de Vogons que he mencionado durante esta guía, de donde he descargado el exe modificado para soportar panorámico real HOR+ hay también una intervención de un tal masterotaku, en la que muestra una captura del juego en panorámico real con el HUD sin estirar:

El mismo masterotaku parece ser el creador de este blog donde, efectivamente, muestra el fix para el HUD con instrucciones de uso. Sin embargo, no he sido capaz de usarlo. Puedes descargarlo desde su enlace oficial o desde este mirror.
  • Hace unas semanas pregunté en la sección de modding del canal de Discord del juego acerca de la posibilidad de aumentar el nivel de detalle de los rivales al máximo en todo momento, para evitar, por ejemplo, que cuando te acercas a tus rivales su nivel de detalle aumente de repente, o disminuya cuando te alejas. LightningPirate (aka louriccia) me dio algunas pistas pero no fui capaz de completar el proceso de parcheado del ejecutable con CheatEngine. Sus indicaciones fueron:
"You can nop SWEP1RCR.EXE+6654D and get up to 6 ai pods to be full lod. More than that and the game crashes".
"If you open memory view in cheat engine right click in the upper box and hit 'go to address'. Then type in that address"
"Right click that line of code and select 'replace with code that does nothing'"


Cuando le pregunté cómo hacer esos cambios permanentes, me respondió:
"Instead of opening the live process, there should be a way to open a file in cheat engine. You can open the exe itself and find and nop those same bytes but they'll probably be offset by 400C00. Then you can save the exe"

Y eso es todo. No lo conseguí (tampoco le dediqué demasiado tiempo, desanimándome ante la falta de progreso).

Y, hablando de CheatEngine, la comunidad ha creado una tabla que se puede importar en CheatEngine para hacer modificaciones al vuelo de infinidad de parámetros como, por ejemplo, el FOV, y hacer auténticas locuras:



Si supiera cómo hacer esos cambios permanentes en el exe o, al menos, un trainer al estilo del que muestra el menú debug... Es más complicado de lo que parece, y me faltan muchos conocimientos para eso. Quizá algún día.


╔═══════════════════╗
NOTAS FINALES
╚═══════════════════╝

Pues hasta aquí hemos llegado. Como ves, he invertido cantidades ingentes de tiempo en dejar este juego en condiciones. Concretamente, las noches de mayo y junio. Y, aun así, se le puede dedicar mucho más; considero que el juego ya está perfecto así, pero siempre se pueden pulir los aspectos que hemos comentado.

Sea como fuere, lo he pasado muy bien y he aprendido muchísimo con la """remasteriación""" del juego. Lo pongo entre comillas pero realmente no lo sería tanto, dado que se ve mejor que las versiones remasterizadas de PS4 y Switch que salieron a mediados de 2020.

¡Chúpate esa, LucasArts Disney!

Comentarios

  1. Hola y buen día. He visto tu post y se nota no sólo que te has documentado a la hora de publicarlo, sino que, hasta cierto modo, el mimo puesto en él. Sobre las versiones del juego, te menciono que hizo falta una reedición que se realizó en 2021 por parte de Limited Run Games. De hecho, que existen varias reediciones de juegos clásicos de LucasArts que, no son más que reempaquetados realizados con install shield de manera oficial y ofrecidos en packs, promos por suscripción, etc., de hecho que tengo varios que obtuve con la suscripción de Humble-bundle, por ejemplo. O a través de medios digitales (compra-venta) con versiones físicas actualizadas para que se instalen en Sistemas Modernos ( te dejo el enlace aquí: https://limitedrungames.com/es/collections/star-wars-episode-i-racer/products/star-wars-episode-i-racer-pc-classic-edition ). A decir verdad, me gusta más esta versión que la de GOG y, sí bien, el único problema es que viene en idioma angloparlante, se resuelve con la traducción que esta disponible en Steam. Tampoco he hecho muchas pruebas al respecto, a decir verdad. En fin, sólo deseaba contribuir con tú blog al mencionar esta versión tan particular y libre de esa basura (entre lo que destaca la publicidad de la versión DRM-Free de GOG). De igual, manera esta es una versión libre de DRM y, pues, dentro de la imagen de disco sólo se encuentra el archivo *.exe con el instalador (de unos 546MB) y el manual en inglés en formato *.pdf. Finalmente, funciona de perlas en Windows 11 (x64) que es mí Sistema actual. Eso, como datos extras que puedan servir de algo, sí no sirve pues, siéntete en la libertad de omitirlo. Un abrazo y éxitos.

    ResponderEliminar
    Respuestas
    1. Hola, gracias por pasarte. De hecho, tengo la versión big box de limited run games pero nunca la he probado. ¿Tiene algún tipo de mejora aparte del instalador compatible con sistemas modernos? ¿Qué ventajas tiene respecto a la versión de GOG? Esta última funciona correctamente en Windows 11. Todo lo demás son manías mías para sacarle el máximo jugo gráfico.

      Eliminar

Publicar un comentario