Merge branch 'main' into Space-level
This commit is contained in:
@@ -3,4 +3,15 @@ extends Node2D
|
||||
|
||||
func _ready() -> void:
|
||||
$YSort/Player.load_hud($HUD)
|
||||
|
||||
for level_portal in $'YSort/Level Portals'.get_children():
|
||||
if level_portal.connect('enter_level', self, 'enter_level') != OK:
|
||||
print('ERROR: Level Portal "enter_level" signal already connected.')
|
||||
return
|
||||
|
||||
|
||||
func enter_level(level: String) -> void:
|
||||
if get_tree().change_scene(level) != OK:
|
||||
print('ERROR: Hub World failed to change scene to Level.')
|
||||
queue_free()
|
||||
return
|
||||
|
File diff suppressed because one or more lines are too long
10
Levels/Interactables/Coin.gd
Normal file
10
Levels/Interactables/Coin.gd
Normal file
@@ -0,0 +1,10 @@
|
||||
extends Area2D
|
||||
|
||||
signal coin_grabbed
|
||||
|
||||
|
||||
func _on_Node2D_body_entered(body: Node) -> void:
|
||||
if body.get_name() == 'Player':
|
||||
emit_signal("coin_grabbed")
|
||||
print("coin!")
|
||||
queue_free()
|
19
Levels/Interactables/Coin.tscn
Normal file
19
Levels/Interactables/Coin.tscn
Normal file
@@ -0,0 +1,19 @@
|
||||
[gd_scene load_steps=4 format=2]
|
||||
|
||||
[ext_resource path="res://Levels/Interactables/Coin.gd" type="Script" id=1]
|
||||
[ext_resource path="res://Sprites/Assets/coin.png" type="Texture" id=2]
|
||||
|
||||
[sub_resource type="CircleShape2D" id=1]
|
||||
radius = 6.38067
|
||||
|
||||
[node name="coin" type="Area2D"]
|
||||
script = ExtResource( 1 )
|
||||
|
||||
[node name="Sprite" type="Sprite" parent="."]
|
||||
position = Vector2( 0, 1 )
|
||||
texture = ExtResource( 2 )
|
||||
|
||||
[node name="coin" type="CollisionShape2D" parent="."]
|
||||
shape = SubResource( 1 )
|
||||
|
||||
[connection signal="body_entered" from="." to="." method="_on_Node2D_body_entered"]
|
11
Levels/Interactables/Level Portal.gd
Normal file
11
Levels/Interactables/Level Portal.gd
Normal file
@@ -0,0 +1,11 @@
|
||||
extends Area2D
|
||||
|
||||
signal enter_level(level)
|
||||
|
||||
export var level_path: String = 'res://Levels/LEVEL.tscn'
|
||||
|
||||
|
||||
func _on_level_portal_body_entered(body: Node) -> void:
|
||||
if body.is_in_group('player'):
|
||||
emit_signal('enter_level', level_path)
|
||||
return
|
28
Levels/Interactables/Level Portal.tscn
Normal file
28
Levels/Interactables/Level Portal.tscn
Normal file
@@ -0,0 +1,28 @@
|
||||
[gd_scene load_steps=4 format=2]
|
||||
|
||||
[ext_resource path="res://Sprites/Levels/Interactables/Level_Portal.png" type="Texture" id=1]
|
||||
[ext_resource path="res://Levels/Interactables/Level Portal.gd" type="Script" id=2]
|
||||
|
||||
[sub_resource type="CapsuleShape2D" id=1]
|
||||
radius = 8.0
|
||||
height = 18.0
|
||||
|
||||
[node name="Level Portal" type="Area2D"]
|
||||
light_mask = 0
|
||||
collision_layer = 0
|
||||
collision_mask = 2
|
||||
input_pickable = false
|
||||
monitorable = false
|
||||
script = ExtResource( 2 )
|
||||
|
||||
[node name="Sprite" type="Sprite" parent="."]
|
||||
texture = ExtResource( 1 )
|
||||
offset = Vector2( 0, -8 )
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
|
||||
visible = false
|
||||
light_mask = 0
|
||||
position = Vector2( 0, -8 )
|
||||
shape = SubResource( 1 )
|
||||
|
||||
[connection signal="body_entered" from="." to="." method="_on_level_portal_body_entered"]
|
@@ -38,10 +38,10 @@ shape = SubResource( 2 )
|
||||
|
||||
[node name="Unlock" type="Area2D" parent="."]
|
||||
light_mask = 0
|
||||
collision_layer = 0
|
||||
collision_mask = 2
|
||||
input_pickable = false
|
||||
monitorable = false
|
||||
collision_layer = 0
|
||||
collision_mask = 2
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="Unlock"]
|
||||
visible = false
|
||||
|
56
Levels/Level 3.gd
Normal file
56
Levels/Level 3.gd
Normal file
@@ -0,0 +1,56 @@
|
||||
extends Node2D
|
||||
|
||||
onready var coin = preload('res://Levels/Interactables/Coin.tscn')
|
||||
|
||||
var screensize
|
||||
var score = 0
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
$YSort/Player.load_hud($HUD)
|
||||
screensize = get_viewport_rect().size
|
||||
spawn_coins(8)
|
||||
return
|
||||
|
||||
|
||||
func spawn_coins(num: int) -> void:
|
||||
for _i in range(num):
|
||||
var g: Node = coin.instance()
|
||||
$'coin_container'.add_child(g)
|
||||
g.connect('coin_grabbed', self, '_on_coin_grabbed')
|
||||
#g.set_pos(Vector2(rand_range(0, screensize.x - 40), rand_range(0, screensize.y - 40)))
|
||||
g.position = Vector2(rand_range(0, screensize.x - 40), rand_range(0, screensize.y - 40))
|
||||
return
|
||||
|
||||
|
||||
func _on_coin_grabbed() -> void:
|
||||
score += 1
|
||||
print(score)
|
||||
$'Level 3 HUD/Label'.set_text(str(score) + '/5')
|
||||
return
|
||||
|
||||
|
||||
func _timer_out() -> void:
|
||||
get_tree().change_scene('res://Levels/Hub World.tscn')
|
||||
return
|
||||
|
||||
|
||||
func _on_TreasureChest_ice_key_collected() -> void:
|
||||
$YSort/Door/doorClosed.visible = false
|
||||
$YSort/Door/doorOpened.visible = true
|
||||
$YSort/DoorCollision.layers = 5
|
||||
return
|
||||
|
||||
|
||||
func _on_DoorDetector_body_entered(body: Node) -> void:
|
||||
if body.is_in_group('player'):
|
||||
print('WIN WIN WIN')
|
||||
get_tree().change_scene('res://Levels/Hub World.tscn')
|
||||
return
|
||||
|
||||
|
||||
func _on_DoorDetector_area_entered(area: Area2D) -> void:
|
||||
if area.get_parent().name == 'Player':
|
||||
print('WIN WIN WIN')
|
||||
get_tree().change_scene('res://Levels/Hub World.tscn')
|
||||
return
|
227
Levels/Level 3.tscn
Normal file
227
Levels/Level 3.tscn
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
16
Levels/Objects/IceDoor.gd
Normal file
16
Levels/Objects/IceDoor.gd
Normal file
@@ -0,0 +1,16 @@
|
||||
extends Sprite
|
||||
|
||||
|
||||
# Declare member variables here. Examples:
|
||||
# var a: int = 2
|
||||
# var b: String = "text"
|
||||
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready() -> void:
|
||||
pass # Replace with function body.
|
||||
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
#func _process(delta: float) -> void:
|
||||
# pass
|
21
Levels/Objects/IceDoor.tscn
Normal file
21
Levels/Objects/IceDoor.tscn
Normal file
@@ -0,0 +1,21 @@
|
||||
[gd_scene load_steps=3 format=2]
|
||||
|
||||
[ext_resource path="res://Sprites/Levels/Objects/Gate_Open.png" type="Texture" id=1]
|
||||
[ext_resource path="res://Sprites/Levels/Objects/Gate_Closed.png" type="Texture" id=2]
|
||||
|
||||
[node name="IceDoor" type="Sprite"]
|
||||
|
||||
[node name="doorClosed" type="Sprite" parent="."]
|
||||
modulate = Color( 0.00392157, 0.905882, 1, 1 )
|
||||
self_modulate = Color( 0.0352941, 0.705882, 1, 1 )
|
||||
position = Vector2( 0.530327, 0.0883861 )
|
||||
scale = Vector2( 0.742002, 0.706551 )
|
||||
texture = ExtResource( 2 )
|
||||
|
||||
[node name="doorOpened" type="Sprite" parent="."]
|
||||
visible = false
|
||||
modulate = Color( 0.00392157, 0.905882, 1, 1 )
|
||||
self_modulate = Color( 0.0352941, 0.705882, 1, 1 )
|
||||
position = Vector2( 0.353549, 0.97227 )
|
||||
scale = Vector2( 0.732446, 0.669794 )
|
||||
texture = ExtResource( 1 )
|
24
Levels/Objects/Key.gd
Normal file
24
Levels/Objects/Key.gd
Normal file
@@ -0,0 +1,24 @@
|
||||
extends Node2D
|
||||
|
||||
|
||||
# Declare member variables here. Examples:
|
||||
# var a: int = 2
|
||||
# var b: String = "text"
|
||||
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready() -> void:
|
||||
pass # Replace with function body.
|
||||
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
#func _process(delta: float) -> void:
|
||||
# pass
|
||||
|
||||
|
||||
func _on_AnimationPlayer_animation_finished(anim_name: String) -> void:
|
||||
$IceKeySprite.visible = false
|
||||
|
||||
|
||||
func _on_AnimationPlayer_animation_started(anim_name: String) -> void:
|
||||
$IceKeySprite.visible = true
|
21
Levels/Objects/Key.tscn
Normal file
21
Levels/Objects/Key.tscn
Normal file
@@ -0,0 +1,21 @@
|
||||
[gd_scene load_steps=4 format=2]
|
||||
|
||||
[ext_resource path="res://Levels/Objects/icekey.png" type="Texture" id=1]
|
||||
[ext_resource path="res://Levels/Interactables/Gem.gd" type="Script" id=2]
|
||||
|
||||
[sub_resource type="Animation" id=1]
|
||||
resource_name = "rise"
|
||||
length = 1.2
|
||||
|
||||
[node name="Key" type="Node2D"]
|
||||
script = ExtResource( 2 )
|
||||
|
||||
[node name="IceKeySprite" type="Sprite" parent="."]
|
||||
position = Vector2( -0.0417144, 0.145997 )
|
||||
scale = Vector2( 0.760146, 0.732771 )
|
||||
texture = ExtResource( 1 )
|
||||
|
||||
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
|
||||
anims/rise = SubResource( 1 )
|
||||
|
||||
[connection signal="animation_finished" from="AnimationPlayer" to="." method="_on_AnimationPlayer_animation_finished"]
|
34
Levels/Objects/TreasureChest_L3.gd
Normal file
34
Levels/Objects/TreasureChest_L3.gd
Normal file
@@ -0,0 +1,34 @@
|
||||
extends Sprite
|
||||
|
||||
var is_player_inside: bool = false
|
||||
var is_opened: bool = false
|
||||
var has_key: bool = true
|
||||
|
||||
signal ice_key_collected
|
||||
|
||||
# Declare member variables here. Examples:
|
||||
# var a: int = 2
|
||||
# var b: String = "text"
|
||||
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready() -> void:
|
||||
pass # Replace with function body.
|
||||
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
#func _process(delta: float) -> void:
|
||||
# pass
|
||||
|
||||
|
||||
func _on_Player_Detector_area_entered(area: Area2D) -> void:
|
||||
print(get_parent().get_parent().score)
|
||||
if area.get_parent().name == 'Player' and get_parent().get_parent().score >= 5:
|
||||
if is_opened == false:
|
||||
$chestClosed.visible = false
|
||||
$chestOpened.visible = true
|
||||
$Key.visible = true
|
||||
$Key/AnimationPlayer.play("rise")
|
||||
is_opened = true
|
||||
has_key = false
|
||||
emit_signal("ice_key_collected")
|
38
Levels/Objects/TreasureChest_L3.tscn
Normal file
38
Levels/Objects/TreasureChest_L3.tscn
Normal file
@@ -0,0 +1,38 @@
|
||||
[gd_scene load_steps=7 format=2]
|
||||
|
||||
[ext_resource path="res://Levels/Interactables/Treasure Chest.gd" type="Script" id=1]
|
||||
[ext_resource path="res://Levels/Objects/Key.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://Sprites/Levels/Interactables/Treasure_Chest_Closed.png" type="Texture" id=3]
|
||||
[ext_resource path="res://Sprites/Levels/Interactables/Treasure_Chest_Open.png" type="Texture" id=4]
|
||||
[ext_resource path="res://Levels/Objects/Key.gd" type="Script" id=5]
|
||||
|
||||
[sub_resource type="RectangleShape2D" id=1]
|
||||
extents = Vector2( 21.3333, 17.3333 )
|
||||
|
||||
[node name="TreasureChest" type="Sprite" groups=["enemies"]]
|
||||
script = ExtResource( 1 )
|
||||
|
||||
[node name="chestOpened" type="Sprite" parent="."]
|
||||
visible = false
|
||||
texture = ExtResource( 4 )
|
||||
|
||||
[node name="chestClosed" type="Sprite" parent="."]
|
||||
texture = ExtResource( 3 )
|
||||
|
||||
[node name="Key" parent="." instance=ExtResource( 2 )]
|
||||
visible = false
|
||||
script = ExtResource( 5 )
|
||||
|
||||
[node name="Player Detector" type="Area2D" parent="."]
|
||||
collision_layer = 0
|
||||
collision_mask = 2
|
||||
input_pickable = false
|
||||
monitorable = false
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="Player Detector"]
|
||||
visible = false
|
||||
position = Vector2( 1, -1 )
|
||||
scale = Vector2( 1.5, 1.5 )
|
||||
shape = SubResource( 1 )
|
||||
|
||||
[connection signal="area_entered" from="Player Detector" to="." method="_on_Player_Detector_area_entered"]
|
17
Levels/Objects/Tree.tscn
Normal file
17
Levels/Objects/Tree.tscn
Normal file
@@ -0,0 +1,17 @@
|
||||
[gd_scene load_steps=3 format=2]
|
||||
|
||||
[ext_resource path="res://Sprites/Assets/forestTreeBig.png" type="Texture" id=1]
|
||||
|
||||
[sub_resource type="CapsuleShape2D" id=1]
|
||||
radius = 5.0
|
||||
height = 9.0
|
||||
|
||||
[node name="Tree" type="StaticBody2D"]
|
||||
|
||||
[node name="Sprite" type="Sprite" parent="."]
|
||||
texture = ExtResource( 1 )
|
||||
offset = Vector2( 0, -5 )
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
|
||||
rotation = 1.5708
|
||||
shape = SubResource( 1 )
|
BIN
Levels/Objects/icekey.png
Normal file
BIN
Levels/Objects/icekey.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 285 B |
35
Levels/Objects/icekey.png.import
Normal file
35
Levels/Objects/icekey.png.import
Normal file
@@ -0,0 +1,35 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="StreamTexture"
|
||||
path="res://.import/icekey.png-527d7dd5cd660f0970e78efce0eda1a1.stex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Levels/Objects/icekey.png"
|
||||
dest_files=[ "res://.import/icekey.png-527d7dd5cd660f0970e78efce0eda1a1.stex" ]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_mode=0
|
||||
compress/bptc_ldr=0
|
||||
compress/normal_map=0
|
||||
flags/repeat=0
|
||||
flags/filter=false
|
||||
flags/mipmaps=false
|
||||
flags/anisotropic=false
|
||||
flags/srgb=2
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/HDR_as_SRGB=false
|
||||
process/invert_color=false
|
||||
process/normal_map_invert_y=false
|
||||
stream=false
|
||||
size_limit=0
|
||||
detect_3d=false
|
||||
svg/scale=1.0
|
35
Levels/SlowTime.gd
Normal file
35
Levels/SlowTime.gd
Normal file
@@ -0,0 +1,35 @@
|
||||
extends Node
|
||||
|
||||
signal unfreeze
|
||||
|
||||
const END_VALUE: int = 1
|
||||
|
||||
var is_active: bool = false
|
||||
var time_start: int
|
||||
var duration_ms: int
|
||||
var start_value: float
|
||||
|
||||
|
||||
func start(duration: int = 1, strength: float = 0.9):
|
||||
time_start = OS.get_ticks_msec()
|
||||
duration_ms = duration * 1000
|
||||
start_value = 1 - strength
|
||||
Engine.time_scale = start_value
|
||||
is_active = true
|
||||
|
||||
|
||||
func _process(_delta: float) -> void:
|
||||
if is_active:
|
||||
var current_time = OS.get_ticks_msec() - time_start
|
||||
var value = circl_ease_in(current_time, start_value, END_VALUE, duration_ms)
|
||||
if current_time >= duration_ms:
|
||||
is_active = false
|
||||
value = END_VALUE
|
||||
emit_signal('unfreeze')
|
||||
Engine.time_scale = value
|
||||
return
|
||||
|
||||
|
||||
func circl_ease_in(t, b, c, d):
|
||||
t /= d
|
||||
return -c * (sqrt(1 - t * t) - 1) + b
|
@@ -7,7 +7,7 @@ export var relative_y_tiles: int
|
||||
|
||||
func _on_spawn_trap_body_entered(body: Node) -> void:
|
||||
if body.is_in_group('player'):
|
||||
set_deferred('monitoring', false)
|
||||
$Tile.set_deferred('disabled', true)
|
||||
|
||||
var enemy: KinematicBody2D = load(enemy_path).instance()
|
||||
enemy.position.x = position.x + (relative_x_tiles * 16 + 8)
|
||||
|
Reference in New Issue
Block a user