Files
idle/game_state.gd
Michele Rossi bd11d2c037 First commit
2026-03-08 10:38:30 +01:00

77 lines
2.2 KiB
GDScript

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())