feat(builder): add native Windows save file selection #2842

Open
github-sync wants to merge 4 commits from github/pr/2842 into main
Owner

@Anarkkie opened this pull request on GitHub · 2026-11-12 16:13 UTC · original

Windows players using one installation currently share its save location. This adds named save files to the native launcher so each player can keep separate progress while using the same game executable, content, settings and caches.

The existing Windows setup build supplies the installed root hookshot.exe; Builder's Play action and the normal shortcut open File Select. It copies the selected file into the normal save mount, starts bin/hookshot.exe, waits through game Restart, and synchronizes the save back on exit. Staged copies, backups and recovery markers protect interrupted swaps. Additional files and launcher-only names do not change Link's in-game name.

The fixed-size menu shows the latest supported snapshot's embedded picture and decoded progress. Items, Equipment and Quest Status have independent pages and keyboard navigation, with quantities, hearts, unlocked magic, rupees, double defense and age. Normal green clothes appear once for the saved age; supported replacement families show their highest acquired upgrade. Decoding retains all records and keeps stock separate from acquisition flags. The preview does not claim which upgrade is actively equipped in an edited save.

Available icons and schema-validated song metadata are generated locally from each player's supported installation. The shared public item catalog retains its MIT notice. Missing artwork has text labels. The contribution includes source, tests, documentation and screenshots; extracted assets, metadata, saves and compiled binaries are excluded. Save editing is not included.

Installed-version metadata is refreshed by the build, including untagged development builds. Update checks offer the official GitHub Releases page; File Select does not download or launch Builder.

Validation

  • Synced with upstream main at e2057b2b (AMD Anti-Lag 2 with frame generation); the merge is clean and the complete Windows suite was rerun on the combined branch.
  • Native LLVM-MinGW C++17 build passes with -Wall -Wextra -Werror. WPF Builder build passes with zero warnings and errors.
  • Six focused checks pass: python -I -B tests/run_all.py --jobs 4 file_select_save file_select_layout file_select_presentation file_select_metadata portable_game_home prompt_skip.
  • The authored 126-record fixture produces 110 displayed entries across the paged groups. Every displayed entry's focus/tooltip name was checked. The real-save regression fails before the presentation fix (two green tunics and two stick-bag tiers) and passes after it (one of each).
  • Windows frame geometry was checked at 100%, 125%, 150%, 200% and 250% scaling. The client canvas stays 1004 by 641 pixels.
  • Native --list reports installed v2.1.0 and all three existing files. All 72 checked save/game-file hashes stayed unchanged after installing the final launcher. Earlier native integration booted each of those three files through the shared game root and synchronized on exit.
  • Full Windows suite after the upstream merge: 463 passed, 2 failed, 34 skipped in 256 seconds. The two failures are in unchanged checks: nx2/test_nup_paths.py cannot create file symlinks without Windows privilege; tests/test_input_background.py encounters LLVM's unused-but-set-global warning in tests/input_background_test.c. This is not a green full-suite result.

Test system: Windows 11 Pro 10.0.26300, Ryzen 7 5800X3D, 32 GB RAM, RTX 3080 Ti driver 610.88; installed game v2.1.0 (633eb435) unchanged. The measured run is recorded in docs/tested-configurations.md.

Screenshots and remaining verification

These are outputs of the actual native renderer, with verification captions outside the menu. The first reads the existing File 1; the second uses authored test progress and a placeholder landscape. The latest polished menu has not had a fresh live input/gameplay pass, and no other-OS or performance result is claimed. This PR is a draft pending that final live pass and CI review.

Existing save, native rendered preview

Fully populated authored test save, native rendered preview

> [@Anarkkie](https://github.com/Anarkkie) opened this pull request on GitHub · 2026-11-12 16:13 UTC · [original](https://github.com/NotRexed/Hookshot/pull/2842) Windows players using one installation currently share its save location. This adds named save files to the native launcher so each player can keep separate progress while using the same game executable, content, settings and caches. The existing Windows setup build supplies the installed root `hookshot.exe`; Builder's Play action and the normal shortcut open File Select. It copies the selected file into the normal save mount, starts `bin/hookshot.exe`, waits through game Restart, and synchronizes the save back on exit. Staged copies, backups and recovery markers protect interrupted swaps. Additional files and launcher-only names do not change Link's in-game name. The fixed-size menu shows the latest supported snapshot's embedded picture and decoded progress. Items, Equipment and Quest Status have independent pages and keyboard navigation, with quantities, hearts, unlocked magic, rupees, double defense and age. Normal green clothes appear once for the saved age; supported replacement families show their highest acquired upgrade. Decoding retains all records and keeps stock separate from acquisition flags. The preview does not claim which upgrade is actively equipped in an edited save. Available icons and schema-validated song metadata are generated locally from each player's supported installation. The shared public item catalog retains its MIT notice. Missing artwork has text labels. The contribution includes source, tests, documentation and screenshots; extracted assets, metadata, saves and compiled binaries are excluded. Save editing is not included. Installed-version metadata is refreshed by the build, including untagged development builds. Update checks offer the official GitHub Releases page; File Select does not download or launch Builder. ### Validation - Synced with upstream `main` at `e2057b2b` (AMD Anti-Lag 2 with frame generation); the merge is clean and the complete Windows suite was rerun on the combined branch. - Native LLVM-MinGW C++17 build passes with `-Wall -Wextra -Werror`. WPF Builder build passes with zero warnings and errors. - Six focused checks pass: `python -I -B tests/run_all.py --jobs 4 file_select_save file_select_layout file_select_presentation file_select_metadata portable_game_home prompt_skip`. - The authored 126-record fixture produces 110 displayed entries across the paged groups. Every displayed entry's focus/tooltip name was checked. The real-save regression fails before the presentation fix (two green tunics and two stick-bag tiers) and passes after it (one of each). - Windows frame geometry was checked at 100%, 125%, 150%, 200% and 250% scaling. The client canvas stays 1004 by 641 pixels. - Native `--list` reports installed v2.1.0 and all three existing files. All 72 checked save/game-file hashes stayed unchanged after installing the final launcher. Earlier native integration booted each of those three files through the shared game root and synchronized on exit. - Full Windows suite after the upstream merge: **463 passed, 2 failed, 34 skipped in 256 seconds**. The two failures are in unchanged checks: `nx2/test_nup_paths.py` cannot create file symlinks without Windows privilege; `tests/test_input_background.py` encounters LLVM's unused-but-set-global warning in `tests/input_background_test.c`. This is not a green full-suite result. Test system: Windows 11 Pro 10.0.26300, Ryzen 7 5800X3D, 32 GB RAM, RTX 3080 Ti driver 610.88; installed game v2.1.0 (`633eb435`) unchanged. The measured run is recorded in `docs/tested-configurations.md`. ### Screenshots and remaining verification These are outputs of the actual native renderer, with verification captions outside the menu. The first reads the existing File 1; the second uses authored test progress and a placeholder landscape. The latest polished menu has not had a fresh live input/gameplay pass, and no other-OS or performance result is claimed. This PR is a **draft** pending that final live pass and CI review. ![Existing save, native rendered preview](https://raw.githubusercontent.com/Anarkkie/Hookshot/97ec97279977a6b32afe6fb0e561d2c3a549e737/docs/images/windows-file-select.png) ![Fully populated authored test save, native rendered preview](https://raw.githubusercontent.com/Anarkkie/Hookshot/97ec97279977a6b32afe6fb0e561d2c3a549e737/docs/images/windows-file-select-full.png) <!-- github-sync:item:2842 -->
Keep named save profiles under one game root, with recoverable swaps and
sync on exit. Build the native selector through the existing Windows setup
pipeline and show decoded progress with locally generated artwork.

Cover save transactions, decoding, presentation, fixed layout, metadata
validation and build integration. Document measured results and limitations.

Assisted-by: OpenAI Codex and GPT-6 Astra
Co-Authored-By: OpenAI Codex <[email protected]>
Commenting is not possible because the repository is archived.
No description provided.