feat(simulation): complete interaction and monologue pipelines (#413, #414, #415)

Three fixes to make the gameplay loop functional end-to-end:

- Add Interactable component to NPC spawn so E-prompt detection works
- Build monologue trigger system (enter_location + time_idle) with
  MonologueBuffer/MonologueState components, wire through ObserverSnapshot
  as current_monologue field, decode on client and display via HUD
- Change PlayerAction::Interact from unit to struct variant carrying
  optional target_entity_id and verb fields

Bumps protocol version from 4 to 5. Regenerates MessagePack fixtures.
All 200 tests pass (170 unit + 30 integration).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-13 19:23:47 +01:00
co-authored by Claude Opus 4.6
parent 8228ef3c1c
commit 3c106aa2d0
27 changed files with 480 additions and 30 deletions
+5 -3
View File
@@ -18,7 +18,7 @@ fn write_fixture(name: &str, bytes: &[u8]) {
/// Helper to create a minimal v2 snapshot for fixtures
fn fixture_snapshot(tick: u64, entities: Vec<VisibleEntity>) -> ObserverSnapshot {
ObserverSnapshot {
version: 4,
version: PROTOCOL_VERSION,
tick,
game_time: GameTime {
day: 0,
@@ -30,6 +30,7 @@ fn fixture_snapshot(tick: u64, entities: Vec<VisibleEntity>) -> ObserverSnapshot
entities,
visible_tiles: vec![],
nearby_interactions: vec![],
current_monologue: None,
}
}
@@ -151,7 +152,7 @@ fn generate_msgpack_fixtures() {
// v2 snapshot with visible_tiles and game_time populated
let snapshot_v2_full = ObserverSnapshot {
version: 4,
version: PROTOCOL_VERSION,
tick: 500,
game_time: GameTime {
day: 1,
@@ -194,6 +195,7 @@ fn generate_msgpack_fixtures() {
},
],
nearby_interactions: vec![],
current_monologue: None,
};
write_fixture(
"snapshot_v2_full",
@@ -208,7 +210,7 @@ fn generate_msgpack_fixtures() {
},
PlayerInput {
tick: 0,
action: PlayerAction::Interact,
action: PlayerAction::Interact { target_entity_id: None, verb: None },
},
];
write_fixture(