feat(saves): add player profiles and progress previews #55

Open
Anarkkie wants to merge 19 commits from Anarkkie/LongshotLauncher:feat/player-save-previews into main
First-time contributor

Players sharing a PC need separate named playthroughs and a way to recognize their progress before starting a version. This adds remembered player selection and read-only save previews to Home and Saves, following the launcher's existing theme and save-transfer flow.

What changed

  • Named players use stable folders independent of display names and game versions. Default keeps the existing save environment. Selection and rename persist; running games, corrupt metadata, ambiguous accounts and stale confirmations cannot silently select another player's saves. Uninstall preserves profile folders even when their index is unavailable.
  • Home shows the selected player's latest save; Saves lets the player select a slot and inspect its screenshot, location, vitals and supported inventory. Empty players and unavailable data clear the previous preview.
  • Usable items, equipment and trading items are separate from upgrades and collectibles. Swords, shields, tunics, arrows and bottles stay with their families. Spiritual stones and medallions have separate rows; six normal songs sit above six warp songs, with Scarecrow separate.
  • Rupees are right-aligned below the screenshot, above ten-heart rows. Unlocked magic has its own row below, with optional native segments at the same scale for normal and double capacity. Locked magic has no row.
  • Current stock determines replaceable tools, gear and trading items; permanent rewards and depleted consumables retain supported unlock state. Replacement tiers collapse to the appropriate highest tier. The preview does not claim equipped state, age eligibility, quest completion or playable Scarecrow notes.
  • Optional artwork and song metadata are prepared locally with scripts/extract_save_icons.py. The branch ships no game artwork or metadata. Missing, corrupt, linked or unsupported assets fall back without losing the rest of the preview. The authored item catalog retains its MIT notice.

Alignment with accepted upstream

Includes accepted main 9b3d202, including the translation system, first-import destination work, NX2navi import, Hookshot settings import and current crash-log discovery. This replaces the earlier proposal's temporary first-save prerequisite and outstanding integration notes for #47 and #52, which have now merged.

  • Empty named players import through upstream Saves.ImportTarget; previews use the same game account and ignore stray account folders. Import/export confirmations revalidate the selected player and destination.
  • New UI labels use Tr and refresh when the language changes without losing player/slot selection. 59 new strings use the accepted English fallback pending translation.
  • Hookshot game settings remain scoped to an explicitly selected build, independent of the player-save directory. Startup crash-page diversion releases its unused Home preview.
  • Upstream's ambiguous-account export guard remains intact. A real account plus a stray account may still block export.

This remains a framework contribution for maintainers to adapt as the launcher grows. Automatic icon extraction during installation and the long-term profile-storage policy remain maintainer decisions. Open #54, #57, #58 and #61 were inspected but are not included; some touch shared launcher/build files and may need merge-order coordination.

Validation

Feature code: 5bca18c; latest accepted main: 9b3d202. The accompanying documentation records source revisions and measured configurations in docs/tested-configurations.md.

Scope Result
Standalone profile integration e4893d5, Linux / .NET 10.0.404 Strict core 1,089, release 28, icon exporter 4, metadata 6; all pass.
Standalone profile integration, Windows headless UI 290 checks pass.
Final private integration ae3c27e, after accepted #60 Windows/Linux strict core 1,120 / 1,145; headless UI 290 / 289; Linux release 28, exporter 4, metadata 6; all pass.
Locked Release builds, Windows and Linux 0 warnings, 0 errors.
Actual Avalonia Home/Saves at 960 x 600 Early/advanced/empty saves; art fallback; 3/10/11/20 hearts; both magic capacities; grouped progress; first imports; stale confirmations; language switching; settings/build separation and preview lifetime covered.

The final private integration also includes the Windows filesystem fixes in #64 and source-built game-layout fix in #63. Its full Windows-suite result is not a standalone pass for this profile branch. The standalone branch retains the upstream Windows core-runner failures addressed by those fixes. Windows successful-symlink fixtures explicitly report unavailable privilege; their complete Linux coverage passes. Linux release tests emit existing Python socket ResourceWarnings.

Native acceptance used nightly-80-7315957c (source cdf3d9d8), Kokiri Forest, Windows 11 Pro 10.0.26300, RTX 3080 Ti / NVIDIA 610.88, Ryzen 7 5800X3D and 32 GB RAM. Early QA -> Upgraded QA -> Early QA, reopening the launcher service for each run, loaded the correct selected save every time: three hearts -> twenty hearts with magic/upgraded ammunition -> three hearts. All three runs rendered the settled scene, accepted movement and exited 0. All 70 pre-existing and 28 copied test-save files retained their hashes. These runs used combined e262bd6; launch/routing/preview source is unchanged by the final crash-log-only merge to ae3c27e.

Native checks were offscreen through the game's control bridge with HOS_HEADLESS=1, HOS_AUDIO=0, RX_VK_LOAD=create and RX_VK_PRECOMPILE unset. The advanced fixture was edited in an isolated copy, not obtained through a completed playthrough. Earlier game-write/readback checks retained all 85 supported displayed records. Not every natural unlock event, native Linux/Steam Deck window, physical controller, stable game build or newly packaged single-file release has been exercised. No performance improvement is claimed.

Screenshots

Current Home and Saves at 960 x 600, showing the upgraded test copy. Update and both screenshots.

Upgraded test copy on Home

Upgraded test copy in Saves

The earlier early-progress and fallback screenshots remain available.

Risk and rollback

The main risks are player-directory routing, import destinations and future save-schema changes. Routing fails closed for missing/corrupt profiles; parsing is bounded and read-only. Unknown fields remain unavailable. Selecting Default restores the original save environment. Reverting the feature leaves named-player folders intact; preserve/export them rather than deleting them.

Only source, authored fixtures, documentation and permitted launcher screenshots are shared. Game files, saves, extracted textures and generated game metadata remain local.

AI-assisted implementation and independent source review with OpenAI Codex; all validation above ran locally.

Players sharing a PC need separate named playthroughs and a way to recognize their progress before starting a version. This adds remembered player selection and read-only save previews to Home and Saves, following the launcher's existing theme and save-transfer flow. ## What changed - Named players use stable folders independent of display names and game versions. Default keeps the existing save environment. Selection and rename persist; running games, corrupt metadata, ambiguous accounts and stale confirmations cannot silently select another player's saves. Uninstall preserves profile folders even when their index is unavailable. - Home shows the selected player's latest save; Saves lets the player select a slot and inspect its screenshot, location, vitals and supported inventory. Empty players and unavailable data clear the previous preview. - Usable items, equipment and trading items are separate from upgrades and collectibles. Swords, shields, tunics, arrows and bottles stay with their families. Spiritual stones and medallions have separate rows; six normal songs sit above six warp songs, with Scarecrow separate. - Rupees are right-aligned below the screenshot, above ten-heart rows. Unlocked magic has its own row below, with optional native segments at the same scale for normal and double capacity. Locked magic has no row. - Current stock determines replaceable tools, gear and trading items; permanent rewards and depleted consumables retain supported unlock state. Replacement tiers collapse to the appropriate highest tier. The preview does not claim equipped state, age eligibility, quest completion or playable Scarecrow notes. - Optional artwork and song metadata are prepared locally with `scripts/extract_save_icons.py`. The branch ships no game artwork or metadata. Missing, corrupt, linked or unsupported assets fall back without losing the rest of the preview. The authored item catalog retains its MIT notice. ## Alignment with accepted upstream Includes accepted main `9b3d202`, including the translation system, first-import destination work, NX2navi import, Hookshot settings import and current crash-log discovery. This replaces the earlier proposal's temporary first-save prerequisite and outstanding integration notes for #47 and #52, which have now merged. - Empty named players import through upstream `Saves.ImportTarget`; previews use the same game account and ignore stray account folders. Import/export confirmations revalidate the selected player and destination. - New UI labels use `Tr` and refresh when the language changes without losing player/slot selection. **59 new strings use the accepted English fallback** pending translation. - Hookshot game settings remain scoped to an explicitly selected build, independent of the player-save directory. Startup crash-page diversion releases its unused Home preview. - Upstream's ambiguous-account export guard remains intact. A real account plus a stray account may still block export. This remains a framework contribution for maintainers to adapt as the launcher grows. Automatic icon extraction during installation and the long-term profile-storage policy remain maintainer decisions. Open #54, #57, #58 and #61 were inspected but are not included; some touch shared launcher/build files and may need merge-order coordination. ## Validation Feature code: `5bca18c`; latest accepted main: `9b3d202`. The accompanying documentation records source revisions and measured configurations in `docs/tested-configurations.md`. | Scope | Result | |---|---| | Standalone profile integration `e4893d5`, Linux / .NET 10.0.404 | Strict core **1,089**, release **28**, icon exporter **4**, metadata **6**; all pass. | | Standalone profile integration, Windows headless UI | **290** checks pass. | | Final private integration `ae3c27e`, after accepted #60 | Windows/Linux strict core **1,120 / 1,145**; headless UI **290 / 289**; Linux release **28**, exporter **4**, metadata **6**; all pass. | | Locked Release builds, Windows and Linux | **0 warnings, 0 errors**. | | Actual Avalonia Home/Saves at 960 x 600 | Early/advanced/empty saves; art fallback; 3/10/11/20 hearts; both magic capacities; grouped progress; first imports; stale confirmations; language switching; settings/build separation and preview lifetime covered. | The final private integration also includes the Windows filesystem fixes in #64 and source-built game-layout fix in #63. Its full Windows-suite result is **not** a standalone pass for this profile branch. The standalone branch retains the upstream Windows core-runner failures addressed by those fixes. Windows successful-symlink fixtures explicitly report unavailable privilege; their complete Linux coverage passes. Linux release tests emit existing Python socket ResourceWarnings. Native acceptance used nightly-80-7315957c (source `cdf3d9d8`), Kokiri Forest, Windows 11 Pro 10.0.26300, RTX 3080 Ti / NVIDIA 610.88, Ryzen 7 5800X3D and 32 GB RAM. Early QA -> Upgraded QA -> Early QA, reopening the launcher service for each run, loaded the correct selected save every time: three hearts -> twenty hearts with magic/upgraded ammunition -> three hearts. All three runs rendered the settled scene, accepted movement and exited 0. **All 70 pre-existing and 28 copied test-save files retained their hashes.** These runs used combined `e262bd6`; launch/routing/preview source is unchanged by the final crash-log-only merge to `ae3c27e`. Native checks were offscreen through the game's control bridge with `HOS_HEADLESS=1`, `HOS_AUDIO=0`, `RX_VK_LOAD=create` and `RX_VK_PRECOMPILE` unset. The advanced fixture was edited in an isolated copy, not obtained through a completed playthrough. Earlier game-write/readback checks retained all **85** supported displayed records. Not every natural unlock event, native Linux/Steam Deck window, physical controller, stable game build or newly packaged single-file release has been exercised. No performance improvement is claimed. ## Screenshots Current Home and Saves at 960 x 600, showing the upgraded test copy. [Update and both screenshots](https://git.magicbean.dev/MagicBeanDev/LongshotLauncher/pulls/55#issuecomment-17832). ![Upgraded test copy on Home](https://git.magicbean.dev/attachments/fe650533-435c-4399-9a74-4f78e4e69065) ![Upgraded test copy in Saves](https://git.magicbean.dev/attachments/2251ca23-699d-4b97-84e6-ab731a1da3f8) The earlier [early-progress and fallback screenshots](https://git.magicbean.dev/MagicBeanDev/LongshotLauncher/pulls/55#issuecomment-15496) remain available. ## Risk and rollback The main risks are player-directory routing, import destinations and future save-schema changes. Routing fails closed for missing/corrupt profiles; parsing is bounded and read-only. Unknown fields remain unavailable. Selecting Default restores the original save environment. Reverting the feature leaves named-player folders intact; preserve/export them rather than deleting them. Only source, authored fixtures, documentation and permitted launcher screenshots are shared. Game files, saves, extracted textures and generated game metadata remain local. AI-assisted implementation and independent source review with OpenAI Codex; all validation above ran locally.
Keep Default on its existing save root while optional named players have
separate persisted roots shared across game versions. Show bounded read-only
caption previews in the existing launcher and handle unavailable profile data.

Add authored core checks and headless Avalonia interaction coverage. Local
validation: 65 profile checks and 68 headless checks passed; locked Release
build passed. Full Windows suites retain documented upstream/environment
failures. Real-game and native Linux acceptance remain pending.

Assisted-by: OpenAI Codex
Place rupees above health at the screenshot's right edge. Preserve native gauge segments across normal and double capacity, with an honest fallback when local art is unavailable.
Assisted-by: OpenAI Codex
docs(saves): record final upstream comparison
Some checks failed
CI / Conventional Commit title (pull_request) Has been cancelled
CI / Compile and test (pull_request) Has been cancelled
de5eb1c9dd
Author
First-time contributor

Compiled launcher views for this PR at 960 x 600. Local artwork is optional; these are permitted launcher screenshots, not extracted asset attachments.

Early progress after the game writes its save. Magic is hidden until unlocked; rupees sit above the heart row.

Early save on Home

Advanced test copy after a game save: 85 displayed progress records, grouped inventory, two rows of ten hearts and the native magic gauge below them. This is an isolated unlock/transition fixture, not a completed playthrough.

Advanced test copy on Home

The same shared detail card on Saves, with its selected slot.

Advanced test copy on Saves

Optional-art fallback, using authored data only. Values and accessible item names remain available when local textures are absent.

Authored fixture without optional artwork

Compiled launcher views for this PR at 960 x 600. Local artwork is optional; these are permitted launcher screenshots, not extracted asset attachments. Early progress after the game writes its save. Magic is hidden until unlocked; rupees sit above the heart row. ![Early save on Home](https://git.magicbean.dev/attachments/033af200-3a7c-4513-b3b5-2de969555dbc) Advanced test copy after a game save: 85 displayed progress records, grouped inventory, two rows of ten hearts and the native magic gauge below them. This is an isolated unlock/transition fixture, not a completed playthrough. ![Advanced test copy on Home](https://git.magicbean.dev/attachments/3c88c19c-60e3-46b2-89f4-ae9a0b40518c) The same shared detail card on Saves, with its selected slot. ![Advanced test copy on Saves](https://git.magicbean.dev/attachments/64e3ef23-3cc4-45eb-b12e-3c8e4fb8f0ff) Optional-art fallback, using authored data only. Values and accessible item names remain available when local textures are absent. ![Authored fixture without optional artwork](https://git.magicbean.dev/attachments/04ceb797-d5d1-4810-869e-7ba3a3c51db4)
docs(saves): record upstream integration validation
Some checks are pending
CI / Conventional Commit title (pull_request) Blocked by required conditions
CI / Compile and test (pull_request) Blocked by required conditions
8934451faf
Author
First-time contributor

Updated to the accepted launcher main at 9b3d202. Empty-player imports now use the accepted account destination; translation switching, NX2navi imports and build-scoped Hookshot settings are integrated. The refreshed description records standalone and combined validation separately. The independent layout and Windows corrections are #63 and #64.

Current Home and Saves at 960 x 600 use an isolated upgraded test copy with 85 supported displayed records. These are launcher screenshots; saves, extracted art and generated metadata remain local.

Upgraded test copy on Home

Upgraded test copy in Saves

Updated to the accepted launcher main at 9b3d202. Empty-player imports now use the accepted account destination; translation switching, NX2navi imports and build-scoped Hookshot settings are integrated. The refreshed description records standalone and combined validation separately. The independent layout and Windows corrections are #63 and #64. Current Home and Saves at 960 x 600 use an isolated upgraded test copy with 85 supported displayed records. These are launcher screenshots; saves, extracted art and generated metadata remain local. ![Upgraded test copy on Home](https://git.magicbean.dev/attachments/fe650533-435c-4399-9a74-4f78e4e69065) ![Upgraded test copy in Saves](https://git.magicbean.dev/attachments/2251ca23-699d-4b97-84e6-ab731a1da3f8)
First-time contributor

Hey! Thanks for the heads-up about !57. I checked the overlap between our PRs: the only files we both touch are the 12 Core/Lang catalogs and README.md. None of the code overlap, mine just touch the build folder logic in BuildRegistry / LauncherSettings and the wizard. So whichever lands second, just needs a small rebase on the catalogs. Happy to rebase mine if yours goes first!

Hey! Thanks for the heads-up about !57. I checked the overlap between our PRs: the only files we both touch are the 12 Core/Lang catalogs and README.md. None of the code overlap, mine just touch the build folder logic in BuildRegistry / LauncherSettings and the wizard. So whichever lands second, just needs a small rebase on the catalogs. Happy to rebase mine if yours goes first!
Some checks are pending
CI / Conventional Commit title (pull_request) Blocked by required conditions
CI / Compile and test (pull_request) Blocked by required conditions
This pull request doesn't have enough approvals yet. 0 of 1 approvals granted.
Some workflows are waiting to be reviewed.
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u 'feat/player-save-previews:Anarkkie-feat/player-save-previews'
git switch 'Anarkkie-feat/player-save-previews'
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
MagicBeanDev/LongshotLauncher!55
No description provided.