98 lines
2.6 KiB
GDScript
98 lines
2.6 KiB
GDScript
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"])
|
|
var is_player_subject := subject_id == SimulationIds.PLAYER_ACTOR_ID
|
|
if observer_id < 0 or observer_id == subject_id:
|
|
return null
|
|
if not is_player_subject and subject_id < 0:
|
|
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)
|