Skip to content

feat(builder): one desktop Flutter builder for Linux and Windows - #2403

Closed
dazemc wants to merge 5 commits into
NotRexed:mainfrom
dazemc:feat/flutter-builder
Closed

dazemc wants to merge 5 commits into
NotRexed:mainfrom
dazemc:feat/flutter-builder

Conversation

@dazemc

@dazemc dazemc commented Nov 11, 2026

Copy link
Copy Markdown

Why

Hookshot has two builder GUIs — Tk on Linux, WPF on Windows — with duplicated build, update, launcher and save logic. They drift: a fix or a profile lands in one and the other keeps its old behaviour. This PR adds one desktop Flutter builder for both systems, built on flutter_bloc and the existing Slate look, and ports the open builder fixes into the shared engine so the same behaviour is tested without a game.

The game never leaves the PC: every build, run and test below used the local dump only; no game file or anything made from it is in this branch.

AI disclosure: this PR was created by the AI coding agent DeepSeek V4.1 Flash 1017 running in OpenCode, using the reporter's Sage tool. The reporter directed the work and tested it locally.

What the Flutter builder does

Ported into the shared engine

Benefits over the split codebases

Split Tk + WPF This branch
Two GUI implementations and two command/@@ parsers One Flutter UI and one BLoC state machine
A fix or option often lands on one OS only Shared Dart behaviour with platform-only gates (gamescope is Linux-only)
Launcher/profile/version work is separate per GUI One launcher screen for both; one profile engine
Update/cancel/download code differs per GUI One Dart updater, tested once, used on both
Inconsistent layouts and icon sets Fluent + Lucide on the same page chrome
Play bypasses the launcher Play always lands on the launcher options

Screenshots

Linux, from this branch:

Linux form
Linux launcher
Linux build log and percentage

Windows 11 26H2 in a VM, flutter build windows --debug from this branch:

Windows launcher

Testing

Linux (CachyOS, RX 7900-class, real 25.6 GB dump):

  • Full build via the Flutter UI: 12:34, shaders prepared; game launched to the title screen from the launcher.
  • Profile 5a3c9e1f0b7d24680000000000000002 selected; hookshot_log.txt says account: profile 5a3c9e1f0b7d24680000000000000002.
  • Gamescope: gamescope -- /home/.../hookshot observed; game precompiled 10,956 programs / 15,330 pipelines.
  • Cancel path exercised and shows "Build cancelled"; cache cleared after layout/log findings.

Windows 11 26H2 VM:

  • flutter build windows --debug succeeds (Visual Studio Build Tools 17.14, Windows SDK 10.0.26100).
  • The app starts, the profile helper finds python.exe (%LOCALAPPDATA%\Programs\Python\Python312), profiles load, and free space reads correctly; gamescope is absent as intended.
  • A full Windows game build was not run in the VM (the game dump and llvm-mingw toolchain were not copied into it); this remains the one unverified platform path.

Checks:

  • python -I -B tests/run_all.py: 368 passed, 10 skipped, 1 failed — tests/test_updater_asset_digest.py cannot resolve .NET 8 reference packs in this environment (pre-existing).
  • dart analyze lib test: clean.
  • flutter test: 40 passed.
  • flutter build linux --debug and flutter build windows --debug: succeed.

Follow-ups (not this PR)

  • Flutter packaging in the Linux AppImage and Windows setup (the old Tk/WPF apps are still what the current release pipeline packages).
  • Separate versions for the builder GUI, the nx2 engine/toolchain and the built game; the header now labels the builder (Builder 1.0.0) and tools separately, but the release/update pipeline still uses one tag.
  • Setup: fall back when Windows' tar.exe is missing #1896 (Windows setup tar.exe fallback) and Shader prepare time #2218 (shader preparation time on slow AMD drivers).
  • Full Windows game build with the Windows toolchain.

Closes #2237, #2246, #2142, #2257, #2242, #2129, #1388, #2287 (launcher rebuild), #1958, #1414, #2275, #1759, #2160, #2159, #2150, #2141, #2201, #2254, #2253, #2250, #2137, #2096, and #2045 item 3. #1002, #1700 and #2005 are the damage evidence this warning path is for.

…lder

Add the desktop Flutter builder (Linux and Windows) with BLoC state, a
game launcher with profiles, version pinning, gamescope options and a
launcher rebuild action. Port the open builder fixes into the shared
engine: damaged-file notes and stop, UTF-8 cache stamps, scoped cleanup,
comma-safe linker options, repository-relative updates, CPU-aware shader
prep, the AppImage PPA retry and profiles. Add game-free tests for each.
@hckrman101

Copy link
Copy Markdown
Collaborator

@dazemc Hey! This is great work. We are having discussions of replacing the builder UI with a 'launcher', with a cross-platform tool, similar to this. Please join the Discord and join the conversation!

@Arkex-ai

Copy link
Copy Markdown
Contributor

Thanks for linking the existing fixes. I maintain #2096, #2250, #2367 and #2406; there is useful overlap in the shared engine.

A few integration points from e1a79eb7:

Could we coordinate the launcher direction with #2373 in the Discord discussion, while keeping engine fixes independently reviewable? I also have the requested workarea/scroll fallback and live release-label checks locally; I'll hold separate UI publication while that direction is being agreed.

@hckrman101

Copy link
Copy Markdown
Collaborator

Hey, because of the launcher work in #2373, which will replace this UI completely and will use Avalonia (agreed to in Discord), I am going to close this. Thank you again for your contribution!

@hckrman101 hckrman101 closed this Nov 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Warn users about damaged-dump texture stand-ins where they will see it (Builder UI, game folder note)

3 participants