diff --git a/Audio/songMaps/Song1.tres b/Audio/songMaps/BossBlood.tres
similarity index 50%
rename from Audio/songMaps/Song1.tres
rename to Audio/songMaps/BossBlood.tres
index 7e95ae2e..95693782 100644
--- a/Audio/songMaps/Song1.tres
+++ b/Audio/songMaps/BossBlood.tres
@@ -1,251 +1,255 @@
-[gd_resource type="Resource" load_steps=51 format=3]
+[gd_resource type="Resource" load_steps=51 format=3 uid="uid://iumt7xjdgn6x"]
-[ext_resource type="Script" path="res://Classes/MidiMaestro/NoteInfo.cs" id="1_5ry1j"]
-[ext_resource type="Script" path="res://Classes/MidiMaestro/NoteChart.cs" id="2_gbqfw"]
+[ext_resource type="Script" uid="uid://bhbpcmtr6e6pk" path="res://Classes/MidiMaestro/NoteInfo.cs" id="1_mc06a"]
+[ext_resource type="Script" uid="uid://bnpnavb5lwobj" path="res://Classes/MidiMaestro/NoteChart.cs" id="2_uhxkd"]
[sub_resource type="Resource" id="Resource_h1ijp"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 9.0
Length = 0.0
[sub_resource type="Resource" id="Resource_ysbfa"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 25.0
Length = 0.0
[sub_resource type="Resource" id="Resource_j4c1l"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 49.0
Length = 0.0
[sub_resource type="Resource" id="Resource_lktv3"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 53.0
Length = 0.0
[sub_resource type="Resource" id="Resource_b0kfm"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 57.0
Length = 0.0
[sub_resource type="Resource" id="Resource_xbckj"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 34.0
Length = 0.0
[sub_resource type="Resource" id="Resource_gs0vr"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 43.0
Length = 0.0
[sub_resource type="Resource" id="Resource_4ygvu"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 44.0
Length = 0.0
[sub_resource type="Resource" id="Resource_efsyh"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 17.0
Length = 0.0
[sub_resource type="Resource" id="Resource_mf3c7"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 5.0
Length = 0.0
[sub_resource type="Resource" id="Resource_f15o4"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 13.0
Length = 0.0
[sub_resource type="Resource" id="Resource_hsn40"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 29.0
Length = 0.0
[sub_resource type="Resource" id="Resource_fdk4c"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 33.0
Length = 0.0
[sub_resource type="Resource" id="Resource_1aoo3"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 37.0
Length = 0.0
[sub_resource type="Resource" id="Resource_wlcjv"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 41.0
Length = 0.0
[sub_resource type="Resource" id="Resource_i1n24"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 45.0
Length = 0.0
[sub_resource type="Resource" id="Resource_2jtmb"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 57.0
Length = 0.0
[sub_resource type="Resource" id="Resource_qx4ac"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 50.0
Length = 0.0
[sub_resource type="Resource" id="Resource_csfw3"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 59.0
Length = 0.0
[sub_resource type="Resource" id="Resource_l3uo1"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 32.0
Length = 0.0
[sub_resource type="Resource" id="Resource_erw8g"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 44.0
Length = 0.0
[sub_resource type="Resource" id="Resource_alq0l"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 36.0
Length = 0.0
[sub_resource type="Resource" id="Resource_rkc43"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 4.0
Length = 0.0
[sub_resource type="Resource" id="Resource_tudf6"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 8.0
Length = 0.0
[sub_resource type="Resource" id="Resource_tlvlu"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 12.0
Length = 0.0
[sub_resource type="Resource" id="Resource_p167p"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 16.0
Length = 0.0
[sub_resource type="Resource" id="Resource_dc6jo"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 20.0
Length = 0.0
[sub_resource type="Resource" id="Resource_w3cuf"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 24.0
Length = 0.0
[sub_resource type="Resource" id="Resource_vjysj"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 28.0
Length = 0.0
[sub_resource type="Resource" id="Resource_aqpy1"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 40.0
Length = 0.0
[sub_resource type="Resource" id="Resource_ctve7"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 48.0
Length = 0.0
[sub_resource type="Resource" id="Resource_nl7kj"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 56.0
Length = 0.0
[sub_resource type="Resource" id="Resource_ogyoe"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 60.0
Length = 0.0
[sub_resource type="Resource" id="Resource_q33e3"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 61.0
Length = 0.0
[sub_resource type="Resource" id="Resource_vqw4k"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 52.0
Length = 0.0
[sub_resource type="Resource" id="Resource_s8jc0"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 33.0
Length = 0.0
[sub_resource type="Resource" id="Resource_fjllr"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 36.0
Length = 0.0
[sub_resource type="Resource" id="Resource_y2wfd"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 17.0
Length = 0.0
[sub_resource type="Resource" id="Resource_cb61k"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 41.0
Length = 0.0
[sub_resource type="Resource" id="Resource_hbkgo"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 49.0
Length = 0.0
[sub_resource type="Resource" id="Resource_80wib"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 35.0
Length = 0.0
[sub_resource type="Resource" id="Resource_jsm3m"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 50.0
Length = 0.0
[sub_resource type="Resource" id="Resource_ryg8k"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 51.0
Length = 0.0
[sub_resource type="Resource" id="Resource_gj6xo"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 58.0
Length = 0.0
[sub_resource type="Resource" id="Resource_112dg"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 59.0
Length = 0.0
[sub_resource type="Resource" id="Resource_eguul"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 42.0
Length = 0.0
[sub_resource type="Resource" id="Resource_tdy7a"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 21.0
Length = 0.0
[sub_resource type="Resource" id="Resource_d7de0"]
-script = ExtResource("1_5ry1j")
+script = ExtResource("1_mc06a")
Beat = 26.0
Length = 0.0
[resource]
-script = ExtResource("2_gbqfw")
-UpLaneData = [SubResource("Resource_fjllr"), SubResource("Resource_y2wfd"), SubResource("Resource_cb61k"), SubResource("Resource_hbkgo"), SubResource("Resource_80wib"), SubResource("Resource_jsm3m"), SubResource("Resource_ryg8k"), SubResource("Resource_gj6xo"), SubResource("Resource_112dg"), SubResource("Resource_eguul"), SubResource("Resource_tdy7a"), SubResource("Resource_d7de0")]
-DownLaneData = [SubResource("Resource_h1ijp"), SubResource("Resource_ysbfa"), SubResource("Resource_j4c1l"), SubResource("Resource_lktv3"), SubResource("Resource_b0kfm"), SubResource("Resource_xbckj"), SubResource("Resource_gs0vr"), SubResource("Resource_4ygvu"), SubResource("Resource_efsyh")]
-LeftLaneData = [SubResource("Resource_mf3c7"), SubResource("Resource_f15o4"), SubResource("Resource_hsn40"), SubResource("Resource_fdk4c"), SubResource("Resource_1aoo3"), SubResource("Resource_wlcjv"), SubResource("Resource_i1n24"), SubResource("Resource_2jtmb"), SubResource("Resource_qx4ac"), SubResource("Resource_csfw3")]
-RightLaneData = [SubResource("Resource_l3uo1"), SubResource("Resource_erw8g"), SubResource("Resource_alq0l"), SubResource("Resource_rkc43"), SubResource("Resource_tudf6"), SubResource("Resource_tlvlu"), SubResource("Resource_p167p"), SubResource("Resource_dc6jo"), SubResource("Resource_w3cuf"), SubResource("Resource_vjysj"), SubResource("Resource_aqpy1"), SubResource("Resource_ctve7"), SubResource("Resource_nl7kj"), SubResource("Resource_ogyoe"), SubResource("Resource_q33e3"), SubResource("Resource_vqw4k"), SubResource("Resource_s8jc0")]
+script = ExtResource("2_uhxkd")
+Bpm = 120
+NumLoops = 5
+SongSpeed = -1.0
+SongMapLocation = "Song1.ogg"
+UpLaneData = Array[ExtResource("1_mc06a")]([SubResource("Resource_fjllr"), SubResource("Resource_y2wfd"), SubResource("Resource_cb61k"), SubResource("Resource_hbkgo"), SubResource("Resource_80wib"), SubResource("Resource_jsm3m"), SubResource("Resource_ryg8k"), SubResource("Resource_gj6xo"), SubResource("Resource_112dg"), SubResource("Resource_eguul"), SubResource("Resource_tdy7a"), SubResource("Resource_d7de0")])
+DownLaneData = Array[ExtResource("1_mc06a")]([SubResource("Resource_h1ijp"), SubResource("Resource_ysbfa"), SubResource("Resource_j4c1l"), SubResource("Resource_lktv3"), SubResource("Resource_b0kfm"), SubResource("Resource_xbckj"), SubResource("Resource_gs0vr"), SubResource("Resource_4ygvu"), SubResource("Resource_efsyh")])
+LeftLaneData = Array[ExtResource("1_mc06a")]([SubResource("Resource_mf3c7"), SubResource("Resource_f15o4"), SubResource("Resource_hsn40"), SubResource("Resource_fdk4c"), SubResource("Resource_1aoo3"), SubResource("Resource_wlcjv"), SubResource("Resource_i1n24"), SubResource("Resource_2jtmb"), SubResource("Resource_qx4ac"), SubResource("Resource_csfw3")])
+RightLaneData = Array[ExtResource("1_mc06a")]([SubResource("Resource_l3uo1"), SubResource("Resource_erw8g"), SubResource("Resource_alq0l"), SubResource("Resource_rkc43"), SubResource("Resource_tudf6"), SubResource("Resource_tlvlu"), SubResource("Resource_p167p"), SubResource("Resource_dc6jo"), SubResource("Resource_w3cuf"), SubResource("Resource_vjysj"), SubResource("Resource_aqpy1"), SubResource("Resource_ctve7"), SubResource("Resource_nl7kj"), SubResource("Resource_ogyoe"), SubResource("Resource_q33e3"), SubResource("Resource_vqw4k"), SubResource("Resource_s8jc0")])
diff --git a/Audio/songMaps/CyberFoxSong.tres b/Audio/songMaps/CyberFoxSong.tres
index 27df1cea..fa88c568 100644
--- a/Audio/songMaps/CyberFoxSong.tres
+++ b/Audio/songMaps/CyberFoxSong.tres
@@ -1,7 +1,7 @@
-[gd_resource type="Resource" load_steps=25 format=3]
+[gd_resource type="Resource" load_steps=25 format=3 uid="uid://xhi8r70ht3dp"]
-[ext_resource type="Script" path="res://Classes/MidiMaestro/NoteInfo.cs" id="1_8ueh4"]
-[ext_resource type="Script" path="res://Classes/MidiMaestro/NoteChart.cs" id="2_s63u8"]
+[ext_resource type="Script" uid="uid://bhbpcmtr6e6pk" path="res://Classes/MidiMaestro/NoteInfo.cs" id="1_8ueh4"]
+[ext_resource type="Script" uid="uid://bnpnavb5lwobj" path="res://Classes/MidiMaestro/NoteChart.cs" id="2_s63u8"]
[sub_resource type="Resource" id="Resource_ljr32"]
script = ExtResource("1_8ueh4")
@@ -115,7 +115,11 @@ Length = 0.0
[resource]
script = ExtResource("2_s63u8")
-UpLaneData = Array[ExtResource("1_8ueh4")]([SubResource("Resource_50tbs"), SubResource("Resource_ttd2q"), SubResource("Resource_nnlde"), SubResource("Resource_rwedv"), SubResource("Resource_3eydr"), SubResource("Resource_83big")])
-DownLaneData = Array[ExtResource("1_8ueh4")]([SubResource("Resource_ljr32"), SubResource("Resource_bb3yp"), SubResource("Resource_852ml"), SubResource("Resource_38nu8"), SubResource("Resource_ct6sp"), SubResource("Resource_8ueh4"), SubResource("Resource_7lpnw")])
-LeftLaneData = Array[ExtResource("1_8ueh4")]([SubResource("Resource_yk705"), SubResource("Resource_oocdv"), SubResource("Resource_uswjw"), SubResource("Resource_e1hbr")])
-RightLaneData = Array[ExtResource("1_8ueh4")]([SubResource("Resource_gryrv"), SubResource("Resource_kwtfb"), SubResource("Resource_c2bxv"), SubResource("Resource_s63u8"), SubResource("Resource_lrc4j")])
+Bpm = 180
+NumLoops = 1
+SongSpeed = -1.0
+SongMapLocation = "CyberFoxSong.ogg"
+UpLaneData = [SubResource("Resource_50tbs"), SubResource("Resource_ttd2q"), SubResource("Resource_nnlde"), SubResource("Resource_rwedv"), SubResource("Resource_3eydr"), SubResource("Resource_83big")]
+DownLaneData = [SubResource("Resource_ljr32"), SubResource("Resource_bb3yp"), SubResource("Resource_852ml"), SubResource("Resource_38nu8"), SubResource("Resource_ct6sp"), SubResource("Resource_8ueh4"), SubResource("Resource_7lpnw")]
+LeftLaneData = [SubResource("Resource_yk705"), SubResource("Resource_oocdv"), SubResource("Resource_uswjw"), SubResource("Resource_e1hbr")]
+RightLaneData = [SubResource("Resource_gryrv"), SubResource("Resource_kwtfb"), SubResource("Resource_c2bxv"), SubResource("Resource_s63u8"), SubResource("Resource_lrc4j")]
diff --git a/Audio/songMaps/EcholaneSong.tres b/Audio/songMaps/EcholaneSong.tres
index 3713f118..aac69093 100644
--- a/Audio/songMaps/EcholaneSong.tres
+++ b/Audio/songMaps/EcholaneSong.tres
@@ -1,7 +1,7 @@
-[gd_resource type="Resource" load_steps=46 format=3]
+[gd_resource type="Resource" load_steps=46 format=3 uid="uid://2oiuwngh6w4p"]
-[ext_resource type="Script" path="res://Classes/MidiMaestro/NoteInfo.cs" id="1_vkj58"]
-[ext_resource type="Script" path="res://Classes/MidiMaestro/NoteChart.cs" id="2_ulihw"]
+[ext_resource type="Script" uid="uid://bhbpcmtr6e6pk" path="res://Classes/MidiMaestro/NoteInfo.cs" id="1_vkj58"]
+[ext_resource type="Script" uid="uid://bnpnavb5lwobj" path="res://Classes/MidiMaestro/NoteChart.cs" id="2_ulihw"]
[sub_resource type="Resource" id="Resource_vkj58"]
script = ExtResource("1_vkj58")
@@ -220,7 +220,11 @@ Length = 0.0
[resource]
script = ExtResource("2_ulihw")
-UpLaneData = Array[ExtResource("1_vkj58")]([SubResource("Resource_3lcfd"), SubResource("Resource_b1quw"), SubResource("Resource_lq0og"), SubResource("Resource_56y1a"), SubResource("Resource_jljr5"), SubResource("Resource_bxx88"), SubResource("Resource_bdoqu"), SubResource("Resource_cr07w")])
-DownLaneData = Array[ExtResource("1_vkj58")]([SubResource("Resource_vkj58"), SubResource("Resource_ulihw"), SubResource("Resource_t8863"), SubResource("Resource_6g1by"), SubResource("Resource_m02wy"), SubResource("Resource_t1nlw"), SubResource("Resource_iknre"), SubResource("Resource_icwn4"), SubResource("Resource_vkj1q"), SubResource("Resource_g5inb")])
-LeftLaneData = Array[ExtResource("1_vkj58")]([SubResource("Resource_7jmhk"), SubResource("Resource_plxvd"), SubResource("Resource_jva8p"), SubResource("Resource_pref2"), SubResource("Resource_3tvlw"), SubResource("Resource_iq4by"), SubResource("Resource_rekwa"), SubResource("Resource_xbnbk"), SubResource("Resource_byp8i"), SubResource("Resource_dime5")])
-RightLaneData = Array[ExtResource("1_vkj58")]([SubResource("Resource_dnuvc"), SubResource("Resource_n5nx3"), SubResource("Resource_y8tsg"), SubResource("Resource_msofk"), SubResource("Resource_8qmnl"), SubResource("Resource_w7vp2"), SubResource("Resource_kvr5u"), SubResource("Resource_6jc5o"), SubResource("Resource_14q1d"), SubResource("Resource_vixxy"), SubResource("Resource_ktvox"), SubResource("Resource_4vybl"), SubResource("Resource_hclfl"), SubResource("Resource_bmq0x"), SubResource("Resource_6hjh7")])
+Bpm = 120
+NumLoops = 4
+SongSpeed = -1.0
+SongMapLocation = "EcholaneSong.ogg"
+UpLaneData = [SubResource("Resource_3lcfd"), SubResource("Resource_b1quw"), SubResource("Resource_lq0og"), SubResource("Resource_56y1a"), SubResource("Resource_jljr5"), SubResource("Resource_bxx88"), SubResource("Resource_bdoqu"), SubResource("Resource_cr07w")]
+DownLaneData = [SubResource("Resource_vkj58"), SubResource("Resource_ulihw"), SubResource("Resource_t8863"), SubResource("Resource_6g1by"), SubResource("Resource_m02wy"), SubResource("Resource_t1nlw"), SubResource("Resource_iknre"), SubResource("Resource_icwn4"), SubResource("Resource_vkj1q"), SubResource("Resource_g5inb")]
+LeftLaneData = [SubResource("Resource_7jmhk"), SubResource("Resource_plxvd"), SubResource("Resource_jva8p"), SubResource("Resource_pref2"), SubResource("Resource_3tvlw"), SubResource("Resource_iq4by"), SubResource("Resource_rekwa"), SubResource("Resource_xbnbk"), SubResource("Resource_byp8i"), SubResource("Resource_dime5")]
+RightLaneData = [SubResource("Resource_dnuvc"), SubResource("Resource_n5nx3"), SubResource("Resource_y8tsg"), SubResource("Resource_msofk"), SubResource("Resource_8qmnl"), SubResource("Resource_w7vp2"), SubResource("Resource_kvr5u"), SubResource("Resource_6jc5o"), SubResource("Resource_14q1d"), SubResource("Resource_vixxy"), SubResource("Resource_ktvox"), SubResource("Resource_4vybl"), SubResource("Resource_hclfl"), SubResource("Resource_bmq0x"), SubResource("Resource_6hjh7")]
diff --git a/Audio/songMaps/FrostWaltz.tres b/Audio/songMaps/FrostWaltz.tres
index 6562d14b..e604c168 100644
--- a/Audio/songMaps/FrostWaltz.tres
+++ b/Audio/songMaps/FrostWaltz.tres
@@ -95,7 +95,11 @@ Length = 0.0
[resource]
script = ExtResource("2_ipsne")
-UpLaneData = Array[ExtResource("1_8s5n5")]([SubResource("Resource_ffi45"), SubResource("Resource_3tfr0"), SubResource("Resource_ipsne")])
-DownLaneData = Array[ExtResource("1_8s5n5")]([SubResource("Resource_dwqep"), SubResource("Resource_ukqut"), SubResource("Resource_x1mw3"), SubResource("Resource_54umo"), SubResource("Resource_o0hqd"), SubResource("Resource_8s5n5"), SubResource("Resource_bsuy3")])
-LeftLaneData = Array[ExtResource("1_8s5n5")]([SubResource("Resource_828xi"), SubResource("Resource_gfy4r"), SubResource("Resource_716y2"), SubResource("Resource_6sju3"), SubResource("Resource_h8r3u")])
-RightLaneData = Array[ExtResource("1_8s5n5")]([SubResource("Resource_3skly"), SubResource("Resource_fe74b"), SubResource("Resource_1d04x")])
+Bpm = 99
+NumLoops = 5
+SongSpeed = -1.0
+SongMapLocation = "FrostWaltz.ogg"
+UpLaneData = [SubResource("Resource_ffi45"), SubResource("Resource_3tfr0"), SubResource("Resource_ipsne")]
+DownLaneData = [SubResource("Resource_dwqep"), SubResource("Resource_ukqut"), SubResource("Resource_x1mw3"), SubResource("Resource_54umo"), SubResource("Resource_o0hqd"), SubResource("Resource_8s5n5"), SubResource("Resource_bsuy3")]
+LeftLaneData = [SubResource("Resource_828xi"), SubResource("Resource_gfy4r"), SubResource("Resource_716y2"), SubResource("Resource_6sju3"), SubResource("Resource_h8r3u")]
+RightLaneData = [SubResource("Resource_3skly"), SubResource("Resource_fe74b"), SubResource("Resource_1d04x")]
diff --git a/Audio/songMaps/Song3.tres b/Audio/songMaps/GWS.tres
similarity index 73%
rename from Audio/songMaps/Song3.tres
rename to Audio/songMaps/GWS.tres
index c8e3c520..e670a6ee 100644
--- a/Audio/songMaps/Song3.tres
+++ b/Audio/songMaps/GWS.tres
@@ -1,295 +1,299 @@
-[gd_resource type="Resource" load_steps=60 format=3]
+[gd_resource type="Resource" load_steps=60 format=3 uid="uid://cnxhv0busahh0"]
-[ext_resource type="Script" path="res://Classes/MidiMaestro/NoteInfo.cs" id="1_7kndb"]
-[ext_resource type="Script" path="res://Classes/MidiMaestro/NoteChart.cs" id="2_xg88o"]
+[ext_resource type="Script" uid="uid://bhbpcmtr6e6pk" path="res://Classes/MidiMaestro/NoteInfo.cs" id="1_6fik5"]
+[ext_resource type="Script" uid="uid://bnpnavb5lwobj" path="res://Classes/MidiMaestro/NoteChart.cs" id="2_4vdmh"]
[sub_resource type="Resource" id="Resource_11qbm"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 17.0
Length = 0.0
[sub_resource type="Resource" id="Resource_hrrtc"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 20.0
Length = 0.0
[sub_resource type="Resource" id="Resource_rmog3"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 22.0
Length = 0.0
[sub_resource type="Resource" id="Resource_tnqsp"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 25.0
Length = 0.0
[sub_resource type="Resource" id="Resource_fldsc"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 38.0
Length = 0.0
[sub_resource type="Resource" id="Resource_ntp27"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 35.0
Length = 0.0
[sub_resource type="Resource" id="Resource_7nmxt"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 49.0
Length = 0.0
[sub_resource type="Resource" id="Resource_47jch"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 57.0
Length = 0.0
[sub_resource type="Resource" id="Resource_kp5f0"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 41.0
Length = 0.0
[sub_resource type="Resource" id="Resource_v8s33"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 52.0
Length = 0.0
[sub_resource type="Resource" id="Resource_hrafv"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 61.0
Length = 0.0
[sub_resource type="Resource" id="Resource_d50tw"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 4.0
Length = 0.0
[sub_resource type="Resource" id="Resource_a8amf"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 44.0
Length = 0.0
[sub_resource type="Resource" id="Resource_mbtm7"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 12.0
Length = 0.0
[sub_resource type="Resource" id="Resource_ynh6c"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 28.0
Length = 0.0
[sub_resource type="Resource" id="Resource_marsf"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 33.0
Length = 0.0
[sub_resource type="Resource" id="Resource_wkvcn"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 18.0
Length = 0.0
[sub_resource type="Resource" id="Resource_woki6"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 21.0
Length = 0.0
[sub_resource type="Resource" id="Resource_gm3ao"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 24.0
Length = 0.0
[sub_resource type="Resource" id="Resource_1qfq5"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 56.0
Length = 0.0
[sub_resource type="Resource" id="Resource_ywfrj"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 60.0
Length = 0.0
[sub_resource type="Resource" id="Resource_rxusk"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 8.0
Length = 0.0
[sub_resource type="Resource" id="Resource_r88cj"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 36.0
Length = 0.0
[sub_resource type="Resource" id="Resource_5e2go"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 50.0
Length = 0.0
[sub_resource type="Resource" id="Resource_s083v"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 40.0
Length = 0.0
[sub_resource type="Resource" id="Resource_jc0cy"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 52.0
Length = 0.0
[sub_resource type="Resource" id="Resource_3oete"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 61.0
Length = 0.0
[sub_resource type="Resource" id="Resource_b24fs"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 5.0
Length = 0.0
[sub_resource type="Resource" id="Resource_45x0b"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 33.0
Length = 0.0
[sub_resource type="Resource" id="Resource_x70wl"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 45.0
Length = 0.0
[sub_resource type="Resource" id="Resource_6e30o"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 29.0
Length = 0.0
[sub_resource type="Resource" id="Resource_8l6ei"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 32.0
Length = 0.0
[sub_resource type="Resource" id="Resource_31o0y"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 16.0
Length = 0.0
[sub_resource type="Resource" id="Resource_2wwc7"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 56.0
Length = 0.0
[sub_resource type="Resource" id="Resource_m5e6q"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 24.0
Length = 0.0
[sub_resource type="Resource" id="Resource_v8sin"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 38.0
Length = 0.0
[sub_resource type="Resource" id="Resource_ykqor"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 48.0
Length = 0.0
[sub_resource type="Resource" id="Resource_cbmdd"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 34.0
Length = 0.0
[sub_resource type="Resource" id="Resource_ak0tp"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 40.0
Length = 0.0
[sub_resource type="Resource" id="Resource_pd2wi"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 53.0
Length = 0.0
[sub_resource type="Resource" id="Resource_11m2d"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 3.0
Length = 0.0
[sub_resource type="Resource" id="Resource_7totf"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 8.0
Length = 0.0
[sub_resource type="Resource" id="Resource_ob06q"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 45.0
Length = 0.0
[sub_resource type="Resource" id="Resource_s6r1b"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 29.0
Length = 0.0
[sub_resource type="Resource" id="Resource_3gjtl"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 19.0
Length = 0.0
[sub_resource type="Resource" id="Resource_vdnsu"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 25.0
Length = 0.0
[sub_resource type="Resource" id="Resource_3wyug"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 51.0
Length = 0.0
[sub_resource type="Resource" id="Resource_6kji1"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 60.0
Length = 0.0
[sub_resource type="Resource" id="Resource_w6jqv"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 54.0
Length = 0.0
[sub_resource type="Resource" id="Resource_083mg"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 37.0
Length = 0.0
[sub_resource type="Resource" id="Resource_dsf4k"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 57.0
Length = 0.0
[sub_resource type="Resource" id="Resource_2woca"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 41.0
Length = 0.0
[sub_resource type="Resource" id="Resource_jsj5h"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 6.0
Length = 0.0
[sub_resource type="Resource" id="Resource_qoqm3"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 32.0
Length = 0.0
[sub_resource type="Resource" id="Resource_nob8r"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 44.0
Length = 0.0
[sub_resource type="Resource" id="Resource_a6epf"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 12.0
Length = 0.0
[sub_resource type="Resource" id="Resource_ekjhc"]
-script = ExtResource("1_7kndb")
+script = ExtResource("1_6fik5")
Beat = 28.0
Length = 0.0
[resource]
-script = ExtResource("2_xg88o")
+script = ExtResource("2_4vdmh")
+Bpm = 120
+NumLoops = 1
+SongSpeed = -1.0
+SongMapLocation = "Song3.ogg"
UpLaneData = [SubResource("Resource_3gjtl"), SubResource("Resource_vdnsu"), SubResource("Resource_3wyug"), SubResource("Resource_6kji1"), SubResource("Resource_w6jqv"), SubResource("Resource_083mg"), SubResource("Resource_dsf4k"), SubResource("Resource_2woca"), SubResource("Resource_jsj5h"), SubResource("Resource_qoqm3"), SubResource("Resource_nob8r"), SubResource("Resource_a6epf"), SubResource("Resource_ekjhc")]
DownLaneData = [SubResource("Resource_11qbm"), SubResource("Resource_hrrtc"), SubResource("Resource_rmog3"), SubResource("Resource_tnqsp"), SubResource("Resource_fldsc"), SubResource("Resource_ntp27"), SubResource("Resource_7nmxt"), SubResource("Resource_47jch"), SubResource("Resource_kp5f0"), SubResource("Resource_v8s33"), SubResource("Resource_hrafv"), SubResource("Resource_d50tw"), SubResource("Resource_a8amf"), SubResource("Resource_mbtm7"), SubResource("Resource_ynh6c"), SubResource("Resource_marsf")]
LeftLaneData = [SubResource("Resource_wkvcn"), SubResource("Resource_woki6"), SubResource("Resource_gm3ao"), SubResource("Resource_1qfq5"), SubResource("Resource_ywfrj"), SubResource("Resource_rxusk"), SubResource("Resource_r88cj"), SubResource("Resource_5e2go"), SubResource("Resource_s083v"), SubResource("Resource_jc0cy"), SubResource("Resource_3oete"), SubResource("Resource_b24fs"), SubResource("Resource_45x0b"), SubResource("Resource_x70wl"), SubResource("Resource_6e30o"), SubResource("Resource_8l6ei")]
diff --git a/Audio/songMaps/Gobbler.tres b/Audio/songMaps/Gobbler.tres
index ec3b18b5..9931c118 100644
--- a/Audio/songMaps/Gobbler.tres
+++ b/Audio/songMaps/Gobbler.tres
@@ -1,7 +1,7 @@
-[gd_resource type="Resource" load_steps=45 format=3]
+[gd_resource type="Resource" load_steps=45 format=3 uid="uid://dfs1r7rw8x2fv"]
-[ext_resource type="Script" path="res://Classes/MidiMaestro/NoteInfo.cs" id="1_tuude"]
-[ext_resource type="Script" path="res://Classes/MidiMaestro/NoteChart.cs" id="2_hfiht"]
+[ext_resource type="Script" uid="uid://bhbpcmtr6e6pk" path="res://Classes/MidiMaestro/NoteInfo.cs" id="1_tuude"]
+[ext_resource type="Script" uid="uid://bnpnavb5lwobj" path="res://Classes/MidiMaestro/NoteChart.cs" id="2_hfiht"]
[sub_resource type="Resource" id="Resource_i2qfq"]
script = ExtResource("1_tuude")
@@ -215,7 +215,11 @@ Length = 0.0
[resource]
script = ExtResource("2_hfiht")
-UpLaneData = Array[ExtResource("1_tuude")]([SubResource("Resource_8xjpx"), SubResource("Resource_wsgab"), SubResource("Resource_qwdig"), SubResource("Resource_66kxm"), SubResource("Resource_7ilo7"), SubResource("Resource_a20b3"), SubResource("Resource_pqrtt"), SubResource("Resource_pwr5v"), SubResource("Resource_rt0eg"), SubResource("Resource_8g5uo")])
-DownLaneData = Array[ExtResource("1_tuude")]([SubResource("Resource_i2qfq"), SubResource("Resource_clkmt"), SubResource("Resource_2yhqr"), SubResource("Resource_avloc"), SubResource("Resource_7ipoh"), SubResource("Resource_rc4vs"), SubResource("Resource_hsxfe"), SubResource("Resource_5uul0"), SubResource("Resource_20iwo")])
-LeftLaneData = Array[ExtResource("1_tuude")]([SubResource("Resource_q3mne"), SubResource("Resource_klde2"), SubResource("Resource_6wxhr"), SubResource("Resource_4fyoq"), SubResource("Resource_1hg6d"), SubResource("Resource_6on7t"), SubResource("Resource_eq4ob"), SubResource("Resource_2rtaq"), SubResource("Resource_t5na6")])
-RightLaneData = Array[ExtResource("1_tuude")]([SubResource("Resource_447id"), SubResource("Resource_5hmpv"), SubResource("Resource_xky58"), SubResource("Resource_sxqb5"), SubResource("Resource_ae4y0"), SubResource("Resource_j7a00"), SubResource("Resource_tbgdx"), SubResource("Resource_55ty7"), SubResource("Resource_meqji"), SubResource("Resource_bc4nj"), SubResource("Resource_i1t8w"), SubResource("Resource_qmi4l"), SubResource("Resource_ebk8g"), SubResource("Resource_cj46n")])
+Bpm = 120
+NumLoops = 6
+SongSpeed = -1.0
+SongMapLocation = "Gobbler.ogg"
+UpLaneData = [SubResource("Resource_8xjpx"), SubResource("Resource_wsgab"), SubResource("Resource_qwdig"), SubResource("Resource_66kxm"), SubResource("Resource_7ilo7"), SubResource("Resource_a20b3"), SubResource("Resource_pqrtt"), SubResource("Resource_pwr5v"), SubResource("Resource_rt0eg"), SubResource("Resource_8g5uo")]
+DownLaneData = [SubResource("Resource_i2qfq"), SubResource("Resource_clkmt"), SubResource("Resource_2yhqr"), SubResource("Resource_avloc"), SubResource("Resource_7ipoh"), SubResource("Resource_rc4vs"), SubResource("Resource_hsxfe"), SubResource("Resource_5uul0"), SubResource("Resource_20iwo")]
+LeftLaneData = [SubResource("Resource_q3mne"), SubResource("Resource_klde2"), SubResource("Resource_6wxhr"), SubResource("Resource_4fyoq"), SubResource("Resource_1hg6d"), SubResource("Resource_6on7t"), SubResource("Resource_eq4ob"), SubResource("Resource_2rtaq"), SubResource("Resource_t5na6")]
+RightLaneData = [SubResource("Resource_447id"), SubResource("Resource_5hmpv"), SubResource("Resource_xky58"), SubResource("Resource_sxqb5"), SubResource("Resource_ae4y0"), SubResource("Resource_j7a00"), SubResource("Resource_tbgdx"), SubResource("Resource_55ty7"), SubResource("Resource_meqji"), SubResource("Resource_bc4nj"), SubResource("Resource_i1t8w"), SubResource("Resource_qmi4l"), SubResource("Resource_ebk8g"), SubResource("Resource_cj46n")]
diff --git a/Audio/songMaps/HoloRepeat.tres b/Audio/songMaps/HoloRepeat.tres
index a51e8538..72f2ed94 100644
--- a/Audio/songMaps/HoloRepeat.tres
+++ b/Audio/songMaps/HoloRepeat.tres
@@ -1,7 +1,7 @@
-[gd_resource type="Resource" load_steps=27 format=3]
+[gd_resource type="Resource" load_steps=27 format=3 uid="uid://dh7fdqbs6mwrq"]
-[ext_resource type="Script" path="res://Classes/MidiMaestro/NoteInfo.cs" id="1_y4wy8"]
-[ext_resource type="Script" path="res://Classes/MidiMaestro/NoteChart.cs" id="2_1kkot"]
+[ext_resource type="Script" uid="uid://bhbpcmtr6e6pk" path="res://Classes/MidiMaestro/NoteInfo.cs" id="1_y4wy8"]
+[ext_resource type="Script" uid="uid://bnpnavb5lwobj" path="res://Classes/MidiMaestro/NoteChart.cs" id="2_1kkot"]
[sub_resource type="Resource" id="Resource_wxfu7"]
script = ExtResource("1_y4wy8")
@@ -125,6 +125,10 @@ Length = 0.0
[resource]
script = ExtResource("2_1kkot")
+Bpm = 130
+NumLoops = 1
+SongSpeed = -1.0
+SongMapLocation = "Holo_ThereItIs.ogg"
UpLaneData = [SubResource("Resource_rclq0"), SubResource("Resource_d15sy"), SubResource("Resource_xylpo"), SubResource("Resource_c4e5y"), SubResource("Resource_7lbis"), SubResource("Resource_8usgo")]
DownLaneData = [SubResource("Resource_wxfu7"), SubResource("Resource_cjafy"), SubResource("Resource_jdotv"), SubResource("Resource_per1x"), SubResource("Resource_lw4uc"), SubResource("Resource_nxcmx")]
LeftLaneData = [SubResource("Resource_x0uap"), SubResource("Resource_1m0i6"), SubResource("Resource_1mpgo"), SubResource("Resource_iuho0"), SubResource("Resource_uj1b6"), SubResource("Resource_fi760")]
diff --git a/Audio/songMaps/KeythuluSong.tres b/Audio/songMaps/KeythuluSong.tres
index 3eec9775..4e4f2257 100644
--- a/Audio/songMaps/KeythuluSong.tres
+++ b/Audio/songMaps/KeythuluSong.tres
@@ -1,7 +1,7 @@
-[gd_resource type="Resource" load_steps=43 format=3]
+[gd_resource type="Resource" load_steps=43 format=3 uid="uid://lm4pv832bgt5"]
-[ext_resource type="Script" path="res://Classes/MidiMaestro/NoteInfo.cs" id="1_8ueh4"]
-[ext_resource type="Script" path="res://Classes/MidiMaestro/NoteChart.cs" id="2_s63u8"]
+[ext_resource type="Script" uid="uid://bhbpcmtr6e6pk" path="res://Classes/MidiMaestro/NoteInfo.cs" id="1_8ueh4"]
+[ext_resource type="Script" uid="uid://bnpnavb5lwobj" path="res://Classes/MidiMaestro/NoteChart.cs" id="2_s63u8"]
[sub_resource type="Resource" id="Resource_ljr32"]
script = ExtResource("1_8ueh4")
@@ -205,6 +205,10 @@ Length = 0.0
[resource]
script = ExtResource("2_s63u8")
+Bpm = 170
+NumLoops = 9
+SongSpeed = -1.0
+SongMapLocation = "KeythuluSong.ogg"
UpLaneData = Array[ExtResource("1_8ueh4")]([SubResource("Resource_vkfw6"), SubResource("Resource_5vawl"), SubResource("Resource_wqml3"), SubResource("Resource_knus5"), SubResource("Resource_iyhat"), SubResource("Resource_e231o"), SubResource("Resource_u1ybv"), SubResource("Resource_s63u8"), SubResource("Resource_rwedv")])
DownLaneData = Array[ExtResource("1_8ueh4")]([SubResource("Resource_ljr32"), SubResource("Resource_bb3yp"), SubResource("Resource_852ml"), SubResource("Resource_38nu8"), SubResource("Resource_3eydr"), SubResource("Resource_ct6sp"), SubResource("Resource_yk705"), SubResource("Resource_uswjw"), SubResource("Resource_e1hbr"), SubResource("Resource_8ueh4")])
LeftLaneData = Array[ExtResource("1_8ueh4")]([SubResource("Resource_gryrv"), SubResource("Resource_kwtfb"), SubResource("Resource_c2bxv"), SubResource("Resource_7lpnw"), SubResource("Resource_50tbs"), SubResource("Resource_ttd2q"), SubResource("Resource_nnlde"), SubResource("Resource_lrc4j"), SubResource("Resource_83big"), SubResource("Resource_oocdv")])
diff --git a/Audio/songMaps/Mushroom.tres b/Audio/songMaps/Mushroom.tres
index 76fd946b..7c6ac43d 100644
--- a/Audio/songMaps/Mushroom.tres
+++ b/Audio/songMaps/Mushroom.tres
@@ -75,7 +75,11 @@ Length = 0.0
[resource]
script = ExtResource("2_0c8vj")
-UpLaneData = Array[ExtResource("1_n1l5w")]([SubResource("Resource_ymucf"), SubResource("Resource_bmgju"), SubResource("Resource_sosma"), SubResource("Resource_3retf")])
-DownLaneData = Array[ExtResource("1_n1l5w")]([SubResource("Resource_pprmk"), SubResource("Resource_n1l5w"), SubResource("Resource_0c8vj")])
-LeftLaneData = Array[ExtResource("1_n1l5w")]([SubResource("Resource_4gn2h"), SubResource("Resource_aa728"), SubResource("Resource_olyge"), SubResource("Resource_rjl7u")])
-RightLaneData = Array[ExtResource("1_n1l5w")]([SubResource("Resource_ea4gl"), SubResource("Resource_seepc"), SubResource("Resource_xdem2")])
+Bpm = 100
+NumLoops = 4
+SongSpeed = -1.0
+SongMapLocation = "Mushroom.ogg"
+UpLaneData = [SubResource("Resource_ymucf"), SubResource("Resource_bmgju"), SubResource("Resource_sosma"), SubResource("Resource_3retf")]
+DownLaneData = [SubResource("Resource_pprmk"), SubResource("Resource_n1l5w"), SubResource("Resource_0c8vj")]
+LeftLaneData = [SubResource("Resource_4gn2h"), SubResource("Resource_aa728"), SubResource("Resource_olyge"), SubResource("Resource_rjl7u")]
+RightLaneData = [SubResource("Resource_ea4gl"), SubResource("Resource_seepc"), SubResource("Resource_xdem2")]
diff --git a/Audio/songMaps/ParasiflyDouble.tres b/Audio/songMaps/ParasiflyDouble.tres
new file mode 100644
index 00000000..6a4e498b
--- /dev/null
+++ b/Audio/songMaps/ParasiflyDouble.tres
@@ -0,0 +1,130 @@
+[gd_resource type="Resource" load_steps=26 format=3 uid="uid://vdkolb7ylhcu"]
+
+[ext_resource type="Script" uid="uid://bhbpcmtr6e6pk" path="res://Classes/MidiMaestro/NoteInfo.cs" id="1_2gxac"]
+[ext_resource type="Script" uid="uid://bnpnavb5lwobj" path="res://Classes/MidiMaestro/NoteChart.cs" id="2_p8lx2"]
+
+[sub_resource type="Resource" id="Resource_svc5u"]
+script = ExtResource("1_2gxac")
+Beat = 2.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_ienox"]
+script = ExtResource("1_2gxac")
+Beat = 6.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_ax4q1"]
+script = ExtResource("1_2gxac")
+Beat = 10.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_663rs"]
+script = ExtResource("1_2gxac")
+Beat = 15.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_86xei"]
+script = ExtResource("1_2gxac")
+Beat = 20.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_w3gx2"]
+script = ExtResource("1_2gxac")
+Beat = 12.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_t01kg"]
+script = ExtResource("1_2gxac")
+Beat = 18.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_rnhdg"]
+script = ExtResource("1_2gxac")
+Beat = 8.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_of7dy"]
+script = ExtResource("1_2gxac")
+Beat = 22.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_xq1dl"]
+script = ExtResource("1_2gxac")
+Beat = 11.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_ym0tj"]
+script = ExtResource("1_2gxac")
+Beat = 4.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_1vvgc"]
+script = ExtResource("1_2gxac")
+Beat = 11.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_wjmqy"]
+script = ExtResource("1_2gxac")
+Beat = 14.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_64q4o"]
+script = ExtResource("1_2gxac")
+Beat = 16.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_rubmr"]
+script = ExtResource("1_2gxac")
+Beat = 19.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_ejow0"]
+script = ExtResource("1_2gxac")
+Beat = 20.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_pbett"]
+script = ExtResource("1_2gxac")
+Beat = 8.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_gru0r"]
+script = ExtResource("1_2gxac")
+Beat = 22.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_wljiu"]
+script = ExtResource("1_2gxac")
+Beat = 10.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_3viwm"]
+script = ExtResource("1_2gxac")
+Beat = 2.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_mcgpp"]
+script = ExtResource("1_2gxac")
+Beat = 4.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_olklg"]
+script = ExtResource("1_2gxac")
+Beat = 12.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_57g2b"]
+script = ExtResource("1_2gxac")
+Beat = 18.0
+Length = 0.0
+
+[resource]
+script = ExtResource("2_p8lx2")
+Bpm = 120
+NumLoops = 2
+SongSpeed = -1.0
+SongMapLocation = "Song2.ogg"
+UpLaneData = [SubResource("Resource_3viwm"), SubResource("Resource_mcgpp"), SubResource("Resource_olklg"), SubResource("Resource_57g2b")]
+DownLaneData = [SubResource("Resource_svc5u"), SubResource("Resource_ienox"), SubResource("Resource_ax4q1"), SubResource("Resource_663rs"), SubResource("Resource_86xei"), SubResource("Resource_w3gx2"), SubResource("Resource_t01kg")]
+LeftLaneData = [SubResource("Resource_rnhdg"), SubResource("Resource_of7dy"), SubResource("Resource_xq1dl")]
+RightLaneData = [SubResource("Resource_ym0tj"), SubResource("Resource_1vvgc"), SubResource("Resource_wjmqy"), SubResource("Resource_64q4o"), SubResource("Resource_rubmr"), SubResource("Resource_ejow0"), SubResource("Resource_pbett"), SubResource("Resource_gru0r"), SubResource("Resource_wljiu")]
diff --git a/Audio/songMaps/ParasiflySingle.tres b/Audio/songMaps/ParasiflySingle.tres
new file mode 100644
index 00000000..c33068e5
--- /dev/null
+++ b/Audio/songMaps/ParasiflySingle.tres
@@ -0,0 +1,130 @@
+[gd_resource type="Resource" load_steps=26 format=3 uid="uid://drmfhafnnokw1"]
+
+[ext_resource type="Script" uid="uid://bhbpcmtr6e6pk" path="res://Classes/MidiMaestro/NoteInfo.cs" id="1_qiqje"]
+[ext_resource type="Script" uid="uid://bnpnavb5lwobj" path="res://Classes/MidiMaestro/NoteChart.cs" id="2_qfjvo"]
+
+[sub_resource type="Resource" id="Resource_svc5u"]
+script = ExtResource("1_qiqje")
+Beat = 2.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_ienox"]
+script = ExtResource("1_qiqje")
+Beat = 6.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_ax4q1"]
+script = ExtResource("1_qiqje")
+Beat = 10.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_663rs"]
+script = ExtResource("1_qiqje")
+Beat = 15.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_86xei"]
+script = ExtResource("1_qiqje")
+Beat = 20.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_w3gx2"]
+script = ExtResource("1_qiqje")
+Beat = 12.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_t01kg"]
+script = ExtResource("1_qiqje")
+Beat = 18.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_rnhdg"]
+script = ExtResource("1_qiqje")
+Beat = 8.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_of7dy"]
+script = ExtResource("1_qiqje")
+Beat = 22.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_xq1dl"]
+script = ExtResource("1_qiqje")
+Beat = 11.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_ym0tj"]
+script = ExtResource("1_qiqje")
+Beat = 4.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_1vvgc"]
+script = ExtResource("1_qiqje")
+Beat = 11.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_wjmqy"]
+script = ExtResource("1_qiqje")
+Beat = 14.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_64q4o"]
+script = ExtResource("1_qiqje")
+Beat = 16.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_rubmr"]
+script = ExtResource("1_qiqje")
+Beat = 19.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_ejow0"]
+script = ExtResource("1_qiqje")
+Beat = 20.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_pbett"]
+script = ExtResource("1_qiqje")
+Beat = 8.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_gru0r"]
+script = ExtResource("1_qiqje")
+Beat = 22.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_wljiu"]
+script = ExtResource("1_qiqje")
+Beat = 10.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_3viwm"]
+script = ExtResource("1_qiqje")
+Beat = 2.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_mcgpp"]
+script = ExtResource("1_qiqje")
+Beat = 4.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_olklg"]
+script = ExtResource("1_qiqje")
+Beat = 12.0
+Length = 0.0
+
+[sub_resource type="Resource" id="Resource_57g2b"]
+script = ExtResource("1_qiqje")
+Beat = 18.0
+Length = 0.0
+
+[resource]
+script = ExtResource("2_qfjvo")
+Bpm = 60
+NumLoops = 1
+SongSpeed = -1.0
+SongMapLocation = "Song2.ogg"
+UpLaneData = [SubResource("Resource_3viwm"), SubResource("Resource_mcgpp"), SubResource("Resource_olklg"), SubResource("Resource_57g2b")]
+DownLaneData = [SubResource("Resource_svc5u"), SubResource("Resource_ienox"), SubResource("Resource_ax4q1"), SubResource("Resource_663rs"), SubResource("Resource_86xei"), SubResource("Resource_w3gx2"), SubResource("Resource_t01kg")]
+LeftLaneData = [SubResource("Resource_rnhdg"), SubResource("Resource_of7dy"), SubResource("Resource_xq1dl")]
+RightLaneData = [SubResource("Resource_ym0tj"), SubResource("Resource_1vvgc"), SubResource("Resource_wjmqy"), SubResource("Resource_64q4o"), SubResource("Resource_rubmr"), SubResource("Resource_ejow0"), SubResource("Resource_pbett"), SubResource("Resource_gru0r"), SubResource("Resource_wljiu")]
diff --git a/Audio/songMaps/Shapes.tres b/Audio/songMaps/Shapes.tres
index 5e567069..ac1ea63a 100644
--- a/Audio/songMaps/Shapes.tres
+++ b/Audio/songMaps/Shapes.tres
@@ -1,7 +1,7 @@
-[gd_resource type="Resource" load_steps=39 format=3]
+[gd_resource type="Resource" load_steps=39 format=3 uid="uid://dcdgn2fv63vls"]
-[ext_resource type="Script" path="res://Classes/MidiMaestro/NoteInfo.cs" id="1_egl41"]
-[ext_resource type="Script" path="res://Classes/MidiMaestro/NoteChart.cs" id="2_j6rk8"]
+[ext_resource type="Script" uid="uid://bhbpcmtr6e6pk" path="res://Classes/MidiMaestro/NoteInfo.cs" id="1_egl41"]
+[ext_resource type="Script" uid="uid://bnpnavb5lwobj" path="res://Classes/MidiMaestro/NoteChart.cs" id="2_j6rk8"]
[sub_resource type="Resource" id="Resource_egl41"]
script = ExtResource("1_egl41")
@@ -185,7 +185,11 @@ Length = 0.0
[resource]
script = ExtResource("2_j6rk8")
-UpLaneData = Array[ExtResource("1_egl41")]([SubResource("Resource_20ma1"), SubResource("Resource_t2x17"), SubResource("Resource_hsyk0"), SubResource("Resource_txx7m"), SubResource("Resource_uic3e"), SubResource("Resource_fy78b"), SubResource("Resource_p1dmw"), SubResource("Resource_7k1m6"), SubResource("Resource_e223l")])
-DownLaneData = Array[ExtResource("1_egl41")]([SubResource("Resource_egl41"), SubResource("Resource_j6rk8"), SubResource("Resource_61fe8"), SubResource("Resource_dmlrl"), SubResource("Resource_xny5e"), SubResource("Resource_sybk5"), SubResource("Resource_cs7yi"), SubResource("Resource_xv7yd"), SubResource("Resource_pfidy"), SubResource("Resource_n0y2d")])
-LeftLaneData = Array[ExtResource("1_egl41")]([SubResource("Resource_i5oul"), SubResource("Resource_qnkk3"), SubResource("Resource_oqhlp"), SubResource("Resource_af8di"), SubResource("Resource_p5qx0"), SubResource("Resource_5ddno"), SubResource("Resource_ep11h")])
-RightLaneData = Array[ExtResource("1_egl41")]([SubResource("Resource_yjewp"), SubResource("Resource_pn3jr"), SubResource("Resource_yxbuu"), SubResource("Resource_5ue8d"), SubResource("Resource_kjeyd"), SubResource("Resource_pljkl"), SubResource("Resource_0h2yl"), SubResource("Resource_ijt06"), SubResource("Resource_61fei"), SubResource("Resource_vxhs1")])
+Bpm = 107
+NumLoops = 7
+SongSpeed = -1.0
+SongMapLocation = "Shapes.ogg"
+UpLaneData = [SubResource("Resource_20ma1"), SubResource("Resource_t2x17"), SubResource("Resource_hsyk0"), SubResource("Resource_txx7m"), SubResource("Resource_uic3e"), SubResource("Resource_fy78b"), SubResource("Resource_p1dmw"), SubResource("Resource_7k1m6"), SubResource("Resource_e223l")]
+DownLaneData = [SubResource("Resource_egl41"), SubResource("Resource_j6rk8"), SubResource("Resource_61fe8"), SubResource("Resource_dmlrl"), SubResource("Resource_xny5e"), SubResource("Resource_sybk5"), SubResource("Resource_cs7yi"), SubResource("Resource_xv7yd"), SubResource("Resource_pfidy"), SubResource("Resource_n0y2d")]
+LeftLaneData = [SubResource("Resource_i5oul"), SubResource("Resource_qnkk3"), SubResource("Resource_oqhlp"), SubResource("Resource_af8di"), SubResource("Resource_p5qx0"), SubResource("Resource_5ddno"), SubResource("Resource_ep11h")]
+RightLaneData = [SubResource("Resource_yjewp"), SubResource("Resource_pn3jr"), SubResource("Resource_yxbuu"), SubResource("Resource_5ue8d"), SubResource("Resource_kjeyd"), SubResource("Resource_pljkl"), SubResource("Resource_0h2yl"), SubResource("Resource_ijt06"), SubResource("Resource_61fei"), SubResource("Resource_vxhs1")]
diff --git a/Audio/songMaps/Song2.tres b/Audio/songMaps/Song2.tres
deleted file mode 100644
index 93e6a038..00000000
--- a/Audio/songMaps/Song2.tres
+++ /dev/null
@@ -1,126 +0,0 @@
-[gd_resource type="Resource" load_steps=26 format=3]
-
-[ext_resource type="Script" path="res://Classes/MidiMaestro/NoteInfo.cs" id="1_vo5rw"]
-[ext_resource type="Script" path="res://Classes/MidiMaestro/NoteChart.cs" id="2_hgwt2"]
-
-[sub_resource type="Resource" id="Resource_svc5u"]
-script = ExtResource("1_vo5rw")
-Beat = 2.0
-Length = 0.0
-
-[sub_resource type="Resource" id="Resource_ienox"]
-script = ExtResource("1_vo5rw")
-Beat = 6.0
-Length = 0.0
-
-[sub_resource type="Resource" id="Resource_ax4q1"]
-script = ExtResource("1_vo5rw")
-Beat = 10.0
-Length = 0.0
-
-[sub_resource type="Resource" id="Resource_663rs"]
-script = ExtResource("1_vo5rw")
-Beat = 15.0
-Length = 0.0
-
-[sub_resource type="Resource" id="Resource_86xei"]
-script = ExtResource("1_vo5rw")
-Beat = 20.0
-Length = 0.0
-
-[sub_resource type="Resource" id="Resource_w3gx2"]
-script = ExtResource("1_vo5rw")
-Beat = 12.0
-Length = 0.0
-
-[sub_resource type="Resource" id="Resource_t01kg"]
-script = ExtResource("1_vo5rw")
-Beat = 18.0
-Length = 0.0
-
-[sub_resource type="Resource" id="Resource_rnhdg"]
-script = ExtResource("1_vo5rw")
-Beat = 8.0
-Length = 0.0
-
-[sub_resource type="Resource" id="Resource_of7dy"]
-script = ExtResource("1_vo5rw")
-Beat = 22.0
-Length = 0.0
-
-[sub_resource type="Resource" id="Resource_xq1dl"]
-script = ExtResource("1_vo5rw")
-Beat = 11.0
-Length = 0.0
-
-[sub_resource type="Resource" id="Resource_ym0tj"]
-script = ExtResource("1_vo5rw")
-Beat = 4.0
-Length = 0.0
-
-[sub_resource type="Resource" id="Resource_1vvgc"]
-script = ExtResource("1_vo5rw")
-Beat = 11.0
-Length = 0.0
-
-[sub_resource type="Resource" id="Resource_wjmqy"]
-script = ExtResource("1_vo5rw")
-Beat = 14.0
-Length = 0.0
-
-[sub_resource type="Resource" id="Resource_64q4o"]
-script = ExtResource("1_vo5rw")
-Beat = 16.0
-Length = 0.0
-
-[sub_resource type="Resource" id="Resource_rubmr"]
-script = ExtResource("1_vo5rw")
-Beat = 19.0
-Length = 0.0
-
-[sub_resource type="Resource" id="Resource_ejow0"]
-script = ExtResource("1_vo5rw")
-Beat = 20.0
-Length = 0.0
-
-[sub_resource type="Resource" id="Resource_pbett"]
-script = ExtResource("1_vo5rw")
-Beat = 8.0
-Length = 0.0
-
-[sub_resource type="Resource" id="Resource_gru0r"]
-script = ExtResource("1_vo5rw")
-Beat = 22.0
-Length = 0.0
-
-[sub_resource type="Resource" id="Resource_wljiu"]
-script = ExtResource("1_vo5rw")
-Beat = 10.0
-Length = 0.0
-
-[sub_resource type="Resource" id="Resource_3viwm"]
-script = ExtResource("1_vo5rw")
-Beat = 2.0
-Length = 0.0
-
-[sub_resource type="Resource" id="Resource_mcgpp"]
-script = ExtResource("1_vo5rw")
-Beat = 4.0
-Length = 0.0
-
-[sub_resource type="Resource" id="Resource_olklg"]
-script = ExtResource("1_vo5rw")
-Beat = 12.0
-Length = 0.0
-
-[sub_resource type="Resource" id="Resource_57g2b"]
-script = ExtResource("1_vo5rw")
-Beat = 18.0
-Length = 0.0
-
-[resource]
-script = ExtResource("2_hgwt2")
-UpLaneData = Array[ExtResource("1_vo5rw")]([SubResource("Resource_3viwm"), SubResource("Resource_mcgpp"), SubResource("Resource_olklg"), SubResource("Resource_57g2b")])
-DownLaneData = Array[ExtResource("1_vo5rw")]([SubResource("Resource_svc5u"), SubResource("Resource_ienox"), SubResource("Resource_ax4q1"), SubResource("Resource_663rs"), SubResource("Resource_86xei"), SubResource("Resource_w3gx2"), SubResource("Resource_t01kg")])
-LeftLaneData = Array[ExtResource("1_vo5rw")]([SubResource("Resource_rnhdg"), SubResource("Resource_of7dy"), SubResource("Resource_xq1dl")])
-RightLaneData = Array[ExtResource("1_vo5rw")]([SubResource("Resource_ym0tj"), SubResource("Resource_1vvgc"), SubResource("Resource_wjmqy"), SubResource("Resource_64q4o"), SubResource("Resource_rubmr"), SubResource("Resource_ejow0"), SubResource("Resource_pbett"), SubResource("Resource_gru0r"), SubResource("Resource_wljiu")])
diff --git a/Audio/songMaps/Spider.tres b/Audio/songMaps/Spider.tres
index 7e666dc5..816c1b3d 100644
--- a/Audio/songMaps/Spider.tres
+++ b/Audio/songMaps/Spider.tres
@@ -1,7 +1,7 @@
-[gd_resource type="Resource" load_steps=29 format=3]
+[gd_resource type="Resource" load_steps=29 format=3 uid="uid://ca5svgb1cmdc"]
-[ext_resource type="Script" path="res://Classes/MidiMaestro/NoteInfo.cs" id="1_kilos"]
-[ext_resource type="Script" path="res://Classes/MidiMaestro/NoteChart.cs" id="2_ojgcg"]
+[ext_resource type="Script" uid="uid://bhbpcmtr6e6pk" path="res://Classes/MidiMaestro/NoteInfo.cs" id="1_kilos"]
+[ext_resource type="Script" uid="uid://bnpnavb5lwobj" path="res://Classes/MidiMaestro/NoteChart.cs" id="2_ojgcg"]
[sub_resource type="Resource" id="Resource_kilos"]
script = ExtResource("1_kilos")
@@ -135,7 +135,11 @@ Length = 0.0
[resource]
script = ExtResource("2_ojgcg")
-UpLaneData = Array[ExtResource("1_kilos")]([SubResource("Resource_j42ns"), SubResource("Resource_kihon"), SubResource("Resource_j43rp"), SubResource("Resource_3j8yo"), SubResource("Resource_vk213"), SubResource("Resource_dsydf")])
-DownLaneData = Array[ExtResource("1_kilos")]([SubResource("Resource_kilos"), SubResource("Resource_ojgcg"), SubResource("Resource_e2i3v"), SubResource("Resource_bxgte"), SubResource("Resource_7c41j"), SubResource("Resource_ibasm"), SubResource("Resource_57q1g")])
-LeftLaneData = Array[ExtResource("1_kilos")]([SubResource("Resource_5kf2q"), SubResource("Resource_klick"), SubResource("Resource_ncgpb"), SubResource("Resource_58gsr"), SubResource("Resource_cuxey"), SubResource("Resource_uqtyg"), SubResource("Resource_8wxpt"), SubResource("Resource_7xcdg")])
-RightLaneData = Array[ExtResource("1_kilos")]([SubResource("Resource_erw8g"), SubResource("Resource_ka8yr"), SubResource("Resource_8jxfc"), SubResource("Resource_al1ha"), SubResource("Resource_heg8m")])
+Bpm = 130
+NumLoops = 3
+SongSpeed = -1.0
+SongMapLocation = "Spider.ogg"
+UpLaneData = [SubResource("Resource_j42ns"), SubResource("Resource_kihon"), SubResource("Resource_j43rp"), SubResource("Resource_3j8yo"), SubResource("Resource_vk213"), SubResource("Resource_dsydf")]
+DownLaneData = [SubResource("Resource_kilos"), SubResource("Resource_ojgcg"), SubResource("Resource_e2i3v"), SubResource("Resource_bxgte"), SubResource("Resource_7c41j"), SubResource("Resource_ibasm"), SubResource("Resource_57q1g")]
+LeftLaneData = [SubResource("Resource_5kf2q"), SubResource("Resource_klick"), SubResource("Resource_ncgpb"), SubResource("Resource_58gsr"), SubResource("Resource_cuxey"), SubResource("Resource_uqtyg"), SubResource("Resource_8wxpt"), SubResource("Resource_7xcdg")]
+RightLaneData = [SubResource("Resource_erw8g"), SubResource("Resource_ka8yr"), SubResource("Resource_8jxfc"), SubResource("Resource_al1ha"), SubResource("Resource_heg8m")]
diff --git a/Audio/songMaps/SquirkelSong.tres b/Audio/songMaps/SquirkelSong.tres
index ff14f0c3..7fa60430 100644
--- a/Audio/songMaps/SquirkelSong.tres
+++ b/Audio/songMaps/SquirkelSong.tres
@@ -1,7 +1,7 @@
-[gd_resource type="Resource" load_steps=19 format=3]
+[gd_resource type="Resource" load_steps=19 format=3 uid="uid://bsofxdw0mkiuw"]
-[ext_resource type="Script" path="res://Classes/MidiMaestro/NoteInfo.cs" id="1_8ueh4"]
-[ext_resource type="Script" path="res://Classes/MidiMaestro/NoteChart.cs" id="2_s63u8"]
+[ext_resource type="Script" uid="uid://bhbpcmtr6e6pk" path="res://Classes/MidiMaestro/NoteInfo.cs" id="1_8ueh4"]
+[ext_resource type="Script" uid="uid://bnpnavb5lwobj" path="res://Classes/MidiMaestro/NoteChart.cs" id="2_s63u8"]
[sub_resource type="Resource" id="Resource_ljr32"]
script = ExtResource("1_8ueh4")
@@ -85,7 +85,11 @@ Length = 0.0
[resource]
script = ExtResource("2_s63u8")
-UpLaneData = Array[ExtResource("1_8ueh4")]([SubResource("Resource_50tbs"), SubResource("Resource_ttd2q")])
-DownLaneData = Array[ExtResource("1_8ueh4")]([SubResource("Resource_ljr32"), SubResource("Resource_bb3yp"), SubResource("Resource_852ml"), SubResource("Resource_38nu8"), SubResource("Resource_3eydr"), SubResource("Resource_ct6sp"), SubResource("Resource_yk705"), SubResource("Resource_oocdv")])
-LeftLaneData = Array[ExtResource("1_8ueh4")]([])
-RightLaneData = Array[ExtResource("1_8ueh4")]([SubResource("Resource_uswjw"), SubResource("Resource_e1hbr"), SubResource("Resource_gryrv"), SubResource("Resource_kwtfb"), SubResource("Resource_c2bxv"), SubResource("Resource_7lpnw")])
+Bpm = 180
+NumLoops = 5
+SongSpeed = -1.0
+SongMapLocation = "SquirkelSong.ogg"
+UpLaneData = [SubResource("Resource_50tbs"), SubResource("Resource_ttd2q")]
+DownLaneData = [SubResource("Resource_ljr32"), SubResource("Resource_bb3yp"), SubResource("Resource_852ml"), SubResource("Resource_38nu8"), SubResource("Resource_3eydr"), SubResource("Resource_ct6sp"), SubResource("Resource_yk705"), SubResource("Resource_oocdv")]
+LeftLaneData = []
+RightLaneData = [SubResource("Resource_uswjw"), SubResource("Resource_e1hbr"), SubResource("Resource_gryrv"), SubResource("Resource_kwtfb"), SubResource("Resource_c2bxv"), SubResource("Resource_7lpnw")]
diff --git a/Audio/songMaps/TutorialBoss176_7.tres b/Audio/songMaps/TutorialBoss176_7.tres
index b90c3588..fc22a24b 100644
--- a/Audio/songMaps/TutorialBoss176_7.tres
+++ b/Audio/songMaps/TutorialBoss176_7.tres
@@ -1,7 +1,7 @@
-[gd_resource type="Resource" load_steps=60 format=3]
+[gd_resource type="Resource" load_steps=60 format=3 uid="uid://e0qdn4kgsv3k"]
-[ext_resource type="Script" path="res://Classes/MidiMaestro/NoteInfo.cs" id="1_w1u0b"]
-[ext_resource type="Script" path="res://Classes/MidiMaestro/NoteChart.cs" id="2_gbai3"]
+[ext_resource type="Script" uid="uid://bhbpcmtr6e6pk" path="res://Classes/MidiMaestro/NoteInfo.cs" id="1_w1u0b"]
+[ext_resource type="Script" uid="uid://bnpnavb5lwobj" path="res://Classes/MidiMaestro/NoteChart.cs" id="2_gbai3"]
[sub_resource type="Resource" id="Resource_sxt82"]
script = ExtResource("1_w1u0b")
@@ -290,7 +290,11 @@ Length = 0.0
[resource]
script = ExtResource("2_gbai3")
-UpLaneData = Array[ExtResource("1_w1u0b")]([SubResource("Resource_w1u0b"), SubResource("Resource_gbai3"), SubResource("Resource_bcwc6"), SubResource("Resource_0k2f6"), SubResource("Resource_tgoco"), SubResource("Resource_x1j4d"), SubResource("Resource_e76xg"), SubResource("Resource_vhygb"), SubResource("Resource_unq76"), SubResource("Resource_cn75w"), SubResource("Resource_3pobr"), SubResource("Resource_43v1q"), SubResource("Resource_2i0ix"), SubResource("Resource_eo1b6"), SubResource("Resource_ehfsr"), SubResource("Resource_05gdy"), SubResource("Resource_b164v"), SubResource("Resource_86j1n"), SubResource("Resource_p6bp3"), SubResource("Resource_7erhr"), SubResource("Resource_n6xrx"), SubResource("Resource_75ujr"), SubResource("Resource_mlxr3"), SubResource("Resource_5vw1o"), SubResource("Resource_suuru")])
-DownLaneData = Array[ExtResource("1_w1u0b")]([SubResource("Resource_sxt82"), SubResource("Resource_j5ca6"), SubResource("Resource_cfyig"), SubResource("Resource_oq2fs"), SubResource("Resource_bv13m"), SubResource("Resource_lg6ov"), SubResource("Resource_eg7rs"), SubResource("Resource_x3k65"), SubResource("Resource_d5g7d"), SubResource("Resource_1cpsm"), SubResource("Resource_giltv")])
-LeftLaneData = Array[ExtResource("1_w1u0b")]([SubResource("Resource_oqa5e"), SubResource("Resource_kk6vq"), SubResource("Resource_3scxn"), SubResource("Resource_p5ohh"), SubResource("Resource_dxorp"), SubResource("Resource_pm5wf"), SubResource("Resource_biar7"), SubResource("Resource_bnjg0"), SubResource("Resource_7gvq1")])
-RightLaneData = Array[ExtResource("1_w1u0b")]([SubResource("Resource_pgga6"), SubResource("Resource_gr1jk"), SubResource("Resource_w2pru"), SubResource("Resource_wgekv"), SubResource("Resource_qsagv"), SubResource("Resource_gmjq8"), SubResource("Resource_35mcn"), SubResource("Resource_pwkkg"), SubResource("Resource_gks01"), SubResource("Resource_vp8wv"), SubResource("Resource_ur61o"), SubResource("Resource_71lt2")])
+Bpm = 176
+NumLoops = 7
+SongSpeed = -1.0
+SongMapLocation = "District_Four.ogg"
+UpLaneData = [SubResource("Resource_w1u0b"), SubResource("Resource_gbai3"), SubResource("Resource_bcwc6"), SubResource("Resource_0k2f6"), SubResource("Resource_tgoco"), SubResource("Resource_x1j4d"), SubResource("Resource_e76xg"), SubResource("Resource_vhygb"), SubResource("Resource_unq76"), SubResource("Resource_cn75w"), SubResource("Resource_3pobr"), SubResource("Resource_43v1q"), SubResource("Resource_2i0ix"), SubResource("Resource_eo1b6"), SubResource("Resource_ehfsr"), SubResource("Resource_05gdy"), SubResource("Resource_b164v"), SubResource("Resource_86j1n"), SubResource("Resource_p6bp3"), SubResource("Resource_7erhr"), SubResource("Resource_n6xrx"), SubResource("Resource_75ujr"), SubResource("Resource_mlxr3"), SubResource("Resource_5vw1o"), SubResource("Resource_suuru")]
+DownLaneData = [SubResource("Resource_sxt82"), SubResource("Resource_j5ca6"), SubResource("Resource_cfyig"), SubResource("Resource_oq2fs"), SubResource("Resource_bv13m"), SubResource("Resource_lg6ov"), SubResource("Resource_eg7rs"), SubResource("Resource_x3k65"), SubResource("Resource_d5g7d"), SubResource("Resource_1cpsm"), SubResource("Resource_giltv")]
+LeftLaneData = [SubResource("Resource_oqa5e"), SubResource("Resource_kk6vq"), SubResource("Resource_3scxn"), SubResource("Resource_p5ohh"), SubResource("Resource_dxorp"), SubResource("Resource_pm5wf"), SubResource("Resource_biar7"), SubResource("Resource_bnjg0"), SubResource("Resource_7gvq1")]
+RightLaneData = [SubResource("Resource_pgga6"), SubResource("Resource_gr1jk"), SubResource("Resource_w2pru"), SubResource("Resource_wgekv"), SubResource("Resource_qsagv"), SubResource("Resource_gmjq8"), SubResource("Resource_35mcn"), SubResource("Resource_pwkkg"), SubResource("Resource_gks01"), SubResource("Resource_vp8wv"), SubResource("Resource_ur61o"), SubResource("Resource_71lt2")]
diff --git a/Audio/songMaps/TutorialSong.tres b/Audio/songMaps/TutorialSong.tres
index a24d6ee3..fd0a10f4 100644
--- a/Audio/songMaps/TutorialSong.tres
+++ b/Audio/songMaps/TutorialSong.tres
@@ -105,7 +105,11 @@ Length = 0.0
[resource]
script = ExtResource("2_bsw0b")
-UpLaneData = Array[ExtResource("1_roxhp")]([SubResource("Resource_bnbk2"), SubResource("Resource_t2mc0"), SubResource("Resource_xl4h8"), SubResource("Resource_7i220"), SubResource("Resource_txc3y"), SubResource("Resource_iixj3"), SubResource("Resource_5o1tj"), SubResource("Resource_l3ivu"), SubResource("Resource_d6d5y")])
-DownLaneData = Array[ExtResource("1_roxhp")]([SubResource("Resource_a0ovt"), SubResource("Resource_ahash"), SubResource("Resource_6gc2p"), SubResource("Resource_tjsh3"), SubResource("Resource_s18ys"), SubResource("Resource_wcsgu"), SubResource("Resource_r81qg"), SubResource("Resource_roxhp")])
-LeftLaneData = Array[ExtResource("1_roxhp")]([SubResource("Resource_ifw8a"), SubResource("Resource_d0m6p"), SubResource("Resource_owwlp")])
-RightLaneData = Array[ExtResource("1_roxhp")]([])
+Bpm = 90
+NumLoops = 1
+SongSpeed = -1.0
+SongMapLocation = "TutorialSong.ogg"
+UpLaneData = [SubResource("Resource_bnbk2"), SubResource("Resource_t2mc0"), SubResource("Resource_xl4h8"), SubResource("Resource_7i220"), SubResource("Resource_txc3y"), SubResource("Resource_iixj3"), SubResource("Resource_5o1tj"), SubResource("Resource_l3ivu"), SubResource("Resource_d6d5y")]
+DownLaneData = [SubResource("Resource_a0ovt"), SubResource("Resource_ahash"), SubResource("Resource_6gc2p"), SubResource("Resource_tjsh3"), SubResource("Resource_s18ys"), SubResource("Resource_wcsgu"), SubResource("Resource_r81qg"), SubResource("Resource_roxhp")]
+LeftLaneData = [SubResource("Resource_ifw8a"), SubResource("Resource_d0m6p"), SubResource("Resource_owwlp")]
+RightLaneData = []
diff --git a/Classes/MidiMaestro/MidiMaestro.cs b/Classes/MidiMaestro/MidiMaestro.cs
index 1bd1964f..2c7bfa8f 100644
--- a/Classes/MidiMaestro/MidiMaestro.cs
+++ b/Classes/MidiMaestro/MidiMaestro.cs
@@ -20,9 +20,9 @@ public partial class MidiMaestro : Resource
* Constructor loads resource file and populates lane note arrays with NoteInfo
* A string file path to a valid songMap .tres file
*/
- public MidiMaestro(string filePath)
+ public MidiMaestro(NoteChart savedChart)
{
- if (!OS.HasFeature("editor"))
+ /*if (!OS.HasFeature("editor"))
{
filePath = OS.GetExecutablePath().GetBaseDir() + "/" + filePath;
}
@@ -32,7 +32,7 @@ public MidiMaestro(string filePath)
GD.PushError("ERROR: Unable to load level songMap resource file: " + filePath);
}
- NoteChart savedChart = ResourceLoader.Load(filePath);
+ NoteChart savedChart = ResourceLoader.Load(filePath);*/
if (savedChart != null)
{
@@ -43,7 +43,7 @@ public MidiMaestro(string filePath)
}
else
{
- GD.PushError("ERROR: Unable to load songMap resource file: " + filePath);
+ GD.PushError("ERROR: Unable to load songMap resource file!");
_upNotes = [];
_downNotes = [];
_leftNotes = [];
diff --git a/Classes/MidiMaestro/NoteChart.cs b/Classes/MidiMaestro/NoteChart.cs
index 5e239bdc..d5f9fc85 100644
--- a/Classes/MidiMaestro/NoteChart.cs
+++ b/Classes/MidiMaestro/NoteChart.cs
@@ -8,6 +8,20 @@ public partial class NoteChart : Resource
{ //Godot is unhappy with this sometimes.
const float Precision = 0.0001f;
+ [Export]
+ public int Bpm { get; set; }
+
+ [Export]
+ public int NumLoops { get; set; }
+
+ //178 is average for most fights
+ //<= 0 means go with default chart speed based on song length
+ [Export]
+ public float SongSpeed { get; set; } = -1;
+
+ [Export]
+ public string SongMapLocation { get; set; } = "";
+
[Export]
Array UpLaneData = [];
diff --git a/Classes/MidiMaestro/SongTemplate.cs b/Classes/MidiMaestro/SongTemplate.cs
index 9cff9f5d..89d6e749 100644
--- a/Classes/MidiMaestro/SongTemplate.cs
+++ b/Classes/MidiMaestro/SongTemplate.cs
@@ -1,3 +1,6 @@
+using System.Text.Json;
+using Godot;
+
namespace FunkEngine.Classes.MidiMaestro;
/**
@@ -6,23 +9,67 @@ namespace FunkEngine.Classes.MidiMaestro;
public struct SongTemplate
{
public string Name;
- public readonly string AudioLocation;
- public string SongMapLocation;
+ public readonly NoteChart Chart;
public readonly string[] EnemyScenePath;
- public SongData SongData;
- public SongTemplate(
- SongData songData,
- string name = "",
- string audioLocation = "",
- string songMapLocation = "",
- string[] enemyScenePath = null
- )
+ public SongTemplate(string name = "", string[] enemyScenePath = null, NoteChart chart = null)
{
Name = name;
- AudioLocation = audioLocation;
- SongMapLocation = songMapLocation;
- SongData = songData;
+ Chart = chart;
EnemyScenePath = enemyScenePath;
}
+
+ public struct NoteChartMemento(
+ string name = "",
+ string[] enemyScenePath = null,
+ string chartPath = ""
+ )
+ {
+ public string Name { get; init; } = name;
+ public string ChartPath { get; init; } = chartPath;
+ public string[] EnemyScenePath { get; init; } = enemyScenePath;
+ }
+
+ public static string ToJSONString(SongTemplate template, string chartPath)
+ {
+ NoteChartMemento inbetween = new NoteChartMemento(
+ template.Name,
+ template.EnemyScenePath,
+ chartPath
+ );
+ string result = JsonSerializer.Serialize(inbetween);
+ return result;
+ }
+
+ public static SongTemplate CreateFromPath(string path, bool fromUserPath = true)
+ {
+ if (!FileAccess.FileExists(path))
+ return new SongTemplate("CUSTOM_SONTEM_NOT_FOUND", [path]);
+
+ FileAccess file = FileAccess.Open(path, FileAccess.ModeFlags.Read);
+ string json = file.GetAsText();
+
+ file.Close();
+ try
+ {
+ NoteChartMemento result = JsonSerializer.Deserialize(json);
+ if (string.IsNullOrEmpty(result.ChartPath))
+ return new SongTemplate("CUSTOM_NO_CHART_PATH", [json]);
+ if (!FileAccess.FileExists(path.GetBaseDir() + "/" + result.ChartPath))
+ return new SongTemplate(
+ "CUSTOM_CHART_NOT_FOUND",
+ [path.GetBaseDir() + "/" + result.ChartPath]
+ );
+
+ NoteChart nc = ResourceLoader.Load(
+ path.GetBaseDir() + "/" + result.ChartPath
+ );
+ return new SongTemplate(result.Name, result.EnemyScenePath, nc);
+ }
+ catch (JsonException)
+ {
+ GD.PushWarning("Cannot deserialize SongTemplate, returning error object.");
+ return new SongTemplate("CUSTOM_COULD_NOT_READ", [json]);
+ }
+ }
}
diff --git a/Globals/FunkEngineNameSpace.cs b/Globals/FunkEngineNameSpace.cs
index 78b98bd0..2c896daf 100644
--- a/Globals/FunkEngineNameSpace.cs
+++ b/Globals/FunkEngineNameSpace.cs
@@ -7,15 +7,6 @@
namespace FunkEngine;
#region Structs
-/**
- * SongData: Basic information defining the statistics of an in-battle song.
- */
-public struct SongData
-{
- public int Bpm;
- public double SongLength;
- public int NumLoops;
-}
/**
* ArrowData: Data representing the necessary information for each arrow checker.
@@ -268,6 +259,7 @@ public enum Stages
Load,
Continue,
Title,
+ Custom,
}
public enum Rarity
diff --git a/Globals/SaveSystem.cs b/Globals/SaveSystem.cs
index 071e0255..63ea5acf 100644
--- a/Globals/SaveSystem.cs
+++ b/Globals/SaveSystem.cs
@@ -30,6 +30,7 @@ public static class SaveSystem
private const string DefaultLanguage = "en";
private const bool DefaultHighCon = false;
private const bool DefaultFirstTime = true;
+ private const bool DefaultHasWon = false;
public enum ConfigSettings
{
@@ -50,6 +51,7 @@ public enum ConfigSettings
LanguageKey,
HighContrast,
FirstTime,
+ HasWon,
}
/**
@@ -75,6 +77,7 @@ private static void InitConfig()
UpdateConfig(ConfigSettings.LanguageKey, DefaultLanguage);
UpdateConfig(ConfigSettings.HighContrast, DefaultHighCon);
UpdateConfig(ConfigSettings.FirstTime, DefaultFirstTime);
+ UpdateConfig(ConfigSettings.HasWon, DefaultHasWon);
}
private static void SaveConfig()
@@ -139,6 +142,9 @@ public static void UpdateConfig(ConfigSettings setting, Variant value)
case ConfigSettings.FirstTime:
_curConfigData.SetValue("Game", "FirstTime", value);
break;
+ case ConfigSettings.HasWon:
+ _curConfigData.SetValue("Game", "HasWon", value);
+ break;
default:
GD.PushError("SaveSystem.UpdateConfig: Invalid config setting passed. " + setting);
break;
@@ -278,6 +284,8 @@ public static Variant GetConfigValue(ConfigSettings setting)
return _curConfigData.GetValue("Options", "HighContrast", DefaultHighCon);
case ConfigSettings.FirstTime:
return _curConfigData.GetValue("Game", "FirstTime", DefaultFirstTime);
+ case ConfigSettings.HasWon:
+ return _curConfigData.GetValue("Game", "HasWon", DefaultHasWon);
default:
GD.PushError("Invalid config setting passed. " + setting);
return float.MinValue;
diff --git a/Globals/Scribe.cs b/Globals/Scribe.cs
index 8835dc97..358c7a18 100644
--- a/Globals/Scribe.cs
+++ b/Globals/Scribe.cs
@@ -582,199 +582,89 @@ e is BattleDirector.Harbinger.OnDamageInstanceArgs dmgArgs
),
};
+ private static string DefaultNoteChartPath = "Audio/songMaps/";
+
public static readonly SongTemplate[] SongDictionary = new[] //Generalize and make pools for areas/room types
{
new SongTemplate(
- new SongData
- {
- Bpm = 120,
- SongLength = -1,
- NumLoops = 5,
- },
"Song1",
- "Audio/Song1.ogg",
- "Audio/songMaps/Song1.tres",
- [P_BossBlood.LoadPath]
+ [P_BossBlood.LoadPath],
+ ResourceLoader.Load(DefaultNoteChartPath + "BossBlood.tres")
),
new SongTemplate(
- new SongData
- {
- Bpm = 60,
- SongLength = -1,
- NumLoops = 1,
- },
"Song2",
- "Audio/Song2.ogg",
- "Audio/songMaps/Song2.tres",
- [P_Parasifly.LoadPath]
+ [P_Parasifly.LoadPath],
+ ResourceLoader.Load(DefaultNoteChartPath + "ParasiflySingle.tres")
),
new SongTemplate(
- new SongData
- {
- Bpm = 120,
- SongLength = -1,
- NumLoops = 2,
- },
"Song2",
- "Audio/Song2.ogg",
- "Audio/songMaps/Song2.tres",
- [P_Parasifly.LoadPath, P_Parasifly.LoadPath]
+ [P_Parasifly.LoadPath, P_Parasifly.LoadPath],
+ ResourceLoader.Load(DefaultNoteChartPath + "ParasiflyDouble.tres")
),
new SongTemplate(
- new SongData
- {
- Bpm = 120,
- SongLength = -1,
- NumLoops = 1,
- },
"Song3",
- "Audio/Song3.ogg",
- "Audio/songMaps/Song3.tres",
- [P_TheGWS.LoadPath]
+ [P_TheGWS.LoadPath],
+ ResourceLoader.Load(DefaultNoteChartPath + "GWS.tres")
),
new SongTemplate(
- new SongData
- {
- Bpm = 90,
- SongLength = -1,
- NumLoops = 1,
- },
"TutorialSong",
- "Audio/TutorialSong.ogg",
- "Audio/songMaps/TutorialSong.tres",
- [P_Strawman.LoadPath]
+ [P_Strawman.LoadPath],
+ ResourceLoader.Load(DefaultNoteChartPath + "TutorialSong.tres")
),
new SongTemplate(
- new SongData
- {
- Bpm = 176,
- SongLength = -1,
- NumLoops = 7,
- },
"YouWillDie:)",
- "Audio/District_Four.ogg",
- "Audio/songMaps/TutorialBoss176_7.tres",
- [P_Effigy.LoadPath]
+ [P_Effigy.LoadPath],
+ ResourceLoader.Load(DefaultNoteChartPath + "TutorialBoss176_7.tres")
),
new SongTemplate(
- new SongData
- {
- Bpm = 120,
- SongLength = -1,
- NumLoops = 4,
- },
"EcholaneSong",
- "Audio/EcholaneSong.ogg",
- "Audio/songMaps/EcholaneSong.tres",
- [P_Turtle.LoadPath]
+ [P_Turtle.LoadPath],
+ ResourceLoader.Load(DefaultNoteChartPath + "EcholaneSong.tres")
),
new SongTemplate(
- new SongData
- {
- Bpm = 180,
- SongLength = -1,
- NumLoops = 1,
- },
"CyberFoxSong",
- "Audio/CyberFoxSong.ogg",
- "Audio/songMaps/CyberFoxSong.tres",
- [P_CyberFox.LoadPath]
+ [P_CyberFox.LoadPath],
+ ResourceLoader.Load(DefaultNoteChartPath + "CyberFoxSong.tres")
),
new SongTemplate(
- new SongData
- {
- Bpm = 120,
- SongLength = -1,
- NumLoops = 6,
- },
"GobblerSong",
- "Audio/Gobbler.ogg",
- "Audio/songMaps/Gobbler.tres",
- [P_Gobbler.LoadPath]
+ [P_Gobbler.LoadPath],
+ ResourceLoader.Load(DefaultNoteChartPath + "Gobbler.tres")
),
new SongTemplate( //9
- new SongData
- {
- Bpm = 130,
- SongLength = -1,
- NumLoops = 1,
- },
"Holograeme",
- "Audio/Holo_ThereItIs.ogg",
- "Audio/songMaps/HoloRepeat.tres",
- [P_Holograeme.LoadPath]
+ [P_Holograeme.LoadPath],
+ ResourceLoader.Load(DefaultNoteChartPath + "HoloRepeat.tres")
),
new SongTemplate( //10
- new SongData
- {
- Bpm = 107,
- SongLength = -1,
- NumLoops = 7,
- },
"Shapes",
- "Audio/Shapes.ogg",
- "Audio/songMaps/Shapes.tres",
- [P_Shapes.LoadPath]
+ [P_Shapes.LoadPath],
+ ResourceLoader.Load(DefaultNoteChartPath + "Shapes.tres")
),
new SongTemplate( //11
- new SongData
- {
- Bpm = 130,
- SongLength = -1,
- NumLoops = 3,
- },
"Spideer",
- "Audio/Spider.ogg",
- "Audio/songMaps/Spider.tres",
- [P_Spider.LoadPath, P_Spider.LoadPath]
+ [P_Spider.LoadPath, P_Spider.LoadPath],
+ ResourceLoader.Load(DefaultNoteChartPath + "Spider.tres")
),
new SongTemplate( //12
- new SongData
- {
- Bpm = 180,
- SongLength = -1,
- NumLoops = 5,
- },
"Squirkel",
- "Audio/SquirkelSong.ogg",
- "Audio/songMaps/SquirkelSong.tres",
- [P_Squirkel.LoadPath]
+ [P_Squirkel.LoadPath],
+ ResourceLoader.Load(DefaultNoteChartPath + "SquirkelSong.tres")
),
new SongTemplate( //13
- new SongData
- {
- Bpm = 100,
- SongLength = -1,
- NumLoops = 4,
- },
"Mushroom",
- "Audio/Mushroom.ogg",
- "Audio/songMaps/Mushroom.tres",
- [P_Mushroom.LoadPath]
+ [P_Mushroom.LoadPath],
+ ResourceLoader.Load(DefaultNoteChartPath + "Mushroom.tres")
),
new SongTemplate(
- new SongData
- {
- Bpm = 170,
- SongLength = -1,
- NumLoops = 9,
- },
"Keythulu",
- "Audio/KeythuluSong.ogg",
- "Audio/songMaps/KeythuluSong.tres",
- [P_Keythulu.LoadPath]
+ [P_Keythulu.LoadPath],
+ ResourceLoader.Load(DefaultNoteChartPath + "KeythuluSong.tres")
),
new SongTemplate( // 15
- new SongData
- {
- Bpm = 99,
- SongLength = -1,
- NumLoops = 5,
- },
name: "LWS",
- audioLocation: "Audio/FrostWaltz.ogg",
- songMapLocation: "Audio/songMaps/FrostWaltz.tres",
- enemyScenePath: [P_LWS.LoadPath]
+ enemyScenePath: [P_LWS.LoadPath],
+ ResourceLoader.Load(DefaultNoteChartPath + "FrostWaltz.tres")
),
};
diff --git a/Globals/StageProducer.cs b/Globals/StageProducer.cs
index f9606d0a..28e87438 100644
--- a/Globals/StageProducer.cs
+++ b/Globals/StageProducer.cs
@@ -2,6 +2,7 @@
using System.Linq;
using System.Threading.Tasks;
using FunkEngine;
+using FunkEngine.Classes.MidiMaestro;
using Godot;
/**
@@ -218,8 +219,29 @@ public void TransitionStage(Stages nextStage, int nextRoomIdx = -1)
_preloadStage = null;
//Apply grayscale shader to all scenes
GetTree().Root.AddChild(ContrastFilter);
+ LastStage = _curStage;
_curStage = nextStage;
}
+
+ public Stages LastStage; //Hacky, purely to have title screen return to custom menu.
+
+ public void TransitionToCustom(SongTemplate song)
+ {
+ GetTree().Root.RemoveChild(ContrastFilter);
+ GetTree().Root.AddChild(ContrastFilter);
+ GlobalRng.Randomize();
+ PlayerStats = new PlayerStats();
+ Config = new BattleConfig
+ {
+ BattleRoom = null,
+ RoomType = Stages.Custom,
+ CurSong = song,
+ EnemyScenePath = song.EnemyScenePath,
+ };
+ GetTree().ChangeSceneToFile(BattleDirector.LoadPath);
+ _curStage = Stages.Custom;
+ }
+
#endregion
private void RefreshBattlePool()
diff --git a/Globals/Translations/Translations.csv b/Globals/Translations/Translations.csv
index b6923eea..48b4b286 100644
--- a/Globals/Translations/Translations.csv
+++ b/Globals/Translations/Translations.csv
@@ -163,4 +163,21 @@ EVENT_EVENT3_OPTION2,Increase bar charge rate.,提高能量条充能速度
EVENT_EVENT3_OPTION3,Purchase 2 heal notes (30g),购买2个治疗音符 (30硬币)
EVENT_EVENT3_OUTCOME1,The medic patched you up.\nYou restored 10 Health.,医生为你包扎了伤口。\n你恢复了10点生命值。
EVENT_EVENT3_OUTCOME2,The medic gave you a shot of adrenaline.\nFreestyle bar fills 8% faster!,医生给你注射了一针肾上腺素。\n风格条充能速度提升8%!
-EVENT_EVENT3_OUTCOME3,The medic sold you some healing supplies.\nAdded 2 heal notes to your inventory.,医生卖给你一些治疗用品。\n你的背包中增加了2个治疗音符。
\ No newline at end of file
+EVENT_EVENT3_OUTCOME3,The medic sold you some healing supplies.\nAdded 2 heal notes to your inventory.,医生卖给你一些治疗用品。\n你的背包中增加了2个治疗音符。
+CUSTOM_DIFFICULTY,Difficulty: ,困难:
+CUSTOM_SONG,Song: ,歌曲:
+CUSTOM_BPM,BPM: ,BPM:
+CUSTOM_LOOPS,Number of Loops: , 循环次数:
+CUSTOM_SONG_SELECT,Custom Song,自定义歌曲
+CUSTOM_SONG_NOT_FOUND,Could not find song file!,无法找到歌曲文件!
+CUSTOM_SONTEM_NOT_FOUND,Could not find .sontem file!,无法找到 .sontem 文件!
+CUSTOM_NO_CHART_PATH,There was no chart file path!,未提供谱面文件路径!
+CUSTOM_CHART_NOT_FOUND,Could not find chart files at path!,无法在指定路径下找到谱面文件!
+CUSTOM_COULD_NOT_READ,Invalid/broken sontem file!,无效或损坏的 .sontem 文件!
+CUSTOM_RESULTS,Results,自定义歌曲结算
+CUSTOM_PLAYER_HP,HP Remaining: ,剩余HP:
+CUSTOM_ENEMY_HP,Enemy HP Remaining: ,敌人剩余HP:
+CUSTOM_NOTES_PLACED,Notes Placed: ,已放置音符:
+CUSTOM_PERFECTS,Perfect Hits: ,Perfect 命中:
+CUSTOM_MISSES,Missed Notes: ,失误音符:
+CUSTOM_LOOPS_TAKEN,Loops Taken: ,循环次数:
\ No newline at end of file
diff --git a/Scenes/BattleDirector/Assets/NoteQueue_Frame.png b/Scenes/BattleDirector/Assets/NoteQueue_Frame.png
index 8ce76dec..25ae06b2 100644
Binary files a/Scenes/BattleDirector/Assets/NoteQueue_Frame.png and b/Scenes/BattleDirector/Assets/NoteQueue_Frame.png differ
diff --git a/Scenes/BattleDirector/NotePlacementBar.tscn b/Scenes/BattleDirector/NotePlacementBar.tscn
index 1fc0ddd2..54d676b3 100644
--- a/Scenes/BattleDirector/NotePlacementBar.tscn
+++ b/Scenes/BattleDirector/NotePlacementBar.tscn
@@ -1,10 +1,9 @@
-[gd_scene load_steps=15 format=3 uid="uid://duhiilcv4tat3"]
+[gd_scene load_steps=14 format=3 uid="uid://duhiilcv4tat3"]
[ext_resource type="Script" uid="uid://gj666xe815py" path="res://Scenes/BattleDirector/Scripts/NotePlacementBar.cs" id="1_456es"]
[ext_resource type="Texture2D" uid="uid://cnyr5usjdv0ni" path="res://Scenes/BattleDirector/Assets/NoteQueue_Frame.png" id="2_3tw16"]
[ext_resource type="Texture2D" uid="uid://gcst7q2acsqm" path="res://Scenes/BattleDirector/Assets/PlacementBar_Under.png" id="2_5a8x5"]
[ext_resource type="Shader" uid="uid://difiiwiddwutp" path="res://Scenes/BattleDirector/Assets/wave.gdshader" id="2_kb2co"]
-[ext_resource type="Texture2D" uid="uid://c3chrsxrulapd" path="res://Classes/Notes/Assets/Note_PlayerBasic.png" id="3_6ylx6"]
[ext_resource type="Texture2D" uid="uid://bi4tbiovlm2g1" path="res://Scenes/BattleDirector/Assets/PlacementBar_Over.png" id="3_kb2co"]
[ext_resource type="Texture2D" uid="uid://caw70lr5e1yiq" path="res://Classes/Notes/Assets/Note_PlayerDouble.png" id="4_6w8ha"]
@@ -127,16 +126,13 @@ scale_amount_max = 2.0
color = Color(1, 1, 0.0745098, 1)
[node name="NoteQueueSprite" type="Sprite2D" parent="."]
-position = Vector2(23, 66)
-rotation = -1.5708
+position = Vector2(23, 69)
texture = ExtResource("2_3tw16")
-[node name="NextNote" type="Sprite2D" parent="NoteQueueSprite"]
-position = Vector2(-16, 0)
-rotation = 1.5708
-texture = ExtResource("3_6ylx6")
-
[node name="CurrentNote" type="Sprite2D" parent="NoteQueueSprite"]
-position = Vector2(16, 0)
-rotation = 1.5708
+position = Vector2(1, -19)
+texture = ExtResource("4_6w8ha")
+
+[node name="NextNote" type="Sprite2D" parent="NoteQueueSprite"]
+position = Vector2(1, 14)
texture = ExtResource("4_6w8ha")
diff --git a/Scenes/BattleDirector/Scripts/BattleDirector.cs b/Scenes/BattleDirector/Scripts/BattleDirector.cs
index 65cff2a4..f4ec3395 100644
--- a/Scenes/BattleDirector/Scripts/BattleDirector.cs
+++ b/Scenes/BattleDirector/Scripts/BattleDirector.cs
@@ -88,19 +88,25 @@ private void BeginPlayback()
public override void _Ready()
{
- SongData curSong = StageProducer.Config.CurSong.SongData;
- Audio.SetStream(GD.Load(StageProducer.Config.CurSong.AudioLocation));
- if (curSong.SongLength <= 0)
- {
- curSong.SongLength = Audio.Stream.GetLength();
- }
+ NoteChart curChart = StageProducer.Config.CurSong.Chart;
+
+ Audio.SetStream(
+ StageProducer.Config.RoomType == Stages.Custom
+ ? AudioStreamOggVorbis.LoadFromFile(
+ CustomSelection.UserSongDir + curChart.SongMapLocation
+ )
+ : GD.Load("Audio/" + curChart.SongMapLocation)
+ );
+
+ double songLen = Audio.Stream.GetLength();
- TimeKeeper.InitVals(curSong.Bpm);
+ TimeKeeper.InitVals(curChart.Bpm);
Harbinger.Init(this);
InitPlayer();
InitEnemies();
InitScoringGuide();
- CD.Initialize(curSong, _enemies);
+ CD.Initialize(curChart, songLen, _enemies);
+
CD.NoteInputEvent += OnTimedInput;
FocusedButton.GrabFocus();
@@ -112,6 +118,11 @@ public override void _Ready()
};
Harbinger.Instance.InvokeBattleStarted();
+ if (StageProducer.Config.RoomType != Stages.Custom)
+ return;
+ _customSongResultsScene = GD.Load(CustomScore.LoadPath)
+ .Instantiate();
+ _customSongResultsScene.ListenToDirector();
}
public ScoringScreen.ScoreGuide BattleScore;
@@ -323,6 +334,12 @@ private bool IsBattleWon()
private void OnBattleWon()
{
+ if (StageProducer.Config.RoomType == Stages.Custom)
+ {
+ _customSongResultsScene.ShowResults(this, (float)_enemies[0].GetCurrentHealth() / 500);
+ _customSongResultsScene.Finished += TransitionOutOfCustom;
+ return;
+ }
Harbinger.Instance.InvokeBattleEnded();
CleanUpRelics();
BattleScore.SetEndHp(Player.GetCurrentHealth());
@@ -335,6 +352,12 @@ private void OnBattleWon()
private void OnBattleLost()
{
+ if (StageProducer.Config.RoomType == Stages.Custom)
+ {
+ _customSongResultsScene.ShowResults(this, (float)_enemies[0].GetCurrentHealth() / 500);
+ _customSongResultsScene.Finished += TransitionOutOfCustom;
+ return;
+ }
Audio.StreamPaused = true;
SaveSystem.ClearSave();
AddChild(GD.Load(EndScreen.LoadPath).Instantiate());
@@ -353,6 +376,14 @@ private void ShowRewardSelection(int amount)
rewardSelect.Selected += TransitionOutOfBattle;
}
+ private CustomScore _customSongResultsScene;
+
+ private void TransitionOutOfCustom()
+ {
+ BgAudioPlayer.LiveInstance.PlayLevelMusic();
+ StageProducer.LiveInstance.TransitionStage(Stages.Title);
+ }
+
private void TransitionOutOfBattle()
{
StageProducer.LiveInstance.TransitionStage(Stages.Map);
diff --git a/Scenes/BattleDirector/Scripts/Conductor.cs b/Scenes/BattleDirector/Scripts/Conductor.cs
index 55f37f62..ddbd59f0 100644
--- a/Scenes/BattleDirector/Scripts/Conductor.cs
+++ b/Scenes/BattleDirector/Scripts/Conductor.cs
@@ -19,15 +19,15 @@ public partial class Conductor : Node
private bool _initialized;
#region Initialization
- public void Initialize(SongData curSong, EnemyPuppet[] enemies = null)
+ public void Initialize(NoteChart curSong, double songLen, EnemyPuppet[] enemies = null)
{
if (_initialized)
return;
- MM = new MidiMaestro(StageProducer.Config.CurSong.SongMapLocation);
+ MM = new MidiMaestro(curSong);
CM.ArrowFromInput += ReceiveNoteInput;
- CM.Initialize(curSong);
+ CM.Initialize(curSong, songLen);
//Approximately the first note offscreen
_beatSpawnOffset =
diff --git a/Scenes/ChartViewport/Scripts/ChartManager.cs b/Scenes/ChartViewport/Scripts/ChartManager.cs
index 396718ec..2d28aaab 100644
--- a/Scenes/ChartViewport/Scripts/ChartManager.cs
+++ b/Scenes/ChartViewport/Scripts/ChartManager.cs
@@ -74,23 +74,24 @@ public override void _Process(double delta)
private bool _initialized;
- public void Initialize(SongData songData)
+ public void Initialize(NoteChart songData, double songLen)
{
if (_initialized)
return;
TimeKeeper.LoopsPerSong = songData.NumLoops;
- TimeKeeper.SongLength = songData.SongLength;
+ TimeKeeper.SongLength = songLen;
- double _loopLen = songData.SongLength / songData.NumLoops;
+ double loopLen = songLen / songData.NumLoops;
+ if (songData.SongSpeed > 0)
+ _chartLength = songData.SongSpeed * loopLen;
//99% sure chart length can never be less than (chart viewport width) * 2,
//otherwise there isn't room for things to loop from off and on screen
_chartLength = Math.Max(
- _loopLen * Math.Ceiling(Size.X * 2 / _loopLen),
+ loopLen * Math.Ceiling(Size.X * 2 / loopLen),
//Also minimize rounding point imprecision, improvement is qualitative
- _loopLen * Math.Floor(_chartLength / _loopLen)
+ loopLen * Math.Floor(_chartLength / loopLen)
);
-
TimeKeeper.ChartWidth = _chartLength;
TimeKeeper.Bpm = songData.Bpm;
@@ -102,7 +103,7 @@ public void Initialize(SongData songData)
public void BeginTweens()
{
if (ArrowTween != null)
- this.ArrowTween.Kill();
+ ArrowTween.Kill();
//This could be good as a function to call on something, to have many things animated to the beat.
ArrowTween = CreateTween();
ArrowTween
diff --git a/Scenes/CustomSong/CustomScore.cs b/Scenes/CustomSong/CustomScore.cs
new file mode 100644
index 00000000..83a1c8af
--- /dev/null
+++ b/Scenes/CustomSong/CustomScore.cs
@@ -0,0 +1,89 @@
+using System;
+using System.Globalization;
+using FunkEngine;
+using Godot;
+
+public partial class CustomScore : CanvasLayer
+{
+ public const string LoadPath = "res://Scenes/CustomSong/CustomScoreScreen.tscn";
+
+ private enum ScoringVals
+ {
+ PlayerHP = 0,
+ EnemyHP = 1,
+ NotesPlaced = 2,
+ Perfects = 3,
+ Misses = 4,
+ Loops = 5,
+ }
+
+ private float[] score = new float[6];
+
+ [Export]
+ private Label[] _amtLabels = new Label[6];
+
+ [Export]
+ private Button _acceptButton;
+
+ public delegate void FinishedHandler();
+ public event FinishedHandler Finished;
+
+ public void ListenToDirector()
+ {
+ BattleDirector.Harbinger.Instance.NoteHit += e =>
+ {
+ if (e is not BattleDirector.Harbinger.NoteHitArgs nArgs)
+ return;
+ switch (nArgs.Timing)
+ {
+ case Timing.Perfect:
+ score[(int)ScoringVals.Perfects] += 1;
+ break;
+ case Timing.Miss:
+ score[(int)ScoringVals.Misses] += 1;
+ break;
+ }
+ };
+ BattleDirector.Harbinger.Instance.NotePlaced += _ =>
+ {
+ score[(int)ScoringVals.NotesPlaced] += 1;
+ };
+ }
+
+ public CustomScore ShowResults(BattleDirector battleDirector, float enemyPercent)
+ {
+ score[(int)ScoringVals.Loops] = TimeKeeper.LastBeat.Loop;
+ score[(int)ScoringVals.PlayerHP] =
+ (float)battleDirector.Player.GetCurrentHealth()
+ / StageProducer.PlayerStats.MaxHealth
+ * 100;
+ score[(int)ScoringVals.EnemyHP] = enemyPercent * 100;
+
+ for (int i = 0; i < 6; i++)
+ {
+ _amtLabels[i].Text = score[i].ToString("0");
+ if (i == (int)ScoringVals.PlayerHP || i == (int)ScoringVals.EnemyHP)
+ _amtLabels[i].Text += "%";
+ }
+ battleDirector.AddChild(this);
+ battleDirector.ProcessMode = ProcessModeEnum.Disabled;
+
+ return this;
+ }
+
+ public override void _Ready()
+ {
+ _acceptButton.Pressed += FinishScoring;
+ }
+
+ public override void _Process(double delta)
+ {
+ _acceptButton.GrabFocus();
+ }
+
+ private void FinishScoring()
+ {
+ Finished?.Invoke();
+ QueueFree();
+ }
+}
diff --git a/Scenes/CustomSong/CustomScore.cs.uid b/Scenes/CustomSong/CustomScore.cs.uid
new file mode 100644
index 00000000..0253254f
--- /dev/null
+++ b/Scenes/CustomSong/CustomScore.cs.uid
@@ -0,0 +1 @@
+uid://d2wb4jlf3iphf
diff --git a/Scenes/CustomSong/CustomScoreScreen.tscn b/Scenes/CustomSong/CustomScoreScreen.tscn
new file mode 100644
index 00000000..39602b92
--- /dev/null
+++ b/Scenes/CustomSong/CustomScoreScreen.tscn
@@ -0,0 +1,201 @@
+[gd_scene load_steps=6 format=3 uid="uid://de8eb06i6ftr"]
+
+[ext_resource type="Script" uid="uid://d2wb4jlf3iphf" path="res://Scenes/CustomSong/CustomScore.cs" id="1_qqyeb"]
+[ext_resource type="Texture2D" uid="uid://ck16vyh1q68ri" path="res://Scenes/UI/Assets/UI_ForestBackground.png" id="2_f5eg8"]
+[ext_resource type="Texture2D" uid="uid://8u3xvcma81d" path="res://Scenes/UI/Assets/UI_CrystalFrame.png" id="3_5fo4y"]
+[ext_resource type="Texture2D" uid="uid://burj10os057fx" path="res://Scenes/UI/Assets/UI_CrystalFrameInset.png" id="4_pghd5"]
+[ext_resource type="Theme" uid="uid://d37e3tpsbxwak" path="res://Scenes/UI/Assets/GeneralTheme.tres" id="6_ql2an"]
+
+[node name="ScoreScreen" type="CanvasLayer" node_paths=PackedStringArray("_amtLabels", "_acceptButton")]
+process_mode = 3
+script = ExtResource("1_qqyeb")
+_amtLabels = [NodePath("Bg/WindowMargin/VBoxContainer/MarginContainer/HBoxContainer/LabelMargin/LabelVbox/HBoxContainer/PlayerHPPercent"), NodePath("Bg/WindowMargin/VBoxContainer/MarginContainer/HBoxContainer/LabelMargin/LabelVbox/HBoxContainer2/EnemyHPPercent"), NodePath("Bg/WindowMargin/VBoxContainer/MarginContainer/HBoxContainer/LabelMargin/LabelVbox/HBoxContainer3/NotesPlacedAmt"), NodePath("Bg/WindowMargin/VBoxContainer/MarginContainer/HBoxContainer/LabelMargin/LabelVbox/HBoxContainer4/PerfectAmt"), NodePath("Bg/WindowMargin/VBoxContainer/MarginContainer/HBoxContainer/LabelMargin/LabelVbox/HBoxContainer5/MissedAmt"), NodePath("Bg/WindowMargin/VBoxContainer/MarginContainer/HBoxContainer/LabelMargin/LabelVbox/HBoxContainer6/LoopsAmt")]
+_acceptButton = NodePath("Bg/WindowMargin/VBoxContainer/ButtonMargin/AcceptButton")
+
+[node name="Bg" type="NinePatchRect" parent="."]
+self_modulate = Color(1, 1, 1, 0.75)
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+texture = ExtResource("2_f5eg8")
+patch_margin_left = 100
+patch_margin_top = 100
+patch_margin_right = 102
+patch_margin_bottom = 100
+
+[node name="WindowMargin" type="MarginContainer" parent="Bg"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_constants/margin_left = 175
+theme_override_constants/margin_top = 50
+theme_override_constants/margin_right = 175
+theme_override_constants/margin_bottom = 50
+
+[node name="PanelBg" type="NinePatchRect" parent="Bg/WindowMargin"]
+self_modulate = Color(1, 1, 1, 0.75)
+layout_mode = 2
+texture = ExtResource("3_5fo4y")
+patch_margin_left = 30
+patch_margin_top = 10
+patch_margin_right = 20
+patch_margin_bottom = 27
+
+[node name="VBoxContainer" type="VBoxContainer" parent="Bg/WindowMargin"]
+layout_mode = 2
+
+[node name="TitleContainer" type="MarginContainer" parent="Bg/WindowMargin/VBoxContainer"]
+layout_mode = 2
+
+[node name="TopPanelBg" type="NinePatchRect" parent="Bg/WindowMargin/VBoxContainer/TitleContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+size_flags_stretch_ratio = 0.25
+texture = ExtResource("3_5fo4y")
+patch_margin_left = 30
+patch_margin_top = 10
+patch_margin_right = 20
+patch_margin_bottom = 27
+
+[node name="Title" type="CenterContainer" parent="Bg/WindowMargin/VBoxContainer/TitleContainer"]
+layout_mode = 2
+
+[node name="TitleText" type="RichTextLabel" parent="Bg/WindowMargin/VBoxContainer/TitleContainer/Title"]
+custom_minimum_size = Vector2(400, 47)
+layout_mode = 2
+theme_override_font_sizes/normal_font_size = 32
+bbcode_enabled = true
+text = "CUSTOM_RESULTS"
+horizontal_alignment = 1
+vertical_alignment = 1
+
+[node name="MarginContainer" type="MarginContainer" parent="Bg/WindowMargin/VBoxContainer"]
+layout_mode = 2
+size_flags_vertical = 3
+theme_override_constants/margin_left = 6
+theme_override_constants/margin_top = 0
+theme_override_constants/margin_right = 6
+theme_override_constants/margin_bottom = 4
+
+[node name="BottomPanelBg" type="NinePatchRect" parent="Bg/WindowMargin/VBoxContainer/MarginContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+texture = ExtResource("4_pghd5")
+patch_margin_left = 30
+patch_margin_top = 10
+patch_margin_right = 20
+patch_margin_bottom = 27
+
+[node name="HBoxContainer" type="HBoxContainer" parent="Bg/WindowMargin/VBoxContainer/MarginContainer"]
+layout_mode = 2
+size_flags_vertical = 3
+
+[node name="LabelMargin" type="MarginContainer" parent="Bg/WindowMargin/VBoxContainer/MarginContainer/HBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_constants/margin_left = 8
+theme_override_constants/margin_top = 8
+theme_override_constants/margin_right = 8
+theme_override_constants/margin_bottom = 8
+
+[node name="LabelVbox" type="VBoxContainer" parent="Bg/WindowMargin/VBoxContainer/MarginContainer/HBoxContainer/LabelMargin"]
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_constants/separation = 11
+alignment = 1
+
+[node name="HBoxContainer" type="HBoxContainer" parent="Bg/WindowMargin/VBoxContainer/MarginContainer/HBoxContainer/LabelMargin/LabelVbox"]
+layout_mode = 2
+
+[node name="PlayerHP" type="Label" parent="Bg/WindowMargin/VBoxContainer/MarginContainer/HBoxContainer/LabelMargin/LabelVbox/HBoxContainer"]
+layout_mode = 2
+text = "CUSTOM_PLAYER_HP"
+
+[node name="PlayerHPPercent" type="Label" parent="Bg/WindowMargin/VBoxContainer/MarginContainer/HBoxContainer/LabelMargin/LabelVbox/HBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 10
+text = "999"
+horizontal_alignment = 2
+
+[node name="HBoxContainer2" type="HBoxContainer" parent="Bg/WindowMargin/VBoxContainer/MarginContainer/HBoxContainer/LabelMargin/LabelVbox"]
+layout_mode = 2
+
+[node name="EnemyHP" type="Label" parent="Bg/WindowMargin/VBoxContainer/MarginContainer/HBoxContainer/LabelMargin/LabelVbox/HBoxContainer2"]
+layout_mode = 2
+text = "CUSTOM_ENEMY_HP"
+
+[node name="EnemyHPPercent" type="Label" parent="Bg/WindowMargin/VBoxContainer/MarginContainer/HBoxContainer/LabelMargin/LabelVbox/HBoxContainer2"]
+layout_mode = 2
+size_flags_horizontal = 10
+text = "999"
+horizontal_alignment = 2
+
+[node name="HBoxContainer3" type="HBoxContainer" parent="Bg/WindowMargin/VBoxContainer/MarginContainer/HBoxContainer/LabelMargin/LabelVbox"]
+layout_mode = 2
+
+[node name="NotesPlaced" type="Label" parent="Bg/WindowMargin/VBoxContainer/MarginContainer/HBoxContainer/LabelMargin/LabelVbox/HBoxContainer3"]
+layout_mode = 2
+text = "CUSTOM_NOTES_PLACED"
+
+[node name="NotesPlacedAmt" type="Label" parent="Bg/WindowMargin/VBoxContainer/MarginContainer/HBoxContainer/LabelMargin/LabelVbox/HBoxContainer3"]
+layout_mode = 2
+size_flags_horizontal = 10
+text = "999"
+horizontal_alignment = 2
+
+[node name="HBoxContainer4" type="HBoxContainer" parent="Bg/WindowMargin/VBoxContainer/MarginContainer/HBoxContainer/LabelMargin/LabelVbox"]
+layout_mode = 2
+
+[node name="Perfects" type="Label" parent="Bg/WindowMargin/VBoxContainer/MarginContainer/HBoxContainer/LabelMargin/LabelVbox/HBoxContainer4"]
+layout_mode = 2
+text = "CUSTOM_PERFECTS"
+
+[node name="PerfectAmt" type="Label" parent="Bg/WindowMargin/VBoxContainer/MarginContainer/HBoxContainer/LabelMargin/LabelVbox/HBoxContainer4"]
+layout_mode = 2
+size_flags_horizontal = 10
+text = "999"
+horizontal_alignment = 2
+
+[node name="HBoxContainer5" type="HBoxContainer" parent="Bg/WindowMargin/VBoxContainer/MarginContainer/HBoxContainer/LabelMargin/LabelVbox"]
+layout_mode = 2
+
+[node name="Misses" type="Label" parent="Bg/WindowMargin/VBoxContainer/MarginContainer/HBoxContainer/LabelMargin/LabelVbox/HBoxContainer5"]
+layout_mode = 2
+text = "CUSTOM_MISSES"
+
+[node name="MissedAmt" type="Label" parent="Bg/WindowMargin/VBoxContainer/MarginContainer/HBoxContainer/LabelMargin/LabelVbox/HBoxContainer5"]
+layout_mode = 2
+size_flags_horizontal = 10
+text = "999"
+horizontal_alignment = 2
+
+[node name="HBoxContainer6" type="HBoxContainer" parent="Bg/WindowMargin/VBoxContainer/MarginContainer/HBoxContainer/LabelMargin/LabelVbox"]
+layout_mode = 2
+
+[node name="LoopsTake" type="Label" parent="Bg/WindowMargin/VBoxContainer/MarginContainer/HBoxContainer/LabelMargin/LabelVbox/HBoxContainer6"]
+layout_mode = 2
+text = "CUSTOM_LOOPS_TAKEN"
+
+[node name="LoopsAmt" type="Label" parent="Bg/WindowMargin/VBoxContainer/MarginContainer/HBoxContainer/LabelMargin/LabelVbox/HBoxContainer6"]
+layout_mode = 2
+size_flags_horizontal = 10
+text = "999"
+horizontal_alignment = 2
+
+[node name="ButtonMargin" type="MarginContainer" parent="Bg/WindowMargin/VBoxContainer"]
+layout_mode = 2
+theme_override_constants/margin_top = -3
+theme_override_constants/margin_bottom = 9
+
+[node name="AcceptButton" type="Button" parent="Bg/WindowMargin/VBoxContainer/ButtonMargin"]
+layout_mode = 2
+size_flags_horizontal = 6
+theme = ExtResource("6_ql2an")
+text = "ESCAPE_MENU_TITLE"
diff --git a/Scenes/CustomSong/CustomSelection.tscn b/Scenes/CustomSong/CustomSelection.tscn
new file mode 100644
index 00000000..270bb5b2
--- /dev/null
+++ b/Scenes/CustomSong/CustomSelection.tscn
@@ -0,0 +1,134 @@
+[gd_scene load_steps=5 format=3 uid="uid://4afpdcupy6x"]
+
+[ext_resource type="Script" uid="uid://cvt1bucvy5o2b" path="res://Scenes/CustomSong/Scripts/CustomSelection.cs" id="1_2bets"]
+[ext_resource type="Texture2D" uid="uid://ck16vyh1q68ri" path="res://Scenes/UI/Assets/UI_ForestBackground.png" id="1_2j36x"]
+[ext_resource type="Texture2D" uid="uid://djd6iw2g84bba" path="res://Scenes/UI/Assets/UI_CenterFrame.png" id="2_2bets"]
+[ext_resource type="Theme" uid="uid://d37e3tpsbxwak" path="res://Scenes/UI/Assets/GeneralTheme.tres" id="4_fvo50"]
+
+[node name="CustomSongMenu" type="CanvasLayer" node_paths=PackedStringArray("_returnButton", "_songList", "_songDescription", "_focused")]
+process_mode = 3
+script = ExtResource("1_2bets")
+_returnButton = NodePath("Control/ReturnButton")
+_songList = NodePath("Control/Background/MarginContainer/HBoxContainer/MarginContainer2/ScrollContainer/Songs")
+_songDescription = NodePath("Control/Background/MarginContainer/HBoxContainer/MarginContainer/OptionsBackground/MarginContainer/SongDetails")
+_focused = NodePath("Control/ReturnButton")
+
+[node name="Control" type="Control" parent="."]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="Background" type="NinePatchRect" parent="Control"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+texture = ExtResource("1_2j36x")
+patch_margin_left = 105
+patch_margin_top = 100
+patch_margin_right = 105
+patch_margin_bottom = 100
+
+[node name="MarginContainer" type="MarginContainer" parent="Control/Background"]
+layout_mode = 1
+anchors_preset = 8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -255.0
+offset_top = -155.0
+offset_right = 255.0
+offset_bottom = 105.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_constants/margin_left = 5
+theme_override_constants/margin_top = 5
+theme_override_constants/margin_right = 5
+theme_override_constants/margin_bottom = 5
+
+[node name="OptionsBackground" type="NinePatchRect" parent="Control/Background/MarginContainer"]
+layout_mode = 2
+texture = ExtResource("2_2bets")
+patch_margin_left = 5
+patch_margin_top = 5
+patch_margin_right = 5
+patch_margin_bottom = 5
+
+[node name="HBoxContainer" type="HBoxContainer" parent="Control/Background/MarginContainer"]
+custom_minimum_size = Vector2(500, 250)
+layout_mode = 2
+
+[node name="MarginContainer2" type="MarginContainer" parent="Control/Background/MarginContainer/HBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_constants/margin_left = 8
+theme_override_constants/margin_top = 8
+theme_override_constants/margin_bottom = 8
+
+[node name="ScrollContainer" type="ScrollContainer" parent="Control/Background/MarginContainer/HBoxContainer/MarginContainer2"]
+layout_mode = 2
+size_flags_horizontal = 3
+follow_focus = true
+horizontal_scroll_mode = 0
+
+[node name="Songs" type="VBoxContainer" parent="Control/Background/MarginContainer/HBoxContainer/MarginContainer2/ScrollContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="MarginContainer" type="MarginContainer" parent="Control/Background/MarginContainer/HBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_constants/margin_top = 4
+theme_override_constants/margin_right = 4
+theme_override_constants/margin_bottom = 4
+
+[node name="OptionsBackground" type="NinePatchRect" parent="Control/Background/MarginContainer/HBoxContainer/MarginContainer"]
+layout_mode = 2
+texture = ExtResource("2_2bets")
+patch_margin_left = 5
+patch_margin_top = 5
+patch_margin_right = 5
+patch_margin_bottom = 5
+
+[node name="MarginContainer" type="MarginContainer" parent="Control/Background/MarginContainer/HBoxContainer/MarginContainer/OptionsBackground"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_constants/margin_left = 4
+theme_override_constants/margin_top = 4
+theme_override_constants/margin_right = 4
+theme_override_constants/margin_bottom = 4
+
+[node name="SongDetails" type="Label" parent="Control/Background/MarginContainer/HBoxContainer/MarginContainer/OptionsBackground/MarginContainer"]
+layout_mode = 2
+size_flags_vertical = 1
+horizontal_alignment = 1
+vertical_alignment = 1
+
+[node name="ReturnButton" type="Button" parent="Control"]
+layout_mode = 1
+anchors_preset = 7
+anchor_left = 0.5
+anchor_top = 1.0
+anchor_right = 0.5
+anchor_bottom = 1.0
+offset_left = -91.5
+offset_top = -59.0
+offset_right = 91.5
+offset_bottom = -22.0
+grow_horizontal = 2
+grow_vertical = 0
+theme = ExtResource("4_fvo50")
+text = "CONTROLS_RETURN_BUTTON"
diff --git a/Scenes/CustomSong/Scripts/CustomSelection.cs b/Scenes/CustomSong/Scripts/CustomSelection.cs
new file mode 100644
index 00000000..da7dc166
--- /dev/null
+++ b/Scenes/CustomSong/Scripts/CustomSelection.cs
@@ -0,0 +1,164 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using FunkEngine;
+using FunkEngine.Classes.MidiMaestro;
+using Godot;
+using FileAccess = Godot.FileAccess;
+
+public partial class CustomSelection : CanvasLayer, IFocusableMenu
+{
+ public const string LoadPath = "res://Scenes/CustomSong/CustomSelection.tscn";
+ public const string UserSongDir = "user://Exports/";
+
+ [Export]
+ private Button _returnButton;
+
+ [Export]
+ private VBoxContainer _songList;
+
+ [Export]
+ private Label _songDescription;
+
+ private DirAccess _dirAccess = DirAccess.Open(UserSongDir);
+ readonly List _customSongs = new List();
+
+ public override void _EnterTree()
+ {
+ _returnButton.Pressed += ReturnToPrev;
+
+ if (!DirAccess.DirExistsAbsolute(UserSongDir))
+ DirAccess.Open("user://").MakeDirRecursive(UserSongDir);
+ _dirAccess = DirAccess.Open(UserSongDir);
+ if (_dirAccess == null)
+ {
+ GD.PushWarning("Could not open user song directory!");
+ return;
+ }
+ foreach (string file in _dirAccess.GetFiles())
+ {
+ if (file.GetExtension() == "sontem")
+ {
+ SongTemplate result = SongTemplate.CreateFromPath(UserSongDir + file);
+ _customSongs.Add(result);
+ }
+ }
+ }
+
+ SongTemplate _selectedSong;
+
+ public override void _Ready()
+ {
+ foreach (SongTemplate song in _customSongs)
+ {
+ DisplayButton newButton = GD.Load(DisplayButton.LoadPath)
+ .Instantiate();
+ _songList.AddChild(newButton);
+ if (song.Chart == null)
+ {
+ newButton.Text = Tr(song.Name);
+ newButton.Disabled = true;
+ newButton.FocusEntered += () =>
+ {
+ _songDescription.Text = song.EnemyScenePath[0];
+ };
+ continue;
+ }
+ if (!FileAccess.FileExists(UserSongDir + song.Chart.SongMapLocation))
+ {
+ newButton.Text = Tr("CUSTOM_SONG_NOT_FOUND");
+ newButton.Disabled = true;
+ newButton.FocusEntered += () =>
+ {
+ _songDescription.Text = UserSongDir + song.Chart.SongMapLocation;
+ };
+ continue;
+ }
+
+ float arbitraryDifficulty = 0;
+ arbitraryDifficulty += (float)song.Chart.Bpm / 120;
+ arbitraryDifficulty += (float)song.Chart.GetLane(ArrowType.Up).Count / 10;
+ arbitraryDifficulty += (float)song.Chart.GetLane(ArrowType.Right).Count / 10;
+ arbitraryDifficulty += (float)song.Chart.GetLane(ArrowType.Left).Count / 10;
+ arbitraryDifficulty += (float)song.Chart.GetLane(ArrowType.Down).Count / 10;
+ arbitraryDifficulty = (float)Math.Floor(arbitraryDifficulty);
+
+ newButton.Text = song.Name;
+ newButton.FocusEntered += () =>
+ {
+ _songDescription.Text =
+ song.Name
+ + "\n \n"
+ + Tr("CUSTOM_SONG")
+ + song.Chart.SongMapLocation
+ + "\n"
+ + Tr("CUSTOM_BPM")
+ + song.Chart.Bpm
+ + "\n"
+ + Tr("CUSTOM_LOOPS")
+ + song.Chart.NumLoops
+ + "\n"
+ + Tr("CUSTOM_DIFFICULTY")
+ + new string('\u2605', (int)arbitraryDifficulty);
+
+ _selectedSong = song;
+ };
+ newButton.Pressed += StartCustomSelection;
+ }
+ }
+
+ private void StartCustomSelection()
+ {
+ BgAudioPlayer.LiveInstance.StopMusic();
+ StageProducer.LiveInstance.TransitionToCustom(_selectedSong);
+ }
+
+ #region IFocusableMenu
+ public IFocusableMenu Prev { get; set; }
+ private ProcessModeEnum _previousProcessMode;
+
+ [Export]
+ private Control _focused;
+
+ public void ResumeFocus()
+ {
+ ProcessMode = _previousProcessMode;
+ _focused.GrabFocus();
+ }
+
+ public void PauseFocus()
+ {
+ _focused = GetViewport().GuiGetFocusOwner();
+ _previousProcessMode = ProcessMode;
+ ProcessMode = ProcessModeEnum.Disabled;
+ }
+
+ public void OpenMenu(IFocusableMenu prev)
+ {
+ Prev = prev;
+ Prev.PauseFocus();
+ _focused.GrabFocus();
+ }
+
+ public void ReturnToPrev()
+ {
+ StageProducer.LiveInstance.LastStage = Stages.Title;
+ Prev.ResumeFocus();
+ QueueFree();
+ }
+
+ public override void _Input(InputEvent @event)
+ {
+ if (ControlSettings.IsOutOfFocus(this))
+ {
+ GetViewport().SetInputAsHandled();
+ return;
+ }
+ if (@event.IsActionPressed("ui_cancel"))
+ {
+ ReturnToPrev();
+ GetViewport().SetInputAsHandled();
+ }
+ }
+ #endregion
+}
diff --git a/Scenes/CustomSong/Scripts/CustomSelection.cs.uid b/Scenes/CustomSong/Scripts/CustomSelection.cs.uid
new file mode 100644
index 00000000..87272ed3
--- /dev/null
+++ b/Scenes/CustomSong/Scripts/CustomSelection.cs.uid
@@ -0,0 +1 @@
+uid://cvt1bucvy5o2b
diff --git a/Scenes/Puppets/Enemies/Keythulu/P_Keythulu.cs b/Scenes/Puppets/Enemies/Keythulu/P_Keythulu.cs
index 587c878d..91fff8ea 100644
--- a/Scenes/Puppets/Enemies/Keythulu/P_Keythulu.cs
+++ b/Scenes/Puppets/Enemies/Keythulu/P_Keythulu.cs
@@ -65,7 +65,10 @@ public override void _Ready()
1,
(e, eff, val) =>
{
- if (e is not BattleDirector.Harbinger.OnDamageInstanceArgs dArgs)
+ if (
+ StageProducer.Config.RoomType == Stages.Custom
+ || e is not BattleDirector.Harbinger.OnDamageInstanceArgs dArgs
+ )
return;
if (
dArgs.Dmg.Target == this
@@ -73,6 +76,7 @@ public override void _Ready()
)
{
SteamWhisperer.PopAchievement("actTwoComp");
+ SaveSystem.UpdateConfig(SaveSystem.ConfigSettings.HasWon, true);
}
}
),
diff --git a/Scenes/UI/Assets/DisplayButtonTheme.tres b/Scenes/UI/Assets/DisplayButtonTheme.tres
index 723e48bd..2d54291a 100644
--- a/Scenes/UI/Assets/DisplayButtonTheme.tres
+++ b/Scenes/UI/Assets/DisplayButtonTheme.tres
@@ -1,4 +1,4 @@
-[gd_resource type="Theme" load_steps=9 format=3 uid="uid://ckecvh3spna35"]
+[gd_resource type="Theme" load_steps=15 format=3 uid="uid://ckecvh3spna35"]
[ext_resource type="Texture2D" uid="uid://cegasble5d7uw" path="res://Scenes/UI/Assets/UI_Selection.png" id="1_2cv7a"]
[ext_resource type="Texture2D" uid="uid://burj10os057fx" path="res://Scenes/UI/Assets/UI_CrystalFrameInset.png" id="1_cx0nq"]
@@ -49,6 +49,51 @@ texture_margin_right = 6.0
texture_margin_bottom = 6.0
modulate_color = Color(2, 2, 2, 0.8)
+[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_m0rnd"]
+texture = ExtResource("1_cx0nq")
+texture_margin_left = 6.0
+texture_margin_top = 6.0
+texture_margin_right = 6.0
+texture_margin_bottom = 6.0
+modulate_color = Color(1, 1, 1, 0.8)
+
+[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_juphm"]
+texture = ExtResource("1_2cv7a")
+texture_margin_left = 20.0
+texture_margin_top = 20.0
+texture_margin_right = 20.0
+texture_margin_bottom = 20.0
+
+[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_nysmq"]
+texture = ExtResource("1_cx0nq")
+texture_margin_left = 6.0
+texture_margin_top = 6.0
+texture_margin_right = 6.0
+texture_margin_bottom = 6.0
+
+[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_p2uoo"]
+texture = ExtResource("1_cx0nq")
+texture_margin_left = 6.0
+texture_margin_top = 6.0
+texture_margin_right = 6.0
+texture_margin_bottom = 6.0
+
+[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_5a8h5"]
+texture = ExtResource("1_cx0nq")
+texture_margin_left = 6.0
+texture_margin_top = 6.0
+texture_margin_right = 6.0
+texture_margin_bottom = 6.0
+modulate_color = Color(1, 1, 1, 0.8)
+
+[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_bo0wt"]
+texture = ExtResource("1_cx0nq")
+texture_margin_left = 6.0
+texture_margin_top = 6.0
+texture_margin_right = 6.0
+texture_margin_bottom = 6.0
+modulate_color = Color(1, 1, 1, 0.8)
+
[resource]
Button/styles/disabled = SubResource("StyleBoxTexture_7041q")
Button/styles/focus = SubResource("StyleBoxTexture_2t3ig")
@@ -56,3 +101,10 @@ Button/styles/hover = SubResource("StyleBoxTexture_qs7pc")
Button/styles/hover_pressed = SubResource("StyleBoxTexture_yqny2")
Button/styles/normal = SubResource("StyleBoxTexture_2cv7a")
Button/styles/pressed = SubResource("StyleBoxTexture_5plxl")
+nopress/base_type = &"Button"
+nopress/styles/disabled = SubResource("StyleBoxTexture_m0rnd")
+nopress/styles/focus = SubResource("StyleBoxTexture_juphm")
+nopress/styles/hover = SubResource("StyleBoxTexture_nysmq")
+nopress/styles/hover_pressed = SubResource("StyleBoxTexture_p2uoo")
+nopress/styles/normal = SubResource("StyleBoxTexture_5a8h5")
+nopress/styles/pressed = SubResource("StyleBoxTexture_bo0wt")
diff --git a/Scenes/UI/Assets/GeneralTheme.tres b/Scenes/UI/Assets/GeneralTheme.tres
index cdbaff2f..3b35e005 100644
--- a/Scenes/UI/Assets/GeneralTheme.tres
+++ b/Scenes/UI/Assets/GeneralTheme.tres
@@ -1,8 +1,9 @@
-[gd_resource type="Theme" load_steps=12 format=3 uid="uid://d37e3tpsbxwak"]
+[gd_resource type="Theme" load_steps=22 format=3 uid="uid://d37e3tpsbxwak"]
[ext_resource type="Texture2D" uid="uid://dj0nfgig1kd5l" path="res://Scenes/UI/Assets/3DButton.png" id="1_nsq46"]
[ext_resource type="Texture2D" uid="uid://cegasble5d7uw" path="res://Scenes/UI/Assets/UI_Selection.png" id="2_d2tmw"]
[ext_resource type="Texture2D" uid="uid://b5jfffpaextmp" path="res://Scenes/UI/Assets/3DButtonPressed.png" id="2_i0sgk"]
+[ext_resource type="Texture2D" uid="uid://djd6iw2g84bba" path="res://Scenes/UI/Assets/UI_CenterFrame.png" id="4_fcxv1"]
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_agpvv"]
texture = ExtResource("1_nsq46")
@@ -51,13 +52,90 @@ texture_margin_right = 9.0
texture_margin_bottom = 13.0
modulate_color = Color(0.801938, 0.00206308, 0.972656, 0.8)
+[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_fcxv1"]
+texture = ExtResource("2_d2tmw")
+texture_margin_left = 20.0
+texture_margin_top = 20.0
+texture_margin_right = 20.0
+texture_margin_bottom = 20.0
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_o3ngu"]
+content_margin_left = 4.0
+content_margin_top = 4.0
+content_margin_right = 4.0
+content_margin_bottom = 4.0
+bg_color = Color(0.584, 0.004, 0.725, 0.4)
+corner_radius_top_left = 4
+corner_radius_top_right = 4
+corner_radius_bottom_right = 4
+corner_radius_bottom_left = 4
+corner_detail = 6
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_x6kye"]
+content_margin_left = 4.0
+content_margin_top = 4.0
+content_margin_right = 4.0
+content_margin_bottom = 4.0
+bg_color = Color(0.754963, 0.0147022, 0.93338, 0.9)
+corner_radius_top_left = 4
+corner_radius_top_right = 4
+corner_radius_bottom_right = 4
+corner_radius_bottom_left = 4
+corner_detail = 6
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_gstb8"]
+content_margin_left = 4.0
+content_margin_top = 4.0
+content_margin_right = 4.0
+content_margin_bottom = 4.0
+bg_color = Color(0.89, 0.8, 1, 0.2)
+corner_radius_top_left = 4
+corner_radius_top_right = 4
+corner_radius_bottom_right = 4
+corner_radius_bottom_left = 4
+corner_detail = 6
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_a72e7"]
+bg_color = Color(1, 1, 1, 0.25)
+
+[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_o3ngu"]
+texture = ExtResource("4_fcxv1")
+texture_margin_left = 6.0
+texture_margin_top = 6.0
+texture_margin_right = 6.0
+texture_margin_bottom = 6.0
+
+[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_fcxv1"]
+load_path = "res://.godot/imported/UI_Selection.png-8c5709c8210ccab47a36d274ec2686c0.ctex"
+
+[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_a72e7"]
+texture = SubResource("CompressedTexture2D_fcxv1")
+texture_margin_left = 20.0
+texture_margin_top = 21.0
+texture_margin_right = 20.0
+expand_margin_left = 1.0
+expand_margin_top = 2.0
+expand_margin_right = 1.0
+expand_margin_bottom = 2.0
+region_rect = Rect2(0, 0, 98, 20)
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_fcxv1"]
+content_margin_left = 10.0
+content_margin_top = 4.0
+content_margin_right = 10.0
+content_margin_bottom = 4.0
+bg_color = Color(0.039, 0.012, 0.149, 0.75)
+border_color = Color(0.175, 0.175, 0.175, 1)
+corner_detail = 1
+
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_crcjn"]
content_margin_left = 10.0
content_margin_top = 4.0
content_margin_right = 10.0
content_margin_bottom = 4.0
-bg_color = Color(0.1, 0.1, 0.1, 1)
+bg_color = Color(0.0392157, 0.0117647, 0.145098, 1)
border_width_top = 2
+border_color = Color(0.890196, 0.8, 1, 1)
corner_detail = 1
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_gxcar"]
@@ -65,9 +143,7 @@ content_margin_left = 10.0
content_margin_top = 4.0
content_margin_right = 10.0
content_margin_bottom = 4.0
-bg_color = Color(0, 0, 0, 0.8)
-border_width_left = 1
-border_width_right = 1
+bg_color = Color(0.039, 0.012, 0.149, 0.75)
border_color = Color(0.175, 0.175, 0.175, 1)
corner_detail = 1
@@ -91,5 +167,13 @@ Button/styles/hover = SubResource("StyleBoxTexture_crcjn")
Button/styles/hover_pressed = SubResource("StyleBoxTexture_gxcar")
Button/styles/normal = SubResource("StyleBoxTexture_a6bcw")
Button/styles/pressed = SubResource("StyleBoxTexture_3eh60")
+CheckBox/styles/focus = SubResource("StyleBoxTexture_fcxv1")
+HSlider/styles/grabber_area = SubResource("StyleBoxFlat_o3ngu")
+HSlider/styles/grabber_area_highlight = SubResource("StyleBoxFlat_x6kye")
+HSlider/styles/slider = SubResource("StyleBoxFlat_gstb8")
+PopupMenu/styles/hover = SubResource("StyleBoxFlat_a72e7")
+PopupMenu/styles/panel = SubResource("StyleBoxTexture_o3ngu")
+TabContainer/styles/tab_focus = SubResource("StyleBoxTexture_a72e7")
+TabContainer/styles/tab_hovered = SubResource("StyleBoxFlat_fcxv1")
TabContainer/styles/tab_selected = SubResource("StyleBoxFlat_crcjn")
TabContainer/styles/tab_unselected = SubResource("StyleBoxFlat_gxcar")
diff --git a/Scenes/UI/Inventory.tscn b/Scenes/UI/Inventory.tscn
index 7fa6e6ab..123d27ab 100644
--- a/Scenes/UI/Inventory.tscn
+++ b/Scenes/UI/Inventory.tscn
@@ -1,7 +1,8 @@
-[gd_scene load_steps=6 format=3 uid="uid://be6fb2sr5i515"]
+[gd_scene load_steps=7 format=3 uid="uid://be6fb2sr5i515"]
[ext_resource type="Script" uid="uid://kqa0ovjph1hd" path="res://Scenes/UI/Scripts/Inventory.cs" id="1_8rcwd"]
[ext_resource type="Texture2D" uid="uid://ck16vyh1q68ri" path="res://Scenes/UI/Assets/UI_ForestBackground.png" id="2_s6pj7"]
+[ext_resource type="Theme" uid="uid://d37e3tpsbxwak" path="res://Scenes/UI/Assets/GeneralTheme.tres" id="3_e51wb"]
[ext_resource type="Texture2D" uid="uid://8u3xvcma81d" path="res://Scenes/UI/Assets/UI_CrystalFrame.png" id="3_s6pj7"]
[ext_resource type="Texture2D" uid="uid://burj10os057fx" path="res://Scenes/UI/Assets/UI_CrystalFrameInset.png" id="4_b6trj"]
[ext_resource type="Texture2D" uid="uid://dyt1cvag13aik" path="res://SharedAssets/Money.png" id="5_si1x5"]
@@ -53,6 +54,7 @@ layout_mode = 2
[node name="Tabs" type="TabContainer" parent="MarginContainer/InvenVBox"]
layout_mode = 2
size_flags_vertical = 3
+theme = ExtResource("3_e51wb")
current_tab = 0
clip_tabs = false
diff --git a/Scenes/UI/Options/OptionsMenu.tscn b/Scenes/UI/Options/OptionsMenu.tscn
index 7ae34a3c..f883c248 100644
--- a/Scenes/UI/Options/OptionsMenu.tscn
+++ b/Scenes/UI/Options/OptionsMenu.tscn
@@ -106,6 +106,7 @@ horizontal_alignment = 1
[node name="Volume" type="HSlider" parent="Control/CenterContainer/MarginContainer/MarginContainer/VBoxContainer/Container"]
layout_mode = 2
tooltip_text = "OPTIONS_VOLUME_LABEL"
+theme = ExtResource("4_r616m")
max_value = 1.0
step = 0.01
value = 1.0
diff --git a/Scenes/UI/ScoreScreen.tscn b/Scenes/UI/ScoreScreen.tscn
index 5fa20eb6..53b3715c 100644
--- a/Scenes/UI/ScoreScreen.tscn
+++ b/Scenes/UI/ScoreScreen.tscn
@@ -49,6 +49,7 @@ theme_override_constants/margin_bottom = 50
[node name="PanelBg" type="NinePatchRect" parent="Bg/WindowMargin"]
self_modulate = Color(1, 1, 1, 0.75)
+custom_minimum_size = Vector2(0, 280)
layout_mode = 2
texture = ExtResource("2_usavq")
patch_margin_left = 30
@@ -65,7 +66,7 @@ grow_horizontal = 2
grow_vertical = 2
[node name="TopPanelBg" type="NinePatchRect" parent="Bg/WindowMargin/PanelBg/VBoxContainer"]
-self_modulate = Color(1, 1, 1, 0.5)
+custom_minimum_size = Vector2(0, 45)
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
@@ -102,7 +103,7 @@ theme_override_constants/margin_right = 4
theme_override_constants/margin_bottom = 4
[node name="BottomPanelBg" type="NinePatchRect" parent="Bg/WindowMargin/PanelBg/VBoxContainer/MarginContainer"]
-self_modulate = Color(1, 1, 1, 0.5)
+custom_minimum_size = Vector2(0, 175)
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
diff --git a/Scenes/UI/Scripts/Inventory.cs b/Scenes/UI/Scripts/Inventory.cs
index 71dd4d93..e28979a8 100644
--- a/Scenes/UI/Scripts/Inventory.cs
+++ b/Scenes/UI/Scripts/Inventory.cs
@@ -40,6 +40,7 @@ private void AddDisplayButtons(IDisplayable[] displayables, Node parentNode)
var newButton = GD.Load(DisplayButton.LoadPath)
.Instantiate();
newButton.Display(item.Texture, item.Name, true);
+ newButton.ThemeTypeVariation = "nopress";
newButton.Pressed += () =>
{
DoDescription(newButton);
diff --git a/Scenes/UI/TitleScreen/Scripts/TitleScreen.cs b/Scenes/UI/TitleScreen/Scripts/TitleScreen.cs
index 65dd551c..50f6c12d 100644
--- a/Scenes/UI/TitleScreen/Scripts/TitleScreen.cs
+++ b/Scenes/UI/TitleScreen/Scripts/TitleScreen.cs
@@ -1,3 +1,4 @@
+using System.Threading.Tasks;
using FunkEngine;
using Godot;
@@ -15,6 +16,9 @@ public partial class TitleScreen : Control, IFocusableMenu
[Export]
public Button Options;
+ [Export]
+ private Button _customSelectionButton;
+
private Control _focused;
public IFocusableMenu Prev { get; set; }
@@ -36,11 +40,16 @@ public override void _UnhandledInput(InputEvent @event)
public override void _EnterTree()
{
BgAudioPlayer.LiveInstance.PlayLevelMusic();
+ Options.Pressed += OpenOptions;
+ _customSelectionButton.Pressed += OpenCustomSelection;
}
public override void _Ready()
{
- Options.Pressed += OpenOptions;
+ if (StageProducer.LiveInstance.LastStage == Stages.Custom)
+ OpenCustomSelection();
+ _customSelectionButton.Visible = (bool)
+ SaveSystem.GetConfigValue(SaveSystem.ConfigSettings.HasWon);
}
public override void _Process(double delta)
@@ -79,13 +88,36 @@ private void OpenOptions()
optionsMenu.OpenMenu(this);
}
+ private void OpenCustomSelection()
+ {
+ CustomSelection customMenu = GD.Load(CustomSelection.LoadPath)
+ .Instantiate();
+ AddChild(customMenu);
+ customMenu.OpenMenu(this);
+ }
+
+ private bool taskStarted = false;
+
private void InitEffects()
{
- if (_effectsPlaceholder is not InstancePlaceholder placeholder)
+ if (taskStarted || _effectsPlaceholder is not InstancePlaceholder placeholder)
return;
- _effectsRoot = placeholder.CreateInstance(true, GD.Load(EffectsLoadPath));
- TextLight = _effectsRoot.GetNode("TextLight");
- TweenLight();
+
+ taskStarted = true;
+ Task.Run(() => //Will need to monitor to make sure this is safe
+ {
+ Callable
+ .From(() =>
+ {
+ _effectsRoot = placeholder.CreateInstance(
+ true,
+ GD.Load(EffectsLoadPath)
+ );
+ TextLight = _effectsRoot.GetNode("TextLight");
+ TweenLight();
+ })
+ .CallDeferred();
+ });
}
private void TweenLight()
diff --git a/Scenes/UI/TitleScreen/TitleScreen.tscn b/Scenes/UI/TitleScreen/TitleScreen.tscn
index 96a32b3a..a7092d37 100644
--- a/Scenes/UI/TitleScreen/TitleScreen.tscn
+++ b/Scenes/UI/TitleScreen/TitleScreen.tscn
@@ -26,7 +26,7 @@ shader_parameter/height = 10.0
shader_parameter/speed = 2.0
shader_parameter/freq = 10.0
-[node name="Title" type="Control" node_paths=PackedStringArray("_effectsPlaceholder", "Options")]
+[node name="Title" type="Control" node_paths=PackedStringArray("_effectsPlaceholder", "Options", "_customSelectionButton")]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
@@ -38,6 +38,7 @@ size_flags_vertical = 3
script = ExtResource("1_r22ha")
_effectsPlaceholder = NodePath("Effects")
Options = NodePath("VBoxContainer/OptionsMargin/Options")
+_customSelectionButton = NodePath("Custom")
[node name="Effects" parent="." instance_placeholder="res://Scenes/UI/TitleScreen/TitleScreenEffects.tscn"]
@@ -221,3 +222,13 @@ focus_neighbor_right = NodePath("../../HBoxContainer/MarginContainer2/Quit")
theme = ExtResource("13_v0au1")
theme_override_font_sizes/font_size = 24
text = "TITLE_OPTIONS"
+
+[node name="Custom" type="Button" parent="."]
+visible = false
+z_index = 1
+layout_mode = 0
+offset_top = 1.0
+offset_right = 113.0
+offset_bottom = 40.0
+theme = ExtResource("13_v0au1")
+text = "CUSTOM_SONG_SELECT"
diff --git a/SharedAssets/SplashScreenGodot.png b/SharedAssets/SplashScreenGodot.png
new file mode 100644
index 00000000..b3275747
Binary files /dev/null and b/SharedAssets/SplashScreenGodot.png differ
diff --git a/SharedAssets/SplashScreenGodot.png.import b/SharedAssets/SplashScreenGodot.png.import
new file mode 100644
index 00000000..c498deb2
--- /dev/null
+++ b/SharedAssets/SplashScreenGodot.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://buc2vne427up1"
+path="res://.godot/imported/SplashScreenGodot.png-d169252b8ad42d7ed1f93c8536ff8bdd.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://SharedAssets/SplashScreenGodot.png"
+dest_files=["res://.godot/imported/SplashScreenGodot.png-d169252b8ad42d7ed1f93c8536ff8bdd.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/project.godot b/project.godot
index 9fb978b4..d9217cef 100644
--- a/project.godot
+++ b/project.godot
@@ -14,6 +14,8 @@ config/name="ProjectFunkEngine"
config/tags=PackedStringArray("cool")
run/main_scene="res://Scenes/UI/TitleScreen/TitleScreen.tscn"
config/features=PackedStringArray("4.4", "C#", "Forward Plus")
+boot_splash/bg_color=Color(0.103744, 0.103744, 0.103744, 1)
+boot_splash/image="uid://buc2vne427up1"
config/icon="res://SharedAssets/Character1.png"
[audio]