v1.6 — CPU Classic Co-op partner, interpolated high framerate, and a major Fast3D accuracy/stability pass
This release adds a CPU partner option for Classic Co-op and an opt-in interpolated 120/180/240 FPS presentation mode. It also includes a substantial Fast3D and memory-safety pass: more accurate intro rendering, deterministic N64 trigonometry, and fixes for textureless or corrupted fighters, stages, and particles that could eventually crash the game.
New Features
1. CPU partner in Classic Co-op
Classic Co-op can now fill the second-player slot with a CPU partner, allowing solo players to use the co-op route without a second controller. Contributed by @the-outcaster through decomp PR #13.
2. Enhanced Framerate (Interpolated)
An opt-in graphics setting can present the game at 120, 180, or 240 FPS while game logic, physics, input, and audio remain locked to the original 60 Hz tick rate.
- Interpolates object and camera matrices between game ticks.
- Includes teleport, flip, and large-transform guards to avoid interpolation artifacts.
- Automatically steps down the presentation rate when the host cannot sustain the requested frame budget.
- Applies immediately from Settings → Graphics → Enhanced Framerate (Interpolated).
- Preserves authored freeze frames and the original 60 Hz game clock.
Gameplay and Audio
- Final Destination music selection — Final Destination now honors the selected or shuffled track instead of always falling back to its default music. Contributed by @the-outcaster in #256.
Rendering Accuracy
- Opening desk-to-stage explosion (#10) — Fast3D now emulates SSB64's color-image-to-Z-buffer technique, including RDP rectangle depth behavior and framebuffer persistence. The transition now reveals the next scene through the expanding Smash-logo silhouette instead of relying on port-specific workarounds.
- Montage flash geometry (#72) — restored near-plane trivial rejection so off-camera climax quads no longer smear into large gold wedges.
- Opening-scene pacing (#136) — sustained over-budget RCP work now uses a carry model, removing repeated freeze/advance/freeze stutter while preserving authored hardware stalls.
- RDP depth semantics — depth comparison now follows
Z_CMP, rather than being enabled solely byG_ZBUFFER, restoring the red starburst border around the opening explosion. - DirectX intro explosion — fixed corner smears caused by redirect-depth draws outside the intended clip region.
- Widescreen intro transition — preserves prior-frame history correctly instead of clearing the transition exterior to black.
- OpenGL fighter intro cards — restores missing fighter-name cards by resetting leaked color-write state before framebuffer presentation.
Stability and Data Correctness
- Textureless/corrupted fighter and stage family — runtime texture fixups no longer byte-swap past texel data into live model descriptors, relocation tokens, or animation data. This fixes a family of flat or missing fighters/objects, corrupted stage backgrounds and particles, and later scene crashes.
- Texture-cache reuse — cached textures are content-verified so recycled game buffers cannot silently display stale texels; particle working buffers now evict renderer caches before reuse.
- Relocation chain hardening — relocation tokens can no longer be mistaken for
G_VTXorG_SETTIMGcommands as slot generations increase. Chain walks now validate bounds and stop safely instead of corrupting assets or exhausting the token table during long sessions. - 64-bit display-list pointer handling — native host pointers whose address happens to contain segment byte
0x0Eare no longer misread as N64 segmented addresses, fixing an ASLR-dependent intro crash shared by DirectX and OpenGL. - Deterministic N64 trigonometry — game
sinf/cosfcalls now use libultra's original Cody-Waite implementations instead of platform-dependent host libm behavior, keeping physics and animation calculations consistent across platforms. - Additional corruption guards — clamps an out-of-bounds fighter-scale seed, clears stale effect-file pointers between scenes, and restores low-address guards on Linux.
- Android OpenGL ES compatibility — redirect-depth rendering now uses the GLES depth-clear API and avoids unsupported desktop depth-clamp state, restoring release builds for both Android ABIs.
Developer and Diagnostic Improvements
- GBI traces can now start at a selected VI frame and include matrix, vertex, and texture payloads, per-draw flush markers, and VI frame numbers.
- Added OpenGL framebuffer capture and expanded RCP/interpolation diagnostics for graphics regression work.
- Automated README download and star-history charts were refreshed throughout the release cycle.
Submodule Changes
decomp: dbc69f44 → a79173a9
- CPU partner support for Classic Co-op.
- Matrix recording hooks for interpolated presentation.
- Original opening-room transition restored now that Fast3D supports its hardware behavior.
- Fighter-scale bounds fix, stale effect-file cleanup, and diagnostic scene-heap mode.
- Endian-safe libultra trigonometry tables.
- Widescreen opening-transition history preservation.
libultraship: 37f13c97 → cdb279c5
- Color-image-to-Z emulation and RDP rectangle-depth behavior.
- Correct
Z_CMPdepth-test gating and near-plane rejection. - Content-verified texture caching and restored low-address pointer guards.
- DirectX redirect-depth clipping and widescreen framebuffer persistence.
- OpenGL fighter-name presentation fix.
- 64-bit display-list pointer/segment disambiguation.
- OpenGL ES depth-operation compatibility for Android.
torch
- Unchanged:
8060a909.
Contributors
Thanks to @the-outcaster for the CPU Classic Co-op partner and Final Destination music-selection fix.
Full Changelog: v1.5.1...v1.6