feat(menu): skip the title screen and load the newest save #399
No reviewers
Labels
No labels
area/accessibility
area/audio
area/input
area/install
area/menu
area/renderer
area/saves
area/upscaling
good first issue
gpu/amd
gpu/igpu
gpu/intel
gpu/nvidia
help wanted
kind
bug
kind
chore
kind
docs
kind
feature
kind
performance
kind
question
needs measurements
platform/linux
platform/steam-deck
platform/windows
preview
priority
critical
priority
high
priority
low
status
blocked
status
confirmed
status
duplicate
status
invalid
status
needs-info
status
wontfix
testing wanted
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
MagicBeanDev/Longshot!399
Loading…
Reference in a new issue
No description provided.
Delete branch "mooki/Longshot:feat/skip-title"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Why
What this is for: Nicholas Gower's Skip title work lets a returning player launch into the game's newest save without pressing through the title and file list. Michael Schienbein carried it here from https://github.com/NotRexed/Hookshot/pull/1560 with Nicholas credited as co-author, so restart in place can build on it.
What is measured: current game-free checks, four standalone Linux/RTX 4090 functional cases at
5c175a472, and a completed quiet interleaved Off-cost comparison against0caf06184. It finds no cost distinguishable from main's 0.8566% repeat spread; this change's own spread is 1.3907%. Not measured: Windows runtime, physical input, other hardware/scenes or a game run on the current head.Below, "r4" is the earlier head
5c175a472(on main0caf06184), where the game runs and the measurement were taken, and "r5" is the current headdb39383ba(on main5e072fc8c), which carries the same three feature and test commits unchanged plus the run records.What changed
gpu/vk/vk_menu.cppandvk_menu.h: the Gameplay row Skip title screen, Off by default, saved asskip_title_screen. It takes effect after a restart.gpu/vk/vk_api.handvk_replay.cpp: use the already reserved option 44 and answer it through the existing option callback. Skip opening remains 52; neither renderer interface changes.host/oot_autoload.cand.h: find the newest save by modification time, then use the existing host input-tap implementation to press A through the title and file list. The game chooses which save to load; this code does not select a slot or check save contents. With no save, it leaves the title alone.host/nn_hid.candhos_main.c: run the title helper from input reads and reuse the existing player-seen signal to stop once play begins. No second input-tap implementation is added.tests/test_skip_title.py: compile the actual host implementation against temporary files and controlled clock/input observations. Preserve the background-input fixture and the Skip opening/option-allocation checks. The standalone fixture carries its existing README case and secure-CRT fixes, split from the mixed test commit in 61.README.mdanddocs/development.md: retain the option-table entry, player explanation and saved-key reference. This feature changes no language catalogue entries or counts; its row and help still use English fallback. Main's current translations are retained.This does not include save-before-restart, continuation notes, the windowless Restart/Quit repair, or restart's later idle-demand guard. Those remain in 61. All added and removed lines of the three Skip title commits are preserved through this carry; that is patch evidence, not a new game result.
docs/tested/: eight new run records in one separate documentation commit, preserving the first window's rejection and the second window's within-repeat-spread result.Flags and settings
Skip title screenskip_title_screenHOS_OPT_SKIP_TITLEMeasurements
Final r5 source checks, 14 November
main:
5e072fc8c2(2026-11-14 UTC)this PR: feat/skip-title @
db39383ba0Hardware: Core i9-13900K, 96 GB RAM, Arch Linux 7.2.15-1-omarchy, GCC 16.2.1, Clang 23.1.3, Python 3.12.16; RTX 4090/NVIDIA 615.78.08 for windowless game evidence.
Scene: authored temporary-file, menu/input and save-state fixtures; no game is started by these checks.
Method: focused GCC/Clang checks and the whole strict suite once on the final head, including the run-record commit; main's retained exact-head suite is the baseline.
How to reproduce:
python -I -B tests/run_all.py --jobs 6 --strict; runtests/test_tested_configurations.pyfor the records and the Skip title drivers with GCC and Clang.5e072fc8cdb39383ba0caf061845c175a472; r5 built and linked for Windows and Linux, not runThe whole-suite failures are exactly main's
tests/test_framegen_resources.py(missing Intel-gate/guarded-call declarations in its fixture),tests/test_module_ids.py(an old exact function signature), andtests/test_pad_layout.py(missingHoldToggledeclaration). The separate GCC-onlytests/test_menu_keys.pyfailure is g++ rejecting three C-header_Static_assertspellings; Clang passes. No failing check or assertion was removed.The carry onto main
5e072fc8cchanged no added or removed line of the feature/test commits. Its two later commits are5ed8141af(PsychoV35's adapted scene-tone-map permutation) and5e072fc8c(actor-motion pose capture and pairing model copies by place), with their tests and run records. Neither changes the title, input, save or restart code. The measured settings use the game's upscaler with frame generation and HDR Off. Earlier game runs and measurements remain attributed to0caf06184,5c175a472andd89cb5992as applicable; they were not rerun on r5, and are not a new absolute frame-time result for current main. Each r5 layer adds only its separate measured-run documentation commit.Completed Skip title Off measurement at r4
main:
0caf06184b(2026-11-14 UTC)this PR: feat/skip-title @
5c175a4727Hardware: Core i9-13900K, 96 GB RAM, Arch Linux 7.2.15-1-omarchy, GCC 16.2.1, Clang 23.1.3, Python 3.12.16; RTX 4090/NVIDIA 615.78.08 for windowless game evidence.
Scene: Kokiri Forest, the same copied save, stationary view by the sign, menu closed.
Settings: Windowless, game output 1280x720, render 100%, game's upscaler, frame generation/HDR/FPS overlay Off, real-time speed,
HOS_FPS_MAX=1000(Uncapped). Saved V-Sync is 0, labelled Auto; there is no swapchain or display wait in this run. Skip title is Off.Method: both scenes warmed, then A1/B1/A2/B2 in each quiet exclusive window; 85-second game bounds, three seconds of scene settling followed by 25 seconds of game-present-return CPU intervals. This clock measures neither GPU completion nor display latency. Matched release builds, lift and profile. Other-work CPU must average below 3 cores and peak at most 6 over five seconds, repeat spread at most 5%, with no measured gap over one second.
How to reproduce: load the same valid copied save on the two named builds, keep the above settings and fixed camera, then collect two interleaved stationary samples per build after settling.
Result: no cost distinguishable from the repeats' spread. In the quiet second window, main's two medians are 13.758351 and 13.641001 ms; Skip title Off's are 13.730049 and 13.540422 ms. Main's repeat span is 0.117350 ms (0.8566%); the candidate's is 0.189627 ms (1.3907%). Main's span exceeds the between-arm difference, so this is neither a speed gain nor proof of zero cost. It is a completed measurement with a
within-repeat-spreadresult, not a missing measurement.0caf061845c175a472The first window is disturbed and rejected in full: A2 used 7.942 other-work cores on average and peaked at 28.797. The second passed two five-second admission samples (0.608 and 0.296 cores) and all four sample-window quiet checks. Every run is retained, including the rejected window:
0caf061845c175a4720caf061845c175a4720caf061845c175a4720caf061845c175a472The two holds occupied 348.1 and 353.295 seconds including settling and shutdown. All eight games ended at the intended bound (124), with complete journal coverage and no fatal/device/kernel fault. Scene pictures were inspected. Eight self-contained files under
docs/tested/retain these actual measured commits and mark every first-window row rejected. The original baseline warm-up's clean Quit was first misclassified as invalid by its exit check; the retained game evidence established successful warming without repeating it.Testing
Tested: final r5 focused GCC/Clang and whole-suite checks above; the per-run catalogue before and after the added records. The feature's main-source control fails for the intended absent row. On r4
5c175a472, the native Linux executable/renderer and Windows cross-build both linked; all four captured Windows-target fixture units passed, not Windows execution. The four Linux/RTX 4090 cases below and the Off-cost measurement retain that r4 head.Carried standalone game cases, 14 November
Same head
5c175a472, source fingerprint7a3c888d; 1920×1080 output, render resolution 100%, frame generation/V-Sync/FPS overlay Off, real-time speed and a 60 cap. These are pass/fail observations, not frame-time or startup-speed measurements.slot_01/progress.sav, logs automatic loading complete, and reaches fresh playable forest state without an event/load.slot_01is newest because its original modification time is 11 November 02:45:19 local, later thanslot_00at 01:38:45. Both were known-valid test-library saves; this run also proves the selected one loads. This does not claim content validation or recovery from a newer damaged file.The On run observes fresh playable state at frame 2013 (game sample frame 2013, event/loading false), then frame 2325 with a fresh sample and the same saved position. All four games exit 0, leave no owned process, and have complete journal coverage with zero fatal/crash/device/driver faults or NVIDIA mapping/allocation refusals. The copied saves and registered source stay byte-identical. Every picture below was inspected.
Built at r5: At
db39383ba042ca131ea9ddf8fe520d39833fc8ec, the Windows x86-64 Vulkan renderer DLL and all 48 selected host translation units were cross-built on Linux with llvm-mingw 20261104 (Clang 23.1.5), using the project's production flags and pinned dependencies (renderer: 35 newly compiled / 170 reused; host: 1 newly compiled / 47 reused; lifted C: 0 newly compiled / 80 reused; all Windows units: 36 newly compiled / 611 reused from matching object-cache entries), the renderer DLL linked and the full game executable linked; nothing was run on Windows or under Wine, and this is neither the project's hosted builder run nor a Windows UTF-8 run-time path test.The exact same head
db39383ba042ca131ea9ddf8fe520d39833fc8ecalso compiled and linked its full native Linux executable and renderer with Clang 23.1.3 through the documented resume path (247 newly compiled units, 242 matching Linux-cache units, source stamp63776eb6), using the verified target-neutral C from lift5c175a4727d82f85e425e85400dca17fea0750fbrather than carrying the patch onto another commit; neither Linux binary was run.Not tested: game execution on r5; Windows execution of the new/changed C fixtures; Windows game/runtime, non-ASCII/long Windows save paths, real keyboard/controller input, AMD/Deck, other areas, unusual title prompts and damaged-save handling. Automatic title loading with non-default held/toggled A has not been tried in the game. Opening the Insert menu during automatic loading was not tested; the row picture is after loading. The row/help still use English fallback. The measured within-repeat-spread result does not establish zero cost.
Needs other testers:
Screenshots
Risk and rollback
The helper presses A on a timer, starting after 20 seconds, every 2 seconds, until play begins or 120 seconds pass. It does not identify the active title prompt. The Insert menu pauses it and switching the row Off stops it, but touching another control does not automatically cancel it. Unexpected confirmations and damaged saves remain risks. A file's presence and modification time do not establish that it is safe to load. Set
skip_title_screen=0or turn the row Off, then restart, to return to manual loading. Reverting these commits removes the option; it does not repair a damaged save.Reviewer notes
Read
hos_oot_autoload_input,hos_oot_newest_save, the input call and option 44 first. The original provenance and Nicholas Gower's exact co-author trailer remain. Three carried commits compare equal by range-diff, with author/date/message and every added/removed patch line preserved; the fourth commit records the eight runs only.The archived review questioned timed A presses on unexpected prompts and the absence of cancellation on physical player input. Those remain disclosed design risks for review, not a claim that every prompt is safe. The current forge review can decide the approach. The standalone helper still reads the clock on input calls when Off; the measurement does not claim that instruction costs zero.
Skip title retains reserved option 44; Skip opening remains 52. The earlier 128-PR option survey is historical, not a new inventory. #61 contains these same three feature/test commits and the run-record commit until this merges. The separate restart layer uses option 64, which clashes with
HOS_OPT_GFX_OBJECTSin #227 at0fc2e8c9268d8611d5070cef9540725d60364874; that is not a title-only collision.Issues
Original work: https://github.com/NotRexed/Hookshot/pull/1560
Dependent restart work: #61
Checklist
For everyone
type(scope): description).main. Exact base5e072fc8c; final headdb39383ba.python -I -B tests/run_all.pyrun and passing (any failure that also fails onmainis named above). 543 passed, 3 inherited failures, 16 skipped on this final head.third_party/untouched (a new folder with aPROVENANCE.mdinstead).If applicable
Assisted-by:/Co-Authored-By:trailers.docs/tested/for each new measured run (format indocs/tested-configurations.md; no appended row or assembled view). Eight records, including the rejected first window.mainand passing here.tests/that reads changed source updated in this PR, not weakened.db39383ba042ca131ea9ddf8fe520d39833fc8ec(under Testing); nothing was run on Windows, so UTF-8 path behavior at run time is not claimed.Moved from NotRexed/Hookshot#1560.
Co-Authored-By: Nicholas Gower [email protected]
Assisted-by: GPT-6 Astra
Co-Authored-By: GPT-6 Astra [email protected]
Carried onto main
5e072fc8c; new headdb39383ba042ca131ea9ddf8fe520d39833fc8ec. The three feature and test commits replay unchanged; one new commit adds the eight run files of the two measurement windows underdocs/tested/. The whole suite on this exact head: 543 passed, 3 failed, 16 skipped; the three failures are main's owntests/test_pad_layout.py,tests/test_module_ids.pyandtests/test_framegen_resources.py.The measurement is complete, so its box is ticked: with Skip title off, frame times cannot be told apart from main's within the spread between repeats. In the quiet second window main's two medians are 13.758 and 13.641 ms and this change's are 13.730 and 13.540 ms. The first window was disturbed by other work on the PC and is kept in the run files as rejected. That is neither a speed gain nor proof of zero cost.
The game runs and pictures keep the earlier head
5c175a472they were taken on. The build box stays unticked until this pushed head has been built for Windows and Linux. The Windows test request T-TSA8 is still open.5c175a4727db39383ba0The pushed head
db39383ba042ca131ea9ddf8fe520d39833fc8ecis now built and linked for Windows (cross-built with llvm-mingw 20261104, Clang 23.1.5) and for Linux (Clang 23.1.3); the details are under Testing and the build box is ticked. Nothing was run on Windows. With the measurement complete and every box ticked, this is ready for review.WIP: feat(menu): skip the title screen and load the newest saveto feat(menu): skip the title screen and load the newest save