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

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

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 ## #104 — Scene VFX particles not clipped to the PView visible cell set
**Status:** OPEN **Status:** OPEN

View file

@ -2,7 +2,9 @@
**Status:** Living document. Created 2026-05-12. **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). **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 **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 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 **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 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 play. Drudge dies, drops loot. Pick up the loot. Open the inventory panel
and see it. 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:** **Phases to ship:**
- **F.2 (panels)** — Inventory panel reading `ItemRepository` (data already - **F.2 (panels)** — Inventory panel reading `ItemRepository` (data already
shipped in F.2 base; M2 ships the visual surface). shipped in F.2 base; M2 ships the visual surface).