class_name SimulationContentPack extends Resource @export var pack_id: StringName @export var display_name: String @export var required_pack_ids: Array[StringName] = [] @export var required_handler_ids: Array[StringName] = [] @export var actions: Array[ActionDefinition] = [] @export var professions: Array[ProfessionDefinition] = [] @export var capability_tags: Array[CapabilityTagDefinition] = [] @export var items: Array[ItemDefinition] = [] @export var resources: Array[ResourceDefinition] = [] @export var storages: Array[StorageDefinition] = [] @export var enemies: Array[EnemyDefinition] = [] @export var animals: Array[AnimalDefinition] = [] @export var situations: Array[SituationDefinition] = [] @export var dialogue_intents: Array[ConversationIntentDefinition] = [] @export var dialogue_template_catalogs: Array[ConversationTemplateCatalog] = [] @export var event_types: Array[EventTypeDefinition] = [] @export var social_consequences: Array[SocialConsequenceDefinition] = [] func validate() -> Array[String]: var errors: Array[String] = [] if pack_id.is_empty(): errors.append("pack_id is empty") if display_name.is_empty(): errors.append("display_name is empty for pack '%s'" % pack_id) _validate_dependency_ids(required_pack_ids, "required pack", errors) _validate_dependency_ids(required_handler_ids, "required handler", errors) if pack_id in required_pack_ids: errors.append("pack '%s' cannot require itself" % pack_id) _validate_actions(errors) _validate_professions(errors) _validate_capability_tags(errors) _validate_items(errors) _validate_resources(errors) _validate_storages(errors) _validate_enemies(errors) _validate_animals(errors) _validate_situations(errors) _validate_dialogue_intents(errors) _validate_dialogue_template_catalogs(errors) _validate_event_types(errors) _validate_social_consequences(errors) return errors func _validate_actions(errors: Array[String]) -> void: for definition in actions: if definition == null: errors.append("actions contains a null definition") continue for error in definition.validate(): errors.append("ActionDefinition: " + error) func _validate_professions(errors: Array[String]) -> void: for definition in professions: if definition == null: errors.append("professions contains a null definition") continue for error in definition.validate(): errors.append("ProfessionDefinition: " + error) func _validate_items(errors: Array[String]) -> void: for definition in items: if definition == null: errors.append("items contains a null definition") continue for error in definition.validate(): errors.append("ItemDefinition: " + error) func _validate_capability_tags(errors: Array[String]) -> void: for definition in capability_tags: if definition == null: errors.append("capability_tags contains a null definition") continue for error in definition.validate(): errors.append("CapabilityTagDefinition: " + error) func _validate_resources(errors: Array[String]) -> void: for definition in resources: if definition == null: errors.append("resources contains a null definition") continue for error in definition.validate(): errors.append("ResourceDefinition: " + error) func _validate_storages(errors: Array[String]) -> void: for definition in storages: if definition == null: errors.append("storages contains a null definition") continue for error in definition.validate(): errors.append("StorageDefinition: " + error) func _validate_enemies(errors: Array[String]) -> void: for definition in enemies: if definition == null: errors.append("enemies contains a null definition") continue for error in definition.validate(): errors.append("EnemyDefinition: " + error) func _validate_animals(errors: Array[String]) -> void: for definition in animals: if definition == null: errors.append("animals contains a null definition") continue for error in definition.validate(): errors.append("AnimalDefinition: " + error) func _validate_situations(errors: Array[String]) -> void: for definition in situations: if definition == null: errors.append("situations contains a null definition") continue for error in definition.validate(): errors.append("SituationDefinition: " + error) func _validate_dialogue_intents(errors: Array[String]) -> void: for definition in dialogue_intents: if definition == null: errors.append("dialogue_intents contains a null definition") continue for error in definition.validate(): errors.append("ConversationIntentDefinition: " + error) func _validate_dialogue_template_catalogs(errors: Array[String]) -> void: for catalog in dialogue_template_catalogs: if catalog == null: errors.append("dialogue_template_catalogs contains a null catalog") elif catalog.catalog_id.is_empty(): errors.append("ConversationTemplateCatalog: catalog_id is empty") func _validate_event_types(errors: Array[String]) -> void: for definition in event_types: if definition == null: errors.append("event_types contains a null definition") continue for error in definition.validate(): errors.append("EventTypeDefinition: " + error) func _validate_social_consequences(errors: Array[String]) -> void: for definition in social_consequences: if definition == null: errors.append("social_consequences contains a null definition") continue for error in definition.validate(): errors.append("SocialConsequenceDefinition: " + error) static func _validate_dependency_ids( ids: Array[StringName], label: String, errors: Array[String] ) -> void: var seen := {} for dependency_id in ids: if dependency_id.is_empty(): errors.append("%s ID is empty" % label) continue if seen.has(dependency_id): errors.append("duplicate %s '%s'" % [label, dependency_id]) continue seen[dependency_id] = true