feat: author emergent situations and dialogue

This commit is contained in:
Rijad Zuzo
2026-08-12 21:58:12 +02:00
parent 14120115d4
commit d12e9515fb
29 changed files with 856 additions and 143 deletions
+43 -1
View File
@@ -13,6 +13,7 @@ extends Resource
@export_range(0, 1000000, 1) var expiry_ticks := 0
@export_range(0, 1000000, 1) var cooldown_ticks := 0
@export var dialogue_topic_ids: Array[StringName] = []
@export var dialogue_intent_ids: Array[StringName] = []
@export var alternatives: Array[SituationAlternativeDefinition] = []
@@ -63,11 +64,24 @@ func validate(
)
_validate_unique_names(dedupe_key_fields, "dedupe key", errors)
_validate_unique_names(dialogue_topic_ids, "dialogue topic", errors)
_validate_unique_names(dialogue_intent_ids, "dialogue intent", errors)
var predicate_ids := {}
for predicate in trigger_predicates + resolution_predicates:
if predicate == null:
continue
if predicate_ids.has(predicate.predicate_id):
errors.append(
(
"'%s' has duplicate predicate '%s' across trigger/resolution predicates"
% [situation_definition_id, predicate.predicate_id]
)
)
predicate_ids[predicate.predicate_id] = true
var alternatives_by_id: Dictionary = {}
for alternative in alternatives:
if alternative == null:
errors.append("'%s' contains a null alternative" % situation_definition_id)
continue
continue
for error in alternative.validate():
errors.append("Alternative '%s': %s" % [alternative.alternative_id, error])
if alternatives_by_id.has(alternative.alternative_id):
@@ -89,6 +103,34 @@ func validate(
return errors
func duplicate_definition() -> SituationDefinition:
var copy := SituationDefinition.new()
copy.situation_definition_id = situation_definition_id
copy.display_name = display_name
copy.description = description
copy.severity = severity
copy.priority = priority
for predicate in trigger_predicates:
copy.trigger_predicates.append(
predicate.duplicate_predicate() if predicate != null else null
)
for predicate in resolution_predicates:
copy.resolution_predicates.append(
predicate.duplicate_predicate() if predicate != null else null
)
copy.expiry_predicate_ids = expiry_predicate_ids.duplicate()
copy.dedupe_key_fields = dedupe_key_fields.duplicate()
copy.expiry_ticks = expiry_ticks
copy.cooldown_ticks = cooldown_ticks
copy.dialogue_topic_ids = dialogue_topic_ids.duplicate()
copy.dialogue_intent_ids = dialogue_intent_ids.duplicate()
for alternative in alternatives:
copy.alternatives.append(
alternative.duplicate_alternative() if alternative != null else null
)
return copy
func get_predicate(predicate_id: StringName) -> SituationPredicate:
for predicate in trigger_predicates:
if predicate != null and predicate.predicate_id == predicate_id: