diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..f28239b
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,4 @@
+root = true
+
+[*]
+charset = utf-8
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..8ad74f7
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,2 @@
+# Normalize EOL for all files that Git considers text files.
+* text=auto eol=lf
diff --git a/LICENSE b/LICENSE
index cb9c905..8ff9a07 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
MIT License
-Copyright (c) 2025 kawaiizenbo
+Copyright (c) 2025 Persephone (KawaiiZenbo) Bubblegum-Holiday
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
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 56%
rename from Models/3stHelen_beak.png.import
rename to Models/3-Stage/3stHelen_beak.png.import
index c7dc48c..8788f58 100644
--- a/Models/3stHelen_beak.png.import
+++ b/Models/3-Stage/3stHelen_beak.png.import
@@ -3,9 +3,10 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://bprmuf7jpffy3"
-path.s3tc="res://.godot/imported/3stHelen_beak.png-da72f62ca7ac7e5bf5593b4d1be3a7ee.s3tc.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"],
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
generator_parameters={
@@ -14,8 +15,8 @@ generator_parameters={
[deps]
-source_file="res://Models/3stHelen_beak.png"
-dest_files=["res://.godot/imported/3stHelen_beak.png-da72f62ca7ac7e5bf5593b4d1be3a7ee.s3tc.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 56%
rename from Models/3stHelen_shoes.png.import
rename to Models/3-Stage/3stHelen_shoes.png.import
index 7fa6728..ade3f95 100644
--- a/Models/3stHelen_shoes.png.import
+++ b/Models/3-Stage/3stHelen_shoes.png.import
@@ -3,9 +3,10 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://cm8h5o5urcvym"
-path.s3tc="res://.godot/imported/3stHelen_shoes.png-97c060c3fc3442bff6f75c94bc90506a.s3tc.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"],
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
generator_parameters={
@@ -14,8 +15,8 @@ generator_parameters={
[deps]
-source_file="res://Models/3stHelen_shoes.png"
-dest_files=["res://.godot/imported/3stHelen_shoes.png-97c060c3fc3442bff6f75c94bc90506a.s3tc.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/ChuckEsCorner/ChuckEsCornerStage.glb.import b/Models/ChuckEsCorner/ChuckEsCornerStage.glb.import
new file mode 100644
index 0000000..94fd5f3
--- /dev/null
+++ b/Models/ChuckEsCorner/ChuckEsCornerStage.glb.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://bv66hlbvtekho"
+path="res://.godot/imported/ChuckEsCornerStage.glb-972590d495adda7be8c93e6d0989aa24.scn"
+
+[deps]
+
+source_file="res://Models/ChuckEsCorner/ChuckEsCornerStage.glb"
+dest_files=["res://.godot/imported/ChuckEsCornerStage.glb-972590d495adda7be8c93e6d0989aa24.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/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/Chuck.fbx.import b/Models/Cyberamics/Cyberamic Chuck.glb.import
similarity index 63%
rename from Models/Chuck.fbx.import
rename to Models/Cyberamics/Cyberamic Chuck.glb.import
index fee6fc1..faf11ce 100644
--- a/Models/Chuck.fbx.import
+++ b/Models/Cyberamics/Cyberamic Chuck.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://c2j62syov3skq"
+path="res://.godot/imported/Cyberamic Chuck.glb-7640bcf570eaf553eddfec5de3e96502.scn"
[deps]
-source_file="res://3-Stage/Models/Chuck.fbx"
-dest_files=["res://.godot/imported/Chuck.fbx-e0f76e66bd2d66a68bf43edbd8d1d948.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/Jasper.fbx.import b/Models/Jasper.fbx.import
deleted file mode 100644
index 820701e..0000000
--- a/Models/Jasper.fbx.import
+++ /dev/null
@@ -1,38 +0,0 @@
-[remap]
-
-importer="scene"
-importer_version=1
-type="PackedScene"
-uid="uid://b4xrsr1w4t017"
-path="res://.godot/imported/Jasper.fbx-172cc49326619adb06baca5b9e28470b.scn"
-
-[deps]
-
-source_file="res://3-Stage/Models/Jasper.fbx"
-dest_files=["res://.godot/imported/Jasper.fbx-172cc49326619adb06baca5b9e28470b.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/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/MovementFrameIndicatorOff.tscn b/Scenes/GUI/Controls/MovementFrameIndicatorOff.tscn
new file mode 100644
index 0000000..179fd0a
--- /dev/null
+++ b/Scenes/GUI/Controls/MovementFrameIndicatorOff.tscn
@@ -0,0 +1,14 @@
+[gd_scene load_steps=2 format=3 uid="uid://btbdib3vwowhd"]
+
+[ext_resource type="Script" uid="uid://b4qincechbf63" path="res://Scripts/MovementFrameIndicator.gd" id="1_ttcva"]
+
+[node name="MovementFrameIndicator" type="Control"]
+layout_mode = 3
+anchors_preset = 0
+script = ExtResource("1_ttcva")
+
+[node name="ColorRect" type="ColorRect" parent="."]
+layout_mode = 0
+offset_right = 2.0
+offset_bottom = 32.0
+color = Color(0.0941176, 0.0941176, 0.0941176, 1)
diff --git a/Scenes/GUI/Controls/MovementFrameIndicatorOn.tscn b/Scenes/GUI/Controls/MovementFrameIndicatorOn.tscn
new file mode 100644
index 0000000..1a264f4
--- /dev/null
+++ b/Scenes/GUI/Controls/MovementFrameIndicatorOn.tscn
@@ -0,0 +1,14 @@
+[gd_scene load_steps=2 format=3 uid="uid://dao6mf54xule2"]
+
+[ext_resource type="Script" uid="uid://b4qincechbf63" path="res://Scripts/MovementFrameIndicator.gd" id="1_2om8h"]
+
+[node name="MovementFrameIndicator" type="Control"]
+layout_mode = 3
+anchors_preset = 0
+script = ExtResource("1_2om8h")
+
+[node name="ColorRect" type="ColorRect" parent="."]
+layout_mode = 0
+offset_right = 2.0
+offset_bottom = 32.0
+color = Color(0, 1, 0, 1)
diff --git a/Scenes/GUI/Controls/MovementRow.tscn b/Scenes/GUI/Controls/MovementRow.tscn
new file mode 100644
index 0000000..e8354c5
--- /dev/null
+++ b/Scenes/GUI/Controls/MovementRow.tscn
@@ -0,0 +1,103 @@
+[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)
+corner_radius_top_left = 4
+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
+offset_bottom = 40.0
+grow_horizontal = 2
+script = ExtResource("1_rm5t0")
+
+[node name="ActiveBG" type="Panel" parent="."]
+visible = false
+layout_mode = 0
+offset_left = 4.0
+offset_top = 4.0
+offset_right = 260.0
+offset_bottom = 36.0
+theme_override_styles/panel = SubResource("StyleBoxFlat_rm5t0")
+
+[node name="Button" type="Button" parent="."]
+layout_mode = 0
+offset_left = 4.0
+offset_top = 4.0
+offset_right = 260.0
+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
+anchors_preset = -1
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = 264.0
+grow_horizontal = 2
+grow_vertical = 2
+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
+offset_top = 4.0
+offset_right = -4.0
+offset_bottom = -4.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="MovementsHandle" type="Control" parent="MovementsBG/InvisibleMask"]
+anchors_preset = 0
+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 8d87dad..3d97c93 100644
--- a/Scenes/GUI/EditorScreen.tscn
+++ b/Scenes/GUI/EditorScreen.tscn
@@ -1,14 +1,45 @@
-[gd_scene load_steps=7 format=3 uid="uid://oiehbor0dlqx"]
+[gd_scene load_steps=27 format=3 uid="uid://oiehbor0dlqx"]
[ext_resource type="Script" uid="uid://dfiwoln8mdwm8" path="res://Scripts/EditorScreen.gd" id="1_sd512"]
-[ext_resource type="PackedScene" uid="uid://blg1c3v4o44of" path="res://Scenes/GUI/Controls/FlowSlider.tscn" id="2_jo1ms"]
-[ext_resource type="PackedScene" uid="uid://btre5j66mpchy" path="res://Scenes/Stages/HelenHouse.tscn" id="2_p1t5g"]
-[ext_resource type="ButtonGroup" uid="uid://bij2tonqeslpt" path="res://Scenes/GUI/FlyoutButtonGroup.tres" id="3_p1t5g"]
-[ext_resource type="PackedScene" uid="uid://cbf3x44mvo701" path="res://Scenes/GUI/Controls/IndicatorLight.tscn" id="4_wuj6m"]
+[ext_resource type="Theme" uid="uid://dbgs4id7y5d1c" path="res://UI/Themes/Dark.tres" id="1_v0ton"]
+[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="ButtonGroup" uid="uid://bij2tonqeslpt" path="res://Scenes/GUI/FlyoutButtonGroup.tres" id="13_wy7jo"]
[sub_resource type="ViewportTexture" id="ViewportTexture_g6u4d"]
viewport_path = NodePath("SubViewport")
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_wy7jo"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_v0ton"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_20noo"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_mch36"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_fxi2g"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_bdf35"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_j2w5p"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_bv2rw"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_gx718"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_gu086"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_othvt"]
+
[node name="EditorScreen" type="Control"]
layout_mode = 3
anchors_preset = 15
@@ -16,1025 +47,1099 @@ anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
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)
-size_2d_override = Vector2i(640, 360)
-
-[node name="HelenHouse" parent="SubViewport" instance=ExtResource("2_p1t5g")]
[node name="ColorRect" type="ColorRect" parent="."]
-layout_mode = 0
-offset_right = 1280.0
-offset_bottom = 720.0
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
color = Color(0.187176, 0.187176, 0.187176, 1)
-[node name="CameraPreview" type="TextureRect" parent="."]
-layout_mode = 0
-offset_left = 636.0
-offset_top = 48.0
-offset_right = 1276.0
-offset_bottom = 408.0
-texture = SubResource("ViewportTexture_g6u4d")
-expand_mode = 2
-
[node name="Label" type="Label" parent="."]
-layout_mode = 0
+layout_mode = 1
+anchors_preset = -1
+anchor_right = 0.5
+anchor_bottom = 0.5
offset_left = 144.0
offset_top = 48.0
-offset_right = 632.0
-offset_bottom = 408.0
+offset_right = -8.0
+offset_bottom = 48.0
+grow_horizontal = 2
+grow_vertical = 2
text = "Welcome to Pneumatic Plaything Animatronic Simulator!
You can press the buttons to the side to
-control the bot, or adjust its flows.
+control the bots manually, adjust their flows,
+change the camera angle, or switch their cosmetics.
-Open the Controls menu to see all of the keybinds.
-
-More features will be coming in the future, so stay tuned!"
+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
+anchor_right = 1.0
+offset_left = 4.0
+offset_top = 4.0
+offset_right = -4.0
+offset_bottom = 44.0
+grow_horizontal = 2
+
+[node name="StageSelector" type="OptionButton" parent="MenuBar"]
layout_mode = 0
offset_left = 4.0
offset_top = 4.0
-offset_right = 1276.0
-offset_bottom = 44.0
+offset_right = 260.0
+offset_bottom = 36.0
+selected = 0
+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="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 = "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="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 = "Controls"
+
+[node name="CreditsButton" type="Button" parent="MenuBar"]
+layout_mode = 0
+offset_left = 528.0
+offset_top = 4.0
+offset_right = 656.0
+offset_bottom = 36.0
+text = "Credits"
[node name="Wordmark" type="Label" parent="MenuBar"]
-layout_mode = 0
-offset_left = 1044.0
-offset_top = 4.0
-offset_right = 1268.0
-offset_bottom = 36.0
-text = "Pneumatic Plaything v0.2"
-horizontal_alignment = 1
+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
+anchor_top = 0.5
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = 4.0
+offset_top = 52.0
+offset_right = -4.0
+offset_bottom = -4.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="TransportControls" type="Control" parent="SequencerPanel"]
+layout_mode = 1
+anchors_preset = 10
+anchor_right = 1.0
+offset_bottom = 48.0
+grow_horizontal = 2
+
+[node name="TimeLabel" type="Label" parent="SequencerPanel/TransportControls"]
+layout_mode = 0
+offset_left = 8.0
+offset_top = 8.0
+offset_right = 196.0
+offset_bottom = 40.0
+text = "0:00:00:00"
+vertical_alignment = 1
+
+[node name="Centered" type="Control" parent="SequencerPanel/TransportControls"]
+layout_mode = 1
+anchors_preset = 8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -178.0
+offset_top = -24.0
+offset_right = 178.0
+offset_bottom = 24.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="StepBackwardsButton" type="Button" parent="SequencerPanel/TransportControls/Centered"]
layout_mode = 0
offset_left = 4.0
-offset_top = 412.0
-offset_right = 1276.0
-offset_bottom = 716.0
+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="FlyoutButtons" type="Panel" parent="."]
+[node name="FastBackwardsButton" type="Button" parent="SequencerPanel/TransportControls/Centered"]
layout_mode = 0
+offset_left = 48.0
+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"]
+layout_mode = 0
+offset_left = 92.0
+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"]
+layout_mode = 0
+offset_left = 136.0
+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"]
+layout_mode = 0
+offset_left = 180.0
+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"]
+layout_mode = 0
+offset_left = 224.0
+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"]
+layout_mode = 0
+offset_left = 268.0
+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"]
+layout_mode = 0
+offset_left = 312.0
+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"]
+layout_mode = 1
+anchors_preset = -1
+anchor_left = 1.0
+anchor_top = 0.5
+anchor_right = 1.0
+anchor_bottom = 0.5
+offset_left = -40.0
+offset_top = -20.0
+offset_right = -4.0
+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"]
+layout_mode = 1
+anchors_preset = -1
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = 4.0
+offset_top = 48.0
+offset_right = -4.0
+offset_bottom = -4.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="VScrollBar" type="VScrollBar" parent="SequencerPanel/TimelinePanel"]
+layout_mode = 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 = 0.0
+step = 1.0
+
+[node name="InvisibleMask" type="Control" parent="SequencerPanel/TimelinePanel"]
+clip_contents = true
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = 16.0
+offset_top = 4.0
+offset_right = -4.0
+offset_bottom = -4.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="MovementRowsContainer" type="Control" parent="SequencerPanel/TimelinePanel/InvisibleMask"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="Playhead" type="VSeparator" parent="SequencerPanel/TimelinePanel/InvisibleMask"]
+layout_mode = 1
+anchors_preset = 9
+anchor_bottom = 1.0
+offset_left = 388.0
+offset_right = 392.0
+grow_vertical = 2
+
+[node name="FlyoutPanel" type="Control" parent="."]
+layout_mode = 1
+anchor_bottom = 0.5
offset_left = 4.0
offset_top = 48.0
offset_right = 140.0
-offset_bottom = 408.0
+offset_bottom = 48.0
+grow_vertical = 2
-[node name="MovementsFlyoutButton" type="Button" parent="FlyoutButtons"]
+[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("3_p1t5g")
+button_group = ExtResource("13_wy7jo")
text = "Movements"
-[node name="FlowsFlyoutButton" type="Button" parent="FlyoutButtons"]
+[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("3_p1t5g")
+button_group = ExtResource("13_wy7jo")
text = "Flows"
-[node name="CameraFlyoutButton" type="Button" parent="FlyoutButtons"]
+[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("3_p1t5g")
+button_group = ExtResource("13_wy7jo")
text = "Camera"
-[node name="Movements" type="Panel" parent="."]
+[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 = 144.0
-offset_top = 48.0
-offset_right = 484.0
-offset_bottom = 412.0
+offset_left = 140.0
+offset_right = 416.0
+offset_bottom = 392.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("4_wuj6m")]
-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("4_wuj6m")]
-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("4_wuj6m")]
-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("4_wuj6m")]
-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("4_wuj6m")]
-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("4_wuj6m")]
-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("4_wuj6m")]
-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("4_wuj6m")]
-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("4_wuj6m")]
-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("4_wuj6m")]
-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("4_wuj6m")]
-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("4_wuj6m")]
-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("4_wuj6m")]
-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("4_wuj6m")]
-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("4_wuj6m")]
-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("4_wuj6m")]
-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("4_wuj6m")]
-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("4_wuj6m")]
-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("4_wuj6m")]
-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 = 144.0
-offset_top = 48.0
-offset_right = 812.0
-offset_bottom = 440.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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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("2_jo1ms")]
-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"]
+[node name="InvisibleMask" type="Control" parent="FlyoutPanel/Movements"]
+clip_contents = true
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_top = 4.0
+offset_right = 260.0
offset_bottom = 388.0
-text = "Head Up"
+
+[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
+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="ControlsScreen"]
+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="ControlsScreen"]
+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 = -192.0
+offset_right = 256.0
+offset_bottom = 192.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="Label" type="Label" parent="ControlsScreen/DialogPanel"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+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
+Stop: Home
+Change Camera Angle: Tab"
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"
+[node name="CreditsScreen" 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="CreditsScreen"]
+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="CreditsScreen"]
+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 = -192.0
+offset_right = 256.0
+offset_bottom = 192.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="Label" type="Label" parent="CreditsScreen/DialogPanel"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+text = "Pneumatic Plaything Animatronic Simulator
+
+Project Oversight: Persephone (KawaiiZenbo)
+
+Interface Design: Persephone
+Simulator Backend: 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="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"
+[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="LeftElbow" type="Label" parent="FlowControls/MovementLabels"]
+[node name="AudioTypeLabel" type="Label" parent="ShowtapeNewScreen/DialogPanel"]
layout_mode = 0
-offset_left = 336.0
-offset_top = 104.0
-offset_right = 464.0
-offset_bottom = 136.0
-text = "Left Elbow"
+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="RightArmUp" type="Label" parent="FlowControls/MovementLabels"]
+[node name="InFileLabel" type="Label" parent="ShowtapeLoadScreen/DialogPanel"]
layout_mode = 0
-offset_left = 336.0
-offset_top = 140.0
-offset_right = 464.0
-offset_bottom = 172.0
-text = "Right Arm Up"
+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="RightArmTwist" type="Label" parent="FlowControls/MovementLabels"]
+[node name="OutFileLabel" type="Label" parent="ShowtapeSaveScreen/DialogPanel"]
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
+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="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="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="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="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="BodyRight" type="Label" parent="FlowControls/MovementLabels"]
+[node name="CancelButton" type="Button" parent="ShowtapeSaveScreen/DialogPanel"]
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
+offset_left = 309.0
+offset_top = 216.0
+offset_right = 405.0
+offset_bottom = 248.0
+text = "Cancel
+"
-[node name="BodyLean" type="Label" parent="FlowControls/MovementLabels"]
+[node name="CreateButton" type="Button" parent="ShowtapeSaveScreen/DialogPanel"]
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
+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 = 0
-offset_right = 1280.0
-offset_bottom = 720.0
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
texture = SubResource("ViewportTexture_g6u4d")
expand_mode = 2
-[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="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="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"]
+[connection signal="pressed" from="SequencerPanel/TransportControls/Centered/FastBackwardsButton" to="." method="_on_fast_backwards_button_pressed"]
+[connection signal="pressed" from="SequencerPanel/TransportControls/Centered/PlayBackwardsButton" to="." method="_on_play_backwards_button_pressed"]
+[connection signal="pressed" from="SequencerPanel/TransportControls/Centered/PauseButton" to="." method="_on_pause_button_pressed"]
+[connection signal="pressed" from="SequencerPanel/TransportControls/Centered/StopButton" to="." method="_on_stop_button_pressed"]
+[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="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="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/HelenHouse.tscn b/Scenes/Stages/HelenHouse.tscn
index 0e46785..8a69767 100644
--- a/Scenes/Stages/HelenHouse.tscn
+++ b/Scenes/Stages/HelenHouse.tscn
@@ -1,40 +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="Camera3D" type="Camera3D" parent="."]
-transform = Transform3D(-1, 1.31601e-08, -1.50421e-07, 0, 0.996195, 0.0871557, 1.50996e-07, 0.0871557, -0.996195, 0, 1.5, -3)
+[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="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/AnimatronicController.gd b/Scripts/AnimatronicController.gd
new file mode 100644
index 0000000..5dc202b
--- /dev/null
+++ b/Scripts/AnimatronicController.gd
@@ -0,0 +1,93 @@
+extends Node3D
+
+var animation_player : AnimationPlayer
+var animation_tree : AnimationTree
+var blend_tree : AnimationNodeBlendTree
+
+var movement_states : Dictionary
+
+func _ready():
+ animation_player = $AnimationPlayer
+
+ animation_tree = AnimationTree.new()
+ animation_tree.anim_player = animation_player.get_path()
+ add_child(animation_tree)
+
+ animation_tree.tree_root = AnimationNodeBlendTree.new()
+ animation_tree.active = true
+ blend_tree = animation_tree.tree_root as AnimationNodeBlendTree
+
+ 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]
+
+ var prev_anim_node := AnimationNodeAnimation.new()
+ prev_anim_node.animation = animations[0]
+ blend_tree.add_node(prev_name, prev_anim_node)
+
+ var old_time_node := AnimationNodeTimeScale.new()
+ blend_tree.add_node(old_time_name,old_time_node)
+
+ var _old_seek_node := AnimationNodeTimeSeek.new()
+ blend_tree.add_node(old_seek_name,_old_seek_node)
+
+ blend_tree.connect_node(old_time_name,0,prev_name)
+ blend_tree.connect_node(old_seek_name,0,old_time_name)
+ prev_name = old_seek_name
+
+ for i in range(1, animations.size()):
+ var anim_name = "Anim_" + animations[i]
+ var add_name = "Add_" + animations[i]
+ var time_name = "Time_" + animations[i]
+ var seek_name = "Seek_" + animations[i]
+
+ var new_anim_node := AnimationNodeAnimation.new()
+ new_anim_node.animation = animations[i]
+ blend_tree.add_node(anim_name, new_anim_node)
+
+ var time_node := AnimationNodeTimeScale.new()
+ blend_tree.add_node(time_name,time_node)
+
+ var seek_node := AnimationNodeTimeSeek.new()
+ blend_tree.add_node(seek_name,seek_node)
+
+ 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(add_name, 0, prev_name)
+ blend_tree.connect_node(add_name, 1, seek_name)
+ prev_name = add_name
+
+ blend_tree.connect_node("output", 0, prev_name)
+
+ for i in range(0, animations.size()):
+ animation_tree.set("parameters/Add_" + str(animations[i]) + "/add_amount", 1.0)
+ animation_tree.set("parameters/Seek_" + str(animations[i]) + "/seek_request", 0)
+ animation_tree.set("parameters/Time_" + str(animations[i]) + "/scale", 0)
+
+func _physics_process(delta: float) -> void:
+ for key in movement_states:
+ var anim_path = "parameters/Seek_" + key + "/seek_request"
+ var state = movement_states[key]
+ if (state[0]):
+ state[1] = clamp(float(state[1]) + (delta * state[2]), 0, 1)
+ else:
+ state[1] = clamp(float(state[1]) - (delta * state[3]), 0, 1)
+ animation_tree.set(anim_path, state[1])
+
+func _movement_in(movement, rate):
+ movement_states[movement][0] = true
+ movement_states[movement][2] = rate
+
+func _movement_out(movement, rate):
+ movement_states[movement][0] = false
+ movement_states[movement][3] = rate
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 3209ad4..f34bf79 100644
--- a/Scripts/EditorScreen.gd
+++ b/Scripts/EditorScreen.gd
@@ -1,161 +1,947 @@
extends Control
-signal movement_in(movement, rate)
-signal movement_out(movement, rate)
+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.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]
+
+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:
- var animatronic = $"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)
+ 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;
+ 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):
+ 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
+
+func _on_controls_button_pressed() -> void:
+ $ControlsScreen.visible = true
+
+func _on_credits_button_pressed() -> void:
+ $CreditsScreen.visible = true
+
+func _on_input_eater_pressed() -> void:
+ $ControlsScreen.visible = false
+ $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/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:
- $Movements.visible = toggled_on
+ $FlyoutPanel/Movements.visible = toggled_on
func _on_flows_flyout_button_toggled(toggled_on: bool) -> void:
- $FlowControls.visible = toggled_on
+ $FlyoutPanel/FlowControls.visible = toggled_on
-func _movement_in(movement, rate):
- get_node("Movements/IndicatorLights/" + movement).turn_on();
+func _on_camera_flyout_button_toggled(toggled_on: bool) -> void:
+ $FlyoutPanel/Camera.visible = toggled_on
-func _movement_out(movement, rate):
- get_node("Movements/IndicatorLights/" + movement).turn_off();
+func _on_cosmetics_flyout_button_toggled(toggled_on: bool) -> void:
+ $FlyoutPanel/Cosmetics.visible = toggled_on
-func _on_mouth_button_down() -> void:
- movement_in.emit("Mouth", $FlowControls/InFlows/MouthFlow.value)
+func _on_play_button_pressed() -> void:
+ playback_rate = 1
+ $AudioStreamPlayer.pitch_scale = 1
+ $AudioStreamPlayer.play(float(index)/60.0)
+ playing = true
-func _on_mouth_button_up() -> void:
- movement_out.emit("Mouth", $FlowControls/OutFlows/MouthFlow.value)
+func _on_pause_button_pressed() -> void:
+ $AudioStreamPlayer.stop()
+ playing = false
+func _on_play_backwards_button_pressed() -> void:
+ playback_rate = -1
+ $AudioStreamPlayer.stop() # cant play backwards :(
+ playing = true
+ $SequencerPanel/TransportControls/RecordButton.button_pressed = false
-func _on_left_ear_button_down() -> void:
- movement_in.emit("Left Ear", $FlowControls/InFlows/LeftEarFlow.value)
+func _on_fast_backwards_button_pressed() -> void:
+ playback_rate = -2
+ $AudioStreamPlayer.stop() # cant play backwards :(
+ playing = true
+ $SequencerPanel/TransportControls/RecordButton.button_pressed = false
-func _on_left_ear_button_up() -> void:
- movement_out.emit("Left Ear", $FlowControls/OutFlows/LeftEarFlow.value)
+func _on_step_backwards_button_pressed() -> void:
+ playing = false
+ $AudioStreamPlayer.stop()
+ $SequencerPanel/TransportControls/RecordButton.button_pressed = false
+ if (index != 0):
+ step.emit(-1)
+ index -= 1
+ update_time_label()
+func _on_fast_forward_button_pressed() -> void:
+ playback_rate = 2
+ $AudioStreamPlayer.pitch_scale = 2
+ $AudioStreamPlayer.play(float(index)/60.0)
+ playing = true
+ $SequencerPanel/TransportControls/RecordButton.button_pressed = false
-func _on_right_ear_button_down() -> void:
- movement_in.emit("Right Ear", $FlowControls/InFlows/RightEarFlow.value)
+func _on_step_forward_button_pressed() -> void:
+ playing = false
+ $AudioStreamPlayer.stop()
+ $SequencerPanel/TransportControls/RecordButton.button_pressed = false
+ step.emit(1)
+ index += 1
+ update_time_label()
-func _on_right_ear_button_up() -> void:
- movement_out.emit("Right Ear", $FlowControls/OutFlows/RightEarFlow.value)
+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
+ $AudioStreamPlayer.stop()
+ $AudioStreamPlayer.seek(0)
+ $SequencerPanel/TransportControls/RecordButton.button_pressed = false
+ index = 0
+ return_to_zero.emit()
+ update_time_label()
-func _on_left_eyelid_button_down() -> void:
- movement_in.emit("Left Eyelid", $FlowControls/InFlows/LeftEyelidFlow.value)
+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 _on_left_eyelid_button_up() -> void:
- movement_out.emit("Left Eyelid", $FlowControls/OutFlows/LeftEyelidFlow.value)
+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 _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)
+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 0c85b45..0000000
--- a/Scripts/FlowSlider.gd
+++ /dev/null
@@ -1,10 +0,0 @@
-extends Control
-
-@export var value : float = 1.0
-
-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)
diff --git a/Scripts/HelenController.gd b/Scripts/HelenController.gd
deleted file mode 100644
index 0818448..0000000
--- a/Scripts/HelenController.gd
+++ /dev/null
@@ -1,14 +0,0 @@
-extends Node3D
-
-var animation_player
-
-func _ready():
- animation_player = $AnimationPlayer
-
-func _movement_in(movement, rate):
- animation_player.speed_scale = rate
- animation_player.play(movement)
-
-func _movement_out(movement, rate):
- animation_player.speed_scale = rate
- animation_player.play_backwards(movement)
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/MovementFrameIndicator.gd b/Scripts/MovementFrameIndicator.gd
new file mode 100644
index 0000000..67590fe
--- /dev/null
+++ b/Scripts/MovementFrameIndicator.gd
@@ -0,0 +1,6 @@
+extends Control
+
+@export var x_offset : int = 0
+
+func _ready() -> void:
+ self.size.x += x_offset
diff --git a/Scripts/MovementFrameIndicator.gd.uid b/Scripts/MovementFrameIndicator.gd.uid
new file mode 100644
index 0000000..ce8fc88
--- /dev/null
+++ b/Scripts/MovementFrameIndicator.gd.uid
@@ -0,0 +1 @@
+uid://b4qincechbf63
diff --git a/Scripts/MovementRow.gd b/Scripts/MovementRow.gd
new file mode 100644
index 0000000..b02c8c3
--- /dev/null
+++ b/Scripts/MovementRow.gd
@@ -0,0 +1,176 @@
+extends Panel
+
+@export var movement_bit : int = 0
+@export var movement_name : String = "Name"
+@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
+
+var key_binding : InputEventKey = InputEventKey.new()
+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 recording : bool = false
+var playing : bool = true
+var current_block_indicator
+
+signal movement_in(movement, rate)
+signal movement_out(movement, rate)
+
+func set_at_current() -> void:
+ if (current_index > self.movements.size()-1): self.movements.append(true)
+ else: self.movements.set(current_index, true)
+ if (check_at_index(current_index-1)): current_block_indicator.get_node("ColorRect").size.x += 2
+ else:
+ current_block_indicator = load("res://Scenes/GUI/Controls/MovementFrameIndicatorOn.tscn").instantiate()
+ current_block_indicator.position.x = current_index * 2
+ $MovementsBG/InvisibleMask/MovementsHandle.add_child(current_block_indicator)
+
+func unset_at_current() -> void:
+ if (current_index > self.movements.size()-1): self.movements.append(false)
+ else: self.movements.set(current_index, false)
+ if (!check_at_index(current_index-1)): current_block_indicator.get_node("ColorRect").size.x += 2
+ else:
+ current_block_indicator = load("res://Scenes/GUI/Controls/MovementFrameIndicatorOff.tscn").instantiate()
+ current_block_indicator.position.x = current_index * 2
+ $MovementsBG/InvisibleMask/MovementsHandle.add_child(current_block_indicator)
+
+func check_at_current() -> bool:
+ if (current_index > self.movements.size()-1): return false
+ var out = self.movements.get(current_index)
+ if (out == null): return false
+ return out
+
+func check_at_index(cindex: int) -> bool:
+ if (cindex > self.movements.size()-1): return false
+ if (cindex < 0): return false
+ var out = self.movements.get(cindex)
+ 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 && check_if_erasing()):
+ if (etching): set_at_current()
+ else: unset_at_current()
+ if (playing):
+ if (check_at_current()):
+ if (!playback_held_on_previous_frame):
+ movement_in.emit(movement_name, in_flow)
+ playback_held_on_previous_frame = true;
+ else:
+ if (playback_held_on_previous_frame):
+ movement_out.emit(movement_name, out_flow)
+ playback_held_on_previous_frame = false;
+ current_index += amount
+ $MovementsBG/InvisibleMask/MovementsHandle.position.x += -2*amount
+
+func _return_to_zero():
+ current_index = 0
+ $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
+
+func _end_recording():
+ recording = false
+
+func _start_playback():
+ playing = true
+
+func _end_playback():
+ playing = false
+
+func update_text() -> void:
+ 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
+
+func _update_out_flow(new_value: float) -> void:
+ out_flow = new_value
+
+func _ready() -> void:
+ 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
+ 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("../../../../../")
+ 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 || 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)
+ held_on_previous_frame = true;
+ else:
+ if (held_on_previous_frame):
+ movement_out.emit(movement_name, out_flow)
+ held_on_previous_frame = false;
+
+func _movement_in(_movement, _rate):
+ $ActiveBG.visible = true
+ if (recording): etching = true
+
+func _movement_out(_movement, _rate):
+ $ActiveBG.visible = false
+ etching = false
+
+func _on_button_pressed() -> void:
+ if (binding):
+ update_text()
+ binding = false
+ return
+ if (key_binding.keycode == 0):
+ $Button.text = "Press a key to bind."
+ binding = true
+ else:
+ key_binding.keycode = KEY_NONE
+ update_text()
+
+func _input(event: InputEvent) -> void:
+ if (event is InputEventKey && binding):
+ if (event.keycode != KEY_ESCAPE):
+ key_binding = event
+ 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/Scripts/MovementRow.gd.uid b/Scripts/MovementRow.gd.uid
new file mode 100644
index 0000000..14caf71
--- /dev/null
+++ b/Scripts/MovementRow.gd.uid
@@ -0,0 +1 @@
+uid://tn3aaldu7mm2
diff --git a/Stages.md b/Stages.md
new file mode 100644
index 0000000..8acdca4
--- /dev/null
+++ b/Stages.md
@@ -0,0 +1,79 @@
+# Stages
+
+## Currently in game
+
+ - Helen House (homemade stage)
+ - Chuck E's Corner (homemade stage)
+
+## In Development
+
+ - Balcony Stage
+ - Prototype Road Stage
+
+## Planned
+
+### Cyberamics
+
+ - Portrait Stage
+ - Shelf Stage (Portrait stage with Balcony mechs)
+ - C Stage
+ - Rocker Stage
+ - Road Stage
+ - 2-Stage
+ - 1-Stage
+ - Turntable 1-Stage
+ - Cyberamic 3-Stage
+
+
+### 3-Stage
+
+ - 3-Stage
+ - CU 1-Stage
+ - Hollywood 3-Stage
+
+
+### Studio C
+
+ - Studio C Alpha
+ - Studio C Alpha 3-Stage
+ - Studio C Jukebox/"Prototype"
+ - Studio C Beta (3 Screens)
+ - Studio C Beta (1 Screen)
+ - Studio C Cappa (Mirror Backdrop)
+ - Studio C Cappa (Spiral Backdrop)
+ - Studio C Cappa (Beta Backdrop)
+ - Star Stage
+ - Studio C Beta (2012 Update)
+ - Circles of Light
+
+### Other
+
+ - Winchester Portrait Stage
+ - Kooser Portrait Stage
+ - Store specific variants (Lake Forest, Staten Island, Jeddah, Huntsville)
+
+
+## Far future (unlikely without model contributions)
+
+ - Rock-afire Explosion
+ - Mini Stage (RAE)
+ - Magic Stage (RAE)
+ - Hannah Banana Stage
+ - Playroom 3-Stage
+ - Winter 3-Stage
+ - Awesome Adventure Machine
+ - Concept Unification Prototype
+ - Guest Stars (Portrait/Balcony stages)
+ - Cabaret (Dolli Dimples, Artie Antlers, B.B. Bubbles, Dr. Quack)
+ - Lounge (The King, King Kat, Helen Henny, Beach Bowsers, The Beagles)
+ - Latex masks for 3-Stage
+
+
+## Never
+
+ - 2015 Dance Floor
+ - 2017 Dance Floor
+ - 2019 Dance Floor
+ - 2021 Dance Floor + Video Wall
+ - Dance Floor + Circles of Light
+ - Anything to do with The Mopsey Sisters
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/FastBackwards.png b/UI/FastBackwards.png
new file mode 100644
index 0000000..9bfcd28
Binary files /dev/null and b/UI/FastBackwards.png differ
diff --git a/UI/FastBackwards.png.import b/UI/FastBackwards.png.import
new file mode 100644
index 0000000..a9eb6b8
--- /dev/null
+++ b/UI/FastBackwards.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dhx2v2fd0egxd"
+path="res://.godot/imported/FastBackwards.png-f55ba91d8d237cb6919d5f2a056db594.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://UI/FastBackwards.png"
+dest_files=["res://.godot/imported/FastBackwards.png-f55ba91d8d237cb6919d5f2a056db594.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/FastForward.png b/UI/FastForward.png
new file mode 100644
index 0000000..93f5dff
Binary files /dev/null and b/UI/FastForward.png differ
diff --git a/UI/FastForward.png.import b/UI/FastForward.png.import
new file mode 100644
index 0000000..f24b413
--- /dev/null
+++ b/UI/FastForward.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dsr03w7r667fw"
+path="res://.godot/imported/FastForward.png-acbfeb2710bea5385ca8ad13fa6699e8.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://UI/FastForward.png"
+dest_files=["res://.godot/imported/FastForward.png-acbfeb2710bea5385ca8ad13fa6699e8.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/Pause.png b/UI/Pause.png
new file mode 100644
index 0000000..2892111
Binary files /dev/null and b/UI/Pause.png differ
diff --git a/UI/Pause.png.import b/UI/Pause.png.import
new file mode 100644
index 0000000..1d6d8e3
--- /dev/null
+++ b/UI/Pause.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bwhgy4u37jmo1"
+path="res://.godot/imported/Pause.png-90c47ed988bd7d26b746eb81a6aaeedf.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://UI/Pause.png"
+dest_files=["res://.godot/imported/Pause.png-90c47ed988bd7d26b746eb81a6aaeedf.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/Play.png b/UI/Play.png
new file mode 100644
index 0000000..378ce01
Binary files /dev/null and b/UI/Play.png differ
diff --git a/icon.png.import b/UI/Play.png.import
similarity index 70%
rename from icon.png.import
rename to UI/Play.png.import
index 3064ba9..e17e752 100644
--- a/icon.png.import
+++ b/UI/Play.png.import
@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
-uid="uid://dhjuhhilgmxq3"
-path="res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex"
+uid="uid://xllpr3qc064c"
+path="res://.godot/imported/Play.png-eec0d54380d32c59b84e7db5fa226d5e.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://icon.png"
-dest_files=["res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex"]
+source_file="res://UI/Play.png"
+dest_files=["res://.godot/imported/Play.png-eec0d54380d32c59b84e7db5fa226d5e.ctex"]
[params]
diff --git a/UI/PlayBackwards.png b/UI/PlayBackwards.png
new file mode 100644
index 0000000..37f25b2
Binary files /dev/null and b/UI/PlayBackwards.png differ
diff --git a/UI/PlayBackwards.png.import b/UI/PlayBackwards.png.import
new file mode 100644
index 0000000..2e32746
--- /dev/null
+++ b/UI/PlayBackwards.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dgacnkv2dc65s"
+path="res://.godot/imported/PlayBackwards.png-52f3d5b871717feab369f20308dd695c.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://UI/PlayBackwards.png"
+dest_files=["res://.godot/imported/PlayBackwards.png-52f3d5b871717feab369f20308dd695c.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/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/PneumaticPlaything.icon/Assets/cylinder.svg.import b/UI/PneumaticPlaything.icon/Assets/cylinder.svg.import
new file mode 100644
index 0000000..5c56810
--- /dev/null
+++ b/UI/PneumaticPlaything.icon/Assets/cylinder.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://1eluxvmnj7l7"
+path="res://.godot/imported/cylinder.svg-7c12310ad8fca6e1f959909a64d6d065.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://UI/PneumaticPlaything.icon/Assets/cylinder.svg"
+dest_files=["res://.godot/imported/cylinder.svg-7c12310ad8fca6e1f959909a64d6d065.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/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/Record.png b/UI/Record.png
new file mode 100644
index 0000000..4ffe48f
Binary files /dev/null and b/UI/Record.png differ
diff --git a/UI/Record.png.import b/UI/Record.png.import
new file mode 100644
index 0000000..2d19281
--- /dev/null
+++ b/UI/Record.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ckg2ihy105ttj"
+path="res://.godot/imported/Record.png-52d5a1455899304e32054af5c940c434.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://UI/Record.png"
+dest_files=["res://.godot/imported/Record.png-52d5a1455899304e32054af5c940c434.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/SkipBackwards.png b/UI/SkipBackwards.png
new file mode 100644
index 0000000..f3e1d5a
Binary files /dev/null and b/UI/SkipBackwards.png differ
diff --git a/UI/SkipBackwards.png.import b/UI/SkipBackwards.png.import
new file mode 100644
index 0000000..0e46ac4
--- /dev/null
+++ b/UI/SkipBackwards.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dts4eh6hyt8p3"
+path="res://.godot/imported/SkipBackwards.png-dfebc48054bc60d9671fc8d69c696237.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://UI/SkipBackwards.png"
+dest_files=["res://.godot/imported/SkipBackwards.png-dfebc48054bc60d9671fc8d69c696237.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/SkipForward.png b/UI/SkipForward.png
new file mode 100644
index 0000000..29c5dec
Binary files /dev/null and b/UI/SkipForward.png differ
diff --git a/UI/SkipForward.png.import b/UI/SkipForward.png.import
new file mode 100644
index 0000000..eef54cb
--- /dev/null
+++ b/UI/SkipForward.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bphwtliq2ahus"
+path="res://.godot/imported/SkipForward.png-ca36b20fa5c982368f6b620245865f56.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://UI/SkipForward.png"
+dest_files=["res://.godot/imported/SkipForward.png-ca36b20fa5c982368f6b620245865f56.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/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/Stop.png b/UI/Stop.png
new file mode 100644
index 0000000..a008b37
Binary files /dev/null and b/UI/Stop.png differ
diff --git a/UI/Stop.png.import b/UI/Stop.png.import
new file mode 100644
index 0000000..9659f7c
--- /dev/null
+++ b/UI/Stop.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cttgtbu1xllwq"
+path="res://.godot/imported/Stop.png-28cf49bd72d354d073c38f19027d6ddb.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://UI/Stop.png"
+dest_files=["res://.godot/imported/Stop.png-28cf49bd72d354d073c38f19027d6ddb.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/Themes/Dark.tres b/UI/Themes/Dark.tres
new file mode 100644
index 0000000..cb4f782
--- /dev/null
+++ b/UI/Themes/Dark.tres
@@ -0,0 +1,16 @@
+[gd_resource type="Theme" load_steps=2 format=3 uid="uid://dbgs4id7y5d1c"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_6oevq"]
+bg_color = Color(0.133333, 0.133333, 0.133333, 1)
+border_width_left = 1
+border_width_top = 1
+border_width_right = 1
+border_width_bottom = 1
+border_color = Color(0.0941176, 0.0941176, 0.0941176, 1)
+corner_radius_top_left = 4
+corner_radius_top_right = 4
+corner_radius_bottom_right = 4
+corner_radius_bottom_left = 4
+
+[resource]
+Panel/styles/panel = SubResource("StyleBoxFlat_6oevq")
diff --git a/UI/Themes/MovementsPanelOverride.tres b/UI/Themes/MovementsPanelOverride.tres
new file mode 100644
index 0000000..3055b66
--- /dev/null
+++ b/UI/Themes/MovementsPanelOverride.tres
@@ -0,0 +1,6 @@
+[gd_resource type="StyleBoxFlat" format=3 uid="uid://d17amc25o63p1"]
+
+[resource]
+bg_color = Color(0.0941176, 0.0941176, 0.0941176, 1)
+corner_radius_top_right = 4
+corner_radius_bottom_right = 4
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
new file mode 100644
index 0000000..fc311ca
Binary files /dev/null and b/UI/icon.png differ
diff --git a/UI/icon.png.import b/UI/icon.png.import
new file mode 100644
index 0000000..10cbd4d
--- /dev/null
+++ b/UI/icon.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cnvfrr028730a"
+path="res://.godot/imported/icon.png-d44ad423496976af115f803f6386bc82.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://UI/icon.png"
+dest_files=["res://.godot/imported/icon.png-d44ad423496976af115f803f6386bc82.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/icon.png b/icon.png
deleted file mode 100644
index bf8c711..0000000
Binary files a/icon.png and /dev/null differ
diff --git a/project.godot b/project.godot
index 1572dca..4b8bb8c 100644
--- a/project.godot
+++ b/project.godot
@@ -11,27 +11,392 @@ config_version=5
[application]
config/name="Pneumatic Plaything"
-config/version="v0.1"
+config/version="v0.6"
run/main_scene="uid://oiehbor0dlqx"
config/features=PackedStringArray("4.4", "GL Compatibility")
boot_splash/show_image=false
-config/icon="uid://dhjuhhilgmxq3"
+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)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":6,"pressure":0.0,"pressed":true,"script":null)
]
}
+sequencer_play_pause={
+"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":32,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":0,"pressure":0.0,"pressed":true,"script":null)
+]
+}
+sequencer_play_reverse={
+"deadzone": 0.2,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":1,"pressure":0.0,"pressed":true,"script":null)
+]
+}
+sequencer_fast_forward={
+"deadzone": 0.2,
+"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":5,"axis_value":1.0,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194321,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+]
+}
+sequencer_fast_reverse={
+"deadzone": 0.2,
+"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":4,"axis_value":1.0,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194319,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+]
+}
+sequencer_step_forward={
+"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":4194321,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":10,"pressure":0.0,"pressed":true,"script":null)
+]
+}
+sequencer_step_backward={
+"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":4194319,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":9,"pressure":0.0,"pressed":true,"script":null)
+]
+}
+cycle_camera_angle={
+"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":4194306,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":3,"pressure":0.0,"pressed":false,"script":null)
+]
+}
+sequencer_home={
+"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":4194317,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+, 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