128 lines
3.8 KiB
GDScript3
128 lines
3.8 KiB
GDScript3
|
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)
|