Added level 1, base-level to abstract from, and level-controller
							
								
								
									
										
											BIN
										
									
								
								assets/fonts/ice_pixel-7.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								assets/music_icon.xcf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								assets/play.xcf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								assets/pointer_indicator.xcf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								assets/shaders/Blinds.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 695 KiB  | 
							
								
								
									
										35
									
								
								assets/shaders/Blinds.png.import
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,35 @@
 | 
			
		||||
[remap]
 | 
			
		||||
 | 
			
		||||
importer="texture"
 | 
			
		||||
type="StreamTexture"
 | 
			
		||||
path="res://.import/Blinds.png-2bd8a9f6eba63f8eb0695083fdf9397c.stex"
 | 
			
		||||
metadata={
 | 
			
		||||
"vram_texture": false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[deps]
 | 
			
		||||
 | 
			
		||||
source_file="res://assets/shaders/Blinds.png"
 | 
			
		||||
dest_files=[ "res://.import/Blinds.png-2bd8a9f6eba63f8eb0695083fdf9397c.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=true
 | 
			
		||||
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=true
 | 
			
		||||
svg/scale=1.0
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								assets/ui/music-hover.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 693 B  | 
							
								
								
									
										35
									
								
								assets/ui/music-hover.png.import
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,35 @@
 | 
			
		||||
[remap]
 | 
			
		||||
 | 
			
		||||
importer="texture"
 | 
			
		||||
type="StreamTexture"
 | 
			
		||||
path="res://.import/music-hover.png-41e3fb39d172b3252aeeef3a9bab17af.stex"
 | 
			
		||||
metadata={
 | 
			
		||||
"vram_texture": false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[deps]
 | 
			
		||||
 | 
			
		||||
source_file="res://assets/ui/music-hover.png"
 | 
			
		||||
dest_files=[ "res://.import/music-hover.png-41e3fb39d172b3252aeeef3a9bab17af.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
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								assets/ui/pause-hover.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 647 B  | 
							
								
								
									
										35
									
								
								assets/ui/pause-hover.png.import
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,35 @@
 | 
			
		||||
[remap]
 | 
			
		||||
 | 
			
		||||
importer="texture"
 | 
			
		||||
type="StreamTexture"
 | 
			
		||||
path="res://.import/pause-hover.png-e4ea4eb67c068bc5d056965d6f087be0.stex"
 | 
			
		||||
metadata={
 | 
			
		||||
"vram_texture": false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[deps]
 | 
			
		||||
 | 
			
		||||
source_file="res://assets/ui/pause-hover.png"
 | 
			
		||||
dest_files=[ "res://.import/pause-hover.png-e4ea4eb67c068bc5d056965d6f087be0.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
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								assets/ui/pause.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 631 B  | 
							
								
								
									
										35
									
								
								assets/ui/pause.png.import
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,35 @@
 | 
			
		||||
[remap]
 | 
			
		||||
 | 
			
		||||
importer="texture"
 | 
			
		||||
type="StreamTexture"
 | 
			
		||||
path="res://.import/pause.png-1ae561f3bc81500c9be2d9dbcefe44ff.stex"
 | 
			
		||||
metadata={
 | 
			
		||||
"vram_texture": false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[deps]
 | 
			
		||||
 | 
			
		||||
source_file="res://assets/ui/pause.png"
 | 
			
		||||
dest_files=[ "res://.import/pause.png-1ae561f3bc81500c9be2d9dbcefe44ff.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
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								assets/ui/play.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 695 B  | 
							
								
								
									
										35
									
								
								assets/ui/play.png.import
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,35 @@
 | 
			
		||||
[remap]
 | 
			
		||||
 | 
			
		||||
importer="texture"
 | 
			
		||||
type="StreamTexture"
 | 
			
		||||
path="res://.import/play.png-d5c85744be54e3dde1ca5bb32a24f02f.stex"
 | 
			
		||||
metadata={
 | 
			
		||||
"vram_texture": false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[deps]
 | 
			
		||||
 | 
			
		||||
source_file="res://assets/ui/play.png"
 | 
			
		||||
dest_files=[ "res://.import/play.png-d5c85744be54e3dde1ca5bb32a24f02f.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
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								assets/ui/pointer.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.4 KiB  | 
							
								
								
									
										35
									
								
								assets/ui/pointer.png.import
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,35 @@
 | 
			
		||||
[remap]
 | 
			
		||||
 | 
			
		||||
importer="texture"
 | 
			
		||||
type="StreamTexture"
 | 
			
		||||
path="res://.import/pointer.png-133392f260ecc87b51a28d66b4343076.stex"
 | 
			
		||||
metadata={
 | 
			
		||||
"vram_texture": false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[deps]
 | 
			
		||||
 | 
			
		||||
source_file="res://assets/ui/pointer.png"
 | 
			
		||||
dest_files=[ "res://.import/pointer.png-133392f260ecc87b51a28d66b4343076.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
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								assets/ui/pointer_hand.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.0 KiB  | 
							
								
								
									
										35
									
								
								assets/ui/pointer_hand.png.import
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,35 @@
 | 
			
		||||
[remap]
 | 
			
		||||
 | 
			
		||||
importer="texture"
 | 
			
		||||
type="StreamTexture"
 | 
			
		||||
path="res://.import/pointer_hand.png-1004d662901565d110a8c0d58ec1da71.stex"
 | 
			
		||||
metadata={
 | 
			
		||||
"vram_texture": false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[deps]
 | 
			
		||||
 | 
			
		||||
source_file="res://assets/ui/pointer_hand.png"
 | 
			
		||||
dest_files=[ "res://.import/pointer_hand.png-1004d662901565d110a8c0d58ec1da71.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
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								assets/ui_elements.xcf
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -9,6 +9,16 @@
 | 
			
		||||
config_version=4
 | 
			
		||||
 | 
			
		||||
_global_script_classes=[ {
 | 
			
		||||
"base": "Node2D",
 | 
			
		||||
"class": "BaseLevel",
 | 
			
		||||
"language": "GDScript",
 | 
			
		||||
"path": "res://scripts/base_level.gd"
 | 
			
		||||
}, {
 | 
			
		||||
"base": "Node2D",
 | 
			
		||||
"class": "GUI",
 | 
			
		||||
"language": "GDScript",
 | 
			
		||||
"path": "res://scripts/UI.gd"
 | 
			
		||||
}, {
 | 
			
		||||
"base": "KinematicBody2D",
 | 
			
		||||
"class": "Neighbor",
 | 
			
		||||
"language": "GDScript",
 | 
			
		||||
@ -25,6 +35,8 @@ _global_script_classes=[ {
 | 
			
		||||
"path": "res://scripts/trolley.gd"
 | 
			
		||||
} ]
 | 
			
		||||
_global_script_class_icons={
 | 
			
		||||
"BaseLevel": "",
 | 
			
		||||
"GUI": "",
 | 
			
		||||
"Neighbor": "",
 | 
			
		||||
"Player": "",
 | 
			
		||||
"Trolley": ""
 | 
			
		||||
@ -33,7 +45,7 @@ _global_script_class_icons={
 | 
			
		||||
[application]
 | 
			
		||||
 | 
			
		||||
config/name="roger"
 | 
			
		||||
run/main_scene="res://scenes/stage.tscn"
 | 
			
		||||
run/main_scene="res://scenes/level_controller.tscn"
 | 
			
		||||
 | 
			
		||||
[display]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -243,4 +243,6 @@ scale = Vector2( 5, 5 )
 | 
			
		||||
tile_set = SubResource( 2 )
 | 
			
		||||
cell_size = Vector2( 16, 16 )
 | 
			
		||||
show_collision = true
 | 
			
		||||
collision_layer = 4
 | 
			
		||||
collision_mask = 0
 | 
			
		||||
format = 1
 | 
			
		||||
 | 
			
		||||
@ -1,47 +0,0 @@
 | 
			
		||||
[gd_scene load_steps=6 format=2]
 | 
			
		||||
 | 
			
		||||
[ext_resource path="res://assets/fonts/8-BIT WONDER.TTF" type="DynamicFontData" id=1]
 | 
			
		||||
[ext_resource path="res://scripts/UI.gd" type="Script" id=2]
 | 
			
		||||
[ext_resource path="res://assets/ui/music-enabled.png" type="Texture" id=3]
 | 
			
		||||
 | 
			
		||||
[sub_resource type="DynamicFont" id=1]
 | 
			
		||||
font_data = ExtResource( 1 )
 | 
			
		||||
 | 
			
		||||
[sub_resource type="Theme" id=2]
 | 
			
		||||
default_font = SubResource( 1 )
 | 
			
		||||
 | 
			
		||||
[node name="GUI" type="Node2D"]
 | 
			
		||||
script = ExtResource( 2 )
 | 
			
		||||
 | 
			
		||||
[node name="MarginContainer" type="MarginContainer" parent="."]
 | 
			
		||||
margin_left = 20.0
 | 
			
		||||
margin_top = 20.0
 | 
			
		||||
margin_right = 1279.0
 | 
			
		||||
margin_bottom = 257.0
 | 
			
		||||
 | 
			
		||||
[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer"]
 | 
			
		||||
margin_right = 1259.0
 | 
			
		||||
margin_bottom = 237.0
 | 
			
		||||
 | 
			
		||||
[node name="TimeLabel" type="RichTextLabel" parent="MarginContainer/HBoxContainer"]
 | 
			
		||||
margin_right = 1227.0
 | 
			
		||||
margin_bottom = 237.0
 | 
			
		||||
size_flags_horizontal = 3
 | 
			
		||||
size_flags_vertical = 3
 | 
			
		||||
theme = SubResource( 2 )
 | 
			
		||||
text = "Time fdsafdsafdsa"
 | 
			
		||||
 | 
			
		||||
[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/HBoxContainer"]
 | 
			
		||||
margin_left = 1231.0
 | 
			
		||||
margin_right = 1259.0
 | 
			
		||||
margin_bottom = 237.0
 | 
			
		||||
 | 
			
		||||
[node name="ToolButton" type="ToolButton" parent="MarginContainer/HBoxContainer/VBoxContainer"]
 | 
			
		||||
margin_right = 28.0
 | 
			
		||||
margin_bottom = 24.0
 | 
			
		||||
toggle_mode = true
 | 
			
		||||
icon = ExtResource( 3 )
 | 
			
		||||
 | 
			
		||||
[node name="GameTimer" type="Timer" parent="."]
 | 
			
		||||
 | 
			
		||||
[connection signal="toggled" from="MarginContainer/HBoxContainer/VBoxContainer/ToolButton" to="." method="_on_ToolButton_toggled"]
 | 
			
		||||
							
								
								
									
										139
									
								
								scenes/base_level.tscn
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,139 @@
 | 
			
		||||
[gd_scene load_steps=13 format=2]
 | 
			
		||||
 | 
			
		||||
[ext_resource path="res://Y2Mate.is - Won't You Be My Neighbor [8 Bit Tribute to Mr. Rogers] - 8 Bit Universe-8f3BEcQp1Q4-48k-1659646018463.mp3" type="AudioStream" id=1]
 | 
			
		||||
[ext_resource path="res://scenes/clouds.tscn" type="PackedScene" id=2]
 | 
			
		||||
[ext_resource path="res://scenes/TileMap.tscn" type="PackedScene" id=3]
 | 
			
		||||
[ext_resource path="res://scripts/base_level.gd" type="Script" id=4]
 | 
			
		||||
[ext_resource path="res://scenes/trolley.tscn" type="PackedScene" id=5]
 | 
			
		||||
[ext_resource path="res://scenes/player.tscn" type="PackedScene" id=6]
 | 
			
		||||
[ext_resource path="res://scenes/neighbor.tscn" type="PackedScene" id=7]
 | 
			
		||||
[ext_resource path="res://scenes/house.tscn" type="PackedScene" id=8]
 | 
			
		||||
[ext_resource path="res://assets/fonts/8-BIT WONDER.TTF" type="DynamicFontData" id=9]
 | 
			
		||||
 | 
			
		||||
[sub_resource type="DynamicFont" id=1]
 | 
			
		||||
size = 40
 | 
			
		||||
font_data = ExtResource( 9 )
 | 
			
		||||
 | 
			
		||||
[sub_resource type="DynamicFont" id=3]
 | 
			
		||||
size = 40
 | 
			
		||||
 | 
			
		||||
[sub_resource type="Theme" id=2]
 | 
			
		||||
default_font = SubResource( 3 )
 | 
			
		||||
RichTextLabel/fonts/normal_font = SubResource( 1 )
 | 
			
		||||
 | 
			
		||||
[node name="BaseLevel" type="Node2D"]
 | 
			
		||||
script = ExtResource( 4 )
 | 
			
		||||
 | 
			
		||||
[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."]
 | 
			
		||||
stream = ExtResource( 1 )
 | 
			
		||||
pitch_scale = 0.75
 | 
			
		||||
 | 
			
		||||
[node name="TileMap" parent="." instance=ExtResource( 3 )]
 | 
			
		||||
collision_mask = 7
 | 
			
		||||
 | 
			
		||||
[node name="YSort" type="YSort" parent="."]
 | 
			
		||||
 | 
			
		||||
[node name="Player" parent="YSort" instance=ExtResource( 6 )]
 | 
			
		||||
position = Vector2( 619.221, 307.07 )
 | 
			
		||||
 | 
			
		||||
[node name="Trolley" parent="YSort" instance=ExtResource( 5 )]
 | 
			
		||||
position = Vector2( 629.977, 650.649 )
 | 
			
		||||
 | 
			
		||||
[node name="House1" parent="YSort" instance=ExtResource( 8 )]
 | 
			
		||||
position = Vector2( 1066, 540 )
 | 
			
		||||
 | 
			
		||||
[node name="Neighbor1" parent="YSort" instance=ExtResource( 7 )]
 | 
			
		||||
position = Vector2( 131, 429 )
 | 
			
		||||
 | 
			
		||||
[node name="Clouds" parent="." instance=ExtResource( 2 )]
 | 
			
		||||
position = Vector2( -0.17392, 0.152588 )
 | 
			
		||||
 | 
			
		||||
[node name="CameraBounds" type="Node2D" parent="."]
 | 
			
		||||
 | 
			
		||||
[node name="Left" type="Node2D" parent="CameraBounds"]
 | 
			
		||||
position = Vector2( -521, 432 )
 | 
			
		||||
 | 
			
		||||
[node name="Top" type="Node2D" parent="CameraBounds"]
 | 
			
		||||
position = Vector2( 594, -189 )
 | 
			
		||||
 | 
			
		||||
[node name="Right" type="Node2D" parent="CameraBounds"]
 | 
			
		||||
position = Vector2( 1757, 455 )
 | 
			
		||||
 | 
			
		||||
[node name="Bottom" type="Node2D" parent="CameraBounds"]
 | 
			
		||||
position = Vector2( 655, 1037 )
 | 
			
		||||
 | 
			
		||||
[node name="TrolleyLocations" type="Node2D" parent="."]
 | 
			
		||||
 | 
			
		||||
[node name="TrolleyStart" type="Node2D" parent="TrolleyLocations"]
 | 
			
		||||
position = Vector2( 72, 91 )
 | 
			
		||||
 | 
			
		||||
[node name="TrolleyEnd" type="Node2D" parent="TrolleyLocations"]
 | 
			
		||||
position = Vector2( 1258, 154 )
 | 
			
		||||
 | 
			
		||||
[node name="Panel" type="Panel" parent="."]
 | 
			
		||||
visible = false
 | 
			
		||||
margin_left = -2.0
 | 
			
		||||
margin_top = -6.0
 | 
			
		||||
margin_right = 1361.0
 | 
			
		||||
margin_bottom = 1054.0
 | 
			
		||||
 | 
			
		||||
[node name="VBoxContainer" type="VBoxContainer" parent="Panel"]
 | 
			
		||||
anchor_right = 1.0
 | 
			
		||||
anchor_bottom = 1.0
 | 
			
		||||
size_flags_horizontal = 3
 | 
			
		||||
size_flags_vertical = 3
 | 
			
		||||
 | 
			
		||||
[node name="Control" type="Control" parent="Panel/VBoxContainer"]
 | 
			
		||||
margin_right = 1363.0
 | 
			
		||||
margin_bottom = 279.0
 | 
			
		||||
size_flags_horizontal = 3
 | 
			
		||||
size_flags_vertical = 3
 | 
			
		||||
 | 
			
		||||
[node name="EndGameTitle" type="RichTextLabel" parent="Panel/VBoxContainer"]
 | 
			
		||||
margin_left = 181.0
 | 
			
		||||
margin_top = 283.0
 | 
			
		||||
margin_right = 1181.0
 | 
			
		||||
margin_bottom = 324.0
 | 
			
		||||
rect_min_size = Vector2( 1000, 0 )
 | 
			
		||||
size_flags_horizontal = 4
 | 
			
		||||
size_flags_vertical = 4
 | 
			
		||||
theme = SubResource( 2 )
 | 
			
		||||
text = "This is the text"
 | 
			
		||||
fit_content_height = true
 | 
			
		||||
 | 
			
		||||
[node name="Control3" type="Control" parent="Panel/VBoxContainer"]
 | 
			
		||||
margin_top = 328.0
 | 
			
		||||
margin_right = 1363.0
 | 
			
		||||
margin_bottom = 390.0
 | 
			
		||||
size_flags_horizontal = 3
 | 
			
		||||
size_flags_vertical = 3
 | 
			
		||||
size_flags_stretch_ratio = 0.22
 | 
			
		||||
 | 
			
		||||
[node name="EndGameBody" type="RichTextLabel" parent="Panel/VBoxContainer"]
 | 
			
		||||
margin_left = 181.0
 | 
			
		||||
margin_top = 394.0
 | 
			
		||||
margin_right = 1181.0
 | 
			
		||||
margin_bottom = 435.0
 | 
			
		||||
rect_min_size = Vector2( 1000, 0 )
 | 
			
		||||
size_flags_horizontal = 4
 | 
			
		||||
size_flags_vertical = 4
 | 
			
		||||
theme = SubResource( 2 )
 | 
			
		||||
text = "This is the text"
 | 
			
		||||
fit_content_height = true
 | 
			
		||||
 | 
			
		||||
[node name="Control2" type="Control" parent="Panel/VBoxContainer"]
 | 
			
		||||
margin_top = 439.0
 | 
			
		||||
margin_right = 1363.0
 | 
			
		||||
margin_bottom = 1060.0
 | 
			
		||||
size_flags_horizontal = 3
 | 
			
		||||
size_flags_vertical = 3
 | 
			
		||||
size_flags_stretch_ratio = 2.22
 | 
			
		||||
 | 
			
		||||
[node name="DisplayTimer" type="Timer" parent="."]
 | 
			
		||||
one_shot = true
 | 
			
		||||
autostart = true
 | 
			
		||||
 | 
			
		||||
[connection signal="left_wih_rogers" from="YSort/Trolley" to="." method="_on_Trolley_left_wih_rogers"]
 | 
			
		||||
[connection signal="rogers_entered_trolley" from="YSort/Trolley" to="." method="_on_Trolley_rogers_entered_trolley"]
 | 
			
		||||
[connection signal="rogers_left_trolley" from="YSort/Trolley" to="." method="_on_Trolley_rogers_left_trolley"]
 | 
			
		||||
[connection signal="timeout" from="DisplayTimer" to="." method="_on_DisplayTimer_timeout"]
 | 
			
		||||
							
								
								
									
										20
									
								
								scenes/clouds.tscn
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,20 @@
 | 
			
		||||
[gd_scene load_steps=2 format=2]
 | 
			
		||||
 | 
			
		||||
[ext_resource path="res://scripts/Clouds.gd" type="Script" id=3]
 | 
			
		||||
 | 
			
		||||
[node name="Clouds" type="Node2D"]
 | 
			
		||||
position = Vector2( -2.43112, -0.845276 )
 | 
			
		||||
scale = Vector2( 10, 10 )
 | 
			
		||||
script = ExtResource( 3 )
 | 
			
		||||
 | 
			
		||||
[node name="RightBorder" type="Node2D" parent="."]
 | 
			
		||||
position = Vector2( 127.8, 47.0604 )
 | 
			
		||||
 | 
			
		||||
[node name="LeftBorder" type="Node2D" parent="."]
 | 
			
		||||
position = Vector2( 0.0503082, 46.0223 )
 | 
			
		||||
 | 
			
		||||
[node name="TopBorder" type="Node2D" parent="."]
 | 
			
		||||
position = Vector2( 62.236, 0.33577 )
 | 
			
		||||
 | 
			
		||||
[node name="BottomBorder" type="Node2D" parent="."]
 | 
			
		||||
position = Vector2( 61.0313, 94.858 )
 | 
			
		||||
							
								
								
									
										36
									
								
								scenes/game-screen.tscn
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,36 @@
 | 
			
		||||
[gd_scene load_steps=4 format=2]
 | 
			
		||||
 | 
			
		||||
[ext_resource path="res://assets/fonts/8-BIT WONDER.TTF" type="DynamicFontData" id=1]
 | 
			
		||||
 | 
			
		||||
[sub_resource type="DynamicFont" id=1]
 | 
			
		||||
size = 30
 | 
			
		||||
font_data = ExtResource( 1 )
 | 
			
		||||
 | 
			
		||||
[sub_resource type="Theme" id=2]
 | 
			
		||||
RichTextLabel/fonts/normal_font = SubResource( 1 )
 | 
			
		||||
 | 
			
		||||
[node name="Panel" type="Panel"]
 | 
			
		||||
margin_left = -31.0
 | 
			
		||||
margin_top = -245.0
 | 
			
		||||
margin_right = 1332.0
 | 
			
		||||
margin_bottom = 815.0
 | 
			
		||||
 | 
			
		||||
[node name="VBoxContainer" type="VBoxContainer" parent="."]
 | 
			
		||||
margin_right = 1299.0
 | 
			
		||||
margin_bottom = 992.0
 | 
			
		||||
size_flags_horizontal = 3
 | 
			
		||||
size_flags_vertical = 3
 | 
			
		||||
 | 
			
		||||
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"]
 | 
			
		||||
margin_right = 1299.0
 | 
			
		||||
margin_bottom = 992.0
 | 
			
		||||
size_flags_horizontal = 3
 | 
			
		||||
size_flags_vertical = 3
 | 
			
		||||
 | 
			
		||||
[node name="RichTextLabel" type="RichTextLabel" parent="VBoxContainer/HBoxContainer"]
 | 
			
		||||
margin_right = 1299.0
 | 
			
		||||
margin_bottom = 992.0
 | 
			
		||||
size_flags_horizontal = 3
 | 
			
		||||
size_flags_vertical = 3
 | 
			
		||||
theme = SubResource( 2 )
 | 
			
		||||
text = "This is the text"
 | 
			
		||||
							
								
								
									
										99
									
								
								scenes/gui.tscn
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,99 @@
 | 
			
		||||
[gd_scene load_steps=12 format=2]
 | 
			
		||||
 | 
			
		||||
[ext_resource path="res://assets/ui/play.png" type="Texture" id=1]
 | 
			
		||||
[ext_resource path="res://scripts/UI.gd" type="Script" id=2]
 | 
			
		||||
[ext_resource path="res://assets/ui/music-enabled.png" type="Texture" id=3]
 | 
			
		||||
[ext_resource path="res://assets/fonts/ice_pixel-7.ttf" type="DynamicFontData" id=4]
 | 
			
		||||
[ext_resource path="res://assets/ui/pause.png" type="Texture" id=5]
 | 
			
		||||
[ext_resource path="res://assets/ui/pause-hover.png" type="Texture" id=6]
 | 
			
		||||
[ext_resource path="res://assets/ui/music-disabled.png" type="Texture" id=7]
 | 
			
		||||
[ext_resource path="res://assets/ui/music-hover.png" type="Texture" id=8]
 | 
			
		||||
 | 
			
		||||
[sub_resource type="DynamicFont" id=8]
 | 
			
		||||
size = 60
 | 
			
		||||
outline_size = 1
 | 
			
		||||
outline_color = Color( 0.203125, 0.203125, 0.203125, 1 )
 | 
			
		||||
use_mipmaps = true
 | 
			
		||||
font_data = ExtResource( 4 )
 | 
			
		||||
 | 
			
		||||
[sub_resource type="DynamicFont" id=1]
 | 
			
		||||
size = 45
 | 
			
		||||
font_data = ExtResource( 4 )
 | 
			
		||||
 | 
			
		||||
[sub_resource type="Theme" id=2]
 | 
			
		||||
default_font = SubResource( 1 )
 | 
			
		||||
RichTextLabel/fonts/normal_font = SubResource( 8 )
 | 
			
		||||
 | 
			
		||||
[node name="GUI" type="Node2D"]
 | 
			
		||||
script = ExtResource( 2 )
 | 
			
		||||
 | 
			
		||||
[node name="MarginContainer" type="MarginContainer" parent="."]
 | 
			
		||||
margin_left = 25.0
 | 
			
		||||
margin_top = 25.0
 | 
			
		||||
margin_right = 1255.0
 | 
			
		||||
margin_bottom = 100.0
 | 
			
		||||
 | 
			
		||||
[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer"]
 | 
			
		||||
margin_right = 1230.0
 | 
			
		||||
margin_bottom = 75.0
 | 
			
		||||
 | 
			
		||||
[node name="TimeLabel" type="RichTextLabel" parent="MarginContainer/HBoxContainer"]
 | 
			
		||||
margin_right = 305.0
 | 
			
		||||
margin_bottom = 75.0
 | 
			
		||||
size_flags_horizontal = 3
 | 
			
		||||
size_flags_vertical = 3
 | 
			
		||||
theme = SubResource( 2 )
 | 
			
		||||
text = "Time:"
 | 
			
		||||
 | 
			
		||||
[node name="NeighborLabel" type="RichTextLabel" parent="MarginContainer/HBoxContainer"]
 | 
			
		||||
margin_left = 309.0
 | 
			
		||||
margin_right = 920.0
 | 
			
		||||
margin_bottom = 75.0
 | 
			
		||||
size_flags_horizontal = 3
 | 
			
		||||
size_flags_vertical = 3
 | 
			
		||||
size_flags_stretch_ratio = 2.0
 | 
			
		||||
theme = SubResource( 2 )
 | 
			
		||||
text = "Neighbors Left: 6"
 | 
			
		||||
 | 
			
		||||
[node name="GridContainer" type="GridContainer" parent="MarginContainer/HBoxContainer"]
 | 
			
		||||
margin_left = 924.0
 | 
			
		||||
margin_right = 1230.0
 | 
			
		||||
margin_bottom = 75.0
 | 
			
		||||
size_flags_horizontal = 3
 | 
			
		||||
columns = 3
 | 
			
		||||
 | 
			
		||||
[node name="PauseButton" type="TextureButton" parent="MarginContainer/HBoxContainer/GridContainer"]
 | 
			
		||||
margin_right = 100.0
 | 
			
		||||
margin_bottom = 75.0
 | 
			
		||||
focus_mode = 1
 | 
			
		||||
size_flags_horizontal = 3
 | 
			
		||||
size_flags_vertical = 3
 | 
			
		||||
toggle_mode = true
 | 
			
		||||
texture_normal = ExtResource( 5 )
 | 
			
		||||
texture_pressed = ExtResource( 1 )
 | 
			
		||||
texture_hover = ExtResource( 6 )
 | 
			
		||||
expand = true
 | 
			
		||||
stretch_mode = 4
 | 
			
		||||
 | 
			
		||||
[node name="MusicButton" type="TextureButton" parent="MarginContainer/HBoxContainer/GridContainer"]
 | 
			
		||||
margin_left = 104.0
 | 
			
		||||
margin_right = 204.0
 | 
			
		||||
margin_bottom = 75.0
 | 
			
		||||
size_flags_horizontal = 3
 | 
			
		||||
toggle_mode = true
 | 
			
		||||
texture_normal = ExtResource( 3 )
 | 
			
		||||
texture_pressed = ExtResource( 7 )
 | 
			
		||||
texture_hover = ExtResource( 8 )
 | 
			
		||||
expand = true
 | 
			
		||||
stretch_mode = 4
 | 
			
		||||
 | 
			
		||||
[node name="GameTimer" type="Timer" parent="."]
 | 
			
		||||
one_shot = true
 | 
			
		||||
 | 
			
		||||
[connection signal="mouse_entered" from="MarginContainer/HBoxContainer/GridContainer/PauseButton" to="." method="_on_mouse_entered"]
 | 
			
		||||
[connection signal="mouse_exited" from="MarginContainer/HBoxContainer/GridContainer/PauseButton" to="." method="_on_mouse_exited"]
 | 
			
		||||
[connection signal="toggled" from="MarginContainer/HBoxContainer/GridContainer/PauseButton" to="." method="_on_PauseButton_toggled"]
 | 
			
		||||
[connection signal="mouse_entered" from="MarginContainer/HBoxContainer/GridContainer/MusicButton" to="." method="_on_mouse_entered"]
 | 
			
		||||
[connection signal="mouse_exited" from="MarginContainer/HBoxContainer/GridContainer/MusicButton" to="." method="_on_mouse_exited"]
 | 
			
		||||
[connection signal="toggled" from="MarginContainer/HBoxContainer/GridContainer/MusicButton" to="." method="_on_MusicButton_toggled"]
 | 
			
		||||
[connection signal="timeout" from="GameTimer" to="." method="_on_GameTimer_timeout"]
 | 
			
		||||
							
								
								
									
										101
									
								
								scenes/level1.tscn
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										7
									
								
								scenes/level3.tscn
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,7 @@
 | 
			
		||||
[gd_scene load_steps=2 format=2]
 | 
			
		||||
 | 
			
		||||
[ext_resource path="res://scenes/base_level.tscn" type="PackedScene" id=1]
 | 
			
		||||
 | 
			
		||||
[node name="Level1" type="Node2D"]
 | 
			
		||||
 | 
			
		||||
[node name="BaseLevel" parent="." instance=ExtResource( 1 )]
 | 
			
		||||
							
								
								
									
										11
									
								
								scenes/level_controller.tscn
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,11 @@
 | 
			
		||||
[gd_scene load_steps=2 format=2]
 | 
			
		||||
 | 
			
		||||
[ext_resource path="res://scripts/level_controller.gd" type="Script" id=1]
 | 
			
		||||
 | 
			
		||||
[node name="Master" type="Node2D"]
 | 
			
		||||
script = ExtResource( 1 )
 | 
			
		||||
 | 
			
		||||
[node name="EndTimer" type="Timer" parent="."]
 | 
			
		||||
one_shot = true
 | 
			
		||||
 | 
			
		||||
[connection signal="timeout" from="EndTimer" to="." method="_on_EndTimer_timeout"]
 | 
			
		||||
@ -11,11 +11,7 @@
 | 
			
		||||
[ext_resource path="res://scripts/player.gd" type="Script" id=9]
 | 
			
		||||
[ext_resource path="res://assets/mrRogers.png" type="Texture" id=10]
 | 
			
		||||
[ext_resource path="res://assets/chevron_pointer.png" type="Texture" id=11]
 | 
			
		||||
[ext_resource path="res://scenes/UI.tscn" type="PackedScene" id=12]
 | 
			
		||||
 | 
			
		||||
[sub_resource type="CapsuleShape2D" id=2]
 | 
			
		||||
radius = 13.0
 | 
			
		||||
height = 10.0001
 | 
			
		||||
[ext_resource path="res://scenes/gui.tscn" type="PackedScene" id=12]
 | 
			
		||||
 | 
			
		||||
[sub_resource type="SpriteFrames" id=1]
 | 
			
		||||
animations = [ {
 | 
			
		||||
@ -30,17 +26,16 @@ animations = [ {
 | 
			
		||||
"speed": 8.0
 | 
			
		||||
} ]
 | 
			
		||||
 | 
			
		||||
[sub_resource type="CapsuleShape2D" id=2]
 | 
			
		||||
radius = 13.0
 | 
			
		||||
height = 10.0001
 | 
			
		||||
 | 
			
		||||
[node name="Player" type="KinematicBody2D"]
 | 
			
		||||
collision_mask = 7
 | 
			
		||||
script = ExtResource( 9 )
 | 
			
		||||
ACCELERATION = 2000
 | 
			
		||||
FRICTION = 2500
 | 
			
		||||
 | 
			
		||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
 | 
			
		||||
position = Vector2( 0, 4 )
 | 
			
		||||
rotation = 1.5708
 | 
			
		||||
shape = SubResource( 2 )
 | 
			
		||||
 | 
			
		||||
[node name="AnimatedSprite" type="AnimatedSprite" parent="."]
 | 
			
		||||
position = Vector2( 2, -25 )
 | 
			
		||||
scale = Vector2( 5, 5 )
 | 
			
		||||
@ -48,6 +43,11 @@ frames = SubResource( 1 )
 | 
			
		||||
animation = "idle"
 | 
			
		||||
playing = true
 | 
			
		||||
 | 
			
		||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
 | 
			
		||||
position = Vector2( 0, 4 )
 | 
			
		||||
rotation = 1.5708
 | 
			
		||||
shape = SubResource( 2 )
 | 
			
		||||
 | 
			
		||||
[node name="Camera2D" type="Camera2D" parent="."]
 | 
			
		||||
current = true
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,8 +1,11 @@
 | 
			
		||||
[gd_scene load_steps=5 format=2]
 | 
			
		||||
[gd_scene load_steps=6 format=2]
 | 
			
		||||
 | 
			
		||||
[ext_resource path="res://assets/trolley-lg.png" type="Texture" id=1]
 | 
			
		||||
[ext_resource path="res://scripts/trolley.gd" type="Script" id=2]
 | 
			
		||||
 | 
			
		||||
[sub_resource type="CircleShape2D" id=4]
 | 
			
		||||
radius = 172.29
 | 
			
		||||
 | 
			
		||||
[sub_resource type="RectangleShape2D" id=2]
 | 
			
		||||
extents = Vector2( 38, 10 )
 | 
			
		||||
 | 
			
		||||
@ -13,6 +16,12 @@ extents = Vector2( 44.5, 8.25 )
 | 
			
		||||
collision_layer = 4
 | 
			
		||||
script = ExtResource( 2 )
 | 
			
		||||
 | 
			
		||||
[node name="TrolleySurroundingArea" type="Area2D" parent="."]
 | 
			
		||||
 | 
			
		||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="TrolleySurroundingArea"]
 | 
			
		||||
position = Vector2( 0, -45 )
 | 
			
		||||
shape = SubResource( 4 )
 | 
			
		||||
 | 
			
		||||
[node name="TrolleySeatArea" type="Area2D" parent="."]
 | 
			
		||||
collision_layer = 0
 | 
			
		||||
 | 
			
		||||
@ -34,5 +43,5 @@ polygon = PoolVector2Array( 172, -5, 198, 106, 150, 106, 122, 127, 74, 109, 46,
 | 
			
		||||
position = Vector2( 0, -2.25 )
 | 
			
		||||
shape = SubResource( 3 )
 | 
			
		||||
 | 
			
		||||
[connection signal="body_shape_exited" from="TrolleySurroundingArea" to="." method="_on_TrolleySurroundingArea_body_exited"]
 | 
			
		||||
[connection signal="body_entered" from="TrolleySeatArea" to="." method="_on_TrolleySeatArea_body_entered"]
 | 
			
		||||
[connection signal="body_exited" from="TrolleySeatArea" to="." method="_on_TrolleySeatArea_body_exited"]
 | 
			
		||||
 | 
			
		||||
@ -1,42 +1,39 @@
 | 
			
		||||
extends Node2D
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Declare member variables here. Examples:
 | 
			
		||||
# var a = 2
 | 
			
		||||
# var b = "text"
 | 
			
		||||
 | 
			
		||||
onready var cloud1 = $Sprite
 | 
			
		||||
onready var cloud2 = $Sprite2
 | 
			
		||||
onready var cloud3 = $Sprite3
 | 
			
		||||
onready var cloud4 = $Sprite4
 | 
			
		||||
onready var topBorder = $TopBorder
 | 
			
		||||
onready var bottomBorder = $BottomBorder
 | 
			
		||||
onready var leftBorder = $LeftBorder
 | 
			
		||||
onready var rightBorder = $RightBorder
 | 
			
		||||
 | 
			
		||||
export var NUM_CLOUDS = 12
 | 
			
		||||
 | 
			
		||||
var clouds = []
 | 
			
		||||
 | 
			
		||||
var speeds = []
 | 
			
		||||
var rng = RandomNumberGenerator.new()
 | 
			
		||||
var xSpeed = 0
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Called when the node enters the scene tree for the first time.
 | 
			
		||||
func _ready():
 | 
			
		||||
	for num in range(NUM_CLOUDS):
 | 
			
		||||
		var cloud_image_path = "res://assets/cloud%s.png" % (num % 4 + 1)
 | 
			
		||||
		var new_cloud_sprite = Sprite.new()
 | 
			
		||||
		new_cloud_sprite.texture = load(cloud_image_path)
 | 
			
		||||
		add_child(new_cloud_sprite)
 | 
			
		||||
		clouds.append(new_cloud_sprite)
 | 
			
		||||
		var rand_speed = rng.randf_range(0.5,2)
 | 
			
		||||
		speeds.append(rand_speed)
 | 
			
		||||
	rng.randomize()
 | 
			
		||||
	xSpeed = rng.randf_range(0.5,2)
 | 
			
		||||
	clouds = [cloud1, cloud2, cloud3, cloud4]
 | 
			
		||||
	_start_position()
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
 | 
			
		||||
func _process(delta):
 | 
			
		||||
	print(xSpeed)
 | 
			
		||||
	var index := 0
 | 
			
		||||
	for cloud in clouds:
 | 
			
		||||
		if cloud.global_position.x + xSpeed < rightBorder.global_position.x:
 | 
			
		||||
			cloud.global_position.x = cloud.global_position.x + xSpeed
 | 
			
		||||
		if cloud.global_position.x + speeds[index] < rightBorder.global_position.x:
 | 
			
		||||
			cloud.global_position.x = cloud.global_position.x + speeds[index]
 | 
			
		||||
		else:
 | 
			
		||||
			cloud.global_position.x = leftBorder.global_position.x
 | 
			
		||||
			cloud.global_position.y = rng.randi_range(topBorder.global_position.y, bottomBorder.global_position.y)
 | 
			
		||||
		index += 1
 | 
			
		||||
 | 
			
		||||
func _start_position():
 | 
			
		||||
	rng.randomize()
 | 
			
		||||
@ -1,16 +0,0 @@
 | 
			
		||||
extends Sprite
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Declare member variables here. Examples:
 | 
			
		||||
# var a = 2
 | 
			
		||||
# var b = "text"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Called when the node enters the scene tree for the first time.
 | 
			
		||||
func _ready():
 | 
			
		||||
	pass # Replace with function body.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
 | 
			
		||||
#func _process(delta):
 | 
			
		||||
#	pass
 | 
			
		||||
@ -1,18 +1,52 @@
 | 
			
		||||
extends Node2D
 | 
			
		||||
 | 
			
		||||
class_name GUI
 | 
			
		||||
 | 
			
		||||
signal toggle_music(music_off)
 | 
			
		||||
 | 
			
		||||
onready var time_label := $MarginContainer/HBoxContainer/TimeLabel
 | 
			
		||||
onready var neighbor_label := $MarginContainer/HBoxContainer/NeighborLabel
 | 
			
		||||
onready var game_timer := $GameTimer
 | 
			
		||||
onready var music_button := $MarginContainer/HBoxContainer/VBoxContainer/MusicButton
 | 
			
		||||
onready var pause_button := $MarginContainer/HBoxContainer/GridContainer/PauseButton
 | 
			
		||||
 | 
			
		||||
var arrow = preload("res://assets/ui/pointer.png")
 | 
			
		||||
var hand = preload("res://assets/ui/pointer_hand.png")
 | 
			
		||||
#var music_enabled_texture = preload("res://assets/ui/music-enabled.png")
 | 
			
		||||
#var music_disabled_texture = preload("res://assets/ui/music-disabled.png")
 | 
			
		||||
#var pause_texture = preload("res://assets/ui/pause.png")
 | 
			
		||||
#var play_texture = preload("res://assets/ui/play.png")
 | 
			
		||||
 | 
			
		||||
func start_timer(seconds: int) -> void:
 | 
			
		||||
	game_timer.start(seconds)
 | 
			
		||||
 | 
			
		||||
func set_neighbor_count(neighbors_left: int) -> void:
 | 
			
		||||
	neighbor_label.text = "Neighbors left: %s" % neighbors_left
 | 
			
		||||
 | 
			
		||||
func set_game_label(content: String) -> void:
 | 
			
		||||
	neighbor_label.text = content
 | 
			
		||||
 | 
			
		||||
func _ready() -> void:
 | 
			
		||||
	start_timer(60)
 | 
			
		||||
	Input.set_custom_mouse_cursor(arrow)
 | 
			
		||||
#	Input.set_custom_mouse_cursor(beam, Input.CURSOR_IBEAM)
 | 
			
		||||
#	start_timer(60)
 | 
			
		||||
	
 | 
			
		||||
func _process(delta: float) -> void:
 | 
			
		||||
	var time = int(game_timer.get_time_left())
 | 
			
		||||
	time_label.text = "Time %s" % time
 | 
			
		||||
	time_label.text = "Time: %s" % time
 | 
			
		||||
 | 
			
		||||
func _on_PauseButton_toggled(button_pressed: bool) -> void:
 | 
			
		||||
	print('TODO nothing happens...')
 | 
			
		||||
	
 | 
			
		||||
func _on_MusicButton_toggled(button_pressed: bool) -> void:
 | 
			
		||||
	emit_signal("toggle_music", !button_pressed)
 | 
			
		||||
 | 
			
		||||
func _on_mouse_entered() -> void:
 | 
			
		||||
	Input.set_custom_mouse_cursor(hand)
 | 
			
		||||
	
 | 
			
		||||
func _on_mouse_exited() -> void:
 | 
			
		||||
	Input.set_custom_mouse_cursor(arrow)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
func _on_ToolButton_toggled(button_pressed: bool) -> void:
 | 
			
		||||
	print(button_pressed)
 | 
			
		||||
func _on_GameTimer_timeout() -> void:
 | 
			
		||||
	pass # Replace with function body.
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										97
									
								
								scripts/base_level.gd
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,97 @@
 | 
			
		||||
extends Node2D
 | 
			
		||||
 | 
			
		||||
class_name BaseLevel
 | 
			
		||||
 | 
			
		||||
var helped_neighbors := []
 | 
			
		||||
var total_neighbors := 0
 | 
			
		||||
var playback_position: float
 | 
			
		||||
var level_num := 1
 | 
			
		||||
var last_level := false
 | 
			
		||||
 | 
			
		||||
export var SECONDS_TO_COMPLETE := 10
 | 
			
		||||
 | 
			
		||||
signal game_complete(is_win)
 | 
			
		||||
 | 
			
		||||
onready var trolley = $YSort/Trolley as Trolley
 | 
			
		||||
onready var player = $YSort/Player as Player
 | 
			
		||||
onready var bounds = $CameraBounds
 | 
			
		||||
onready var audio_player = $AudioStreamPlayer
 | 
			
		||||
onready var gui = $YSort/Player/GUI as GUI
 | 
			
		||||
onready var trolley_locations = $TrolleyLocations
 | 
			
		||||
onready var end_game_panel = $Panel
 | 
			
		||||
onready var end_game_label_title = $Panel/VBoxContainer/EndGameTitle
 | 
			
		||||
onready var end_game_label_body = $Panel/VBoxContainer/EndGameBody
 | 
			
		||||
onready var display_timer = $DisplayTimer
 | 
			
		||||
 | 
			
		||||
func display_start(this_level_num: int, is_last_level: bool = false) -> void:
 | 
			
		||||
	last_level = is_last_level
 | 
			
		||||
	level_num = this_level_num
 | 
			
		||||
	end_game_label_title.text = 'Land of make believe'
 | 
			
		||||
	end_game_label_body.text = '1   %s' % level_num
 | 
			
		||||
	end_game_panel.visible = true
 | 
			
		||||
 | 
			
		||||
func _process(delta: float) -> void:
 | 
			
		||||
	if end_game_panel.visible:
 | 
			
		||||
			end_game_panel.rect_global_position = player.camera.get_camera_screen_center() - Vector2(get_viewport().get_visible_rect().size.x / 2, get_viewport().get_visible_rect().size.y / 2)
 | 
			
		||||
 | 
			
		||||
func _on_neighbor_found_home(id: int) -> void:
 | 
			
		||||
	helped_neighbors.append(id)
 | 
			
		||||
	gui.set_neighbor_count(total_neighbors - len(helped_neighbors))
 | 
			
		||||
	if len(helped_neighbors) == total_neighbors:
 | 
			
		||||
		trolley.set_trolley_open(true)
 | 
			
		||||
		gui.set_game_label("Get to the Trolley!")
 | 
			
		||||
		player.follower = trolley
 | 
			
		||||
 | 
			
		||||
func _on_toggle_music(music_off: bool) -> void:
 | 
			
		||||
	if music_off:
 | 
			
		||||
		playback_position = audio_player.get_playback_position()
 | 
			
		||||
		audio_player.stop()
 | 
			
		||||
	else:
 | 
			
		||||
		audio_player.play(playback_position)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
func _on_Trolley_rogers_entered_trolley() -> void:
 | 
			
		||||
	player.follower = null
 | 
			
		||||
	trolley.move_to_leave()
 | 
			
		||||
 | 
			
		||||
func _on_Trolley_rogers_left_trolley() -> void:
 | 
			
		||||
	gui.start_timer(SECONDS_TO_COMPLETE)
 | 
			
		||||
	trolley.move_to_end(trolley_locations.get_node("TrolleyEnd").global_position, SECONDS_TO_COMPLETE)
 | 
			
		||||
	
 | 
			
		||||
func _on_GameTimer_timeout() -> void:
 | 
			
		||||
	trolley.move_to_leave()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
func _on_Trolley_left_wih_rogers(has_rogers) -> void:
 | 
			
		||||
	if has_rogers:
 | 
			
		||||
		if last_level:
 | 
			
		||||
			end_game_label_title.text = 'You are very neighborly'
 | 
			
		||||
			end_game_label_body.text = 'You saved all the neighbors in the land of make believe'
 | 
			
		||||
			emit_signal("game_complete", true)
 | 
			
		||||
		else:
 | 
			
		||||
			end_game_label_title.text = 'You win'
 | 
			
		||||
			end_game_label_body.text = 'Proceeding to level %s' % (level_num + 1)
 | 
			
		||||
			emit_signal("game_complete", true)
 | 
			
		||||
	else:
 | 
			
		||||
		end_game_label_title.text = 'Oh no'
 | 
			
		||||
		end_game_label_body.text = 'You were left in the land of make-believe'
 | 
			
		||||
		emit_signal("game_complete", false)
 | 
			
		||||
	end_game_panel.visible = true
 | 
			
		||||
 | 
			
		||||
# Sets up the level start
 | 
			
		||||
func _on_DisplayTimer_timeout() -> void:
 | 
			
		||||
	end_game_panel.visible = false
 | 
			
		||||
	if trolley != null:
 | 
			
		||||
		trolley.global_position = Vector2(bounds.get_node("Left").global_position.x - 20, trolley_locations.get_node("TrolleyStart").global_position.y)
 | 
			
		||||
	if player != null:
 | 
			
		||||
		player.global_position = trolley.get_node("TrolleySeatArea/SeatAreaShape").global_position
 | 
			
		||||
	for node in get_node("YSort").get_children():
 | 
			
		||||
		if 'Neighbor' in node.name:
 | 
			
		||||
			var err = node.connect("found_home", self, "_on_neighbor_found_home")
 | 
			
		||||
			total_neighbors += 1
 | 
			
		||||
	print('Level loaded with %s neighbors' % total_neighbors)
 | 
			
		||||
	gui.set_neighbor_count(total_neighbors)
 | 
			
		||||
	player.set_camera_bounds(bounds.get_node("Top").global_position.y, bounds.get_node("Bottom").global_position.y, bounds.get_node("Left").global_position.x, bounds.get_node("Right").global_position.x)
 | 
			
		||||
	var err = gui.connect("toggle_music", self, "_on_toggle_music")
 | 
			
		||||
	err = gui.get_node("GameTimer").connect("timeout", self, "_on_GameTimer_timeout")
 | 
			
		||||
	trolley.move_to_start(get_node("TrolleyLocations/TrolleyStart").global_position)
 | 
			
		||||
							
								
								
									
										36
									
								
								scripts/level_controller.gd
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,36 @@
 | 
			
		||||
extends Node2D
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
var level_path := "res://scenes/level{num}.tscn"
 | 
			
		||||
var level1 = preload("res://scenes/level1.tscn")
 | 
			
		||||
var current_level_num = 1
 | 
			
		||||
var current_level : Node
 | 
			
		||||
var max_levels = 3
 | 
			
		||||
var level_win := false
 | 
			
		||||
 | 
			
		||||
onready var end_timer := $EndTimer
 | 
			
		||||
 | 
			
		||||
func _ready() -> void:
 | 
			
		||||
	current_level = level1.instance()
 | 
			
		||||
	add_child(current_level)
 | 
			
		||||
	var err = current_level.get_child(0).connect("game_complete", self, "_on_level_complete")
 | 
			
		||||
 | 
			
		||||
func _on_level_complete(is_win: bool) -> void:
 | 
			
		||||
	print('Level complete')
 | 
			
		||||
	level_win = is_win
 | 
			
		||||
	end_timer.start(2)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
func _on_EndTimer_timeout() -> void:
 | 
			
		||||
	if level_win and current_level_num < max_levels:
 | 
			
		||||
		current_level_num += 1
 | 
			
		||||
		var new_level_path = level_path.format({"num": current_level_num})
 | 
			
		||||
		var next_level = load(new_level_path).instance()
 | 
			
		||||
		add_child(next_level)
 | 
			
		||||
		current_level.queue_free()
 | 
			
		||||
		current_level = next_level
 | 
			
		||||
		var current_base_level = current_level.get_node("BaseLevel") as BaseLevel
 | 
			
		||||
		current_base_level.display_start(current_level_num)
 | 
			
		||||
		var err = current_base_level.connect("game_complete", self, "_on_level_complete")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -95,7 +95,6 @@ func _idle_state(delta: float) -> void:
 | 
			
		||||
 | 
			
		||||
func _go_home_state(delta: float) -> void:
 | 
			
		||||
	_move_neighbor(house_direction, true)
 | 
			
		||||
#	print((house_position - global_position).length())
 | 
			
		||||
	if ((house_position - global_position).length() < 30):
 | 
			
		||||
		emit_signal("found_home", id)
 | 
			
		||||
		queue_free()
 | 
			
		||||
 | 
			
		||||
@ -13,13 +13,23 @@ var leader := self
 | 
			
		||||
 | 
			
		||||
onready var sprite := $AnimatedSprite
 | 
			
		||||
onready var chevron_sprite := $ChevronSprite
 | 
			
		||||
onready var camera := $Camera2D
 | 
			
		||||
onready var gui := $GUI
 | 
			
		||||
 | 
			
		||||
enum State {
 | 
			
		||||
	MOVE,
 | 
			
		||||
	IDLE
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func set_camera_bounds(up: int, down: int, left: int, right: int):
 | 
			
		||||
	camera.set_limit(MARGIN_TOP, up)
 | 
			
		||||
	camera.set_limit(MARGIN_BOTTOM, down)
 | 
			
		||||
	camera.set_limit(MARGIN_LEFT, left)
 | 
			
		||||
	camera.set_limit(MARGIN_RIGHT, right)
 | 
			
		||||
 | 
			
		||||
func _process(delta: float) -> void:
 | 
			
		||||
	gui.global_position = camera.get_camera_screen_center() - Vector2(get_viewport().get_visible_rect().size.x / 2, get_viewport().get_visible_rect().size.y / 2) # Get Height)
 | 
			
		||||
	
 | 
			
		||||
func _physics_process(delta: float) -> void:
 | 
			
		||||
	match state:
 | 
			
		||||
		State.MOVE:
 | 
			
		||||
@ -28,6 +38,8 @@ func _physics_process(delta: float) -> void:
 | 
			
		||||
			_idle_state(delta)
 | 
			
		||||
	chevron_sprite.visible = follower != null
 | 
			
		||||
	if follower != null:
 | 
			
		||||
		if follower.name == "Trolley":
 | 
			
		||||
			chevron_sprite.set_modulate(Color(0,0.9,0))
 | 
			
		||||
		chevron_sprite.rotation_degrees = rad2deg((follower.house_position - global_position).angle()) - 90
 | 
			
		||||
 | 
			
		||||
func _move_state(delta: float) -> void:
 | 
			
		||||
@ -58,11 +70,3 @@ func _idle_state(delta: float) -> void:
 | 
			
		||||
		state = State.MOVE
 | 
			
		||||
	else:
 | 
			
		||||
		sprite.set_animation("idle")
 | 
			
		||||
#	if Input.is_action_pressed("ui_up"):
 | 
			
		||||
#		speed.y -= ACCELERATION
 | 
			
		||||
#	elif Input.is_action_pressed("ui_right"):
 | 
			
		||||
#		print("right")
 | 
			
		||||
#	elif Input.is_action_pressed("ui_left"):
 | 
			
		||||
#		print("left")
 | 
			
		||||
#	elif Input.is_action_pressed("ui_down"):
 | 
			
		||||
#		print("down")
 | 
			
		||||
 | 
			
		||||
@ -17,7 +17,6 @@ func _on_rogers_left_trolley() -> void:
 | 
			
		||||
	pass
 | 
			
		||||
 | 
			
		||||
func _on_neighbor_found_home(id: int) -> void:
 | 
			
		||||
	print('You helped a neighbor')
 | 
			
		||||
	helped_neighbors.append(id)
 | 
			
		||||
	if len(helped_neighbors) == total_neighbors:
 | 
			
		||||
		trolley.set_trolley_open(true)
 | 
			
		||||
 | 
			
		||||
@ -3,38 +3,114 @@ extends KinematicBody2D
 | 
			
		||||
class_name Trolley
 | 
			
		||||
 | 
			
		||||
signal rogers_left_trolley()
 | 
			
		||||
signal rogers_entered_trolley()
 | 
			
		||||
signal left_wih_rogers(has_rogers)
 | 
			
		||||
 | 
			
		||||
export var TIME = 60
 | 
			
		||||
onready var trolley_closed_shape = $TrolleyClosedShape
 | 
			
		||||
export var MAX_VELOCITY = .3
 | 
			
		||||
export var MAX_VELOCITY = 8
 | 
			
		||||
 | 
			
		||||
var velocity := Vector2.ZERO
 | 
			
		||||
var state = State.STOPPED
 | 
			
		||||
var has_roger := false
 | 
			
		||||
var destination := Vector2.ZERO
 | 
			
		||||
var house_position : Vector2
 | 
			
		||||
var arrival_time: int
 | 
			
		||||
var en_route_length: float
 | 
			
		||||
 | 
			
		||||
func _ready() -> void:
 | 
			
		||||
	set_trolley_open(true)
 | 
			
		||||
enum State {
 | 
			
		||||
	MOVE_TO_START,
 | 
			
		||||
	STOPPED,
 | 
			
		||||
	EN_ROUTE,
 | 
			
		||||
	LEAVING
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func set_trolley_open(trolley_open: bool) -> void:
 | 
			
		||||
	trolley_closed_shape.set_deferred("disabled", trolley_open)
 | 
			
		||||
 | 
			
		||||
func move_to_start(start_pos: Vector2) -> void:
 | 
			
		||||
	state = State.MOVE_TO_START
 | 
			
		||||
	destination = start_pos
 | 
			
		||||
	velocity = Vector2(MAX_VELOCITY, 0)
 | 
			
		||||
	set_trolley_open(false)
 | 
			
		||||
 | 
			
		||||
func move_to_end(end_pos: Vector2, seconds_to_exit) -> void:
 | 
			
		||||
	state = State.EN_ROUTE
 | 
			
		||||
	destination = end_pos
 | 
			
		||||
	velocity = Vector2.ZERO
 | 
			
		||||
	arrival_time = seconds_to_exit
 | 
			
		||||
	set_trolley_open(false)
 | 
			
		||||
	en_route_length = destination.x - global_position.x
 | 
			
		||||
 | 
			
		||||
func move_to_leave() -> void:
 | 
			
		||||
	if state != State.LEAVING:
 | 
			
		||||
		set_trolley_open(false)
 | 
			
		||||
		emit_signal("left_wih_rogers", has_roger)
 | 
			
		||||
		state = State.LEAVING
 | 
			
		||||
	
 | 
			
		||||
func _physics_process(delta: float) -> void:
 | 
			
		||||
	velocity.x = move_toward(velocity.x, MAX_VELOCITY, delta if not has_roger else delta * 10)
 | 
			
		||||
	match state:
 | 
			
		||||
		State.MOVE_TO_START:
 | 
			
		||||
			_decelerate_to_start(delta)
 | 
			
		||||
		State.STOPPED:
 | 
			
		||||
			_stop(delta)
 | 
			
		||||
		State.EN_ROUTE:
 | 
			
		||||
			_en_route(delta)
 | 
			
		||||
		State.LEAVING:
 | 
			
		||||
			_leaving(delta)
 | 
			
		||||
	# For the player indicator to show where the trolley is, update 'house_position' to current position
 | 
			
		||||
	house_position = global_position
 | 
			
		||||
 | 
			
		||||
func _decelerate_to_start(delta: float) -> void:
 | 
			
		||||
	var length_to_start := destination.x - global_position.x - 100
 | 
			
		||||
	velocity.x = min(move_toward(velocity.x, length_to_start, delta * 10), MAX_VELOCITY)
 | 
			
		||||
	var collision := move_and_collide(velocity)
 | 
			
		||||
	if collision:
 | 
			
		||||
		var collider = collision.get_collider()
 | 
			
		||||
		if collider.get_class() == "KinematicBody2D":
 | 
			
		||||
			collider.move_and_collide(velocity * 2)
 | 
			
		||||
	if global_position.x >= destination.x:
 | 
			
		||||
		set_trolley_open(true)
 | 
			
		||||
		state = State.STOPPED
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
func _stop(delta: float) -> void:
 | 
			
		||||
	pass
 | 
			
		||||
	
 | 
			
		||||
func _en_route(delta: float) -> void:
 | 
			
		||||
	velocity.x = en_route_length / arrival_time * delta
 | 
			
		||||
	var collision := move_and_collide(velocity)
 | 
			
		||||
	if collision:
 | 
			
		||||
		var collider = collision.get_collider()
 | 
			
		||||
		if collider.get_class() == "KinematicBody2D":
 | 
			
		||||
			if has_roger:
 | 
			
		||||
				MAX_VELOCITY = 10
 | 
			
		||||
				return
 | 
			
		||||
			collider.move_and_collide(velocity * 3)
 | 
			
		||||
	if global_position.x >= destination.x:
 | 
			
		||||
		set_trolley_open(false)
 | 
			
		||||
		state = State.LEAVING
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
func _leaving(delta: float) -> void:
 | 
			
		||||
	velocity.x = min(move_toward(velocity.x, (destination.x + 200), delta * 10), MAX_VELOCITY)
 | 
			
		||||
	var collision := move_and_collide(velocity)
 | 
			
		||||
	if collision:
 | 
			
		||||
		var collider = collision.get_collider()
 | 
			
		||||
		if collider.get_class() == "KinematicBody2D":
 | 
			
		||||
			collider.move_and_collide(velocity * 3)
 | 
			
		||||
#	if global_position.x >= destination.x:
 | 
			
		||||
#		set_trolley_open(true)
 | 
			
		||||
#		state = State.STOPPED
 | 
			
		||||
 | 
			
		||||
func set_trolley_open(trolley_open: bool) -> void:
 | 
			
		||||
	trolley_closed_shape.set_deferred("disabled", trolley_open)
 | 
			
		||||
 | 
			
		||||
func _on_TrolleySeatArea_body_entered(body: Node) -> void:
 | 
			
		||||
	if body is Player:
 | 
			
		||||
	if body is Player and state != State.STOPPED and state != State.MOVE_TO_START:
 | 
			
		||||
		has_roger = true
 | 
			
		||||
		print('closing trolley')
 | 
			
		||||
		trolley_closed_shape.set_deferred("disabled", false)
 | 
			
		||||
		emit_signal("rogers_entered_trolley")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
func _on_TrolleySeatArea_body_exited(body: Node) -> void:
 | 
			
		||||
func _on_TrolleySurroundingArea_body_exited(body_rid: RID, body: Node, body_shape_index: int, local_shape_index: int) -> void:
 | 
			
		||||
	if body is Player:
 | 
			
		||||
		has_roger = false
 | 
			
		||||
		emit_signal("rogers_left_trolley")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||