feat: author emergent situations and dialogue
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user