diff --git a/src/Autoload/GlobalState.gd b/src/Autoload/GlobalState.gd index b384514..c98f43d 100644 --- a/src/Autoload/GlobalState.gd +++ b/src/Autoload/GlobalState.gd @@ -31,7 +31,7 @@ func load_sounds() -> void: func set_progress(value) -> void: gsr.progress_dict = value - SaveManager.save_default() + save() func get_progress() -> Dictionary: @@ -41,6 +41,7 @@ func get_progress() -> Dictionary: func save() -> void: SaveManager.save_default() + # Returns if the level was completed or not func get_level_completed(level_name: String) -> bool: if gsr.progress_dict.has(level_name) && gsr.progress_dict[level_name].has("levelcompleted"): @@ -53,14 +54,14 @@ func set_level_completed(level_name: String, state: bool) -> void: if !gsr.progress_dict.has(level_name): gsr.progress_dict[level_name] = {} gsr.progress_dict[level_name]["levelcompleted"] = state - SaveManager.save_default() + save() -func set_leveltime(level_name: String, time: float) -> void: +func set_level_time(level_name: String, time: float) -> void: if !gsr.progress_dict.has(level_name): gsr.progress_dict[level_name] = {} gsr.progress_dict[level_name]["leveltime"] = time - SaveManager.save_default() + save() func get_level_time(level_name: String) -> float: @@ -74,7 +75,7 @@ func set_uncompleted_level_time(level_name: String, time: float) -> void: if !gsr.progress_dict.has(level_name): gsr.progress_dict[level_name] = {} gsr.progress_dict[level_name]["uncompletedleveltime"] = time - SaveManager.save_default() + save() func get_uncompleted_level_time(level_name: String) -> float: @@ -90,28 +91,29 @@ func set_savepoint(level_name: String, position: Vector2) -> void: if !gsr.progress_dict.has(level_name): gsr.progress_dict[level_name] = {} gsr.progress_dict[level_name]["savepoint"] = position - SaveManager.save_default() + save() func set_level_state(level_name: String, property_dict: Dictionary) -> void: if !gsr.progress_dict.has(level_name): gsr.progress_dict[level_name] = {} gsr.progress_dict[level_name]["savestate"] = property_dict - SaveManager.save_default() + save() func remove_savepoint(level_name: String) -> void: if !gsr.progress_dict.has(level_name): return gsr.progress_dict[level_name].erase("savepoint") + gsr.progress_dict[level_name].erase("currency") gsr.progress_dict[level_name].erase("uncompletedleveltime") - SaveManager.save_default() + save() func remove_savestate(level_name: String) -> void: if !gsr.progress_dict.has(level_name): return gsr.progress_dict[level_name].erase("savestate") - SaveManager.save_default() + save() func get_property_value(level_name: String, propertyName: String) -> int: @@ -149,14 +151,14 @@ func touch_level(level_name: String) -> void: # TODO This is permanent immediatly func set_wallet(value) -> void: gsr.wallet = value - SaveManager.save_default() + save() func get_wallet() -> int: return gsr.wallet func set_swaying_grass(value: bool) -> void: gsr.swaying_grass = value - SaveManager.save_default() + save() func get_swaying_grass() -> bool: return gsr.swaying_grass diff --git a/src/BenefitialObjects/Coin.gd b/src/BenefitialObjects/Coin.gd index 07f2acb..269e705 100644 --- a/src/BenefitialObjects/Coin.gd +++ b/src/BenefitialObjects/Coin.gd @@ -9,20 +9,17 @@ export var currencyValue := 1 export var coin_3D_fps := 30 var last_draw_time := 0 -var scene_saved_id := 0 func _ready() -> void: - scene_saved_id = level_state.register_saveable_object(self) - var collected_saved = level_state.get_saved_object_property(scene_saved_id, "was_collected") + level_state.register_saveable_node(self) + var collected_saved = level_state.get_saved_node_property(self, "was_collected") if collected_saved != null: was_collected = collected_saved if was_collected: visible = false - level_state.set_currency(level_state.get_currency() + currencyValue) - return func _physics_process(delta: float) -> void: if !visible || proto_coin == null: diff --git a/src/Contraptions/Triggers/FrogFreeButton.gd b/src/Contraptions/Triggers/FrogFreeButton.gd index f90b353..8713f19 100644 --- a/src/Contraptions/Triggers/FrogFreeButton.gd +++ b/src/Contraptions/Triggers/FrogFreeButton.gd @@ -15,10 +15,10 @@ var scene_saved_id := 0 var activatable = true func _ready() -> void: - scene_saved_id = level_state.register_saveable_object(self) - var activated_saved = level_state.get_saved_object_property(scene_saved_id, "activated") + level_state.register_saveable_node(self) + var activated_saved = level_state.get_saved_node_property(self, "activated") - if activated_saved != null: + if level_state.savepoint_loaded && activated_saved != null: activated = activated_saved $Digit.frame = frog_number if activated: diff --git a/src/Contraptions/Triggers/GateButton.gd b/src/Contraptions/Triggers/GateButton.gd index b549e2d..5ce3377 100644 --- a/src/Contraptions/Triggers/GateButton.gd +++ b/src/Contraptions/Triggers/GateButton.gd @@ -8,14 +8,13 @@ onready var unactivatable_timer := $Timer export onready var activated := false -var scene_saved_id := 0 var activatable := true func _ready() -> void: - scene_saved_id = level_state.register_saveable_object(self) - var activated_saved = level_state.get_saved_object_property(scene_saved_id, "activated") + level_state.register_saveable_node(self) + var activated_saved = level_state.get_saved_node_property(self, "activated") - if activated_saved != null: + if level_state.savepoint_loaded && activated_saved != null: activated = activated_saved signal_manager.connect("unlocked", self, "receive_unlock") diff --git a/src/Contraptions/VendingMachine.gd b/src/Contraptions/VendingMachine.gd index e829eb7..f9e3518 100644 --- a/src/Contraptions/VendingMachine.gd +++ b/src/Contraptions/VendingMachine.gd @@ -9,14 +9,13 @@ onready var unactivatable_timer := $Timer export onready var activated := false export var cost := 3 -var scene_saved_id := 0 var activatable = false func _ready(): - scene_saved_id = level_state.register_saveable_object(self) - var activated_saved = level_state.get_saved_object_property(scene_saved_id, "activated") + level_state.register_saveable_node(self) + var activated_saved = level_state.get_saved_node_property(self, "activated") - if activated_saved != null: + if level_state.savepoint_loaded && activated_saved != null: activated = activated_saved $Sprite.frame = 0 diff --git a/src/ObstacleObjects/Mine.gd b/src/ObstacleObjects/Mine.gd index 3e1a8f2..6f97e0f 100644 --- a/src/ObstacleObjects/Mine.gd +++ b/src/ObstacleObjects/Mine.gd @@ -7,14 +7,13 @@ export onready var is_armed = false var trigger_zone_entered: bool = false -var scene_saved_id := 0 var activatable = false func _ready(): - scene_saved_id = level_state.register_saveable_object(self) - var is_armed_saved = level_state.get_saved_object_property(scene_saved_id, "is_armed") + level_state.register_saveable_node(self) + var is_armed_saved = level_state.get_saved_node_property(self, "is_armed") - if is_armed_saved != null: + if level_state.savepoint_loaded && is_armed_saved != null: is_armed = is_armed_saved if(!is_armed): diff --git a/src/Utilities/LevelState.gd b/src/Utilities/LevelState.gd index 413ed9f..bb2c3c3 100644 --- a/src/Utilities/LevelState.gd +++ b/src/Utilities/LevelState.gd @@ -10,6 +10,7 @@ var freed_frogs := [] # TODO Rename probs var is_dead := false setget set_dead +var savepoint_loaded := false var level_time := 0.0 var saved_property_dictionary := {} @@ -19,8 +20,9 @@ var object_in_scene_id: int = 0 func _ready() -> void: GlobalState.touch_level(level_name) + saved_property_dictionary = GlobalState.get_savestate(level_name) GlobalState.gsr.last_played_level = level_name - SaveManager.save_default() + GlobalState.save() signal_manager.connect("level_completed", self, "_on_level_completed") signal_manager.connect("player_died", self, "player_dying") @@ -42,52 +44,61 @@ func set_currency(value: int) -> void: currency = value signal_manager.emit_signal("currency_updated") + func get_currency() -> int: return currency + func set_deaths(value: int) -> void: deaths = value + func set_dead(value: bool) -> void: is_dead = value -func get_own_scene_id(obj: Object) -> int: - if "scene_id" in obj && saved_object_dictionary.has(obj.scene_id): - return obj.scene_id + +func register_saveable_node(node: Node) -> void: + if saved_object_dictionary.has(node.name): + return else: - return register_saveable_object(obj) + saved_object_dictionary[node.name] = node + if !saved_property_dictionary.has(node.name): + save_node_properties() -func register_saveable_object(obj: Object) -> int: - var id = object_in_scene_id - saved_object_dictionary[id] = obj - object_in_scene_id += 1 - return id - - -func save_object_properties() -> void: - for id in saved_object_dictionary.keys(): - var object = saved_object_dictionary[id] +# Saves the state of triggers, collected collectibles and such +func save_node_properties() -> void: + for name in saved_object_dictionary.keys(): + var object = saved_object_dictionary[name] var property_list = object.get_property_list() var saved_properties = {} for property in property_list: # Only script Variables and only "primitive" types if property["usage"] == PROPERTY_USAGE_SCRIPT_VARIABLE && property["type"] <= 16: saved_properties[property["name"]] = object.get(property["name"]) - saved_property_dictionary[id] = saved_properties + saved_property_dictionary[name] = saved_properties + GlobalState.set_level_state(level_name, saved_property_dictionary) -func get_saved_object_property(id: int, property: String): - if saved_property_dictionary.has(id) && saved_property_dictionary[id].has(property): - return saved_property_dictionary[id][property] + +func get_saved_node_property(node: Node, property: String): + if ( + saved_property_dictionary.has(node.name) + && saved_property_dictionary[node.name].has(property) + ): + return saved_property_dictionary[node.name][property] else: return null func set_savepoint(pos: Vector2) -> void: GlobalState.set_savepoint(level_name, pos) - save_object_properties() GlobalState.set_uncompleted_level_time(level_name, level_time) - GlobalState.set_level_state(level_name, saved_property_dictionary) + save_node_properties() + GlobalState.get_progress()[level_name]["currency"] = ( + GlobalState.get_property_value(level_name, "currency") + + currency) + currency = 0 + update_global_state() func load_savepoint() -> bool: @@ -95,6 +106,9 @@ func load_savepoint() -> bool: return false saved_property_dictionary = GlobalState.get_savestate(level_name) level_time = GlobalState.get_uncompleted_level_time(level_name) + # Just update the hud + set_currency(currency) + savepoint_loaded = true return true @@ -134,48 +148,48 @@ func absolved_tutorial(lesson: String) -> void: # and returns true if so. Else it does not spend and return false. func spend_currency(cost: int) -> bool: # TODO member that - if OS.is_debug_build(): - return true + #if OS.is_debug_build(): + # return true if check_balance() < cost: return false # Can get negative if the cost is greater than what was collected in the same level currency = currency - cost return true + func check_balance() -> int: - var balance = currency + GlobalState.get_wallet() + var balance = currency + GlobalState.get_wallet() + GlobalState.get_property_value(level_name, "currency") return balance + func _on_level_completed(): #if(OS.is_debug_build()): # return # TODO Extra screen for new best time + save_node_properties() + savepoint_loaded = false GlobalState.set_level_completed(level_name, true) - if(GlobalState.get_level_time(level_name) > level_time ): - GlobalState.set_leveltime(level_name, level_time) + if GlobalState.get_level_time(level_name) > level_time: + GlobalState.set_level_time(level_name, level_time) GlobalState.set_uncompleted_level_time(level_name, INF) - GlobalState.remove_savepoint(level_name) - GlobalState.remove_savestate(level_name) update_global_state() + GlobalState.remove_savepoint(level_name) reset() -# TODO This is now inconsistent as the level_completed property could be used to + +# TODO This is now inconsistent as the level_completed property could be used to # determine what was achieved for good and what progress was lost due to death/reloading func update_global_state() -> void: var progress_dict: Dictionary = GlobalState.get_progress() var levelProgress: Dictionary = {} - levelProgress["currency"] = currency levelProgress["deaths"] = deaths # TODO Doesnt account for multiple plays of same level if !progress_dict.has(level_name): progress_dict[level_name] = levelProgress else: - progress_dict[level_name]["currency"] = ( - GlobalState.get_property_value(level_name, "currency") - + currency - ) + progress_dict[level_name]["deaths"] = ( GlobalState.get_property_value(level_name, "deaths") + deaths @@ -186,11 +200,15 @@ func update_global_state() -> void: for frog_number in freed_frogs: if progress_dict[level_name]["froggies"].has(frog_number): progress_dict[level_name]["froggies"][frog_number] = true - - # TODO Wallet is independant from progress_dict because??? - GlobalState.set_wallet(GlobalState.gsr.wallet + currency) + if GlobalState.get_level_completed(level_name): + currency += GlobalState.get_property_value(level_name, "currency") + GlobalState.set_wallet(GlobalState.gsr.wallet + currency) + progress_dict[level_name]["currency"] = 0 + currency = 0 + # Adds currency to level progress temporarily GlobalState.set_progress(progress_dict) + func player_dying(animation_number: int = 0) -> void: currency = 0 is_dead = true