feat(simulation): protocol v14 — POI list, examine result, player knowledge wire types
Add three new ObserverSnapshot fields for client Sprint 18 tickets: poi_list (Vec<PoiWire>) for minimap #151, examine_result (Option<ExamineResultWire>) for #174, player_knowledge (Option<PlayerKnowledgeWire>) for journal #264. POI list populated live from KG-discovered PointOfInterest components. KG dump serializes entity/fact knowledge with confidence, source, and state. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -67,6 +67,9 @@ fn snapshot_roundtrip_over_unix_socket() {
|
||||
conversation_ended: vec![],
|
||||
follow_state: None,
|
||||
rng_seed: None,
|
||||
poi_list: vec![],
|
||||
examine_result: None,
|
||||
player_knowledge: None,
|
||||
};
|
||||
|
||||
bridge
|
||||
|
||||
@@ -53,6 +53,9 @@ fn snapshot_roundtrip_over_tcp() {
|
||||
conversation_ended: vec![],
|
||||
follow_state: None,
|
||||
rng_seed: None,
|
||||
poi_list: vec![],
|
||||
examine_result: None,
|
||||
player_knowledge: None,
|
||||
};
|
||||
|
||||
bridge
|
||||
|
||||
@@ -42,6 +42,9 @@ fn fixture_snapshot(tick: u64, entities: Vec<VisibleEntity>) -> ObserverSnapshot
|
||||
conversation_ended: vec![],
|
||||
follow_state: None,
|
||||
rng_seed: None,
|
||||
poi_list: vec![],
|
||||
examine_result: None,
|
||||
player_knowledge: None,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -228,6 +231,9 @@ fn generate_msgpack_fixtures() {
|
||||
conversation_ended: vec![],
|
||||
follow_state: None,
|
||||
rng_seed: None,
|
||||
poi_list: vec![],
|
||||
examine_result: None,
|
||||
player_knowledge: None,
|
||||
};
|
||||
write_fixture(
|
||||
"snapshot_v2_full",
|
||||
|
||||
@@ -67,11 +67,12 @@
|
||||
"player_facing": "North",
|
||||
"player_inventory": [],
|
||||
"player_stance": "Sprint",
|
||||
"poi_list": [],
|
||||
"rng_seed": 42,
|
||||
"scan_events": [],
|
||||
"sound_events": [],
|
||||
"tick": 8,
|
||||
"version": 13,
|
||||
"version": 14,
|
||||
"visible_tiles": [
|
||||
{
|
||||
"tile_kind": "Wall",
|
||||
|
||||
@@ -31,6 +31,9 @@ fn test_snapshot(tick: u64, entities: Vec<VisibleEntity>) -> ObserverSnapshot {
|
||||
conversation_ended: vec![],
|
||||
follow_state: None,
|
||||
rng_seed: None,
|
||||
poi_list: vec![],
|
||||
examine_result: None,
|
||||
player_knowledge: None,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -276,6 +279,9 @@ fn snapshot_v2_fields_roundtrip() {
|
||||
conversation_ended: vec![],
|
||||
follow_state: None,
|
||||
rng_seed: None,
|
||||
poi_list: vec![],
|
||||
examine_result: None,
|
||||
player_knowledge: None,
|
||||
};
|
||||
|
||||
let bytes = rmp_serde::to_vec_named(&snapshot).expect("serialize");
|
||||
@@ -330,7 +336,7 @@ fn protocol_version_constant_matches_snapshot() {
|
||||
let snapshot = test_snapshot(0, vec![]);
|
||||
assert_eq!(snapshot.version, PROTOCOL_VERSION);
|
||||
assert_eq!(
|
||||
PROTOCOL_VERSION, 13,
|
||||
PROTOCOL_VERSION, 14,
|
||||
"bump this assertion when protocol version changes"
|
||||
);
|
||||
}
|
||||
@@ -375,6 +381,9 @@ fn all_facing_direction_variants_roundtrip() {
|
||||
conversation_ended: vec![],
|
||||
follow_state: None,
|
||||
rng_seed: None,
|
||||
poi_list: vec![],
|
||||
examine_result: None,
|
||||
player_knowledge: None,
|
||||
};
|
||||
let bytes = rmp_serde::to_vec_named(&snapshot).expect("serialize");
|
||||
let decoded: ObserverSnapshot = rmp_serde::from_slice(&bytes).expect("deserialize");
|
||||
@@ -1418,8 +1427,8 @@ fn serde_default_fields_fill_in_when_missing_from_wire() {
|
||||
let decoded: ObserverSnapshot =
|
||||
serde_json::from_value(minimal_json).expect("minimal JSON must deserialize");
|
||||
|
||||
// Version and required fields present
|
||||
assert_eq!(decoded.version, PROTOCOL_VERSION);
|
||||
// Version matches what was in the wire (13, simulating older server)
|
||||
assert_eq!(decoded.version, 13);
|
||||
assert_eq!(decoded.tick, 42);
|
||||
assert_eq!(decoded.entities.len(), 1);
|
||||
|
||||
@@ -1437,6 +1446,19 @@ fn serde_default_fields_fill_in_when_missing_from_wire() {
|
||||
decoded.follow_state.is_none(),
|
||||
"follow_state must default to None when absent from wire"
|
||||
);
|
||||
// v14 fields default correctly when absent from older wire format
|
||||
assert!(
|
||||
decoded.poi_list.is_empty(),
|
||||
"poi_list must default to empty when absent from wire"
|
||||
);
|
||||
assert!(
|
||||
decoded.examine_result.is_none(),
|
||||
"examine_result must default to None when absent from wire"
|
||||
);
|
||||
assert!(
|
||||
decoded.player_knowledge.is_none(),
|
||||
"player_knowledge must default to None when absent from wire"
|
||||
);
|
||||
}
|
||||
|
||||
/// A snapshot with version != PROTOCOL_VERSION can be detected by checking
|
||||
|
||||
Reference in New Issue
Block a user