Add generator buffs (additional test required)
This commit is contained in:
116
game_state.gd
116
game_state.gd
@@ -6,6 +6,7 @@ extends Node
|
||||
# ==========================================
|
||||
signal currency_changed(currency_id: StringName, new_amount: BigNumber)
|
||||
signal generator_state_changed(generator_id: StringName, state: Dictionary)
|
||||
signal generator_buff_level_changed(generator_id: StringName, buff_id: StringName, new_level: int)
|
||||
|
||||
# ==========================================
|
||||
# STATE VARIABLES
|
||||
@@ -14,6 +15,7 @@ var _current_currency: Dictionary = {}
|
||||
var _total_currency_acquired: Dictionary = {}
|
||||
|
||||
var generator_states: Dictionary = {}
|
||||
var generator_buff_levels: Dictionary = {}
|
||||
|
||||
var last_save_time: int = 0 # Unix timestamp
|
||||
|
||||
@@ -25,9 +27,12 @@ const GENERATOR_OWNED_KEY: String = "owned"
|
||||
const GENERATOR_PURCHASED_COUNT_KEY: String = "purchased_count"
|
||||
const GENERATOR_UNLOCKED_KEY: String = "unlocked"
|
||||
const GENERATOR_AVAILABLE_KEY: String = "available"
|
||||
const GENERATOR_STATES_KEY: String = "generator_states"
|
||||
const GENERATOR_BUFF_LEVELS_KEY: String = "generator_buff_levels"
|
||||
const CURRENCIES_KEY: String = "currencies"
|
||||
const CURRENT_KEY: String = "current"
|
||||
const TOTAL_KEY: String = "total"
|
||||
const LAST_SAVE_TIME_KEY: String = "last_save_time"
|
||||
|
||||
func _ready() -> void:
|
||||
_initialize_currency_maps()
|
||||
@@ -192,14 +197,61 @@ func set_generator_available(generator_id: StringName, value: bool) -> void:
|
||||
state[GENERATOR_AVAILABLE_KEY] = value
|
||||
_set_generator_state(generator_id, state)
|
||||
|
||||
func register_generator_buff(generator_id: StringName, buff_id: StringName, initial_level: int = 0) -> void:
|
||||
var generator_key: String = String(generator_id)
|
||||
var buff_key: String = String(buff_id)
|
||||
if generator_key.is_empty() or buff_key.is_empty():
|
||||
return
|
||||
|
||||
var levels: Dictionary = _get_generator_buff_levels_ref(generator_id)
|
||||
if levels.has(buff_key):
|
||||
var existing_level: int = _to_non_negative_int(levels.get(buff_key, initial_level), initial_level)
|
||||
if int(levels.get(buff_key, initial_level)) != existing_level:
|
||||
levels[buff_key] = existing_level
|
||||
generator_buff_levels[generator_key] = levels
|
||||
generator_buff_level_changed.emit(StringName(generator_key), StringName(buff_key), existing_level)
|
||||
return
|
||||
|
||||
var sanitized_level: int = _to_non_negative_int(initial_level, 0)
|
||||
levels[buff_key] = sanitized_level
|
||||
generator_buff_levels[generator_key] = levels
|
||||
generator_buff_level_changed.emit(StringName(generator_key), StringName(buff_key), sanitized_level)
|
||||
|
||||
func get_generator_buff_level(generator_id: StringName, buff_id: StringName) -> int:
|
||||
var buff_key: String = String(buff_id)
|
||||
if buff_key.is_empty():
|
||||
return 0
|
||||
|
||||
var levels: Dictionary = _get_generator_buff_levels_ref(generator_id)
|
||||
return _to_non_negative_int(levels.get(buff_key, 0), 0)
|
||||
|
||||
func set_generator_buff_level(generator_id: StringName, buff_id: StringName, value: int) -> void:
|
||||
var generator_key: String = String(generator_id)
|
||||
var buff_key: String = String(buff_id)
|
||||
if generator_key.is_empty() or buff_key.is_empty():
|
||||
return
|
||||
|
||||
var levels: Dictionary = _get_generator_buff_levels_ref(generator_id)
|
||||
var next_level: int = _to_non_negative_int(value, 0)
|
||||
if int(levels.get(buff_key, -1)) == next_level:
|
||||
return
|
||||
|
||||
levels[buff_key] = next_level
|
||||
generator_buff_levels[generator_key] = levels
|
||||
generator_buff_level_changed.emit(StringName(generator_key), StringName(buff_key), next_level)
|
||||
|
||||
func get_generator_buff_levels(generator_id: StringName) -> Dictionary:
|
||||
return _get_generator_buff_levels_ref(generator_id).duplicate(true)
|
||||
|
||||
# ==========================================
|
||||
# PERSISTENCE (Save/Load)
|
||||
# ==========================================
|
||||
func save_game() -> void:
|
||||
var save_data = {
|
||||
CURRENCIES_KEY: _serialize_currency_balances(),
|
||||
"generator_states": _serialize_generator_states(),
|
||||
"last_save_time": Time.get_unix_time_from_system()
|
||||
GENERATOR_STATES_KEY: _serialize_generator_states(),
|
||||
GENERATOR_BUFF_LEVELS_KEY: _serialize_generator_buff_levels(),
|
||||
LAST_SAVE_TIME_KEY: Time.get_unix_time_from_system()
|
||||
}
|
||||
|
||||
var file: FileAccess = FileAccess.open(file_name, FileAccess.WRITE)
|
||||
@@ -218,8 +270,9 @@ func load_game() -> void:
|
||||
if parsed_data.has(CURRENCIES_KEY):
|
||||
_load_currency_balances(parsed_data.get(CURRENCIES_KEY, {}))
|
||||
|
||||
generator_states = _deserialize_generator_states(parsed_data.get("generator_states", {}))
|
||||
last_save_time = parsed_data.get("last_save_time", Time.get_unix_time_from_system())
|
||||
generator_states = _deserialize_generator_states(parsed_data.get(GENERATOR_STATES_KEY, {}))
|
||||
generator_buff_levels = _deserialize_generator_buff_levels(parsed_data.get(GENERATOR_BUFF_LEVELS_KEY, {}))
|
||||
last_save_time = parsed_data.get(LAST_SAVE_TIME_KEY, Time.get_unix_time_from_system())
|
||||
|
||||
func _load_currency_balances(raw_currencies: Variant) -> void:
|
||||
if not (raw_currencies is Dictionary):
|
||||
@@ -378,6 +431,32 @@ func _set_generator_state(generator_id: StringName, state: Dictionary) -> void:
|
||||
generator_states[key] = sanitized
|
||||
generator_state_changed.emit(StringName(key), sanitized.duplicate(true))
|
||||
|
||||
func _get_generator_buff_levels_ref(generator_id: StringName) -> Dictionary:
|
||||
var key: String = String(generator_id)
|
||||
if key.is_empty():
|
||||
return {}
|
||||
|
||||
var existing_raw: Variant = generator_buff_levels.get(key, {})
|
||||
if existing_raw is Dictionary:
|
||||
var sanitized: Dictionary = _sanitize_generator_buff_levels(existing_raw)
|
||||
generator_buff_levels[key] = sanitized
|
||||
return sanitized
|
||||
|
||||
var fallback: Dictionary = {}
|
||||
generator_buff_levels[key] = fallback
|
||||
return fallback
|
||||
|
||||
func _sanitize_generator_buff_levels(raw_levels: Dictionary) -> Dictionary:
|
||||
var sanitized_levels: Dictionary = {}
|
||||
for buff_key_variant in raw_levels.keys():
|
||||
var buff_key: String = String(buff_key_variant)
|
||||
if buff_key.is_empty():
|
||||
continue
|
||||
|
||||
sanitized_levels[buff_key] = _to_non_negative_int(raw_levels.get(buff_key_variant, 0), 0)
|
||||
|
||||
return sanitized_levels
|
||||
|
||||
func _serialize_generator_states() -> Dictionary:
|
||||
var result: Dictionary = {}
|
||||
for key_variant in generator_states.keys():
|
||||
@@ -405,6 +484,35 @@ func _deserialize_generator_states(raw_value: Variant) -> Dictionary:
|
||||
result[key] = _deserialize_generator_state_entry(entry)
|
||||
return result
|
||||
|
||||
func _serialize_generator_buff_levels() -> Dictionary:
|
||||
var result: Dictionary = {}
|
||||
for generator_key_variant in generator_buff_levels.keys():
|
||||
var generator_key: String = String(generator_key_variant)
|
||||
if generator_key.is_empty():
|
||||
continue
|
||||
|
||||
var raw_levels: Variant = generator_buff_levels.get(generator_key_variant)
|
||||
if raw_levels is Dictionary:
|
||||
result[generator_key] = _sanitize_generator_buff_levels(raw_levels)
|
||||
|
||||
return result
|
||||
|
||||
func _deserialize_generator_buff_levels(raw_value: Variant) -> Dictionary:
|
||||
var result: Dictionary = {}
|
||||
if not (raw_value is Dictionary):
|
||||
return result
|
||||
|
||||
for generator_key_variant in raw_value.keys():
|
||||
var generator_key: String = String(generator_key_variant)
|
||||
if generator_key.is_empty():
|
||||
continue
|
||||
|
||||
var raw_levels: Variant = raw_value.get(generator_key_variant)
|
||||
if raw_levels is Dictionary:
|
||||
result[generator_key] = _sanitize_generator_buff_levels(raw_levels)
|
||||
|
||||
return result
|
||||
|
||||
func _serialize_generator_state_entry(raw_state: Dictionary) -> Dictionary:
|
||||
var owned_value: int = _to_non_negative_int(raw_state.get(GENERATOR_OWNED_KEY, 0), 0)
|
||||
var purchased_value: int = _to_non_negative_int(raw_state.get(GENERATOR_PURCHASED_COUNT_KEY, owned_value), owned_value)
|
||||
|
||||
Reference in New Issue
Block a user