Legend of Zelda Ocarina of Time en Linux

Como todo millenial nostálgico, a veces me da por jugar los juegos de mi época, de hecho Derek y Danté los disfrutan de vez en cuando, ya sea en mi vieja consola Nintendo 64 o en el Super Nintendo.

Hace algún tiempo venía dando seguimiento al proyecto ZeldaRET, un equipo coordinado de voluntarios que trabajan decompilando distintas versiones de la saga Legend of Zelda. Es importante decir que este equipo no está haciendo un port, sino una base de código que al compilar produce un archivo que es equiparable byte por byte a la ROM original. Esto no es emulación como hace tiempo se hace con Project64, Mupen64plus, etc. Esto es un trabajo de ingeniería inversa voluntario que produce una ROM que se podría jugar en la consola original.

Este esfuerzo en decompilación ha servido a otros proyectos e inspirado a otros a crear ports nativos para diferentes plataformas. En especial como usuario de Arch Linux y Fedora le tengo el ojo puesto a dos proyectos, a los cuales he dejado pasar algo de tiempo para que mejoren y añadan características respecto a su lanzamiento inicial, estos son: Ship of Harkinian y Open Ocarina.

De Open Ocarina, se puede destacar que fueron los primeros en soportar nativamente un framerate de 60 fps y los primeros en hacer público su port (febrero 2022), pero a lo largo del tiempo Ship of Harkinian (cuyo primera versión se hizo pública en abril 2022) ha terminado enriqueciendo mucho más su port del juego, por lo que finalmente me he decantado por esta versión. Respecto a Open Ocarina he observado en su repositorio múltiples issues que aún no han sido resueltos y algunos merge-request que solucionan problemas pero que no están integrados al código aún, mucho menos movimiento comparado a Ship of Harkinian.

Parecerá que hay algo de ilegal aquí, pero realmente ambos proyectos no tienen nada de la propiedad intelectual de Nintendo, es código creado por muchas personas que se distribuye bajo los principios del software libre y código abierto. Espero que el todopoderoso equipo legal de Nintendo no se vaya a poner creativo y venga a cortar la cabeza de personas que realmente solo tienen el interés de revivir momentos nostálgicos y encarnar al héroe del tiempo una vez más.

Por otro lado, la ROM es la que tiene el contenido del juego en sí volcado como un archivo único extraído del cartucho para propósitos de respaldo. Así como todos hacemos 😉 con el método de conectar el cartucho gameshark al N64, luego conectarlo por el puerto serial a la computadora que uno tiene con Windows 98, hay otros colegas que usan el Dr V64 conectado por serial de la misma forma. Existen asimismo opciones más recientes para los aventureros y manitas en electrónica con Arduino como estos interesantes planteamientos de Hackaday usando un 64drive o el Open Source Cartridge Reader.

Hasta anoche, que logré obtener mi volcado del cartucho 😉, me dispuse a instalar Ship of Harkinian en la Thinkpad X230 (Intel Core i5-3320M / 16 GB RAM / 256 GB SSD) con Fedora 37 de Derek. En principio, como no soy muy partidario de los paquetes flatpak, snap, appimage y similares; abandoné está idea y tome la ruta larga.

Opción No. 1: compilar manualmente

Debería ser la 2, pero como iba escribiendo la entrada a medida que avanzaba la dejé tal cual. Para esta opción hay que instalar toda la paquetería y dependencias necesarias para compilar una versión jugable de Legend of Zelda Ocarina of Time. La PC de Derek, viene trabajando con Fedora 35 desde que abandonó Pop OS! y ha evolucionado hasta la actual Fedora 37.

Este método fue ensayo – error, pero como soy terco y obstinado di y di hasta que logré compilarlo limpiamente. Lo primero fue instalar lo necesario en cuanto a paquetes recomendados por el equipo de desarrollo, pero me topé con que hacían falta otros que iba añadiendo a medida que trataba de compilarlo y chocaba con un error. Al final terminé instalando todos estos.

1
sudo dnf install meson ninja-build glew-devel zlib-devel libpng-devel libXrandr-devel libXinerama-devel libXcursor-devel libXi-devel SDL_net-devel SDL_net SDL-devel SDl2-devel SDL2_net SDL2_net-devel SDL2_sound SDL2_sound-devel SDL2_image SDL2_image-devel SDL2_gfx-devel SDL2_image-devel

Como se puede ver hay una fuerte dependencia de librerías de X.org, aunque también creo que de ese listado de paquetes debe haber varios que eran innecesarios sobre todo en las librerías de SDL2. Recordemos que Fedora 37 viene por defecto con wayland y pipewire para el audio, este último fue problema también por dependencias de pulseaudio. Lo solucioné con:

1
sudo dnf install pipewire-pulseaudio pulseaudio-libs-devel

Como se que todos tenemos el cartucho de Legend of Zelda, específicamente la versión de desarrollo europea del GameCube 😉, les comparto el enlace para que no pasen las penurias del procedimiento para obtener la ROM y puedan traer los assets del juego para integrarlos en Ship of Harkinian que solo funciona con 3 ROMs específicas de manera oficial, una de ellas es versión Master Quest pero no la incluí en estos enlaces.

Ocarina of Time (Europe) (Debug) (GameCube) (la recomendada)

Ocarina of Time (Europe) (GameCube)

Ahora sí, hora de descargar el repositorio y módulos adicionales…

1
2
3
git clone https://github.com/HarbourMasters/Shipwright.git
cd Shipwright
git submodule update --init

Extraer assets para generar archivo OTR. Reemplazar {ROM} con la ROM que vayamos a usar.

1
2
3
cp {ROM} OTRExporter
cmake -H. -Bbuild-cmake -GNinja
cmake --build build-cmake --target ExtractAssets

Y compilar…

1
cmake --build build-cmake

En este punto, ya Ship of Harkinian era jugable desde el directorio de trabajo bajo este comando.

1
./build-cmake/soh/soh.elf

Una opción que consideré en su momento fue crear un paquete RPM, pero está se instala en el directorio /opt y por temas de permisos más que todo, no funciona adecuadamente, pues necesita permisos de escritura (se la pasa tratando de generar el archivo OTR). Me limité a moverlo a una carpeta oculta dentro del /home de Derek.

Pero tenía curiosidad por como funcionaba la versión AppImage, después de todo es un solo archivo. Me aventuré a experimentar.

Opción No. 2: el método oficial

En el canal oficial de Discord del equipo detrás de Ship of Harkinian, se liberan los binarios actualizados de manera regular. Para distros Linux, tenemos archivos AppImage que funcionan con «cualquier distro».

Como me gusta mantener en orden las cosas, me pareció mejor trabajarlo todo en el directorio de usuario como una carpeta oculta desde el principio.

1
2
cd ~
mkdir .soh

Nunca había tenido la necesidad de emplear un AppImage porque no había tenido la necesidad. En el canal de Discord de SoH la versión actual (abril 2023) en #download se llama Khan-Charlie. Solo hay que descargarlo.

Revisando un poco vemos un readme.txt cuyo contenido es el mismo que vemos en el README.md que hay en el repositorio en Github y el archivo AppImage que sería la aplicación empaquetada.

1
2
3
4
5
6
7
8
unzip -l SoH-Khan-Charlie-Linux-Compatibility.zip
Archive:  SoH-Khan-Charlie-Linux-Compatibility.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
    10160  04-02-2023 20:00   readme.txt
 12428480  04-02-2023 20:00   soh.appimage
---------                     -------
 12438640                     2 files

Extraemos el contenido hacia el directorio de trabajo oculto.

1
unzip -j SoH-Khan-Charlie-Linux-Compatibility.zip -d ~/.soh

Ahora añadimos cualquiera de las ROM que están arriba dentro del mismo directorio.

1
cp {ROM} ~/.soh

Ahora damos permiso de ejecución al AppImage, y lo ejecutamos.

1
2
3
cd .soh
chmod +x soh.appimage
./soh.appimage

La primera vez, se generara el archivo OTR, proceso que tardará unos minutos. Al finalizar, volvemos a ejecutar el AppImage y ya veremos a Link aproximarse en el lomo de Epona en el horizonte del Campo de Hyrule.

Extras

Lanzador de aplicación

Como Ship of Harkinian queda fuera de la vista al colocarlo en un directorio oculto, necesitaba darle a Derek un lanzador para que pudiera iniciar el juego. Para ello, crearemos un archivo en .local/share/applications/.

1
touch .local/share/applications/soh.desktop

Añadimos este contenido

1
2
3
4
5
6
7
8
[Desktop Entry]
Name=
Comment=
Exec=
Icon=
Terminal=
Type=
Categories=

Lo primero que necesitamos es un ícono reconocible y relacionado al juego. Podría haber usado el ícono del barco que trae Ship of Harkinian, pero decidí lanzarme a la búsqueda de un ícono memorable, solo necesitaba que fuera una imagen PNG de 512×512 píxeles. Una búsqueda en Google me llevo a seleccionar estas imágenes, al final me decanté por el ícono de la ocarina. He creado un zip con los íconos transparentes en tamaño 512×512 píxeles.

Mi selección de íconos

Luego me enfrentaba al dilema de las rutas relativas dentro de los lanzadores en la línea Exec del archivo .desktop.

Leí varios foros de comunidades, Reddit, stackoverflow y ninguna de las soluciones propuestas me permitían usar rutas relativas dentro del archivo, ya que es un problema inherente al estándar. Después de varias horas pensando como hacerlo, se me ocurrió escribir un pequeño script bash dentro del directorio oculto para solucionarlo.

Lo que se hace el script bash es: moverse al directorio oculto de Ship of Harkinian y ejecutar la appimage. Voilá, funciona. La única pega es que se abre una terminal detrás del juego, pero añadiendo exit al final de la línea, está se cierra automáticamente al cerrar el juego.

1
2
#!/bin/bash
cd /home/usuario/.soh && ./soh.appimage && exit

Finalmente el lanzador ha quedado así:

1
2
3
4
5
6
7
8
[Desktop Entry]
Name=Legend of Zelda: Ocarina of Time
Comment=Port para PC del popular juego de Nintendo 64
Exec=sh -c '/home/usuario/.soh/launcher.sh'
Icon=/home/usuario/.soh/icon-oot-ocarina.png
Terminal=false
Type=Application
Categories=Games;

Así, queda todo más elegante y Derek le puede presumir a sus amiguitos el pequeño iconito de la ocarina en el cajón de aplicaciones de Gnome Shell.

El codiciado juego en el cajón de aplicaciones de Gnome Shell

Traducción

Este paso extra coloca los diálogos en español, sin embargo no es reconocido como un idioma adicional en la aplicación, solo los que ya trae la ROM europea original inglés, alemán y francés. Para lograr este cometido lo que ocurrirá será que extraeremos los diálogos en español de una ROM traducida. De manera no oficial circulan por internet algunas ROMS ya parchadas como la de Toruzz. En este punto Open Ocarina los supera al haber separado un área para internacionalización con archivos .po, pero supongo que es cuestión de tiempo que implementen esta característica en Ship of Harkinian.

Desconozco cual es esta versión traducida, pero dejo aquí el zip con la ROM para extraer el idioma. Eso sí he observado algunas pequeñas fallas con acentos y letras que sobresalen de la caja de texto.

Para extraer los diálogos, usaremos el OTRMod de Amaro Martínez en su versión web. Una herramienta online que nos permitirá extraer en un solo archivo los diálogos de la ROM que usemos. Tardará unos segundos en subir el archivo y en dejarte descargar el archivo modificado para usar.

OTRMod Web

Ahora dentro del directorio donde tenemos Ship of Harkinian, creamos uno llamado mods (específicamente en minúsculas). Dentro colocamos el archivo que nos generó la herramienta OTRMod. Al lanzar el juego veremos que ahora los diálogos están en español.

Hay un pequeño glitch al inicio en la pantalla de intro, cuando está cargado el mod de idioma aparece un gráfico alterado donde debería decir «© 1998, 2003 Nintendo», supongo que esto ocurre porque la ROM de donde extraímos el texto es versión USA 1.0 y esta dice «© 1998 Nintendo».

Alguna vez en mi vida recuerdo haber parchado una rom para traducirla, no era muy complicado, solo era cuestión de tener los scripts y la ROM específica con la cual funcionaba el script. De todas las versiones que hay en español, la traducción de eduardo_a2j, es la más completa y para fortuna nuestra en español latino neutro. Me queda pendiente parchear una ROM con esta traducción y extraerlo como expuse para usarlo como mod.

Mejoras útiles

Con Ship of Harkinian puedes jugar como si se tratara de tu vieja Nintendo 64, o puedes utilizar algunas pequeñas mejoras de las que trae. Mencionaré las opciones que tengo activas y los atajos que más uso.

F1: la tecla F1 esconde / muestra el menú de Ship of Harkinian.

F5: guarda la partida actual en una instantánea.

F7: carga la partida guardada con la tecla anterior. Tanto está opción como la anterior, las utilizo poco ya que he empezado a usar el modo autosave.

F10: el modo para jugar a pantalla completa estando en alguna distro Linux.

Framerate a 60 FPS: muy útil, muy moderno y le quita esa apariencia laggy que tiene el original. Se activa en Enhancements > Frame Interpolation, en la barra de esa opción la movemos para escoger el framerate deseado.

Velocidad de subida por escaleras / enredaderas: para subir más rápido escaleras y enredaderas. Se activa en Enhancements > Gameplay > Time Savers > Vine/ladder climb speed, en la barra selecciono un +2 ó +3 de velocidad.

Kaepora Gaebora que no tortura: para que la respuesta predeterminada cuando hablas con el buho Kaepora Gaebora sea «Si, entendí». Se activa en Enhancements > Gameplay > Time Savers > Better owl.

Hay muchas más opciones disponibles, pero por el momento solo uso estas. Hay también un menú de cheats enorme, pero prefiero jugarlo a mi manera con el mínimo de ayudas.

Playtest

Conecte mi viejo mando Logitech F310 a la PC de Derek, y la magia ocurrió a continuación. El mando funcionó a la perfección sin hacer ajustes. Por supuesto, Ship of Harkinian trae un menú para cambiar las opciones predeterminadas del control o remapear botones.

Y así jugué cerca de la medianoche… creo yo que tal vez una media hora… hasta que volví a ver la majestuosidad del Campo Hyrule luego de salir del Bosque Kokiri y de recibir el sermón habitual de Kaepora Gaebora.

Conclusiones

Este tipo de proyectos abre la puerta a toda una serie inimaginable de cosas que se podrían hacer con este juego ahora, hasta ahora tenemos soporte nativo de resoluciones hasta 4K en lugar de la 240p del Nintendo 64 original, el juego corriendo a más de 60 FPS como la seda en lugar de los 20 FPS del cartucho original. Hay solicitudes pidiendo soporte multiplayer, en red, editor de mapas, etc. Como esta entrada termino siendo una guía de instalación, es posible que con el tiempo quede desactualizada, por lo que siempre es mejor ver la documentación oficial.

Existió un tiempo en nuestra vieja HP Pavilion 6736 (Intel Celeron 667 MHz / 64 MB RAM / 30 GB HDD) con Windows ME, que cuando usábamos Project64 para correr Legend of Zelda Ocarina of Time que la PC literal tosía sangre (como dice mi hermano) y a dura penas podía correr el juego. Y pensar que la consola apenas se maneja con 4 MB de RAM y un procesador de 93.7 MHz. Esto contrasta con el impacto en Fedora corriendo en modo nativo, luego de una partida de aproximadamente una hora durante el monitoreo he observado que el consumo de RAM se mantiene cerca de xx MB con un uso de CPU y carga media de .

Hasta aquí la entrada y gracias por leerme, quedará para después contenido sobre cómo añadir mods, texturas y otras hierbas cuando tenga algo de tiempo. Mientras, me iré con Derek a luchar contra Ganondorf una vez más.


Moisés Serrano Samudio Médico de atención primaria, fotógrafo aficionado, apasionado de las tecnologías relacionadas con el EdTech y el eHealth y diseñador/desarrollador de sitios web de salud. Médico, apasionado del EdTech/eHealth y diseñador/desarrollador de sitios web de salud.
Moisés Serrano Samudio

@linkmoises

Médico de atención primaria, fotógrafo aficionado, apasionado de las tecnologías relacionadas con el EdTech y el eHealth.

Entradas relacionadas

Comentarios

  1. El procedimiento para extraer la i18n de la ROM de toruzz es exactamente el mismo y al menos de este lado del mundo los pocos gatos que somos, cerca de unos 650 millones, la preferencia va por ahí… Casi nadie contra los 47 millones de habitantes de nuestra madre patria España…

Deja una respuesta

Su email no será publicado. Required fields are marked *