feat: add bounded npc memory retention

This commit is contained in:
Rijad Zuzo
2026-07-12 01:10:10 +02:00
parent 9a479ba182
commit 99b8146f75
17 changed files with 945 additions and 126 deletions
+41 -5
View File
@@ -162,16 +162,20 @@ func test_event_communication_preserves_first_provenance_and_stops_after_one_hop
var knowledge_system := EventKnowledgeSystemScript.new()
knowledge_system.observe_event(event, villagers)
assert_null(knowledge_system.communicate_event(event, listener.id, relay_target.id))
var communicated := knowledge_system.communicate_event(event, witness.id, listener.id)
assert_null(knowledge_system.communicate_event(event, listener.id, relay_target.id, 50))
var communicated := knowledge_system.communicate_event(event, witness.id, listener.id, 50)
assert_not_null(communicated)
assert_eq(
communicated.get_acquisition_method(), SimulationIds.KNOWLEDGE_ACQUISITION_COMMUNICATED
)
assert_eq(communicated.get_source_npc_id(), witness.id)
assert_null(knowledge_system.communicate_event(event, actor.id, listener.id))
assert_eq(communicated.get_acquired_tick(), 50)
assert_eq(
communicated.get_source_acquisition_method(), SimulationIds.KNOWLEDGE_ACQUISITION_WITNESSED
)
assert_null(knowledge_system.communicate_event(event, actor.id, listener.id, 50))
assert_eq(knowledge_system.get_record(listener.id, event.data["event_id"]), communicated)
assert_null(knowledge_system.communicate_event(event, listener.id, relay_target.id))
assert_null(knowledge_system.communicate_event(event, listener.id, relay_target.id, 50))
assert_false(knowledge_system.knows_event(relay_target.id, int(event.data["event_id"])))
var actor_gap_system := EventKnowledgeSystemScript.new()
var direct_witness_records: Array[KnownEventStateRecord] = [
@@ -180,4 +184,36 @@ func test_event_communication_preserves_first_provenance_and_stops_after_one_hop
)
]
actor_gap_system.restore(direct_witness_records)
assert_null(actor_gap_system.communicate_event(event, witness.id, actor.id))
assert_null(actor_gap_system.communicate_event(event, witness.id, actor.id, 50))
func test_knowledge_retention_is_bounded_stable_and_importance_ranked() -> void:
var knowledge_system := EventKnowledgeSystemScript.new()
var records: Array[KnownEventStateRecord] = [
KnownEventStateRecord.create(0, 30, SimulationIds.KNOWLEDGE_ACQUISITION_WITNESSED, -1, 1),
KnownEventStateRecord.create(0, 20, SimulationIds.KNOWLEDGE_ACQUISITION_WITNESSED, -1, 2),
KnownEventStateRecord.create(0, 10, SimulationIds.KNOWLEDGE_ACQUISITION_WITNESSED, -1, 3),
KnownEventStateRecord.create(0, 5, SimulationIds.KNOWLEDGE_ACQUISITION_WITNESSED, -1, 4),
]
knowledge_system.restore(records)
var no_lasting: Array[KnownEventStateRecord] = []
var capacity_forgotten := knowledge_system.maintain_retention(4, 100, no_lasting, false)
assert_eq(capacity_forgotten.size(), 1)
assert_eq(capacity_forgotten[0].get_event_id(), 30)
assert_eq(knowledge_system.get_known_event_ids(0, 0), [20, 10, 5])
var lasting: Array[KnownEventStateRecord] = [knowledge_system.get_record(0, 20)]
assert_eq(knowledge_system.maintain_retention(101, 100, lasting, true).size(), 0)
assert_true(knowledge_system.knows_event(0, 20))
assert_eq(knowledge_system.maintain_retention(103, 100, lasting, true).size(), 1)
assert_false(knowledge_system.knows_event(0, 10))
assert_true(knowledge_system.knows_event(0, 20))
var ranked_system := EventKnowledgeSystemScript.new()
var ranked_records: Array[KnownEventStateRecord] = [
KnownEventStateRecord.create(1, 1, SimulationIds.KNOWLEDGE_ACQUISITION_WITNESSED, -1, 10),
KnownEventStateRecord.create(1, 2, SimulationIds.KNOWLEDGE_ACQUISITION_WITNESSED, -1, 20),
]
ranked_system.restore(ranked_records)
var lasting_event_ids: Array[int] = [1]
assert_eq(ranked_system.get_communicable_event_ids(1, lasting_event_ids), [1, 2])