quarrel07 8629bec320 Fix the warning-flagged real bugs across the codebase (#691, 1 of 3) (#725)
* menu_items: fix the real-bug-tier compiler warnings (#691 batch 1)

Six fixes, all in menu_items.c, all verified by menu playtest on macOS:

- BSWAP16(*color0++) advanced the pointer twice per pixel on little-endian
  builds (the macro evaluates its argument twice) and mixed bytes from two
  different pixels. Read first, increment separately. Note: this function
  (func_8009A9FC) currently has no callers, so the corruption was latent,
  not live.
- func_8009B9D0 fell off the end on a lookup miss, returning garbage (the
  existing code comment already suspected this). The miss path now returns
  the display list head unchanged, i.e. draws nothing.
- update_ok_menu_item read an uninitialized stack slot for unknown menu
  item types; now selects an explicit no-animation value, matching what
  the garbage read did in practice.
- pause_menu_item_box_cursor: removed the three empty 'if (x2);' matching
  artifacts. The x/y/z spin state itself is untouched.
- func_800A1FB0: initialized var_s4/var_s5 against the guarded-but-warned
  switch default.
- func_800A54EC: initialized the pause cursor position pointer against its
  unreachable mode-switch default (would have been a null-deref class bug
  if mode values ever grew).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* collision: define the G_ENDDL opcode shifts, return 0 when no tyre surface found

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* replays: cast staff-ghost pointer comparisons, return 0 for empty ghost buffer

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* update_objects: return 0 from conditional step helpers, fix TLUT pointer comparison, init train draw distances

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* render_player: remove the impossible lamp range (vanilla bug, never glowed on N64 either)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* math_util_2: return the vector, not the address of the parameter slot

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Crab: remove inner declaration shadowing the initialized objectIndex

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* editor: honor InverseMatrix failure (bool was compared against 2, always true)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Track.h: drop dead null checks on array members

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* shells: drop always-true angle and surface gates (behavior unchanged, s16 made them tautological)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* particles: make the no-return particle setters void

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* effects/stubs/skybox/main: align signatures with functions that return nothing

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* menus/save: type the pak status variable as s32, return BAD_READ on the fall-off path

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* audio: remove uninitialized-read matching artifacts, init isSound

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* code_80005FD0/code_80086E70: init dead bomb kart pointer and the no_init variable

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* port/engine UI: fix printf-style format types and non-literal format string

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* render_objects: feed the unused texture param to the uninitialized img walker

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Format the changed lines per .clang-format

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Address review: strip explanatory comments, drop vec3f pointer returns

Comments moved to the PR record; the one flagged worth keeping stays.
vec3f_set_xyz/normalize/cross_product return void now since the out
argument is the interface and nothing used the pointer.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Update actors_extended.c

* Add checkbox for 'Shells Shoot Straight' option

* Update render_player.c

* Update PortMenu.cpp

* Update render_player.c

* Update actors_extended.c

* Update render_player.c

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: MegaMech <MegaMech@users.noreply.github.com>
2026-08-01 22:29:56 -06:00
2026-05-03 02:13:30 +02:00
2026-05-03 02:13:30 +02:00
2025-05-14 18:30:32 -06:00
2025-02-07 23:48:36 -07:00
2026-07-22 18:02:58 -06:00
2025-12-22 14:48:07 -07:00
2024-08-27 17:47:39 -06:00
2022-05-14 15:12:32 -07:00
2022-06-15 17:26:03 -07:00
2026-04-07 13:10:53 -06:00
2025-06-16 16:33:31 -06:00
2025-06-20 16:54:31 -06:00
2025-03-07 18:32:15 -06:00
2024-04-12 19:16:13 -06:00
2026-03-24 12:34:15 -06:00
2026-08-01 12:25:06 -06:00
2025-06-20 16:54:31 -06:00
2025-05-14 18:30:32 -06:00
2025-06-20 16:54:31 -06:00

Spaghetti Kart Spaghetti Kart

Discord

Official Discord: https://discord.com/invite/shipofharkinian

If you're having any trouble after reading through this README, feel free ask for help in the SpaghettiKart Support text channels. Please keep in mind that we do not condone piracy.

Quick Start

SpaghettiKart does not include any copyrighted assets. You are required to provide a supported copy of the game.

1. Verify your ROM dump

The US ROM is the only supported version. You can verify you have dumped a supported copy of the game by using the SHA-1 File Checksum Online at https://www.romhacking.net/hash/. The hash for a US ROM is SHA-1: 579C48E211AE952530FFC8738709F078D5DD215E.

2. Verify your ROM is in .z64 format

Your ROM needs to be in .z64 format. If it's in .n64 format, use the following to convert it to a .z64: https://hack64.net/tools/swapper.php

2. Download SpaghettiKart from Releases

3. Generating the O2R from the ROM

Windows

  • Extract every file from the zip into a folder of your choosing.
  • Run "Spaghettify.exe" and select your US ROM.

Linux

  • Extract every file from the zip into a folder of your choosing.
  • Ensure zenity or kdialog package is installed.
  • Run "spaghetti.appimage" and select your US ROM. You may have to chmod +x the appimage via terminal.

Nintendo Switch

  • Run one of the PC releases to generate an mk64.o2r file. After launching the game on PC, you will be able to find these files in the same directory as Spaghettify.exe or spaghetti.appimage.
  • Copy the files to your sd card

4. Play

  • Launch Spaghettify.exe Congratulations, you are now sailing with SpaghettiKart! Have fun!

Configuration

Default controls configuration

N64 A B L R Z Start Analogue stick C buttons D-Pad
Keyboard Shift Ctrl Q Space Z Enter Arrow keys TGFH (↑ ↓ ← →) Num 8 2 4 6
SDL Gamepad A X LB RB LT Start L-Stick R-Stick Up, B, Y, R-Stick Right (↑ ↓ ← →) D-Pad

Other shortcuts

Keys Action
F11 Fullscreen
Tab Toggle Alternate assets
Ctrl+R Reset
Esc Settings

Graphics Backends

Currently, there are three rendering APIs supported: DirectX11 (Windows), OpenGL (all platforms), and Metal (macOS). You can change which API to use in the Settings menu of the menubar, which requires a restart. If you're having an issue with crashing, you can change the API in the spaghettify.cfg.json file by finding the line "Backend":{... and changing the id value to 3 and set the Name to OpenGL. DirectX 11 with id 2 is the default on Windows. Metal with id 4 is the default on macOS.

Modding

Custom assets are packed in .o2r or stored .zip files. To use custom assets, place them in the mods folder.

There is an official gamebanana page.

If you're interested in creating and/or packing your own custom asset .o2r files, check out the documentation page.

Note that .otr archives are not supported in SpaghettiKart!

Development

Building

If you want to manually compile SpaghettiKart, please consult the building instructions.

Playtesting (nightly)

If you want to playtest a continuous integration build, you can find them at the links below. Keep in mind that these are for playtesting only, and you will likely encounter bugs and possibly crashes.

Maintainers: MegaMech, Coco, Kirito

Powered by libultraship
S
Description
No description provided
Readme 628 MiB
Languages
C 83.8%
C++ 13.7%
Python 1.1%
CMake 0.8%
Assembly 0.3%