Generalize the project from a single GB4 fix into a collection that can host
ultrawide patches for many games.
- games/<Game>/{SUWSF.ini,game.conf,README.md}; GB4 moved in as the first entry
- game.conf carries all game-specific data (appid, exe, paths, loader, launch
option), so install.sh is fully generic: ./install.sh <Game> [uninstall]
- installer gains GAME_DIR / PREFIX_INI_FILE / LOADER_NAME overrides; verified
install -> idempotent re-run -> uninstall leaves the tree pristine
- tools de-hardcoded: dump_decrypted.py takes an exe name, read_protonlog.sh
takes an appid, aob.py takes a dump + game ini, build_release.sh takes a game
- README rewritten as an umbrella index with an "adding a game" guide
- LICENSE copyright -> programmingPug
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
54 lines
3.0 KiB
Markdown
54 lines
3.0 KiB
Markdown
# 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](https://github.com/PhantomGamers/SUWSF) + [Ultimate ASI Loader](https://github.com/ThirteenAG/Ultimate-ASI-Loader).
|
||
|
||
## Supported games
|
||
|
||
| Game | Engine | Status |
|
||
|---|---|---|
|
||
| [Gundam Breaker 4](games/GundamBreaker4/) | Unreal Engine 4.27 | ✅ Confirmed working in gameplay at 5120×1440 |
|
||
|
||
## Install
|
||
|
||
```bash
|
||
./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`](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](LICENSE). Bundled third-party components (SUWSF, Ultimate ASI Loader) are MIT and credited in [THIRD_PARTY.md](THIRD_PARTY.md). You must own the games; nothing here modifies or circumvents copy protection.
|