1
0
Fork 0

SaveStation, save & load properly

This commit is contained in:
Felipe M 2021-05-22 18:33:00 +02:00
parent d4acde846c
commit 847670821d
Signed by: fmartingr
GPG Key ID: 716BC147715E716F
16 changed files with 129 additions and 13 deletions

View File

@ -6,3 +6,13 @@ func _ready():
var parent = get_parent()
if parent is WORLD:
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

View File

@ -3,7 +3,9 @@
[ext_resource path="res://Levels/Level.gd" type="Script" id=1]
[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 )
[node name="TileMap" parent="." instance=ExtResource( 2 )]

View File

@ -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/Door.tscn" type="PackedScene" id=2]
[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 )]
@ -13,3 +14,7 @@ tile_data = PoolIntArray( 0, 0, 4, 1, 0, 196609, 2, 0, 196609, 3, 0, 196609, 4,
position = Vector2( 312, 144 )
connection = ExtResource( 3 )
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 )

View File

@ -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/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/01_99.tres" type="Resource" id=4]
[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 )]
@ -16,6 +17,9 @@ position = Vector2( 88, 144 )
connection = ExtResource( 4 )
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 )]
position = Vector2( 8, 144 )
scale = Vector2( -1, 1 )
@ -23,4 +27,4 @@ connection = ExtResource( 3 )
new_level_path = "res://Levels/Level_00.tscn"
[node name="MissilesPowerup" parent="." index="3" instance=ExtResource( 5 )]
position = Vector2( 47, 146 )
position = Vector2( 25, 146 )

View File

@ -2,6 +2,8 @@ extends Node
const save_path = "user://savegame.save"
var is_loading = false
func save_game():
var save_game = File.new()
save_game.open(save_path, File.WRITE)
@ -23,7 +25,10 @@ func load_game():
save_game.open(save_path, File.READ)
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:
var newNode = load(current_line["filename"]).instance()
get_node(current_line["parent"]).add_child(newNode, true)

View File

@ -0,0 +1,7 @@
extends StaticBody2D
onready var animation = $Animation
func _on_SaveArea_body_entered(body):
animation.play("Save")
SaverLoader.save_game()

View File

@ -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"]

View File

@ -9,6 +9,7 @@ extents = Vector2( 8, 8 )
[node name="Spikes" type="Node2D"]
[node name="Sprite" type="Sprite" parent="."]
z_index = 20
texture = ExtResource( 1 )
centered = false

View File

@ -40,6 +40,7 @@ onready var muzzle = $Sprite/PlayerGun/Sprite/Muzzle
onready var fireBulletTimer = $FireBulletTimer
onready var blinkAnimator = $BlinkAnimator
onready var powerupDetector = $PowerupDetector
onready var cameraFollow = $CameraFollow
signal hit_door(door)
@ -50,6 +51,10 @@ func set_invincible(value):
func _ready():
PlayerStats.connect("player_died", self, "_on_died")
MainInstances.Player = self
call_deferred("assign_world_camera")
func assign_world_camera():
cameraFollow.remote_path = MainInstances.WorldCamera.get_path()
func _exit_tree():
MainInstances.Player = null
@ -87,7 +92,7 @@ func _physics_process(delta):
if Input.is_action_pressed("fire_missile") and fireBulletTimer.time_left == 0 and PlayerStats.missiles > 0 and PlayerStats.missiles_unlocked:
fire_missile()
func fire_bullet():
var bullet = Utils.instance_scene_on_main(PlayerBullet, muzzle.global_position)
bullet.velocity = Vector2.RIGHT.rotated(playerGun.rotation) * bullet_speed

View File

@ -130,6 +130,7 @@ script = ExtResource( 2 )
[node name="Sprite" type="Sprite" parent="."]
position = Vector2( 0, -12 )
z_index = 10
texture = ExtResource( 1 )
hframes = 12
frame = 11

View File

@ -41,6 +41,7 @@ margin_right = 56.0
margin_bottom = 56.0
rect_min_size = Vector2( 56, 16 )
text = "Quit"
[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/QuitButton" to="." method="_on_QuitButton_pressed"]

View File

@ -1,11 +1,17 @@
extends Camera2D
var MainInstances = ResourceLoader.MainInstances
var shake = 0
onready var timer = $Timer
func _ready():
Events.connect("add_screenshake", self, "_on_Events_add_screenshake")
MainInstances.WorldCamera = self
func _exit_tree():
MainInstances.WorldCamera = null
func _process(delta):
offset_h = rand_range(-shake, shake)

View File

@ -6,6 +6,11 @@ onready var currentLevel = $Level_00
func _ready():
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")
func _on_Player_hit_door(door):

View File

@ -9,19 +9,19 @@
[node name="World" type="Node"]
script = ExtResource( 3 )
[node name="Camera" parent="." instance=ExtResource( 6 )]
position = Vector2( 9, 88 )
[node name="Player" parent="." instance=ExtResource( 2 )]
position = Vector2( 9, 96 )
[node name="CameraFollow" parent="Player" index="5"]
remote_path = NodePath("../../Camera")
[node name="Camera" parent="." instance=ExtResource( 6 )]
position = Vector2( 9, 88 )
[node name="UI" parent="." instance=ExtResource( 7 )]
[node name="Level_00" parent="." instance=ExtResource( 1 )]
position = Vector2( -132, -35 )
position = Vector2( -132, -32 )
[editable path="Player"]
[editable path="Player/Hurtbox"]

View File

@ -8,8 +8,8 @@ func _on_StartButton_pressed():
get_tree().change_scene("res://Scenes/World/World.tscn")
func _on_LoadButton_pressed():
# TODO: Savegames
pass
SaverLoader.is_loading = true
get_tree().change_scene("res://Scenes/World/World.tscn")
func _on_QuitButton_pressed():
get_tree().quit()

View File

@ -33,7 +33,7 @@ _global_script_class_icons={
[application]
config/name="Metroidvania"
run/main_scene="res://Scenes/World/World.tscn"
run/main_scene="res://Scenes/UI/StarMenu.tscn"
config/icon="res://icon.png"
[autoload]