diff --git a/Models/3-Stage/3stHelen.glb b/Models/3-Stage/3stHelen.glb
new file mode 100644
index 0000000..a2bdb2f
Binary files /dev/null and b/Models/3-Stage/3stHelen.glb differ
diff --git a/Models/3stHelen.glb.import b/Models/3-Stage/3stHelen.glb.import
similarity index 76%
rename from Models/3stHelen.glb.import
rename to Models/3-Stage/3stHelen.glb.import
index 1daebe8..29ea8c8 100644
--- a/Models/3stHelen.glb.import
+++ b/Models/3-Stage/3stHelen.glb.import
@@ -4,12 +4,12 @@ importer="scene"
importer_version=1
type="PackedScene"
uid="uid://f0fkcs7erhop"
-path="res://.godot/imported/3stHelen.glb-c3541fdb7863c3136dcc986fabbb06be.scn"
+path="res://.godot/imported/3stHelen.glb-09c973ef19734a7d77b0f363ef6fade1.scn"
[deps]
-source_file="res://Models/3stHelen.glb"
-dest_files=["res://.godot/imported/3stHelen.glb-c3541fdb7863c3136dcc986fabbb06be.scn"]
+source_file="res://Models/3-Stage/3stHelen.glb"
+dest_files=["res://.godot/imported/3stHelen.glb-09c973ef19734a7d77b0f363ef6fade1.scn"]
[params]
diff --git a/Models/3stHelen_beak.png b/Models/3-Stage/3stHelen_beak.png
similarity index 100%
rename from Models/3stHelen_beak.png
rename to Models/3-Stage/3stHelen_beak.png
diff --git a/Models/3stHelen_beak.png.import b/Models/3-Stage/3stHelen_beak.png.import
similarity index 61%
rename from Models/3stHelen_beak.png.import
rename to Models/3-Stage/3stHelen_beak.png.import
index 9de2456..8788f58 100644
--- a/Models/3stHelen_beak.png.import
+++ b/Models/3-Stage/3stHelen_beak.png.import
@@ -3,8 +3,8 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://bprmuf7jpffy3"
-path.s3tc="res://.godot/imported/3stHelen_beak.png-da72f62ca7ac7e5bf5593b4d1be3a7ee.s3tc.ctex"
-path.etc2="res://.godot/imported/3stHelen_beak.png-da72f62ca7ac7e5bf5593b4d1be3a7ee.etc2.ctex"
+path.s3tc="res://.godot/imported/3stHelen_beak.png-093e64b7512180691d5a4d9b4796c163.s3tc.ctex"
+path.etc2="res://.godot/imported/3stHelen_beak.png-093e64b7512180691d5a4d9b4796c163.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
@@ -15,8 +15,8 @@ generator_parameters={
[deps]
-source_file="res://Models/3stHelen_beak.png"
-dest_files=["res://.godot/imported/3stHelen_beak.png-da72f62ca7ac7e5bf5593b4d1be3a7ee.s3tc.ctex", "res://.godot/imported/3stHelen_beak.png-da72f62ca7ac7e5bf5593b4d1be3a7ee.etc2.ctex"]
+source_file="res://Models/3-Stage/3stHelen_beak.png"
+dest_files=["res://.godot/imported/3stHelen_beak.png-093e64b7512180691d5a4d9b4796c163.s3tc.ctex", "res://.godot/imported/3stHelen_beak.png-093e64b7512180691d5a4d9b4796c163.etc2.ctex"]
[params]
diff --git a/Models/3-Stage/3stHelen_cheer dress.png b/Models/3-Stage/3stHelen_cheer dress.png
new file mode 100644
index 0000000..5ecb4bf
Binary files /dev/null and b/Models/3-Stage/3stHelen_cheer dress.png differ
diff --git a/Models/3-Stage/3stHelen_cheer dress.png.import b/Models/3-Stage/3stHelen_cheer dress.png.import
new file mode 100644
index 0000000..040e12e
--- /dev/null
+++ b/Models/3-Stage/3stHelen_cheer dress.png.import
@@ -0,0 +1,39 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c78fctfafkuon"
+path.s3tc="res://.godot/imported/3stHelen_cheer dress.png-c2a1c708bd40884f6dbb3748c5660c8c.s3tc.ctex"
+path.etc2="res://.godot/imported/3stHelen_cheer dress.png-c2a1c708bd40884f6dbb3748c5660c8c.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+generator_parameters={
+"md5": "7cedb51b071905707d033e23c77584cb"
+}
+
+[deps]
+
+source_file="res://Models/3-Stage/3stHelen_cheer dress.png"
+dest_files=["res://.godot/imported/3stHelen_cheer dress.png-c2a1c708bd40884f6dbb3748c5660c8c.s3tc.ctex", "res://.godot/imported/3stHelen_cheer dress.png-c2a1c708bd40884f6dbb3748c5660c8c.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0
diff --git a/Models/3-Stage/3stHelen_fur.png b/Models/3-Stage/3stHelen_fur.png
new file mode 100644
index 0000000..b3c53a5
Binary files /dev/null and b/Models/3-Stage/3stHelen_fur.png differ
diff --git a/Models/3-Stage/3stHelen_fur.png.import b/Models/3-Stage/3stHelen_fur.png.import
new file mode 100644
index 0000000..5fc31ff
--- /dev/null
+++ b/Models/3-Stage/3stHelen_fur.png.import
@@ -0,0 +1,39 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dtd42wohdk5nf"
+path.s3tc="res://.godot/imported/3stHelen_fur.png-9bde7d93521e058da6cc6f8f43774856.s3tc.ctex"
+path.etc2="res://.godot/imported/3stHelen_fur.png-9bde7d93521e058da6cc6f8f43774856.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+generator_parameters={
+"md5": "d622cd261604f2451fe93281e2085d70"
+}
+
+[deps]
+
+source_file="res://Models/3-Stage/3stHelen_fur.png"
+dest_files=["res://.godot/imported/3stHelen_fur.png-9bde7d93521e058da6cc6f8f43774856.s3tc.ctex", "res://.godot/imported/3stHelen_fur.png-9bde7d93521e058da6cc6f8f43774856.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0
diff --git a/Models/3-Stage/3stHelen_hair.png b/Models/3-Stage/3stHelen_hair.png
new file mode 100644
index 0000000..56bd6e2
Binary files /dev/null and b/Models/3-Stage/3stHelen_hair.png differ
diff --git a/Models/3-Stage/3stHelen_hair.png.import b/Models/3-Stage/3stHelen_hair.png.import
new file mode 100644
index 0000000..d34e5f2
--- /dev/null
+++ b/Models/3-Stage/3stHelen_hair.png.import
@@ -0,0 +1,39 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b3264mrednlbd"
+path.s3tc="res://.godot/imported/3stHelen_hair.png-0b37fd8e5c162c865cb4a11d468dd921.s3tc.ctex"
+path.etc2="res://.godot/imported/3stHelen_hair.png-0b37fd8e5c162c865cb4a11d468dd921.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+generator_parameters={
+"md5": "35bb2072abe8c8e39214dcb47ee5fc3a"
+}
+
+[deps]
+
+source_file="res://Models/3-Stage/3stHelen_hair.png"
+dest_files=["res://.godot/imported/3stHelen_hair.png-0b37fd8e5c162c865cb4a11d468dd921.s3tc.ctex", "res://.godot/imported/3stHelen_hair.png-0b37fd8e5c162c865cb4a11d468dd921.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0
diff --git a/Models/3stHelen_shoes.png b/Models/3-Stage/3stHelen_shoes.png
similarity index 100%
rename from Models/3stHelen_shoes.png
rename to Models/3-Stage/3stHelen_shoes.png
diff --git a/Models/3stHelen_shoes.png.import b/Models/3-Stage/3stHelen_shoes.png.import
similarity index 60%
rename from Models/3stHelen_shoes.png.import
rename to Models/3-Stage/3stHelen_shoes.png.import
index 65f1332..ade3f95 100644
--- a/Models/3stHelen_shoes.png.import
+++ b/Models/3-Stage/3stHelen_shoes.png.import
@@ -3,8 +3,8 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://cm8h5o5urcvym"
-path.s3tc="res://.godot/imported/3stHelen_shoes.png-97c060c3fc3442bff6f75c94bc90506a.s3tc.ctex"
-path.etc2="res://.godot/imported/3stHelen_shoes.png-97c060c3fc3442bff6f75c94bc90506a.etc2.ctex"
+path.s3tc="res://.godot/imported/3stHelen_shoes.png-61154e88a8b3c30e2bfb4db457818ce0.s3tc.ctex"
+path.etc2="res://.godot/imported/3stHelen_shoes.png-61154e88a8b3c30e2bfb4db457818ce0.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
@@ -15,8 +15,8 @@ generator_parameters={
[deps]
-source_file="res://Models/3stHelen_shoes.png"
-dest_files=["res://.godot/imported/3stHelen_shoes.png-97c060c3fc3442bff6f75c94bc90506a.s3tc.ctex", "res://.godot/imported/3stHelen_shoes.png-97c060c3fc3442bff6f75c94bc90506a.etc2.ctex"]
+source_file="res://Models/3-Stage/3stHelen_shoes.png"
+dest_files=["res://.godot/imported/3stHelen_shoes.png-61154e88a8b3c30e2bfb4db457818ce0.s3tc.ctex", "res://.godot/imported/3stHelen_shoes.png-61154e88a8b3c30e2bfb4db457818ce0.etc2.ctex"]
[params]
diff --git a/Models/3stHelen.glb b/Models/3stHelen.glb
deleted file mode 100644
index 06ed7ec..0000000
Binary files a/Models/3stHelen.glb and /dev/null differ
diff --git a/Models/Balcony/BalconyStage.glb b/Models/Balcony/BalconyStage.glb
new file mode 100644
index 0000000..4d14ed5
Binary files /dev/null and b/Models/Balcony/BalconyStage.glb differ
diff --git a/Models/Helen.fbx.import b/Models/Balcony/BalconyStage.glb.import
similarity index 64%
rename from Models/Helen.fbx.import
rename to Models/Balcony/BalconyStage.glb.import
index 11a121e..a005e55 100644
--- a/Models/Helen.fbx.import
+++ b/Models/Balcony/BalconyStage.glb.import
@@ -3,13 +3,13 @@
importer="scene"
importer_version=1
type="PackedScene"
-uid="uid://5i7srffes8ut"
-path="res://.godot/imported/Helen.fbx-a3dcdd674756aa7b6860353ece3f39df.scn"
+uid="uid://c6n4otfble154"
+path="res://.godot/imported/BalconyStage.glb-30f76dcef53d0e1cd152a84572aefbee.scn"
[deps]
-source_file="res://3-Stage/Models/Helen.fbx"
-dest_files=["res://.godot/imported/Helen.fbx-a3dcdd674756aa7b6860353ece3f39df.scn"]
+source_file="res://Models/Balcony/BalconyStage.glb"
+dest_files=["res://.godot/imported/BalconyStage.glb-30f76dcef53d0e1cd152a84572aefbee.scn"]
[params]
@@ -28,11 +28,10 @@ meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
-animation/trimming=true
+animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
_subresources={}
-fbx/importer=0
-fbx/allow_geometry_helper_nodes=false
-fbx/embedded_image_handling=1
+gltf/naming_version=1
+gltf/embedded_image_handling=1
diff --git a/Models/Balcony/BalconyStage_prankbg.png b/Models/Balcony/BalconyStage_prankbg.png
new file mode 100644
index 0000000..10e3109
Binary files /dev/null and b/Models/Balcony/BalconyStage_prankbg.png differ
diff --git a/Models/Balcony/BalconyStage_prankbg.png.import b/Models/Balcony/BalconyStage_prankbg.png.import
new file mode 100644
index 0000000..f900444
--- /dev/null
+++ b/Models/Balcony/BalconyStage_prankbg.png.import
@@ -0,0 +1,39 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cm643d4g33g6h"
+path.s3tc="res://.godot/imported/BalconyStage_prankbg.png-be741b0faaf56dcb0bfe2448a6e85e19.s3tc.ctex"
+path.etc2="res://.godot/imported/BalconyStage_prankbg.png-be741b0faaf56dcb0bfe2448a6e85e19.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+generator_parameters={
+"md5": "437ade1d165b37a51e8dde9c8e10394d"
+}
+
+[deps]
+
+source_file="res://Models/Balcony/BalconyStage_prankbg.png"
+dest_files=["res://.godot/imported/BalconyStage_prankbg.png-be741b0faaf56dcb0bfe2448a6e85e19.s3tc.ctex", "res://.godot/imported/BalconyStage_prankbg.png-be741b0faaf56dcb0bfe2448a6e85e19.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0
diff --git a/Models/ChuckEsCorner/ChuckEsCornerStage.glb b/Models/ChuckEsCorner/ChuckEsCornerStage.glb
new file mode 100644
index 0000000..4b206e4
Binary files /dev/null and b/Models/ChuckEsCorner/ChuckEsCornerStage.glb differ
diff --git a/Models/Chuck.fbx.import b/Models/ChuckEsCorner/ChuckEsCornerStage.glb.import
similarity index 62%
rename from Models/Chuck.fbx.import
rename to Models/ChuckEsCorner/ChuckEsCornerStage.glb.import
index fee6fc1..94fd5f3 100644
--- a/Models/Chuck.fbx.import
+++ b/Models/ChuckEsCorner/ChuckEsCornerStage.glb.import
@@ -3,13 +3,13 @@
importer="scene"
importer_version=1
type="PackedScene"
-uid="uid://cs0va7jp6fjfa"
-path="res://.godot/imported/Chuck.fbx-e0f76e66bd2d66a68bf43edbd8d1d948.scn"
+uid="uid://bv66hlbvtekho"
+path="res://.godot/imported/ChuckEsCornerStage.glb-972590d495adda7be8c93e6d0989aa24.scn"
[deps]
-source_file="res://3-Stage/Models/Chuck.fbx"
-dest_files=["res://.godot/imported/Chuck.fbx-e0f76e66bd2d66a68bf43edbd8d1d948.scn"]
+source_file="res://Models/ChuckEsCorner/ChuckEsCornerStage.glb"
+dest_files=["res://.godot/imported/ChuckEsCornerStage.glb-972590d495adda7be8c93e6d0989aa24.scn"]
[params]
@@ -28,11 +28,10 @@ meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
-animation/trimming=true
+animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
_subresources={}
-fbx/importer=0
-fbx/allow_geometry_helper_nodes=false
-fbx/embedded_image_handling=1
+gltf/naming_version=1
+gltf/embedded_image_handling=1
diff --git a/Models/ChuckEsCorner/ChuckEsCornerStage_Chuck_Es_Corner_1.png b/Models/ChuckEsCorner/ChuckEsCornerStage_Chuck_Es_Corner_1.png
new file mode 100644
index 0000000..7cc6469
Binary files /dev/null and b/Models/ChuckEsCorner/ChuckEsCornerStage_Chuck_Es_Corner_1.png differ
diff --git a/Models/ChuckEsCorner/ChuckEsCornerStage_Chuck_Es_Corner_1.png.import b/Models/ChuckEsCorner/ChuckEsCornerStage_Chuck_Es_Corner_1.png.import
new file mode 100644
index 0000000..814f541
--- /dev/null
+++ b/Models/ChuckEsCorner/ChuckEsCornerStage_Chuck_Es_Corner_1.png.import
@@ -0,0 +1,39 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://buqvxu4n8q6qc"
+path.s3tc="res://.godot/imported/ChuckEsCornerStage_Chuck_Es_Corner_1.png-df2de8b158e2601de4629961436b760a.s3tc.ctex"
+path.etc2="res://.godot/imported/ChuckEsCornerStage_Chuck_Es_Corner_1.png-df2de8b158e2601de4629961436b760a.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+generator_parameters={
+"md5": "91cacf7bfdf049e3b957402daac9df21"
+}
+
+[deps]
+
+source_file="res://Models/ChuckEsCorner/ChuckEsCornerStage_Chuck_Es_Corner_1.png"
+dest_files=["res://.godot/imported/ChuckEsCornerStage_Chuck_Es_Corner_1.png-df2de8b158e2601de4629961436b760a.s3tc.ctex", "res://.godot/imported/ChuckEsCornerStage_Chuck_Es_Corner_1.png-df2de8b158e2601de4629961436b760a.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0
diff --git a/Models/ChuckEsCorner/data.bin b/Models/ChuckEsCorner/data.bin
new file mode 100644
index 0000000..d8a7f6a
Binary files /dev/null and b/Models/ChuckEsCorner/data.bin differ
diff --git a/Models/Cyberamics/Cyber Helen.glb b/Models/Cyberamics/Cyber Helen.glb
new file mode 100644
index 0000000..c58dd1f
Binary files /dev/null and b/Models/Cyberamics/Cyber Helen.glb differ
diff --git a/Models/Munch.fbx.import b/Models/Cyberamics/Cyber Helen.glb.import
similarity index 64%
rename from Models/Munch.fbx.import
rename to Models/Cyberamics/Cyber Helen.glb.import
index 748c19c..0bec33a 100644
--- a/Models/Munch.fbx.import
+++ b/Models/Cyberamics/Cyber Helen.glb.import
@@ -3,13 +3,13 @@
importer="scene"
importer_version=1
type="PackedScene"
-uid="uid://y5jsfwdmgwkq"
-path="res://.godot/imported/Munch.fbx-5aedcf1ca9583a75c301f71dc6519957.scn"
+uid="uid://d34xfaignny8j"
+path="res://.godot/imported/Cyber Helen.glb-3f0344c1f3e746ac81eea3dfffd7e005.scn"
[deps]
-source_file="res://3-Stage/Models/Munch.fbx"
-dest_files=["res://.godot/imported/Munch.fbx-5aedcf1ca9583a75c301f71dc6519957.scn"]
+source_file="res://Models/Cyberamics/Cyber Helen.glb"
+dest_files=["res://.godot/imported/Cyber Helen.glb-3f0344c1f3e746ac81eea3dfffd7e005.scn"]
[params]
@@ -28,11 +28,10 @@ meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
-animation/trimming=true
+animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
_subresources={}
-fbx/importer=0
-fbx/allow_geometry_helper_nodes=false
-fbx/embedded_image_handling=1
+gltf/naming_version=1
+gltf/embedded_image_handling=1
diff --git a/Models/Cyberamics/Cyber Helen_beak.png b/Models/Cyberamics/Cyber Helen_beak.png
new file mode 100644
index 0000000..7b16303
Binary files /dev/null and b/Models/Cyberamics/Cyber Helen_beak.png differ
diff --git a/Models/Cyberamics/Cyber Helen_beak.png.import b/Models/Cyberamics/Cyber Helen_beak.png.import
new file mode 100644
index 0000000..400ab2a
--- /dev/null
+++ b/Models/Cyberamics/Cyber Helen_beak.png.import
@@ -0,0 +1,39 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dt2k7wwpcttwx"
+path.s3tc="res://.godot/imported/Cyber Helen_beak.png-dafc891d002e04d99d222183d0d236ea.s3tc.ctex"
+path.etc2="res://.godot/imported/Cyber Helen_beak.png-dafc891d002e04d99d222183d0d236ea.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+generator_parameters={
+"md5": "660d81a1bf46d22fbda7523d081ce944"
+}
+
+[deps]
+
+source_file="res://Models/Cyberamics/Cyber Helen_beak.png"
+dest_files=["res://.godot/imported/Cyber Helen_beak.png-dafc891d002e04d99d222183d0d236ea.s3tc.ctex", "res://.godot/imported/Cyber Helen_beak.png-dafc891d002e04d99d222183d0d236ea.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0
diff --git a/Models/Cyberamics/Cyber Helen_eyes.png b/Models/Cyberamics/Cyber Helen_eyes.png
new file mode 100644
index 0000000..6b69d6d
Binary files /dev/null and b/Models/Cyberamics/Cyber Helen_eyes.png differ
diff --git a/Models/Cyberamics/Cyber Helen_eyes.png.import b/Models/Cyberamics/Cyber Helen_eyes.png.import
new file mode 100644
index 0000000..7f8cc01
--- /dev/null
+++ b/Models/Cyberamics/Cyber Helen_eyes.png.import
@@ -0,0 +1,39 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://u6c8i8hmf55l"
+path.s3tc="res://.godot/imported/Cyber Helen_eyes.png-c8e727972f281835cc003dd052d0e371.s3tc.ctex"
+path.etc2="res://.godot/imported/Cyber Helen_eyes.png-c8e727972f281835cc003dd052d0e371.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+generator_parameters={
+"md5": "f3d293a05f8484be8751f38e0651eb91"
+}
+
+[deps]
+
+source_file="res://Models/Cyberamics/Cyber Helen_eyes.png"
+dest_files=["res://.godot/imported/Cyber Helen_eyes.png-c8e727972f281835cc003dd052d0e371.s3tc.ctex", "res://.godot/imported/Cyber Helen_eyes.png-c8e727972f281835cc003dd052d0e371.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0
diff --git a/Models/Cyberamics/Cyber Helen_fur.png b/Models/Cyberamics/Cyber Helen_fur.png
new file mode 100644
index 0000000..b3c53a5
Binary files /dev/null and b/Models/Cyberamics/Cyber Helen_fur.png differ
diff --git a/Models/Cyberamics/Cyber Helen_fur.png.import b/Models/Cyberamics/Cyber Helen_fur.png.import
new file mode 100644
index 0000000..b2c4a7c
--- /dev/null
+++ b/Models/Cyberamics/Cyber Helen_fur.png.import
@@ -0,0 +1,39 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b874br054h4u6"
+path.s3tc="res://.godot/imported/Cyber Helen_fur.png-25e5870ed95edb351ef0f52eda54dda5.s3tc.ctex"
+path.etc2="res://.godot/imported/Cyber Helen_fur.png-25e5870ed95edb351ef0f52eda54dda5.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+generator_parameters={
+"md5": "d622cd261604f2451fe93281e2085d70"
+}
+
+[deps]
+
+source_file="res://Models/Cyberamics/Cyber Helen_fur.png"
+dest_files=["res://.godot/imported/Cyber Helen_fur.png-25e5870ed95edb351ef0f52eda54dda5.s3tc.ctex", "res://.godot/imported/Cyber Helen_fur.png-25e5870ed95edb351ef0f52eda54dda5.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0
diff --git a/Models/Cyberamics/Cyber Helen_hair.png b/Models/Cyberamics/Cyber Helen_hair.png
new file mode 100644
index 0000000..56bd6e2
Binary files /dev/null and b/Models/Cyberamics/Cyber Helen_hair.png differ
diff --git a/Models/Cyberamics/Cyber Helen_hair.png.import b/Models/Cyberamics/Cyber Helen_hair.png.import
new file mode 100644
index 0000000..c80b9e7
--- /dev/null
+++ b/Models/Cyberamics/Cyber Helen_hair.png.import
@@ -0,0 +1,39 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bv65pevudy3dk"
+path.s3tc="res://.godot/imported/Cyber Helen_hair.png-7eb38b10a596be14320077537c5df16f.s3tc.ctex"
+path.etc2="res://.godot/imported/Cyber Helen_hair.png-7eb38b10a596be14320077537c5df16f.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+generator_parameters={
+"md5": "35bb2072abe8c8e39214dcb47ee5fc3a"
+}
+
+[deps]
+
+source_file="res://Models/Cyberamics/Cyber Helen_hair.png"
+dest_files=["res://.godot/imported/Cyber Helen_hair.png-7eb38b10a596be14320077537c5df16f.s3tc.ctex", "res://.godot/imported/Cyber Helen_hair.png-7eb38b10a596be14320077537c5df16f.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0
diff --git a/Models/Cyberamics/Cyber Helen_mic.png b/Models/Cyberamics/Cyber Helen_mic.png
new file mode 100644
index 0000000..72ef3ea
Binary files /dev/null and b/Models/Cyberamics/Cyber Helen_mic.png differ
diff --git a/Models/Cyberamics/Cyber Helen_mic.png.import b/Models/Cyberamics/Cyber Helen_mic.png.import
new file mode 100644
index 0000000..faf0cd6
--- /dev/null
+++ b/Models/Cyberamics/Cyber Helen_mic.png.import
@@ -0,0 +1,39 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b05jw1y0ukwqu"
+path.s3tc="res://.godot/imported/Cyber Helen_mic.png-47fa0aeb51ad55b858b963218d0d6ecd.s3tc.ctex"
+path.etc2="res://.godot/imported/Cyber Helen_mic.png-47fa0aeb51ad55b858b963218d0d6ecd.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+generator_parameters={
+"md5": "0c2b737299479570c7cc39c7685d4c62"
+}
+
+[deps]
+
+source_file="res://Models/Cyberamics/Cyber Helen_mic.png"
+dest_files=["res://.godot/imported/Cyber Helen_mic.png-47fa0aeb51ad55b858b963218d0d6ecd.s3tc.ctex", "res://.godot/imported/Cyber Helen_mic.png-47fa0aeb51ad55b858b963218d0d6ecd.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0
diff --git a/Models/Cyberamics/Cyber Jasper.glb b/Models/Cyberamics/Cyber Jasper.glb
new file mode 100644
index 0000000..e2fe313
Binary files /dev/null and b/Models/Cyberamics/Cyber Jasper.glb differ
diff --git a/Models/Cyberamics/Cyber Jasper.glb.import b/Models/Cyberamics/Cyber Jasper.glb.import
new file mode 100644
index 0000000..58015b9
--- /dev/null
+++ b/Models/Cyberamics/Cyber Jasper.glb.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://ba7i8p8olef2s"
+path="res://.godot/imported/Cyber Jasper.glb-7156eb669feb8aeef67d143d15c0b7ad.scn"
+
+[deps]
+
+source_file="res://Models/Cyberamics/Cyber Jasper.glb"
+dest_files=["res://.godot/imported/Cyber Jasper.glb-7156eb669feb8aeef67d143d15c0b7ad.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+nodes/use_node_type_suffixes=true
+meshes/ensure_tangents=true
+meshes/generate_lods=true
+meshes/create_shadow_meshes=true
+meshes/light_baking=1
+meshes/lightmap_texel_size=0.2
+meshes/force_disable_compression=false
+skins/use_named_skins=true
+animation/import=true
+animation/fps=30
+animation/trimming=false
+animation/remove_immutable_tracks=true
+animation/import_rest_as_RESET=false
+import_script/path=""
+_subresources={}
+gltf/naming_version=1
+gltf/embedded_image_handling=1
diff --git a/Models/Cyberamics/Cyber Jasper_denim.png b/Models/Cyberamics/Cyber Jasper_denim.png
new file mode 100644
index 0000000..8a6d8e7
Binary files /dev/null and b/Models/Cyberamics/Cyber Jasper_denim.png differ
diff --git a/Models/Cyberamics/Cyber Jasper_denim.png.import b/Models/Cyberamics/Cyber Jasper_denim.png.import
new file mode 100644
index 0000000..0837877
--- /dev/null
+++ b/Models/Cyberamics/Cyber Jasper_denim.png.import
@@ -0,0 +1,39 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://q20cddw2xrei"
+path.s3tc="res://.godot/imported/Cyber Jasper_denim.png-d8598725528ffd5195e28e0eec9cd741.s3tc.ctex"
+path.etc2="res://.godot/imported/Cyber Jasper_denim.png-d8598725528ffd5195e28e0eec9cd741.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+generator_parameters={
+"md5": "402d309e5ed850ba52e293c0656acf10"
+}
+
+[deps]
+
+source_file="res://Models/Cyberamics/Cyber Jasper_denim.png"
+dest_files=["res://.godot/imported/Cyber Jasper_denim.png-d8598725528ffd5195e28e0eec9cd741.s3tc.ctex", "res://.godot/imported/Cyber Jasper_denim.png-d8598725528ffd5195e28e0eec9cd741.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0
diff --git a/Models/Cyberamics/Cyber Jasper_eyes.png b/Models/Cyberamics/Cyber Jasper_eyes.png
new file mode 100644
index 0000000..fb32529
Binary files /dev/null and b/Models/Cyberamics/Cyber Jasper_eyes.png differ
diff --git a/Models/Cyberamics/Cyber Jasper_eyes.png.import b/Models/Cyberamics/Cyber Jasper_eyes.png.import
new file mode 100644
index 0000000..131a261
--- /dev/null
+++ b/Models/Cyberamics/Cyber Jasper_eyes.png.import
@@ -0,0 +1,39 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://nwgwmia0tqak"
+path.s3tc="res://.godot/imported/Cyber Jasper_eyes.png-3656e523e85be9bc7e5d4df443165869.s3tc.ctex"
+path.etc2="res://.godot/imported/Cyber Jasper_eyes.png-3656e523e85be9bc7e5d4df443165869.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+generator_parameters={
+"md5": "d05686d9b10603e16e5810f67def9d24"
+}
+
+[deps]
+
+source_file="res://Models/Cyberamics/Cyber Jasper_eyes.png"
+dest_files=["res://.godot/imported/Cyber Jasper_eyes.png-3656e523e85be9bc7e5d4df443165869.s3tc.ctex", "res://.godot/imported/Cyber Jasper_eyes.png-3656e523e85be9bc7e5d4df443165869.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0
diff --git a/Models/Cyberamics/Cyber Jasper_muzzle.png b/Models/Cyberamics/Cyber Jasper_muzzle.png
new file mode 100644
index 0000000..a6c47ad
Binary files /dev/null and b/Models/Cyberamics/Cyber Jasper_muzzle.png differ
diff --git a/Models/Cyberamics/Cyber Jasper_muzzle.png.import b/Models/Cyberamics/Cyber Jasper_muzzle.png.import
new file mode 100644
index 0000000..d957bfc
--- /dev/null
+++ b/Models/Cyberamics/Cyber Jasper_muzzle.png.import
@@ -0,0 +1,39 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dyegy5aix0jnm"
+path.s3tc="res://.godot/imported/Cyber Jasper_muzzle.png-1363f785a4c6b6366aae4b87bbe29a4a.s3tc.ctex"
+path.etc2="res://.godot/imported/Cyber Jasper_muzzle.png-1363f785a4c6b6366aae4b87bbe29a4a.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+generator_parameters={
+"md5": "078b2003477a7c7835cfd9643aee65c3"
+}
+
+[deps]
+
+source_file="res://Models/Cyberamics/Cyber Jasper_muzzle.png"
+dest_files=["res://.godot/imported/Cyber Jasper_muzzle.png-1363f785a4c6b6366aae4b87bbe29a4a.s3tc.ctex", "res://.godot/imported/Cyber Jasper_muzzle.png-1363f785a4c6b6366aae4b87bbe29a4a.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0
diff --git a/Models/Cyberamics/Cyber Jasper_shirt_cow_print.png b/Models/Cyberamics/Cyber Jasper_shirt_cow_print.png
new file mode 100644
index 0000000..56bd6e2
Binary files /dev/null and b/Models/Cyberamics/Cyber Jasper_shirt_cow_print.png differ
diff --git a/Models/Cyberamics/Cyber Jasper_shirt_cow_print.png.import b/Models/Cyberamics/Cyber Jasper_shirt_cow_print.png.import
new file mode 100644
index 0000000..f0fb509
--- /dev/null
+++ b/Models/Cyberamics/Cyber Jasper_shirt_cow_print.png.import
@@ -0,0 +1,39 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c0hh0000v6h8y"
+path.s3tc="res://.godot/imported/Cyber Jasper_shirt_cow_print.png-de5138976b0094419018b0936baa9497.s3tc.ctex"
+path.etc2="res://.godot/imported/Cyber Jasper_shirt_cow_print.png-de5138976b0094419018b0936baa9497.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+generator_parameters={
+"md5": "35bb2072abe8c8e39214dcb47ee5fc3a"
+}
+
+[deps]
+
+source_file="res://Models/Cyberamics/Cyber Jasper_shirt_cow_print.png"
+dest_files=["res://.godot/imported/Cyber Jasper_shirt_cow_print.png-de5138976b0094419018b0936baa9497.s3tc.ctex", "res://.godot/imported/Cyber Jasper_shirt_cow_print.png-de5138976b0094419018b0936baa9497.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0
diff --git a/Models/Cyberamics/Cyber Jasper_shirt_rocker.png b/Models/Cyberamics/Cyber Jasper_shirt_rocker.png
new file mode 100644
index 0000000..d98871e
Binary files /dev/null and b/Models/Cyberamics/Cyber Jasper_shirt_rocker.png differ
diff --git a/Models/Cyberamics/Cyber Jasper_shirt_rocker.png.import b/Models/Cyberamics/Cyber Jasper_shirt_rocker.png.import
new file mode 100644
index 0000000..3ed149b
--- /dev/null
+++ b/Models/Cyberamics/Cyber Jasper_shirt_rocker.png.import
@@ -0,0 +1,39 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bcbsootxxvpjb"
+path.s3tc="res://.godot/imported/Cyber Jasper_shirt_rocker.png-f0e49ba2d7398b113f1af6030157a14e.s3tc.ctex"
+path.etc2="res://.godot/imported/Cyber Jasper_shirt_rocker.png-f0e49ba2d7398b113f1af6030157a14e.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+generator_parameters={
+"md5": "af4edca67cb9ab3accdc565f145f9c99"
+}
+
+[deps]
+
+source_file="res://Models/Cyberamics/Cyber Jasper_shirt_rocker.png"
+dest_files=["res://.godot/imported/Cyber Jasper_shirt_rocker.png-f0e49ba2d7398b113f1af6030157a14e.s3tc.ctex", "res://.godot/imported/Cyber Jasper_shirt_rocker.png-f0e49ba2d7398b113f1af6030157a14e.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0
diff --git a/Models/Cyberamics/Cyberamic Chuck.glb b/Models/Cyberamics/Cyberamic Chuck.glb
new file mode 100644
index 0000000..140a7b3
Binary files /dev/null and b/Models/Cyberamics/Cyberamic Chuck.glb differ
diff --git a/Models/Jasper.fbx.import b/Models/Cyberamics/Cyberamic Chuck.glb.import
similarity index 63%
rename from Models/Jasper.fbx.import
rename to Models/Cyberamics/Cyberamic Chuck.glb.import
index 820701e..faf11ce 100644
--- a/Models/Jasper.fbx.import
+++ b/Models/Cyberamics/Cyberamic Chuck.glb.import
@@ -3,13 +3,13 @@
importer="scene"
importer_version=1
type="PackedScene"
-uid="uid://b4xrsr1w4t017"
-path="res://.godot/imported/Jasper.fbx-172cc49326619adb06baca5b9e28470b.scn"
+uid="uid://c2j62syov3skq"
+path="res://.godot/imported/Cyberamic Chuck.glb-7640bcf570eaf553eddfec5de3e96502.scn"
[deps]
-source_file="res://3-Stage/Models/Jasper.fbx"
-dest_files=["res://.godot/imported/Jasper.fbx-172cc49326619adb06baca5b9e28470b.scn"]
+source_file="res://Models/Cyberamics/Cyberamic Chuck.glb"
+dest_files=["res://.godot/imported/Cyberamic Chuck.glb-7640bcf570eaf553eddfec5de3e96502.scn"]
[params]
@@ -28,11 +28,10 @@ meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
-animation/trimming=true
+animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
_subresources={}
-fbx/importer=0
-fbx/allow_geometry_helper_nodes=false
-fbx/embedded_image_handling=1
+gltf/naming_version=1
+gltf/embedded_image_handling=1
diff --git a/Models/Cyberamics/Cyberamic Chuck_avenger chuck shirt.png b/Models/Cyberamics/Cyberamic Chuck_avenger chuck shirt.png
new file mode 100644
index 0000000..473ca17
Binary files /dev/null and b/Models/Cyberamics/Cyberamic Chuck_avenger chuck shirt.png differ
diff --git a/Models/Cyberamics/Cyberamic Chuck_avenger chuck shirt.png.import b/Models/Cyberamics/Cyberamic Chuck_avenger chuck shirt.png.import
new file mode 100644
index 0000000..516457a
--- /dev/null
+++ b/Models/Cyberamics/Cyberamic Chuck_avenger chuck shirt.png.import
@@ -0,0 +1,39 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c8li1pbbld1r6"
+path.s3tc="res://.godot/imported/Cyberamic Chuck_avenger chuck shirt.png-ef24b9642c3c8e09e634fc0b19923210.s3tc.ctex"
+path.etc2="res://.godot/imported/Cyberamic Chuck_avenger chuck shirt.png-ef24b9642c3c8e09e634fc0b19923210.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+generator_parameters={
+"md5": "d05498ddd2256dae1de9c85a416823f1"
+}
+
+[deps]
+
+source_file="res://Models/Cyberamics/Cyberamic Chuck_avenger chuck shirt.png"
+dest_files=["res://.godot/imported/Cyberamic Chuck_avenger chuck shirt.png-ef24b9642c3c8e09e634fc0b19923210.s3tc.ctex", "res://.godot/imported/Cyberamic Chuck_avenger chuck shirt.png-ef24b9642c3c8e09e634fc0b19923210.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0
diff --git a/Models/Cyberamics/Cyberamic Chuck_avenger hat.png b/Models/Cyberamics/Cyberamic Chuck_avenger hat.png
new file mode 100644
index 0000000..3b25282
Binary files /dev/null and b/Models/Cyberamics/Cyberamic Chuck_avenger hat.png differ
diff --git a/Models/Cyberamics/Cyberamic Chuck_avenger hat.png.import b/Models/Cyberamics/Cyberamic Chuck_avenger hat.png.import
new file mode 100644
index 0000000..28242f2
--- /dev/null
+++ b/Models/Cyberamics/Cyberamic Chuck_avenger hat.png.import
@@ -0,0 +1,39 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://im1r1enoj4l3"
+path.s3tc="res://.godot/imported/Cyberamic Chuck_avenger hat.png-29377b5e8b656b2b533aeba9277b6de7.s3tc.ctex"
+path.etc2="res://.godot/imported/Cyberamic Chuck_avenger hat.png-29377b5e8b656b2b533aeba9277b6de7.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+generator_parameters={
+"md5": "eda0a6f93a90b3b6fa865784593fcd9f"
+}
+
+[deps]
+
+source_file="res://Models/Cyberamics/Cyberamic Chuck_avenger hat.png"
+dest_files=["res://.godot/imported/Cyberamic Chuck_avenger hat.png-29377b5e8b656b2b533aeba9277b6de7.s3tc.ctex", "res://.godot/imported/Cyberamic Chuck_avenger hat.png-29377b5e8b656b2b533aeba9277b6de7.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0
diff --git a/Models/Cyberamics/Cyberamic Chuck_cool chuck hat.png b/Models/Cyberamics/Cyberamic Chuck_cool chuck hat.png
new file mode 100644
index 0000000..8ca275a
Binary files /dev/null and b/Models/Cyberamics/Cyberamic Chuck_cool chuck hat.png differ
diff --git a/Models/Cyberamics/Cyberamic Chuck_cool chuck hat.png.import b/Models/Cyberamics/Cyberamic Chuck_cool chuck hat.png.import
new file mode 100644
index 0000000..3437fa1
--- /dev/null
+++ b/Models/Cyberamics/Cyberamic Chuck_cool chuck hat.png.import
@@ -0,0 +1,39 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bgfogdr7mgqrn"
+path.s3tc="res://.godot/imported/Cyberamic Chuck_cool chuck hat.png-92e57bd583b5fddebeb2b5a26a27b65f.s3tc.ctex"
+path.etc2="res://.godot/imported/Cyberamic Chuck_cool chuck hat.png-92e57bd583b5fddebeb2b5a26a27b65f.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+generator_parameters={
+"md5": "30dda0ec4550d8b59629241b11fcb967"
+}
+
+[deps]
+
+source_file="res://Models/Cyberamics/Cyberamic Chuck_cool chuck hat.png"
+dest_files=["res://.godot/imported/Cyberamic Chuck_cool chuck hat.png-92e57bd583b5fddebeb2b5a26a27b65f.s3tc.ctex", "res://.godot/imported/Cyberamic Chuck_cool chuck hat.png-92e57bd583b5fddebeb2b5a26a27b65f.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0
diff --git a/Models/Cyberamics/Cyberamic Chuck_cool chuck shirt.png b/Models/Cyberamics/Cyberamic Chuck_cool chuck shirt.png
new file mode 100644
index 0000000..167eb4d
Binary files /dev/null and b/Models/Cyberamics/Cyberamic Chuck_cool chuck shirt.png differ
diff --git a/Models/Cyberamics/Cyberamic Chuck_cool chuck shirt.png.import b/Models/Cyberamics/Cyberamic Chuck_cool chuck shirt.png.import
new file mode 100644
index 0000000..70b496e
--- /dev/null
+++ b/Models/Cyberamics/Cyberamic Chuck_cool chuck shirt.png.import
@@ -0,0 +1,39 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cpyxdwmo2mitw"
+path.s3tc="res://.godot/imported/Cyberamic Chuck_cool chuck shirt.png-52e5a2fe3b0c7d22e5cbd78c1c7500a9.s3tc.ctex"
+path.etc2="res://.godot/imported/Cyberamic Chuck_cool chuck shirt.png-52e5a2fe3b0c7d22e5cbd78c1c7500a9.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+generator_parameters={
+"md5": "47d45b1d7535be024d7328edf43a202e"
+}
+
+[deps]
+
+source_file="res://Models/Cyberamics/Cyberamic Chuck_cool chuck shirt.png"
+dest_files=["res://.godot/imported/Cyberamic Chuck_cool chuck shirt.png-52e5a2fe3b0c7d22e5cbd78c1c7500a9.s3tc.ctex", "res://.godot/imported/Cyberamic Chuck_cool chuck shirt.png-52e5a2fe3b0c7d22e5cbd78c1c7500a9.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0
diff --git a/Models/Cyberamics/Cyberamic Chuck_derby.png b/Models/Cyberamics/Cyberamic Chuck_derby.png
new file mode 100644
index 0000000..1f40a12
Binary files /dev/null and b/Models/Cyberamics/Cyberamic Chuck_derby.png differ
diff --git a/Models/Cyberamics/Cyberamic Chuck_derby.png.import b/Models/Cyberamics/Cyberamic Chuck_derby.png.import
new file mode 100644
index 0000000..215a507
--- /dev/null
+++ b/Models/Cyberamics/Cyberamic Chuck_derby.png.import
@@ -0,0 +1,39 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cbweai1832bm3"
+path.s3tc="res://.godot/imported/Cyberamic Chuck_derby.png-7bc146630594177e24ceda21a9c7859a.s3tc.ctex"
+path.etc2="res://.godot/imported/Cyberamic Chuck_derby.png-7bc146630594177e24ceda21a9c7859a.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+generator_parameters={
+"md5": "b7dcfc8d03f78489056415859985c5e8"
+}
+
+[deps]
+
+source_file="res://Models/Cyberamics/Cyberamic Chuck_derby.png"
+dest_files=["res://.godot/imported/Cyberamic Chuck_derby.png-7bc146630594177e24ceda21a9c7859a.s3tc.ctex", "res://.godot/imported/Cyberamic Chuck_derby.png-7bc146630594177e24ceda21a9c7859a.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0
diff --git a/Models/Cyberamics/Cyberamic Chuck_eyes.png b/Models/Cyberamics/Cyberamic Chuck_eyes.png
new file mode 100644
index 0000000..14dcc16
Binary files /dev/null and b/Models/Cyberamics/Cyberamic Chuck_eyes.png differ
diff --git a/Models/Cyberamics/Cyberamic Chuck_eyes.png.import b/Models/Cyberamics/Cyberamic Chuck_eyes.png.import
new file mode 100644
index 0000000..2a6d6da
--- /dev/null
+++ b/Models/Cyberamics/Cyberamic Chuck_eyes.png.import
@@ -0,0 +1,39 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://n8fyvmnwkd5f"
+path.s3tc="res://.godot/imported/Cyberamic Chuck_eyes.png-833864a46a4992a27ec42be8deaf2902.s3tc.ctex"
+path.etc2="res://.godot/imported/Cyberamic Chuck_eyes.png-833864a46a4992a27ec42be8deaf2902.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+generator_parameters={
+"md5": "de6b71a0b6b2ef973e666c75df9734be"
+}
+
+[deps]
+
+source_file="res://Models/Cyberamics/Cyberamic Chuck_eyes.png"
+dest_files=["res://.godot/imported/Cyberamic Chuck_eyes.png-833864a46a4992a27ec42be8deaf2902.s3tc.ctex", "res://.godot/imported/Cyberamic Chuck_eyes.png-833864a46a4992a27ec42be8deaf2902.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0
diff --git a/Models/Cyberamics/Cyberamic Chuck_fur.png b/Models/Cyberamics/Cyberamic Chuck_fur.png
new file mode 100644
index 0000000..30cd299
Binary files /dev/null and b/Models/Cyberamics/Cyberamic Chuck_fur.png differ
diff --git a/Models/Cyberamics/Cyberamic Chuck_fur.png.import b/Models/Cyberamics/Cyberamic Chuck_fur.png.import
new file mode 100644
index 0000000..d39617c
--- /dev/null
+++ b/Models/Cyberamics/Cyberamic Chuck_fur.png.import
@@ -0,0 +1,39 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c4tq7klloya28"
+path.s3tc="res://.godot/imported/Cyberamic Chuck_fur.png-5da3fabde0b41b5765b323a829d6681a.s3tc.ctex"
+path.etc2="res://.godot/imported/Cyberamic Chuck_fur.png-5da3fabde0b41b5765b323a829d6681a.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+generator_parameters={
+"md5": "6dc122b4f22f3c13939182e577582275"
+}
+
+[deps]
+
+source_file="res://Models/Cyberamics/Cyberamic Chuck_fur.png"
+dest_files=["res://.godot/imported/Cyberamic Chuck_fur.png-5da3fabde0b41b5765b323a829d6681a.s3tc.ctex", "res://.godot/imported/Cyberamic Chuck_fur.png-5da3fabde0b41b5765b323a829d6681a.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0
diff --git a/Models/Cyberamics/Cyberamic Chuck_jaw.png b/Models/Cyberamics/Cyberamic Chuck_jaw.png
new file mode 100644
index 0000000..becab0e
Binary files /dev/null and b/Models/Cyberamics/Cyberamic Chuck_jaw.png differ
diff --git a/Models/Cyberamics/Cyberamic Chuck_jaw.png.import b/Models/Cyberamics/Cyberamic Chuck_jaw.png.import
new file mode 100644
index 0000000..ac445d4
--- /dev/null
+++ b/Models/Cyberamics/Cyberamic Chuck_jaw.png.import
@@ -0,0 +1,39 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b6i5p7ssueq1c"
+path.s3tc="res://.godot/imported/Cyberamic Chuck_jaw.png-77869e5cf0e223c7b7e77b4c6ef73abc.s3tc.ctex"
+path.etc2="res://.godot/imported/Cyberamic Chuck_jaw.png-77869e5cf0e223c7b7e77b4c6ef73abc.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+generator_parameters={
+"md5": "dce09f49a6e472d9d20fd12ae0105263"
+}
+
+[deps]
+
+source_file="res://Models/Cyberamics/Cyberamic Chuck_jaw.png"
+dest_files=["res://.godot/imported/Cyberamic Chuck_jaw.png-77869e5cf0e223c7b7e77b4c6ef73abc.s3tc.ctex", "res://.godot/imported/Cyberamic Chuck_jaw.png-77869e5cf0e223c7b7e77b4c6ef73abc.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0
diff --git a/Models/Cyberamics/Cyberamic Chuck_mic.png b/Models/Cyberamics/Cyberamic Chuck_mic.png
new file mode 100644
index 0000000..72ef3ea
Binary files /dev/null and b/Models/Cyberamics/Cyberamic Chuck_mic.png differ
diff --git a/Models/Cyberamics/Cyberamic Chuck_mic.png.import b/Models/Cyberamics/Cyberamic Chuck_mic.png.import
new file mode 100644
index 0000000..90d4bb4
--- /dev/null
+++ b/Models/Cyberamics/Cyberamic Chuck_mic.png.import
@@ -0,0 +1,39 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://btm7ni51m76xy"
+path.s3tc="res://.godot/imported/Cyberamic Chuck_mic.png-a001658a24b06e235c5f95469e65dd38.s3tc.ctex"
+path.etc2="res://.godot/imported/Cyberamic Chuck_mic.png-a001658a24b06e235c5f95469e65dd38.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+generator_parameters={
+"md5": "0c2b737299479570c7cc39c7685d4c62"
+}
+
+[deps]
+
+source_file="res://Models/Cyberamics/Cyberamic Chuck_mic.png"
+dest_files=["res://.godot/imported/Cyberamic Chuck_mic.png-a001658a24b06e235c5f95469e65dd38.s3tc.ctex", "res://.godot/imported/Cyberamic Chuck_mic.png-a001658a24b06e235c5f95469e65dd38.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0
diff --git a/Models/Cyberamics/Cyberamic Chuck_modern jaw.png b/Models/Cyberamics/Cyberamic Chuck_modern jaw.png
new file mode 100644
index 0000000..63dcf64
Binary files /dev/null and b/Models/Cyberamics/Cyberamic Chuck_modern jaw.png differ
diff --git a/Models/Cyberamics/Cyberamic Chuck_modern jaw.png.import b/Models/Cyberamics/Cyberamic Chuck_modern jaw.png.import
new file mode 100644
index 0000000..46cadc4
--- /dev/null
+++ b/Models/Cyberamics/Cyberamic Chuck_modern jaw.png.import
@@ -0,0 +1,39 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b2im7s145j3ba"
+path.s3tc="res://.godot/imported/Cyberamic Chuck_modern jaw.png-cbbfdab929ad63a720505602abfbed7a.s3tc.ctex"
+path.etc2="res://.godot/imported/Cyberamic Chuck_modern jaw.png-cbbfdab929ad63a720505602abfbed7a.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+generator_parameters={
+"md5": "40535739a152a771fa57e75e1df9b011"
+}
+
+[deps]
+
+source_file="res://Models/Cyberamics/Cyberamic Chuck_modern jaw.png"
+dest_files=["res://.godot/imported/Cyberamic Chuck_modern jaw.png-cbbfdab929ad63a720505602abfbed7a.s3tc.ctex", "res://.godot/imported/Cyberamic Chuck_modern jaw.png-cbbfdab929ad63a720505602abfbed7a.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0
diff --git a/Models/Cyberamics/Cyberamic Chuck_vest.png b/Models/Cyberamics/Cyberamic Chuck_vest.png
new file mode 100644
index 0000000..594a1b9
Binary files /dev/null and b/Models/Cyberamics/Cyberamic Chuck_vest.png differ
diff --git a/Models/Cyberamics/Cyberamic Chuck_vest.png.import b/Models/Cyberamics/Cyberamic Chuck_vest.png.import
new file mode 100644
index 0000000..3a6567d
--- /dev/null
+++ b/Models/Cyberamics/Cyberamic Chuck_vest.png.import
@@ -0,0 +1,39 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cjjfoyalnst1d"
+path.s3tc="res://.godot/imported/Cyberamic Chuck_vest.png-f2e092297f624fd3dd64f2cbcf170064.s3tc.ctex"
+path.etc2="res://.godot/imported/Cyberamic Chuck_vest.png-f2e092297f624fd3dd64f2cbcf170064.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+generator_parameters={
+"md5": "cdfb9781f38ce700fb6a6329107289e5"
+}
+
+[deps]
+
+source_file="res://Models/Cyberamics/Cyberamic Chuck_vest.png"
+dest_files=["res://.godot/imported/Cyberamic Chuck_vest.png-f2e092297f624fd3dd64f2cbcf170064.s3tc.ctex", "res://.godot/imported/Cyberamic Chuck_vest.png-f2e092297f624fd3dd64f2cbcf170064.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0
diff --git a/Models/Cyberamics/Warblettes.glb b/Models/Cyberamics/Warblettes.glb
new file mode 100644
index 0000000..222c974
Binary files /dev/null and b/Models/Cyberamics/Warblettes.glb differ
diff --git a/Models/Cyberamics/Warblettes.glb.import b/Models/Cyberamics/Warblettes.glb.import
new file mode 100644
index 0000000..598bb73
--- /dev/null
+++ b/Models/Cyberamics/Warblettes.glb.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://dmh5upwts8y11"
+path="res://.godot/imported/Warblettes.glb-4411a6da11355afeccccd99ded899996.scn"
+
+[deps]
+
+source_file="res://Models/Cyberamics/Warblettes.glb"
+dest_files=["res://.godot/imported/Warblettes.glb-4411a6da11355afeccccd99ded899996.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+nodes/use_node_type_suffixes=true
+meshes/ensure_tangents=true
+meshes/generate_lods=true
+meshes/create_shadow_meshes=true
+meshes/light_baking=1
+meshes/lightmap_texel_size=0.2
+meshes/force_disable_compression=false
+skins/use_named_skins=true
+animation/import=true
+animation/fps=30
+animation/trimming=false
+animation/remove_immutable_tracks=true
+animation/import_rest_as_RESET=false
+import_script/path=""
+_subresources={}
+gltf/naming_version=1
+gltf/embedded_image_handling=1
diff --git a/Models/Cyberamics/Warblettes_fur.png b/Models/Cyberamics/Warblettes_fur.png
new file mode 100644
index 0000000..b903419
Binary files /dev/null and b/Models/Cyberamics/Warblettes_fur.png differ
diff --git a/Models/Cyberamics/Warblettes_fur.png.import b/Models/Cyberamics/Warblettes_fur.png.import
new file mode 100644
index 0000000..aa9cbfb
--- /dev/null
+++ b/Models/Cyberamics/Warblettes_fur.png.import
@@ -0,0 +1,39 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://jp06lvl1l4kf"
+path.s3tc="res://.godot/imported/Warblettes_fur.png-9635d2a2f1884e838e8285a0042af334.s3tc.ctex"
+path.etc2="res://.godot/imported/Warblettes_fur.png-9635d2a2f1884e838e8285a0042af334.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+generator_parameters={
+"md5": "e63b9c660d716af6780b5637f38da662"
+}
+
+[deps]
+
+source_file="res://Models/Cyberamics/Warblettes_fur.png"
+dest_files=["res://.godot/imported/Warblettes_fur.png-9635d2a2f1884e838e8285a0042af334.s3tc.ctex", "res://.godot/imported/Warblettes_fur.png-9635d2a2f1884e838e8285a0042af334.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0
diff --git a/Models/Room.glb b/Models/HelenHouse/HelenHouse-Room.glb
similarity index 100%
rename from Models/Room.glb
rename to Models/HelenHouse/HelenHouse-Room.glb
diff --git a/Models/Room.glb.import b/Models/HelenHouse/HelenHouse-Room.glb.import
similarity index 74%
rename from Models/Room.glb.import
rename to Models/HelenHouse/HelenHouse-Room.glb.import
index a2980ee..ec642f8 100644
--- a/Models/Room.glb.import
+++ b/Models/HelenHouse/HelenHouse-Room.glb.import
@@ -4,12 +4,12 @@ importer="scene"
importer_version=1
type="PackedScene"
uid="uid://bhoeqcsdb0fx2"
-path="res://.godot/imported/Room.glb-057b6820edeabb93a1fe769eeffdac34.scn"
+path="res://.godot/imported/HelenHouse-Room.glb-d039721f5e781fffec7d16cd58395499.scn"
[deps]
-source_file="res://Models/Room.glb"
-dest_files=["res://.godot/imported/Room.glb-057b6820edeabb93a1fe769eeffdac34.scn"]
+source_file="res://Models/HelenHouse/HelenHouse-Room.glb"
+dest_files=["res://.godot/imported/HelenHouse-Room.glb-d039721f5e781fffec7d16cd58395499.scn"]
[params]
diff --git a/Models/Stage.glb b/Models/HelenHouse/HelenHouse-Stage.glb
similarity index 100%
rename from Models/Stage.glb
rename to Models/HelenHouse/HelenHouse-Stage.glb
diff --git a/Models/Stage.glb.import b/Models/HelenHouse/HelenHouse-Stage.glb.import
similarity index 74%
rename from Models/Stage.glb.import
rename to Models/HelenHouse/HelenHouse-Stage.glb.import
index f5efa03..43b6dd4 100644
--- a/Models/Stage.glb.import
+++ b/Models/HelenHouse/HelenHouse-Stage.glb.import
@@ -4,12 +4,12 @@ importer="scene"
importer_version=1
type="PackedScene"
uid="uid://btvomf1ayoypu"
-path="res://.godot/imported/Stage.glb-38d445218888b57ffbbfd79eb6fd72c0.scn"
+path="res://.godot/imported/HelenHouse-Stage.glb-3682deea9f5a1b3381bc9010b144dd14.scn"
[deps]
-source_file="res://Models/Stage.glb"
-dest_files=["res://.godot/imported/Stage.glb-38d445218888b57ffbbfd79eb6fd72c0.scn"]
+source_file="res://Models/HelenHouse/HelenHouse-Stage.glb"
+dest_files=["res://.godot/imported/HelenHouse-Stage.glb-3682deea9f5a1b3381bc9010b144dd14.scn"]
[params]
diff --git a/Models/Pasqually.fbx.import b/Models/Pasqually.fbx.import
deleted file mode 100644
index 4eec3f9..0000000
--- a/Models/Pasqually.fbx.import
+++ /dev/null
@@ -1,38 +0,0 @@
-[remap]
-
-importer="scene"
-importer_version=1
-type="PackedScene"
-uid="uid://c66qevr67an0l"
-path="res://.godot/imported/Pasqually.fbx-764599cdc792a8e7936bfd485f85d0d3.scn"
-
-[deps]
-
-source_file="res://3-Stage/Models/Pasqually.fbx"
-dest_files=["res://.godot/imported/Pasqually.fbx-764599cdc792a8e7936bfd485f85d0d3.scn"]
-
-[params]
-
-nodes/root_type=""
-nodes/root_name=""
-nodes/apply_root_scale=true
-nodes/root_scale=1.0
-nodes/import_as_skeleton_bones=false
-nodes/use_node_type_suffixes=true
-meshes/ensure_tangents=true
-meshes/generate_lods=true
-meshes/create_shadow_meshes=true
-meshes/light_baking=1
-meshes/lightmap_texel_size=0.2
-meshes/force_disable_compression=false
-skins/use_named_skins=true
-animation/import=true
-animation/fps=30
-animation/trimming=true
-animation/remove_immutable_tracks=true
-animation/import_rest_as_RESET=false
-import_script/path=""
-_subresources={}
-fbx/importer=0
-fbx/allow_geometry_helper_nodes=false
-fbx/embedded_image_handling=1
diff --git a/README.md b/README.md
index 3f3d4e0..38858fc 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,6 @@
# PneumaticPlaything
-animatronic simulator
\ No newline at end of file
+Animatronics simulator and showtape creator
+(soon to be) Featuring real stages and animatronics
+
+This project is not associated with CEC Entertainment LLC. or Creative Engineering Inc.
diff --git a/Scenes/GUI/Controls/CameraButton.tscn b/Scenes/GUI/Controls/CameraButton.tscn
new file mode 100644
index 0000000..c49bfca
--- /dev/null
+++ b/Scenes/GUI/Controls/CameraButton.tscn
@@ -0,0 +1,19 @@
+[gd_scene load_steps=2 format=3 uid="uid://bt7bxdgv6u8ev"]
+
+[ext_resource type="Script" uid="uid://dfoog0y2bh7tk" path="res://Scripts/CameraButton.gd" id="1_3y3s1"]
+
+[node name="CameraButton" type="Control"]
+layout_mode = 3
+anchors_preset = 0
+offset_right = 136.0
+offset_bottom = 32.0
+script = ExtResource("1_3y3s1")
+
+[node name="Button" type="Button" parent="."]
+layout_mode = 0
+offset_left = 4.0
+offset_right = 132.0
+offset_bottom = 32.0
+text = "Angle"
+
+[connection signal="pressed" from="Button" to="." method="_on_button_pressed"]
diff --git a/Scenes/GUI/Controls/CosmeticAdjustment.tscn b/Scenes/GUI/Controls/CosmeticAdjustment.tscn
new file mode 100644
index 0000000..75b90ef
--- /dev/null
+++ b/Scenes/GUI/Controls/CosmeticAdjustment.tscn
@@ -0,0 +1,35 @@
+[gd_scene load_steps=2 format=3 uid="uid://dfll7xwkb2mbi"]
+
+[ext_resource type="Script" uid="uid://1f7v3ohsgx0g" path="res://Scripts/CosmeticAdjustment.gd" id="1_fg0vw"]
+
+[node name="FlowControl" type="Control"]
+layout_mode = 3
+anchors_preset = 0
+offset_right = 384.0
+offset_bottom = 40.0
+script = ExtResource("1_fg0vw")
+
+[node name="Panel" type="Panel" parent="."]
+layout_mode = 0
+offset_right = 384.0
+offset_bottom = 40.0
+
+[node name="Label" type="Label" parent="Panel"]
+layout_mode = 0
+offset_left = 4.0
+offset_top = 4.0
+offset_right = 184.0
+offset_bottom = 36.0
+text = "Cosmetic Adustment"
+vertical_alignment = 1
+clip_text = true
+text_overrun_behavior = 3
+
+[node name="OptionButton" type="OptionButton" parent="Panel"]
+layout_mode = 0
+offset_left = 188.0
+offset_top = 4.0
+offset_right = 380.0
+offset_bottom = 36.0
+
+[connection signal="item_selected" from="Panel/OptionButton" to="." method="_on_option_button_item_selected"]
diff --git a/Scenes/GUI/Controls/FlowControl.tscn b/Scenes/GUI/Controls/FlowControl.tscn
new file mode 100644
index 0000000..c711895
--- /dev/null
+++ b/Scenes/GUI/Controls/FlowControl.tscn
@@ -0,0 +1,51 @@
+[gd_scene load_steps=2 format=3 uid="uid://blg1c3v4o44of"]
+
+[ext_resource type="Script" uid="uid://blhv0kms1sleu" path="res://Scripts/FlowControl.gd" id="1_6sy3t"]
+
+[node name="FlowControl" type="Control"]
+layout_mode = 3
+anchors_preset = 0
+offset_right = 512.0
+offset_bottom = 40.0
+script = ExtResource("1_6sy3t")
+
+[node name="Panel" type="Panel" parent="."]
+layout_mode = 0
+offset_right = 512.0
+offset_bottom = 40.0
+
+[node name="Label" type="Label" parent="Panel"]
+layout_mode = 0
+offset_left = 4.0
+offset_top = 4.0
+offset_right = 244.0
+offset_bottom = 36.0
+text = "Movement"
+vertical_alignment = 1
+clip_text = true
+text_overrun_behavior = 3
+
+[node name="InStepper" type="SpinBox" parent="Panel"]
+layout_mode = 0
+offset_left = 248.0
+offset_top = 4.0
+offset_right = 376.0
+offset_bottom = 36.0
+max_value = 10000.0
+step = 0.1
+value = 1.0
+prefix = "In:"
+
+[node name="OutStepper" type="SpinBox" parent="Panel"]
+layout_mode = 0
+offset_left = 380.0
+offset_top = 4.0
+offset_right = 508.0
+offset_bottom = 36.0
+max_value = 10.0
+step = 0.1
+value = 1.0
+prefix = "Out:"
+
+[connection signal="value_changed" from="Panel/InStepper" to="." method="_on_in_stepper_value_changed"]
+[connection signal="value_changed" from="Panel/OutStepper" to="." method="_on_out_stepper_value_changed"]
diff --git a/Scenes/GUI/Controls/FlowSlider.tscn b/Scenes/GUI/Controls/FlowSlider.tscn
deleted file mode 100644
index d2dfd56..0000000
--- a/Scenes/GUI/Controls/FlowSlider.tscn
+++ /dev/null
@@ -1,42 +0,0 @@
-[gd_scene load_steps=2 format=3 uid="uid://blg1c3v4o44of"]
-
-[ext_resource type="Script" uid="uid://blhv0kms1sleu" path="res://Scripts/FlowSlider.gd" id="1_q164o"]
-
-[node name="FlowSlider" type="Control"]
-layout_mode = 3
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-offset_right = -1280.0
-offset_bottom = -720.0
-grow_horizontal = 2
-grow_vertical = 2
-script = ExtResource("1_q164o")
-
-[node name="Panel" type="Panel" parent="."]
-layout_mode = 0
-offset_right = 96.0
-offset_bottom = 32.0
-
-[node name="Slider" type="HSlider" parent="Panel"]
-layout_mode = 2
-offset_left = 4.0
-offset_right = 64.0
-offset_bottom = 32.0
-size_flags_vertical = 1
-max_value = 5.0
-step = 0.1
-value = 1.0
-
-[node name="ValueLabel" type="Label" parent="Panel"]
-layout_mode = 2
-offset_left = 64.0
-offset_right = 96.0
-offset_bottom = 32.0
-size_flags_horizontal = 8
-size_flags_vertical = 1
-text = "1.0"
-horizontal_alignment = 1
-vertical_alignment = 1
-
-[connection signal="value_changed" from="Panel/Slider" to="." method="_on_slider_value_changed"]
diff --git a/Scenes/GUI/Controls/IndicatorLight.tscn b/Scenes/GUI/Controls/MovementButton.tscn
similarity index 51%
rename from Scenes/GUI/Controls/IndicatorLight.tscn
rename to Scenes/GUI/Controls/MovementButton.tscn
index 998e838..0200f4a 100644
--- a/Scenes/GUI/Controls/IndicatorLight.tscn
+++ b/Scenes/GUI/Controls/MovementButton.tscn
@@ -1,6 +1,6 @@
[gd_scene load_steps=4 format=3 uid="uid://cbf3x44mvo701"]
-[ext_resource type="Script" uid="uid://cg157l4uo7ki8" path="res://Scripts/IndicatorLight.gd" id="1_l718a"]
+[ext_resource type="Script" uid="uid://cg157l4uo7ki8" path="res://Scripts/MovementButton.gd" id="1_l718a"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_1pi70"]
bg_color = Color(0, 0, 0, 1)
@@ -16,23 +16,26 @@ corner_radius_top_right = 12
corner_radius_bottom_right = 12
corner_radius_bottom_left = 12
-[node name="IndicatorLight" type="Control"]
+[node name="MovementButton" type="Control"]
layout_mode = 3
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-offset_right = -1280.0
-offset_bottom = -720.0
-grow_horizontal = 2
-grow_vertical = 2
+anchors_preset = 0
+offset_right = 256.0
+offset_bottom = 40.0
script = ExtResource("1_l718a")
-[node name="Container" type="Panel" parent="."]
+[node name="Panel" type="Panel" parent="."]
layout_mode = 0
-offset_right = 32.0
-offset_bottom = 32.0
+offset_right = 256.0
+offset_bottom = 40.0
-[node name="Black" type="Panel" parent="."]
+[node name="IndicatorPanel" type="Panel" parent="Panel"]
+layout_mode = 0
+offset_left = 220.0
+offset_top = 4.0
+offset_right = 252.0
+offset_bottom = 36.0
+
+[node name="Black" type="Panel" parent="Panel/IndicatorPanel"]
layout_mode = 0
offset_left = 4.0
offset_top = 4.0
@@ -40,10 +43,22 @@ offset_right = 28.0
offset_bottom = 28.0
theme_override_styles/panel = SubResource("StyleBoxFlat_1pi70")
-[node name="Green" type="Panel" parent="."]
+[node name="Green" type="Panel" parent="Panel/IndicatorPanel"]
+visible = false
layout_mode = 0
offset_left = 4.0
offset_top = 4.0
offset_right = 28.0
offset_bottom = 28.0
theme_override_styles/panel = SubResource("StyleBoxFlat_5m0fm")
+
+[node name="Button" type="Button" parent="Panel"]
+layout_mode = 0
+offset_left = 4.0
+offset_top = 4.0
+offset_right = 216.0
+offset_bottom = 36.0
+text = "Movement"
+
+[connection signal="button_down" from="Panel/Button" to="." method="_on_button_button_down"]
+[connection signal="button_up" from="Panel/Button" to="." method="_on_button_button_up"]
diff --git a/Scenes/GUI/Controls/MovementRow.tscn b/Scenes/GUI/Controls/MovementRow.tscn
index 0a6fa47..e8354c5 100644
--- a/Scenes/GUI/Controls/MovementRow.tscn
+++ b/Scenes/GUI/Controls/MovementRow.tscn
@@ -1,7 +1,9 @@
-[gd_scene load_steps=4 format=3 uid="uid://dtkqaw5533rxy"]
+[gd_scene load_steps=7 format=3 uid="uid://dtkqaw5533rxy"]
[ext_resource type="StyleBox" uid="uid://d17amc25o63p1" path="res://UI/Themes/MovementsPanelOverride.tres" id="1_d1xev"]
[ext_resource type="Script" uid="uid://tn3aaldu7mm2" path="res://Scripts/MovementRow.gd" id="1_rm5t0"]
+[ext_resource type="Texture2D" uid="uid://cn5xdrxdv622h" path="res://UI/SmallX.png" id="2_e7anl"]
+[ext_resource type="Texture2D" uid="uid://d007317123e27" path="res://UI/SmallLock.png" id="3_ldhn8"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_rm5t0"]
bg_color = Color(0, 1, 0, 1)
@@ -10,6 +12,17 @@ corner_radius_top_right = 4
corner_radius_bottom_right = 4
corner_radius_bottom_left = 4
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ldhn8"]
+content_margin_left = 4.0
+content_margin_top = 4.0
+content_margin_right = 4.0
+content_margin_bottom = 4.0
+bg_color = Color(1, 0.752941, 0, 1)
+corner_radius_top_left = 2
+corner_radius_top_right = 2
+corner_radius_bottom_right = 2
+corner_radius_bottom_left = 2
+
[node name="Row" type="Panel"]
anchors_preset = 10
anchor_right = 1.0
@@ -35,6 +48,28 @@ offset_bottom = 36.0
tooltip_text = "Click to bind a key to this movement"
text = "0 - Name (Unbound)"
alignment = 0
+text_overrun_behavior = 3
+clip_text = true
+
+[node name="ClearButton" type="Button" parent="."]
+layout_mode = 0
+offset_left = 244.0
+offset_top = 4.0
+offset_right = 260.0
+offset_bottom = 20.0
+tooltip_text = "Clear this row"
+icon = ExtResource("2_e7anl")
+
+[node name="LockButton" type="Button" parent="."]
+layout_mode = 0
+offset_left = 244.0
+offset_top = 20.0
+offset_right = 260.0
+offset_bottom = 36.0
+tooltip_text = "Prevent recording over"
+theme_override_styles/pressed = SubResource("StyleBoxFlat_ldhn8")
+toggle_mode = true
+icon = ExtResource("3_ldhn8")
[node name="MovementsBG" type="Panel" parent="."]
layout_mode = 1
@@ -49,6 +84,7 @@ theme_override_styles/panel = ExtResource("1_d1xev")
[node name="InvisibleMask" type="Control" parent="MovementsBG"]
clip_contents = true
layout_mode = 1
+anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = 4.0
@@ -64,3 +100,4 @@ offset_left = 120.0
offset_right = 120.0
[connection signal="pressed" from="Button" to="." method="_on_button_pressed"]
+[connection signal="pressed" from="ClearButton" to="." method="_on_clear_button_pressed"]
diff --git a/Scenes/GUI/EditorScreen.tscn b/Scenes/GUI/EditorScreen.tscn
index c1e0287..3d97c93 100644
--- a/Scenes/GUI/EditorScreen.tscn
+++ b/Scenes/GUI/EditorScreen.tscn
@@ -2,18 +2,18 @@
[ext_resource type="Script" uid="uid://dfiwoln8mdwm8" path="res://Scripts/EditorScreen.gd" id="1_sd512"]
[ext_resource type="Theme" uid="uid://dbgs4id7y5d1c" path="res://UI/Themes/Dark.tres" id="1_v0ton"]
-[ext_resource type="PackedScene" uid="uid://btre5j66mpchy" path="res://Scenes/Stages/Helen House/HelenHouse.tscn" id="2_p1t5g"]
[ext_resource type="Texture2D" uid="uid://xllpr3qc064c" path="res://UI/Play.png" id="3_g6u4d"]
[ext_resource type="Texture2D" uid="uid://dgacnkv2dc65s" path="res://UI/PlayBackwards.png" id="3_mr8sb"]
[ext_resource type="Texture2D" uid="uid://dts4eh6hyt8p3" path="res://UI/SkipBackwards.png" id="3_r4ytj"]
+[ext_resource type="Texture2D" uid="uid://bpb3xn54kpxoe" path="res://UI/icon-32px.png" id="4_20noo"]
[ext_resource type="Texture2D" uid="uid://bwhgy4u37jmo1" path="res://UI/Pause.png" id="4_ba3jn"]
+[ext_resource type="Texture2D" uid="uid://s3yr2wasxv03" path="res://UI/BlankCam.png" id="4_v0ton"]
[ext_resource type="Texture2D" uid="uid://dhx2v2fd0egxd" path="res://UI/FastBackwards.png" id="4_wy7jo"]
[ext_resource type="Texture2D" uid="uid://cttgtbu1xllwq" path="res://UI/Stop.png" id="8_20noo"]
[ext_resource type="Texture2D" uid="uid://dsr03w7r667fw" path="res://UI/FastForward.png" id="8_v0ton"]
[ext_resource type="Texture2D" uid="uid://bphwtliq2ahus" path="res://UI/SkipForward.png" id="9_20noo"]
[ext_resource type="Texture2D" uid="uid://ckg2ihy105ttj" path="res://UI/Record.png" id="10_wy7jo"]
-[ext_resource type="PackedScene" uid="uid://dyuhywnk8heav" path="res://Scenes/Stages/Helen House/HelenHouseMovementRows.tscn" id="12_20noo"]
-[ext_resource type="PackedScene" uid="uid://dwhrame6udwbh" path="res://Scenes/Stages/Helen House/HelenHouseFlyout.tscn" id="13_wy7jo"]
+[ext_resource type="ButtonGroup" uid="uid://bij2tonqeslpt" path="res://Scenes/GUI/FlyoutButtonGroup.tres" id="13_wy7jo"]
[sub_resource type="ViewportTexture" id="ViewportTexture_g6u4d"]
viewport_path = NodePath("SubViewport")
@@ -50,11 +50,79 @@ grow_vertical = 2
theme = ExtResource("1_v0ton")
script = ExtResource("1_sd512")
+[node name="OpenAudioFileDialog" type="FileDialog" parent="."]
+title = "Open a File"
+initial_position = 2
+ok_button_text = "Open"
+dialog_hide_on_ok = true
+file_mode = 0
+access = 2
+filters = PackedStringArray("*.wav", "*.mp3", "*.ogg")
+
+[node name="OpenShowtapeFileDialog" type="FileDialog" parent="."]
+auto_translate_mode = 1
+title = "Open a File"
+initial_position = 2
+ok_button_text = "Open"
+dialog_hide_on_ok = true
+file_mode = 0
+access = 2
+filters = PackedStringArray("*.ust")
+
+[node name="SaveShowtapeFileDialog" type="FileDialog" parent="."]
+auto_translate_mode = 1
+initial_position = 2
+dialog_hide_on_ok = true
+access = 2
+filters = PackedStringArray("*.ust")
+
+[node name="NewOverwriteConfirmationDialog" type="ConfirmationDialog" parent="."]
+initial_position = 2
+size = Vector2i(472, 100)
+ok_button_text = "Proceed"
+dialog_text = "You have unsaved data! Are you sure you want to proceed?"
+cancel_button_text = "Do Not"
+
+[node name="LoadOverwriteConfirmationDialog" type="ConfirmationDialog" parent="."]
+auto_translate_mode = 1
+initial_position = 2
+size = Vector2i(472, 100)
+ok_button_text = "Proceed"
+dialog_text = "You have unsaved data! Are you sure you want to proceed?"
+cancel_button_text = "Do Not"
+
+[node name="StageChangeOverwriteConfirmationDialog" type="ConfirmationDialog" parent="."]
+auto_translate_mode = 1
+initial_position = 2
+size = Vector2i(472, 100)
+ok_button_text = "Proceed"
+dialog_text = "You have unsaved data! Are you sure you want to proceed?"
+cancel_button_text = "Do Not"
+
+[node name="FileDoesntExistDialog" type="AcceptDialog" parent="."]
+initial_position = 2
+dialog_text = "The specified file does not exist."
+
+[node name="EmptyStringDialog" type="AcceptDialog" parent="."]
+auto_translate_mode = 1
+initial_position = 2
+dialog_text = "String cannot be blank."
+
+[node name="NoShowtapeLoadedDialog" type="AcceptDialog" parent="."]
+auto_translate_mode = 1
+initial_position = 2
+dialog_text = "There is no showtape currently loaded."
+
+[node name="IncorrectShowtapeDialog" type="AcceptDialog" parent="."]
+auto_translate_mode = 1
+initial_position = 2
+dialog_text = "This showtape is not compatible with the currently selected stage."
+
+[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."]
+
[node name="SubViewport" type="SubViewport" parent="."]
size = Vector2i(1280, 720)
-[node name="HelenHouse" parent="SubViewport" instance=ExtResource("2_p1t5g")]
-
[node name="ColorRect" type="ColorRect" parent="."]
layout_mode = 1
anchors_preset = 15
@@ -64,19 +132,6 @@ grow_horizontal = 2
grow_vertical = 2
color = Color(0.187176, 0.187176, 0.187176, 1)
-[node name="CameraPreview" type="TextureRect" parent="."]
-layout_mode = 1
-anchors_preset = -1
-anchor_left = 0.5
-anchor_right = 1.0
-offset_left = -4.0
-offset_top = 48.0
-offset_right = -4.0
-grow_horizontal = 0
-texture = SubResource("ViewportTexture_g6u4d")
-expand_mode = 5
-stretch_mode = 6
-
[node name="Label" type="Label" parent="."]
layout_mode = 1
anchors_preset = -1
@@ -98,6 +153,35 @@ Open the Controls menu to see all of the keybinds."
horizontal_alignment = 1
vertical_alignment = 1
+[node name="CameraPlaceholder" type="TextureRect" parent="."]
+layout_mode = 1
+anchors_preset = -1
+anchor_left = 0.5
+anchor_right = 1.0
+anchor_bottom = 0.5
+offset_left = -4.0
+offset_top = 48.0
+offset_right = -4.0
+offset_bottom = 48.0
+grow_horizontal = 2
+grow_vertical = 2
+texture = ExtResource("4_v0ton")
+expand_mode = 1
+
+[node name="CameraPreview" type="TextureRect" parent="."]
+visible = false
+layout_mode = 1
+anchors_preset = -1
+anchor_left = 0.5
+anchor_right = 1.0
+offset_left = -4.0
+offset_top = 48.0
+offset_right = -4.0
+grow_horizontal = 0
+texture = SubResource("ViewportTexture_g6u4d")
+expand_mode = 5
+stretch_mode = 6
+
[node name="MenuBar" type="Panel" parent="."]
layout_mode = 1
anchors_preset = -1
@@ -108,23 +192,6 @@ offset_right = -4.0
offset_bottom = 44.0
grow_horizontal = 2
-[node name="Wordmark" type="Label" parent="MenuBar"]
-layout_mode = 1
-anchors_preset = -1
-anchor_left = 1.0
-anchor_top = 0.5
-anchor_right = 1.0
-anchor_bottom = 0.5
-offset_left = -228.0
-offset_top = -16.0
-offset_right = -4.0
-offset_bottom = 16.0
-grow_horizontal = 0
-grow_vertical = 2
-text = "Pneumatic Plaything v0.2"
-horizontal_alignment = 1
-vertical_alignment = 1
-
[node name="StageSelector" type="OptionButton" parent="MenuBar"]
layout_mode = 0
offset_left = 4.0
@@ -132,53 +199,84 @@ offset_top = 4.0
offset_right = 260.0
offset_bottom = 36.0
selected = 0
-item_count = 1
-popup/item_0/text = "Helen House (Custom)"
+item_count = 3
+popup/item_0/text = "Balcony Stage"
popup/item_0/id = 0
+popup/item_1/text = "Helen House"
+popup/item_1/id = 1
+popup/item_2/text = "Chuck E's Corner"
+popup/item_2/id = 2
-[node name="LoadShowtapeButton" type="Button" parent="MenuBar"]
-visible = false
+[node name="MenuButton" type="MenuButton" parent="MenuBar"]
layout_mode = 0
offset_left = 264.0
offset_top = 4.0
offset_right = 392.0
offset_bottom = 36.0
-text = "Load Showtape"
+text = "Showtape"
+flat = false
+item_count = 3
+popup/item_0/text = "New"
+popup/item_0/id = 0
+popup/item_1/text = "Load"
+popup/item_1/id = 1
+popup/item_2/text = "Save"
+popup/item_2/id = 2
-[node name="NewShowtapeButton" type="Button" parent="MenuBar"]
-visible = false
+[node name="ControlsButton" type="Button" parent="MenuBar"]
layout_mode = 0
offset_left = 396.0
offset_top = 4.0
offset_right = 524.0
offset_bottom = 36.0
-text = "New Showtape"
-
-[node name="SaveShowtapeButton" type="Button" parent="MenuBar"]
-visible = false
-layout_mode = 0
-offset_left = 528.0
-offset_top = 4.0
-offset_right = 656.0
-offset_bottom = 36.0
-text = "Save Showtape"
-
-[node name="ControlsButton" type="Button" parent="MenuBar"]
-layout_mode = 0
-offset_left = 264.0
-offset_top = 4.0
-offset_right = 392.0
-offset_bottom = 36.0
text = "Controls"
[node name="CreditsButton" type="Button" parent="MenuBar"]
layout_mode = 0
-offset_left = 396.0
+offset_left = 528.0
offset_top = 4.0
-offset_right = 524.0
+offset_right = 656.0
offset_bottom = 36.0
text = "Credits"
+[node name="Wordmark" type="Label" parent="MenuBar"]
+layout_mode = 1
+anchors_preset = -1
+anchor_left = 1.0
+anchor_top = 0.5
+anchor_right = 1.0
+anchor_bottom = 0.5
+offset_left = -264.0
+offset_top = -16.0
+offset_right = -40.0
+offset_bottom = 16.0
+grow_horizontal = 0
+grow_vertical = 2
+text = "Pneumatic Plaything v0.6"
+horizontal_alignment = 2
+vertical_alignment = 1
+
+[node name="EditingLabel" type="Label" parent="MenuBar"]
+layout_mode = 0
+offset_left = 660.0
+offset_top = 4.0
+offset_right = 899.0
+offset_bottom = 36.0
+text = "No showtape loaded."
+vertical_alignment = 1
+
+[node name="TextureRect" type="TextureRect" parent="MenuBar"]
+layout_mode = 1
+anchors_preset = 1
+anchor_left = 1.0
+anchor_right = 1.0
+offset_left = -36.0
+offset_top = 4.0
+offset_right = -4.0
+offset_bottom = 36.0
+grow_horizontal = 0
+texture = ExtResource("4_20noo")
+
[node name="SequencerPanel" type="Panel" parent="."]
layout_mode = 1
anchors_preset = -1
@@ -229,6 +327,7 @@ offset_top = 4.0
offset_right = 44.0
offset_bottom = 44.0
tooltip_text = "Step backward 1 frame"
+disabled = true
icon = ExtResource("3_r4ytj")
[node name="FastBackwardsButton" type="Button" parent="SequencerPanel/TransportControls/Centered"]
@@ -238,6 +337,7 @@ offset_top = 4.0
offset_right = 88.0
offset_bottom = 44.0
tooltip_text = "Play backwards at 2x speed"
+disabled = true
icon = ExtResource("4_wy7jo")
[node name="PlayBackwardsButton" type="Button" parent="SequencerPanel/TransportControls/Centered"]
@@ -247,6 +347,7 @@ offset_top = 4.0
offset_right = 132.0
offset_bottom = 44.0
tooltip_text = "Play backwards"
+disabled = true
icon = ExtResource("3_mr8sb")
[node name="PauseButton" type="Button" parent="SequencerPanel/TransportControls/Centered"]
@@ -256,6 +357,7 @@ offset_top = 4.0
offset_right = 176.0
offset_bottom = 44.0
tooltip_text = "Pause"
+disabled = true
icon = ExtResource("4_ba3jn")
[node name="StopButton" type="Button" parent="SequencerPanel/TransportControls/Centered"]
@@ -265,6 +367,7 @@ offset_top = 4.0
offset_right = 220.0
offset_bottom = 44.0
tooltip_text = "Stop playback and return to frame 0"
+disabled = true
icon = ExtResource("8_20noo")
[node name="PlayButton" type="Button" parent="SequencerPanel/TransportControls/Centered"]
@@ -274,6 +377,7 @@ offset_top = 4.0
offset_right = 264.0
offset_bottom = 44.0
tooltip_text = "Play"
+disabled = true
icon = ExtResource("3_g6u4d")
[node name="FastForwardButton" type="Button" parent="SequencerPanel/TransportControls/Centered"]
@@ -283,6 +387,7 @@ offset_top = 4.0
offset_right = 308.0
offset_bottom = 44.0
tooltip_text = "Play at 2x speed"
+disabled = true
icon = ExtResource("8_v0ton")
[node name="StepForwardButton" type="Button" parent="SequencerPanel/TransportControls/Centered"]
@@ -292,6 +397,7 @@ offset_top = 4.0
offset_right = 352.0
offset_bottom = 44.0
tooltip_text = "Step forward 1 frame"
+disabled = true
icon = ExtResource("9_20noo")
[node name="RecordButton" type="Button" parent="SequencerPanel/TransportControls"]
@@ -308,6 +414,8 @@ offset_bottom = 20.0
grow_horizontal = 0
grow_vertical = 2
tooltip_text = "Start recording"
+disabled = true
+toggle_mode = true
icon = ExtResource("10_wy7jo")
[node name="TimelinePanel" type="Panel" parent="SequencerPanel"]
@@ -324,14 +432,14 @@ grow_vertical = 2
[node name="VScrollBar" type="VScrollBar" parent="SequencerPanel/TimelinePanel"]
layout_mode = 1
-anchors_preset = -1
+anchors_preset = 9
anchor_bottom = 1.0
offset_left = 4.0
offset_top = 4.0
offset_right = 12.0
offset_bottom = -4.0
grow_vertical = 2
-max_value = 18.0
+max_value = 0.0
step = 1.0
[node name="InvisibleMask" type="Control" parent="SequencerPanel/TimelinePanel"]
@@ -347,32 +455,166 @@ offset_bottom = -4.0
grow_horizontal = 2
grow_vertical = 2
-[node name="RowsHandle" type="Control" parent="SequencerPanel/TimelinePanel/InvisibleMask"]
+[node name="MovementRowsContainer" type="Control" parent="SequencerPanel/TimelinePanel/InvisibleMask"]
layout_mode = 1
-anchors_preset = 10
+anchors_preset = 15
anchor_right = 1.0
+anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
-[node name="HelenHouseMovementRows" parent="SequencerPanel/TimelinePanel/InvisibleMask/RowsHandle" instance=ExtResource("12_20noo")]
+[node name="Playhead" type="VSeparator" parent="SequencerPanel/TimelinePanel/InvisibleMask"]
layout_mode = 1
-
-[node name="VSeparator" type="VSeparator" parent="SequencerPanel/TimelinePanel"]
-layout_mode = 1
-anchors_preset = -1
+anchors_preset = 9
anchor_bottom = 1.0
-offset_left = 398.0
-offset_right = 4.0
+offset_left = 388.0
+offset_right = 392.0
grow_vertical = 2
-[node name="HelenHouseFlyout" parent="." instance=ExtResource("13_wy7jo")]
+[node name="FlyoutPanel" type="Control" parent="."]
layout_mode = 1
-anchors_preset = -1
anchor_bottom = 0.5
offset_left = 4.0
offset_top = 48.0
offset_right = 140.0
offset_bottom = 48.0
+grow_vertical = 2
+
+[node name="FlyoutButtons" type="Panel" parent="FlyoutPanel"]
+layout_mode = 1
+anchors_preset = 9
+anchor_bottom = 1.0
+offset_right = 136.0
+grow_vertical = 2
+
+[node name="MovementsFlyoutButton" type="Button" parent="FlyoutPanel/FlyoutButtons"]
+layout_mode = 0
+offset_left = 4.0
+offset_top = 4.0
+offset_right = 132.0
+offset_bottom = 36.0
+toggle_mode = true
+button_group = ExtResource("13_wy7jo")
+text = "Movements"
+
+[node name="FlowsFlyoutButton" type="Button" parent="FlyoutPanel/FlyoutButtons"]
+layout_mode = 0
+offset_left = 4.0
+offset_top = 40.0
+offset_right = 132.0
+offset_bottom = 72.0
+toggle_mode = true
+button_group = ExtResource("13_wy7jo")
+text = "Flows"
+
+[node name="CameraFlyoutButton" type="Button" parent="FlyoutPanel/FlyoutButtons"]
+layout_mode = 0
+offset_left = 4.0
+offset_top = 76.0
+offset_right = 132.0
+offset_bottom = 108.0
+toggle_mode = true
+button_group = ExtResource("13_wy7jo")
+text = "Camera"
+
+[node name="CosmeticsFlyoutButton" type="Button" parent="FlyoutPanel/FlyoutButtons"]
+layout_mode = 0
+offset_left = 4.0
+offset_top = 112.0
+offset_right = 132.0
+offset_bottom = 144.0
+toggle_mode = true
+button_group = ExtResource("13_wy7jo")
+text = "Cosmetics"
+
+[node name="Movements" type="Panel" parent="FlyoutPanel"]
+visible = false
+layout_mode = 0
+offset_left = 140.0
+offset_right = 416.0
+offset_bottom = 392.0
+
+[node name="InvisibleMask" type="Control" parent="FlyoutPanel/Movements"]
+clip_contents = true
+layout_mode = 3
+anchors_preset = 0
+offset_left = 4.0
+offset_top = 4.0
+offset_right = 260.0
+offset_bottom = 388.0
+
+[node name="MovementHandle" type="Control" parent="FlyoutPanel/Movements/InvisibleMask"]
+anchors_preset = 0
+
+[node name="VScrollBar" type="VScrollBar" parent="FlyoutPanel/Movements"]
+layout_mode = 0
+offset_left = 264.0
+offset_top = 4.0
+offset_right = 272.0
+offset_bottom = 388.0
+max_value = 0.0
+step = 1.0
+
+[node name="FlowControls" type="Panel" parent="FlyoutPanel"]
+visible = false
+layout_mode = 0
+offset_left = 140.0
+offset_right = 672.0
+offset_bottom = 392.0
+
+[node name="InvisibleMask" type="Control" parent="FlyoutPanel/FlowControls"]
+clip_contents = true
+anchors_preset = 0
+offset_left = 4.0
+offset_top = 4.0
+offset_right = 516.0
+offset_bottom = 388.0
+
+[node name="FlowHandle" type="Control" parent="FlyoutPanel/FlowControls/InvisibleMask"]
+anchors_preset = 0
+
+[node name="VScrollBar" type="VScrollBar" parent="FlyoutPanel/FlowControls"]
+layout_mode = 0
+offset_left = 520.0
+offset_top = 4.0
+offset_right = 528.0
+offset_bottom = 388.0
+max_value = 0.0
+step = 1.0
+
+[node name="Camera" type="Panel" parent="FlyoutPanel"]
+visible = false
+layout_mode = 0
+offset_left = 140.0
+offset_right = 276.0
+offset_bottom = 4.0
+
+[node name="Cosmetics" type="Panel" parent="FlyoutPanel"]
+visible = false
+layout_mode = 0
+offset_left = 140.0
+offset_right = 544.0
+offset_bottom = 392.0
+
+[node name="InvisibleMask" type="Control" parent="FlyoutPanel/Cosmetics"]
+clip_contents = true
+anchors_preset = 0
+offset_left = 4.0
+offset_top = 4.0
+offset_right = 388.0
+offset_bottom = 388.0
+
+[node name="CosmeticsHandle" type="Control" parent="FlyoutPanel/Cosmetics/InvisibleMask"]
+anchors_preset = 0
+
+[node name="VScrollBar" type="VScrollBar" parent="FlyoutPanel/Cosmetics"]
+layout_mode = 0
+offset_left = 392.0
+offset_top = 4.0
+offset_right = 400.0
+offset_bottom = 388.0
+max_value = 0.0
+step = 1.0
[node name="ControlsScreen" type="Control" parent="."]
visible = false
@@ -405,10 +647,14 @@ theme_override_styles/normal = SubResource("StyleBoxEmpty_othvt")
[node name="DialogPanel" type="Panel" parent="ControlsScreen"]
layout_mode = 1
anchors_preset = -1
-anchor_left = 0.3
-anchor_top = 0.2
-anchor_right = 0.7
-anchor_bottom = 0.8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -256.0
+offset_top = -192.0
+offset_right = 256.0
+offset_bottom = 192.0
grow_horizontal = 2
grow_vertical = 2
@@ -420,13 +666,14 @@ anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
text = "Fullscreen camera view: ESC
+Fullscreen program: F11 or Alt+Enter
Play/Pause: Space
Play Reverse: Shift + Space
Fast Forward: Shift + Right Arrow
Fast Reverse: Shift + Left
Step Forward: Right Arrow
Step Backward: Left Arrow
-Go to start of showtape: Home
+Stop: Home
Change Camera Angle: Tab"
horizontal_alignment = 1
vertical_alignment = 1
@@ -462,10 +709,14 @@ theme_override_styles/normal = SubResource("StyleBoxEmpty_othvt")
[node name="DialogPanel" type="Panel" parent="CreditsScreen"]
layout_mode = 1
anchors_preset = -1
-anchor_left = 0.3
-anchor_top = 0.2
-anchor_right = 0.7
-anchor_bottom = 0.8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -256.0
+offset_top = -192.0
+offset_right = 256.0
+offset_bottom = 192.0
grow_horizontal = 2
grow_vertical = 2
@@ -482,13 +733,365 @@ Project Oversight: Persephone (KawaiiZenbo)
Interface Design: Persephone
Simulator Backend: Persephone
-3-Stage Helen Henny Model: Persephone
+3-Stage Models: Persephone
+PTT Cybers Models: Persephone
+Chuck E's Corner Stage: Luigigamin212
+Balcony Stage Model: ToastHQ
This project is not associated with CEC Entertainment LLC.
or Creative Engineering Inc."
horizontal_alignment = 1
vertical_alignment = 1
+[node name="ShowtapeNewScreen" type="Control" parent="."]
+visible = false
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="InputEater" type="Button" parent="ShowtapeNewScreen"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_styles/focus = SubResource("StyleBoxEmpty_wy7jo")
+theme_override_styles/disabled_mirrored = SubResource("StyleBoxEmpty_v0ton")
+theme_override_styles/disabled = SubResource("StyleBoxEmpty_20noo")
+theme_override_styles/hover_pressed_mirrored = SubResource("StyleBoxEmpty_mch36")
+theme_override_styles/hover_pressed = SubResource("StyleBoxEmpty_fxi2g")
+theme_override_styles/hover_mirrored = SubResource("StyleBoxEmpty_bdf35")
+theme_override_styles/hover = SubResource("StyleBoxEmpty_j2w5p")
+theme_override_styles/pressed_mirrored = SubResource("StyleBoxEmpty_bv2rw")
+theme_override_styles/pressed = SubResource("StyleBoxEmpty_gx718")
+theme_override_styles/normal_mirrored = SubResource("StyleBoxEmpty_gu086")
+theme_override_styles/normal = SubResource("StyleBoxEmpty_othvt")
+
+[node name="DialogPanel" type="Panel" parent="ShowtapeNewScreen"]
+layout_mode = 1
+anchors_preset = -1
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -256.0
+offset_top = -128.0
+offset_right = 256.0
+offset_bottom = 128.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="DialogLabel" type="Label" parent="ShowtapeNewScreen/DialogPanel"]
+layout_mode = 1
+anchors_preset = -1
+anchor_left = 0.5
+anchor_right = 0.5
+offset_left = -96.0
+offset_top = 4.0
+offset_right = 96.0
+offset_bottom = 36.0
+grow_horizontal = 2
+text = "Create New Showtape"
+horizontal_alignment = 1
+vertical_alignment = 1
+
+[node name="AudioTypeLabel" type="Label" parent="ShowtapeNewScreen/DialogPanel"]
+layout_mode = 0
+offset_left = 8.0
+offset_top = 40.0
+offset_right = 264.0
+offset_bottom = 72.0
+text = "Audio File (WAV, MP3, or OGG)"
+vertical_alignment = 1
+
+[node name="AudioFilePath" type="TextEdit" parent="ShowtapeNewScreen/DialogPanel"]
+layout_mode = 1
+anchors_preset = -1
+anchor_right = 1.0
+offset_left = 4.0
+offset_top = 76.0
+offset_right = -104.0
+offset_bottom = 112.0
+grow_horizontal = 2
+grow_vertical = 2
+placeholder_text = "File Path"
+
+[node name="AudioBrowseButton" type="Button" parent="ShowtapeNewScreen/DialogPanel"]
+layout_mode = 1
+anchors_preset = -1
+anchor_left = 1.0
+anchor_right = 1.0
+offset_left = -100.0
+offset_top = 76.0
+offset_right = -4.0
+offset_bottom = 112.0
+tooltip_text = "Browse for a file."
+text = "Browse"
+
+[node name="ShowNameLabel" type="Label" parent="ShowtapeNewScreen/DialogPanel"]
+layout_mode = 0
+offset_left = 8.0
+offset_top = 116.0
+offset_right = 264.0
+offset_bottom = 148.0
+text = "Showtape Name"
+vertical_alignment = 1
+
+[node name="ShowNameTextBox" type="TextEdit" parent="ShowtapeNewScreen/DialogPanel"]
+layout_mode = 1
+anchors_preset = -1
+anchor_right = 1.0
+offset_left = 4.0
+offset_top = 152.0
+offset_right = -4.0
+offset_bottom = 188.0
+grow_horizontal = 2
+grow_vertical = 2
+placeholder_text = "Show Name"
+
+[node name="CancelButton" type="Button" parent="ShowtapeNewScreen/DialogPanel"]
+layout_mode = 0
+offset_left = 309.0
+offset_top = 216.0
+offset_right = 405.0
+offset_bottom = 248.0
+text = "Cancel
+"
+
+[node name="CreateButton" type="Button" parent="ShowtapeNewScreen/DialogPanel"]
+layout_mode = 0
+offset_left = 408.0
+offset_top = 216.0
+offset_right = 504.0
+offset_bottom = 248.0
+text = "Create"
+
+[node name="ShowtapeLoadScreen" type="Control" parent="."]
+visible = false
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="InputEater" type="Button" parent="ShowtapeLoadScreen"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_styles/focus = SubResource("StyleBoxEmpty_wy7jo")
+theme_override_styles/disabled_mirrored = SubResource("StyleBoxEmpty_v0ton")
+theme_override_styles/disabled = SubResource("StyleBoxEmpty_20noo")
+theme_override_styles/hover_pressed_mirrored = SubResource("StyleBoxEmpty_mch36")
+theme_override_styles/hover_pressed = SubResource("StyleBoxEmpty_fxi2g")
+theme_override_styles/hover_mirrored = SubResource("StyleBoxEmpty_bdf35")
+theme_override_styles/hover = SubResource("StyleBoxEmpty_j2w5p")
+theme_override_styles/pressed_mirrored = SubResource("StyleBoxEmpty_bv2rw")
+theme_override_styles/pressed = SubResource("StyleBoxEmpty_gx718")
+theme_override_styles/normal_mirrored = SubResource("StyleBoxEmpty_gu086")
+theme_override_styles/normal = SubResource("StyleBoxEmpty_othvt")
+
+[node name="DialogPanel" type="Panel" parent="ShowtapeLoadScreen"]
+layout_mode = 1
+anchors_preset = -1
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -256.0
+offset_top = -128.0
+offset_right = 256.0
+offset_bottom = 128.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="DialogLabel" type="Label" parent="ShowtapeLoadScreen/DialogPanel"]
+layout_mode = 1
+anchors_preset = -1
+anchor_left = 0.5
+anchor_right = 0.5
+offset_left = -96.0
+offset_top = 4.0
+offset_right = 96.0
+offset_bottom = 36.0
+grow_horizontal = 2
+text = "Load Showtape"
+horizontal_alignment = 1
+vertical_alignment = 1
+
+[node name="InFileLabel" type="Label" parent="ShowtapeLoadScreen/DialogPanel"]
+layout_mode = 0
+offset_left = 8.0
+offset_top = 73.0
+offset_right = 264.0
+offset_bottom = 105.0
+text = "File to load"
+vertical_alignment = 1
+
+[node name="InFilePath" type="TextEdit" parent="ShowtapeLoadScreen/DialogPanel"]
+layout_mode = 1
+anchors_preset = -1
+anchor_right = 1.0
+offset_left = 4.0
+offset_top = 109.0
+offset_right = -104.0
+offset_bottom = 145.0
+grow_horizontal = 2
+grow_vertical = 2
+placeholder_text = "File Path"
+
+[node name="InBrowseButton" type="Button" parent="ShowtapeLoadScreen/DialogPanel"]
+layout_mode = 1
+anchors_preset = -1
+anchor_left = 1.0
+anchor_right = 1.0
+offset_left = -100.0
+offset_top = 109.0
+offset_right = -4.0
+offset_bottom = 145.0
+tooltip_text = "Browse for a file."
+text = "Browse"
+
+[node name="ShowWaitMessage" type="Label" parent="ShowtapeLoadScreen/DialogPanel"]
+layout_mode = 0
+offset_left = 8.0
+offset_top = 148.0
+offset_right = 374.0
+offset_bottom = 197.0
+text = "If shows are taking a long time to load,
+consider compressing the audio to MP3 or OGG"
+vertical_alignment = 1
+
+[node name="CancelButton" type="Button" parent="ShowtapeLoadScreen/DialogPanel"]
+layout_mode = 0
+offset_left = 309.0
+offset_top = 216.0
+offset_right = 405.0
+offset_bottom = 248.0
+text = "Cancel
+"
+
+[node name="OpenButton" type="Button" parent="ShowtapeLoadScreen/DialogPanel"]
+layout_mode = 0
+offset_left = 408.0
+offset_top = 216.0
+offset_right = 504.0
+offset_bottom = 248.0
+text = "Open"
+
+[node name="ShowtapeSaveScreen" type="Control" parent="."]
+visible = false
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="InputEater" type="Button" parent="ShowtapeSaveScreen"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_styles/focus = SubResource("StyleBoxEmpty_wy7jo")
+theme_override_styles/disabled_mirrored = SubResource("StyleBoxEmpty_v0ton")
+theme_override_styles/disabled = SubResource("StyleBoxEmpty_20noo")
+theme_override_styles/hover_pressed_mirrored = SubResource("StyleBoxEmpty_mch36")
+theme_override_styles/hover_pressed = SubResource("StyleBoxEmpty_fxi2g")
+theme_override_styles/hover_mirrored = SubResource("StyleBoxEmpty_bdf35")
+theme_override_styles/hover = SubResource("StyleBoxEmpty_j2w5p")
+theme_override_styles/pressed_mirrored = SubResource("StyleBoxEmpty_bv2rw")
+theme_override_styles/pressed = SubResource("StyleBoxEmpty_gx718")
+theme_override_styles/normal_mirrored = SubResource("StyleBoxEmpty_gu086")
+theme_override_styles/normal = SubResource("StyleBoxEmpty_othvt")
+
+[node name="DialogPanel" type="Panel" parent="ShowtapeSaveScreen"]
+layout_mode = 1
+anchors_preset = -1
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -256.0
+offset_top = -128.0
+offset_right = 256.0
+offset_bottom = 128.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="DialogLabel" type="Label" parent="ShowtapeSaveScreen/DialogPanel"]
+layout_mode = 1
+anchors_preset = -1
+anchor_left = 0.5
+anchor_right = 0.5
+offset_left = -96.0
+offset_top = 4.0
+offset_right = 96.0
+offset_bottom = 36.0
+grow_horizontal = 2
+text = "Save Showtape"
+horizontal_alignment = 1
+vertical_alignment = 1
+
+[node name="OutFileLabel" type="Label" parent="ShowtapeSaveScreen/DialogPanel"]
+layout_mode = 0
+offset_left = 8.0
+offset_top = 73.0
+offset_right = 264.0
+offset_bottom = 105.0
+text = "File to save as"
+vertical_alignment = 1
+
+[node name="OutFilePath" type="TextEdit" parent="ShowtapeSaveScreen/DialogPanel"]
+layout_mode = 1
+anchors_preset = -1
+anchor_right = 1.0
+offset_left = 4.0
+offset_top = 109.0
+offset_right = -104.0
+offset_bottom = 145.0
+grow_horizontal = 2
+grow_vertical = 2
+placeholder_text = "File Path"
+
+[node name="OutBrowseButton" type="Button" parent="ShowtapeSaveScreen/DialogPanel"]
+layout_mode = 1
+anchors_preset = -1
+anchor_left = 1.0
+anchor_right = 1.0
+offset_left = -100.0
+offset_top = 109.0
+offset_right = -4.0
+offset_bottom = 145.0
+tooltip_text = "Browse for a file."
+text = "Browse"
+
+[node name="CancelButton" type="Button" parent="ShowtapeSaveScreen/DialogPanel"]
+layout_mode = 0
+offset_left = 309.0
+offset_top = 216.0
+offset_right = 405.0
+offset_bottom = 248.0
+text = "Cancel
+"
+
+[node name="CreateButton" type="Button" parent="ShowtapeSaveScreen/DialogPanel"]
+layout_mode = 0
+offset_left = 408.0
+offset_top = 216.0
+offset_right = 504.0
+offset_bottom = 248.0
+text = "Save"
+
[node name="CameraFullScreen" type="TextureRect" parent="."]
visible = false
layout_mode = 1
@@ -500,6 +1103,13 @@ grow_vertical = 2
texture = SubResource("ViewportTexture_g6u4d")
expand_mode = 2
+[connection signal="file_selected" from="OpenAudioFileDialog" to="." method="_on_open_audio_file_dialog_file_selected"]
+[connection signal="file_selected" from="OpenShowtapeFileDialog" to="." method="_on_open_showtape_file_dialog_file_selected"]
+[connection signal="file_selected" from="SaveShowtapeFileDialog" to="." method="_on_save_showtape_file_dialog_file_selected"]
+[connection signal="confirmed" from="NewOverwriteConfirmationDialog" to="." method="_on_new_overwrite_confirmation_dialog_confirmed"]
+[connection signal="confirmed" from="LoadOverwriteConfirmationDialog" to="." method="_on_load_overwrite_confirmation_dialog_confirmed"]
+[connection signal="confirmed" from="StageChangeOverwriteConfirmationDialog" to="." method="_on_stage_change_overwrite_confirmation_dialog_confirmed"]
+[connection signal="item_selected" from="MenuBar/StageSelector" to="." method="_on_stage_selector_item_selected"]
[connection signal="pressed" from="MenuBar/ControlsButton" to="." method="_on_controls_button_pressed"]
[connection signal="pressed" from="MenuBar/CreditsButton" to="." method="_on_credits_button_pressed"]
[connection signal="pressed" from="SequencerPanel/TransportControls/Centered/StepBackwardsButton" to="." method="_on_step_backwards_button_pressed"]
@@ -510,7 +1120,26 @@ expand_mode = 2
[connection signal="pressed" from="SequencerPanel/TransportControls/Centered/PlayButton" to="." method="_on_play_button_pressed"]
[connection signal="pressed" from="SequencerPanel/TransportControls/Centered/FastForwardButton" to="." method="_on_fast_forward_button_pressed"]
[connection signal="pressed" from="SequencerPanel/TransportControls/Centered/StepForwardButton" to="." method="_on_step_forward_button_pressed"]
-[connection signal="pressed" from="SequencerPanel/TransportControls/RecordButton" to="." method="_on_record_button_pressed"]
+[connection signal="toggled" from="SequencerPanel/TransportControls/RecordButton" to="." method="_on_record_button_toggled"]
[connection signal="value_changed" from="SequencerPanel/TimelinePanel/VScrollBar" to="." method="_on_v_scroll_bar_value_changed"]
-[connection signal="pressed" from="ControlsScreen/InputEater" to="." method="_on_controls_input_eater_pressed"]
-[connection signal="pressed" from="CreditsScreen/InputEater" to="." method="_on_credits_input_eater_pressed"]
+[connection signal="toggled" from="FlyoutPanel/FlyoutButtons/MovementsFlyoutButton" to="." method="_on_movements_flyout_button_toggled"]
+[connection signal="toggled" from="FlyoutPanel/FlyoutButtons/FlowsFlyoutButton" to="." method="_on_flows_flyout_button_toggled"]
+[connection signal="toggled" from="FlyoutPanel/FlyoutButtons/CameraFlyoutButton" to="." method="_on_camera_flyout_button_toggled"]
+[connection signal="toggled" from="FlyoutPanel/FlyoutButtons/CosmeticsFlyoutButton" to="." method="_on_cosmetics_flyout_button_toggled"]
+[connection signal="value_changed" from="FlyoutPanel/Movements/VScrollBar" to="." method="_on_movement_v_scroll_bar_value_changed"]
+[connection signal="value_changed" from="FlyoutPanel/FlowControls/VScrollBar" to="." method="_on_flow_v_scroll_bar_value_changed"]
+[connection signal="value_changed" from="FlyoutPanel/Cosmetics/VScrollBar" to="." method="_on_cosmetics_v_scroll_bar_value_changed"]
+[connection signal="pressed" from="ControlsScreen/InputEater" to="." method="_on_input_eater_pressed"]
+[connection signal="pressed" from="CreditsScreen/InputEater" to="." method="_on_input_eater_pressed"]
+[connection signal="pressed" from="ShowtapeNewScreen/InputEater" to="." method="_on_input_eater_pressed"]
+[connection signal="pressed" from="ShowtapeNewScreen/DialogPanel/AudioBrowseButton" to="." method="_on_showtape_new_audio_browse_button_pressed"]
+[connection signal="pressed" from="ShowtapeNewScreen/DialogPanel/CancelButton" to="." method="_on_showtape_new_cancel_button_pressed"]
+[connection signal="pressed" from="ShowtapeNewScreen/DialogPanel/CreateButton" to="." method="_on_showtape_new_create_button_pressed"]
+[connection signal="pressed" from="ShowtapeLoadScreen/InputEater" to="." method="_on_input_eater_pressed"]
+[connection signal="pressed" from="ShowtapeLoadScreen/DialogPanel/InBrowseButton" to="." method="_on_showtape_load_in_browse_button_pressed"]
+[connection signal="pressed" from="ShowtapeLoadScreen/DialogPanel/CancelButton" to="." method="_on_showtape_load_cancel_button_pressed"]
+[connection signal="pressed" from="ShowtapeLoadScreen/DialogPanel/OpenButton" to="." method="_on_showtape_load_open_button_pressed"]
+[connection signal="pressed" from="ShowtapeSaveScreen/InputEater" to="." method="_on_input_eater_pressed"]
+[connection signal="pressed" from="ShowtapeSaveScreen/DialogPanel/OutBrowseButton" to="." method="_on_showtape_save_out_browse_button_pressed"]
+[connection signal="pressed" from="ShowtapeSaveScreen/DialogPanel/CancelButton" to="." method="_on_showtape_save_cancel_button_pressed"]
+[connection signal="pressed" from="ShowtapeSaveScreen/DialogPanel/CreateButton" to="." method="_on_showtape_save_create_button_pressed"]
diff --git a/Scenes/Stages/Balcony.tscn b/Scenes/Stages/Balcony.tscn
new file mode 100644
index 0000000..704418c
--- /dev/null
+++ b/Scenes/Stages/Balcony.tscn
@@ -0,0 +1,319 @@
+[gd_scene load_steps=9 format=3 uid="uid://d2g6chunc572s"]
+
+[ext_resource type="PackedScene" uid="uid://d34xfaignny8j" path="res://Models/Cyberamics/Cyber Helen.glb" id="1_w3m2i"]
+[ext_resource type="Script" uid="uid://bu68w4jnh0n2b" path="res://Scripts/AnimatronicController.gd" id="2_t4ere"]
+[ext_resource type="PackedScene" uid="uid://c2j62syov3skq" path="res://Models/Cyberamics/Cyberamic Chuck.glb" id="3_45mf1"]
+[ext_resource type="PackedScene" uid="uid://ba7i8p8olef2s" path="res://Models/Cyberamics/Cyber Jasper.glb" id="4_t4ere"]
+[ext_resource type="PackedScene" uid="uid://c6n4otfble154" path="res://Models/Balcony/BalconyStage.glb" id="5_45mf1"]
+[ext_resource type="PackedScene" uid="uid://dmh5upwts8y11" path="res://Models/Cyberamics/Warblettes.glb" id="5_ocq6y"]
+[ext_resource type="Script" uid="uid://d1p4ite8ts2wi" path="res://Scripts/LightController.gd" id="6_j8jbd"]
+
+[sub_resource type="Environment" id="Environment_w3m2i"]
+ambient_light_source = 1
+
+[node name="Balcony" type="Node3D"]
+
+[node name="Jasper" parent="." instance=ExtResource("4_t4ere")]
+transform = Transform3D(0.866025, 0, 0.5, 0, 1, 0, -0.5, 0, 0.866025, -2.2, 3, -0.5)
+script = ExtResource("2_t4ere")
+
+[node name="Chuck" parent="." instance=ExtResource("3_45mf1")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3, -0.5)
+script = ExtResource("2_t4ere")
+
+[node name="Helen" parent="." instance=ExtResource("1_w3m2i")]
+transform = Transform3D(0.866025, 0, -0.5, 0, 1, 0, 0.5, 0, 0.866025, 2.2, 3, -0.5)
+script = ExtResource("2_t4ere")
+
+[node name="Warblettes" parent="." instance=ExtResource("5_ocq6y")]
+transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, -7.5, 3.6, -1)
+script = ExtResource("2_t4ere")
+
+[node name="Spots" type="Node3D" parent="."]
+script = ExtResource("6_j8jbd")
+
+[node name="Chuck" type="SpotLight3D" parent="Spots"]
+transform = Transform3D(1, 0, 0, 0, 0.970296, 0.241922, 0, -0.241922, 0.970296, 0, 5.5, 5)
+visible = false
+light_color = Color(1, 0.960784, 0.85098, 1)
+light_energy = 0.8
+spot_range = 8.0
+spot_attenuation = -1.0
+spot_angle = 7.5
+
+[node name="Helen" type="SpotLight3D" parent="Spots"]
+transform = Transform3D(0.866025, 0.120961, -0.485148, 0, 0.970296, 0.241922, 0.5, -0.209511, 0.840301, -1, 5.5, 5)
+visible = false
+light_color = Color(1, 0.960784, 0.85098, 1)
+light_energy = 0.8
+spot_range = 8.0
+spot_attenuation = -1.0
+spot_angle = 7.5
+
+[node name="Jasper" type="SpotLight3D" parent="Spots"]
+transform = Transform3D(0.866025, -0.120961, 0.485148, 0, 0.970296, 0.241922, -0.5, -0.209511, 0.840301, 1, 5.5, 5)
+visible = false
+light_color = Color(1, 0.960784, 0.85098, 1)
+light_energy = 0.8
+spot_range = 8.0
+spot_attenuation = -1.0
+spot_angle = 7.5
+
+[node name="Munch" type="SpotLight3D" parent="Spots"]
+transform = Transform3D(1, 0, 0, 0, 0.970296, 0.241922, 0, -0.241922, 0.970296, -4.5, 5.5, 5)
+visible = false
+light_color = Color(1, 0.960784, 0.85098, 1)
+light_energy = 0.8
+spot_range = 8.0
+spot_attenuation = -1.0
+spot_angle = 7.5
+
+[node name="Pasqually" type="SpotLight3D" parent="Spots"]
+transform = Transform3D(1, 0, 0, 0, 0.970296, 0.241922, 0, -0.241922, 0.970296, 4.5, 5.5, 5)
+visible = false
+light_color = Color(1, 0.960784, 0.85098, 1)
+light_energy = 0.8
+spot_range = 8.0
+spot_attenuation = -1.0
+spot_angle = 7.5
+
+[node name="Warblettes" type="SpotLight3D" parent="Spots"]
+transform = Transform3D(1, 0, 0, 0, 0.991445, 0.130526, 0, -0.130526, 0.991445, -7.5, 5.5, 5)
+visible = false
+light_color = Color(1, 0.960784, 0.85098, 1)
+light_energy = 0.8
+spot_range = 8.0
+spot_attenuation = -1.0
+spot_angle = 10.0
+
+[node name="Color Spots" type="Node3D" parent="."]
+script = ExtResource("6_j8jbd")
+
+[node name="Chuck" type="SpotLight3D" parent="Color Spots"]
+transform = Transform3D(1, 0, 0, 0, 0.970296, 0.241922, 0, -0.241922, 0.970296, 0, 5.5, 5)
+visible = false
+light_color = Color(0.734652, 0.426335, 0.999996, 1)
+light_energy = 0.8
+spot_range = 8.0
+spot_attenuation = -1.0
+spot_angle = 7.5
+
+[node name="Chuck 2" type="SpotLight3D" parent="Color Spots"]
+transform = Transform3D(1, 0, 0, 0, 0.970296, 0.241922, 0, -0.241922, 0.970296, 0, 5.5, 5)
+visible = false
+light_color = Color(1, 0, 0, 1)
+light_energy = 0.8
+spot_range = 8.0
+spot_attenuation = -1.0
+spot_angle = 7.5
+
+[node name="Helen" type="SpotLight3D" parent="Color Spots"]
+transform = Transform3D(0.866025, 0.120961, -0.485148, 0, 0.970296, 0.241922, 0.5, -0.209511, 0.840301, -1, 5.5, 5)
+visible = false
+light_color = Color(0.734652, 0.426335, 0.999996, 1)
+light_energy = 0.8
+spot_range = 8.0
+spot_attenuation = -1.0
+spot_angle = 7.5
+
+[node name="Jasper" type="SpotLight3D" parent="Color Spots"]
+transform = Transform3D(0.866025, -0.120961, 0.485148, 0, 0.970296, 0.241922, -0.5, -0.209511, 0.840301, 1, 5.5, 5)
+visible = false
+light_color = Color(0.734652, 0.426335, 0.999996, 1)
+light_energy = 0.8
+spot_range = 8.0
+spot_attenuation = -1.0
+spot_angle = 7.5
+
+[node name="Munch" type="SpotLight3D" parent="Color Spots"]
+transform = Transform3D(1, 0, 0, 0, 0.970296, 0.241922, 0, -0.241922, 0.970296, -4.5, 5.5, 5)
+visible = false
+light_color = Color(0.734652, 0.426335, 0.999996, 1)
+light_energy = 0.8
+spot_range = 8.0
+spot_attenuation = -1.0
+spot_angle = 7.5
+
+[node name="Pasqually" type="SpotLight3D" parent="Color Spots"]
+transform = Transform3D(1, 0, 0, 0, 0.970296, 0.241922, 0, -0.241922, 0.970296, 4.5, 5.5, 5)
+visible = false
+light_color = Color(0.734652, 0.426335, 0.999996, 1)
+light_energy = 0.8
+spot_range = 8.0
+spot_attenuation = -1.0
+spot_angle = 7.5
+
+[node name="Warblettes" type="SpotLight3D" parent="Color Spots"]
+transform = Transform3D(1, 0, 0, 0, 0.991445, 0.130526, 0, -0.130526, 0.991445, -7.5, 5.5, 5)
+visible = false
+light_color = Color(0.734652, 0.426335, 0.999996, 1)
+light_energy = 0.8
+spot_range = 8.0
+spot_attenuation = -1.0
+spot_angle = 10.0
+
+[node name="Valence" type="Node3D" parent="."]
+script = ExtResource("6_j8jbd")
+
+[node name="L" type="SpotLight3D" parent="Valence"]
+transform = Transform3D(1, 0, 0, 0, 0.965926, 0.258819, 0, -0.258819, 0.965926, -2.25, 5.5, 0.25)
+visible = false
+light_color = Color(1, 0.960784, 0.85098, 1)
+spot_attenuation = -1.0
+spot_angle = 15.0
+
+[node name="L Center" type="SpotLight3D" parent="Valence"]
+transform = Transform3D(1, 0, 0, 0, 0.965926, 0.258819, 0, -0.258819, 0.965926, -1.2, 5.5, 0.5)
+visible = false
+light_color = Color(1, 0.960784, 0.85098, 1)
+spot_attenuation = -1.0
+spot_angle = 15.0
+
+[node name="Center" type="SpotLight3D" parent="Valence"]
+transform = Transform3D(1, 0, 0, 0, 0.965926, 0.258819, 0, -0.258819, 0.965926, 0, 5.5, 0.75)
+visible = false
+light_color = Color(1, 0.960784, 0.85098, 1)
+spot_attenuation = -1.0
+spot_angle = 15.0
+
+[node name="R Center" type="SpotLight3D" parent="Valence"]
+transform = Transform3D(1, 0, 0, 0, 0.965926, 0.258819, 0, -0.258819, 0.965926, 1.2, 5.5, 0.5)
+visible = false
+light_color = Color(1, 0.960784, 0.85098, 1)
+spot_attenuation = -1.0
+spot_angle = 15.0
+
+[node name="R" type="SpotLight3D" parent="Valence"]
+transform = Transform3D(1, 0, 0, 0, 0.965926, 0.258819, 0, -0.258819, 0.965926, 2.25, 5.5, 0.25)
+visible = false
+light_color = Color(1, 0.960784, 0.85098, 1)
+spot_attenuation = -1.0
+spot_angle = 15.0
+
+[node name="Backdrop" type="Node3D" parent="."]
+script = ExtResource("6_j8jbd")
+
+[node name="L Blue" type="SpotLight3D" parent="Backdrop"]
+transform = Transform3D(0.866025, 0.433013, 0.25, -7.18775e-09, 0.5, -0.866025, -0.5, 0.75, 0.433013, -2.5, 3, -1.1)
+visible = false
+light_color = Color(0, 0, 1, 1)
+spot_attenuation = 2.0
+spot_angle = 30.0
+spot_angle_attenuation = 0.15
+
+[node name="L Amber" type="SpotLight3D" parent="Backdrop"]
+transform = Transform3D(0.866025, 0.433013, 0.25, -7.18775e-09, 0.5, -0.866025, -0.5, 0.75, 0.433013, -2, 3, -1.1)
+visible = false
+light_color = Color(1, 0.74902, 0, 1)
+spot_attenuation = 2.0
+spot_angle = 30.0
+spot_angle_attenuation = 0.15
+
+[node name="L Red" type="SpotLight3D" parent="Backdrop"]
+transform = Transform3D(0.866025, 0.433013, 0.25, -7.18775e-09, 0.5, -0.866025, -0.5, 0.75, 0.433013, -1.5, 3, -1.1)
+visible = false
+light_color = Color(1, 0, 0, 1)
+spot_attenuation = 2.0
+spot_angle = 30.0
+spot_angle_attenuation = 0.15
+
+[node name="C Blue" type="SpotLight3D" parent="Backdrop"]
+transform = Transform3D(1, 0, 0, 0, 0.5, -0.866025, 0, 0.866025, 0.5, -0.5, 3, -1.1)
+visible = false
+light_color = Color(0, 0, 1, 1)
+spot_attenuation = 2.0
+spot_angle = 30.0
+spot_angle_attenuation = 0.15
+
+[node name="C Amber" type="SpotLight3D" parent="Backdrop"]
+transform = Transform3D(1, 0, 0, 0, 0.5, -0.866025, 0, 0.866025, 0.5, 0, 3, -1.1)
+visible = false
+light_color = Color(1, 0.74902, 0, 1)
+spot_attenuation = 2.0
+spot_angle = 30.0
+spot_angle_attenuation = 0.15
+
+[node name="C Red" type="SpotLight3D" parent="Backdrop"]
+transform = Transform3D(1, 0, 0, 0, 0.5, -0.866025, 0, 0.866025, 0.5, 0.5, 3, -1.1)
+visible = false
+light_color = Color(1, 0, 0, 1)
+spot_attenuation = 2.0
+spot_angle = 30.0
+spot_angle_attenuation = 0.15
+
+[node name="R Blue" type="SpotLight3D" parent="Backdrop"]
+transform = Transform3D(0.866025, -0.433013, -0.25, 1.82764e-08, 0.5, -0.866025, 0.5, 0.75, 0.433013, 1.5, 3, -1.1)
+visible = false
+light_color = Color(0, 0, 1, 1)
+spot_attenuation = 2.0
+spot_angle = 30.0
+spot_angle_attenuation = 0.15
+
+[node name="R Amber" type="SpotLight3D" parent="Backdrop"]
+transform = Transform3D(0.866025, -0.433013, -0.25, 1.82764e-08, 0.5, -0.866025, 0.5, 0.75, 0.433013, 2, 3, -1.1)
+visible = false
+light_color = Color(1, 0.74902, 0, 1)
+spot_attenuation = 2.0
+spot_angle = 30.0
+spot_angle_attenuation = 0.15
+
+[node name="R Red" type="SpotLight3D" parent="Backdrop"]
+transform = Transform3D(0.866025, -0.433013, -0.25, 1.82764e-08, 0.5, -0.866025, 0.5, 0.75, 0.433013, 2.5, 3, -1.1)
+visible = false
+light_color = Color(1, 0, 0, 1)
+spot_attenuation = 2.0
+spot_angle = 30.0
+spot_angle_attenuation = 0.15
+
+[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
+environment = SubResource("Environment_w3m2i")
+
+[node name="Room Lights" type="Node3D" parent="."]
+
+[node name="OmniLight3D" type="OmniLight3D" parent="Room Lights"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 4.5, 3)
+light_color = Color(1, 0.960784, 0.85098, 1)
+
+[node name="OmniLight3D2" type="OmniLight3D" parent="Room Lights"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4, 4.5, 3)
+light_color = Color(1, 0.960784, 0.85098, 1)
+
+[node name="OmniLight3D3" type="OmniLight3D" parent="Room Lights"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4.5, 3)
+light_color = Color(1, 0.960784, 0.85098, 1)
+
+[node name="OmniLight3D4" type="OmniLight3D" parent="Room Lights"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8, 4.5, 3)
+light_color = Color(1, 0.960784, 0.85098, 1)
+
+[node name="OmniLight3D5" type="OmniLight3D" parent="Room Lights"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -8, 4.5, 3)
+light_color = Color(1, 0.960784, 0.85098, 1)
+
+[node name="BalconyStage" parent="." instance=ExtResource("5_45mf1")]
+transform = Transform3D(1.5, 0, 0, 0, 1.5, 0, 0, 0, 1.5, 0, 0, 0)
+
+[node name="Angle 1" type="Camera3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 0.965926, 0.258819, 0, -0.258819, 0.965926, 0, 4.75, 3)
+current = true
+fov = 60.0
+
+[node name="Angle 2" type="Camera3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 0.965926, 0.258819, 0, -0.258819, 0.965926, -4.5, 4.75, 3)
+fov = 60.0
+
+[node name="Angle 3" type="Camera3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 0.965926, 0.258819, 0, -0.258819, 0.965926, 4.5, 4.75, 3)
+fov = 60.0
+
+[node name="Angle 4" type="Camera3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.5, 5, 3)
+fov = 60.0
+
+[node name="Angle 5" type="Camera3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 0.996195, 0.0871557, 0, -0.0871557, 0.996195, 0, 4.75, 6)
+fov = 60.0
+
+[node name="Angle 6" type="Camera3D" parent="."]
+transform = Transform3D(0.965926, -0.0225576, 0.257834, 0, 0.996195, 0.0871557, -0.258819, -0.084186, 0.96225, 2, 4.75, 7)
+fov = 60.0
diff --git a/Scenes/Stages/ChuckEsCorner.tscn b/Scenes/Stages/ChuckEsCorner.tscn
new file mode 100644
index 0000000..9f1dbf9
--- /dev/null
+++ b/Scenes/Stages/ChuckEsCorner.tscn
@@ -0,0 +1,109 @@
+[gd_scene load_steps=7 format=3 uid="uid://dw3eplmapm5gc"]
+
+[ext_resource type="PackedScene" uid="uid://c2j62syov3skq" path="res://Models/Cyberamics/Cyberamic Chuck.glb" id="1_t27ru"]
+[ext_resource type="Script" uid="uid://bu68w4jnh0n2b" path="res://Scripts/AnimatronicController.gd" id="2_8qvk7"]
+[ext_resource type="PackedScene" uid="uid://bv66hlbvtekho" path="res://Models/ChuckEsCorner/ChuckEsCornerStage.glb" id="3_8qvk7"]
+[ext_resource type="PackedScene" uid="uid://dmh5upwts8y11" path="res://Models/Cyberamics/Warblettes.glb" id="3_t27ru"]
+[ext_resource type="Script" uid="uid://d1p4ite8ts2wi" path="res://Scripts/LightController.gd" id="4_8suoo"]
+
+[sub_resource type="Environment" id="Environment_4uxdq"]
+ambient_light_source = 1
+
+[node name="ChuckEsCorner" type="Node3D"]
+
+[node name="Chuck" parent="." instance=ExtResource("1_t27ru")]
+transform = Transform3D(-1.5, 0, -1.31134e-07, 0, 1.5, 0, 1.31134e-07, 0, -1.5, -2, 2, 0.312)
+script = ExtResource("2_8qvk7")
+
+[node name="Warblettes" parent="." instance=ExtResource("3_t27ru")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.25, 4, 0.5)
+script = ExtResource("2_8qvk7")
+
+[node name="Spots" type="Node3D" parent="."]
+script = ExtResource("4_8suoo")
+
+[node name="Chuck" type="SpotLight3D" parent="Spots"]
+transform = Transform3D(-0.972974, -0.0597654, 0.223048, 2.26267e-08, 0.965926, 0.258819, -0.230916, 0.251824, -0.939821, -1.57812, 4.57895, -1.25599)
+visible = false
+light_color = Color(1, 0.9625, 0.85, 1)
+light_energy = 2.0
+spot_range = 6.53799
+spot_angle = 30.5982
+spot_angle_attenuation = 0.1
+
+[node name="Warblettes" type="SpotLight3D" parent="Spots"]
+transform = Transform3D(-0.963761, 0.0690445, -0.257677, 1.9697e-08, 0.965926, 0.258819, 0.266767, 0.24944, -0.930922, -0.309492, 5.86862, -0.75)
+visible = false
+light_color = Color(1, 0.9625, 0.85, 1)
+light_energy = 2.0
+spot_range = 12.8142
+spot_angle = 28.4779
+spot_angle_attenuation = 0.1
+
+[node name="Floods" type="Node3D" parent="."]
+script = ExtResource("4_8suoo")
+
+[node name="Red" type="SpotLight3D" parent="Floods"]
+transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 1.8, 0.9)
+visible = false
+light_color = Color(1, 0, 0, 1)
+light_energy = 15.0
+spot_attenuation = 2.0
+spot_angle_attenuation = 0.15
+
+[node name="Green" type="SpotLight3D" parent="Floods"]
+transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, -2, 1.8, 0.9)
+visible = false
+light_color = Color(0, 1, 0, 1)
+light_energy = 15.0
+spot_attenuation = 2.0
+spot_angle_attenuation = 0.15
+
+[node name="Blue" type="SpotLight3D" parent="Floods"]
+transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, -4, 1.8, 0.9)
+visible = false
+light_color = Color(0, 0, 1, 1)
+light_energy = 15.0
+spot_attenuation = 2.0
+spot_angle_attenuation = 0.15
+
+[node name="Color Spots" type="Node3D" parent="."]
+script = ExtResource("4_8suoo")
+
+[node name="Chuck" type="SpotLight3D" parent="Color Spots"]
+transform = Transform3D(-0.995147, -0.00124532, 0.0983965, 0.0311161, 0.944632, 0.326653, -0.0933553, 0.328129, -0.940009, -1.57812, 4.57895, -1.25599)
+visible = false
+light_color = Color(0, 0.538333, 0.85, 1)
+light_energy = 3.0
+spot_range = 6.53799
+spot_angle = 33.4444
+spot_angle_attenuation = 0.1
+
+[node name="Angle 1" type="Camera3D" parent="."]
+transform = Transform3D(-0.984612, -0.00554278, 0.174664, 0.0289131, 0.980555, 0.194105, -0.172344, 0.196168, -0.965306, -0.658302, 4.93729, -4)
+current = true
+fov = 60.0
+
+[node name="Angle 2" type="Camera3D" parent="."]
+transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, -2, 3.44355, -2.64184)
+fov = 60.0
+
+[node name="Angle 3" type="Camera3D" parent="."]
+transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0.25, 4.95492, -1.77582)
+fov = 60.0
+
+[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
+environment = SubResource("Environment_4uxdq")
+
+[node name="OmniLight3D" type="OmniLight3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 3.5, -2)
+light_color = Color(1, 0.960784, 0.85098, 1)
+light_energy = 0.5
+
+[node name="OmniLight3D2" type="OmniLight3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3, 3.5, -2)
+light_color = Color(1, 0.960784, 0.85098, 1)
+light_energy = 0.5
+
+[node name="ChuckEsCornerStage" parent="." instance=ExtResource("3_8qvk7")]
+transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 1)
diff --git a/Scenes/Stages/Helen House/HelenHouseFlyout.tscn b/Scenes/Stages/Helen House/HelenHouseFlyout.tscn
deleted file mode 100644
index c227897..0000000
--- a/Scenes/Stages/Helen House/HelenHouseFlyout.tscn
+++ /dev/null
@@ -1,1043 +0,0 @@
-[gd_scene load_steps=5 format=3 uid="uid://dwhrame6udwbh"]
-
-[ext_resource type="Script" uid="uid://bh512bgpm0kj7" path="res://Scripts/HelenHouseFlyout.gd" id="1_82hqt"]
-[ext_resource type="ButtonGroup" uid="uid://bij2tonqeslpt" path="res://Scenes/GUI/FlyoutButtonGroup.tres" id="1_p77ya"]
-[ext_resource type="PackedScene" uid="uid://cbf3x44mvo701" path="res://Scenes/GUI/Controls/IndicatorLight.tscn" id="2_82hqt"]
-[ext_resource type="PackedScene" uid="uid://blg1c3v4o44of" path="res://Scenes/GUI/Controls/FlowSlider.tscn" id="3_petwi"]
-
-[node name="HelenHouseFlyout" type="Control"]
-layout_mode = 3
-anchors_preset = 9
-anchor_bottom = 1.0
-offset_right = 136.0
-grow_vertical = 2
-script = ExtResource("1_82hqt")
-
-[node name="FlyoutButtons" type="Panel" parent="."]
-layout_mode = 1
-anchors_preset = 9
-anchor_bottom = 1.0
-offset_right = 136.0
-grow_vertical = 2
-
-[node name="MovementsFlyoutButton" type="Button" parent="FlyoutButtons"]
-layout_mode = 0
-offset_left = 4.0
-offset_top = 4.0
-offset_right = 132.0
-offset_bottom = 36.0
-toggle_mode = true
-button_group = ExtResource("1_p77ya")
-text = "Movements"
-
-[node name="FlowsFlyoutButton" type="Button" parent="FlyoutButtons"]
-layout_mode = 0
-offset_left = 4.0
-offset_top = 40.0
-offset_right = 132.0
-offset_bottom = 72.0
-toggle_mode = true
-button_group = ExtResource("1_p77ya")
-text = "Flows"
-
-[node name="CameraFlyoutButton" type="Button" parent="FlyoutButtons"]
-layout_mode = 0
-offset_left = 4.0
-offset_top = 76.0
-offset_right = 132.0
-offset_bottom = 108.0
-toggle_mode = true
-button_group = ExtResource("1_p77ya")
-text = "Camera"
-
-[node name="CosmeticsFlyoutButton" type="Button" parent="FlyoutButtons"]
-layout_mode = 0
-offset_left = 4.0
-offset_top = 112.0
-offset_right = 132.0
-offset_bottom = 144.0
-toggle_mode = true
-button_group = ExtResource("1_p77ya")
-text = "Cosmetics"
-
-[node name="StageFlyoutButton" type="Button" parent="FlyoutButtons"]
-layout_mode = 0
-offset_left = 4.0
-offset_top = 148.0
-offset_right = 132.0
-offset_bottom = 180.0
-toggle_mode = true
-button_group = ExtResource("1_p77ya")
-text = "Stage"
-
-[node name="Movements" type="Panel" parent="."]
-visible = false
-layout_mode = 0
-offset_left = 140.0
-offset_right = 480.0
-offset_bottom = 364.0
-
-[node name="Buttons" type="Control" parent="Movements"]
-anchors_preset = 0
-
-[node name="Mouth" type="Button" parent="Movements/Buttons"]
-layout_mode = 0
-offset_left = 4.0
-offset_top = 4.0
-offset_right = 132.0
-offset_bottom = 36.0
-text = "Mouth"
-
-[node name="LeftEar" type="Button" parent="Movements/Buttons"]
-layout_mode = 0
-offset_left = 4.0
-offset_top = 40.0
-offset_right = 132.0
-offset_bottom = 72.0
-text = "Left Ear"
-
-[node name="RightEar" type="Button" parent="Movements/Buttons"]
-layout_mode = 0
-offset_left = 4.0
-offset_top = 76.0
-offset_right = 132.0
-offset_bottom = 108.0
-text = "Right Ear"
-
-[node name="LeftEyelid" type="Button" parent="Movements/Buttons"]
-layout_mode = 0
-offset_left = 4.0
-offset_top = 112.0
-offset_right = 132.0
-offset_bottom = 144.0
-text = "Left Eyelid"
-
-[node name="RightEyelid" type="Button" parent="Movements/Buttons"]
-layout_mode = 0
-offset_left = 4.0
-offset_top = 148.0
-offset_right = 132.0
-offset_bottom = 180.0
-text = "Right Eyelid"
-
-[node name="EyesLeft" type="Button" parent="Movements/Buttons"]
-layout_mode = 0
-offset_left = 4.0
-offset_top = 184.0
-offset_right = 132.0
-offset_bottom = 216.0
-text = "Eyes Left"
-
-[node name="EyesRight" type="Button" parent="Movements/Buttons"]
-layout_mode = 0
-offset_left = 4.0
-offset_top = 220.0
-offset_right = 132.0
-offset_bottom = 252.0
-text = "Eyes Right"
-
-[node name="HeadLeft" type="Button" parent="Movements/Buttons"]
-layout_mode = 0
-offset_left = 4.0
-offset_top = 256.0
-offset_right = 132.0
-offset_bottom = 288.0
-text = "Head Left"
-
-[node name="HeadRight" type="Button" parent="Movements/Buttons"]
-layout_mode = 0
-offset_left = 4.0
-offset_top = 292.0
-offset_right = 132.0
-offset_bottom = 324.0
-text = "Head Right"
-
-[node name="HeadUp" type="Button" parent="Movements/Buttons"]
-layout_mode = 0
-offset_left = 4.0
-offset_top = 328.0
-offset_right = 132.0
-offset_bottom = 360.0
-text = "Head Up"
-
-[node name="LeftArmUp" type="Button" parent="Movements/Buttons"]
-layout_mode = 0
-offset_left = 172.0
-offset_top = 4.0
-offset_right = 300.0
-offset_bottom = 36.0
-text = "Left Arm Up"
-
-[node name="LeftArmTwist" type="Button" parent="Movements/Buttons"]
-layout_mode = 0
-offset_left = 172.0
-offset_top = 40.0
-offset_right = 300.0
-offset_bottom = 72.0
-text = "Left Arm Twist"
-
-[node name="LeftElbow" type="Button" parent="Movements/Buttons"]
-layout_mode = 0
-offset_left = 172.0
-offset_top = 76.0
-offset_right = 300.0
-offset_bottom = 108.0
-text = "Left Elbow"
-
-[node name="RightArmUp" type="Button" parent="Movements/Buttons"]
-layout_mode = 0
-offset_left = 172.0
-offset_top = 112.0
-offset_right = 300.0
-offset_bottom = 144.0
-text = "Right Arm Up"
-
-[node name="RightArmTwist" type="Button" parent="Movements/Buttons"]
-layout_mode = 0
-offset_left = 172.0
-offset_top = 148.0
-offset_right = 300.0
-offset_bottom = 180.0
-text = "R. Arm Twist"
-
-[node name="RightElbow" type="Button" parent="Movements/Buttons"]
-layout_mode = 0
-offset_left = 172.0
-offset_top = 184.0
-offset_right = 300.0
-offset_bottom = 216.0
-text = "Right Elbow"
-
-[node name="BodyLeft" type="Button" parent="Movements/Buttons"]
-layout_mode = 0
-offset_left = 172.0
-offset_top = 220.0
-offset_right = 300.0
-offset_bottom = 252.0
-text = "Body Left"
-
-[node name="BodyRight" type="Button" parent="Movements/Buttons"]
-layout_mode = 0
-offset_left = 172.0
-offset_top = 256.0
-offset_right = 300.0
-offset_bottom = 288.0
-text = "Body Right"
-
-[node name="BodyLean" type="Button" parent="Movements/Buttons"]
-layout_mode = 0
-offset_left = 172.0
-offset_top = 292.0
-offset_right = 300.0
-offset_bottom = 324.0
-text = "Body Lean"
-
-[node name="IndicatorLights" type="Control" parent="Movements"]
-anchors_preset = 0
-
-[node name="Mouth" parent="Movements/IndicatorLights" instance=ExtResource("2_82hqt")]
-layout_mode = 1
-offset_left = 136.0
-offset_top = 4.0
-offset_right = 136.0
-offset_bottom = 4.0
-
-[node name="Left Ear" parent="Movements/IndicatorLights" instance=ExtResource("2_82hqt")]
-layout_mode = 1
-offset_left = 136.0
-offset_top = 40.0
-offset_right = 136.0
-offset_bottom = 40.0
-
-[node name="Right Ear" parent="Movements/IndicatorLights" instance=ExtResource("2_82hqt")]
-layout_mode = 1
-offset_left = 136.0
-offset_top = 76.0
-offset_right = 136.0
-offset_bottom = 76.0
-
-[node name="Left Eyelid" parent="Movements/IndicatorLights" instance=ExtResource("2_82hqt")]
-layout_mode = 1
-offset_left = 136.0
-offset_top = 112.0
-offset_right = 136.0
-offset_bottom = 112.0
-
-[node name="Right Eyelid" parent="Movements/IndicatorLights" instance=ExtResource("2_82hqt")]
-layout_mode = 1
-offset_left = 136.0
-offset_top = 148.0
-offset_right = 136.0
-offset_bottom = 148.0
-
-[node name="Eyes Left" parent="Movements/IndicatorLights" instance=ExtResource("2_82hqt")]
-layout_mode = 1
-offset_left = 136.0
-offset_top = 184.0
-offset_right = 136.0
-offset_bottom = 184.0
-
-[node name="Eyes Right" parent="Movements/IndicatorLights" instance=ExtResource("2_82hqt")]
-layout_mode = 1
-offset_left = 136.0
-offset_top = 220.0
-offset_right = 136.0
-offset_bottom = 220.0
-
-[node name="Head Left" parent="Movements/IndicatorLights" instance=ExtResource("2_82hqt")]
-layout_mode = 1
-offset_left = 136.0
-offset_top = 256.0
-offset_right = 136.0
-offset_bottom = 256.0
-
-[node name="Head Right" parent="Movements/IndicatorLights" instance=ExtResource("2_82hqt")]
-layout_mode = 1
-offset_left = 136.0
-offset_top = 292.0
-offset_right = 136.0
-offset_bottom = 292.0
-
-[node name="Head Up" parent="Movements/IndicatorLights" instance=ExtResource("2_82hqt")]
-layout_mode = 1
-offset_left = 136.0
-offset_top = 328.0
-offset_right = 136.0
-offset_bottom = 328.0
-
-[node name="Left Arm Up" parent="Movements/IndicatorLights" instance=ExtResource("2_82hqt")]
-layout_mode = 1
-offset_left = 304.0
-offset_top = 4.0
-offset_right = 304.0
-offset_bottom = 4.0
-
-[node name="Left Arm Twist" parent="Movements/IndicatorLights" instance=ExtResource("2_82hqt")]
-layout_mode = 1
-offset_left = 304.0
-offset_top = 40.0
-offset_right = 304.0
-offset_bottom = 40.0
-
-[node name="Left Elbow" parent="Movements/IndicatorLights" instance=ExtResource("2_82hqt")]
-layout_mode = 1
-offset_left = 304.0
-offset_top = 76.0
-offset_right = 304.0
-offset_bottom = 76.0
-
-[node name="Right Arm Up" parent="Movements/IndicatorLights" instance=ExtResource("2_82hqt")]
-layout_mode = 1
-offset_left = 304.0
-offset_top = 112.0
-offset_right = 304.0
-offset_bottom = 112.0
-
-[node name="Right Arm Twist" parent="Movements/IndicatorLights" instance=ExtResource("2_82hqt")]
-layout_mode = 1
-offset_left = 304.0
-offset_top = 148.0
-offset_right = 304.0
-offset_bottom = 148.0
-
-[node name="Right Elbow" parent="Movements/IndicatorLights" instance=ExtResource("2_82hqt")]
-layout_mode = 1
-offset_left = 304.0
-offset_top = 184.0
-offset_right = 304.0
-offset_bottom = 184.0
-
-[node name="Body Left" parent="Movements/IndicatorLights" instance=ExtResource("2_82hqt")]
-layout_mode = 1
-offset_left = 304.0
-offset_top = 220.0
-offset_right = 304.0
-offset_bottom = 220.0
-
-[node name="Body Right" parent="Movements/IndicatorLights" instance=ExtResource("2_82hqt")]
-layout_mode = 1
-offset_left = 304.0
-offset_top = 256.0
-offset_right = 304.0
-offset_bottom = 256.0
-
-[node name="Body Lean" parent="Movements/IndicatorLights" instance=ExtResource("2_82hqt")]
-layout_mode = 1
-offset_left = 304.0
-offset_top = 292.0
-offset_right = 304.0
-offset_bottom = 292.0
-
-[node name="FlowControls" type="Panel" parent="."]
-visible = false
-layout_mode = 0
-offset_left = 140.0
-offset_right = 808.0
-offset_bottom = 392.0
-
-[node name="Labels" type="Control" parent="FlowControls"]
-anchors_preset = 0
-offset_top = -40.0
-offset_bottom = -40.0
-
-[node name="MovementsLabel1" type="Label" parent="FlowControls/Labels"]
-layout_mode = 0
-offset_left = 4.0
-offset_top = 40.0
-offset_right = 132.0
-offset_bottom = 72.0
-text = "Movement"
-horizontal_alignment = 1
-vertical_alignment = 1
-
-[node name="MovementsLabel2" type="Label" parent="FlowControls/Labels"]
-layout_mode = 0
-offset_left = 336.0
-offset_top = 40.0
-offset_right = 464.0
-offset_bottom = 72.0
-text = "Movement"
-horizontal_alignment = 1
-vertical_alignment = 1
-
-[node name="InFlowsLabel1" type="Label" parent="FlowControls/Labels"]
-layout_mode = 0
-offset_left = 136.0
-offset_top = 40.0
-offset_right = 232.0
-offset_bottom = 72.0
-text = "In Flow"
-horizontal_alignment = 1
-vertical_alignment = 1
-
-[node name="InFlowsLabel2" type="Label" parent="FlowControls/Labels"]
-layout_mode = 0
-offset_left = 468.0
-offset_top = 40.0
-offset_right = 564.0
-offset_bottom = 72.0
-text = "In Flow"
-horizontal_alignment = 1
-vertical_alignment = 1
-
-[node name="OutFlowsLabel1" type="Label" parent="FlowControls/Labels"]
-layout_mode = 0
-offset_left = 236.0
-offset_top = 40.0
-offset_right = 332.0
-offset_bottom = 72.0
-text = "Out Flow"
-horizontal_alignment = 1
-vertical_alignment = 1
-
-[node name="OutFlowsLabel2" type="Label" parent="FlowControls/Labels"]
-layout_mode = 0
-offset_left = 568.0
-offset_top = 40.0
-offset_right = 664.0
-offset_bottom = 72.0
-text = "Out Flow"
-horizontal_alignment = 1
-vertical_alignment = 1
-
-[node name="InFlows" type="Control" parent="FlowControls"]
-anchors_preset = 0
-offset_top = -40.0
-offset_bottom = -40.0
-
-[node name="MouthFlow" parent="FlowControls/InFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 135.5
-offset_top = 72.0
-offset_right = 135.5
-offset_bottom = 72.0
-value = 3.0
-
-[node name="LeftEarFlow" parent="FlowControls/InFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 135.5
-offset_top = 108.0
-offset_right = 135.5
-offset_bottom = 108.0
-value = 3.5
-
-[node name="RightEarFlow" parent="FlowControls/InFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 135.5
-offset_top = 144.0
-offset_right = 135.5
-offset_bottom = 144.0
-value = 3.5
-
-[node name="LeftEyelidFlow" parent="FlowControls/InFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 135.5
-offset_top = 180.0
-offset_right = 135.5
-offset_bottom = 180.0
-value = 1.5
-
-[node name="RightEyelidFlow" parent="FlowControls/InFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 135.5
-offset_top = 216.0
-offset_right = 135.5
-offset_bottom = 216.0
-value = 1.5
-
-[node name="EyesLeftFlow" parent="FlowControls/InFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 135.5
-offset_top = 252.0
-offset_right = 135.5
-offset_bottom = 252.0
-value = 2.0
-
-[node name="EyesRightFlow" parent="FlowControls/InFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 135.5
-offset_top = 288.0
-offset_right = 135.5
-offset_bottom = 288.0
-value = 2.0
-
-[node name="HeadLeftFlow" parent="FlowControls/InFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 135.5
-offset_top = 324.0
-offset_right = 135.5
-offset_bottom = 324.0
-value = 1.5
-
-[node name="HeadRightFlow" parent="FlowControls/InFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 135.5
-offset_top = 360.0
-offset_right = 135.5
-offset_bottom = 360.0
-value = 1.5
-
-[node name="HeadUpFlow" parent="FlowControls/InFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 135.5
-offset_top = 396.0
-offset_right = 135.5
-offset_bottom = 396.0
-
-[node name="LeftArmUpFlow" parent="FlowControls/InFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 467.5
-offset_top = 72.0
-offset_right = 467.5
-offset_bottom = 72.0
-value = 0.8
-
-[node name="LeftArmTwistFlow" parent="FlowControls/InFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 467.5
-offset_top = 108.0
-offset_right = 467.5
-offset_bottom = 108.0
-value = 0.8
-
-[node name="LeftElbowFlow" parent="FlowControls/InFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 467.5
-offset_top = 144.0
-offset_right = 467.5
-offset_bottom = 144.0
-
-[node name="RightArmUpFlow" parent="FlowControls/InFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 467.5
-offset_top = 180.0
-offset_right = 467.5
-offset_bottom = 180.0
-value = 0.8
-
-[node name="RightArmTwistFlow" parent="FlowControls/InFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 467.5
-offset_top = 216.0
-offset_right = 467.5
-offset_bottom = 216.0
-value = 0.8
-
-[node name="RightElbowFlow" parent="FlowControls/InFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 467.5
-offset_top = 252.0
-offset_right = 467.5
-offset_bottom = 252.0
-
-[node name="BodyLeftFlow" parent="FlowControls/InFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 467.5
-offset_top = 288.0
-offset_right = 467.5
-offset_bottom = 288.0
-value = 0.7
-
-[node name="BodyRightFlow" parent="FlowControls/InFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 467.5
-offset_top = 324.0
-offset_right = 467.5
-offset_bottom = 324.0
-value = 0.7
-
-[node name="BodyLeanFlow" parent="FlowControls/InFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 467.5
-offset_top = 360.0
-offset_right = 467.5
-offset_bottom = 360.0
-
-[node name="OutFlows" type="Control" parent="FlowControls"]
-anchors_preset = 0
-offset_top = -40.0
-offset_bottom = -40.0
-
-[node name="MouthFlow" parent="FlowControls/OutFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 235.5
-offset_top = 72.0
-offset_right = 235.5
-offset_bottom = 72.0
-value = 2.0
-
-[node name="LeftEarFlow" parent="FlowControls/OutFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 235.5
-offset_top = 108.0
-offset_right = 235.5
-offset_bottom = 108.0
-value = 1.5
-
-[node name="RightEarFlow" parent="FlowControls/OutFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 235.5
-offset_top = 144.0
-offset_right = 235.5
-offset_bottom = 144.0
-value = 1.5
-
-[node name="LeftEyelidFlow" parent="FlowControls/OutFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 235.5
-offset_top = 180.0
-offset_right = 235.5
-offset_bottom = 180.0
-value = 2.0
-
-[node name="RightEyelidFlow" parent="FlowControls/OutFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 235.5
-offset_top = 216.0
-offset_right = 235.5
-offset_bottom = 216.0
-value = 2.0
-
-[node name="EyesLeftFlow" parent="FlowControls/OutFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 235.5
-offset_top = 252.0
-offset_right = 235.5
-offset_bottom = 252.0
-value = 2.0
-
-[node name="EyesRightFlow" parent="FlowControls/OutFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 235.5
-offset_top = 288.0
-offset_right = 235.5
-offset_bottom = 288.0
-value = 2.0
-
-[node name="HeadLeftFlow" parent="FlowControls/OutFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 235.5
-offset_top = 324.0
-offset_right = 235.5
-offset_bottom = 324.0
-value = 1.5
-
-[node name="HeadRightFlow" parent="FlowControls/OutFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 235.5
-offset_top = 360.0
-offset_right = 235.5
-offset_bottom = 360.0
-value = 1.5
-
-[node name="HeadUpFlow" parent="FlowControls/OutFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 235.5
-offset_top = 396.0
-offset_right = 235.5
-offset_bottom = 396.0
-
-[node name="LeftArmUpFlow" parent="FlowControls/OutFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 567.5
-offset_top = 72.0
-offset_right = 567.5
-offset_bottom = 72.0
-value = 0.6
-
-[node name="LeftArmTwistFlow" parent="FlowControls/OutFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 567.5
-offset_top = 108.0
-offset_right = 567.5
-offset_bottom = 108.0
-value = 0.8
-
-[node name="LeftElbowFlow" parent="FlowControls/OutFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 567.5
-offset_top = 144.0
-offset_right = 567.5
-offset_bottom = 144.0
-
-[node name="RightArmUpFlow" parent="FlowControls/OutFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 567.5
-offset_top = 180.0
-offset_right = 567.5
-offset_bottom = 180.0
-value = 0.6
-
-[node name="RightArmTwistFlow" parent="FlowControls/OutFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 567.5
-offset_top = 216.0
-offset_right = 567.5
-offset_bottom = 216.0
-value = 0.8
-
-[node name="RightElbowFlow" parent="FlowControls/OutFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 567.5
-offset_top = 252.0
-offset_right = 567.5
-offset_bottom = 252.0
-
-[node name="BodyLeftFlow" parent="FlowControls/OutFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 567.5
-offset_top = 288.0
-offset_right = 567.5
-offset_bottom = 288.0
-value = 0.7
-
-[node name="BodyRightFlow" parent="FlowControls/OutFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 567.5
-offset_top = 324.0
-offset_right = 567.5
-offset_bottom = 324.0
-value = 0.7
-
-[node name="BodyLeanFlow" parent="FlowControls/OutFlows" instance=ExtResource("3_petwi")]
-layout_mode = 1
-offset_left = 567.5
-offset_top = 360.0
-offset_right = 567.5
-offset_bottom = 360.0
-value = 0.8
-
-[node name="MovementLabels" type="Control" parent="FlowControls"]
-layout_mode = 3
-anchors_preset = 0
-
-[node name="Mouth" type="Label" parent="FlowControls/MovementLabels"]
-layout_mode = 0
-offset_left = 4.0
-offset_top = 32.0
-offset_right = 132.0
-offset_bottom = 64.0
-text = "Mouth"
-horizontal_alignment = 1
-vertical_alignment = 1
-
-[node name="LeftEar" type="Label" parent="FlowControls/MovementLabels"]
-layout_mode = 0
-offset_left = 4.0
-offset_top = 68.0
-offset_right = 132.0
-offset_bottom = 100.0
-text = "Left Ear"
-horizontal_alignment = 1
-vertical_alignment = 1
-
-[node name="RightEar" type="Label" parent="FlowControls/MovementLabels"]
-layout_mode = 0
-offset_left = 4.0
-offset_top = 104.0
-offset_right = 132.0
-offset_bottom = 136.0
-text = "Right Ear"
-horizontal_alignment = 1
-vertical_alignment = 1
-
-[node name="LeftEyelid" type="Label" parent="FlowControls/MovementLabels"]
-layout_mode = 0
-offset_left = 4.0
-offset_top = 140.0
-offset_right = 132.0
-offset_bottom = 172.0
-text = "Left Eyelid"
-horizontal_alignment = 1
-vertical_alignment = 1
-
-[node name="RightEyelid" type="Label" parent="FlowControls/MovementLabels"]
-layout_mode = 0
-offset_left = 4.0
-offset_top = 176.0
-offset_right = 132.0
-offset_bottom = 208.0
-text = "Right Eyelid"
-horizontal_alignment = 1
-vertical_alignment = 1
-
-[node name="EyesLeft" type="Label" parent="FlowControls/MovementLabels"]
-layout_mode = 0
-offset_left = 4.0
-offset_top = 212.0
-offset_right = 132.0
-offset_bottom = 244.0
-text = "Eyes Left"
-horizontal_alignment = 1
-vertical_alignment = 1
-
-[node name="EyesRight" type="Label" parent="FlowControls/MovementLabels"]
-layout_mode = 0
-offset_left = 4.0
-offset_top = 248.0
-offset_right = 132.0
-offset_bottom = 280.0
-text = "Eyes Right"
-horizontal_alignment = 1
-vertical_alignment = 1
-
-[node name="HeadLeft" type="Label" parent="FlowControls/MovementLabels"]
-layout_mode = 0
-offset_left = 4.0
-offset_top = 284.0
-offset_right = 132.0
-offset_bottom = 316.0
-text = "Head Left"
-horizontal_alignment = 1
-vertical_alignment = 1
-
-[node name="HeadRight" type="Label" parent="FlowControls/MovementLabels"]
-layout_mode = 0
-offset_left = 4.0
-offset_top = 320.0
-offset_right = 132.0
-offset_bottom = 352.0
-text = "Head Right"
-horizontal_alignment = 1
-vertical_alignment = 1
-
-[node name="HeadUp" type="Label" parent="FlowControls/MovementLabels"]
-layout_mode = 0
-offset_left = 4.0
-offset_top = 356.0
-offset_right = 132.0
-offset_bottom = 388.0
-text = "Head Up"
-horizontal_alignment = 1
-vertical_alignment = 1
-
-[node name="LeftArmUp" type="Label" parent="FlowControls/MovementLabels"]
-layout_mode = 0
-offset_left = 336.0
-offset_top = 32.0
-offset_right = 464.0
-offset_bottom = 64.0
-text = "Left Arm Up"
-horizontal_alignment = 1
-vertical_alignment = 1
-
-[node name="LeftArmTwist" type="Label" parent="FlowControls/MovementLabels"]
-layout_mode = 0
-offset_left = 336.0
-offset_top = 68.0
-offset_right = 464.0
-offset_bottom = 100.0
-text = "Left Arm Twist"
-horizontal_alignment = 1
-vertical_alignment = 1
-
-[node name="LeftElbow" type="Label" parent="FlowControls/MovementLabels"]
-layout_mode = 0
-offset_left = 336.0
-offset_top = 104.0
-offset_right = 464.0
-offset_bottom = 136.0
-text = "Left Elbow"
-horizontal_alignment = 1
-vertical_alignment = 1
-
-[node name="RightArmUp" type="Label" parent="FlowControls/MovementLabels"]
-layout_mode = 0
-offset_left = 336.0
-offset_top = 140.0
-offset_right = 464.0
-offset_bottom = 172.0
-text = "Right Arm Up"
-horizontal_alignment = 1
-vertical_alignment = 1
-
-[node name="RightArmTwist" type="Label" parent="FlowControls/MovementLabels"]
-layout_mode = 0
-offset_left = 336.0
-offset_top = 176.0
-offset_right = 464.0
-offset_bottom = 208.0
-text = "R. Arm Twist"
-horizontal_alignment = 1
-vertical_alignment = 1
-
-[node name="RightElbow" type="Label" parent="FlowControls/MovementLabels"]
-layout_mode = 0
-offset_left = 336.0
-offset_top = 212.0
-offset_right = 464.0
-offset_bottom = 244.0
-text = "Right Elbow"
-horizontal_alignment = 1
-vertical_alignment = 1
-
-[node name="BodyLeft" type="Label" parent="FlowControls/MovementLabels"]
-layout_mode = 0
-offset_left = 336.0
-offset_top = 248.0
-offset_right = 464.0
-offset_bottom = 280.0
-text = "Body Left"
-horizontal_alignment = 1
-vertical_alignment = 1
-
-[node name="BodyRight" type="Label" parent="FlowControls/MovementLabels"]
-layout_mode = 0
-offset_left = 336.0
-offset_top = 284.0
-offset_right = 464.0
-offset_bottom = 316.0
-text = "Body Right"
-horizontal_alignment = 1
-vertical_alignment = 1
-
-[node name="BodyLean" type="Label" parent="FlowControls/MovementLabels"]
-layout_mode = 0
-offset_left = 336.0
-offset_top = 320.0
-offset_right = 464.0
-offset_bottom = 352.0
-text = "Body Lean"
-horizontal_alignment = 1
-vertical_alignment = 1
-
-[node name="Camera" type="Panel" parent="."]
-visible = false
-layout_mode = 0
-offset_left = 140.0
-offset_right = 276.0
-offset_bottom = 76.0
-
-[node name="Angle1Button" type="Button" parent="Camera"]
-layout_mode = 0
-offset_left = 4.0
-offset_top = 4.0
-offset_right = 132.0
-offset_bottom = 36.0
-text = "Angle 1"
-
-[node name="Angle2Button" type="Button" parent="Camera"]
-layout_mode = 0
-offset_left = 4.0
-offset_top = 40.0
-offset_right = 132.0
-offset_bottom = 72.0
-text = "Angle 2"
-
-[node name="Cosmetics" type="Panel" parent="."]
-visible = false
-layout_mode = 0
-offset_left = 140.0
-offset_right = 396.0
-offset_bottom = 64.0
-
-[node name="Label" type="Label" parent="Cosmetics"]
-layout_mode = 0
-offset_left = 4.0
-offset_top = 4.0
-offset_right = 228.0
-offset_bottom = 36.0
-text = "No options for this stage :("
-vertical_alignment = 1
-
-[node name="Stage" type="Panel" parent="."]
-visible = false
-layout_mode = 0
-offset_left = 140.0
-offset_right = 396.0
-offset_bottom = 64.0
-
-[node name="Label" type="Label" parent="Stage"]
-layout_mode = 0
-offset_left = 4.0
-offset_top = 4.0
-offset_right = 228.0
-offset_bottom = 36.0
-text = "No options for this stage :("
-vertical_alignment = 1
-
-[connection signal="toggled" from="FlyoutButtons/MovementsFlyoutButton" to="." method="_on_movements_flyout_button_toggled"]
-[connection signal="toggled" from="FlyoutButtons/FlowsFlyoutButton" to="." method="_on_flows_flyout_button_toggled"]
-[connection signal="toggled" from="FlyoutButtons/CameraFlyoutButton" to="." method="_on_camera_flyout_button_toggled"]
-[connection signal="toggled" from="FlyoutButtons/CosmeticsFlyoutButton" to="." method="_on_cosmetics_flyout_button_toggled"]
-[connection signal="toggled" from="FlyoutButtons/StageFlyoutButton" to="." method="_on_stage_flyout_button_toggled"]
-[connection signal="button_down" from="Movements/Buttons/Mouth" to="." method="_on_mouth_button_down"]
-[connection signal="button_up" from="Movements/Buttons/Mouth" to="." method="_on_mouth_button_up"]
-[connection signal="button_down" from="Movements/Buttons/LeftEar" to="." method="_on_left_ear_button_down"]
-[connection signal="button_up" from="Movements/Buttons/LeftEar" to="." method="_on_left_ear_button_up"]
-[connection signal="button_down" from="Movements/Buttons/RightEar" to="." method="_on_right_ear_button_down"]
-[connection signal="button_up" from="Movements/Buttons/RightEar" to="." method="_on_right_ear_button_up"]
-[connection signal="button_down" from="Movements/Buttons/LeftEyelid" to="." method="_on_left_eyelid_button_down"]
-[connection signal="button_up" from="Movements/Buttons/LeftEyelid" to="." method="_on_left_eyelid_button_up"]
-[connection signal="button_down" from="Movements/Buttons/RightEyelid" to="." method="_on_right_eyelid_button_down"]
-[connection signal="button_up" from="Movements/Buttons/RightEyelid" to="." method="_on_right_eyelid_button_up"]
-[connection signal="button_down" from="Movements/Buttons/EyesLeft" to="." method="_on_eyes_left_button_down"]
-[connection signal="button_up" from="Movements/Buttons/EyesLeft" to="." method="_on_eyes_left_button_up"]
-[connection signal="button_down" from="Movements/Buttons/EyesRight" to="." method="_on_eyes_right_button_down"]
-[connection signal="button_up" from="Movements/Buttons/EyesRight" to="." method="_on_eyes_right_button_up"]
-[connection signal="button_down" from="Movements/Buttons/HeadLeft" to="." method="_on_head_left_button_down"]
-[connection signal="button_up" from="Movements/Buttons/HeadLeft" to="." method="_on_head_left_button_up"]
-[connection signal="button_down" from="Movements/Buttons/HeadRight" to="." method="_on_head_right_button_down"]
-[connection signal="button_up" from="Movements/Buttons/HeadRight" to="." method="_on_head_right_button_up"]
-[connection signal="button_down" from="Movements/Buttons/HeadUp" to="." method="_on_head_up_button_down"]
-[connection signal="button_up" from="Movements/Buttons/HeadUp" to="." method="_on_head_up_button_up"]
-[connection signal="button_down" from="Movements/Buttons/LeftArmUp" to="." method="_on_left_arm_up_button_down"]
-[connection signal="button_up" from="Movements/Buttons/LeftArmUp" to="." method="_on_left_arm_up_button_up"]
-[connection signal="button_down" from="Movements/Buttons/LeftArmTwist" to="." method="_on_left_arm_twist_button_down"]
-[connection signal="button_up" from="Movements/Buttons/LeftArmTwist" to="." method="_on_left_arm_twist_button_up"]
-[connection signal="button_down" from="Movements/Buttons/LeftElbow" to="." method="_on_left_elbow_button_down"]
-[connection signal="button_up" from="Movements/Buttons/LeftElbow" to="." method="_on_left_elbow_button_up"]
-[connection signal="button_down" from="Movements/Buttons/RightArmUp" to="." method="_on_right_arm_up_button_down"]
-[connection signal="button_up" from="Movements/Buttons/RightArmUp" to="." method="_on_right_arm_up_button_up"]
-[connection signal="button_down" from="Movements/Buttons/RightArmTwist" to="." method="_on_right_arm_twist_button_down"]
-[connection signal="button_up" from="Movements/Buttons/RightArmTwist" to="." method="_on_right_arm_twist_button_up"]
-[connection signal="button_down" from="Movements/Buttons/RightElbow" to="." method="_on_right_elbow_button_down"]
-[connection signal="button_up" from="Movements/Buttons/RightElbow" to="." method="_on_right_elbow_button_up"]
-[connection signal="button_down" from="Movements/Buttons/BodyLeft" to="." method="_on_body_left_button_down"]
-[connection signal="button_up" from="Movements/Buttons/BodyLeft" to="." method="_on_body_left_button_up"]
-[connection signal="button_down" from="Movements/Buttons/BodyRight" to="." method="_on_body_right_button_down"]
-[connection signal="button_up" from="Movements/Buttons/BodyRight" to="." method="_on_body_right_button_up"]
-[connection signal="button_down" from="Movements/Buttons/BodyLean" to="." method="_on_body_lean_button_down"]
-[connection signal="button_up" from="Movements/Buttons/BodyLean" to="." method="_on_body_lean_button_up"]
-[connection signal="pressed" from="Camera/Angle1Button" to="." method="_on_angle_1_button_pressed"]
-[connection signal="pressed" from="Camera/Angle2Button" to="." method="_on_angle_2_button_pressed"]
diff --git a/Scenes/Stages/Helen House/HelenHouseMovementRows.tscn b/Scenes/Stages/Helen House/HelenHouseMovementRows.tscn
deleted file mode 100644
index 2b88c62..0000000
--- a/Scenes/Stages/Helen House/HelenHouseMovementRows.tscn
+++ /dev/null
@@ -1,178 +0,0 @@
-[gd_scene load_steps=2 format=3 uid="uid://dyuhywnk8heav"]
-
-[ext_resource type="PackedScene" uid="uid://dtkqaw5533rxy" path="res://Scenes/GUI/Controls/MovementRow.tscn" id="1_g2q8r"]
-
-[node name="HelenHouseMovementRows" type="Control"]
-layout_mode = 3
-anchors_preset = 10
-anchor_right = 1.0
-grow_horizontal = 2
-
-[node name="MouthRow" parent="." instance=ExtResource("1_g2q8r")]
-layout_mode = 1
-anchors_preset = -1
-grow_horizontal = 1
-movement_bit = 1
-movement_name = "Mouth"
-
-[node name="LeftEarRow" parent="." instance=ExtResource("1_g2q8r")]
-layout_mode = 1
-anchors_preset = -1
-offset_top = 44.0
-offset_bottom = 84.0
-grow_horizontal = 1
-movement_bit = 2
-movement_name = "Left Ear"
-
-[node name="RightEarRow" parent="." instance=ExtResource("1_g2q8r")]
-layout_mode = 1
-anchors_preset = -1
-offset_top = 88.0
-offset_bottom = 128.0
-grow_horizontal = 1
-movement_bit = 3
-movement_name = "Right Ear"
-
-[node name="LeftEyelidRow" parent="." instance=ExtResource("1_g2q8r")]
-layout_mode = 1
-anchors_preset = -1
-offset_top = 132.0
-offset_bottom = 172.0
-grow_horizontal = 1
-movement_bit = 4
-movement_name = "Left Eyelid"
-
-[node name="RightEyelidRow" parent="." instance=ExtResource("1_g2q8r")]
-layout_mode = 1
-anchors_preset = -1
-offset_top = 176.0
-offset_bottom = 216.0
-grow_horizontal = 1
-movement_bit = 5
-movement_name = "Right Eyelid"
-
-[node name="EyesLeftRow" parent="." instance=ExtResource("1_g2q8r")]
-layout_mode = 1
-anchors_preset = -1
-offset_top = 220.0
-offset_bottom = 260.0
-grow_horizontal = 1
-movement_bit = 6
-movement_name = "Eyes Left"
-
-[node name="EyesRightRow" parent="." instance=ExtResource("1_g2q8r")]
-layout_mode = 1
-anchors_preset = -1
-offset_top = 264.0
-offset_bottom = 304.0
-grow_horizontal = 1
-movement_bit = 7
-movement_name = "Eyes Right"
-
-[node name="HeadLeftRow" parent="." instance=ExtResource("1_g2q8r")]
-layout_mode = 1
-anchors_preset = -1
-offset_top = 308.0
-offset_bottom = 348.0
-grow_horizontal = 1
-movement_bit = 8
-movement_name = "Head Left"
-
-[node name="HeadRightRow" parent="." instance=ExtResource("1_g2q8r")]
-layout_mode = 1
-anchors_preset = -1
-offset_top = 352.0
-offset_bottom = 392.0
-grow_horizontal = 1
-movement_bit = 9
-movement_name = "Head Right"
-
-[node name="HeadUpRow" parent="." instance=ExtResource("1_g2q8r")]
-layout_mode = 1
-anchors_preset = -1
-offset_top = 396.0
-offset_bottom = 436.0
-grow_horizontal = 1
-movement_bit = 10
-movement_name = "Head Up"
-
-[node name="LeftArmUpRow" parent="." instance=ExtResource("1_g2q8r")]
-layout_mode = 1
-anchors_preset = -1
-offset_top = 440.0
-offset_bottom = 480.0
-grow_horizontal = 1
-movement_bit = 11
-movement_name = "Left Arm Up"
-
-[node name="LeftArmTwistRow" parent="." instance=ExtResource("1_g2q8r")]
-layout_mode = 1
-anchors_preset = -1
-offset_top = 484.0
-offset_bottom = 524.0
-grow_horizontal = 1
-movement_bit = 12
-movement_name = "Left Arm Twist"
-
-[node name="LeftElbowRow" parent="." instance=ExtResource("1_g2q8r")]
-layout_mode = 1
-anchors_preset = -1
-offset_top = 528.0
-offset_bottom = 568.0
-grow_horizontal = 1
-movement_bit = 13
-movement_name = "Left Elbow"
-
-[node name="RightArmUpRow" parent="." instance=ExtResource("1_g2q8r")]
-layout_mode = 1
-anchors_preset = -1
-offset_top = 572.0
-offset_bottom = 612.0
-grow_horizontal = 1
-movement_bit = 14
-movement_name = "Right Arm Up"
-
-[node name="RightArmTwistRow" parent="." instance=ExtResource("1_g2q8r")]
-layout_mode = 1
-anchors_preset = -1
-offset_top = 616.0
-offset_bottom = 656.0
-grow_horizontal = 1
-movement_bit = 15
-movement_name = "Right Arm Twist"
-
-[node name="RightElbowRow" parent="." instance=ExtResource("1_g2q8r")]
-layout_mode = 1
-anchors_preset = -1
-offset_top = 660.0
-offset_bottom = 700.0
-grow_horizontal = 1
-movement_bit = 16
-movement_name = "Right Elbow"
-
-[node name="BodyLeftRow" parent="." instance=ExtResource("1_g2q8r")]
-layout_mode = 1
-anchors_preset = -1
-offset_top = 704.0
-offset_bottom = 744.0
-grow_horizontal = 1
-movement_bit = 17
-movement_name = "Body Left"
-
-[node name="BodyRightRow" parent="." instance=ExtResource("1_g2q8r")]
-layout_mode = 1
-anchors_preset = -1
-offset_top = 748.0
-offset_bottom = 788.0
-grow_horizontal = 1
-movement_bit = 18
-movement_name = "Body Right"
-
-[node name="BodyLeanRow" parent="." instance=ExtResource("1_g2q8r")]
-layout_mode = 1
-anchors_preset = -1
-offset_top = 792.0
-offset_bottom = 832.0
-grow_horizontal = 1
-movement_bit = 19
-movement_name = "Body Lean"
diff --git a/Scenes/Stages/Helen House/HelenHouse.tscn b/Scenes/Stages/HelenHouse.tscn
similarity index 56%
rename from Scenes/Stages/Helen House/HelenHouse.tscn
rename to Scenes/Stages/HelenHouse.tscn
index 6dd600f..8a69767 100644
--- a/Scenes/Stages/Helen House/HelenHouse.tscn
+++ b/Scenes/Stages/HelenHouse.tscn
@@ -1,44 +1,49 @@
-[gd_scene load_steps=6 format=3 uid="uid://btre5j66mpchy"]
+[gd_scene load_steps=7 format=3 uid="uid://btre5j66mpchy"]
-[ext_resource type="PackedScene" uid="uid://f0fkcs7erhop" path="res://Models/3stHelen.glb" id="2_e7oou"]
-[ext_resource type="Script" uid="uid://bu68w4jnh0n2b" path="res://Scripts/HelenController.gd" id="3_e2vvs"]
-[ext_resource type="PackedScene" uid="uid://bhoeqcsdb0fx2" path="res://Models/Room.glb" id="4_pv43k"]
-[ext_resource type="PackedScene" uid="uid://btvomf1ayoypu" path="res://Models/Stage.glb" id="5_afett"]
+[ext_resource type="PackedScene" uid="uid://f0fkcs7erhop" path="res://Models/3-Stage/3stHelen.glb" id="1_s1mol"]
+[ext_resource type="Script" uid="uid://bu68w4jnh0n2b" path="res://Scripts/AnimatronicController.gd" id="2_odcb6"]
+[ext_resource type="PackedScene" uid="uid://bhoeqcsdb0fx2" path="res://Models/HelenHouse/HelenHouse-Room.glb" id="3_e7oou"]
+[ext_resource type="PackedScene" uid="uid://btvomf1ayoypu" path="res://Models/HelenHouse/HelenHouse-Stage.glb" id="4_e2vvs"]
+[ext_resource type="Script" uid="uid://d1p4ite8ts2wi" path="res://Scripts/LightController.gd" id="5_odcb6"]
[sub_resource type="Environment" id="Environment_axk5g"]
ambient_light_source = 1
[node name="HelenHouse" type="Node3D"]
-[node name="3stHelen" parent="." instance=ExtResource("2_e7oou")]
+[node name="Helen" parent="." instance=ExtResource("1_s1mol")]
transform = Transform3D(0.25, 0, 0, 0, 0.25, 0, 0, 0, 0.25, 0, 0.25, 0)
-script = ExtResource("3_e2vvs")
+script = ExtResource("2_odcb6")
-[node name="Room" parent="." instance=ExtResource("4_pv43k")]
+[node name="Spots" type="Node3D" parent="."]
+script = ExtResource("5_odcb6")
+
+[node name="Helen" type="SpotLight3D" parent="Spots"]
+transform = Transform3D(-1, 3.69465e-08, -7.92319e-08, 0, 0.906308, 0.422618, 8.74228e-08, 0.422618, -0.906308, 0, 2.5, -2)
+visible = false
+light_color = Color(1, 0.9625, 0.85, 1)
+light_energy = 5.0
+spot_attenuation = 2.0
+spot_angle = 10.0
+spot_angle_attenuation = 0.15
+
+[node name="Room" parent="." instance=ExtResource("3_e7oou")]
transform = Transform3D(0.25, 0, 0, 0, 0.25, 0, 0, 0, 0.25, 0, 0, 0)
-[node name="Stage" parent="." instance=ExtResource("5_afett")]
+[node name="Stage" parent="." instance=ExtResource("4_e2vvs")]
transform = Transform3D(0.25, 0, 0, 0, 0.25, 0, 0, 0, 0.25, 0, 0, 0)
-[node name="Camera 1" type="Camera3D" parent="."]
+[node name="Angle 1" type="Camera3D" parent="."]
transform = Transform3D(-1, 1.31602e-08, -1.50421e-07, 0, 0.996195, 0.0871557, 1.50996e-07, 0.0871557, -0.996195, 0, 1.5, -3)
fov = 60.0
-[node name="Camera 2" type="Camera3D" parent="."]
+[node name="Angle 2" type="Camera3D" parent="."]
transform = Transform3D(-1, 1.31602e-08, -1.50421e-07, 0, 0.996195, 0.0871557, 1.50996e-07, 0.0871557, -0.996195, 0, 1.5, -1)
fov = 60.0
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = SubResource("Environment_axk5g")
-[node name="SpotLight3D" type="SpotLight3D" parent="."]
-transform = Transform3D(-0.972974, -0.0597654, 0.223048, 2.26267e-08, 0.965926, 0.258819, -0.230916, 0.251824, -0.939821, 0.217544, 1.75308, -1.04223)
-light_color = Color(1, 0.9625, 0.85, 1)
-light_energy = 2.0
-spot_range = 1.3068
-spot_angle = 27.449
-spot_angle_attenuation = 0.1
-
[node name="OmniLight3D" type="OmniLight3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 2.5, -3)
light_color = Color(1, 0.960784, 0.85098, 1)
diff --git a/Scripts/HelenController.gd b/Scripts/AnimatronicController.gd
similarity index 75%
rename from Scripts/HelenController.gd
rename to Scripts/AnimatronicController.gd
index 4caedd1..5dc202b 100644
--- a/Scripts/HelenController.gd
+++ b/Scripts/AnimatronicController.gd
@@ -4,27 +4,7 @@ var animation_player : AnimationPlayer
var animation_tree : AnimationTree
var blend_tree : AnimationNodeBlendTree
-var movement_states = {
- "Mouth": [false, 0.0, 0.0, 0.0],
- "Left Ear": [false, 0.0, 0.0, 0.0],
- "Right Ear": [false, 0.0, 0.0, 0.0],
- "Left Eyelid": [false, 0.0, 0.0, 0.0],
- "Right Eyelid": [false, 0.0, 0.0, 0.0],
- "Eyes Left": [false, 0.0, 0.0, 0.0],
- "Eyes Right": [false, 0.0, 0.0, 0.0],
- "Head Left": [false, 0.0, 0.0, 0.0],
- "Head Right": [false, 0.0, 0.0, 0.0],
- "Head Up": [false, 0.0, 0.0, 0.0],
- "Left Arm Up": [false, 0.0, 0.0, 0.0],
- "Left Arm Twist": [false, 0.0, 0.0, 0.0],
- "Left Elbow": [false, 0.0, 0.0, 0.0],
- "Right Arm Up": [false, 0.0, 0.0, 0.0],
- "Right Arm Twist": [false, 0.0, 0.0, 0.0],
- "Right Elbow": [false, 0.0, 0.0, 0.0],
- "Body Left": [false, 0.0, 0.0, 0.0],
- "Body Right": [false, 0.0, 0.0, 0.0],
- "Body Lean": [false, 0.0, 0.0, 0.0],
-}
+var movement_states : Dictionary
func _ready():
animation_player = $AnimationPlayer
@@ -37,10 +17,13 @@ func _ready():
animation_tree.active = true
blend_tree = animation_tree.tree_root as AnimationNodeBlendTree
- #animation_player.speed_scale = 0
+ animation_player.speed_scale = 0
var animations = animation_player.get_animation_list()
+ for animation in animations:
+ movement_states[animation] = [false, 0.0, 0.0, 0.0]
+
var prev_name = "Anim_" + animations[0]
var old_time_name = "Time_" + animations[0]
var old_seek_name = "Seek_" + animations[0]
@@ -78,8 +61,8 @@ func _ready():
var add_node := AnimationNodeAdd2.new()
blend_tree.add_node(add_name, add_node)
- blend_tree.connect_node(time_name,0,anim_name)
- blend_tree.connect_node(seek_name,0,time_name)
+ blend_tree.connect_node(time_name, 0, anim_name)
+ blend_tree.connect_node(seek_name, 0, time_name)
blend_tree.connect_node(add_name, 0, prev_name)
blend_tree.connect_node(add_name, 1, seek_name)
prev_name = add_name
diff --git a/Scripts/HelenController.gd.uid b/Scripts/AnimatronicController.gd.uid
similarity index 100%
rename from Scripts/HelenController.gd.uid
rename to Scripts/AnimatronicController.gd.uid
diff --git a/Scripts/CameraButton.gd b/Scripts/CameraButton.gd
new file mode 100644
index 0000000..ef99c04
--- /dev/null
+++ b/Scripts/CameraButton.gd
@@ -0,0 +1,10 @@
+extends Control
+
+@export var camera : String
+@export var base_scene_path : String
+
+func _ready() -> void:
+ $Button.text = camera
+
+func _on_button_pressed() -> void:
+ get_node(base_scene_path + camera).current = true;
diff --git a/Scripts/CameraButton.gd.uid b/Scripts/CameraButton.gd.uid
new file mode 100644
index 0000000..18a4fd1
--- /dev/null
+++ b/Scripts/CameraButton.gd.uid
@@ -0,0 +1 @@
+uid://dfoog0y2bh7tk
diff --git a/Scripts/CosmeticAdjustment.gd b/Scripts/CosmeticAdjustment.gd
new file mode 100644
index 0000000..75fd198
--- /dev/null
+++ b/Scripts/CosmeticAdjustment.gd
@@ -0,0 +1,18 @@
+extends Control
+
+@export var vis_name: String
+@export var scene_handle: String
+@export var options: Dictionary
+
+func _ready() -> void:
+ $Panel/Label.text = vis_name
+ for option in options:
+ $Panel/OptionButton.add_item(option)
+ $Panel/OptionButton.select(0)
+ for adjusted in options[$Panel/OptionButton.get_item_text(0)]:
+ get_node(scene_handle+adjusted).visible = options[$Panel/OptionButton.get_item_text(0)][adjusted]
+
+
+func _on_option_button_item_selected(index: int) -> void:
+ for adjusted in options[$Panel/OptionButton.get_item_text(index)]:
+ get_node(scene_handle+adjusted).visible = options[$Panel/OptionButton.get_item_text(index)][adjusted]
diff --git a/Scripts/CosmeticAdjustment.gd.uid b/Scripts/CosmeticAdjustment.gd.uid
new file mode 100644
index 0000000..832bd83
--- /dev/null
+++ b/Scripts/CosmeticAdjustment.gd.uid
@@ -0,0 +1 @@
+uid://1f7v3ohsgx0g
diff --git a/Scripts/EditorScreen.gd b/Scripts/EditorScreen.gd
index 5fc6eb6..f34bf79 100644
--- a/Scripts/EditorScreen.gd
+++ b/Scripts/EditorScreen.gd
@@ -4,50 +4,775 @@ var playing : bool = false
var recording : bool = false
var index : int = 0
var playback_rate : int = 1
+var transport_enabled : bool = false
+var erase_validated : bool = false
+var cam_index : int = 0
+var fullscreen : bool = false
+
+var showtape_loaded : bool = false
+var show_name : String
+
+var current_stage : String
+
+var stages_info = {
+ "Helen House":
+ {
+ "bits": 20,
+ "scene": "res://Scenes/Stages/HelenHouse.tscn",
+ "scene_ref_base": "SubViewport/HelenHouse/",
+ "camera_count": 2,
+
+ "ust_type": "Rockafire Explosion/3-Stage",
+
+ "bit_mapping":
+ {
+ 23: { "bot": "Helen", "movement": "Mouth", "flow_in": 3.0, "flow_out": 2.0 },
+ 24: { "bot": "Helen", "movement": "Left Ear", "flow_in": 3.5, "flow_out": 1.5 },
+ 25: { "bot": "Helen", "movement": "Right Ear", "flow_in": 3.5, "flow_out": 1.5 },
+ 26: { "bot": "Helen", "movement": "Left Eyelid", "flow_in": 1.5, "flow_out": 2.0 },
+ 27: { "bot": "Helen", "movement": "Right Eyelid", "flow_in": 1.5, "flow_out": 2.0 },
+ 28: { "bot": "Helen", "movement": "Eyes Left", "flow_in": 3.5, "flow_out": 1.5 },
+ 29: { "bot": "Helen", "movement": "Eyes Right", "flow_in": 3.5, "flow_out": 1.5 },
+ 30: { "bot": "Helen", "movement": "Head Left", "flow_in": 1.5, "flow_out": 1.5 },
+ 31: { "bot": "Helen", "movement": "Head Right", "flow_in": 1.5, "flow_out": 1.5 },
+ 32: { "bot": "Helen", "movement": "Head Up", "flow_in": 1.0, "flow_out": 1.0 },
+ 33: { "bot": "Helen", "movement": "Left Arm Up", "flow_in": 0.8, "flow_out": 0.6 },
+ 34: { "bot": "Helen", "movement": "Left Arm Twist", "flow_in": 0.8, "flow_out": 0.8 },
+ 35: { "bot": "Helen", "movement": "Left Elbow", "flow_in": 1.0, "flow_out": 1.0 },
+ 36: { "bot": "Helen", "movement": "Right Arm Up", "flow_in": 0.8, "flow_out": 0.6 },
+ 37: { "bot": "Helen", "movement": "Right Arm Twist", "flow_in": 0.8, "flow_out": 0.8 },
+ 38: { "bot": "Helen", "movement": "Right Elbow", "flow_in": 1.0, "flow_out": 1.0 },
+ 39: { "bot": "Helen", "movement": "Body Left", "flow_in": 0.7, "flow_out": 0.7 },
+ 40: { "bot": "Helen", "movement": "Body Right", "flow_in": 0.7, "flow_out": 0.7 },
+ 41: { "bot": "Helen", "movement": "Body Lean", "flow_in": 1.0, "flow_out": 0.8 },
+ 125: { "bot": "Spots", "movement": "Helen", "flow_in": "None", "flow_out": "None" },
+ },
+
+ "cosmetics":
+ {
+ "Helen Hair":
+ {
+ "Black and White":
+ {
+ "Helen/Helen/Skeleton3D/BWHair": true,
+ "Helen/Helen/Skeleton3D/YellowHair": false,
+ },
+ "Yellow":
+ {
+ "Helen/Helen/Skeleton3D/BWHair": false,
+ "Helen/Helen/Skeleton3D/YellowHair": true,
+ },
+ },
+ "Helen Dress":
+ {
+ "Tux":
+ {
+ "Helen/Helen/Skeleton3D/Collar": true,
+ "Helen/Helen/Skeleton3D/Torso": true,
+ "Helen/Helen/Skeleton3D/Skirt": true,
+ "Helen/Helen/Skeleton3D/CheerDress": false,
+ },
+ "Cheerleader":
+ {
+ "Helen/Helen/Skeleton3D/Collar": false,
+ "Helen/Helen/Skeleton3D/Torso": false,
+ "Helen/Helen/Skeleton3D/Skirt": false,
+ "Helen/Helen/Skeleton3D/CheerDress": true,
+ }
+ }
+ }
+ },
+ "Chuck E's Corner":
+ {
+ "bits": 16,
+ "scene": "res://Scenes/Stages/ChuckEsCorner.tscn",
+ "scene_ref_base": "SubViewport/ChuckEsCorner/",
+ "camera_count": 3,
+
+ "ust_type": "Cyberamics",
+
+ "bit_mapping":
+ {
+ 1: { "bot": "Chuck", "movement": "Mouth", "flow_in": 7.5, "flow_out": 6.0 },
+ 2: { "bot": "Chuck", "movement": "Head Left", "flow_in": 0.8, "flow_out": 1.0 },
+ 3: { "bot": "Chuck", "movement": "Head Right", "flow_in": 1.0, "flow_out": 1.0 },
+ 4: { "bot": "Chuck", "movement": "Head Up", "flow_in": 2.0, "flow_out": 1.0 },
+ 5: { "bot": "Chuck", "movement": "Eyes Left", "flow_in": 4.0, "flow_out": 3.0 },
+ 6: { "bot": "Chuck", "movement": "Eyes Right", "flow_in": 4.0, "flow_out": 3.0 },
+ 7: { "bot": "Chuck", "movement": "Eyelids", "flow_in": 7.5, "flow_out": 5.0 },
+ 8: { "bot": "Chuck", "movement": "Right Arm", "flow_in": 2.0, "flow_out": 1.0 },
+ 41: { "bot": "Warblettes", "movement": "Mouth", "flow_in": 4.0, "flow_out": 3.0 },
+ 44: { "bot": "Warblettes", "movement": "Body Rock", "flow_in": 1.0, "flow_out": 1.0 },
+ 50: { "bot": "Spots", "movement": "Chuck", "flow_in": "None", "flow_out": "None" },
+ 55: { "bot": "Floods", "movement": "Blue", "flow_in": "None", "flow_out": "None" },
+ 78: { "bot": "Spots", "movement": "Warblettes", "flow_in": "None", "flow_out": "None" },
+ 79: { "bot": "Color Spots", "movement": "Chuck", "flow_in": "None", "flow_out": "None" },
+ 82: { "bot": "Floods", "movement": "Red", "flow_in": "None", "flow_out": "None" },
+ 86: { "bot": "Floods", "movement": "Green", "flow_in": "None", "flow_out": "None" },
+ },
+
+ "cosmetics":
+ {
+ "Chuck E. Hat":
+ {
+ "Derby":
+ {
+ "Chuck/Chuck/Skeleton3D/Avenger Hat": false,
+ "Chuck/Chuck/Skeleton3D/Cool Chuck Hat": false,
+ "Chuck/Chuck/Skeleton3D/Derby": true,
+ },
+ "Cool Chuck":
+ {
+ "Chuck/Chuck/Skeleton3D/Avenger Hat": false,
+ "Chuck/Chuck/Skeleton3D/Cool Chuck Hat": true,
+ "Chuck/Chuck/Skeleton3D/Derby": false,
+ },
+ "Avenger":
+ {
+ "Chuck/Chuck/Skeleton3D/Avenger Hat": true,
+ "Chuck/Chuck/Skeleton3D/Cool Chuck Hat": false,
+ "Chuck/Chuck/Skeleton3D/Derby": false,
+ },
+ "None":
+ {
+ "Chuck/Chuck/Skeleton3D/Avenger Hat": false,
+ "Chuck/Chuck/Skeleton3D/Cool Chuck Hat": false,
+ "Chuck/Chuck/Skeleton3D/Derby": false,
+ }
+ },
+
+ "Chuck E. Shirt":
+ {
+ "Red Vest":
+ {
+ "Chuck/Chuck/Skeleton3D/Avenger Shirt": false,
+ "Chuck/Chuck/Skeleton3D/Cool Chuck Shirt": false,
+ "Chuck/Chuck/Skeleton3D/Black Bowtie": true,
+ "Chuck/Chuck/Skeleton3D/Buttons": true,
+ "Chuck/Chuck/Skeleton3D/Vest Trim": true,
+ "Chuck/Chuck/Skeleton3D/Yellow Checker Vest": false,
+ "Chuck/Chuck/Skeleton3D/Rocker Vest": true,
+ },
+ "Yellow Checker Vest":
+ {
+ "Chuck/Chuck/Skeleton3D/Avenger Shirt": false,
+ "Chuck/Chuck/Skeleton3D/Cool Chuck Shirt": false,
+ "Chuck/Chuck/Skeleton3D/Black Bowtie": true,
+ "Chuck/Chuck/Skeleton3D/Buttons": true,
+ "Chuck/Chuck/Skeleton3D/Vest Trim": true,
+ "Chuck/Chuck/Skeleton3D/Yellow Checker Vest": true,
+ "Chuck/Chuck/Skeleton3D/Rocker Vest": false,
+ },
+ "Cool Chuck Shirt":
+ {
+ "Chuck/Chuck/Skeleton3D/Avenger Shirt": false,
+ "Chuck/Chuck/Skeleton3D/Cool Chuck Shirt": true,
+ "Chuck/Chuck/Skeleton3D/Black Bowtie": false,
+ "Chuck/Chuck/Skeleton3D/Buttons": false,
+ "Chuck/Chuck/Skeleton3D/Vest Trim": false,
+ "Chuck/Chuck/Skeleton3D/Yellow Checker Vest": false,
+ "Chuck/Chuck/Skeleton3D/Rocker Vest": false,
+ },
+ "Avenger Shirt":
+ {
+ "Chuck/Chuck/Skeleton3D/Avenger Shirt": true,
+ "Chuck/Chuck/Skeleton3D/Cool Chuck Shirt": false,
+ "Chuck/Chuck/Skeleton3D/Black Bowtie": false,
+ "Chuck/Chuck/Skeleton3D/Buttons": false,
+ "Chuck/Chuck/Skeleton3D/Vest Trim": false,
+ "Chuck/Chuck/Skeleton3D/Yellow Checker Vest": false,
+ "Chuck/Chuck/Skeleton3D/Rocker Vest": false,
+ }
+ },
+
+ "Chuck E. Mask":
+ {
+ "PTT":
+ {
+ "Chuck/Chuck/Skeleton3D/PTT Ears": true,
+ "Chuck/Chuck/Skeleton3D/PTT Ears Inside": true,
+ "Chuck/Chuck/Skeleton3D/PTT Jaw": true,
+ "Chuck/Chuck/Skeleton3D/PTT Muzzle": true,
+ "Chuck/Chuck/Skeleton3D/Modern Ears": false,
+ "Chuck/Chuck/Skeleton3D/Modern Ears Inside": false,
+ "Chuck/Chuck/Skeleton3D/Modern Jaw": false,
+ "Chuck/Chuck/Skeleton3D/Modern Muzzle": false,
+ },
+ "Modern":
+ {
+ "Chuck/Chuck/Skeleton3D/PTT Ears": false,
+ "Chuck/Chuck/Skeleton3D/PTT Ears Inside": false,
+ "Chuck/Chuck/Skeleton3D/PTT Jaw": false,
+ "Chuck/Chuck/Skeleton3D/PTT Muzzle": false,
+ "Chuck/Chuck/Skeleton3D/Modern Ears": true,
+ "Chuck/Chuck/Skeleton3D/Modern Ears Inside": true,
+ "Chuck/Chuck/Skeleton3D/Modern Jaw": true,
+ "Chuck/Chuck/Skeleton3D/Modern Muzzle": true,
+ },
+ },
+
+ "Chuck E. Eyelids":
+ {
+ "Blue":
+ {
+ "Chuck/Chuck/Skeleton3D/Blue Eyelids": true,
+ "Chuck/Chuck/Skeleton3D/Grey Eyelids": false,
+ },
+ "Grey":
+ {
+ "Chuck/Chuck/Skeleton3D/Blue Eyelids": false,
+ "Chuck/Chuck/Skeleton3D/Grey Eyelids": true,
+ },
+ }
+ }
+ },
+ "Balcony Stage":
+ {
+ "bits": 53,
+ "scene": "res://Scenes/Stages/Balcony.tscn",
+ "scene_ref_base": "SubViewport/Balcony/",
+ "camera_count": 6,
+
+ "ust_type": "Cyberamics",
+
+ "bit_mapping":
+ {
+ 1: { "bot": "Chuck", "movement": "Mouth", "flow_in": 7.5, "flow_out": 6.0 },
+ 2: { "bot": "Chuck", "movement": "Head Left", "flow_in": 0.8, "flow_out": 1.0 },
+ 3: { "bot": "Chuck", "movement": "Head Right", "flow_in": 1.0, "flow_out": 1.0 },
+ 4: { "bot": "Chuck", "movement": "Head Up", "flow_in": 2.0, "flow_out": 1.0 },
+ 5: { "bot": "Chuck", "movement": "Eyes Left", "flow_in": 4.0, "flow_out": 3.0 },
+ 6: { "bot": "Chuck", "movement": "Eyes Right", "flow_in": 4.0, "flow_out": 3.0 },
+ 7: { "bot": "Chuck", "movement": "Eyelids", "flow_in": 7.5, "flow_out": 5.0 },
+ 8: { "bot": "Chuck", "movement": "Right Arm", "flow_in": 2.0, "flow_out": 1.0 },
+ 9: { "bot": "Helen", "movement": "Mouth", "flow_in": 7.5, "flow_out": 6.0 },
+ 10: { "bot": "Helen", "movement": "Head Left", "flow_in": 0.8, "flow_out": 1.0 },
+ 11: { "bot": "Helen", "movement": "Head Right", "flow_in": 1.0, "flow_out": 1.0 },
+ 12: { "bot": "Helen", "movement": "Head Up", "flow_in": 2.0, "flow_out": 1.0 },
+ 13: { "bot": "Helen", "movement": "Eyes Left", "flow_in": 4.0, "flow_out": 3.0 },
+ 14: { "bot": "Helen", "movement": "Eyes Right", "flow_in": 4.0, "flow_out": 3.0 },
+ 15: { "bot": "Helen", "movement": "Eyelids", "flow_in": 7.5, "flow_out": 5.0 },
+ 16: { "bot": "Helen", "movement": "Right Arm", "flow_in": 2.0, "flow_out": 1.0 },
+ 25: { "bot": "Jasper", "movement": "Mouth", "flow_in": 7.5, "flow_out": 6.0 },
+ 26: { "bot": "Jasper", "movement": "Head Left", "flow_in": 1.0, "flow_out": 1.0 },
+ 27: { "bot": "Jasper", "movement": "Head Right", "flow_in": 1.0, "flow_out": 1.0 },
+ 28: { "bot": "Jasper", "movement": "Head Up", "flow_in": 2.0, "flow_out": 1.0 },
+ 29: { "bot": "Jasper", "movement": "Eyes Left", "flow_in": 4.0, "flow_out": 3.0 },
+ 30: { "bot": "Jasper", "movement": "Eyes Right", "flow_in": 4.0, "flow_out": 3.0 },
+ 31: { "bot": "Jasper", "movement": "Eyelids", "flow_in": 7.5, "flow_out": 5.0 },
+ 32: { "bot": "Jasper", "movement": "Strum", "flow_in": 2.0, "flow_out": 1.0 },
+ 41: { "bot": "Warblettes", "movement": "Mouth", "flow_in": 4.0, "flow_out": 3.0 },
+ 44: { "bot": "Warblettes", "movement": "Body Rock", "flow_in": 1.0, "flow_out": 1.0 },
+ 50: { "bot": "Spots", "movement": "Chuck", "flow_in": "None", "flow_out": "None" },
+ 51: { "bot": "Spots", "movement": "Helen", "flow_in": "None", "flow_out": "None" },
+ 52: { "bot": "Spots", "movement": "Munch", "flow_in": "None", "flow_out": "None" },
+ 53: { "bot": "Spots", "movement": "Jasper", "flow_in": "None", "flow_out": "None" },
+ 54: { "bot": "Spots", "movement": "Pasqually", "flow_in": "None", "flow_out": "None" },
+ 55: { "bot": "Backdrop", "movement": "C Blue", "flow_in": "None", "flow_out": "None" },
+ 65: { "bot": "Backdrop", "movement": "L Blue", "flow_in": "None", "flow_out": "None" },
+ 66: { "bot": "Valence", "movement": "R Center", "flow_in": "None", "flow_out": "None" },
+ 68: { "bot": "Backdrop", "movement": "L Red", "flow_in": "None", "flow_out": "None" },
+ 69: { "bot": "Valence", "movement": "R", "flow_in": "None", "flow_out": "None" },
+ 70: { "bot": "Backdrop", "movement": "L Amber", "flow_in": "None", "flow_out": "None" },
+ 71: { "bot": "Valence", "movement": "L Center", "flow_in": "None", "flow_out": "None" },
+ 72: { "bot": "Valence", "movement": "L", "flow_in": "None", "flow_out": "None" },
+ 73: { "bot": "Valence", "movement": "Center", "flow_in": "None", "flow_out": "None" },
+ 74: { "bot": "Color Spots", "movement": "Warblettes", "flow_in": "None", "flow_out": "None" },
+ 75: { "bot": "Color Spots", "movement": "Munch", "flow_in": "None", "flow_out": "None" },
+ 76: { "bot": "Color Spots", "movement": "Helen", "flow_in": "None", "flow_out": "None" },
+ 77: { "bot": "Color Spots", "movement": "Jasper", "flow_in": "None", "flow_out": "None" },
+ 78: { "bot": "Spots", "movement": "Warblettes", "flow_in": "None", "flow_out": "None" },
+ 79: { "bot": "Color Spots", "movement": "Chuck", "flow_in": "None", "flow_out": "None" },
+ 80: { "bot": "Color Spots", "movement": "Chuck 2", "flow_in": "None", "flow_out": "None" },
+ 81: { "bot": "Backdrop", "movement": "R Amber", "flow_in": "None", "flow_out": "None" },
+ 82: { "bot": "Backdrop", "movement": "C Red", "flow_in": "None", "flow_out": "None" },
+ 83: { "bot": "Backdrop", "movement": "R Blue", "flow_in": "None", "flow_out": "None" },
+ 84: { "bot": "Color Spots", "movement": "Pasqually", "flow_in": "None", "flow_out": "None" },
+ 85: { "bot": "Backdrop", "movement": "R Red", "flow_in": "None", "flow_out": "None" },
+ 86: { "bot": "Backdrop", "movement": "C Amber", "flow_in": "None", "flow_out": "None" },
+ },
+
+ "cosmetics":
+ {
+ "Chuck E. Hat":
+ {
+ "Derby":
+ {
+ "Chuck/Chuck/Skeleton3D/Avenger Hat": false,
+ "Chuck/Chuck/Skeleton3D/Cool Chuck Hat": false,
+ "Chuck/Chuck/Skeleton3D/Derby": true,
+ },
+ "Cool Chuck":
+ {
+ "Chuck/Chuck/Skeleton3D/Avenger Hat": false,
+ "Chuck/Chuck/Skeleton3D/Cool Chuck Hat": true,
+ "Chuck/Chuck/Skeleton3D/Derby": false,
+ },
+ "Avenger":
+ {
+ "Chuck/Chuck/Skeleton3D/Avenger Hat": true,
+ "Chuck/Chuck/Skeleton3D/Cool Chuck Hat": false,
+ "Chuck/Chuck/Skeleton3D/Derby": false,
+ },
+ "None":
+ {
+ "Chuck/Chuck/Skeleton3D/Avenger Hat": false,
+ "Chuck/Chuck/Skeleton3D/Cool Chuck Hat": false,
+ "Chuck/Chuck/Skeleton3D/Derby": false,
+ }
+ },
+
+ "Chuck E. Shirt":
+ {
+ "Yellow Checker Vest":
+ {
+ "Chuck/Chuck/Skeleton3D/Avenger Shirt": false,
+ "Chuck/Chuck/Skeleton3D/Cool Chuck Shirt": false,
+ "Chuck/Chuck/Skeleton3D/Black Bowtie": true,
+ "Chuck/Chuck/Skeleton3D/Buttons": true,
+ "Chuck/Chuck/Skeleton3D/Vest Trim": true,
+ "Chuck/Chuck/Skeleton3D/Yellow Checker Vest": true,
+ "Chuck/Chuck/Skeleton3D/Rocker Vest": false,
+ },
+ "Red Vest":
+ {
+ "Chuck/Chuck/Skeleton3D/Avenger Shirt": false,
+ "Chuck/Chuck/Skeleton3D/Cool Chuck Shirt": false,
+ "Chuck/Chuck/Skeleton3D/Black Bowtie": true,
+ "Chuck/Chuck/Skeleton3D/Buttons": true,
+ "Chuck/Chuck/Skeleton3D/Vest Trim": true,
+ "Chuck/Chuck/Skeleton3D/Yellow Checker Vest": false,
+ "Chuck/Chuck/Skeleton3D/Rocker Vest": true,
+ },
+ "Cool Chuck Shirt":
+ {
+ "Chuck/Chuck/Skeleton3D/Avenger Shirt": false,
+ "Chuck/Chuck/Skeleton3D/Cool Chuck Shirt": true,
+ "Chuck/Chuck/Skeleton3D/Black Bowtie": false,
+ "Chuck/Chuck/Skeleton3D/Buttons": false,
+ "Chuck/Chuck/Skeleton3D/Vest Trim": false,
+ "Chuck/Chuck/Skeleton3D/Yellow Checker Vest": false,
+ "Chuck/Chuck/Skeleton3D/Rocker Vest": false,
+ },
+ "Avenger Shirt":
+ {
+ "Chuck/Chuck/Skeleton3D/Avenger Shirt": true,
+ "Chuck/Chuck/Skeleton3D/Cool Chuck Shirt": false,
+ "Chuck/Chuck/Skeleton3D/Black Bowtie": false,
+ "Chuck/Chuck/Skeleton3D/Buttons": false,
+ "Chuck/Chuck/Skeleton3D/Vest Trim": false,
+ "Chuck/Chuck/Skeleton3D/Yellow Checker Vest": false,
+ "Chuck/Chuck/Skeleton3D/Rocker Vest": false,
+ }
+ },
+
+ "Chuck E. Mask":
+ {
+ "PTT":
+ {
+ "Chuck/Chuck/Skeleton3D/PTT Ears": true,
+ "Chuck/Chuck/Skeleton3D/PTT Ears Inside": true,
+ "Chuck/Chuck/Skeleton3D/PTT Jaw": true,
+ "Chuck/Chuck/Skeleton3D/PTT Muzzle": true,
+ "Chuck/Chuck/Skeleton3D/Modern Ears": false,
+ "Chuck/Chuck/Skeleton3D/Modern Ears Inside": false,
+ "Chuck/Chuck/Skeleton3D/Modern Jaw": false,
+ "Chuck/Chuck/Skeleton3D/Modern Muzzle": false,
+ },
+ "Modern":
+ {
+ "Chuck/Chuck/Skeleton3D/PTT Ears": false,
+ "Chuck/Chuck/Skeleton3D/PTT Ears Inside": false,
+ "Chuck/Chuck/Skeleton3D/PTT Jaw": false,
+ "Chuck/Chuck/Skeleton3D/PTT Muzzle": false,
+ "Chuck/Chuck/Skeleton3D/Modern Ears": true,
+ "Chuck/Chuck/Skeleton3D/Modern Ears Inside": true,
+ "Chuck/Chuck/Skeleton3D/Modern Jaw": true,
+ "Chuck/Chuck/Skeleton3D/Modern Muzzle": true,
+ },
+ },
+
+ "Chuck E. Eyelids":
+ {
+ "Blue":
+ {
+ "Chuck/Chuck/Skeleton3D/Blue Eyelids": true,
+ "Chuck/Chuck/Skeleton3D/Grey Eyelids": false,
+ },
+ "Grey":
+ {
+ "Chuck/Chuck/Skeleton3D/Blue Eyelids": false,
+ "Chuck/Chuck/Skeleton3D/Grey Eyelids": true,
+ },
+ },
+
+ "Helen Eyelids":
+ {
+ "Blue":
+ {
+ "Helen/Helen/Skeleton3D/Blue Eyelids": true,
+ "Helen/Helen/Skeleton3D/Pink Eyelids": false,
+ },
+ "Pink":
+ {
+ "Helen/Helen/Skeleton3D/Blue Eyelids": false,
+ "Helen/Helen/Skeleton3D/Pink Eyelids": true,
+ },
+ },
+
+ "Helen Dress":
+ {
+ "Half Body CU":
+ {
+ "Helen/Helen/Skeleton3D/Half Body Skirt": true,
+ "Helen/Helen/Skeleton3D/Skirt": false,
+ "Helen/Helen/Skeleton3D/Black Shirt": true,
+ "Helen/Helen/Skeleton3D/Collar": true,
+ },
+ "Full Body CU":
+ {
+ "Helen/Helen/Skeleton3D/Half Body Skirt": false,
+ "Helen/Helen/Skeleton3D/Skirt": true,
+ "Helen/Helen/Skeleton3D/Black Shirt": true,
+ "Helen/Helen/Skeleton3D/Collar": true,
+ },
+ },
+
+ "Helen Hair":
+ {
+ "Large CU":
+ {
+ "Helen/Helen/Skeleton3D/BWHair Large": true,
+ "Helen/Helen/Skeleton3D/BWHair": false,
+ },
+ "Normal CU":
+ {
+ "Helen/Helen/Skeleton3D/BWHair Large": false,
+ "Helen/Helen/Skeleton3D/BWHair": true,
+ },
+ },
+
+ "Helen Mask":
+ {
+ "Modern":
+ {
+ "Helen/Helen/Skeleton3D/Modern Head": true,
+ "Helen/Helen/Skeleton3D/Modern Mask": true,
+ "Helen/Helen/Skeleton3D/Road Stage Jaw": false,
+ "Helen/Helen/Skeleton3D/Road Stage Beak": false,
+ "Helen/Helen/Skeleton3D/Modern Jaw": true,
+ "Helen/Helen/Skeleton3D/Modern Beak": true,
+ },
+ "Road Stage":
+ {
+ "Helen/Helen/Skeleton3D/Modern Head": true,
+ "Helen/Helen/Skeleton3D/Modern Mask": true,
+ "Helen/Helen/Skeleton3D/Road Stage Jaw": true,
+ "Helen/Helen/Skeleton3D/Road Stage Beak": true,
+ "Helen/Helen/Skeleton3D/Modern Jaw": false,
+ "Helen/Helen/Skeleton3D/Modern Beak": false,
+ },
+ },
+ }
+ }
+}
signal step(amount: int)
signal start_recording()
signal end_recording()
signal return_to_zero()
+signal erase_all()
+
+func reload_stage() -> void:
+ $SequencerPanel/TimelinePanel/VScrollBar.value = 0
+ $FlyoutPanel/Movements/VScrollBar.value = 0
+ $FlyoutPanel/FlowControls/VScrollBar.value = 0
+ $CameraPreview.visible = false
+ for row in $SequencerPanel/TimelinePanel/InvisibleMask/MovementRowsContainer.get_children():
+ row.queue_free()
+ for flow in $FlyoutPanel/FlowControls/InvisibleMask/FlowHandle.get_children():
+ flow.queue_free()
+ for movement in $FlyoutPanel/Movements/InvisibleMask/MovementHandle.get_children():
+ movement.queue_free()
+ for camera in $FlyoutPanel/Camera.get_children():
+ camera.queue_free()
+ for cosmetic_adjustment in $FlyoutPanel/Cosmetics/InvisibleMask/CosmeticsHandle.get_children():
+ cosmetic_adjustment.queue_free()
+ if ($SubViewport.get_child_count() > 0):
+ $SubViewport.get_child(0).queue_free()
+ cam_index = 0
+ var stage = load(stages_info[current_stage]["scene"]).instantiate()
+ $SubViewport.add_child(stage)
+
+ var cam_offset = 4
+ for i in range(1, stages_info[current_stage]["camera_count"]+1):
+ var camera_button = load("res://Scenes/GUI/Controls/CameraButton.tscn").instantiate()
+ camera_button.camera = "Angle " + str(i)
+ camera_button.base_scene_path = "../../../" + stages_info[current_stage]["scene_ref_base"]
+ camera_button.position.y = cam_offset
+ cam_offset += 36
+ $FlyoutPanel/Camera.add_child(camera_button)
+ $FlyoutPanel/Camera.size.y = cam_offset
+
+ var cosmetics_offset = 0
+ var cosmetics_count = -1
+ for cosmetic in stages_info[current_stage]["cosmetics"]:
+ var cosmetic_adjustment = load("res://Scenes/GUI/Controls/CosmeticAdjustment.tscn").instantiate()
+ cosmetic_adjustment.vis_name = cosmetic
+ cosmetic_adjustment.options = stages_info[current_stage]["cosmetics"][cosmetic]
+ cosmetic_adjustment.scene_handle = "../../../../../" + stages_info[current_stage]["scene_ref_base"]
+ cosmetic_adjustment.position.y = cosmetics_offset
+ cosmetics_offset += 44
+ cosmetics_count += 1
+ $FlyoutPanel/Cosmetics/InvisibleMask/CosmeticsHandle.add_child(cosmetic_adjustment)
+ $FlyoutPanel/Cosmetics/VScrollBar.max_value = cosmetics_count
+
+ var rows_offset = 0
+ var flows_offset = 0
+ var flow_count = 0
+ for bit_number in stages_info[current_stage]["bit_mapping"]:
+ var bot = stages_info[current_stage]["bit_mapping"][bit_number]["bot"]
+ var movement = stages_info[current_stage]["bit_mapping"][bit_number]["movement"]
+
+ var in_flow = stages_info[current_stage]["bit_mapping"][bit_number]["flow_in"]
+ var out_flow = stages_info[current_stage]["bit_mapping"][bit_number]["flow_out"]
+ if (in_flow is not String):
+ var flow_control = load("res://Scenes/GUI/Controls/FlowControl.tscn").instantiate()
+ flow_control.position.y = flows_offset
+ flow_control.name = str(bit_number) + bot + movement + current_stage
+ flow_control.vis_name = bot + " " + movement
+ flow_control.in_value = in_flow
+ flow_control.out_value = out_flow
+ $FlyoutPanel/FlowControls/InvisibleMask/FlowHandle.add_child(flow_control)
+ flows_offset += 44
+ flow_count += 1
+
+ var row = load("res://Scenes/GUI/Controls/MovementRow.tscn").instantiate()
+ row.name = str(bit_number) + " Bit"
+ row.position.y = rows_offset
+ row.base_scene_path = "../../../../../" + stages_info[current_stage]["scene_ref_base"]
+ row.animatronic = bot
+ row.current_stage = current_stage
+ if (in_flow is String): row.flow_path = "None"
+ row.movement_bit = bit_number
+ row.movement_name = movement
+ $SequencerPanel/TimelinePanel/InvisibleMask/MovementRowsContainer.add_child(row, true)
+
+ var movement_button = load("res://Scenes/GUI/Controls/MovementButton.tscn").instantiate()
+ movement_button.position.y = rows_offset
+ movement_button.base_scene_path = "../../../../../" + stages_info[current_stage]["scene_ref_base"]
+ movement_button.animatronic = bot
+ movement_button.movement_bit = bit_number
+ movement_button.current_stage = current_stage
+ if (in_flow is String): movement_button.flow_path = "None"
+ movement_button.movement_name = movement
+ $FlyoutPanel/Movements/InvisibleMask/MovementHandle.add_child(movement_button)
+ rows_offset += 44
+ $SequencerPanel/TimelinePanel/VScrollBar.max_value = stages_info[current_stage]["bits"] - 1
+ $FlyoutPanel/Movements/VScrollBar.max_value = stages_info[current_stage]["bits"] - 1
+ $FlyoutPanel/FlowControls/VScrollBar.max_value = flow_count - 1
+ $CameraPreview.visible = true
+
+func _on_stage_change_overwrite_confirmation_dialog_confirmed() -> void:
+ erase_all.emit()
+ current_stage = $MenuBar/StageSelector.get_item_text($MenuBar/StageSelector.selected)
+ reload_stage()
func update_time_label() -> void:
var frames = index % 60
- var seconds = floori(index/60) % 60
- var minutes = floori(index/3600) % 60
- var hours = floori(index/216000)
+ var seconds = floori(index/60.0) % 60
+ var minutes = floori(index/3600.0) % 60
+ var hours = floori(index/216000.0)
$SequencerPanel/TransportControls/TimeLabel.text = "%d:%02d:%02d:%02d" % [hours, minutes, seconds, frames]
- #$SequencerPanel/TransportControls/TimeLabel.text = str(index)
+
+func set_transport_enabled(enabled: bool):
+ $SequencerPanel/TransportControls/Centered/StepBackwardsButton.disabled = !enabled
+ $SequencerPanel/TransportControls/Centered/FastBackwardsButton.disabled = !enabled
+ $SequencerPanel/TransportControls/Centered/PlayBackwardsButton.disabled = !enabled
+ $SequencerPanel/TransportControls/Centered/PauseButton.disabled = !enabled
+ $SequencerPanel/TransportControls/Centered/StopButton.disabled = !enabled
+ $SequencerPanel/TransportControls/Centered/PlayButton.disabled = !enabled
+ $SequencerPanel/TransportControls/Centered/FastForwardButton.disabled = !enabled
+ $SequencerPanel/TransportControls/Centered/StepForwardButton.disabled = !enabled
+ $SequencerPanel/TransportControls/RecordButton.disabled = !enabled
+ transport_enabled = enabled
func _ready() -> void:
get_tree().get_root().size_changed.connect(_on_size_changed)
+ erase_all.connect(_erase_all)
+ $MenuBar/MenuButton.get_popup().id_pressed.connect(_showtape_menu_button_pressed)
+ OS.request_permissions()
+ current_stage = $MenuBar/StageSelector.get_item_text($MenuBar/StageSelector.selected)
+ reload_stage()
+
+func _on_stage_selector_item_selected(_index: int) -> void:
+ if (showtape_loaded): $StageChangeOverwriteConfirmationDialog.show()
+ else:
+ current_stage = $MenuBar/StageSelector.get_item_text($MenuBar/StageSelector.selected)
+ reload_stage()
+
+func _showtape_menu_button_pressed(id: int) -> void:
+ match (id):
+ 0: #new
+ if (showtape_loaded): $NewOverwriteConfirmationDialog.show()
+ else: $ShowtapeNewScreen.visible = true
+ 1: #load
+ if (showtape_loaded): $LoadOverwriteConfirmationDialog.show()
+ else: $ShowtapeLoadScreen.visible = true
+ 2: #save
+ if (showtape_loaded): $ShowtapeSaveScreen.visible = true
+ else: $NoShowtapeLoadedDialog.show()
+
+
+func _on_showtape_new_audio_browse_button_pressed() -> void:
+ $OpenAudioFileDialog.show()
+
+func _on_open_audio_file_dialog_file_selected(path: String) -> void:
+ $ShowtapeNewScreen/DialogPanel/AudioFilePath.text = path
+
+func _on_showtape_new_cancel_button_pressed() -> void:
+ $ShowtapeNewScreen/DialogPanel/AudioFilePath.text = ""
+ $ShowtapeNewScreen/DialogPanel/ShowNameTextBox.text = ""
+ $ShowtapeNewScreen.visible = false
+
+func _on_showtape_new_create_button_pressed() -> void:
+ if (!FileAccess.file_exists($ShowtapeNewScreen/DialogPanel/AudioFilePath.text.strip_edges())):
+ $FileDoesntExistDialog.show()
+ return
+ if ($ShowtapeNewScreen/DialogPanel/ShowNameTextBox.text.strip_edges() == ""):
+ $EmptyStringDialog.show()
+ return
+ show_name = $ShowtapeNewScreen/DialogPanel/ShowNameTextBox.text.strip_edges()
+ $AudioStreamPlayer.stream = load_audio($ShowtapeNewScreen/DialogPanel/AudioFilePath.text.strip_edges())
+ set_transport_enabled(true)
+ showtape_loaded = true
+ $MenuBar/EditingLabel.text = "Editing: " + show_name
+ $ShowtapeNewScreen/DialogPanel/AudioFilePath.text = ""
+ $ShowtapeNewScreen/DialogPanel/ShowNameTextBox.text = ""
+ $ShowtapeNewScreen.visible = false
+
+func _on_new_overwrite_confirmation_dialog_confirmed() -> void:
+ erase_all.emit()
+ $ShowtapeNewScreen.visible = true
+
+func _on_open_showtape_file_dialog_file_selected(path: String) -> void:
+ $ShowtapeLoadScreen/DialogPanel/InFilePath.text = path
+
+func _on_showtape_load_in_browse_button_pressed() -> void:
+ $OpenShowtapeFileDialog.show()
+
+func _on_showtape_load_cancel_button_pressed() -> void:
+ $ShowtapeLoadScreen/DialogPanel/InFilePath.text = ""
+ $ShowtapeLoadScreen.visible = false
+
+func _on_showtape_load_open_button_pressed() -> void:
+ if (!FileAccess.file_exists($ShowtapeLoadScreen/DialogPanel/InFilePath.text.strip_edges())):
+ $FileDoesntExistDialog.show()
+ return
+ var file = FileAccess.open($ShowtapeLoadScreen/DialogPanel/InFilePath.text.strip_edges(), FileAccess.READ)
+ var content = file.get_as_text()
+ var header = content.split(";")[0].split(",")
+ if (header[1] != "2"):
+ $IncorrectShowtapeDialog.dialog_text = "This showtape is not the correct version!"
+ $IncorrectShowtapeDialog.show()
+ return
+ if (header[3] != stages_info[current_stage]["ust_type"]):
+ $IncorrectShowtapeDialog.dialog_text = "This showtape is not compatible with the currently selected stage.\nShowtape stage type: " + header[3]
+ $IncorrectShowtapeDialog.show()
+ return
+ show_name = header[2]
+ plot_data(content.split(";")[1])
+ $AudioStreamPlayer.stream = load_audio_from_buffer(Marshalls.base64_to_raw(content.split(";")[2]))
+ set_transport_enabled(true)
+ showtape_loaded = true
+ $MenuBar/EditingLabel.text = "Editing: " + show_name
+ $ShowtapeLoadScreen/DialogPanel/InFilePath.text = ""
+ $ShowtapeLoadScreen.visible = false
+
+func _on_load_overwrite_confirmation_dialog_confirmed() -> void:
+ erase_all.emit()
+ $ShowtapeLoadScreen.visible = true
+
+
+func _on_showtape_save_out_browse_button_pressed() -> void:
+ $SaveShowtapeFileDialog.show()
+
+func _on_showtape_save_create_button_pressed() -> void:
+ var header = "UST,2,"+show_name.replace(",", "_").replace(";", "_")+","+stages_info[current_stage]["ust_type"]+";"
+ var data_out_string = save_data()
+ var file = FileAccess.open($ShowtapeSaveScreen/DialogPanel/OutFilePath.text, FileAccess.WRITE)
+ file.store_string(header+data_out_string+";"+Marshalls.raw_to_base64($AudioStreamPlayer.stream.data))
+ file.close()
+ $ShowtapeSaveScreen/DialogPanel/OutFilePath.text = ""
+ $ShowtapeSaveScreen.visible = false
+
+func _on_showtape_save_cancel_button_pressed() -> void:
+ $ShowtapeSaveScreen/DialogPanel/OutFilePath.text = ""
+ $ShowtapeSaveScreen.visible = false
+
+func _on_save_showtape_file_dialog_file_selected(path: String) -> void:
+ $ShowtapeSaveScreen/DialogPanel/OutFilePath.text = path
func _input(event: InputEvent) -> void:
if event.is_action_pressed("toggle_editor_screen"):
$CameraPreview.visible = !$CameraPreview.visible;
$CameraFullScreen.visible = !$CameraFullScreen.visible;
- elif event.is_action_pressed("sequencer_play_pause"):
- if (playing): _on_pause_button_pressed()
- else: _on_play_button_pressed()
- elif event.is_action_pressed("sequencer_play_reverse"):
- _on_play_backwards_button_pressed()
- elif event.is_action_pressed("sequencer_fast_reverse"):
- _on_fast_backwards_button_pressed()
- elif event.is_action_pressed("sequencer_fast_forward"):
- _on_fast_forward_button_pressed()
- elif event.is_action_pressed("sequencer_step_backward"):
- _on_step_backwards_button_pressed()
- elif event.is_action_pressed("sequencer_step_forward"):
- _on_step_forward_button_pressed()
- elif event.is_action_pressed("sequencer_home"):
- _on_stop_button_pressed()
+ if event.is_action_pressed("fullscreen"):
+ if (!fullscreen):
+ fullscreen = true
+ DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN)
+ else:
+ fullscreen = false
+ DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED)
+ if (event.is_action_pressed("cycle_camera_angle")):
+ cam_index += 1
+ get_node(stages_info[current_stage]["scene_ref_base"] + "Angle " + str((cam_index % stages_info[current_stage]["camera_count"])+1)).current = true
+ if (transport_enabled):
+ if event.is_action_pressed("sequencer_play_pause"):
+ if (playing): _on_pause_button_pressed()
+ else: _on_play_button_pressed()
+ elif event.is_action_pressed("sequencer_play_reverse"):
+ _on_play_backwards_button_pressed()
+ elif event.is_action_pressed("sequencer_fast_reverse"):
+ _on_fast_backwards_button_pressed()
+ elif event.is_action_pressed("sequencer_fast_forward"):
+ _on_fast_forward_button_pressed()
+ elif event.is_action_pressed("sequencer_step_backward"):
+ _on_step_backwards_button_pressed()
+ elif event.is_action_pressed("sequencer_step_forward"):
+ _on_step_forward_button_pressed()
+ elif event.is_action_pressed("sequencer_home"):
+ _on_stop_button_pressed()
func _physics_process(_delta: float) -> void:
- if (playing || recording):
+ if (playing):
step.emit(playback_rate)
index += playback_rate
if (index <= 0): _on_stop_button_pressed()
update_time_label()
+func load_audio(path: String) -> AudioStream:
+ var sound
+ match (path.split(".")[-1]):
+ "mp3":
+ sound = AudioStreamMP3.load_from_file(path)
+ "wav":
+ sound = AudioStreamWAV.load_from_file(path)
+ "ogg":
+ sound = AudioStreamOggVorbis.load_from_file(path)
+ return sound
+
+func load_audio_from_buffer(data: PackedByteArray) -> AudioStream:
+ var sound
+ match (data[0]):
+ 73:
+ sound = AudioStreamMP3.load_from_buffer(data)
+ 82:
+ sound = AudioStreamWAV.load_from_buffer(data)
+ 79:
+ sound = AudioStreamOggVorbis.load_from_buffer(data)
+ return sound
+
func _on_size_changed() -> void:
$SubViewport.size = $ColorRect.size
@@ -57,43 +782,77 @@ func _on_controls_button_pressed() -> void:
func _on_credits_button_pressed() -> void:
$CreditsScreen.visible = true
-func _on_controls_input_eater_pressed() -> void:
+func _on_input_eater_pressed() -> void:
$ControlsScreen.visible = false
-
-func _on_credits_input_eater_pressed() -> void:
$CreditsScreen.visible = false
+ $ShowtapeNewScreen.visible = false
+ $ShowtapeLoadScreen.visible = false
+ $ShowtapeSaveScreen.visible = false
func _on_v_scroll_bar_value_changed(value: float) -> void:
- $SequencerPanel/TimelinePanel/InvisibleMask/RowsHandle.position.y = value * -44
+ $SequencerPanel/TimelinePanel/InvisibleMask/MovementRowsContainer.position.y = value * -44
+
+func _on_flow_v_scroll_bar_value_changed(value: float) -> void:
+ $FlyoutPanel/FlowControls/InvisibleMask/FlowHandle.position.y = value * -44
+
+func _on_movement_v_scroll_bar_value_changed(value: float) -> void:
+ $FlyoutPanel/Movements/InvisibleMask/MovementHandle.position.y = value * -44
+
+func _on_cosmetics_v_scroll_bar_value_changed(value: float) -> void:
+ $FlyoutPanel/Cosmetics/InvisibleMask/CosmeticsHandle.position.y = value * -44
+
+func _erase_all() -> void:
+ playing = false
+ $AudioStreamPlayer.stop()
+ $AudioStreamPlayer.seek(0)
+ $SequencerPanel/TransportControls/RecordButton.button_pressed = false
+ index = 0
+ update_time_label()
+ show_name = ""
+ $AudioStreamPlayer.stream = null
+ set_transport_enabled(false)
+ showtape_loaded = false
+ $MenuBar/EditingLabel.text = "No showtape loaded."
+
+func _on_movements_flyout_button_toggled(toggled_on: bool) -> void:
+ $FlyoutPanel/Movements.visible = toggled_on
+
+func _on_flows_flyout_button_toggled(toggled_on: bool) -> void:
+ $FlyoutPanel/FlowControls.visible = toggled_on
+
+func _on_camera_flyout_button_toggled(toggled_on: bool) -> void:
+ $FlyoutPanel/Camera.visible = toggled_on
+
+func _on_cosmetics_flyout_button_toggled(toggled_on: bool) -> void:
+ $FlyoutPanel/Cosmetics.visible = toggled_on
func _on_play_button_pressed() -> void:
playback_rate = 1
+ $AudioStreamPlayer.pitch_scale = 1
+ $AudioStreamPlayer.play(float(index)/60.0)
playing = true
- recording = false
- end_recording.emit()
func _on_pause_button_pressed() -> void:
+ $AudioStreamPlayer.stop()
playing = false
- recording = false
- end_recording.emit()
func _on_play_backwards_button_pressed() -> void:
playback_rate = -1
+ $AudioStreamPlayer.stop() # cant play backwards :(
playing = true
- recording = false
- end_recording.emit()
+ $SequencerPanel/TransportControls/RecordButton.button_pressed = false
func _on_fast_backwards_button_pressed() -> void:
playback_rate = -2
+ $AudioStreamPlayer.stop() # cant play backwards :(
playing = true
- recording = false
- end_recording.emit()
+ $SequencerPanel/TransportControls/RecordButton.button_pressed = false
func _on_step_backwards_button_pressed() -> void:
playing = false
- recording = false
- end_recording.emit()
+ $AudioStreamPlayer.stop()
+ $SequencerPanel/TransportControls/RecordButton.button_pressed = false
if (index != 0):
step.emit(-1)
index -= 1
@@ -101,28 +860,88 @@ func _on_step_backwards_button_pressed() -> void:
func _on_fast_forward_button_pressed() -> void:
playback_rate = 2
+ $AudioStreamPlayer.pitch_scale = 2
+ $AudioStreamPlayer.play(float(index)/60.0)
playing = true
- recording = false
- end_recording.emit()
+ $SequencerPanel/TransportControls/RecordButton.button_pressed = false
func _on_step_forward_button_pressed() -> void:
playing = false
- recording = false
- end_recording.emit()
+ $AudioStreamPlayer.stop()
+ $SequencerPanel/TransportControls/RecordButton.button_pressed = false
step.emit(1)
index += 1
update_time_label()
-func _on_record_button_pressed() -> void:
- playback_rate = 1
- playing = false
- recording = true
- start_recording.emit()
+func _on_record_button_toggled(toggled_on: bool) -> void:
+ if (playing):
+ # starting recording while playing causes issues
+ _on_stop_button_pressed()
+ recording = toggled_on
+ if (toggled_on): start_recording.emit()
+ else: end_recording.emit()
func _on_stop_button_pressed() -> void:
playing = false
- recording = false
+ $AudioStreamPlayer.stop()
+ $AudioStreamPlayer.seek(0)
+ $SequencerPanel/TransportControls/RecordButton.button_pressed = false
index = 0
- end_recording.emit()
return_to_zero.emit()
update_time_label()
+
+func save_data() -> String:
+ var write_out : String = ""
+ var temp_data = {}
+ var longest_channel = 0
+ for movement_row in $SequencerPanel/TimelinePanel/InvisibleMask/MovementRowsContainer.get_children():
+ temp_data[movement_row.movement_bit] = movement_row.movements
+ if (movement_row.movements.size() > longest_channel): longest_channel = movement_row.movements.size()
+ for i in range(longest_channel+1):
+ var total_frame_index = 1
+ var fstring = ""
+ for j in range(64):
+ var f_quartet = 0
+ for k in range(4):
+ if (index_get_safe(i, index_s_get_safe(total_frame_index, temp_data))):
+ f_quartet += int(pow(2, k))
+ total_frame_index += 1
+ fstring = ("%01X" % f_quartet) + fstring
+ write_out += fstring + ","
+ return write_out
+
+func plot_data(data: String):
+ start_recording.emit()
+ var evil_glass = []
+ for movement_row in $SequencerPanel/TimelinePanel/InvisibleMask/MovementRowsContainer.get_children():
+ evil_glass.append(movement_row.movement_bit)
+ for frame_string in data.split(","):
+ if (frame_string == ""): continue
+ var check_frame_split = frame_string.split()
+ check_frame_split.reverse()
+ for i in stages_info[current_stage]["bit_mapping"]:
+ var er = false
+ if ((check_frame_split[(i - 1) / 4].hex_to_int() & int(pow(2, ((i - 1) % 4)))) == int(pow(2, ((i - 1) % 4)))):
+ er = true
+ $SequencerPanel/TimelinePanel/InvisibleMask/MovementRowsContainer.get_child(evil_glass.find(i)).forced_etchable = true
+ $SequencerPanel/TimelinePanel/InvisibleMask/MovementRowsContainer.get_child(evil_glass.find(i)).etching = er
+ step.emit(1)
+ for movement_row in $SequencerPanel/TimelinePanel/InvisibleMask/MovementRowsContainer.get_children():
+ movement_row.forced_etchable = false
+ movement_row.etching = false
+ end_recording.emit()
+ return_to_zero.emit()
+
+func index_get_safe(cindex: int, data: Array[bool]) -> bool:
+ if (cindex > data.size()-1): return false
+ if (cindex < 0): return false
+ var out = data.get(cindex)
+ if (out == null): return false
+ return out
+
+func index_s_get_safe(cindex: int, data: Dictionary) -> Array[bool]:
+ if (cindex > data.size()-1): return [ false ]
+ if (cindex < 0): return [ false ]
+ var out = data.get(cindex)
+ if (out == null): return [ false ]
+ return out
diff --git a/Scripts/FlowControl.gd b/Scripts/FlowControl.gd
new file mode 100644
index 0000000..66de06e
--- /dev/null
+++ b/Scripts/FlowControl.gd
@@ -0,0 +1,21 @@
+extends Control
+
+@export var in_value : float = 1.0
+@export var out_value : float = 1.0
+@export var vis_name : String = ""
+
+signal in_value_updated(new_value: float)
+signal out_value_updated(new_value: float)
+
+func _ready() -> void:
+ $Panel/Label.text = self.vis_name
+ $Panel/InStepper.value = self.in_value
+ $Panel/OutStepper.value = self.out_value
+
+func _on_in_stepper_value_changed(value: float) -> void:
+ self.in_value = value
+ in_value_updated.emit(value)
+
+func _on_out_stepper_value_changed(value: float) -> void:
+ self.out_value = value
+ out_value_updated.emit(value)
diff --git a/Scripts/FlowSlider.gd.uid b/Scripts/FlowControl.gd.uid
similarity index 100%
rename from Scripts/FlowSlider.gd.uid
rename to Scripts/FlowControl.gd.uid
diff --git a/Scripts/FlowSlider.gd b/Scripts/FlowSlider.gd
deleted file mode 100644
index 3bc2838..0000000
--- a/Scripts/FlowSlider.gd
+++ /dev/null
@@ -1,13 +0,0 @@
-extends Control
-
-@export var value : float = 1.0
-
-signal value_updated(new_value: float)
-
-func _ready() -> void:
- $Panel/Slider.value = self.value
-
-func _on_slider_value_changed(value: float) -> void:
- self.value = $Panel/Slider.value
- $Panel/ValueLabel.text = str(self.value)
- value_updated.emit(value)
diff --git a/Scripts/HelenHouseFlyout.gd b/Scripts/HelenHouseFlyout.gd
deleted file mode 100644
index eab8222..0000000
--- a/Scripts/HelenHouseFlyout.gd
+++ /dev/null
@@ -1,178 +0,0 @@
-extends Control
-
-signal movement_in(movement, rate)
-signal movement_out(movement, rate)
-
-var cam_index : int = 0
-
-func _ready() -> void:
- var animatronic = get_node("../SubViewport/HelenHouse/3stHelen")
- movement_in.connect(animatronic._movement_in)
- movement_out.connect(animatronic._movement_out)
- movement_in.connect(self._movement_in)
- movement_out.connect(self._movement_out)
-
-func _input(event: InputEvent) -> void:
- if (event.is_action_pressed("cycle_camera_angle")):
- cam_index += 1
- get_node("../SubViewport/HelenHouse/Camera " + str((cam_index % 2)+1)).current = true
-
-func _movement_in(movement, _rate):
- get_node("Movements/IndicatorLights/" + movement).turn_on();
-
-func _movement_out(movement, _rate):
- get_node("Movements/IndicatorLights/" + movement).turn_off();
-
-func _on_movements_flyout_button_toggled(toggled_on: bool) -> void:
- $Movements.visible = toggled_on
-
-func _on_flows_flyout_button_toggled(toggled_on: bool) -> void:
- $FlowControls.visible = toggled_on
-
-func _on_camera_flyout_button_toggled(toggled_on: bool) -> void:
- $Camera.visible = toggled_on
-
-func _on_cosmetics_flyout_button_toggled(toggled_on: bool) -> void:
- $Cosmetics.visible = toggled_on
-
-func _on_stage_flyout_button_toggled(toggled_on: bool) -> void:
- $Stage.visible = toggled_on
-
-func _on_angle_1_button_pressed() -> void:
- get_node("../SubViewport/HelenHouse/Camera 1").current = true
-
-func _on_angle_2_button_pressed() -> void:
- get_node("../SubViewport/HelenHouse/Camera 2").current = true
-
-
-func _on_mouth_button_down() -> void:
- movement_in.emit("Mouth", $FlowControls/InFlows/MouthFlow.value)
-
-func _on_mouth_button_up() -> void:
- movement_out.emit("Mouth", $FlowControls/OutFlows/MouthFlow.value)
-
-
-func _on_left_ear_button_down() -> void:
- movement_in.emit("Left Ear", $FlowControls/InFlows/LeftEarFlow.value)
-
-func _on_left_ear_button_up() -> void:
- movement_out.emit("Left Ear", $FlowControls/OutFlows/LeftEarFlow.value)
-
-
-func _on_right_ear_button_down() -> void:
- movement_in.emit("Right Ear", $FlowControls/InFlows/RightEarFlow.value)
-
-func _on_right_ear_button_up() -> void:
- movement_out.emit("Right Ear", $FlowControls/OutFlows/RightEarFlow.value)
-
-
-func _on_left_eyelid_button_down() -> void:
- movement_in.emit("Left Eyelid", $FlowControls/InFlows/LeftEyelidFlow.value)
-
-func _on_left_eyelid_button_up() -> void:
- movement_out.emit("Left Eyelid", $FlowControls/OutFlows/LeftEyelidFlow.value)
-
-
-func _on_right_eyelid_button_down() -> void:
- movement_in.emit("Right Eyelid", $FlowControls/InFlows/RightEyelidFlow.value)
-
-func _on_right_eyelid_button_up() -> void:
- movement_out.emit("Right Eyelid", $FlowControls/OutFlows/RightEyelidFlow.value)
-
-
-func _on_eyes_left_button_down() -> void:
- movement_in.emit("Eyes Left", $FlowControls/InFlows/EyesLeftFlow.value)
-
-func _on_eyes_left_button_up() -> void:
- movement_out.emit("Eyes Left", $FlowControls/OutFlows/EyesLeftFlow.value)
-
-
-func _on_eyes_right_button_down() -> void:
- movement_in.emit("Eyes Right", $FlowControls/InFlows/EyesRightFlow.value)
-
-func _on_eyes_right_button_up() -> void:
- movement_out.emit("Eyes Right", $FlowControls/OutFlows/EyesRightFlow.value)
-
-
-func _on_head_left_button_down() -> void:
- movement_in.emit("Head Left", $FlowControls/InFlows/HeadLeftFlow.value)
-
-func _on_head_left_button_up() -> void:
- movement_out.emit("Head Left", $FlowControls/OutFlows/HeadLeftFlow.value)
-
-
-func _on_head_right_button_down() -> void:
- movement_in.emit("Head Right", $FlowControls/InFlows/HeadRightFlow.value)
-
-func _on_head_right_button_up() -> void:
- movement_out.emit("Head Right", $FlowControls/OutFlows/HeadRightFlow.value)
-
-
-func _on_head_up_button_down() -> void:
- movement_in.emit("Head Up", $FlowControls/InFlows/HeadUpFlow.value)
-
-func _on_head_up_button_up() -> void:
- movement_out.emit("Head Up", $FlowControls/OutFlows/HeadUpFlow.value)
-
-
-func _on_left_arm_up_button_down() -> void:
- movement_in.emit("Left Arm Up", $FlowControls/InFlows/LeftArmUpFlow.value)
-
-func _on_left_arm_up_button_up() -> void:
- movement_out.emit("Left Arm Up", $FlowControls/OutFlows/LeftArmUpFlow.value)
-
-
-func _on_left_arm_twist_button_down() -> void:
- movement_in.emit("Left Arm Twist", $FlowControls/InFlows/LeftArmTwistFlow.value)
-
-func _on_left_arm_twist_button_up() -> void:
- movement_out.emit("Left Arm Twist", $FlowControls/OutFlows/LeftArmTwistFlow.value)
-
-
-func _on_left_elbow_button_down() -> void:
- movement_in.emit("Left Elbow", $FlowControls/InFlows/LeftElbowFlow.value)
-
-func _on_left_elbow_button_up() -> void:
- movement_out.emit("Left Elbow", $FlowControls/OutFlows/LeftElbowFlow.value)
-
-
-func _on_right_arm_up_button_down() -> void:
- movement_in.emit("Right Arm Up", $FlowControls/InFlows/RightArmUpFlow.value)
-
-func _on_right_arm_up_button_up() -> void:
- movement_out.emit("Right Arm Up", $FlowControls/OutFlows/RightArmUpFlow.value)
-
-
-func _on_right_arm_twist_button_down() -> void:
- movement_in.emit("Right Arm Twist", $FlowControls/InFlows/RightArmTwistFlow.value)
-
-func _on_right_arm_twist_button_up() -> void:
- movement_out.emit("Right Arm Twist", $FlowControls/OutFlows/RightArmTwistFlow.value)
-
-
-func _on_right_elbow_button_down() -> void:
- movement_in.emit("Right Elbow", $FlowControls/InFlows/RightElbowFlow.value)
-
-func _on_right_elbow_button_up() -> void:
- movement_out.emit("Right Elbow", $FlowControls/OutFlows/RightElbowFlow.value)
-
-
-func _on_body_left_button_down() -> void:
- movement_in.emit("Body Left", $FlowControls/InFlows/BodyLeftFlow.value)
-
-func _on_body_left_button_up() -> void:
- movement_out.emit("Body Left", $FlowControls/OutFlows/BodyLeftFlow.value)
-
-
-func _on_body_right_button_down() -> void:
- movement_in.emit("Body Right", $FlowControls/InFlows/BodyRightFlow.value)
-
-func _on_body_right_button_up() -> void:
- movement_out.emit("Body Right", $FlowControls/OutFlows/BodyRightFlow.value)
-
-
-func _on_body_lean_button_down() -> void:
- movement_in.emit("Body Lean", $FlowControls/InFlows/BodyLeanFlow.value)
-
-func _on_body_lean_button_up() -> void:
- movement_out.emit("Body Lean", $FlowControls/OutFlows/BodyLeanFlow.value)
diff --git a/Scripts/HelenHouseFlyout.gd.uid b/Scripts/HelenHouseFlyout.gd.uid
deleted file mode 100644
index c95620b..0000000
--- a/Scripts/HelenHouseFlyout.gd.uid
+++ /dev/null
@@ -1 +0,0 @@
-uid://bh512bgpm0kj7
diff --git a/Scripts/IndicatorLight.gd b/Scripts/IndicatorLight.gd
deleted file mode 100644
index bbf57ae..0000000
--- a/Scripts/IndicatorLight.gd
+++ /dev/null
@@ -1,22 +0,0 @@
-extends Control
-
-@export var on: bool = false
-
-func _ready() -> void:
- $Green.visible = self.on
-
-func turn_on() -> void:
- self.on = true
- $Green.visible = self.on
-
-func turn_off() -> void:
- self.on = false
- $Green.visible = self.on
-
-func toggle() -> void:
- self.on = !self.on
- $Green.visible = self.on
-
-func set_state(value: bool) -> void:
- self.on = value
- $Green.visible = self.on
diff --git a/Scripts/LightController.gd b/Scripts/LightController.gd
new file mode 100644
index 0000000..b5dc91d
--- /dev/null
+++ b/Scripts/LightController.gd
@@ -0,0 +1,7 @@
+extends Node3D
+
+func _movement_in(movement, _rate):
+ get_node(movement).visible = true
+
+func _movement_out(movement, _rate):
+ get_node(movement).visible = false
diff --git a/Scripts/LightController.gd.uid b/Scripts/LightController.gd.uid
new file mode 100644
index 0000000..2a8204c
--- /dev/null
+++ b/Scripts/LightController.gd.uid
@@ -0,0 +1 @@
+uid://d1p4ite8ts2wi
diff --git a/Scripts/MovementButton.gd b/Scripts/MovementButton.gd
new file mode 100644
index 0000000..2e7e1c5
--- /dev/null
+++ b/Scripts/MovementButton.gd
@@ -0,0 +1,41 @@
+extends Control
+
+signal movement_in(movement, rate)
+signal movement_out(movement, rate)
+
+@export var animatronic : String
+@export var movement_bit : int
+@export var current_stage : String
+@export var base_scene_path : String
+@export var flow_path : String = "../../../../../FlyoutPanel/FlowControls/InvisibleMask/FlowHandle/"
+@export var movement_name : String
+
+var in_flow : float = 1.0
+var out_flow : float = 1.0
+
+func _ready() -> void:
+ $Panel/Button.text = animatronic + " " + movement_name
+ if (animatronic != "None"):
+ var animatronic_node = get_node(base_scene_path + animatronic)
+ movement_in.connect(animatronic_node._movement_in)
+ movement_out.connect(animatronic_node._movement_out)
+ if (flow_path != "None"):
+ var flow_control = get_node(flow_path + str(movement_bit) + animatronic + movement_name + current_stage)
+ flow_control.in_value_updated.connect(self._update_in_flow)
+ flow_control.out_value_updated.connect(self._update_out_flow)
+ in_flow = flow_control.in_value
+ out_flow = flow_control.out_value
+
+func _update_in_flow(new_value: float) -> void:
+ in_flow = new_value
+
+func _update_out_flow(new_value: float) -> void:
+ out_flow = new_value
+
+func _on_button_button_down() -> void:
+ movement_in.emit(movement_name, in_flow)
+ $Panel/IndicatorPanel/Green.visible = true
+
+func _on_button_button_up() -> void:
+ movement_out.emit(movement_name, out_flow)
+ $Panel/IndicatorPanel/Green.visible = false
diff --git a/Scripts/IndicatorLight.gd.uid b/Scripts/MovementButton.gd.uid
similarity index 100%
rename from Scripts/IndicatorLight.gd.uid
rename to Scripts/MovementButton.gd.uid
diff --git a/Scripts/MovementRow.gd b/Scripts/MovementRow.gd
index 1f42439..b02c8c3 100644
--- a/Scripts/MovementRow.gd
+++ b/Scripts/MovementRow.gd
@@ -2,9 +2,13 @@ extends Panel
@export var movement_bit : int = 0
@export var movement_name : String = "Name"
-@export var flow_path : String = "../../../../../../HelenHouseFlyout/FlowControls/"
-@export var animatronic_path : String = "../../../../../../SubViewport/HelenHouse/3stHelen"
+@export var flow_path : String = "../../../../../FlyoutPanel/FlowControls/InvisibleMask/FlowHandle/"
+@export var base_scene_path : String
+@export var current_stage : String
+@export var animatronic : String
@export var movements : Array[bool]
+@export var etching: bool = false
+@export var forced_etchable: bool = false
var in_flow : float = 1.0
var out_flow : float = 1.0
@@ -14,7 +18,6 @@ var current_index : int = 0
var binding : bool = false
var held_on_previous_frame : bool = false
var playback_held_on_previous_frame : bool = false
-var etching: bool = false
var recording : bool = false
var playing : bool = true
var current_block_indicator
@@ -53,8 +56,12 @@ func check_at_index(cindex: int) -> bool:
if (out == null): return false
return out
+func check_if_erasing() -> bool:
+ if (forced_etchable): return true
+ return (!$LockButton.button_pressed) && key_binding.keycode != 0
+
func _step(amount: int):
- if (recording):
+ if (recording && check_if_erasing()):
if (etching): set_at_current()
else: unset_at_current()
if (playing):
@@ -74,6 +81,10 @@ func _return_to_zero():
$MovementsBG/InvisibleMask/MovementsHandle.position.x = 120
movement_out.emit(movement_name, out_flow)
+func _erase_all() -> void:
+ _return_to_zero()
+ _on_clear_button_pressed()
+
func _start_recording():
recording = true
@@ -87,7 +98,8 @@ func _end_playback():
playing = false
func update_text() -> void:
- $Button.text = "%d - %s (%s)" % [movement_bit, movement_name, key_binding.as_text() if key_binding.keycode != 0 else "Unbound"]
+ if (animatronic == "None"): $Button.text = "%d - Unused (%s)" % [movement_bit, key_binding.as_text() if key_binding.keycode != 0 else "Unbound"]
+ else: $Button.text = "%d - %s %s (%s)" % [movement_bit, animatronic, movement_name, key_binding.as_text() if key_binding.keycode != 0 else "Unbound"]
func _update_in_flow(new_value: float) -> void:
in_flow = new_value
@@ -96,28 +108,29 @@ func _update_out_flow(new_value: float) -> void:
out_flow = new_value
func _ready() -> void:
- var animatronic = get_node(animatronic_path)
if (flow_path != "None"):
- var if_node = get_node(flow_path + "InFlows/" + movement_name.replace(" ", "") + "Flow")
- var of_node = get_node(flow_path + "OutFlows/" + movement_name.replace(" ", "") + "Flow")
- if_node.value_updated.connect(self._update_in_flow)
- of_node.value_updated.connect(self._update_out_flow)
- in_flow = if_node.value
- out_flow = of_node.value
- movement_in.connect(animatronic._movement_in)
- movement_out.connect(animatronic._movement_out)
+ var flow_control = get_node(flow_path + str(movement_bit) + animatronic + movement_name + current_stage)
+ flow_control.in_value_updated.connect(self._update_in_flow)
+ flow_control.out_value_updated.connect(self._update_out_flow)
+ in_flow = flow_control.in_value
+ out_flow = flow_control.out_value
+ if (animatronic != "None"):
+ var animatronic_node = get_node(base_scene_path + animatronic)
+ movement_in.connect(animatronic_node._movement_in)
+ movement_out.connect(animatronic_node._movement_out)
movement_in.connect(self._movement_in)
movement_out.connect(self._movement_out)
- var editor = get_node("../../../../../../")
+ var editor = get_node("../../../../../")
editor.step.connect(_step)
editor.start_recording.connect(_start_recording)
editor.end_recording.connect(_end_recording)
editor.return_to_zero.connect(_return_to_zero)
+ editor.erase_all.connect(_erase_all)
current_block_indicator = load("res://Scenes/GUI/Controls/MovementFrameIndicatorOff.tscn").instantiate()
update_text()
func _process(_delta: float) -> void:
- if (binding): return
+ if (binding || key_binding.keycode == 0): return
if (Input.is_key_pressed(key_binding.keycode)):
if (!held_on_previous_frame):
movement_in.emit(movement_name, in_flow)
@@ -154,3 +167,10 @@ func _input(event: InputEvent) -> void:
binding = false
update_text()
return
+
+func _on_clear_button_pressed() -> void:
+ if ($LockButton.button_pressed): return
+ movements = []
+ for indicator in $MovementsBG/InvisibleMask/MovementsHandle.get_children():
+ indicator.queue_free()
+ current_block_indicator = load("res://Scenes/GUI/Controls/MovementFrameIndicatorOff.tscn").instantiate()
diff --git a/Stages.md b/Stages.md
index 12731bd..8acdca4 100644
--- a/Stages.md
+++ b/Stages.md
@@ -2,7 +2,13 @@
## Currently in game
- - Helen House (not a real stage)
+ - Helen House (homemade stage)
+ - Chuck E's Corner (homemade stage)
+
+## In Development
+
+ - Balcony Stage
+ - Prototype Road Stage
## Planned
@@ -10,7 +16,6 @@
- Portrait Stage
- Shelf Stage (Portrait stage with Balcony mechs)
- - Balcony Stage
- C Stage
- Rocker Stage
- Road Stage
diff --git a/UI/BlankCam.png b/UI/BlankCam.png
index ee39acd..822a25f 100644
Binary files a/UI/BlankCam.png and b/UI/BlankCam.png differ
diff --git a/UI/PneumaticPlaything.icon/Assets/cylinder.svg b/UI/PneumaticPlaything.icon/Assets/cylinder.svg
new file mode 100644
index 0000000..d6749de
--- /dev/null
+++ b/UI/PneumaticPlaything.icon/Assets/cylinder.svg
@@ -0,0 +1,87 @@
+
+
+
+
diff --git a/UI/icon.svg.import b/UI/PneumaticPlaything.icon/Assets/cylinder.svg.import
similarity index 70%
rename from UI/icon.svg.import
rename to UI/PneumaticPlaything.icon/Assets/cylinder.svg.import
index 6fc4cc8..5c56810 100644
--- a/UI/icon.svg.import
+++ b/UI/PneumaticPlaything.icon/Assets/cylinder.svg.import
@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
-uid="uid://bm61nhm3rs043"
-path="res://.godot/imported/icon.svg-c9c2a32fd2d5f8bc98ecd887f02eeda7.ctex"
+uid="uid://1eluxvmnj7l7"
+path="res://.godot/imported/cylinder.svg-7c12310ad8fca6e1f959909a64d6d065.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://UI/icon.svg"
-dest_files=["res://.godot/imported/icon.svg-c9c2a32fd2d5f8bc98ecd887f02eeda7.ctex"]
+source_file="res://UI/PneumaticPlaything.icon/Assets/cylinder.svg"
+dest_files=["res://.godot/imported/cylinder.svg-7c12310ad8fca6e1f959909a64d6d065.ctex"]
[params]
diff --git a/UI/PneumaticPlaything.icon/Assets/green_lines.svg b/UI/PneumaticPlaything.icon/Assets/green_lines.svg
new file mode 100644
index 0000000..ce9309e
--- /dev/null
+++ b/UI/PneumaticPlaything.icon/Assets/green_lines.svg
@@ -0,0 +1,69 @@
+
+
+
+
diff --git a/UI/PneumaticPlaything.icon/Assets/green_lines.svg.import b/UI/PneumaticPlaything.icon/Assets/green_lines.svg.import
new file mode 100644
index 0000000..6881607
--- /dev/null
+++ b/UI/PneumaticPlaything.icon/Assets/green_lines.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dkg2eh0tfbji4"
+path="res://.godot/imported/green_lines.svg-af1cb631137e1105ee7be8775d8a5016.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://UI/PneumaticPlaything.icon/Assets/green_lines.svg"
+dest_files=["res://.godot/imported/green_lines.svg-af1cb631137e1105ee7be8775d8a5016.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/UI/PneumaticPlaything.icon/icon.json b/UI/PneumaticPlaything.icon/icon.json
new file mode 100644
index 0000000..1b2358d
--- /dev/null
+++ b/UI/PneumaticPlaything.icon/icon.json
@@ -0,0 +1,68 @@
+{
+ "fill" : {
+ "automatic-gradient" : "srgb:0.12984,0.12985,0.12984,1.00000"
+ },
+ "groups" : [
+ {
+ "layers" : [
+ {
+ "blend-mode" : "normal",
+ "fill" : {
+ "automatic-gradient" : "srgb:1.00000,1.00000,1.00000,1.00000"
+ },
+ "glass" : true,
+ "image-name" : "cylinder.svg",
+ "name" : "cylinder",
+ "position" : {
+ "scale" : 3,
+ "translation-in-points" : [
+ 0,
+ 0
+ ]
+ }
+ }
+ ],
+ "shadow" : {
+ "kind" : "neutral",
+ "opacity" : 0.5
+ },
+ "translucency" : {
+ "enabled" : true,
+ "value" : 0.5
+ }
+ },
+ {
+ "layers" : [
+ {
+ "fill" : {
+ "automatic-gradient" : "srgb:0.00000,0.97680,0.00000,1.00000"
+ },
+ "image-name" : "green_lines.svg",
+ "name" : "green_lines",
+ "opacity" : 1,
+ "position" : {
+ "scale" : 3.4,
+ "translation-in-points" : [
+ 0,
+ 0
+ ]
+ }
+ }
+ ],
+ "shadow" : {
+ "kind" : "neutral",
+ "opacity" : 0.5
+ },
+ "translucency" : {
+ "enabled" : true,
+ "value" : 0.5
+ }
+ }
+ ],
+ "supported-platforms" : {
+ "circles" : [
+ "watchOS"
+ ],
+ "squares" : "shared"
+ }
+}
\ No newline at end of file
diff --git a/UI/SmallLock.png b/UI/SmallLock.png
new file mode 100644
index 0000000..b5bc9f0
Binary files /dev/null and b/UI/SmallLock.png differ
diff --git a/UI/SmallLock.png.import b/UI/SmallLock.png.import
new file mode 100644
index 0000000..ea363c7
--- /dev/null
+++ b/UI/SmallLock.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://d007317123e27"
+path="res://.godot/imported/SmallLock.png-0c9e5ce04a7421f0922124b2fb1d8696.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://UI/SmallLock.png"
+dest_files=["res://.godot/imported/SmallLock.png-0c9e5ce04a7421f0922124b2fb1d8696.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/UI/SmallX.png b/UI/SmallX.png
new file mode 100644
index 0000000..157eba5
Binary files /dev/null and b/UI/SmallX.png differ
diff --git a/UI/SmallX.png.import b/UI/SmallX.png.import
new file mode 100644
index 0000000..7b9fa19
--- /dev/null
+++ b/UI/SmallX.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cn5xdrxdv622h"
+path="res://.godot/imported/SmallX.png-fca237bd1b13d37241a1ac9e982c446b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://UI/SmallX.png"
+dest_files=["res://.godot/imported/SmallX.png-fca237bd1b13d37241a1ac9e982c446b.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/UI/icon-32px.png b/UI/icon-32px.png
new file mode 100644
index 0000000..16574f1
Binary files /dev/null and b/UI/icon-32px.png differ
diff --git a/UI/icon-32px.png.import b/UI/icon-32px.png.import
new file mode 100644
index 0000000..6250137
--- /dev/null
+++ b/UI/icon-32px.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bpb3xn54kpxoe"
+path="res://.godot/imported/icon-32px.png-601da436f7467fcd6c395054742650f3.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://UI/icon-32px.png"
+dest_files=["res://.godot/imported/icon-32px.png-601da436f7467fcd6c395054742650f3.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/UI/icon-round.png b/UI/icon-round.png
new file mode 100644
index 0000000..fdbbf6c
Binary files /dev/null and b/UI/icon-round.png differ
diff --git a/UI/icon-round.png.import b/UI/icon-round.png.import
new file mode 100644
index 0000000..5f55748
--- /dev/null
+++ b/UI/icon-round.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://yqg6bh2fiumf"
+path="res://.godot/imported/icon-round.png-d13b0f9c2aed0f892b01044430866017.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://UI/icon-round.png"
+dest_files=["res://.godot/imported/icon-round.png-d13b0f9c2aed0f892b01044430866017.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/UI/icon.icns b/UI/icon.icns
new file mode 100644
index 0000000..cf6eb7e
Binary files /dev/null and b/UI/icon.icns differ
diff --git a/UI/icon.ico b/UI/icon.ico
new file mode 100644
index 0000000..59409c5
Binary files /dev/null and b/UI/icon.ico differ
diff --git a/UI/icon.png b/UI/icon.png
index 9886d6f..fc311ca 100644
Binary files a/UI/icon.png and b/UI/icon.png differ
diff --git a/UI/icon.png.import b/UI/icon.png.import
index 1fbd3b0..10cbd4d 100644
--- a/UI/icon.png.import
+++ b/UI/icon.png.import
@@ -2,7 +2,7 @@
importer="texture"
type="CompressedTexture2D"
-uid="uid://dkbo8r6il5rh7"
+uid="uid://cnvfrr028730a"
path="res://.godot/imported/icon.png-d44ad423496976af115f803f6386bc82.ctex"
metadata={
"vram_texture": false
diff --git a/UI/icon.svg b/UI/icon.svg
deleted file mode 100644
index e472c8b..0000000
--- a/UI/icon.svg
+++ /dev/null
@@ -1,344 +0,0 @@
-
-
-
-
diff --git a/project.godot b/project.godot
index 267d7c8..4b8bb8c 100644
--- a/project.godot
+++ b/project.godot
@@ -11,19 +11,327 @@ config_version=5
[application]
config/name="Pneumatic Plaything"
-config/version="v0.2"
+config/version="v0.6"
run/main_scene="uid://oiehbor0dlqx"
config/features=PackedStringArray("4.4", "GL Compatibility")
boot_splash/show_image=false
-config/icon="uid://bm61nhm3rs043"
+config/icon="uid://cnvfrr028730a"
+config/macos_native_icon="res://UI/icon.icns"
+config/windows_native_icon="res://UI/icon.ico"
[display]
window/size/viewport_width=1280
window/size/viewport_height=720
+[filesystem]
+
+import/blender/enabled=false
+
[input]
+ui_accept={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194309,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194310,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+]
+}
+ui_select={
+"deadzone": 0.5,
+"events": []
+}
+ui_cancel={
+"deadzone": 0.5,
+"events": []
+}
+ui_focus_next={
+"deadzone": 0.5,
+"events": []
+}
+ui_focus_prev={
+"deadzone": 0.5,
+"events": []
+}
+ui_left={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194319,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":13,"pressure":0.0,"pressed":false,"script":null)
+]
+}
+ui_right={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194321,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":14,"pressure":0.0,"pressed":false,"script":null)
+]
+}
+ui_up={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194320,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":11,"pressure":0.0,"pressed":false,"script":null)
+]
+}
+ui_down={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194322,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":12,"pressure":0.0,"pressed":false,"script":null)
+]
+}
+ui_page_up={
+"deadzone": 0.5,
+"events": []
+}
+ui_page_down={
+"deadzone": 0.5,
+"events": []
+}
+ui_home={
+"deadzone": 0.5,
+"events": []
+}
+ui_end={
+"deadzone": 0.5,
+"events": []
+}
+ui_cut={
+"deadzone": 0.5,
+"events": []
+}
+ui_copy={
+"deadzone": 0.5,
+"events": []
+}
+ui_paste={
+"deadzone": 0.5,
+"events": []
+}
+ui_undo={
+"deadzone": 0.5,
+"events": []
+}
+ui_redo={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_completion_query={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_completion_accept={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_completion_replace={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_newline={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_newline_blank={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_newline_above={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_indent={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_dedent={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_backspace_word={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_backspace_word.macos={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_backspace_all_to_left.macos={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_delete_word={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_delete_word.macos={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_delete_all_to_right.macos={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_caret_left={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_caret_word_left={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_caret_word_left.macos={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_caret_right={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_caret_word_right={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_caret_word_right.macos={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_caret_up={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_caret_down={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_caret_line_start={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_caret_line_start.macos={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_caret_line_end={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_caret_line_end.macos={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_caret_page_up={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_caret_page_down={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_caret_document_start={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_caret_document_start.macos={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_caret_document_end={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_caret_document_end.macos={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_caret_add_below={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_caret_add_below.macos={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_caret_add_above={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_caret_add_above.macos={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_scroll_up={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_scroll_up.macos={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_scroll_down={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_scroll_down.macos={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_select_all={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_select_word_under_caret={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_select_word_under_caret.macos={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_add_selection_for_next_occurrence={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_skip_selection_for_next_occurrence={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_clear_carets_and_selection={
+"deadzone": 0.5,
+"events": []
+}
+ui_text_toggle_insert_mode={
+"deadzone": 0.5,
+"events": []
+}
+ui_menu={
+"deadzone": 0.5,
+"events": []
+}
+ui_unicode_start={
+"deadzone": 0.5,
+"events": []
+}
+ui_graph_duplicate={
+"deadzone": 0.5,
+"events": []
+}
+ui_graph_delete={
+"deadzone": 0.5,
+"events": []
+}
+ui_filedialog_up_one_level={
+"deadzone": 0.5,
+"events": []
+}
+ui_filedialog_refresh={
+"deadzone": 0.5,
+"events": []
+}
+ui_filedialog_show_hidden={
+"deadzone": 0.5,
+"events": []
+}
+ui_swap_input_direction={
+"deadzone": 0.5,
+"events": []
+}
toggle_editor_screen={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194305,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
@@ -78,9 +386,17 @@ sequencer_home={
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":2,"pressure":0.0,"pressed":false,"script":null)
]
}
+fullscreen={
+"deadzone": 0.2,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194342,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194309,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+]
+}
[rendering]
renderer/rendering_method="gl_compatibility"
renderer/rendering_method.mobile="gl_compatibility"
textures/vram_compression/import_etc2_astc=true
+limits/opengl/max_renderable_lights=128
+limits/opengl/max_lights_per_object=128