feat(launcher): the Longshot Launcher, ported from Hookshot's launcher and renamed #12

Closed
HumanBean wants to merge 1 commit from HumanBean/Longshot:feat/launcher into main
Owner

Longshot has no launcher yet, so players would still get the 2.x Builder. This brings over Hookshot's 3.0 launcher and renames it to Longshot, so that the next release can ship it.

What comes over

I looked at three Hookshot launcher trees. The most complete one is feat/hookshot-launcher (~/Projects/Hookshot-launcher-base, with the core, the Avalonia app, the screens from the mockup and the core tests). The other two are related changes that are not ported here: the clickable HTML mockup is a design document, and the 2.x Builder's "hand over to the launcher" change (Hookshot #2722) belongs to the Builder.

  • launcher/Core and launcher/App: the launcher (.NET 10, Avalonia 12.1.6, pinned with lock files).
  • tests/launcher_core and tests/test_launcher_core.py: the core's checks (no game, no network, no window), run by tests/run_all.py.
  • docs/launcher-upgrade.md and tests/fixtures/launcher: the 2.x hand-over contract. Only the launcher's side is in Longshot, and no Longshot 2.x Builder writes a hand-over. The reader (LegacyImport) finds nothing and stays quiet. I kept it so a hand-over can be added later without touching the launcher. Removing it is easy if you'd rather not have it.
  • CI (source-regressions.yml): sets up .NET 10 beside .NET 8, compiles the launcher with warnings as errors, and runs the core tests.

What was renamed

  • The product, window title and texts: Hookshot to Longshot / Longshot Launcher.
  • The program, projects and namespaces: LongshotLauncher(.exe), LongshotLauncher.slnx, LongshotLauncher.Core.
  • Folders: the launcher's home %LOCALAPPDATA%\LongshotLauncher and ~/.local/share/longshot/launcher, builds in ~/Games/Longshot, and Longshot's save and data paths as scripts/oot_saves.py already has them.
  • Variables: LONGSHOT_LAUNCHER_HOME, _OFFLINE, _PARTS, _REDUCED_MOTION, plus the game's LONGSHOT_*.
  • Shortcuts: longshot.desktop, Longshot.lnk, and the AppImage name Longshot.AppImage.
  • The icon is the Longshot logo already in main: assets/longshot.png for the window and the title bar, and builder/setup/longshot.ico as the Windows program's icon. No placeholder was needed.

Two other changes came with the move:

  • The version vectors the core is checked against are now the test's own. Longshot's tests/test_update_tracks.py has no nightly-<count>-<commit> names.
  • The update check asks git.magicbean.dev's releases instead of GitHub. That is a stopgap: the follow-up PR replaces it with signed release files.

Tests

  • python -I -B tests/test_launcher_core.py --dotnet ~/.dotnet/dotnet: 453 checks passed.
  • dotnet build launcher/LongshotLauncher.slnx -c Release -p:RestoreLockedMode=true: no warnings, no errors (Linux, .NET SDK 10.0.404).
  • python -I -B tests/run_all.py: 457 passed, 2 failed, 70 skipped. The two failures are this PC's, not the change's: test_bake_portability.py needs the zstandard module and test_builder_log_read_only.py needs Tk, and neither is installed here. The skips are GPU, Vulkan-header and Windows-only checks.

Not tested: the Windows build and a real build of the game through the launcher (no game run).

Screenshots

Linux, drawn headless with Avalonia's Skia renderer and a temporary home:

Nothing built yet:

The home with no build

Two builds, with an update offered:

The home with two builds

Longshot has no launcher yet, so players would still get the 2.x Builder. This brings over Hookshot's 3.0 launcher and renames it to Longshot, so that the next release can ship it. ## What comes over I looked at three Hookshot launcher trees. The most complete one is `feat/hookshot-launcher` (`~/Projects/Hookshot-launcher-base`, with the core, the Avalonia app, the screens from the mockup and the core tests). The other two are related changes that are not ported here: the clickable HTML mockup is a design document, and the 2.x Builder's "hand over to the launcher" change (Hookshot #2722) belongs to the Builder. - `launcher/Core` and `launcher/App`: the launcher (.NET 10, Avalonia 12.1.6, pinned with lock files). - `tests/launcher_core` and `tests/test_launcher_core.py`: the core's checks (no game, no network, no window), run by `tests/run_all.py`. - `docs/launcher-upgrade.md` and `tests/fixtures/launcher`: the 2.x hand-over contract. Only the launcher's side is in Longshot, and no Longshot 2.x Builder writes a hand-over. The reader (`LegacyImport`) finds nothing and stays quiet. I kept it so a hand-over can be added later without touching the launcher. Removing it is easy if you'd rather not have it. - CI (`source-regressions.yml`): sets up .NET 10 beside .NET 8, compiles the launcher with warnings as errors, and runs the core tests. ## What was renamed - The product, window title and texts: Hookshot to **Longshot** / **Longshot Launcher**. - The program, projects and namespaces: `LongshotLauncher(.exe)`, `LongshotLauncher.slnx`, `LongshotLauncher.Core`. - Folders: the launcher's home `%LOCALAPPDATA%\LongshotLauncher` and `~/.local/share/longshot/launcher`, builds in `~/Games/Longshot`, and Longshot's save and data paths as `scripts/oot_saves.py` already has them. - Variables: `LONGSHOT_LAUNCHER_HOME`, `_OFFLINE`, `_PARTS`, `_REDUCED_MOTION`, plus the game's `LONGSHOT_*`. - Shortcuts: `longshot.desktop`, `Longshot.lnk`, and the AppImage name `Longshot.AppImage`. - The icon is the Longshot logo already in `main`: `assets/longshot.png` for the window and the title bar, and `builder/setup/longshot.ico` as the Windows program's icon. No placeholder was needed. Two other changes came with the move: - The version vectors the core is checked against are now the test's own. Longshot's `tests/test_update_tracks.py` has no `nightly-<count>-<commit>` names. - The update check asks git.magicbean.dev's releases instead of GitHub. That is a stopgap: the follow-up PR replaces it with signed release files. ## Tests - `python -I -B tests/test_launcher_core.py --dotnet ~/.dotnet/dotnet`: 453 checks passed. - `dotnet build launcher/LongshotLauncher.slnx -c Release -p:RestoreLockedMode=true`: no warnings, no errors (Linux, .NET SDK 10.0.404). - `python -I -B tests/run_all.py`: 457 passed, 2 failed, 70 skipped. The two failures are this PC's, not the change's: `test_bake_portability.py` needs the `zstandard` module and `test_builder_log_read_only.py` needs Tk, and neither is installed here. The skips are GPU, Vulkan-header and Windows-only checks. Not tested: the Windows build and a real build of the game through the launcher (no game run). ## Screenshots Linux, drawn headless with Avalonia's Skia renderer and a temporary home: Nothing built yet: ![The home with no build](https://git.magicbean.dev/attachments/f174f92f-9a7c-44ef-abc3-46d05b74d6b3) Two builds, with an update offered: ![The home with two builds](https://git.magicbean.dev/attachments/7b86605e-4226-4407-a53b-3b62f2e8deeb)
The launcher (launcher/Core, launcher/App, Avalonia, .NET 10) from Hookshot's
feat/hookshot-launcher branch, its core tests (tests/launcher_core,
tests/test_launcher_core.py) and the hand-over contract (docs/launcher-upgrade.md,
tests/fixtures/launcher), renamed to Longshot: the program LongshotLauncher(.exe),
the projects and namespaces, the window title, the home folders
(%LOCALAPPDATA%\LongshotLauncher, ~/.local/share/longshot/launcher), ~/Games/Longshot,
the LONGSHOT_LAUNCHER_* variables, the shortcuts and the AppImage name. The logo is
assets/longshot.png, and the Windows program's icon builder/setup/longshot.ico.

The version vectors the core is checked against are now the test's own: Longshot's
tests/test_update_tracks.py has no nightly-<count>-<commit> names. The release check
asks git.magicbean.dev's releases until the release and update redesign replaces it.
CI compiles the launcher and runs its core tests with .NET 10.
Author
Owner

Closing: the launcher now lives in its own repository, released apart from Longshot. Its pull request is MagicBeanDev/LongshotLauncher#1 (the port, the clean break at v3.0.0, the Hookshot save importer, its CI and releases). Longshot's side, the game's release process, is #13.

Closing: the launcher now lives in its own repository, released apart from Longshot. Its pull request is https://git.magicbean.dev/MagicBeanDev/LongshotLauncher/pulls/1 (the port, the clean break at v3.0.0, the Hookshot save importer, its CI and releases). Longshot's side, the game's release process, is #13.
HumanBean closed this pull request 2026-11-12 23:03:05 +00:00
Author
Owner

Closing: the launcher moves to its own repository, MagicBeanDev/LongshotLauncher, where it comes in as one PR (launcher releases and updates are separate from Longshot's). The code stays on this branch until then.

Closing: the launcher moves to its own repository, MagicBeanDev/LongshotLauncher, where it comes in as one PR (launcher releases and updates are separate from Longshot's). The code stays on this branch until then.

Pull request closed

Sign in to join this conversation.
No description provided.