[PR #273] [MERGED] kb: Shadow of War offline mode (in-process stand-in for WB's Hydra API, local Garrison) and Goblins of War follow-ups #273

Closed
opened 2026-10-15 20:55:02 +00:00 by bsakaguchi · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/rehan-remade/universal-modder/pull/273
Author: @DeimozZarco
Created: 10/12/2026
Status: ✅ Merged
Merged: 10/14/2026
Merged by: @rehan-remade

Base: main ← Head: kb/shadow-of-war-offline-garrison


📝 Commits (6)

  • 48cb55c kb(shadow-of-war): answer #182 follow-ups, document v1.1 Act 2 gate
  • 7a1ef86 kb(shadow-of-war): offline mode + local Garrison (Deploy, Destroy for gear)
  • 3ae6e97 kb: Shadow of War offline mode: review fixes and scope
  • 430609a renormalize line endings to match .gitattributes (as on main since #304)
  • ce45301 Merge remote-tracking branch 'origin/main' into land/pr-273
  • 4242bcd kb: regenerate the index

📊 Changes

18 files changed (+2237 additions, -23 deletions)

View changed files

➕ examples/shadow-of-war-offline-mode/OfflineMode.ini.txt (+13 -0)
➕ examples/shadow-of-war-offline-mode/README.md (+82 -0)
➕ examples/shadow-of-war-offline-mode/build.cmd (+7 -0)
➕ examples/shadow-of-war-offline-mode/install.ps1 (+14 -0)
➕ examples/shadow-of-war-offline-mode/src/agb.c (+235 -0)
➕ examples/shadow-of-war-offline-mode/src/agb.h (+46 -0)
➕ examples/shadow-of-war-offline-mode/src/names.h (+74 -0)
➕ examples/shadow-of-war-offline-mode/src/offline.c (+466 -0)
➕ examples/shadow-of-war-offline-mode/src/responder.c (+603 -0)
➕ examples/shadow-of-war-offline-mode/src/responder.h (+11 -0)
➕ examples/shadow-of-war-offline-mode/src/stubs.S (+215 -0)
➕ examples/shadow-of-war-offline-mode/src/winhttp.def (+72 -0)
➕ examples/shadow-of-war-offline-mode/tools/log_to_object.py (+51 -0)
➕ examples/shadow-of-war-offline-mode/uninstall.ps1 (+6 -0)
📝 knowledge/INDEX.md (+2 -1)
📝 knowledge/games/middle-earth-shadow-of-war/goblin-tribe-a-new-nemesis-tribe-via-game-gamedb.md (+41 -22)
➕ knowledge/games/middle-earth-shadow-of-war/offline-mode-and-local-garrison.md (+253 -0)
📝 knowledge/index.json (+46 -0)

📄 Description

What this adds

1. New field note: knowledge/games/middle-earth-shadow-of-war/offline-mode-and-local-garrison.md

  • A proxy winhttp.dll next to ShadowOfWar.exe answers every WB/Agora (Hydra SDK) request on the PC.
  • The game never reaches WB, but it still signs in locally and the Garrison keeps working: store, list, Details, Deploy to an empty captain slot, and Destroy for gear.
  • The gear is rolled by the game itself; the stand-in grants nothing.
  • Verified in the real game on Steam build 3095001.
  • The note documents:
    • the x-ag-binary wire format, including the int64-only gotcha;
    • sign-in;
    • WB's game-settings kill switch;
    • the store "accessible" gates;
    • the object store;
    • the garrison_removal notification handshake that Deploy and Destroy wait for after the DELETE.

2. Source: examples/shadow-of-war-offline-mode

  • C for MinGW-w64, plus build, install and uninstall scripts.
  • No binaries and no game files. um publish check --game <install> passes.

3. #182 follow-ups: the held commit answering the review questions on the Goblins of War note, and documenting the v1.1 Act 2 gate.

  • The goblin note now also points to the offline mode as the testing prerequisite.

Why

  • In #182 the reviewer raised the concern that a modded Nemesis database could reach other players through Shadow of War's online modes.
  • This mod is the answer. Installed and running, it's the prerequisite for testing or making any later SoW mod, so modded tribes, creatures or gear are never tested while signed in to WB (no online testing, per the universal-modder rules).
  • Goblins of War was a proof of concept for tribe injection. It showed that a new Nemesis tribe can be injected into game.gamedb and behaves like a native tribe. It's the base for the next project, injecting a creature from another game into the Nemesis system, which will be built and tested on top of this offline mode.

Loaders and credits

  • Packet Loader and the Dll Loader (both by survivalizeed) are not required by either mod.
    • The Dll Loader coexisted during the tests.
    • Packet Loader was disabled because it crashes at startup about half the time on this build.
  • Tools used:
    • Ghidra (NSA);
    • w64devkit (Christopher Wellons);
    • QuickBMS and shadow_of_mordor.bms (Luigi Auriemma) for the earlier archive research.
  • The exe was analysed only from the running game's memory, as a private image kept outside the repo. The note has no unpacking steps, and the DRM is untouched.

Checks

  • um kb check --index: 205 notes pass.
  • pytest: 139 passed, 2 skipped.
  • The example builds from a clean copy.

🤖 Generated with Claude Code


🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/rehan-remade/universal-modder/pull/273 **Author:** [@DeimozZarco](https://github.com/DeimozZarco) **Created:** 10/12/2026 **Status:** ✅ Merged **Merged:** 10/14/2026 **Merged by:** [@rehan-remade](https://github.com/rehan-remade) **Base:** `main` ← **Head:** `kb/shadow-of-war-offline-garrison` --- ### 📝 Commits (6) - [`48cb55c`](https://github.com/rehan-remade/universal-modder/commit/48cb55cbd9b393f43c286ac31bc4f40fe51a42c5) kb(shadow-of-war): answer #182 follow-ups, document v1.1 Act 2 gate - [`7a1ef86`](https://github.com/rehan-remade/universal-modder/commit/7a1ef866aada17694eaaefeb9a8ab7cdc6f1256b) kb(shadow-of-war): offline mode + local Garrison (Deploy, Destroy for gear) - [`3ae6e97`](https://github.com/rehan-remade/universal-modder/commit/3ae6e97f92a2d62c74a2f510a1908a27bf03c84c) kb: Shadow of War offline mode: review fixes and scope - [`430609a`](https://github.com/rehan-remade/universal-modder/commit/430609a64834c1c9e977310212b4a68e947ddfa1) renormalize line endings to match .gitattributes (as on main since #304) - [`ce45301`](https://github.com/rehan-remade/universal-modder/commit/ce45301f40c0656c3c530a2d868276917e1f7f93) Merge remote-tracking branch 'origin/main' into land/pr-273 - [`4242bcd`](https://github.com/rehan-remade/universal-modder/commit/4242bcd2cc9c3a1f8f84406ef46fec1f9edc2d59) kb: regenerate the index ### 📊 Changes **18 files changed** (+2237 additions, -23 deletions) <details> <summary>View changed files</summary> ➕ `examples/shadow-of-war-offline-mode/OfflineMode.ini.txt` (+13 -0) ➕ `examples/shadow-of-war-offline-mode/README.md` (+82 -0) ➕ `examples/shadow-of-war-offline-mode/build.cmd` (+7 -0) ➕ `examples/shadow-of-war-offline-mode/install.ps1` (+14 -0) ➕ `examples/shadow-of-war-offline-mode/src/agb.c` (+235 -0) ➕ `examples/shadow-of-war-offline-mode/src/agb.h` (+46 -0) ➕ `examples/shadow-of-war-offline-mode/src/names.h` (+74 -0) ➕ `examples/shadow-of-war-offline-mode/src/offline.c` (+466 -0) ➕ `examples/shadow-of-war-offline-mode/src/responder.c` (+603 -0) ➕ `examples/shadow-of-war-offline-mode/src/responder.h` (+11 -0) ➕ `examples/shadow-of-war-offline-mode/src/stubs.S` (+215 -0) ➕ `examples/shadow-of-war-offline-mode/src/winhttp.def` (+72 -0) ➕ `examples/shadow-of-war-offline-mode/tools/log_to_object.py` (+51 -0) ➕ `examples/shadow-of-war-offline-mode/uninstall.ps1` (+6 -0) 📝 `knowledge/INDEX.md` (+2 -1) 📝 `knowledge/games/middle-earth-shadow-of-war/goblin-tribe-a-new-nemesis-tribe-via-game-gamedb.md` (+41 -22) ➕ `knowledge/games/middle-earth-shadow-of-war/offline-mode-and-local-garrison.md` (+253 -0) 📝 `knowledge/index.json` (+46 -0) </details> ### 📄 Description ## What this adds **1. New field note:** `knowledge/games/middle-earth-shadow-of-war/offline-mode-and-local-garrison.md` - A proxy `winhttp.dll` next to `ShadowOfWar.exe` answers every WB/Agora (Hydra SDK) request on the PC. - The game never reaches WB, but it still signs in locally and the **Garrison keeps working**: store, list, Details, **Deploy** to an empty captain slot, and **Destroy for gear**. - The gear is rolled by the game itself; the stand-in grants nothing. - Verified in the real game on Steam build 3095001. - The note documents: - the `x-ag-binary` wire format, including the int64-only gotcha; - sign-in; - WB's `game-settings` kill switch; - the store "accessible" gates; - the object store; - the `garrison_removal` notification handshake that Deploy and Destroy wait for after the DELETE. **2. Source:** `examples/shadow-of-war-offline-mode` - C for MinGW-w64, plus build, install and uninstall scripts. - No binaries and no game files. `um publish check --game <install>` passes. **3. #182 follow-ups:** the held commit answering the review questions on the Goblins of War note, and documenting the v1.1 Act 2 gate. - The goblin note now also points to the offline mode as the testing prerequisite. ## Why - In #182 the reviewer raised the concern that a modded Nemesis database could reach other players through Shadow of War's online modes. - This mod is the answer. Installed and running, **it's the prerequisite for testing or making any later SoW mod**, so modded tribes, creatures or gear are never tested while signed in to WB (no online testing, per the universal-modder rules). - **Goblins of War was a proof of concept for tribe injection.** It showed that a new Nemesis tribe can be injected into `game.gamedb` and behaves like a native tribe. It's the base for the next project, injecting a creature from another game into the Nemesis system, which will be built and tested on top of this offline mode. ## Loaders and credits - **Packet Loader** and the **Dll Loader** (both by survivalizeed) are **not required** by either mod. - The Dll Loader coexisted during the tests. - Packet Loader was disabled because it crashes at startup about half the time on this build. - **Tools used:** - Ghidra (NSA); - w64devkit (Christopher Wellons); - QuickBMS and `shadow_of_mordor.bms` (Luigi Auriemma) for the earlier archive research. - The exe was analysed only from the running game's memory, as a private image kept outside the repo. The note has no unpacking steps, and the DRM is untouched. ## Checks - `um kb check --index`: 205 notes pass. - `pytest`: 139 passed, 2 skipped. - The example builds from a clean copy. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
bsakaguchi 2026-10-15 20:55:02 +00:00
Sign in to join this conversation.
No labels
pull-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
rehan-remade/universal-modder#273
No description provided.