165 lines
5.3 KiB
GDScript
165 lines
5.3 KiB
GDScript
extends Node
|
|
|
|
#const GOLD_CURRENCY_ID: StringName = &"gold"
|
|
#const GEMS_CURRENCY_ID: StringName = &"gems"
|
|
#const LEGACY_CURRENCY_INDEX_TO_ID: Dictionary = {
|
|
#0: GOLD_CURRENCY_ID,
|
|
#1: GEMS_CURRENCY_ID,
|
|
#}
|
|
|
|
const CURRENCY_DIRECTORY_PATH: String = "res://currency"
|
|
const CURRENCY_RESOURCE_EXTENSIONS: PackedStringArray = ["tres", "res"]
|
|
|
|
var _currency_by_id: Dictionary = {}
|
|
var _catalog_initialized: bool = false
|
|
|
|
func _ready() -> void:
|
|
_initialize_currency_catalog()
|
|
|
|
func get_known_currencies() -> Array[Resource]:
|
|
_initialize_currency_catalog_if_needed()
|
|
|
|
var result: Array[Resource] = []
|
|
for raw_currency in _currency_by_id.values():
|
|
var currency: Resource = raw_currency as Resource
|
|
if currency != null:
|
|
result.append(currency)
|
|
return result
|
|
|
|
func get_known_currency_ids() -> Array[StringName]:
|
|
_initialize_currency_catalog_if_needed()
|
|
|
|
var ids: Array[StringName] = []
|
|
for raw_currency_id in _currency_by_id.keys():
|
|
var currency_id: StringName = _normalize_currency_id(StringName(String(raw_currency_id)))
|
|
if currency_id == &"":
|
|
continue
|
|
ids.append(currency_id)
|
|
return ids
|
|
|
|
func get_currency_id(currency: Resource) -> StringName:
|
|
if currency == null:
|
|
return &""
|
|
|
|
var raw_id: Variant = currency.get("id")
|
|
if raw_id is StringName:
|
|
return _normalize_currency_id(raw_id)
|
|
return _normalize_currency_id(StringName(String(raw_id)))
|
|
|
|
func parse_currency_id(raw_currency: Variant) -> StringName:
|
|
#if raw_currency is int:
|
|
#return currency_id_from_legacy_index(raw_currency)
|
|
|
|
var currency_text: String = String(raw_currency).to_lower().strip_edges()
|
|
if currency_text == "gem":
|
|
currency_text = "gems"
|
|
return _normalize_currency_id(StringName(currency_text))
|
|
|
|
#func currency_id_from_legacy_index(currency_index: int) -> StringName:
|
|
#return LEGACY_CURRENCY_INDEX_TO_ID.get(currency_index, &"")
|
|
|
|
func is_known_currency_id(currency_id: StringName) -> bool:
|
|
_initialize_currency_catalog_if_needed()
|
|
|
|
var normalized_currency_id: StringName = _normalize_currency_id(currency_id)
|
|
if normalized_currency_id == &"":
|
|
return false
|
|
return _currency_by_id.has(normalized_currency_id)
|
|
|
|
func get_currency_resource(currency_id: StringName) -> Resource:
|
|
_initialize_currency_catalog_if_needed()
|
|
|
|
var normalized_currency_id: StringName = _normalize_currency_id(currency_id)
|
|
if normalized_currency_id == &"":
|
|
return null
|
|
|
|
var raw_currency: Variant = _currency_by_id.get(normalized_currency_id)
|
|
if raw_currency is Resource:
|
|
return raw_currency
|
|
return null
|
|
|
|
func get_currency_name(currency_id: StringName) -> String:
|
|
var currency: Resource = get_currency_resource(currency_id)
|
|
if currency != null:
|
|
var display_name: String = String(currency.get("display_name")).strip_edges()
|
|
if not display_name.is_empty():
|
|
return display_name
|
|
return _humanize_currency_id(currency_id)
|
|
|
|
func get_currency_icon(currency_id: StringName) -> Texture2D:
|
|
var currency: Resource = get_currency_resource(currency_id)
|
|
if currency == null:
|
|
return null
|
|
|
|
var raw_icon: Variant = currency.get("icon")
|
|
if raw_icon is Texture2D:
|
|
return raw_icon
|
|
return null
|
|
|
|
func _initialize_currency_catalog_if_needed() -> void:
|
|
if _catalog_initialized:
|
|
return
|
|
_initialize_currency_catalog()
|
|
|
|
func _initialize_currency_catalog() -> void:
|
|
_currency_by_id.clear()
|
|
_catalog_initialized = true
|
|
|
|
var currency_resource_paths: PackedStringArray = _discover_currency_resource_paths()
|
|
for resource_path in currency_resource_paths:
|
|
var loaded_resource: Resource = load(resource_path)
|
|
if loaded_resource == null:
|
|
push_warning("Failed to load currency resource at '%s'." % resource_path)
|
|
continue
|
|
if not (loaded_resource is Currency):
|
|
continue
|
|
|
|
var currency_id: StringName = get_currency_id(loaded_resource)
|
|
if currency_id == &"":
|
|
push_warning("Skipping currency with missing id: %s" % resource_path)
|
|
continue
|
|
if _currency_by_id.has(currency_id):
|
|
push_warning("Duplicate currency id '%s' found at %s. Keeping first occurrence." % [String(currency_id), resource_path])
|
|
continue
|
|
|
|
_currency_by_id[currency_id] = loaded_resource
|
|
|
|
if _currency_by_id.is_empty():
|
|
push_warning("No currency resources discovered under %s. Ensure currency .tres files exist and are included in export presets." % CURRENCY_DIRECTORY_PATH)
|
|
|
|
func _discover_currency_resource_paths() -> PackedStringArray:
|
|
var result: PackedStringArray = []
|
|
var directory: DirAccess = DirAccess.open(CURRENCY_DIRECTORY_PATH)
|
|
if directory == null:
|
|
push_warning("Unable to open currency directory: %s" % CURRENCY_DIRECTORY_PATH)
|
|
return result
|
|
|
|
directory.list_dir_begin()
|
|
var entry_name: String = directory.get_next()
|
|
while not entry_name.is_empty():
|
|
if directory.current_is_dir() or entry_name.begins_with("."):
|
|
entry_name = directory.get_next()
|
|
continue
|
|
|
|
var extension: String = entry_name.get_extension().to_lower()
|
|
if CURRENCY_RESOURCE_EXTENSIONS.has(extension):
|
|
result.append("%s/%s" % [CURRENCY_DIRECTORY_PATH, entry_name])
|
|
|
|
entry_name = directory.get_next()
|
|
directory.list_dir_end()
|
|
|
|
result.sort()
|
|
return result
|
|
|
|
func _normalize_currency_id(currency_id: StringName) -> StringName:
|
|
var normalized: String = String(currency_id).to_lower().strip_edges()
|
|
if normalized.is_empty():
|
|
return &""
|
|
return StringName(normalized)
|
|
|
|
func _humanize_currency_id(currency_id: StringName) -> String:
|
|
var normalized: String = String(_normalize_currency_id(currency_id))
|
|
if normalized.is_empty():
|
|
return "Unknown"
|
|
return normalized.replace("_", " ").capitalize()
|