Developer guide
This section is for people who work on EasyUO Reforged itself. Its main subject is the job that comes back with every client patch: teaching EasyUO Reforged a new client build, by hand or with the EUOMigrate tool.
If you only want to write scripts, you don’t need any of this: start with Get started. To build the programs yourself, see Build from source. For the ground rules and pull requests, see CONTRIBUTING.md on GitHub.
When a new client needs work
Section titled “When a new client needs work”EasyUO Reforged keeps the memory addresses and object layouts of every client build it supports. A build it does not know usually still attaches, but some things go wrong:
- variables read
0,N/Aor nonsense, for example#CharPosXnever changes; - events do nothing, for example
event Macroorevent SysMessage; - the client is not offered at all (“No supported UO client found!”), when it is older than every known build.
How client support works explains why; Add a new client fixes it.
What you need
Section titled “What you need”- A clone of the repository, and Lazarus 3.6 or newer to build it (see Build from source).
- The client executable you want to support.
- Python 3.10 or newer with Capstone, for EUOMigrate.
- A character logged in on that client, for the live checks. They only read the client’s memory.
The short version
Section titled “The short version”# 1. Derive the values (the client does not need to run)pip install -r tools/EUOMigrate/requirements.txtpython tools/EUOMigrate/euomigrate.py migrate "C:\Games\Ultima Online\client.exe"
# 2. Start the client, log in, and check them in the running clientpython tools/EUOMigrate/euomigrate.py verify tools/EUOMigrate/out/<id>/candidates.jsonpython tools/EUOMigrate/euomigrate.py probe tools/EUOMigrate/out/<id>/candidates.json
# 3. Paste out/<id>/uoclidata-snippet.pas into uo/uoclidata.pas, rebuild, testpwsh ./tests/run_tests.ps1
# 4. Add the build to the knowledge base for next timepython tools/EUOMigrate/euomigrate.py fingerprint "C:\Games\Ultima Online\client.exe"Every step is explained, with examples, in Add a new client.
In this section
Section titled “In this section”The architecture of the code as a whole is described in docs/architecture.md.