test(p2): faithful cellar-lip wedge reproduction + investigation apparatus (no fix yet)

P2 / M1.5 "blocked at the last step" cellar-lip wedge. This session built a faithful
deterministic reproduction and peeled the cause through six evidence-disproven framings
to one bounded question. NO fix landed — the last layers were each disproven by evidence,
and guessing at the load-bearing collision code is the saga's failure mode.

Apparatus:
- CellarLipWedgeTests.cs + Fixtures/cellar-lip/ (3 real cell dumps + wedge-records.jsonl =
  29 captured ACDREAM_CAPTURE_RESOLVE wedge calls). Replays the exact calls + body-before
  through the lip-cell engine: all 29 reproduce at 0% advance in <200 ms. Tests are
  documents-the-bug / diagnostics (GREEN while the wedge exists).
- TEMP probes ([path5-wall]/[fw-enter]/[find-walkable] in BSPQuery; [neg-poly]/[stepsphereup]/
  [stepdown-decide]/CheckOtherCells cn/sn/negHit in TransitionTypes), gated on
  ACDREAM_PROBE_INDOOR_BSP, marked STRIP. TransitionTypes neg-poly shortcut has a reverted-fix
  comment (slide attempt didn't clear the wedge).
- tools/cdb/retail-*-trace.cdb (retail cdb traces).

Findings (handoff: docs/research/2026-06-04-p2-cellar-lip-flatfloor-cp-handoff.md, see the
"NEXT-SESSION KICKOFF" at top):
- Flat-floor contact plane is retail-faithful (v1 trace, full-file correlation). NOT the bug.
- PosHitsSphere cull sign is retail-faithful (cdb -z verified; the Binary Ninja `test ah,N; jp`
  parity-jump reads inverted — caught + reverted a wrong fix from that mis-read).
- Sphere radius correct (0.48 player / 0.30 camera probe).
- Retail connector cell 0xA9B40175 never blocks (CEnvCell::find_collisions trace: 0 Collided/Slid).
- PINNED: during the step-up's step-down, BSPQuery.FindWalkableInternal is never called for cell
  0171, so the cottage floor (poly 0x0023, Z=94) is never tested as walkable -> no contact plane
  -> step-up fails -> StepUpSlide=Collided -> wedge.

Next: trace FindEnvCollisions -> FindCollisions path dispatch for 0171 during StepDown=true (why
StepSphereDown/find_walkable is skipped), port retail, validate via CellarLipWedgeTests, regress
DoorBugTrajectoryReplayTests + visual gate.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Erik 2026-06-05 08:30:36 +02:00
parent 57435e912b
commit bc1be26907
12 changed files with 5824 additions and 3 deletions

View file

@ -1,5 +1,20 @@
# P2 pickup — cellar-top corner wedge = cell-resolver ping-pong (re-diagnosed) reverting a WORKING step-up # P2 pickup — cellar-top corner wedge = cell-resolver ping-pong (re-diagnosed) reverting a WORKING step-up
> **🟢 SUPERSEDED 2026-06-04 PM — the wedge is NOT membership and NOT a reverted landing.**
> Canonical findings + full evidence chain are now in `memory/project_p2_door_stepup_findings.md`
> (the "RE-DIAGNOSIS 2" + "SLIDE LOCALIZED" + "FAILING CONDITION PINNED" entries). One-line summary:
> a live **retail cdb trace** proved retail's carried cell ALSO flips 0174/0175/0171 at the lip yet
> retail is smooth → membership ruled out. The wedge is a **step-up coin-flip**: the step-up's
> internal step-down FAILS to set a contact plane on the FLAT cottage floor (`cpValid=False`,
> `walkInterp=1.0`) while it works on the ramp slope. acdream's `StepSphereDown`/`AdjustSphereToPlane`
> are FAITHFUL to retail (verified vs `find_walkable` pc:326793 + `adjust_sphere_to_plane` pc:322032),
> so the obvious "set the CP anyway" fix DIVERGES from retail — do NOT ship it. **NEXT STEP (ready):**
> run `tools/cdb/retail-flatfloor-trace.cdb` on the live retail client at the cellar lip to see whether
> retail's `step_sphere_down` returns 3 (sets CP) or 1 (no CP) on the flat floor — that decides where
> retail establishes the flat-floor contact plane, then port it. 4 TEMP probes (gated on
> ACDREAM_PROBE_INDOOR_BSP, marked STRIP) are uncommitted in the worktree. The text below is HISTORY.
> **Canonical pickup, 2026-06-04.** Branch `claude/thirsty-goldberg-51bb9b` (do NOT > **Canonical pickup, 2026-06-04.** Branch `claude/thirsty-goldberg-51bb9b` (do NOT
> branch/worktree; do NOT push without asking; NEVER `git stash`/`gc`). PowerShell on > branch/worktree; do NOT push without asking; NEVER `git stash`/`gc`). PowerShell on
> Windows; launch logs are UTF-16. > Windows; launch logs are UTF-16.

View file

@ -0,0 +1,445 @@
# P2 cellar-lip wedge — CANONICAL handoff (flat-floor contact-plane coin-flip)
## ▶ NEXT-SESSION KICKOFF (START HERE — supersedes everything below)
**State:** M1.5 / P2 cellar-lip "blocked at the last step" wedge. A FAITHFUL deterministic reproduction now
exists. The cause has been peeled through SIX evidence-disproven framings to one bounded question. No fix
landed (intentionally — the last layers were each disproven; do NOT guess, the collision code is load-
bearing). Branch `claude/thirsty-goldberg-51bb9b` (do NOT branch/worktree; do NOT push w/o asking; NEVER
`git stash`/`gc`). PowerShell on Windows; launch logs UTF-16. Use `superpowers:systematic-debugging`.
**READ (in order):** (1) THIS file's `## SESSION-END` + `UPDATE 1` + `UPDATE 2` (the live captures + the
pinned root cause) and `CORRECTION 1`/`CORRECTION 2` (CP + cull are RETAIL-FAITHFUL, proven). (2)
`memory/project_p2_door_stepup_findings.md`.
**DONE — faithful apparatus (uncommitted in worktree; RECOMMEND committing first):**
`tests/AcDream.Core.Tests/Physics/CellarLipWedgeTests.cs` + `Fixtures/cellar-lip/0xA9B4017{1,4,5}.json` +
`Fixtures/cellar-lip/wedge-records.jsonl` (29 real `ACDREAM_CAPTURE_RESOLVE` wedge calls). Replays the EXACT
captured calls (seed body-before, real climb dir X,+Y) through the lip-cell engine — **all 29 reproduce
the wedge at 0% advance in <200 ms.** Tests (all GREEN as documents-the-bug/diagnostics):
`DocumentsWedge_LiveFloorCp_PlayerStuckAtCottageFloorEdge`, `Diagnostic_ReplayLiveWedgeRecords_Advance`,
`Diagnostic_ReplayFloorCpRecord_StepUpProbes` (→ `%TEMP%/lip-wedge-stepup.log`), + 2 synthetic.
**DISPROVEN — do NOT re-investigate:** flat-floor CP (retail also no-CP, smooth — Correction 1); the
`PosHitsSphere` cull sign (retail-faithful, `cdb -z`-verified — Correction 2); sphere radius (0.48=player
correct, 0.30=camera probe); the A6.P4 neg-poly `Collided``slide_sphere` shortcut (fix attempted + reverted,
didn't clear it — the slide returns offset=0 then degenerates to Collided on re-check).
**PINNED ROOT-CAUSE LAYER (UPDATE 2):** during the step-up's step-down (`DoStepUp``DoStepDown`
`TransitionalInsert(5)`), **`BSPQuery.FindWalkableInternal` is NEVER called for cell 0171** (confirmed after
a CLEAN rebuild — `[fw-enter]` TEMP probe fires 0×). So the cottage floor (0171 poly 0x0023, n=(0,0,1),
Z=94) is **never tested as walkable** → no contact plane → step-down rejects (`cpValid=False`) → step-up
fails → `StepUpSlide=Collided` → wedge. `[other-cells] iter=0171 result=OK` is returned WITHOUT reaching
`StepSphereDown``find_walkable`.
**THE JOB (bounded, evidence-first — NO speculative edits):**
1. Trace `Transition.FindEnvCollisions` (TransitionTypes.cs) → `BSPQuery.FindCollisions` PATH DISPATCH for
cell 0171 when `StepDown=true`. Find WHY `StepSphereDown`/`FindWalkableInternal` is skipped — candidates:
entry `NodeIntersects` early-OK; Path 1 (Placement) taken (DoStepDown's placement insert); the primary
0175 collision returning Collided (the X-wall Path-5 `StepSphereUp`, `stepUp=stepDown=False` = the OUTER
non-step pass) short-circuiting before `CheckOtherCells(0171)`; or StepDown not actually set on that call.
Use the `[fw-enter]`/`[find-walkable]` TEMP probes — **FORCE A CLEAN REBUILD (`Remove-Item obj,bin`) for
any Core probe edit; `dotnet test`/`dotnet build` incremental did NOT pick up new BSPQuery.cs probes
(cost two probe rounds).**
2. Port retail's behavior (oracle: `CEnvCell::find_collisions` pc:309560 → `BSPTREE::find_collisions`
pc:323725 Path-3 → `BSPTREE::step_sphere_down` pc:323665 → `BSPLEAF::find_walkable` pc:326793). Verify
how retail's step-down reaches `find_walkable` on the cottage floor where acdream's does not.
3. Fix → VALIDATE: flip `CellarLipWedgeTests.DocumentsWedge_LiveFloorCp_*` to `advance>0.25·requested`
GREEN; `Diagnostic_ReplayLiveWedgeRecords` advance% jumps off 0%. 4. REGRESSION: `DoorBugTrajectoryReplayTests`
+ full Core suite. **VISUAL GATE: cellar ascent clean (no last-step wedge) + inn door BLOCKS + generic
step-up climbs.**
**ENABLER:** `cdb -z "C:\Turbine\Asheron's Call\acclient.exe"` = offline static disasm + `uf` w/ PDB symbols
(no live attach); use it to verify any retail branch/offset (the cull-sign error was a BN parity-jump
mis-read — never trust BN `if(p)` for `test ah,N; jp`).
**Apparatus (uncommitted, worktree):** the test + fixtures above; TEMP probes in `BSPQuery.cs`
(`[path5-wall]`,`[fw-enter]`,`[find-walkable]`, STRIP) + `TransitionTypes.cs` (`[neg-poly]`,`[stepsphereup]`,
`[stepdown-decide]`, CheckOtherCells cn/sn/negHit, STRIP) all gated on `ACDREAM_PROBE_INDOOR_BSP`; captures
`lip-wedge-resolve.jsonl`/`lip-cells/`/`launch-*.log`; cdb scripts `tools/cdb/retail-connector-collide-trace.cdb`
(+ flatfloor/lip); analyzers `analyze_wedge_jsonl.py`/`extract_wedge_records.py`/`analyze_v1_corr.py`;
`cdbz-disasm.txt`/`cdbz-poshits.txt`. **Test baseline:** Core prior 1310p/4f/1s + 5 GREEN lip tests; App 177.
---
> **Canonical pickup, 2026-06-04 PM.** Branch `claude/thirsty-goldberg-51bb9b` (do NOT
> branch/worktree; do NOT push without asking; NEVER `git stash`/`gc`). PowerShell on
> Windows; launch logs are UTF-16. This SUPERSEDES the membership re-diagnosis in
> `docs/research/2026-06-04-p2-cellar-corner-stepup-handoff.md` (now history) and folds in
> the full chain from `memory/project_p2_door_stepup_findings.md`.
---
## 🧪 SESSION-END 2026-06-04 PM — deterministic repro BUILT + first fix attempt REVERTED
**Apparatus shipped (uncommitted in worktree):** `tests/AcDream.Core.Tests/Physics/CellarLipWedgeTests.cs`
+ fixtures `tests/AcDream.Core.Tests/Fixtures/cellar-lip/0xA9B4017{1,4,5}.json` (copied from `lip-cells/`).
Loads the 3 lip cells (synthetic single-leaf BSP, same as `CellarUpTrajectoryReplayTests`), seeds the
player (r=0.48, foot bottom Z=93.456 → foot-sphere center Z=93.936 = the live wedge) carried in slab
0175, drives forward. **Reproduces the wedge deterministically in <90 ms:** the player FREEZES, blocked
by the threshold slab's X side wall (poly normal world (1,0,0)). Two tests, both GREEN as documents-the-
bug: `Diagnostic_DriveOffThreshold_DumpTrajectory` (dumps trajectory+probes to `%TEMP%/lip-wedge-diag.log`
via Console redirect) + `DocumentsWedge_PlayerFrozenAtThreshold_BlockedByMinusXWall`.
**FIX ATTEMPT #1 — REVERTED.** Hypothesis: the A6.P4 neg-poly `NegStepUp==false` branch
(`TransitionTypes.cs` ~line 1083) returns `Collided` (a deliberate "simpler response" shortcut; the
comment says the slide was deferred), where retail dispatches `neg_step_up==0 → slide_sphere`. Replaced
it with `SlideSphereInternal(NegCollisionNormal, GlobalCurrCenter[0].Origin)` (mirroring the NegStepUp=
true branch). **Did NOT fix the wedge** → reverted. WHY: the slide returns `Slid` with **offset=0** (the
Y displacement is already along the crease `dir=cross((1,0,0),(0,0,1))=(0,1,0)`), so the sphere
doesn't move; the loop re-checks with `gDelta≈0``SlideSphere`'s `offset.LengthSquared<ε → Collided`
branch (`TransitionTypes.cs:2877`) → revert. So the bug is NOT the shortcut alone — it's the
**slide/loop-commit**: the parallel-graze slide produces no advance, and the re-check degenerates to
Collided.
**TWO GAPS for the next pass:**
1. **Faithful repro:** the synthetic drive direction (world Y) is a GUESS and is PARALLEL to the X
wall (keeps grazing). The real climb direction is unknown without the exact `targetPos`. **Get a
short `ACDREAM_CAPTURE_RESOLVE=<path>` JSONL of the live wedge** (one acdream run, wedge ~5 s) → wire
a `LiveCompare`-style test (the proven `CellarUpTrajectoryReplayTests` pattern) with the exact
currentPos/targetPos/body-before. That makes the RED test faithful + the fix validatable.
2. **The real fix is in the slide/loop:** why does retail's `slide_sphere` advance the sphere PAST the
parallel graze where acdream's returns offset=0 then degenerates to Collided on re-check? Trace
retail `CSphere::slide_sphere` (pc:321660) vs acdream `SlideSphere` (`TransitionTypes.cs:2826`) for
the parallel-wall + grounded case, AND why the loop re-check sees `gDelta≈0`. NOTE the live wedge
used the **NegStepUp=TRUE** path (StepSphereUp→StepUpSlide=Collided) while the synthetic repro used
**NegStepUp=FALSE** (neg-poly-dispatch→Collided) — BOTH end in `SlideSphere`/`SlideSphereInternal`
returning Collided, so the common fix point is `SlideSphere`'s degenerate-offset handling, not the
dispatch branch. **DOOR REGRESSION RISK:** any `SlideSphere`/neg-poly change touches the A6.P4 door
block — regression-test `DoorBugTrajectoryReplayTests` + visual-gate the inn door BLOCKS.
**Test baseline unchanged:** the 2 new lip tests are GREEN (documents-the-bug). Build green. The reverted
fix leaves `TransitionTypes.cs` functionally identical (only an explanatory comment added at the shortcut).
### UPDATE (same session, later) — FAITHFUL repro BUILT + ROOT CAUSE PINNED
Got the JSONL (`ACDREAM_CAPTURE_RESOLVE``lip-wedge-resolve.jsonl`, 17K player records). The real climb
direction is **X,+Y** (my synthetic Y guess was backwards). Extracted 29 representative wedge records to
`tests/AcDream.Core.Tests/Fixtures/cellar-lip/wedge-records.jsonl` (`extract_wedge_records.py`).
`CellarLipWedgeTests` now replays the EXACT captured calls (seed body-before, replay `ResolveWithTransition`
through the lip-cell engine): **all 29 reproduce the wedge bit-faithfully (0% advance).** New tests (all
GREEN as documents-the-bug / diagnostics): `Diagnostic_ReplayLiveWedgeRecords_Advance`,
`Diagnostic_ReplayFloorCpRecord_StepUpProbes`, `DocumentsWedge_LiveFloorCp_PlayerStuckAtCottageFloorEdge`.
**ROOT CAUSE PINNED** (via `Diagnostic_ReplayFloorCpRecord_StepUpProbes``%TEMP%/lip-wedge-stepup.log`):
the player is at the doorway EDGE of the cottage floor. The step-up (triggered by the X wall, normal
(1,0,0), STEEP) → step-down → multi-cell check reaches **0171 poly 0x0023 = the cottage floor** (n=(0,0,1),
world Z=94). The 0.48 sphere **OVERLAPS** it (`overlapsSphere=True`, `dist=0.085`) — BUT it's **REJECTED
because the sphere center projects outside the floor poly's edge** (`insideEdges=False`, `gap=0.395`). So
`[other-cells] iter=0171 result=OK` (NOT Adjusted), no contact plane is set → `[stepdown-decide] cpValid=
False accept=False` → step-up FAILS → `StepUpSlide=Collided` → wedge. Retail accepts the floor at its edge
and crosses (0175 never blocks). **This is a WALKABLE-EDGE acceptance divergence**, not a CP/cull/slide bug.
**THE FIX (next, narrow):** compare acdream's walkable-edge math vs retail for the sphere-overlaps-floor-
but-center-outside-edge case. Actual walkable test = `BSPQuery.WalkableHitsSphere` (254) →
`PolygonHitsSpherePrecise` (overlap) + `AdjustSphereToPlane` (351); `[other-cells] result=OK` means one of
them returned false for poly 0x0023. The `[walkable-nearest]` diagnostic uses `CheckWalkable` (287, the
edge/`insideEdges` test). Retail oracle: `CPolygon::walkable_hits_sphere` (pc:323006) +
`CPolygon::check_walkable` (pc:322811) + `CPolygon::adjust_sphere_to_plane` (pc:322032). Read which one
rejects the edge-overlap and why retail accepts it. **Validate with `CellarLipWedgeTests` (flip
`DocumentsWedge_LiveFloorCp_*` to assert advance>0.25·requested). DOOR REGRESSION RISK: walkable changes
are global — run `DoorBugTrajectoryReplayTests` + visual-gate the inn door BLOCKS + generic step-up climbs.**
Apparatus: `lip-wedge-resolve.jsonl`, `Fixtures/cellar-lip/*`, `analyze_wedge_jsonl.py`,
`extract_wedge_records.py`, `%TEMP%/lip-wedge-stepup.log`.
### UPDATE 2 — deeper: `find_walkable` is NEVER called during the step-down (cottage floor never tested)
Drilled one layer further with TEMP probes `[fw-enter]`/`[find-walkable]` in `BSPQuery.FindWalkableInternal`
(gated on `ACDREAM_PROBE_INDOOR_BSP`, marked STRIP, uncommitted). **Confirmed after a CLEAN rebuild (deleted
obj/bin) — `[fw-enter]` fires ZERO times** while the prior probes fire. So during the step-up's step-down
(`DoStepUp``DoStepDown``TransitionalInsert(5)`), `FindWalkableInternal` is **never reached** for 0171 (nor
0175): the cottage floor poly 0x0023 is never tested by the walkable finder. `[other-cells] iter=0171
result=OK` is returned WITHOUT `StepSphereDown`→`FindWalkableInternal`. So the "walkable-edge acceptance"
framing in UPDATE 1 is one level too shallow — the floor isn't *rejected* by the edge test, it's never
*tested* at all. Root: `FindEnvCollisions`/`BSPQuery.FindCollisions` for 0171 during the step-down returns OK
on a path BEFORE Path 3 (StepDown→StepSphereDown). **NEXT: trace `FindEnvCollisions` (TransitionTypes) → which
`FindCollisions` path 0171 takes during `StepDown=true` (entry NodeIntersects early-out? Path 1 Placement?
the primary-0175 result short-circuiting CheckOtherCells?) and why StepSphereDown/find_walkable is skipped.**
The `[stepsphereup] stepUpFlag=False stepDownFlag=False` means the X-wall StepSphereUp is the OUTER
(non-step) collision; the step-DOWN that should find the floor is a separate inner insert that never runs
find_walkable. NOTE: a clean `dotnet build`/`dotnet test` did NOT pick up new `BSPQuery.cs` probes until
`Remove-Item obj,bin`**force a clean rebuild when adding Core probes** (cost two probe rounds this session).
**HONEST STATUS: NO FIX. The collision/step path is deeper than a single-line fix** — 6+ framings this
session (CP→cull→slide→neg-poly→walkable-edge→find_walkable-not-called), each disproven by evidence and the
next layer exposed. This is the systematic-debugging "question the architecture" signal. The FAITHFUL repro
(`CellarLipWedgeTests`, 29 records @0% advance) makes the next attempt iterable; the next move is the
`FindEnvCollisions`/`FindCollisions`-path trace above, NOT another speculative edit. The collision code is
load-bearing (every floor/wall/step) — do not guess.
---
## ⚠️ CORRECTION 2026-06-04 (next session) — THE CP IS RETAIL-FAITHFUL; v2 IS MOOT
**The "decisive question" below is ANSWERED from the EXISTING v1 log — no new retail trace
needed.** The v1 `retail-flatfloor-trace.log` was wrongly dismissed as a `gu` artifact. It is
**real data.** Proof (full-file correlation over all 5,349 records, `analyze_v1_corr.py`):
- sphere **z ≤ 90.0 → pure ret=3** (CP set); **z = 94.01 (the flat cottage floor) → pure ret=1
(NO-CP), 877 records, zero ret=3**; ret mixes only in the **ramp transition zone (9093.7)**,
which is physical. A corrupted-`eax` artifact CANNOT produce two large pure populations at
opposite Z extremes with a physical transition between — the ret tracks the input Z exactly.
- **`walk_interp = 1.0 → ret=1 (no-CP) 770×`** — i.e. retail, with `walk_interp=1.0` on the flat
floor, gets NO contact plane and is **smooth**. That is the *exact* acdream condition
(`walkInterp=1.000 cpValid=False`).
- `cdb -z acclient.exe` (offline static disasm, symbols) confirms `BSPTREE::step_sphere_down`
`+0x218`=`mov eax,3;ret` (reached only after `[eax+18h]=1` contact_plane_valid + `set_walkable`)
and `+0x227`=`mov eax,1;ret` (early `je` when `find_walkable` found nothing). So ret3↔CP-set,
ret1↔no-CP is certain.
**ANSWER:** retail's `step_sphere_down` returns **NO-CP (ret 1)** on the flat cottage floor —
exactly like acdream — and retail crosses smoothly. **The contact plane is NOT the divergence.**
Both "if NO-CP → trace set_contact_plane callers" and "if SET-CP → divergence in StepSphereDown"
branches below rest on a FALSE premise (that retail establishes a flat-floor CP somewhere). It
does not. **Do NOT run the v2 trace; do NOT hunt a retail flat-floor CP path.**
**REDIRECTED diagnosis (back to the connector recovery — the `RE-DIAGNOSIS 2` / `SLIDE LOCALIZED`
line in memory, which the flat-floor-CP finding had wrongly sidelined):** the wedge is the
per-cell collide on **connector 0175** returning **Slid** during the recovery, which reverts the
good floor landing. Static comparison this session confirms the recovery structures ALL MATCH
retail: `find_collisions` Contact full-hit → `step_sphere_up`; `step_up` fail → `step_up_slide`
`slide_sphere` (retail `CSphere::step_sphere_up` pc:321611321638, `step_up_slide` pc:273930);
`check_other_cells` halts on Slid (4) clearing CP (pc:272717, `cdb -z` jump-table on `(result-1)`);
acdream `TransitionalInsert` *continues* (no revert) on Slid (TransitionTypes.cs:881). The SOLE
open question: **does retail's per-cell `CEnvCell::find_collisions` return Slid (recover & slide)
or OK (never hits) for connector 0175 at the lip?**
- OK in retail → acdream's connector Slid is SPURIOUS (over-detect / over-step-up 0175) → fix there.
- Slid in retail → retail slides+continues; acdream's wedge is the substep **REVERT** upstream
(`FindTransitionalPosition` / `ResolveWithTransition`), not the collide.
**NEW decisive trace (READY, robust, no `gu`):** `tools/cdb/retail-connector-collide-trace.cdb`
breaks `CEnvCell::find_collisions+0x1e` (the SINGLE exit; `esi`=`this`, `eax`=result; cell id
`poi(esi+0x28)`), logs ret per lip cell 0xA9B4017X. Built + offset-verified entirely offline via
`cdb -z` (no live attach). **ENABLER:** `cdb -z "C:\Turbine\Asheron's Call\acclient.exe"` does
offline static disassembly with full PDB symbols — verify any trace offset without a running client.
Everything below this banner is RETAINED FOR HISTORY (the flat-floor-CP hypothesis, now disproven).
---
## ⚠️ CORRECTION 2 — 2026-06-04 PM (live retail + acdream captures; the REAL mechanism)
Two live captures this session settled it. **Retail-connector trace** (`tools/cdb/retail-connector-collide-trace.cdb`
`retail-connector-collide-trace.log`, breaking `CEnvCell::find_collisions+0x1e`, single nesting-safe exit):
over ~85K samples the **connector cell 0175 returns 2692 OK + 94 Adjusted + 0 Collided + 0 Slid** — it
**never blocks**. (Floor 0171 and 0174 DO block — real cottage-room walls — so the trace is working.) So
the connector is a pure pass-through / successful-step-up in retail; acdream spuriously blocks it.
**acdream live capture at the wedge** (`launch-lip-capture.log`, ACDREAM_PROBE_INDOOR_BSP=1 + the 4 TEMP
probes + cell dumps `lip-cells/0xA9B4017{1,4,5}.json`) — the stuck state is:
```
[indoor-bsp] cell=0xA9B40175 lpos=(8.523,-2.251,-0.064) lprev=(8.520,-2.251,-0.064) r=0.480 result=OK
[stepdown-decide] cell=0xA9B40175 insert=OK cpValid=False cpNz=1.000 walkableZ=0.664 accept=False pos=(...,93.456)
[stepsphereup] cell=0xA9B40175 stepUpFlag=False stepDownFlag=False n=(1.00,0,0) stepped=False
[stepsphereup] cell=0xA9B40175 StepUpSlide=Collided
[indoor-bsp] cell=0xA9B40175 r=0.480 result=Collided
```
**Decoded mechanism (this is NOT the memory's "connector Slid" — that was a pre-B1-fix state):**
- **0175 is a 0.364 m-tall threshold SLAB** (dump: 4 solid side walls at local X=7/9, Y=2.85/1.15;
open floor/ceiling portals poly4→0171, poly5→0174; WorldTransform 180°-rot at (161.929,7.503,94)).
- The wedge uses the **r=0.48 body sphere** (Ø0.96 — *bigger than the slab is tall*), centered at world
Z=93.936 (local Z=0.064, i.e. SUNK into the threshold, ~0.5 m below resting-on-floor Z≈94.48).
- That oversized sphere genuinely **full-hits** the X wall (poly 3, X=9; sphere at X=8.523 reaches
X=9.003 — a **3 mm graze**; `moveDot<0` so retail would keep it too) → `BSPQuery.StepSphereUp`
(Path 5, BSPQuery.cs:1849/1380) → **`DoStepUp` fails** (its internal step-down finds no CP on the flat
floor — `[stepdown-decide] cpValid=False`, retail-faithful per Correction 1) → **`StepUpSlide`
`SlideSphereInternal` returns `Collided`** → `FindEnvCollisions` returns Collided → wedge. The 3 mm
graze is hair-trigger → explains the intermittency.
**CULL SIGN = RED HERRING (verified faithful).** Mid-session I believed acdream's `PosHitsSphere` cull
(`if moveDot>=0 return false`) was OPPOSITE retail. **WRONG**`cdb -z uf acclient!CPolygon::pos_hits_sphere`
shows `test ah,5; jp +0x46`. `jp` is a **parity** jump; the cull branch is taken on EVEN parity = `{dot>=0}`.
So retail **keeps the hit when `dot<0`, culls when `dot>=0`** — IDENTICAL to acdream + ACE (`if dist>=0
return false`). Movement convention also matches (both `checkcurr`: acdream BSPQuery.cs:1663, retail
find_collisions). **Do NOT touch the cull.** The Binary Ninja pseudo-C renders `test ah,5; jp` as
`if (p) return 0` which READS like "cull when dot<0" it is not; the parity decode is inverted. LESSON:
verify any cull/branch sign against `cdb -z`, never the BN `if(p)` rendering of a parity jump.
**ENABLER:** `cdb -z "C:\Turbine\Asheron's Call\acclient.exe"` does offline static disasm + `uf` with full
PDB symbols — used to build/verify the connector trace AND to catch the cull-sign error. Ghidra `patchmem`
addresses do NOT match the PDB/BN addresses (0x005394f0 → `CPolygon::UnPack` in Ghidra); use `cdb -z`.
**THE SHARP REMAINING QUESTION:** at the thin slab, **why does retail's step-up SUCCEED (climb onto the
cottage floor, find_collisions returns OK) where acdream's `DoStepUp` FAILS (no CP → StepUpSlide=Collided)?**
Sub-leads: (a) **RULED OUT — r=0.48 vs r=0.30 is two DIFFERENT movers, not a bug.** r=0.48 = the PLAYER
(`PlayerMovementController.cs:1116`, "human player radius from Setup"); r=0.30 = the CAMERA collision
probe (`PhysicsCameraCollisionProbe.cs:18` `ViewerSphereRadius=0.3`, single sphere). The smooth r=0.30
crossings are the camera spring-arm; the wedge is the player. Player radius 0.48 is correct. So the
question is purely the player step-up, NOT the sphere. Open: why is the player SUNK to Z=93.936 (0.5 m
below resting-on-floor Z≈94.48) at the threshold — is that retail-faithful (it's mid-climb from the
cellar) or a position error? (b) does retail even full-hit 0175's wall, or does its sphere clear it
(position)? (c) the
flat-floor step-up success path (Correction 1's open question — retail's step_up establishes the floor
CP via some path acdream lacks). NEXT: either build a deterministic harness test from `lip-cells/*.json`
(place the r=0.48 sphere at the captured wedge pos, assert FindCollisions returns OK not Collided — RED→
GREEN), or one targeted retail trace of `CSphere::step_sphere_up`/`CTransition::step_up` at 0175 (does it
return 1/OK or fall to step_up_slide?). Apparatus committed-in-worktree: `tools/cdb/retail-connector-collide-trace.cdb`,
`lip-cells/0xA9B4017{1,4,5}.json`, `launch-lip-capture.log`, `cdbz-disasm.txt`, `cdbz-poshits.txt`,
`analyze_v1_corr.py`. TEMP `[path5-wall]` probe added to BSPQuery.cs Path 5 (STRIP; was NOT in the stale
--no-build binary, so it didn't fire — rebuild to use it).
---
## State both altitudes
- **Milestone:** M1.5 — Indoor world feels right.
- **Effort:** P2 of the verbatim spatial-pipeline port
(`docs/superpowers/specs/2026-06-03-verbatim-spatial-pipeline-port-master-plan.md`).
- **Symptom (user words):** "run up the cellar stairs, get blocked at the last step;
sometimes through, sometimes not." Retail is always smooth there.
- **This session's outcome:** NO fix landed. The diagnosis was corrected three times with
evidence; the wedge is now precisely localized; the FINAL decisive question is still open
because the retail trace tooling (`gu` in a bp action) produced an artifact. One clean v2
retail trace pins it. Everything is saved; resume cold.
## The corrected diagnosis (evidence chain — all three prior theories DISPROVEN)
1. **NOT membership / cell-resolver ping-pong** (the prior handoff's claim). A live **retail
cdb trace** (`tools/cdb/retail-lip-trace.cdb``retail-lip-trace.log`, breaking
`CTransition::step_up`, logging `sphere_path.check_pos.objcell_id`) proved retail's carried
cell ALSO alternates `0xA9B40174/0175/0171` at the lip (181/40/17 over 238 step_ups), yet
retail crosses smoothly. So the carried-cell flip is retail-faithful — a "keep the cell
stable" / `ResolveCellId`-stickiness fix would DIVERGE from retail. Also: the production
`[cell-transit] reason=resolver` is the SWEPT `find_cell_list` pick (`RunCheckOtherCellsAndAdvance`
`CellTransit.FindCellSet`), NOT `PhysicsEngine.ResolveCellId` (which is only the cache-null
test fallback). `result.cellId` is STABLE in runs of 100s of ticks in
`acdream-corner-capture.jsonl` (154K recs).
2. **NOT a reverted landing (the M1 guess).** In `acdream-corner-capture.jsonl` the player
reaches the floor (Z=94.0, cpz 0.78→1.00) and WALKS ON into the cottage (idx 7215→7244);
the landing commits fine.
3. **IT IS: a step-up coin-flip on the FLAT cottage floor.** The `[stepdown-decide]` probe
(in `Transition.DoStepDown`) shows the trigger unambiguously:
- `accept=True (1845×): insert=OK cpValid=True` on the RAMP (cpNz=0.781, Z≈93.3, walkInterp≈0)
- `accept=False ( 849×): insert=OK cpValid=False cpNz=1.000 walkInterp=1.000` on the FLAT floor (Z=94.0)
The step-up's acceptance check (`insert==OK && ContactPlaneValid && cpNz>=walkableZ`,
`TransitionTypes.cs:3147`) rejects ONLY when `cpValid=False`, which happens ONLY on the FLAT
floor: the sphere is already settled → `adjust_sphere_to_plane` is a no-op → `FindWalkableInternal`
records no poly (its gate is `walkable && adjusted`, `BSPQuery.cs:736`) → `StepSphereDown`
(`BSPQuery.cs:1216`) sets no contact plane → reject. On the RAMP the sphere is always sliding
(adjusted=true) so the CP is set → accept. **Ramp = adjusting = works; flat floor = settled =
no CP = fails.** The `[stepsphereup]` probe corroborates: lip-riser step-up (cell 0171,
n=(0,-1,0)) = 443 success / 445 fail; connector +X corner wall (cell 0175, n=(1,0,0)) = 74 fail
→ recursive `StepSphereUp``StepUpSlide` = 401 Slid / 203 Collided overall.
## Why the OBVIOUS fix is WRONG (do not ship it)
"Just set the contact plane whenever a walkable poly is found, even without adjustment" — this
DIVERGES from retail. Verified against the decomp:
- `BSPLEAF::find_walkable` (`acclient_2013_pseudo_c.txt:326793`) gates BOTH the poly AND the
changed-flag on `walkable_hits_sphere && adjust_sphere_to_plane` — IDENTICAL to acdream's
`FindWalkableInternal`.
- `CPolygon::adjust_sphere_to_plane` (`:322032`) updates `walk_interp` and returns 1 only when
`new_interp = (1-t)*walk_interp < walk_interp`, i.e. `t>0` (the sphere must move toward the
plane). For a SETTLED sphere (`t≈0`) retail ALSO returns 0 → records no poly → sets no
step-down CP.
So acdream's `StepSphereDown` + `AdjustSphereToPlane` are FAITHFUL. Retail must establish the
flat-floor contact plane through a DIFFERENT path during the climb — that path is what's still
unknown.
## THE DECISIVE OPEN QUESTION + the v2 trace protocol
**Does retail's `BSPTREE::step_sphere_down` SET the contact plane (ret 3) or NOT (ret 1) on the
flat floor cell (0xA9B40171)?**
- v1 trace FAILED: `gu` inside a cdb bp action ("commands skipped … target execution inside an
event handler") corrupted eax → perfect `1,3,1,3` alternation artifact (run-length=1; the
4216/1133 histogram is meaningless). **NEVER use `gu` in a cdb bp action.**
- v2 trace READY: `tools/cdb/retail-flatfloor-trace.cdb` — stashes the cell in `$t3` at entry
via `@@c++`, counts at the two RETURN addresses (no `gu`). **STEP 0: verify the +0x218 (ret 3)
/ +0x227 (ret 1) offsets against the `u acclient!BSPTREE::step_sphere_down` disassembly the
script logs, fix if needed, re-attach, THEN have the user wedge ~10s.**
- Interpretation: if floor cell 0171 is mostly **NO-CP** → retail establishes the floor CP via a
DIFFERENT path → next trace breaks `COLLISIONINFO::set_contact_plane` and logs the CALLER
(`poi(@esp)`) for normal≈(0,0,1) to find that path, then port it. If mostly **SET-CP** → the
divergence is inside acdream's `StepSphereDown`/`AdjustSphereToPlane` after all (re-read the
`walk_interp`/`t` math vs ACE).
## Leading hypothesis (UNCONFIRMED, pending v2)
Retail's step-up ALSO "fails" on the settled flat floor (step_sphere_down no-CP) but **recovers
via `step_up_slide` smoothly**, where acdream wedges — so the divergence may be in the SLIDE
RECOVERY (`SpherePath.StepUpSlide``Transition.SlideSphereInternal`, the B1/`slide_sphere`
area, commits `abbd761`/`0935a31`) and/or the connector-cell-0175 `StepSphereUp` interference,
NOT the contact plane itself. The B1/slide fixes are correct FOR THE DOOR; re-investigation is
warranted FOR THE CELLAR recovery only.
## Retail decomp anchors (verified this session)
`CTransition::step_up` pc:273099 (clears CP @273103, calls step_down) · `CTransition::step_down`
pc:272946 (the `if (step_up==0)` lower-gate @272954; `transitional_insert(5)`; accept iff
`!cond:0 && contact_plane_valid` @272968) · `BSPTREE::step_sphere_down` pc:323665 (sets
`contact_plane_valid=1` UNCONDITIONALLY when a poly is found @323711; return 3) ·
`BSPLEAF::find_walkable` pc:326793 · `CPolygon::adjust_sphere_to_plane` pc:322032 ·
`CTransition::transitional_insert` pc:273137 (neg_poly_hit → slide_sphere @273350) ·
`CTransition::validate_transition` pc:272547 · `CTransition::check_other_cells` pc:272717.
## acdream code map (where the fix will likely go)
`BSPQuery.StepSphereDown` (:1216) · `FindWalkableInternal` gate (:736) · `AdjustSphereToPlane`
(:351) · `FindCollisions` StepDown dispatch (:1753) · `StepSphereUp` (:1372) · `StepUpSlide`
(TransitionTypes.cs:472) / `SlideSphereInternal` · `DoStepUp` (:3269) / `DoStepDown` (:3089) ·
step-up acceptance (:3147) · neg_poly dispatch gated `!StepDown && !StepUp` (:1040) ·
`CheckOtherCells` (:1632) · `RunCheckOtherCellsAndAdvance` (:2158).
## Apparatus inventory
**TEMP probes (UNCOMMITTED in worktree, gated on `ACDREAM_PROBE_INDOOR_BSP`, marked STRIP):**
`BSPQuery.NegPolyHitDispatch``[neg-poly]`; `BSPQuery.StepSphereUp``[stepsphereup]`;
`Transition.CheckOtherCells``cn`/`sn`/`negHit` added to `[other-cells]`; `Transition.DoStepDown`
`[stepdown-decide]`.
**Existing env probes:** `ACDREAM_PROBE_INDOOR_BSP=1` (→ `[indoor-bsp]`+`[other-cells]`+the 4 TEMP),
`ACDREAM_DUMP_STEPUP=1` (→ `stepup:`), `ACDREAM_PROBE_CELL=1` (→ `[cell-transit]`),
`ACDREAM_PROBE_STEP_WALK=1` (→ `[step-walk]`, very high volume), `ACDREAM_CAPTURE_RESOLVE=<path>`.
**cdb scripts:** `tools/cdb/retail-lip-trace.cdb` (carried cell — DONE), `tools/cdb/retail-flatfloor-trace.cdb`
(v2, READY). Binary `C:\Turbine\Asheron's Call\acclient.exe` MATCHES `refs/acclient.pdb`.
**Logs (worktree root, UTF-16/big — do NOT commit):** `acdream-corner-capture.jsonl` (321MB),
`launch-corner-{innerflow,slidepoly,negpoly,ssu,decide}.log`, `retail-lip-trace.log`,
`retail-flatfloor-trace.log` (artifact), `corner-cells-audit.txt`. **Analyzers:** `analyze_corner.py`.
## DO NOT
- Re-diagnose as membership / add `ResolveCellId` stickiness (RULED OUT by retail cdb).
- Ship "set the step-down CP without adjustment" (DIVERGES from retail — verified vs decomp).
- Use `gu` inside a cdb bp action (corrupts eax — v1 trace artifact).
- Re-investigate B1/`slide_sphere` AS THE DOOR FIX (correct); but the cellar SLIDE RECOVERY is a
legitimate new suspect.
- Flip `Apparatus_Grounded_50cmOffCenter` to `Assert.True` (synthetic-floor artifact).
- Guess the fix — the divergence is genuinely subtle (`walk_interp`/slide-recovery), pin it first.
## Test baseline
Core 1310 pass / 4 fail / 1 skip (the 4: `Apparatus_Grounded_50cmOffCenter` [synthetic-floor],
2× `DoorBugTrajectoryReplay LiveCompare_*` [captured-buggy-live], `BSPStepUpTests.D4` [airborne
Path 6, separate]); App 177 green. Branch HEAD `664101f` + this session's UNCOMMITTED probes/docs.
## FRESH-SESSION KICKOFF PROMPT (copy-paste)
```
Continue the P2 cellar-lip wedge fix for acdream. Branch claude/thirsty-goldberg-51bb9b (do NOT
branch/worktree; do NOT push without asking; NEVER git stash/gc). PowerShell on Windows; launch
logs are UTF-16. Use superpowers:systematic-debugging.
READ FIRST (in order):
1. docs/research/2026-06-04-p2-cellar-lip-flatfloor-cp-handoff.md (THIS handoff — canonical).
2. memory/project_p2_door_stepup_findings.md (full chain: RE-DIAGNOSIS 2 + SLIDE LOCALIZED +
FAILING CONDITION PINNED + RETAIL trace ATTEMPT #1 entries).
STATE: M1.5. The cellar "blocked at the last step, sometimes through" wedge is RE-DIAGNOSED with
live retail cdb evidence: NOT membership (retail's carried cell flips the same way + is smooth),
NOT a reverted landing. It IS a step-up coin-flip on the FLAT cottage floor — the step-up's
internal step-down sets NO contact plane on the settled flat floor (cpValid=False, walkInterp=1.0)
so the acceptance check rejects, while it works on the ramp slope. acdream's StepSphereDown +
AdjustSphereToPlane are FAITHFUL to retail (verified vs find_walkable pc:326793 + adjust_sphere_to_plane
pc:322032), so the obvious "set the CP anyway" fix is WRONG — retail establishes the flat-floor CP
via a DIFFERENT path that is still unknown.
THE JOB (evidence-first; do NOT guess):
1. Run the READY v2 retail trace tools/cdb/retail-flatfloor-trace.cdb (user relaunches the retail
client + walks to the cellar lip; STEP 0 = verify the +0x218/+0x227 return offsets against the
`u` disassembly the script logs BEFORE driving; NO `gu` in bp actions). Answer: does retail's
step_sphere_down set the CP (ret 3) or not (ret 1) at floor cell 0xA9B40171?
2. If mostly NO-CP → trace COLLISIONINFO::set_contact_plane callers (poi(@esp)) for normal≈(0,0,1)
to find retail's flat-floor CP path; port it. If mostly SET-CP → the divergence is in acdream's
StepSphereDown/AdjustSphereToPlane walk_interp/t math vs ACE. Leading hypothesis: retail's
step-up also "fails" on the flat floor but RECOVERS via step_up_slide smoothly where acdream
wedges → the divergence may be the SLIDE RECOVERY (StepUpSlide/SlideSphereInternal) +
connector-0175 StepSphereUp interference, NOT the CP.
3. RED→GREEN deterministic test + STRIP the 4 TEMP probes once the fix lands. USER VISUAL GATE:
cellar ascent clean (no last-step wedge); inn door still BLOCKS; generic step-up climbs.
DO NOT: re-diagnose as membership / add ResolveCellId stickiness; ship "set the step-down CP
without adjust" (diverges from retail); use `gu` in a cdb bp action; guess.
TEST BASELINE: Core 1310 pass / 4 fail / 1 skip (documented); App 177 green. Branch HEAD 664101f +
UNCOMMITTED TEMP probes (BSPQuery.NegPolyHitDispatch [neg-poly], BSPQuery.StepSphereUp
[stepsphereup], CheckOtherCells cn/sn/negHit, DoStepDown [stepdown-decide]) gated on
ACDREAM_PROBE_INDOOR_BSP.
```

View file

@ -1374,10 +1374,27 @@ public static class BSPQuery
Vector3 collisionNormal, Vector3 collisionNormal,
PhysicsEngine engine) PhysicsEngine engine)
{ {
if (transition.DoStepUp(collisionNormal, engine!)) bool stepped = transition.DoStepUp(collisionNormal, engine!);
// TEMP diagnostic (cellar-lip wedge, 2026-06-04): this is the suspected
// recursive step-up onto the CONNECTOR cell during the outer check_other_cells
// (StepUp/StepDown both false). Log which cell, the input normal, whether the
// climb succeeded, and the slide fallback's result. STRIP once the wedge fix lands.
if (PhysicsDiagnostics.ProbeIndoorBspEnabled)
{
var p = transition.SpherePath;
Console.WriteLine(System.FormattableString.Invariant(
$"[stepsphereup] cell=0x{p.CheckCellId:X8} stepUpFlag={p.StepUp} stepDownFlag={p.StepDown} n=({collisionNormal.X:F2},{collisionNormal.Y:F2},{collisionNormal.Z:F2}) stepped={stepped} pos=({p.CheckPos.X:F3},{p.CheckPos.Y:F3},{p.CheckPos.Z:F3})"));
}
if (stepped)
return TransitionState.OK; return TransitionState.OK;
return transition.SpherePath.StepUpSlide(transition); var slideRes = transition.SpherePath.StepUpSlide(transition);
if (PhysicsDiagnostics.ProbeIndoorBspEnabled)
Console.WriteLine(System.FormattableString.Invariant(
$"[stepsphereup] cell=0x{transition.SpherePath.CheckCellId:X8} → StepUpSlide={slideRes}"));
return slideRes;
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
@ -1494,6 +1511,17 @@ public static class BSPQuery
path.NegStepUp = stepUp; path.NegStepUp = stepUp;
// ACE: path.LocalSpacePos.LocalToGlobalVec(hitPoly.Plane.Normal) // ACE: path.LocalSpacePos.LocalToGlobalVec(hitPoly.Plane.Normal)
path.NegCollisionNormal = Vector3.Transform(hitPoly.Plane.Normal, localToWorld); path.NegCollisionNormal = Vector3.Transform(hitPoly.Plane.Normal, localToWorld);
// TEMP diagnostic (cellar-lip wedge, 2026-06-04): name the exact near-miss
// polygon (id + local normal + sides) + the foot/head mapping (stepUp) + the
// step-down flag, so we can tell which connector poly the step-up grazes.
// Gated on ACDREAM_PROBE_INDOOR_BSP. STRIP once the wedge fix lands.
if (PhysicsDiagnostics.ProbeIndoorBspEnabled)
{
var nl = hitPoly.Plane.Normal;
Console.WriteLine(System.FormattableString.Invariant(
$"[neg-poly] cell=0x{path.CheckCellId:X8} stepUp={stepUp} stepDownFlag={path.StepDown} poly=0x{hitPoly.Id:X4} nLocal=({nl.X:F3},{nl.Y:F3},{nl.Z:F3}) sides={hitPoly.SidesType} checkPos=({path.CheckPos.X:F3},{path.CheckPos.Y:F3},{path.CheckPos.Z:F3})"));
}
return TransitionState.OK; return TransitionState.OK;
} }

View file

@ -1742,7 +1742,7 @@ public sealed class Transition
string bsDesc = System.FormattableString.Invariant( string bsDesc = System.FormattableString.Invariant(
$"bs=({bs.Origin.X:F3},{bs.Origin.Y:F3},{bs.Origin.Z:F3}) br={bs.Radius:F3}"); $"bs=({bs.Origin.X:F3},{bs.Origin.Y:F3},{bs.Origin.Z:F3}) br={bs.Radius:F3}");
Console.WriteLine(System.FormattableString.Invariant( Console.WriteLine(System.FormattableString.Invariant(
$"[other-cells] primary=0x{sp.CheckCellId:X8} iter=0x{cellId:X8} wpos=({footCenter.X:F3},{footCenter.Y:F3},{footCenter.Z:F3}) lpos=({localCenter.X:F3},{localCenter.Y:F3},{localCenter.Z:F3}) lprev=({localCurrCenter.X:F3},{localCurrCenter.Y:F3},{localCurrCenter.Z:F3}) r={sphereRadius:F3} {bsDesc} result={result} {polyDesc}")); $"[other-cells] primary=0x{sp.CheckCellId:X8} iter=0x{cellId:X8} wpos=({footCenter.X:F3},{footCenter.Y:F3},{footCenter.Z:F3}) lpos=({localCenter.X:F3},{localCenter.Y:F3},{localCenter.Z:F3}) lprev=({localCurrCenter.X:F3},{localCurrCenter.Y:F3},{localCurrCenter.Z:F3}) r={sphereRadius:F3} {bsDesc} result={result} cn=({CollisionInfo.CollisionNormal.X:F2},{CollisionInfo.CollisionNormal.Y:F2},{CollisionInfo.CollisionNormal.Z:F2}) sn=({CollisionInfo.SlidingNormal.X:F2},{CollisionInfo.SlidingNormal.Y:F2},{CollisionInfo.SlidingNormal.Z:F2}) negHit={sp.NegPolyHit} negN=({sp.NegCollisionNormal.X:F2},{sp.NegCollisionNormal.Y:F2},{sp.NegCollisionNormal.Z:F2}) {polyDesc}"));
} }
if (PhysicsDiagnostics.ProbeStepWalkEnabled if (PhysicsDiagnostics.ProbeStepWalkEnabled
@ -3134,6 +3134,22 @@ public sealed class Transition
sp.StepDown = false; sp.StepDown = false;
// TEMP diagnostic (cellar-lip wedge, 2026-06-04): why does the lip-riser
// step-up flip ~50/50? Log the step-down DECISION inputs — the
// TransitionalInsert(5) result, contact-plane validity + Z-normal, the
// walkable threshold, and WalkInterp. On the FAILING half exactly one of
// these explains the rejection. Gated on ACDREAM_PROBE_INDOOR_BSP. STRIP
// once the wedge fix lands.
if (PhysicsDiagnostics.ProbeIndoorBspEnabled)
{
var cpn = CollisionInfo.ContactPlane.Normal;
bool accept = transitState == TransitionState.OK
&& CollisionInfo.ContactPlaneValid
&& cpn.Z >= walkableZ;
Console.WriteLine(System.FormattableString.Invariant(
$"[stepdown-decide] cell=0x{sp.CheckCellId:X8} insert={transitState} cpValid={CollisionInfo.ContactPlaneValid} cpNz={cpn.Z:F3} walkableZ={walkableZ:F3} walkInterp={sp.WalkInterp:F3} accept={accept} pos=({sp.CheckPos.X:F3},{sp.CheckPos.Y:F3},{sp.CheckPos.Z:F3})"));
}
// Accept step-down if: // Accept step-down if:
// 1. Collision detection returned OK // 1. Collision detection returned OK
// 2. A valid contact plane was found // 2. A valid contact plane was found

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,583 @@
{
"CellId": 2847146356,
"WorldTransform": {
"M11": -1,
"M12": 8.74228E-08,
"M13": 0,
"M14": 0,
"M21": -8.74228E-08,
"M22": -1,
"M23": 0,
"M24": 0,
"M31": 0,
"M32": 0,
"M33": 1,
"M34": 0,
"M41": 161.929,
"M42": 7.50315,
"M43": 94,
"M44": 1
},
"InverseWorldTransform": {
"M11": -1,
"M12": -8.74228E-08,
"M13": 0,
"M14": -0,
"M21": 8.74228E-08,
"M22": -1,
"M23": 0,
"M24": 0,
"M31": 0,
"M32": 0,
"M33": 1,
"M34": -0,
"M41": 161.929,
"M42": 7.5031643,
"M43": -94,
"M44": 1
},
"ResolvedPolygons": [
{
"Id": 0,
"NumPoints": 4,
"SidesType": 0,
"Plane": {
"Normal": {
"X": 0,
"Y": 0,
"Z": 1
},
"D": 3.999
},
"Vertices": [
{
"X": 9,
"Y": -2.85,
"Z": -3.999
},
{
"X": 9,
"Y": 2.98,
"Z": -3.999
},
{
"X": -2.664,
"Y": 2.98,
"Z": -3.999
},
{
"X": -2.664,
"Y": -2.85,
"Z": -3.999
}
]
},
{
"Id": 1,
"NumPoints": 4,
"SidesType": 0,
"Plane": {
"Normal": {
"X": -1,
"Y": 0,
"Z": 0
},
"D": 9
},
"Vertices": [
{
"X": 9,
"Y": -2.85,
"Z": -0.364
},
{
"X": 9,
"Y": 2.98,
"Z": -0.364
},
{
"X": 9,
"Y": 2.98,
"Z": -3.999
},
{
"X": 9,
"Y": -2.85,
"Z": -3.999
}
]
},
{
"Id": 2,
"NumPoints": 4,
"SidesType": 0,
"Plane": {
"Normal": {
"X": 0,
"Y": 0,
"Z": -1
},
"D": -0.364
},
"Vertices": [
{
"X": 9,
"Y": 2.98,
"Z": -0.364
},
{
"X": 9,
"Y": 1.15,
"Z": -0.364
},
{
"X": 7,
"Y": 1.15,
"Z": -0.364
},
{
"X": -2.664,
"Y": 2.98,
"Z": -0.364
}
]
},
{
"Id": 3,
"NumPoints": 4,
"SidesType": 0,
"Plane": {
"Normal": {
"X": 0,
"Y": -1,
"Z": 0
},
"D": 2.98
},
"Vertices": [
{
"X": 9,
"Y": 2.98,
"Z": -3.999
},
{
"X": 9,
"Y": 2.98,
"Z": -0.364
},
{
"X": -2.664,
"Y": 2.98,
"Z": -0.364
},
{
"X": -2.664,
"Y": 2.98,
"Z": -3.999
}
]
},
{
"Id": 4,
"NumPoints": 4,
"SidesType": 0,
"Plane": {
"Normal": {
"X": 0,
"Y": 0,
"Z": -1
},
"D": -0.364
},
"Vertices": [
{
"X": 7,
"Y": 1.15,
"Z": -0.364
},
{
"X": 7,
"Y": -2.85,
"Z": -0.364
},
{
"X": -2.664,
"Y": -2.85,
"Z": -0.364
},
{
"X": -2.664,
"Y": 2.98,
"Z": -0.364
}
]
},
{
"Id": 5,
"NumPoints": 4,
"SidesType": 0,
"Plane": {
"Normal": {
"X": 0,
"Y": 1,
"Z": 0
},
"D": 2.85
},
"Vertices": [
{
"X": -2.664,
"Y": -2.85,
"Z": -0.364
},
{
"X": 9,
"Y": -2.85,
"Z": -0.364
},
{
"X": 9,
"Y": -2.85,
"Z": -3.999
},
{
"X": -2.664,
"Y": -2.85,
"Z": -3.999
}
]
},
{
"Id": 6,
"NumPoints": 4,
"SidesType": 0,
"Plane": {
"Normal": {
"X": 1,
"Y": 0,
"Z": 0
},
"D": 2.664
},
"Vertices": [
{
"X": -2.664,
"Y": 2.98,
"Z": -3.999
},
{
"X": -2.664,
"Y": 2.98,
"Z": -0.364
},
{
"X": -2.664,
"Y": -2.85,
"Z": -0.364
},
{
"X": -2.664,
"Y": -2.85,
"Z": -3.999
}
]
}
],
"PortalPolygons": [
{
"Id": 0,
"NumPoints": 4,
"SidesType": 0,
"Plane": {
"Normal": {
"X": 0,
"Y": 0,
"Z": 1
},
"D": 3.999
},
"Vertices": [
{
"X": 9,
"Y": -2.85,
"Z": -3.999
},
{
"X": 9,
"Y": 2.98,
"Z": -3.999
},
{
"X": -2.664,
"Y": 2.98,
"Z": -3.999
},
{
"X": -2.664,
"Y": -2.85,
"Z": -3.999
}
]
},
{
"Id": 1,
"NumPoints": 4,
"SidesType": 0,
"Plane": {
"Normal": {
"X": 0,
"Y": 1,
"Z": 0
},
"D": 2.85
},
"Vertices": [
{
"X": -2.664,
"Y": -2.85,
"Z": -0.364
},
{
"X": 9,
"Y": -2.85,
"Z": -0.364
},
{
"X": 9,
"Y": -2.85,
"Z": -3.999
},
{
"X": -2.664,
"Y": -2.85,
"Z": -3.999
}
]
},
{
"Id": 2,
"NumPoints": 4,
"SidesType": 0,
"Plane": {
"Normal": {
"X": -1,
"Y": 0,
"Z": 0
},
"D": 9
},
"Vertices": [
{
"X": 9,
"Y": -2.85,
"Z": -0.364
},
{
"X": 9,
"Y": 2.98,
"Z": -0.364
},
{
"X": 9,
"Y": 2.98,
"Z": -3.999
},
{
"X": 9,
"Y": -2.85,
"Z": -3.999
}
]
},
{
"Id": 3,
"NumPoints": 4,
"SidesType": 0,
"Plane": {
"Normal": {
"X": 0,
"Y": -1,
"Z": 0
},
"D": 2.98
},
"Vertices": [
{
"X": 9,
"Y": 2.98,
"Z": -3.999
},
{
"X": 9,
"Y": 2.98,
"Z": -0.364
},
{
"X": -2.664,
"Y": 2.98,
"Z": -0.364
},
{
"X": -2.664,
"Y": 2.98,
"Z": -3.999
}
]
},
{
"Id": 4,
"NumPoints": 4,
"SidesType": 0,
"Plane": {
"Normal": {
"X": 1,
"Y": 0,
"Z": 0
},
"D": 2.664
},
"Vertices": [
{
"X": -2.664,
"Y": 2.98,
"Z": -3.999
},
{
"X": -2.664,
"Y": 2.98,
"Z": -0.364
},
{
"X": -2.664,
"Y": -2.85,
"Z": -0.364
},
{
"X": -2.664,
"Y": -2.85,
"Z": -3.999
}
]
},
{
"Id": 5,
"NumPoints": 4,
"SidesType": 0,
"Plane": {
"Normal": {
"X": 0,
"Y": 0,
"Z": -1
},
"D": -0.364
},
"Vertices": [
{
"X": 9,
"Y": 2.98,
"Z": -0.364
},
{
"X": 9,
"Y": 1.15,
"Z": -0.364
},
{
"X": 7,
"Y": 1.15,
"Z": -0.364
},
{
"X": -2.664,
"Y": 2.98,
"Z": -0.364
}
]
},
{
"Id": 6,
"NumPoints": 4,
"SidesType": 0,
"Plane": {
"Normal": {
"X": 0,
"Y": 0,
"Z": -1
},
"D": -0.364
},
"Vertices": [
{
"X": 7,
"Y": 1.15,
"Z": -0.364
},
{
"X": 7,
"Y": -2.85,
"Z": -0.364
},
{
"X": -2.664,
"Y": -2.85,
"Z": -0.364
},
{
"X": -2.664,
"Y": 2.98,
"Z": -0.364
}
]
},
{
"Id": 7,
"NumPoints": 4,
"SidesType": 0,
"Plane": {
"Normal": {
"X": 0,
"Y": 0,
"Z": 1
},
"D": 0.364
},
"Vertices": [
{
"X": 7,
"Y": 1.15,
"Z": -0.364
},
{
"X": 7,
"Y": -2.85,
"Z": -0.364
},
{
"X": 9,
"Y": -2.85,
"Z": -0.364
},
{
"X": 9,
"Y": 1.15,
"Z": -0.364
}
]
}
],
"Portals": [
{
"OtherCellId": 373,
"PolygonId": 7,
"Flags": 1
}
],
"VisibleCellIds": [
2847146351,
2847146352,
2847146353,
2847146354,
2847146355,
2847146357
]
}

View file

@ -0,0 +1,413 @@
{
"CellId": 2847146357,
"WorldTransform": {
"M11": -1,
"M12": 8.74228E-08,
"M13": 0,
"M14": 0,
"M21": -8.74228E-08,
"M22": -1,
"M23": 0,
"M24": 0,
"M31": 0,
"M32": 0,
"M33": 1,
"M34": 0,
"M41": 161.929,
"M42": 7.50315,
"M43": 94,
"M44": 1
},
"InverseWorldTransform": {
"M11": -1,
"M12": -8.74228E-08,
"M13": 0,
"M14": -0,
"M21": 8.74228E-08,
"M22": -1,
"M23": 0,
"M24": 0,
"M31": 0,
"M32": 0,
"M33": 1,
"M34": -0,
"M41": 161.929,
"M42": 7.5031643,
"M43": -94,
"M44": 1
},
"ResolvedPolygons": [
{
"Id": 0,
"NumPoints": 4,
"SidesType": 0,
"Plane": {
"Normal": {
"X": 0,
"Y": -1,
"Z": 0
},
"D": 1.15
},
"Vertices": [
{
"X": 9,
"Y": 1.15,
"Z": 0
},
{
"X": 7,
"Y": 1.15,
"Z": -1.19209E-08
},
{
"X": 7,
"Y": 1.15,
"Z": -0.364
},
{
"X": 9,
"Y": 1.15,
"Z": -0.364
}
]
},
{
"Id": 1,
"NumPoints": 4,
"SidesType": 0,
"Plane": {
"Normal": {
"X": 0,
"Y": 1,
"Z": 0
},
"D": 2.85
},
"Vertices": [
{
"X": 7,
"Y": -2.85,
"Z": -0.364
},
{
"X": 7,
"Y": -2.85,
"Z": -1.19209E-08
},
{
"X": 9,
"Y": -2.85,
"Z": 1.11022E-16
},
{
"X": 9,
"Y": -2.85,
"Z": -0.364
}
]
},
{
"Id": 2,
"NumPoints": 4,
"SidesType": 0,
"Plane": {
"Normal": {
"X": 1,
"Y": 0,
"Z": 0
},
"D": -7
},
"Vertices": [
{
"X": 7,
"Y": 1.15,
"Z": -1.19209E-08
},
{
"X": 7,
"Y": -2.85,
"Z": -1.19209E-08
},
{
"X": 7,
"Y": -2.85,
"Z": -0.364
},
{
"X": 7,
"Y": 1.15,
"Z": -0.364
}
]
},
{
"Id": 3,
"NumPoints": 4,
"SidesType": 0,
"Plane": {
"Normal": {
"X": -1,
"Y": 0,
"Z": 0
},
"D": 9
},
"Vertices": [
{
"X": 9,
"Y": -2.85,
"Z": 1.11022E-16
},
{
"X": 9,
"Y": 1.15,
"Z": 0
},
{
"X": 9,
"Y": 1.15,
"Z": -0.364
},
{
"X": 9,
"Y": -2.85,
"Z": -0.364
}
]
}
],
"PortalPolygons": [
{
"Id": 0,
"NumPoints": 4,
"SidesType": 0,
"Plane": {
"Normal": {
"X": 0,
"Y": -1,
"Z": 0
},
"D": 1.15
},
"Vertices": [
{
"X": 9,
"Y": 1.15,
"Z": 0
},
{
"X": 7,
"Y": 1.15,
"Z": -1.19209E-08
},
{
"X": 7,
"Y": 1.15,
"Z": -0.364
},
{
"X": 9,
"Y": 1.15,
"Z": -0.364
}
]
},
{
"Id": 1,
"NumPoints": 4,
"SidesType": 0,
"Plane": {
"Normal": {
"X": 1,
"Y": 0,
"Z": 0
},
"D": -7
},
"Vertices": [
{
"X": 7,
"Y": 1.15,
"Z": -1.19209E-08
},
{
"X": 7,
"Y": -2.85,
"Z": -1.19209E-08
},
{
"X": 7,
"Y": -2.85,
"Z": -0.364
},
{
"X": 7,
"Y": 1.15,
"Z": -0.364
}
]
},
{
"Id": 2,
"NumPoints": 4,
"SidesType": 0,
"Plane": {
"Normal": {
"X": 0,
"Y": 1,
"Z": 0
},
"D": 2.85
},
"Vertices": [
{
"X": 7,
"Y": -2.85,
"Z": -0.364
},
{
"X": 7,
"Y": -2.85,
"Z": -1.19209E-08
},
{
"X": 9,
"Y": -2.85,
"Z": 1.11022E-16
},
{
"X": 9,
"Y": -2.85,
"Z": -0.364
}
]
},
{
"Id": 3,
"NumPoints": 4,
"SidesType": 0,
"Plane": {
"Normal": {
"X": -1,
"Y": 0,
"Z": 0
},
"D": 9
},
"Vertices": [
{
"X": 9,
"Y": -2.85,
"Z": 1.11022E-16
},
{
"X": 9,
"Y": 1.15,
"Z": 0
},
{
"X": 9,
"Y": 1.15,
"Z": -0.364
},
{
"X": 9,
"Y": -2.85,
"Z": -0.364
}
]
},
{
"Id": 4,
"NumPoints": 4,
"SidesType": 0,
"Plane": {
"Normal": {
"X": 5.96045E-09,
"Y": -1.387775E-17,
"Z": -1
},
"D": -5.364405E-08
},
"Vertices": [
{
"X": 9,
"Y": -2.85,
"Z": 1.11022E-16
},
{
"X": 7,
"Y": -2.85,
"Z": -1.19209E-08
},
{
"X": 7,
"Y": 1.15,
"Z": -1.19209E-08
},
{
"X": 9,
"Y": 1.15,
"Z": 0
}
]
},
{
"Id": 5,
"NumPoints": 4,
"SidesType": 0,
"Plane": {
"Normal": {
"X": 0,
"Y": 0,
"Z": 1
},
"D": 0.364
},
"Vertices": [
{
"X": 7,
"Y": 1.15,
"Z": -0.364
},
{
"X": 7,
"Y": -2.85,
"Z": -0.364
},
{
"X": 9,
"Y": -2.85,
"Z": -0.364
},
{
"X": 9,
"Y": 1.15,
"Z": -0.364
}
]
}
],
"Portals": [
{
"OtherCellId": 369,
"PolygonId": 4,
"Flags": 3
},
{
"OtherCellId": 372,
"PolygonId": 5,
"Flags": 3
}
],
"VisibleCellIds": [
2847146351,
2847146352,
2847146353,
2847146354,
2847146355,
2847146356
]
}

View file

@ -0,0 +1,29 @@
{"tick":3135,"timestampMs":262876276,"input":{"currentPos":{"x":153.73085,"y":9.728503,"z":93.43498},"targetPos":{"x":153.74791,"y":10.200278,"z":93.43498},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.74791,"y":10.200278,"z":93.43498},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.018063338,"w":0.99983686},"velocity":{"x":0.42796403,"y":11.840406,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0},"result":{"position":{"x":153.74791,"y":9.728503,"z":93.43498},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":false,"collisionNormal":{"x":0,"y":0,"z":0}},"bodyAfter":{"position":{"x":153.74791,"y":10.200278,"z":93.43498},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.018063338,"w":0.99983686},"velocity":{"x":0.42796403,"y":11.840406,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0}}
{"tick":3143,"timestampMs":262876359,"input":{"currentPos":{"x":153.76514,"y":9.728503,"z":93.43498},"targetPos":{"x":153.78326,"y":10.229973,"z":93.43498},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.78326,"y":10.229973,"z":93.43498},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.018063338,"w":0.99983686},"velocity":{"x":0.42796403,"y":11.840406,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0},"result":{"position":{"x":153.78326,"y":9.728503,"z":93.43498},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":153.78326,"y":10.229973,"z":93.43498},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.018063338,"w":0.99983686},"velocity":{"x":0.42796403,"y":11.840406,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}}
{"tick":3163,"timestampMs":262876563,"input":{"currentPos":{"x":153.85286,"y":9.728503,"z":93.43498},"targetPos":{"x":153.8703,"y":10.211022,"z":93.43498},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.8703,"y":10.211022,"z":93.43498},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.018063338,"w":0.99983686},"velocity":{"x":0.42796403,"y":11.840406,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0},"result":{"position":{"x":153.8703,"y":9.728503,"z":93.43498},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":153.8703,"y":10.211022,"z":93.43498},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.018063338,"w":0.99983686},"velocity":{"x":0.42796403,"y":11.840406,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}}
{"tick":3186,"timestampMs":262876807,"input":{"currentPos":{"x":153.9604,"y":9.728503,"z":93.43498},"targetPos":{"x":153.97502,"y":10.133064,"z":93.43498},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.97502,"y":10.133064,"z":93.43498},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.018063338,"w":0.99983686},"velocity":{"x":0.42796403,"y":11.840406,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0},"result":{"position":{"x":153.97502,"y":9.728503,"z":93.43498},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":false,"collisionNormal":{"x":0,"y":0,"z":0}},"bodyAfter":{"position":{"x":153.97502,"y":10.133064,"z":93.43498},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.018063338,"w":0.99983686},"velocity":{"x":0.42796403,"y":11.840406,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0}}
{"tick":3210,"timestampMs":262877045,"input":{"currentPos":{"x":154.0595,"y":9.728503,"z":93.43498},"targetPos":{"x":154.07689,"y":10.209565,"z":93.43498},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":154.07689,"y":10.209565,"z":93.43498},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.018063338,"w":0.99983686},"velocity":{"x":0.42796403,"y":11.840406,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0},"result":{"position":{"x":154.07689,"y":9.728503,"z":93.43498},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":154.07689,"y":10.209565,"z":93.43498},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.018063338,"w":0.99983686},"velocity":{"x":0.42796403,"y":11.840406,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}}
{"tick":3233,"timestampMs":262877276,"input":{"currentPos":{"x":154.15952,"y":9.728503,"z":93.43498},"targetPos":{"x":154.1759,"y":10.181853,"z":93.43498},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":154.1759,"y":10.181853,"z":93.43498},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.018063338,"w":0.99983686},"velocity":{"x":0.42796403,"y":11.840406,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0},"result":{"position":{"x":154.1759,"y":9.728503,"z":93.43498},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":154.1759,"y":10.181853,"z":93.43498},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.018063338,"w":0.99983686},"velocity":{"x":0.42796403,"y":11.840406,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}}
{"tick":3351,"timestampMs":262878460,"input":{"currentPos":{"x":153.4518,"y":9.728503,"z":93.43498},"targetPos":{"x":153.33388,"y":10.169506,"z":93.43498},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.33388,"y":10.169506,"z":93.43498},"orientation":{"isIdentity":false,"x":0,"y":0,"z":0.13027212,"w":0.99147826},"velocity":{"x":-3.0606577,"y":11.445992,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"contactPlaneCellId":2847146357,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"walkableVertices":[{"x":152.929,"y":15.153151,"z":94},{"x":152.929,"y":10.353151,"z":94},{"x":154.929,"y":10.35315,"z":94}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0},"result":{"position":{"x":153.4518,"y":9.728503,"z":93.43498},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":1,"y":-8.74228E-08,"z":0}},"bodyAfter":{"position":{"x":153.33388,"y":10.169506,"z":93.43498},"orientation":{"isIdentity":false,"x":0,"y":0,"z":0.13027212,"w":0.99147826},"velocity":{"x":-3.0606577,"y":11.445992,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":1,"y":-8.74228E-08,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"contactPlaneCellId":2847146357,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"walkableVertices":[{"x":152.929,"y":15.153151,"z":94},{"x":152.929,"y":10.353151,"z":94},{"x":154.929,"y":10.35315,"z":94}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}}
{"tick":3371,"timestampMs":262878655,"input":{"currentPos":{"x":153.44606,"y":9.728503,"z":93.43498},"targetPos":{"x":153.43967,"y":10.24506,"z":93.43498},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.43967,"y":10.24506,"z":93.43498},"orientation":{"isIdentity":false,"x":0,"y":0,"z":0.006181737,"w":0.99998087},"velocity":{"x":-0.14648134,"y":11.847231,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0},"result":{"position":{"x":153.43967,"y":9.728503,"z":93.43498},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":153.43967,"y":10.24506,"z":93.43498},"orientation":{"isIdentity":false,"x":0,"y":0,"z":0.006181737,"w":0.99998087},"velocity":{"x":-0.14648134,"y":11.847231,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}}
{"tick":3402,"timestampMs":262878973,"input":{"currentPos":{"x":153.41031,"y":9.728503,"z":93.43498},"targetPos":{"x":153.40495,"y":10.161768,"z":93.43498},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.40495,"y":10.161768,"z":93.43498},"orientation":{"isIdentity":false,"x":0,"y":0,"z":0.006181737,"w":0.99998087},"velocity":{"x":-0.14648134,"y":11.847231,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":1,"y":-8.74228E-08,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"contactPlaneCellId":2847146357,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"walkableVertices":[{"x":152.929,"y":15.153151,"z":94},{"x":152.929,"y":10.353151,"z":94},{"x":154.929,"y":10.35315,"z":94}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0},"result":{"position":{"x":153.41031,"y":9.728503,"z":93.43498},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":153.40495,"y":10.161768,"z":93.43498},"orientation":{"isIdentity":false,"x":0,"y":0,"z":0.006181737,"w":0.99998087},"velocity":{"x":-0.14648134,"y":11.847231,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"contactPlaneCellId":2847146357,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"walkableVertices":[{"x":152.929,"y":15.153151,"z":94},{"x":152.929,"y":10.353151,"z":94},{"x":154.929,"y":10.35315,"z":94}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}}
{"tick":3885,"timestampMs":262883615,"input":{"currentPos":{"x":153.57297,"y":9.823084,"z":93.51064},"targetPos":{"x":153.58644,"y":10.3026905,"z":93.51064},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.58644,"y":10.3026905,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.014045194,"w":0.99990135},"velocity":{"x":0.33278593,"y":11.843463,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0},"result":{"position":{"x":153.58644,"y":9.823084,"z":93.51064},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":153.58644,"y":10.3026905,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.014045194,"w":0.99990135},"velocity":{"x":0.33278593,"y":11.843463,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}}
{"tick":3909,"timestampMs":262883872,"input":{"currentPos":{"x":153.6587,"y":9.823084,"z":93.51064},"targetPos":{"x":153.67194,"y":10.29413,"z":93.51064},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.67194,"y":10.29413,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.014045194,"w":0.99990135},"velocity":{"x":0.33278593,"y":11.843463,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0},"result":{"position":{"x":153.67194,"y":9.823084,"z":93.51064},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":false,"collisionNormal":{"x":0,"y":0,"z":0}},"bodyAfter":{"position":{"x":153.67194,"y":10.29413,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.014045194,"w":0.99990135},"velocity":{"x":0.33278593,"y":11.843463,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0}}
{"tick":3940,"timestampMs":262884181,"input":{"currentPos":{"x":153.76233,"y":9.823084,"z":93.51064},"targetPos":{"x":153.7749,"y":10.270569,"z":93.51064},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.7749,"y":10.270569,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.014045194,"w":0.99990135},"velocity":{"x":0.33278593,"y":11.843463,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0},"result":{"position":{"x":153.7749,"y":9.823084,"z":93.51064},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":153.7749,"y":10.270569,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.014045194,"w":0.99990135},"velocity":{"x":0.33278593,"y":11.843463,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}}
{"tick":3967,"timestampMs":262884453,"input":{"currentPos":{"x":153.85223,"y":9.823084,"z":93.51064},"targetPos":{"x":153.86536,"y":10.289894,"z":93.51064},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.86536,"y":10.289894,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.014045194,"w":0.99990135},"velocity":{"x":0.33278593,"y":11.843463,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0},"result":{"position":{"x":153.86536,"y":9.823084,"z":93.51064},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":153.86536,"y":10.289894,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.014045194,"w":0.99990135},"velocity":{"x":0.33278593,"y":11.843463,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}}
{"tick":4018,"timestampMs":262884952,"input":{"currentPos":{"x":153.41425,"y":9.823084,"z":93.51064},"targetPos":{"x":153.34381,"y":10.280462,"z":93.51064},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.34381,"y":10.280462,"z":93.51064},"orientation":{"isIdentity":false,"x":0,"y":0,"z":0.076320924,"w":0.9970833},"velocity":{"x":-1.8032467,"y":11.710111,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0},"result":{"position":{"x":153.41425,"y":9.823084,"z":93.51064},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":153.34381,"y":10.280462,"z":93.51064},"orientation":{"isIdentity":false,"x":0,"y":0,"z":0.076320924,"w":0.9970833},"velocity":{"x":-1.8032467,"y":11.710111,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"contactPlaneCellId":2847146357,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"walkableVertices":[{"x":152.929,"y":15.153151,"z":94},{"x":152.929,"y":10.353151,"z":94},{"x":154.929,"y":10.35315,"z":94}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}}
{"tick":4022,"timestampMs":262884991,"input":{"currentPos":{"x":153.41425,"y":9.823084,"z":93.51064},"targetPos":{"x":153.3429,"y":10.28642,"z":93.51064},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.3429,"y":10.28642,"z":93.51064},"orientation":{"isIdentity":false,"x":0,"y":0,"z":0.076320924,"w":0.9970833},"velocity":{"x":-1.8032467,"y":11.710111,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"contactPlaneCellId":2847146357,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"walkableVertices":[{"x":152.929,"y":15.153151,"z":94},{"x":152.929,"y":10.353151,"z":94},{"x":154.929,"y":10.35315,"z":94}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0},"result":{"position":{"x":153.41425,"y":9.823084,"z":93.51064},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":1,"y":-8.74228E-08,"z":0}},"bodyAfter":{"position":{"x":153.3429,"y":10.28642,"z":93.51064},"orientation":{"isIdentity":false,"x":0,"y":0,"z":0.076320924,"w":0.9970833},"velocity":{"x":-1.8032467,"y":11.710111,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":1,"y":-8.74228E-08,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"contactPlaneCellId":2847146357,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"walkableVertices":[{"x":152.929,"y":15.153151,"z":94},{"x":152.929,"y":10.353151,"z":94},{"x":154.929,"y":10.35315,"z":94}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}}
{"tick":4049,"timestampMs":262885262,"input":{"currentPos":{"x":153.49516,"y":9.823084,"z":93.51064},"targetPos":{"x":153.54453,"y":10.317957,"z":93.51064},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.54453,"y":10.317957,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.049692065,"w":0.9987646},"velocity":{"x":1.1760621,"y":11.789623,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0},"result":{"position":{"x":153.54453,"y":9.823084,"z":93.51064},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":153.54453,"y":10.317957,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.049692065,"w":0.9987646},"velocity":{"x":1.1760621,"y":11.789623,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}}
{"tick":4091,"timestampMs":262885677,"input":{"currentPos":{"x":153.9869,"y":9.823084,"z":93.51064},"targetPos":{"x":154.03308,"y":10.286115,"z":93.51064},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":154.03308,"y":10.286115,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.049692065,"w":0.9987646},"velocity":{"x":1.1760621,"y":11.789623,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0},"result":{"position":{"x":154.03308,"y":9.823084,"z":93.51064},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":false,"collisionNormal":{"x":0,"y":0,"z":0}},"bodyAfter":{"position":{"x":154.03308,"y":10.286115,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.049692065,"w":0.9987646},"velocity":{"x":1.1760621,"y":11.789623,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0}}
{"tick":4193,"timestampMs":262886713,"input":{"currentPos":{"x":154.05077,"y":9.823084,"z":93.51064},"targetPos":{"x":154.09308,"y":10.273949,"z":93.51064},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":154.09308,"y":10.273949,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.04677716,"w":0.99890536},"velocity":{"x":1.1072311,"y":11.7962885,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0},"result":{"position":{"x":154.09308,"y":9.823084,"z":93.51064},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":false,"collisionNormal":{"x":0,"y":0,"z":0}},"bodyAfter":{"position":{"x":154.09308,"y":10.273949,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.04677716,"w":0.99890536},"velocity":{"x":1.1072311,"y":11.7962885,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0}}
{"tick":4205,"timestampMs":262886828,"input":{"currentPos":{"x":154.17876,"y":9.823084,"z":93.51064},"targetPos":{"x":154.22104,"y":10.273495,"z":93.51064},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":154.22104,"y":10.273495,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.04677716,"w":0.99890536},"velocity":{"x":1.1072311,"y":11.7962885,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0},"result":{"position":{"x":154.22104,"y":9.823084,"z":93.51064},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":154.22104,"y":10.273495,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.04677716,"w":0.99890536},"velocity":{"x":1.1072311,"y":11.7962885,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}}
{"tick":4213,"timestampMs":262886906,"input":{"currentPos":{"x":154.26338,"y":9.823084,"z":93.51064},"targetPos":{"x":154.3069,"y":10.286709,"z":93.51064},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":154.3069,"y":10.286709,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.04677716,"w":0.99890536},"velocity":{"x":1.1072311,"y":11.7962885,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0},"result":{"position":{"x":154.3069,"y":9.823084,"z":93.51064},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":154.3069,"y":10.286709,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.04677716,"w":0.99890536},"velocity":{"x":1.1072311,"y":11.7962885,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}}
{"tick":4221,"timestampMs":262886985,"input":{"currentPos":{"x":154.35124,"y":9.823084,"z":93.51064},"targetPos":{"x":154.37279,"y":10.279013,"z":93.51064},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":154.37279,"y":10.279013,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.023612391,"w":0.99972117},"velocity":{"x":0.55936974,"y":11.834926,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0},"result":{"position":{"x":154.37279,"y":9.823084,"z":93.51064},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":154.37279,"y":10.279013,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.023612391,"w":0.99972117},"velocity":{"x":0.55936974,"y":11.834926,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}}
{"tick":4398,"timestampMs":262888732,"input":{"currentPos":{"x":153.56111,"y":9.389898,"z":93.16409},"targetPos":{"x":153.40527,"y":9.150686,"z":93.16409},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.40527,"y":9.150686,"z":93.16409},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.012522013,"w":0.9999216},"velocity":{"x":-3.85181,"y":-5.9124026,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0},"result":{"position":{"x":153.56111,"y":9.389898,"z":93.16409},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":1,"y":-8.74228E-08,"z":0}},"bodyAfter":{"position":{"x":153.40527,"y":9.150686,"z":93.16409},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.012522013,"w":0.9999216},"velocity":{"x":-3.85181,"y":-5.9124026,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":1,"y":-8.74228E-08,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}}
{"tick":4531,"timestampMs":262889815,"input":{"currentPos":{"x":153.50339,"y":9.73499,"z":93.44017},"targetPos":{"x":153.51482,"y":10.191414,"z":93.44017},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.51482,"y":10.191414,"z":93.44017},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.012522013,"w":0.9999216},"velocity":{"x":0.29670182,"y":11.844422,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0},"result":{"position":{"x":153.51482,"y":9.73499,"z":93.44017},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":153.51482,"y":10.191414,"z":93.44017},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.012522013,"w":0.9999216},"velocity":{"x":0.29670182,"y":11.844422,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}}
{"tick":4547,"timestampMs":262889974,"input":{"currentPos":{"x":153.55008,"y":9.73499,"z":93.44017},"targetPos":{"x":153.56207,"y":10.213897,"z":93.44017},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.56207,"y":10.213897,"z":93.44017},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.012522013,"w":0.9999216},"velocity":{"x":0.29670182,"y":11.844422,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0},"result":{"position":{"x":153.56207,"y":9.73499,"z":93.44017},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":153.56207,"y":10.213897,"z":93.44017},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.012522013,"w":0.9999216},"velocity":{"x":0.29670182,"y":11.844422,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}}
{"tick":4780,"timestampMs":262892348,"input":{"currentPos":{"x":154.2535,"y":9.73499,"z":93.44017},"targetPos":{"x":154.2664,"y":10.250063,"z":93.44017},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":154.2664,"y":10.250063,"z":93.44017},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.012522013,"w":0.9999216},"velocity":{"x":0.29670182,"y":11.844422,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0},"result":{"position":{"x":154.2664,"y":9.73499,"z":93.44017},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":154.2664,"y":10.250063,"z":93.44017},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.012522013,"w":0.9999216},"velocity":{"x":0.29670182,"y":11.844422,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}}
{"tick":4809,"timestampMs":262892702,"input":{"currentPos":{"x":154.36081,"y":9.73499,"z":93.44017},"targetPos":{"x":154.37146,"y":10.160073,"z":93.44017},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":154.37146,"y":10.160073,"z":93.44017},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.012522013,"w":0.9999216},"velocity":{"x":0.29670182,"y":11.844422,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0},"result":{"position":{"x":154.37146,"y":9.73499,"z":93.44017},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":154.37146,"y":10.160073,"z":93.44017},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.012522013,"w":0.9999216},"velocity":{"x":0.29670182,"y":11.844422,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}}
{"tick":4844,"timestampMs":262893063,"input":{"currentPos":{"x":154.44443,"y":9.73499,"z":93.44017},"targetPos":{"x":154.45627,"y":10.207521,"z":93.44017},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":154.45627,"y":10.207521,"z":93.44017},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.012522013,"w":0.9999216},"velocity":{"x":0.29670182,"y":11.844422,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-1,"y":8.74228E-08,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"contactPlaneCellId":2847146357,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"walkableVertices":[{"x":152.929,"y":15.153151,"z":94},{"x":152.929,"y":10.353151,"z":94},{"x":154.929,"y":10.35315,"z":94}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0},"result":{"position":{"x":154.44443,"y":9.73499,"z":93.44017},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":154.45627,"y":10.207521,"z":93.44017},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.012522013,"w":0.9999216},"velocity":{"x":0.29670182,"y":11.844422,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"contactPlaneCellId":2847146357,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"walkableVertices":[{"x":152.929,"y":15.153151,"z":94},{"x":152.929,"y":10.353151,"z":94},{"x":154.929,"y":10.35315,"z":94}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}}
{"tick":7519,"timestampMs":262918465,"input":{"currentPos":{"x":154.42896,"y":9.811654,"z":93.5015},"targetPos":{"x":154.4983,"y":10.303496,"z":93.5015},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":154.4983,"y":10.303496,"z":93.5015},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.0699809,"w":0.99754834},"velocity":{"x":1.654221,"y":11.732089,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-1,"y":8.74228E-08,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":0,"y":0,"z":1},"d":-94},"contactPlaneCellId":2847146357,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":0,"y":0,"z":1},"d":-94},"walkableVertices":[{"x":154.929,"y":10.35315,"z":94},{"x":154.929,"y":6.353151,"z":94},{"x":157.829,"y":6.3531504,"z":94}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0},"result":{"position":{"x":154.42896,"y":9.811654,"z":93.5015},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-1,"y":8.74228E-08,"z":0}},"bodyAfter":{"position":{"x":154.4983,"y":10.303496,"z":93.5015},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.0699809,"w":0.99754834},"velocity":{"x":1.654221,"y":11.732089,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-1,"y":8.74228E-08,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":0,"y":0,"z":1},"d":-94},"contactPlaneCellId":2847146357,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":0,"y":0,"z":1},"d":-94},"walkableVertices":[{"x":154.929,"y":10.35315,"z":94},{"x":154.929,"y":6.353151,"z":94},{"x":157.829,"y":6.3531504,"z":94}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}}
{"tick":9466,"timestampMs":262936723,"input":{"currentPos":{"x":153.4952,"y":9.751367,"z":93.45327},"targetPos":{"x":153.44092,"y":10.214444,"z":93.45327},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.44092,"y":10.214444,"z":93.45327},"orientation":{"isIdentity":false,"x":0,"y":0,"z":0.05830996,"w":0.9982985},"velocity":{"x":-1.3793778,"y":11.767569,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":1,"y":-8.74228E-08,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"contactPlaneCellId":2847146357,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"walkableVertices":[{"x":152.929,"y":15.153151,"z":94},{"x":152.929,"y":10.353151,"z":94},{"x":154.929,"y":10.35315,"z":94}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0},"result":{"position":{"x":153.4952,"y":9.751367,"z":93.45327},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":153.44092,"y":10.214444,"z":93.45327},"orientation":{"isIdentity":false,"x":0,"y":0,"z":0.05830996,"w":0.9982985},"velocity":{"x":-1.3793778,"y":11.767569,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"contactPlaneCellId":2847146357,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"walkableVertices":[{"x":152.929,"y":15.153151,"z":94},{"x":152.929,"y":10.353151,"z":94},{"x":154.929,"y":10.35315,"z":94}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}}

View file

@ -0,0 +1,446 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Numerics;
using AcDream.Core.Physics;
using DatReaderWriter.Enums;
using DatReaderWriter.Types;
using Xunit;
namespace AcDream.Core.Tests.Physics;
/// <summary>
/// P2 cellar-LIP wedge (2026-06-04) — deterministic reproduction of the
/// "blocked at the last step" wedge at the Holtburg cottage cellar lip,
/// distinct from the earlier issue-#98 cellar (cells 0xA9B4014X).
///
/// <para>
/// Built from live captures this session:
/// <list type="bullet">
/// <item><b>Retail-connector trace</b> (CEnvCell::find_collisions) proved
/// retail's connector cell <c>0xA9B40175</c> NEVER blocks (2692 OK +
/// 94 Adjusted + 0 Collided + 0 Slid over ~85K samples).</item>
/// <item><b>acdream live capture</b> at the wedge: the player (r=0.48 body
/// sphere) is mid-climb at world Z=93.936, carried in the 0.364 m-tall
/// threshold slab <c>0xA9B40175</c>. Its 0.48 sphere grazes the slab's
/// X wall (local X=9; sphere at X=8.523 reaches 9.003 — a 3 mm graze)
/// → <c>StepSphereUp</c> → <c>DoStepUp</c> fails (no CP on the flat
/// cottage floor) → <c>StepUpSlide</c> returns <c>Collided</c> → the
/// per-cell collide returns Collided → wedge.</item>
/// </list>
/// </para>
///
/// <para>
/// Fixtures are real cell dumps (<c>ACDREAM_DUMP_CELLS</c>) of the three lip
/// cells: <c>0xA9B40171</c> (cottage floor), <c>0xA9B40174</c>, <c>0xA9B40175</c>
/// (threshold connector). The <c>BSP=null</c> hydration gap is bridged with a
/// synthetic single-leaf BSP, same as <see cref="CellarUpTrajectoryReplayTests"/>.
/// </para>
///
/// <para>
/// <b>RED status:</b> the climb-advance assertion is expected to FAIL while the
/// wedge exists (the player freezes at the threshold ~Z=93.94 instead of
/// reaching the cottage floor ~Z=94.48). When the fix lands it flips to GREEN.
/// </para>
/// </summary>
public class CellarLipWedgeTests
{
private const uint CottageFloorId = 0xA9B40171u; // cottage room floor
private const uint Connector74Id = 0xA9B40174u;
private const uint ThresholdId = 0xA9B40175u; // 0.364 m threshold slab
// Player physics from PlayerMovementController.cs (human, from Setup).
private const float SphereRadius = 0.48f;
private const float SphereHeight = 1.20f;
private const float StepUpHeight = 0.40f;
private const float StepDownHeight = 0.04f;
// The live-captured wedge state. The probe's [indoor-bsp] wpos is the
// FOOT-SPHERE CENTER (153.406, 9.754, 93.936); the engine body Position is
// the foot BOTTOM = center radius = Z 93.456. Player carried in the
// 0.364 m threshold slab 0xA9B40175, climbing the cellar stairs; observed
// motion at the lip is world Y (into the cottage).
private static readonly Vector3 WedgeSphereCenter = new(153.406f, 9.754f, 93.936f);
private static readonly Vector3 WedgeBodyPos =
new(153.406f, 9.754f, 93.936f - SphereRadius); // foot bottom Z=93.456
private static readonly Vector3 PerTickOffset = new(0f, -0.10f, 0f);
private const float CottageFloorZ = 94.00f;
private const float RestOnCottageZ = CottageFloorZ + SphereRadius; // ≈94.48
/// <summary>
/// Diagnostic: drive the player off the threshold toward the cottage and
/// dump the trajectory + indoor-BSP/step probes. Always passes; the
/// captured stdout shows exactly what the engine does each tick.
/// </summary>
[Fact]
public void Diagnostic_DriveOffThreshold_DumpTrajectory()
{
PhysicsDiagnostics.ProbeResolveEnabled = true;
PhysicsDiagnostics.ProbeIndoorBspEnabled = true;
var saved = Console.Out;
var sw = new StringWriter();
Console.SetOut(sw);
try
{
var engine = BuildEngineWithLipFixtures();
var body = BuildWedgeBody();
var traj = SimulateTicks(engine, body, ThresholdId, 4);
Console.SetOut(saved);
var probeLines = sw.ToString();
File.WriteAllText(
Path.Combine(Path.GetTempPath(), "lip-wedge-diag.log"),
"TRAJECTORY:\n" + string.Join("\n", traj.Select(p =>
$"tick={p.Tick} pos=({p.Position.X:F4},{p.Position.Y:F4},{p.Position.Z:F4}) " +
$"cell=0x{p.CellId:X8} onGround={p.IsOnGround} cpValid={p.CpValid}")) +
"\n\nPROBES:\n" + probeLines);
Assert.True(true);
}
finally
{
Console.SetOut(saved);
PhysicsDiagnostics.ProbeResolveEnabled = false;
PhysicsDiagnostics.ProbeIndoorBspEnabled = false;
}
}
/// <summary>
/// DOCUMENTS-THE-BUG (passes while the wedge exists; FAILS when the fix
/// lands). Seeded at the live wedge position (foot-sphere center Z=93.936,
/// carried in the 0.364 m threshold slab 0xA9B40175) and driven forward,
/// the player FREEZES — blocked by the slab's X side wall (poly normal
/// world (1,0,0)) — instead of advancing onto the cottage floor. Retail's
/// 0175 never blocks (live CEnvCell::find_collisions trace: 0 Collided/Slid).
///
/// <para>
/// <b>Faithfulness caveat:</b> the per-tick drive direction (world Y) is an
/// approximation — the exact <c>targetPos</c> would come from an
/// <c>ACDREAM_CAPTURE_RESOLVE</c> JSONL of the live wedge. The Y drive is
/// PARALLEL to the X wall, so it reproduces the block but may not be the
/// real climb path. A candidate fix (replacing the A6.P4 neg-poly
/// "return Collided" shortcut with retail's slide_sphere) did NOT clear this:
/// the slide returns Slid with offset=0 (displacement already along the
/// crease), the loop re-checks with gDelta≈0 → SlideSphere's
/// offset.LengthSquared&lt;ε → Collided branch → revert. The real fix needs a
/// faithful repro + the slide/loop-commit investigation (see the handoff
/// doc 2026-06-04-p2-cellar-lip-flatfloor-cp-handoff.md, Correction 2).
/// </para>
///
/// When the wedge is fixed the player advances and this assertion FAILS —
/// that is the signal to flip it to assert the climb.
/// </summary>
[Fact]
public void DocumentsWedge_PlayerFrozenAtThreshold_BlockedByMinusXWall()
{
var engine = BuildEngineWithLipFixtures();
var body = BuildWedgeBody();
var traj = SimulateTicks(engine, body, ThresholdId, 30);
var final = traj[^1];
float yAdvance = WedgeBodyPos.Y - final.Position.Y; // +ve = moved into cottage
float zRise = final.Position.Z - WedgeBodyPos.Z; // +ve = climbed
Assert.True(
yAdvance < 0.1f && zRise < 0.1f,
$"DOCUMENTS-THE-BUG: expected the player to be FROZEN at the threshold " +
$"(the X-wall wedge). Instead it advanced to " +
$"({final.Position.X:F3},{final.Position.Y:F3},{final.Position.Z:F3}) " +
$"after 30 ticks (yAdvance={yAdvance:F3}, zRise={zRise:F3}). If the wedge " +
$"fix landed, FLIP this assertion to require the climb " +
$"(Z≥{CottageFloorZ - 0.05f:F2}, yAdvance>0.5).");
}
// ───────────────────────────── helpers ─────────────────────────────
private static PhysicsBody BuildWedgeBody() => new()
{
Position = WedgeBodyPos, // foot bottom Z=93.456
Orientation = Quaternion.Identity,
// Best-effort grounded seed: a flat floor at foot level so the player
// starts "on the ground" mid-climb (the exact body-before state would
// come from an ACDREAM_CAPTURE_RESOLVE JSONL; this approximation puts
// the foot-sphere center at Z=93.936 — the live wedge — so the
// geometric X-wall full-hit fires).
ContactPlaneValid = true,
ContactPlane = new System.Numerics.Plane(0f, 0f, 1f, -WedgeBodyPos.Z),
ContactPlaneCellId = ThresholdId,
WalkablePolygonValid = true,
WalkablePlane = new System.Numerics.Plane(0f, 0f, 1f, -WedgeBodyPos.Z),
WalkableVertices = new[]
{
new Vector3(WedgeBodyPos.X - 1f, WedgeBodyPos.Y - 1f, WedgeBodyPos.Z),
new Vector3(WedgeBodyPos.X - 1f, WedgeBodyPos.Y + 1f, WedgeBodyPos.Z),
new Vector3(WedgeBodyPos.X + 1f, WedgeBodyPos.Y + 1f, WedgeBodyPos.Z),
new Vector3(WedgeBodyPos.X + 1f, WedgeBodyPos.Y - 1f, WedgeBodyPos.Z),
},
WalkableUp = Vector3.UnitZ,
TransientState = TransientStateFlags.Contact | TransientStateFlags.OnWalkable,
};
private static List<TrajPoint> SimulateTicks(
PhysicsEngine engine, PhysicsBody body, uint initialCellId, int tickCount)
{
uint cellId = initialCellId;
bool isOnGround = true;
var traj = new List<TrajPoint> { new(0, body.Position, cellId, isOnGround, body.ContactPlaneValid) };
for (int tick = 1; tick <= tickCount; tick++)
{
Vector3 target = body.Position + PerTickOffset;
var result = engine.ResolveWithTransition(
currentPos: body.Position,
targetPos: target,
cellId: cellId,
sphereRadius: SphereRadius,
sphereHeight: SphereHeight,
stepUpHeight: StepUpHeight,
stepDownHeight: StepDownHeight,
isOnGround: isOnGround,
body: body,
moverFlags: ObjectInfoState.IsPlayer | ObjectInfoState.EdgeSlide,
movingEntityId: 0);
body.Position = result.Position;
cellId = result.CellId;
isOnGround = result.IsOnGround;
traj.Add(new(tick, body.Position, cellId, isOnGround, body.ContactPlaneValid));
}
return traj;
}
private sealed record TrajPoint(int Tick, Vector3 Position, uint CellId, bool IsOnGround, bool CpValid);
// ─────────────────────── faithful live-wedge replay ───────────────────────
// Replays a captured wedge ResolveWithTransition call (exact currentPos /
// targetPos / body-before from ACDREAM_CAPTURE_RESOLVE at the live cellar
// lip) through the lip-cell engine. The live climb direction is X,+Y (the
// synthetic Y guess was backwards). 29 representative wedge records are in
// Fixtures/cellar-lip/wedge-records.jsonl.
private static readonly System.Text.Json.JsonSerializerOptions WedgeJsonOptions =
new() { IncludeFields = true, PropertyNamingPolicy = System.Text.Json.JsonNamingPolicy.CamelCase };
private static List<ResolveCaptureRecord> LoadWedgeRecords()
{
var path = Path.Combine(FixtureDir, "wedge-records.jsonl");
Assert.True(File.Exists(path), $"Wedge fixture missing: {path}");
var list = new List<ResolveCaptureRecord>();
foreach (var line in File.ReadLines(path))
{
if (string.IsNullOrWhiteSpace(line)) continue;
list.Add(System.Text.Json.JsonSerializer.Deserialize<ResolveCaptureRecord>(line, WedgeJsonOptions)!);
}
return list;
}
private static PhysicsBody SeedBody(PhysicsBodySnapshot s) => new()
{
Position = s.Position,
Orientation = s.Orientation,
Velocity = s.Velocity,
Acceleration = s.Acceleration,
Omega = s.Omega,
GroundNormal = s.GroundNormal,
SlidingNormal = s.SlidingNormal,
ContactPlaneValid = s.ContactPlaneValid,
ContactPlane = s.ContactPlane,
ContactPlaneCellId = s.ContactPlaneCellId,
ContactPlaneIsWater = s.ContactPlaneIsWater,
WalkablePolygonValid = s.WalkablePolygonValid,
WalkablePlane = s.WalkablePlane,
WalkableVertices = s.WalkableVertices,
WalkableUp = s.WalkableUp,
Elasticity = s.Elasticity,
Friction = s.Friction,
State = (PhysicsStateFlags)s.State,
TransientState = (TransientStateFlags)s.TransientState,
LastUpdateTime = s.LastUpdateTime,
};
private static (Vector3 res, float requested, float advance) ReplayRecord(ResolveCaptureRecord rec)
{
var engine = BuildEngineWithLipFixtures();
var body = SeedBody(rec.BodyBefore!);
var result = engine.ResolveWithTransition(
currentPos: rec.Input.CurrentPos,
targetPos: rec.Input.TargetPos,
cellId: rec.Input.CellId,
sphereRadius: rec.Input.SphereRadius,
sphereHeight: rec.Input.SphereHeight,
stepUpHeight: rec.Input.StepUpHeight,
stepDownHeight: rec.Input.StepDownHeight,
isOnGround: rec.Input.IsOnGround,
body: body,
moverFlags: (ObjectInfoState)rec.Input.MoverFlags,
movingEntityId: rec.Input.MovingEntityId);
float requested = Vector3.Distance(rec.Input.CurrentPos, rec.Input.TargetPos);
float advance = Vector3.Distance(rec.Input.CurrentPos, result.Position);
return (result.Position, requested, advance);
}
/// <summary>
/// Diagnostic: replay every captured wedge record and report advance% — to
/// confirm the lip-cell engine reproduces the live stuck (0% advance) before
/// asserting a fix. Always passes; results in the message + %TEMP% file.
/// </summary>
[Fact]
public void Diagnostic_ReplayLiveWedgeRecords_Advance()
{
var recs = LoadWedgeRecords();
var lines = new List<string>();
foreach (var (rec, i) in recs.Select((r, i) => (r, i)))
{
if (rec.BodyBefore is null) continue;
var (res, req, adv) = ReplayRecord(rec);
var cpN = rec.BodyBefore.ContactPlane.Normal;
lines.Add($"#{i} cp=({cpN.X:F2},{cpN.Y:F2},{cpN.Z:F2}) req={req:F3} adv={adv:F3} ({(req>0?100*adv/req:0):F0}%) " +
$"cur=({rec.Input.CurrentPos.X:F2},{rec.Input.CurrentPos.Y:F2},{rec.Input.CurrentPos.Z:F2}) " +
$"tgt=({rec.Input.TargetPos.X:F2},{rec.Input.TargetPos.Y:F2},{rec.Input.TargetPos.Z:F2}) " +
$"res=({res.X:F2},{res.Y:F2},{res.Z:F2})");
}
File.WriteAllText(Path.Combine(Path.GetTempPath(), "lip-wedge-replay.log"), string.Join("\n", lines));
Assert.True(true, string.Join("\n", lines.Take(10)));
}
/// <summary>
/// Diagnostic: replay ONE floor-CP wedge record with the step-up + indoor
/// probes on, capturing why the step-up fails. Output to %TEMP%/lip-wedge-stepup.log.
/// </summary>
[Fact]
public void Diagnostic_ReplayFloorCpRecord_StepUpProbes()
{
var rec = LoadWedgeRecords().First(r => r.BodyBefore is not null
&& r.BodyBefore.ContactPlane.Normal.Z > 0.99f);
var saved = Console.Out;
var sw = new StringWriter();
PhysicsDiagnostics.ProbeIndoorBspEnabled = true;
PhysicsDiagnostics.ProbeStepWalkEnabled = true;
Environment.SetEnvironmentVariable("ACDREAM_DUMP_STEPUP", "1");
Console.SetOut(sw);
try
{
var (res, req, adv) = ReplayRecord(rec);
Console.SetOut(saved);
File.WriteAllText(Path.Combine(Path.GetTempPath(), "lip-wedge-stepup.log"),
$"record cur=({rec.Input.CurrentPos.X:F4},{rec.Input.CurrentPos.Y:F4},{rec.Input.CurrentPos.Z:F4}) " +
$"tgt=({rec.Input.TargetPos.X:F4},{rec.Input.TargetPos.Y:F4},{rec.Input.TargetPos.Z:F4}) " +
$"req={req:F3} adv={adv:F3} res=({res.X:F4},{res.Y:F4},{res.Z:F4})\n\n" + sw.ToString());
Assert.True(true);
}
finally
{
Console.SetOut(saved);
Environment.SetEnvironmentVariable("ACDREAM_DUMP_STEPUP", null);
PhysicsDiagnostics.ProbeIndoorBspEnabled = false;
PhysicsDiagnostics.ProbeStepWalkEnabled = false;
}
}
/// <summary>
/// FAITHFUL documents-the-bug (passes while the wedge exists; FAILS when the
/// fix lands → flip to assert the climb). Replays a captured FLOOR-contact-
/// plane wedge through the lip-cell engine; the player is STUCK (0% advance).
///
/// <para>
/// <b>Root cause (traced via <c>Diagnostic_ReplayFloorCpRecord_StepUpProbes</c>):</b>
/// the player is at the doorway EDGE of the cottage floor (0171, poly 0x0023,
/// Z=94). The step-up's step-down finds that floor and the 0.48 sphere
/// OVERLAPS it (0.085 m below), but acdream's walkable check REJECTS it
/// because the sphere center projects outside the floor poly's edge
/// (<c>insideEdges=False</c>, <c>gap=0.395</c>) → no contact plane → step-up
/// fails → StepUpSlide=Collided. Retail accepts the floor at its edge and
/// crosses (0175 never blocks). Fix is in the walkable-edge acceptance
/// (WalkableHitsSphere / PolygonHitsSpherePrecise / CheckWalkable edge math)
/// — compare retail CPolygon::walkable_hits_sphere + check_walkable. DOOR
/// REGRESSION RISK: walkable changes are global; visual-gate + door tests.
/// </para>
/// </summary>
[Fact]
public void DocumentsWedge_LiveFloorCp_PlayerStuckAtCottageFloorEdge()
{
var recs = LoadWedgeRecords();
var rec = recs.First(r => r.BodyBefore is not null
&& r.BodyBefore.ContactPlane.Normal.Z > 0.99f);
var (res, requested, advance) = ReplayRecord(rec);
var c = rec.Input.CurrentPos; var t = rec.Input.TargetPos;
Assert.True(advance < 0.1f * requested,
$"DOCUMENTS-THE-BUG: expected the player STUCK at the cottage-floor edge. " +
$"Instead it advanced: cur=({c.X:F3},{c.Y:F3},{c.Z:F3}) tgt=({t.X:F3},{t.Y:F3},{t.Z:F3}) " +
$"res=({res.X:F3},{res.Y:F3},{res.Z:F3}) requested={requested:F3} advance={advance:F3}. " +
$"If the walkable-edge fix landed, FLIP this to require advance>0.25·requested.");
}
private static PhysicsEngine BuildEngineWithLipFixtures()
{
var cache = new PhysicsDataCache();
var engine = new PhysicsEngine { DataCache = cache };
foreach (var cellId in new[] { CottageFloorId, Connector74Id, ThresholdId })
{
var path = Path.Combine(FixtureDir, $"0x{cellId:X8}.json");
Assert.True(File.Exists(path), $"Lip fixture missing: {path}");
var dump = CellDumpSerializer.Read(path);
var cell = CellDumpSerializer.Hydrate(dump);
cache.RegisterCellStructForTest(cellId, AttachSyntheticBsp(cell));
}
// Empty-terrain landblock so FindObjCollisions' TryGetLandblockContext
// succeeds at the lip XY (X≈153, Y≈9). Flat far-below surface; the
// indoor BSP path fires first so terrain is never consulted.
var heights = new byte[81];
var heightTable = new float[256];
for (int i = 0; i < 256; i++) heightTable[i] = -1000f;
engine.AddLandblock(
landblockId: 0xA9B40000u,
terrain: new TerrainSurface(heights, heightTable),
cells: Array.Empty<CellSurface>(),
portals: Array.Empty<PortalPlane>(),
worldOffsetX: 0f,
worldOffsetY: 0f);
return engine;
}
private static CellPhysics AttachSyntheticBsp(CellPhysics cell)
{
var leaf = new PhysicsBSPNode
{
Type = BSPNodeType.Leaf,
BoundingSphere = new Sphere { Origin = new Vector3(0f, 0f, 0f), Radius = 15f },
};
foreach (var kv in cell.Resolved)
leaf.Polygons.Add(kv.Key);
return new CellPhysics
{
BSP = new PhysicsBSPTree { Root = leaf },
PhysicsPolygons = cell.PhysicsPolygons,
Vertices = cell.Vertices,
WorldTransform = cell.WorldTransform,
InverseWorldTransform = cell.InverseWorldTransform,
Resolved = cell.Resolved,
CellBSP = cell.CellBSP,
Portals = cell.Portals,
PortalPolygons = cell.PortalPolygons,
VisibleCellIds = cell.VisibleCellIds,
};
}
private static string FixtureDir =>
Path.Combine(SolutionRoot(), "tests", "AcDream.Core.Tests", "Fixtures", "cellar-lip");
private static string SolutionRoot()
{
var dir = AppContext.BaseDirectory;
while (!string.IsNullOrEmpty(dir))
{
if (File.Exists(Path.Combine(dir, "AcDream.slnx")))
return dir;
dir = Path.GetDirectoryName(dir);
}
throw new InvalidOperationException("Could not locate solution root (AcDream.slnx).");
}
}

View file

@ -0,0 +1,34 @@
$$ Retail per-cell collide trace (2026-06-04 — the DECISIVE discriminator).
$$
$$ Question: when retail crosses the cellar lip, what does the per-cell collide
$$ CEnvCell::find_collisions RETURN for the connector cell 0xA9B40175 and the floor
$$ cell 0xA9B40171 (and 0174)? This is the thing check_other_cells calls per cell
$$ (vtable[0x88]). enum: 1=OK 2=COLLIDED 3=ADJUSTED 4=SLID.
$$
$$ - If 0175 returns mostly 1 (OK) -> acdream's connector Slid is SPURIOUS
$$ (acdream over-detects / over-steps-up 0175). Fix = stop acdream blocking 0175.
$$ - If 0175 returns 4 (SLID) too -> retail slides+continues (no revert);
$$ acdream's wedge is the substep REVERT, not the collide. Look upstream.
$$
$$ ROBUST BY CONSTRUCTION (verified offline via `cdb -z acclient.exe`):
$$ CEnvCell::find_collisions @0x52c100 has a SINGLE exit at +0x1e (0x52c11e):
$$ 0052c11e pop edi <-- esi still = this (CEnvCell*), eax = result
$$ 0052c11f pop esi
$$ 0052c120 ret 4
$$ cell id = poi(esi+0x28) (CEnvCell.m_DID). No `gu`, no `qd` in the action.
$$ Reading this+result directly at the single exit is nesting-safe.
$$
$$ STEP 0 (optional re-verify): the `uf` below re-dumps the function; confirm the
$$ single exit is still at +0x1e and esi=this there, before driving.
$$
$$ Close retail when done to detach cdb (debuggee exit detaches; no qd needed).
.logopen C:\Users\erikn\source\repos\acdream\.claude\worktrees\thirsty-goldberg-51bb9b\retail-connector-collide-trace.log
.sympath C:\Users\erikn\source\repos\acdream\refs
.symopt+ 0x40
.reload /f acclient.exe
uf acclient!CEnvCell::find_collisions
$$ Log EVERY return for the lip cluster 0xA9B4017X (0171 floor / 0174 / 0175 connector).
$$ Also log any NON-OK (ret!=1) return for ANY Holtburg cell 0xA9B4xxxx (catch blocks
$$ outside the 017X cluster). Low volume; cheap action + gc.
bp acclient!CEnvCell::find_collisions+0x1e ".if ((poi(@esi+0x28) & 0xFFFFFFF0) == 0xA9B40170) { .printf \"lip cell=0x%x ret=%d\\n\", poi(@esi+0x28), @eax } .elsif (((poi(@esi+0x28) & 0xFFFF0000) == 0xA9B40000) & (@eax != 1)) { .printf \"blk cell=0x%x ret=%d\\n\", poi(@esi+0x28), @eax }; gc"
g

View file

@ -0,0 +1,26 @@
$$ Retail flat-floor contact-plane trace (2026-06-04, v2 — CORRECTED).
$$ Decisive question: when retail lands on the FLAT cottage floor during the climb, does
$$ BSPTREE::step_sphere_down SET the contact plane (return 3) or NOT (return 1)?
$$
$$ v1 (gu-in-bp-action) FAILED: "commands skipped ... target execution inside an event
$$ handler" corrupted eax -> a perfect 1,3,1,3 alternation artifact. DO NOT use `gu` in a
$$ bp action. v2: stash the carried cell in $t3 at ENTRY (arg2 = sphere_path at [esp+4],
$$ before the prologue), then break at the TWO RETURN addresses and print SET/NO + $t3.
$$
$$ STEP 0 (do this FIRST, before driving): the +0x218 (return 3) / +0x227 (return 1) offsets
$$ below are from the decomp (step_sphere_down @0x53a210; return 3 @0x53a428; return 1 @0x53a437)
$$ and MUST be verified against the live binary. After attaching, read the log: the `u` output
$$ (below) disassembles the function — confirm which addresses load eax=3 vs eax=1 (or jmp to the
$$ shared epilogue) and FIX the two `bp ...+0xNNN` offsets if they differ, then re-attach.
$$
$$ No qd / no Stop-Process needed if the user closes retail (debuggee exit detaches cdb).
.logopen C:\Users\erikn\source\repos\acdream\.claude\worktrees\thirsty-goldberg-51bb9b\retail-flatfloor-trace.log
.sympath C:\Users\erikn\source\repos\acdream\refs
.symopt+ 0x40
.reload /f acclient.exe
u acclient!BSPTREE::step_sphere_down L90
r @$t3 = 0
bp acclient!BSPTREE::step_sphere_down "r @$t3 = @@c++(((acclient!SPHEREPATH *)poi(@esp+4))->check_pos.objcell_id); gc"
bp acclient!BSPTREE::step_sphere_down+0x218 ".printf \"SET-CP cell=0x%x\\n\", @$t3; gc"
bp acclient!BSPTREE::step_sphere_down+0x227 ".printf \"NO-CP cell=0x%x\\n\", @$t3; gc"
g

View file

@ -0,0 +1,13 @@
$$ Retail cellar-lip trace (2026-06-04). Captures, per CTransition::step_up,
$$ the CARRIED cell (sphere_path.check_pos.objcell_id) + world position
$$ (check_pos.frame.m_fOrigin). Discriminates whether retail's carried cell
$$ STAYS STABLE at the cellar lip (-> acdream's mid-step-up cell-flip is the bug)
$$ or ALTERNATES like acdream (-> the connector-cell slide is the bug).
$$ Auto-detaches (qd) after 150 step_ups so retail keeps running.
.logopen C:\Users\erikn\source\repos\acdream\.claude\worktrees\thirsty-goldberg-51bb9b\retail-lip-trace.log
.sympath C:\Users\erikn\source\repos\acdream\refs
.symopt+ 0x40
.reload /f acclient.exe
r @$t0 = 0
bp acclient!CTransition::step_up "r @$t0 = @$t0 + 1; .printf \"--- stepup #%d ---\\n\", @$t0; dt acclient!CTransition @ecx sphere_path.check_pos.objcell_id sphere_path.check_pos.frame.m_fOrigin.x sphere_path.check_pos.frame.m_fOrigin.y sphere_path.check_pos.frame.m_fOrigin.z; .if (@$t0 >= 150) { .printf \"=== DETACH after %d step_ups ===\\n\", @$t0; qd } .else { gc }"
g