60 lines
2.5 KiB
GDScript
60 lines
2.5 KiB
GDScript
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
|