diff --git a/metroidvania/Levels/Level_99.gd b/metroidvania/Levels/Level_99.gd index 084073b..98737f7 100644 --- a/metroidvania/Levels/Level_99.gd +++ b/metroidvania/Levels/Level_99.gd @@ -11,7 +11,8 @@ func set_door_lock(value): DoorLock.set_collision_mask_bit(PLAYER_BIT, value) func _on_Trigger_triggered(): - set_door_lock(true) + if not SaverLoader.custom_data.boss_defeated: + set_door_lock(true) func _on_BossEnemy_died(): set_door_lock(false) diff --git a/metroidvania/SaverLoader.gd b/metroidvania/SaverLoader.gd index 989d357..6ca0cbe 100644 --- a/metroidvania/SaverLoader.gd +++ b/metroidvania/SaverLoader.gd @@ -3,12 +3,20 @@ extends Node const save_path = "user://savegame.save" var is_loading = false +var custom_data = { # Defaults + "boss_defeated": false, + "missiles": 0, + "missiles_unlocked": false, + "health": 4, +} func save_game(): - print("Saving game") var save_game = File.new() save_game.open(save_path, File.WRITE) var persistingNodes = get_tree().get_nodes_in_group("Persists") + + save_game.store_line(to_json(custom_data)) + for node in persistingNodes: var nodeData = node.save() save_game.store_line(to_json(nodeData)) @@ -25,6 +33,10 @@ func load_game(): node.queue_free() save_game.open(save_path, File.READ) + + if not save_game.eof_reached(): + custom_data = parse_json(save_game.get_line()) + while not save_game.eof_reached(): var current_line = save_game.get_line() if current_line == "": diff --git a/metroidvania/Scenes/Enemies/BossEnemy.gd b/metroidvania/Scenes/Enemies/BossEnemy.gd index 0c7a23b..2942635 100644 --- a/metroidvania/Scenes/Enemies/BossEnemy.gd +++ b/metroidvania/Scenes/Enemies/BossEnemy.gd @@ -9,6 +9,11 @@ export (int) var ACCELERATION = 70 onready var rightWallCheck = $RightWallCheck onready var leftWallCheck = $LeftWallCheck +func _ready(): + ._ready() + if SaverLoader.custom_data.boss_defeated: + self.queue_free() + func _process(delta): chase_player(delta) @@ -35,3 +40,8 @@ func fire_bullet() -> void: func _on_Timer_timeout(): fire_bullet() + + +func _on_BossEnemy_died(): + SaverLoader.custom_data.boss_defeated = true + self.queue_free() diff --git a/metroidvania/Scenes/Enemies/BossEnemy.tscn b/metroidvania/Scenes/Enemies/BossEnemy.tscn index 3766367..01462d3 100644 --- a/metroidvania/Scenes/Enemies/BossEnemy.tscn +++ b/metroidvania/Scenes/Enemies/BossEnemy.tscn @@ -1023,6 +1023,7 @@ collision_mask = 2 wait_time = 0.3 autostart = true +[connection signal="died" from="." to="." method="_on_BossEnemy_died"] [connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"] [editable path="Hurtbox"] diff --git a/metroidvania/Scenes/Objects/SaveStation.gd b/metroidvania/Scenes/Objects/SaveStation.gd index 8357fa5..e321070 100644 --- a/metroidvania/Scenes/Objects/SaveStation.gd +++ b/metroidvania/Scenes/Objects/SaveStation.gd @@ -1,8 +1,11 @@ extends StaticBody2D +var PlayerStats = ResourceLoader.PlayerStats + onready var animation = $Animation func _on_SaveArea_body_entered(_body): print(_body) + # PlayerStats.set_max_health() animation.play("Save") SaverLoader.save_game() diff --git a/metroidvania/Scenes/Player/Player.gd b/metroidvania/Scenes/Player/Player.gd index 124bd20..17b9b17 100644 --- a/metroidvania/Scenes/Player/Player.gd +++ b/metroidvania/Scenes/Player/Player.gd @@ -50,6 +50,9 @@ func set_invincible(value): func _ready(): PlayerStats.connect("player_died", self, "_on_died") + PlayerStats.health = SaverLoader.custom_data.health + PlayerStats.missiles_unlocked = SaverLoader.custom_data.missiles_unlocked + PlayerStats.missiles = SaverLoader.custom_data.missiles MainInstances.Player = self call_deferred("assign_world_camera") @@ -261,6 +264,7 @@ func _on_Hurtbox_hit(damage): if not invincible: PlayerStats.health -= damage blinkAnimator.play("Blink") + SaverLoader.custom_data.health = PlayerStats.health func _on_died(): queue_free() diff --git a/metroidvania/Scenes/Player/PlayerStats.gd b/metroidvania/Scenes/Player/PlayerStats.gd index f217254..2000213 100644 --- a/metroidvania/Scenes/Player/PlayerStats.gd +++ b/metroidvania/Scenes/Player/PlayerStats.gd @@ -22,10 +22,15 @@ func set_health(value): if health == 0: emit_signal("player_died") +func set_max_health(): + set_health(max_health) + func set_missiles(value): missiles = clamp(value, 0, max_missiles) + SaverLoader.custom_data.missiles = missiles emit_signal("player_missiles_changed", missiles) func set_missiles_unlocked(value): missiles_unlocked = value + SaverLoader.custom_data.missiles_unlocked = value emit_signal("player_missiles_unlocked", value) diff --git a/metroidvania/Scenes/UI/MissilesUI.gd b/metroidvania/Scenes/UI/MissilesUI.gd index 7f556a8..884d293 100644 --- a/metroidvania/Scenes/UI/MissilesUI.gd +++ b/metroidvania/Scenes/UI/MissilesUI.gd @@ -9,7 +9,7 @@ func _ready(): PlayerStats.connect("player_missiles_unlocked", self, "_on_player_missiles_unlocked") func _on_player_missiles_changed(value): - label.text = str(value) + label.text = str(value) + "/" + str(PlayerStats.max_missiles) func _on_player_missiles_unlocked(value): visible = value diff --git a/metroidvania/project.godot b/metroidvania/project.godot index 1814253..f7d2a01 100644 --- a/metroidvania/project.godot +++ b/metroidvania/project.godot @@ -53,6 +53,10 @@ window/size/test_height=720 window/stretch/mode="2d" window/stretch/aspect="keep" +[global] + +editor=false + [importer_defaults] texture={