summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
20 hoursMerge branch 'main' into Caladius-patch-1Caladius-patch-1MegaMech
21 hoursMechanical compiler warning cleanup across the game C code (#691, 2 of 3) (#736)quarrel07
* spawn_players: cast player flag combinations to s16 explicitly The PLAYER_* flag defines OR into values with bit 15 set; assigning them to s16 fields wraps to the intended negative value. The casts make that explicit (82 warnings, no behavior change). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * render_objects: mechanical warning cleanup uintptr_t casts for display list macro args, u8* casts for asset name pointers, UNUSED on decomp-preserved dead locals and params, one loop index sign fix. 75 warnings, no behavior change. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * update_objects: mechanical warning cleanup (42 warnings, casts and UNUSED) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * menu_items: mechanical warning cleanup (50 warnings, casts and UNUSED) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * stubs, kart_dma: mechanical warning cleanup (43 warnings) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * code_80057C60, audio/external: mechanical warning cleanup (113 warnings) Includes two decomp artifacts worth noting: a comma operator inside an array index ([0, soundIndex] indexed only soundIndex) and a no-op for init clause, both formerly needed for byte-matching. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * some_data, actors, code_8006E9C0, code_80005FD0, main, render_player, mixer, skybox, load: mechanical warning cleanup (111 warnings) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Remaining game C files: mechanical warning cleanup to zero 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> * ending: fix the bcopy shim reversing its arguments The port shimmed bcopy to memcpy, but bcopy takes (src, dst) and memcpy takes (dst, src), so every call through the shim copied backwards. The one call site is the debug character switch in the ceremony cutscene, which is meant to reset gCharacterIdByGPOverallRank to defaultCharacterIds. Instead it overwrote the default table with the current standings, so the reset never happened and the defaults were clobbered for later use. Reachable only with gEnableDebugMode on and all D-pad plus C buttons held. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Address review: delete dead port helper, widen D_8015F718, comment out size lookup get_texture2 was port-added and has no callers, so it goes away rather than wearing the decomp UNUSED tag. D_8015F718 holds pointers, so it is uintptr_t now. The kart_dma size lookup is commented out instead of annotated. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * menu_items: replace func_80097274 with the matched decomp version Straight copy of the matched function; the NON_MATCHING guard and GLOBAL_ASM fallback go away with it. The matched body also uses the (u32) comparison forms, which keeps it warning-clean. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Update menu_items.c * Address review round 2: audio loop form, cast collapse, dead code removal func_800C3478 takes the while form; the (s8*)(u8*) stacks collapse to one cast (40 sites); func_800BA8B0 and clamp32 go away (no callers); gCourseOutlineTextures is const char* so its casts vanish; the podium test line and render_screens matrix line are gone; set_screen keeps its refactoring breadcrumbs commented out; the display-list walker is reverted to the vanilla form as requested, which brings its one shift-negative warning back; gCurrentlyLoadedTrackAddr defaults to 0. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Address review round 3: endianness.h byteswap, size_t indices, stub pragma BSWAP16 now comes from libultraship's endianness.h on little-endian targets, whose builtin returns u16 and needs no casts at the data.c initializers. The intrinsic pragmas leave the repo. Actor and save loops index with size_t instead of casting their bounds. stubs.c silences unused parameters once for the file instead of tagging every signature. spawn_player takes s32 and casts once inside, dropping 82 call-site casts. The item window arrays are const char* end to end, race_begin_viewport loses its unused mode argument, mio0encode takes uintptr_t, and the neon TLUT math is written in bytes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * data.c: use BOMSWAP16_CONST in the static envelope initializer MSVC's _byteswap_ushort is a function call, not a constant expression, so the plain BSWAP16 broke every Windows build at this initializer. The _CONST variant is the manual shift form on MSVC and the same builtin everywhere else. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Address review round 4: single BSWAP16 home, mixer arg refactor, stragglers effects.h includes macros.h instead of carrying its own BSWAP16 copy. mixer.c drops its unused arguments and locals outright, with the ABI macros absorbing the removed parameters the same way they already absorb pkt. func_8028EC98 takes no argument, the fourth intrinsic pragma leaves math_util_2.c, the backup checksum loop joins its siblings on size_t, and two leftover casts and an UNUSED go away. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * ending: back out the debug-print cast for #745 The int-to-pointer warning it silenced returns until #745 reworks this code. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * effects.h: drop the include annotation Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Retrigger CI after runner disconnect * mixer: restore the Impl signatures and suppress the unused-parameter warning instead * Clean up unused variables in code_80005FD0.c Removed unused variables and assignments in CPU behaviour code. * Remove unused camera variable from function Remove unused camera variable in look_behind_toggle function. * Update comment for bcopy and memcpy clarification Clarified comment about bcopy and memcpy usage. --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: MegaMech <MegaMech@users.noreply.github.com>
8 daysRevise Discord section to include website linkCaladius
Updated the README to include the official website and modify the Discord section.
2026-08-15Change gTickCounter from uin64_t to size_t (#744)MegaMech
* Update main.c * Update main.h
2026-08-15Fix menu fizzle-out transition ending instantly (#747)quarrel07
The decomp zeroes the slot-4 transition timer when starting the fizzle-out (D_8018E7E0 = 0, the scalar that the gCurrentTransitionTime[4] out-of-bounds index lands on). The rename in #309 turned that into gCurrentTransitionTime[4] = arg0, which starts the timer at the full duration, so the first frame sees it expired and completes the transition immediately. Restores the dissolve when backing out of the menu and lets the back sound play out.
2026-08-11Fix Vehicle Speeds (#740)MegaMech
* Init * Update vehicle tick * fix tick * Update BombKart.cpp * Update BombKart.h * Update World.h
2026-08-11Fix spellings (#743)MegaMech
2026-08-11fix hyperlink nightly (#742)coco875
Co-authored-by: MegaMech <MegaMech@users.noreply.github.com>
2026-08-11Fix Track Invocation Spam (#738)MegaMech
* Update main.c * Update TrackBrowser.cpp * Add TrackBrowser_ResetSelectedTrack function declaration * Add void keyword to function declarations * Rename global track variable for clarity * Update TrackBrowser.h
2026-08-01Switch LUS to port-maintenance branch (#727)lus2MegaMech
* lus update compiles but not run * Game runs, fix demo bug * Switch lus to port-maintenance branch
2026-08-01Remove As Much Code As Possible and Still Pass Tests (#732)MegaMech
* Update render_objects.c * Remove unused HUD texture function declarations Removed several unused function declarations related to HUD textures. * Update skybox_and_splitscreen.c * Remove unused set_viewport2 function declaration Removed unused function declaration for set_viewport2. * Update code_80005FD0.c * Remove set_bomb_kart_spawn_positions function declaration * Update skybox_and_splitscreen.c * Update skybox_and_splitscreen.h * Modify Draw function to adjust crab visibility Commented out code to prevent premature disappearance of the crab when the camera rotates. * Update Crab.cpp * Update Crab.h * Update Crab.cpp * Delete unused texture rendering functions Removed unused functions related to texture rendering. * Update render_objects.h
2026-08-01Fix the warning-flagged real bugs across the codebase (#691, 1 of 3) (#725)quarrel07
* 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-01macOS: package the game as a proper SpaghettiKart.app bundle (#724)quarrel07
* macOS: package the game as a proper SpaghettiKart.app bundle Turns the bare Spaghettify executable into a self-contained SpaghettiKart.app: - cmake/macos/apple_bundle.cmake: bundle metadata (using the existing Info.plist, which already described a bundle), app icon, runtime resources (config.yml, yamls, meta, spaghetti.o2r) into Contents/Resources, dylib relinking for local Homebrew builds (no-op with static vcpkg deps), and ad-hoc codesigning so the app launches without 'damaged app' warnings - App icon: on Xcode 26+ the Icon Composer package (SpaghettiKartIcon.icon, drawn from the existing HM ship-kart icon.png art) compiles with actool into an Assets.car, giving the native Liquid Glass look on macOS 26+, plus a flattened icns for older systems; older Xcode falls back to the previous sips/iconutil flat icon. Supersedes the CreateOSXIcons target. - Game.cpp: default SHIP_HOME to ~/Library/Application Support/SpaghettiKart on macOS so first-run extraction, saves, config, and mods land there instead of scattering into the user's home folder; a user-set SHIP_HOME still wins - Info.plist: NSHighResolutionCapable for proper Retina rendering - CI: mac jobs now ship the .app (ditto zip so the executable bit survives artifact upload) - the yamls-next-to-exe copy is scoped to non-Darwin; on macOS those files live in Contents/Resources instead * macOS: ship prebuilt icon artifacts instead of compiling them at build time Commits the compiled Assets.car (Liquid Glass icon for macOS 26+) and the flattened SpaghettiKart.icns, both built from the in-repo Icon Composer package. The build now just copies them into the bundle, which removes the actool machinery and the Xcode 26 requirement entirely: every build on any machine, including CI, gets the real icon. Also adds a staleness guard: the artifacts carry a hash stamp of the icon.png they were made from, and if icon.png ever changes without them being regenerated, the build automatically generates a flat icns from the current icon.png instead, so updating the logo never requires any macOS work and an outdated icon can never ship. Regeneration steps are documented in apple_bundle.cmake. * Rename the icon layer to ship-kart-layer.png Group 2.png was the design tool's default layer name; name it for what it is. Verified the Icon Composer package still compiles with actool after the rename; the committed Assets.car is unaffected (compiled, self-contained). --------- Co-authored-by: MegaMech <MegaMech@users.noreply.github.com>
2026-08-01fix nightly link (#734)coco875
Updated playtesting links to specify architecture for Windows and Linux.
2026-07-28docs: fix broken links and missing assets on the GitHub Pages site (#726)quarrel07
Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: MegaMech <MegaMech@users.noreply.github.com>
2026-07-28Update SkySnow.cpp (#728)MegaMech
2026-07-26Fix garbage frame flash on cinematic camera cuts (#720)quarrel07
* Fix garbage frame flash on cinematic camera cuts Frame interpolation blended matrices across instant camera teleports in attract/demo and post-race cameras, flashing 1-2 frames of sheared geometry. Complete the existing camera-epoch mechanism: flag a cut in func_80019890 when the camera moves >100 units, and have the interpolator snap that frame to the new view instead of blending. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Retrigger CI (transient 502 downloading libogg from gitlab.xiph.org) * Name the cinematic shot dispatcher Review feedback on #720: func_80019890 -> camera_start_cinematic_shot. It starts whichever shot D_80164680 has selected for a camera, dispatching to the per-shot setup that teleports the camera to the shot's opening position, which is why the cut detection lives there. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Apply fix to freecam Added FrameInterpolation_DontInterpolateCamera calls to improve camera behavior when changing target players. --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: MegaMech <MegaMech@users.noreply.github.com>
2026-07-26Sky: paint the full window width (#717)quarrel07
The gradient quad's projection path does not preserve the outward rounding of the Rect edge getters, which can leave the last window column unpainted at some aspect ratios (visible as a black strip at the screen edge that only sky sprites drew into). Overshoot the quad a few virtual pixels past both edges; the excess clips at the window. Co-authored-by: MegaMech <MegaMech@users.noreply.github.com>
2026-07-26Don't let the attract timer hijack an in-flight menu fade (#723)quarrel07
Pressing start on the splash screen in the last moments before the demo timeout could play the enter chime and then drop into the demo reel with no music: the attract timer (gMenuTimingCounter >= 0x12D) fired while the press-start fade was in flight and overwrote gMenuFadeType to the demo value, so the fade completed as a demo entry. Vanilla bug; roughly a 0.7-second window every attract cycle. Only arm the demo when no fade is in flight. A natural timeout (idle, no fade running) behaves exactly as before. Play-verified: start pressed repeatedly around the timeout boundary always lands in the main menu with music; the demo reel still plays when idle.
2026-07-23Exit cleanly after teardown instead of racing static destructors (#718)quarrel07
Normal quits ran the full static-destructor chain, where destruction order is unspecified and something logs through spdlog after its statics are destroyed, intermittently segfaulting on exit (same class as upstream issue #689). All user-visible state (config, saves) is already persisted by GameEngine::Destroy, so end the process with _Exit like the extraction error paths already do. Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: MegaMech <MegaMech@users.noreply.github.com>
2026-07-23Fix the reset button doing nothing or looping the start screen when pressed ↵quarrel07
repeatedly (#719) * Make the reset button reliable from any screen Pressing reset repeatedly near app start could do nothing, fade the music with no reset, or bounce the press-start screen back to itself. Three defects in the old handler: - It ran from the ImGui widget, racing the menu state machine; a press landing mid-fade was re-advanced by the in-flight transition (the press-start loop). - It always wrote gGamestateNext = MAIN_MENU_FROM_QUIT; once the game was already in that state a repeat write is swallowed by the != guard in main.c, so nothing happened. - CM_ResetAudio ran unconditionally, so the music faded even when the reset was swallowed. The widget now only sets an atomic request flag; ApplyPendingReset (top of push_frame, on the game loop) performs the reset. It alternates between the two identical FROM_QUIT gamestates so every press trips the gamestate switch, and re-enters the menus through the intro's own transition protocol (FADE_MODE_LOGO -> setup_menus rebuild + fresh fade-in), which replaces any in-flight transition. Audio only fades when a reset actually executes. The dead gSkipIntro switch in the old handler (an unconditional override below it always won) is gone; behavior is unchanged: reset lands on the logo intro, or the start menu in debug mode. Play-verified: hammering reset during the splash screens restarts the logo every press; reset mid-fade after press-start no longer loops back; resets from the main menu and mid-race work as before. * Honor gSkipIntro when picking the post-reset screen Review feedback on #719: restore the gSkipIntro switch from the old handler instead of hard-coding the logo intro, keeping the debug-mode override on top (no else), matching the boot-time logic in main(). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: MegaMech <MegaMech@users.noreply.github.com>
2026-07-22Refactor cmake (#721)coco875
* some start of refactor * Update SetFlags.cmake * Update SetCmakeVar.cmake * Update SetFlags.cmake * Fix error int-convertion * more refactor * clean up include and source file * fix link of lib * fix a warning * fix include in src/actors * fix include in src/debug * fix include in src/ending * fix include in src/engine/actors * fix include in src/engine/cameras * fix include in src/engine/editor * fix include in src/engine/objects * fix include in src/engine/tracks * fix include in src/port/ui * fix include in src/racing * fix include in src/engine/vehicles * fix include in subfolder of src/engine * fix include in src/engine * fix include in src/enhancements * fix include in src * fix switch * invert common and findlib * Update SetFlags.cmake * clean up some workflow * some splification * Update build.sh * Update Game.h * add header back * Delete test_check.cmake * continue * Update common.cmake
2026-07-22macOS: disable press-and-hold accent popup while moving (#713)quarrel07
2026-07-20CI: run the x86 PR build natively instead of under QEMU (#716)quarrel07
The PR-validation build-docker-x86 job registers a QEMU binfmt handler for linux/386 before building. i386 containers run natively on the amd64 runners, but the explicit registration routes every binary in the container through the qemu-i386 emulator, turning a ~15 minute build into ~170 minutes. main.yml's build-linux-x86-docker job is identical except it never installs QEMU, and it completes in 13-18 minutes. Dropping the setup-qemu step makes the PR job match main.yml; the --platform linux/386 image and build steps are unchanged.
2026-07-20Fix warnings regarding ambigious typings (#715)Lucas
* Fix warnings regarding ambigious typings * Revert struct Collision name change
2026-07-20Fix widescreen letterbox/divider left-edge clipping on ARM64 (#709)quarrel07
* Fix widescreen letterbox/divider left-edge clipping on ARM64 The race-intro letterbox bars (draw_box_fill_wide) and the splitscreen divider lines fed the float OTRGetDimensionFromLeftEdge result into gDPFillWideRectangle, whose _SHIFTL packing casts float->unsigned. Converting a negative float to unsigned is UB: x86 wraps (and the wide-rect handler's sign extension recovers the value, so the bug is invisible there), but ARM64 fcvtzu saturates negatives to zero — so on Apple Silicon the fills started at the 4:3 left edge instead of the true left edge, leaving a strip of sky visible left of the intro bars in widescreen. Use the integer OTRGetRectDimensionFrom*Edge getters, matching the sibling draw_box_wide helpers. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Shorten the fix comment Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-19macOS: sharp ImGui menu text on Retina at every menu scale (#714)quarrel07
* macOS: sharp ImGui menu text on Retina at every menu scale On a HiDPI display the ImGui overlay renders into a 2x framebuffer, but the glyph atlas is rasterized at the logical point size and stretched up by DisplayFramebufferScale, so all menu text looks fuzzy. Set ImFontConfig::RasterizerDensity on the game fonts and the merged FontAwesome icons: glyphs rasterize at higher resolution without changing logical size or layout. Baked at retinaScale (2.0) times the Menu Scale slider's maximum (2.0) so the runtime FontGlobalScale only ever downsamples a high-res atlas instead of stretching a low-res one, keeping text crisp at every Menu Scale setting. Standard-DPI displays just get a supersampled atlas (identical layout, slightly sharper). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Shorten the RasterizerDensity comment Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-18Fix macOS arm64 build: fmt consteval error in the TorchExternal sub-build (#712)quarrel07
* Fix macOS arm64 build: fmt consteval error in the TorchExternal sub-build Torch's pinned spdlog bundles an fmt whose consteval format-string checking fails to compile under newer AppleClang (Xcode 16+), breaking the build-macos-arm64 CI job (the intel runner's older Xcode doesn't hit it): error: call to consteval function 'fmt::basic_format_string<...>' is not a constant expression Define FMT_CONSTEVAL as empty inside the Torch sub-build, falling back to fmt's pre-C++20 constexpr checking. Injected via CMAKE_PROJECT_INCLUDE because Torch's CMakeLists overwrites CMAKE_CXX_FLAGS, so plain flag injection through CMAKE_ARGS is discarded. Scoped to AppleClang; no other platform or compiler is affected, and the Torch pin is unchanged. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Also neutralize FMT_CONSTEVAL for the game build (vcpkg spdlog/fmt) With the TorchExternal fix in place, CI reaches the game build and hits the same consteval error again, this time from the vcpkg-provided spdlog/fmt headers (SPDLOG_FMT_EXTERNAL) under the runner's Xcode 26.5. Apply the same AppleClang-scoped FMT_CONSTEVAL= define at the project level so both layers compile. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Pin vcpkg fmt to 10.2.1 (+ spdlog 1.14.1): fmt 11.0.2 can't compile on new AppleClang The baseline's fmt 11.0.2 both fails to compile under newer AppleClang (consteval format-string checking) and removed the #ifndef guard around FMT_CONSTEVAL, so the AppleClang-scoped define from the previous commit lands on the compile line but gets clobbered by fmt's own definition (FMT_USE_CONSTEVAL is likewise unguarded in that version). No newer fmt exists in the pinned baseline. Override fmt to 10.2.1, which keeps the #ifndef guard, making the existing define effective; spdlog moves to the matching 1.14.1 (1.15.x requires fmt >= 11 headers). Verified locally against the exact CI setup (vcpkg at baseline 2e58bb35ff, vcpkg toolchain file, Ninja): the previous failure reproduces without this change and the full game builds cleanly with it. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Add TODO markers for removing the fmt consteval workarounds Requested in PR #712 review: mark all three workaround sites (project-level define, Torch sub-build include, vcpkg fmt/spdlog pins) so they can be found and removed together once the Torch pin is bumped past its spdlog/fmt update. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: siliconports <aguthmann10@gmail.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-29Fix crash when bailing out of first-run setup before the game inits (#707)quarrel07
InitModsSystem() runs before the game world is set up. Its bail-out paths (no O2R + user declines generation, missing mods.toml, cyclic/outdated mod deps, and GenAssetFile's no-ROM / unsupported-ROM cases) call exit(), which runs the global `static World sWorldInstance` destructor -> World::CleanWorld() -> dereferences Sky::Instance and other singletons that are still null this early, segfaulting. The most visible case: declining the first-run "Generate one now?" prompt pops a crash report instead of quitting cleanly. Use _Exit() on these pre-initialization bail-outs so no static destructors run. Co-authored-by: quarrel07 <paeans-toggle-2e@icloud.com> Co-authored-by: coco875 <59367621+coco875@users.noreply.github.com>
2026-06-25Add spaghetti.o2r to CI build artifact and remove unneccessary files (#708)Tim Schneeberger
2026-06-25Fix stale macOS Info.plist version (0.1.0 -> 1.0.0) (#706)quarrel07
The bundle version strings were left at 0.1.0 while the project is at 1.0.0 (project(Spaghettify VERSION 1.0.0)), so the macOS .app and cpack bundle report the wrong version in Finder/Get Info. Match them to the project version. Co-authored-by: quarrel07 <paeans-toggle-2e@icloud.com>
2026-06-10Fix Switch build (#705)Tim Schneeberger
* Remove duplicate Switch::Init(PostInit) call. It was called multiple times, causing multiple applet hooks (that all point to the same callback address) to be registered. For some reason, the OS started spamming us with FocusUpdate events via that hook because of that. * Hide fullscreen and app data directory button on Switch
2026-05-04Fix switch and windows CI (#700)coco875
* merge upstream commit to fix some bug * fix merge * add a local user for the merge * Update main.yml * revert main.yml * fix windows CI * fix switch build * fix windows and try a fix for switch * fix windows build
2026-05-03Force proper wrapping on fov angles. (#699)Alessio Tosto
Co-authored-by: coco875 <59367621+coco875@users.noreply.github.com>
2026-05-03Fix 32 bit (#697)coco875
* try x86 * ci: uniform build-linux-release-docker and their x86 * Update main.yml * fix animation Co-Authored-By: Alessio Tosto <rinnegatamante@gmail.com> * add explanation * add windows 32 in release * Update windows-compile.yml * fix windows compilation * fix win32 windows * Update libultraship --------- Co-authored-by: Alessio Tosto <rinnegatamante@gmail.com>
2026-05-02Fix missing texture size initialization for clouds. (#698)Alessio Tosto
2026-05-01Force type correctness when calculating collision hashes (#696)Alessio Tosto
* Force type correctness when calculating collision hashes * Fix more incorrect hash calculations. * fix an error --------- Co-authored-by: coco875 <59367621+coco875@users.noreply.github.com>
2026-04-22Fix compiling for linux arm64 (#650)Jeod
* Enable MK64 build option for torch * Fix HMAS type error (present on arm64) * Align memory pool and fix empty macro * Experimental: Add 4096 memory alignment * Add alignment for ALIGNED8 macro * Use memset over deprecated bzero * Ensure OPENGLES flag can be used in CMakeLists.txt * Diagnostic: align ship2_window_i8 to rule out odd-alignment crash --------- Co-authored-by: MegaMech <MegaMech@users.noreply.github.com>
2026-04-22Update CMakeLists.txt (#695)coco875
2026-04-21Add CoreAudio to audio backend combobox map (#686)mkoterski
macOS uses COREAUDIO as the default audio backend, but the combobox display map in MenuTypes.h only contained SDL and WASAPI. This causes an unordered_map::at crash on first frame draw when the Audio API dropdown tries to render. Fixes the menu crash portion of #681.
2026-04-21Combine OpenGL shaders into single .glsl file (#687)briaguya
Kenix3/libultraship#972 changed the OpenGL backend to load a single combined default.shader.glsl instead of separate .fs and .vs files. The assets were never updated to match, breaking the OpenGL renderer. Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07Update libultraship (#685)coco875
* Update libultraship * Update libultraship * Update .gitignore
2026-03-29Allowing user-set internal resolution in menu (#682)EJStaats
2026-03-24Fix Windows Build (#680)Gabriel Morazan
2026-03-09Fix Item Window (#677)MegaMech
* Update render_objects.c * Update render_objects.c
2026-03-09Fix Palm Tree Interp (#675)MegaMech
* Update actors.c * Update actors.c * Update SkyCloud.cpp * Update render_objects.c
2026-03-06Big Interpolation Overhaul (#674)MegaMech
* Fix FI * FI statue * Intepr fixes * Improve * More interp * Fix compile * More interp * Fix text
2026-03-06More Interp Fixes (#673)MegaMech
* Update render_player.c * Update render.inc.c * Update render.inc.c * Fix kart interp * Remove feature * Fix error
2026-03-05Fix mistakes (#672)MegaMech
2026-03-05Fix editor loading and finishline duplication (#653)MegaMech
* Fix editor loading and finishline duplication * Update SceneManager.cpp