docs(#182): crowd-collision investigation outcome + velocity-model rebuild design

The #182 CSphere port (96ae2740) failed its visual gate and introduced an
airborne "stuck in the falling animation" regression. A player-attributed retail
cdb trace (tools/cdb/retail-crowd-jump3.cdb) proved retail's LOCAL client fully
runs player-vs-creature collision (76 land_on_sphere, 188 COLLIDED, 130 SLID,
~78% OK, glides across) -- NOT server-authoritative (an earlier unfiltered
land_on_sphere=0 read was a false lead the attributed trace refuted).

acdream's same-repro capture: 50.9% OK, 22.4% stuck, 115 airborne-stuck. Root
divergence: retail CPhysicsObj::UpdateObjectInternal (0x005156b0, pc:283688) sets
cached_velocity = (resolved - old)/dt -- velocity from ACTUAL movement, so a
blocked jump collapses to ~0 -> gravity -> the player falls/glides. acdream
integrates velocity + reflects on collision (PlayerMovementController ~:1008-1069),
so the jump velocity (~18) persists against the creature -> hang.

Fix = verbatim rebuild of the per-frame player-physics loop (UpdateObjectInternal
chain), velocity model first, transition internals kept. Full design +
retail function inventory + the capture apparatus + retail target numbers:
docs/superpowers/specs/2026-07-07-player-physics-update-verbatim-rebuild-design.md.
Implementation deferred to a fresh session (user decision). Also files #183
(floating distant scenery, observed during testing). #182 stays as the base.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-07-07 13:07:56 +02:00
parent 96ae274081
commit 80881ed6f1
5 changed files with 305 additions and 1 deletions

View file

@ -46,13 +46,50 @@ Copy this block when adding a new issue:
---
## #183 — Floating distant scenery: trees from another biome hover in the distance
**Status:** OPEN
**Severity:** LOW
**Filed:** 2026-07-07
**Component:** rendering / scenery / streaming
**Description:** Observed during #182 crowd testing (Holtburg area, `+Acdream`): trees
that appear to belong to a different biome render **floating** in the distance —
detached from the ground, at the wrong Z and/or wrong placement. Distant/far-radius
scenery only; unrelated to the collision work.
**Root cause / status:** Unknown. Candidates: far-tier streaming placing scenery
before its terrain Z is resolved (procedural scenery Z uses the terrain height at the
cell — a stale/zero height would float it), a biome/terrain-type mismatch selecting
the wrong scene set, or a far-LOD placement offset. Not yet investigated.
**Files:** likely `src/AcDream.App/Rendering/Wb/` scenery pipeline
(SceneryRenderManager / SceneryHelpers) + the two-tier streamer's far tier.
**Acceptance:** distant scenery sits on the ground with correct biome/placement.
---
## #182 — Player wedges in a packed monster crowd, can't wiggle free (hand-rolled SphereCollision)
**Status:** DONE (fix landed; pending user visual gate)
**Status:** IN-PROGRESS — CSphere port shipped (`96ae2740`) but **visual-gate FAILED**;
the real fix is a velocity-model rebuild (see design spec), deferred to a new session.
**Severity:** MEDIUM
**Filed:** 2026-07-07
**Component:** physics / collision
**GATE OUTCOME (2026-07-07):** The CSphere-family port below was faithful but did NOT
fix the crowd feel and INTRODUCED an airborne "stuck in the falling animation"
regression. Player-attributed retail cdb trace proved retail's local client fully runs
player-vs-creature collision (~78% OK, glides) — NOT server-authoritative. Root
divergence: retail's per-frame `UpdateObjectInternal` sets velocity = ACTUAL movement/dt
(blocked → velocity collapses → gravity → glide); acdream integrates+reflects (jump
velocity persists → hang). Fix = verbatim rebuild of the per-frame player-physics loop,
velocity model first. Design:
`docs/superpowers/specs/2026-07-07-player-physics-update-verbatim-rebuild-design.md`.
#182 stays as the base (user), so the codebase carries the airborne regression until
the rebuild lands.
**Description:** In a large group of monsters packed around the player it was too
easy to get stuck — the player couldn't shuffle/slide out. Retail leaves room to
wiggle free.