From 1bf037a1c93451b12f6cf231786e58625fdfddd5 Mon Sep 17 00:00:00 2001 From: Erik Date: Sat, 13 Jun 2026 10:45:00 +0200 Subject: [PATCH] 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 --- CLAUDE.md | 21 ++++++----- docs/ISSUES.md | 58 +++++++++++++++++++++++++++++ docs/plans/2026-05-12-milestones.md | 50 +++++++++++++++++++++++-- 3 files changed, 116 insertions(+), 13 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 7892d6a4..e11dbb52 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -108,16 +108,17 @@ movement queries. ## Current state -**Currently working toward: M1.5 — Indoor world feels right** -(M1 — Walkable + clickable world — landed 2026-05-16 via Phase B.6). -The holistic building-render port (Option A: ONE `DrawInside(viewer_cell)`, -no inside/outside branch; BR-2..BR-7/T1..T6) is SHIPPED and user-gated. -2026-06-12 closes: #119/#128, #112, #113, #124, #129, #130, #131, #132, -UN-2, **#108-residual** (terrain was double-sided — backface-cull port), -**#127** (distant-building flap died with the W=0 clip port). Open -render/physics ledger: #116 (slide-response, oracle-first), #125 -sticky-drop debt (leads in ISSUES.md). Keep this paragraph ≤5 lines + -pointers — detail lives in the docs below, NOT here. +**Currently working toward: M2 — Kill a drudge** (M1.5 — Indoor world +feels right — LANDED 2026-06-13 on the building/cellar demo; the holistic +Option-A render port + A6.P4 physics shipped and user-gated). **First M2 +target: `CombatMath.ComputeDamage`** (port-ready, ACE oracle; combat-math +research memo). Drudges spawn outdoors for the demo — dungeon access is +Phase G.3 (M4). **Dungeon teleport is BROKEN (#133):** teleport-into- +dungeon snaps before the dungeon streams in → lands in the old frame over +ocean; the M1.5 dungeon demo is deferred to G.3. Recent closes (2026-06-12/13): +#119/#128, #112, #113, #124, #129/#130/#131/#132, UN-2, #108-residual, +#127, #125; #116 partial (Ghidra threshold fix). Keep this paragraph ≤5 +lines + pointers — detail lives in the docs below, NOT here. For canonical state, read in this order: - [`docs/plans/2026-05-12-milestones.md`](docs/plans/2026-05-12-milestones.md) — milestone targets + freeze list per milestone diff --git a/docs/ISSUES.md b/docs/ISSUES.md index 2ae95c93..b2aaeb38 100644 --- a/docs/ISSUES.md +++ b/docs/ISSUES.md @@ -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 diff --git a/docs/plans/2026-05-12-milestones.md b/docs/plans/2026-05-12-milestones.md index 77401952..7e9f6419 100644 --- a/docs/plans/2026-05-12-milestones.md +++ b/docs/plans/2026-05-12-milestones.md @@ -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).