diff --git a/.gitignore b/.gitignore
index e6e20995..2eae03de 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,5 +7,7 @@ export_presets.cfg
*.translation
.mono/
addons/discord_game_sdk/bin/**
-
+addons/discord_game_sdk/discord_game_sdk.dll
+addons/discord_game_sdk/discord_game_sdk.dylib
+override.cfg
.vscode/settings.json
diff --git a/LICENSE.txt b/LICENSE.txt
index 3db7fa55..8a8cd0d9 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -1,6 +1,6 @@
MIT License
-Copyright (c) 2022 Basil
+Copyright (c) 2022-2025 Lilian "Chedski" & Rhythia Contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/assets/font/NotoSansMono/NotoSansMono-Black.ttf b/assets/font/NotoSansMono/NotoSansMono-Black.ttf
new file mode 100644
index 00000000..ed87328b
Binary files /dev/null and b/assets/font/NotoSansMono/NotoSansMono-Black.ttf differ
diff --git a/assets/font/NotoSansMono/NotoSansMono-Bold.ttf b/assets/font/NotoSansMono/NotoSansMono-Bold.ttf
new file mode 100644
index 00000000..8073d573
Binary files /dev/null and b/assets/font/NotoSansMono/NotoSansMono-Bold.ttf differ
diff --git a/assets/font/NotoSansMono/NotoSansMono-ExtraBold.ttf b/assets/font/NotoSansMono/NotoSansMono-ExtraBold.ttf
new file mode 100644
index 00000000..a8617964
Binary files /dev/null and b/assets/font/NotoSansMono/NotoSansMono-ExtraBold.ttf differ
diff --git a/assets/font/NotoSansMono/NotoSansMono-ExtraLight.ttf b/assets/font/NotoSansMono/NotoSansMono-ExtraLight.ttf
new file mode 100644
index 00000000..0bfe1011
Binary files /dev/null and b/assets/font/NotoSansMono/NotoSansMono-ExtraLight.ttf differ
diff --git a/assets/font/NotoSansMono/NotoSansMono-Light.ttf b/assets/font/NotoSansMono/NotoSansMono-Light.ttf
new file mode 100644
index 00000000..2463d6bd
Binary files /dev/null and b/assets/font/NotoSansMono/NotoSansMono-Light.ttf differ
diff --git a/assets/font/NotoSansMono/NotoSansMono-Medium.ttf b/assets/font/NotoSansMono/NotoSansMono-Medium.ttf
new file mode 100644
index 00000000..6ebf2d5e
Binary files /dev/null and b/assets/font/NotoSansMono/NotoSansMono-Medium.ttf differ
diff --git a/assets/font/NotoSansMono/NotoSansMono-Regular.ttf b/assets/font/NotoSansMono/NotoSansMono-Regular.ttf
new file mode 100644
index 00000000..ff9389ae
Binary files /dev/null and b/assets/font/NotoSansMono/NotoSansMono-Regular.ttf differ
diff --git a/assets/font/NotoSansMono/NotoSansMono-SemiBold.ttf b/assets/font/NotoSansMono/NotoSansMono-SemiBold.ttf
new file mode 100644
index 00000000..d0ec3860
Binary files /dev/null and b/assets/font/NotoSansMono/NotoSansMono-SemiBold.ttf differ
diff --git a/assets/font/NotoSansMono/NotoSansMono-Thin.ttf b/assets/font/NotoSansMono/NotoSansMono-Thin.ttf
new file mode 100644
index 00000000..26988150
Binary files /dev/null and b/assets/font/NotoSansMono/NotoSansMono-Thin.ttf differ
diff --git a/assets/images/branding/icon.png.import b/assets/images/branding/icon.png.import
index 6775976c..82ba7ed0 100644
--- a/assets/images/branding/icon.png.import
+++ b/assets/images/branding/icon.png.import
@@ -2,28 +2,31 @@
importer="texture"
type="StreamTexture"
-path="res://.import/icon.png-29103d28d10c95ea8b4bc51a2d70e8db.stex"
+path.s3tc="res://.import/icon.png-29103d28d10c95ea8b4bc51a2d70e8db.s3tc.stex"
+path.etc2="res://.import/icon.png-29103d28d10c95ea8b4bc51a2d70e8db.etc2.stex"
+path.etc="res://.import/icon.png-29103d28d10c95ea8b4bc51a2d70e8db.etc.stex"
metadata={
-"vram_texture": false
+"imported_formats": [ "s3tc", "etc2", "etc" ],
+"vram_texture": true
}
[deps]
source_file="res://assets/images/branding/icon.png"
-dest_files=[ "res://.import/icon.png-29103d28d10c95ea8b4bc51a2d70e8db.stex" ]
+dest_files=[ "res://.import/icon.png-29103d28d10c95ea8b4bc51a2d70e8db.s3tc.stex", "res://.import/icon.png-29103d28d10c95ea8b4bc51a2d70e8db.etc2.stex", "res://.import/icon.png-29103d28d10c95ea8b4bc51a2d70e8db.etc.stex" ]
[params]
-compress/mode=0
+compress/mode=2
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
-flags/repeat=0
+flags/repeat=true
flags/filter=true
-flags/mipmaps=false
+flags/mipmaps=true
flags/anisotropic=false
-flags/srgb=2
+flags/srgb=1
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
@@ -31,5 +34,5 @@ process/invert_color=false
process/normal_map_invert_y=false
stream=false
size_limit=0
-detect_3d=true
+detect_3d=false
svg/scale=1.0
diff --git a/assets/images/branding/icon_glow.png b/assets/images/branding/icon_glow.png
new file mode 100644
index 00000000..1f0882c3
Binary files /dev/null and b/assets/images/branding/icon_glow.png differ
diff --git a/assets/images/branding/icon_glow.png.import b/assets/images/branding/icon_glow.png.import
new file mode 100644
index 00000000..92cbe100
--- /dev/null
+++ b/assets/images/branding/icon_glow.png.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path.s3tc="res://.import/icon_glow.png-687175a5ec6e4d83730911ebf311ef40.s3tc.stex"
+path.etc2="res://.import/icon_glow.png-687175a5ec6e4d83730911ebf311ef40.etc2.stex"
+path.etc="res://.import/icon_glow.png-687175a5ec6e4d83730911ebf311ef40.etc.stex"
+metadata={
+"imported_formats": [ "s3tc", "etc2", "etc" ],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/images/branding/icon_glow.png"
+dest_files=[ "res://.import/icon_glow.png-687175a5ec6e4d83730911ebf311ef40.s3tc.stex", "res://.import/icon_glow.png-687175a5ec6e4d83730911ebf311ef40.etc2.stex", "res://.import/icon_glow.png-687175a5ec6e4d83730911ebf311ef40.etc.stex" ]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=true
+flags/filter=true
+flags/mipmaps=true
+flags/anisotropic=false
+flags/srgb=1
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/assets/images/branding/logo.png.import b/assets/images/branding/logo.png.import
index 70120a85..40615148 100644
--- a/assets/images/branding/logo.png.import
+++ b/assets/images/branding/logo.png.import
@@ -2,28 +2,31 @@
importer="texture"
type="StreamTexture"
-path="res://.import/logo.png-51e5047df242d51d76015b7ce520fd5b.stex"
+path.s3tc="res://.import/logo.png-51e5047df242d51d76015b7ce520fd5b.s3tc.stex"
+path.etc2="res://.import/logo.png-51e5047df242d51d76015b7ce520fd5b.etc2.stex"
+path.etc="res://.import/logo.png-51e5047df242d51d76015b7ce520fd5b.etc.stex"
metadata={
-"vram_texture": false
+"imported_formats": [ "s3tc", "etc2", "etc" ],
+"vram_texture": true
}
[deps]
source_file="res://assets/images/branding/logo.png"
-dest_files=[ "res://.import/logo.png-51e5047df242d51d76015b7ce520fd5b.stex" ]
+dest_files=[ "res://.import/logo.png-51e5047df242d51d76015b7ce520fd5b.s3tc.stex", "res://.import/logo.png-51e5047df242d51d76015b7ce520fd5b.etc2.stex", "res://.import/logo.png-51e5047df242d51d76015b7ce520fd5b.etc.stex" ]
[params]
-compress/mode=0
+compress/mode=2
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
-flags/repeat=0
+flags/repeat=true
flags/filter=true
-flags/mipmaps=false
+flags/mipmaps=true
flags/anisotropic=false
-flags/srgb=2
+flags/srgb=1
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
@@ -31,5 +34,5 @@ process/invert_color=false
process/normal_map_invert_y=false
stream=false
size_limit=0
-detect_3d=true
+detect_3d=false
svg/scale=1.0
diff --git a/assets/images/devbg.png b/assets/images/devbg.png
new file mode 100644
index 00000000..4974feaf
Binary files /dev/null and b/assets/images/devbg.png differ
diff --git a/assets/images/devbg.png.import b/assets/images/devbg.png.import
new file mode 100644
index 00000000..9d4806e6
--- /dev/null
+++ b/assets/images/devbg.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/devbg.png-d8b2b40ed647588cf99b30dcf0a7fd69.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/images/devbg.png"
+dest_files=[ "res://.import/devbg.png-d8b2b40ed647588cf99b30dcf0a7fd69.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/images/menu3d/badges/bot.svg b/assets/images/menu3d/badges/bot.svg
new file mode 100644
index 00000000..3a15b779
--- /dev/null
+++ b/assets/images/menu3d/badges/bot.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/menu3d/badges/bot.svg.import b/assets/images/menu3d/badges/bot.svg.import
new file mode 100644
index 00000000..e3594862
--- /dev/null
+++ b/assets/images/menu3d/badges/bot.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/bot.svg-95b9d73e5ae7a57ac59c85ef06946871.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/badges/bot.svg"
+dest_files=[ "res://.import/bot.svg-95b9d73e5ae7a57ac59c85ef06946871.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/images/menu3d/badges/bughunter.svg b/assets/images/menu3d/badges/bughunter.svg
new file mode 100644
index 00000000..69d45ef8
--- /dev/null
+++ b/assets/images/menu3d/badges/bughunter.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/menu3d/badges/bughunter.svg.import b/assets/images/menu3d/badges/bughunter.svg.import
new file mode 100644
index 00000000..ab9594fb
--- /dev/null
+++ b/assets/images/menu3d/badges/bughunter.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/bughunter.svg-7b43ec76145db137e0c47b3ae265e193.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/badges/bughunter.svg"
+dest_files=[ "res://.import/bughunter.svg-7b43ec76145db137e0c47b3ae265e193.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/images/menu3d/badges/cat.svg b/assets/images/menu3d/badges/cat.svg
new file mode 100644
index 00000000..c742a8f2
--- /dev/null
+++ b/assets/images/menu3d/badges/cat.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/menu3d/badges/cat.svg.import b/assets/images/menu3d/badges/cat.svg.import
new file mode 100644
index 00000000..d852bda6
--- /dev/null
+++ b/assets/images/menu3d/badges/cat.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/cat.svg-22fdbda54b59981223ccc3b5d375a638.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/badges/cat.svg"
+dest_files=[ "res://.import/cat.svg-22fdbda54b59981223ccc3b5d375a638.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/images/menu3d/badges/contentcreator.svg b/assets/images/menu3d/badges/contentcreator.svg
new file mode 100644
index 00000000..3a05f3cc
--- /dev/null
+++ b/assets/images/menu3d/badges/contentcreator.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/menu3d/badges/contentcreator.svg.import b/assets/images/menu3d/badges/contentcreator.svg.import
new file mode 100644
index 00000000..11a1e8c6
--- /dev/null
+++ b/assets/images/menu3d/badges/contentcreator.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/contentcreator.svg-89024b128e553a074c5f86d0d6b0611a.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/badges/contentcreator.svg"
+dest_files=[ "res://.import/contentcreator.svg-89024b128e553a074c5f86d0d6b0611a.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/images/menu3d/badges/contestwinner.svg b/assets/images/menu3d/badges/contestwinner.svg
new file mode 100644
index 00000000..c7770e07
--- /dev/null
+++ b/assets/images/menu3d/badges/contestwinner.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/menu3d/badges/contestwinner.svg.import b/assets/images/menu3d/badges/contestwinner.svg.import
new file mode 100644
index 00000000..051a127e
--- /dev/null
+++ b/assets/images/menu3d/badges/contestwinner.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/contestwinner.svg-c6fbb13160c1be12cebb4060e763e366.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/badges/contestwinner.svg"
+dest_files=[ "res://.import/contestwinner.svg-c6fbb13160c1be12cebb4060e763e366.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/images/menu3d/badges/developer.svg b/assets/images/menu3d/badges/developer.svg
new file mode 100644
index 00000000..d038d9b5
--- /dev/null
+++ b/assets/images/menu3d/badges/developer.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/menu3d/badges/developer.svg.import b/assets/images/menu3d/badges/developer.svg.import
new file mode 100644
index 00000000..8d0e4d73
--- /dev/null
+++ b/assets/images/menu3d/badges/developer.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/developer.svg-7489458574237ba3e77b571bda2ca81e.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/badges/developer.svg"
+dest_files=[ "res://.import/developer.svg-7489458574237ba3e77b571bda2ca81e.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/images/menu3d/badges/earlybird.svg b/assets/images/menu3d/badges/earlybird.svg
new file mode 100644
index 00000000..1ac3f6c3
--- /dev/null
+++ b/assets/images/menu3d/badges/earlybird.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/menu3d/badges/earlybird.svg.import b/assets/images/menu3d/badges/earlybird.svg.import
new file mode 100644
index 00000000..3057bf73
--- /dev/null
+++ b/assets/images/menu3d/badges/earlybird.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/earlybird.svg-54c09a23e09940ef048f94e7d70bb08a.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/badges/earlybird.svg"
+dest_files=[ "res://.import/earlybird.svg-54c09a23e09940ef048f94e7d70bb08a.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/images/menu3d/badges/map_legacy.svg b/assets/images/menu3d/badges/map_legacy.svg
new file mode 100644
index 00000000..7dec7873
--- /dev/null
+++ b/assets/images/menu3d/badges/map_legacy.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/menu3d/badges/map_legacy.svg.import b/assets/images/menu3d/badges/map_legacy.svg.import
new file mode 100644
index 00000000..0b8bba54
--- /dev/null
+++ b/assets/images/menu3d/badges/map_legacy.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/map_legacy.svg-f851470155a54941f3acf3bbcab4caad.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/badges/map_legacy.svg"
+dest_files=[ "res://.import/map_legacy.svg-f851470155a54941f3acf3bbcab4caad.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/images/menu3d/badges/map_offline.svg b/assets/images/menu3d/badges/map_offline.svg
new file mode 100644
index 00000000..ebc3e3a0
--- /dev/null
+++ b/assets/images/menu3d/badges/map_offline.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/menu3d/badges/map_offline.svg.import b/assets/images/menu3d/badges/map_offline.svg.import
new file mode 100644
index 00000000..03d7c76f
--- /dev/null
+++ b/assets/images/menu3d/badges/map_offline.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/map_offline.svg-286886aa5742710a72f9f42eaac456a5.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/badges/map_offline.svg"
+dest_files=[ "res://.import/map_offline.svg-286886aa5742710a72f9f42eaac456a5.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/images/menu3d/badges/map_online.svg b/assets/images/menu3d/badges/map_online.svg
new file mode 100644
index 00000000..b26419ce
--- /dev/null
+++ b/assets/images/menu3d/badges/map_online.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/menu3d/badges/map_online.svg.import b/assets/images/menu3d/badges/map_online.svg.import
new file mode 100644
index 00000000..bb6895ac
--- /dev/null
+++ b/assets/images/menu3d/badges/map_online.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/map_online.svg-fa948c47a00ee9d091ef3a9acb779efc.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/badges/map_online.svg"
+dest_files=[ "res://.import/map_online.svg-fa948c47a00ee9d091ef3a9acb779efc.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/images/menu3d/badges/map_ranked.svg b/assets/images/menu3d/badges/map_ranked.svg
new file mode 100644
index 00000000..f5d28095
--- /dev/null
+++ b/assets/images/menu3d/badges/map_ranked.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/menu3d/badges/map_ranked.svg.import b/assets/images/menu3d/badges/map_ranked.svg.import
new file mode 100644
index 00000000..e2c66b6e
--- /dev/null
+++ b/assets/images/menu3d/badges/map_ranked.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/map_ranked.svg-3b32da5c482a15ac758ea6bfd3acb58d.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/badges/map_ranked.svg"
+dest_files=[ "res://.import/map_ranked.svg-3b32da5c482a15ac758ea6bfd3acb58d.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/images/menu3d/badges/map_review_pending.svg b/assets/images/menu3d/badges/map_review_pending.svg
new file mode 100644
index 00000000..de0f810d
--- /dev/null
+++ b/assets/images/menu3d/badges/map_review_pending.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/menu3d/badges/map_review_pending.svg.import b/assets/images/menu3d/badges/map_review_pending.svg.import
new file mode 100644
index 00000000..d262cedf
--- /dev/null
+++ b/assets/images/menu3d/badges/map_review_pending.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/map_review_pending.svg-d821f8c8f83b78a3f79aea698148309b.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/badges/map_review_pending.svg"
+dest_files=[ "res://.import/map_review_pending.svg-d821f8c8f83b78a3f79aea698148309b.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/images/menu3d/badges/map_unranked.svg b/assets/images/menu3d/badges/map_unranked.svg
new file mode 100644
index 00000000..1fdde770
--- /dev/null
+++ b/assets/images/menu3d/badges/map_unranked.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/menu3d/badges/map_unranked.svg.import b/assets/images/menu3d/badges/map_unranked.svg.import
new file mode 100644
index 00000000..9ce7d281
--- /dev/null
+++ b/assets/images/menu3d/badges/map_unranked.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/map_unranked.svg-4ca2bec1bd639ff8c8c2c05df7ffb44e.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/badges/map_unranked.svg"
+dest_files=[ "res://.import/map_unranked.svg-4ca2bec1bd639ff8c8c2c05df7ffb44e.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/images/menu3d/badges/map_wip.svg b/assets/images/menu3d/badges/map_wip.svg
new file mode 100644
index 00000000..c2ad9483
--- /dev/null
+++ b/assets/images/menu3d/badges/map_wip.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/menu3d/badges/map_wip.svg.import b/assets/images/menu3d/badges/map_wip.svg.import
new file mode 100644
index 00000000..aac5390a
--- /dev/null
+++ b/assets/images/menu3d/badges/map_wip.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/map_wip.svg-f1201042dd62dd5cebd012a26946a400.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/badges/map_wip.svg"
+dest_files=[ "res://.import/map_wip.svg-f1201042dd62dd5cebd012a26946a400.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/images/menu3d/badges/mmt.svg b/assets/images/menu3d/badges/mmt.svg
new file mode 100644
index 00000000..0a17b52c
--- /dev/null
+++ b/assets/images/menu3d/badges/mmt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/menu3d/badges/mmt.svg.import b/assets/images/menu3d/badges/mmt.svg.import
new file mode 100644
index 00000000..ffabb202
--- /dev/null
+++ b/assets/images/menu3d/badges/mmt.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/mmt.svg-f659ef8598481f4d6ab1408724685f6d.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/badges/mmt.svg"
+dest_files=[ "res://.import/mmt.svg-f659ef8598481f4d6ab1408724685f6d.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/images/menu3d/badges/moderator.svg b/assets/images/menu3d/badges/moderator.svg
new file mode 100644
index 00000000..793f7002
--- /dev/null
+++ b/assets/images/menu3d/badges/moderator.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/menu3d/badges/moderator.svg.import b/assets/images/menu3d/badges/moderator.svg.import
new file mode 100644
index 00000000..885aae25
--- /dev/null
+++ b/assets/images/menu3d/badges/moderator.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/moderator.svg-ac50c24c1ad4e51224df71385dd6664a.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/badges/moderator.svg"
+dest_files=[ "res://.import/moderator.svg-ac50c24c1ad4e51224df71385dd6664a.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/images/menu3d/badges/rct.svg b/assets/images/menu3d/badges/rct.svg
new file mode 100644
index 00000000..8d33fbb0
--- /dev/null
+++ b/assets/images/menu3d/badges/rct.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/menu3d/badges/rct.svg.import b/assets/images/menu3d/badges/rct.svg.import
new file mode 100644
index 00000000..53515ab1
--- /dev/null
+++ b/assets/images/menu3d/badges/rct.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/rct.svg-a68ee6d21616f711e9cadda76749fed6.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/badges/rct.svg"
+dest_files=[ "res://.import/rct.svg-a68ee6d21616f711e9cadda76749fed6.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/images/menu3d/badges/silenced.svg b/assets/images/menu3d/badges/silenced.svg
new file mode 100644
index 00000000..de86c627
--- /dev/null
+++ b/assets/images/menu3d/badges/silenced.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/menu3d/badges/silenced.svg.import b/assets/images/menu3d/badges/silenced.svg.import
new file mode 100644
index 00000000..a46f213e
--- /dev/null
+++ b/assets/images/menu3d/badges/silenced.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/silenced.svg-7be15cdee264af184fe27076a5d26825.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/badges/silenced.svg"
+dest_files=[ "res://.import/silenced.svg-7be15cdee264af184fe27076a5d26825.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/images/menu3d/badges/supporter.svg b/assets/images/menu3d/badges/supporter.svg
new file mode 100644
index 00000000..d92c51a8
--- /dev/null
+++ b/assets/images/menu3d/badges/supporter.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/menu3d/badges/supporter.svg.import b/assets/images/menu3d/badges/supporter.svg.import
new file mode 100644
index 00000000..32291e38
--- /dev/null
+++ b/assets/images/menu3d/badges/supporter.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/supporter.svg-6f7f47353d0b2129d9d545af950e68bc.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/badges/supporter.svg"
+dest_files=[ "res://.import/supporter.svg-6f7f47353d0b2129d9d545af950e68bc.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/images/menu3d/badges/tester.svg b/assets/images/menu3d/badges/tester.svg
new file mode 100644
index 00000000..b32d027c
--- /dev/null
+++ b/assets/images/menu3d/badges/tester.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/menu3d/badges/tester.svg.import b/assets/images/menu3d/badges/tester.svg.import
new file mode 100644
index 00000000..ecb6081e
--- /dev/null
+++ b/assets/images/menu3d/badges/tester.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/tester.svg-87392929331ce95f45e14a546a54caf7.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/badges/tester.svg"
+dest_files=[ "res://.import/tester.svg-87392929331ce95f45e14a546a54caf7.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/images/menu3d/badges/top50.svg b/assets/images/menu3d/badges/top50.svg
new file mode 100644
index 00000000..3197d50a
--- /dev/null
+++ b/assets/images/menu3d/badges/top50.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/menu3d/badges/top50.svg.import b/assets/images/menu3d/badges/top50.svg.import
new file mode 100644
index 00000000..d0738b78
--- /dev/null
+++ b/assets/images/menu3d/badges/top50.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/top50.svg-99a9a6b8ff9d044b63cedf7bde79af0a.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/badges/top50.svg"
+dest_files=[ "res://.import/top50.svg-99a9a6b8ff9d044b63cedf7bde79af0a.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/images/menu3d/bgtile.svg b/assets/images/menu3d/bgtile.svg
new file mode 100644
index 00000000..f0afb1fe
--- /dev/null
+++ b/assets/images/menu3d/bgtile.svg
@@ -0,0 +1,114 @@
+
+
diff --git a/assets/images/menu3d/bgtile.svg.import b/assets/images/menu3d/bgtile.svg.import
new file mode 100644
index 00000000..5fa575ff
--- /dev/null
+++ b/assets/images/menu3d/bgtile.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path.s3tc="res://.import/bgtile.svg-9642330d3ac688ef4d0f013249a85348.s3tc.stex"
+path.etc2="res://.import/bgtile.svg-9642330d3ac688ef4d0f013249a85348.etc2.stex"
+path.etc="res://.import/bgtile.svg-9642330d3ac688ef4d0f013249a85348.etc.stex"
+metadata={
+"imported_formats": [ "s3tc", "etc2", "etc" ],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/bgtile.svg"
+dest_files=[ "res://.import/bgtile.svg-9642330d3ac688ef4d0f013249a85348.s3tc.stex", "res://.import/bgtile.svg-9642330d3ac688ef4d0f013249a85348.etc2.stex", "res://.import/bgtile.svg-9642330d3ac688ef4d0f013249a85348.etc.stex" ]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=true
+flags/filter=true
+flags/mipmaps=true
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/assets/images/menu3d/bgtile_b.png b/assets/images/menu3d/bgtile_b.png
new file mode 100644
index 00000000..64dc12db
Binary files /dev/null and b/assets/images/menu3d/bgtile_b.png differ
diff --git a/assets/images/menu3d/bgtile_b.png.import b/assets/images/menu3d/bgtile_b.png.import
new file mode 100644
index 00000000..e69c31e5
--- /dev/null
+++ b/assets/images/menu3d/bgtile_b.png.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path.s3tc="res://.import/bgtile_b.png-d08429989f1fe15cf447748ae543045f.s3tc.stex"
+path.etc2="res://.import/bgtile_b.png-d08429989f1fe15cf447748ae543045f.etc2.stex"
+path.etc="res://.import/bgtile_b.png-d08429989f1fe15cf447748ae543045f.etc.stex"
+metadata={
+"imported_formats": [ "s3tc", "etc2", "etc" ],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/bgtile_b.png"
+dest_files=[ "res://.import/bgtile_b.png-d08429989f1fe15cf447748ae543045f.s3tc.stex", "res://.import/bgtile_b.png-d08429989f1fe15cf447748ae543045f.etc2.stex", "res://.import/bgtile_b.png-d08429989f1fe15cf447748ae543045f.etc.stex" ]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=2
+flags/repeat=1
+flags/filter=true
+flags/mipmaps=true
+flags/anisotropic=false
+flags/srgb=1
+process/fix_alpha_border=false
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/assets/images/menu3d/bgtile_b.svg b/assets/images/menu3d/bgtile_b.svg
new file mode 100644
index 00000000..b28cf3bf
--- /dev/null
+++ b/assets/images/menu3d/bgtile_b.svg
@@ -0,0 +1,169 @@
+
+
diff --git a/assets/images/menu3d/bgtile_b.svg.import b/assets/images/menu3d/bgtile_b.svg.import
new file mode 100644
index 00000000..e820aa35
--- /dev/null
+++ b/assets/images/menu3d/bgtile_b.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path.s3tc="res://.import/bgtile_b.svg-cdda2294c7b84d76faa31721f7ba2b42.s3tc.stex"
+path.etc2="res://.import/bgtile_b.svg-cdda2294c7b84d76faa31721f7ba2b42.etc2.stex"
+path.etc="res://.import/bgtile_b.svg-cdda2294c7b84d76faa31721f7ba2b42.etc.stex"
+metadata={
+"imported_formats": [ "s3tc", "etc2", "etc" ],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/bgtile_b.svg"
+dest_files=[ "res://.import/bgtile_b.svg-cdda2294c7b84d76faa31721f7ba2b42.s3tc.stex", "res://.import/bgtile_b.svg-cdda2294c7b84d76faa31721f7ba2b42.etc2.stex", "res://.import/bgtile_b.svg-cdda2294c7b84d76faa31721f7ba2b42.etc.stex" ]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=true
+flags/filter=true
+flags/mipmaps=true
+flags/anisotropic=false
+flags/srgb=1
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/assets/images/menu3d/icons/account.svg b/assets/images/menu3d/icons/account.svg
new file mode 100644
index 00000000..76710665
--- /dev/null
+++ b/assets/images/menu3d/icons/account.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/menu3d/icons/account.svg.import b/assets/images/menu3d/icons/account.svg.import
new file mode 100644
index 00000000..e7d66b14
--- /dev/null
+++ b/assets/images/menu3d/icons/account.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/account.svg-3c52112a196c970a6d0299b01ce2d424.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/icons/account.svg"
+dest_files=[ "res://.import/account.svg-3c52112a196c970a6d0299b01ce2d424.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/images/menu3d/icons/account_signedout.svg b/assets/images/menu3d/icons/account_signedout.svg
new file mode 100644
index 00000000..e6ae8d89
--- /dev/null
+++ b/assets/images/menu3d/icons/account_signedout.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/menu3d/icons/account_signedout.svg.import b/assets/images/menu3d/icons/account_signedout.svg.import
new file mode 100644
index 00000000..dcfa22c5
--- /dev/null
+++ b/assets/images/menu3d/icons/account_signedout.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/account_signedout.svg-6f406cb891f58bcf33dbd2c16924daee.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/icons/account_signedout.svg"
+dest_files=[ "res://.import/account_signedout.svg-6f406cb891f58bcf33dbd2c16924daee.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/images/menu3d/icons/advanced.svg b/assets/images/menu3d/icons/advanced.svg
new file mode 100644
index 00000000..7794db7e
--- /dev/null
+++ b/assets/images/menu3d/icons/advanced.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/menu3d/icons/advanced.svg.import b/assets/images/menu3d/icons/advanced.svg.import
new file mode 100644
index 00000000..c797ebc3
--- /dev/null
+++ b/assets/images/menu3d/icons/advanced.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/advanced.svg-0152e6c9fd776c1dbfd58bb4a83d7af9.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/icons/advanced.svg"
+dest_files=[ "res://.import/advanced.svg-0152e6c9fd776c1dbfd58bb4a83d7af9.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/images/menu3d/icons/maintenance.svg b/assets/images/menu3d/icons/maintenance.svg
new file mode 100644
index 00000000..f79d4b1c
--- /dev/null
+++ b/assets/images/menu3d/icons/maintenance.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/menu3d/icons/maintenance.svg.import b/assets/images/menu3d/icons/maintenance.svg.import
new file mode 100644
index 00000000..1a8a8fb2
--- /dev/null
+++ b/assets/images/menu3d/icons/maintenance.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/maintenance.svg-d7fca4f3c981ec7e089801427cc303ce.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/icons/maintenance.svg"
+dest_files=[ "res://.import/maintenance.svg-d7fca4f3c981ec7e089801427cc303ce.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/images/menu3d/icons/mapbrowser.svg b/assets/images/menu3d/icons/mapbrowser.svg
new file mode 100644
index 00000000..8aae2292
--- /dev/null
+++ b/assets/images/menu3d/icons/mapbrowser.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/menu3d/icons/mapbrowser.svg.import b/assets/images/menu3d/icons/mapbrowser.svg.import
new file mode 100644
index 00000000..11fd3411
--- /dev/null
+++ b/assets/images/menu3d/icons/mapbrowser.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/mapbrowser.svg-1a97ab791aafeb6d2fe159bbfcd468ae.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/icons/mapbrowser.svg"
+dest_files=[ "res://.import/mapbrowser.svg-1a97ab791aafeb6d2fe159bbfcd468ae.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/images/menu3d/icons/online.svg b/assets/images/menu3d/icons/online.svg
new file mode 100644
index 00000000..c7dd33a4
--- /dev/null
+++ b/assets/images/menu3d/icons/online.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/menu3d/icons/online.svg.import b/assets/images/menu3d/icons/online.svg.import
new file mode 100644
index 00000000..decefaaa
--- /dev/null
+++ b/assets/images/menu3d/icons/online.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/online.svg-b44215a388d863d4cf56c9736c98474b.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/icons/online.svg"
+dest_files=[ "res://.import/online.svg-b44215a388d863d4cf56c9736c98474b.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/images/menu3d/icons/online_no.svg b/assets/images/menu3d/icons/online_no.svg
new file mode 100644
index 00000000..d77e33c7
--- /dev/null
+++ b/assets/images/menu3d/icons/online_no.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/menu3d/icons/online_no.svg.import b/assets/images/menu3d/icons/online_no.svg.import
new file mode 100644
index 00000000..d127c348
--- /dev/null
+++ b/assets/images/menu3d/icons/online_no.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/online_no.svg-636634f13b95d22ef6560c58471d8e78.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/icons/online_no.svg"
+dest_files=[ "res://.import/online_no.svg-636634f13b95d22ef6560c58471d8e78.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/images/menu3d/icons/prohibit.svg b/assets/images/menu3d/icons/prohibit.svg
new file mode 100644
index 00000000..b544dd9d
--- /dev/null
+++ b/assets/images/menu3d/icons/prohibit.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/menu3d/icons/prohibit.svg.import b/assets/images/menu3d/icons/prohibit.svg.import
new file mode 100644
index 00000000..924cbc76
--- /dev/null
+++ b/assets/images/menu3d/icons/prohibit.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/prohibit.svg-3e3999183801678cc63da8b4d86ee119.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/icons/prohibit.svg"
+dest_files=[ "res://.import/prohibit.svg-3e3999183801678cc63da8b4d86ee119.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/images/menu3d/icons/sword.svg b/assets/images/menu3d/icons/sword.svg
new file mode 100644
index 00000000..21d79e7d
--- /dev/null
+++ b/assets/images/menu3d/icons/sword.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/menu3d/icons/sword.svg.import b/assets/images/menu3d/icons/sword.svg.import
new file mode 100644
index 00000000..474e2031
--- /dev/null
+++ b/assets/images/menu3d/icons/sword.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/sword.svg-bd8f4d59ce659058cda4327fe80f6e06.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/images/menu3d/icons/sword.svg"
+dest_files=[ "res://.import/sword.svg-bd8f4d59ce659058cda4327fe80f6e06.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/assets/notefx/explosion/explosion.gd b/assets/notefx/explosion/explosion.gd
new file mode 100644
index 00000000..a90989b3
--- /dev/null
+++ b/assets/notefx/explosion/explosion.gd
@@ -0,0 +1,29 @@
+extends Spatial
+
+var active:bool = false
+var menu:bool = false
+
+func _process(delta):
+ if active:
+ if $Particles.emitting == false:
+ active = false
+ queue_free()
+ return
+
+func spawn_menu(parent:Node,col:Color,transform:Transform):
+ menu = true
+# setup("ssp_explosion",false)
+ global_transform = transform
+ spawn(parent,transform.origin,col,"ssp_explosion",false)
+
+func spawn(parent:Node,pos:Vector3,col:Color,id:String,miss:bool):
+ transform.origin = pos
+ parent.add_child(self)
+ visible = true
+ $Particles.emitting = true
+ active = true
+
+func setup(id:String,miss:bool):
+ if id == "ssp_explosion_t":
+ $Particles.material_override = $Particles.material_override.duplicate()
+ $Particles.material_override.albedo_color = Color(1.0,1.0,1.0,0.3)
diff --git a/assets/notefx/explosion/explosion.tres b/assets/notefx/explosion/explosion.tres
new file mode 100644
index 00000000..49eb2497
--- /dev/null
+++ b/assets/notefx/explosion/explosion.tres
@@ -0,0 +1,57 @@
+[gd_resource type="AnimatedTexture" load_steps=18 format=2]
+
+[ext_resource path="res://assets/notefx/explosion/explosion01.png" type="Texture" id=1]
+[ext_resource path="res://assets/notefx/explosion/explosion02.png" type="Texture" id=2]
+[ext_resource path="res://assets/notefx/explosion/explosion06.png" type="Texture" id=3]
+[ext_resource path="res://assets/notefx/explosion/explosion03.png" type="Texture" id=4]
+[ext_resource path="res://assets/notefx/explosion/explosion07.png" type="Texture" id=5]
+[ext_resource path="res://assets/notefx/explosion/explosion04.png" type="Texture" id=6]
+[ext_resource path="res://assets/notefx/explosion/explosion05.png" type="Texture" id=7]
+[ext_resource path="res://assets/notefx/explosion/explosion11.png" type="Texture" id=8]
+[ext_resource path="res://assets/notefx/explosion/explosion10.png" type="Texture" id=9]
+[ext_resource path="res://assets/notefx/explosion/explosion09.png" type="Texture" id=10]
+[ext_resource path="res://assets/notefx/explosion/explosion14.png" type="Texture" id=11]
+[ext_resource path="res://assets/notefx/explosion/explosion08.png" type="Texture" id=12]
+[ext_resource path="res://assets/notefx/explosion/explosion15.png" type="Texture" id=13]
+[ext_resource path="res://assets/notefx/explosion/explosion17.png" type="Texture" id=14]
+[ext_resource path="res://assets/notefx/explosion/explosion12.png" type="Texture" id=15]
+[ext_resource path="res://assets/notefx/explosion/explosion13.png" type="Texture" id=16]
+[ext_resource path="res://assets/notefx/explosion/explosion16.png" type="Texture" id=17]
+
+[resource]
+flags = 23
+frames = 17
+fps = 10.0
+frame_0/texture = ExtResource( 1 )
+frame_1/texture = ExtResource( 2 )
+frame_1/delay_sec = 0.0
+frame_2/texture = ExtResource( 4 )
+frame_2/delay_sec = 0.0
+frame_3/texture = ExtResource( 6 )
+frame_3/delay_sec = 0.0
+frame_4/texture = ExtResource( 7 )
+frame_4/delay_sec = 0.0
+frame_5/texture = ExtResource( 3 )
+frame_5/delay_sec = 0.0
+frame_6/texture = ExtResource( 5 )
+frame_6/delay_sec = 0.0
+frame_7/texture = ExtResource( 12 )
+frame_7/delay_sec = 0.0
+frame_8/texture = ExtResource( 10 )
+frame_8/delay_sec = 0.0
+frame_9/texture = ExtResource( 9 )
+frame_9/delay_sec = 0.0
+frame_10/texture = ExtResource( 8 )
+frame_10/delay_sec = 0.0
+frame_11/texture = ExtResource( 15 )
+frame_11/delay_sec = 0.0
+frame_12/texture = ExtResource( 16 )
+frame_12/delay_sec = 0.0
+frame_13/texture = ExtResource( 11 )
+frame_13/delay_sec = 0.0
+frame_14/texture = ExtResource( 13 )
+frame_14/delay_sec = 0.0
+frame_15/texture = ExtResource( 17 )
+frame_15/delay_sec = 0.0
+frame_16/texture = ExtResource( 14 )
+frame_16/delay_sec = 0.0
diff --git a/assets/notefx/explosion/explosion.tscn b/assets/notefx/explosion/explosion.tscn
new file mode 100644
index 00000000..46e7afab
--- /dev/null
+++ b/assets/notefx/explosion/explosion.tscn
@@ -0,0 +1,42 @@
+[gd_scene load_steps=8 format=2]
+
+[ext_resource path="res://assets/notefx/explosion/explosion.gd" type="Script" id=1]
+[ext_resource path="res://assets/notefx/explosion/explosion_spritesheet.png" type="Texture" id=2]
+
+[sub_resource type="SpatialMaterial" id=8]
+flags_transparent = true
+flags_unshaded = true
+vertex_color_use_as_albedo = true
+vertex_color_is_srgb = true
+params_billboard_mode = 3
+particles_anim_h_frames = 5
+particles_anim_v_frames = 4
+particles_anim_loop = true
+albedo_texture = ExtResource( 2 )
+
+[sub_resource type="Curve" id=6]
+max_value = 0.72
+_data = [ Vector2( 0, 0.36 ), 0.0, 0.401025, 0, 0, Vector2( 1, 0.72 ), 0.349364, 0.0, 0, 0 ]
+
+[sub_resource type="CurveTexture" id=7]
+curve = SubResource( 6 )
+
+[sub_resource type="ParticlesMaterial" id=9]
+gravity = Vector3( 0, 0, 0 )
+scale_curve = SubResource( 7 )
+anim_speed = 0.9
+anim_offset = 0.1
+
+[sub_resource type="QuadMesh" id=10]
+size = Vector2( 2, 2 )
+
+[node name="Effect" type="Spatial"]
+script = ExtResource( 1 )
+
+[node name="Particles" type="Particles" parent="."]
+material_override = SubResource( 8 )
+emitting = false
+amount = 1
+one_shot = true
+process_material = SubResource( 9 )
+draw_pass_1 = SubResource( 10 )
diff --git a/assets/notefx/explosion/explosion01.png b/assets/notefx/explosion/explosion01.png
new file mode 100644
index 00000000..4e640cb1
Binary files /dev/null and b/assets/notefx/explosion/explosion01.png differ
diff --git a/assets/notefx/explosion/explosion01.png.import b/assets/notefx/explosion/explosion01.png.import
new file mode 100644
index 00000000..ae3f2437
--- /dev/null
+++ b/assets/notefx/explosion/explosion01.png.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path.s3tc="res://.import/explosion01.png-b1166232b4ef701a12ef41ea98fa2a50.s3tc.stex"
+path.etc2="res://.import/explosion01.png-b1166232b4ef701a12ef41ea98fa2a50.etc2.stex"
+path.etc="res://.import/explosion01.png-b1166232b4ef701a12ef41ea98fa2a50.etc.stex"
+metadata={
+"imported_formats": [ "s3tc", "etc2", "etc" ],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/notefx/explosion/explosion01.png"
+dest_files=[ "res://.import/explosion01.png-b1166232b4ef701a12ef41ea98fa2a50.s3tc.stex", "res://.import/explosion01.png-b1166232b4ef701a12ef41ea98fa2a50.etc2.stex", "res://.import/explosion01.png-b1166232b4ef701a12ef41ea98fa2a50.etc.stex" ]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=true
+flags/filter=true
+flags/mipmaps=true
+flags/anisotropic=false
+flags/srgb=1
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/assets/notefx/explosion/explosion02.png b/assets/notefx/explosion/explosion02.png
new file mode 100644
index 00000000..56173999
Binary files /dev/null and b/assets/notefx/explosion/explosion02.png differ
diff --git a/assets/notefx/explosion/explosion02.png.import b/assets/notefx/explosion/explosion02.png.import
new file mode 100644
index 00000000..77c7e64c
--- /dev/null
+++ b/assets/notefx/explosion/explosion02.png.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path.s3tc="res://.import/explosion02.png-085138e319b071d14fa84e5cfc4d0c97.s3tc.stex"
+path.etc2="res://.import/explosion02.png-085138e319b071d14fa84e5cfc4d0c97.etc2.stex"
+path.etc="res://.import/explosion02.png-085138e319b071d14fa84e5cfc4d0c97.etc.stex"
+metadata={
+"imported_formats": [ "s3tc", "etc2", "etc" ],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/notefx/explosion/explosion02.png"
+dest_files=[ "res://.import/explosion02.png-085138e319b071d14fa84e5cfc4d0c97.s3tc.stex", "res://.import/explosion02.png-085138e319b071d14fa84e5cfc4d0c97.etc2.stex", "res://.import/explosion02.png-085138e319b071d14fa84e5cfc4d0c97.etc.stex" ]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=true
+flags/filter=true
+flags/mipmaps=true
+flags/anisotropic=false
+flags/srgb=1
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/assets/notefx/explosion/explosion03.png b/assets/notefx/explosion/explosion03.png
new file mode 100644
index 00000000..e0b7ac94
Binary files /dev/null and b/assets/notefx/explosion/explosion03.png differ
diff --git a/assets/notefx/explosion/explosion03.png.import b/assets/notefx/explosion/explosion03.png.import
new file mode 100644
index 00000000..7147a2f0
--- /dev/null
+++ b/assets/notefx/explosion/explosion03.png.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path.s3tc="res://.import/explosion03.png-7a5e1d674a29455f5b7d08287d60dd17.s3tc.stex"
+path.etc2="res://.import/explosion03.png-7a5e1d674a29455f5b7d08287d60dd17.etc2.stex"
+path.etc="res://.import/explosion03.png-7a5e1d674a29455f5b7d08287d60dd17.etc.stex"
+metadata={
+"imported_formats": [ "s3tc", "etc2", "etc" ],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/notefx/explosion/explosion03.png"
+dest_files=[ "res://.import/explosion03.png-7a5e1d674a29455f5b7d08287d60dd17.s3tc.stex", "res://.import/explosion03.png-7a5e1d674a29455f5b7d08287d60dd17.etc2.stex", "res://.import/explosion03.png-7a5e1d674a29455f5b7d08287d60dd17.etc.stex" ]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=true
+flags/filter=true
+flags/mipmaps=true
+flags/anisotropic=false
+flags/srgb=1
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/assets/notefx/explosion/explosion04.png b/assets/notefx/explosion/explosion04.png
new file mode 100644
index 00000000..cfc3437d
Binary files /dev/null and b/assets/notefx/explosion/explosion04.png differ
diff --git a/assets/notefx/explosion/explosion04.png.import b/assets/notefx/explosion/explosion04.png.import
new file mode 100644
index 00000000..4d77eab7
--- /dev/null
+++ b/assets/notefx/explosion/explosion04.png.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path.s3tc="res://.import/explosion04.png-6c0867bdfb7bf6a0cc1d980fdb592de6.s3tc.stex"
+path.etc2="res://.import/explosion04.png-6c0867bdfb7bf6a0cc1d980fdb592de6.etc2.stex"
+path.etc="res://.import/explosion04.png-6c0867bdfb7bf6a0cc1d980fdb592de6.etc.stex"
+metadata={
+"imported_formats": [ "s3tc", "etc2", "etc" ],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/notefx/explosion/explosion04.png"
+dest_files=[ "res://.import/explosion04.png-6c0867bdfb7bf6a0cc1d980fdb592de6.s3tc.stex", "res://.import/explosion04.png-6c0867bdfb7bf6a0cc1d980fdb592de6.etc2.stex", "res://.import/explosion04.png-6c0867bdfb7bf6a0cc1d980fdb592de6.etc.stex" ]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=true
+flags/filter=true
+flags/mipmaps=true
+flags/anisotropic=false
+flags/srgb=1
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/assets/notefx/explosion/explosion05.png b/assets/notefx/explosion/explosion05.png
new file mode 100644
index 00000000..82aeb5cc
Binary files /dev/null and b/assets/notefx/explosion/explosion05.png differ
diff --git a/assets/notefx/explosion/explosion05.png.import b/assets/notefx/explosion/explosion05.png.import
new file mode 100644
index 00000000..25c8c0d7
--- /dev/null
+++ b/assets/notefx/explosion/explosion05.png.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path.s3tc="res://.import/explosion05.png-a34107206ddecf3f24b307cabdfe8743.s3tc.stex"
+path.etc2="res://.import/explosion05.png-a34107206ddecf3f24b307cabdfe8743.etc2.stex"
+path.etc="res://.import/explosion05.png-a34107206ddecf3f24b307cabdfe8743.etc.stex"
+metadata={
+"imported_formats": [ "s3tc", "etc2", "etc" ],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/notefx/explosion/explosion05.png"
+dest_files=[ "res://.import/explosion05.png-a34107206ddecf3f24b307cabdfe8743.s3tc.stex", "res://.import/explosion05.png-a34107206ddecf3f24b307cabdfe8743.etc2.stex", "res://.import/explosion05.png-a34107206ddecf3f24b307cabdfe8743.etc.stex" ]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=true
+flags/filter=true
+flags/mipmaps=true
+flags/anisotropic=false
+flags/srgb=1
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/assets/notefx/explosion/explosion06.png b/assets/notefx/explosion/explosion06.png
new file mode 100644
index 00000000..ff38a590
Binary files /dev/null and b/assets/notefx/explosion/explosion06.png differ
diff --git a/assets/notefx/explosion/explosion06.png.import b/assets/notefx/explosion/explosion06.png.import
new file mode 100644
index 00000000..684c6b0b
--- /dev/null
+++ b/assets/notefx/explosion/explosion06.png.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path.s3tc="res://.import/explosion06.png-19c90fef4c58bd0b35479e9296d5aaba.s3tc.stex"
+path.etc2="res://.import/explosion06.png-19c90fef4c58bd0b35479e9296d5aaba.etc2.stex"
+path.etc="res://.import/explosion06.png-19c90fef4c58bd0b35479e9296d5aaba.etc.stex"
+metadata={
+"imported_formats": [ "s3tc", "etc2", "etc" ],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/notefx/explosion/explosion06.png"
+dest_files=[ "res://.import/explosion06.png-19c90fef4c58bd0b35479e9296d5aaba.s3tc.stex", "res://.import/explosion06.png-19c90fef4c58bd0b35479e9296d5aaba.etc2.stex", "res://.import/explosion06.png-19c90fef4c58bd0b35479e9296d5aaba.etc.stex" ]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=true
+flags/filter=true
+flags/mipmaps=true
+flags/anisotropic=false
+flags/srgb=1
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/assets/notefx/explosion/explosion07.png b/assets/notefx/explosion/explosion07.png
new file mode 100644
index 00000000..61afc4c0
Binary files /dev/null and b/assets/notefx/explosion/explosion07.png differ
diff --git a/assets/notefx/explosion/explosion07.png.import b/assets/notefx/explosion/explosion07.png.import
new file mode 100644
index 00000000..20b92cd7
--- /dev/null
+++ b/assets/notefx/explosion/explosion07.png.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path.s3tc="res://.import/explosion07.png-a9804825e6ce00c62974afe92d909ed7.s3tc.stex"
+path.etc2="res://.import/explosion07.png-a9804825e6ce00c62974afe92d909ed7.etc2.stex"
+path.etc="res://.import/explosion07.png-a9804825e6ce00c62974afe92d909ed7.etc.stex"
+metadata={
+"imported_formats": [ "s3tc", "etc2", "etc" ],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/notefx/explosion/explosion07.png"
+dest_files=[ "res://.import/explosion07.png-a9804825e6ce00c62974afe92d909ed7.s3tc.stex", "res://.import/explosion07.png-a9804825e6ce00c62974afe92d909ed7.etc2.stex", "res://.import/explosion07.png-a9804825e6ce00c62974afe92d909ed7.etc.stex" ]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=true
+flags/filter=true
+flags/mipmaps=true
+flags/anisotropic=false
+flags/srgb=1
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/assets/notefx/explosion/explosion08.png b/assets/notefx/explosion/explosion08.png
new file mode 100644
index 00000000..d76b6768
Binary files /dev/null and b/assets/notefx/explosion/explosion08.png differ
diff --git a/assets/notefx/explosion/explosion08.png.import b/assets/notefx/explosion/explosion08.png.import
new file mode 100644
index 00000000..1942a247
--- /dev/null
+++ b/assets/notefx/explosion/explosion08.png.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path.s3tc="res://.import/explosion08.png-79cb959d2f1b10abf4e49ef5fb863d49.s3tc.stex"
+path.etc2="res://.import/explosion08.png-79cb959d2f1b10abf4e49ef5fb863d49.etc2.stex"
+path.etc="res://.import/explosion08.png-79cb959d2f1b10abf4e49ef5fb863d49.etc.stex"
+metadata={
+"imported_formats": [ "s3tc", "etc2", "etc" ],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/notefx/explosion/explosion08.png"
+dest_files=[ "res://.import/explosion08.png-79cb959d2f1b10abf4e49ef5fb863d49.s3tc.stex", "res://.import/explosion08.png-79cb959d2f1b10abf4e49ef5fb863d49.etc2.stex", "res://.import/explosion08.png-79cb959d2f1b10abf4e49ef5fb863d49.etc.stex" ]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=true
+flags/filter=true
+flags/mipmaps=true
+flags/anisotropic=false
+flags/srgb=1
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/assets/notefx/explosion/explosion09.png b/assets/notefx/explosion/explosion09.png
new file mode 100644
index 00000000..79393bd6
Binary files /dev/null and b/assets/notefx/explosion/explosion09.png differ
diff --git a/assets/notefx/explosion/explosion09.png.import b/assets/notefx/explosion/explosion09.png.import
new file mode 100644
index 00000000..f9828cbe
--- /dev/null
+++ b/assets/notefx/explosion/explosion09.png.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path.s3tc="res://.import/explosion09.png-a9fe415af1f8998464461f4db718e221.s3tc.stex"
+path.etc2="res://.import/explosion09.png-a9fe415af1f8998464461f4db718e221.etc2.stex"
+path.etc="res://.import/explosion09.png-a9fe415af1f8998464461f4db718e221.etc.stex"
+metadata={
+"imported_formats": [ "s3tc", "etc2", "etc" ],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/notefx/explosion/explosion09.png"
+dest_files=[ "res://.import/explosion09.png-a9fe415af1f8998464461f4db718e221.s3tc.stex", "res://.import/explosion09.png-a9fe415af1f8998464461f4db718e221.etc2.stex", "res://.import/explosion09.png-a9fe415af1f8998464461f4db718e221.etc.stex" ]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=true
+flags/filter=true
+flags/mipmaps=true
+flags/anisotropic=false
+flags/srgb=1
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/assets/notefx/explosion/explosion10.png b/assets/notefx/explosion/explosion10.png
new file mode 100644
index 00000000..2346b6af
Binary files /dev/null and b/assets/notefx/explosion/explosion10.png differ
diff --git a/assets/notefx/explosion/explosion10.png.import b/assets/notefx/explosion/explosion10.png.import
new file mode 100644
index 00000000..7c979316
--- /dev/null
+++ b/assets/notefx/explosion/explosion10.png.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path.s3tc="res://.import/explosion10.png-f47a456f7ee8455e9b310300feecb646.s3tc.stex"
+path.etc2="res://.import/explosion10.png-f47a456f7ee8455e9b310300feecb646.etc2.stex"
+path.etc="res://.import/explosion10.png-f47a456f7ee8455e9b310300feecb646.etc.stex"
+metadata={
+"imported_formats": [ "s3tc", "etc2", "etc" ],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/notefx/explosion/explosion10.png"
+dest_files=[ "res://.import/explosion10.png-f47a456f7ee8455e9b310300feecb646.s3tc.stex", "res://.import/explosion10.png-f47a456f7ee8455e9b310300feecb646.etc2.stex", "res://.import/explosion10.png-f47a456f7ee8455e9b310300feecb646.etc.stex" ]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=true
+flags/filter=true
+flags/mipmaps=true
+flags/anisotropic=false
+flags/srgb=1
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/assets/notefx/explosion/explosion11.png b/assets/notefx/explosion/explosion11.png
new file mode 100644
index 00000000..3dd47e62
Binary files /dev/null and b/assets/notefx/explosion/explosion11.png differ
diff --git a/assets/notefx/explosion/explosion11.png.import b/assets/notefx/explosion/explosion11.png.import
new file mode 100644
index 00000000..506aa6de
--- /dev/null
+++ b/assets/notefx/explosion/explosion11.png.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path.s3tc="res://.import/explosion11.png-68fdf550db66b793b83ea5ba769f404c.s3tc.stex"
+path.etc2="res://.import/explosion11.png-68fdf550db66b793b83ea5ba769f404c.etc2.stex"
+path.etc="res://.import/explosion11.png-68fdf550db66b793b83ea5ba769f404c.etc.stex"
+metadata={
+"imported_formats": [ "s3tc", "etc2", "etc" ],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/notefx/explosion/explosion11.png"
+dest_files=[ "res://.import/explosion11.png-68fdf550db66b793b83ea5ba769f404c.s3tc.stex", "res://.import/explosion11.png-68fdf550db66b793b83ea5ba769f404c.etc2.stex", "res://.import/explosion11.png-68fdf550db66b793b83ea5ba769f404c.etc.stex" ]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=true
+flags/filter=true
+flags/mipmaps=true
+flags/anisotropic=false
+flags/srgb=1
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/assets/notefx/explosion/explosion12.png b/assets/notefx/explosion/explosion12.png
new file mode 100644
index 00000000..d594510b
Binary files /dev/null and b/assets/notefx/explosion/explosion12.png differ
diff --git a/assets/notefx/explosion/explosion12.png.import b/assets/notefx/explosion/explosion12.png.import
new file mode 100644
index 00000000..18045d73
--- /dev/null
+++ b/assets/notefx/explosion/explosion12.png.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path.s3tc="res://.import/explosion12.png-d708df8ebc86ad52ce260f7ab907320b.s3tc.stex"
+path.etc2="res://.import/explosion12.png-d708df8ebc86ad52ce260f7ab907320b.etc2.stex"
+path.etc="res://.import/explosion12.png-d708df8ebc86ad52ce260f7ab907320b.etc.stex"
+metadata={
+"imported_formats": [ "s3tc", "etc2", "etc" ],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/notefx/explosion/explosion12.png"
+dest_files=[ "res://.import/explosion12.png-d708df8ebc86ad52ce260f7ab907320b.s3tc.stex", "res://.import/explosion12.png-d708df8ebc86ad52ce260f7ab907320b.etc2.stex", "res://.import/explosion12.png-d708df8ebc86ad52ce260f7ab907320b.etc.stex" ]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=true
+flags/filter=true
+flags/mipmaps=true
+flags/anisotropic=false
+flags/srgb=1
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/assets/notefx/explosion/explosion13.png b/assets/notefx/explosion/explosion13.png
new file mode 100644
index 00000000..5de821a9
Binary files /dev/null and b/assets/notefx/explosion/explosion13.png differ
diff --git a/assets/notefx/explosion/explosion13.png.import b/assets/notefx/explosion/explosion13.png.import
new file mode 100644
index 00000000..3ae15b38
--- /dev/null
+++ b/assets/notefx/explosion/explosion13.png.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path.s3tc="res://.import/explosion13.png-82c74adade711603e0ea658368c541d3.s3tc.stex"
+path.etc2="res://.import/explosion13.png-82c74adade711603e0ea658368c541d3.etc2.stex"
+path.etc="res://.import/explosion13.png-82c74adade711603e0ea658368c541d3.etc.stex"
+metadata={
+"imported_formats": [ "s3tc", "etc2", "etc" ],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/notefx/explosion/explosion13.png"
+dest_files=[ "res://.import/explosion13.png-82c74adade711603e0ea658368c541d3.s3tc.stex", "res://.import/explosion13.png-82c74adade711603e0ea658368c541d3.etc2.stex", "res://.import/explosion13.png-82c74adade711603e0ea658368c541d3.etc.stex" ]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=true
+flags/filter=true
+flags/mipmaps=true
+flags/anisotropic=false
+flags/srgb=1
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/assets/notefx/explosion/explosion14.png b/assets/notefx/explosion/explosion14.png
new file mode 100644
index 00000000..c2df658a
Binary files /dev/null and b/assets/notefx/explosion/explosion14.png differ
diff --git a/assets/notefx/explosion/explosion14.png.import b/assets/notefx/explosion/explosion14.png.import
new file mode 100644
index 00000000..29c3a9b6
--- /dev/null
+++ b/assets/notefx/explosion/explosion14.png.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path.s3tc="res://.import/explosion14.png-84254093b517b8c47981586e6c98a373.s3tc.stex"
+path.etc2="res://.import/explosion14.png-84254093b517b8c47981586e6c98a373.etc2.stex"
+path.etc="res://.import/explosion14.png-84254093b517b8c47981586e6c98a373.etc.stex"
+metadata={
+"imported_formats": [ "s3tc", "etc2", "etc" ],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/notefx/explosion/explosion14.png"
+dest_files=[ "res://.import/explosion14.png-84254093b517b8c47981586e6c98a373.s3tc.stex", "res://.import/explosion14.png-84254093b517b8c47981586e6c98a373.etc2.stex", "res://.import/explosion14.png-84254093b517b8c47981586e6c98a373.etc.stex" ]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=true
+flags/filter=true
+flags/mipmaps=true
+flags/anisotropic=false
+flags/srgb=1
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/assets/notefx/explosion/explosion15.png b/assets/notefx/explosion/explosion15.png
new file mode 100644
index 00000000..0a1133db
Binary files /dev/null and b/assets/notefx/explosion/explosion15.png differ
diff --git a/assets/notefx/explosion/explosion15.png.import b/assets/notefx/explosion/explosion15.png.import
new file mode 100644
index 00000000..8d80889a
--- /dev/null
+++ b/assets/notefx/explosion/explosion15.png.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path.s3tc="res://.import/explosion15.png-ff4a756d0aa919643a602010227a61db.s3tc.stex"
+path.etc2="res://.import/explosion15.png-ff4a756d0aa919643a602010227a61db.etc2.stex"
+path.etc="res://.import/explosion15.png-ff4a756d0aa919643a602010227a61db.etc.stex"
+metadata={
+"imported_formats": [ "s3tc", "etc2", "etc" ],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/notefx/explosion/explosion15.png"
+dest_files=[ "res://.import/explosion15.png-ff4a756d0aa919643a602010227a61db.s3tc.stex", "res://.import/explosion15.png-ff4a756d0aa919643a602010227a61db.etc2.stex", "res://.import/explosion15.png-ff4a756d0aa919643a602010227a61db.etc.stex" ]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=true
+flags/filter=true
+flags/mipmaps=true
+flags/anisotropic=false
+flags/srgb=1
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/assets/notefx/explosion/explosion16.png b/assets/notefx/explosion/explosion16.png
new file mode 100644
index 00000000..ae6114b2
Binary files /dev/null and b/assets/notefx/explosion/explosion16.png differ
diff --git a/assets/notefx/explosion/explosion16.png.import b/assets/notefx/explosion/explosion16.png.import
new file mode 100644
index 00000000..a0700a0a
--- /dev/null
+++ b/assets/notefx/explosion/explosion16.png.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path.s3tc="res://.import/explosion16.png-d45c525823accc891d7aefd0b363ecd4.s3tc.stex"
+path.etc2="res://.import/explosion16.png-d45c525823accc891d7aefd0b363ecd4.etc2.stex"
+path.etc="res://.import/explosion16.png-d45c525823accc891d7aefd0b363ecd4.etc.stex"
+metadata={
+"imported_formats": [ "s3tc", "etc2", "etc" ],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/notefx/explosion/explosion16.png"
+dest_files=[ "res://.import/explosion16.png-d45c525823accc891d7aefd0b363ecd4.s3tc.stex", "res://.import/explosion16.png-d45c525823accc891d7aefd0b363ecd4.etc2.stex", "res://.import/explosion16.png-d45c525823accc891d7aefd0b363ecd4.etc.stex" ]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=true
+flags/filter=true
+flags/mipmaps=true
+flags/anisotropic=false
+flags/srgb=1
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/assets/notefx/explosion/explosion17.png b/assets/notefx/explosion/explosion17.png
new file mode 100644
index 00000000..87784807
Binary files /dev/null and b/assets/notefx/explosion/explosion17.png differ
diff --git a/assets/notefx/explosion/explosion17.png.import b/assets/notefx/explosion/explosion17.png.import
new file mode 100644
index 00000000..8d07b262
--- /dev/null
+++ b/assets/notefx/explosion/explosion17.png.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path.s3tc="res://.import/explosion17.png-176649932a09eb48b6cf5aa4cb860864.s3tc.stex"
+path.etc2="res://.import/explosion17.png-176649932a09eb48b6cf5aa4cb860864.etc2.stex"
+path.etc="res://.import/explosion17.png-176649932a09eb48b6cf5aa4cb860864.etc.stex"
+metadata={
+"imported_formats": [ "s3tc", "etc2", "etc" ],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/notefx/explosion/explosion17.png"
+dest_files=[ "res://.import/explosion17.png-176649932a09eb48b6cf5aa4cb860864.s3tc.stex", "res://.import/explosion17.png-176649932a09eb48b6cf5aa4cb860864.etc2.stex", "res://.import/explosion17.png-176649932a09eb48b6cf5aa4cb860864.etc.stex" ]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=true
+flags/filter=true
+flags/mipmaps=true
+flags/anisotropic=false
+flags/srgb=1
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/assets/notefx/explosion/explosion_spritesheet.png b/assets/notefx/explosion/explosion_spritesheet.png
new file mode 100644
index 00000000..aaa5d826
Binary files /dev/null and b/assets/notefx/explosion/explosion_spritesheet.png differ
diff --git a/assets/notefx/explosion/explosion_spritesheet.png.import b/assets/notefx/explosion/explosion_spritesheet.png.import
new file mode 100644
index 00000000..f15535a3
--- /dev/null
+++ b/assets/notefx/explosion/explosion_spritesheet.png.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path.s3tc="res://.import/explosion_spritesheet.png-e95b65646b81c8c7debc4f3944d2799e.s3tc.stex"
+path.etc2="res://.import/explosion_spritesheet.png-e95b65646b81c8c7debc4f3944d2799e.etc2.stex"
+path.etc="res://.import/explosion_spritesheet.png-e95b65646b81c8c7debc4f3944d2799e.etc.stex"
+metadata={
+"imported_formats": [ "s3tc", "etc2", "etc" ],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/notefx/explosion/explosion_spritesheet.png"
+dest_files=[ "res://.import/explosion_spritesheet.png-e95b65646b81c8c7debc4f3944d2799e.s3tc.stex", "res://.import/explosion_spritesheet.png-e95b65646b81c8c7debc4f3944d2799e.etc2.stex", "res://.import/explosion_spritesheet.png-e95b65646b81c8c7debc4f3944d2799e.etc.stex" ]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=true
+flags/filter=true
+flags/mipmaps=true
+flags/anisotropic=false
+flags/srgb=1
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/assets/notefx/ripple/ripple.tscn b/assets/notefx/ripple/ripple.tscn
index 59626d7a..2ad0b45b 100644
--- a/assets/notefx/ripple/ripple.tscn
+++ b/assets/notefx/ripple/ripple.tscn
@@ -3,8 +3,6 @@
[ext_resource path="res://assets/notefx/ripple/ripple.png" type="Texture" id=1]
[ext_resource path="res://assets/notefx/ripple/ripple.gd" type="Script" id=2]
-
-
[sub_resource type="SpatialMaterial" id=2]
flags_transparent = true
flags_unshaded = true
diff --git a/assets/sfx/mkw_alert.mp3 b/assets/sfx/mkw_alert.mp3
new file mode 100644
index 00000000..ba1d39cd
Binary files /dev/null and b/assets/sfx/mkw_alert.mp3 differ
diff --git a/assets/sfx/mkw_alert.mp3.import b/assets/sfx/mkw_alert.mp3.import
new file mode 100644
index 00000000..c9f4d714
--- /dev/null
+++ b/assets/sfx/mkw_alert.mp3.import
@@ -0,0 +1,15 @@
+[remap]
+
+importer="mp3"
+type="AudioStreamMP3"
+path="res://.import/mkw_alert.mp3-49441d8fc087664d08e2d38dcf548d4c.mp3str"
+
+[deps]
+
+source_file="res://assets/sfx/mkw_alert.mp3"
+dest_files=[ "res://.import/mkw_alert.mp3-49441d8fc087664d08e2d38dcf548d4c.mp3str" ]
+
+[params]
+
+loop=false
+loop_offset=0
diff --git a/assets/sfx/mkw_back.mp3 b/assets/sfx/mkw_back.mp3
new file mode 100644
index 00000000..129219da
Binary files /dev/null and b/assets/sfx/mkw_back.mp3 differ
diff --git a/assets/sfx/mkw_back.mp3.import b/assets/sfx/mkw_back.mp3.import
new file mode 100644
index 00000000..3b46cb69
--- /dev/null
+++ b/assets/sfx/mkw_back.mp3.import
@@ -0,0 +1,15 @@
+[remap]
+
+importer="mp3"
+type="AudioStreamMP3"
+path="res://.import/mkw_back.mp3-21c1d47ac0cc71fdc2b15e996e94ec86.mp3str"
+
+[deps]
+
+source_file="res://assets/sfx/mkw_back.mp3"
+dest_files=[ "res://.import/mkw_back.mp3-21c1d47ac0cc71fdc2b15e996e94ec86.mp3str" ]
+
+[params]
+
+loop=false
+loop_offset=0
diff --git a/assets/sfx/mkw_next.mp3 b/assets/sfx/mkw_next.mp3
new file mode 100644
index 00000000..58b2aa80
Binary files /dev/null and b/assets/sfx/mkw_next.mp3 differ
diff --git a/assets/sfx/mkw_next.mp3.import b/assets/sfx/mkw_next.mp3.import
new file mode 100644
index 00000000..f86b16ee
--- /dev/null
+++ b/assets/sfx/mkw_next.mp3.import
@@ -0,0 +1,15 @@
+[remap]
+
+importer="mp3"
+type="AudioStreamMP3"
+path="res://.import/mkw_next.mp3-341a987dcdc420e91f57b98112f69479.mp3str"
+
+[deps]
+
+source_file="res://assets/sfx/mkw_next.mp3"
+dest_files=[ "res://.import/mkw_next.mp3-341a987dcdc420e91f57b98112f69479.mp3str" ]
+
+[params]
+
+loop=false
+loop_offset=0
diff --git a/assets/sfx/mkwii_load_short.ogg b/assets/sfx/mkwii_load_short.ogg
new file mode 100644
index 00000000..01c29a78
Binary files /dev/null and b/assets/sfx/mkwii_load_short.ogg differ
diff --git a/assets/sfx/mkwii_load_short.ogg.import b/assets/sfx/mkwii_load_short.ogg.import
new file mode 100644
index 00000000..3b02a887
--- /dev/null
+++ b/assets/sfx/mkwii_load_short.ogg.import
@@ -0,0 +1,15 @@
+[remap]
+
+importer="ogg_vorbis"
+type="AudioStreamOGGVorbis"
+path="res://.import/mkwii_load_short.ogg-1b32da8777d55c3c0d34c816de4fe5c2.oggstr"
+
+[deps]
+
+source_file="res://assets/sfx/mkwii_load_short.ogg"
+dest_files=[ "res://.import/mkwii_load_short.ogg-1b32da8777d55c3c0d34c816de4fe5c2.oggstr" ]
+
+[params]
+
+loop=true
+loop_offset=0
diff --git a/assets/sfx/music/init3d/drums.ogg b/assets/sfx/music/init3d/drums.ogg
new file mode 100644
index 00000000..a6bd4774
Binary files /dev/null and b/assets/sfx/music/init3d/drums.ogg differ
diff --git a/assets/sfx/music/init3d/drums.ogg.import b/assets/sfx/music/init3d/drums.ogg.import
new file mode 100644
index 00000000..6708926f
--- /dev/null
+++ b/assets/sfx/music/init3d/drums.ogg.import
@@ -0,0 +1,15 @@
+[remap]
+
+importer="ogg_vorbis"
+type="AudioStreamOGGVorbis"
+path="res://.import/drums.ogg-24d114ce7e004ccd16d3da77a5aac83a.oggstr"
+
+[deps]
+
+source_file="res://assets/sfx/music/init3d/drums.ogg"
+dest_files=[ "res://.import/drums.ogg-24d114ce7e004ccd16d3da77a5aac83a.oggstr" ]
+
+[params]
+
+loop=true
+loop_offset=0
diff --git a/assets/sfx/music/init3d/phaser.ogg b/assets/sfx/music/init3d/phaser.ogg
new file mode 100644
index 00000000..2f77bc22
Binary files /dev/null and b/assets/sfx/music/init3d/phaser.ogg differ
diff --git a/assets/sfx/music/init3d/phaser.ogg.import b/assets/sfx/music/init3d/phaser.ogg.import
new file mode 100644
index 00000000..c4301f76
--- /dev/null
+++ b/assets/sfx/music/init3d/phaser.ogg.import
@@ -0,0 +1,15 @@
+[remap]
+
+importer="ogg_vorbis"
+type="AudioStreamOGGVorbis"
+path="res://.import/phaser.ogg-53c2d8a1efcdf19e7be49f4dbb231e86.oggstr"
+
+[deps]
+
+source_file="res://assets/sfx/music/init3d/phaser.ogg"
+dest_files=[ "res://.import/phaser.ogg-53c2d8a1efcdf19e7be49f4dbb231e86.oggstr" ]
+
+[params]
+
+loop=true
+loop_offset=0
diff --git a/assets/sfx/music/init3d/piano.ogg b/assets/sfx/music/init3d/piano.ogg
new file mode 100644
index 00000000..dc4b1860
Binary files /dev/null and b/assets/sfx/music/init3d/piano.ogg differ
diff --git a/assets/sfx/music/init3d/piano.ogg.import b/assets/sfx/music/init3d/piano.ogg.import
new file mode 100644
index 00000000..36bc801e
--- /dev/null
+++ b/assets/sfx/music/init3d/piano.ogg.import
@@ -0,0 +1,15 @@
+[remap]
+
+importer="ogg_vorbis"
+type="AudioStreamOGGVorbis"
+path="res://.import/piano.ogg-2d48a720c2634408d5a853ca9321fe03.oggstr"
+
+[deps]
+
+source_file="res://assets/sfx/music/init3d/piano.ogg"
+dest_files=[ "res://.import/piano.ogg-2d48a720c2634408d5a853ca9321fe03.oggstr" ]
+
+[params]
+
+loop=true
+loop_offset=0
diff --git a/assets/sfx/music/init3d/strings.ogg b/assets/sfx/music/init3d/strings.ogg
new file mode 100644
index 00000000..277b9905
Binary files /dev/null and b/assets/sfx/music/init3d/strings.ogg differ
diff --git a/assets/sfx/music/init3d/strings.ogg.import b/assets/sfx/music/init3d/strings.ogg.import
new file mode 100644
index 00000000..acd18433
--- /dev/null
+++ b/assets/sfx/music/init3d/strings.ogg.import
@@ -0,0 +1,15 @@
+[remap]
+
+importer="ogg_vorbis"
+type="AudioStreamOGGVorbis"
+path="res://.import/strings.ogg-af28458439b812473980d511a0d570d9.oggstr"
+
+[deps]
+
+source_file="res://assets/sfx/music/init3d/strings.ogg"
+dest_files=[ "res://.import/strings.ogg-af28458439b812473980d511a0d570d9.oggstr" ]
+
+[params]
+
+loop=true
+loop_offset=0
diff --git a/prefabs/game/HUD.tscn b/prefabs/game/HUD.tscn
index 3eb4f23a..3aa74d18 100644
--- a/prefabs/game/HUD.tscn
+++ b/prefabs/game/HUD.tscn
@@ -34,22 +34,22 @@
[ext_resource path="res://scripts/game/MobileButtons.gd" type="Script" id=32]
[ext_resource path="res://assets/font/NotoColorEmoji.ttf" type="DynamicFontData" id=33]
-[sub_resource type="Gradient" id=86]
+[sub_resource type="Gradient" id=91]
interpolation_mode = 1
offsets = PoolRealArray( 1 )
colors = PoolColorArray( 1, 1, 1, 1 )
[sub_resource type="GradientTexture2D" id=87]
-gradient = SubResource( 86 )
+gradient = SubResource( 91 )
use_hdr = true
-[sub_resource type="Gradient" id=88]
+[sub_resource type="Gradient" id=92]
interpolation_mode = 1
offsets = PoolRealArray( 1 )
colors = PoolColorArray( 1, 1, 1, 1 )
[sub_resource type="GradientTexture2D" id=89]
-gradient = SubResource( 88 )
+gradient = SubResource( 92 )
[sub_resource type="DynamicFont" id=85]
size = 48
@@ -347,9 +347,6 @@ to give up"
[node name="Stats" type="Control" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
-__meta__ = {
-"_edit_use_anchors_": true
-}
[node name="Label" type="Label" parent="Stats"]
anchor_right = 1.0
diff --git a/prefabs/game/HUD2.tscn b/prefabs/game/HUD2.tscn
new file mode 100644
index 00000000..9c5bf11b
--- /dev/null
+++ b/prefabs/game/HUD2.tscn
@@ -0,0 +1,1690 @@
+[gd_scene load_steps=92 format=2]
+
+[ext_resource path="res://scripts/game/TrueComboHandler.gd" type="Script" id=1]
+[ext_resource path="res://scripts/game/FPS.gd" type="Script" id=2]
+[ext_resource path="res://scripts/game/configDisp.gd" type="Script" id=3]
+[ext_resource path="res://scripts/game/MobileButtons.gd" type="Script" id=4]
+[ext_resource path="res://assets/font/Lato/Lato-Regular.ttf" type="DynamicFontData" id=5]
+[ext_resource path="res://assets/font/Lato/Lato-Bold.ttf" type="DynamicFontData" id=6]
+[ext_resource path="res://assets/font/UbuntuMono/Regular.ttf" type="DynamicFontData" id=7]
+[ext_resource path="res://assets/font/NotoSansMono/NotoSansMono-Regular.ttf" type="DynamicFontData" id=8]
+[ext_resource path="res://assets/images/ui/spinner_thin.png" type="Texture" id=9]
+[ext_resource path="res://assets/font/NotoSansMono/NotoSansMono-Light.ttf" type="DynamicFontData" id=10]
+[ext_resource path="res://assets/images/modifiers/32/speed_mmm_colored.png" type="Texture" id=11]
+[ext_resource path="res://assets/images/ui/spinner_thick.png" type="Texture" id=12]
+[ext_resource path="res://assets/font/Roboto/Regular.ttf" type="DynamicFontData" id=13]
+[ext_resource path="res://assets/font/NotoColorEmoji.ttf" type="DynamicFontData" id=14]
+[ext_resource path="res://assets/font/Lato/Lato-Light.ttf" type="DynamicFontData" id=15]
+[ext_resource path="res://assets/images/modifiers/32/speed_pp_colored.png" type="Texture" id=16]
+[ext_resource path="res://assets/images/modifiers/32/speed_mm_colored.png" type="Texture" id=17]
+[ext_resource path="res://assets/images/modifiers/32/speed_m_colored.png" type="Texture" id=18]
+[ext_resource path="res://assets/font/Noto_Sans_JP/NotoSansJP-Medium.otf" type="DynamicFontData" id=19]
+[ext_resource path="res://assets/images/modifiers/32/speed_p_colored.png" type="Texture" id=20]
+[ext_resource path="res://assets/images/modifiers/32/speed_pppp_colored.png" type="Texture" id=21]
+[ext_resource path="res://assets/images/modifiers/32/autoplayer.png" type="Texture" id=22]
+[ext_resource path="res://assets/font/NotoSansMono/NotoSansMono-Medium.ttf" type="DynamicFontData" id=23]
+[ext_resource path="res://assets/images/modifiers/64/speed_pp_colored.png" type="Texture" id=24]
+[ext_resource path="res://scripts/game/CircularProgress2.gd" type="Script" id=25]
+[ext_resource path="res://scripts/game/PauseHud.gd" type="Script" id=26]
+[ext_resource path="res://assets/images/modifiers/64/speed_mm_colored.png" type="Texture" id=27]
+[ext_resource path="res://assets/images/modifiers/64/speed_ppp_colored.png" type="Texture" id=28]
+[ext_resource path="res://scripts/game/HUD2.gd" type="Script" id=29]
+[ext_resource path="res://assets/images/modifiers/32/speed_ppp_colored.png" type="Texture" id=30]
+[ext_resource path="res://assets/images/modifiers/32/replaying.png" type="Texture" id=31]
+[ext_resource path="res://assets/font/NotoSansMono/NotoSansMono-SemiBold.ttf" type="DynamicFontData" id=32]
+[ext_resource path="res://assets/images/modifiers/64/speed_pppp_colored.png" type="Texture" id=33]
+[ext_resource path="res://assets/images/modifiers/64/autoplayer.png" type="Texture" id=34]
+[ext_resource path="res://assets/images/modifiers/64/speed_m_colored.png" type="Texture" id=35]
+[ext_resource path="res://assets/images/modifiers/64/speed_mmm_colored.png" type="Texture" id=36]
+[ext_resource path="res://assets/images/modifiers/64/speed_p_colored.png" type="Texture" id=37]
+[ext_resource path="res://assets/images/modifiers/64/replaying.png" type="Texture" id=38]
+[ext_resource path="res://assets/notefx/miss/miss.png" type="Texture" id=39]
+
+[sub_resource type="Gradient" id=86]
+interpolation_mode = 1
+offsets = PoolRealArray( 1 )
+colors = PoolColorArray( 1, 1, 1, 1 )
+
+[sub_resource type="GradientTexture2D" id=96]
+gradient = SubResource( 86 )
+use_hdr = true
+
+[sub_resource type="Gradient" id=88]
+interpolation_mode = 1
+offsets = PoolRealArray( 1 )
+colors = PoolColorArray( 1, 1, 1, 1 )
+
+[sub_resource type="GradientTexture2D" id=97]
+gradient = SubResource( 88 )
+
+[sub_resource type="DynamicFont" id=98]
+size = 48
+outline_size = 4
+outline_color = Color( 0, 0, 0, 0.490196 )
+use_filter = true
+font_data = ExtResource( 7 )
+
+[sub_resource type="StyleBoxFlat" id=84]
+bg_color = Color( 0, 0, 0, 0.45098 )
+corner_radius_top_left = 125
+corner_radius_top_right = 125
+corner_radius_bottom_right = 125
+corner_radius_bottom_left = 125
+
+[sub_resource type="StyleBoxFlat" id=8]
+bg_color = Color( 0.54902, 1, 0, 1 )
+
+[sub_resource type="StyleBoxFlat" id=5]
+bg_color = Color( 0.560784, 0.560784, 0.560784, 0.690196 )
+
+[sub_resource type="DynamicFont" id=9]
+size = 36
+use_filter = true
+font_data = ExtResource( 5 )
+
+[sub_resource type="DynamicFont" id=10]
+size = 48
+use_filter = true
+font_data = ExtResource( 13 )
+
+[sub_resource type="Shader" id=52]
+code = "shader_type canvas_item;
+
+uniform float amount = 0.0;
+
+void fragment() {
+ vec2 uv = UV + vec2(TIME * -0.07);
+ float mult = ( 0.75 + (( 1.0 - amount ) * 0.25) + (amount * 0.25 * sin(length( uv*38.0) )) );
+ COLOR.rgb *= texture(TEXTURE,UV).rgb * mult;
+ COLOR.a *= texture(TEXTURE,UV).a;
+
+}"
+
+[sub_resource type="ShaderMaterial" id=53]
+shader = SubResource( 52 )
+shader_param/amount = 0.0
+
+[sub_resource type="DynamicFont" id=51]
+size = 64
+use_filter = true
+font_data = ExtResource( 6 )
+
+[sub_resource type="Shader" id=109]
+code = "shader_type canvas_item;
+
+uniform float amount = 0.0;
+
+void fragment() {
+ vec2 uv = (UV + vec2(TIME * -0.07)) * vec2(0.25, 0.75);
+ float mult = ( 0.75 + (( 1.0 - amount ) * 0.25) + (amount * 0.25 * sin(length( uv*38.0) )) );
+ COLOR.rgb *= texture(TEXTURE,UV).rgb * mult;
+ COLOR.a *= texture(TEXTURE,UV).a;
+
+}"
+
+[sub_resource type="ShaderMaterial" id=110]
+shader = SubResource( 109 )
+shader_param/amount = 0.0
+
+[sub_resource type="DynamicFont" id=11]
+size = 96
+use_filter = true
+font_data = ExtResource( 15 )
+
+[sub_resource type="Shader" id=41]
+code = "shader_type canvas_item;
+
+uniform float value:hint_range(0.0,1.0) = 0.5;
+uniform vec4 fill_color:hint_color = vec4(1,1,1,1);
+uniform vec4 empty_color:hint_color = vec4(0.2,0.2,0.2,0.5);
+uniform float sml:hint_range(0.0,1.0) = 0.0;
+
+void fragment() {
+ vec4 col = texture(TEXTURE,UV);
+ vec2 p = (UV - vec2(0.5)) * 2.0;
+ float ang = -(degrees(atan(p.x,p.y)) - 180.0);
+ float pos = ang/360.0;
+
+ float v = 0.5;
+ if (sml != 0.0) {
+ v = 1.0 - clamp((pos - (value + (sml * ((value*2.0)-1.0)))) / max(sml * 2.0,0.0001),0.0,1.0);
+ } else {
+ v = float(pos <= value);
+ }
+ vec4 final = mix(empty_color,fill_color,v);
+ COLOR = vec4(final.rgb,final.a*col.a);
+}"
+
+[sub_resource type="ShaderMaterial" id=42]
+shader = SubResource( 41 )
+shader_param/value = 0.5
+shader_param/fill_color = Color( 0.482353, 1, 0.952941, 1 )
+shader_param/empty_color = Color( 0.294118, 0.294118, 0.294118, 0.72549 )
+shader_param/sml = 0.0
+
+[sub_resource type="DynamicFont" id=13]
+size = 52
+use_filter = true
+font_data = ExtResource( 5 )
+
+[sub_resource type="DynamicFont" id=14]
+size = 72
+use_filter = true
+font_data = ExtResource( 15 )
+
+[sub_resource type="StyleBoxFlat" id=50]
+bg_color = Color( 0, 0, 0, 0.45098 )
+corner_radius_top_left = 125
+corner_radius_top_right = 125
+corner_radius_bottom_right = 125
+corner_radius_bottom_left = 125
+
+[sub_resource type="DynamicFont" id=77]
+size = 52
+use_filter = true
+font_data = ExtResource( 6 )
+
+[sub_resource type="DynamicFont" id=17]
+size = 72
+outline_color = Color( 0, 0, 0, 0.333333 )
+use_filter = true
+font_data = ExtResource( 5 )
+
+[sub_resource type="DynamicFont" id=75]
+size = 72
+outline_color = Color( 0.407843, 0.584314, 1, 1 )
+use_filter = true
+font_data = ExtResource( 5 )
+
+[sub_resource type="DynamicFont" id=43]
+size = 28
+outline_color = Color( 0, 0, 0, 0.333333 )
+use_filter = true
+extra_spacing_space = 3
+font_data = ExtResource( 5 )
+
+[sub_resource type="DynamicFont" id=18]
+size = 44
+use_filter = true
+font_data = ExtResource( 5 )
+
+[sub_resource type="DynamicFont" id=19]
+size = 28
+use_filter = true
+font_data = ExtResource( 5 )
+
+[sub_resource type="ShaderMaterial" id=108]
+shader = SubResource( 52 )
+shader_param/amount = 0.0
+
+[sub_resource type="DynamicFont" id=20]
+size = 128
+use_filter = true
+font_data = ExtResource( 5 )
+
+[sub_resource type="ViewportTexture" id=22]
+flags = 20
+viewport_path = NodePath("LeftVP")
+
+[sub_resource type="ViewportTexture" id=23]
+flags = 4
+viewport_path = NodePath("GiveUpVP")
+
+[sub_resource type="ViewportTexture" id=24]
+flags = 4
+viewport_path = NodePath("PauseVP")
+
+[sub_resource type="ViewportTexture" id=25]
+flags = 4
+viewport_path = NodePath("RightVP")
+
+[sub_resource type="ViewportTexture" id=27]
+flags = 4
+viewport_path = NodePath("ConfigVP")
+
+[sub_resource type="ViewportTexture" id=28]
+flags = 4
+viewport_path = NodePath("ComboVP")
+
+[sub_resource type="StyleBoxLine" id=85]
+color = Color( 1, 1, 1, 0.470588 )
+thickness = 2
+
+[sub_resource type="DynamicFont" id=99]
+size = 32
+use_filter = true
+font_data = ExtResource( 10 )
+fallback/0 = ExtResource( 19 )
+fallback/1 = ExtResource( 14 )
+
+[sub_resource type="DynamicFont" id=87]
+use_filter = true
+font_data = ExtResource( 8 )
+fallback/0 = ExtResource( 19 )
+
+[sub_resource type="DynamicFont" id=100]
+use_filter = true
+font_data = ExtResource( 8 )
+fallback/0 = ExtResource( 19 )
+fallback/1 = ExtResource( 14 )
+
+[sub_resource type="DynamicFont" id=89]
+use_filter = true
+font_data = ExtResource( 8 )
+fallback/0 = ExtResource( 19 )
+
+[sub_resource type="StyleBoxFlat" id=4]
+bg_color = Color( 1, 1, 1, 1 )
+
+[sub_resource type="DynamicFont" id=93]
+size = 28
+use_filter = true
+font_data = ExtResource( 32 )
+fallback/0 = ExtResource( 19 )
+
+[sub_resource type="DynamicFont" id=101]
+size = 28
+font_data = ExtResource( 23 )
+fallback/0 = ExtResource( 19 )
+fallback/1 = ExtResource( 14 )
+
+[sub_resource type="StyleBoxFlat" id=111]
+bg_color = Color( 0.227451, 0.647059, 0.0823529, 1 )
+
+[sub_resource type="StyleBoxFlat" id=112]
+bg_color = Color( 0.580392, 0.129412, 0.129412, 0.686275 )
+
+[sub_resource type="DynamicFont" id=106]
+size = 24
+use_filter = true
+font_data = ExtResource( 5 )
+fallback/0 = ExtResource( 19 )
+
+[sub_resource type="DynamicFont" id=107]
+size = 48
+font_data = ExtResource( 14 )
+fallback/0 = ExtResource( 19 )
+
+[sub_resource type="PlaneMesh" id=90]
+size = Vector2( 4.95, 4.95 )
+
+[sub_resource type="ViewportTexture" id=92]
+viewport_path = NodePath("GridVP")
+
+[sub_resource type="SpatialMaterial" id=91]
+resource_local_to_scene = true
+render_priority = 99
+flags_transparent = true
+flags_unshaded = true
+flags_no_depth_test = true
+albedo_color = Color( 1, 1, 1, 0.588235 )
+albedo_texture = SubResource( 92 )
+
+[sub_resource type="ViewportTexture" id=104]
+flags = 4
+viewport_path = NodePath("TimerVP")
+
+[sub_resource type="ViewportTexture" id=105]
+flags = 68
+viewport_path = NodePath("EnergyVP")
+
+[node name="HUD" type="Spatial"]
+pause_mode = 1
+script = ExtResource( 29 )
+
+[node name="Mobile" type="Control" parent="."]
+anchor_right = 1.0
+anchor_bottom = 1.0
+script = ExtResource( 4 )
+
+[node name="Pause" type="Control" parent="Mobile"]
+modulate = Color( 1, 1, 1, 0.501961 )
+margin_right = 1280.0
+margin_bottom = 720.0
+
+[node name="Button" type="TouchScreenButton" parent="Mobile/Pause"]
+modulate = Color( 1, 1, 1, 0.521569 )
+scale = Vector2( 3.75, 3.5 )
+normal = SubResource( 96 )
+
+[node name="Label" type="Label" parent="Mobile/Pause/Button"]
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+margin_left = -20.0
+margin_top = -15.5
+margin_right = 20.0
+margin_bottom = 15.5
+text = "tap to pause"
+align = 1
+autowrap = true
+
+[node name="GiveUp" type="Control" parent="Mobile"]
+modulate = Color( 1, 1, 1, 0.501961 )
+anchor_top = 1.0
+anchor_bottom = 1.0
+margin_top = -720.0
+margin_right = 1280.0
+
+[node name="Button" type="TouchScreenButton" parent="Mobile/GiveUp"]
+modulate = Color( 1, 1, 1, 0.505882 )
+position = Vector2( 0, 494 )
+scale = Vector2( 3.75, 3.5 )
+normal = SubResource( 97 )
+
+[node name="Label" type="Label" parent="Mobile/GiveUp/Button"]
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+margin_left = -31.5
+margin_top = -15.5
+margin_right = 31.5
+margin_bottom = 15.5
+text = " hold
+to give up"
+
+[node name="Stats" type="Control" parent="."]
+anchor_right = 1.0
+anchor_bottom = 1.0
+
+[node name="Label" type="Label" parent="Stats"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+custom_fonts/font = SubResource( 98 )
+text = "(stats)"
+align = 2
+
+[node name="LeftVP" type="Viewport" parent="."]
+size = Vector2( 300, 900 )
+transparent_bg = true
+msaa = 2
+hdr = false
+usage = 0
+render_target_update_mode = 3
+gui_snap_controls_to_pixels = false
+
+[node name="Control" type="ColorRect" parent="LeftVP" groups=["panel_bg"]]
+margin_right = 300.0
+margin_bottom = 900.0
+color = Color( 0, 0, 0, 0.607843 )
+
+[node name="SimpleBg" type="Panel" parent="LeftVP/Control" groups=["panel_bg"]]
+visible = false
+margin_left = 25.0
+margin_top = 225.0
+margin_right = 275.0
+margin_bottom = 475.0
+custom_styles/panel = SubResource( 84 )
+
+[node name="AccuracyBar" type="ProgressBar" parent="LeftVP/Control"]
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = -1.18921
+margin_top = -50.0
+margin_right = -1.18921
+margin_bottom = -25.0
+custom_styles/fg = SubResource( 8 )
+custom_styles/bg = SubResource( 5 )
+max_value = 1.0
+step = 0.0
+value = 1.0
+percent_visible = false
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="AccuracyTitle" type="Label" parent="LeftVP/Control" groups=["panel_text"]]
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_top = -231.908
+margin_bottom = -156.908
+custom_fonts/font = SubResource( 9 )
+text = "ACCURACY"
+align = 1
+valign = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Accuracy" type="Label" parent="LeftVP/Control" groups=["panel_text"]]
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_top = -167.0
+margin_bottom = -92.0003
+custom_fonts/font = SubResource( 10 )
+text = "-"
+align = 1
+valign = 1
+
+[node name="LetterGrade" type="Label" parent="LeftVP/Control"]
+material = SubResource( 53 )
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_top = -343.0
+margin_bottom = -265.0
+custom_colors/font_color = Color( 1, 1, 1, 1 )
+custom_fonts/font = SubResource( 51 )
+text = "--"
+align = 1
+valign = 1
+
+[node name="FullComboIndicator" type="ColorRect" parent="LeftVP/Control/LetterGrade"]
+visible = false
+show_behind_parent = true
+material = SubResource( 110 )
+anchor_right = 1.0
+anchor_bottom = 1.0
+
+[node name="Combo" type="Control" parent="LeftVP/Control"]
+anchor_right = 1.0
+margin_left = 25.0
+margin_top = 25.0
+margin_right = -25.0
+margin_bottom = 275.0
+script = ExtResource( 25 )
+fill_color = Color( 0.482353, 1, 0.952941, 1 )
+empty_color = Color( 0.294118, 0.294118, 0.294118, 0.72549 )
+
+[node name="Label" type="Label" parent="LeftVP/Control/Combo" groups=["panel_text"]]
+anchor_right = 1.0
+anchor_bottom = 1.0
+custom_fonts/font = SubResource( 11 )
+text = "1x"
+align = 1
+valign = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Spin" type="TextureRect" parent="LeftVP/Control/Combo"]
+material = SubResource( 42 )
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+texture = ExtResource( 9 )
+expand = true
+stretch_mode = 6
+
+[node name="Pauses" type="Label" parent="LeftVP/Control" groups=["pause_text"]]
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_top = -552.0
+margin_bottom = -477.0
+custom_fonts/font = SubResource( 13 )
+text = "0"
+align = 1
+valign = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="PausesTitle" type="Label" parent="LeftVP/Control" groups=["pause_text"]]
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_top = -616.776
+margin_bottom = -541.776
+custom_fonts/font = SubResource( 9 )
+text = "PAUSES"
+align = 1
+valign = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="GiveUpVP" type="Viewport" parent="."]
+size = Vector2( 600, 600 )
+transparent_bg = true
+msaa = 2
+debanding = true
+hdr = false
+usage = 0
+render_target_update_mode = 3
+gui_snap_controls_to_pixels = false
+
+[node name="Control" type="Control" parent="GiveUpVP"]
+margin_right = 600.0
+margin_bottom = 600.0
+script = ExtResource( 25 )
+fill_color = Color( 1, 0.560784, 0.172549, 1 )
+empty_color = Color( 0.435294, 0.435294, 0.435294, 0 )
+
+[node name="Label" type="Label" parent="GiveUpVP/Control"]
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+margin_left = -300.0
+margin_top = -300.0
+margin_right = 300.0
+margin_bottom = 300.0
+custom_fonts/font = SubResource( 14 )
+text = "Giving up..."
+align = 1
+valign = 1
+clip_text = true
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Spin" type="TextureRect" parent="GiveUpVP/Control"]
+material = SubResource( 42 )
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = 50.0
+margin_top = 50.0
+margin_right = -50.0
+margin_bottom = -50.0
+grow_horizontal = 2
+grow_vertical = 2
+texture = ExtResource( 12 )
+expand = true
+stretch_mode = 6
+
+[node name="RightVP" type="Viewport" parent="."]
+size = Vector2( 300, 900 )
+transparent_bg = true
+msaa = 2
+hdr = false
+usage = 0
+render_target_update_mode = 3
+gui_snap_controls_to_pixels = false
+
+[node name="Control" type="ColorRect" parent="RightVP" groups=["panel_bg"]]
+margin_right = 300.0
+margin_bottom = 900.0
+color = Color( 0, 0, 0, 0.607843 )
+
+[node name="SimpleBg" type="Panel" parent="RightVP/Control" groups=["panel_bg"]]
+visible = false
+margin_left = 25.0
+margin_top = 225.0
+margin_right = 275.0
+margin_bottom = 475.0
+custom_styles/panel = SubResource( 50 )
+
+[node name="Notes" type="Label" parent="RightVP/Control" groups=["panel_text"]]
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_top = -168.0
+margin_bottom = -93.0002
+custom_fonts/font = SubResource( 13 )
+text = "0/0"
+align = 1
+valign = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="NoteTitle" type="Label" parent="RightVP/Control" groups=["panel_text"]]
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_top = -232.0
+margin_bottom = -157.0
+custom_fonts/font = SubResource( 9 )
+text = "NOTES"
+align = 1
+valign = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Misses" type="Label" parent="RightVP/Control" groups=["miss_text"]]
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_top = -552.0
+margin_bottom = -477.0
+custom_fonts/font = SubResource( 13 )
+text = "0"
+align = 1
+valign = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="MissesTitle" type="Label" parent="RightVP/Control" groups=["miss_text"]]
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_top = -617.0
+margin_bottom = -542.0
+custom_fonts/font = SubResource( 9 )
+text = "MISSES"
+align = 1
+valign = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="FPS" type="Label" parent="RightVP/Control" groups=["panel_text"]]
+visible = false
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_top = -785.0
+margin_bottom = -710.0
+custom_fonts/font = SubResource( 13 )
+text = "0"
+align = 1
+valign = 1
+script = ExtResource( 2 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="FPSTitle" type="Label" parent="RightVP/Control" groups=["panel_text"]]
+visible = false
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_top = -850.0
+margin_bottom = -775.0
+custom_fonts/font = SubResource( 9 )
+text = "FPS"
+align = 1
+valign = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Score" type="Label" parent="RightVP/Control" groups=["score_text"]]
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_top = -809.0
+margin_bottom = -734.0
+custom_fonts/font = SubResource( 77 )
+text = "0"
+align = 1
+valign = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="ScoreTitle" type="Label" parent="RightVP/Control" groups=["score_text"]]
+visible = false
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_top = -874.0
+margin_bottom = -799.0
+custom_fonts/font = SubResource( 9 )
+text = "SCORE"
+align = 1
+valign = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="PauseVP" type="Viewport" parent="."]
+size = Vector2( 600, 600 )
+transparent_bg = true
+msaa = 2
+debanding = true
+hdr = false
+usage = 0
+render_target_update_mode = 3
+gui_snap_controls_to_pixels = false
+
+[node name="Control" type="Control" parent="PauseVP"]
+margin_right = 600.0
+margin_bottom = 600.0
+script = ExtResource( 26 )
+
+[node name="Paused" type="Label" parent="PauseVP/Control"]
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+margin_left = -300.0
+margin_top = -300.0
+margin_right = 300.0
+margin_bottom = 300.0
+custom_colors/font_color = Color( 0.407843, 1, 0, 1 )
+custom_fonts/font = SubResource( 17 )
+text = "PAUSED"
+align = 1
+valign = 1
+clip_text = true
+
+[node name="ProgressBar" type="Control" parent="PauseVP/Control"]
+margin_left = 160.0
+margin_top = 160.0
+margin_right = 160.0
+margin_bottom = 440.0
+grow_horizontal = 2
+rect_clip_content = true
+
+[node name="Paused" type="Label" parent="PauseVP/Control/ProgressBar"]
+margin_right = 280.0
+margin_bottom = 280.0
+grow_horizontal = 2
+custom_colors/font_color = Color( 0.501961, 1, 0.952941, 1 )
+custom_fonts/font = SubResource( 75 )
+text = "PAUSED"
+align = 1
+valign = 1
+
+[node name="HoldR" type="Label" parent="PauseVP/Control"]
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+margin_left = -300.0
+margin_top = 40.0
+margin_right = 300.0
+margin_bottom = 300.0
+custom_colors/font_color = Color( 1, 0.858824, 0, 1 )
+custom_fonts/font = SubResource( 43 )
+text = "HOLD R TO EXIT"
+align = 1
+clip_text = true
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="ConfigVP" type="Viewport" parent="."]
+size = Vector2( 600, 600 )
+transparent_bg = true
+msaa = 1
+fxaa = true
+hdr = false
+usage = 0
+render_target_update_mode = 3
+gui_snap_controls_to_pixels = false
+
+[node name="Control" type="ColorRect" parent="ConfigVP"]
+margin_right = 600.0
+margin_bottom = 600.0
+color = Color( 0, 0, 0, 0.831373 )
+script = ExtResource( 3 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="HitWindow" type="Label" parent="ConfigVP/Control"]
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = 30.0
+margin_top = -525.0
+margin_right = -315.0
+margin_bottom = -460.0
+custom_fonts/font = SubResource( 18 )
+text = "35 ms"
+align = 1
+valign = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Title" type="Label" parent="ConfigVP/Control/HitWindow"]
+anchor_right = 1.0
+margin_top = -40.0
+custom_fonts/font = SubResource( 19 )
+text = "HIT WINDOW"
+align = 1
+valign = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Approach" type="Label" parent="ConfigVP/Control"]
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = 315.0
+margin_top = -525.0
+margin_right = -30.0
+margin_bottom = -460.0
+custom_fonts/font = SubResource( 18 )
+text = "50"
+align = 1
+valign = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Title" type="Label" parent="ConfigVP/Control/Approach"]
+anchor_right = 1.0
+margin_top = -40.0
+custom_fonts/font = SubResource( 19 )
+text = "APPROACH RATE"
+align = 1
+valign = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Camera" type="Label" parent="ConfigVP/Control"]
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = 30.0
+margin_top = -400.0
+margin_right = -315.0
+margin_bottom = -335.0
+custom_fonts/font = SubResource( 18 )
+text = "LOCK"
+align = 1
+valign = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Title" type="Label" parent="ConfigVP/Control/Camera"]
+anchor_right = 1.0
+margin_top = -40.0
+custom_fonts/font = SubResource( 19 )
+text = "CAMERA TYPE"
+align = 1
+valign = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Parallax" type="Label" parent="ConfigVP/Control"]
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = 315.0
+margin_top = -400.0
+margin_right = -30.0
+margin_bottom = -335.0
+custom_fonts/font = SubResource( 18 )
+text = "1.00"
+align = 1
+valign = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Title" type="Label" parent="ConfigVP/Control/Parallax"]
+anchor_right = 1.0
+margin_top = -40.0
+custom_fonts/font = SubResource( 19 )
+text = "PARALLAX"
+align = 1
+valign = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="EdgeBuffer" type="Label" parent="ConfigVP/Control"]
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = 30.0
+margin_top = -275.0
+margin_right = -315.0
+margin_bottom = -210.0
+custom_fonts/font = SubResource( 18 )
+text = "NO"
+align = 1
+valign = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Title" type="Label" parent="ConfigVP/Control/EdgeBuffer"]
+anchor_right = 1.0
+margin_top = -40.0
+custom_fonts/font = SubResource( 19 )
+text = "EDGE BUFFER"
+align = 1
+valign = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Hitbox" type="Label" parent="ConfigVP/Control"]
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = 30.0
+margin_top = -150.0
+margin_right = -315.0
+margin_bottom = -85.0
+custom_fonts/font = SubResource( 18 )
+text = "1.27 (+0)"
+align = 1
+valign = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Title" type="Label" parent="ConfigVP/Control/Hitbox"]
+anchor_right = 1.0
+margin_top = -40.0
+custom_fonts/font = SubResource( 19 )
+text = "HITBOX SIZE"
+align = 1
+valign = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Sensitivity" type="Label" parent="ConfigVP/Control"]
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = 315.0
+margin_top = -275.0
+margin_right = -30.0
+margin_bottom = -210.0
+custom_fonts/font = SubResource( 18 )
+text = "1.00"
+align = 1
+valign = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Title" type="Label" parent="ConfigVP/Control/Sensitivity"]
+anchor_right = 1.0
+margin_top = -40.0
+custom_fonts/font = SubResource( 19 )
+text = "SENSITIVITY"
+align = 1
+valign = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="ComboVP" type="Viewport" parent="."]
+size = Vector2( 600, 600 )
+transparent_bg = true
+msaa = 1
+fxaa = true
+hdr = false
+usage = 0
+render_target_update_mode = 3
+gui_snap_controls_to_pixels = false
+
+[node name="Value" type="Label" parent="ComboVP"]
+material = SubResource( 108 )
+anchor_top = 0.25
+anchor_right = 1.0
+anchor_bottom = 0.25
+margin_bottom = 236.0
+grow_horizontal = 2
+grow_vertical = 0
+custom_colors/font_color = Color( 1, 1, 1, 0.196078 )
+custom_fonts/font = SubResource( 20 )
+text = "0"
+align = 1
+valign = 1
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LeftHud" type="Sprite3D" parent="."]
+transform = Transform( -0.996195, 0.0871559, 3.8097e-09, 0, -4.37114e-08, 1, 0.0871559, 0.996195, 4.35451e-08, -2.457, 0, 0.28 )
+cast_shadow = 0
+flip_h = true
+pixel_size = 0.0033
+axis = 1
+double_sided = false
+render_priority = 101
+texture = SubResource( 22 )
+
+[node name="GiveUpHud" type="Sprite3D" parent="."]
+transform = Transform( 1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 2.23827e-08, 0.512057 )
+visible = false
+cast_shadow = 0
+pixel_size = 0.0033
+axis = 1
+no_depth_test = true
+render_priority = 105
+texture = SubResource( 23 )
+
+[node name="PauseHud" type="Sprite3D" parent="."]
+transform = Transform( 1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 1.89666e-08, 0.433905 )
+visible = false
+cast_shadow = 0
+pixel_size = 0.0044
+axis = 1
+no_depth_test = true
+render_priority = 104
+texture = SubResource( 24 )
+
+[node name="RightHud" type="Sprite3D" parent="."]
+transform = Transform( -0.996195, -0.0871557, -3.80969e-09, 0, -4.37114e-08, 1, -0.0871557, 0.996195, 4.35451e-08, 2.457, 0, 0.28 )
+cast_shadow = 0
+flip_h = true
+pixel_size = 0.0033
+axis = 1
+double_sided = false
+render_priority = 101
+texture = SubResource( 25 )
+
+[node name="ConfigHud" type="Sprite3D" parent="."]
+transform = Transform( 1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 2.35546e-08, 0.538867 )
+visible = false
+cast_shadow = 0
+pixel_size = 0.0033
+axis = 1
+no_depth_test = true
+render_priority = 103
+texture = SubResource( 27 )
+
+[node name="ComboHud" type="Sprite3D" parent="."]
+transform = Transform( 1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 1, -0.461133 )
+cast_shadow = 0
+pixel_size = 0.0033
+axis = 1
+no_depth_test = true
+render_priority = 100
+texture = SubResource( 28 )
+
+[node name="Info" type="HBoxContainer" parent="."]
+anchor_top = 0.5
+anchor_right = 1.0
+anchor_bottom = 0.5
+grow_horizontal = 2
+alignment = 1
+
+[node name="C" type="VBoxContainer" parent="Info"]
+margin_left = 315.0
+margin_right = 965.0
+margin_bottom = 118.0
+rect_min_size = Vector2( 650, 0 )
+
+[node name="Sep" type="MarginContainer" parent="Info/C"]
+margin_right = 650.0
+margin_bottom = 14.0
+custom_constants/margin_right = 45
+custom_constants/margin_left = 45
+custom_constants/margin_bottom = 10
+
+[node name="HSeparator" type="HSeparator" parent="Info/C/Sep"]
+margin_left = 45.0
+margin_right = 605.0
+margin_bottom = 4.0
+custom_styles/separator = SubResource( 85 )
+
+[node name="MapName" type="MarginContainer" parent="Info/C"]
+margin_top = 18.0
+margin_right = 650.0
+margin_bottom = 63.0
+custom_constants/margin_right = 30
+custom_constants/margin_left = 30
+
+[node name="L" type="Label" parent="Info/C/MapName"]
+margin_left = 30.0
+margin_right = 620.0
+margin_bottom = 45.0
+custom_fonts/font = SubResource( 99 )
+text = "Artist Name - Song Name"
+align = 1
+
+[node name="Mapper" type="MarginContainer" parent="Info/C"]
+margin_top = 67.0
+margin_right = 650.0
+margin_bottom = 90.0
+custom_constants/margin_right = 30
+custom_constants/margin_left = 30
+
+[node name="H" type="HBoxContainer" parent="Info/C/Mapper"]
+margin_left = 30.0
+margin_right = 620.0
+margin_bottom = 23.0
+custom_constants/separation = 0
+alignment = 1
+
+[node name="T" type="Label" parent="Info/C/Mapper/H"]
+margin_left = 180.0
+margin_right = 280.0
+margin_bottom = 23.0
+custom_colors/font_color = Color( 0.67451, 0.992157, 0.694118, 1 )
+custom_fonts/font = SubResource( 87 )
+text = "Mapped by "
+align = 1
+
+[node name="L" type="Label" parent="Info/C/Mapper/H"]
+margin_left = 280.0
+margin_right = 410.0
+margin_bottom = 23.0
+custom_colors/font_color = Color( 0.67451, 0.968627, 0.992157, 1 )
+custom_fonts/font = SubResource( 100 )
+text = "Mario & Luigi"
+align = 1
+
+[node name="Sep2" type="MarginContainer" parent="Info/C"]
+margin_top = 94.0
+margin_right = 650.0
+margin_bottom = 118.0
+custom_constants/margin_right = 45
+custom_constants/margin_top = 10
+custom_constants/margin_left = 45
+custom_constants/margin_bottom = 10
+
+[node name="HSeparator2" type="HSeparator" parent="Info/C/Sep2"]
+margin_left = 45.0
+margin_top = 10.0
+margin_right = 605.0
+margin_bottom = 14.0
+custom_styles/separator = SubResource( 85 )
+
+[node name="Modifiers" type="MarginContainer" parent="Info/C"]
+visible = false
+margin_top = 122.0
+margin_right = 800.0
+margin_bottom = 149.0
+
+[node name="V" type="VBoxContainer" parent="Info/C/Modifiers"]
+margin_right = 800.0
+margin_bottom = 27.0
+grow_horizontal = 2
+
+[node name="Icons" type="MarginContainer" parent="Info/C/Modifiers/V"]
+margin_right = 800.0
+grow_horizontal = 2
+custom_constants/margin_right = 28
+custom_constants/margin_left = 28
+
+[node name="H" type="HBoxContainer" parent="Info/C/Modifiers/V/Icons"]
+margin_left = 28.0
+margin_right = 772.0
+rect_min_size = Vector2( 744, 0 )
+custom_constants/separation = 6
+alignment = 1
+
+[node name="Replaying" type="TextureRect" parent="Info/C/Modifiers/V/Icons/H"]
+visible = false
+margin_left = 204.0
+margin_right = 236.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 32, 32 )
+texture = ExtResource( 31 )
+stretch_mode = 1
+
+[node name="Autoplay" type="TextureRect" parent="Info/C/Modifiers/V/Icons/H"]
+visible = false
+margin_left = 242.0
+margin_right = 274.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 32, 32 )
+texture = ExtResource( 22 )
+stretch_mode = 1
+
+[node name="SpeedMMM" type="TextureRect" parent="Info/C/Modifiers/V/Icons/H"]
+visible = false
+margin_left = 280.0
+margin_right = 312.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 32, 32 )
+texture = ExtResource( 11 )
+stretch_mode = 1
+
+[node name="SpeedMM" type="TextureRect" parent="Info/C/Modifiers/V/Icons/H"]
+visible = false
+margin_left = 318.0
+margin_right = 350.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 32, 32 )
+texture = ExtResource( 17 )
+stretch_mode = 1
+
+[node name="SpeedM" type="TextureRect" parent="Info/C/Modifiers/V/Icons/H"]
+visible = false
+margin_left = 356.0
+margin_right = 388.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 32, 32 )
+texture = ExtResource( 18 )
+stretch_mode = 1
+
+[node name="SpeedP" type="TextureRect" parent="Info/C/Modifiers/V/Icons/H"]
+visible = false
+margin_left = 394.0
+margin_right = 426.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 32, 32 )
+texture = ExtResource( 20 )
+stretch_mode = 1
+
+[node name="SpeedPP" type="TextureRect" parent="Info/C/Modifiers/V/Icons/H"]
+visible = false
+margin_left = 432.0
+margin_right = 464.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 32, 32 )
+texture = ExtResource( 16 )
+stretch_mode = 1
+
+[node name="SpeedPPP" type="TextureRect" parent="Info/C/Modifiers/V/Icons/H"]
+visible = false
+margin_left = 470.0
+margin_right = 502.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 32, 32 )
+texture = ExtResource( 30 )
+stretch_mode = 1
+
+[node name="SpeedPPPP" type="TextureRect" parent="Info/C/Modifiers/V/Icons/H"]
+visible = false
+margin_left = 508.0
+margin_right = 540.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 32, 32 )
+texture = ExtResource( 21 )
+stretch_mode = 1
+
+[node name="Text" type="Label" parent="Info/C/Modifiers/V"]
+margin_top = 4.0
+margin_right = 800.0
+margin_bottom = 27.0
+rect_min_size = Vector2( 800, 0 )
+custom_colors/font_color = Color( 1, 0.929412, 0.658824, 1 )
+custom_fonts/font = SubResource( 89 )
+text = "Modifier text"
+align = 1
+autowrap = true
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="GridVP" type="Viewport" parent="."]
+size = Vector2( 900, 900 )
+transparent_bg = true
+msaa = 2
+debanding = true
+hdr = false
+usage = 0
+render_target_v_flip = true
+render_target_update_mode = 3
+gui_snap_controls_to_pixels = false
+
+[node name="Control" type="Control" parent="GridVP"]
+margin_right = 900.0
+margin_bottom = 900.0
+
+[node name="Timer" type="Control" parent="GridVP/Control"]
+margin_right = 900.0
+margin_bottom = 150.0
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Time" type="ProgressBar" parent="GridVP/Control/Timer"]
+anchor_left = 0.5
+anchor_top = 1.0
+anchor_right = 0.5
+anchor_bottom = 1.0
+margin_left = -210.0
+margin_top = -13.0
+margin_right = 210.0
+margin_bottom = -8.0
+custom_styles/fg = SubResource( 4 )
+custom_styles/bg = SubResource( 5 )
+max_value = 1.0
+step = 0.0
+value = 0.5
+percent_visible = false
+
+[node name="Label" type="Label" parent="GridVP/Control/Timer" groups=["timer_text"]]
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_bottom = -15.0
+custom_fonts/font = SubResource( 93 )
+text = "CLICK TO START"
+align = 1
+valign = 2
+
+[node name="SongName" type="Label" parent="GridVP/Control/Timer" groups=["timer_text"]]
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_bottom = -60.0
+rect_min_size = Vector2( 0, 48 )
+custom_fonts/font = SubResource( 101 )
+text = "Artist Name - Song Name"
+align = 1
+valign = 2
+autowrap = true
+clip_text = true
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Sides" type="Control" parent="GridVP/Control"]
+margin_left = 150.0
+margin_top = 150.0
+margin_right = 750.0
+margin_bottom = 750.0
+
+[node name="AA" type="ColorRect" parent="GridVP/Control/Sides"]
+anchor_top = 0.2
+anchor_bottom = 0.8
+margin_left = 1.0
+margin_right = 4.0
+color = Color( 1, 1, 1, 0.470588 )
+
+[node name="AB" type="ColorRect" parent="GridVP/Control/Sides"]
+anchor_left = 1.0
+anchor_top = 0.2
+anchor_right = 1.0
+anchor_bottom = 0.8
+margin_left = -4.0
+margin_right = -1.0
+color = Color( 1, 1, 1, 0.470588 )
+
+[node name="BA" type="ColorRect" parent="GridVP/Control/Sides"]
+anchor_left = 0.2
+anchor_top = 1.0
+anchor_right = 0.8
+anchor_bottom = 1.0
+margin_top = -4.0
+margin_bottom = -1.0
+color = Color( 1, 1, 1, 0.470588 )
+
+[node name="BB" type="ColorRect" parent="GridVP/Control/Sides"]
+anchor_left = 0.2
+anchor_right = 0.8
+margin_top = 1.0
+margin_bottom = 4.0
+color = Color( 1, 1, 1, 0.470588 )
+
+[node name="Corners" type="Control" parent="GridVP/Control"]
+margin_left = 150.0
+margin_top = 150.0
+margin_right = 750.0
+margin_bottom = 750.0
+
+[node name="Corner" type="Control" parent="GridVP/Control/Corners"]
+anchor_right = 0.15
+anchor_bottom = 0.15
+
+[node name="A" type="ColorRect" parent="GridVP/Control/Corners/Corner"]
+anchor_bottom = 1.0
+margin_right = 4.0
+
+[node name="B" type="ColorRect" parent="GridVP/Control/Corners/Corner"]
+anchor_right = 1.0
+margin_left = 4.0
+margin_bottom = 4.0
+
+[node name="Corner4" type="Control" parent="GridVP/Control/Corners"]
+anchor_top = 0.85
+anchor_right = 0.15
+anchor_bottom = 1.0
+
+[node name="A" type="ColorRect" parent="GridVP/Control/Corners/Corner4"]
+anchor_bottom = 1.0
+margin_right = 4.0
+
+[node name="B" type="ColorRect" parent="GridVP/Control/Corners/Corner4"]
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = 4.0
+margin_top = -4.0
+
+[node name="Corner2" type="Control" parent="GridVP/Control/Corners"]
+anchor_left = 0.85
+anchor_top = 0.85
+anchor_right = 1.0
+anchor_bottom = 1.0
+
+[node name="A" type="ColorRect" parent="GridVP/Control/Corners/Corner2"]
+anchor_left = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = -4.0
+
+[node name="B" type="ColorRect" parent="GridVP/Control/Corners/Corner2"]
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_top = -4.0
+margin_right = -4.0
+
+[node name="Corner3" type="Control" parent="GridVP/Control/Corners"]
+anchor_left = 0.85
+anchor_right = 1.0
+anchor_bottom = 0.15
+
+[node name="A" type="ColorRect" parent="GridVP/Control/Corners/Corner3"]
+anchor_left = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = -4.0
+
+[node name="B" type="ColorRect" parent="GridVP/Control/Corners/Corner3"]
+anchor_right = 1.0
+margin_right = -4.0
+margin_bottom = 4.0
+
+[node name="Energy" type="Control" parent="GridVP/Control"]
+anchor_top = 1.0
+anchor_bottom = 1.0
+margin_top = -150.0
+margin_right = 900.0
+
+[node name="Energy" type="ProgressBar" parent="GridVP/Control/Energy"]
+anchor_left = 0.5
+anchor_right = 0.5
+margin_left = -210.0
+margin_top = 8.0
+margin_right = 210.0
+margin_bottom = 13.0
+custom_styles/fg = SubResource( 111 )
+custom_styles/bg = SubResource( 112 )
+max_value = 1.0
+step = 0.0
+value = 1.0
+percent_visible = false
+
+[node name="Failed" type="TextureRect" parent="GridVP/Control/Energy/Energy"]
+visible = false
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+margin_left = -24.0
+margin_top = -24.0
+margin_right = 24.0
+margin_bottom = 24.0
+rect_pivot_offset = Vector2( 24, 24 )
+texture = ExtResource( 39 )
+expand = true
+
+[node name="Modifiers" type="VBoxContainer" parent="GridVP/Control/Energy"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_top = 25.0
+grow_horizontal = 2
+
+[node name="Text" type="Label" parent="GridVP/Control/Energy/Modifiers"]
+margin_right = 900.0
+margin_bottom = 30.0
+rect_min_size = Vector2( 800, 0 )
+custom_colors/font_color = Color( 1, 0.929412, 0.658824, 1 )
+custom_fonts/font = SubResource( 106 )
+text = "Modifier text"
+align = 1
+autowrap = true
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Icons" type="MarginContainer" parent="GridVP/Control/Energy/Modifiers"]
+margin_top = 34.0
+margin_right = 900.0
+margin_bottom = 34.0
+grow_horizontal = 2
+custom_constants/margin_right = 28
+custom_constants/margin_left = 28
+
+[node name="H" type="HBoxContainer" parent="GridVP/Control/Energy/Modifiers/Icons"]
+margin_left = 28.0
+margin_right = 872.0
+rect_min_size = Vector2( 744, 0 )
+custom_constants/separation = 6
+alignment = 1
+
+[node name="Replaying" type="TextureRect" parent="GridVP/Control/Energy/Modifiers/Icons/H"]
+visible = false
+margin_left = 155.0
+margin_right = 203.0
+margin_bottom = 48.0
+rect_min_size = Vector2( 48, 48 )
+texture = ExtResource( 38 )
+expand = true
+stretch_mode = 1
+
+[node name="Autoplay" type="TextureRect" parent="GridVP/Control/Energy/Modifiers/Icons/H"]
+visible = false
+margin_left = 209.0
+margin_right = 257.0
+margin_bottom = 48.0
+rect_min_size = Vector2( 48, 48 )
+texture = ExtResource( 34 )
+expand = true
+stretch_mode = 1
+
+[node name="SpeedMMM" type="TextureRect" parent="GridVP/Control/Energy/Modifiers/Icons/H"]
+visible = false
+margin_left = 263.0
+margin_right = 311.0
+margin_bottom = 48.0
+rect_min_size = Vector2( 48, 48 )
+texture = ExtResource( 36 )
+expand = true
+stretch_mode = 1
+
+[node name="SpeedMM" type="TextureRect" parent="GridVP/Control/Energy/Modifiers/Icons/H"]
+visible = false
+margin_left = 317.0
+margin_right = 365.0
+margin_bottom = 48.0
+rect_min_size = Vector2( 48, 48 )
+texture = ExtResource( 27 )
+expand = true
+stretch_mode = 1
+
+[node name="SpeedM" type="TextureRect" parent="GridVP/Control/Energy/Modifiers/Icons/H"]
+visible = false
+margin_left = 371.0
+margin_right = 419.0
+margin_bottom = 48.0
+rect_min_size = Vector2( 48, 48 )
+texture = ExtResource( 35 )
+expand = true
+stretch_mode = 1
+
+[node name="SpeedP" type="TextureRect" parent="GridVP/Control/Energy/Modifiers/Icons/H"]
+visible = false
+margin_left = 425.0
+margin_right = 473.0
+margin_bottom = 48.0
+rect_min_size = Vector2( 48, 48 )
+texture = ExtResource( 37 )
+expand = true
+stretch_mode = 1
+
+[node name="SpeedPP" type="TextureRect" parent="GridVP/Control/Energy/Modifiers/Icons/H"]
+visible = false
+margin_left = 479.0
+margin_right = 527.0
+margin_bottom = 48.0
+rect_min_size = Vector2( 48, 48 )
+texture = ExtResource( 24 )
+expand = true
+stretch_mode = 1
+
+[node name="SpeedPPP" type="TextureRect" parent="GridVP/Control/Energy/Modifiers/Icons/H"]
+visible = false
+margin_left = 533.0
+margin_right = 581.0
+margin_bottom = 48.0
+rect_min_size = Vector2( 48, 48 )
+texture = ExtResource( 28 )
+expand = true
+stretch_mode = 1
+
+[node name="SpeedPPPP" type="TextureRect" parent="GridVP/Control/Energy/Modifiers/Icons/H"]
+visible = false
+margin_left = 587.0
+margin_right = 635.0
+margin_bottom = 48.0
+rect_min_size = Vector2( 48, 48 )
+texture = ExtResource( 33 )
+expand = true
+stretch_mode = 1
+
+[node name="Window" type="Label" parent="GridVP/Control/Energy/Modifiers/Icons/H"]
+visible = false
+margin_left = 641.0
+margin_right = 689.0
+margin_bottom = 48.0
+rect_min_size = Vector2( 48, 48 )
+size_flags_vertical = 3
+custom_fonts/font = SubResource( 107 )
+text = "🪟"
+align = 1
+valign = 1
+
+[node name="Grid" type="Spatial" parent="."]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -1, 1, 0 )
+
+[node name="Outer" type="MeshInstance" parent="Grid"]
+transform = Transform( 1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 1, -1, 0 )
+mesh = SubResource( 90 )
+skeleton = NodePath("../..")
+material/0 = SubResource( 91 )
+
+[node name="TimerVP" type="Viewport" parent="."]
+size = Vector2( 900, 300 )
+transparent_bg = true
+msaa = 2
+debanding = true
+hdr = false
+usage = 0
+render_target_update_mode = 3
+
+[node name="EnergyVP" type="Viewport" parent="."]
+size = Vector2( 900, 300 )
+transparent_bg = true
+msaa = 2
+debanding = true
+hdr = false
+usage = 0
+render_target_update_mode = 3
+
+[node name="TimerHud" type="Sprite3D" parent="."]
+transform = Transform( -1, 2.9595e-08, -1.50892e-07, -1.50597e-07, -0.386727, 0.922195, -3.10616e-08, 0.922195, 0.386727, -1.05219e-07, 2.3915, -0.13436 )
+cast_shadow = 0
+flip_h = true
+pixel_size = 0.0055
+axis = 1
+double_sided = false
+render_priority = 102
+texture = SubResource( 104 )
+
+[node name="EnergyHud" type="Sprite3D" parent="."]
+transform = Transform( -1, 6.50888e-09, 3.31011e-08, 3.31011e-08, 0.378633, 0.925547, -6.5089e-09, 0.925547, -0.378633, -2.19198e-08, -2.63437, -0.117157 )
+cast_shadow = 0
+flip_h = true
+pixel_size = 0.0055
+axis = 1
+double_sided = false
+render_priority = 102
+texture = SubResource( 105 )
+
+[connection signal="pressed" from="Mobile/Pause/Button" to="Mobile" method="_on_Pause_pressed"]
+[connection signal="released" from="Mobile/Pause/Button" to="Mobile" method="_on_Pause_released"]
+[connection signal="pressed" from="Mobile/GiveUp/Button" to="Mobile" method="_on_GiveUp_pressed"]
+[connection signal="released" from="Mobile/GiveUp/Button" to="Mobile" method="_on_GiveUp_released"]
diff --git a/prefabs/menu/confirm.tscn b/prefabs/menu/confirm.tscn
index 78912b2c..cad7a83f 100644
--- a/prefabs/menu/confirm.tscn
+++ b/prefabs/menu/confirm.tscn
@@ -4,11 +4,9 @@
[ext_resource path="res://assets/font/Noto_Sans_JP/NotoSansJP-Medium.otf" type="DynamicFontData" id=2]
[ext_resource path="res://assets/font/Lato/Lato-Regular.ttf" type="DynamicFontData" id=3]
[ext_resource path="res://scripts/ui/ConfirmationPrompt2D.gd" type="Script" id=4]
-[ext_resource path="res://assets/sfx/new_best.wav" type="AudioStream" id=5]
-[ext_resource path="res://assets/sfx/button-16.wav" type="AudioStream" id=6]
-[ext_resource path="res://assets/sfx/button-16.wav" type="AudioStream" id=7]
-
-
+[ext_resource path="res://assets/sfx/mkw_alert.mp3" type="AudioStream" id=5]
+[ext_resource path="res://assets/sfx/mkw_back.mp3" type="AudioStream" id=6]
+[ext_resource path="res://assets/sfx/mkw_next.mp3" type="AudioStream" id=7]
[sub_resource type="StyleBoxFlat" id=4]
bg_color = Color( 0.0784314, 0.0784314, 0.0784314, 1 )
@@ -45,17 +43,14 @@ script = ExtResource( 4 )
[node name="Alert" type="AudioStreamPlayer" parent="."]
stream = ExtResource( 5 )
-volume_db = -6.0
bus = "Prompt"
[node name="Next" type="AudioStreamPlayer" parent="."]
-stream = ExtResource( 6 )
-volume_db = -6.0
+stream = ExtResource( 7 )
bus = "Prompt"
[node name="Back" type="AudioStreamPlayer" parent="."]
-stream = ExtResource( 7 )
-volume_db = -6.0
+stream = ExtResource( 6 )
bus = "Prompt"
[node name="C" type="CenterContainer" parent="."]
diff --git a/prefabs/menu/credits.tscn b/prefabs/menu/credits.tscn
index 6293e651..f17b0de5 100644
--- a/prefabs/menu/credits.tscn
+++ b/prefabs/menu/credits.tscn
@@ -373,17 +373,17 @@ margin_right = 1216.0
margin_bottom = 77.0
[node name="H" type="HBoxContainer" parent="SpecialThanks/C13"]
-margin_left = 259.0
-margin_right = 956.0
+margin_left = 375.0
+margin_right = 840.0
margin_bottom = 25.0
alignment = 1
[node name="Label" type="Label" parent="SpecialThanks/C13/H"]
-margin_right = 697.0
+margin_right = 465.0
margin_bottom = 25.0
custom_colors/font_color = Color( 0.878431, 0.858824, 0.682353, 1 )
custom_fonts/font = SubResource( 160 )
-text = "Basil \"Chedski\" Cyathea - The person that started it all; unfortunately gone now"
+text = "Lily \"Chedski\" Cyathea - The person that started it all"
align = 1
[node name="C7" type="CenterContainer" parent="SpecialThanks"]
diff --git a/prefabs/menu/settings_page.tscn b/prefabs/menu/settings_page.tscn
index 02b58b65..dd2d8acd 100644
--- a/prefabs/menu/settings_page.tscn
+++ b/prefabs/menu/settings_page.tscn
@@ -1,4 +1,4 @@
-[gd_scene load_steps=92 format=2]
+[gd_scene load_steps=93 format=2]
[ext_resource path="res://uitheme.tres" type="Theme" id=1]
[ext_resource path="res://assets/font/Lato/Lato-Regular.ttf" type="DynamicFontData" id=2]
@@ -41,6 +41,7 @@
[ext_resource path="res://scripts/ui/settings/fov.gd" type="Script" id=39]
[ext_resource path="res://assets/font/Lato/Lato-Bold.ttf" type="DynamicFontData" id=40]
[ext_resource path="res://scripts/ui/settings/Bloom.gd" type="Script" id=41]
+[ext_resource path="res://assets/notefx/miss/miss.png" type="Texture" id=42]
[ext_resource path="res://scripts/ui/settings/NoteScale.gd" type="Script" id=44]
[ext_resource path="res://scripts/ui/settings/ReplaceCustomFile.gd" type="Script" id=45]
[ext_resource path="res://addons/native_dialogs/bin/native_dialog_open_file.gdns" type="Script" id=46]
@@ -2350,11 +2351,11 @@ custom_styles/separator = SubResource( 55 )
[node name="Cursor" type="VBoxContainer" parent="TabContainer/World & Cursor"]
margin_top = 276.0
margin_right = 1280.0
-margin_bottom = 700.0
+margin_bottom = 736.0
[node name="Group" type="MarginContainer" parent="TabContainer/World & Cursor/Cursor"]
margin_right = 1280.0
-margin_bottom = 424.0
+margin_bottom = 460.0
mouse_filter = 1
custom_constants/margin_left = 66
custom_constants/margin_bottom = 12
@@ -2362,7 +2363,7 @@ custom_constants/margin_bottom = 12
[node name="H" type="GridContainer" parent="TabContainer/World & Cursor/Cursor/Group"]
margin_left = 66.0
margin_right = 1280.0
-margin_bottom = 412.0
+margin_bottom = 448.0
[node name="CustomCursor" type="Control" parent="TabContainer/World & Cursor/Cursor/Group/H"]
margin_right = 316.0
@@ -2437,10 +2438,85 @@ disabled = true
icon = ExtResource( 4 )
expand_icon = true
-[node name="CursorColorType" type="HBoxContainer" parent="TabContainer/World & Cursor/Cursor/Group/H"]
+[node name="CursorTrailImg" type="Control" parent="TabContainer/World & Cursor/Cursor/Group/H"]
margin_top = 36.0
margin_right = 316.0
margin_bottom = 68.0
+rect_min_size = Vector2( 200, 32 )
+
+[node name="CursorTrailImg" type="Button" parent="TabContainer/World & Cursor/Cursor/Group/H/CursorTrailImg"]
+margin_right = 200.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 200, 32 )
+rect_pivot_offset = Vector2( -432, 104 )
+hint_tooltip = "changes the image used by the cursor trail. uses the cursor image if unset"
+theme = ExtResource( 1 )
+custom_colors/font_color_focus = Color( 0, 0, 0, 1 )
+custom_colors/font_color = Color( 0, 0, 0, 1 )
+custom_colors/font_color_hover = Color( 0, 0, 0, 1 )
+custom_colors/font_color_pressed = Color( 0, 0, 0, 1 )
+text = "Click to replace"
+script = ExtResource( 45 )
+target = "trail"
+default_image = ExtResource( 42 )
+
+[node name="Label" type="Label" parent="TabContainer/World & Cursor/Cursor/Group/H/CursorTrailImg/CursorTrailImg"]
+margin_left = 289.0
+margin_right = 462.0
+margin_bottom = 32.0
+hint_tooltip = "ah, the cursor. arguably the most important part of this game."
+focus_mode = 2
+mouse_filter = 1
+theme = ExtResource( 1 )
+custom_colors/font_color = Color( 0.898039, 0.94902, 1, 1 )
+custom_fonts/font = SubResource( 3 )
+text = "Cursor Trail (optional)"
+valign = 1
+
+[node name="ImgPreview" type="TextureRect" parent="TabContainer/World & Cursor/Cursor/Group/H/CursorTrailImg/CursorTrailImg"]
+anchor_left = 1.0
+anchor_right = 1.0
+margin_left = 5.0
+margin_right = 37.0
+margin_bottom = 32.0
+texture = ExtResource( 42 )
+expand = true
+stretch_mode = 1
+
+[node name="Button" type="Button" parent="TabContainer/World & Cursor/Cursor/Group/H/CursorTrailImg/CursorTrailImg"]
+visible = false
+anchor_left = 1.0
+anchor_right = 1.0
+margin_left = 42.0
+margin_right = 74.0
+margin_bottom = 32.0
+
+[node name="TextureRect" type="TextureRect" parent="TabContainer/World & Cursor/Cursor/Group/H/CursorTrailImg/CursorTrailImg/Button"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+texture = ExtResource( 4 )
+expand = true
+stretch_mode = 4
+
+[node name="Clear" type="Button" parent="TabContainer/World & Cursor/Cursor/Group/H/CursorTrailImg/CursorTrailImg"]
+anchor_left = 1.0
+anchor_right = 1.0
+margin_left = 42.0
+margin_right = 74.0
+margin_bottom = 32.0
+theme = ExtResource( 1 )
+custom_colors/font_color_focus = Color( 0, 0, 0, 1 )
+custom_colors/font_color = Color( 0, 0, 0, 1 )
+custom_colors/font_color_hover = Color( 0, 0, 0, 1 )
+custom_colors/font_color_pressed = Color( 0, 0, 0, 1 )
+disabled = true
+icon = ExtResource( 4 )
+expand_icon = true
+
+[node name="CursorColorType" type="HBoxContainer" parent="TabContainer/World & Cursor/Cursor/Group/H"]
+margin_top = 72.0
+margin_right = 316.0
+margin_bottom = 104.0
hint_tooltip = "how the cursor will be colored"
[node name="Effect" type="MenuButton" parent="TabContainer/World & Cursor/Cursor/Group/H/CursorColorType"]
@@ -2475,9 +2551,9 @@ align = 2
valign = 1
[node name="cursor_color" type="HBoxContainer" parent="TabContainer/World & Cursor/Cursor/Group/H"]
-margin_top = 72.0
+margin_top = 108.0
margin_right = 316.0
-margin_bottom = 104.0
+margin_bottom = 140.0
hint_tooltip = "[def. #ffffff] color used for \"Single Color\""
[node name="Color" type="ColorPickerButton" parent="TabContainer/World & Cursor/Cursor/Group/H/cursor_color"]
@@ -2509,9 +2585,9 @@ align = 2
valign = 1
[node name="CursorScale" type="HBoxContainer" parent="TabContainer/World & Cursor/Cursor/Group/H"]
-margin_top = 108.0
+margin_top = 144.0
margin_right = 316.0
-margin_bottom = 140.0
+margin_bottom = 176.0
hint_tooltip = "[def. 1] cursor size multiplier (doesn't affect hitboxes)"
[node name="CursorScale" type="SpinBox" parent="TabContainer/World & Cursor/Cursor/Group/H/CursorScale"]
@@ -2540,9 +2616,9 @@ align = 2
valign = 1
[node name="CursorSpin" type="HBoxContainer" parent="TabContainer/World & Cursor/Cursor/Group/H"]
-margin_top = 144.0
+margin_top = 180.0
margin_right = 316.0
-margin_bottom = 176.0
+margin_bottom = 212.0
hint_tooltip = "[def. 0°] makes the cursor image rotate"
[node name="CursorSpin" type="SpinBox" parent="TabContainer/World & Cursor/Cursor/Group/H/CursorSpin"]
@@ -2575,16 +2651,16 @@ align = 2
valign = 1
[node name="SEPARATOR7" type="HSeparator" parent="TabContainer/World & Cursor/Cursor/Group/H"]
-margin_top = 180.0
+margin_top = 216.0
margin_right = 316.0
-margin_bottom = 190.0
+margin_bottom = 226.0
rect_min_size = Vector2( 0, 10 )
custom_styles/separator = SubResource( 55 )
[node name="CursorTrail" type="CheckBox" parent="TabContainer/World & Cursor/Cursor/Group/H"]
-margin_top = 194.0
+margin_top = 230.0
margin_right = 316.0
-margin_bottom = 222.0
+margin_bottom = 258.0
rect_min_size = Vector2( 0, 28 )
hint_tooltip = "many of you have asked so i shall deliver"
theme = ExtResource( 1 )
@@ -2602,9 +2678,9 @@ script = ExtResource( 54 )
target = "cursor_trail"
[node name="SmartTrail" type="CheckBox" parent="TabContainer/World & Cursor/Cursor/Group/H"]
-margin_top = 226.0
+margin_top = 262.0
margin_right = 316.0
-margin_bottom = 254.0
+margin_bottom = 290.0
rect_min_size = Vector2( 0, 28 )
hint_tooltip = "makes the trail smooth by using distance moved to spawn particles instead of having a constant number"
theme = ExtResource( 1 )
@@ -2622,9 +2698,9 @@ script = ExtResource( 54 )
target = "smart_trail"
[node name="CursorTrailMode" type="HBoxContainer" parent="TabContainer/World & Cursor/Cursor/Group/H"]
-margin_top = 258.0
+margin_top = 294.0
margin_right = 316.0
-margin_bottom = 290.0
+margin_bottom = 326.0
hint_tooltip = "how the trail will fade out"
[node name="Effect" type="MenuButton" parent="TabContainer/World & Cursor/Cursor/Group/H/CursorTrailMode"]
@@ -2657,9 +2733,9 @@ align = 2
valign = 1
[node name="TrailDetail" type="HBoxContainer" parent="TabContainer/World & Cursor/Cursor/Group/H"]
-margin_top = 294.0
+margin_top = 330.0
margin_right = 316.0
-margin_bottom = 326.0
+margin_bottom = 362.0
hint_tooltip = "[def. 10] number of particles in the cursor trail / (smart trail) number spawned per grid unit"
[node name="TrailDetail" type="SpinBox" parent="TabContainer/World & Cursor/Cursor/Group/H/TrailDetail"]
@@ -2690,9 +2766,9 @@ align = 2
valign = 1
[node name="TrailTime" type="HBoxContainer" parent="TabContainer/World & Cursor/Cursor/Group/H"]
-margin_top = 330.0
+margin_top = 366.0
margin_right = 316.0
-margin_bottom = 362.0
+margin_bottom = 398.0
hint_tooltip = "[def. 0.15] how long the cursor trail lasts in seconds"
[node name="TrailTime" type="SpinBox" parent="TabContainer/World & Cursor/Cursor/Group/H/TrailTime"]
@@ -2724,16 +2800,16 @@ align = 2
valign = 1
[node name="SEPARATOR3" type="HSeparator" parent="TabContainer/World & Cursor/Cursor/Group/H"]
-margin_top = 366.0
+margin_top = 402.0
margin_right = 316.0
-margin_bottom = 376.0
+margin_bottom = 412.0
rect_min_size = Vector2( 0, 10 )
custom_styles/separator = SubResource( 55 )
[node name="TouchIndicator" type="Control" parent="TabContainer/World & Cursor/Cursor/Group/H"]
-margin_top = 380.0
+margin_top = 416.0
margin_right = 316.0
-margin_bottom = 412.0
+margin_bottom = 448.0
rect_min_size = Vector2( 200, 32 )
[node name="TouchIndicator" type="Button" parent="TabContainer/World & Cursor/Cursor/Group/H/TouchIndicator"]
@@ -2791,9 +2867,9 @@ icon = ExtResource( 4 )
expand_icon = true
[node name="SEPARATOR" type="HSeparator" parent="TabContainer/World & Cursor"]
-margin_top = 700.0
+margin_top = 736.0
margin_right = 1280.0
-margin_bottom = 730.0
+margin_bottom = 766.0
rect_min_size = Vector2( 0, 10 )
custom_constants/separation = 30
custom_styles/separator = SubResource( 55 )
@@ -2816,21 +2892,21 @@ custom_styles/separator = SubResource( 55 )
[node name="UI" type="VBoxContainer" parent="TabContainer/UI"]
margin_top = 30.0
margin_right = 1280.0
-margin_bottom = 562.0
+margin_bottom = 594.0
[node name="Group" type="MarginContainer" parent="TabContainer/UI/UI"]
margin_right = 1280.0
-margin_bottom = 532.0
+margin_bottom = 564.0
mouse_filter = 1
custom_constants/margin_left = 66
[node name="H" type="GridContainer" parent="TabContainer/UI/UI/Group"]
margin_left = 66.0
margin_right = 1280.0
-margin_bottom = 532.0
+margin_bottom = 564.0
[node name="Grid" type="CheckBox" parent="TabContainer/UI/UI/Group/H"]
-margin_right = 170.0
+margin_right = 214.0
margin_bottom = 28.0
rect_min_size = Vector2( 0, 28 )
hint_tooltip = "turns the note grid on or off"
@@ -2854,7 +2930,7 @@ target = "enable_grid"
[node name="Border" type="CheckBox" parent="TabContainer/UI/UI/Group/H"]
margin_top = 32.0
-margin_right = 170.0
+margin_right = 214.0
margin_bottom = 60.0
rect_min_size = Vector2( 0, 28 )
hint_tooltip = "turns the note grid border on or off"
@@ -2878,7 +2954,7 @@ target = "enable_border"
[node name="SimpleHud" type="CheckBox" parent="TabContainer/UI/UI/Group/H"]
margin_top = 64.0
-margin_right = 170.0
+margin_right = 214.0
margin_bottom = 92.0
rect_min_size = Vector2( 0, 28 )
hint_tooltip = "changes the side panels to show only your misses and pauses"
@@ -2902,7 +2978,7 @@ target = "simple_hud"
[node name="LetterGrade" type="CheckBox" parent="TabContainer/UI/UI/Group/H"]
margin_top = 96.0
-margin_right = 170.0
+margin_right = 214.0
margin_bottom = 124.0
rect_min_size = Vector2( 0, 28 )
hint_tooltip = "shows a letter grade (SS, S, A, etc.) above your accuracy"
@@ -2926,7 +3002,7 @@ target = "show_letter_grade"
[node name="Config" type="CheckBox" parent="TabContainer/UI/UI/Group/H"]
margin_top = 128.0
-margin_right = 170.0
+margin_right = 214.0
margin_bottom = 156.0
rect_min_size = Vector2( 0, 28 )
hint_tooltip = "shows your approach rate, hit window, and camera config at the start of songs (to show off)"
@@ -2950,7 +3026,7 @@ target = "show_config"
[node name="DisplayTrueCombo" type="CheckBox" parent="TabContainer/UI/UI/Group/H"]
margin_top = 160.0
-margin_right = 170.0
+margin_right = 214.0
margin_bottom = 188.0
rect_min_size = Vector2( 0, 28 )
hint_tooltip = "displays the real value of your combo behind the grid"
@@ -2969,11 +3045,32 @@ flat = true
script = ExtResource( 54 )
target = "display_true_combo"
-[node name="ShowHealth" type="CheckBox" parent="TabContainer/UI/UI/Group/H"]
+[node name="FullComboIndicators" type="CheckBox" parent="TabContainer/UI/UI/Group/H"]
margin_top = 192.0
-margin_right = 170.0
+margin_right = 214.0
margin_bottom = 220.0
rect_min_size = Vector2( 0, 28 )
+hint_tooltip = "highlights the letter grade and combo number (if visible) when you have 100% accuracy"
+theme = ExtResource( 1 )
+custom_colors/font_color_disabled = Color( 0.898039, 0.94902, 1, 1 )
+custom_colors/font_color_focus = Color( 0.898039, 0.94902, 1, 1 )
+custom_colors/font_color_hover_pressed = Color( 0.898039, 0.94902, 1, 1 )
+custom_colors/font_color = Color( 0.898039, 0.94902, 1, 1 )
+custom_colors/font_color_hover = Color( 0.898039, 0.94902, 1, 1 )
+custom_colors/font_color_pressed = Color( 0.898039, 0.94902, 1, 1 )
+custom_fonts/font = SubResource( 4 )
+pressed = true
+action_mode = 0
+text = "Show Full Combo Indicators"
+flat = true
+script = ExtResource( 54 )
+target = "show_full_combo_indicators"
+
+[node name="ShowHealth" type="CheckBox" parent="TabContainer/UI/UI/Group/H"]
+margin_top = 224.0
+margin_right = 214.0
+margin_bottom = 252.0
+rect_min_size = Vector2( 0, 28 )
hint_tooltip = "i don't understand why you'd turn this off but people have asked so here you go"
theme = ExtResource( 1 )
custom_colors/font_color_disabled = Color( 0.898039, 0.94902, 1, 1 )
@@ -2991,9 +3088,9 @@ script = ExtResource( 54 )
target = "show_hp_bar"
[node name="ShowTimer" type="CheckBox" parent="TabContainer/UI/UI/Group/H"]
-margin_top = 224.0
-margin_right = 170.0
-margin_bottom = 252.0
+margin_top = 256.0
+margin_right = 214.0
+margin_bottom = 284.0
rect_min_size = Vector2( 0, 28 )
hint_tooltip = "tells you how far into a song you are (and the name of the song)"
theme = ExtResource( 1 )
@@ -3012,9 +3109,9 @@ script = ExtResource( 54 )
target = "show_timer"
[node name="AccuracyBar" type="CheckBox" parent="TabContainer/UI/UI/Group/H"]
-margin_top = 256.0
-margin_right = 170.0
-margin_bottom = 284.0
+margin_top = 288.0
+margin_right = 214.0
+margin_bottom = 316.0
rect_min_size = Vector2( 0, 28 )
hint_tooltip = "shows your accuracy on a progress bar"
theme = ExtResource( 1 )
@@ -3033,9 +3130,9 @@ script = ExtResource( 54 )
target = "show_accuracy_bar"
[node name="ShowLeftPanel" type="CheckBox" parent="TabContainer/UI/UI/Group/H"]
-margin_top = 288.0
-margin_right = 170.0
-margin_bottom = 316.0
+margin_top = 320.0
+margin_right = 214.0
+margin_bottom = 348.0
rect_min_size = Vector2( 0, 28 )
hint_tooltip = "contains: combo meter, pause counter, accuracy"
theme = ExtResource( 1 )
@@ -3054,9 +3151,9 @@ script = ExtResource( 54 )
target = "show_left_panel"
[node name="ShowRightPanel" type="CheckBox" parent="TabContainer/UI/UI/Group/H"]
-margin_top = 320.0
-margin_right = 170.0
-margin_bottom = 348.0
+margin_top = 352.0
+margin_right = 214.0
+margin_bottom = 380.0
rect_min_size = Vector2( 0, 28 )
hint_tooltip = "contains: framerate, miss counter, notes hit / total notes"
theme = ExtResource( 1 )
@@ -3075,9 +3172,9 @@ script = ExtResource( 54 )
target = "show_right_panel"
[node name="ShowCursor" type="CheckBox" parent="TabContainer/UI/UI/Group/H"]
-margin_top = 352.0
-margin_right = 170.0
-margin_bottom = 380.0
+margin_top = 384.0
+margin_right = 214.0
+margin_bottom = 412.0
rect_min_size = Vector2( 0, 28 )
hint_tooltip = "to prevent issues where people forget they turned the cursor off, this doesn't save"
theme = ExtResource( 1 )
@@ -3096,9 +3193,9 @@ script = ExtResource( 54 )
target = "show_cursor"
[node name="AttachHpToGrid" type="CheckBox" parent="TabContainer/UI/UI/Group/H"]
-margin_top = 384.0
-margin_right = 170.0
-margin_bottom = 412.0
+margin_top = 416.0
+margin_right = 214.0
+margin_bottom = 444.0
rect_min_size = Vector2( 0, 28 )
hint_tooltip = "attaches your health bar + modifiers to the note grid"
theme = ExtResource( 1 )
@@ -3116,9 +3213,9 @@ script = ExtResource( 54 )
target = "attach_hp_to_grid"
[node name="AttachTimerToGrid" type="CheckBox" parent="TabContainer/UI/UI/Group/H"]
-margin_top = 416.0
-margin_right = 170.0
-margin_bottom = 444.0
+margin_top = 448.0
+margin_right = 214.0
+margin_bottom = 476.0
rect_min_size = Vector2( 0, 28 )
hint_tooltip = "attaches the timer + song name to the note grid"
theme = ExtResource( 1 )
@@ -3136,9 +3233,9 @@ script = ExtResource( 54 )
target = "attach_timer_to_grid"
[node name="Score Popup" type="CheckBox" parent="TabContainer/UI/UI/Group/H"]
-margin_top = 448.0
-margin_right = 170.0
-margin_bottom = 476.0
+margin_top = 480.0
+margin_right = 214.0
+margin_bottom = 508.0
rect_min_size = Vector2( 0, 28 )
hint_tooltip = "show the score you get from hitting a note at the bottom of the grid"
theme = ExtResource( 1 )
@@ -3157,9 +3254,9 @@ script = ExtResource( 54 )
target = "score_popup"
[node name="BillboardScore2" type="CheckBox" parent="TabContainer/UI/UI/Group/H"]
-margin_top = 480.0
-margin_right = 170.0
-margin_bottom = 508.0
+margin_top = 512.0
+margin_right = 214.0
+margin_bottom = 540.0
rect_min_size = Vector2( 0, 28 )
hint_tooltip = "apply a billboard effect to the score popup"
theme = ExtResource( 1 )
@@ -3210,9 +3307,9 @@ valign = 1
clip_text = true
[node name="ExpandHUDonHR" type="CheckBox" parent="TabContainer/UI/UI/Group/H"]
-margin_top = 512.0
-margin_right = 170.0
-margin_bottom = 532.0
+margin_top = 544.0
+margin_right = 214.0
+margin_bottom = 564.0
hint_tooltip = "expands the HUD when using Hard Rock"
theme = ExtResource( 1 )
custom_colors/font_color_disabled = Color( 0.898039, 0.94902, 1, 1 )
@@ -3230,20 +3327,20 @@ script = ExtResource( 54 )
target = "expand_hud_onhr"
[node name="UIColor" type="VBoxContainer" parent="TabContainer/UI"]
-margin_top = 562.0
+margin_top = 594.0
margin_right = 1280.0
-margin_bottom = 2194.0
+margin_bottom = 2384.0
[node name="Group" type="MarginContainer" parent="TabContainer/UI/UIColor"]
margin_right = 1280.0
-margin_bottom = 1632.0
+margin_bottom = 1790.0
mouse_filter = 1
custom_constants/margin_left = 66
[node name="H" type="GridContainer" parent="TabContainer/UI/UIColor/Group"]
margin_left = 66.0
margin_right = 1280.0
-margin_bottom = 1632.0
+margin_bottom = 1790.0
[node name="Presets" type="Control" parent="TabContainer/UI/UIColor/Group/H"]
margin_right = 500.0
@@ -4170,10 +4267,153 @@ margin_bottom = 1072.0
rect_min_size = Vector2( 500, 10 )
custom_styles/separator = SubResource( 55 )
-[node name="miss_text_color" type="HBoxContainer" parent="TabContainer/UI/UIColor/Group/H"]
+[node name="energy_fg" type="HBoxContainer" parent="TabContainer/UI/UIColor/Group/H"]
margin_top = 1076.0
margin_right = 500.0
margin_bottom = 1108.0
+hint_tooltip = "[def. ##DEFAULT##] fill color of timer progress bar (when skipping is possible)"
+
+[node name="Color" type="ColorPickerButton" parent="TabContainer/UI/UIColor/Group/H/energy_fg"]
+margin_right = 100.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 100, 32 )
+rect_pivot_offset = Vector2( 286, -36 )
+hint_tooltip = "[def. ##DEFAULT##] fill color of energy bar"
+theme = ExtResource( 1 )
+custom_styles/hover = SubResource( 50 )
+custom_styles/pressed = SubResource( 51 )
+custom_styles/focus = SubResource( 52 )
+custom_styles/disabled = SubResource( 53 )
+custom_styles/normal = SubResource( 54 )
+script = ExtResource( 51 )
+target = "energy_fg"
+
+[node name="Label" type="Label" parent="TabContainer/UI/UIColor/Group/H/energy_fg"]
+margin_left = 104.0
+margin_top = 6.0
+margin_right = 212.0
+margin_bottom = 26.0
+focus_mode = 2
+theme = ExtResource( 1 )
+custom_colors/font_color = Color( 0.898039, 0.94902, 1, 1 )
+custom_fonts/font = SubResource( 3 )
+text = "Energy Bar - Fill"
+align = 2
+valign = 1
+
+[node name="energy_bg" type="HBoxContainer" parent="TabContainer/UI/UIColor/Group/H"]
+margin_top = 1112.0
+margin_right = 500.0
+margin_bottom = 1144.0
+hint_tooltip = "[def. ##DEFAULT##] fill color of timer progress bar (when skipping is possible)"
+
+[node name="Color" type="ColorPickerButton" parent="TabContainer/UI/UIColor/Group/H/energy_bg"]
+margin_right = 100.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 100, 32 )
+rect_pivot_offset = Vector2( 286, -36 )
+hint_tooltip = "[def. ##DEFAULT##] empty color of energy bar"
+theme = ExtResource( 1 )
+custom_styles/hover = SubResource( 50 )
+custom_styles/pressed = SubResource( 51 )
+custom_styles/focus = SubResource( 52 )
+custom_styles/disabled = SubResource( 53 )
+custom_styles/normal = SubResource( 54 )
+script = ExtResource( 51 )
+target = "energy_bg"
+
+[node name="Label" type="Label" parent="TabContainer/UI/UIColor/Group/H/energy_bg"]
+margin_left = 104.0
+margin_top = 6.0
+margin_right = 236.0
+margin_bottom = 26.0
+focus_mode = 2
+theme = ExtResource( 1 )
+custom_colors/font_color = Color( 0.898039, 0.94902, 1, 1 )
+custom_fonts/font = SubResource( 3 )
+text = "Energy Bar - Empty"
+align = 2
+valign = 1
+
+[node name="energy_failed" type="HBoxContainer" parent="TabContainer/UI/UIColor/Group/H"]
+margin_top = 1148.0
+margin_right = 500.0
+margin_bottom = 1180.0
+hint_tooltip = "[def. ##DEFAULT##] color of the energy bar after failing"
+
+[node name="Color" type="ColorPickerButton" parent="TabContainer/UI/UIColor/Group/H/energy_failed"]
+margin_right = 100.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 100, 32 )
+rect_pivot_offset = Vector2( 286, -36 )
+hint_tooltip = "[def. ##DEFAULT##] color of the energy bar after failing when playing with nofail"
+theme = ExtResource( 1 )
+custom_styles/hover = SubResource( 50 )
+custom_styles/pressed = SubResource( 51 )
+custom_styles/focus = SubResource( 52 )
+custom_styles/disabled = SubResource( 53 )
+custom_styles/normal = SubResource( 54 )
+script = ExtResource( 51 )
+target = "energy_failed"
+
+[node name="Label" type="Label" parent="TabContainer/UI/UIColor/Group/H/energy_failed"]
+margin_left = 104.0
+margin_top = 6.0
+margin_right = 233.0
+margin_bottom = 26.0
+focus_mode = 2
+theme = ExtResource( 1 )
+custom_colors/font_color = Color( 0.898039, 0.94902, 1, 1 )
+custom_fonts/font = SubResource( 3 )
+text = "Energy Bar - Failed"
+align = 2
+valign = 1
+
+[node name="energy_failed_flash" type="HBoxContainer" parent="TabContainer/UI/UIColor/Group/H"]
+margin_top = 1184.0
+margin_right = 500.0
+margin_bottom = 1216.0
+hint_tooltip = "[def. ##DEFAULT##] color of the energy bar after failing"
+
+[node name="Color" type="ColorPickerButton" parent="TabContainer/UI/UIColor/Group/H/energy_failed_flash"]
+margin_right = 100.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 100, 32 )
+rect_pivot_offset = Vector2( 286, -36 )
+hint_tooltip = "[def. ##DEFAULT##] color that the energy bar flashes when you fail with nofail on"
+theme = ExtResource( 1 )
+custom_styles/hover = SubResource( 50 )
+custom_styles/pressed = SubResource( 51 )
+custom_styles/focus = SubResource( 52 )
+custom_styles/disabled = SubResource( 53 )
+custom_styles/normal = SubResource( 54 )
+script = ExtResource( 51 )
+target = "energy_failed_flash"
+
+[node name="Label" type="Label" parent="TabContainer/UI/UIColor/Group/H/energy_failed_flash"]
+margin_left = 104.0
+margin_top = 6.0
+margin_right = 283.0
+margin_bottom = 26.0
+focus_mode = 2
+theme = ExtResource( 1 )
+custom_colors/font_color = Color( 0.898039, 0.94902, 1, 1 )
+custom_fonts/font = SubResource( 3 )
+text = "Energy Bar - Failed (Flash)"
+align = 2
+valign = 1
+
+[node name="SEPARATOR15" type="HSeparator" parent="TabContainer/UI/UIColor/Group/H"]
+margin_top = 1220.0
+margin_right = 500.0
+margin_bottom = 1230.0
+rect_min_size = Vector2( 500, 10 )
+custom_styles/separator = SubResource( 55 )
+
+[node name="miss_text_color" type="HBoxContainer" parent="TabContainer/UI/UIColor/Group/H"]
+margin_top = 1234.0
+margin_right = 500.0
+margin_bottom = 1266.0
hint_tooltip = "[def. ##DEFAULT##] text color of the miss counter"
[node name="Color" type="ColorPickerButton" parent="TabContainer/UI/UIColor/Group/H/miss_text_color"]
@@ -4205,9 +4445,9 @@ align = 2
valign = 1
[node name="miss_flash_color" type="HBoxContainer" parent="TabContainer/UI/UIColor/Group/H"]
-margin_top = 1112.0
+margin_top = 1270.0
margin_right = 500.0
-margin_bottom = 1144.0
+margin_bottom = 1302.0
hint_tooltip = "[def. ##DEFAULT##] miss counter text briefly flashes this color when you get a miss"
[node name="Color" type="ColorPickerButton" parent="TabContainer/UI/UIColor/Group/H/miss_flash_color"]
@@ -4239,16 +4479,16 @@ align = 2
valign = 1
[node name="SEPARATOR11" type="HSeparator" parent="TabContainer/UI/UIColor/Group/H"]
-margin_top = 1148.0
+margin_top = 1306.0
margin_right = 500.0
-margin_bottom = 1158.0
+margin_bottom = 1316.0
rect_min_size = Vector2( 500, 10 )
custom_styles/separator = SubResource( 55 )
[node name="pause_text_color" type="HBoxContainer" parent="TabContainer/UI/UIColor/Group/H"]
-margin_top = 1162.0
+margin_top = 1320.0
margin_right = 500.0
-margin_bottom = 1194.0
+margin_bottom = 1352.0
hint_tooltip = "[def. ##DEFAULT##] color of the pause counter (with no pauses)"
[node name="Color" type="ColorPickerButton" parent="TabContainer/UI/UIColor/Group/H/pause_text_color"]
@@ -4280,9 +4520,9 @@ align = 2
valign = 1
[node name="pause_used_color" type="HBoxContainer" parent="TabContainer/UI/UIColor/Group/H"]
-margin_top = 1198.0
+margin_top = 1356.0
margin_right = 500.0
-margin_bottom = 1230.0
+margin_bottom = 1388.0
hint_tooltip = "[def. ##DEFAULT##] color of the pause counter (with at least 1 pause)"
[node name="Color" type="ColorPickerButton" parent="TabContainer/UI/UIColor/Group/H/pause_used_color"]
@@ -4314,16 +4554,16 @@ align = 2
valign = 1
[node name="SEPARATOR12" type="HSeparator" parent="TabContainer/UI/UIColor/Group/H"]
-margin_top = 1234.0
+margin_top = 1392.0
margin_right = 500.0
-margin_bottom = 1244.0
+margin_bottom = 1402.0
rect_min_size = Vector2( 500, 10 )
custom_styles/separator = SubResource( 55 )
[node name="grade_ss_saturation" type="HBoxContainer" parent="TabContainer/UI/UIColor/Group/H"]
-margin_top = 1248.0
+margin_top = 1406.0
margin_right = 500.0
-margin_bottom = 1280.0
+margin_bottom = 1438.0
hint_tooltip = "[def. ##DEFAULT##] hsv saturation of rainbow effect on grade SS"
[node name="SpinBox" type="SpinBox" parent="TabContainer/UI/UIColor/Group/H/grade_ss_saturation"]
@@ -4354,9 +4594,9 @@ align = 2
valign = 1
[node name="grade_ss_value" type="HBoxContainer" parent="TabContainer/UI/UIColor/Group/H"]
-margin_top = 1284.0
+margin_top = 1442.0
margin_right = 500.0
-margin_bottom = 1316.0
+margin_bottom = 1474.0
hint_tooltip = "[def. ##DEFAULT##] hsv value of rainbow effect on grade SS"
[node name="SpinBox" type="SpinBox" parent="TabContainer/UI/UIColor/Group/H/grade_ss_value"]
@@ -4387,9 +4627,9 @@ align = 2
valign = 1
[node name="grade_ss_shine" type="HBoxContainer" parent="TabContainer/UI/UIColor/Group/H"]
-margin_top = 1320.0
+margin_top = 1478.0
margin_right = 500.0
-margin_bottom = 1352.0
+margin_bottom = 1510.0
hint_tooltip = "[def. ##DEFAULT##] level of shine shader when grade is SS"
[node name="SpinBox" type="SpinBox" parent="TabContainer/UI/UIColor/Group/H/grade_ss_shine"]
@@ -4420,16 +4660,16 @@ align = 2
valign = 1
[node name="SEPARATOR13" type="HSeparator" parent="TabContainer/UI/UIColor/Group/H"]
-margin_top = 1356.0
+margin_top = 1514.0
margin_right = 500.0
-margin_bottom = 1366.0
+margin_bottom = 1524.0
rect_min_size = Vector2( 500, 10 )
custom_styles/separator = SubResource( 55 )
[node name="grade_s_color" type="HBoxContainer" parent="TabContainer/UI/UIColor/Group/H"]
-margin_top = 1370.0
+margin_top = 1528.0
margin_right = 500.0
-margin_bottom = 1402.0
+margin_bottom = 1560.0
hint_tooltip = "[def. ##DEFAULT##] color of text when grade is S"
[node name="Color" type="ColorPickerButton" parent="TabContainer/UI/UIColor/Group/H/grade_s_color"]
@@ -4461,9 +4701,9 @@ align = 2
valign = 1
[node name="grade_s_shine" type="HBoxContainer" parent="TabContainer/UI/UIColor/Group/H"]
-margin_top = 1406.0
+margin_top = 1564.0
margin_right = 500.0
-margin_bottom = 1438.0
+margin_bottom = 1596.0
hint_tooltip = "[def. ##DEFAULT##] level of shine shader when grade is S"
[node name="SpinBox" type="SpinBox" parent="TabContainer/UI/UIColor/Group/H/grade_s_shine"]
@@ -4494,16 +4734,16 @@ align = 2
valign = 1
[node name="SEPARATOR14" type="HSeparator" parent="TabContainer/UI/UIColor/Group/H"]
-margin_top = 1442.0
+margin_top = 1600.0
margin_right = 500.0
-margin_bottom = 1452.0
+margin_bottom = 1610.0
rect_min_size = Vector2( 500, 10 )
custom_styles/separator = SubResource( 55 )
[node name="grade_a_color" type="HBoxContainer" parent="TabContainer/UI/UIColor/Group/H"]
-margin_top = 1456.0
+margin_top = 1614.0
margin_right = 500.0
-margin_bottom = 1488.0
+margin_bottom = 1646.0
hint_tooltip = "[def. ##DEFAULT##] color of text when grade is A"
[node name="Color" type="ColorPickerButton" parent="TabContainer/UI/UIColor/Group/H/grade_a_color"]
@@ -4535,9 +4775,9 @@ align = 2
valign = 1
[node name="grade_b_color" type="HBoxContainer" parent="TabContainer/UI/UIColor/Group/H"]
-margin_top = 1492.0
+margin_top = 1650.0
margin_right = 500.0
-margin_bottom = 1524.0
+margin_bottom = 1682.0
hint_tooltip = "[def. ##DEFAULT##] color of text when grade is B"
[node name="Color" type="ColorPickerButton" parent="TabContainer/UI/UIColor/Group/H/grade_b_color"]
@@ -4569,9 +4809,9 @@ align = 2
valign = 1
[node name="grade_c_color" type="HBoxContainer" parent="TabContainer/UI/UIColor/Group/H"]
-margin_top = 1528.0
+margin_top = 1686.0
margin_right = 500.0
-margin_bottom = 1560.0
+margin_bottom = 1718.0
hint_tooltip = "[def. ##DEFAULT##] color of text when grade is C"
[node name="Color" type="ColorPickerButton" parent="TabContainer/UI/UIColor/Group/H/grade_c_color"]
@@ -4603,9 +4843,9 @@ align = 2
valign = 1
[node name="grade_d_color" type="HBoxContainer" parent="TabContainer/UI/UIColor/Group/H"]
-margin_top = 1564.0
+margin_top = 1722.0
margin_right = 500.0
-margin_bottom = 1596.0
+margin_bottom = 1754.0
hint_tooltip = "[def. ##DEFAULT##] color of text when grade is D"
[node name="Color" type="ColorPickerButton" parent="TabContainer/UI/UIColor/Group/H/grade_d_color"]
@@ -4637,9 +4877,9 @@ align = 2
valign = 1
[node name="grade_f_color" type="HBoxContainer" parent="TabContainer/UI/UIColor/Group/H"]
-margin_top = 1600.0
+margin_top = 1758.0
margin_right = 500.0
-margin_bottom = 1632.0
+margin_bottom = 1790.0
hint_tooltip = "[def. ##DEFAULT##] color of text when grade is F"
[node name="Color" type="ColorPickerButton" parent="TabContainer/UI/UIColor/Group/H/grade_f_color"]
@@ -4671,9 +4911,9 @@ align = 2
valign = 1
[node name="SEPARATOR" type="HSeparator" parent="TabContainer/UI"]
-margin_top = 2194.0
+margin_top = 2384.0
margin_right = 1280.0
-margin_bottom = 2224.0
+margin_bottom = 2414.0
rect_min_size = Vector2( 0, 10 )
custom_constants/separation = 30
custom_styles/separator = SubResource( 55 )
diff --git a/prefabs/menu/string.tscn b/prefabs/menu/string.tscn
index 7a3f0c93..cdc9fbea 100644
--- a/prefabs/menu/string.tscn
+++ b/prefabs/menu/string.tscn
@@ -1,11 +1,12 @@
-[gd_scene load_steps=13 format=2]
+[gd_scene load_steps=14 format=2]
[ext_resource path="res://uitheme.tres" type="Theme" id=1]
[ext_resource path="res://assets/font/Noto_Sans_JP/NotoSansJP-Medium.otf" type="DynamicFontData" id=2]
[ext_resource path="res://assets/font/Lato/Lato-Regular.ttf" type="DynamicFontData" id=3]
[ext_resource path="res://scripts/ui/StringPrompt2D.gd" type="Script" id=4]
-[ext_resource path="res://assets/sfx/new_best.wav" type="AudioStream" id=5]
-[ext_resource path="res://assets/sfx/button-16.wav" type="AudioStream" id=7]
+[ext_resource path="res://assets/sfx/mkw_alert.mp3" type="AudioStream" id=5]
+[ext_resource path="res://assets/sfx/mkw_back.mp3" type="AudioStream" id=6]
+[ext_resource path="res://assets/sfx/mkw_next.mp3" type="AudioStream" id=7]
[sub_resource type="StyleBoxFlat" id=4]
bg_color = Color( 0.0784314, 0.0784314, 0.0784314, 1 )
@@ -42,17 +43,14 @@ script = ExtResource( 4 )
[node name="Alert" type="AudioStreamPlayer" parent="."]
stream = ExtResource( 5 )
-volume_db = -6.0
bus = "Prompt"
[node name="Next" type="AudioStreamPlayer" parent="."]
stream = ExtResource( 7 )
-volume_db = -6.0
bus = "Prompt"
[node name="Back" type="AudioStreamPlayer" parent="."]
-stream = ExtResource( 7 )
-volume_db = -6.0
+stream = ExtResource( 6 )
bus = "Prompt"
[node name="C" type="CenterContainer" parent="."]
diff --git a/project.godot b/project.godot
index ef22b89a..a2e1845b 100644
--- a/project.godot
+++ b/project.godot
@@ -49,72 +49,72 @@ _global_script_classes=[ {
"language": "GDScript",
"path": "res://scripts/cursordance/Directional.gd"
}, {
-"base": "",
+"base": "Reference",
"class": "DiscordActivity",
"language": "NativeScript",
"path": "res://addons/discord_game_sdk/discord_activity.gdns"
}, {
-"base": "",
+"base": "Reference",
"class": "DiscordActivityAssets",
"language": "NativeScript",
"path": "res://addons/discord_game_sdk/discord_activity_assets.gdns"
}, {
-"base": "",
+"base": "Reference",
"class": "DiscordActivityManager",
"language": "NativeScript",
"path": "res://addons/discord_game_sdk/discord_activity_manager.gdns"
}, {
-"base": "",
+"base": "Reference",
"class": "DiscordActivityParty",
"language": "NativeScript",
"path": "res://addons/discord_game_sdk/discord_activity_party.gdns"
}, {
-"base": "",
+"base": "Reference",
"class": "DiscordActivitySecrets",
"language": "NativeScript",
"path": "res://addons/discord_game_sdk/discord_activity_secrets.gdns"
}, {
-"base": "",
+"base": "Reference",
"class": "DiscordActivityTimestamps",
"language": "NativeScript",
"path": "res://addons/discord_game_sdk/discord_activity_timestamps.gdns"
}, {
-"base": "",
+"base": "Reference",
"class": "DiscordCore",
"language": "NativeScript",
"path": "res://addons/discord_game_sdk/discord_core.gdns"
}, {
-"base": "",
+"base": "Reference",
"class": "DiscordLobby",
"language": "NativeScript",
"path": "res://addons/discord_game_sdk/discord_lobby.gdns"
}, {
-"base": "",
+"base": "Reference",
"class": "DiscordLobbyManager",
"language": "NativeScript",
"path": "res://addons/discord_game_sdk/discord_lobby_manager.gdns"
}, {
-"base": "",
+"base": "Reference",
"class": "DiscordLobbyTransaction",
"language": "NativeScript",
"path": "res://addons/discord_game_sdk/discord_lobby_transaction.gdns"
}, {
-"base": "",
+"base": "Reference",
"class": "DiscordOverlayManager",
"language": "NativeScript",
"path": "res://addons/discord_game_sdk/discord_overlay_manager.gdns"
}, {
-"base": "",
+"base": "Reference",
"class": "DiscordPartySize",
"language": "NativeScript",
"path": "res://addons/discord_game_sdk/discord_party_size.gdns"
}, {
-"base": "",
+"base": "Reference",
"class": "DiscordResult",
"language": "NativeScript",
"path": "res://addons/discord_game_sdk/discord_result.gdns"
}, {
-"base": "",
+"base": "Reference",
"class": "DiscordUser",
"language": "NativeScript",
"path": "res://addons/discord_game_sdk/discord_user.gdns"
@@ -175,6 +175,11 @@ _global_script_classes=[ {
"path": "res://scripts/content/resources/ObjParse.gd"
}, {
"base": "Resource",
+"class": "OnlineAccount",
+"language": "GDScript",
+"path": "res://scripts/online/OnlineAccount.gd"
+}, {
+"base": "Resource",
"class": "Registry",
"language": "GDScript",
"path": "res://scripts/content/Registry.gd"
@@ -243,6 +248,7 @@ _global_script_class_icons={
"NoteMesh": "",
"Notify2D": "",
"ObjParse": "",
+"OnlineAccount": "",
"Registry": "",
"Replay": "",
"SimpleDanceMover": "",
@@ -255,7 +261,7 @@ _global_script_class_icons={
[application]
config/name="Rhythia"
-run/main_scene="res://scenes/init.tscn"
+run/main_scene="res://scenes/init3d.tscn"
config/use_custom_user_dir=true
config/custom_user_dir_name="SoundSpacePlus"
run/delta_sync_after_draw=true
@@ -265,7 +271,7 @@ boot_splash/bg_color=Color( 0, 0, 0, 1 )
config/icon="res://assets/images/branding/icon.png"
config/windows_native_icon="res://icon.ico"
config/quit_on_go_back=false
-config/version="oct31-2024"
+config/version="dev-menu3d"
config/autoload_map_registries="test maps|res://test_assets/test_maps.sspmr;built in|res://content/songs/built_in_maps.sspmr"
config/enable_new_content_mgr=true
config/default_menu_target="res://scenes/menu/menu2.tscn"
@@ -300,6 +306,7 @@ config/is_using_controller=true
config/discord_rpc=true
config/discord_rpc.editor=true
networking/github_repo="David20122/sound-space-plus"
+networking/online_features=true
[audio]
@@ -321,6 +328,7 @@ SFXManager="*res://scripts/game/SFXManager.gd"
gdscript/warnings/unused_argument=false
gdscript/warnings/narrowing_conversion=false
gdscript/warnings/unused_signal=false
+gdscript/warnings/return_value_discarded=false
[discord_presence]
@@ -524,6 +532,31 @@ menu_quickbar={
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":10,"pressure":0.0,"pressed":false,"script":null)
]
}
+warning_test2={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":true,"shift":true,"control":false,"meta":false,"command":false,"pressed":false,"scancode":69,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+ ]
+}
+warning_test3={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":true,"shift":true,"control":false,"meta":false,"command":false,"pressed":false,"scancode":82,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+ ]
+}
+warning_test4={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":true,"shift":true,"control":false,"meta":false,"command":false,"pressed":false,"scancode":83,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+ ]
+}
+dismiss_bar={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":67,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+ ]
+}
+debug_devmenu={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":true,"control":true,"meta":false,"command":true,"pressed":false,"scancode":68,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+ ]
+}
[locale]
diff --git a/scenes/devmenu.tscn b/scenes/devmenu.tscn
new file mode 100644
index 00000000..979658ba
--- /dev/null
+++ b/scenes/devmenu.tscn
@@ -0,0 +1,554 @@
+[gd_scene load_steps=41 format=2]
+
+[ext_resource path="res://uitheme.tres" type="Theme" id=1]
+[ext_resource path="res://assets/font/Lato/Lato-Regular.ttf" type="DynamicFontData" id=2]
+[ext_resource path="res://assets/font/Noto_Sans_JP/NotoSansJP-Medium.otf" type="DynamicFontData" id=3]
+[ext_resource path="res://assets/font/NotoColorEmoji.ttf" type="DynamicFontData" id=4]
+[ext_resource path="res://scripts/ui/menu/WarningBar.gd" type="Script" id=5]
+[ext_resource path="res://scripts/ui/menu/VersionNumber.gd" type="Script" id=6]
+[ext_resource path="res://assets/images/branding/icon.png" type="Texture" id=7]
+[ext_resource path="res://assets/images/menu3d/badges/map_offline.svg" type="Texture" id=8]
+[ext_resource path="res://assets/images/menu3d/icons/online.svg" type="Texture" id=9]
+[ext_resource path="res://assets/images/menu3d/badges/contentcreator.svg" type="Texture" id=10]
+[ext_resource path="res://assets/images/menu3d/badges/map_online.svg" type="Texture" id=11]
+[ext_resource path="res://assets/images/menu3d/icons/online_no.svg" type="Texture" id=12]
+[ext_resource path="res://assets/images/menu3d/badges/developer.svg" type="Texture" id=13]
+[ext_resource path="res://assets/images/menu3d/icons/advanced.svg" type="Texture" id=14]
+[ext_resource path="res://assets/images/menu3d/badges/rct.svg" type="Texture" id=15]
+[ext_resource path="res://assets/images/menu3d/badges/map_ranked.svg" type="Texture" id=16]
+[ext_resource path="res://assets/images/menu3d/badges/map_unranked.svg" type="Texture" id=17]
+[ext_resource path="res://assets/images/menu3d/icons/account_signedout.svg" type="Texture" id=18]
+[ext_resource path="res://assets/images/menu3d/badges/mmt.svg" type="Texture" id=19]
+[ext_resource path="res://assets/images/menu3d/icons/maintenance.svg" type="Texture" id=20]
+[ext_resource path="res://assets/images/menu3d/icons/sword.svg" type="Texture" id=21]
+[ext_resource path="res://assets/images/menu3d/badges/moderator.svg" type="Texture" id=22]
+[ext_resource path="res://scripts/ui/devmenu/devmenu.gd" type="Script" id=23]
+[ext_resource path="res://assets/images/menu3d/badges/silenced.svg" type="Texture" id=24]
+[ext_resource path="res://assets/images/menu3d/badges/map_wip.svg" type="Texture" id=25]
+[ext_resource path="res://prefabs/menu/credits.tscn" type="PackedScene" id=26]
+[ext_resource path="res://prefabs/menu/settings_page.tscn" type="PackedScene" id=27]
+[ext_resource path="res://assets/sfx/menu_full.mp3" type="AudioStream" id=28]
+[ext_resource path="res://scripts/ui/menu/buttons/RunMapButton.gd" type="Script" id=29]
+[ext_resource path="res://scripts/ui/menu/buttons/Favorite.gd" type="Script" id=30]
+[ext_resource path="res://scripts/ui/menu/menu2.gd" type="Script" id=31]
+[ext_resource path="res://scripts/ui/menu/buttons/PlaySong.gd" type="Script" id=32]
+[ext_resource path="res://scripts/ui/settings/MusicVolumeSetter.gd" type="Script" id=33]
+[ext_resource path="res://assets/images/ui/settings_dark.png" type="Texture" id=34]
+[ext_resource path="res://scripts/ui/menu/buttons/MapActions.gd" type="Script" id=35]
+[ext_resource path="res://assets/images/devbg.png" type="Texture" id=36]
+[ext_resource path="res://assets/notefx/explosion/explosion.tres" type="Texture" id=37]
+
+[sub_resource type="StyleBoxFlat" id=1]
+bg_color = Color( 0.498039, 0.894118, 1, 1 )
+corner_radius_top_left = 6
+corner_radius_top_right = 6
+corner_radius_bottom_right = 6
+corner_radius_bottom_left = 6
+
+[sub_resource type="StyleBoxFlat" id=3]
+bg_color = Color( 0.129412, 0.129412, 0.129412, 0.568627 )
+
+[sub_resource type="DynamicFont" id=2]
+use_filter = true
+font_data = ExtResource( 2 )
+fallback/0 = ExtResource( 4 )
+fallback/1 = ExtResource( 3 )
+
+[node name="Menu" type="TextureRect"]
+self_modulate = Color( 1, 1, 1, 0 )
+anchor_right = 1.0
+anchor_bottom = 1.0
+theme = ExtResource( 1 )
+texture = ExtResource( 36 )
+expand = true
+script = ExtResource( 31 )
+
+[node name="Menu" type="MarginContainer" parent="."]
+anchor_right = 1.0
+anchor_bottom = 1.0
+custom_constants/margin_right = 6
+custom_constants/margin_top = 6
+custom_constants/margin_left = 6
+custom_constants/margin_bottom = 6
+script = ExtResource( 23 )
+
+[node name="V" type="VBoxContainer" parent="Menu"]
+margin_left = 6.0
+margin_top = 6.0
+margin_right = 1274.0
+margin_bottom = 714.0
+
+[node name="Bar" type="HFlowContainer" parent="Menu/V"]
+margin_right = 1268.0
+margin_bottom = 32.0
+rect_pivot_offset = Vector2( -422, 4 )
+
+[node name="Quit" type="Button" parent="Menu/V/Bar"]
+margin_right = 64.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 64, 32 )
+theme = ExtResource( 1 )
+custom_styles/pressed = SubResource( 1 )
+toggle_mode = true
+action_mode = 0
+text = "quit"
+icon = ExtResource( 37 )
+icon_align = 1
+expand_icon = true
+
+[node name="Logo" type="TextureRect" parent="Menu/V/Bar"]
+visible = false
+margin_left = 68.0
+margin_right = 100.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 32, 32 )
+texture = ExtResource( 7 )
+expand = true
+stretch_mode = 1
+
+[node name="VersionNumber" type="Label" parent="Menu/V/Bar"]
+margin_left = 68.0
+margin_top = 6.0
+margin_right = 228.0
+margin_bottom = 26.0
+theme_type_variation = "DevMenuMonoLabel"
+text = "Rhythia [?????-????]"
+script = ExtResource( 6 )
+
+[node name="Debug" type="TextureRect" parent="Menu/V/Bar"]
+modulate = Color( 1, 0.239216, 0.988235, 1 )
+margin_left = 232.0
+margin_right = 256.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 24, 32 )
+texture = ExtResource( 13 )
+expand = true
+stretch_mode = 6
+
+[node name="Release" type="TextureRect" parent="Menu/V/Bar"]
+modulate = Color( 0.239216, 0.87451, 1, 1 )
+margin_left = 260.0
+margin_right = 284.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 24, 32 )
+texture = ExtResource( 10 )
+expand = true
+stretch_mode = 6
+
+[node name="OnlineServicesYes" type="TextureRect" parent="Menu/V/Bar"]
+modulate = Color( 0.0235294, 0.803922, 0.0901961, 1 )
+margin_left = 288.0
+margin_right = 312.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 24, 32 )
+texture = ExtResource( 9 )
+expand = true
+stretch_mode = 6
+
+[node name="OnlineServicesNo" type="TextureRect" parent="Menu/V/Bar"]
+modulate = Color( 1, 0.752941, 0.435294, 1 )
+margin_left = 316.0
+margin_right = 340.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 24, 32 )
+texture = ExtResource( 12 )
+expand = true
+stretch_mode = 6
+
+[node name="OnlineMapsYes" type="TextureRect" parent="Menu/V/Bar"]
+modulate = Color( 0.0235294, 0.803922, 0.0901961, 1 )
+margin_left = 344.0
+margin_right = 368.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 24, 32 )
+texture = ExtResource( 11 )
+expand = true
+stretch_mode = 6
+
+[node name="OnlineMapsNo" type="TextureRect" parent="Menu/V/Bar"]
+modulate = Color( 1, 0.752941, 0.435294, 1 )
+margin_left = 372.0
+margin_right = 396.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 24, 32 )
+texture = ExtResource( 8 )
+expand = true
+stretch_mode = 6
+
+[node name="ScoreSubYes" type="TextureRect" parent="Menu/V/Bar"]
+modulate = Color( 0.0235294, 0.803922, 0.0901961, 1 )
+margin_left = 400.0
+margin_right = 424.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 24, 32 )
+texture = ExtResource( 16 )
+expand = true
+stretch_mode = 6
+
+[node name="ScoreSubNo" type="TextureRect" parent="Menu/V/Bar"]
+modulate = Color( 1, 0.752941, 0.435294, 1 )
+margin_left = 428.0
+margin_right = 452.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 24, 32 )
+texture = ExtResource( 17 )
+expand = true
+stretch_mode = 6
+
+[node name="Silenced" type="TextureRect" parent="Menu/V/Bar"]
+modulate = Color( 1, 0.356863, 0.356863, 1 )
+margin_left = 456.0
+margin_right = 480.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 24, 32 )
+texture = ExtResource( 24 )
+expand = true
+stretch_mode = 6
+
+[node name="Banned" type="TextureRect" parent="Menu/V/Bar"]
+modulate = Color( 1, 0.356863, 0.356863, 1 )
+margin_left = 484.0
+margin_right = 508.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 24, 32 )
+texture = ExtResource( 22 )
+expand = true
+stretch_mode = 6
+
+[node name="AntiTamper" type="TextureRect" parent="Menu/V/Bar"]
+modulate = Color( 1, 0.356863, 0.356863, 1 )
+margin_left = 512.0
+margin_right = 536.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 24, 32 )
+texture = ExtResource( 25 )
+expand = true
+stretch_mode = 6
+
+[node name="ServerDown" type="TextureRect" parent="Menu/V/Bar"]
+modulate = Color( 1, 0.356863, 0.356863, 1 )
+margin_left = 540.0
+margin_right = 564.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 24, 32 )
+texture = ExtResource( 20 )
+expand = true
+stretch_mode = 6
+
+[node name="NoInternet" type="TextureRect" parent="Menu/V/Bar"]
+modulate = Color( 1, 0.356863, 0.356863, 1 )
+margin_left = 568.0
+margin_right = 592.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 24, 32 )
+texture = ExtResource( 12 )
+expand = true
+stretch_mode = 6
+
+[node name="SignedOut" type="TextureRect" parent="Menu/V/Bar"]
+modulate = Color( 1, 0.356863, 0.356863, 1 )
+margin_left = 596.0
+margin_right = 620.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 24, 32 )
+texture = ExtResource( 18 )
+expand = true
+stretch_mode = 6
+
+[node name="IsAdmin" type="TextureRect" parent="Menu/V/Bar"]
+modulate = Color( 0.356863, 0.607843, 1, 1 )
+margin_left = 624.0
+margin_right = 648.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 24, 32 )
+texture = ExtResource( 14 )
+expand = true
+stretch_mode = 6
+
+[node name="IsModerator" type="TextureRect" parent="Menu/V/Bar"]
+modulate = Color( 0.356863, 0.607843, 1, 1 )
+margin_left = 652.0
+margin_right = 676.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 24, 32 )
+texture = ExtResource( 21 )
+expand = true
+stretch_mode = 6
+
+[node name="IsMMT" type="TextureRect" parent="Menu/V/Bar"]
+modulate = Color( 0.356863, 0.607843, 1, 1 )
+margin_left = 680.0
+margin_right = 704.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 24, 32 )
+texture = ExtResource( 19 )
+expand = true
+stretch_mode = 6
+
+[node name="IsRCT" type="TextureRect" parent="Menu/V/Bar"]
+modulate = Color( 0.356863, 0.607843, 1, 1 )
+margin_left = 708.0
+margin_right = 732.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 24, 32 )
+texture = ExtResource( 15 )
+expand = true
+stretch_mode = 6
+
+[node name="DevMenuTag" type="Label" parent="Menu/V/Bar"]
+margin_left = 736.0
+margin_top = 6.0
+margin_right = 880.0
+margin_bottom = 26.0
+theme_type_variation = "DevMenuMonoLabel"
+text = "debug menu!!!! :3c"
+
+[node name="VSeparator" type="VSeparator" parent="Menu/V/Bar"]
+margin_left = 884.0
+margin_right = 888.0
+margin_bottom = 32.0
+
+[node name="Label" type="Label" parent="Menu/V/Bar"]
+margin_left = 892.0
+margin_top = 6.0
+margin_right = 935.0
+margin_bottom = 26.0
+text = "Go to:"
+
+[node name="ToDevMenu" type="Button" parent="Menu/V/Bar"]
+margin_left = 939.0
+margin_right = 1003.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 0, 32 )
+theme = ExtResource( 1 )
+custom_styles/pressed = SubResource( 1 )
+toggle_mode = true
+action_mode = 0
+text = "devmenu"
+
+[node name="ToMenu2" type="Button" parent="Menu/V/Bar"]
+margin_left = 1007.0
+margin_right = 1055.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 0, 32 )
+theme = ExtResource( 1 )
+custom_styles/pressed = SubResource( 1 )
+toggle_mode = true
+action_mode = 0
+text = "menu2"
+
+[node name="ToMenu3" type="Button" parent="Menu/V/Bar"]
+margin_left = 1059.0
+margin_right = 1116.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 0, 32 )
+theme = ExtResource( 1 )
+custom_styles/pressed = SubResource( 1 )
+toggle_mode = true
+action_mode = 0
+text = "menu3d"
+
+[node name="ToInit3d" type="Button" parent="Menu/V/Bar"]
+margin_left = 1120.0
+margin_right = 1161.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 0, 32 )
+theme = ExtResource( 1 )
+custom_styles/pressed = SubResource( 1 )
+toggle_mode = true
+action_mode = 0
+text = "init3d"
+
+[node name="ToSongload" type="Button" parent="Menu/V/Bar"]
+margin_left = 1165.0
+margin_right = 1198.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 0, 32 )
+theme = ExtResource( 1 )
+custom_styles/pressed = SubResource( 1 )
+toggle_mode = true
+action_mode = 0
+text = "song"
+
+[node name="VSeparator2" type="VSeparator" parent="Menu/V/Bar"]
+margin_left = 1202.0
+margin_right = 1206.0
+margin_bottom = 32.0
+
+[node name="Main" type="TabContainer" parent="Menu/V"]
+margin_top = 36.0
+margin_right = 1268.0
+margin_bottom = 674.0
+size_flags_vertical = 3
+custom_styles/panel = SubResource( 3 )
+tab_align = 0
+
+[node name="Songs" type="MarginContainer" parent="Menu/V/Main"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_top = 30.0
+
+[node name="Split" type="HSplitContainer" parent="Menu/V/Main/Songs"]
+margin_right = 1268.0
+margin_bottom = 608.0
+custom_constants/autohide = 0
+split_offset = 300
+
+[node name="Map" type="ScrollContainer" parent="Menu/V/Main/Songs/Split"]
+margin_right = 300.0
+margin_bottom = 608.0
+
+[node name="V" type="VBoxContainer" parent="Menu/V/Main/Songs/Split/Map"]
+margin_right = 300.0
+margin_bottom = 608.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="DevMenuTag" type="Label" parent="Menu/V/Main/Songs/Split/Map/V"]
+margin_right = 300.0
+margin_bottom = 20.0
+theme_type_variation = "DevMenuMonoLabel"
+text = "DEBUG MENU"
+
+[node name="Run" type="Button" parent="Menu/V/Main/Songs/Split/Map/V"]
+margin_top = 24.0
+margin_right = 300.0
+margin_bottom = 72.0
+rect_min_size = Vector2( 0, 48 )
+hint_tooltip = "(Spacebar, Xbox A)"
+size_flags_stretch_ratio = 3.0
+theme = ExtResource( 1 )
+toggle_mode = true
+action_mode = 0
+text = "Start!"
+script = ExtResource( 29 )
+
+[node name="Actions" type="MenuButton" parent="Menu/V/Main/Songs/Split/Map/V"]
+margin_top = 76.0
+margin_right = 300.0
+margin_bottom = 100.0
+rect_min_size = Vector2( 32, 24 )
+focus_mode = 2
+theme = ExtResource( 1 )
+custom_colors/font_color_disabled = Color( 0, 0, 0, 1 )
+custom_colors/font_color_focus = Color( 0, 0, 0, 1 )
+custom_colors/font_color = Color( 0, 0, 0, 1 )
+custom_colors/font_color_hover = Color( 0, 0, 0, 1 )
+custom_colors/font_color_pressed = Color( 0, 0, 0, 1 )
+text = "Actions"
+icon = ExtResource( 34 )
+flat = false
+expand_icon = true
+script = ExtResource( 35 )
+
+[node name="Favorite" type="Button" parent="Menu/V/Main/Songs/Split/Map/V"]
+margin_top = 104.0
+margin_right = 300.0
+margin_bottom = 128.0
+rect_min_size = Vector2( 0, 24 )
+theme = ExtResource( 1 )
+toggle_mode = true
+action_mode = 0
+text = "Favorite"
+script = ExtResource( 30 )
+
+[node name="PreviewMusic" type="Button" parent="Menu/V/Main/Songs/Split/Map/V"]
+margin_top = 132.0
+margin_right = 300.0
+margin_bottom = 156.0
+rect_min_size = Vector2( 0, 24 )
+theme = ExtResource( 1 )
+action_mode = 0
+text = "Play Music"
+script = ExtResource( 32 )
+
+[node name="Song" type="AudioStreamPlayer" parent="Menu/V/Main/Songs/Split/Map/V/PreviewMusic"]
+pause_mode = 2
+bus = "Music"
+script = ExtResource( 33 )
+
+[node name="MenuSong" type="AudioStreamPlayer" parent="Menu/V/Main/Songs/Split/Map/V/PreviewMusic"]
+pause_mode = 2
+stream = ExtResource( 28 )
+volume_db = -10.0
+bus = "Music"
+
+[node name="DevMenuTag2" type="Label" parent="Menu/V/Main/Songs/Split/Map/V"]
+margin_top = 160.0
+margin_right = 300.0
+margin_bottom = 180.0
+theme_type_variation = "DevMenuMonoLabel"
+text = "DEBUG MENU"
+
+[node name="List" type="ScrollContainer" parent="Menu/V/Main/Songs/Split"]
+margin_left = 312.0
+margin_right = 1268.0
+margin_bottom = 608.0
+
+[node name="VBoxContainer" type="VBoxContainer" parent="Menu/V/Main/Songs/Split/List"]
+margin_right = 956.0
+margin_bottom = 608.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="Settings" type="ScrollContainer" parent="Menu/V/Main"]
+visible = false
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_top = 30.0
+
+[node name="L" parent="Menu/V/Main/Settings" instance=ExtResource( 27 )]
+anchor_right = 0.0
+margin_right = 1268.0
+margin_bottom = 915.0
+
+[node name="Credits" type="ScrollContainer" parent="Menu/V/Main"]
+visible = false
+margin_right = 12.0
+margin_bottom = 12.0
+
+[node name="L" parent="Menu/V/Main/Credits" instance=ExtResource( 26 )]
+margin_right = 720.0
+margin_bottom = 1521.0
+
+[node name="WarningBar" type="ColorRect" parent="Menu/V"]
+margin_top = 678.0
+margin_right = 1268.0
+margin_bottom = 708.0
+rect_min_size = Vector2( 0, 30 )
+size_flags_vertical = 0
+color = Color( 0.278431, 0.490196, 0.580392, 1 )
+script = ExtResource( 5 )
+is_devmenu = true
+
+[node name="L" type="Label" parent="Menu/V/WarningBar"]
+anchor_bottom = 1.0
+margin_right = 201.0
+custom_colors/font_color = Color( 0, 0, 0, 1 )
+custom_colors/font_color_shadow = Color( 0, 0, 0, 0 )
+custom_fonts/font = SubResource( 2 )
+text = "This is a warning bar message"
+valign = 1
+
+[node name="L2" type="Label" parent="Menu/V/WarningBar"]
+anchor_bottom = 1.0
+margin_right = 201.0
+custom_colors/font_color = Color( 0, 0, 0, 1 )
+custom_colors/font_color_shadow = Color( 0, 0, 0, 0 )
+custom_fonts/font = SubResource( 2 )
+text = "This is a warning bar message"
+valign = 1
+
+[node name="Button" type="Button" parent="Menu/V/WarningBar"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+flat = true
+
+[node name="BlackFade" type="ColorRect" parent="."]
+visible = false
+anchor_right = 1.0
+anchor_bottom = 1.0
+color = Color( 0, 0, 0, 0 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
diff --git a/scenes/errors/DeleteSettingsFile.gd b/scenes/errors/DeleteSettingsFile.gd
index 688b58ef..9d5e29a8 100644
--- a/scenes/errors/DeleteSettingsFile.gd
+++ b/scenes/errors/DeleteSettingsFile.gd
@@ -34,7 +34,7 @@ func confirm(v:int):
#get_node("../BlackFade").target = true
#yield(get_node("../BlackFade"),"done_fading")
Engine.target_fps = 0
- get_tree().change_scene("res://scenes/init.tscn")
+ get_tree().change_scene("res://scenes/init3d.tscn")
return
else:
Globals.confirm_prompt.s_back.play()
diff --git a/scenes/init3d.tscn b/scenes/init3d.tscn
new file mode 100644
index 00000000..699aa5f4
--- /dev/null
+++ b/scenes/init3d.tscn
@@ -0,0 +1,326 @@
+[gd_scene load_steps=37 format=2]
+
+[ext_resource path="res://assets/images/branding/logo.png" type="Texture" id=1]
+[ext_resource path="res://assets/sfx/music/init3d/drums.ogg" type="AudioStream" id=2]
+[ext_resource path="res://assets/images/menu3d/bgtile_b.png" type="Texture" id=3]
+[ext_resource path="res://assets/sfx/music/init3d/piano.ogg" type="AudioStream" id=4]
+[ext_resource path="res://assets/images/cursors/circle.png" type="Texture" id=5]
+[ext_resource path="res://assets/sfx/music/init3d/phaser.ogg" type="AudioStream" id=6]
+[ext_resource path="res://assets/sfx/music/init3d/strings.ogg" type="AudioStream" id=7]
+[ext_resource path="res://scripts/ui/menu3d/GameInit.gd" type="Script" id=8]
+[ext_resource path="res://scripts/ui/menu3d/Controls.gd" type="Script" id=9]
+[ext_resource path="res://assets/font/debug.tres" type="DynamicFont" id=10]
+[ext_resource path="res://assets/font/Lato/Lato-Regular.ttf" type="DynamicFontData" id=11]
+[ext_resource path="res://scripts/ui/menu3d/init3d.gd" type="Script" id=12]
+[ext_resource path="res://scripts/ui/menu3d/Music.gd" type="Script" id=13]
+[ext_resource path="res://scripts/ui/menu3d/PointerTrail.gd" type="Script" id=14]
+[ext_resource path="res://assets/images/branding/icon.png" type="Texture" id=15]
+[ext_resource path="res://assets/images/branding/icon_glow.png" type="Texture" id=16]
+
+[sub_resource type="Environment" id=1]
+background_mode = 1
+background_color = Color( 0.0313726, 0.00784314, 0.0588235, 1 )
+
+[sub_resource type="Shader" id=2]
+code = "shader_type spatial;
+
+uniform sampler2D base_map: hint_albedo;
+uniform vec4 color: hint_color = vec4(1.0);
+uniform float uv_scale = 1.0;
+
+void fragment() {
+ vec2 cUV = (UV * 2.0) - vec2(1.0, 1.0);
+ vec4 m = color * texture(base_map, (UV) * uv_scale);
+
+ ALPHA = m.a * clamp(1.0 - length(cUV), 0.0, 1.0);
+ ALBEDO = m.rgb;
+}"
+
+[sub_resource type="ShaderMaterial" id=7]
+shader = SubResource( 2 )
+shader_param/color = Color( 0.109804, 0.109804, 0.109804, 1 )
+shader_param/uv_scale = 8.0
+shader_param/base_map = ExtResource( 3 )
+
+[sub_resource type="QuadMesh" id=19]
+material = SubResource( 7 )
+size = Vector2( 8, 8 )
+
+[sub_resource type="Shader" id=8]
+code = "shader_type spatial;
+
+uniform sampler2D base_map: hint_albedo;
+uniform vec4 color: hint_color = vec4(1.0);
+uniform float uv_scale = 1.0;
+
+void fragment() {
+ vec2 cUV = (UV * 2.0) - vec2(1.0, 1.0);
+ float bv = mod(TIME - (UV.y * 250.0), 3.0);
+ float v = clamp(clamp(bv, 0.0, 1.0) - clamp(bv - 1.0, 0.0, 1.0) - 0.8, 0.0, 1.0);
+
+ ALPHA = color.a * v * clamp(1.0 - length(cUV), 0.0, 1.0);
+ ALBEDO = color.rgb;
+}"
+
+[sub_resource type="ShaderMaterial" id=9]
+shader = SubResource( 8 )
+shader_param/color = Color( 1, 1, 1, 0.113725 )
+shader_param/uv_scale = 8.0
+shader_param/base_map = ExtResource( 3 )
+
+[sub_resource type="QuadMesh" id=4]
+material = SubResource( 9 )
+size = Vector2( 8, 8 )
+
+[sub_resource type="BoxShape" id=31]
+extents = Vector3( 4.2, 4, 1.25 )
+
+[sub_resource type="SpatialMaterial" id=25]
+flags_unshaded = true
+albedo_color = Color( 1, 0, 0, 1 )
+
+[sub_resource type="QuadMesh" id=26]
+material = SubResource( 25 )
+size = Vector2( 0.1, 0.1 )
+
+[sub_resource type="SpatialMaterial" id=29]
+flags_unshaded = true
+albedo_color = Color( 1, 1, 0, 1 )
+
+[sub_resource type="QuadMesh" id=30]
+material = SubResource( 29 )
+size = Vector2( 0.1, 0.1 )
+
+[sub_resource type="SpatialMaterial" id=27]
+
+[sub_resource type="QuadMesh" id=28]
+material = SubResource( 27 )
+size = Vector2( 2, 2 )
+
+[sub_resource type="SpatialMaterial" id=6]
+flags_transparent = true
+flags_unshaded = true
+vertex_color_use_as_albedo = true
+albedo_texture = ExtResource( 5 )
+
+[sub_resource type="QuadMesh" id=14]
+material = SubResource( 6 )
+size = Vector2( 0.273, 0.273 )
+
+[sub_resource type="QuadMesh" id=34]
+size = Vector2( 0.273, 0.273 )
+
+[sub_resource type="SpatialMaterial" id=33]
+resource_local_to_scene = true
+render_priority = 1
+flags_transparent = true
+flags_unshaded = true
+flags_do_not_receive_shadows = true
+flags_disable_ambient_light = true
+params_depth_draw_mode = 2
+albedo_texture = ExtResource( 5 )
+
+[sub_resource type="DynamicFont" id=36]
+size = 64
+use_filter = true
+font_data = ExtResource( 11 )
+
+[sub_resource type="DynamicFont" id=35]
+size = 36
+use_filter = true
+font_data = ExtResource( 11 )
+
+[node name="Onboarding" type="Spatial"]
+script = ExtResource( 12 )
+
+[node name="BlackFade" type="ColorRect" parent="."]
+anchor_right = 1.0
+anchor_bottom = 1.0
+color = Color( 0, 0, 0, 1 )
+
+[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
+environment = SubResource( 1 )
+
+[node name="Env" type="Spatial" parent="."]
+
+[node name="Background" type="Area" parent="Env"]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -4 )
+
+[node name="BackgroundTile" type="MeshInstance" parent="Env/Background"]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.01 )
+mesh = SubResource( 19 )
+skeleton = NodePath("../../..")
+
+[node name="BackgroundLines" type="MeshInstance" parent="Env/Background"]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.005 )
+mesh = SubResource( 4 )
+skeleton = NodePath("../../..")
+
+[node name="CollisionShape" type="CollisionShape" parent="Env/Background"]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -1.25 )
+shape = SubResource( 31 )
+
+[node name="DirectionalLight" type="DirectionalLight" parent="Env"]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 2.5 )
+light_color = Color( 0.941176, 0.858824, 1, 1 )
+
+[node name="RightWall" type="Area" parent="Env"]
+transform = Transform( 0.866025, 0, -0.5, 0, 1, 0, 0.5, 0, 0.866025, 4, 0, -4 )
+
+[node name="CollisionShape" type="CollisionShape" parent="Env/RightWall"]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 0, -1.25 )
+shape = SubResource( 31 )
+
+[node name="LeftWall" type="Area" parent="Env"]
+transform = Transform( 0.866025, 0, 0.5, 0, 1, 0, -0.5, 0, 0.866025, -4, 0, -4 )
+
+[node name="CollisionShape" type="CollisionShape" parent="Env/LeftWall"]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -4, 0, -1.25 )
+shape = SubResource( 31 )
+
+[node name="Music" type="Node" parent="."]
+script = ExtResource( 13 )
+
+[node name="Strings" type="AudioStreamPlayer" parent="Music"]
+stream = ExtResource( 7 )
+volume_db = -80.0
+bus = "Music"
+
+[node name="Drums" type="AudioStreamPlayer" parent="Music"]
+stream = ExtResource( 2 )
+volume_db = -80.0
+bus = "Music"
+
+[node name="Piano" type="AudioStreamPlayer" parent="Music"]
+stream = ExtResource( 4 )
+volume_db = -80.0
+bus = "Music"
+
+[node name="Phaser" type="AudioStreamPlayer" parent="Music"]
+stream = ExtResource( 6 )
+volume_db = -80.0
+bus = "Music"
+
+[node name="Controls" type="Spatial" parent="."]
+script = ExtResource( 9 )
+
+[node name="Camera" type="Camera" parent="Controls"]
+current = true
+fov = 55.0
+far = 500.0
+
+[node name="RayCast" type="RayCast" parent="Controls/Camera"]
+cast_to = Vector3( 0, 0, -100 )
+collide_with_areas = true
+collide_with_bodies = false
+
+[node name="p" type="MeshInstance" parent="Controls/Camera"]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -2.13351 )
+visible = false
+mesh = SubResource( 26 )
+skeleton = NodePath("../../..")
+
+[node name="p2" type="MeshInstance" parent="Controls/Camera"]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -2.135 )
+visible = false
+mesh = SubResource( 30 )
+skeleton = NodePath("../../..")
+
+[node name="MeshInstance4" type="MeshInstance" parent="Controls/Camera"]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -2.16137 )
+visible = false
+mesh = SubResource( 28 )
+skeleton = NodePath("../../..")
+
+[node name="Label" type="Label" parent="Controls"]
+visible = false
+margin_left = 25.0
+margin_top = 90.0
+margin_right = 65.0
+margin_bottom = 104.0
+custom_fonts/font = ExtResource( 10 )
+text = "AUGH"
+
+[node name="PointerHolder" type="Spatial" parent="Controls"]
+visible = false
+
+[node name="Pointer" type="MeshInstance" parent="Controls/PointerHolder"]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -3.99863 )
+visible = false
+mesh = SubResource( 14 )
+skeleton = NodePath("../../..")
+
+[node name="PointerTrail" type="MeshInstance" parent="Controls/PointerHolder"]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -1.09278e-07, 1.09278e-07, -4 )
+visible = false
+cast_shadow = 0
+generate_lightmap = false
+mesh = SubResource( 34 )
+skeleton = NodePath(".")
+material/0 = SubResource( 33 )
+script = ExtResource( 14 )
+
+[node name="GameInit" type="Spatial" parent="."]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -3 )
+script = ExtResource( 8 )
+
+[node name="Logo" type="Spatial" parent="GameInit"]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.2, 0 )
+
+[node name="IconOnly" type="Sprite3D" parent="GameInit/Logo"]
+opacity = 0.0
+pixel_size = 0.002
+texture = ExtResource( 1 )
+
+[node name="S0" type="Sprite3D" parent="GameInit/Logo"]
+opacity = 0.0
+pixel_size = 0.002
+texture = ExtResource( 1 )
+
+[node name="S1" type="Sprite3D" parent="GameInit/Logo"]
+opacity = 0.0
+pixel_size = 0.002
+texture = ExtResource( 1 )
+
+[node name="S2" type="Sprite3D" parent="GameInit/Logo"]
+opacity = 0.0
+pixel_size = 0.002
+texture = ExtResource( 1 )
+
+[node name="S3" type="Sprite3D" parent="GameInit/Logo"]
+opacity = 0.0
+pixel_size = 0.002
+texture = ExtResource( 1 )
+
+[node name="S4" type="Sprite3D" parent="GameInit/Logo"]
+opacity = 0.0
+pixel_size = 0.002
+texture = ExtResource( 1 )
+
+[node name="LogoSpinner" type="Spatial" parent="GameInit"]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.2, 0 )
+
+[node name="Glow" type="Sprite3D" parent="GameInit/LogoSpinner"]
+opacity = 0.0
+pixel_size = 0.0005
+texture = ExtResource( 16 )
+
+[node name="NoGlow" type="Sprite3D" parent="GameInit/LogoSpinner"]
+pixel_size = 0.0005
+texture = ExtResource( 15 )
+
+[node name="Label" type="Label3D" parent="GameInit"]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.1, 0 )
+pixel_size = 0.003
+text = "Loading"
+font = SubResource( 36 )
+vertical_alignment = 0
+
+[node name="Label2" type="Label3D" parent="GameInit"]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.35, 0 )
+pixel_size = 0.003
+text = "Waiting for engine"
+font = SubResource( 35 )
+vertical_alignment = 0
+
+[node name="Position3D" type="Position3D" parent="GameInit"]
diff --git a/scenes/song.tscn b/scenes/song.tscn
index ade02d72..611463f6 100644
--- a/scenes/song.tscn
+++ b/scenes/song.tscn
@@ -4,7 +4,7 @@
[ext_resource path="res://scripts/game/NoteManager.gd" type="Script" id=2]
[ext_resource path="res://scripts/game/Game.gd" type="Script" id=3]
[ext_resource path="res://scripts/content/game/Note.gd" type="Script" id=4]
-[ext_resource path="res://prefabs/game/HUD.tscn" type="PackedScene" id=5]
+[ext_resource path="res://prefabs/game/HUD2.tscn" type="PackedScene" id=5]
[ext_resource path="res://assets/images/cursors/circle.png" type="Texture" id=6]
[ext_resource path="res://assets/images/grid_inner.png" type="Texture" id=7]
[ext_resource path="res://assets/images/spawn_effect.png" type="Texture" id=8]
diff --git a/scripts/Intro.gd b/scripts/Intro.gd
index cd59921a..c967b8fd 100644
--- a/scripts/Intro.gd
+++ b/scripts/Intro.gd
@@ -33,7 +33,7 @@ func _ready():
$ColorRect.modulate.a = 1
# OS.window_fullscreen = true
Input.mouse_mode = Input.MOUSE_MODE_HIDDEN
- yield(get_tree().create_timer(4),"timeout")
+# yield(get_tree().create_timer(4),"timeout")
running = true
$Avatar/Animations.play("Float")
$Avatar/Animations.playback_speed = 1
@@ -49,13 +49,13 @@ func _ready():
yield(get_tree().create_timer(14),"timeout")
fading = true
yield(get_tree().create_timer(4),"timeout")
- get_tree().change_scene("res://scenes/init.tscn")
+ get_tree().change_scene("res://scenes/init3d.tscn")
func _input(event):
if Input.is_action_just_pressed("pause") and can_skip:
- get_tree().change_scene("res://scenes/init.tscn")
+ get_tree().change_scene("res://scenes/init3d.tscn")
elif OS.has_feature("Android") and can_skip:
- get_tree().change_scene("res://scenes/init.tscn")
+ get_tree().change_scene("res://scenes/init3d.tscn")
func _process(delta):
$Sprite3D.rotation_degrees.z += 16 * delta
diff --git a/scripts/Online.gd b/scripts/Online.gd
index ad1bd5c7..06fa3c46 100644
--- a/scripts/Online.gd
+++ b/scripts/Online.gd
@@ -1,6 +1,16 @@
extends Node
# https://cdn.rhythia.net/index.json
+enum STATUS {
+ OK = 0,
+ NOT_INITIALIZED,
+ CONNECTION_TEST_FAIL,
+ API_HTTP_FAIL,
+ CONFIG_ERROR,
+ INTERNAL_ERROR,
+ ANTI_TAMPER,
+}
+var netmaps_status:int = STATUS.NOT_INITIALIZED
var mapdb_api:String = ""
@@ -38,19 +48,28 @@ func _on_ctest_request_completed(result:int,response_code:int,headers:PoolString
emit_signal("_connection_test",true)
else:
emit_signal("_connection_test",false)
+ netmaps_status = STATUS.CONNECTION_TEST_FAIL
func test_connection():
var res = ctest_hr.request(ProjectSettings.get_setting("application/networking/test_url"))
- if res != OK: emit_signal("_connection_test",false)
+ if res != OK:
+ emit_signal("_connection_test",false)
+ netmaps_status = STATUS.CONNECTION_TEST_FAIL
func _mapdl_handler(id:String,map:Song):
print("[MapDB Download] Starting download of map %s" % map.id)
if !ProjectSettings.get_setting("application/networking/enabled"):
- mapdl_error(id,"Networking is disabled",map); return
+ mapdl_error(id,"Networking is disabled",map)
+ netmaps_status = STATUS.CONFIG_ERROR
+ return
if mapdb_api == "":
- mapdl_error(id,"MapDB API Invalid",map); return
+ mapdl_error(id,"MapDB API Invalid",map)
+ netmaps_status = STATUS.CONFIG_ERROR
+ return
if !Globals.is_valid_url(mapdb_api):
- mapdl_error(id,"MapDB API Invalid",map); return
+ mapdl_error(id,"MapDB API Invalid",map)
+ netmaps_status = STATUS.CONFIG_ERROR
+ return
call_deferred("test_connection")
if !yield(self,"_connection_test"):
@@ -199,24 +218,31 @@ func load_db_maps():
if netmaps_res.result == HTTPRequest.RESULT_CANT_RESOLVE:
show_db_error("Map database download failed.\nError: Can't Resolve","Map Database Error")
+ netmaps_status = STATUS.API_HTTP_FAIL
yield(self,"error_done")
elif netmaps_res.result == HTTPRequest.RESULT_CANT_CONNECT:
show_db_error("Map database download failed.\nError: Can't Connect","Map Database Error")
+ netmaps_status = STATUS.API_HTTP_FAIL
yield(self,"error_done")
elif netmaps_res.result == HTTPRequest.RESULT_CONNECTION_ERROR:
show_db_error("Map database download failed.\nError: Connection Error","Map Database Error")
+ netmaps_status = STATUS.API_HTTP_FAIL
yield(self,"error_done")
elif netmaps_res.result == HTTPRequest.RESULT_SSL_HANDSHAKE_ERROR:
show_db_error("Map database download failed.\nError: SSL Handshake Error","Map Database Error")
+ netmaps_status = STATUS.API_HTTP_FAIL
yield(self,"error_done")
elif netmaps_res.result == HTTPRequest.RESULT_TIMEOUT:
show_db_error("Map database download failed.\nError: Timeout","Map Database Error")
+ netmaps_status = STATUS.API_HTTP_FAIL
yield(self,"error_done")
elif netmaps_res.result == HTTPRequest.RESULT_REDIRECT_LIMIT_REACHED:
show_db_error("Map database download failed.\nError: Redirect Limit Reached","Map Database Error")
+ netmaps_status = STATUS.API_HTTP_FAIL
yield(self,"error_done")
elif netmaps_res.result == HTTPRequest.RESULT_SUCCESS:
+ netmaps_status = STATUS.OK
if netmaps_res.response_code == 200:
print("Cache miss!")
var res = file.open(Globals.p("user://.mapdb_cache.json"),File.WRITE)
@@ -285,23 +311,31 @@ func load_db_maps():
file.close()
else:
show_db_error("Map database download failed.\nError code: HTTP-%s" % netmaps_res.response_code,"Map Database Error")
+ netmaps_status = STATUS.API_HTTP_FAIL
yield(self,"error_done")
else: # Unknown error
show_db_error("Map database download failed.\nError code: HTTP-%s" % netmaps_res.response_code,"Map Database Error")
+ netmaps_status = STATUS.API_HTTP_FAIL
yield(self,"error_done")
emit_signal("db_maps_done")
+
+
var latest_version_data
signal latest_version
var version_hr:HTTPRequest = HTTPRequest.new()
func check_latest_version():
- if !(OS.has_feature("Windows") or OS.has_feature("X11")) or !ProjectSettings.get_setting("application/networking/enabled"):
+ if (
+ !(OS.has_feature("Windows") or OS.has_feature("X11"))
+ or !ProjectSettings.get_setting("application/networking/enabled")
+ ):
emit_signal("latest_version",ProjectSettings.get_setting("application/config/version"))
return
var github_url = "https://api.github.com/repos/%s/releases/latest"
version_hr.request(github_url % ProjectSettings.get_setting("application/networking/github_repo"))
+
func _on_version_request_completed(result:int,response_code:int,headers:PoolStringArray,body:PoolByteArray):
if result != HTTPRequest.RESULT_SUCCESS or response_code != 200:
emit_signal("latest_version",ProjectSettings.get_setting("application/config/version"))
@@ -310,7 +344,9 @@ func _on_version_request_completed(result:int,response_code:int,headers:PoolStri
var json = JSON.parse(string)
var data = json.result
latest_version_data = data
+
emit_signal("latest_version",data.tag_name)
+
signal update_finished
signal _update_req
var update_hr:HTTPRequest = HTTPRequest.new()
@@ -355,7 +391,7 @@ func _on_update_request_completed(result:int,response_code:int,headers:PoolStrin
func _ready():
add_child(netmaps_hr)
netmaps_hr.use_threads = true
- netmaps_hr.timeout = 80
+ netmaps_hr.timeout = 30#80
netmaps_hr.connect("request_completed",self,"_on_netmaps_request_completed")
add_child(ctest_hr)
diff --git a/scripts/Rhythia.gd b/scripts/Rhythia.gd
index c8f832d0..d17e15c0 100644
--- a/scripts/Rhythia.gd
+++ b/scripts/Rhythia.gd
@@ -121,6 +121,9 @@ var song_end_accuracy_str:String
var song_end_time_str:String
var song_end_length:float
var song_end_combo:int
+var song_end_fail_time_str:String
+var song_end_fail_position:float
+var song_end_failed:bool
# Replay data
var replay:Replay
var replay_path:String = ""
@@ -141,7 +144,8 @@ var first_init_done = false # Don't reload mods as that can cause problems
var loaded_world = null # Holds the bg world for transit between songload and song player
var was_map_screen_centered:bool = true
var menu_target:String = ProjectSettings.get_setting("application/config/default_menu_target")
-var is_init:bool = true # Used to check if Onboarding is being used for game startup
+var is_init:bool = true # Should we start the initialization process?
+var init_running:bool = false # Is the initialization process currently running?
# Song list position/search persistence
var was_auto_play_switch:bool = true
@@ -351,12 +355,21 @@ func _process(delta):
# Global hotkeys
if Input.is_action_just_pressed("fullscreen"):
OS.window_fullscreen = not OS.window_fullscreen
+
+ if OS.has_feature("debug"):
+ if init_running and Input.is_action_pressed("debug_devmenu"):
+ menu_target = "res://scenes/devmenu.tscn"
+ elif Input.is_action_just_pressed("debug_devmenu"):
+ get_tree().change_scene("res://scenes/devmenu.tscn")
# Debug
var desync_alerts:bool = false
var disable_desync:bool = false
func _console(cmd:String,args:String):
match cmd:
+ "devmenu":
+ menu_target = "res://scenes/devmenu.tscn"
+ get_tree().change_scene("res://scenes/devmenu.tscn")
"queue":
var ids = args.split(" ",false)
if ids.size() == 0:
@@ -423,7 +436,7 @@ func update_rpc_song(): # Discord RPC
if mod_flashlight: mods.append("Flashlight")
if mod_nearsighted: mods.append("Nearsight")
if mod_hardrock: mods.append("Hard Rock")
- if replay.autoplayer: mods.append("Auto")
+ if replay and replay.autoplayer: mods.append("Auto")
if mods.size() == 0: txt = "No modifiers"
else:
@@ -668,6 +681,7 @@ var visual_approach_follow:bool = false
var billboard_score:bool = false
var score_popup:bool = false
var mirror_buttons:bool = false
+var show_full_combo_indicators:bool = true
# Settings - HUD Colors
var panel_bg:Color = Color("#9b000000") #9bcecece
@@ -698,6 +712,11 @@ var timer_bg_done:Color = Color("#af008f00") #af008f00
var timer_fg_canskip:Color = Color("#b3ffff") #760070
var timer_bg_canskip:Color = Color("#b0638f8f") #b02b172a
+var energy_fg:Color = Color("#3aa515")
+var energy_bg:Color = Color("#af942121")
+var energy_failed:Color = Color(0.3,0.3,0.3,0.5)
+var energy_failed_flash:Color = Color(1.0,0.25,0.25)
+
var miss_flash_color:Color = Color("#ff0000") #ff0000
var pause_used_color:Color = Color("#ff66ff") #2600c2
@@ -822,7 +841,7 @@ func generate_pb_str(for_pb:bool=false):
Globals.HP_OLD: pts.append("hp_old")
Globals.HP_SOUNDSPACE: pass # prevents wiping of old pbs
pts.append("hitw:%s" % String(floor(hitwindow_ms)))
- var hb = note_hitbox_size
+# var hb = note_hitbox_size
pts.append("hbox:%.02f" % note_hitbox_size)
pts.append("ar:%d" % sign(approach_rate))
if !for_pb and start_offset != 0: pts.append("so:%f" % start_offset)
@@ -1259,6 +1278,8 @@ func load_saved_settings(saveFile:String = Globals.p("user://settings.json")):
hit_pitch_max = data.hit_pitch_max
if data.has("half_ghost"):
half_ghost = data.half_ghost
+ if data.has("show_full_combo_indicators"):
+ show_full_combo_indicators = data.show_full_combo_indicators
if data.has("language"):
language = data.language
@@ -1291,6 +1312,10 @@ func load_saved_settings(saveFile:String = Globals.p("user://settings.json")):
lcol(data,"timer_bg_done")
lcol(data,"timer_fg_canskip")
lcol(data,"timer_bg_canskip")
+ lcol(data,"energy_fg")
+ lcol(data,"energy_bg")
+ lcol(data,"energy_failed")
+ lcol(data,"energy_failed_flash")
lcol(data,"miss_flash_color")
lcol(data,"pause_used_color")
lcol(data,"miss_text_color")
@@ -1634,6 +1659,7 @@ func save_settings(saveFile:String = Globals.p("user://settings.json")):
ignore_controller_detection = ignore_controller_detection,
expand_hud_onhr = expand_hud_onhr,
last_search_incl_online = last_search_incl_online,
+ show_full_combo_indicators = show_full_combo_indicators,
master_volume = ser_float(clamp(AudioServer.get_bus_volume_db(AudioServer.get_bus_index("Master")),-80,1000000)),
music_volume = ser_float(clamp(AudioServer.get_bus_volume_db(AudioServer.get_bus_index("Music")),-80,1000000)),
@@ -1939,6 +1965,13 @@ func register_effects():
registry_effect.add_item(NoteEffect.new(
"ssp_miss_w", "Miss* (no color)", "res://assets/notefx/miss/miss.tscn", "Chedski"
))
+
+ registry_effect.add_item(NoteEffect.new(
+ "ssp_explosion", "Explosion", "res://assets/notefx/explosion/explosion.tscn", "Chedski"
+ ))
+ registry_effect.add_item(NoteEffect.new(
+ "ssp_explosion_t", "Explosion (transparent)", "res://assets/notefx/explosion/explosion.tscn", "Chedski"
+ ))
@@ -2016,6 +2049,8 @@ var single_map_mode_audio_path:String
# Initialization
func do_init(_ud=null):
+ init_running = true
+ is_init = false
installed_packs = []
yield(get_tree().create_timer(0.05),"timeout") # haha thread safety go brrrr
var lp:bool = false # load pause
@@ -2074,7 +2109,11 @@ func do_init(_ud=null):
single_map_mode_audio_path = Globals.cmdline.audio
# Check for updates
- if (OS.has_feature("Windows") or OS.has_feature("X11")) and !OS.has_feature("editor"):
+ if (
+ (OS.has_feature("Windows") or OS.has_feature("X11"))
+ and !OS.has_feature("editor")
+ and !ProjectSettings.get_setting("application/config/version").begins_with("dev-")
+ ):
emit_signal("init_stage_reached","Check for updates")
emit_signal("init_stage_num",-1)
yield(get_tree(),"idle_frame")
@@ -2261,9 +2300,9 @@ func do_init(_ud=null):
var smaps:Array = []
emit_signal("init_stage_reached","Register content 1/4\nImport Rhythia maps\nLocating files")
yield(get_tree(),"idle_frame")
- var sd:Array = []
+# var sd:Array = []
dir.change_dir(user_map_dir)
- var li = 0
+# var li = 0
var map_search_folders = [user_map_dir]
err = file.open(Globals.p("user://map_folders.txt"),File.READ)
@@ -2520,5 +2559,6 @@ func do_init(_ud=null):
Globals.confirm_prompt.s_next.play()
Globals.confirm_prompt.close()
yield(Globals.confirm_prompt,"done_closing")
- is_init = false
+ init_running = false
+ print("Init done!")
emit_signal("init_stage_reached","Waiting for menu",true)
diff --git a/scripts/content/Registry.gd b/scripts/content/Registry.gd
index d556a523..73ceec2f 100644
--- a/scripts/content/Registry.gd
+++ b/scripts/content/Registry.gd
@@ -152,8 +152,11 @@ func load_registry_file(path:String,regtype:int,regDisplayName:String=""):
if regDisplayName == "": regDisplayName = path.get_base_dir().get_file()
print(path)
var file:File = File.new()
- file.open(path,File.READ)
- if regtype == Globals.REGISTRY_MAP:
+ var status = file.open(path,File.READ)
+ if status != OK:
+ print("Unable to open registry file %s, skipping" % path)
+ yield(Globals.get_tree(),"idle_frame") # We have to sleep here to ensure it doesn't get stuck
+ elif regtype == Globals.REGISTRY_MAP:
var home_path:String = path.get_base_dir() + "/"
# var home_path:String = "res://test_assets/"
var rawRegData:String = file.get_as_text()
diff --git a/scripts/content/game/Song.gd b/scripts/content/game/Song.gd
index 8ec9e148..abdc4ecc 100644
--- a/scripts/content/game/Song.gd
+++ b/scripts/content/game/Song.gd
@@ -123,8 +123,8 @@ const db_builtin_difficulty_names = [
func load_from_db_data(data:Dictionary={
"id":"INVALID_id_that_doesnt_exist",
- "download":"http://chedski.test/ssp/mapdb/api/download/INVALID_id_that_doesnt_exist",
- "audio":"http://chedski.test/ssp/mapdb/api/audio/INVALID_id_that_doesnt_exist",
+ "download":"http://nonexistent.invalid",
+ "audio":"http://nonexistent.invalid",
# "id":"ss_archive_waterflame_-_geometrical_dominator",
# "download":"http://chedski.test/ssp/mapdb/api/download/ss_archive_waterflame_-_geometrical_dominator",
# "audio":"http://chedski.test/ssp/mapdb/api/audio/ss_archive_waterflame_-_geometrical_dominator",
@@ -216,7 +216,7 @@ func load_pbs():
var amt:int = file.get_64() # number of bests stored
- for i in range(amt):
+ for _i in range(amt):
var pb:Dictionary = {}
var s:String = file.get_line()
# if sv == 1: s = s.replace("1.27","1.14") # handle the default hitbox change
@@ -260,7 +260,7 @@ func save_pbs():
else: file.store_32(floor(min(pb.length,pb.position)))
file.store_32(floor(pb.length))
- file.store_16(pb.max_combo)
+ file.store_16(pb.max_combo)
file.close()
diff --git a/scripts/game/Game.gd b/scripts/game/Game.gd
index 5754fe8d..baf6aaab 100644
--- a/scripts/game/Game.gd
+++ b/scripts/game/Game.gd
@@ -3,6 +3,7 @@ class_name SongPlayerManager
signal hit
signal miss
+signal failed
var rawMapData:String
var notes:Array
@@ -68,6 +69,17 @@ func end(end_type:int):
Rhythia.replay.store_sig($Spawn.rms,Globals.RS_GIVEUP)
if end_type != Globals.END_PASS:
Rhythia.fail_asp.play()
+ if !Rhythia.song_end_failed:
+ Rhythia.song_end_failed = true
+ var fail_ms = clamp($Spawn.ms,0,last_ms)
+
+ var s = fail_ms / 1000.0
+ var m = floor(s / 60.0)
+ var rs = fmod(s, 60.0)
+
+ Rhythia.song_end_fail_position = fail_ms
+ Rhythia.song_end_time_str = "%d:%02d" % [m,rs]
+
get_tree().paused = true
if total_notes == 0: total_notes = 1
update_hud()
@@ -231,7 +243,8 @@ func hit(col):
emit_signal("hit",col)
hits += 1
total_notes += 1
- if !Rhythia.mod_no_regen: energy = clamp(energy+energy_per_hit,0,max_energy)
+ if !Rhythia.mod_no_regen and not song_has_failed:
+ energy = clamp(energy+energy_per_hit,0,max_energy)
combo += 1
if combo > max_combo: max_combo = combo
@@ -266,12 +279,22 @@ func miss(col):
if combo_level != 1: combo_level -= 1
update_hud()
if energy == 0:
- if Rhythia.mod_nofail:
- if not song_has_failed:
- song_has_failed = true
+ if not song_has_failed:
+ song_has_failed = true
+ emit_signal("failed")
+ if Rhythia.mod_nofail:
Rhythia.fail_asp.play()
- else:
- end(Globals.END_FAIL)
+ var fail_ms = clamp($Spawn.ms,0,last_ms)
+
+ var s = fail_ms / 1000.0
+ var m = floor(s / 60.0)
+ var rs = fmod(s, 60.0)
+
+ Rhythia.song_end_fail_position = fail_ms
+ Rhythia.song_end_time_str = "%d:%02d" % [m,rs]
+ else:
+ end(Globals.END_FAIL)
+ Rhythia.song_end_failed = true
func _ready():
diff --git a/scripts/game/HUD2.gd b/scripts/game/HUD2.gd
new file mode 100644
index 00000000..ef024e9a
--- /dev/null
+++ b/scripts/game/HUD2.gd
@@ -0,0 +1,673 @@
+extends Spatial
+
+
+onready var Game:SongPlayerManager = get_parent()
+onready var Spawn:NoteManager = get_parent().get_node("Spawn")
+
+
+onready var timebar:ProgressBar = get_node("GridVP/Control/Timer/Time")
+onready var timelabel:Label = get_node("GridVP/Control/Timer/Label")
+onready var songnametxt:Label = get_node("GridVP/Control/Timer/SongName")
+onready var songnametxt2:Label = get_node("Info/C/MapName/L")
+onready var mappertxt:Label = get_node("Info/C/Mapper/H/L")
+onready var mappertitle:Label = get_node("Info/C/Mapper/H/T")
+onready var acclabel:Label = get_node("LeftVP/Control/Accuracy")
+onready var accbar:ProgressBar = get_node("LeftVP/Control/AccuracyBar")
+onready var pauselabel:Label = get_node("LeftVP/Control/Pauses")
+onready var noteslabel:Label = get_node("RightVP/Control/Notes")
+onready var misseslabel:Label = get_node("RightVP/Control/Misses")
+onready var scorelabel:Label = get_node("RightVP/Control/Score")
+onready var energybar:ProgressBar = get_node("GridVP/Control/Energy/Energy")
+onready var modicons:HBoxContainer = get_node("GridVP/Control/Energy/Modifiers/Icons/H")
+onready var modtxt:Label = get_node("GridVP/Control/Energy/Modifiers/Text")
+onready var modholder:VBoxContainer = get_node("GridVP/Control/Energy/Modifiers")
+onready var infoholder:HBoxContainer = get_node("Info")
+
+onready var comboring:Control = get_node("LeftVP/Control/Combo")
+onready var combotxt:Label = get_node("LeftVP/Control/Combo/Label")
+onready var truecombo:Label = get_node("ComboVP/Value")
+
+onready var lettergrade:Label = get_node("LeftVP/Control/LetterGrade")
+
+onready var friend:MeshInstance = Spawn.get_node("Friend")
+onready var gridborder:Spatial = get_node("Grid")
+onready var gridvp:Viewport = get_node("GridVP")
+onready var gridmat:SpatialMaterial = get_node("Grid/Outer").get_surface_material(0)
+onready var gridsides:Control = get_node("GridVP/Control/Sides")
+onready var gridcorners:Control = get_node("GridVP/Control/Corners")
+
+onready var cur_pos = $"../Spawn/Cursor/Mesh".global_transform.origin
+onready var pcur_pos = cur_pos
+
+
+
+
+var panel_bg:Color = Rhythia.panel_bg
+var panel_text:Color = Rhythia.panel_text
+
+var unpause_fill_color:Color = Rhythia.unpause_fill_color
+var unpause_empty_color:Color = Rhythia.unpause_empty_color
+var how_to_quit:Color = Rhythia.how_to_quit
+
+var combo_fill_color:Color = Rhythia.combo_fill_color
+var combo_empty_color:Color = Rhythia.combo_empty_color
+
+var acc_fill_color:Color = Rhythia.acc_fill_color
+var acc_empty_color:Color = Rhythia.acc_empty_color
+
+var giveup_text:Color = Rhythia.giveup_text
+var giveup_fill_color:Color = Rhythia.giveup_fill_color
+var giveup_fill_color_end_skip:Color = Rhythia.giveup_fill_color_end_skip
+
+var timer_text:Color = Rhythia.timer_text
+var timer_text_done:Color = Rhythia.timer_text_done
+var timer_text_canskip:Color = Rhythia.timer_text_canskip
+
+var timer_fg:Color = Rhythia.timer_fg
+var timer_bg:Color = Rhythia.timer_bg
+var timer_fg_done:Color = Rhythia.timer_fg_done
+var timer_bg_done:Color = Rhythia.timer_bg_done
+var timer_fg_canskip:Color = Rhythia.timer_fg_canskip
+var timer_bg_canskip:Color = Rhythia.timer_bg_canskip
+
+var energy_fg:Color = Rhythia.energy_fg
+var energy_bg:Color = Rhythia.energy_bg
+var energy_failed:Color = Rhythia.energy_failed
+var energy_failed_flash:Color = Rhythia.energy_failed_flash
+
+var miss_flash_color:Color = Rhythia.miss_flash_color
+var pause_used_color:Color = Rhythia.pause_used_color
+
+var miss_text_color:Color = Rhythia.miss_text_color
+var pause_text_color:Color = Rhythia.pause_text_color
+var score_text_color:Color = Rhythia.score_text_color
+
+var pause_ui_opacity:float = Rhythia.pause_ui_opacity
+
+var grade_ss_saturation:float = Rhythia.grade_ss_saturation
+var grade_ss_value:float = Rhythia.grade_ss_value
+var grade_ss_shine:float = Rhythia.grade_ss_shine
+
+var grade_s_color:Color = Rhythia.grade_s_color
+var grade_s_shine:float = Rhythia.grade_s_shine
+
+var grade_a_color:Color = Rhythia.grade_a_color
+var grade_b_color:Color = Rhythia.grade_b_color
+var grade_c_color:Color = Rhythia.grade_c_color
+var grade_d_color:Color = Rhythia.grade_d_color
+var grade_f_color:Color = Rhythia.grade_f_color
+
+
+
+var last_combo:int = 0
+var is_full_combo:bool = false
+var full_combo_indicator_t:float = 1.0
+
+
+
+var elapsed:float = 0
+var gtimer:float = 0 # global delta timer
+var s_curspd:float = 0
+var s_tcurspd:float = 0
+var calculating:bool = false
+
+
+func set_song_name(name:String=Rhythia.selected_song.name):
+ songnametxt.text = name
+ songnametxt2.text = name
+
+func song_end(end_type:int):
+ if end_type == Globals.END_GIVEUP and Rhythia.record_replays and !Rhythia.replaying:
+ Rhythia.replay.store_sig(Spawn.rms,Globals.RS_GIVEUP)
+ if end_type != Globals.END_PASS:
+ friend.failed = true
+ Rhythia.fail_asp.play()
+ friend.upd()
+
+var combo_ring_target:float = 0
+var combo_ring_value:float = 0
+
+func update_static_values():
+
+ if Game.hits == Game.total_notes: acclabel.text = "100%"
+ elif Game.hits == 0: acclabel.text = "0%"
+ else: acclabel.text = "%.3f%%" % ((Game.hits/Game.total_notes)*100)
+ Rhythia.song_end_accuracy_str = acclabel.text
+ if not Game.total_notes == 0:
+ accbar.value = Game.hits/Game.total_notes
+ noteslabel.text = "%s/%s" % [Globals.comma_sep(Game.hits),Globals.comma_sep(Game.total_notes)]
+ misseslabel.text = "%s" % Globals.comma_sep(Game.misses)
+ energybar.max_value = Game.max_energy
+ energybar.value = Game.energy
+ combotxt.text = String(Game.combo_level) + "x"
+ combo_ring_target = float(Game.lvl_progress) / 10.0
+
+ if Game.combo != last_combo:
+ truecombo.text = String(Game.combo)
+ truecombo.rect_position.y = 100
+ last_combo = Game.combo
+
+ pauselabel.text = Globals.comma_sep(Rhythia.song_end_pause_count)
+
+ for n in get_tree().get_nodes_in_group("pause_text"):
+ paint(
+ n,
+ pause_text_color if (Rhythia.song_end_pause_count == 0)
+ else pause_used_color
+ )
+
+ scorelabel.text = Globals.comma_sep(Game.score)
+
+
+ var grade:String = "--"
+ var gcol:Color = Color(1,0,1)
+ var shine:float = 0
+ var acc = 1
+ if not Game.total_notes == 0:
+ acc = Game.hits/Game.total_notes
+ is_full_combo = (acc == 1)
+ if acc == 1:
+ grade = "SS"
+ gcol = Color.from_hsv(Rhythia.rainbow_t*0.1, grade_ss_saturation, grade_ss_value)
+ shine = grade_ss_shine
+ elif acc >= 0.98:
+ grade = "S"
+ gcol = grade_s_color
+ shine = grade_s_shine
+ elif acc >= 0.95:
+ grade = "A"
+ gcol = grade_a_color
+ elif acc >= 0.90:
+ grade = "B"
+ gcol = grade_b_color
+ elif acc >= 0.85:
+ grade = "C"
+ gcol = grade_c_color
+ elif acc >= 0.80:
+ grade = "D"
+ gcol = grade_d_color
+ else:
+ grade = "F"
+ gcol = grade_f_color
+
+ lettergrade.text = grade
+ if shine != lettergrade.material.get_shader_param("amount"):
+ lettergrade.material.set_shader_param("amount",shine)
+
+ if !Rhythia.rainbow_hud:
+ lettergrade.set("custom_colors/font_color",gcol)
+
+var miss_flash:float = 0
+var hit_flash:float = 1
+var hit_color:Color = Color("#ffffff")
+var fail_flash:float = 0
+
+
+func dry_get_next():
+ if Rhythia.song_end_type == Globals.END_GIVEUP or Rhythia.queue_pos + 1 == Rhythia.song_queue.size():
+ return null
+
+ return Rhythia.song_queue[Rhythia.queue_pos + 1]
+
+var info_fade:float = 1
+var info_target:bool = true
+func update_timer(ms:float,canSkip:bool=false):
+ var qms = ms + Spawn.ms_offset
+ var lms = Game.last_ms
+
+ if Rhythia.queue_active:
+ lms = Rhythia.queue_end_length + (3000 * (Rhythia.song_queue.size() - 1))
+
+ var s = clamp(floor(qms/1000),0,lms/1000)
+ var m = floor(s / 60)
+ var rs = fmod(s,60)
+
+ var ls = floor(lms/1000)
+ var lm = floor(ls / 60)
+ var lrs = fmod(ls,60)
+
+ if !Rhythia.rainbow_hud:
+ if canSkip:
+ timebar.get("custom_styles/fg").bg_color = timer_fg_canskip
+ timebar.get("custom_styles/bg").bg_color = timer_bg_canskip
+ for n in get_tree().get_nodes_in_group("timer_text"):
+ paint(n,timer_text_canskip)
+
+ elif !Rhythia.queue_active and Spawn.ms > Game.last_ms:
+ timebar.get("custom_styles/fg").bg_color = timer_fg_done
+ timebar.get("custom_styles/bg").bg_color = timer_bg_done
+ for n in get_tree().get_nodes_in_group("timer_text"):
+ paint(n,timer_text_done)
+
+ else:
+ timebar.get("custom_styles/fg").bg_color = timer_fg
+ timebar.get("custom_styles/bg").bg_color = timer_bg
+ for n in get_tree().get_nodes_in_group("timer_text"):
+ paint(n,timer_text)
+
+ timebar.value = clamp(qms/lms,0,1)
+ if canSkip: timelabel.text = tr("PRESS SPACE TO SKIP")
+ elif canSkip and OS.has_feature("Android"): timelabel.text = tr("TAP TO SKIP")
+ else: timelabel.text = "%d:%02d / %d:%02d" % [m,rs,lm,lrs]
+ Rhythia.song_end_time_str = "%d:%02d" % [m,rs]
+
+
+ if Rhythia.queue_active:
+ if ms >= Game.last_ms + Rhythia.hitwindow_ms:
+# songnametxt.text = "(Intermission)"
+ var next = dry_get_next()
+ if next:
+ info_target = true
+ songnametxt.text = next.name
+ songnametxt2.text = next.name
+ mappertitle.text = "Mapped by "
+ mappertxt.text = next.creator
+# mappertitle.text = "Next song:"
+# mappertxt.text = next.name
+ else:
+ info_target = false#Input.is_key_pressed(KEY_S)
+ else:
+ songnametxt.text = Rhythia.selected_song.name
+ songnametxt2.text = Rhythia.selected_song.name
+ mappertitle.text = "Mapped by "
+ mappertxt.text = Rhythia.selected_song.creator
+ if ms <= Rhythia.start_offset - 1000:
+ info_target = true
+ else:
+ info_target = false#Input.is_key_pressed(KEY_S)
+ else:
+ if ms <= (Rhythia.start_offset - 1000):
+ info_target = true
+ else:
+ info_target = false#Input.is_key_pressed(KEY_S)
+
+
+
+func on_miss(color:Color):
+ miss_flash = 1
+
+func on_hit(color:Color):
+ hit_flash = 1
+ hit_color = color
+ if !Rhythia.rainbow_grid:
+ paint(gridcorners,hit_color)
+ paint(gridsides, hit_color)
+
+func paint(node:Control,color:Color):
+ if node is ColorRect:
+ node.color = color
+
+ elif node is Panel:
+ node.get("custom_styles/panel").bg_color = color
+
+ elif node is Label:
+ if node.has_color_override("font_color"):
+ node.set("custom_colors/font_color",color)
+ else:
+ node.modulate = color
+
+ else:
+ node.modulate = color
+
+var config_time:float = 2.5
+
+func on_fail():
+ fail_flash = 1
+
+func _process(delta:float):
+ gtimer += delta
+ if Rhythia.show_config:
+ config_time = max(config_time-delta,0)
+ if config_time <= 0: $ConfigHud.visible = false
+ else: $ConfigHud.opacity = min(1,config_time)
+
+ if combo_ring_value > combo_ring_target:
+ combo_ring_value = max(combo_ring_value + (
+ ((combo_ring_target - combo_ring_value) * delta * 6)
+ ), combo_ring_target)
+ elif combo_ring_value < combo_ring_target:
+ combo_ring_value = min(combo_ring_value + (
+ ((combo_ring_target - combo_ring_value) * delta * 6)
+ ), combo_ring_target)
+
+ if comboring.percent != combo_ring_value:
+ comboring._set_percent(combo_ring_value)
+
+ if Input.is_action_pressed("give_up"):
+ get_node("GiveUpHud").visible = true
+ get_node("GiveUpVP/Control/Label").visible = !$PauseHud.visible
+ if Spawn.ms > Game.last_ms:
+ get_node("GiveUpVP/Control/Label").text = "Skipping..."
+ get_node("GiveUpVP/Control").fill_color = giveup_fill_color_end_skip
+
+ get_node("GiveUpVP/Control").percent = Game.giving_up
+ get_node("GiveUpHud").opacity = min(Game.giving_up*2,1)
+ else:
+ get_node("GiveUpHud").visible = false
+ get_node("GiveUpHud").opacity = 0
+
+ if not is_full_combo:
+ full_combo_indicator_t = max(full_combo_indicator_t - (delta / 0.35), 0.0)
+ else:
+ full_combo_indicator_t = 1.0
+
+ if Rhythia.show_full_combo_indicators:# and Game.total_notes != 0:
+ var fc_indicator_t_curved = ease(full_combo_indicator_t,0.25)
+ var lettergrade_rainbow = Color.from_hsv(Rhythia.rainbow_t*0.1, grade_ss_saturation, grade_ss_value)
+ var combo_rainbow = Color.from_hsv(Rhythia.rainbow_t*0.1, 0.75, 1.0, 0.5)
+ $ComboVP/Value.material.set_shader_param("amount",fc_indicator_t_curved)
+ $ComboVP/Value.set("custom_colors/font_color",lerp(Color(1.0,1.0,1.0,0.19),combo_rainbow,fc_indicator_t_curved))
+ lettergrade.get_node("FullComboIndicator").anchor_top = lerp(0.5,0.0,fc_indicator_t_curved)
+ lettergrade.get_node("FullComboIndicator").anchor_bottom = lerp(0.5,1.0,fc_indicator_t_curved)
+ lettergrade.get_node("FullComboIndicator").visible = fc_indicator_t_curved > 0
+ #lettergrade.get_node("FullComboIndicator").material.set_shader_param("amount",fc_indicator_t_curved)
+ lettergrade.self_modulate = lerp(Color.white, Color.black, fc_indicator_t_curved)
+ $ComboHud.scale = lerp(Vector3.ONE, Vector3(1.25,1.25,1.25), fc_indicator_t_curved)
+ if !Rhythia.rainbow_hud:
+ lettergrade.get_node("FullComboIndicator").color = lettergrade_rainbow
+ elif is_full_combo and !Rhythia.rainbow_hud:
+ lettergrade.set("custom_colors/font_color",Color.from_hsv(Rhythia.rainbow_t*0.1, grade_ss_saturation, grade_ss_value))
+
+ if miss_flash != 0:
+ miss_flash = max(0, miss_flash - (delta * 3))
+ var miss_col = lerp(miss_text_color, miss_flash_color, miss_flash)
+ for n in get_tree().get_nodes_in_group("miss_text"):
+ paint(n, miss_col)
+
+ if hit_flash != 0:
+ hit_flash = max(0, hit_flash - (delta * 1.5))
+ var hit_col = lerp(Color(hit_color.r,hit_color.g,hit_color.b,0), hit_color, min(hit_flash/0.5, 1))
+ paint(gridsides, hit_col)
+
+ if Game.song_has_failed:
+ fail_flash = max(fail_flash - (delta / 0.5), 0.0)
+ var fail_flash_curved = ease(fail_flash, 4)
+ energybar.get("custom_styles/fg").bg_color = Color(0.0,0.0,0.0,0.0)
+ energybar.get("custom_styles/bg").bg_color = lerp(energy_failed, energy_failed_flash, fail_flash_curved)
+ energybar.get_node("Failed").visible = true
+ energybar.get_node("Failed").modulate = lerp(Color(1.0,0.4,0.4,0.8), Color(1.0,0.0,0.0), fail_flash_curved)
+ if Rhythia.attach_hp_to_grid: # unfortunately this gets cut off when using detached HP
+ energybar.get_node("Failed").rect_scale = lerp(Vector2.ONE, Vector2(6.0,6.0), fail_flash_curved)
+ elif Rhythia.rainbow_hud:
+ energybar.get("custom_styles/fg").bg_color = Color.from_hsv(Rhythia.rainbow_t*0.1,0.4,1)
+ energybar.get("custom_styles/bg").bg_color = Color.from_hsv(Rhythia.rainbow_t*0.1,0.4,0.2,0.65)
+
+ # yes these do need to be separate
+ if Rhythia.rainbow_hud:
+ $TimerHud.modulate = Color.from_hsv(Rhythia.rainbow_t*0.1,0.4,1)
+ $ComboHud.modulate = Color.from_hsv(Rhythia.rainbow_t*0.1,0.4,1)
+ $LeftHud.modulate = Color.from_hsv(Rhythia.rainbow_t*0.1,0.4,1)
+ $RightHud.modulate = Color.from_hsv(Rhythia.rainbow_t*0.1,0.4,1)
+ if Rhythia.rainbow_grid:
+ paint(gridcorners, Color.from_hsv(Rhythia.rainbow_t*0.1,0.4,1))
+ paint(gridsides, Color.from_hsv(Rhythia.rainbow_t*0.1,0.4,1,min(hit_flash/0.5, 1)))
+
+ if info_target && info_fade != 1:
+ info_fade = min(info_fade + (delta),1)
+ infoholder.modulate = Color(1,1,1,info_fade)
+ elif !info_target && info_fade != 0:
+ info_fade = max(info_fade - (delta),0)
+ infoholder.modulate = Color(1,1,1,info_fade)
+ infoholder.visible = (info_fade != 0)
+
+
+
+ if Spawn.pause_state != 0:
+ $PauseHud.visible = !Input.is_key_pressed(KEY_C)
+ $PauseVP/Control.percent = clamp(
+ 1 - (Spawn.pause_state),
+ 0,
+ float(Spawn.pause_state != -1)
+ )
+ $PauseHud.modulate = Color(1,1,1,abs(Spawn.pause_state) * pause_ui_opacity)
+ else:
+ $PauseHud.visible = false
+
+ # stat mod
+ elapsed += delta
+ if elapsed >= 0.1 and calculating:
+ pcur_pos = cur_pos
+ cur_pos = $"../Spawn/Cursor/Mesh".global_transform.origin
+ var dist = cur_pos.distance_to(pcur_pos)
+ s_curspd = dist / elapsed
+ if s_curspd > s_tcurspd:
+ s_tcurspd = s_curspd
+ elapsed = 0
+ if gtimer >= 2:
+ calculating = true
+
+ var fstr = "cursor speed\n{current} m/sec/{frames}fr\n\ntop speed\n{top} m/sec/{frames}fr\n\nrec interval\n{rec}"
+ $Stats/Label.text = fstr.format(
+ {
+ "current": stepify(s_curspd,0.1),
+ "frames": Engine.get_frames_per_second(),
+ "top": stepify(s_tcurspd,0.1),
+ "rec": round(Spawn.rec_interval)
+ }
+ )
+
+
+
+
+func _ready():
+ $Grid.translation = Vector3.ZERO
+ Game.connect("miss",self,"on_miss")
+ Game.connect("hit",self,"on_hit")
+ Game.connect("failed",self,"on_fail")
+ $Stats/Label.visible = Rhythia.show_stats
+
+ $GiveUpVP/Control.fill_color = giveup_fill_color
+
+ if !Rhythia.rainbow_hud:
+ for n in get_tree().get_nodes_in_group("panel_bg"):
+ paint(n,panel_bg)
+
+ for n in get_tree().get_nodes_in_group("panel_text"):
+ paint(n,panel_text)
+
+ for n in get_tree().get_nodes_in_group("score_text"):
+ paint(n,score_text_color)
+
+ for n in get_tree().get_nodes_in_group("pause_text"):
+ paint(n, pause_text_color)
+
+ for n in get_tree().get_nodes_in_group("miss_text"):
+ paint(n, miss_text_color)
+
+ if !Rhythia.enable_border:
+ $GridVP/Control/Sides.visible = false
+ $GridVP/Control/Corners.visible = false
+
+ paint($PauseVP/Control/Paused,unpause_empty_color)
+ paint($PauseVP/Control/ProgressBar/Paused,unpause_fill_color)
+ paint($PauseVP/Control/HoldR,how_to_quit)
+ paint($GiveUpVP/Control/Label,giveup_text)
+
+ if Rhythia.rainbow_hud:
+ var cf = max(max(combo_fill_color.r,combo_fill_color.g),combo_fill_color.b)
+ var ce = max(max(combo_empty_color.r,combo_empty_color.g),combo_empty_color.b)
+ var af = max(max(acc_fill_color.r,acc_fill_color.g),acc_fill_color.b)
+ var ae = max(max(acc_empty_color.r,acc_empty_color.g),acc_empty_color.b)
+
+ comboring.fill_color = Color(cf,cf,cf,combo_fill_color.a)
+ comboring.empty_color = Color(ce,ce,ce,combo_empty_color.a)
+ accbar.get("custom_styles/fg").bg_color = Color(af,af,af,acc_fill_color.a)
+ accbar.get("custom_styles/bg").bg_color = Color(ae,ae,ae,acc_empty_color.a)
+
+ else:
+ comboring.fill_color = combo_fill_color
+ comboring.empty_color = combo_empty_color
+ accbar.get("custom_styles/fg").bg_color = acc_fill_color
+ accbar.get("custom_styles/bg").bg_color = acc_empty_color
+ energybar.get("custom_styles/fg").bg_color = energy_fg
+ energybar.get("custom_styles/bg").bg_color = energy_bg
+
+
+
+
+ if !Rhythia.show_config:
+ $ConfigHud.visible = false
+
+ if !Rhythia.enable_grid:
+ Spawn.get_node("Inner").visible = false
+
+ # --------------------------------------------- making this a setting cuz fog wants to lol
+
+ if Rhythia.mod_hardrock and Rhythia.expand_hud_onhr:
+ var HUDScale:Array = [
+ $TimerHud,
+ $LeftHud,
+ $RightHud,
+ $EnergyHud,
+ $ComboHud,
+ ]
+ Spawn.get_node("Inner").scale *= 1.35
+ Spawn.get_node("Outer").scale *= 1.35
+ $TimerHud.transform.origin += Vector3(0, 0.385, 0)
+ $LeftHud.transform.origin += Vector3(-0.50, 0, 0)
+ $RightHud.transform.origin += Vector3(0.50, 0, 0)
+ $EnergyHud.transform.origin += Vector3(0, -0.45, 0)
+ $ComboHud.transform.origin += Vector3(0, 0.40, 0)
+
+ for l in HUDScale:
+ l.scale *= 0.85
+
+ if !Rhythia.enable_border:
+ Spawn.get_node("Outer").visible = false
+
+ if Rhythia.visual_mode or !Rhythia.show_left_panel:
+ $LeftHud.visible = false
+
+ if Rhythia.visual_mode or !Rhythia.show_right_panel:
+ $RightHud.visible = false
+
+ if !Rhythia.show_letter_grade:
+ lettergrade.visible = false
+
+ if !Rhythia.show_accuracy_bar:
+ accbar.visible = false
+
+ if Rhythia.visual_mode or !Rhythia.show_hp_bar:
+ energybar.visible = false
+ modholder.margin_top = 8
+
+ if !Rhythia.show_timer:
+ timelabel.visible = false
+ timebar.visible = false
+
+
+ # TODO: figure out how to handle these
+ if not Rhythia.attach_hp_to_grid:
+ var econtrol = $GridVP/Control/Energy
+ var ehud = $EnergyHud
+ econtrol.get_parent().remove_child(econtrol)
+ $EnergyVP.add_child(econtrol)
+ econtrol.margin_top = -300
+ econtrol.margin_left = 0
+ econtrol.margin_right = 900
+ econtrol.margin_bottom = 0
+# remove_child(ehud)
+# Spawn.add_child(ehud)
+# ehud.transform.origin += Vector3(1,-1,0)
+
+ if not Rhythia.attach_timer_to_grid:
+ var tcontrol = $GridVP/Control/Timer
+ var thud = $TimerHud
+ tcontrol.get_parent().remove_child(tcontrol)
+ $TimerVP.add_child(tcontrol)
+ tcontrol.margin_top = 0
+ tcontrol.margin_left = 0
+ tcontrol.margin_right = 900
+ tcontrol.margin_bottom = 300
+# remove_child(thud)
+# Spawn.add_child(thud)
+# thud.transform.origin += Vector3(1,-1,0)
+
+ if Rhythia.simple_hud:
+ $LeftVP/Control.self_modulate = Color(0,0,0,0)
+ $RightVP/Control.self_modulate = Color(0,0,0,0)
+
+ for n in $LeftVP/Control.get_children():
+ n.visible = n.name == "SimpleBg" or n.name == "Pauses" or n.name == "PausesTitle"
+ if n.visible: n.rect_position.y += 100
+
+ for n in $RightVP/Control.get_children():
+ n.visible = n.name == "SimpleBg" or n.name == "Misses" or n.name == "MissesTitle"
+ if n.visible: n.rect_position.y += 100
+
+ if Rhythia.faraway_hud:
+ transform.origin = Vector3(0,0,-10)
+ scale = Vector3(3.7,3.7,3.7)
+
+# if Rhythia.visual_mode:
+# $EnergyVP/Control/Modifiers.visible = false
+
+ songnametxt.text = Rhythia.selected_song.name
+ songnametxt2.text = Rhythia.selected_song.name
+ mappertitle.text = tr("Mapped by ")
+ mappertxt.text = Rhythia.selected_song.creator
+
+
+
+
+
+ var ms = ""
+
+ if Rhythia.replaying:
+ if Rhythia.replay.autoplayer: modicons.get_node("Autoplay").visible = true
+ else: modicons.get_node("Replaying").visible = true
+
+ if Rhythia.mod_nofail: ms += tr("[ NOFAIL ACTIVE ]") + "\n"
+ elif Rhythia.health_model == Globals.HP_OLD: ms += tr("Using old hp model (more hp + fast regen)") + "\n"
+
+ var mods = []
+ if Rhythia.mod_speed_level != Globals.SPEED_NORMAL:
+ match Rhythia.mod_speed_level:
+ Globals.SPEED_MMM: modicons.get_node("SpeedMMM").visible = true
+ Globals.SPEED_MM: modicons.get_node("SpeedMM").visible = true
+ Globals.SPEED_M: modicons.get_node("SpeedM").visible = true
+ Globals.SPEED_P: modicons.get_node("SpeedP").visible = true
+ Globals.SPEED_PP: modicons.get_node("SpeedPP").visible = true
+ Globals.SPEED_PPP: modicons.get_node("SpeedPPP").visible = true
+ Globals.SPEED_PPPP: modicons.get_node("SpeedPPPP").visible = true
+ Globals.SPEED_CUSTOM: mods.append("S%s" % [Globals.speed_multi[Globals.SPEED_CUSTOM] * 100])
+ if Rhythia.mod_sudden_death: mods.append("SuddenDeath")
+ if Rhythia.mod_extra_energy: mods.append("Energy+")
+ if Rhythia.mod_no_regen: mods.append("NoRegen")
+ if Rhythia.mod_mirror_x or Rhythia.mod_mirror_y:
+ var mirrorst = tr("Mirror")
+ if Rhythia.mod_mirror_x: mirrorst += "X"
+ if Rhythia.mod_mirror_y: mirrorst += "Y"
+ mods.append(mirrorst)
+ if Rhythia.mod_ghost: mods.append(tr("Ghost"))
+ if Rhythia.mod_nearsighted: mods.append("Nearsight")
+ if Rhythia.mod_chaos: mods.append(tr("Chaos"))
+ if Rhythia.mod_earthquake: mods.append(tr("Earthquake"))
+ if Rhythia.mod_flashlight: mods.append(tr("Flashlight"))
+ if Rhythia.mod_hardrock: mods.append(tr("Hard Rock"))
+ if Rhythia.invert_mouse: mods.append(tr("Mouse Inverted"))
+ for i in range(mods.size()):
+ if i != 0: ms += " "
+ ms += mods[i]
+ if mods.size() != 0 and !Rhythia.mod_nofail: ms += '\n'
+
+ if Rhythia.hitwindow_ms != 55 or Rhythia.note_hitbox_size != 1.140:
+ ms += "HW: %.0f ms | HB: %.02f m" % [Rhythia.hitwindow_ms,Rhythia.note_hitbox_size]
+
+ modtxt.text = ms
+
+ Spawn.get_node("Outer").visible = false
+ if Rhythia.enable_border:
+ yield(get_tree(),"idle_frame")
+ remove_child(gridborder)
+ yield(get_tree(),"idle_frame")
+ Spawn.add_child(gridborder)
+# yield(get_tree(),"idle_frame")
+# var vpt = ViewportTexture.new()
+# gridmat.albedo_texture = vpt
+# vpt.viewport_path = get_tree().root.get_node("Song").get_path_to(gridvp)
+ else:
+ gridborder.visible = false
+
+
+
diff --git a/scripts/game/TrueComboHandler.gd b/scripts/game/TrueComboHandler.gd
index 51cfa417..7e48fdc5 100644
--- a/scripts/game/TrueComboHandler.gd
+++ b/scripts/game/TrueComboHandler.gd
@@ -6,5 +6,5 @@ func _ready():
else:
visible = true
-func _physics_process(delta):
- rect_position.y += (150 - rect_position.y) * 0.25
+func _process(delta):
+ rect_position.y += (150 - rect_position.y) * 0.25 * (delta * 60.0)
diff --git a/scripts/init.gd b/scripts/init.gd
index 17de246f..2851ecdc 100644
--- a/scripts/init.gd
+++ b/scripts/init.gd
@@ -31,7 +31,7 @@ func _ready():
black_fade = 1
$BlackFade.color = Color(0,0,0,black_fade)
Rhythia.connect("init_stage_reached",self,"stage")
- var s = Globals.error_sound
+# var s = Globals.error_sound
# var st = Rhythia.get_stream_with_default("user://loadingmusic",s)
# if st != s:
# $Music.stream = st
diff --git a/scripts/online/OnlineAccount.gd b/scripts/online/OnlineAccount.gd
new file mode 100644
index 00000000..b51a4b25
--- /dev/null
+++ b/scripts/online/OnlineAccount.gd
@@ -0,0 +1,6 @@
+class_name OnlineAccount
+extends Resource
+
+var ready:bool = false
+
+var profile_aboutme:String = ""
diff --git a/scripts/ui/devmenu/devmenu.gd b/scripts/ui/devmenu/devmenu.gd
new file mode 100644
index 00000000..a242cd8e
--- /dev/null
+++ b/scripts/ui/devmenu/devmenu.gd
@@ -0,0 +1,115 @@
+extends Control
+
+var online_services_ok:bool = false
+var online_maps_ok:bool = false
+var online_score_submission_ok:bool = false
+var online_silenced:bool = false
+var online_banned:bool = false # Restricted / Excluded
+var online_anti_tamper:bool = false
+var online_server_down:bool = false
+var online_no_internet:bool = false
+var online_signed_out:bool = false
+var online_is_admin:bool = false
+var online_is_moderator:bool = false
+var online_is_mmt:bool = false
+var online_is_rct:bool = false
+
+func check_online_status():
+ online_maps_ok = (Online.netmaps_status == Online.STATUS.OK)
+ online_server_down = (Online.netmaps_status == Online.STATUS.API_HTTP_FAIL)
+ online_no_internet = (Online.netmaps_status == Online.STATUS.CONNECTION_TEST_FAIL)
+ online_signed_out = true
+
+func update_status_icons():
+ $V/Bar/Debug.visible = OS.has_feature("debug")
+ $V/Bar/Release.visible = not OS.has_feature("debug")
+
+ check_online_status()
+ $V/Bar/OnlineServicesYes.visible = online_services_ok
+ $V/Bar/OnlineServicesNo.visible = not online_services_ok
+ $V/Bar/OnlineMapsYes.visible = online_maps_ok
+ $V/Bar/OnlineMapsNo.visible = not online_maps_ok
+ $V/Bar/ScoreSubYes.visible = online_score_submission_ok
+ $V/Bar/ScoreSubNo.visible = not online_score_submission_ok
+ $V/Bar/Silenced.visible = online_silenced
+ $V/Bar/Banned.visible = online_banned
+ $V/Bar/AntiTamper.visible = online_anti_tamper
+ $V/Bar/ServerDown.visible = online_server_down
+ $V/Bar/NoInternet.visible = online_no_internet
+ $V/Bar/SignedOut.visible = online_signed_out
+ $V/Bar/IsAdmin.visible = online_is_admin
+ $V/Bar/IsModerator.visible = online_is_moderator
+ $V/Bar/IsMMT.visible = online_is_mmt
+ $V/Bar/IsRCT.visible = online_is_rct
+
+var bg_image_fade:float = 0.0
+var bg_image_httpreq:HTTPRequest = HTTPRequest.new()
+var bg_image_ready:bool = false
+
+
+func _bg_image_req_done(result:int, response_code:int, headers:PoolStringArray, body:PoolByteArray):
+ if result == OK and response_code == 200:
+ var format = Globals.imageLoader.get_format(body)
+ var img = Image.new()
+ var img_err = ERR_INVALID_DATA
+ if format == "png": img_err = img.load_png_from_buffer(body)
+ elif format == "bmp": img_err = img.load_bmp_from_buffer(body)
+ elif format == "jpg": img_err = img.load_jpg_from_buffer(body)
+ elif format == "webp": img_err = img.load_webp_from_buffer(body)
+
+ if img_err == OK:
+ print("mraaaow mrrp meoww :3c")
+ var texture = ImageTexture.new()
+ texture.create_from_image(img)
+ print("%s %sx%s" % [texture.get_format(), texture.get_width(), texture.get_height()])
+ get_parent().texture = texture
+ else:
+ print("image load was error %s" % img_err)
+ else:
+ print("request failed: result=%s code=%s" % [result,response_code])
+ bg_image_ready = true
+ # if the image fails we want to fade in the normal background
+
+func _process(delta):
+ if bg_image_ready and bg_image_fade < 1.0:
+ bg_image_fade += delta
+ get_parent().self_modulate = Color(1.0,1.0,1.0,bg_image_fade * 0.3)
+ if Input.is_action_just_pressed("ui_quicksettings"):
+ get_parent().self_modulate = Color(1.0,1.0,1.0,0.0)
+ bg_image_fade = 0
+ bg_image_ready = false
+ get_bg_image()
+
+func get_bg_image():
+ if randf() < 0.05:
+ bg_image_ready = true
+ get_parent().texture = load("res://assets/images/devbg.png")
+ # use the default image
+ else:
+ var error = bg_image_httpreq.request("https://cataas.com/cat")
+ if error != OK:
+ print("error %s requesting bg image" % error)
+ bg_image_ready = true
+ # use default image
+
+func _exit_tree():
+ bg_image_httpreq.cancel_request()
+
+func _ready():
+ add_child(bg_image_httpreq)
+ bg_image_httpreq.connect("request_completed",self,"_bg_image_req_done")
+ bg_image_httpreq.use_threads = true
+ bg_image_httpreq.timeout = 6
+ bg_image_httpreq.body_size_limit = 1024*1024*4 # 4 MiB
+ get_bg_image()
+
+ get_parent().self_modulate = Color(1.0,1.0,1.0,0.0)
+ update_status_icons()
+
+ $V/Bar/Quit.connect("pressed",get_tree(),"quit")
+ $V/Bar/ToDevMenu.connect("pressed",get_tree(),"change_scene",["res://scenes/devmenu.tscn"])
+ $V/Bar/ToMenu2.connect("pressed",get_tree(),"change_scene",["res://scenes/menu/menu2.tscn"])
+ $V/Bar/ToMenu3.connect("pressed",get_tree(),"change_scene",["res://scenes/menu/menu3d.tscn"])
+ $V/Bar/ToInit3d.connect("pressed",get_tree(),"change_scene",["res://scenes/init3d.tscn"])
+ $V/Bar/ToSongload.connect("pressed",get_tree(),"change_scene",["res://scenes/loaders/songload.tscn"])
+
diff --git a/scripts/ui/menu/VersionNumber.gd b/scripts/ui/menu/VersionNumber.gd
index a7f4aa5e..0952f158 100644
--- a/scripts/ui/menu/VersionNumber.gd
+++ b/scripts/ui/menu/VersionNumber.gd
@@ -1,4 +1,6 @@
extends Label
+export var template:String = "Rhythia [%s]"
+
func _ready():
- text = "Rhythia [%s]" % ProjectSettings.get_setting("application/config/version")
+ text = template % ProjectSettings.get_setting("application/config/version")
diff --git a/scripts/ui/menu/WarningBar.gd b/scripts/ui/menu/WarningBar.gd
index adde1b98..ebdb3b94 100644
--- a/scripts/ui/menu/WarningBar.gd
+++ b/scripts/ui/menu/WarningBar.gd
@@ -1,5 +1,7 @@
extends ColorRect
+export var is_devmenu = false
+
var entry:float = 0
var state:bool = false
var scroll:float = 0
@@ -21,28 +23,64 @@ func display_warning(id:String):
color = Color("#5cb76e")
"smm":
state = true
- $L.text = "Running in single map mode. Online features, PBs, and most map actions are disabled."
+ $L.text = tr("Running in single map mode. Online features, PBs, and most map actions are disabled.")
color = Color("#ffbb19")
+ "online_excluded":
+ state = true
+ $L.text = tr("Your account has been excluded. Online features, including score submission, are disabled. See rhythia.com/rules for more information.")
+ color = Color("#ff7c19")
+ "online_restricted":
+ state = true
+ $L.text = tr("Your account has been restricted. Scores will not be submitted. See rhythia.com/rules for more information.")
+ color = Color("#ffbb19")
+ "online_silenced":
+ state = true
+ $L.text = tr("Your account has been silenced. Chat and comments will be read-only. See rhythia.com/rules for more information.")
+ color = Color("#ffbb19")
+ "online_nointernet":
+ state = true
+ $L.text = tr("You are not connected to the internet. Score submission and other online features are unavailable.")
+ color = Color("#f2e830")
+ "online_outage":
+ state = true
+ $L.text = tr("Rhythia online services are experiencing an outage. Score submission and other online features are unavailable.")
+ color = Color("#f29e30")
+ "online_maintenance":
+ state = true
+ $L.text = tr("Rhythia online services are undergoing maintenance. Score submission and other online features are unavailable.")
+ color = Color("#f29e30")
+ "online_antitamper":
+ state = true
+ $L.text = tr("Your game has been modified, or you are using an unapproved build. Score submission is disabled. (Press C to dismiss)")
+ color = Color("#fc6d35")
+ "online_scoremaintenance":
+ state = true
+ $L.text = tr("Score submission is currently disabled for maintenance.")
+ color = Color("#f29e30")
+ "online_loggedout":
+ state = true
+ $L.text = tr("You are not logged into your Rhythia account.")
+ color = Color("#f2e6d7")
"spawn":
state = true
- $L.text = "Note spawn effects may be buggy."
+ $L.text = tr("Note spawn effects may be buggy.")
color = Color("#fc794e")
"debug":
state = true
- $L.text = "Development mode is active, game mods will not be used."
+ $L.text = tr("Development mode is active, game mods will not be used and scores will not be submitted.")
color = Color("#477d94")
"controllercheck":
state = true
- $L.text = "Controller checking disabled. Press C to hide this bar."
+ $L.text = tr("Controller checking disabled. Press C to hide this bar.")
color = Color("#8400ff")
"experimental":
state = true
- $L.text = "You are currently using experimental settings. Expect bugs."
+ $L.text = tr("You are currently using experimental settings. Expect bugs.")
color = Color("#c1c1ac")
# color = Color("#dbd1a2")
"experimental_mod":
state = true
- $L.text = "One or more mods you selected are currently experimental. Expect bugs."
+ $L.text = tr("One or more mods you selected are currently experimental. Expect bugs.")
color = Color("#77c1d1")
_:
assert(false)
@@ -58,14 +96,38 @@ func check_experimental_settings():
if Rhythia.get(k): return true
return false
+var test_excluded = false
+var test_restricted = false
+var test_silenced = false
+var online_status = "ok"
+# antitamper / loggedout / nointernet / scoremaintenance / maintenance / outage / ok
+
func check_warnings():
- if Input.is_action_pressed("arcw3") and bar_enable:
+ if Input.is_action_pressed("dismiss_bar") and bar_enable:
bar_enable = false
if Input.is_action_pressed("warning_test"):
return "test"
elif Rhythia.single_map_mode:
return "smm"
+ elif test_excluded:
+ return "online_excluded"
+ elif test_restricted:
+ return "online_restricted"
+ elif test_silenced:
+ return "online_silenced"
+ elif online_status == "nointernet":
+ return "online_nointernet"
+ elif online_status == "outage":
+ return "online_outage"
+ elif online_status == "maintenance":
+ return "online_maintenance"
+ elif bar_enable and online_status == "antitamper" and !OS.has_feature("debug"):
+ return "online_antitamper"
+ elif online_status == "scoremaintenance":
+ return "online_scoremaintenance"
+ elif online_status == "loggedout":
+ return "online_loggedout"
elif Rhythia.note_spawn_effect:
return "spawn"
# Temp mark HR as a Experimental due to issues :/
@@ -75,11 +137,8 @@ func check_warnings():
return "debug"
elif check_experimental_settings():
return "experimental"
- elif Rhythia.ignore_controller_detection:
- if bar_enable:
- return "controllercheck"
- else:
- return "none"
+ elif bar_enable and Rhythia.ignore_controller_detection:
+ return "controllercheck"
else:
return "none"
@@ -104,9 +163,16 @@ func _process(delta):
switch = 0.35
state = false
+ var centerdist = width * abs(
+ fmod(scroll + ($L.rect_size.x/2.0/width), 1.0) - 0.5
+ )
+
+ var centerdist_mod = (6.0 * pow(centerdist/((width-$L.rect_size.x)/1.7), 2.0)) # keep text in the middle for longer
scroll = scroll + (delta * (20.0/1200.0)) * (
- 1.5 + (3.0 * float(Input.is_key_pressed(KEY_CONTROL))))
+ 1.5 + (3.0 * float(Input.is_key_pressed(KEY_CONTROL)))
+ + centerdist_mod
+ )
if scroll >= 1.0: scroll -= 1.0
$L.rect_position = Vector2(
@@ -118,27 +184,30 @@ func _process(delta):
0
)
- if state && entry != 1:
- entry = min(entry + (delta/0.8), 1.0)
- modulate = Color(1.0, 1.0, 1.0, entry)
- margin_top = Dance.InOutSine(entry) * -30
- margin_bottom = (1.0 - Dance.InOutSine(entry)) * 30
- get_parent().get_node("VersionNumber").margin_top = -45 - (Dance.InOutSine(entry)*30)
- get_parent().get_node("VersionNumber").margin_bottom = -15 - (Dance.InOutSine(entry)*30)
- get_parent().get_node("VersionNumberB").margin_top = -45 - (Dance.InOutSine(entry)*30)
- get_parent().get_node("VersionNumberB").margin_bottom = -15 - (Dance.InOutSine(entry)*30)
-
- elif !state && entry != 0:
- entry = max(entry - (delta/0.8), 0.0)
- modulate = Color(1.0, 1.0, 1.0, entry)
- margin_top = Dance.InOutSine(entry) * -30
- margin_bottom = (1.0 - Dance.InOutSine(entry)) * 30
- get_parent().get_node("VersionNumber").margin_top = -45 - (Dance.InOutSine(entry)*30)
- get_parent().get_node("VersionNumber").margin_bottom = -15 - (Dance.InOutSine(entry)*30)
- get_parent().get_node("VersionNumberB").margin_top = -45 - (Dance.InOutSine(entry)*30)
- get_parent().get_node("VersionNumberB").margin_bottom = -15 - (Dance.InOutSine(entry)*30)
-
- visible = (entry != 0)
+ if is_devmenu:
+ visible = state
+ else:
+ if state && entry != 1:
+ entry = min(entry + (delta/0.8), 1.0)
+ modulate = Color(1.0, 1.0, 1.0, entry)
+ margin_top = Dance.InOutSine(entry) * -30
+ margin_bottom = (1.0 - Dance.InOutSine(entry)) * 30
+ get_parent().get_node("VersionNumber").margin_top = -45 - (Dance.InOutSine(entry)*30)
+ get_parent().get_node("VersionNumber").margin_bottom = -15 - (Dance.InOutSine(entry)*30)
+ get_parent().get_node("VersionNumberB").margin_top = -45 - (Dance.InOutSine(entry)*30)
+ get_parent().get_node("VersionNumberB").margin_bottom = -15 - (Dance.InOutSine(entry)*30)
+
+ elif !state && entry != 0:
+ entry = max(entry - (delta/0.8), 0.0)
+ modulate = Color(1.0, 1.0, 1.0, entry)
+ margin_top = Dance.InOutSine(entry) * -30
+ margin_bottom = (1.0 - Dance.InOutSine(entry)) * 30
+ get_parent().get_node("VersionNumber").margin_top = -45 - (Dance.InOutSine(entry)*30)
+ get_parent().get_node("VersionNumber").margin_bottom = -15 - (Dance.InOutSine(entry)*30)
+ get_parent().get_node("VersionNumberB").margin_top = -45 - (Dance.InOutSine(entry)*30)
+ get_parent().get_node("VersionNumberB").margin_bottom = -15 - (Dance.InOutSine(entry)*30)
+
+ visible = (entry != 0)
func _ready():
current_warning = check_warnings()
diff --git a/scripts/ui/menu/buttons/RunMapButton.gd b/scripts/ui/menu/buttons/RunMapButton.gd
index 99398e5c..8f950bc9 100644
--- a/scripts/ui/menu/buttons/RunMapButton.gd
+++ b/scripts/ui/menu/buttons/RunMapButton.gd
@@ -35,6 +35,9 @@ func files_dropped(files:PoolStringArray,_screen:int):
func _input(event:InputEvent):
if not is_visible_in_tree(): return
+ if not get_viewport().has_node("Menu/Main"): return
+ # make sure this doesn't run in devmenu
+
if get_focus_owner() == $"/root/Menu/Main/Maps/MapRegistry/T/Search": return
if get_focus_owner() == $"/root/Menu/Main/Maps/MapRegistry/T/AuthorSearch": return
if get_viewport().get_node("Menu/Main/Maps/Results").visible == true:
diff --git a/scripts/ui/menu3d/Controls.gd b/scripts/ui/menu3d/Controls.gd
new file mode 100644
index 00000000..63e2455e
--- /dev/null
+++ b/scripts/ui/menu3d/Controls.gd
@@ -0,0 +1,226 @@
+extends Spatial
+
+var controls_allowed:bool = false
+var fov_target:float = 65
+
+var yaw = 0
+var pitch = 0
+
+var yaw_limit = 75
+var pitch_limit = 35
+
+var yaw_pillow = 35
+var pitch_pillow = 18
+
+var ellipse_grow = 6
+
+var joy_multi = 120
+
+# $d = \sqrt {(a\cos t + c)^2 + (b\sin t)^2}$
+
+func get_limits():
+ return Vector2(yaw_limit, pitch_limit)
+# return Vector2(
+# sqrt( abs( pow(yaw_limit+ellipse_grow,2) * ( -(pow(pitch,2) / pow(pitch_limit+ellipse_grow,2)) + 1 ) ) ),
+# sqrt( abs( pow(pitch_limit+ellipse_grow,2) * ( -(pow(yaw,2) / pow(yaw_limit+ellipse_grow,2)) + 1 ) ) )
+# )
+
+func _input(event:InputEvent):
+ if !controls_allowed: return
+ if (Input.mouse_mode == Input.MOUSE_MODE_CAPTURED && event is InputEventMouseMotion) || event is InputEventScreenDrag:
+ var xc = -(event.relative.x * Rhythia.sensitivity * 0.2)
+ var yc = -(event.relative.y * Rhythia.sensitivity * 0.2)
+
+ var l = get_limits()
+ $Label.text = String(l)
+
+ if sign(xc) == sign(yaw) && (l.x - abs(yaw)) < yaw_pillow:
+ xc *= (l.x - abs(yaw)) / yaw_pillow
+
+ if sign(yc) == sign(pitch) && (l.y - abs(pitch)) < pitch_pillow:
+ yc *= (l.y - abs(pitch)) / pitch_pillow
+
+ yaw = clamp(yaw + xc, -l.x, l.x)
+ pitch = clamp(pitch + yc, -l.y, l.y)
+ $Camera.rotation = Vector3(deg2rad(pitch), deg2rad(fmod(yaw, 360)), 0)
+ $PointerHolder/Pointer.visible = true
+
+
+var trail_cache:Array = []
+
+var prev_end
+var trail_started = false
+
+var ct:float = 0
+var segt:float = 0
+var segl:float = 0.01
+
+var total_trail_segments = 0
+
+onready var trail_base = $PointerHolder/PointerTrail
+
+
+func _ready():
+ set_process(false) # this will be re-enabled by onboarding.gd when needed
+# Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
+
+
+ var img = Globals.imageLoader.load_if_exists("user://cursor")
+ if img: $PointerHolder/Pointer.mesh.surface_get_material(0).albedo_texture = img
+
+ var mat = trail_base.get("material/0")
+ var img2 = Globals.imageLoader.load_if_exists("user://trail")
+ if img2: mat.albedo_texture = img2
+ elif img: mat.albedo_texture = img
+
+ yield(get_tree(),"idle_frame")
+ prev_end = global_transform.origin
+
+ for i in range(48):
+ var trail = trail_base.duplicate()
+ $PointerHolder.add_child(trail)
+ trail.connect("cache_me",self,"cache_trail",[trail])
+ trail_cache.append(trail)
+ trail.init()
+ trail_started = true
+
+var t = 0
+var ci = 0
+
+var trail_t = 0
+
+func cache_trail(part:Spatial):
+ trail_cache.append(part)
+
+var ripple = preload("res://assets/notefx/ripple/ripple.tscn")
+
+func on_click():
+ if !Rhythia.selected_colorset: return
+ ci = (ci+1) % len(Rhythia.selected_colorset.colors)
+ var e = ripple.instance()
+ e.spawn_menu(self,Rhythia.selected_colorset.colors[ci],$PointerHolder/Pointer.transform)
+ pass # this will do raycast stuff eventually
+
+func _process(delta):
+ if $Camera.fov > fov_target:
+ $Camera.fov = max(lerp($Camera.fov, fov_target * 0.99, delta * 2), fov_target)
+ elif $Camera.fov < fov_target:
+ $Camera.fov = min(lerp($Camera.fov, fov_target * 1.01, delta * 2), fov_target)
+ # if it's equal we don't need to do anything
+
+ if !controls_allowed:
+ if Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:
+ Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
+
+ if Input.is_action_just_pressed("toggle_mouse_lock"):
+ if Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:
+ Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
+ else:
+ Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
+
+ if controls_allowed:
+ $PointerHolder.visible = true
+ var xp = Input.get_action_strength("joy_right") - Input.get_action_strength("joy_left")
+ var yp = Input.get_action_strength("joy_up") - Input.get_action_strength("joy_down")
+
+ $Label.text = ""
+
+ # $Camera/p.visible = (xp != 0 || yp != 0)
+ # $Camera/p2.visible = (xp != 0 || yp != 0)
+
+ if xp != 0 || yp != 0:
+ $PointerHolder/Pointer.visible = true
+ var l = get_limits()
+
+
+ $Camera/p.transform.origin.x = xp
+ $Camera/p.transform.origin.y = yp
+
+ if sign(xp) == -sign(yaw) && (l.x - abs(yaw)) < yaw_pillow:
+ xp *= (l.x - abs(yaw)) / yaw_pillow
+
+ if sign(yp) == sign(pitch) && (l.y - abs(pitch)) < pitch_pillow:
+ yp *= (l.y - abs(pitch)) / pitch_pillow
+
+ var xc = -(xp * Rhythia.sensitivity * delta * joy_multi)
+ var yc = (yp * Rhythia.sensitivity * delta * joy_multi)
+
+ $Camera/p2.transform.origin.x = xp
+ $Camera/p2.transform.origin.y = yp
+
+ yaw = clamp(yaw + xc, -l.x, l.x)
+ pitch = clamp(pitch + yc, -l.y, l.y)
+ $Camera.rotation = Vector3(deg2rad(pitch), deg2rad(fmod(yaw, 360)), 0)
+
+ $Camera/RayCast.force_raycast_update()
+
+ if $Camera/RayCast.is_colliding():
+ $Label.text += "\nP: " + String($Camera/RayCast.get_collision_point())
+ $Label.text += "\nN: " + String($Camera/RayCast.get_collision_normal())
+
+ $PointerHolder/Pointer.global_translation = $Camera/RayCast.get_collision_point()
+ $PointerHolder/Pointer.look_at($PointerHolder/Pointer.global_translation - $Camera/RayCast.get_collision_normal(),Vector3.UP)
+
+ $PointerHolder/Pointer.scale = Vector3(Rhythia.cursor_scale, Rhythia.cursor_scale, Rhythia.cursor_scale)
+
+ if Rhythia.cursor_color_type == Globals.CURSOR_RAINBOW:
+ $PointerHolder/Pointer.mesh.material.albedo_color = Color.from_hsv(Rhythia.rainbow_t*0.1,0.65,1)
+ elif Rhythia.cursor_color_type == Globals.CURSOR_NOTE_COLOR:
+ if Rhythia.selected_colorset:
+ ci = ci % len(Rhythia.selected_colorset.colors)
+ $PointerHolder/Pointer.mesh.material.albedo_color = Rhythia.selected_colorset.colors[ci]
+ else:
+ $PointerHolder/Pointer.mesh.material.albedo_color = Rhythia.cursor_color
+ else:
+ $PointerHolder/Pointer.visible = false
+
+ if Rhythia.cursor_trail and trail_started:
+# print("doing trail")
+ trail_t += delta
+ $Label.text += "\n\nT: " + String(trail_t)
+
+ if Rhythia.smart_trail:
+ $Label.text += "\nsmart"
+ trail_t = 0
+ var start_p = $PointerHolder/Pointer.global_transform.origin
+ var end_p = prev_end
+ $Label.text += "\nD: " + String((start_p-end_p).length())
+ var amt = min(ceil(Rhythia.trail_detail*((start_p-end_p).length())),120)
+ $Label.text += "\nA: " + String(amt)
+
+ for i in range(amt):
+ var trail:Spatial
+ var v = float(i)/float(amt)
+ var pos = lerp(start_p,end_p,v)
+ if trail_cache.size() != 0:
+ trail = trail_cache.pop_front()
+ else:
+ trail = trail_base.duplicate()
+ $PointerHolder.add_child(trail)
+ trail.connect("cache_me",self,"cache_trail",[trail])
+ total_trail_segments += 1
+
+ trail.start_smart(v*delta,pos)
+
+ elif trail_t >= 1.0 / Rhythia.trail_detail:
+ $Label.text += "\ndumb"
+ while trail_t >= 1.0 / Rhythia.trail_detail:
+ var trail:Spatial
+ var v = clamp(trail_t / (1.0 / Rhythia.trail_detail), 0.0, 1.0)
+
+ trail_t -= (1.0 / Rhythia.trail_detail)
+
+ if trail_cache.size() != 0:
+ trail = trail_cache.pop_front()
+ else:
+ trail = trail_base.duplicate()
+ $PointerHolder.add_child(trail)
+ trail.connect("cache_me",self,"cache_trail",[trail])
+ total_trail_segments += 1
+ trail.start(v)
+
+ prev_end = $PointerHolder/Pointer.global_transform.origin
+ $Label.text += "\nTotal: " + String(total_trail_segments)
+
+ if Input.is_action_just_pressed("menu_click"):
+ on_click()
diff --git a/scripts/ui/menu3d/GameInit.gd b/scripts/ui/menu3d/GameInit.gd
new file mode 100644
index 00000000..1651b3eb
--- /dev/null
+++ b/scripts/ui/menu3d/GameInit.gd
@@ -0,0 +1,126 @@
+extends Spatial
+
+var active:bool = false
+
+var thread:Thread
+var target:String = Rhythia.menu_target
+var leaving:bool = false
+
+func stage(text:String,done:bool=false):
+ $Label2.text = text
+ if done:
+# black_fade_target = true
+ $Label2.text = "Loading menu"
+ var res = RQueue.queue_resource(target)
+ if res != OK:
+ Rhythia.errorstr = "queue_resource returned %s" % res
+ get_tree().change_scene("res://scenes/errors/menuload.tscn")
+# leaving = true
+
+enum {
+ MODE_STARTINIT = 0,
+ MODE_MIDINIT = 1,
+ MODE_MENU = 2,
+}
+
+func activate(mode):
+ get_node("../Music").change(true,false,false,false)
+
+ print("Showing loading screen in mode %s" % mode)
+
+ active = true
+
+# init vr (disabled currently)
+# var VR = ARVRServer.find_interface("OpenVR")
+# if VR and VR.initialize():
+# target = "res://vrmenudemo.tscn"
+
+# VisualServer.set_debug_generate_wireframes(true)
+# get_viewport().debug_draw = get_viewport().DEBUG_DRAW_OVERDRAW
+
+ if mode == MODE_STARTINIT or mode == MODE_MIDINIT:
+ Rhythia.connect("init_stage_reached",self,"stage")
+
+ match mode:
+ MODE_STARTINIT:
+ thread = Thread.new()
+
+ OS.request_permissions()
+ yield(get_tree().create_timer(0.5),"timeout")
+ if ProjectSettings.get_setting("application/config/auto_maximize") and Rhythia.auto_maximize: OS.window_maximized = true
+ yield(get_tree().create_timer(0.5),"timeout")
+
+ thread.start(Rhythia,"do_init")
+
+ MODE_MENU:
+ stage("",true)
+
+ _:
+ pass
+
+ if ProjectSettings.get_setting("application/config/discord_rpc"):
+ var activity = Discord.Activity.new()
+ activity.set_type(Discord.ActivityType.Playing)
+ activity.set_details("Initialization")
+
+ if mode == MODE_MENU: activity.set_state("Loading menu")
+ elif Rhythia.do_archive_convert: activity.set_state("Mass-converting songs")
+ elif Rhythia.first_init_done: activity.set_state("Reloading content")
+ else: activity.set_state("Starting the game")
+
+ var assets = activity.get_assets()
+ assets.set_large_image("icon")
+
+ Discord.activity_manager.update_activity(activity)
+
+func _exit_tree():
+ if thread: thread.wait_to_finish()
+
+var result
+
+var logo_target = -2
+
+func set_logo_target(i):
+ logo_target = i
+
+onready var logo = [
+ $Logo/IconOnly,
+ $Logo/S0,
+ $Logo/S1,
+ $Logo/S2,
+ $Logo/S3,
+ $Logo/S4,
+]
+
+var glow_timer = 0
+
+func _process(delta):
+ glow_timer += delta * PI
+ if glow_timer > PI:
+ glow_timer -= PI
+ $LogoSpinner/Glow.opacity = 0.25 + (0.75 * sin(glow_timer))
+ var total = 0
+# for i in range(logo.size()):
+# var n:Sprite3D = logo[i]
+# i -= 1
+# if i == logo_target:
+# n.opacity = min(n.opacity + (delta / 0.6), 1)
+# else:
+# n.opacity = max(n.opacity - (delta / 0.6), 0)
+# total += n.opacity
+
+ if !leaving:
+
+ if Rhythia.init_running and OS.has_feature("debug") and Input.is_action_pressed("debug_devmenu"):
+ target = "res://scenes/devmenu.tscn"
+ if RQueue.is_ready(target):
+ result = RQueue.get_resource(target)
+ leaving = true
+ get_node("../Music").change(false,false,false,false)
+ get_parent().black_fade_target = true
+ if !(result is Object):
+ Rhythia.errorstr = "get_resource returned non-object (probably null)"
+ get_tree().change_scene("res://scenes/errors/menuload.tscn")
+
+ if leaving and result and get_parent().black_fade == 1 and get_node("../Music").hv == 0:
+ get_tree().change_scene_to(result)
diff --git a/scripts/ui/menu3d/MenuCamera.gd b/scripts/ui/menu3d/MenuCamera.gd
new file mode 100644
index 00000000..7cafa7db
--- /dev/null
+++ b/scripts/ui/menu3d/MenuCamera.gd
@@ -0,0 +1,11 @@
+extends Camera
+
+var yaw = 0
+var pitch = 0
+
+func _input(event):
+ if Rhythia.cam_unlock and !Rhythia.replaying:
+ if (event is InputEventMouseMotion) or (event is InputEventScreenDrag):
+ yaw = fmod(yaw - event.relative.x * Rhythia.sensitivity * 0.2, 360)
+ pitch = max(min(pitch - event.relative.y * Rhythia.sensitivity * 0.2, 89), -89)
+ rotation = Vector3(deg2rad(pitch), deg2rad(yaw), 0)
diff --git a/scripts/ui/menu3d/Music.gd b/scripts/ui/menu3d/Music.gd
new file mode 100644
index 00000000..99a08588
--- /dev/null
+++ b/scripts/ui/menu3d/Music.gd
@@ -0,0 +1,51 @@
+extends Node
+
+var transition_time:float = 0.6
+
+var strings_target:bool = false
+var piano_target:bool = false
+var phaser_target:bool = false
+var drums_target:bool = false
+
+var strings_v:float = 0
+var piano_v:float = 0
+var phaser_v:float = 0
+var drums_v:float = 0
+
+var hv:float = 0 # highest value, for fade-out checks
+
+func change(strings:bool,piano:bool,phaser:bool,drums:bool):
+ strings_target = strings
+ piano_target = piano
+ phaser_target = phaser
+ drums_target = drums
+
+ if (strings_v + piano_v + phaser_v + drums_v) == 0:
+ $Strings.play()
+# strings_v = float(strings)
+ $Piano.play()
+# piano_v = float(piano)
+ $Phaser.play()
+# phaser_v = float(phaser)
+ $Drums.play()
+# drums_v = float(drums)
+
+func m(x:float,v:bool):
+ if v: return x
+ else: return -x
+
+func _process(delta:float):
+ var c:float = delta / transition_time
+ var bfm:float = 1.0 - get_parent().black_fade
+
+ strings_v = clamp(strings_v + m(c,strings_target),0,1)
+ piano_v = clamp(piano_v + m(c,piano_target),0,1)
+ phaser_v = clamp(phaser_v + m(c,phaser_target),0,1)
+ drums_v = clamp(drums_v + m(c,drums_target),0,1)
+
+ $Strings.volume_db = linear2db(strings_v * bfm)
+ $Piano.volume_db = linear2db(piano_v * bfm)
+ $Phaser.volume_db = linear2db(phaser_v * bfm)
+ $Drums.volume_db = linear2db(drums_v * bfm)
+
+ hv = max(max(strings_v,piano_v),max(phaser_v,drums_v))
diff --git a/scripts/ui/menu3d/PointerTrail.gd b/scripts/ui/menu3d/PointerTrail.gd
new file mode 100644
index 00000000..05b2ffe3
--- /dev/null
+++ b/scripts/ui/menu3d/PointerTrail.gd
@@ -0,0 +1,82 @@
+extends Spatial
+
+signal cache_me
+
+var started:bool = false
+var t:float = 0
+
+onready var cursor = get_node("../Pointer")
+onready var cursormesh = get_node("../Pointer")
+
+var last_origin = Vector3(-100,0,0)
+var before
+var can_reuse:bool = false
+var transp_multi = 1
+
+var smart:bool = false
+
+func respawn(t_override=null):
+ if t_override:
+ visible = true
+ global_transform.origin = t_override
+ else:
+ visible = (cursor.global_transform.origin - Vector3(0,0,0.001)) != last_origin
+ global_transform.origin = cursor.global_transform.origin - Vector3(0,0,0.001)
+
+ self.get("material/0").albedo_color = cursormesh.mesh.surface_get_material(0).albedo_color
+ rotation = cursormesh.rotation
+
+func upd_dumb(delta):
+ t += (delta/Rhythia.trail_time)
+
+ var a = clamp((t - 0.2),0,1)
+ if Rhythia.trail_mode_opacity:
+ get("material/0").albedo_color.a = a * 0.6 * transp_multi
+ if Rhythia.trail_mode_scale:
+ scale = Vector3(a*Rhythia.cursor_scale,a*Rhythia.cursor_scale,a*Rhythia.cursor_scale)
+ if t >= 1:
+ started = false
+ visible = false
+ emit_signal("cache_me")
+
+func update(delta):
+ t -= (delta/Rhythia.trail_time)
+ var a = clamp((t),0,1)
+ if Rhythia.trail_mode_opacity:
+ self.get("material/0").albedo_color.a = a * 0.6 * transp_multi
+ if Rhythia.trail_mode_scale:
+ scale = Vector3(a*Rhythia.cursor_scale,a*Rhythia.cursor_scale,a*Rhythia.cursor_scale)
+ if t <= 0:
+ started = false
+ visible = false
+ emit_signal("cache_me")
+
+func _process(delta):
+ if started:
+ if smart: update(delta)
+ else: upd_dumb(delta)
+
+var init_done:bool = false
+func init():
+ smart = false
+ scale = Vector3(0,1,0)
+ if not Rhythia.trail_mode_scale:
+ scale = Vector3(Rhythia.cursor_scale,Rhythia.cursor_scale,Rhythia.cursor_scale)
+
+ if init_done: return
+ init_done = true
+ var mat:SpatialMaterial = self.get("material/0").duplicate()
+ self.set("material/0",mat)
+
+func start(v:float):
+ init()
+ t = v
+ started = true
+
+
+func start_smart(v:float,pos:Vector3):
+ init()
+ smart = true
+ started = true
+ t = 1 - v
+ respawn(pos)
diff --git a/scripts/ui/menu3d/init3d.gd b/scripts/ui/menu3d/init3d.gd
new file mode 100644
index 00000000..b7535168
--- /dev/null
+++ b/scripts/ui/menu3d/init3d.gd
@@ -0,0 +1,42 @@
+extends Node
+
+func _ready():
+ set_process(false)
+ get_tree().paused = false
+
+ # fix audio pitchshifts
+ if AudioServer.get_bus_effect_count(AudioServer.get_bus_index("Music")) > 0:
+ AudioServer.remove_bus_effect(AudioServer.get_bus_index("Music"),0)
+
+ $BlackFade.visible = true
+ $BlackFade.color = Color(0,0,0,black_fade)
+
+ self.call_deferred("_begin")
+ # We defer this because, on startup, Globals will invoke the do_init function
+ # and we want to make sure we give it a chance to set init_running
+
+func _begin():
+# active = true
+ set_process(true)
+ $Controls.set_process(true)
+ if Rhythia.init_running:
+ print("Init is running, listening for init stage events.")
+ $GameInit.activate(1) # MODE_MIDINIT
+ elif Rhythia.is_init:
+ print("Init is requested, calling do_init and listening for stage events.")
+ $GameInit.activate(0) # MODE_STARTINIT
+ else:
+ print("Init is not running or requested, proceeding to the main menu.")
+ $GameInit.activate(2) # MODE_MENU
+
+var black_fade_target:bool = false
+var black_fade:float = 1
+
+func _process(delta):
+ if black_fade_target && black_fade != 1:
+ black_fade = min(black_fade + (delta/0.6),1)
+ $BlackFade.color = Color(0,0,0,black_fade)
+ elif !black_fade_target && black_fade != 0:
+ black_fade = max(black_fade - (delta/0.5),0)
+ $BlackFade.color = Color(0,0,0,black_fade)
+ $BlackFade.visible = (black_fade != 0)
diff --git a/scripts/ui/settings/ArchiveConvert.gd b/scripts/ui/settings/ArchiveConvert.gd
index e7d343ab..2665f2a3 100644
--- a/scripts/ui/settings/ArchiveConvert.gd
+++ b/scripts/ui/settings/ArchiveConvert.gd
@@ -10,7 +10,7 @@ func _pressed():
OS.shell_open(ProjectSettings.globalize_path(Globals.p("user://packs")))
elif confirm:
Rhythia.do_archive_convert = true
- get_tree().change_scene("res://scenes/init.tscn")
+ get_tree().change_scene("res://scenes/init3d.tscn")
else:
confirm = true
text = "8 GB space required. Continue?"
diff --git a/scripts/ui/settings/Profiles.gd b/scripts/ui/settings/Profiles.gd
index e82041fb..25e3e16a 100644
--- a/scripts/ui/settings/Profiles.gd
+++ b/scripts/ui/settings/Profiles.gd
@@ -55,7 +55,7 @@ func on_pressed(i):
# Rhythia.is_switch_profile = true
get_viewport().get_node("Menu").black_fade_target = true
yield(get_tree().create_timer(0.35),"timeout")
- get_tree().change_scene("res://scenes/init.tscn")
+ get_tree().change_scene("res://scenes/init3d.tscn")
Rhythia.load_saved_settings(profile)
Rhythia.save_settings()
diff --git a/scripts/ui/settings/ReloadContent.gd b/scripts/ui/settings/ReloadContent.gd
index 683bb865..459625dd 100644
--- a/scripts/ui/settings/ReloadContent.gd
+++ b/scripts/ui/settings/ReloadContent.gd
@@ -19,6 +19,6 @@ func _pressed():
get_viewport().get_node("Menu").black_fade_target = true
yield(get_tree().create_timer(0.35),"timeout")
Rhythia.is_init = true
- get_tree().change_scene("res://scenes/init.tscn")
+ get_tree().change_scene("res://scenes/init3d.tscn")
else:
Globals.confirm_prompt.s_back.play()
diff --git a/uitheme.tres b/uitheme.tres
index 7e2302bd..e0fe1feb 100644
--- a/uitheme.tres
+++ b/uitheme.tres
@@ -1,8 +1,9 @@
-[gd_resource type="Theme" load_steps=23 format=2]
+[gd_resource type="Theme" load_steps=25 format=2]
[ext_resource path="res://assets/font/Lato/Lato-Regular.ttf" type="DynamicFontData" id=1]
[ext_resource path="res://assets/font/Noto_Sans_JP/NotoSansJP-Medium.otf" type="DynamicFontData" id=2]
[ext_resource path="res://assets/font/NotoColorEmoji.ttf" type="DynamicFontData" id=3]
+[ext_resource path="res://assets/font/NotoSansMono/NotoSansMono-Medium.ttf" type="DynamicFontData" id=4]
[sub_resource type="DynamicFont" id=17]
use_filter = true
@@ -48,6 +49,12 @@ corner_radius_top_right = 6
corner_radius_bottom_right = 6
corner_radius_bottom_left = 6
+[sub_resource type="DynamicFont" id=20]
+size = 14
+font_data = ExtResource( 4 )
+fallback/0 = ExtResource( 2 )
+fallback/1 = ExtResource( 3 )
+
[sub_resource type="StyleBoxFlat" id=5]
bg_color = Color( 0.87451, 0.87451, 0.87451, 1 )
draw_center = false
@@ -251,6 +258,8 @@ ColorPickerButton/styles/focus = null
ColorPickerButton/styles/hover = null
ColorPickerButton/styles/normal = null
ColorPickerButton/styles/pressed = null
+DevMenuMonoLabel/base_type = "Label"
+DevMenuMonoLabel/fonts/font = SubResource( 20 )
Dialogs/constants/button_margin = 32
Dialogs/constants/margin = 8
FileDialog/colors/file_icon_modulate = Color( 1, 1, 1, 1 )