From 4bdd4d70a56b9859bdc50d24fad793b75ac87eb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=A1vio=20Silva?= Date: Tue, 21 Jan 2025 22:26:27 +0000 Subject: [PATCH 1/3] feat(#18): created save and load system --- globals/GameStorage.gd | 39 +++++++++++++++++++++++++++++++++++ globals/LevelSystem/Player.gd | 8 +++++++ globals/LevelSystem/Tree.gd | 8 +++---- project.godot | 1 + scenes/game/game.gd | 1 + scenes/game/game.tscn | 2 ++ 6 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 globals/GameStorage.gd diff --git a/globals/GameStorage.gd b/globals/GameStorage.gd new file mode 100644 index 0000000..6d14961 --- /dev/null +++ b/globals/GameStorage.gd @@ -0,0 +1,39 @@ +extends Node + +const SAVE_PATH = "user://savegame.json" + +func _ready() -> void: + load_progress() + save_progress() + +func save_progress(): + var data = { + "player": PlayerLS.get_data(), + "trees": TreeLS.trees, + "selectedTree": TreeLS.selected + } + + var file = FileAccess.open(SAVE_PATH, FileAccess.WRITE) + var jsonData = JSON.stringify(data) + + file.store_line(jsonData) + +func load_progress(): + if not FileAccess.file_exists(SAVE_PATH): + print("Save file not exists") + return + + var file = FileAccess.open(SAVE_PATH, FileAccess.READ) + var file_content = file.get_as_text() + var json = JSON.new() + + json.parse(file_content) + + var data = json.data + + TreeLS.trees = data.trees + TreeLS.selected = data.selectedTree + PlayerLS.xp = data.player.xp + PlayerLS.level = data.player.level + PlayerLS.xpNextLevel = data.player.xpNextLevel + diff --git a/globals/LevelSystem/Player.gd b/globals/LevelSystem/Player.gd index 086af10..8843067 100644 --- a/globals/LevelSystem/Player.gd +++ b/globals/LevelSystem/Player.gd @@ -6,6 +6,14 @@ var xp = 0 # Current XP var level = 1 # Current Level var xpNextLevel = 100 # XP to the next level +func get_data(): + var data = { + "xp": xp, + "level": level, + "xpNextLevel": xpNextLevel + } + return data + func add_xp() -> void: xp += XP_PER_SECOND _check_level_up() diff --git a/globals/LevelSystem/Tree.gd b/globals/LevelSystem/Tree.gd index 05e475b..8c1b316 100644 --- a/globals/LevelSystem/Tree.gd +++ b/globals/LevelSystem/Tree.gd @@ -7,13 +7,13 @@ var trees = { "Tree2": {"xp": 0, "level": 1, "xpNextLevel": 100, "maxLevel": 10}, "Tree3": {"xp": 0, "level": 1, "xpNextLevel": 100, "maxLevel": 10}, } -var select = "Tree1" +var selected = "Tree1" func get_select_tree(): - return trees[select] + return trees[selected] func set_selected_tree(name: String) -> void: - select = name + selected = name func add_xp() -> void: var tree = get_select_tree() @@ -32,4 +32,4 @@ func _check_level_up() -> void: func _on_level_up() -> void: var tree = get_select_tree() - print(select, " subiu de nível! Novo nível: ", tree["level"]) + print(selected, " subiu de nível! Novo nível: ", tree["level"]) diff --git a/project.godot b/project.godot index 42a25ed..70ab773 100644 --- a/project.godot +++ b/project.godot @@ -17,6 +17,7 @@ config/icon="res://icon.svg" [autoload] +GameStorage="*res://globals/GameStorage.gd" GameManager="*res://globals/GameManager.gd" Utils="*res://globals/Utils.gd" PlayerLS="*res://globals/LevelSystem/Player.gd" diff --git a/scenes/game/game.gd b/scenes/game/game.gd index 444d03a..70eb0a5 100644 --- a/scenes/game/game.gd +++ b/scenes/game/game.gd @@ -13,6 +13,7 @@ func _on_xp_timer_timeout() -> void: PlayerLS.add_xp() TreeLS.add_xp() _update_ui() + GameStorage.save_progress() func _update_ui() -> void: var tree = TreeLS.get_select_tree() diff --git a/scenes/game/game.tscn b/scenes/game/game.tscn index abf911b..fb9dfd6 100644 --- a/scenes/game/game.tscn +++ b/scenes/game/game.tscn @@ -41,6 +41,8 @@ layout_mode = 2 [node name="TreeSelector" type="OptionButton" parent="UI/TreeLevelUI"] layout_mode = 2 selected = 0 +item_count = 2 +popup/item_1/id = 1 [node name="XP_Timer" type="Timer" parent="."] autostart = true From e586a7c37c8ab5cf6f24c209915380daed95e0aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=A1vio=20Silva?= Date: Tue, 21 Jan 2025 22:29:16 +0000 Subject: [PATCH 2/3] Update game.tscn --- scenes/game/game.tscn | 2 -- 1 file changed, 2 deletions(-) diff --git a/scenes/game/game.tscn b/scenes/game/game.tscn index fb9dfd6..abf911b 100644 --- a/scenes/game/game.tscn +++ b/scenes/game/game.tscn @@ -41,8 +41,6 @@ layout_mode = 2 [node name="TreeSelector" type="OptionButton" parent="UI/TreeLevelUI"] layout_mode = 2 selected = 0 -item_count = 2 -popup/item_1/id = 1 [node name="XP_Timer" type="Timer" parent="."] autostart = true From 7ace50b2180ea38eed9854820a44d43673a2033b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=A1vio=20Silva?= Date: Tue, 21 Jan 2025 23:31:27 +0000 Subject: [PATCH 3/3] feat: save select tree on load/save --- globals/GameManager.gd | 17 ----------------- globals/LevelSystem/Player.gd | 2 +- globals/LevelSystem/Tree.gd | 13 ++++++++++--- scenes/game/game.gd | 18 +++++++++++------- 4 files changed, 22 insertions(+), 28 deletions(-) diff --git a/globals/GameManager.gd b/globals/GameManager.gd index 22a0a19..61510e1 100644 --- a/globals/GameManager.gd +++ b/globals/GameManager.gd @@ -1,18 +1 @@ extends Node - -const XP_PER_SECOND: int = 5 - -const TREES = { - 0: { - "id": "Tree1", - "name": "Tree 1" - }, - 1: { - "id": "Tree2", - "name": "Tree 2" - }, - 2: { - "id": "Tree3", - "name": "Tree 3" - }, -} diff --git a/globals/LevelSystem/Player.gd b/globals/LevelSystem/Player.gd index 8843067..15ccfd4 100644 --- a/globals/LevelSystem/Player.gd +++ b/globals/LevelSystem/Player.gd @@ -6,7 +6,7 @@ var xp = 0 # Current XP var level = 1 # Current Level var xpNextLevel = 100 # XP to the next level -func get_data(): +func get_data() -> Dictionary: var data = { "xp": xp, "level": level, diff --git a/globals/LevelSystem/Tree.gd b/globals/LevelSystem/Tree.gd index 8c1b316..c90dcc9 100644 --- a/globals/LevelSystem/Tree.gd +++ b/globals/LevelSystem/Tree.gd @@ -3,15 +3,22 @@ extends Node const XP_PER_SECOND: int = 5 var trees = { - "Tree1": {"xp": 0, "level": 1, "xpNextLevel": 100, "maxLevel": 10}, - "Tree2": {"xp": 0, "level": 1, "xpNextLevel": 100, "maxLevel": 10}, - "Tree3": {"xp": 0, "level": 1, "xpNextLevel": 100, "maxLevel": 10}, + "Tree1": {"id": 0, "name": "Tree 1", "xp": 0, "level": 1, "xpNextLevel": 100, "maxLevel": 10}, + "Tree2": {"id": 1, "name": "Tree 2", "xp": 0, "level": 1, "xpNextLevel": 100, "maxLevel": 10}, + "Tree3": {"id": 2, "name": "Tree 3", "xp": 0, "level": 1, "xpNextLevel": 100, "maxLevel": 10}, } var selected = "Tree1" func get_select_tree(): return trees[selected] +func find_tree_by_id(target_id: int) -> Dictionary: + for key in trees.keys(): + var tree = trees[key] + if tree.id == target_id: + return {"key": key, "tree": tree} + return {} + func set_selected_tree(name: String) -> void: selected = name diff --git a/scenes/game/game.gd b/scenes/game/game.gd index 70eb0a5..5b77eba 100644 --- a/scenes/game/game.gd +++ b/scenes/game/game.gd @@ -21,16 +21,20 @@ func _update_ui() -> void: tree_level_status.update_ui(tree["level"], tree["xp"], tree["xpNextLevel"]) func _populate_option_button(): - var TREES = GameManager.TREES + var TREES = TreeLS.trees + var selected = TreeLS.selected for key in TREES.keys(): - var tree_data = TREES[key] - tree_selector.add_item(tree_data["name"], key) + var tree = TREES[key] + tree_selector.add_item(tree.name, tree.id) + + tree_selector.selected = TREES[selected].id func _on_option_button_item_selected(index: int) -> void: - var TREES = GameManager.TREES - var seletec = TREES[index] + var seletec = TreeLS.find_tree_by_id(index) + + TreeLS.set_selected_tree(seletec.key) + tree_name.text = seletec.tree.name - TreeLS.set_selected_tree(seletec["id"]) - tree_name.text = seletec["name"] _update_ui() + GameStorage.save_progress()