acdream/tests/AcDream.Core.Tests/World
Erik e651cb6dd1 fix(#190): interior entity id counter overflowed past its 8-bit budget, aliasing into the next landblock
Found while investigating #189 (missing fountain/candle particles):
reverting the A7.L1 light-carrier hydration fix (9ebb2060) made the
Town Network fountain's water-spray particle work again, which didn't
fit the earlier dat-truth finding that the fountain's own entity was
never touched by that fix. Traced with ACDREAM_DUMP_ENTITY: the
fountain's hydrated entity.Id shifted between reverted (0x400007F8)
and fixed (0x40000815) builds — a 29-id delta matching the extra
mesh-less light carriers the A7.L1 fix now keeps alive earlier in the
same landblock's hydration pass.

Root cause: GameWindow's interior-entity id scheme
(interiorIdBase + localCounter, "0x40XXYY##") reserves only 8 bits
(256 values) for a landblock's ENTIRE interior static population — a
residual explicitly flagged in the #119 fix's own comment ("counter
overflow past 0xFF still bleeds into the lbY byte"). The Town Network
hub (205 cells, one landblock) already sat at 248 before A7.L1; the
light fix pushed it to 277, past the boundary. 0x40000815 decodes as
landblock Y=0x08 — NOT this dungeon's true Y=0x07 — the exact #119
cross-landblock aliasing bug, reincarnated by entity count instead of
a computation bug. EntityScriptActivator keys particle-script
instances by entity.Id directly (no landblock-hint disambiguation
unlike the #119 batch cache), so the aliased id silently broke the
fountain's script tracking.

Fix: AcDream.Core.World.InteriorEntityIdAllocator widens the counter
8->12 bits (256->4096) by shrinking the fixed class prefix from a
full byte (0x40) to its top nibble (0x4_) — verified safe against
every entity.Id classification check in GameWindow (none decode X/Y
back out, they only check thresholds/prefixes). Added a loud
one-time [id-overflow] log if a landblock ever exceeds the new
budget, so this class of bug can never hide silently again.

Core 2675+2skip / App 741+2skip / UI 425 / Net 385 green.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-09 12:21:57 +02:00
..
Cells test(core): UCG Stage 1 — real cottage-cell fixture grounding 2026-06-02 09:24:37 +02:00
DerethDateTimeCollection.cs test(world): serialize DerethDateTime offset tests 2026-04-28 11:58:50 +02:00
DerethDateTimeTests.cs test(world): serialize DerethDateTime offset tests 2026-04-28 11:58:50 +02:00
InteriorEntityIdAllocatorTests.cs fix(#190): interior entity id counter overflowed past its 8-bit budget, aliasing into the next landblock 2026-07-09 12:21:57 +02:00
LandblockLoaderTests.cs feat(render): Phase A8 — indoor visibility + streaming fixes batch 2026-05-29 10:14:50 +02:00
PhysicsDatBundleTests.cs feat(streaming): PhysicsDatBundle on LoadedLandblock (datLock fix scaffold) 2026-06-23 09:31:26 +02:00
SceneryGeneratorTests.cs phase(N.1): delete legacy scenery code path; WB is the only path 2026-05-08 10:37:55 +02:00
SkyDescLoaderTests.cs fix(sky): A7 — correct sun-vector magnitude (ambient + sun were ~32% too bright) 2026-06-18 15:08:52 +02:00
SkyStateTests.cs fix(sky): A7 — correct sun-vector magnitude (ambient + sun were ~32% too bright) 2026-06-18 15:08:52 +02:00
TeleportAnimSequencerTests.cs feat(core/slice-1): Begin() sets EnterTunnel pending for portal/login/death entry; all sequencer tests pass 2026-06-21 20:01:17 +02:00
WbSceneryAdapterTests.cs phase(N.1): add LandBlock → TerrainEntry[] adapter 2026-05-08 09:11:59 +02:00
WeatherSystemTests.cs weather(phase-7): gut WeatherSystem.Snapshot — passthrough keyframe fog 2026-04-24 12:55:19 +02:00
WorldEntityAabbTests.cs #119: entity bounds from dat vertex data - works for every case, not just multi-part 2026-06-11 22:39:05 +02:00
WorldTimeDebugTests.cs Merge feature/animation-system-complete — Phase L.1c animation MVP 2026-04-29 10:50:59 +02:00
WorldViewTests.cs feat(core): add WorldView with 3x3 neighbor landblock computation 2026-04-10 18:02:41 +02:00