ld-56/components/Unlocks/unlocks.gd
2024-10-06 04:22:46 -04:00

127 lines
3.8 KiB
GDScript

class_name UnlocksType
extends Base
# Signals
# Constants
const LOG_CATEGORY = "LOCK"
var unlocks = {}
func unlock_item(key: String, category: String):
if not unlocks.has(category):
if _logger: _logger.error("Attempted to unlock item %s in invalid category %s" % [key, category], LOG_CATEGORY)
return
if not unlocks[category].has(key):
if _logger: _logger.error("Attempted to unlock invalid item %s in category %s" % [key, category], LOG_CATEGORY)
return
if unlocks[category][key]:
if _logger: _logger.warn("Unlocked already unlocked item %s in category %s" % [key, category], LOG_CATEGORY)
unlocks[category][key].status = true
if _logger: _logger.info("Unlocked item %s in category %s" % [key, category], LOG_CATEGORY)
func lock_item(key: String, category: String):
if not unlocks.has(category):
if _logger: _logger.error("Attempted to lock item %s in invalid category %s" % [key, category], LOG_CATEGORY)
return
if not unlocks[category].has(key):
if _logger: _logger.error("Attempted to lock invalid item %s in category %s" % [key, category], LOG_CATEGORY)
return
if not unlocks[category][key]:
if _logger: _logger.warn("Locked already locked item %s in category %s" % [key, category], LOG_CATEGORY)
unlocks[category][key].status = false
if _logger: _logger.info("Locked item %s in category %s" % [key, category], LOG_CATEGORY)
func reset_unlocks():
if (_data):
unlocks = {}
for category in _data.data:
var category_data = _data.data[category]
if category_data.has("!_config"):
if category_data["!_config"].has("unlock"):
if category_data["!_config"]["unlock"] == "true":
unlocks[category] = {}
for key in category_data:
if key == "!_config":
continue
var element = category_data[key]
if element.has("locked"):
if element["locked"] == "true":
if not element.has("unlock_trigger"):
if _logger: _logger.warn("Locked element %s in category %s has no unlock trigger" % [key, category], LOG_CATEGORY)
unlocks[category][key] = {
"status": false
}
continue
if not element.has("unlock_amount"):
if _logger: _logger.warn("Locked element %s in category %s has no unlock amount" % [key, category], LOG_CATEGORY)
unlocks[category][key] = {
"status": false
}
continue
if is_nan(int(element["unlock_amount"])):
if _logger: _logger.warn("Locked element %s in category %s unlock amount %s is not a number" % [key, category, element["unlock_amount"]], LOG_CATEGORY)
unlocks[category][key] = {
"status": false
}
continue
unlocks[category][key] = {
"status": false,
"trigger": element["unlock_trigger"],
"amount": int(element["unlock_amount"])
}
else:
unlocks[category][key] = {
"status": true
}
else:
unlocks[category][key] = {
"status": true
}
if _logger: _logger.info("Reset Unlocks", LOG_CATEGORY)
func _ready():
super()
reset_unlocks()
#func _on_number_persisted(key: String, value, category: PersisterType.DataCategory):
#_check_trigger(key, value)
func _check_trigger(key: String, value: int):
for category in unlocks:
var category_data = unlocks[category]
for element in category_data:
var element_data = category_data[element]
if not element_data.has("trigger"):
continue
if element_data["trigger"] != key:
continue
if element_data["status"]:
continue
if _logger: _logger.debug("Checking trigger %s for item %s in category %s: %d (required) vs %d (incoming)" % [key, element, category, element_data["amount"], value], LOG_CATEGORY)
if value > element_data["amount"]:
unlock_item(element, category)