GWCA is dead, long live GWCA!
About two years ago, Py4GW started from a clone of
GWCA. That was the seed, and we owe it a huge debt. But a lot has changed since. Over that time our codebase drifted further and further from where it began - different needs, different direction - until it shared little with GWCA beyond the shape it was born into. For most of that stretch we were not really depending on GWCA at all; we were just still carrying its skeleton.
Today I am proud to announce
Py4GW Reforged - a complete re-engineering of the backend that finally sheds that inherited structure and stands entirely on its own.
The title is only half a joke. The GWCA our code was born from is gone. But everything that lineage stood for - deep access to the game, a rich scripting surface, a real automation platform - lives on, now on a backend built on our own terms.
[hr]
What actually changed
The part most people never saw is the part that was completely reworked: the native C++ DLL that gets injected into the game. That is the engine room, and it has been rebuilt from the ground up as a new, standalone project:
Py4GW Reforged Native.
To be clear: this was never GWCA tracking upstream. It was a fork that went its own way early on. What changed now is that we stopped carrying GWCA's structure out of habit and rebuilt the backend the way our project actually needs it.
- A backend built from scratch. A Windows 32-bit DLL that embeds its own CPython interpreter (via pybind11), hooks the game's Direct3D 9 render pipeline directly, and renders its own Dear ImGui overlay.
- Our own game layer, our own structure. Every subsystem - agents, map, party, inventory, skills, and the rest - has been re-implemented as native modules organized the way that suits us, not the layout we inherited. Since we had long stopped following GWCA's design, there was no reason to keep mirroring it.
- No more hardcoded addresses. This is the big one. Instead of baking in fixed memory addresses that shatter on every game patch, the new backend resolves everything at runtime from byte-pattern signatures stored in JSON. When Guild Wars updates, we update patterns - not a pile of magic numbers scattered through the code.
- A cleaner path to the game. Live game state now flows through two clean channels: the Py* binding modules for callable operations, and a shared-memory layer for fast, read-only game data.
- Modern ImGui, driven from Python. The whole UI stack was reworked on top of a current Dear ImGui (with docking), controlled almost entirely from Python.
Why do this at all?
Because the old backend was a years-old divergent codebase still wearing a skeleton it had outgrown. We were maintaining structure and assumptions that no longer matched how the project actually works. Rebuilding it means:
- Resilience. Game patches are handled by re-scanning patterns, not by chasing hardcoded offsets.
- A structure that fits. The backend is now organized around how Py4GW actually works today, instead of a layout inherited from a codebase we parted ways with years ago.
- Room to grow. New game systems can be added directly into our own native modules, on foundations we designed for the job.
What this means for you
If you write scripts or widgets, the good news is that the Python side you already know is intact and, in many places, better. Same scripting philosophy, same kind of API - now sitting on a backend that is cleaner, easier to extend, and far more resistant to game updates.
The project now lives in two repositories:
The old repositories have been retired and now point here.
[hr]
To GWCA and everyone who built it: thank you. It was the seed this project grew from, and even after years of going our own way, we have not forgotten where we started. That chapter has earned its rest.
GWCA is dead. Long live GWCA.
Join our discord at
[Only registered and activated users can see links. Click Here To Register...]