This page looks best with JavaScript enabled

Native MarioKart64 on Linux

 ·  🎃 kr0m

This time we’re going to use the decompilation of the MarioKart64 game to install it, which will let us enjoy the title at 60FPS.

Index:


Installation:

There is a precompiled binary release for Linux, so we just need to make sure we have the only ROM supported .

Download the binary from the project’s GitHub and unzip it:

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

Check the SHA1 hash of the ROM:

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

It is indeed one of the supported versions, so move the ROM to the directory where we extracted the binary:

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

Run the binary:

./spaghetti.appimage

When asked whether to generate the O2R, answer yes and select the ROM:

This screenshot shows the game running — of course, you can play in fullscreen mode.

By the way, the Xbox controller works flawlessly.


Compilation:

If the precompiled binary causes issues, we can build it ourselves . However, in my case it was impossible, as it appears to be bugged by overwriting methods across different files in the project:

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.
...
ninja: build stopped: subcommand failed.

Another option is to use Docker , but it compiles against the library versions inside the Docker image, so it didn’t work for me:

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