Two live cdb captures on the paired 2013 client at the Holtburg doorway: the blockset template (every Render::block_check call of one frame — 2,601 resident blocks x 2 exit views) proves retail tests a9c9 at ring slot 25,46 and returns PARTIALLY then OUTSIDE; the blockcheck template dumps its four corner interval vectors (0 0 0 0 300.4|310.2 and 0 0 0 1001 ..., slab 75..330). acdream's replay at the same P pose reproduces the sentinel pattern, the four edge planes and both verdicts, drawing a9c9 once, with clip heights 298.8/308.5 m — a 0.5 % plane difference (about 0.35 px of projected door-vertex position). At the fixture pose that margin is what flips the south-west corner from inside to outside on the fourth edge plane, so retail's four-corner unanimity test says OUTSIDE where ours says PartiallyInside. Not fixable bit-exactly short of D3D's x87 transform; the KnownFailure row stays with its comment rewritten, the register carries AD-118, and the first filtered capture's silent miss (cdb sign-extends poi() inside .if; use dwo()) is noted in the template. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
37 lines
2.1 KiB
Text
37 lines
2.1 KiB
Text
* OH walk-oracle capture: BLOCK SET (2026-09-03, for docs/ISSUES.md #458).
|
|
* The filtered block-check template (oh-capture-blockcheck.cdb.template)
|
|
* printed NOTHING for block 0xA9C9FFFF at the doorway pose — either retail
|
|
* never calls Render::block_check for that block (it is not resident in
|
|
* LScape's block ring at that pose, so draw_check_blocks skips it) or the
|
|
* template's register facts are wrong. This template settles which: it prints
|
|
* EVERY Render::block_check @0x0054dc50 call for the captured frames — the
|
|
* block DID (esi = the caller's CLandBlock*, DBObj::m_DID at +0x28), the grid
|
|
* indices (ebx = x, ebp = y) and the returned BoundingType at the call's
|
|
* return site 0x005061e9 — plus a per-frame hit count, so the set of blocks
|
|
* retail checks can be diffed against acdream's WalkLandscape.Blocks at the
|
|
* same P pose. No interval dumps (cheap enough for the whole ring).
|
|
*
|
|
* LINE FORMATS:
|
|
* F <n> -- frame marker (SmartBox::RenderNormalMode)
|
|
* P <cell> <ox> <oy> <oz> <qw> <qx> <qy> <qz> -- viewer pose, raw dwords
|
|
* N <count> -- block_check calls seen since the last F
|
|
* BC did=<hex> gx=<n> gy=<n> esi=<hex>
|
|
* BR ret=<n> -- the BoundingType returned for the last BC
|
|
*
|
|
* AUTO-DETACH: same fall-through + top-level qd recipe as the walk template.
|
|
* BEFORE USE: replace <FRAMES> and <LOG>. Use -Frames 2: the marker fires
|
|
* BEFORE a frame's checks, so frame 1's checks land between F 1 and F 2.
|
|
|
|
.logopen <LOG>
|
|
.sympath C:\Users\erikn\source\repos\acdream\refs
|
|
.symopt+ 0x40
|
|
.reload /f acclient.exe
|
|
r $t0 = 0
|
|
r $t9 = 0
|
|
bp 00453aa0 "r $t0 = @$t0 + 1; .printf \"N %d\\n\", @$t9; r $t9 = 0; .printf \"F %d\\n\", @$t0; .printf \"P %08x %08x %08x %08x %08x %08x %08x %08x\\n\", poi(0081ef00+4), poi(0081ef00+0x3c), poi(0081ef00+0x40), poi(0081ef00+0x44), poi(0081ef00+8), poi(0081ef00+0xc), poi(0081ef00+0x10), poi(0081ef00+0x14); .if (@$t0 < 0n<FRAMES>) { gc }"
|
|
bp 0054dc50 "r $t9 = @$t9 + 1; .printf \"BC did=%08x gx=%d gy=%d esi=%08x\\n\", poi(@esi+0x28), @ebx, @ebp, @esi; gc"
|
|
bp 005061e9 ".printf \"BR ret=%d\\n\", @eax; gc"
|
|
g
|
|
.echo ===DETACHING===
|
|
qd
|
|
.logclose
|