feat: define regional world state

This commit is contained in:
Rijad Zuzo
2026-08-12 21:22:04 +02:00
parent 8707942c75
commit c5978a9807
22 changed files with 2703 additions and 0 deletions
@@ -0,0 +1,129 @@
class_name DiplomaticRelationRecord
extends RefCounted
const SCHEMA_VERSION := 1
var data: Dictionary
func _init(record_data: Dictionary = {}) -> void:
data = record_data.duplicate(true)
static func create(
relation_id: StringName,
first_polity_id: StringName,
second_polity_id: StringName,
stance_id: StringName,
trust: float,
started_tick: int,
history_event_ids: Array = []
) -> DiplomaticRelationRecord:
var first := String(first_polity_id)
var second := String(second_polity_id)
if second < first:
var swapped := first
first = second
second = swapped
var normalized_history: Variant = RegionalStateSupport.normalize_history_event_ids(
history_event_ids
)
if normalized_history == null:
return null
var record := (
DiplomaticRelationRecord
. new(
{
"schema_version": SCHEMA_VERSION,
"relation_id": String(relation_id),
"first_polity_id": first,
"second_polity_id": second,
"stance_id": String(stance_id),
"trust": trust,
"started_tick": started_tick,
"history_event_ids": normalized_history,
}
)
)
return record if record.is_valid() else null
static func from_dictionary(record_data: Dictionary) -> DiplomaticRelationRecord:
if int(record_data.get("schema_version", -1)) != SCHEMA_VERSION:
return null
if not (
record_data
. has_all(
[
"relation_id",
"first_polity_id",
"second_polity_id",
"stance_id",
"trust",
"started_tick",
"history_event_ids",
]
)
):
return null
if not record_data["history_event_ids"] is Array:
return null
return create(
StringName(record_data["relation_id"]),
StringName(record_data["first_polity_id"]),
StringName(record_data["second_polity_id"]),
StringName(record_data["stance_id"]),
float(record_data["trust"]),
int(record_data["started_tick"]),
record_data["history_event_ids"]
)
func is_valid() -> bool:
return (
not get_relation_id().is_empty()
and not get_first_polity_id().is_empty()
and not get_second_polity_id().is_empty()
and String(get_first_polity_id()) < String(get_second_polity_id())
and not get_stance_id().is_empty()
and is_finite(get_trust())
and get_trust() >= -1.0
and get_trust() <= 1.0
and get_started_tick() >= 0
)
func get_relation_id() -> StringName:
return StringName(data["relation_id"])
func get_first_polity_id() -> StringName:
return StringName(data["first_polity_id"])
func get_second_polity_id() -> StringName:
return StringName(data["second_polity_id"])
func get_stance_id() -> StringName:
return StringName(data["stance_id"])
func get_trust() -> float:
return float(data["trust"])
func get_started_tick() -> int:
return int(data["started_tick"])
func get_history_event_ids() -> Array[int]:
return RegionalStateSupport.copy_int_array(data["history_event_ids"])
func get_pair_key() -> String:
return RegionalStateSupport.pair_key(get_first_polity_id(), get_second_polity_id())
func to_dictionary() -> Dictionary:
return data.duplicate(true)