build_exe.py now runs compile -> link (+ .map) -> patch. scripts/exe/postprocess.py
applies scripts/exe/patches/NNNN_*.py in order, each located by symbol, verified
against exact bytes, dropping base relocations it overwrites; --no-postprocess skips it.
0001: CSession::LoadExternalSettings jumps over switch (g_serviceType) to case 0,
as the original does at 0x00DFD08F (e9 10 00 00 00).
scripts/exe/gen_ide.py writes build/Ragexe.sln (Makefile project: Build runs
scripts/exe/build_exe.py like td compile, Rebuild/Clean, Debug starts
build/exe/Ragexe.exe; all units and headers with per-unit IntelliSense flags)
and build/editor-x86/compile_commands.json (clangd, VS Code, CLion).
The hand-written CMakeLists.txt covered 392 of 980 units without the
per-unit flags and was unused by clank; removed with its ThirdParty file.
.clangd drops /execution-charset (CP949), which clang does not accept.
Seeds account tester2 / tester2 (id 2000001, group 0) next to the GM account tester (2000000, group 99), and documents both in docker-compose.yml. Only applies to a fresh rathena-db volume.
Recovered/ holds the code linked only into the standalone exe (scripts/exe/build_exe.py), outside the Clank source dirs:
- jsoncons/ and nProtect/ moved from scripts/exe/; GameGuard stand-in follows main's renamed entry points.
- GPak/PakAuxiliary.cpp: Extract (virtualised in every build; 02-19 jumps out at 0x0065861E) rebuilt from the open GRF Editor decoder, after the visible 02-19 prologue; inline key and kRO keys 1-4. Apply traps (unreachable in 02-19).
- GGHash/GGHash.cpp: CGGHash::Load/Check/VerifyHash trap (RagHash.dat check unreachable in 02-19).
The whole client links: 984 units, 0 unresolved.
build_exe.py compiles every unit in data/compile.json with the pinned toolchain and links Ragexe.exe.
Not part of the decompilation and not in data/compile.json: imports/*.def (original DLL import tables),
jsoncons/ (v0.170.2 headers + JsonCppLoader glue), nProtect/GameGuard.cpp (no-op GameGuard stand-in).