feat: add bounded npc memory retention
This commit is contained in:
@@ -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])
|
||||
|
||||
Reference in New Issue
Block a user