Skip to content

Linux, Mod Support, Game update 1.0.1 and performance improvements

Choose a tag to compare

@github-actions github-actions released this 28 Oct 14:50
· 37 commits to main since this release

HWDER v0.3.0

HWDER v0.3.0 adds a native Linux release: a Setup window (or a terminal setup) that builds the game from your own files on your machine, with Steam integration and no container. It was developed and tested on a ROG Ally running Bazzite, in Game Mode and on the desktop. Both platforms gain a mods folder (LayeredFS), and Setup now recognises an older install and offers an Update instead of starting the old game. The build tools Setup downloads are checked once and then shared, so updates no longer re-install or re-check them. A round of GPU-thread work keeps busy battles at 120 fps in 120 fps mode on the Ally.

Highlights

  • Linux release. Download HWDER-linux-x86_64-v0.3.0.tar.gz, extract it and run hwder-setup. The Setup window (or hwder-setup --cli in a terminal) checks your game, keys and update 1.0.1, downloads a pinned build toolchain (checked by SHA-256) and builds the game on your machine. It adds menu entries and can add the game to Steam, so it starts from Game Mode. No container, no extra packages: it needs only Python 3, which Bazzite, SteamOS, Fedora, Ubuntu and Arch include.
  • Mods folder. Files in mods are laid over the game's files (LayeredFS), on Windows and Linux. See the README.
  • Setup offers Update. Opening a newer Setup over an existing install shows Update, with the installed and the new version named above the button. Before, a newer Setup could keep starting the old game.
  • Faster Setup. The private build tools are checked against their published SHA-256 when downloaded, then only by a quick stamp. One copy is shared by every Setup you unpack, so an Update reuses it. Repair private tools re-checks everything on request.
  • Smoother busy battles. The renderer's GPU thread does much less work per draw (command recording on a worker thread, fast clears, cheaper caches, no periodic 20 ms hitch from the geometry cache). On the Ally, the busiest battle tested holds 119-120 fps in 120 fps mode. 120 fps mode no longer adds frames while the game runs at 30 fps (video cutscenes), and smooth zooms are blended instead of dropping the extra frame.
  • AMD/Mesa fix. On GPUs without the D24S8 depth format (AMD with Mesa 26 RADV), battles rendered no ground, walls or characters. Depth now falls back to D32S8. Thanks to drewb583, whose amd-fixes branch (1d78229) this fix was ported from.

Install / upgrade

  • Windows: unzip HWDER-setup-v0.3.0.zip anywhere and open HWDER Setup.exe. On an existing install the main button says Update: it rebuilds the game (a few minutes; the tools are reused). Saves and settings are kept in %LOCALAPPDATA%\HWDER\play (saves in play\save).
  • Linux: extract HWDER-linux-x86_64-v0.3.0.tar.gz and run hwder-setup (double-click it, or run it from a terminal). First install: about 15 minutes on a ROG Ally, including the toolchain download. Later versions: run the new hwder-setup and choose Update. Saves live in ~/.local/share/HWDER/save, mods in ~/.local/share/HWDER/mods. Your game, keys and update files are read where they are and never copied.
  • Nothing from the game ships with HWDER: you need your own dump of the game, your prod.keys and, optionally, update 1.0.1.

Details

Linux

  • Native Linux port of the runtime: guest memory and threads, file system and saves, NSP services, timing, SDL window and input, Vulkan surface, SDL audio and an FFmpeg H.264 decoder (d27f24e, da0ac6f, f5496b2, 32b9003, 3765ab7, 4560559, b878524).
  • Write watch on Linux with userfaultfd write-protect and PAGEMAP_SCAN (8187ec6).
  • Player release: Setup backend and Setup window, tarball packaging and a GitHub Actions job (0b2ef2e, b67888a). Builds use a pinned Zig toolchain targeting glibc 2.35 and prebuilt static SDL3, FFmpeg (H.264 only) and libcrypto (7d9b833, a09b0dd). Only the last good build is kept.
  • Setup window: system file picker; pointer offset under display scaling fixed (7850a67).
  • Add to Steam (dfd3269, c5efc65, 3ae4c2e, 25de4dd); game update 1.0.1 via --update (23a42aa, 61e3828).
  • Saves default to $XDG_DATA_HOME/HWDER/save (5ef750a).
  • Error dialogs as message boxes; crash report with a backtrace in hwder.log (a83c4a8).
  • Audio: the mixer stays locked to the output device and no longer pads with silence, which fixes buzzing, robotic sound on PipeWire (115e1bd).

Windows

  • A newer Setup shows Prepare/Update instead of Play (82e775f, aeda035).
  • The save root stays an absolute long path; pre-release builds made by Setup used a folder below the game folder (c111a0d). v0.2.2 was not affected.

Setup (both platforms)

  • Update detection by kit version (aeda035, 5a81d37).
  • Tools: verified once from the SHA-256-checked downloads, then a stamp; Repair private tools (beba881); one shared toolset for every kit folder, older installs adopted without re-hashing (0bc31d7); relative tool paths with .. (a5926da).
  • Release kit from one command and from GitHub Actions (97467ac); licence notices checked against the pinned archive (4c7d407).

Runtime and graphics

  • GPU thread: per-draw work, descriptor-set reuse, flat hash maps for geometry, texture-header and index caches, cache probes (7eae304, 006969b, 57f18b9, cfdc012, ddfed10, f3496cd).
  • Vulkan: work submitted on its own thread, in order (56b05b5); command buffers recorded on a worker thread (c216e45); presents queued only after their frame is submitted, fixing a GPU hang (77d769c, 34deaf1); fast colour clears (61f2661); D24S8 to D32S8 depth fallback (b19eab3).
  • Geometry cache swept in slices instead of a full rebuild every 300 frames (f207fc9, 3f32766).
  • Pipeline warm-up recipes kept across builds (e7bb3ff).
  • 120 fps mode: objects blended on their own thread (ffd800b); smooth zooms blended (1e4ad64); no extra frames at a 30 fps game tick (b32c538).
  • Guest draw path: SDK libc as host calls, register caching (561bf24); texture write watch queried once per guest submission (61c2571).
  • Mods folder (LayeredFS) laid over the game RomFS (6721630).
  • Controller: a pad family without a saved layout follows the button-label setting, so A/B match their labels (319fe25).

Tooling and tests

  • Linux autoplay harness with per-thread stats, GPU timing and a muted audio check that fails on the game's own dry-run or dropped-audio counters (cba01eb, af2ea14, 50db100, 115e1bd, 5931cfe, 081ad46).
  • Public link fixture follows the named hooks; managed build test checks the compile call (a5926da); debug-switch table sorted again, so run_synthetic.py runs end to end (c7b2a67).
  • README leads with what HWDER adds and a Setup quickstart; mods listed (797058f, 5511a78).

Known issues

  • Linux is tested on a ROG Ally (Z1 Extreme, RADV, Mesa 26) running Bazzite only. Other distributions and GPUs should work (glibc 2.35 or newer, Vulkan 1.3, an AVX2 CPU) but are untested; SteamOS is untested.
  • On Linux the first audio report after start-up can show the output running dry while the device starts; it settles within seconds.
  • An Update spends 10-20 s on "Checking your game", because Setup hashes the whole game file to confirm it is unchanged. Setup's small private Python is also checked on every run.

SHA-256:
c84a851e038d6135d70de4ebead08c36f6cd011630f000312b41450a942e6bcb HWDER-linux-x86_64-v0.3.0.tar.gz
96fe3f83fcedcd20013cd52558338f50199e08091b97aa98252c53686c0712a5 HWDER-setup-v0.3.0.zip