feat: route resources through typed content
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
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
|
||||
Reference in New Issue
Block a user