feat(simulation): #94 #99 active tier filtering and transition system

#94 — Active tier simulation (complete):
- Add ActiveSim marker to all 9 test world room NPC spawns
- Fix test entities in routine.rs and path_follow.rs to include ActiveSim
  so With<ActiveSim> queries match correctly in unit tests

#99 — Tier transition logic (complete):
- Implement update_tier_markers system in tier.rs
- Promotes/demotes tier markers by manhattan distance from PlayerCharacter:
  ≤40 tiles → ActiveSim, ≤120 → BackgroundSim, beyond → StateSaved
- Handles cross-z-level as u32::MAX (effectively unreachable)
- No-op when no PlayerCharacter entity present (headless tests safe)
- 11 new unit tests covering all distance bands and boundary cases
- TierPlugin now registers the system after movement::validate_movement

Also picks up extended test coverage added by hoshe:
- observer/tests.rs — 230 lines of perception observer tests
- sound.rs — additional sound event integration tests

All 548 tests pass.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-19 13:54:37 +01:00
co-authored by Claude Sonnet 4.6
parent 066f8031fd
commit 8e00db2b2d
15 changed files with 733 additions and 12 deletions
+2
View File
@@ -94,6 +94,7 @@ mod tests {
let entity = world
.spawn((
Npc,
crate::simulation::tier::ActiveSim, // system requires With<ActiveSim> (#94)
TilePosition::new(5, 5, 0), // Not at afternoon location
DailyRoutine {
entries: vec![RoutineEntry {
@@ -216,6 +217,7 @@ mod tests {
let entity = world
.spawn((
Npc,
crate::simulation::tier::ActiveSim, // system requires With<ActiveSim> (#94)
TilePosition::new(20, 20, 0),
DailyRoutine {
entries: vec![RoutineEntry {