• v0.5.7 a7e8427712

    v0.5.7 Stable

    intpa released this 2026-10-18 20:09:41 -04:00 | 70 commits to main since this release

    0.5.7 — Streamer chord behind ZR

    The Streamer toggle is now L+R with ZR held, then Y. The ZL variant, and both triggers
    together, do nothing. ZR is already the hold every window edit needs since 0.5.6.

    Why: after the first 0.5.6 online session the card's saved settings had streamer=true without
    the operator meaning it, so the opponent's name, connection, settings and ping were hidden by
    design; the chord had flipped it unnoticed during window use (ZL is also Training's
    controlled-fighter swap modifier). The 0.5.5 live-peer rule was not involved: no code 112 fired,
    the handshake, confirm and 494 RTT samples were all there.

    No INI change. If Streamer is already on in a saved config, turn it off on the Streamer row with
    ZR held, or with L+R+ZR+Y.

    Also recorded in this release's docs: the first console boot of 0.5.6 ran Vanilla+ in menus, the
    character select and Training with 0 early-present mismatches over 89,500 presents, and its online
    match kept a locked render cadence (p99 16.87 ms) while the simulation stalled on remote inputs,
    so that match's instability was the connection, not frame drops.

    Verification: 238 host tests, clippy clean, no-default-features build, Skyline build. Console
    check owed: L+R+ZL+Y changes nothing, L+R+ZR+Y flips the Streamer row.

    Assets: libssbu_online_deluxe_rewrite.nro and its manifest.json (SHA-256 in the manifest).
    Install path: sd:/atmosphere/contents/01006A800016E000/romfs/skyline/plugins/. Plugin API
    unchanged (v4); FX Control 0.2.1 remains compatible.

    Downloads
  • v0.5.6 6180325791

    v0.5.6 Stable

    intpa released this 2026-10-18 17:24:04 -04:00 | 73 commits to main since this release

    0.5.6 — Vanilla+ is the default, UltraRes 1080p, ZR-hold for every window edit

    Vanilla+. Vanilla keeps the game's own three-image swap chain but presents the acquired image
    at the flush that carried that frame's last submission, one CPU update earlier than the game does,
    the same early present LessLag has used since 0.4.0 and LLUltra/LLDoubles since 0.5.2. The console
    traces show the acquired image is complete at that flush in the three-image shape too, so this
    saves the whole update (about 9 to 13 ms in menus and on the character select) of display latency
    without touching the ring, the acquire or the simulation.

    • New INI key vanilla_plus (true/false, default true): with render_mode=vanilla and Auto
      both defaulting on, the shipped default mode is now Vanilla+ (Auto's Vanilla choice outside matches
      included).
    • Hold L and R and tap X to toggle it live; the setting is saved. The NetProfile row, the
      in-match strip and the native character-select banner read Vanilla+ (manual), Vanilla+*
      (cleanup hold) or Auto:Van+; plain Vanilla / Auto:Van when off. No new NetProfile entry.
    • early_present=false still turns every early present off. The peer exchange still announces
      Vanilla; L+R+ZL/ZR+X (the fork's retired FPS++ chord) stays inert.
    • Eden smoke of this build: 59,203 early presents each matched by one skipped game present,
      0 mismatches, 60 fps on menus, character select, Training and a Training hot swap, toggle round
      trip saved. Console: not yet verified.

    UltraRes 1080p. ultra_resolution=1080 (the UltraRes row walks 576p → 720p → 1080p) lets console
    LLUltra render at the native level; dynamic resolution still steps down from it. Offered because an
    overclocked console (Horizon OC) held 60 at 720p. Default stays 576p.

    ZR-hold everywhere. With the Deluxe window open, a Left/Right value change on any row needs ZR
    held in every scene, not only while a fight is live; a plain Left/Right is ignored and Up/Down still
    move the selection. ZL + D-pad on the native online panes (window closed) is unchanged.

    Verification: 238 host tests, clippy clean, no-default-features build, Skyline build. Console
    checks owed: Vanilla+ visuals and renderer-status.txt counters in menus/CSS/Training, the L+R+X
    round trip, LLUltra 1080p at 60 under OC, the ZR-hold round trip. Details: docs/VALIDATION.md
    ("0.5.6 — 2026-10-18"), docs/RENDERING.md ("Vanilla+").

    Assets: libssbu_online_deluxe_rewrite.nro and its manifest.json (SHA-256 in the manifest).
    Install path: sd:/atmosphere/contents/01006A800016E000/romfs/skyline/plugins/. Plugin API
    unchanged (v4); FX Control 0.2.1 remains compatible.

    Downloads
  • v0.5.5 2bb6974598

    v0.5.5 Stable

    intpa released this 2026-10-18 16:08:42 -04:00 | 78 commits to main since this release

    0.5.5 — the opponent display needs a live peer

    Fixes the operator-reported case where, after choosing Rematch Yes while the opponent
    declined, the opponent's player info stayed on screen.

    • A bound opponent station that has produced no RTT sample for 10 s (pia_rtt::LIVE_MS) is
      treated as disconnected: the Player Info opponent column, the in-match strip's Peer: line
      and its facts, the ping cell, the peer-gated Settings rows and the native CSS banner line all
      hide. A new binding gets the same 10 s grace, so a fresh opponent shows at once.
    • New event code 112 PeerStale in events.log: a = station index, b = silence in ms, one
      row per live-to-silent transition. A 112 row in ordinary play would mean 10 s is too short
      for the console's loading gaps; please report it.
    • Arena roster lines and the station-left protocol gate are unchanged. No INI change.

    Background: Deluxe only learns of a graceful leave through Pia's station-left hook, which drops
    leaves whose protocol id differs from the RTT table's, and nothing aged a bound peer out. The Eden
    LAN-Online harness could not reproduce the console case (its decline ends the session, which
    already cleared the peer), so the hiding branch is covered by unit tests and the console run.
    Details: docs/VALIDATION.md ("0.5.5 — 2026-10-18").

    Verification: 236 host tests, clippy clean, no-default-features build, Skyline build; Eden smoke
    of this NRO showed the opponent throughout a live match, at the results screen and on the
    "Rematch?" prompt with no false 112. Console: not yet verified (first boot of this build
    pending; 0.5.4 booted fine on 2026-10-18).

    Assets: libssbu_online_deluxe_rewrite.nro (1,437,696 B, SHA-256
    cf57cf80f25f2e837deabaf859489dc00653692c269fb4a6e2069a6a1b9bf8c2, build id
    0.5.5-6a9e61afdac8-1792351203) and its manifest.json. Install path:
    sd:/atmosphere/contents/01006A800016E000/romfs/skyline/plugins/. Plugin API unchanged (v4);
    FX Control 0.2.1 remains compatible.

    Downloads
  • v0.5.4 a63bc8c217

    v0.5.4 Stable

    intpa released this 2026-10-17 17:14:48 -04:00 | 83 commits to main since this release

    0.5.4 — the per-file reduction pass

    Patch release of the reduction-candidate work merged into main on 2026-10-17.
    No behavior change intended; the product is still one NRO. (This merge was briefly tagged
    v0.6.0 by mistake; that tag and release were removed the same hour. 0.5.4 is the release.)

    What changed

    • peer_transport.rs, pia_rtt.rs, native_banner.rs and runtime/ui.rs rewritten around fewer
      abstractions (one counter table, one publication type, one text builder and one style decision for
      the native banner, one row model and two renderers for the Player Info window). Source went from
      22,253 to 15,332 code lines (comments and blanks excluded, #[cfg(test)] modules excluded), −31 %.
    • Earlier reduction tiers on this branch: the Tier 1 and Tier 2 removals recorded in
      docs/FORK_PARITY.md and docs/VALIDATION.md.

    Evidence (see docs/VALIDATION.md)

    • Input-latency trials repeated on the candidate package (build 0.5.3-962eb3d1d19f): same frame
      reduction as before the pass.
    • Coverage trace of the whole product on the coverage variant of the same source (Eden offline
      scenarios, LAN-NSO Quickplay, two arenas, Background matchmaking, Co-op): 1,047 of 1,192
      instrumented functions executed. The functions never executed are listed in the evidence root's
      coverage-1017/report-final/never-functions.md; none of them are on the match path.
    • The hook sites behind deluxe_rewrite_arena and deluxe_rewrite_background_matchmaking never
      fired in any scenario (a correctness finding, left for a follow-up).

    Known limits

    • Not device-tested before this release: the 0.5.4 NRO is installed on the operator's console as part
      of this release; the card run is the acceptance test.
    • The candidate and coverage builds abort at startup on Windows Eden (an nn::fs::RenameDirectory
      abort from the plugin); Linux Eden and the console are fine. Follow-up open.

    Assets: libssbu_online_deluxe_rewrite.nro and manifest.json (SHA-256 inside the manifest).

    Downloads
  • v0.5.1 231f4c82ec

    v0.5.1 Stable

    intpa released this 2026-10-15 08:00:09 -04:00 | 165 commits to main since this release

    0.5.1 — render-opts teardown guard

    Fixes a crash at the Training → character-select exit (and other scene exits) on LessLag, LLUltra and LLDoubles.

    What happened. With render options active, Deluxe relocates the game's fighter model update into the post-scene hook. When a fighter module unloaded in the same frame, that relocated update could run on a torn-down module and the game aborted (kernel InvalidHandle inside nn::os::LockMutex, Userspace PANIC). On the 0.5.0 release this hit 5 times in about 22 Training exits in Eden.

    The guard. fighter_probe bumps an unload epoch for every module unload. On a frame where the epoch changed, the post-scene hook skips the relocated model update and the fighter worker but still submits the queue, records event code 48 (RenderTeardownGuard) and counts it as teardown_guard_skips in renderer-status.txt. For the next 180 scene frames the frame recorder falls back to the game's own ordering, then render options resume.

    Evidence. Eden: 22 Training → character-select exits on the candidate with the guard firing on every exit and zero aborts, against 5 aborts in about 22 exits on 0.5.0 the same night (docs/VALIDATION.md, 0.5.0 and 0.5.1 entries). Console, 2026-10-15: the operator ran repeated Training exits and a LessLag match on this exact NRO without a crash. Observed on the console and not addressed here: frame rate dropped into the 40s–50s during Kirby's charged hammer in Training while the zoom itself did not drop; see the 0.5.1 ledger entry.

    Install. One NRO, libssbu_online_deluxe_rewrite.nro, over the previous build. No config change. Remove the original Online Deluxe fork, SsbuSync and the PIA manager if present (docs/INSTALL.md). Verified on the latest skyline-dev Skyline; the Skyline bundled with upstream Online Deluxe is to be checked next.

    Build 0.5.1-231f4c82ec3a-1792064680, NRO SHA-256 aee3852d905218e922886d338e2540cd4dd379a25c23e5f4f32981b2a24642da, module d60c4a2e…1fdf.

    Downloads
  • v0.5.0 44830e5d92

    v0.5.0 Stable

    intpa released this 2026-10-14 17:10:25 -04:00 | 179 commits to main since this release

    0.5.0 — character FX moves to its own plugin; plugins get their own pages

    Character FX is no longer in Deluxe. The On / Off / Reduced effect policy,
    its tables and the EFF siblings now ship as the separate
    FX Control plugin,
    one row per covered fighter plus an All row. Deluxe carries no effect hooks and
    no FX row; the NRO is about 70 KB smaller and the Debug view loses its FX
    tracker rows. A 0.4.x config.ini still loads: the old effects and
    effects_scope keys are ignored and dropped on the next save. If you want the
    effects, install FX Control next to Deluxe; its page appears in the window
    cycle automatically.

    Plugin API descriptor version 3. A plugin can ask for its own page in the
    window cycle (settings → plugins → each own page → performance), titled with
    its label, and may declare up to 32 options. A second export,
    ssbu_online_deluxe_online_context_v1, hands plugins the host's ready /
    online / match / training bits so they can scope themselves to online play
    without hooking the game's scene sites. The Rust SDK is 3.0.0 and still
    registers with older hosts (version 2, then version 1) while the spec fits
    eight options.

    Scene tracker as its own hook family. The main-menu, Quickplay, arena,
    local-wireless and stage-setup hooks were installed from inside the FX family
    until 0.4.2; they are the SCENE family now (DISABLE_SCENE), so Auto, the
    banners, the captures and the online-context export never depended on FX.

    Timing capture schema 2. timing-<id>.csv no longer carries the three FX
    columns; tools/analyze_timing.py reads schema 1 and 2.

    Tested together with FX Control 0.1.0 in Eden (2026-10-14): the window
    cycle ran Settings → FX Control → Performance, Deluxe's Settings had no FX
    row, the plugin read Deluxe's online context, and Sephiroth's Gigaflare was
    recorded under On, Off and Reduced at 60 fps. That run used the 0.5.0
    candidate built from b0ca667 (8b1c936f…); the attached NRO is the same code
    rebuilt from the tagged commit (only the embedded build string differs).
    Console verification follows the install; see docs/VALIDATION.md ("0.5.0").

    Assets: libssbu_online_deluxe_rewrite.nro and manifest.json (SHA-256 in the
    manifest). Smash 13.0.5. Install FX Control 0.1.0 alongside for the effects.

    Downloads
  • v0.4.2 ddea22d1d8

    v0.4.2 Stable

    intpa released this 2026-10-14 13:52:29 -04:00 | 194 commits to main since this release

    0.4.2 — the online entry the scene hooks "missed"

    The Quickplay hook was firing all along. What lost the connection was the
    main-menu hook: Smash's background matchmaking returns to the main menu while
    the search continues and starts the waiting room and the match from there, and
    the rewrite reset the connection to Offline on every main-menu entry. The fork
    kept Quickplay across the main menu for that reason.

    • Main-menu entry now keeps a live Quickplay connection (anything else still
      resets to Offline).
    • A Singles/Doubles stage that runs five seconds under a menu-set Quickplay
      without the online-latency hook is demoted to Offline, so a stale Quickplay
      (the menu hook also fires on some offline menus) cannot keep an offline match
      classified online.
    • Install log code 107 records both decisions; the context row of a demotion
      carries source 0x0ff11e.

    Manual profiles are unaffected. Auto now runs online matches as online from the
    stage load; 0.4.1's latency-hook fallback remains as a second net.

    Repository: the handoff file was purged from the whole history at the
    operator's request; tags were re-pointed to the rewritten commits.

    Assets: libssbu_online_deluxe_rewrite.nro and manifest.json (SHA-256 in the
    manifest). Smash 13.0.5.

    Downloads
  • v0.4.1 a832441f1d

    v0.4.1 Stable

    intpa released this 2026-10-14 13:29:49 -04:00 | 196 commits to main since this release

    0.4.1 — three follow-ups from the first 0.4.0 console session

    Opponent leaves the banner when they decline a rematch. The station-leave
    event retired the opponent only through a station-to-id binding that exists
    with the opt-in peer observer; with the observer off the single remaining
    peer stayed shown until the whole session ended. An unbound station leave now
    retires the only confirmed peer (two or more peers are left alone).

    Auto recognises an online match the scene hooks missed. Two Quickplay
    matches ran with the connection still classified Offline. When the
    online-latency hook fires on a stage the hooks left Offline, Auto now treats
    that stage as an online match (LessLag on console, LLUltra on emulator,
    LLDoubles for doubles). Menus and the waiting room stay Vanilla, classified
    connections are never rewritten, manual selections ignore it.

    Native status edits need ZL. On an online character select or arena pane
    the fork-style D-pad editing changed the input buffer (Left/Right) and the
    profile (Up/Down) while the D-pad was moving the character-select hand, which
    rewrote settings nobody chose. Hold ZL with the direction to edit; the D-pad
    alone only moves the hand. ZL+ZR is still the view chord, and the Settings
    window still edits with the plain D-pad.

    Also in 0.4.0 → 0.4.1: nothing else. 0.4.0 shipped the two-image LessLag
    present-at-flush CSS fix (console: 49.9 → 59.85 fps on the hand sweep), the
    Vanilla* banner and the opt-in CAPTURE_MATCH match capture.

    Assets: libssbu_online_deluxe_rewrite.nro and manifest.json (SHA-256 in the
    manifest). Smash 13.0.5.

    Downloads
  • v0.4.0 ea90f98830

    v0.4.0 Stable

    intpa released this 2026-10-14 13:14:22 -04:00 | 198 commits to main since this release

    0.4.0 — the character-select stall fix, plus match captures

    Two-image LessLag presents at the flush. The console trace showed the real
    CSS stall: the game presents a frame only after running the next frame's whole
    CPU update, 13.7 ms after submitting it (16 ms with the hand moving), and in a
    two-image ring a present after the vsync costs the next acquire a full vsync.
    LessLag now presents the acquired image at the end of the flush that submits
    it and skips the game's later present of that index. On the console the CSS
    hand sweep went from 49.9 fps with 20 % of frames over 20 ms to 59.85 fps
    with 1.3 %; texture-wait p95 16.4 ms → 2.95 ms. Online matches: 59.7–59.9 fps,
    0.2–0.4 % of frames over 20 ms including the stage load. Eden under a 120 %
    CPU quota: p99 19–22 ms vs 32–33 ms before. Counters in renderer-status.txt
    (early_presents, early_present_skips, early_present_mismatches); install
    log code 105 records a mismatch.

    Vanilla* in the banner. A manual selection that the cleanup hold is
    running as Vanilla (the regular CSS right after a match) now reads Vanilla*
    in the banner, the arena lines and the settings row instead of the saved
    profile name.

    Match capture (opt-in). Create an empty CAPTURE_MATCH in
    sd:/ultimate/ssbu_online_deluxe_rewrite/ before boot: every stage load arms
    the timing + API capture pair (timing-<id>.csv, api-<id>.csv, label
    match_singles / match_doubles / match_training) and the capture ends
    when the game leaves the stage (results screen or character select), ten
    minutes at most. Both files stream to the card from the background thread,
    about 4 MB per minute. The flag also installs the three read-only
    CAPTURE_CSS hooks. Debug view row Match capture; install log code 106;
    tools/analyze_timing.py and tools/analyze_render_trace.py accept
    # reason=scene_end. The capture CSVs' engine footer is sampled per poll
    while recording, so a profile change after the capture no longer labels it
    Mixed.

    Known, not in this release. The opponent window stays after the opponent
    declines a rematch. Two online matches were classified offline by the scene
    hooks although the latency hook fired; manual profiles are unaffected.

    Assets: libssbu_online_deluxe_rewrite.nro and manifest.json (SHA-256 in the
    manifest). Smash 13.0.5.

    Downloads
  • v0.3.9 fdaca5ce7d

    v0.3.9 Stable

    intpa released this 2026-10-14 08:41:57 -04:00 | 210 commits to main since this release

    0.3.9 — draw-slot budgets trimmed in the ImGui backend

    The embedded ImGui backend is built from fork intpa/imgui-smash commit c185303 (archive 09b296a0…, 13,851,844 B; the companion crate pin is 77cdab7). Each of the backend's eight draw slots held a 256 KiB + 256 KiB command pool and a 64 KiB + 64 KiB control block in game heap, 5 MiB in all, for recordings that never exceeded 1,256 B of command memory or 120 B of control memory across the Eden evidence (Deluxe and Elite menus open together through menus, character select, a match and results). Each slot now plans 32 KiB + 32 KiB of command memory, exactly one 64 KiB NX memory-pool page, and 8 KiB + 8 KiB of control memory: 640 KiB over eight slots, with more than 25x the observed maximum before the reserve is touched. An oversized frame is still finished from the reserve and discarded rather than aborting. Geometry buffers stay demand-grown (64 KiB initial, 1 MiB cap); the 4 KiB uniform buffer is unchanged.

    Deluxe's own code is unchanged; the NRO size is the same because only constants moved. renderer-status.txt shows the live maxima on the embedded host (imgui_draw_max_command, imgui_draw_max_control, imgui_draw_overflow).

    Standalone companion. Built from the same fork commit: libimgui_smash.nro 888,832 B, SHA-256 946de84f98546cb791640e40fbf5848ea3965c511631ef18b32e5c805b67d50e, identical segment layout, export set, 1.92.7 WIP (19263) tag and text_offset == 0 as the 0.3.8 companion (a3f794b2…). It ships from the fork's release.

    Eden acceptance (2026-10-14, isolated profile, Astra low driver): three runs with Deluxe 0.3.9: external host with the draw-stats build of the companion plus Elite (both windows open on the main menu and the character select, every Deluxe view, then a Shulk vs Wolf match with the compact strip, pause, quit, results and CSS return), embedded host (all views on the main menu and the CSS, portrait hovers), and reversed load order with the release companion plus Elite. All at 59.9–60.0 fps, no crash, assert or window loss. Live counters: run 1 standalone 29,658 submissions, 0 command overflows, 0 failed or pending slots, largest recording 1,448 B command / 120 B control (4.4 % of the 32 KiB initial budget); run 2 embedded 13,201 submissions, 0 overflows, max 1,040 B / 120 B. Details and screenshots in docs/VALIDATION.md and the tangent imgui-fork-1014/eden-test/slots-N-shots/.

    Also in this tag: docs/VALIDATION.md records the Astra analysis of the four hardware CSS captures from the 0.3.7 boot (css-budget/hw-0.3.7-1014/ANALYSIS.md): in genuine two-image LessLag the character-select dips are texture-ready fence stalls after acquire (81 % of the directional-input increment), not acquire/present calls and not backoff pickup; ranked next experiments stay in existing visual-request hooks.

    Gates: 303 host tests, host and Skyline Clippy with warnings denied, cargo build --no-default-features, rustfmt, tools/test_prepare_imgui.py, fork host tests (command_memory_reserve_test with the new layout assertions, draw_slot_rules_test, both frame-guard tests), Skyline release build.

    Asset SHA-256 Size
    libssbu_online_deluxe_rewrite.nro 8c20799f3974f45beaf28c2373982bcc546f08f6496ee58ed95852fd78496cca 1531904

    Build 0.3.9-4fd77a238f9e-1791980278, module 8910f60912630c0f4f273a88ffc0889e236e68a7f41c54c1590ae1041955628b, game 13.0.5. manifest.json carries the ELF, source-archive and imgui archive digests.

    Downloads