P0 Task 6 complete. Captured live retail membership at the 0031<->0170<->0171 doorway via cdb on CPhysicsObj::change_cell (symbol-driven; offsets verified by discover-types.cdb; PDB MATCH). 22 transitions, clean monotonic sequence, NO ping-pong (retail is correct-by-construction). Golden: Conformance/Fixtures/find-cell-list-threshold.log. ROOT-CAUSE FINDING (the central P1 work): retail transitions membership at the PORTAL CROSSING (CEnvCell::find_transit_cells @ 0x52c820 pc:309968 — sphere crosses the doorway polygon plane), while acdream's FindCellList re-picks by POINT-IN-CELL containment at the foot. Retail commits room 0171 while the foot is STILL inside vestibule 0170's BSP (in_0171=0); acdream lags. ALL 22 transitions diverge for this one criterion mismatch — not a per-cell hysteresis or a building-entry-only split. This is master-plan §0 'hysteresis gap' confirmed against the real client. FindCellList_DoorwayThreshold_DivergesFromRetail_PendingP1 (documents-the-bug, GREEN) + ThresholdDivergenceDiagnosticTests (per-transition containment print) pin it; both flip when P1 ports the directed portal crossing. Conformance 59 pass / 1 skip / 0 fail; full Core 1308 pass / 5 fail (baseline) / 1 skip — no new failures. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
34 lines
2.1 KiB
Text
34 lines
2.1 KiB
Text
$$ ============================================================================
|
|
$$ find-cell-list-capture.cdb — P0 conformance retail golden capture
|
|
$$ ----------------------------------------------------------------------------
|
|
$$ Captures retail's ACCEPTED membership transitions at a building doorway so we
|
|
$$ can pin acdream's CellTransit.FindCellList against it (P0 Task 6, P1 gate).
|
|
$$
|
|
$$ Target: CPhysicsObj::change_cell @ 0x00513390 (pc:281192) — fires ONLY on an
|
|
$$ accepted cell transition (the doorway crossings) -> short clean sequence.
|
|
$$ thiscall: this (CPhysicsObj*) = @ecx ; arg new_cell (CObjCell*) = poi(@esp+4)
|
|
$$
|
|
$$ Offsets VERIFIED live via tools/cdb/discover-types.cdb against the matched PDB:
|
|
$$ CPhysicsObj.m_position @ +0x48 ; .cell @ +0x90
|
|
$$ Position.objcell_id @ +0x04 ; .frame @ +0x08 ; Frame.m_fOrigin @ +0x34
|
|
$$ CObjCell.pos @ +0x54 -> a cell's id = cell + 0x54 + 0x04 = cell + 0x58
|
|
$$ player origin x/y/z = @ecx + 0x48 + 0x08 + 0x34 = @ecx + 0x84 (x), +0x88, +0x8c
|
|
$$
|
|
$$ seed = this->cell->pos.objcell_id (the cell BEFORE this change; null-guarded)
|
|
$$ picked = new_cell->pos.objcell_id (the cell committed)
|
|
$$ px/py/pz = player world origin as raw IEEE-754 hex (decode: decode_retail_hex.py)
|
|
$$
|
|
$$ Emits the golden format read by RetailTrace.ParseFindCellList:
|
|
$$ [fcl] seed=0x<oldcell> px=0x<hex> py=0x<hex> pz=0x<hex> picked=0x<newcell>
|
|
$$ ============================================================================
|
|
|
|
.logopen C:\Users\erikn\source\repos\acdream\.claude\worktrees\thirsty-goldberg-51bb9b\find-cell-list-capture.log
|
|
.sympath C:\Users\erikn\source\repos\acdream\refs
|
|
.symopt+ 0x40
|
|
.reload /f acclient.exe
|
|
|
|
r $t0 = 0
|
|
bp acclient!CPhysicsObj::change_cell "r $t0 = @$t0 + 1; r $t1 = 0; .if (poi(@ecx+0x90) != 0) { r $t1 = poi(poi(@ecx+0x90)+0x58) }; .printf /D \"[fcl] seed=0x%08x px=0x%08x py=0x%08x pz=0x%08x picked=0x%08x\\n\", @$t1, poi(@ecx+0x84), poi(@ecx+0x88), poi(@ecx+0x8c), poi(poi(@esp+4)+0x58); .if (@$t0 >= 16) { .printf /D \"=== DETACH after %d cell changes ===\\n\", @$t0; qd } .else { gc }"
|
|
|
|
.printf \"find-cell-list capture armed (change_cell). Walk SLOWLY in/out of the doorway now.\\n\"
|
|
g
|