1
0
Fork 0

Compare commits

...

7 Commits

Author SHA1 Message Date
Felipe M b0c5798328
bugfix: savestation colliding with itself 2021-05-22 18:48:24 +02:00
Felipe M c5a54977ac
fixes 2021-05-22 18:43:03 +02:00
Felipe M 847670821d
SaveStation, save & load properly 2021-05-22 18:33:00 +02:00
Felipe M d4acde846c
SaverLoader base 2021-05-22 17:54:34 +02:00
Felipe M ad7cb69355
Boss encounter door lock 2021-05-22 17:26:11 +02:00
Felipe M 2b90d087c4
Boss encounter 2021-05-22 17:06:32 +02:00
Felipe M bdd9f2ea2c
Player idle animation 2021-05-22 13:45:39 +02:00
26 changed files with 1246 additions and 27 deletions

View File

@ -0,0 +1,3 @@
[gd_resource type="Resource" format=2]
[resource]

View File

@ -6,3 +6,12 @@ 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,15 +1,20 @@
[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 )]
[node name="TileMap" parent="." index="0"]
tile_data = PoolIntArray( 0, 0, 4, 1, 0, 196609, 2, 0, 196609, 3, 0, 196609, 4, 0, 196609, 5, 0, 196609, 6, 0, 196609, 7, 0, 196609, 8, 0, 196609, 9, 0, 196609, 10, 0, 196609, 11, 0, 196609, 12, 0, 196609, 13, 0, 196609, 14, 0, 196609, 15, 0, 196609, 16, 0, 196609, 17, 0, 196609, 18, 0, 196609, 19, 0, 7, 65536, 0, 65539, 65555, 0, 65539, 131072, 0, 65539, 131091, 0, 65539, 196608, 0, 65539, 196627, 0, 65539, 262144, 0, 65539, 262163, 0, 65539, 327680, 0, 65539, 327699, 0, 65539, 393216, 0, 65539, 393235, 0, 65539, 458752, 0, 65539, 458771, 0, 131075, 524288, 0, 65539, 589824, 0, 65539, 655360, 0, 196612, 655361, 0, 196609, 655362, 0, 196609, 655363, 0, 196609, 655364, 0, 196609, 655365, 0, 196609, 655366, 0, 196609, 655367, 0, 196609, 655368, 0, 196609, 655369, 0, 196609, 655370, 0, 196609, 655371, 0, 196609, 655372, 0, 196609, 655373, 0, 196609, 655374, 0, 196609, 655375, 0, 196609, 655376, 0, 196609, 655377, 0, 196609, 655378, 0, 196609, 655379, 0, 196610 )
tile_data = PoolIntArray( 0, 0, 4, 1, 0, 196609, 2, 0, 196609, 3, 0, 196609, 4, 0, 196609, 5, 0, 196609, 6, 0, 196609, 7, 0, 196609, 8, 0, 196609, 9, 0, 196609, 10, 0, 196609, 11, 0, 196609, 12, 0, 196609, 13, 0, 196609, 14, 0, 196609, 15, 0, 196609, 16, 0, 196609, 17, 0, 196609, 18, 0, 196609, 19, 0, 7, 65536, 0, 65539, 65555, 0, 65539, 131072, 0, 65539, 131091, 0, 65539, 262142, 0, 4, 262143, 0, 196609, 196608, 0, 196615, 196627, 0, 65539, 327678, 0, 65539, 262163, 0, 65539, 393214, 0, 65539, 327699, 0, 65539, 458750, 0, 65539, 393235, 0, 65539, 524286, 0, 196612, 524287, 0, 196609, 458752, 0, 7, 458771, 0, 131075, 524288, 0, 65539, 589824, 0, 65539, 655360, 0, 196612, 655361, 0, 196609, 655362, 0, 196609, 655363, 0, 196609, 655364, 0, 196609, 655365, 0, 196609, 655366, 0, 196609, 655367, 0, 196609, 655368, 0, 196609, 655369, 0, 196609, 655370, 0, 196609, 655371, 0, 196609, 655372, 0, 196609, 655373, 0, 196609, 655374, 0, 196609, 655375, 0, 196609, 655376, 0, 196609, 655377, 0, 196609, 655378, 0, 196609, 655379, 0, 196610 )
[node name="Door" parent="." index="1" instance=ExtResource( 2 )]
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,16 +1,30 @@
[gd_scene load_steps=4 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 )]
[node name="TileMap" parent="." index="0"]
tile_data = PoolIntArray( 393216, 0, 4, 393217, 0, 196609, 393218, 0, 196609, 393219, 0, 196609, 393220, 0, 196609, 393221, 0, 7, 458752, 0, 131075, 458757, 0, 131075, 655360, 0, 196608, 655361, 0, 196609, 655362, 0, 196609, 655363, 0, 196609, 655364, 0, 196609, 655365, 0, 196610 )
[node name="InDoor" parent="." index="1" instance=ExtResource( 1 )]
[node name="OutDoor" parent="." index="1" instance=ExtResource( 1 )]
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 )
connection = ExtResource( 3 )
new_level_path = "res://Levels/Level_00.tscn"
[node name="MissilesPowerup" parent="." index="3" instance=ExtResource( 5 )]
position = Vector2( 25, 146 )

View File

@ -0,0 +1,17 @@
extends "res://Levels/Level.gd"
onready var Boss = $BossEnemy
onready var DoorLock = $DoorLock
onready var Trigger = $Trigger
const PLAYER_BIT = 0
func set_door_lock(value):
DoorLock.visible = value
DoorLock.set_collision_mask_bit(PLAYER_BIT, value)
func _on_Trigger_triggered():
set_door_lock(true)
func _on_BossEnemy_died():
set_door_lock(false)

View File

@ -0,0 +1,72 @@
[gd_scene load_steps=9 format=2]
[ext_resource path="res://Levels/Level.tscn" type="PackedScene" id=1]
[ext_resource path="res://Scenes/Enemies/BossEnemy.tscn" type="PackedScene" id=2]
[ext_resource path="res://Levels/Door.tscn" type="PackedScene" id=3]
[ext_resource path="res://Levels/DoorConnections/01_99.tres" type="Resource" id=4]
[ext_resource path="res://Scenes/Objects/Spikes.tscn" type="PackedScene" id=5]
[ext_resource path="res://Levels/Level_99.gd" type="Script" id=6]
[ext_resource path="res://Scenes/World/Trigger.tscn" type="PackedScene" id=7]
[ext_resource path="res://Scenes/TileMap.tscn" type="PackedScene" id=8]
[node name="Level_99" instance=ExtResource( 1 )]
script = ExtResource( 6 )
[node name="Door" parent="." index="0" instance=ExtResource( 3 )]
position = Vector2( -8, 16 )
scale = Vector2( -1, 1 )
connection = ExtResource( 4 )
new_level_path = "res://Levels/Level_01.tscn"
[node name="BossEnemy" parent="." index="1" instance=ExtResource( 2 )]
position = Vector2( 242, -25 )
[node name="EnemyStats" parent="BossEnemy" index="6"]
max_health = 5
[node name="TileMap" parent="." index="2"]
tile_data = PoolIntArray( -589821, 0, 4, -589820, 0, 196609, -589819, 0, 196609, -589818, 0, 196609, -589817, 0, 196609, -589816, 0, 196609, -589815, 0, 196609, -589814, 0, 196609, -589813, 0, 196609, -589812, 0, 196609, -589811, 0, 196609, -589810, 0, 196609, -589809, 0, 196609, -589808, 0, 196609, -589807, 0, 7, -524286, 0, 4, -524285, 0, 196615, -524271, 0, 196612, -524270, 0, 7, -458750, 0, 65539, -458734, 0, 65539, -393215, 0, 4, -393214, 0, 196615, -393198, 0, 196612, -393197, 0, 7, -327679, 0, 65539, -327661, 0, 65539, -262144, 0, 4, -262143, 0, 196615, -262125, 0, 196612, -262124, 0, 7, -196608, 0, 65539, -196588, 0, 65539, -131072, 0, 65539, -131052, 0, 65539, -1, 0, 196608, -65536, 0, 196615, -65516, 0, 65539, 20, 0, 65539, 65556, 0, 65539, 196607, 0, 196608, 131072, 0, 7, 131091, 0, 4, 131092, 0, 196615, 196608, 0, 196612, 196609, 0, 7, 196612, 0, 0, 196613, 0, 1, 196614, 0, 2, 196616, 0, 0, 196617, 0, 2, 196621, 0, 3, 196623, 0, 3, 196626, 0, 4, 196627, 0, 196615, 262145, 0, 196612, 262146, 0, 196609, 262147, 0, 196609, 262148, 0, 196614, 262149, 0, 131073, 262150, 0, 196613, 262151, 0, 196609, 262152, 0, 196614, 262153, 0, 196613, 262154, 0, 196609, 262155, 0, 196609, 262156, 0, 196609, 262157, 0, 196616, 262158, 0, 196609, 262159, 0, 196616, 262160, 0, 196609, 262161, 0, 196609, 262162, 0, 196615 )
[node name="Spikes" type="Node2D" parent="." index="3"]
[node name="Spikes" parent="Spikes" index="0" instance=ExtResource( 5 )]
position = Vector2( 32, -48 )
rotation = 1.5708
[node name="Spikes2" parent="Spikes" index="1" instance=ExtResource( 5 )]
position = Vector2( 32, -16 )
rotation = 1.5708
[node name="Spikes3" parent="Spikes" index="2" instance=ExtResource( 5 )]
position = Vector2( 32, -32 )
rotation = 1.5708
[node name="Spikes4" parent="Spikes" index="3" instance=ExtResource( 5 )]
position = Vector2( 304, -22 )
rotation = -1.5708
[node name="Spikes5" parent="Spikes" index="4" instance=ExtResource( 5 )]
position = Vector2( 304, 10 )
rotation = -1.5708
[node name="Spikes6" parent="Spikes" index="5" instance=ExtResource( 5 )]
position = Vector2( 304, -6 )
rotation = -1.5708
[node name="DoorLock" parent="." index="4" instance=ExtResource( 8 )]
visible = false
collision_layer = 0
tile_data = PoolIntArray( 65535, 0, 3, 42, 0, 196611, 131071, 0, 131075 )
[node name="Trigger" parent="." index="5" instance=ExtResource( 7 )]
[node name="Collision" parent="Trigger" index="0"]
position = Vector2( 12, 16 )
[connection signal="died" from="BossEnemy" to="." method="_on_BossEnemy_died"]
[connection signal="triggered" from="Trigger" to="." method="_on_Trigger_triggered"]
[editable path="BossEnemy"]
[editable path="BossEnemy/Hurtbox"]
[editable path="BossEnemy/Hitbox"]
[editable path="Trigger"]

View File

@ -0,0 +1,42 @@
extends Node
const save_path = "user://savegame.save"
var is_loading = false
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")
for node in persistingNodes:
var nodeData = node.save()
save_game.store_line(to_json(nodeData))
save_game.close()
func load_game():
var save_game = File.new()
if not save_game.file_exists(save_path):
return
var persistingNodes = get_tree().get_nodes_in_group("Persists")
for node in persistingNodes:
node.queue_free()
save_game.open(save_path, File.READ)
while not save_game.eof_reached():
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)
newNode.position = Vector2(current_line["position_x"], current_line["position_y"])
for property in current_line.keys():
if property != "filename" and property != "parent" and property != "position_x" and property != "position_y":
newNode.set(property, current_line[property])
save_game.close()

View File

@ -0,0 +1,37 @@
extends "res://Scenes/Enemies/Enemy.gd"
var MainInstances = ResourceLoader.MainInstances
const Bullet = preload("res://Scenes/Objects/EnemyBullet.tscn")
export (int) var ACCELERATION = 70
onready var rightWallCheck = $RightWallCheck
onready var leftWallCheck = $LeftWallCheck
func _process(delta):
chase_player(delta)
func chase_player(delta):
var player = MainInstances.Player
if player != null: # We not dead
var direction_to_move = sign(player.global_position.x - global_position.x)
motion.x += ACCELERATION * delta * direction_to_move
motion.x = clamp(motion.x, -MAX_SPEED, MAX_SPEED)
global_position.x += motion.x * delta
rotation_degrees = lerp(rotation_degrees, (motion.x / MAX_SPEED) * 10, 0.3)
if rightWallCheck.is_colliding() and motion.x > 0:
motion.x *= -0.5
if rightWallCheck.is_colliding() and motion.x <= 0:
motion.x *= -0.5
func fire_bullet() -> void:
var bullet = Utils.instance_scene_on_main(Bullet, global_position)
var velocity = Vector2.DOWN * 50
velocity = velocity.rotated(deg2rad(rand_range(-30, 30)))
bullet.velocity = velocity
func _on_Timer_timeout():
fire_bullet()

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=9 format=2]
[gd_scene load_steps=14 format=2]
[ext_resource path="res://Scenes/Enemies/Enemy.tscn" type="PackedScene" id=1]
[ext_resource path="res://Assets/Enemies/BossEnemyHead.png" type="Texture" id=2]
@ -8,10 +8,820 @@
[ext_resource path="res://Assets/Enemies/BossEnemyLeg1.png" type="Texture" id=6]
[ext_resource path="res://Assets/Enemies/BossEnemyLeg2.png" type="Texture" id=7]
[ext_resource path="res://Assets/Enemies/BossEnemyLeg3.png" type="Texture" id=8]
[ext_resource path="res://Scenes/Enemies/BossEnemy.gd" type="Script" id=9]
[sub_resource type="Animation" id=1]
resource_name = "Base"
tracks/0/type = "value"
tracks/0/path = NodePath("Sprite/RightLowerLeg/MiddleSegment:position")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Vector2( 12.1781, 2.94854 ) ]
}
tracks/1/type = "value"
tracks/1/path = NodePath("Sprite/RightLowerLeg/MiddleSegment:rotation_degrees")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ 25.0 ]
}
tracks/2/type = "value"
tracks/2/path = NodePath("Sprite/RightLowerLeg:position")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Vector2( 9, 0 ) ]
}
tracks/3/type = "value"
tracks/3/path = NodePath("Sprite/RightLowerLeg:rotation_degrees")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ 15.0 ]
}
tracks/4/type = "value"
tracks/4/path = NodePath("Sprite/RightLowerLeg/MiddleSegment/EndSegment:position")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Vector2( 6, 10 ) ]
}
tracks/5/type = "value"
tracks/5/path = NodePath("Sprite/RightLowerLeg/MiddleSegment/EndSegment:rotation_degrees")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ 15.0 ]
}
tracks/6/type = "value"
tracks/6/path = NodePath("Sprite/LeftUpperLeg/MiddleSegment/EndSegment/EndPoint:position")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Vector2( 3, 5 ) ]
}
tracks/7/type = "value"
tracks/7/path = NodePath("Sprite/LeftUpperLeg/MiddleSegment/EndSegment/EndPoint:rotation_degrees")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ 0.0 ]
}
tracks/8/type = "value"
tracks/8/path = NodePath("Sprite/LeftUpperLeg/MiddleSegment/EndSegment:position")
tracks/8/interp = 1
tracks/8/loop_wrap = true
tracks/8/imported = false
tracks/8/enabled = true
tracks/8/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Vector2( -6, 10 ) ]
}
tracks/9/type = "value"
tracks/9/path = NodePath("Sprite/LeftUpperLeg/MiddleSegment/EndSegment:rotation_degrees")
tracks/9/interp = 1
tracks/9/loop_wrap = true
tracks/9/imported = false
tracks/9/enabled = true
tracks/9/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ 0.0 ]
}
tracks/10/type = "value"
tracks/10/path = NodePath("Sprite/LeftUpperLeg/MiddleSegment:position")
tracks/10/interp = 1
tracks/10/loop_wrap = true
tracks/10/imported = false
tracks/10/enabled = true
tracks/10/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Vector2( -9, 3 ) ]
}
tracks/11/type = "value"
tracks/11/path = NodePath("Sprite/LeftUpperLeg/MiddleSegment:rotation_degrees")
tracks/11/interp = 1
tracks/11/loop_wrap = true
tracks/11/imported = false
tracks/11/enabled = true
tracks/11/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ 0.0 ]
}
tracks/12/type = "value"
tracks/12/path = NodePath("Sprite/LeftUpperLeg:position")
tracks/12/interp = 1
tracks/12/loop_wrap = true
tracks/12/imported = false
tracks/12/enabled = true
tracks/12/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Vector2( -12, -12 ) ]
}
tracks/13/type = "value"
tracks/13/path = NodePath("Sprite/LeftUpperLeg:rotation_degrees")
tracks/13/interp = 1
tracks/13/loop_wrap = true
tracks/13/imported = false
tracks/13/enabled = true
tracks/13/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ 0.0 ]
}
tracks/14/type = "value"
tracks/14/path = NodePath("Sprite/RightUpeerLeg:position")
tracks/14/interp = 1
tracks/14/loop_wrap = true
tracks/14/imported = false
tracks/14/enabled = true
tracks/14/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Vector2( 12, -12 ) ]
}
tracks/15/type = "value"
tracks/15/path = NodePath("Sprite/RightUpeerLeg:rotation_degrees")
tracks/15/interp = 1
tracks/15/loop_wrap = true
tracks/15/imported = false
tracks/15/enabled = true
tracks/15/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ 0.0 ]
}
tracks/16/type = "value"
tracks/16/path = NodePath("Sprite:position")
tracks/16/interp = 1
tracks/16/loop_wrap = true
tracks/16/imported = false
tracks/16/enabled = true
tracks/16/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Vector2( 0, 0 ) ]
}
tracks/17/type = "value"
tracks/17/path = NodePath("Sprite:rotation_degrees")
tracks/17/interp = 1
tracks/17/loop_wrap = true
tracks/17/imported = false
tracks/17/enabled = true
tracks/17/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ 0.0 ]
}
tracks/18/type = "value"
tracks/18/path = NodePath("Sprite/RightUpeerLeg/MiddleSegment/EndSegment:position")
tracks/18/interp = 1
tracks/18/loop_wrap = true
tracks/18/imported = false
tracks/18/enabled = true
tracks/18/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Vector2( 6, 10 ) ]
}
tracks/19/type = "value"
tracks/19/path = NodePath("Sprite/RightUpeerLeg/MiddleSegment/EndSegment:rotation_degrees")
tracks/19/interp = 1
tracks/19/loop_wrap = true
tracks/19/imported = false
tracks/19/enabled = true
tracks/19/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ 15.0 ]
}
tracks/20/type = "value"
tracks/20/path = NodePath("Sprite/RightUpeerLeg/MiddleSegment:position")
tracks/20/interp = 1
tracks/20/loop_wrap = true
tracks/20/imported = false
tracks/20/enabled = true
tracks/20/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Vector2( 12, 3 ) ]
}
tracks/21/type = "value"
tracks/21/path = NodePath("Sprite/RightUpeerLeg/MiddleSegment:rotation_degrees")
tracks/21/interp = 1
tracks/21/loop_wrap = true
tracks/21/imported = false
tracks/21/enabled = true
tracks/21/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ 0.0 ]
}
tracks/22/type = "value"
tracks/22/path = NodePath("Sprite/RightWing:rotation_degrees")
tracks/22/interp = 1
tracks/22/loop_wrap = true
tracks/22/imported = false
tracks/22/enabled = true
tracks/22/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ 180.0 ]
}
tracks/23/type = "value"
tracks/23/path = NodePath("Sprite/RightWing:position")
tracks/23/interp = 1
tracks/23/loop_wrap = true
tracks/23/imported = false
tracks/23/enabled = true
tracks/23/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Vector2( 50, -19 ) ]
}
tracks/24/type = "value"
tracks/24/path = NodePath("Sprite/RightUpeerLeg/MiddleSegment/EndSegment/EndPoint:position")
tracks/24/interp = 1
tracks/24/loop_wrap = true
tracks/24/imported = false
tracks/24/enabled = true
tracks/24/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Vector2( -3, 5 ) ]
}
tracks/25/type = "value"
tracks/25/path = NodePath("Sprite/RightUpeerLeg/MiddleSegment/EndSegment/EndPoint:rotation_degrees")
tracks/25/interp = 1
tracks/25/loop_wrap = true
tracks/25/imported = false
tracks/25/enabled = true
tracks/25/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ 0.0 ]
}
tracks/26/type = "value"
tracks/26/path = NodePath("Sprite/LeftWing:position")
tracks/26/interp = 1
tracks/26/loop_wrap = true
tracks/26/imported = false
tracks/26/enabled = true
tracks/26/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Vector2( -8, -19 ) ]
}
tracks/27/type = "value"
tracks/27/path = NodePath("Sprite/LeftWing:rotation_degrees")
tracks/27/interp = 1
tracks/27/loop_wrap = true
tracks/27/imported = false
tracks/27/enabled = true
tracks/27/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ 0.0 ]
}
tracks/28/type = "value"
tracks/28/path = NodePath("Sprite/LeftLowerLeg/MiddleSegment/EndSegment/EndPoint:position")
tracks/28/interp = 1
tracks/28/loop_wrap = true
tracks/28/imported = false
tracks/28/enabled = true
tracks/28/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Vector2( 3, 5 ) ]
}
tracks/29/type = "value"
tracks/29/path = NodePath("Sprite/LeftLowerLeg/MiddleSegment/EndSegment/EndPoint:rotation_degrees")
tracks/29/interp = 1
tracks/29/loop_wrap = true
tracks/29/imported = false
tracks/29/enabled = true
tracks/29/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ 0.0 ]
}
tracks/30/type = "value"
tracks/30/path = NodePath("Sprite/LeftLowerLeg/MiddleSegment/EndSegment:position")
tracks/30/interp = 1
tracks/30/loop_wrap = true
tracks/30/imported = false
tracks/30/enabled = true
tracks/30/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Vector2( -6, 10 ) ]
}
tracks/31/type = "value"
tracks/31/path = NodePath("Sprite/LeftLowerLeg/MiddleSegment/EndSegment:rotation_degrees")
tracks/31/interp = 1
tracks/31/loop_wrap = true
tracks/31/imported = false
tracks/31/enabled = true
tracks/31/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ -20.0 ]
}
tracks/32/type = "value"
tracks/32/path = NodePath("Sprite/LeftLowerLeg/MiddleSegment:position")
tracks/32/interp = 1
tracks/32/loop_wrap = true
tracks/32/imported = false
tracks/32/enabled = true
tracks/32/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Vector2( -12, 3 ) ]
}
tracks/33/type = "value"
tracks/33/path = NodePath("Sprite/LeftLowerLeg/MiddleSegment:rotation_degrees")
tracks/33/interp = 1
tracks/33/loop_wrap = true
tracks/33/imported = false
tracks/33/enabled = true
tracks/33/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ -25.0 ]
}
tracks/34/type = "value"
tracks/34/path = NodePath("Sprite/LeftLowerLeg:position")
tracks/34/interp = 1
tracks/34/loop_wrap = true
tracks/34/imported = false
tracks/34/enabled = true
tracks/34/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Vector2( -9, 4.76837e-07 ) ]
}
tracks/35/type = "value"
tracks/35/path = NodePath("Sprite/LeftLowerLeg:rotation_degrees")
tracks/35/interp = 1
tracks/35/loop_wrap = true
tracks/35/imported = false
tracks/35/enabled = true
tracks/35/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ -15.0 ]
}
tracks/36/type = "value"
tracks/36/path = NodePath("Sprite/RightLowerLeg/MiddleSegment/EndSegment/EndPoint:position")
tracks/36/interp = 1
tracks/36/loop_wrap = true
tracks/36/imported = false
tracks/36/enabled = true
tracks/36/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Vector2( -3, 5 ) ]
}
tracks/37/type = "value"
tracks/37/path = NodePath("Sprite/RightLowerLeg/MiddleSegment/EndSegment/EndPoint:rotation_degrees")
tracks/37/interp = 1
tracks/37/loop_wrap = true
tracks/37/imported = false
tracks/37/enabled = true
tracks/37/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ 0.0 ]
}
[sub_resource type="Animation" id=2]
resource_name = "Fly"
length = 0.8
loop = true
tracks/0/type = "value"
tracks/0/path = NodePath("Sprite/LeftWing:rotation_degrees")
tracks/0/interp = 2
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0, 0.200945 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ 45.0, -75.0 ]
}
tracks/1/type = "value"
tracks/1/path = NodePath("Sprite/RightWing:rotation_degrees")
tracks/1/interp = 2
tracks/1/loop_wrap = true
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/keys = {
"times": PoolRealArray( 0, 0.200945 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ -45.0, 75.0 ]
}
tracks/2/type = "value"
tracks/2/path = NodePath("Sprite:position")
tracks/2/interp = 2
tracks/2/loop_wrap = true
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/keys = {
"times": PoolRealArray( 0.1, 0.3 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ Vector2( 0, 1 ), Vector2( 0, -2 ) ]
}
tracks/3/type = "value"
tracks/3/path = NodePath("Sprite/Head:position")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/keys = {
"times": PoolRealArray( 0.2, 0.4 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ Vector2( 0, -7.5 ), Vector2( 0, -9 ) ]
}
tracks/4/type = "value"
tracks/4/path = NodePath("Sprite/RightUpeerLeg/MiddleSegment/EndSegment:position")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/keys = {
"times": PoolRealArray( 0.2, 0.799098 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ Vector2( 6, 10 ), Vector2( 6, 10 ) ]
}
tracks/5/type = "value"
tracks/5/path = NodePath("Sprite/RightUpeerLeg/MiddleSegment/EndSegment:rotation_degrees")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/keys = {
"times": PoolRealArray( 0.2, 0.798708 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ 15.0, 23.7776 ]
}
tracks/6/type = "value"
tracks/6/path = NodePath("Sprite/RightUpeerLeg/MiddleSegment:position")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/keys = {
"times": PoolRealArray( 0.2, 0.798708 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ Vector2( 12, 3 ), Vector2( 12, 3 ) ]
}
tracks/7/type = "value"
tracks/7/path = NodePath("Sprite/RightUpeerLeg/MiddleSegment:rotation_degrees")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/keys = {
"times": PoolRealArray( 0.2, 0.798708 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ 0.0, 48.9747 ]
}
tracks/8/type = "value"
tracks/8/path = NodePath("Sprite/RightUpeerLeg:position")
tracks/8/interp = 1
tracks/8/loop_wrap = true
tracks/8/imported = false
tracks/8/enabled = true
tracks/8/keys = {
"times": PoolRealArray( 0.2, 0.798708 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ Vector2( 12, -12 ), Vector2( 12, -12 ) ]
}
tracks/9/type = "value"
tracks/9/path = NodePath("Sprite/RightUpeerLeg:rotation_degrees")
tracks/9/interp = 1
tracks/9/loop_wrap = true
tracks/9/imported = false
tracks/9/enabled = true
tracks/9/keys = {
"times": PoolRealArray( 0.2, 0.798708 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ 0.0, -37.2612 ]
}
tracks/10/type = "value"
tracks/10/path = NodePath("Sprite/LeftUpperLeg/MiddleSegment/EndSegment:position")
tracks/10/interp = 1
tracks/10/loop_wrap = true
tracks/10/imported = false
tracks/10/enabled = true
tracks/10/keys = {
"times": PoolRealArray( 0.2, 0.8, 0.800658 ),
"transitions": PoolRealArray( 1, 1, 1 ),
"update": 0,
"values": [ Vector2( -6, 10 ), Vector2( -6, 10 ), Vector2( -6, 10 ) ]
}
tracks/11/type = "value"
tracks/11/path = NodePath("Sprite/LeftUpperLeg/MiddleSegment/EndSegment:rotation_degrees")
tracks/11/interp = 1
tracks/11/loop_wrap = true
tracks/11/imported = false
tracks/11/enabled = true
tracks/11/keys = {
"times": PoolRealArray( 0.2, 0.8, 0.800658 ),
"transitions": PoolRealArray( 1, 1, 1 ),
"update": 0,
"values": [ 0.0, -22.0, -22.0 ]
}
tracks/12/type = "value"
tracks/12/path = NodePath("Sprite/LeftUpperLeg/MiddleSegment:position")
tracks/12/interp = 1
tracks/12/loop_wrap = true
tracks/12/imported = false
tracks/12/enabled = true
tracks/12/keys = {
"times": PoolRealArray( 0.2, 0.8, 0.800658 ),
"transitions": PoolRealArray( 1, 1, 1 ),
"update": 0,
"values": [ Vector2( -9, 3 ), Vector2( -9, 3 ), Vector2( -9, 3 ) ]
}
tracks/13/type = "value"
tracks/13/path = NodePath("Sprite/LeftUpperLeg/MiddleSegment:rotation_degrees")
tracks/13/interp = 1
tracks/13/loop_wrap = true
tracks/13/imported = false
tracks/13/enabled = true
tracks/13/keys = {
"times": PoolRealArray( 0.2, 0.8, 0.800658 ),
"transitions": PoolRealArray( 1, 1, 1 ),
"update": 0,
"values": [ 0.0, -45.7629, -55.584 ]
}
tracks/14/type = "value"
tracks/14/path = NodePath("Sprite/LeftUpperLeg:position")
tracks/14/interp = 1
tracks/14/loop_wrap = true
tracks/14/imported = false
tracks/14/enabled = true
tracks/14/keys = {
"times": PoolRealArray( 0.2, 0.8, 0.800658 ),
"transitions": PoolRealArray( 1, 1, 1 ),
"update": 0,
"values": [ Vector2( -12, -12 ), Vector2( -12, -12 ), Vector2( -12, -12 ) ]
}
tracks/15/type = "value"
tracks/15/path = NodePath("Sprite/LeftUpperLeg:rotation_degrees")
tracks/15/interp = 1
tracks/15/loop_wrap = true
tracks/15/imported = false
tracks/15/enabled = true
tracks/15/keys = {
"times": PoolRealArray( 0.2, 0.8, 0.800658 ),
"transitions": PoolRealArray( 1, 1, 1 ),
"update": 0,
"values": [ 0.0, 45.025, 52.2154 ]
}
tracks/16/type = "value"
tracks/16/path = NodePath("Sprite/RightLowerLeg/MiddleSegment/EndSegment:position")
tracks/16/interp = 1
tracks/16/loop_wrap = true
tracks/16/imported = false
tracks/16/enabled = true
tracks/16/keys = {
"times": PoolRealArray( 0.200945, 0.8 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ Vector2( 6, 10 ), Vector2( 6, 10 ) ]
}
tracks/17/type = "value"
tracks/17/path = NodePath("Sprite/RightLowerLeg/MiddleSegment/EndSegment:rotation_degrees")
tracks/17/interp = 1
tracks/17/loop_wrap = true
tracks/17/imported = false
tracks/17/enabled = true
tracks/17/keys = {
"times": PoolRealArray( 0.200945, 0.8 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ -24.9, 26.0 ]
}
tracks/18/type = "value"
tracks/18/path = NodePath("Sprite/RightLowerLeg/MiddleSegment:position")
tracks/18/interp = 1
tracks/18/loop_wrap = true
tracks/18/imported = false
tracks/18/enabled = true
tracks/18/keys = {
"times": PoolRealArray( 0.200945, 0.8 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ Vector2( 12.1781, 2.94854 ), Vector2( 12.1781, 2.94854 ) ]
}
tracks/19/type = "value"
tracks/19/path = NodePath("Sprite/RightLowerLeg/MiddleSegment:rotation_degrees")
tracks/19/interp = 1
tracks/19/loop_wrap = true
tracks/19/imported = false
tracks/19/enabled = true
tracks/19/keys = {
"times": PoolRealArray( 0.200945, 0.8 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ -7.88142, 70.0456 ]
}
tracks/20/type = "value"
tracks/20/path = NodePath("Sprite/RightLowerLeg:position")
tracks/20/interp = 1
tracks/20/loop_wrap = true
tracks/20/imported = false
tracks/20/enabled = true
tracks/20/keys = {
"times": PoolRealArray( 0.200945, 0.8 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ Vector2( 9, 0 ), Vector2( 9, 0 ) ]
}
tracks/21/type = "value"
tracks/21/path = NodePath("Sprite/RightLowerLeg:rotation_degrees")
tracks/21/interp = 1
tracks/21/loop_wrap = true
tracks/21/imported = false
tracks/21/enabled = true
tracks/21/keys = {
"times": PoolRealArray( 0.200945, 0.8 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ 48.7326, -4.4743 ]
}
tracks/22/type = "value"
tracks/22/path = NodePath("Sprite/LeftLowerLeg/MiddleSegment/EndSegment:position")
tracks/22/interp = 1
tracks/22/loop_wrap = true
tracks/22/imported = false
tracks/22/enabled = true
tracks/22/keys = {
"times": PoolRealArray( 0.200945, 0.799878 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ Vector2( -6, 10 ), Vector2( -6, 10 ) ]
}
tracks/23/type = "value"
tracks/23/path = NodePath("Sprite/LeftLowerLeg/MiddleSegment/EndSegment:rotation_degrees")
tracks/23/interp = 1
tracks/23/loop_wrap = true
tracks/23/imported = false
tracks/23/enabled = true
tracks/23/keys = {
"times": PoolRealArray( 0.200945, 0.799878 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ 28.7639, 8.1 ]
}
tracks/24/type = "value"
tracks/24/path = NodePath("Sprite/LeftLowerLeg/MiddleSegment:position")
tracks/24/interp = 1
tracks/24/loop_wrap = true
tracks/24/imported = false
tracks/24/enabled = true
tracks/24/keys = {
"times": PoolRealArray( 0.200945, 0.799878 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ Vector2( -12, 3 ), Vector2( -12, 3 ) ]
}
tracks/25/type = "value"
tracks/25/path = NodePath("Sprite/LeftLowerLeg/MiddleSegment:rotation_degrees")
tracks/25/interp = 1
tracks/25/loop_wrap = true
tracks/25/imported = false
tracks/25/enabled = true
tracks/25/keys = {
"times": PoolRealArray( 0.200945, 0.799878 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ 5.39105, -77.5026 ]
}
tracks/26/type = "value"
tracks/26/path = NodePath("Sprite/LeftLowerLeg:position")
tracks/26/interp = 1
tracks/26/loop_wrap = true
tracks/26/imported = false
tracks/26/enabled = true
tracks/26/keys = {
"times": PoolRealArray( 0.200945, 0.799878 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ Vector2( -9, 4.76837e-07 ), Vector2( -9, 4.76837e-07 ) ]
}
tracks/27/type = "value"
tracks/27/path = NodePath("Sprite/LeftLowerLeg:rotation_degrees")
tracks/27/interp = 1
tracks/27/loop_wrap = true
tracks/27/imported = false
tracks/27/enabled = true
tracks/27/keys = {
"times": PoolRealArray( 0.200945, 0.799878 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ -49.701, 6.15604 ]
}
[sub_resource type="CircleShape2D" id=3]
radius = 18.0
[sub_resource type="RayShape2D" id=4]
length = 16.0
[node name="BossEnemy" instance=ExtResource( 1 )]
script = ExtResource( 9 )
MAX_SPEED = 50
[node name="OnionLayer" type="Sprite" parent="." index="0"]
visible = false
modulate = Color( 1, 1, 1, 0.113725 )
position = Vector2( 0, -11 )
texture = ExtResource( 5 )
@ -20,25 +830,28 @@ __meta__ = {
}
[node name="Sprite" parent="." index="1"]
position = Vector2( 0, 0.999149 )
texture = ExtResource( 3 )
[node name="LeftWing" type="Sprite" parent="Sprite" index="0"]
show_behind_parent = true
position = Vector2( -8, -19 )
rotation = -0.179467
texture = ExtResource( 4 )
offset = Vector2( -21, -5 )
[node name="RightWing" type="Sprite" parent="Sprite" index="1"]
show_behind_parent = true
position = Vector2( 50, -19 )
rotation = 3.14159
scale = Vector2( 1, -1 )
position = Vector2( 10, -20 )
rotation = 0.179467
texture = ExtResource( 4 )
offset = Vector2( 21, -5 )
flip_h = true
[node name="LeftUpperLeg" type="Sprite" parent="Sprite" index="2"]
show_behind_parent = true
position = Vector2( -12, -12 )
rotation = 0.415911
texture = ExtResource( 6 )
offset = Vector2( -4, 1 )
__meta__ = {
@ -47,6 +860,7 @@ __meta__ = {
[node name="MiddleSegment" type="Sprite" parent="Sprite/LeftUpperLeg" index="0"]
position = Vector2( -9, 3 )
rotation = -0.422727
texture = ExtResource( 7 )
offset = Vector2( -2, 4 )
__meta__ = {
@ -55,6 +869,7 @@ __meta__ = {
[node name="EndSegment" type="Sprite" parent="Sprite/LeftUpperLeg/MiddleSegment" index="0"]
position = Vector2( -6, 10 )
rotation = -0.203221
texture = ExtResource( 8 )
offset = Vector2( 1, 2 )
__meta__ = {
@ -70,7 +885,7 @@ __meta__ = {
[node name="LeftLowerLeg" type="Sprite" parent="Sprite" index="3"]
show_behind_parent = true
position = Vector2( -9, 4.76837e-07 )
rotation = -0.261799
rotation = -0.349632
texture = ExtResource( 6 )
offset = Vector2( -4, 1 )
__meta__ = {
@ -79,7 +894,7 @@ __meta__ = {
[node name="MiddleSegment" type="Sprite" parent="Sprite/LeftLowerLeg" index="0"]
position = Vector2( -12, 3 )
rotation = -0.436332
rotation = -0.67436
texture = ExtResource( 7 )
offset = Vector2( -2, 4 )
__meta__ = {
@ -88,7 +903,7 @@ __meta__ = {
[node name="EndSegment" type="Sprite" parent="Sprite/LeftLowerLeg/MiddleSegment" index="0"]
position = Vector2( -6, 10 )
rotation = -0.349066
rotation = 0.310464
texture = ExtResource( 8 )
offset = Vector2( 1, 2 )
__meta__ = {
@ -104,6 +919,7 @@ __meta__ = {
[node name="RightUpeerLeg" type="Sprite" parent="Sprite" index="4"]
show_behind_parent = true
position = Vector2( 12, -12 )
rotation = -0.341984
texture = ExtResource( 6 )
offset = Vector2( 5, 1 )
flip_h = true
@ -113,6 +929,7 @@ __meta__ = {
[node name="MiddleSegment" type="Sprite" parent="Sprite/RightUpeerLeg" index="0"]
position = Vector2( 12, 3 )
rotation = 0.449491
texture = ExtResource( 7 )
offset = Vector2( 3, 4 )
flip_h = true
@ -122,7 +939,7 @@ __meta__ = {
[node name="EndSegment" type="Sprite" parent="Sprite/RightUpeerLeg/MiddleSegment" index="0"]
position = Vector2( 6, 10 )
rotation = 0.261799
rotation = 0.342361
texture = ExtResource( 8 )
offset = Vector2( -1, 2 )
flip_h = true
@ -139,7 +956,7 @@ __meta__ = {
[node name="RightLowerLeg" type="Sprite" parent="Sprite" index="5"]
show_behind_parent = true
position = Vector2( 9, 0 )
rotation = 0.261799
rotation = 0.356999
texture = ExtResource( 6 )
offset = Vector2( 5, 1 )
flip_h = true
@ -149,7 +966,7 @@ __meta__ = {
[node name="MiddleSegment" type="Sprite" parent="Sprite/RightLowerLeg" index="0"]
position = Vector2( 12.1781, 2.94854 )
rotation = 0.436332
rotation = 0.585292
texture = ExtResource( 7 )
offset = Vector2( 3, 4 )
flip_h = true
@ -159,7 +976,7 @@ __meta__ = {
[node name="EndSegment" type="Sprite" parent="Sprite/RightLowerLeg/MiddleSegment" index="0"]
position = Vector2( 6, 10 )
rotation = 0.261799
rotation = 0.0375597
texture = ExtResource( 8 )
offset = Vector2( -1, 2 )
flip_h = true
@ -174,5 +991,39 @@ __meta__ = {
}
[node name="Head" type="Sprite" parent="Sprite" index="6"]
position = Vector2( 0, -7 )
position = Vector2( 0, -7.76463 )
texture = ExtResource( 2 )
[node name="AnimationPlayer" parent="." index="3"]
autoplay = "Fly"
anims/Base = SubResource( 1 )
anims/Fly = SubResource( 2 )
[node name="Collider" parent="Hurtbox" index="0"]
position = Vector2( 0, -7 )
shape = SubResource( 3 )
[node name="Collider" parent="Hitbox" index="0"]
shape = SubResource( 4 )
[node name="EnemyStats" parent="." index="6"]
max_health = 100
[node name="RightWallCheck" type="RayCast2D" parent="." index="7"]
enabled = true
cast_to = Vector2( 16, 0 )
collision_mask = 2
[node name="LeftWallCheck" type="RayCast2D" parent="." index="8"]
enabled = true
cast_to = Vector2( -16, 0 )
collision_mask = 2
[node name="Timer" type="Timer" parent="." index="9"]
wait_time = 0.3
autostart = true
[connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"]
[editable path="Hurtbox"]
[editable path="Hitbox"]

View File

@ -6,6 +6,8 @@ export (int) var MAX_SPEED = 15
onready var stats = $EnemyStats
signal died
var motion = Vector2.ZERO
func _on_Hurtbox_hit(damage):
@ -14,3 +16,4 @@ func _on_Hurtbox_hit(damage):
func _on_EnemyStats_enemy_died():
Utils.instance_scene_on_main(EnemyDeathEffect, global_position)
queue_free()
emit_signal("died")

View File

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

View File

@ -0,0 +1,65 @@
[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"]
collision_layer = 0
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

@ -0,0 +1,23 @@
[gd_scene load_steps=4 format=2]
[ext_resource path="res://Assets/Enemies/Spikes.png" type="Texture" id=1]
[ext_resource path="res://Scenes/Objects/Hitbox.tscn" type="PackedScene" id=2]
[sub_resource type="RectangleShape2D" id=1]
extents = Vector2( 8, 8 )
[node name="Spikes" type="Node2D"]
[node name="Sprite" type="Sprite" parent="."]
z_index = 20
texture = ExtResource( 1 )
centered = false
[node name="Hitbox" parent="." instance=ExtResource( 2 )]
collision_mask = 4
[node name="Collider" parent="Hitbox" index="0"]
position = Vector2( 8, 8 )
shape = SubResource( 1 )
[editable path="Hitbox"]

View File

@ -2,4 +2,5 @@ extends Powerup
func _pickup():
PlayerStats.missiles_unlocked = true
PlayerStats.missiles += 1
queue_free()

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,9 +51,23 @@ 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
# We need to check if the player in maininstances is this player instance,
# it could be a loaded player and this call is made after the new player
# is instanced and set in the MainInstances, so the new player is there and
# we set it to null, breaking the game.
if MainInstances.Player == self:
MainInstances.Player = null
# This is another solution to the above problem
# func queue_free():
# MainInstances.Player = null
# .queue_free()
func _physics_process(delta):
just_jumped = false
@ -233,6 +248,15 @@ func wall_detach(delta, wall_axis):
if wall_axis == 0 or is_on_floor():
state = MOVE
func save():
var data = {
"filename": get_filename(),
"parent": get_parent().get_path(),
"position_x": position.x,
"position_y": position.y
}
return data
func _on_Hurtbox_hit(damage):
if not invincible:
PlayerStats.health -= damage

View File

@ -122,12 +122,15 @@ tracks/1/keys = {
} ]
}
[node name="Player" type="KinematicBody2D"]
[node name="Player" type="KinematicBody2D" groups=[
"Persists",
]]
collision_mask = 2
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

@ -5,7 +5,7 @@ var max_health = 4
var health = max_health setget set_health
var missiles_unlocked = false setget set_missiles_unlocked
var max_missiles = 3
var missiles = max_missiles setget set_missiles
var missiles = 0 setget set_missiles
signal player_health_changed(value)
signal player_missiles_unlocked(value)

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,13 +1,19 @@
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 _process(delta):
func _exit_tree():
MainInstances.WorldCamera = null
func _process(_delta):
offset_h = rand_range(-shake, shake)
offset_v = rand_range(-shake, shake)

View File

@ -0,0 +1,11 @@
extends Area2D
signal triggered
var enabled = true
func _on_Trigger_body_entered(_body):
if enabled:
emit_signal("triggered")
enabled = false

View File

@ -0,0 +1,15 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://Scenes/World/Trigger.gd" type="Script" id=1]
[sub_resource type="RectangleShape2D" id=1]
extents = Vector2( 8, 16 )
[node name="Trigger" type="Area2D"]
script = ExtResource( 1 )
[node name="Collision" type="CollisionShape2D" parent="."]
position = Vector2( 23, 16 )
shape = SubResource( 1 )
[connection signal="body_entered" from="." to="." method="_on_Trigger_body_entered"]

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,18 +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, -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]
@ -41,6 +41,7 @@ config/icon="res://icon.png"
Utils="*res://Utils.gd"
ResourceLoader="*res://ResourceLoader.gd"
Events="*res://Events.gd"
SaverLoader="*res://SaverLoader.gd"
[display]