fix(teleport D): cell-march preserves seed landblock id when no resident LB (no more lbX=0 outbound)
BuildCellSetAndPickContaining discarded the bool from TryGetTerrainOrigin — when the current landblock's terrain hadn't been applied yet (priority-apply in flight after a teleport or dungeon exit), blockOrigin was silently set to (0,0,0). The AdjustToOutside/GetOutsideLcoord math treated world-frame sphere coordinates as block-local and marched the cell one landblock per tick in the direction of movement until lbX or lbY underflowed to 0x00. ACE rejected every subsequent move as a failed transition. Fix: honor the bool return. When terrain is unregistered for an OUTDOOR seed (low < 0x0100), return currentCellId verbatim — "no block-local frame → preserve". This mirrors the NO-LANDBLOCK verbatim contract in PhysicsEngine.Resolve and is correct: the cell stays last-known-correct until terrain registers. Indoor seeds are explicitly excluded (blockOrigin is never consumed by the indoor pick path; outdoorPickAllowed=false for indoor seeds). Reproduce + verify via CellMarchLandblockPreservationTests (two new FAILING-before tests: WestEdge and SouthEdge with empty cache, no anchor → lbX/lbY preserved). TeleportFarTownRunawayTests updated: no-anchor path now also preserves (pre-fix it marched south to 0x59; post-fix returns currentCell unchanged). CellTransitFindCellSetTests, Issue112MembershipTests, PhysicsEngineTests: added RegisterTerrain for the streaming-center block (in production it is always resident before outdoor resolves run; tests that used blockOrigin=(0,0,0) as an implicit fallback now register the block explicitly). All 1567 tests pass. Divergence AD-30 added to retail-divergence-register.md. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
aba882cec6
commit
02f4be72c0
7 changed files with 144 additions and 15 deletions
|
|
@ -110,6 +110,9 @@ public class CellTransitFindCellSetTests
|
|||
public void FindCellSet_OutdoorSeed_IncludesNeighbourLandcells()
|
||||
{
|
||||
var cache = new PhysicsDataCache();
|
||||
// #145 D: register A9B4 at origin (0,0) — in production the streaming-center
|
||||
// landblock is always registered before any outdoor physics resolve runs.
|
||||
cache.CellGraph.RegisterTerrain(0xA9B40000u, new TerrainSurface(new byte[81], new float[256]), Vector3.Zero);
|
||||
// A6.P4 (2026-05-24): sphere coords are LANDBLOCK-LOCAL (X/Y in
|
||||
// [0, 192]). Place the sphere center near the east boundary of
|
||||
// landcell grid(0,0) (i.e., near local X=24) so AddAllOutsideCells
|
||||
|
|
@ -172,10 +175,13 @@ public class CellTransitFindCellSetTests
|
|||
public void OutdoorSeed_CrossesLandblockBoundary_South()
|
||||
{
|
||||
// The #106 acceptance golden: walking south out of A9B4, the outdoor
|
||||
// cell must advance to the southern neighbour block's cell. Anchor
|
||||
// frame (no registered terrain → origin Zero): world y = -0.2 is
|
||||
// 0.2 m into A9B3's row 7 under x=150 → cell 0xA9B30038.
|
||||
// cell must advance to the southern neighbour block's cell. Origin of
|
||||
// A9B4 is Zero (streaming center). #145 D: register A9B4 at (0,0) so
|
||||
// TryGetTerrainOrigin succeeds (in production the streaming-center
|
||||
// landblock is always resident before any outdoor physics resolve).
|
||||
// world y = -0.2 is 0.2 m into A9B3's row 7 under x=150 → cell 0xA9B30038.
|
||||
var cache = new PhysicsDataCache();
|
||||
cache.CellGraph.RegisterTerrain(0xA9B40000u, new TerrainSurface(new byte[81], new float[256]), Vector3.Zero);
|
||||
|
||||
uint containing = CellTransit.FindCellSet(
|
||||
cache, new Vector3(150f, -0.2f, 0f), sphereRadius: 0.5f,
|
||||
|
|
@ -194,7 +200,9 @@ public class CellTransitFindCellSetTests
|
|||
// neighbour (sphere overlaps it) but the centre column is still the
|
||||
// current cell — membership must NOT flip early (single clean flip
|
||||
// at the line, matching the capture's 96/96 within-block behaviour).
|
||||
// #145 D: register A9B4 at (0,0) — streaming-center block is always resident.
|
||||
var cache = new PhysicsDataCache();
|
||||
cache.CellGraph.RegisterTerrain(0xA9B40000u, new TerrainSurface(new byte[81], new float[256]), Vector3.Zero);
|
||||
|
||||
uint containing = CellTransit.FindCellSet(
|
||||
cache, new Vector3(150f, 0.2f, 0f), sphereRadius: 0.5f,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue