53 lines
1.3 KiB
GDScript
53 lines
1.3 KiB
GDScript
class_name WorldTargetCapability
|
|
extends RefCounted
|
|
|
|
var _capability_id: StringName
|
|
var _attributes: Dictionary
|
|
|
|
|
|
func _init(capability_id: StringName = &"", attributes: Dictionary = {}) -> void:
|
|
_capability_id = capability_id
|
|
_attributes = attributes.duplicate(true)
|
|
|
|
|
|
func is_valid() -> bool:
|
|
return not _capability_id.is_empty() and not _contains_object(_attributes)
|
|
|
|
|
|
func get_capability_id() -> StringName:
|
|
return _capability_id
|
|
|
|
|
|
func get_attributes() -> Dictionary:
|
|
return _attributes.duplicate(true)
|
|
|
|
|
|
func get_attribute(attribute_id: StringName, default_value: Variant = null) -> Variant:
|
|
var value: Variant = _attributes.get(String(attribute_id), default_value)
|
|
return value.duplicate(true) if value is Array or value is Dictionary else value
|
|
|
|
|
|
func to_dictionary() -> Dictionary:
|
|
return {
|
|
"capability_id": String(_capability_id),
|
|
"attributes": _attributes.duplicate(true),
|
|
}
|
|
|
|
|
|
func copy() -> WorldTargetCapability:
|
|
return WorldTargetCapability.new(_capability_id, _attributes)
|
|
|
|
|
|
static func _contains_object(value: Variant) -> bool:
|
|
if value is Object:
|
|
return true
|
|
if value is Array:
|
|
for item in value:
|
|
if _contains_object(item):
|
|
return true
|
|
elif value is Dictionary:
|
|
for key in value:
|
|
if _contains_object(key) or _contains_object(value[key]):
|
|
return true
|
|
return false
|