milestone: M1.5 LANDED (building/cellar demo); dungeon demo -> #133/G.3; start M2

M1.5 "Indoor world feels right" lands on its primary building/cellar
demo, user-gated across the 2026-06 sessions: multi-floor inn navigation
without sling-out/wall-clip, cottage cellar descend+ascend without
falling through, walls block everywhere, smooth cell transitions. The
holistic Option-A render port (one DrawInside(viewer_cell), BR-2..BR-7 /
T1..T6) and the A6.P4 per-cell shadow physics shipped and were gated; the
doorway-flap family is closed (#119/#128, #112, #113, #124,
#129/#130/#131/#132, #108-residual, #127) and the #90/synthesis
workarounds removed.

The dungeon half is the one piece NOT landed: attempting the dungeon demo
(meeting-hall portal) surfaced issue #133 - teleport-into-a-dungeon snaps
the player BEFORE the dungeon landblock streams in (GameWindow.cs:4928
Resolve falls back to the resident Holtburg landblocks -> snaps to an
outdoor cell over ocean). That is Phase G.3 (dungeon streaming +
PlayerTeleport handling, M4), not a render bug (#95 died with the Option
A rewrite). Per the milestones doc's pre-flagged choice, the dungeon demo
is promoted to G.3 and M1.5 lands on the building/cellar demo (user
decision 2026-06-13).

Start M2 "Kill a drudge" - first port target CombatMath.ComputeDamage
(port-ready per the combat-math research memo; ACE oracle). Drudges spawn
outdoors for the demo, so M2 does not depend on #133/G.3.

Files: milestones doc (M1.5 -> LANDED, M2 -> ACTIVE, currently-working-
toward flipped), CLAUDE.md current-state -> M2, ISSUES.md #133 filed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-06-13 10:45:00 +02:00
parent 8682a8db70
commit 1bf037a1c9
3 changed files with 116 additions and 13 deletions

View file

@ -46,6 +46,64 @@ Copy this block when adding a new issue:
---
## #133 — Teleport into a dungeon snaps the player BEFORE the dungeon landblock streams in → lands at the old landblock's frame (ocean), not the dungeon
**Status:** OPEN — promote to **Phase G.3** (Dungeon streaming + portal
space + `PlayerTeleport` handling; M4 per the milestones doc, line 360).
This is the M1.5 dungeon-demo blocker; the demo is deferred to G.3 (user
decision 2026-06-13). Does NOT block M2 combat (drudges can spawn
outdoors).
**Severity:** HIGH (any far/dungeon teleport is unusable)
**Filed:** 2026-06-13 (M1.5 dungeon-demo gate attempt — meeting-hall portal)
**Component:** physics/streaming — teleport-arrival snap vs async landblock hydration
**Symptom (user):** used the meeting-hall portal to a dungeon; "no
dungeon, just ocean (where the dungeon is placed)." ACE spams `failed
transition for +Acdream from 0x01250126 [30 -60 6.0] to 0xA9B0000E
[-32227 -26748 5.9]` … marching south through `0xA993/0xA97F/…/0xA969`
at Z≈0.9 (underwater) — the server keeps rejecting the client's bogus
outdoor movement.
**Root cause (confirmed against code + the diagnostic log
`launch-dungeon-diag.log`):** ACE correctly placed the player in the
meeting-hall dungeon cell `0x01250126` (landblock `0x0125` = (1,37)). The
acdream teleport-arrival handler (`GameWindow.cs:4877-4960`) DOES recenter
the streaming origin to (1,37) (`_liveCenterX/Y`, :4910-4912), but then
**immediately** calls `_physicsEngine.Resolve(pos=(30,-60,6.005),
cell=0x01250126)` to snap the player (:4928-4931) — BEFORE the dungeon
landblock has streamed in. The physics engine still has only the OLD
Holtburg landblocks resident (A9B4 + neighbours), so `Resolve` can't find
the dungeon cell and falls back to an OUTDOOR scan against the resident
landblocks: local (30,60) maps into A9B3 (the loaded block south of the
A9B4 spawn) → snaps to `0xA9B3000E`, terrainZ=94, indoor=False (the
`[snap]` line). The player is now at Holtburg's south edge; streaming then
shifts the frame out from under them and they slide south into ocean
(the `[cell-transit] A9B3→A9B2→…` chain mirrors ACE's failed-transition
sequence exactly).
**Fix shape (G.3):** on a far/different-landblock teleport, recenter +
HOLD the snap until the destination dungeon landblock/cell hydrates (reuse
the #107 `IsSpawnCellReady` spawn-ready gate, applied to the teleport-
arrival path instead of only login), then place into the indoor cell via
the validated-claim path (#107/#111 `SetPositionInternal` shape). Also
audit the streaming controller actually LOADS the far dungeon landblock on
recenter (the 5×5 Chebyshev window around the new center), and that the
old landblocks unload without stranding the player mid-frame-shift.
**Files:** `GameWindow.cs:4877-4960` (teleport arrival),
`PhysicsEngine.Resolve` (the outdoor fallback), the #107 `IsSpawnCellReady`
gate, `StreamingController` recenter.
**Acceptance:** teleport into the meeting-hall dungeon → the player stands
in the dungeon cell, the dungeon renders (3-5 rooms), walls block, no
ocean / no ACE `failed transition` spam.
**Apparatus:** `ACDREAM_PROBE_CELL=1` ([cell-transit]) + `ACDREAM_PROBE_VIEWER=1`
([viewer]) + `ACDREAM_WB_DIAG=1` + the always-on `[snap]`/`live: teleport`
lines capture the whole chain (`launch-dungeon-diag.log`, this session).
---
## #104 — Scene VFX particles not clipped to the PView visible cell set
**Status:** OPEN

View file

@ -2,7 +2,9 @@
**Status:** Living document. Created 2026-05-12.
**Sits above:** [`docs/plans/2026-04-11-roadmap.md`](2026-04-11-roadmap.md) (the strategic phase index).
**Currently working toward:** **M1.5 — Indoor world feels right.**
**Currently working toward:** **M2 — Kill a drudge.** (M1.5 — Indoor world
feels right — LANDED 2026-06-13 on the building/cellar demo; the dungeon
half deferred to Phase G.3 via issue #133. See the M1.5 section.)
---
@ -185,7 +187,37 @@ close range and the player sees "You pick up the X." in chat.
---
### M1.5 — "Indoor world feels right" — 🔵 ACTIVE (resumed 2026-05-21 after Phase O ship)
### M1.5 — "Indoor world feels right" — ✅ LANDED 2026-06-13 (building/cellar demo; dungeon half → Phase G.3 / issue #133)
**M1.5 LANDED 2026-06-13.** The indoor world reads as solid. Across the
2026-06 sessions the holistic retail-faithful render port (Option A: ONE
`DrawInside(viewer_cell)`, no inside/outside branch — BR-2..BR-7 / T1..T6)
shipped and was user-gated, and the indoor physics/membership family was
brought to retail fidelity (the A6.P4 per-cell shadow architecture; the
#107/#111/#112 spawn + membership fixes; the cellar-lip wedge). End-to-end,
user-gated this milestone: walk into a building and climb a multi-floor inn
without sling-out or wall-clip; descend a cottage cellar and ascend it
without falling through (the #98 + cellar-lip + #108 grass-window closes);
walls block everywhere (indoor + stab-shell, the #99 door run-through
closed); cell transitions are smooth (the doorway "flap" family killed —
#119/#128, #112, #113, #124, #129/#130/#131/#132, #108-residual, #127 all
closed with user gates). The #90-stickiness + `TryFindIndoorWalkablePlane`
synthesis workarounds were removed by A6.P4. Remaining feel-level debt is
tracked (#116 slide-response, partial Ghidra fix shipped; A7 indoor
lighting fidelity not yet done — folded forward). **The dungeon demo is the
one piece NOT landed here:** attempting it (2026-06-13, meeting-hall portal)
surfaced issue **#133** — teleport-into-a-dungeon snaps the player before
the dungeon landblock streams in, landing them in the old (Holtburg) frame
over ocean. That is the **Phase G.3** machinery (dungeon streaming +
`PlayerTeleport` handling), an M4 concern; the dungeon demo is correctly
promoted there rather than blocking M1.5. Drudges for M2 can spawn
outdoors, so M2 is unblocked.
---
#### (historical M1.5 working notes below)
🔵 ACTIVE (resumed 2026-05-21 after Phase O ship)
**2026-05-30 — render-pipeline pivot.** The indoor *rendering* seam (seamless
in/out: the flap, missing/transparent walls, terrain bleed) will be solved by a
@ -293,13 +325,25 @@ unblocks that).
---
### M2 — "Kill a drudge" — ⏸ DEFERRED until M1.5 lands (was: NEXT)
### M2 — "Kill a drudge" — 🔵 ACTIVE (started 2026-06-13, after M1.5 landed)
**Demo scenario:** Equip a sword. Walk to a drudge. Swing. See "You hit
Drudge for 12 slashing damage (87%)" in chat. Watch the swing animation
play. Drudge dies, drops loot. Pick up the loot. Open the inventory panel
and see it.
**Dungeon note:** drudges live in dungeons in retail, but the M2 demo does
NOT require dungeon streaming (#133 / Phase G.3) — spawn a drudge outdoors
near Holtburg for the combat loop. Dungeon access lands later with G.3 (M4).
**First port target (per the M2 combat-math research memo,
`memory/research/2026-06-04-combat-math-deep-dive.md`):**
`CombatMath.ComputeDamage` — damage-calc + armor-resists are port-ready
(ACE is the high-confidence oracle; two known scaffold bugs in
`CombatModel.cs` identified). Hit-roll is well-documented client-side;
the server sigmoid/crit + weapon-timing (the x87 `GetPowerBarLevel`
artifact) come after.
**Phases to ship:**
- **F.2 (panels)** — Inventory panel reading `ItemRepository` (data already
shipped in F.2 base; M2 ships the visual surface).