Compare commits
5
Commits
v1.1.0
...
2f781f95c9
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2f781f95c9 | ||
|
|
1176df8f20 | ||
|
|
15d0169f56 | ||
|
|
6f24502956 | ||
|
|
0833cf8495 |
@@ -0,0 +1,52 @@
|
||||
# Changelog
|
||||
|
||||
Versioning applies to the collection as a whole: **adding a game is a minor bump**,
|
||||
fixes/tuning to existing entries are patch bumps.
|
||||
|
||||
## v1.2.0 — Clair Obscur: Expedition 33
|
||||
|
||||
- **New game: Clair Obscur: Expedition 33** (Unreal Engine 5, no DRM) — ⚠️ partial support.
|
||||
Adds a third install method, `external`: where a good third-party fix already
|
||||
exists and its license allows redistribution, it is vendored **unmodified**
|
||||
with our tuned config and full credit, rather than reimplemented.
|
||||
The fix itself is [ClairObscurFix](https://github.com/Lyall/ClairObscurFix)
|
||||
by **Lyall** (MIT).
|
||||
- Ships a **reduced profile** (only `Center HUD` enabled). Upstream v0.0.10 is
|
||||
archived and predates current game builds; with full features it crashed on
|
||||
save load. Documented with a revalidation checklist rather than marked working.
|
||||
- `publish.sh` now cuts **one release for the whole collection**, attaching every
|
||||
game's zip, and replaces same-named assets so re-runs are idempotent.
|
||||
|
||||
## v1.1.0 — Burglin' Gnomes *(never released; folded into v1.2.0)*
|
||||
|
||||
- **New game: Burglin' Gnomes** (Unity 6, Mono) — ✅ confirmed working at 5120×1440.
|
||||
Adds the `bepinex` install method and a purpose-built C# plugin.
|
||||
- Camera deliberately untouched: it is orthographic with a constant
|
||||
`orthographicSize`, which is already correct Hor+ at 32:9. The entire problem
|
||||
was UI scaling.
|
||||
- Fixes HUD canvases (`match=1` + raised `referenceResolution.y`) and world-space
|
||||
labels (canvas `localScale` — `CanvasScaler.scaleFactor` is overwritten every
|
||||
frame for WorldSpace canvases).
|
||||
- Config reloads live (~2s) without a game restart.
|
||||
|
||||
## v1.0.0 — Gundam Breaker 4
|
||||
|
||||
- **New game: Gundam Breaker 4** (Unreal Engine 4.27, SteamStub DRM) — ✅ confirmed
|
||||
working at 5120×1440.
|
||||
- Forces Hor+ FOV via `AspectRatioAxisConstraint = MaintainYFOV` and disables
|
||||
pillarboxing, patched in decrypted memory at runtime with
|
||||
[SUWSF](https://github.com/PhantomGamers/SUWSF) — the exe is DRM-encrypted on
|
||||
disk, so static patching is impossible.
|
||||
|
||||
---
|
||||
|
||||
### Unreleased infrastructure changes
|
||||
|
||||
These landed between v1.0.0 and v1.2.0 and are not tied to a single game:
|
||||
|
||||
- Restructured from a single-game repo into a multi-game collection
|
||||
(`games/<Game>/` + `game.conf`), so `install.sh` is game-agnostic.
|
||||
**Note:** `./install.sh` now requires a game name; run it bare to list games.
|
||||
- Migrated hosting from GitHub to self-hosted Gitea.
|
||||
- `publish.sh` rewritten for the Gitea API; reads `GITEA_TOKEN` from the
|
||||
environment and never stores it.
|
||||
@@ -6,6 +6,7 @@ Fixes use whichever approach the engine calls for:
|
||||
|
||||
- **SUWSF + Ultimate ASI Loader** — runtime memory patching, for Unreal titles (and anything DRM-wrapped, where static patching is impossible).
|
||||
- **BepInEx plugin** — a proper C# mod, for Unity titles with the Mono backend.
|
||||
- **External** — where a good third-party fix already exists, it is vendored (license permitting) with our tuned config and full credit, rather than reimplemented. Vendored fixes can go stale against a patched game, so those entries carry a revalidation checklist.
|
||||
|
||||
Most force **Hor+ FOV** (a wider screen shows you *more* rather than zooming in) and fix UI that assumes 16:9. Some games already render correctly and only need UI work — [Burglin' Gnomes](games/BurglinGnomes/) is one, and the fix deliberately leaves its camera alone.
|
||||
|
||||
@@ -15,6 +16,8 @@ Most force **Hor+ FOV** (a wider screen shows you *more* rather than zooming in)
|
||||
|---|---|---|---|
|
||||
| [Gundam Breaker 4](games/GundamBreaker4/) | Unreal Engine 4.27 | SUWSF | ✅ Confirmed working at 5120×1440 |
|
||||
| [Burglin' Gnomes](games/BurglinGnomes/) | Unity 6 (Mono) | BepInEx plugin | ✅ Confirmed working at 5120×1440 |
|
||||
| [ONE PIECE ODYSSEY](games/OnePieceOdyssey/) | Unreal Engine 4 | SUWSF | ⚠️ New — unverified |
|
||||
| [Clair Obscur: Expedition 33](games/Expedition33/) | Unreal Engine 5 | External ([ClairObscurFix](https://github.com/Lyall/ClairObscurFix) by Lyall) | ⚠️ Partial — reduced profile, see notes |
|
||||
|
||||
## Install
|
||||
|
||||
@@ -40,6 +43,7 @@ Config-file tweaks (e.g. UE4's `AspectRatioAxisConstraint=MaintainYFOV`) typical
|
||||
|---|---|
|
||||
| `games/<Game>/SUWSF.ini` | Patch definitions (SUWSF games) |
|
||||
| `games/<Game>/plugin/` | C# plugin source + prebuilt DLL (BepInEx games) |
|
||||
| `games/<Game>/*.ini` | Our tuned config for a vendored external fix |
|
||||
| `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 |
|
||||
@@ -54,10 +58,16 @@ Config-file tweaks (e.g. UE4's `AspectRatioAxisConstraint=MaintainYFOV`) typical
|
||||
## Adding a game
|
||||
|
||||
1. `mkdir games/<GameName>` with a `game.conf` (copy GB4's as a template) and a `SUWSF.ini`.
|
||||
2. Set `METHOD=` in `game.conf` to `suwsf` or `bepinex`.
|
||||
2. Set `METHOD=` in `game.conf` to `suwsf`, `bepinex`, or `external`.
|
||||
**Check for an existing fix first** — if a good one exists and its license
|
||||
allows redistribution, vendor it with credit instead of rewriting it.
|
||||
3. **Unreal:** start from the UE4 patterns in [`games/GundamBreaker4/SUWSF.ini`](games/GundamBreaker4/SUWSF.ini) — they match across many UE4 titles. If a pattern misses, use `tools/dump_decrypted.py` + `tools/aob.py` to derive the exact bytes.
|
||||
4. **Unity:** install BepInEx + UnityExplorer and inspect live with [`tools/unity_diag.cs`](tools/unity_diag.cs) / [`tools/unity_uitune.cs`](tools/unity_uitune.cs), then write a plugin (copy `games/BurglinGnomes/plugin/`).
|
||||
|
||||
## Changelog
|
||||
|
||||
Version history and the versioning policy (adding a game = minor bump) are in [CHANGELOG.md](CHANGELOG.md).
|
||||
|
||||
## 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.
|
||||
|
||||
@@ -32,6 +32,14 @@ them; all runtime patching is performed by SUWSF.
|
||||
- Used only for runtime inspection while developing a fix; it is NOT part of any
|
||||
release package and is not required by end users.
|
||||
|
||||
## ClairObscurFix (the entire Expedition 33 fix)
|
||||
- Author: **Lyall** — https://github.com/Lyall/ClairObscurFix
|
||||
- License: MIT (see `vendor/ClairObscurFix/LICENSE`)
|
||||
- Files: `vendor/ClairObscurFix/**` — vendored **unmodified**
|
||||
- Version: v0.0.10 (upstream repo is archived)
|
||||
- The ultrawide fix for Clair Obscur: Expedition 33 is entirely Lyall's work.
|
||||
This repo contributes only a 32:9-tuned `ClairObscurFix.ini` and packaging.
|
||||
|
||||
## Patch patterns
|
||||
The `AspectRatioAxisConstraint` (HOR+) and `ConstrainAspectRatio` (pillarbox)
|
||||
byte patterns in `games/*/SUWSF.ini` are adapted from the UE4 fixes in
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
;;;;;;;;;; General ;;;;;;;;;;
|
||||
|
||||
[Developer Console]
|
||||
; Set "Enabled" to true to enable the console.
|
||||
; By default you can access it with the key "Tilde".
|
||||
Enabled = false
|
||||
|
||||
[Skip Intro Logos]
|
||||
; Skips splash screen logos, epilepsy warning and autosave warning.
|
||||
Enabled = false
|
||||
|
||||
[Uncap Cutscene FPS]
|
||||
; Removes 30fps cap in cutscenes.
|
||||
; DISABLED: bisecting a crash-on-save-load with game build > fix v0.0.10.
|
||||
Enabled = false
|
||||
|
||||
[Adjust Resolution Checks]
|
||||
; Adjusts resolution checks to use the monitor's maximum supported resolution, rather than the "native" resolution.
|
||||
; DISABLED: its pattern scan already fails on this game build ("Resolution Checks: Pattern scan failed").
|
||||
Enabled = false
|
||||
|
||||
[Background Audio]
|
||||
; Set "Enabled" to true to allow audio to continue playing when the game window has lost focus.
|
||||
Enabled = false
|
||||
|
||||
;;;;;;;;;; Ultrawide/Narrower ;;;;;;;;;;
|
||||
|
||||
[Cutscene Letterboxing]
|
||||
; Set "Enabled" to true to re-enable pillarboxing/letterboxing in cutscenes.
|
||||
Enabled = false
|
||||
|
||||
[Fix Movies]
|
||||
; Crops letterboxing from pre-rendered movies at ultrawide resolutions.
|
||||
; DISABLED: bisecting; re-enable once the crash source is known.
|
||||
Enabled = false
|
||||
|
||||
[Center HUD]
|
||||
; Set "Enabled" to true to center certain parts of the HUD to 16:9 at ultrawide resolutions.
|
||||
Enabled = true
|
||||
; Adjust "AspectRatio" to set the aspect ratio of the HUD. i.e 1.77778 for 16:9, 2.33333 for 21:9 etc
|
||||
AspectRatio = 1.77778
|
||||
|
||||
;;;;;;;;;; Graphics ;;;;;;;;;;
|
||||
|
||||
[Disable Subtitle Blur]
|
||||
; Set "Enabled" to true to disable the background blur on cutscene subtitle lines.
|
||||
Enabled = false
|
||||
|
||||
[Sharpening]
|
||||
; Adjust "Strength" to control the intensity of the forced post-process sharpening.
|
||||
; Valid range: 0 to 2.0 Game Default = 1.0
|
||||
Strength = 0
|
||||
@@ -0,0 +1,101 @@
|
||||
# Clair Obscur: Expedition 33 — UltraWide
|
||||
|
||||
⚠️ **Partial support — reduced feature profile.** ClairObscurFix v0.0.10 is archived and predates the current game build; running it with upstream defaults **crashed on save load**. This repo ships a reduced profile with only the 32:9 HUD centering enabled.
|
||||
|
||||
- **Engine:** Unreal Engine 5 — **no DRM** (no SteamStub; `.text` entropy 6.74)
|
||||
- **Steam AppID:** 1903340
|
||||
- **Executable:** `SandFall-Win64-Shipping.exe`
|
||||
- **Method:** `external` — vendored third-party fix + our 32:9 config
|
||||
|
||||
## We did not write this fix
|
||||
|
||||
The ultrawide work here is **[ClairObscurFix](https://github.com/Lyall/ClairObscurFix) by [Lyall](https://github.com/Lyall)** (MIT), vendored unmodified. It is mature and already handles the hard parts; reimplementing it would be duplicated effort for no benefit. **All credit for the fix itself goes to Lyall.**
|
||||
|
||||
What this repo adds is the **32:9 configuration** verified on a Samsung 49" G93SC, packaging, and a one-command installer consistent with the other games here.
|
||||
|
||||
> The upstream repo is **archived**, so it will not receive further updates. Vendoring it here means the version you need stays available.
|
||||
|
||||
## Install (Linux / Proton)
|
||||
|
||||
```bash
|
||||
./install.sh Expedition33
|
||||
```
|
||||
|
||||
Then **required** — Steam → Properties → Launch Options:
|
||||
|
||||
```
|
||||
WINEDLLOVERRIDES="dsound=n,b" %command%
|
||||
```
|
||||
|
||||
Set **5120×1440** fullscreen in-game.
|
||||
|
||||
## Install (Windows)
|
||||
|
||||
Extract the release zip into `…\Expedition 33\Sandfall\Binaries\Win64\`.
|
||||
|
||||
## Our 32:9 config
|
||||
|
||||
`ClairObscurFix.ini` ships with upstream defaults **except**:
|
||||
|
||||
| Option | Upstream | Ours | Why |
|
||||
|---|---|---|---|
|
||||
| `[Center HUD] Enabled` | `false` | **`true`** | At 5120px wide, HUD elements anchored to screen edges end up absurdly far apart |
|
||||
|
||||
Everything else is left at upstream defaults, which are already ultrawide-friendly:
|
||||
|
||||
| Option | Default | Effect |
|
||||
|---|---|---|
|
||||
| `Cutscene Letterboxing` | `false` | No bars in cutscenes |
|
||||
| `Fix Movies` | `true` | Crops letterboxing from pre-rendered video |
|
||||
| `Adjust Resolution Checks` | `true` | Uses the monitor's max resolution rather than "native" |
|
||||
| `Uncap Cutscene FPS` | `true` | Removes the 30fps cutscene cap |
|
||||
|
||||
### Tuning
|
||||
|
||||
Edit `…/Sandfall/Binaries/Win64/ClairObscurFix.ini` (requires a restart — this fix has no live reload):
|
||||
|
||||
- **HUD too cramped?** Raise `[Center HUD] AspectRatio` from `1.77778` (16:9) to `2.33333` (21:9) — usually the sweet spot at 32:9.
|
||||
- **Prefer the HUD spanning the full width?** Set `[Center HUD] Enabled = false`.
|
||||
- **Want cinematic bars back?** `[Cutscene Letterboxing] Enabled = true`.
|
||||
|
||||
## Uninstall
|
||||
|
||||
```bash
|
||||
./install.sh Expedition33 uninstall
|
||||
```
|
||||
|
||||
## Known issue: version drift
|
||||
|
||||
**ClairObscurFix v0.0.10 (May 2025) is archived and no longer tracks the game.**
|
||||
|
||||
Observed on a current build (2026-07-21), with upstream defaults:
|
||||
|
||||
```
|
||||
[error] Resolution Checks: Pattern scan failed.
|
||||
[error] Resolution Scale Bug: Pattern scan failed.
|
||||
```
|
||||
|
||||
…followed by a **crash when loading a save**. Removing the fix entirely made the
|
||||
game load normally, isolating the fix as the cause. The crash coincides with the
|
||||
fix's `Level Load` hook, which is consistent with a hook attaching to shifted
|
||||
code in a newer binary.
|
||||
|
||||
**Mitigation:** ship a reduced profile — everything disabled except `Center HUD`,
|
||||
the only option genuinely needed at 32:9. The failing scans are disabled outright
|
||||
since they were already inert.
|
||||
|
||||
## Maintenance / revalidation
|
||||
|
||||
Because upstream is archived, this entry decays as the game patches. Re-check
|
||||
after any significant game update:
|
||||
|
||||
1. Launch and load a save. If it crashes, remove the fix (`./install.sh Expedition33 uninstall`) and retry to confirm the fix is the cause rather than the game or Proton.
|
||||
2. Read `Sandfall/Binaries/Win64/ClairObscurFix.log` — `Pattern scan failed` lines mark hooks that no longer match the binary.
|
||||
3. Disable any newly-failing feature in `ClairObscurFix.ini`; a failed scan is inert, but a *wrongly-attached* hook is what crashes.
|
||||
4. If `Center HUD` itself stops working, this entry should be marked unsupported. The game has **no DRM**, so writing a small dedicated HUD-centering patch is a viable replacement.
|
||||
|
||||
## Still unverified at 32:9
|
||||
|
||||
- [ ] Is `Center HUD` at 16:9 right, or is 21:9 (`2.33333`) better?
|
||||
- [ ] Camera FOV — Hor+ (see more) or Vert- (zoomed)?
|
||||
- [ ] Pillarboxing in cutscenes / pre-rendered movies (`Fix Movies` currently **off**)
|
||||
@@ -0,0 +1,19 @@
|
||||
# Clair Obscur: Expedition 33 — metadata for ../../install.sh
|
||||
TITLE="Clair Obscur: Expedition 33"
|
||||
APPID=1903340
|
||||
|
||||
EXE="SandFall-Win64-Shipping.exe"
|
||||
COMMON_SUBDIR="Expedition 33/Sandfall/Binaries/Win64"
|
||||
ENGINE="Unreal Engine 5 (no DRM)"
|
||||
|
||||
# Fix method: EXTERNAL — we ship an upstream third-party fix (MIT) plus our own
|
||||
# 32:9-tuned config. We deliberately do NOT reimplement it; see README.md.
|
||||
METHOD="external"
|
||||
VENDOR_PAYLOAD="ClairObscurFix/Sandfall/Binaries/Win64" # contents copied into the exe dir
|
||||
EXTERNAL_CONFIG="ClairObscurFix.ini" # our tuned copy overrides upstream's
|
||||
EXTERNAL_FILES="ClairObscurFix.asi ClairObscurFix.ini dsound.dll"
|
||||
LOADER="dsound.dll"
|
||||
LAUNCH_OPTION='WINEDLLOVERRIDES="dsound=n,b" %command%'
|
||||
|
||||
PREFIX_INI=""
|
||||
STATUS="PARTIAL — reduced profile (Center HUD only); upstream v0.0.10 is archived and crashes with full features on current builds"
|
||||
@@ -0,0 +1,65 @@
|
||||
# ONE PIECE ODYSSEY — UltraWide Fix
|
||||
|
||||
⚠️ **New — patterns not yet verified at runtime.**
|
||||
|
||||
- **Engine:** Unreal Engine 4
|
||||
- **Steam AppID:** 814000
|
||||
- **Executable:** `odyssey-Win64-Shipping.exe` (**SteamStub-encrypted**)
|
||||
- **Method:** SUWSF runtime memory patch
|
||||
|
||||
## Why this mirrors Gundam Breaker 4
|
||||
|
||||
Same engine, same DRM, same symptom — the game has no native ultrawide support and
|
||||
the community workaround is *raising FOV* at 32:9, which is the Vert- signature:
|
||||
the camera holds horizontal FOV constant, so a wider display crops vertically
|
||||
instead of showing more.
|
||||
|
||||
Because the exe is SteamStub-wrapped (`.bind` section, `.text` entropy 8.00), it is
|
||||
encrypted on disk and cannot be patched statically. SUWSF patches the decrypted
|
||||
image in memory at launch, which is also why the fix survives into gameplay.
|
||||
|
||||
The patterns are the UE4-generic ones proven on Gundam Breaker 4.
|
||||
|
||||
## Install (Linux / Proton)
|
||||
|
||||
```bash
|
||||
./install.sh OnePieceOdyssey
|
||||
```
|
||||
|
||||
Then **required** — Steam → Properties → Launch Options:
|
||||
|
||||
```
|
||||
WINEDLLOVERRIDES="dsound=n,b" %command%
|
||||
```
|
||||
|
||||
Set **5120×1440** fullscreen in-game.
|
||||
|
||||
## Patches
|
||||
|
||||
| Patch | Effect |
|
||||
|---|---|
|
||||
| `AspectRatioAxisConstraint` | Forces `MaintainYFOV` → Hor+ FOV. **Do not use at 16:9 or narrower.** |
|
||||
| `ConstrainAspectRatio` | NOPs the pillarbox/letterbox clamp |
|
||||
| `HardcodedAspect_16by9_*` | Optional fallbacks, disabled by default |
|
||||
|
||||
## Verifying / troubleshooting
|
||||
|
||||
Add `PROTON_LOG=1` to the launch options, then:
|
||||
|
||||
```bash
|
||||
./tools/read_protonlog.sh 814000
|
||||
```
|
||||
|
||||
SUWSF reports each pattern as `Found patch … N matches` or `No pattern found, skipping`.
|
||||
If `AspectRatioAxisConstraint` misses, derive the exact bytes from a runtime dump:
|
||||
|
||||
```bash
|
||||
python3 tools/dump_decrypted.py odyssey-Win64-Shipping.exe # while the game runs
|
||||
python3 tools/aob.py <dump> games/OnePieceOdyssey/SUWSF.ini
|
||||
```
|
||||
|
||||
## Open questions
|
||||
|
||||
- [ ] Do the GB4 patterns match this build?
|
||||
- [ ] Is the HUD sane at 32:9, or stretched/misplaced?
|
||||
- [ ] Any pillarboxing left in cutscenes?
|
||||
@@ -0,0 +1,71 @@
|
||||
[UserSettings]
|
||||
; ==========================================================================
|
||||
; ONE PIECE ODYSSEY - UltraWide Fix (SUWSF patch)
|
||||
; Target display: Samsung 49" Odyssey G93SC (5120x1440, 32:9)
|
||||
; Engine: Unreal Engine 4 | Exe is SteamStub-encrypted -> runtime patch
|
||||
; ==========================================================================
|
||||
; Your screen resolution used in patch calculations. "auto" reads primary
|
||||
; display; set explicitly if auto misreads under Proton/DPI scaling.
|
||||
Resolution="5120x1440"
|
||||
; Globally enable or disable all patches (default: true)
|
||||
Enabled=true
|
||||
|
||||
; --------------------------------------------------------------------------
|
||||
; WARNING: PATCHES BELOW. These are CANDIDATE UE4 patterns adapted from
|
||||
; known-good UE4 fixes (Trepang2 / Lies of P). Because GB4's .text is
|
||||
; SteamStub-encrypted on disk we cannot verify the exact bytes statically;
|
||||
; SUWSF scans the DECRYPTED image in memory at runtime, so if GB4's UE4.27
|
||||
; codegen matches these generic patterns they apply directly.
|
||||
;
|
||||
; If a patch reports 0 matches (see SUWSF log / no visual change), run
|
||||
; tools/dump_decrypted.sh while the game is running and send me the dump so
|
||||
; I can derive GB4's exact pattern. Each patch is independent - a miss on one
|
||||
; does not stop the others.
|
||||
; --------------------------------------------------------------------------
|
||||
|
||||
; [1] HOR+ FOV -- the primary fix.
|
||||
; Forces ULocalPlayer AspectRatioAxisConstraint to 0 (AspectRatio_MaintainYFOV).
|
||||
; This makes the camera keep VERTICAL FOV constant and expand horizontally
|
||||
; (Hor+), removing the zoomed-in feel at 32:9. Do NOT use at 16:9 or narrower.
|
||||
; Value BA 00 00 00 00 = "mov edx, 0" ; 90 90 90 = pad nops.
|
||||
[Patch:AspectRatioAxisConstraint]
|
||||
Enabled=true
|
||||
Pattern="0F ?? ?? ?? 0F ?? ?? ?? ?? ?? 41 ?? ?? ?? ?? ?? 00 00 48 ?? ?? ?? ?? 00 00 4C ?? ??"
|
||||
Offset=10
|
||||
Value="BA 00 00 00 00 90 90 90"
|
||||
ValueType="byte"
|
||||
Match="1"
|
||||
Module="auto"
|
||||
|
||||
; [2] Disable pillarboxing/letterboxing (bConstrainAspectRatio = 0).
|
||||
; Prevents the game clamping the render to 16:9 with black side bars.
|
||||
[Patch:ConstrainAspectRatio]
|
||||
Enabled=true
|
||||
Pattern="33 ?? ?? 83 ?? 02 31 ?? ?? 0F ?? ?? ?? ?? 00 00"
|
||||
Offset=0
|
||||
Value="90 90 90 90 90 90"
|
||||
ValueType="byte"
|
||||
Match="1"
|
||||
Module="auto"
|
||||
|
||||
; [3] OPTIONAL fallback: some UE builds hardcode 16:9 (1.777778) as a float
|
||||
; (39 8E E3 3F) or (3B 8E E3 3F) and clamp to it. Disabled by default because
|
||||
; it can double-apply with patch [1]. Enable ONLY if [1] misses and you still
|
||||
; see a squeezed/zoomed image. Writes your true aspect ratio in its place.
|
||||
[Patch:HardcodedAspect_16by9_a]
|
||||
Enabled=false
|
||||
Pattern="39 8E E3 3F"
|
||||
Offset=0
|
||||
Value="aspectratio"
|
||||
ValueType="float"
|
||||
Match="all"
|
||||
Module="auto"
|
||||
|
||||
[Patch:HardcodedAspect_16by9_b]
|
||||
Enabled=false
|
||||
Pattern="3B 8E E3 3F"
|
||||
Offset=0
|
||||
Value="aspectratio"
|
||||
ValueType="float"
|
||||
Match="all"
|
||||
Module="auto"
|
||||
@@ -0,0 +1,20 @@
|
||||
# ONE PIECE ODYSSEY — metadata for ../../install.sh
|
||||
TITLE="ONE PIECE ODYSSEY"
|
||||
APPID=814000
|
||||
|
||||
EXE="odyssey-Win64-Shipping.exe"
|
||||
COMMON_SUBDIR="ONE PIECE ODYSSEY/odyssey/Binaries/Win64"
|
||||
ENGINE="Unreal Engine 4 (SteamStub DRM — runtime patching required)"
|
||||
|
||||
METHOD="suwsf"
|
||||
LOADER="dsound.dll"
|
||||
LAUNCH_OPTION='WINEDLLOVERRIDES="dsound=n,b" %command%'
|
||||
|
||||
# UE4 config-level partial win: fixes menus immediately; SUWSF carries gameplay.
|
||||
PREFIX_INI="drive_c/users/steamuser/AppData/Local/odyssey/Saved/Config/WindowsNoEditor/Engine.ini"
|
||||
read -r -d '' INI_BLOCK <<'BLOCK' || true
|
||||
[/Script/Engine.LocalPlayer]
|
||||
AspectRatioAxisConstraint=AspectRatio_MaintainYFOV
|
||||
BLOCK
|
||||
|
||||
STATUS="NEW — UE4+SteamStub like GB4; patterns unverified at runtime"
|
||||
+17
-3
@@ -109,7 +109,9 @@ METHOD="${METHOD:-suwsf}"
|
||||
|
||||
if [ "$ACTION" = "uninstall" ]; then
|
||||
echo "[+] Uninstalling..."
|
||||
if [ "$METHOD" = "bepinex" ]; then
|
||||
if [ "$METHOD" = "external" ]; then
|
||||
for f in $EXTERNAL_FILES; do [ -f "$GAMEDIR/$f" ] && rm -v "$GAMEDIR/$f"; done
|
||||
elif [ "$METHOD" = "bepinex" ]; then
|
||||
rm -vf "$GAMEDIR/winhttp.dll" "$GAMEDIR/doorstop_config.ini" "$GAMEDIR/.doorstop_version" \
|
||||
"$GAMEDIR/changelog.txt" "$GAMEDIR/BepInEx/plugins/$PLUGIN_DLL"
|
||||
# leave BepInEx/ itself: the user may have other mods installed
|
||||
@@ -125,7 +127,15 @@ if [ "$ACTION" = "uninstall" ]; then
|
||||
fi
|
||||
|
||||
# --- install ------------------------------------------------------------------
|
||||
if [ "$METHOD" = "bepinex" ]; then
|
||||
if [ "$METHOD" = "external" ]; then
|
||||
SRC="$HERE/vendor/$VENDOR_PAYLOAD"
|
||||
[ -d "$SRC" ] || { echo "[!] missing vendored payload: $SRC"; exit 1; }
|
||||
cp -v "$SRC"/* "$GAMEDIR/" 2>/dev/null || true
|
||||
# our tuned config wins over the upstream default
|
||||
if [ -n "${EXTERNAL_CONFIG:-}" ] && [ -f "$GAMES_DIR/$GAME/$EXTERNAL_CONFIG" ]; then
|
||||
cp -v "$GAMES_DIR/$GAME/$EXTERNAL_CONFIG" "$GAMEDIR/$EXTERNAL_CONFIG"
|
||||
fi
|
||||
elif [ "$METHOD" = "bepinex" ]; then
|
||||
BEPZIP=$(ls "$HERE"/vendor/BepInEx_win_x64_*.zip 2>/dev/null | head -1)
|
||||
PLUGIN="$GAMES_DIR/$GAME/$PLUGIN_DLL"
|
||||
[ -f "$BEPZIP" ] || { echo "[!] missing BepInEx zip in vendor/"; exit 1; }
|
||||
@@ -156,7 +166,11 @@ apply_ini
|
||||
|
||||
cat <<EOF
|
||||
|
||||
[+] Installed ($METHOD): $([ "$METHOD" = "bepinex" ] && echo "BepInEx + $PLUGIN_DLL + $LOADER" || echo "SUWSF.asi, SUWSF.ini, $LOADER")
|
||||
[+] Installed ($METHOD): $(case "$METHOD" in
|
||||
bepinex) echo "BepInEx + $PLUGIN_DLL + $LOADER" ;;
|
||||
external) echo "$EXTERNAL_FILES" ;;
|
||||
*) echo "SUWSF.asi, SUWSF.ini, $LOADER" ;;
|
||||
esac)
|
||||
|
||||
NEXT (Proton) — REQUIRED, or the loader is ignored and the fix won't apply in gameplay.
|
||||
Steam > right-click ${TITLE:-$GAME} > Properties > Launch Options:
|
||||
|
||||
+11
-1
@@ -19,7 +19,17 @@ OUT="dist/${GAME}_UltraWide_Fix"
|
||||
rm -rf "$OUT" "$OUT.zip"
|
||||
mkdir -p "$OUT"
|
||||
|
||||
if [ "$METHOD" = "bepinex" ]; then
|
||||
if [ "$METHOD" = "external" ]; then
|
||||
SRC="vendor/$VENDOR_PAYLOAD"
|
||||
[ -d "$SRC" ] || { echo "[!] missing vendored payload: $SRC"; exit 1; }
|
||||
cp "$SRC"/* "$OUT/" 2>/dev/null || true
|
||||
[ -n "${EXTERNAL_CONFIG:-}" ] && [ -f "$GDIR/$EXTERNAL_CONFIG" ] && cp "$GDIR/$EXTERNAL_CONFIG" "$OUT/"
|
||||
# ship the upstream license alongside, as MIT requires
|
||||
UPLIC="vendor/$(dirname "$VENDOR_PAYLOAD" | cut -d/ -f1)/LICENSE"
|
||||
[ -f "$UPLIC" ] || UPLIC="vendor/${VENDOR_PAYLOAD%%/*}/LICENSE"
|
||||
[ -f "$UPLIC" ] && cp "$UPLIC" "$OUT/UPSTREAM-LICENSE.txt"
|
||||
echo "[+] Packaged vendored external fix + our config"
|
||||
elif [ "$METHOD" = "bepinex" ]; then
|
||||
BEPZIP=$(ls vendor/BepInEx_win_x64_*.zip 2>/dev/null | head -1)
|
||||
[ -f "$BEPZIP" ] || { echo "[!] missing BepInEx zip in vendor/"; exit 1; }
|
||||
[ -f "$GDIR/$PLUGIN_DLL" ] || { echo "[!] missing prebuilt plugin $GDIR/$PLUGIN_DLL"; exit 1; }
|
||||
|
||||
+38
-24
@@ -12,24 +12,37 @@ HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"; cd "$HERE"
|
||||
HOST="${GITEA_HOST:-https://git.lazypugs.com}"
|
||||
OWNER="${GITEA_OWNER:-ckoch}"
|
||||
REPO="${GITEA_REPO:-UltraWidePatches}"
|
||||
GAME="${GAME:-GundamBreaker4}"
|
||||
TAG="${TAG:-v1.0.0}"
|
||||
NOTES="${NOTES:-games/$GAME/README.md}"
|
||||
[ -f "$NOTES" ] || NOTES="RELEASE_NOTES.md"
|
||||
# GAME may be a space-separated list; empty/"all" = every game in games/
|
||||
GAME="${GAME:-all}"
|
||||
if [ "$GAME" = "all" ]; then
|
||||
GAME=$(for d in games/*/; do [ -f "$d/game.conf" ] && basename "$d"; done | tr '\n' ' ')
|
||||
fi
|
||||
TAG="${TAG:?set TAG explicitly, e.g. TAG=v1.2.0 (see CHANGELOG.md)}"
|
||||
# Single game -> its own README; multiple -> the collection README.
|
||||
if [ "$(echo "$GAME" | wc -w)" -eq 1 ] && [ -f "games/$GAME/README.md" ]; then
|
||||
NOTES="${NOTES:-games/$GAME/README.md}"
|
||||
else
|
||||
NOTES="${NOTES:-README.md}"
|
||||
fi
|
||||
[ -f "$NOTES" ] || NOTES="README.md"
|
||||
API="$HOST/api/v1"
|
||||
|
||||
[ -n "${GITEA_TOKEN:-}" ] || { echo "[!] GITEA_TOKEN is not set. Create one at $HOST/user/settings/applications (scope: write:repository)"; exit 1; }
|
||||
AUTH=(-H "Authorization: token $GITEA_TOKEN")
|
||||
ZIPNAME="${GAME}_UltraWide_Fix.zip"
|
||||
echo "[+] Games in this release: $GAME"
|
||||
|
||||
# 1. build the artifact -- do NOT swallow output; a failure here used to exit
|
||||
# 1. build every artifact -- do NOT swallow output; a failure here used to exit
|
||||
# the whole script silently because stdout went to /dev/null under `set -e`.
|
||||
if ! bash tools/build_release.sh "$GAME"; then
|
||||
echo "[!] build_release.sh failed for game '$GAME' (see above)"; exit 1
|
||||
fi
|
||||
ZIP="dist/$ZIPNAME"
|
||||
[ -f "$ZIP" ] || { echo "[!] build produced no $ZIP"; exit 1; }
|
||||
echo "[+] Built $ZIP"
|
||||
ZIPS=""
|
||||
for g in $GAME; do
|
||||
if ! bash tools/build_release.sh "$g"; then
|
||||
echo "[!] build_release.sh failed for game '$g' (see above)"; exit 1
|
||||
fi
|
||||
z="dist/${g}_UltraWide_Fix.zip"
|
||||
[ -f "$z" ] || { echo "[!] build produced no $z"; exit 1; }
|
||||
ZIPS="$ZIPS $z"
|
||||
done
|
||||
echo "[+] Built:$ZIPS"
|
||||
|
||||
# 2. push code + tag
|
||||
git push origin main
|
||||
@@ -51,23 +64,24 @@ if [ -z "$REL_ID" ]; then
|
||||
| python3 -c "import sys,json;print(json.load(sys.stdin)['id'])")
|
||||
echo "[+] Created release $TAG (id=$REL_ID)"
|
||||
else
|
||||
echo "[i] Release $TAG exists (id=$REL_ID); replacing asset"
|
||||
echo "[i] Release $TAG exists (id=$REL_ID); replacing assets"
|
||||
fi
|
||||
|
||||
# 4. upload each zip, replacing any same-named asset already attached
|
||||
for z in $ZIPS; do
|
||||
n=$(basename "$z")
|
||||
OLD=$(curl -sf "${AUTH[@]}" "$API/repos/$OWNER/$REPO/releases/$REL_ID" \
|
||||
| ZIPNAME="$ZIPNAME" python3 -c "
|
||||
| ZIPNAME="$n" python3 -c "
|
||||
import sys, json, os
|
||||
d = json.load(sys.stdin)
|
||||
want = os.environ['ZIPNAME']
|
||||
print(next((str(a['id']) for a in d.get('assets', []) if a['name'] == want), ''))" 2>/dev/null || true)
|
||||
if [ -n "$OLD" ]; then
|
||||
curl -sf -X DELETE "${AUTH[@]}" "$API/repos/$OWNER/$REPO/releases/$REL_ID/assets/$OLD" >/dev/null \
|
||||
&& echo "[i] removed previous asset"
|
||||
fi
|
||||
fi
|
||||
|
||||
# 4. upload the zip
|
||||
curl -sf "${AUTH[@]}" -F "attachment=@$ZIP" \
|
||||
"$API/repos/$OWNER/$REPO/releases/$REL_ID/assets?name=$ZIPNAME" >/dev/null
|
||||
echo "[+] Uploaded $ZIPNAME"
|
||||
[ -n "$OLD" ] && curl -sf -X DELETE "${AUTH[@]}" \
|
||||
"$API/repos/$OWNER/$REPO/releases/$REL_ID/assets/$OLD" >/dev/null && echo "[i] replaced $n"
|
||||
curl -sf "${AUTH[@]}" -F "attachment=@$z" \
|
||||
"$API/repos/$OWNER/$REPO/releases/$REL_ID/assets?name=$n" >/dev/null
|
||||
echo "[+] Uploaded $n"
|
||||
done
|
||||
|
||||
echo
|
||||
echo "[+] Done: $HOST/$OWNER/$REPO/releases/tag/$TAG"
|
||||
|
||||
Vendored
BIN
Binary file not shown.
Vendored
+21
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2025 Lyall
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
Binary file not shown.
@@ -0,0 +1,49 @@
|
||||
;;;;;;;;;; General ;;;;;;;;;;
|
||||
|
||||
[Developer Console]
|
||||
; Set "Enabled" to true to enable the console.
|
||||
; By default you can access it with the key "Tilde".
|
||||
Enabled = false
|
||||
|
||||
[Skip Intro Logos]
|
||||
; Skips splash screen logos, epilepsy warning and autosave warning.
|
||||
Enabled = false
|
||||
|
||||
[Uncap Cutscene FPS]
|
||||
; Removes 30fps cap in cutscenes.
|
||||
Enabled = true
|
||||
|
||||
[Adjust Resolution Checks]
|
||||
; Adjusts resolution checks to use the monitor's maximum supported resolution, rather than the "native" resolution.
|
||||
Enabled = true
|
||||
|
||||
[Background Audio]
|
||||
; Set "Enabled" to true to allow audio to continue playing when the game window has lost focus.
|
||||
Enabled = false
|
||||
|
||||
;;;;;;;;;; Ultrawide/Narrower ;;;;;;;;;;
|
||||
|
||||
[Cutscene Letterboxing]
|
||||
; Set "Enabled" to true to re-enable pillarboxing/letterboxing in cutscenes.
|
||||
Enabled = false
|
||||
|
||||
[Fix Movies]
|
||||
; Crops letterboxing from pre-rendered movies at ultrawide resolutions.
|
||||
Enabled = true
|
||||
|
||||
[Center HUD]
|
||||
; Set "Enabled" to true to center certain parts of the HUD to 16:9 at ultrawide resolutions.
|
||||
Enabled = false
|
||||
; Adjust "AspectRatio" to set the aspect ratio of the HUD. i.e 1.77778 for 16:9, 2.33333 for 21:9 etc
|
||||
AspectRatio = 1.77778
|
||||
|
||||
;;;;;;;;;; Graphics ;;;;;;;;;;
|
||||
|
||||
[Disable Subtitle Blur]
|
||||
; Set "Enabled" to true to disable the background blur on cutscene subtitle lines.
|
||||
Enabled = false
|
||||
|
||||
[Sharpening]
|
||||
; Adjust "Strength" to control the intensity of the forced post-process sharpening.
|
||||
; Valid range: 0 to 2.0 Game Default = 1.0
|
||||
Strength = 0
|
||||
Binary file not shown.
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2023 ThirteenAG
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
Reference in New Issue
Block a user