extends Node # This script is added as an Autoload named 'GameState' # ========================================== # SIGNALS # ========================================== signal gold_changed(new_amount: BigNumber) signal gems_changed(new_amount: BigNumber) enum CurrencyType { gold, gems } # ========================================== # STATE VARIABLES # ========================================== var gold: BigNumber = BigNumber.from_float(0.0) var gems: BigNumber = BigNumber.from_float(0.0) var last_save_time: int = 0 # Unix timestamp static var file_name: String = "user://idle_save.json" func _ready() -> void: load_game() # ========================================== # STATE MODIFIERS # ========================================== func add_gold(amount: BigNumber) -> void: gold.add_in_place(amount) gold_changed.emit(gold) func spend_gold(cost: BigNumber) -> bool: if gold.is_greater_than(cost) or gold.is_equal_to(cost): var negative_cost = BigNumber.new(-cost.mantissa, cost.exponent) gold.add_in_place(negative_cost) gold_changed.emit(gold) return true return false func add_gems(amount: BigNumber) -> void: gems.add_in_place(amount) gems_changed.emit(gems) func spend_gems(cost: BigNumber) -> bool: if gems.is_greater_than(cost) or gems.is_equal_to(cost): var negative_cost = BigNumber.new(-cost.mantissa, cost.exponent) gems.add_in_place(negative_cost) gems_changed.emit(gems) return true return false # ========================================== # PERSISTENCE (Save/Load) # ========================================== func save_game() -> void: var save_data = { "gold": gold.serialize(), "gems": gems.serialize(), "last_save_time": Time.get_unix_time_from_system() } var file = FileAccess.open(file_name, FileAccess.WRITE) if file: file.store_string(JSON.stringify(save_data)) func load_game() -> void: if not FileAccess.file_exists(file_name): return var file = FileAccess.open(file_name, FileAccess.READ) if file: var parsed = JSON.parse_string(file.get_as_text()) if parsed is Dictionary: gold = BigNumber.deserialize(parsed.get("gold", {})) gems = BigNumber.deserialize(parsed.get("gems", {})) last_save_time = parsed.get("last_save_time", Time.get_unix_time_from_system())