class_name ResourceDefinition extends Resource @export var resource_id: StringName @export var display_name: String @export var item_id: StringName @export var extraction_action_id: StringName @export var capability_tag_ids: Array[StringName] = [] @export var presentation_cue_id: StringName @export_range(0.0, 100000.0, 0.1) var initial_amount := 10.0 @export_range(0.0, 100000.0, 0.1) var yield_per_action := 1.0 @export_range(0.0, 100000.0, 0.1) var max_amount := 10.0 @export_range(0.0, 1000.0, 0.01) var regrow_rate := 0.0 @export_range(0.0, 1.0, 0.05) var safety_risk := 0.0 @export_range(0.0, 1000.0, 0.1) var comfort_distance := 18.0 @export var discovery_priority := 0.0 @export var can_npcs_use := true @export var can_player_use := true func validate() -> Array[String]: var errors: Array[String] = [] if resource_id.is_empty(): errors.append("resource_id is empty") if display_name.is_empty(): errors.append("display_name is empty for '%s'" % resource_id) if item_id.is_empty(): errors.append("item_id is empty for '%s'" % resource_id) if extraction_action_id.is_empty(): errors.append("extraction_action_id is empty for '%s'" % resource_id) if not is_finite(initial_amount) or initial_amount <= 0.0: errors.append("initial_amount must be positive for '%s'" % resource_id) if not is_finite(yield_per_action) or yield_per_action <= 0.0: errors.append("yield_per_action must be positive for '%s'" % resource_id) if not is_finite(max_amount) or max_amount < initial_amount: errors.append("max_amount must cover initial_amount for '%s'" % resource_id) if not is_finite(regrow_rate) or regrow_rate < 0.0: errors.append("regrow_rate must be non-negative for '%s'" % resource_id) if not is_finite(safety_risk) or safety_risk < 0.0 or safety_risk > 1.0: errors.append("safety_risk must be between zero and one for '%s'" % resource_id) if not is_finite(comfort_distance) or comfort_distance < 0.0: errors.append("comfort_distance must be non-negative for '%s'" % resource_id) if not is_finite(discovery_priority): errors.append("discovery_priority must be finite for '%s'" % resource_id) _validate_unique_ids(capability_tag_ids, "capability tag", errors) return errors static func _validate_unique_ids( ids: Array[StringName], label: String, errors: Array[String] ) -> void: var seen := {} for value in ids: if value.is_empty(): errors.append("%s ID is empty" % label) elif seen.has(value): errors.append("duplicate %s '%s'" % [label, value]) else: seen[value] = true