4 Commits
Author SHA1 Message Date
ckochandClaude Opus 4.8 1176df8f20 Add CHANGELOG; require an explicit release TAG
Adding a game is a minor bump, so the collection is at v1.2.0: v1.0.0 shipped
GB4, Burglin' Gnomes was a minor bump that was never cut, and Expedition 33 is
the second. Skipping the unreleased 1.1.0 reflects the real history better than
collapsing two games' worth of additions into one bump.

publish.sh no longer defaults TAG to v1.0.0, which could silently re-cut the
existing release; it now requires TAG explicitly.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-21 17:23:23 -04:00
ckochandClaude Opus 4.8 15d0169f56 publish.sh: one release for the whole collection
GAME now accepts a space-separated list and defaults to 'all', building and
attaching every game's zip to a single release instead of one game per tag -
which matches the repo being a collection. Release body is the game's own
README for a single game, or the collection README for several.

Asset upload replaces same-named assets, so re-running is idempotent.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-21 17:16:54 -04:00
ckochandClaude Opus 4.8 6f24502956 Expedition 33: record version drift honestly, ship reduced profile
Running ClairObscurFix v0.0.10 with upstream defaults crashed on save load.
Removing it entirely let the game load normally, isolating the fix as the cause
rather than Proton or the year-old save. The fix is archived and predates the
current build; two pattern scans already failed outright, and the crash
coincides with its Level Load hook.

Ship a reduced profile with only Center HUD enabled - the one option actually
needed at 32:9 - and mark the game PARTIAL rather than implying full support.
Adds a revalidation checklist since vendored archived fixes decay as the game
patches, plus a note that the game has no DRM, so a dedicated HUD-centering
patch is a viable replacement if Center HUD eventually breaks too.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-21 17:15:12 -04:00
ckochandClaude Opus 4.8 0833cf8495 Add Clair Obscur: Expedition 33 via new METHOD=external
Expedition 33 is UE5 with no DRM, but a mature MIT-licensed fix already exists:
ClairObscurFix by Lyall. Rather than reimplement it, install.sh gains a third
method that vendors a third-party fix unmodified and layers our own tuned
config on top, with the upstream license shipped in the release zip as MIT
requires. Upstream is archived, so vendoring also keeps it available.

Our only change vs upstream defaults is [Center HUD] Enabled = true, since at
5120px wide the edge-anchored HUD elements end up absurdly far apart.

Install/uninstall round-trip verified against a scratch game dir, including
that our tuned ini overrides the vendored default.

Credit to Lyall is recorded in THIRD_PARTY.md, the game README, and the repo
README's method table.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-21 16:58:05 -04:00
16 changed files with 399 additions and 29 deletions
+52
View File
@@ -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.
+10 -1
View File
@@ -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). - **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. - **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. 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,7 @@ 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 | | [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 | | [Burglin' Gnomes](games/BurglinGnomes/) | Unity 6 (Mono) | BepInEx plugin | ✅ Confirmed working at 5120×1440 |
| [Clair Obscur: Expedition 33](games/Expedition33/) | Unreal Engine 5 | External ([ClairObscurFix](https://github.com/Lyall/ClairObscurFix) by Lyall) | ⚠️ Partial — reduced profile, see notes |
## Install ## Install
@@ -40,6 +42,7 @@ Config-file tweaks (e.g. UE4's `AspectRatioAxisConstraint=MaintainYFOV`) typical
|---|---| |---|---|
| `games/<Game>/SUWSF.ini` | Patch definitions (SUWSF games) | | `games/<Game>/SUWSF.ini` | Patch definitions (SUWSF games) |
| `games/<Game>/plugin/` | C# plugin source + prebuilt DLL (BepInEx 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) | | `games/<Game>/game.conf` | Game metadata (appid, exe, paths, launch option) |
| `install.sh` | Generic installer / uninstaller | | `install.sh` | Generic installer / uninstaller |
| `tools/build_release.sh` | Builds a per-game drop-in release zip | | `tools/build_release.sh` | Builds a per-game drop-in release zip |
@@ -54,10 +57,16 @@ Config-file tweaks (e.g. UE4's `AspectRatioAxisConstraint=MaintainYFOV`) typical
## Adding a game ## Adding a game
1. `mkdir games/<GameName>` with a `game.conf` (copy GB4's as a template) and a `SUWSF.ini`. 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. 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/`). 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 ## 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. 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.
+8
View File
@@ -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 - Used only for runtime inspection while developing a fix; it is NOT part of any
release package and is not required by end users. 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 ## Patch patterns
The `AspectRatioAxisConstraint` (HOR+) and `ConstrainAspectRatio` (pillarbox) The `AspectRatioAxisConstraint` (HOR+) and `ConstrainAspectRatio` (pillarbox)
byte patterns in `games/*/SUWSF.ini` are adapted from the UE4 fixes in byte patterns in `games/*/SUWSF.ini` are adapted from the UE4 fixes in
+52
View File
@@ -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
+101
View File
@@ -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**)
+19
View File
@@ -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"
+17 -3
View File
@@ -109,7 +109,9 @@ METHOD="${METHOD:-suwsf}"
if [ "$ACTION" = "uninstall" ]; then if [ "$ACTION" = "uninstall" ]; then
echo "[+] Uninstalling..." 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" \ rm -vf "$GAMEDIR/winhttp.dll" "$GAMEDIR/doorstop_config.ini" "$GAMEDIR/.doorstop_version" \
"$GAMEDIR/changelog.txt" "$GAMEDIR/BepInEx/plugins/$PLUGIN_DLL" "$GAMEDIR/changelog.txt" "$GAMEDIR/BepInEx/plugins/$PLUGIN_DLL"
# leave BepInEx/ itself: the user may have other mods installed # leave BepInEx/ itself: the user may have other mods installed
@@ -125,7 +127,15 @@ if [ "$ACTION" = "uninstall" ]; then
fi fi
# --- install ------------------------------------------------------------------ # --- 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) BEPZIP=$(ls "$HERE"/vendor/BepInEx_win_x64_*.zip 2>/dev/null | head -1)
PLUGIN="$GAMES_DIR/$GAME/$PLUGIN_DLL" PLUGIN="$GAMES_DIR/$GAME/$PLUGIN_DLL"
[ -f "$BEPZIP" ] || { echo "[!] missing BepInEx zip in vendor/"; exit 1; } [ -f "$BEPZIP" ] || { echo "[!] missing BepInEx zip in vendor/"; exit 1; }
@@ -156,7 +166,11 @@ apply_ini
cat <<EOF 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. NEXT (Proton) — REQUIRED, or the loader is ignored and the fix won't apply in gameplay.
Steam > right-click ${TITLE:-$GAME} > Properties > Launch Options: Steam > right-click ${TITLE:-$GAME} > Properties > Launch Options:
+11 -1
View File
@@ -19,7 +19,17 @@ OUT="dist/${GAME}_UltraWide_Fix"
rm -rf "$OUT" "$OUT.zip" rm -rf "$OUT" "$OUT.zip"
mkdir -p "$OUT" 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) BEPZIP=$(ls vendor/BepInEx_win_x64_*.zip 2>/dev/null | head -1)
[ -f "$BEPZIP" ] || { echo "[!] missing BepInEx zip in vendor/"; exit 1; } [ -f "$BEPZIP" ] || { echo "[!] missing BepInEx zip in vendor/"; exit 1; }
[ -f "$GDIR/$PLUGIN_DLL" ] || { echo "[!] missing prebuilt plugin $GDIR/$PLUGIN_DLL"; exit 1; } [ -f "$GDIR/$PLUGIN_DLL" ] || { echo "[!] missing prebuilt plugin $GDIR/$PLUGIN_DLL"; exit 1; }
+36 -22
View File
@@ -12,24 +12,37 @@ HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"; cd "$HERE"
HOST="${GITEA_HOST:-https://git.lazypugs.com}" HOST="${GITEA_HOST:-https://git.lazypugs.com}"
OWNER="${GITEA_OWNER:-ckoch}" OWNER="${GITEA_OWNER:-ckoch}"
REPO="${GITEA_REPO:-UltraWidePatches}" REPO="${GITEA_REPO:-UltraWidePatches}"
GAME="${GAME:-GundamBreaker4}" # GAME may be a space-separated list; empty/"all" = every game in games/
TAG="${TAG:-v1.0.0}" 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}" NOTES="${NOTES:-games/$GAME/README.md}"
[ -f "$NOTES" ] || NOTES="RELEASE_NOTES.md" else
NOTES="${NOTES:-README.md}"
fi
[ -f "$NOTES" ] || NOTES="README.md"
API="$HOST/api/v1" 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; } [ -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") 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`. # the whole script silently because stdout went to /dev/null under `set -e`.
if ! bash tools/build_release.sh "$GAME"; then ZIPS=""
echo "[!] build_release.sh failed for game '$GAME' (see above)"; exit 1 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 fi
ZIP="dist/$ZIPNAME" z="dist/${g}_UltraWide_Fix.zip"
[ -f "$ZIP" ] || { echo "[!] build produced no $ZIP"; exit 1; } [ -f "$z" ] || { echo "[!] build produced no $z"; exit 1; }
echo "[+] Built $ZIP" ZIPS="$ZIPS $z"
done
echo "[+] Built:$ZIPS"
# 2. push code + tag # 2. push code + tag
git push origin main git push origin main
@@ -51,23 +64,24 @@ if [ -z "$REL_ID" ]; then
| python3 -c "import sys,json;print(json.load(sys.stdin)['id'])") | python3 -c "import sys,json;print(json.load(sys.stdin)['id'])")
echo "[+] Created release $TAG (id=$REL_ID)" echo "[+] Created release $TAG (id=$REL_ID)"
else 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" \ OLD=$(curl -sf "${AUTH[@]}" "$API/repos/$OWNER/$REPO/releases/$REL_ID" \
| ZIPNAME="$ZIPNAME" python3 -c " | ZIPNAME="$n" python3 -c "
import sys, json, os import sys, json, os
d = json.load(sys.stdin) d = json.load(sys.stdin)
want = os.environ['ZIPNAME'] want = os.environ['ZIPNAME']
print(next((str(a['id']) for a in d.get('assets', []) if a['name'] == want), ''))" 2>/dev/null || true) print(next((str(a['id']) for a in d.get('assets', []) if a['name'] == want), ''))" 2>/dev/null || true)
if [ -n "$OLD" ]; then [ -n "$OLD" ] && curl -sf -X DELETE "${AUTH[@]}" \
curl -sf -X DELETE "${AUTH[@]}" "$API/repos/$OWNER/$REPO/releases/$REL_ID/assets/$OLD" >/dev/null \ "$API/repos/$OWNER/$REPO/releases/$REL_ID/assets/$OLD" >/dev/null && echo "[i] replaced $n"
&& echo "[i] removed previous asset" curl -sf "${AUTH[@]}" -F "attachment=@$z" \
fi "$API/repos/$OWNER/$REPO/releases/$REL_ID/assets?name=$n" >/dev/null
fi echo "[+] Uploaded $n"
done
# 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"
echo echo
echo "[+] Done: $HOST/$OWNER/$REPO/releases/tag/$TAG" echo "[+] Done: $HOST/$OWNER/$REPO/releases/tag/$TAG"
BIN
View File
Binary file not shown.
View File
+21
View File
@@ -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.
+21
View File
@@ -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.