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/Balcony/BalconyStage.glb.import b/Models/Balcony/BalconyStage.glb.import
new file mode 100644
index 0000000..a005e55
--- /dev/null
+++ b/Models/Balcony/BalconyStage.glb.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://c6n4otfble154"
+path="res://.godot/imported/BalconyStage.glb-30f76dcef53d0e1cd152a84572aefbee.scn"
+
+[deps]
+
+source_file="res://Models/Balcony/BalconyStage.glb"
+dest_files=["res://.godot/imported/BalconyStage.glb-30f76dcef53d0e1cd152a84572aefbee.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/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/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/Cyberamics/Cyber Helen.glb.import b/Models/Cyberamics/Cyber Helen.glb.import
new file mode 100644
index 0000000..0bec33a
--- /dev/null
+++ b/Models/Cyberamics/Cyber Helen.glb.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://d34xfaignny8j"
+path="res://.godot/imported/Cyber Helen.glb-3f0344c1f3e746ac81eea3dfffd7e005.scn"
+
+[deps]
+
+source_file="res://Models/Cyberamics/Cyber Helen.glb"
+dest_files=["res://.godot/imported/Cyber Helen.glb-3f0344c1f3e746ac81eea3dfffd7e005.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 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/Scenes/GUI/EditorScreen.tscn b/Scenes/GUI/EditorScreen.tscn
index 4d28b33..3d97c93 100644
--- a/Scenes/GUI/EditorScreen.tscn
+++ b/Scenes/GUI/EditorScreen.tscn
@@ -1,10 +1,11 @@
-[gd_scene load_steps=26 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="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"]
@@ -131,33 +132,6 @@ grow_horizontal = 2
grow_vertical = 2
color = Color(0.187176, 0.187176, 0.187176, 1)
-[node name="CameraPlaceholder" type="TextureRect" parent="."]
-layout_mode = 1
-anchors_preset = -1
-anchor_left = 0.5
-anchor_right = 1.0
-offset_left = -4.0
-offset_top = 48.0
-offset_right = -4.0
-offset_bottom = 408.0
-grow_horizontal = 0
-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="Label" type="Label" parent="."]
layout_mode = 1
anchors_preset = -1
@@ -179,6 +153,35 @@ Open the Controls menu to see all of the keybinds."
horizontal_alignment = 1
vertical_alignment = 1
+[node name="CameraPlaceholder" type="TextureRect" parent="."]
+layout_mode = 1
+anchors_preset = -1
+anchor_left = 0.5
+anchor_right = 1.0
+anchor_bottom = 0.5
+offset_left = -4.0
+offset_top = 48.0
+offset_right = -4.0
+offset_bottom = 48.0
+grow_horizontal = 2
+grow_vertical = 2
+texture = ExtResource("4_v0ton")
+expand_mode = 1
+
+[node name="CameraPreview" type="TextureRect" parent="."]
+visible = false
+layout_mode = 1
+anchors_preset = -1
+anchor_left = 0.5
+anchor_right = 1.0
+offset_left = -4.0
+offset_top = 48.0
+offset_right = -4.0
+grow_horizontal = 0
+texture = SubResource("ViewportTexture_g6u4d")
+expand_mode = 5
+stretch_mode = 6
+
[node name="MenuBar" type="Panel" parent="."]
layout_mode = 1
anchors_preset = -1
@@ -196,11 +199,13 @@ offset_top = 4.0
offset_right = 260.0
offset_bottom = 36.0
selected = 0
-item_count = 2
-popup/item_0/text = "Helen House"
+item_count = 3
+popup/item_0/text = "Balcony Stage"
popup/item_0/id = 0
-popup/item_1/text = "Chuck E's Corner"
+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
@@ -241,13 +246,13 @@ anchor_left = 1.0
anchor_top = 0.5
anchor_right = 1.0
anchor_bottom = 0.5
-offset_left = -232.0
+offset_left = -264.0
offset_top = -16.0
-offset_right = -8.0
+offset_right = -40.0
offset_bottom = 16.0
grow_horizontal = 0
grow_vertical = 2
-text = "Pneumatic Plaything v0.5.1"
+text = "Pneumatic Plaything v0.6"
horizontal_alignment = 2
vertical_alignment = 1
@@ -260,6 +265,18 @@ 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
@@ -719,6 +736,7 @@ 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."
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
index 522597a..9f1dbf9 100644
--- a/Scenes/Stages/ChuckEsCorner.tscn
+++ b/Scenes/Stages/ChuckEsCorner.tscn
@@ -71,12 +71,12 @@ spot_angle_attenuation = 0.15
script = ExtResource("4_8suoo")
[node name="Chuck" type="SpotLight3D" parent="Color 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)
+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 = 30.5982
+spot_angle = 33.4444
spot_angle_attenuation = 0.1
[node name="Angle 1" type="Camera3D" parent="."]
diff --git a/Scripts/EditorScreen.gd b/Scripts/EditorScreen.gd
index 5b72fd7..f34bf79 100644
--- a/Scripts/EditorScreen.gd
+++ b/Scripts/EditorScreen.gd
@@ -104,11 +104,11 @@ var stages_info = {
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" },
- 56: { "bot": "Spots", "movement": "Warblettes", "flow_in": "None", "flow_out": "None" },
- 71: { "bot": "Floods", "movement": "Red", "flow_in": "None", "flow_out": "None" },
- 72: { "bot": "Floods", "movement": "Green", "flow_in": "None", "flow_out": "None" },
- 73: { "bot": "Floods", "movement": "Blue", "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":
@@ -225,6 +225,255 @@ var stages_info = {
},
}
}
+ },
+ "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,
+ },
+ },
+ }
}
}
@@ -234,24 +483,24 @@ signal end_recording()
signal return_to_zero()
signal erase_all()
-func reload_stage(stage_previously_loaded: bool) -> void:
- if (stage_previously_loaded):
- $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()
+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
+ cam_index = 0
var stage = load(stages_info[current_stage]["scene"]).instantiate()
$SubViewport.add_child(stage)
@@ -290,7 +539,8 @@ func reload_stage(stage_previously_loaded: bool) -> void:
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 = bot + " " + movement
+ 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)
@@ -302,6 +552,7 @@ func reload_stage(stage_previously_loaded: bool) -> void:
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
@@ -311,6 +562,8 @@ func reload_stage(stage_previously_loaded: bool) -> void:
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)
@@ -323,7 +576,7 @@ func reload_stage(stage_previously_loaded: bool) -> void:
func _on_stage_change_overwrite_confirmation_dialog_confirmed() -> void:
erase_all.emit()
current_stage = $MenuBar/StageSelector.get_item_text($MenuBar/StageSelector.selected)
- reload_stage(true)
+ reload_stage()
func update_time_label() -> void:
var frames = index % 60
@@ -350,13 +603,13 @@ func _ready() -> void:
$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(false)
+ 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(true)
+ reload_stage()
func _showtape_menu_button_pressed(id: int) -> void:
match (id):
@@ -642,36 +895,19 @@ func save_data() -> String:
var temp_data = {}
var longest_channel = 0
for movement_row in $SequencerPanel/TimelinePanel/InvisibleMask/MovementRowsContainer.get_children():
- temp_data[int(movement_row.name.split(" ")[0])] = movement_row.movements
+ 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 frame_long_1 = 0
- var frame_long_2 = 0
- var frame_long_3 = 0
- var frame_long_4 = 0
- var frame_long_5 = 0
- var frame_long_6 = 0
- var frame_long_7 = 0
- var frame_long_8 = 0
- for j in temp_data:
- if (index_get_safe(i, temp_data[j])):
- if (j <= 32):
- frame_long_1 += 1 << (j&32)-1
- elif (j <= 64):
- frame_long_2 += 1 << (j&32)-1
- elif (j <= 96):
- frame_long_3 += 1 << (j&32)-1
- elif (j <= 128):
- frame_long_4 += 1 << (j&32)-1
- elif (j <= 160):
- frame_long_5 += 1 << (j&32)-1
- elif (j <= 192):
- frame_long_6 += 1 << (j&32)-1
- elif (j <= 224):
- frame_long_7 += 1 << (j&32)-1
- elif (j <= 256):
- frame_long_8 += 1 << (j&32)-1
- write_out += (("%08X%08X%08X%08X%08X%08X%08X%08X,") % [frame_long_8, frame_long_7, frame_long_6, frame_long_5, frame_long_4, frame_long_3, frame_long_2, frame_long_1])
+ var total_frame_index = 1
+ var fstring = ""
+ for j in range(64):
+ var f_quartet = 0
+ for k in range(4):
+ if (index_get_safe(i, index_s_get_safe(total_frame_index, temp_data))):
+ f_quartet += int(pow(2, k))
+ total_frame_index += 1
+ fstring = ("%01X" % f_quartet) + fstring
+ write_out += fstring + ","
return write_out
func plot_data(data: String):
@@ -681,36 +917,12 @@ func plot_data(data: String):
evil_glass.append(movement_row.movement_bit)
for frame_string in data.split(","):
if (frame_string == ""): continue
- var frame_long_8 = frame_string.substr(0, 8).hex_to_int()
- var frame_long_7 = frame_string.substr(8, 8).hex_to_int()
- var frame_long_6 = frame_string.substr(16, 8).hex_to_int()
- var frame_long_5 = frame_string.substr(24, 8).hex_to_int()
- var frame_long_4 = frame_string.substr(32, 8).hex_to_int()
- var frame_long_3 = frame_string.substr(40, 8).hex_to_int()
- var frame_long_2 = frame_string.substr(48, 8).hex_to_int()
- var frame_long_1 = frame_string.substr(56, 8).hex_to_int()
+ var check_frame_split = frame_string.split()
+ check_frame_split.reverse()
for i in stages_info[current_stage]["bit_mapping"]:
var er = false
- var check_i = (i % 32) - 1
- var check_frame_segment = frame_long_1
- if (i <= 32):
- check_frame_segment = frame_long_1
- elif (i <= 64):
- check_frame_segment = frame_long_2
- elif (i <= 96):
- check_frame_segment = frame_long_3
- elif (i <= 128):
- check_frame_segment = frame_long_4
- elif (i <= 160):
- check_frame_segment = frame_long_5
- elif (i <= 192):
- check_frame_segment = frame_long_6
- elif (i <= 224):
- check_frame_segment = frame_long_7
- elif (i <= 256):
- check_frame_segment = frame_long_8
- if ((check_frame_segment & int(pow(2, check_i))) >> check_i == 1):
- er = true
+ 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)
@@ -726,3 +938,10 @@ func index_get_safe(cindex: int, data: Array[bool]) -> bool:
var out = data.get(cindex)
if (out == null): return false
return out
+
+func index_s_get_safe(cindex: int, data: Dictionary) -> Array[bool]:
+ if (cindex > data.size()-1): return [ false ]
+ if (cindex < 0): return [ false ]
+ var out = data.get(cindex)
+ if (out == null): return [ false ]
+ return out
diff --git a/Scripts/FlowControl.gd b/Scripts/FlowControl.gd
index a4c6fc7..66de06e 100644
--- a/Scripts/FlowControl.gd
+++ b/Scripts/FlowControl.gd
@@ -2,12 +2,13 @@ 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.name
+ $Panel/Label.text = self.vis_name
$Panel/InStepper.value = self.in_value
$Panel/OutStepper.value = self.out_value
diff --git a/Scripts/MovementButton.gd b/Scripts/MovementButton.gd
index 31bd90b..2e7e1c5 100644
--- a/Scripts/MovementButton.gd
+++ b/Scripts/MovementButton.gd
@@ -4,6 +4,8 @@ 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
@@ -18,7 +20,7 @@ func _ready() -> void:
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 + animatronic + " " + movement_name)
+ 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
diff --git a/Scripts/MovementRow.gd b/Scripts/MovementRow.gd
index 36b96e4..b02c8c3 100644
--- a/Scripts/MovementRow.gd
+++ b/Scripts/MovementRow.gd
@@ -4,6 +4,7 @@ extends Panel
@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
@@ -108,7 +109,7 @@ func _update_out_flow(new_value: float) -> void:
func _ready() -> void:
if (flow_path != "None"):
- var flow_control = get_node(flow_path + animatronic + " " + movement_name)
+ 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
diff --git a/Stages.md b/Stages.md
index 12731bd..8acdca4 100644
--- a/Stages.md
+++ b/Stages.md
@@ -2,7 +2,13 @@
## Currently in game
- - Helen House (not a real stage)
+ - Helen House (homemade stage)
+ - Chuck E's Corner (homemade stage)
+
+## In Development
+
+ - Balcony Stage
+ - Prototype Road Stage
## Planned
@@ -10,7 +16,6 @@
- Portrait Stage
- Shelf Stage (Portrait stage with Balcony mechs)
- - Balcony Stage
- C Stage
- Rocker Stage
- Road Stage
diff --git a/UI/PneumaticPlaything.icon/Assets/cylinder.svg b/UI/PneumaticPlaything.icon/Assets/cylinder.svg
new file mode 100644
index 0000000..d6749de
--- /dev/null
+++ b/UI/PneumaticPlaything.icon/Assets/cylinder.svg
@@ -0,0 +1,87 @@
+
+
+
+
diff --git a/UI/icon.svg.import b/UI/PneumaticPlaything.icon/Assets/cylinder.svg.import
similarity index 70%
rename from UI/icon.svg.import
rename to UI/PneumaticPlaything.icon/Assets/cylinder.svg.import
index 6fc4cc8..5c56810 100644
--- a/UI/icon.svg.import
+++ b/UI/PneumaticPlaything.icon/Assets/cylinder.svg.import
@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
-uid="uid://bm61nhm3rs043"
-path="res://.godot/imported/icon.svg-c9c2a32fd2d5f8bc98ecd887f02eeda7.ctex"
+uid="uid://1eluxvmnj7l7"
+path="res://.godot/imported/cylinder.svg-7c12310ad8fca6e1f959909a64d6d065.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://UI/icon.svg"
-dest_files=["res://.godot/imported/icon.svg-c9c2a32fd2d5f8bc98ecd887f02eeda7.ctex"]
+source_file="res://UI/PneumaticPlaything.icon/Assets/cylinder.svg"
+dest_files=["res://.godot/imported/cylinder.svg-7c12310ad8fca6e1f959909a64d6d065.ctex"]
[params]
diff --git a/UI/PneumaticPlaything.icon/Assets/green_lines.svg b/UI/PneumaticPlaything.icon/Assets/green_lines.svg
new file mode 100644
index 0000000..ce9309e
--- /dev/null
+++ b/UI/PneumaticPlaything.icon/Assets/green_lines.svg
@@ -0,0 +1,69 @@
+
+
+
+
diff --git a/UI/PneumaticPlaything.icon/Assets/green_lines.svg.import b/UI/PneumaticPlaything.icon/Assets/green_lines.svg.import
new file mode 100644
index 0000000..6881607
--- /dev/null
+++ b/UI/PneumaticPlaything.icon/Assets/green_lines.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dkg2eh0tfbji4"
+path="res://.godot/imported/green_lines.svg-af1cb631137e1105ee7be8775d8a5016.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://UI/PneumaticPlaything.icon/Assets/green_lines.svg"
+dest_files=["res://.godot/imported/green_lines.svg-af1cb631137e1105ee7be8775d8a5016.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/UI/PneumaticPlaything.icon/icon.json b/UI/PneumaticPlaything.icon/icon.json
new file mode 100644
index 0000000..1b2358d
--- /dev/null
+++ b/UI/PneumaticPlaything.icon/icon.json
@@ -0,0 +1,68 @@
+{
+ "fill" : {
+ "automatic-gradient" : "srgb:0.12984,0.12985,0.12984,1.00000"
+ },
+ "groups" : [
+ {
+ "layers" : [
+ {
+ "blend-mode" : "normal",
+ "fill" : {
+ "automatic-gradient" : "srgb:1.00000,1.00000,1.00000,1.00000"
+ },
+ "glass" : true,
+ "image-name" : "cylinder.svg",
+ "name" : "cylinder",
+ "position" : {
+ "scale" : 3,
+ "translation-in-points" : [
+ 0,
+ 0
+ ]
+ }
+ }
+ ],
+ "shadow" : {
+ "kind" : "neutral",
+ "opacity" : 0.5
+ },
+ "translucency" : {
+ "enabled" : true,
+ "value" : 0.5
+ }
+ },
+ {
+ "layers" : [
+ {
+ "fill" : {
+ "automatic-gradient" : "srgb:0.00000,0.97680,0.00000,1.00000"
+ },
+ "image-name" : "green_lines.svg",
+ "name" : "green_lines",
+ "opacity" : 1,
+ "position" : {
+ "scale" : 3.4,
+ "translation-in-points" : [
+ 0,
+ 0
+ ]
+ }
+ }
+ ],
+ "shadow" : {
+ "kind" : "neutral",
+ "opacity" : 0.5
+ },
+ "translucency" : {
+ "enabled" : true,
+ "value" : 0.5
+ }
+ }
+ ],
+ "supported-platforms" : {
+ "circles" : [
+ "watchOS"
+ ],
+ "squares" : "shared"
+ }
+}
\ No newline at end of file
diff --git a/UI/icon-32px.png b/UI/icon-32px.png
new file mode 100644
index 0000000..16574f1
Binary files /dev/null and b/UI/icon-32px.png differ
diff --git a/UI/icon-32px.png.import b/UI/icon-32px.png.import
new file mode 100644
index 0000000..6250137
--- /dev/null
+++ b/UI/icon-32px.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bpb3xn54kpxoe"
+path="res://.godot/imported/icon-32px.png-601da436f7467fcd6c395054742650f3.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://UI/icon-32px.png"
+dest_files=["res://.godot/imported/icon-32px.png-601da436f7467fcd6c395054742650f3.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/UI/icon-round.png b/UI/icon-round.png
new file mode 100644
index 0000000..fdbbf6c
Binary files /dev/null and b/UI/icon-round.png differ
diff --git a/UI/icon-round.png.import b/UI/icon-round.png.import
new file mode 100644
index 0000000..5f55748
--- /dev/null
+++ b/UI/icon-round.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://yqg6bh2fiumf"
+path="res://.godot/imported/icon-round.png-d13b0f9c2aed0f892b01044430866017.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://UI/icon-round.png"
+dest_files=["res://.godot/imported/icon-round.png-d13b0f9c2aed0f892b01044430866017.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/UI/icon.icns b/UI/icon.icns
new file mode 100644
index 0000000..cf6eb7e
Binary files /dev/null and b/UI/icon.icns differ
diff --git a/UI/icon.ico b/UI/icon.ico
new file mode 100644
index 0000000..59409c5
Binary files /dev/null and b/UI/icon.ico differ
diff --git a/UI/icon.png b/UI/icon.png
index 9886d6f..fc311ca 100644
Binary files a/UI/icon.png and b/UI/icon.png differ
diff --git a/UI/icon.png.import b/UI/icon.png.import
index 1fbd3b0..10cbd4d 100644
--- a/UI/icon.png.import
+++ b/UI/icon.png.import
@@ -2,7 +2,7 @@
importer="texture"
type="CompressedTexture2D"
-uid="uid://dkbo8r6il5rh7"
+uid="uid://cnvfrr028730a"
path="res://.godot/imported/icon.png-d44ad423496976af115f803f6386bc82.ctex"
metadata={
"vram_texture": false
diff --git a/UI/icon.svg b/UI/icon.svg
deleted file mode 100644
index 684d422..0000000
--- a/UI/icon.svg
+++ /dev/null
@@ -1,336 +0,0 @@
-
-
-
-
diff --git a/project.godot b/project.godot
index 7ba3e56..4b8bb8c 100644
--- a/project.godot
+++ b/project.godot
@@ -11,17 +11,23 @@ config_version=5
[application]
config/name="Pneumatic Plaything"
-config/version="v0.5.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://bm61nhm3rs043"
+config/icon="uid://cnvfrr028730a"
+config/macos_native_icon="res://UI/icon.icns"
+config/windows_native_icon="res://UI/icon.ico"
[display]
window/size/viewport_width=1280
window/size/viewport_height=720
+[filesystem]
+
+import/blender/enabled=false
+
[input]
ui_accept={
@@ -392,3 +398,5 @@ fullscreen={
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