7 Commits
Author SHA1 Message Date
SalastilandClaude Opus 5.5 b12db08ce5 Spawn lookup by ID (0x401b28), inline EQString dtor
0x401b28 returns EQPlayer* from the 3000-entry spawn table (callers in
EQPlayer::Die etc. use it as a spawn). ~EQString is an inline header
function; 0x4482fb is its out-of-line copy, which compiler-generated
destructors call instead of inlining.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-20 23:32:09 -04:00
SalastilandClaude Opus 5.5 619169b331 Match the asset-list TU (0x40515e-0x405491)
CAssetList reads one entry per line; CHR,<prefix>,<name> lines become
character-model entries. Base class is __declspec(novtable). Fixed EQString:
0x571f70 is operator=(const EQString&), 0x571fc0 operator=(const char*),
0x572300 c_str(). 5 of 7 functions match; ctor 0x40515e and Load 0x4051cd are
NONMATCHING (register/scheduling only).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-20 19:10:49 -04:00
SalastilandClaude Opus 5.5 51d6deef8f Match shared helpers 0x401b28-0x401c6b; matching notes
GetSpellByID only matches its caller when it lives in a separate file: MSVC 7.1
tracks callee register use within a translation unit, so TU boundaries show
up in the generated code. docs/MATCHING.md collects these lessons.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-20 12:00:41 -04:00
SalastilandClaude Opus 5.5 642284b662 Match container templates, EQString dtor, Adventure currency ctor
CChunkedArray<T>/CRefPtr<T> instances, vector-deleting dtors and implicit dtors
kept by the linker from this object (0x4016c5-0x40198e), plus EQString::~EQString
(0x4482fb). The original included <new>: delete[] goes to operator delete[].
Tools: header annotations resolve against every object, build tracks headers,
check --inline lists template/inline instances. 41 MATCH, 1 NONMATCHING.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-19 23:09:10 -04:00
SalastilandClaude Opus 5.5 0445661954 Neutral identifiers; check the Adventure TU's inline virtuals
Rename identifiers that came from third-party offset headers to neutral names
(only CDisplay and StringTable are proven by the binary's own strings).
Annotate the four in-class virtual bodies (0x401430-0x401450); all match.
Totals: 25 MATCH, 1 NONMATCHING.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-19 23:05:34 -04:00
SalastilandClaude Opus 5.5 29c59bd31e Match Adventure (LDoN) currency TU, 0x4013e2-0x4016c4
21 of 22 functions byte-exact; ShowSpent is NONMATCHING (memory-operand reload).
Base CMerchantCurrency is __declspec(novtable); its default slots are shared
one-line stubs, so the original link used /OPT:ICF.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-19 23:03:57 -04:00
SalastilandClaude Opus 5.5 9f4e6666b3 Annotation-driven symbols, EH-aware matching, hash-checked link; spell-point TU matched
- // FUNCTION: / GLOBAL: / LIBRARY: annotations in source name symbols, so
  decompiling never needs edits to the shared symbols.txt
- check follows compiler-generated EH handlers into .text$x and verifies
  string literals / float constants by content
- link rebuilds eqgame.exe from compiled objects with relocations resolved
  through the map and checks the SHA1 (currently identical)
- Ghidra pseudo-C export script; docs/ROADMAP.md for the full-relink plan
- /GS confirmed; 0x401022-0x4013e1 (13 functions, spell casting particle
  points) match byte-for-byte

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-19 22:46:21 -04:00