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>
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
WINEDLLOVERRIDESlaunch 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
mkdir games/<GameName>with agame.conf(copy GB4's as a template) and aSUWSF.ini.- Start from the known UE4 patterns in
games/GundamBreaker4/SUWSF.ini— they match across many UE4 titles. - If a pattern misses, use
tools/dump_decrypted.py+tools/aob.pyto 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.