Esta pagina se ve mejor con JavaScript habilitado

MarioKart64 nativo en Linux

 ·  🎃 kr0m

En esta ocasión vamos a hacer uso de la decompilación del juego MarioKart64 para instalar dicho juego, lo que nos permitirá disfrutar del título a 60FPS.

Índice:


Instalación:

En principio hay una versión precompilada del binario para Linux, así que tan solo debemos asegurarnos de tener la única ROM soportada .

Nos bajamos el binario desde el GitHub del proyecto y lo descomprimimos:

unzip Spaghettify-Alfredo-Alfa-1-Linux-Old.zip

Comprobamos el hash SHA1 de la ROM:

sha1sum ~/Mario\ Kart\ 64\ \(USA\).z64
579c48e211ae952530ffc8738709f078d5dd215e  /home/kr0m/Mario Kart 64 (USA).z64

Efectivamente es una de las versiones soportadas, movemos la ROM al directorio donde hemos descomprimido el binario:

mv ~/Mario\ Kart\ 64\ \(USA\).z64 ./

Ejecutamos el binario:

./spaghetti.appimage

Cuando nos pregunte si generar el O2R, respondemos que si y seleccionamos la ROM:

En esta captura se puede ver el juego, por supuesto se puede jugar a pantalla completa.

Por cierto el mando de Xbox funciona de maravilla.


Compilación:

Si el binario precompilado dá problemas en principio podemos compilar nosotros mismos el software. Pero en mi caso ha sido imposible, parece estar bugeado sobreescribiendo métodos entre distintos ficheros del proyecto:

In file included from /home/kr0m/SpaghettiKart/src/port/ui/Menu.h:5:
/home/kr0m/SpaghettiKart/src/port/ui/UIWidgets.h:155:26: error: declaration of ‘UIWidgets::CheckboxOptions& UIWidgets::CheckboxOptions::ComponentAlignment(UIWidgets::ComponentAlignment)’ changes meaning of ‘ComponentAlignment’ [-fpermissive]
  155 |         CheckboxOptions& ComponentAlignment(ComponentAlignment alignment_) {
      |                          ^~~~~~~~~~~~~~~~~~
/home/kr0m/SpaghettiKart/src/port/ui/UIWidgets.h:102:10: note: ‘ComponentAlignment’ declared here as ‘enum UIWidgets::ComponentAlignment’
  102 |     enum ComponentAlignment {
      |          ^~~~~~~~~~~~~~~~~~
/home/kr0m/SpaghettiKart/src/port/ui/UIWidgets.h:159:26: error: declaration of ‘UIWidgets::CheckboxOptions& UIWidgets::CheckboxOptions::LabelPosition(UIWidgets::LabelPosition)’ changes meaning of ‘LabelPosition’ [-fpermissive]
  159 |         CheckboxOptions& LabelPosition(LabelPosition labelPosition_) {
      |                          ^~~~~~~~~~~~~
/home/kr0m/SpaghettiKart/src/port/ui/UIWidgets.h:94:10: note: ‘LabelPosition’ declared here as ‘enum UIWidgets::LabelPosition’
   94 |     enum LabelPosition {
      |          ^~~~~~~~~~~~~
/home/kr0m/SpaghettiKart/src/port/ui/UIWidgets.h:189:26: error: declaration of ‘UIWidgets::ComboboxOptions& UIWidgets::ComboboxOptions::ComponentAlignment(UIWidgets::ComponentAlignment)’ changes meaning of ‘ComponentAlignment’ [-fpermissive]
  189 |         ComboboxOptions& ComponentAlignment(ComponentAlignment alignment_) {
      |                          ^~~~~~~~~~~~~~~~~~
/home/kr0m/SpaghettiKart/src/port/ui/UIWidgets.h:102:10: note: ‘ComponentAlignment’ declared here as ‘enum UIWidgets::ComponentAlignment’
  102 |     enum ComponentAlignment {
      |          ^~~~~~~~~~~~~~~~~~
/home/kr0m/SpaghettiKart/src/port/ui/UIWidgets.h:193:26: error: declaration of ‘UIWidgets::ComboboxOptions& UIWidgets::ComboboxOptions::LabelPosition(UIWidgets::LabelPosition)’ changes meaning of ‘LabelPosition’ [-fpermissive]
  193 |         ComboboxOptions& LabelPosition(LabelPosition labelPosition_) {
      |                          ^~~~~~~~~~~~~
/home/kr0m/SpaghettiKart/src/port/ui/UIWidgets.h:94:10: note: ‘LabelPosition’ declared here as ‘enum UIWidgets::LabelPosition’
   94 |     enum LabelPosition {
      |          ^~~~~~~~~~~~~
/home/kr0m/SpaghettiKart/src/port/ui/UIWidgets.h:243:27: error: declaration of ‘UIWidgets::IntSliderOptions& UIWidgets::IntSliderOptions::ComponentAlignment(UIWidgets::ComponentAlignment)’ changes meaning of ‘ComponentAlignment’ [-fpermissive]
  243 |         IntSliderOptions& ComponentAlignment(ComponentAlignment alignment_) {
      |                           ^~~~~~~~~~~~~~~~~~
/home/kr0m/SpaghettiKart/src/port/ui/UIWidgets.h:102:10: note: ‘ComponentAlignment’ declared here as ‘enum UIWidgets::ComponentAlignment’
  102 |     enum ComponentAlignment {
      |          ^~~~~~~~~~~~~~~~~~
/home/kr0m/SpaghettiKart/src/port/ui/UIWidgets.h:247:27: error: declaration of ‘UIWidgets::IntSliderOptions& UIWidgets::IntSliderOptions::LabelPosition(UIWidgets::LabelPosition)’ changes meaning of ‘LabelPosition’ [-fpermissive]
  247 |         IntSliderOptions& LabelPosition(LabelPosition labelPosition_) {
      |                           ^~~~~~~~~~~~~
/home/kr0m/SpaghettiKart/src/port/ui/UIWidgets.h:94:10: note: ‘LabelPosition’ declared here as ‘enum UIWidgets::LabelPosition’
   94 |     enum LabelPosition {
      |          ^~~~~~~~~~~~~
/home/kr0m/SpaghettiKart/src/port/ui/UIWidgets.h:298:29: error: declaration of ‘UIWidgets::FloatSliderOptions& UIWidgets::FloatSliderOptions::ComponentAlignment(UIWidgets::ComponentAlignment)’ changes meaning of ‘ComponentAlignment’ [-fpermissive]
  298 |         FloatSliderOptions& ComponentAlignment(ComponentAlignment alignment_) {
      |                             ^~~~~~~~~~~~~~~~~~
/home/kr0m/SpaghettiKart/src/port/ui/UIWidgets.h:102:10: note: ‘ComponentAlignment’ declared here as ‘enum UIWidgets::ComponentAlignment’
  102 |     enum ComponentAlignment {
      |          ^~~~~~~~~~~~~~~~~~
/home/kr0m/SpaghettiKart/src/port/ui/UIWidgets.h:302:29: error: declaration of ‘UIWidgets::FloatSliderOptions& UIWidgets::FloatSliderOptions::LabelPosition(UIWidgets::LabelPosition)’ changes meaning of ‘LabelPosition’ [-fpermissive]
  302 |         FloatSliderOptions& LabelPosition(LabelPosition labelPosition_) {
      |                             ^~~~~~~~~~~~~
/home/kr0m/SpaghettiKart/src/port/ui/UIWidgets.h:94:10: note: ‘LabelPosition’ declared here as ‘enum UIWidgets::LabelPosition’
   94 |     enum LabelPosition {
      |          ^~~~~~~~~~~~~
In file included from /home/kr0m/SpaghettiKart/src/engine/courses/Course.h:5:
/home/kr0m/SpaghettiKart/src/engine/CoreMath.h:134:24: warning: ‘nodiscard’ attribute applied to ‘void IRotator::Set(uint16_t, uint16_t, uint16_t)’ with void return type [-Wattributes]
  134 |     [[nodiscard]] void Set(uint16_t p, uint16_t y, uint16_t r) {
      |                        ^~~
ninja: build stopped: subcommand failed.

Hay otra opción que es utilizar Docker , pero compila contra las versiones de las librerías de la imagen de Docker así que a mí no me sirvió de nada:

/build-cmake/Spaghettify
./build-cmake/Spaghettify: error while loading shared libraries: libspdlog.so.1: cannot open shared object file: No such file or directory