SaveStation, save & load properly
This commit is contained in:
parent
d4acde846c
commit
847670821d
|
@ -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
|
||||
|
|
|
@ -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 )]
|
||||
|
|
|
@ -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 )
|
||||
|
|
|
@ -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 )
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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="Sprite" type="Sprite" parent="."]
|
||||
z_index = 20
|
||||
texture = ExtResource( 1 )
|
||||
centered = false
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"]
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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"]
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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]
|
||||
|
|
Loading…
Reference in New Issue