From 5fb4a96159a4d98a66009101a858c781e378e9bf Mon Sep 17 00:00:00 2001 From: cgandeg Date: Thu, 19 Mar 2026 13:27:37 -0600 Subject: [PATCH] beta-1.4/persistence-implementation (#3) Reviewed-on: https://gitea.39062.top/cgandeg/Archipelago-Game/pulls/3 --- Assets/Aseprite Files/Game Icon.aseprite | Bin 0 -> 18062 bytes .../Unit Testing/Scripts/base_test_runner.gd | 28 ++++++++++ .../Scripts/base_test_runner.gd.uid | 1 + .../Scripts/base_test_runner.tscn | 3 ++ .../Scripts/json_parsing_tests.gd | 14 +++++ .../Scripts/json_parsing_tests.gd.uid | 1 + Debug/Unit Testing/json_parsing_tests.tscn | 6 +++ .../under_construction_block.tscn | 0 .../Animals/Chicken/Scripts/npc_chicken.gd | 9 +++- .../Chests/Scripts/Bases/chest_base.gd | 6 +++ .../Chests/Scripts/item_chest_01.gd | 5 ++ .../Gates/Spike Gate/Scripts/spike_gate.gd | 4 ++ .../Gates/Spike Gate/spike_gate.tscn | 2 +- .../Trees/Effects/Scripts/leaf_spawner.gd | 12 ++++- Game Icon.png | Bin 0 -> 16316 bytes Game Icon.png.import | 40 ++++++++++++++ .../path_to_dungeon_01.tscn | 28 ++++++---- .../Scripts/chest_persistence_connector.gd | 21 ++++++++ .../chest_persistence_connector.gd.uid | 1 + .../Scripts/gate_persistence_connector.gd | 40 ++++++++++++++ .../Scripts/gate_persistence_connector.gd.uid | 1 + .../chest_persistence_connector.tscn | 6 +++ .../gate_persistence_connector.tscn | 6 +++ Persistence/persistence_manager.gd | 51 ++++++++++++++++++ Persistence/persistence_manager.gd.uid | 1 + project.godot | 6 ++- 26 files changed, 277 insertions(+), 15 deletions(-) create mode 100644 Assets/Aseprite Files/Game Icon.aseprite create mode 100644 Debug/Unit Testing/Scripts/base_test_runner.gd create mode 100644 Debug/Unit Testing/Scripts/base_test_runner.gd.uid create mode 100644 Debug/Unit Testing/Scripts/base_test_runner.tscn create mode 100644 Debug/Unit Testing/Scripts/json_parsing_tests.gd create mode 100644 Debug/Unit Testing/Scripts/json_parsing_tests.gd.uid create mode 100644 Debug/Unit Testing/json_parsing_tests.tscn rename Debug/{ => Utility Objects}/under_construction_block.tscn (100%) create mode 100644 Game Icon.png create mode 100644 Game Icon.png.import create mode 100644 Persistence/Connectors/Scripts/chest_persistence_connector.gd create mode 100644 Persistence/Connectors/Scripts/chest_persistence_connector.gd.uid create mode 100644 Persistence/Connectors/Scripts/gate_persistence_connector.gd create mode 100644 Persistence/Connectors/Scripts/gate_persistence_connector.gd.uid create mode 100644 Persistence/Connectors/chest_persistence_connector.tscn create mode 100644 Persistence/Connectors/gate_persistence_connector.tscn create mode 100644 Persistence/persistence_manager.gd create mode 100644 Persistence/persistence_manager.gd.uid diff --git a/Assets/Aseprite Files/Game Icon.aseprite b/Assets/Aseprite Files/Game Icon.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..79200aaebe5cf7aae00c8cfb908f7715d658b1b4 GIT binary patch literal 18062 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 literal 0 HcmV?d00001 diff --git a/Debug/Unit Testing/Scripts/base_test_runner.gd b/Debug/Unit Testing/Scripts/base_test_runner.gd new file mode 100644 index 0000000..2d1b874 --- /dev/null +++ b/Debug/Unit Testing/Scripts/base_test_runner.gd @@ -0,0 +1,28 @@ +extends Node +class_name BaseTestRunner + + +func _ready() -> void: + var methods := self.get_method_list() + for method in methods: + var method_name: String = method["name"] + if method_name.left(5).to_lower() != "test_": + continue + + var return_dict: Dictionary = method["return"] + var return_type: int = return_dict["type"] + + if return_type != 1: + print_rich("[color=yellow]Skipping Unit Test Method '%s'. Reason: Return type is not bool[/color]" % method_name) + continue + + var args: Array = method["args"] + if not args.is_empty(): + print_rich("[color=yellow]Skipping Unit Test Method '%s', Reason: Method requires arguments.[/color]" % method_name) + continue + + var result: bool = call(method_name) + if result: + print_rich("[color=green]%s: Success![/color]" % method_name) + else: + print_rich("[color=red]%s: Failure...[/color]" % method_name) diff --git a/Debug/Unit Testing/Scripts/base_test_runner.gd.uid b/Debug/Unit Testing/Scripts/base_test_runner.gd.uid new file mode 100644 index 0000000..948c923 --- /dev/null +++ b/Debug/Unit Testing/Scripts/base_test_runner.gd.uid @@ -0,0 +1 @@ +uid://bsewsmjxlup47 diff --git a/Debug/Unit Testing/Scripts/base_test_runner.tscn b/Debug/Unit Testing/Scripts/base_test_runner.tscn new file mode 100644 index 0000000..4372386 --- /dev/null +++ b/Debug/Unit Testing/Scripts/base_test_runner.tscn @@ -0,0 +1,3 @@ +[gd_scene format=3 uid="uid://rl2o7alqg7w4"] + +[node name="BaseTestRunner" type="Node" unique_id=1916529975] diff --git a/Debug/Unit Testing/Scripts/json_parsing_tests.gd b/Debug/Unit Testing/Scripts/json_parsing_tests.gd new file mode 100644 index 0000000..3c44ae4 --- /dev/null +++ b/Debug/Unit Testing/Scripts/json_parsing_tests.gd @@ -0,0 +1,14 @@ +extends BaseTestRunner + + +func Test_1() -> bool: + var json_string = "{\"Key\": false}" + var json = JSON.new() + var parse_result := json.parse(json_string) + if parse_result != OK: + return false + return true + + +func Test_2() -> String: + return '' diff --git a/Debug/Unit Testing/Scripts/json_parsing_tests.gd.uid b/Debug/Unit Testing/Scripts/json_parsing_tests.gd.uid new file mode 100644 index 0000000..d19ab00 --- /dev/null +++ b/Debug/Unit Testing/Scripts/json_parsing_tests.gd.uid @@ -0,0 +1 @@ +uid://xrexdmk7d1qx diff --git a/Debug/Unit Testing/json_parsing_tests.tscn b/Debug/Unit Testing/json_parsing_tests.tscn new file mode 100644 index 0000000..661f09e --- /dev/null +++ b/Debug/Unit Testing/json_parsing_tests.tscn @@ -0,0 +1,6 @@ +[gd_scene format=3 uid="uid://c23ct3b1nmih7"] + +[ext_resource type="Script" uid="uid://xrexdmk7d1qx" path="res://Debug/Unit Testing/Scripts/json_parsing_tests.gd" id="1_beu12"] + +[node name="JsonParsingTests" type="Node" unique_id=2014332517] +script = ExtResource("1_beu12") diff --git a/Debug/under_construction_block.tscn b/Debug/Utility Objects/under_construction_block.tscn similarity index 100% rename from Debug/under_construction_block.tscn rename to Debug/Utility Objects/under_construction_block.tscn diff --git a/Entities/Characters/Animals/Chicken/Scripts/npc_chicken.gd b/Entities/Characters/Animals/Chicken/Scripts/npc_chicken.gd index 0e7c199..0dde697 100644 --- a/Entities/Characters/Animals/Chicken/Scripts/npc_chicken.gd +++ b/Entities/Characters/Animals/Chicken/Scripts/npc_chicken.gd @@ -5,6 +5,10 @@ enum States { PECKING } +@export var minimum_pecking_schedule_gap := 8.0 +@export var maximum_pecking_schedule_gap := 25.0 +@export var should_log_pecking_schedule := false + @onready var animated_sprite_2d: AnimatedSprite2D = $AnimatedSprite2D var current_state := States.IDLE @@ -23,11 +27,12 @@ func _process(delta: float) -> void: animated_sprite_2d.play("pecking") await animated_sprite_2d.animation_finished animated_sprite_2d.play("idle") - pecking_sched = randf_range(8.0, 25.0) + pecking_sched = randf_range(minimum_pecking_schedule_gap, maximum_pecking_schedule_gap) pecking_timer = 0 current_state = States.IDLE _print_sched() func _print_sched() -> void: - print("%s Pecking Schedule: %f" % [name, pecking_sched]) + if should_log_pecking_schedule: + print("%s Pecking Schedule: %f" % [name, pecking_sched]) diff --git a/Entities/Map Objects/Chests/Scripts/Bases/chest_base.gd b/Entities/Map Objects/Chests/Scripts/Bases/chest_base.gd index 215736d..3aee472 100644 --- a/Entities/Map Objects/Chests/Scripts/Bases/chest_base.gd +++ b/Entities/Map Objects/Chests/Scripts/Bases/chest_base.gd @@ -1,6 +1,7 @@ extends StaticBody2D class_name BaseChest +signal ChestOpened signal OpeningAnimationStarted @export var is_open := false @@ -8,7 +9,12 @@ signal OpeningAnimationStarted # Public Methods func Open() -> void: is_open = true + ChestOpened.emit() func OpenAlreadyOpened() -> void: pass + + +func SetOpenedFromLoad() -> void: + is_open = true diff --git a/Entities/Map Objects/Chests/Scripts/item_chest_01.gd b/Entities/Map Objects/Chests/Scripts/item_chest_01.gd index 48a8e6d..6200fb6 100644 --- a/Entities/Map Objects/Chests/Scripts/item_chest_01.gd +++ b/Entities/Map Objects/Chests/Scripts/item_chest_01.gd @@ -27,6 +27,11 @@ func OpenAlreadyOpened() -> void: already_opened_message_dialogue_trigger.Trigger() +func SetOpenedFromLoad() -> void: + super.SetOpenedFromLoad() + chest_01_sprite.play("opened") + + # Private Methods func _ready() -> void: if is_open: diff --git a/Entities/Map Objects/Gates/Spike Gate/Scripts/spike_gate.gd b/Entities/Map Objects/Gates/Spike Gate/Scripts/spike_gate.gd index ba9a7e8..7e9de6c 100644 --- a/Entities/Map Objects/Gates/Spike Gate/Scripts/spike_gate.gd +++ b/Entities/Map Objects/Gates/Spike Gate/Scripts/spike_gate.gd @@ -1,5 +1,7 @@ extends StaticBody2D +signal Opened + @onready var sprite: AnimatedSprite2D = $AnimatedSprite2D @onready var collision_shape_2d: CollisionShape2D = $CollisionShape2D @@ -15,3 +17,5 @@ func OpenGate() -> void: collision_shape_2d.set_deferred("disabled", true) sprite.play("open") + + Opened.emit() diff --git a/Entities/Map Objects/Gates/Spike Gate/spike_gate.tscn b/Entities/Map Objects/Gates/Spike Gate/spike_gate.tscn index a069542..6d5fc63 100644 --- a/Entities/Map Objects/Gates/Spike Gate/spike_gate.tscn +++ b/Entities/Map Objects/Gates/Spike Gate/spike_gate.tscn @@ -395,6 +395,6 @@ shape = SubResource("RectangleShape2D_5ttkm") y_sort_enabled = true position = Vector2(0, 15) sprite_frames = SubResource("SpriteFrames_pki7h") -animation = &"closed" +animation = &"open" autoplay = "closed" offset = Vector2(0, -15) diff --git a/Entities/Map Objects/Trees/Effects/Scripts/leaf_spawner.gd b/Entities/Map Objects/Trees/Effects/Scripts/leaf_spawner.gd index 64da718..61e446c 100644 --- a/Entities/Map Objects/Trees/Effects/Scripts/leaf_spawner.gd +++ b/Entities/Map Objects/Trees/Effects/Scripts/leaf_spawner.gd @@ -4,6 +4,9 @@ extends Node2D @export var spawn_markers: Node2D @export var destination_markers: Node2D +# Debug +@export var should_log_schedule := false + @export_range(0.0, 60.0) var minimum_schedule_gap := 20.0 @export_range(1.0, 61.0) var maximum_schedule_gap := 60.0 @@ -25,7 +28,8 @@ func _ready() -> void: # At spawn, we might want to spawn some leaves sooner... _spawn_schedule -= randf_range(0.0, _spawn_schedule) _spawn_schedule = max(0, _spawn_schedule) - print("%s - Leaf Spawn Schedule: %f" % [get_parent().name, _spawn_schedule]) + + _log_schedule() func _process(delta: float) -> void: @@ -33,6 +37,7 @@ func _process(delta: float) -> void: if _spawn_timer >= _spawn_schedule: _spawn_timer = 0.0 _set_random_spawn_schedule() + _log_schedule() var spawn := _get_random_spawn_point() var destination := _get_random_destination_point() @@ -76,3 +81,8 @@ func _get_random_destination_point() -> Vector2: var offset := Vector2(randf_range(-5.0, 5.0), randf_range(-5.0, 5.0)) return marker.position + offset + + +func _log_schedule() -> void: + if should_log_schedule: + print("%s - Leaf Spawn Schedule: %f" % [get_parent().name, _spawn_schedule]) diff --git a/Game Icon.png b/Game Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e76724d2db88ca17000cd6d3c4619616a0f3339d GIT binary patch literal 16316 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 literal 0 HcmV?d00001 diff --git a/Game Icon.png.import b/Game Icon.png.import new file mode 100644 index 0000000..571b2b4 --- /dev/null +++ b/Game Icon.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ckbsqf4p5xu44" +path="res://.godot/imported/Game Icon.png-1ecac6caff9b7691e845293f1a955d2a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Game Icon.png" +dest_files=["res://.godot/imported/Game Icon.png-1ecac6caff9b7691e845293f1a955d2a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Maps/Forest Dungeon Entrance/path_to_dungeon_01.tscn b/Maps/Forest Dungeon Entrance/path_to_dungeon_01.tscn index 9fee71a..7b14875 100644 --- a/Maps/Forest Dungeon Entrance/path_to_dungeon_01.tscn +++ b/Maps/Forest Dungeon Entrance/path_to_dungeon_01.tscn @@ -11,6 +11,8 @@ [ext_resource type="PackedScene" uid="uid://byp273amg5ji8" path="res://Entities/Map Objects/Chests/Item Chests/item_chest_01 (Wooden).tscn" id="5_bnsbe"] [ext_resource type="Texture2D" uid="uid://bf6llktwqhs8l" path="res://Assets/Sprites/Door Fade.png" id="5_jett5"] [ext_resource type="PackedScene" uid="uid://did853bh5xeic" path="res://Maps/Connectors/spawn_marker_connector.tscn" id="5_lphfo"] +[ext_resource type="PackedScene" uid="uid://w4mh31se58f4" path="res://Persistence/Connectors/chest_persistence_connector.tscn" id="6_l5trr"] +[ext_resource type="PackedScene" uid="uid://c5ymu08jotbfp" path="res://Persistence/Connectors/gate_persistence_connector.tscn" id="7_0w1de"] [ext_resource type="PackedScene" uid="uid://be6xfndyj4ckx" path="res://Entities/Map Objects/Trees/tree_02.tscn" id="7_ycf72"] [ext_resource type="PackedScene" uid="uid://cc3qat6un2323" path="res://Entities/Map Objects/Trees/tree_01.tscn" id="8_yab5j"] [ext_resource type="PackedScene" uid="uid://bcx1d8kvp7o0h" path="res://Entities/Map Objects/Trees/tree_03.tscn" id="9_lwurn"] @@ -25,7 +27,7 @@ [ext_resource type="PackedScene" uid="uid://coaf2ndwb6h61" path="res://Entities/Map Objects/Decorative/Signs/wooden_sign_02.tscn" id="19_jtncl"] [ext_resource type="PackedScene" uid="uid://cla2d3gii8qda" path="res://Entities/Map Objects/Loading Zone/interactive_loading_zone.tscn" id="20_c5vrl"] [ext_resource type="PackedScene" uid="uid://b60nr4wfvijpf" path="res://Entities/Map Objects/Dialogue/dialogue_trigger.tscn" id="20_x6da4"] -[ext_resource type="PackedScene" uid="uid://c7rjjlamkqhnw" path="res://Debug/under_construction_block.tscn" id="26_4lnhp"] +[ext_resource type="PackedScene" uid="uid://c7rjjlamkqhnw" path="res://Debug/Utility Objects/under_construction_block.tscn" id="26_4lnhp"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_lwurn"] size = Vector2(768, 494) @@ -63,25 +65,33 @@ size = Vector2(10, 7) [node name="Map 01" type="Node2D" unique_id=411453136] y_sort_enabled = true -[node name="Connectors" type="Node" parent="." unique_id=1365901208] +[node name="Map Connectors" type="Node" parent="." unique_id=1365901208] -[node name="Chest Interaction Connector" parent="Connectors" unique_id=625804018 node_paths=PackedStringArray("player") instance=ExtResource("1_jtncl")] +[node name="Chest Interaction Connector" parent="Map Connectors" unique_id=625804018 node_paths=PackedStringArray("player") instance=ExtResource("1_jtncl")] player = NodePath("../../Player") -[node name="Arrow Spawner" parent="Connectors" unique_id=627092886 node_paths=PackedStringArray("player", "arrow_parent") instance=ExtResource("2_jtncl")] +[node name="Arrow Spawner" parent="Map Connectors" unique_id=627092886 node_paths=PackedStringArray("player", "arrow_parent") instance=ExtResource("2_jtncl")] player = NodePath("../../Player") arrow_parent = NodePath("../../Objects/Projectiles") -[node name="Bench Interaction Connector" parent="Connectors" unique_id=541204437 node_paths=PackedStringArray("player") instance=ExtResource("3_x6da4")] +[node name="Bench Interaction Connector" parent="Map Connectors" unique_id=541204437 node_paths=PackedStringArray("player") instance=ExtResource("3_x6da4")] player = NodePath("../../Player") -[node name="Interactive Loading Zone Connector" parent="Connectors" unique_id=833475826 node_paths=PackedStringArray("player") instance=ExtResource("4_4lnhp")] +[node name="Interactive Loading Zone Connector" parent="Map Connectors" unique_id=833475826 node_paths=PackedStringArray("player") instance=ExtResource("4_4lnhp")] player = NodePath("../../Player") -[node name="Spawn Marker Connector" parent="Connectors" unique_id=807187299 node_paths=PackedStringArray("player", "markers") instance=ExtResource("5_lphfo")] +[node name="Spawn Marker Connector" parent="Map Connectors" unique_id=807187299 node_paths=PackedStringArray("player", "markers") instance=ExtResource("5_lphfo")] player = NodePath("../../Player") markers = NodePath("../../Spawn Markers") +[node name="Persistence Connectors" type="Node" parent="." unique_id=1245900932] + +[node name="Chest Persistence Connector" parent="Persistence Connectors" unique_id=281805027 instance=ExtResource("6_l5trr")] +chests = Array[NodePath]([NodePath("../../Objects/Chests/Item Chest 01 - 1"), NodePath("../../Objects/Chests/Item Chest 01 - 2"), NodePath("../../Objects/Chests/Item Chest 01 - 3")]) + +[node name="GatePersistenceConnector" parent="Persistence Connectors" unique_id=1082904286 instance=ExtResource("7_0w1de")] +gates = Array[NodePath]([NodePath("../../Objects/Spike Gate"), NodePath("../../Objects/Spike Gate2")]) + [node name="Camera Limit Connector" type="Area2D" parent="." unique_id=1290795384 node_paths=PackedStringArray("camera_to_limit")] collision_layer = 0 collision_mask = 0 @@ -340,7 +350,7 @@ destination_marker_name = "Entrance" position = Vector2(278, 474) [node name="Player" parent="." unique_id=1502234578 instance=ExtResource("4_4igim")] -position = Vector2(89, 450) +position = Vector2(656, 498) [node name="Camera2D" type="Camera2D" parent="Player" unique_id=1115720225] position = Vector2(0, 1) @@ -385,7 +395,7 @@ position = Vector2(760, 312) [node name="Under Construction Block12" parent="Debug" unique_id=1005752992 instance=ExtResource("26_4lnhp")] position = Vector2(760, 328) -[connection signal="SitOnBenchTriggered" from="Connectors/Bench Interaction Connector" to="Player" method="OnSitOnFurnitureTriggered"] +[connection signal="SitOnBenchTriggered" from="Map Connectors/Bench Interaction Connector" to="Player" method="OnSitOnFurnitureTriggered"] [connection signal="TargetHit" from="Objects/ArrowTarget" to="Objects/Spike Gate" method="OpenGate"] [connection signal="TargetHit" from="Objects/ArrowTarget" to="Objects/Spike Gate2" method="OpenGate"] [connection signal="PressurePlateTripped" from="Objects/PressurePlate" to="Objects/Spike Gate" method="OpenGate"] diff --git a/Persistence/Connectors/Scripts/chest_persistence_connector.gd b/Persistence/Connectors/Scripts/chest_persistence_connector.gd new file mode 100644 index 0000000..ff306d7 --- /dev/null +++ b/Persistence/Connectors/Scripts/chest_persistence_connector.gd @@ -0,0 +1,21 @@ +extends Node + +@export var chests: Array[NodePath] + +# Private Methods +func _ready() -> void: + for relative_node_path in chests: + var chest: BaseChest = get_node(relative_node_path) + var node_path := chest.get_path() + chest.ChestOpened.connect(func(): _on_chest_opened(chest)) + + if PersistenceManager.HasData(node_path): + var chest_opened: bool = PersistenceManager.GetData(node_path) + if chest_opened: + chest.call_deferred("SetOpenedFromLoad") + + +func _on_chest_opened(chest: BaseChest) -> void: + var node_path := chest.get_path() + PersistenceManager.UpdateData(node_path, true) + PersistenceManager.SaveToDisk() diff --git a/Persistence/Connectors/Scripts/chest_persistence_connector.gd.uid b/Persistence/Connectors/Scripts/chest_persistence_connector.gd.uid new file mode 100644 index 0000000..69a3c3c --- /dev/null +++ b/Persistence/Connectors/Scripts/chest_persistence_connector.gd.uid @@ -0,0 +1 @@ +uid://75g2fysjrqji diff --git a/Persistence/Connectors/Scripts/gate_persistence_connector.gd b/Persistence/Connectors/Scripts/gate_persistence_connector.gd new file mode 100644 index 0000000..3769aed --- /dev/null +++ b/Persistence/Connectors/Scripts/gate_persistence_connector.gd @@ -0,0 +1,40 @@ +extends Node + +@export var gates: Array[NodePath] + +# Private Methods +func _ready() -> void: + for node_path in gates: + _handle_spike_gate(node_path) + + +func _handle_spike_gate(node_path: NodePath) -> bool: + var node := get_node(node_path) + node_path = node.get_path() + if not node.name.begins_with("Spike Gate"): + return false + + # Connect Signal + node.connect("Opened", func(): _on_spike_gate_opened(node)) + + if not PersistenceManager.HasData(node_path): + return true + + var is_open: bool = PersistenceManager.GetData(node_path) + if not is_open: + return true + + var collision_shape: CollisionShape2D = node.get_node("CollisionShape2D") + var animated_sprite: AnimatedSprite2D = node.get_node("AnimatedSprite2D") + + node.set_deferred("is_open", true) + collision_shape.set_deferred("disabled", true) + animated_sprite.call_deferred("play", "open") + + return true + + +func _on_spike_gate_opened(node: Node) -> void: + var path := node.get_path() + PersistenceManager.UpdateData(path, true) + PersistenceManager.SaveToDisk() diff --git a/Persistence/Connectors/Scripts/gate_persistence_connector.gd.uid b/Persistence/Connectors/Scripts/gate_persistence_connector.gd.uid new file mode 100644 index 0000000..b048cfd --- /dev/null +++ b/Persistence/Connectors/Scripts/gate_persistence_connector.gd.uid @@ -0,0 +1 @@ +uid://brsiegtrne15y diff --git a/Persistence/Connectors/chest_persistence_connector.tscn b/Persistence/Connectors/chest_persistence_connector.tscn new file mode 100644 index 0000000..f52da8e --- /dev/null +++ b/Persistence/Connectors/chest_persistence_connector.tscn @@ -0,0 +1,6 @@ +[gd_scene format=3 uid="uid://w4mh31se58f4"] + +[ext_resource type="Script" uid="uid://75g2fysjrqji" path="res://Persistence/Connectors/Scripts/chest_persistence_connector.gd" id="1_hytou"] + +[node name="Chest Persistence Connector" type="Node" unique_id=281805027] +script = ExtResource("1_hytou") diff --git a/Persistence/Connectors/gate_persistence_connector.tscn b/Persistence/Connectors/gate_persistence_connector.tscn new file mode 100644 index 0000000..69aa900 --- /dev/null +++ b/Persistence/Connectors/gate_persistence_connector.tscn @@ -0,0 +1,6 @@ +[gd_scene format=3 uid="uid://c5ymu08jotbfp"] + +[ext_resource type="Script" uid="uid://brsiegtrne15y" path="res://Persistence/Connectors/Scripts/gate_persistence_connector.gd" id="1_0smsr"] + +[node name="GatePersistenceConnector" type="Node" unique_id=1082904286] +script = ExtResource("1_0smsr") diff --git a/Persistence/persistence_manager.gd b/Persistence/persistence_manager.gd new file mode 100644 index 0000000..5421910 --- /dev/null +++ b/Persistence/persistence_manager.gd @@ -0,0 +1,51 @@ +extends Node + +var _save_dictionary: Dictionary[NodePath, Variant] = {} + +# Public Methods +func UpdateData(node_path: NodePath, value: Variant) -> void: + _save_dictionary[node_path] = value + + +func GetData(node_path: NodePath) -> Variant: + if not _save_dictionary.has(node_path): + return null + return _save_dictionary[node_path] + + +func HasData(node_path: NodePath) -> bool: + return _save_dictionary.has(node_path) + + +func SaveToDisk() -> void: + var save_file := FileAccess.open("user://savegame.save", FileAccess.WRITE) + var json := JSON.stringify(_save_dictionary) + + save_file.store_line(json) + + +func LoadFromDisk() -> void: + if not FileAccess.file_exists("user://savegame.save"): + return + var save_file = FileAccess.open("user://savegame.save", FileAccess.READ) + print("Loading save file from path: %s" % save_file.get_path_absolute()) + var line := save_file.get_line() + var json = JSON.new() + var parse_result := json.parse(line) + if parse_result != OK: + print("Parsing result when loading file: [%s] in %s at line %d" % [json.get_error_message(), line, json.get_error_line()]) + return + + var data_dict: Dictionary = json.data + var node_dict: Dictionary[NodePath, Variant] + for key in data_dict: + var value: Variant = data_dict[key] + var node_path := NodePath(key) + node_dict[node_path] = value + + _save_dictionary = node_dict + + +# Private Methods +func _ready() -> void: + LoadFromDisk() diff --git a/Persistence/persistence_manager.gd.uid b/Persistence/persistence_manager.gd.uid new file mode 100644 index 0000000..0bad277 --- /dev/null +++ b/Persistence/persistence_manager.gd.uid @@ -0,0 +1 @@ +uid://dl2kg1qu0ymi7 diff --git a/project.godot b/project.godot index 9b4c1a9..b71a6a5 100644 --- a/project.godot +++ b/project.godot @@ -11,10 +11,10 @@ config_version=5 [application] config/name="Archipelago Game" -config/version="beta-1.3" +config/version="beta-1.4" run/main_scene="uid://dqgxg3i307lvr" config/features=PackedStringArray("4.6", "Forward Plus") -config/icon="res://icon.svg" +config/icon="uid://ckbsqf4p5xu44" [autoload] @@ -23,6 +23,7 @@ GameManager="*uid://cb4tuxriixfqs" GroupUtils="*uid://bk7o4drbfh24p" MapLoader="*uid://c4jogxtdi3m13" InputManager="*uid://dnbg1dpjcq6vk" +PersistenceManager="*uid://dl2kg1qu0ymi7" [dotnet] @@ -37,6 +38,7 @@ folder_colors={ "res://Global Managers/": "red", "res://Main/": "gray", "res://Maps/": "green", +"res://Persistence/": "blue", "res://Resources/": "orange", "res://Scripts/": "red", "res://UI/": "yellow"