SaveStation, save & load properly
This commit is contained in:
parent
d4acde846c
commit
847670821d
|
@ -6,3 +6,13 @@ func _ready():
|
||||||
var parent = get_parent()
|
var parent = get_parent()
|
||||||
if parent is WORLD:
|
if parent is WORLD:
|
||||||
parent.currentLevel = self
|
parent.currentLevel = self
|
||||||
|
|
||||||
|
|
||||||
|
func save():
|
||||||
|
var data = {
|
||||||
|
"filename": get_filename(),
|
||||||
|
"parent": get_parent().get_path(),
|
||||||
|
"position_x": position.x,
|
||||||
|
"position_y": position.y
|
||||||
|
}
|
||||||
|
return data
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
[ext_resource path="res://Levels/Level.gd" type="Script" id=1]
|
[ext_resource path="res://Levels/Level.gd" type="Script" id=1]
|
||||||
[ext_resource path="res://Scenes/TileMap.tscn" type="PackedScene" id=2]
|
[ext_resource path="res://Scenes/TileMap.tscn" type="PackedScene" id=2]
|
||||||
|
|
||||||
[node name="Level" type="Node2D"]
|
[node name="Level" type="Node2D" groups=[
|
||||||
|
"Persists",
|
||||||
|
]]
|
||||||
script = ExtResource( 1 )
|
script = ExtResource( 1 )
|
||||||
|
|
||||||
[node name="TileMap" parent="." instance=ExtResource( 2 )]
|
[node name="TileMap" parent="." instance=ExtResource( 2 )]
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
[gd_scene load_steps=4 format=2]
|
[gd_scene load_steps=5 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://Levels/Level.tscn" type="PackedScene" id=1]
|
[ext_resource path="res://Levels/Level.tscn" type="PackedScene" id=1]
|
||||||
[ext_resource path="res://Levels/Door.tscn" type="PackedScene" id=2]
|
[ext_resource path="res://Levels/Door.tscn" type="PackedScene" id=2]
|
||||||
[ext_resource path="res://Levels/DoorConnections/00_link_01.tres" type="Resource" id=3]
|
[ext_resource path="res://Levels/DoorConnections/00_link_01.tres" type="Resource" id=3]
|
||||||
|
[ext_resource path="res://Scenes/Objects/SaveStation.tscn" type="PackedScene" id=4]
|
||||||
|
|
||||||
[node name="Level_00" instance=ExtResource( 1 )]
|
[node name="Level_00" instance=ExtResource( 1 )]
|
||||||
|
|
||||||
|
@ -13,3 +14,7 @@ tile_data = PoolIntArray( 0, 0, 4, 1, 0, 196609, 2, 0, 196609, 3, 0, 196609, 4,
|
||||||
position = Vector2( 312, 144 )
|
position = Vector2( 312, 144 )
|
||||||
connection = ExtResource( 3 )
|
connection = ExtResource( 3 )
|
||||||
new_level_path = "res://Levels/Level_01.tscn"
|
new_level_path = "res://Levels/Level_01.tscn"
|
||||||
|
|
||||||
|
[node name="SaveStation" parent="." index="2" instance=ExtResource( 4 )]
|
||||||
|
position = Vector2( 215, 160 )
|
||||||
|
scale = Vector2( 0.998604, 1 )
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
[gd_scene load_steps=6 format=2]
|
[gd_scene load_steps=7 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://Levels/Door.tscn" type="PackedScene" id=1]
|
[ext_resource path="res://Levels/Door.tscn" type="PackedScene" id=1]
|
||||||
[ext_resource path="res://Levels/Level.tscn" type="PackedScene" id=2]
|
[ext_resource path="res://Levels/Level.tscn" type="PackedScene" id=2]
|
||||||
[ext_resource path="res://Levels/DoorConnections/00_link_01.tres" type="Resource" id=3]
|
[ext_resource path="res://Levels/DoorConnections/00_link_01.tres" type="Resource" id=3]
|
||||||
[ext_resource path="res://Levels/DoorConnections/01_99.tres" type="Resource" id=4]
|
[ext_resource path="res://Levels/DoorConnections/01_99.tres" type="Resource" id=4]
|
||||||
[ext_resource path="res://Scenes/Player/MissilesPowerup.tscn" type="PackedScene" id=5]
|
[ext_resource path="res://Scenes/Player/MissilesPowerup.tscn" type="PackedScene" id=5]
|
||||||
|
[ext_resource path="res://Scenes/Objects/SaveStation.tscn" type="PackedScene" id=6]
|
||||||
|
|
||||||
[node name="Level_01" instance=ExtResource( 2 )]
|
[node name="Level_01" instance=ExtResource( 2 )]
|
||||||
|
|
||||||
|
@ -16,6 +17,9 @@ position = Vector2( 88, 144 )
|
||||||
connection = ExtResource( 4 )
|
connection = ExtResource( 4 )
|
||||||
new_level_path = "res://Levels/Level_99.tscn"
|
new_level_path = "res://Levels/Level_99.tscn"
|
||||||
|
|
||||||
|
[node name="SaveStation" parent="OutDoor" index="2" instance=ExtResource( 6 )]
|
||||||
|
position = Vector2( -26, 16 )
|
||||||
|
|
||||||
[node name="InDoor" parent="." index="2" instance=ExtResource( 1 )]
|
[node name="InDoor" parent="." index="2" instance=ExtResource( 1 )]
|
||||||
position = Vector2( 8, 144 )
|
position = Vector2( 8, 144 )
|
||||||
scale = Vector2( -1, 1 )
|
scale = Vector2( -1, 1 )
|
||||||
|
@ -23,4 +27,4 @@ connection = ExtResource( 3 )
|
||||||
new_level_path = "res://Levels/Level_00.tscn"
|
new_level_path = "res://Levels/Level_00.tscn"
|
||||||
|
|
||||||
[node name="MissilesPowerup" parent="." index="3" instance=ExtResource( 5 )]
|
[node name="MissilesPowerup" parent="." index="3" instance=ExtResource( 5 )]
|
||||||
position = Vector2( 47, 146 )
|
position = Vector2( 25, 146 )
|
||||||
|
|
|
@ -2,6 +2,8 @@ extends Node
|
||||||
|
|
||||||
const save_path = "user://savegame.save"
|
const save_path = "user://savegame.save"
|
||||||
|
|
||||||
|
var is_loading = false
|
||||||
|
|
||||||
func save_game():
|
func save_game():
|
||||||
var save_game = File.new()
|
var save_game = File.new()
|
||||||
save_game.open(save_path, File.WRITE)
|
save_game.open(save_path, File.WRITE)
|
||||||
|
@ -23,7 +25,10 @@ func load_game():
|
||||||
|
|
||||||
save_game.open(save_path, File.READ)
|
save_game.open(save_path, File.READ)
|
||||||
while not save_game.eof_reached():
|
while not save_game.eof_reached():
|
||||||
var current_line = parse_json(save_game.get_line())
|
var current_line = save_game.get_line()
|
||||||
|
if current_line == "":
|
||||||
|
continue
|
||||||
|
current_line = parse_json(current_line)
|
||||||
if current_line != null:
|
if current_line != null:
|
||||||
var newNode = load(current_line["filename"]).instance()
|
var newNode = load(current_line["filename"]).instance()
|
||||||
get_node(current_line["parent"]).add_child(newNode, true)
|
get_node(current_line["parent"]).add_child(newNode, true)
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
extends StaticBody2D
|
||||||
|
|
||||||
|
onready var animation = $Animation
|
||||||
|
|
||||||
|
func _on_SaveArea_body_entered(body):
|
||||||
|
animation.play("Save")
|
||||||
|
SaverLoader.save_game()
|
|
@ -0,0 +1,64 @@
|
||||||
|
[gd_scene load_steps=6 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://Assets/World/SaveStation.png" type="Texture" id=1]
|
||||||
|
[ext_resource path="res://Scenes/Objects/SaveStation.gd" type="Script" id=2]
|
||||||
|
[ext_resource path="res://Assets/UI/WhiteSquare.png" type="Texture" id=3]
|
||||||
|
|
||||||
|
[sub_resource type="RectangleShape2D" id=1]
|
||||||
|
extents = Vector2( 8, 10 )
|
||||||
|
|
||||||
|
[sub_resource type="Animation" id=2]
|
||||||
|
resource_name = "Save"
|
||||||
|
length = 0.5
|
||||||
|
step = 0.05
|
||||||
|
tracks/0/type = "value"
|
||||||
|
tracks/0/path = NodePath("WhiteSpaceSprite:scale")
|
||||||
|
tracks/0/interp = 1
|
||||||
|
tracks/0/loop_wrap = true
|
||||||
|
tracks/0/imported = false
|
||||||
|
tracks/0/enabled = false
|
||||||
|
tracks/0/keys = {
|
||||||
|
"times": PoolRealArray( 0, 0.25, 0.5 ),
|
||||||
|
"transitions": PoolRealArray( 1, 1, 1 ),
|
||||||
|
"update": 0,
|
||||||
|
"values": [ Vector2( 1e-05, 1.25 ), Vector2( 1, 1.25 ), Vector2( 1e-05, 1.25 ) ]
|
||||||
|
}
|
||||||
|
tracks/1/type = "value"
|
||||||
|
tracks/1/path = NodePath("WhiteSpaceSprite:position")
|
||||||
|
tracks/1/interp = 1
|
||||||
|
tracks/1/loop_wrap = true
|
||||||
|
tracks/1/imported = false
|
||||||
|
tracks/1/enabled = true
|
||||||
|
tracks/1/keys = {
|
||||||
|
"times": PoolRealArray( 0, 0.5 ),
|
||||||
|
"transitions": PoolRealArray( 1, 1 ),
|
||||||
|
"update": 0,
|
||||||
|
"values": [ Vector2( 0, -25 ), Vector2( 0, -3 ) ]
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="SaveStation" type="StaticBody2D"]
|
||||||
|
script = ExtResource( 2 )
|
||||||
|
|
||||||
|
[node name="WhiteSpaceSprite" type="Sprite" parent="."]
|
||||||
|
position = Vector2( 0, -25 )
|
||||||
|
scale = Vector2( 1, 0.0625 )
|
||||||
|
texture = ExtResource( 3 )
|
||||||
|
|
||||||
|
[node name="Sprite" type="Sprite" parent="."]
|
||||||
|
position = Vector2( 0, -24 )
|
||||||
|
texture = ExtResource( 1 )
|
||||||
|
|
||||||
|
[node name="Collider" type="CollisionPolygon2D" parent="."]
|
||||||
|
polygon = PoolVector2Array( -13, 0, -9, -4, 9, -4, 13, 0 )
|
||||||
|
|
||||||
|
[node name="SaveArea" type="Area2D" parent="."]
|
||||||
|
collision_layer = 0
|
||||||
|
|
||||||
|
[node name="Collider" type="CollisionShape2D" parent="SaveArea"]
|
||||||
|
position = Vector2( 0, -14 )
|
||||||
|
shape = SubResource( 1 )
|
||||||
|
|
||||||
|
[node name="Animation" type="AnimationPlayer" parent="."]
|
||||||
|
anims/Save = SubResource( 2 )
|
||||||
|
|
||||||
|
[connection signal="body_entered" from="SaveArea" to="." method="_on_SaveArea_body_entered"]
|
|
@ -9,6 +9,7 @@ extents = Vector2( 8, 8 )
|
||||||
[node name="Spikes" type="Node2D"]
|
[node name="Spikes" type="Node2D"]
|
||||||
|
|
||||||
[node name="Sprite" type="Sprite" parent="."]
|
[node name="Sprite" type="Sprite" parent="."]
|
||||||
|
z_index = 20
|
||||||
texture = ExtResource( 1 )
|
texture = ExtResource( 1 )
|
||||||
centered = false
|
centered = false
|
||||||
|
|
||||||
|
|
|
@ -40,6 +40,7 @@ onready var muzzle = $Sprite/PlayerGun/Sprite/Muzzle
|
||||||
onready var fireBulletTimer = $FireBulletTimer
|
onready var fireBulletTimer = $FireBulletTimer
|
||||||
onready var blinkAnimator = $BlinkAnimator
|
onready var blinkAnimator = $BlinkAnimator
|
||||||
onready var powerupDetector = $PowerupDetector
|
onready var powerupDetector = $PowerupDetector
|
||||||
|
onready var cameraFollow = $CameraFollow
|
||||||
|
|
||||||
signal hit_door(door)
|
signal hit_door(door)
|
||||||
|
|
||||||
|
@ -50,6 +51,10 @@ func set_invincible(value):
|
||||||
func _ready():
|
func _ready():
|
||||||
PlayerStats.connect("player_died", self, "_on_died")
|
PlayerStats.connect("player_died", self, "_on_died")
|
||||||
MainInstances.Player = self
|
MainInstances.Player = self
|
||||||
|
call_deferred("assign_world_camera")
|
||||||
|
|
||||||
|
func assign_world_camera():
|
||||||
|
cameraFollow.remote_path = MainInstances.WorldCamera.get_path()
|
||||||
|
|
||||||
func _exit_tree():
|
func _exit_tree():
|
||||||
MainInstances.Player = null
|
MainInstances.Player = null
|
||||||
|
|
|
@ -130,6 +130,7 @@ script = ExtResource( 2 )
|
||||||
|
|
||||||
[node name="Sprite" type="Sprite" parent="."]
|
[node name="Sprite" type="Sprite" parent="."]
|
||||||
position = Vector2( 0, -12 )
|
position = Vector2( 0, -12 )
|
||||||
|
z_index = 10
|
||||||
texture = ExtResource( 1 )
|
texture = ExtResource( 1 )
|
||||||
hframes = 12
|
hframes = 12
|
||||||
frame = 11
|
frame = 11
|
||||||
|
|
|
@ -41,6 +41,7 @@ margin_right = 56.0
|
||||||
margin_bottom = 56.0
|
margin_bottom = 56.0
|
||||||
rect_min_size = Vector2( 56, 16 )
|
rect_min_size = Vector2( 56, 16 )
|
||||||
text = "Quit"
|
text = "Quit"
|
||||||
|
|
||||||
[connection signal="pressed" from="CenterContainer/VBoxContainer/StartButton" to="." method="_on_StartButton_pressed"]
|
[connection signal="pressed" from="CenterContainer/VBoxContainer/StartButton" to="." method="_on_StartButton_pressed"]
|
||||||
[connection signal="pressed" from="CenterContainer/VBoxContainer/LoadButton" to="." method="_on_LoadButton_pressed"]
|
[connection signal="pressed" from="CenterContainer/VBoxContainer/LoadButton" to="." method="_on_LoadButton_pressed"]
|
||||||
[connection signal="pressed" from="CenterContainer/VBoxContainer/QuitButton" to="." method="_on_QuitButton_pressed"]
|
[connection signal="pressed" from="CenterContainer/VBoxContainer/QuitButton" to="." method="_on_QuitButton_pressed"]
|
||||||
|
|
|
@ -1,11 +1,17 @@
|
||||||
extends Camera2D
|
extends Camera2D
|
||||||
|
|
||||||
|
var MainInstances = ResourceLoader.MainInstances
|
||||||
|
|
||||||
var shake = 0
|
var shake = 0
|
||||||
|
|
||||||
onready var timer = $Timer
|
onready var timer = $Timer
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
Events.connect("add_screenshake", self, "_on_Events_add_screenshake")
|
Events.connect("add_screenshake", self, "_on_Events_add_screenshake")
|
||||||
|
MainInstances.WorldCamera = self
|
||||||
|
|
||||||
|
func _exit_tree():
|
||||||
|
MainInstances.WorldCamera = null
|
||||||
|
|
||||||
func _process(delta):
|
func _process(delta):
|
||||||
offset_h = rand_range(-shake, shake)
|
offset_h = rand_range(-shake, shake)
|
||||||
|
|
|
@ -6,6 +6,11 @@ onready var currentLevel = $Level_00
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
VisualServer.set_default_clear_color(Color.black)
|
VisualServer.set_default_clear_color(Color.black)
|
||||||
|
|
||||||
|
if SaverLoader.is_loading:
|
||||||
|
SaverLoader.load_game()
|
||||||
|
SaverLoader.is_loading = false
|
||||||
|
|
||||||
MainInstances.Player.connect("hit_door", self, "_on_Player_hit_door")
|
MainInstances.Player.connect("hit_door", self, "_on_Player_hit_door")
|
||||||
|
|
||||||
func _on_Player_hit_door(door):
|
func _on_Player_hit_door(door):
|
||||||
|
|
|
@ -9,19 +9,19 @@
|
||||||
[node name="World" type="Node"]
|
[node name="World" type="Node"]
|
||||||
script = ExtResource( 3 )
|
script = ExtResource( 3 )
|
||||||
|
|
||||||
|
[node name="Camera" parent="." instance=ExtResource( 6 )]
|
||||||
|
position = Vector2( 9, 88 )
|
||||||
|
|
||||||
[node name="Player" parent="." instance=ExtResource( 2 )]
|
[node name="Player" parent="." instance=ExtResource( 2 )]
|
||||||
position = Vector2( 9, 96 )
|
position = Vector2( 9, 96 )
|
||||||
|
|
||||||
[node name="CameraFollow" parent="Player" index="5"]
|
[node name="CameraFollow" parent="Player" index="5"]
|
||||||
remote_path = NodePath("../../Camera")
|
remote_path = NodePath("../../Camera")
|
||||||
|
|
||||||
[node name="Camera" parent="." instance=ExtResource( 6 )]
|
|
||||||
position = Vector2( 9, 88 )
|
|
||||||
|
|
||||||
[node name="UI" parent="." instance=ExtResource( 7 )]
|
[node name="UI" parent="." instance=ExtResource( 7 )]
|
||||||
|
|
||||||
[node name="Level_00" parent="." instance=ExtResource( 1 )]
|
[node name="Level_00" parent="." instance=ExtResource( 1 )]
|
||||||
position = Vector2( -132, -35 )
|
position = Vector2( -132, -32 )
|
||||||
|
|
||||||
[editable path="Player"]
|
[editable path="Player"]
|
||||||
[editable path="Player/Hurtbox"]
|
[editable path="Player/Hurtbox"]
|
||||||
|
|
|
@ -8,8 +8,8 @@ func _on_StartButton_pressed():
|
||||||
get_tree().change_scene("res://Scenes/World/World.tscn")
|
get_tree().change_scene("res://Scenes/World/World.tscn")
|
||||||
|
|
||||||
func _on_LoadButton_pressed():
|
func _on_LoadButton_pressed():
|
||||||
# TODO: Savegames
|
SaverLoader.is_loading = true
|
||||||
pass
|
get_tree().change_scene("res://Scenes/World/World.tscn")
|
||||||
|
|
||||||
func _on_QuitButton_pressed():
|
func _on_QuitButton_pressed():
|
||||||
get_tree().quit()
|
get_tree().quit()
|
||||||
|
|
|
@ -33,7 +33,7 @@ _global_script_class_icons={
|
||||||
[application]
|
[application]
|
||||||
|
|
||||||
config/name="Metroidvania"
|
config/name="Metroidvania"
|
||||||
run/main_scene="res://Scenes/World/World.tscn"
|
run/main_scene="res://Scenes/UI/StarMenu.tscn"
|
||||||
config/icon="res://icon.png"
|
config/icon="res://icon.png"
|
||||||
|
|
||||||
[autoload]
|
[autoload]
|
||||||
|
|
Loading…
Reference in New Issue