First commit
This commit is contained in:
76
game_state.gd
Normal file
76
game_state.gd
Normal file
@@ -0,0 +1,76 @@
|
||||
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())
|
||||
Reference in New Issue
Block a user