feat: route resources through typed content
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
class_name StorageDefinition
|
||||
extends Resource
|
||||
|
||||
@export var storage_id: StringName
|
||||
@export var display_name: String
|
||||
@export_range(0.0, 1000000.0, 0.1) var capacity := StorageStateRecord.DEFAULT_CAPACITY
|
||||
@export var accepted_item_ids: Array[StringName] = []
|
||||
@export var accepted_item_tag_ids: Array[StringName] = []
|
||||
@export var capability_tag_ids: Array[StringName] = []
|
||||
@export var routing_priority := 0
|
||||
@export var deposit_action_id: StringName
|
||||
@export var withdrawal_action_id: StringName
|
||||
@export var presentation_cue_id: StringName
|
||||
|
||||
|
||||
func validate() -> Array[String]:
|
||||
var errors: Array[String] = []
|
||||
if storage_id.is_empty():
|
||||
errors.append("storage_id is empty")
|
||||
if display_name.is_empty():
|
||||
errors.append("display_name is empty for '%s'" % storage_id)
|
||||
if not is_finite(capacity) or capacity <= 0.0:
|
||||
errors.append("capacity must be positive for '%s'" % storage_id)
|
||||
if accepted_item_ids.is_empty() and accepted_item_tag_ids.is_empty():
|
||||
errors.append("storage '%s' must accept an item or item tag" % storage_id)
|
||||
_validate_unique_ids(accepted_item_ids, "accepted item", errors)
|
||||
_validate_unique_ids(accepted_item_tag_ids, "accepted item tag", errors)
|
||||
_validate_unique_ids(capability_tag_ids, "capability tag", errors)
|
||||
return errors
|
||||
|
||||
|
||||
func accepts_item(item: ItemDefinition) -> bool:
|
||||
if item == null:
|
||||
return false
|
||||
if item.item_id in accepted_item_ids:
|
||||
return true
|
||||
for tag_id in item.capability_tag_ids:
|
||||
if tag_id in accepted_item_tag_ids:
|
||||
return true
|
||||
return false
|
||||
|
||||
|
||||
func create_state(initial_amounts: Dictionary = {}) -> StorageStateRecord:
|
||||
return StorageStateRecord.create(storage_id, initial_amounts, capacity)
|
||||
|
||||
|
||||
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