feat(simulation): ban HashMap via clippy disallowed_types, fix violations (#343)

Adds server/.clippy.toml with disallowed-types for std::collections::HashMap
and std::collections::HashSet. HashMap iteration order is non-deterministic
and breaks deterministic simulation replay (D-030).

Changes:
- server/.clippy.toml: disallow HashMap and HashSet crate-wide
- simulation/movement.rs: WalkabilityMap.chunks and occupied map → BTreeMap;
  add PartialOrd+Ord to ChunkCoord, TilePosition, TilePresence
- simulation/monologue.rs: MonologueState.shown_ids → BTreeSet (simulation state)
- perception/shadowcast.rs: #![allow] — per-frame FOV scratch, iteration irrelevant
- perception/interpretation.rs: #![allow] — per-frame lookup table, key-only access
- perception/query.rs: #![allow] — sector_lookup is a per-frame read-only cache

Also applies cargo fmt to pre-existing format drift in contraband.rs,
dialogue.rs, test_world/mod.rs, and several integration tests.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-19 14:14:07 +01:00
co-authored by Claude Sonnet 4.6
parent 9ea9fd2a74
commit 3248603838
9 changed files with 71 additions and 30 deletions
+3 -3
View File
@@ -8,7 +8,7 @@
// When sprinting past a Contradicted entity, a delayed "double-take" monologue
// fires retroactively. Detection in observer pipeline, processing here.
use std::collections::HashSet;
use std::collections::BTreeSet;
use bevy_ecs::prelude::*;
use rand::Rng;
@@ -77,7 +77,7 @@ pub struct MonologueState {
/// Whether the enter_location monologue has fired this session.
pub entered: bool,
/// IDs of lines already shown (dedup within session).
pub shown_ids: HashSet<String>,
pub shown_ids: BTreeSet<String>,
/// Character type for pool filtering. v0.1: always "detective".
pub character: String,
}
@@ -89,7 +89,7 @@ impl Default for MonologueState {
last_position: None,
idle_ticks: 0,
entered: false,
shown_ids: HashSet::new(),
shown_ids: BTreeSet::new(),
// v0.1: default to detective; character selection sets this
character: "detective".to_string(),
}