ckochandClaude Opus 4.8 b9e68fd284 UI tuner: fix stale readback and World-Space label lever
Two defects in the tuner, both visible in the in-game logs:

1. AFTER lines read Canvas.scaleFactor immediately after writing, but that is
   recomputed in CanvasScaler.Update(), so it reported last frame's value
   (showed 1.3333 after ref was set to 1350). Now prints the mathematically
   expected scale instead.

2. WORLD_SCALE set CanvasScaler.scaleFactor on WorldSpace canvases, which
   HandleWorldCanvas() overwrites with dynamicPixelsPerUnit every frame - the
   log showed 'APPLIED scaleFactor 1 -> 0.8' followed by effectiveScale=1.0.
   World-space label size is driven by the canvas transform localScale, so it
   now scales that, stashing a baseline child so repeated runs don't compound.

Also documents that MATCH must stay 1.0: match .8 + ref 1350 yields 1.281 vs
1.067 at match 1, largely cancelling the shrink.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-21 16:04:56 -04:00
2026-07-21 12:03:21 -04:00

UltraWidePatches

Ultrawide (32:9 / 21:9) fixes for PC games that ship with poor or no ultrawide support — built and tested on a Samsung 49" Odyssey G93SC (5120×1440), and Proton/Linux-first.

Most of these force Hor+ FOV (a wider screen shows you more, instead of zooming the camera in) and disable pillarboxing, by patching the game in memory at runtime with SUWSF + Ultimate ASI Loader.

Supported games

Game Engine Status
Gundam Breaker 4 Unreal Engine 4.27 Confirmed working in gameplay at 5120×1440

Install

./install.sh                    # list available patches
./install.sh GundamBreaker4     # install one
./install.sh GundamBreaker4 uninstall

The installer finds the game across your Steam libraries, drops the loader + patch next to the executable, and applies any config-level tweak (with a backup). It never modifies game files.

Proton users: each game needs a WINEDLLOVERRIDES launch option or the loader is silently ignored — the installer prints the exact line for that game. This is the single most common reason a fix "doesn't work."

Windows users can extract a release zip straight into the game's exe folder; no launch option needed.

Why runtime patching

Config-file tweaks (e.g. UE4's AspectRatioAxisConstraint=MaintainYFOV) typically fix menus but revert once gameplay loads, because the game re-sets the camera per view. Many shipping executables are also DRM-encrypted on disk (GB4's is SteamStub-wrapped, .text entropy 8.0), which makes static exe patching impossible. Patching the decrypted image in memory solves both problems at once.

Repo layout

Path What
games/<Game>/SUWSF.ini That game's patch definitions
games/<Game>/game.conf Game metadata (appid, exe, paths, launch option)
install.sh Generic installer / uninstaller
tools/build_release.sh Builds a per-game drop-in release zip
tools/publish.sh Pushes + cuts a GitHub release
tools/dump_decrypted.py Dumps a DRM-decrypted image from a running process
tools/aob.py Verifies/derives byte patterns against a dump
tools/read_protonlog.sh Confirms ASI injection + per-patch match counts
vendor/SUWSF-x64/ Upstream SUWSF 2.3.0 + Ultimate ASI Loader (MIT)

Adding a game

  1. mkdir games/<GameName> with a game.conf (copy GB4's as a template) and a SUWSF.ini.
  2. Start from the known UE4 patterns in games/GundamBreaker4/SUWSF.ini — they match across many UE4 titles.
  3. If a pattern misses, use tools/dump_decrypted.py + tools/aob.py to derive the game's exact bytes.

License

MIT — see LICENSE. Bundled third-party components (SUWSF, Ultimate ASI Loader) are MIT and credited in THIRD_PARTY.md. You must own the games; nothing here modifies or circumvents copy protection.

S
Description
No description provided
Readme MIT
5.9 MiB
v1.2.0
Latest
2026-07-21 17:35:37 -04:00
Languages
C# 40.5%
Shell 34.4%
Python 25.1%