fix(client): address PR #65 review — POI key, ToldBy parsing, KG dirty flag

- minimap.gd: fix "poi_category" → "category" key mismatch so POI
  colors and shapes render correctly
- journal_panel.gd: parse ToldBy(N) source format, resolve entity
  names from player_knowledge; move confidence/source labels to
  UIStrings per D-042
- observer/mod.rs: add Changed<KnowledgeGraph> dirty flag to skip
  per-tick KG serialization when unchanged
- types.rs: fix stale version doc comment (13 → 14)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-25 02:41:31 +01:00
co-authored by Claude Opus 4.6
parent a52cf4f494
commit a82eb0748a
6 changed files with 486 additions and 289 deletions
+11 -3
View File
@@ -72,7 +72,7 @@ pub fn compute_observer_snapshot(
Entity,
&TilePosition,
Option<&Facing>,
&KnowledgeGraph,
Ref<KnowledgeGraph>,
&mut NearbyInteractionBuffer,
&mut MonologueBuffer,
Option<&Stance>,
@@ -120,6 +120,10 @@ pub fn compute_observer_snapshot(
return;
};
// D-041 dirty flag: only re-serialize KG dump when observer's graph changed this tick.
let kg_changed = observer_kg.is_changed();
let observer_kg: &KnowledgeGraph = &observer_kg;
let facing = facing_opt
.map(|f| f.0)
.unwrap_or(FacingDirection::default());
@@ -290,8 +294,10 @@ pub fn compute_observer_snapshot(
.collect();
// Build player knowledge dump for journal panel (#264, D-041).
// Sends full KG state — client-side filtering for display grouping.
let player_knowledge = {
// Only re-serialize when the observer's KG was mutated this tick (Changed filter).
// When unchanged, player_knowledge = None → field omitted from wire (skip_serializing_if).
// Client keeps its last value (apply_snapshot only updates when field is present).
let player_knowledge = if kg_changed {
let kg_entities: Vec<KnownEntityWire> = observer_kg
.known_entities_iter()
.map(|(sid, ek)| {
@@ -363,6 +369,8 @@ pub fn compute_observer_snapshot(
facts: kg_facts,
})
}
} else {
None
};
buffer.snapshot = Some(ObserverSnapshot {