feat: add provenance-aware npc communication
This commit is contained in:
@@ -13,7 +13,8 @@ func observe_event(event: EconomicEventRecord, npcs: Array[SimNPC]) -> Array[Kno
|
||||
var actor := _find_npc(int(event.data["actor_id"]), npcs)
|
||||
if actor == null:
|
||||
return learned
|
||||
var actor_record := _remember(actor.id, int(event.data["event_id"]))
|
||||
var event_id := int(event.data["event_id"])
|
||||
var actor_record := _remember(actor.id, event_id, SimulationIds.KNOWLEDGE_ACQUISITION_PERFORMED)
|
||||
if actor_record != null:
|
||||
learned.append(actor_record)
|
||||
var witness_radius_squared := WITNESS_RADIUS * WITNESS_RADIUS
|
||||
@@ -23,17 +24,50 @@ func observe_event(event: EconomicEventRecord, npcs: Array[SimNPC]) -> Array[Kno
|
||||
continue
|
||||
if npc.position.distance_squared_to(event_position) > witness_radius_squared:
|
||||
continue
|
||||
var witness_record := _remember(npc.id, int(event.data["event_id"]))
|
||||
var witness_record := _remember(
|
||||
npc.id, event_id, SimulationIds.KNOWLEDGE_ACQUISITION_WITNESSED
|
||||
)
|
||||
if witness_record != null:
|
||||
learned.append(witness_record)
|
||||
learned.sort_custom(_sort_records)
|
||||
return learned
|
||||
|
||||
|
||||
func communicate_event(
|
||||
event: EconomicEventRecord, speaker_id: int, listener_id: int
|
||||
) -> KnownEventStateRecord:
|
||||
if (
|
||||
event == null
|
||||
or speaker_id == listener_id
|
||||
or listener_id == int(event.data["actor_id"])
|
||||
or not _is_witnessable(event)
|
||||
):
|
||||
return null
|
||||
var event_id := int(event.data["event_id"])
|
||||
var speaker_record := get_record(speaker_id, event_id)
|
||||
if speaker_record == null:
|
||||
return null
|
||||
if (
|
||||
speaker_record.get_acquisition_method()
|
||||
not in [
|
||||
SimulationIds.KNOWLEDGE_ACQUISITION_PERFORMED,
|
||||
SimulationIds.KNOWLEDGE_ACQUISITION_WITNESSED,
|
||||
]
|
||||
):
|
||||
return null
|
||||
return _remember(
|
||||
listener_id, event_id, SimulationIds.KNOWLEDGE_ACQUISITION_COMMUNICATED, speaker_id
|
||||
)
|
||||
|
||||
|
||||
func knows_event(knower_id: int, event_id: int) -> bool:
|
||||
return known_events.has(_key(knower_id, event_id))
|
||||
|
||||
|
||||
func get_record(knower_id: int, event_id: int) -> KnownEventStateRecord:
|
||||
return known_events.get(_key(knower_id, event_id)) as KnownEventStateRecord
|
||||
|
||||
|
||||
func get_knowers(event_id: int) -> Array[int]:
|
||||
var knower_ids: Array[int] = []
|
||||
for record in known_events.values():
|
||||
@@ -71,11 +105,18 @@ func restore(records: Array[KnownEventStateRecord]) -> void:
|
||||
known_events[_key(record.get_knower_id(), record.get_event_id())] = record
|
||||
|
||||
|
||||
func _remember(knower_id: int, event_id: int) -> KnownEventStateRecord:
|
||||
func _remember(
|
||||
knower_id: int,
|
||||
event_id: int,
|
||||
acquisition_method: StringName,
|
||||
source_npc_id: int = KnownEventStateRecord.NO_SOURCE_NPC_ID
|
||||
) -> KnownEventStateRecord:
|
||||
var key := _key(knower_id, event_id)
|
||||
if known_events.has(key):
|
||||
return null
|
||||
var record := KnownEventStateRecord.create(knower_id, event_id)
|
||||
var record := KnownEventStateRecord.create(
|
||||
knower_id, event_id, acquisition_method, source_npc_id
|
||||
)
|
||||
known_events[key] = record
|
||||
return record
|
||||
|
||||
|
||||
Reference in New Issue
Block a user