class_name RelationshipStateRecord extends RefCounted const SCHEMA_VERSION := 1 const NO_CAUSE_EVENT := -1 const NEUTRAL_TRUST := 0.5 var data: Dictionary func _init(record_data: Dictionary = {}) -> void: data = record_data.duplicate(true) static func create( observer_id: int, subject_id: int, familiarity: float, trust: float = NEUTRAL_TRUST, last_trust_cause_event_id: int = NO_CAUSE_EVENT ) -> RelationshipStateRecord: return ( RelationshipStateRecord . new( { "schema_version": SCHEMA_VERSION, "observer_id": observer_id, "subject_id": subject_id, "familiarity": clampf(familiarity, 0.0, 1.0), "trust": clampf(trust, 0.0, 1.0), "last_trust_cause_event_id": last_trust_cause_event_id, } ) ) static func from_dictionary(record_data: Dictionary) -> RelationshipStateRecord: if int(record_data.get("schema_version", -1)) != SCHEMA_VERSION: return null if not record_data.has_all( ["observer_id", "subject_id", "familiarity", "trust", "last_trust_cause_event_id"] ): return null var observer_id := int(record_data["observer_id"]) var subject_id := int(record_data["subject_id"]) var familiarity := float(record_data["familiarity"]) var trust := float(record_data["trust"]) var cause_event_id := int(record_data["last_trust_cause_event_id"]) if observer_id < 0 or subject_id < 0 or observer_id == subject_id: return null if familiarity < 0.0 or familiarity > 1.0 or trust < 0.0 or trust > 1.0: return null if cause_event_id < NO_CAUSE_EVENT: return null return create(observer_id, subject_id, familiarity, trust, cause_event_id) func get_observer_id() -> int: return int(data["observer_id"]) func get_subject_id() -> int: return int(data["subject_id"]) func get_familiarity() -> float: return float(data["familiarity"]) func get_trust() -> float: return float(data["trust"]) func get_last_trust_cause_event_id() -> int: return int(data["last_trust_cause_event_id"]) func increase_familiarity(amount: float) -> float: var previous := get_familiarity() data["familiarity"] = clampf(previous + maxf(amount, 0.0), 0.0, 1.0) return get_familiarity() - previous func increase_trust(amount: float, cause_event_id: int) -> float: var previous := get_trust() data["trust"] = clampf(previous + maxf(amount, 0.0), 0.0, 1.0) var applied := get_trust() - previous if applied > 0.0: data["last_trust_cause_event_id"] = cause_event_id return applied func to_dictionary() -> Dictionary: return data.duplicate(true)