feat: add provenance-aware npc communication
This commit is contained in:
@@ -128,3 +128,56 @@ func test_event_knowledge_is_spatial_directed_and_idempotent() -> void:
|
||||
assert_true(knowledge_system.knows_event(nearby.id, 12))
|
||||
assert_false(knowledge_system.knows_event(distant.id, 12))
|
||||
assert_eq(knowledge_system.get_knowers(12), [actor.id, nearby.id])
|
||||
assert_eq(
|
||||
knowledge_system.get_record(actor.id, 12).get_acquisition_method(),
|
||||
SimulationIds.KNOWLEDGE_ACQUISITION_PERFORMED
|
||||
)
|
||||
assert_eq(
|
||||
knowledge_system.get_record(nearby.id, 12).get_acquisition_method(),
|
||||
SimulationIds.KNOWLEDGE_ACQUISITION_WITNESSED
|
||||
)
|
||||
|
||||
|
||||
func test_event_communication_preserves_first_provenance_and_stops_after_one_hop() -> void:
|
||||
var actor := SimNPC.new(0, "Amina", SimulationIds.PROFESSION_FARMER, 5.0, 5.0)
|
||||
var witness := SimNPC.new(1, "Tarik", SimulationIds.PROFESSION_GUARD, 5.0, 5.0)
|
||||
var listener := SimNPC.new(2, "Jasmin", SimulationIds.PROFESSION_GUARD, 5.0, 5.0)
|
||||
var relay_target := SimNPC.new(3, "Elma", SimulationIds.PROFESSION_GUARD, 5.0, 5.0)
|
||||
actor.position = Vector3.ZERO
|
||||
witness.position = Vector3(2.0, 0.0, 0.0)
|
||||
listener.position = Vector3(20.0, 0.0, 0.0)
|
||||
relay_target.position = Vector3(20.0, 0.0, 1.0)
|
||||
var villagers: Array[SimNPC] = [actor, witness, listener, relay_target]
|
||||
var event := EconomicEventRecord.create(
|
||||
21,
|
||||
SimulationIds.EVENT_STORAGE_DEPOSITED,
|
||||
40,
|
||||
actor.id,
|
||||
SimulationIds.npc_inventory_id(actor.id),
|
||||
SimulationIds.STORAGE_VILLAGE_PANTRY,
|
||||
SimulationIds.RESOURCE_FOOD,
|
||||
2.0,
|
||||
Vector3.ZERO
|
||||
)
|
||||
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_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(knowledge_system.get_record(listener.id, event.data["event_id"]), communicated)
|
||||
assert_null(knowledge_system.communicate_event(event, listener.id, relay_target.id))
|
||||
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] = [
|
||||
KnownEventStateRecord.create(
|
||||
witness.id, int(event.data["event_id"]), SimulationIds.KNOWLEDGE_ACQUISITION_WITNESSED
|
||||
)
|
||||
]
|
||||
actor_gap_system.restore(direct_witness_records)
|
||||
assert_null(actor_gap_system.communicate_event(event, witness.id, actor.id))
|
||||
|
||||
Reference in New Issue
Block a user