fix(simulation): address PR #37 re-review — stale strings, test coverage, confrontation symmetry

Hoshe re-review (3 items):
- content_scaling.rs:185: doc "StableId 0-51" → references constant
- content_scaling.rs:256: assertion message "id<=51" → "id <= max_baseline_id"
- input.rs: teleport test now asserts WalkAwayRequest + ConfrontationDelivered
  are cleared (was only checking TalkRequest + ActiveDialogue)

Tyre re-review (2 items):
- input.rs: same teleport test coverage (overlaps Hoshe #3)
- dialogue.rs: process_confrontation_response now inserts RoutineDeviation
  with DeviationTrigger::Confrontation — symmetric with walk-away path.
  Test updated to verify deviation is recorded.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-18 18:22:32 +01:00
co-authored by Claude Opus 4.6
parent d92a2e5f50
commit 52eb8bfc81
3 changed files with 38 additions and 8 deletions
+17 -3
View File
@@ -614,9 +614,14 @@ pub fn process_confrontation_response(
let target = confrontation.target;
// Effect 1: Shift target NPC to Tier 2 animation (D-047)
commands
.entity(target)
.insert(crate::npc::AnimationTier::Tier2);
// + record routine deviation (symmetric with walk-away path)
commands.entity(target).insert((
crate::npc::AnimationTier::Tier2,
crate::npc::RoutineDeviation {
trigger: crate::npc::DeviationTrigger::Confrontation,
tick: time.tick,
},
));
// Effect 2: Decrement observer's relationship with the target (D-033 color fade)
if let Some(target_sid) = registry.to_stable(target) {
@@ -1651,6 +1656,15 @@ mod tests {
Some(&crate::npc::AnimationTier::Tier2),
"NPC should shift to Tier2 after confrontation"
);
// RoutineDeviation should be recorded (symmetric with walk-away)
let deviation = world.get::<crate::npc::RoutineDeviation>(npc);
assert!(deviation.is_some(), "NPC should get RoutineDeviation after confrontation");
assert_eq!(
deviation.unwrap().trigger,
crate::npc::DeviationTrigger::Confrontation,
"Deviation trigger should be Confrontation"
);
}
#[test]
+17 -2
View File
@@ -1860,7 +1860,8 @@ mod tests {
#[cfg(feature = "gauntlet")]
#[test]
fn teleport_to_hub_clears_dialogue_markers() {
// #491: TeleportToHub removes ActiveDialogue and TalkRequest.
// #491: TeleportToHub removes ActiveDialogue, TalkRequest,
// WalkAwayRequest, and ConfrontationDelivered.
let mut world = bevy_ecs::world::World::new();
world.insert_resource(InputQueue::default());
world.insert_resource(SimulationTime::default());
@@ -1869,7 +1870,7 @@ mod tests {
// Spawn a fake NPC target
let npc = world.spawn(TilePosition::new(10, 10, 0)).id();
// Spawn player with active dialogue state
// Spawn player with active dialogue state + mid-confrontation marker
let player = world
.spawn((
PlayerCharacter,
@@ -1880,6 +1881,8 @@ mod tests {
interaction_type: crate::knowledge::events::InteractionType::Talk,
started_tick: 0,
},
crate::simulation::dialogue::WalkAwayRequest,
crate::simulation::dialogue::ConfrontationDelivered { target: npc },
))
.id();
@@ -1904,6 +1907,18 @@ mod tests {
.is_none(),
"ActiveDialogue cleared after teleport"
);
assert!(
world
.get::<crate::simulation::dialogue::WalkAwayRequest>(player)
.is_none(),
"WalkAwayRequest cleared after teleport"
);
assert!(
world
.get::<crate::simulation::dialogue::ConfrontationDelivered>(player)
.is_none(),
"ConfrontationDelivered cleared after teleport"
);
}
#[cfg(feature = "gauntlet")]
+4 -3
View File
@@ -182,8 +182,9 @@ fn scaling_tick_timing_within_budget() {
}
/// Determinism test: baseline entities produce identical snapshots regardless
/// of extra NPCs being present. The original Gauntlet entities (StableId 0-51)
/// should have the same positions and visibility after the same number of ticks.
/// of extra NPCs being present. The original Gauntlet entities (StableId 0
/// through RESET_PLATE_STABLE_IDS.1) should have the same positions and
/// visibility after the same number of ticks.
#[test]
#[cfg(feature = "gauntlet")]
fn extra_npcs_dont_affect_baseline_behavior() {
@@ -253,6 +254,6 @@ fn extra_npcs_dont_affect_baseline_behavior() {
assert_eq!(
baseline_original_ids, scaled_original_ids,
"Original Gauntlet entities (id<=51) should be identical in both runs"
"Original Gauntlet entities (id <= max_baseline_id) should be identical in both runs"
);
}