diff --git a/Project.xml b/Project.xml
index 5d0c0ee..37d7467 100644
--- a/Project.xml
+++ b/Project.xml
@@ -44,6 +44,8 @@
+
+
@@ -96,4 +98,5 @@
+
diff --git a/art/BoyFriend_Assets.fla b/art/BoyFriend_Assets.fla
index 5ec9206..d656109 100644
Binary files a/art/BoyFriend_Assets.fla and b/art/BoyFriend_Assets.fla differ
diff --git a/art/Monster_Assets.fla b/art/Monster_Assets.fla
new file mode 100644
index 0000000..a3ecb76
Binary files /dev/null and b/art/Monster_Assets.fla differ
diff --git a/art/campaign_menu_UI_assets.fla b/art/campaign_menu_UI_assets.fla
new file mode 100644
index 0000000..f7aae25
Binary files /dev/null and b/art/campaign_menu_UI_assets.fla differ
diff --git a/assets/data/monster/monster.json b/assets/data/monster/monster.json
new file mode 100644
index 0000000..dd62162
Binary files /dev/null and b/assets/data/monster/monster.json differ
diff --git a/assets/data/south/south.json b/assets/data/south/south.json
new file mode 100644
index 0000000..03d7378
--- /dev/null
+++ b/assets/data/south/south.json
@@ -0,0 +1 @@
+{"song":{"song":"South","notes":[{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[11636.818181818182,3,0],[11999.818181818182,3,0],[12363.818181818182,0,0],[12545.818181818182,3,0],[12726.818181818182,2,0],[12908.818181818182,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[13101.818181818182,0,0],[13454.818181818182,1,0],[13817.818181818182,3,0],[13999.818181818182,3,0],[14181.818181818182,3,200]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[14545.818181818182,3,0],[14908.818181818182,3,0],[15272.818181818182,3,0],[15454.818181818182,2,0],[15636.818181818182,0,0],[15817.818181818182,1,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[16008.818181818182,0,0],[16363.818181818182,0,0],[16726.818181818184,2,0],[17090.818181818184,0,0],[17272.818181818184,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[17455,3,0],[17818,3,0],[18182,0,0],[18364,3,0],[18545,2,0],[18727,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[18920,0,0],[19273,1,0],[19636,3,0],[19818,3,0],[20000,3,200]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[20364,3,0],[20727,3,0],[21091,3,0],[21273,2,0],[21455,0,0],[21636,1,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[21827,0,0],[22182,0,0],[22545,2,0],[22909,0,0],[23091,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[23273,2,0],[23455,1,0],[23636,0,0],[23818,0,0],[23909,3,0],[24000,2,0],[24182,0,0],[24364,2,0],[24545,1,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[24734,2,0],[25091,2,0],[25455,2,0],[25636,1,0],[25818,0,0],[26000,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[26193,0,0],[26545,0,0],[26727,0,0],[26818,2,0],[26909,3,0],[27000,0,0],[27273,1,0],[27455,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[27648,2,0],[28000,2,0],[28364,2,0],[28545,3,0],[28727,0,0],[28909,1,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[29091.181818181816,2,0],[29273.181818181816,1,0],[29454.181818181816,0,0],[29636.181818181816,0,0],[29727.181818181816,3,0],[29818.181818181816,2,0],[30000.181818181816,0,0],[30182.181818181816,2,0],[30363.181818181816,1,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[30552.181818181816,2,0],[30909.181818181816,2,0],[31273.181818181816,2,0],[31454.181818181816,1,0],[31636.181818181816,0,0],[31818.181818181816,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[32011.181818181816,0,0],[32363.181818181816,0,0],[32545.181818181816,0,0],[32636.181818181816,2,0],[32727.181818181816,3,0],[32818.181818181816,0,0],[33091.181818181816,1,0],[33273.181818181816,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[33466.181818181816,2,0],[33818.181818181816,2,0],[34182.181818181816,2,0],[34363.181818181816,3,0],[34545.181818181816,0,0],[34727.181818181816,1,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[34918,2,0],[35091,3,0],[35273,0,0],[35455,2,0],[35636,3,0],[35818,0,0],[36000,2,0],[36182,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[36380,0,0],[36545,2,0],[36727,3,0],[36909,0,0],[37091,0,0],[37273,3,0],[37455,0,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[37834,2,0],[38000,3,0],[38182,0,0],[38364,2,0],[38545,3,0],[38727,0,0],[38909,2,0],[39091,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[39284,0,0],[39727,3,0],[39909,0,0],[40000,3,0],[40182,0,0],[40364,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[40736.181818181816,2,0],[40909.181818181816,3,0],[41091.181818181816,0,0],[41273.181818181816,2,0],[41454.181818181816,3,0],[41636.181818181816,0,0],[41818.181818181816,2,0],[42000.181818181816,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[42198.181818181816,0,0],[42363.181818181816,2,0],[42545.181818181816,3,0],[42727.181818181816,0,0],[42909.181818181816,0,0],[43091.181818181816,3,0],[43273.181818181816,0,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[43652.181818181816,2,0],[43818.181818181816,3,0],[44000.181818181816,0,0],[44182.181818181816,2,0],[44363.181818181816,3,0],[44545.181818181816,0,0],[44727.181818181816,2,0],[44909.181818181816,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[45102.181818181816,0,0],[45545.181818181816,3,0],[45727.181818181816,0,0],[45818.181818181816,3,0],[46000.181818181816,0,0],[46182.181818181816,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[46554.818181818184,0,0],[46817.818181818184,3,0],[46908.818181818184,1,0],[47181.818181818184,0,0],[47363.818181818184,3,0],[47454.818181818184,1,0],[47726.818181818184,2,0],[47908.818181818184,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[48011.818181818184,0,0],[48181.818181818184,2,0],[48363.818181818184,3,0],[48545.818181818184,0,0],[48726.818181818184,3,0],[48908.818181818184,2,0],[49090.818181818184,0,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[49545,3,0],[49455,0,0],[49636,2,0],[49818,3,0],[50000,0,0],[50182,2,0],[50364,3,0],[50545,0,0],[50636,3,0],[50727,2,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[50914,1,0],[51273,0,0],[51455,3,0],[51727,2,0],[51909,3,0],[52091,0,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[52373,0,0],[52636,3,0],[52727,1,0],[53000,0,0],[53182,3,0],[53273,1,0],[53545,2,0],[53727,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[53830,0,0],[54000,2,0],[54182,3,0],[54364,0,0],[54545,3,0],[54727,2,0],[54909,0,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[55363.181818181816,3,0],[55273.181818181816,0,0],[55454.181818181816,2,0],[55636.181818181816,3,0],[55818.181818181816,0,0],[56000.181818181816,2,0],[56182.181818181816,3,0],[56363.181818181816,0,0],[56454.181818181816,3,0],[56545.181818181816,2,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[56732.181818181816,1,0],[57091.181818181816,0,0],[57273.181818181816,3,0],[57545.181818181816,2,0],[57727.181818181816,3,0],[57909.181818181816,0,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[58182,3,0],[58545,3,0],[59000,2,0],[59091,0,0],[58727,1,0],[59364,1,0],[59455,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[59657,0,272.7272727272727],[60000,2,0],[60364,2,0],[60545,2,0],[60727,2,181.8181818181818]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[61100,2,0],[61455,2,0],[61636,3,0],[61818,1,0],[62000,0,0],[62182,3,0],[62364,0,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[62550,0,0],[63000,0,0],[63727,0,0],[63364,0,0],[63364,7,0],[63545,3,0],[63818,2,0],[63636,5,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[64000.181818181816,3,0],[64363.181818181816,3,0],[64818.181818181816,2,0],[64909.181818181816,0,0],[64545.181818181816,1,0],[65182.181818181816,1,0],[65273.181818181816,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[65475.181818181816,0,272.7272727272727],[65818.18181818182,2,0],[66182.18181818182,2,0],[66363.18181818182,2,0],[66545.18181818182,2,181.8181818181818]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[66918.18181818182,2,0],[67273.18181818182,2,0],[67454.18181818182,3,0],[67636.18181818182,1,0],[67818.18181818182,0,0],[68000.18181818182,3,0],[68182.18181818182,0,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[68368.18181818182,0,0],[68818.18181818182,0,0],[69545.18181818182,0,0],[69182.18181818182,0,0],[69182.18181818182,7,0],[69363.18181818182,3,0],[69636.18181818182,2,0],[69454.18181818182,5,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[69825,2,0],[70000,3,0],[70273,0,0],[70364,3,0],[70545,2,0],[70636,0,0],[71000,2,0],[70727,3,0],[71091,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[71280,2,0],[71636,2,0],[71818,0,0],[72091,2,0],[72273,3,0],[72364,0,0],[72545,2,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[72732,0,0],[73091,0,0],[73273,0,0],[73455,2,0],[73364,3,0],[73636,3,0],[73818,2,0],[74000,0,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[74195,2,0],[74364,3,0],[74545,2,0],[74727,0,0],[74909,1,0],[75091,3,0],[75273,0,0],[75455,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[75643.18181818182,2,0],[75818.18181818182,3,0],[76091.18181818182,0,0],[76182.18181818182,3,0],[76363.18181818182,2,0],[76454.18181818182,0,0],[76818.18181818182,2,0],[76545.18181818182,3,0],[76909.18181818182,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[77098.18181818182,2,0],[77454.18181818182,2,0],[77636.18181818182,0,0],[77909.18181818182,2,0],[78091.18181818182,3,0],[78182.18181818182,0,0],[78363.18181818182,2,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[78550.18181818182,0,0],[78909.18181818182,0,0],[79091.18181818182,0,0],[79273.18181818182,2,0],[79182.18181818182,3,0],[79454.18181818182,3,0],[79636.18181818182,2,0],[79818.18181818182,0,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[80013.18181818182,2,0],[80182.18181818182,3,0],[80363.18181818182,2,0],[80545.18181818182,0,0],[80727.18181818182,1,0],[80909.18181818182,3,0],[81091.18181818182,0,0],[81273.18181818182,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]}],"bpm":165,"sections":0,"needsVoices":true,"player1":"bf","player2":"spooky","sectionLengths":[],"speed":1.5000000000000004},"bpm":165,"sections":60,"notes":[{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[11636.818181818182,3,0],[11999.818181818182,3,0],[12363.818181818182,0,0],[12545.818181818182,3,0],[12726.818181818182,2,0],[12908.818181818182,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[13101.818181818182,0,0],[13454.818181818182,1,0],[13817.818181818182,3,0],[13999.818181818182,3,0],[14181.818181818182,3,200]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[14545.818181818182,3,0],[14908.818181818182,3,0],[15272.818181818182,3,0],[15454.818181818182,2,0],[15636.818181818182,0,0],[15817.818181818182,1,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[16008.818181818182,0,0],[16363.818181818182,0,0],[16726.818181818184,2,0],[17090.818181818184,0,0],[17272.818181818184,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[17455,3,0],[17818,3,0],[18182,0,0],[18364,3,0],[18545,2,0],[18727,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[18920,0,0],[19273,1,0],[19636,3,0],[19818,3,0],[20000,3,200]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[20364,3,0],[20727,3,0],[21091,3,0],[21273,2,0],[21455,0,0],[21636,1,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[21827,0,0],[22182,0,0],[22545,2,0],[22909,0,0],[23091,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[23273,2,0],[23455,1,0],[23636,0,0],[23818,0,0],[23909,3,0],[24000,2,0],[24182,0,0],[24364,2,0],[24545,1,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[24734,2,0],[25091,2,0],[25455,2,0],[25636,1,0],[25818,0,0],[26000,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[26193,0,0],[26545,0,0],[26727,0,0],[26818,2,0],[26909,3,0],[27000,0,0],[27273,1,0],[27455,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[27648,2,0],[28000,2,0],[28364,2,0],[28545,3,0],[28727,0,0],[28909,1,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[29091.181818181816,2,0],[29273.181818181816,1,0],[29454.181818181816,0,0],[29636.181818181816,0,0],[29727.181818181816,3,0],[29818.181818181816,2,0],[30000.181818181816,0,0],[30182.181818181816,2,0],[30363.181818181816,1,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[30552.181818181816,2,0],[30909.181818181816,2,0],[31273.181818181816,2,0],[31454.181818181816,1,0],[31636.181818181816,0,0],[31818.181818181816,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[32011.181818181816,0,0],[32363.181818181816,0,0],[32545.181818181816,0,0],[32636.181818181816,2,0],[32727.181818181816,3,0],[32818.181818181816,0,0],[33091.181818181816,1,0],[33273.181818181816,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[33466.181818181816,2,0],[33818.181818181816,2,0],[34182.181818181816,2,0],[34363.181818181816,3,0],[34545.181818181816,0,0],[34727.181818181816,1,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[34918,2,0],[35091,3,0],[35273,0,0],[35455,2,0],[35636,3,0],[35818,0,0],[36000,2,0],[36182,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[36380,0,0],[36545,2,0],[36727,3,0],[36909,0,0],[37091,0,0],[37273,3,0],[37455,0,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[37834,2,0],[38000,3,0],[38182,0,0],[38364,2,0],[38545,3,0],[38727,0,0],[38909,2,0],[39091,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[39284,0,0],[39727,3,0],[39909,0,0],[40000,3,0],[40182,0,0],[40364,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[40736.181818181816,2,0],[40909.181818181816,3,0],[41091.181818181816,0,0],[41273.181818181816,2,0],[41454.181818181816,3,0],[41636.181818181816,0,0],[41818.181818181816,2,0],[42000.181818181816,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[42198.181818181816,0,0],[42363.181818181816,2,0],[42545.181818181816,3,0],[42727.181818181816,0,0],[42909.181818181816,0,0],[43091.181818181816,3,0],[43273.181818181816,0,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[43652.181818181816,2,0],[43818.181818181816,3,0],[44000.181818181816,0,0],[44182.181818181816,2,0],[44363.181818181816,3,0],[44545.181818181816,0,0],[44727.181818181816,2,0],[44909.181818181816,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[45102.181818181816,0,0],[45545.181818181816,3,0],[45727.181818181816,0,0],[45818.181818181816,3,0],[46000.181818181816,0,0],[46182.181818181816,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[46554.818181818184,0,0],[46817.818181818184,3,0],[46908.818181818184,1,0],[47181.818181818184,0,0],[47363.818181818184,3,0],[47454.818181818184,1,0],[47726.818181818184,2,0],[47908.818181818184,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[48011.818181818184,0,0],[48181.818181818184,2,0],[48363.818181818184,3,0],[48545.818181818184,0,0],[48726.818181818184,3,0],[48908.818181818184,2,0],[49090.818181818184,0,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[49545,3,0],[49455,0,0],[49636,2,0],[49818,3,0],[50000,0,0],[50182,2,0],[50364,3,0],[50545,0,0],[50636,3,0],[50727,2,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[50914,1,0],[51273,0,0],[51455,3,0],[51727,2,0],[51909,3,0],[52091,0,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[52373,0,0],[52636,3,0],[52727,1,0],[53000,0,0],[53182,3,0],[53273,1,0],[53545,2,0],[53727,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[53830,0,0],[54000,2,0],[54182,3,0],[54364,0,0],[54545,3,0],[54727,2,0],[54909,0,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[55363.181818181816,3,0],[55273.181818181816,0,0],[55454.181818181816,2,0],[55636.181818181816,3,0],[55818.181818181816,0,0],[56000.181818181816,2,0],[56182.181818181816,3,0],[56363.181818181816,0,0],[56454.181818181816,3,0],[56545.181818181816,2,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[56732.181818181816,1,0],[57091.181818181816,0,0],[57273.181818181816,3,0],[57545.181818181816,2,0],[57727.181818181816,3,0],[57909.181818181816,0,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[58182,3,0],[58545,3,0],[59000,2,0],[59091,0,0],[58727,1,0],[59364,1,0],[59455,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[59657,0,272.7272727272727],[60000,2,0],[60364,2,0],[60545,2,0],[60727,2,181.8181818181818]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[61100,2,0],[61455,2,0],[61636,3,0],[61818,1,0],[62000,0,0],[62182,3,0],[62364,0,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[62550,0,0],[63000,0,0],[63727,0,0],[63364,0,0],[63364,7,0],[63545,3,0],[63818,2,0],[63636,5,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[64000.181818181816,3,0],[64363.181818181816,3,0],[64818.181818181816,2,0],[64909.181818181816,0,0],[64545.181818181816,1,0],[65182.181818181816,1,0],[65273.181818181816,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[65475.181818181816,0,272.7272727272727],[65818.18181818182,2,0],[66182.18181818182,2,0],[66363.18181818182,2,0],[66545.18181818182,2,181.8181818181818]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[66918.18181818182,2,0],[67273.18181818182,2,0],[67454.18181818182,3,0],[67636.18181818182,1,0],[67818.18181818182,0,0],[68000.18181818182,3,0],[68182.18181818182,0,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[68368.18181818182,0,0],[68818.18181818182,0,0],[69545.18181818182,0,0],[69182.18181818182,0,0],[69182.18181818182,7,0],[69363.18181818182,3,0],[69636.18181818182,2,0],[69454.18181818182,5,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[69825,2,0],[70000,3,0],[70273,0,0],[70364,3,0],[70545,2,0],[70636,0,0],[71000,2,0],[70727,3,0],[71091,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[71280,2,0],[71636,2,0],[71818,0,0],[72091,2,0],[72273,3,0],[72364,0,0],[72545,2,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[72732,0,0],[73091,0,0],[73273,0,0],[73455,2,0],[73364,3,0],[73636,3,0],[73818,2,0],[74000,0,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[74195,2,0],[74364,3,0],[74545,2,0],[74727,0,0],[74909,1,0],[75091,3,0],[75273,0,0],[75455,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[75643.18181818182,2,0],[75818.18181818182,3,0],[76091.18181818182,0,0],[76182.18181818182,3,0],[76363.18181818182,2,0],[76454.18181818182,0,0],[76818.18181818182,2,0],[76545.18181818182,3,0],[76909.18181818182,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[77098.18181818182,2,0],[77454.18181818182,2,0],[77636.18181818182,0,0],[77909.18181818182,2,0],[78091.18181818182,3,0],[78182.18181818182,0,0],[78363.18181818182,2,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[78550.18181818182,0,0],[78909.18181818182,0,0],[79091.18181818182,0,0],[79273.18181818182,2,0],[79182.18181818182,3,0],[79454.18181818182,3,0],[79636.18181818182,2,0],[79818.18181818182,0,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[80013.18181818182,2,0],[80182.18181818182,3,0],[80363.18181818182,2,0],[80545.18181818182,0,0],[80727.18181818182,1,0],[80909.18181818182,3,0],[81091.18181818182,0,0],[81273.18181818182,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]}]}
\ No newline at end of file
diff --git a/assets/data/specialThanks.txt b/assets/data/specialThanks.txt
index ebe2a61..6f24611 100644
--- a/assets/data/specialThanks.txt
+++ b/assets/data/specialThanks.txt
@@ -9,4 +9,7 @@ mmatt_ugh
Squidly
Luis
GeoKureli
-Will Blanton
\ No newline at end of file
+Will Blanton
+SrPelo
+
+BIT BOY - MIKE WELSH
\ No newline at end of file
diff --git a/assets/data/spookeez/spookeez.json b/assets/data/spookeez/spookeez.json
new file mode 100644
index 0000000..5371e35
--- /dev/null
+++ b/assets/data/spookeez/spookeez.json
@@ -0,0 +1 @@
+{"song":{"song":"Spookeez","notes":[{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[6400,0,0],[6600,1,0],[6800,3,0],[7200,3,0],[7600,2,0],[7800,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[8000,1,0],[8200,3,0],[8400,3,0],[9300,0,0],[9400,3,0],[8800,2,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[9600,0,0],[9800,1,0],[10000,3,0],[10400,3,0],[10800,2,0],[11000,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[11200,1,0],[11400,3,0],[11600,3,0],[12500,0,0],[12600,3,0],[12000,2,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[12800,2,0],[13000,3,0],[13100,1,0],[13200,0,0],[13400,0,0],[13500,1,0],[13700,2,0],[13800,3,0],[13900,0,0],[14000,1,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[14700,1,0],[15100,1,0],[14400,1,0],[14600,0,0],[14800,3,0],[15000,3,0],[15300,0,0],[15500,0,0],[15700,2,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[16000,2,0],[16200,3,0],[16300,1,0],[16400,0,0],[16600,0,0],[16700,1,0],[16900,2,0],[17000,3,0],[17100,0,0],[17200,1,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[17900,1,0],[18300,1,0],[17600,1,0],[17800,0,0],[18000,3,0],[18200,3,0],[18500,0,0],[18700,0,0],[18900,2,0],[19000,4,0],[19100,7,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[20000,3,0],[20600,3,0],[19700,3,0],[20400,3,0],[19200,2,0],[19300,0,0],[19400,3,0],[19500,1,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[20800,2,0],[21100,1,0],[20900,3,0],[21000,0,0],[21300,3,0],[21600,3,0],[21900,1,0],[22000,3,0],[22200,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[22900,3,0],[23200,3,0],[23600,3,0],[23800,3,0],[22700,1,0],[22400,2,0],[22500,0,0],[22600,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[24500,3,0],[24300,1,0],[24000,2,0],[24200,0,0],[24100,3,0],[24800,1,0],[25200,2,0],[25400,2,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[26400,3,0],[27000,3,0],[26100,3,0],[26800,3,0],[25600,2,0],[25700,0,0],[25800,3,0],[25900,1,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[27200,2,0],[27500,1,0],[27300,3,0],[27400,0,0],[27700,3,0],[28000,3,0],[28300,1,0],[28400,3,0],[28600,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[29300,3,0],[29600,3,0],[30000,3,0],[30200,3,0],[29100,1,0],[28800,2,0],[28900,0,0],[29000,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[30900,3,0],[30700,1,0],[30400,2,0],[30600,0,0],[30500,3,0],[31200,1,0],[31600,2,0],[31800,2,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[32000,0,0],[32200,1,0],[32400,3,0],[32800,3,0],[33200,2,0],[33400,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[33600,1,0],[33800,3,0],[34000,3,0],[34900,0,0],[35000,3,0],[34400,2,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[35200,0,0],[35400,1,0],[35600,3,0],[36000,3,0],[36400,2,0],[36600,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[36800,1,0],[37000,3,0],[37200,3,0],[38100,0,0],[38200,3,0],[37600,2,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[38400,2,0],[38600,3,0],[38700,1,0],[38800,0,0],[39000,0,0],[39100,1,0],[39300,2,0],[39400,3,0],[39500,0,0],[39600,1,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[40300,1,0],[40700,1,0],[40000,1,0],[40200,0,0],[40400,3,0],[40600,3,0],[40900,0,0],[41100,0,0],[41300,2,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[41600,2,0],[41800,3,0],[41900,1,0],[42000,0,0],[42200,0,0],[42300,1,0],[42500,2,0],[42600,3,0],[42700,0,0],[42800,1,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[43500,1,0],[43900,1,0],[43200,1,0],[43400,0,0],[43600,3,0],[43800,3,0],[44100,0,0],[44300,0,0],[44500,2,0],[44600,4,0],[44700,7,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[45600,3,0],[46200,3,0],[45300,3,0],[46000,3,0],[44800,2,0],[44900,0,0],[45000,3,0],[45100,1,0],[45700,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[46400,2,0],[46700,1,0],[46500,3,0],[46600,0,0],[46900,3,0],[47200,3,0],[47600,3,0],[47800,3,0],[47300,1,0],[47500,0,0],[47538,2,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[48500,3,0],[48800,3,0],[49200,3,0],[49400,3,0],[48300,1,0],[48000,2,0],[48100,0,0],[48200,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[50100,3,0],[49900,1,0],[49600,2,0],[49800,0,0],[49700,3,0],[50400,3,0],[50800,4,0],[51000,7,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[52000,3,0],[52600,3,0],[51700,3,0],[52400,3,0],[51200,2,0],[51300,0,0],[51400,3,0],[51500,1,0],[52100,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[52800,2,0],[53100,1,0],[52900,3,0],[53000,0,0],[53300,3,0],[53600,3,0],[54000,3,0],[54200,3,0],[53700,1,0],[53900,0,0],[53938,2,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[54900,3,0],[55200,3,0],[55600,3,0],[55800,3,0],[54700,1,0],[54400,2,0],[54500,0,0],[54600,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[56500,3,0],[56300,1,0],[56000,2,0],[56200,0,0],[56100,3,0],[56800,3,0],[57200,4,0],[57400,7,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[57600,2,300],[58000,3,400],[58500,1,200],[58800,2,200]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[59200,2,100],[59400,3,100],[59600,0,300],[60000,1,300],[60400,2,200]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[60800,1,0],[61200,1,0],[61400,3,0],[61800,3,0],[62000,0,0],[62200,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[62400,1,0],[62800,1,0],[63000,3,0],[63400,3,0],[63600,0,0],[63800,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[64000,2,300],[64400,3,400],[64900,1,200],[65200,2,200]]},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":true,"sectionNotes":[[65600,2,100],[65800,3,100],[66000,0,300],[66400,1,300],[66800,2,200]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":true,"sectionNotes":[[67200,1,0],[67600,1,0],[67800,3,0],[68200,3,0],[68400,0,0],[68600,3,0]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":true,"sectionNotes":[[68800,1,0],[69200,1,0],[69400,3,0],[69800,3,0],[70000,0,0],[70200,3,0]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":false,"sectionNotes":[[70400,2,0],[70800,3,0],[71000,2,0],[71400,3,0],[71700,1,0],[70600,2,0],[71800,3,0]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":false,"sectionNotes":[[72000,2,0],[72400,3,0],[72600,2,0],[73000,3,0],[73300,1,0],[72200,2,0]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":false,"sectionNotes":[[73600,2,0],[74000,3,0],[74200,2,0],[74600,3,0],[74900,1,0],[73800,2,0],[75000,3,0]],"typeOfSection":0},{"lengthInSteps":16,"bpm":157,"changeBPM":false,"mustHitSection":false,"sectionNotes":[[75200,2,0],[75600,3,0],[75800,2,0],[76200,3,0],[76500,1,0],[75400,2,0],[75200,4,300],[75600,5,300],[76000,7,300],[76400,5,300]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":true,"sectionNotes":[[76800,2,0],[77200,3,0],[77400,2,0],[77800,3,0],[78100,1,0],[77000,2,0],[78200,3,0]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":true,"sectionNotes":[[78400,2,0],[78800,3,0],[79000,2,0],[79400,3,0],[79700,1,0],[78600,2,0]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":true,"sectionNotes":[[80000,2,0],[80400,3,0],[80600,2,0],[81000,3,0],[81300,1,0],[80200,2,0]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":true,"sectionNotes":[[81600,2,0],[82000,3,0],[82200,2,0],[82600,3,0],[82900,1,0],[81800,2,0],[81600,4,300],[82000,5,300],[82400,7,300],[82800,5,300]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":false,"sectionNotes":[[83200,2,0],[83600,3,0],[83800,2,0],[84200,3,0],[84500,1,0],[83400,2,0],[84600,3,0]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":false,"sectionNotes":[[84800,2,0],[85200,3,0],[85400,2,0],[85800,3,0],[86100,1,0],[85000,2,0]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":false,"sectionNotes":[[86400,2,0],[86800,3,0],[87000,2,0],[87400,3,0],[87700,1,0],[86600,2,0],[87800,3,0]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":false,"sectionNotes":[[88000,2,0],[88400,3,0],[88600,2,0],[89000,3,0],[89300,1,0],[88200,2,0],[88000,4,300],[88400,5,300],[88800,7,300],[89200,5,300]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":true,"sectionNotes":[[89600,2,0],[90000,3,0],[90200,2,0],[90600,3,0],[90900,1,0],[89800,2,0]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":true,"sectionNotes":[[91200,2,0],[91600,3,0],[91800,2,0],[92200,3,0],[92500,1,0],[91400,2,0],[91200,2,0],[91600,3,0],[91800,2,0],[92200,3,0],[92500,1,0],[91400,2,0]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":true,"sectionNotes":[[92800,2,0],[93200,3,0],[93400,2,0],[93800,3,0],[94100,1,0],[93000,2,0]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":true,"sectionNotes":[[94400,2,0],[94800,3,0],[95000,2,0],[95400,3,0],[95700,1,0],[94600,2,0],[94400,4,300],[94800,5,300],[95200,7,300],[95600,5,300]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":true,"sectionNotes":[],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":true,"sectionNotes":[],"typeOfSection":0}],"bpm":150,"sections":0,"needsVoices":true,"player1":"bf","player2":"spooky","sectionLengths":[],"speed":1.7000000000000006},"bpm":150,"sections":62,"notes":[{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[6400,0,0],[6600,1,0],[6800,3,0],[7200,3,0],[7600,2,0],[7800,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[8000,1,0],[8200,3,0],[8400,3,0],[9300,0,0],[9400,3,0],[8800,2,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[9600,0,0],[9800,1,0],[10000,3,0],[10400,3,0],[10800,2,0],[11000,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[11200,1,0],[11400,3,0],[11600,3,0],[12500,0,0],[12600,3,0],[12000,2,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[12800,2,0],[13000,3,0],[13100,1,0],[13200,0,0],[13400,0,0],[13500,1,0],[13700,2,0],[13800,3,0],[13900,0,0],[14000,1,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[14700,1,0],[15100,1,0],[14400,1,0],[14600,0,0],[14800,3,0],[15000,3,0],[15300,0,0],[15500,0,0],[15700,2,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[16000,2,0],[16200,3,0],[16300,1,0],[16400,0,0],[16600,0,0],[16700,1,0],[16900,2,0],[17000,3,0],[17100,0,0],[17200,1,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[17900,1,0],[18300,1,0],[17600,1,0],[17800,0,0],[18000,3,0],[18200,3,0],[18500,0,0],[18700,0,0],[18900,2,0],[19000,4,0],[19100,7,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[20000,3,0],[20600,3,0],[19700,3,0],[20400,3,0],[19200,2,0],[19300,0,0],[19400,3,0],[19500,1,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[20800,2,0],[21100,1,0],[20900,3,0],[21000,0,0],[21300,3,0],[21600,3,0],[21900,1,0],[22000,3,0],[22200,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[22900,3,0],[23200,3,0],[23600,3,0],[23800,3,0],[22700,1,0],[22400,2,0],[22500,0,0],[22600,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[24500,3,0],[24300,1,0],[24000,2,0],[24200,0,0],[24100,3,0],[24800,1,0],[25200,2,0],[25400,2,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[26400,3,0],[27000,3,0],[26100,3,0],[26800,3,0],[25600,2,0],[25700,0,0],[25800,3,0],[25900,1,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[27200,2,0],[27500,1,0],[27300,3,0],[27400,0,0],[27700,3,0],[28000,3,0],[28300,1,0],[28400,3,0],[28600,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[29300,3,0],[29600,3,0],[30000,3,0],[30200,3,0],[29100,1,0],[28800,2,0],[28900,0,0],[29000,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[30900,3,0],[30700,1,0],[30400,2,0],[30600,0,0],[30500,3,0],[31200,1,0],[31600,2,0],[31800,2,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[32000,0,0],[32200,1,0],[32400,3,0],[32800,3,0],[33200,2,0],[33400,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[33600,1,0],[33800,3,0],[34000,3,0],[34900,0,0],[35000,3,0],[34400,2,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[35200,0,0],[35400,1,0],[35600,3,0],[36000,3,0],[36400,2,0],[36600,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[36800,1,0],[37000,3,0],[37200,3,0],[38100,0,0],[38200,3,0],[37600,2,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[38400,2,0],[38600,3,0],[38700,1,0],[38800,0,0],[39000,0,0],[39100,1,0],[39300,2,0],[39400,3,0],[39500,0,0],[39600,1,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[40300,1,0],[40700,1,0],[40000,1,0],[40200,0,0],[40400,3,0],[40600,3,0],[40900,0,0],[41100,0,0],[41300,2,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[41600,2,0],[41800,3,0],[41900,1,0],[42000,0,0],[42200,0,0],[42300,1,0],[42500,2,0],[42600,3,0],[42700,0,0],[42800,1,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[43500,1,0],[43900,1,0],[43200,1,0],[43400,0,0],[43600,3,0],[43800,3,0],[44100,0,0],[44300,0,0],[44500,2,0],[44600,4,0],[44700,7,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[45600,3,0],[46200,3,0],[45300,3,0],[46000,3,0],[44800,2,0],[44900,0,0],[45000,3,0],[45100,1,0],[45700,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[46400,2,0],[46700,1,0],[46500,3,0],[46600,0,0],[46900,3,0],[47200,3,0],[47600,3,0],[47800,3,0],[47300,1,0],[47500,0,0],[47538,2,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[48500,3,0],[48800,3,0],[49200,3,0],[49400,3,0],[48300,1,0],[48000,2,0],[48100,0,0],[48200,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[50100,3,0],[49900,1,0],[49600,2,0],[49800,0,0],[49700,3,0],[50400,3,0],[50800,4,0],[51000,7,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[52000,3,0],[52600,3,0],[51700,3,0],[52400,3,0],[51200,2,0],[51300,0,0],[51400,3,0],[51500,1,0],[52100,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[52800,2,0],[53100,1,0],[52900,3,0],[53000,0,0],[53300,3,0],[53600,3,0],[54000,3,0],[54200,3,0],[53700,1,0],[53900,0,0],[53938,2,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[54900,3,0],[55200,3,0],[55600,3,0],[55800,3,0],[54700,1,0],[54400,2,0],[54500,0,0],[54600,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[56500,3,0],[56300,1,0],[56000,2,0],[56200,0,0],[56100,3,0],[56800,3,0],[57200,4,0],[57400,7,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[57600,2,300],[58000,3,400],[58500,1,200],[58800,2,200]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[59200,2,100],[59400,3,100],[59600,0,300],[60000,1,300],[60400,2,200]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[60800,1,0],[61200,1,0],[61400,3,0],[61800,3,0],[62000,0,0],[62200,3,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[62400,1,0],[62800,1,0],[63000,3,0],[63400,3,0],[63600,0,0],[63800,3,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[64000,2,300],[64400,3,400],[64900,1,200],[65200,2,200]]},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":true,"sectionNotes":[[65600,2,100],[65800,3,100],[66000,0,300],[66400,1,300],[66800,2,200]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":true,"sectionNotes":[[67200,1,0],[67600,1,0],[67800,3,0],[68200,3,0],[68400,0,0],[68600,3,0]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":true,"sectionNotes":[[68800,1,0],[69200,1,0],[69400,3,0],[69800,3,0],[70000,0,0],[70200,3,0]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":false,"sectionNotes":[[70400,2,0],[70800,3,0],[71000,2,0],[71400,3,0],[71700,1,0],[70600,2,0],[71800,3,0]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":false,"sectionNotes":[[72000,2,0],[72400,3,0],[72600,2,0],[73000,3,0],[73300,1,0],[72200,2,0]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":false,"sectionNotes":[[73600,2,0],[74000,3,0],[74200,2,0],[74600,3,0],[74900,1,0],[73800,2,0],[75000,3,0]],"typeOfSection":0},{"lengthInSteps":16,"bpm":157,"changeBPM":false,"mustHitSection":false,"sectionNotes":[[75200,2,0],[75600,3,0],[75800,2,0],[76200,3,0],[76500,1,0],[75400,2,0],[75200,4,300],[75600,5,300],[76000,7,300],[76400,5,300]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":true,"sectionNotes":[[76800,2,0],[77200,3,0],[77400,2,0],[77800,3,0],[78100,1,0],[77000,2,0],[78200,3,0]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":true,"sectionNotes":[[78400,2,0],[78800,3,0],[79000,2,0],[79400,3,0],[79700,1,0],[78600,2,0]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":true,"sectionNotes":[[80000,2,0],[80400,3,0],[80600,2,0],[81000,3,0],[81300,1,0],[80200,2,0]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":true,"sectionNotes":[[81600,2,0],[82000,3,0],[82200,2,0],[82600,3,0],[82900,1,0],[81800,2,0],[81600,4,300],[82000,5,300],[82400,7,300],[82800,5,300]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":false,"sectionNotes":[[83200,2,0],[83600,3,0],[83800,2,0],[84200,3,0],[84500,1,0],[83400,2,0],[84600,3,0]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":false,"sectionNotes":[[84800,2,0],[85200,3,0],[85400,2,0],[85800,3,0],[86100,1,0],[85000,2,0]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":false,"sectionNotes":[[86400,2,0],[86800,3,0],[87000,2,0],[87400,3,0],[87700,1,0],[86600,2,0],[87800,3,0]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":false,"sectionNotes":[[88000,2,0],[88400,3,0],[88600,2,0],[89000,3,0],[89300,1,0],[88200,2,0],[88000,4,300],[88400,5,300],[88800,7,300],[89200,5,300]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":true,"sectionNotes":[[89600,2,0],[90000,3,0],[90200,2,0],[90600,3,0],[90900,1,0],[89800,2,0]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":true,"sectionNotes":[[91200,2,0],[91600,3,0],[91800,2,0],[92200,3,0],[92500,1,0],[91400,2,0],[91200,2,0],[91600,3,0],[91800,2,0],[92200,3,0],[92500,1,0],[91400,2,0]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":true,"sectionNotes":[[92800,2,0],[93200,3,0],[93400,2,0],[93800,3,0],[94100,1,0],[93000,2,0]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":true,"sectionNotes":[[94400,2,0],[94800,3,0],[95000,2,0],[95400,3,0],[95700,1,0],[94600,2,0],[94400,4,300],[94800,5,300],[95200,7,300],[95600,5,300]],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":true,"sectionNotes":[],"typeOfSection":0},{"lengthInSteps":16,"bpm":150,"changeBPM":false,"mustHitSection":true,"sectionNotes":[],"typeOfSection":0}]}
\ No newline at end of file
diff --git a/assets/data/tutorial/Tutorial.json b/assets/data/tutorial/Tutorial.json
index fa0457e..b5a64ec 100644
Binary files a/assets/data/tutorial/Tutorial.json and b/assets/data/tutorial/Tutorial.json differ
diff --git a/assets/fonts/vcr.ttf b/assets/fonts/vcr.ttf
new file mode 100644
index 0000000..dcca687
Binary files /dev/null and b/assets/fonts/vcr.ttf differ
diff --git a/assets/images/BOYFRIEND.png b/assets/images/BOYFRIEND.png
index ee20654..2d590fc 100644
Binary files a/assets/images/BOYFRIEND.png and b/assets/images/BOYFRIEND.png differ
diff --git a/assets/images/BOYFRIEND.xml b/assets/images/BOYFRIEND.xml
index 0008f4c..9a4c13d 100644
--- a/assets/images/BOYFRIEND.xml
+++ b/assets/images/BOYFRIEND.xml
@@ -1,300 +1,467 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/images/Monster_Assets.png b/assets/images/Monster_Assets.png
new file mode 100644
index 0000000..10b7bbe
Binary files /dev/null and b/assets/images/Monster_Assets.png differ
diff --git a/assets/images/Monster_Assets.xml b/assets/images/Monster_Assets.xml
new file mode 100644
index 0000000..687d294
--- /dev/null
+++ b/assets/images/Monster_Assets.xml
@@ -0,0 +1,109 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/images/campaign_menu_UI_assets.png b/assets/images/campaign_menu_UI_assets.png
new file mode 100644
index 0000000..98a8924
Binary files /dev/null and b/assets/images/campaign_menu_UI_assets.png differ
diff --git a/assets/images/campaign_menu_UI_assets.xml b/assets/images/campaign_menu_UI_assets.xml
new file mode 100644
index 0000000..51aab94
--- /dev/null
+++ b/assets/images/campaign_menu_UI_assets.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/images/campaign_menu_UI_characters.png b/assets/images/campaign_menu_UI_characters.png
new file mode 100644
index 0000000..75de6a5
Binary files /dev/null and b/assets/images/campaign_menu_UI_characters.png differ
diff --git a/assets/images/campaign_menu_UI_characters.xml b/assets/images/campaign_menu_UI_characters.xml
new file mode 100644
index 0000000..80b7ab2
--- /dev/null
+++ b/assets/images/campaign_menu_UI_characters.xml
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/music/Bopeebo_Inst.mp3 b/assets/music/Bopeebo_Inst.mp3
index d8fe8bf..593fe28 100644
Binary files a/assets/music/Bopeebo_Inst.mp3 and b/assets/music/Bopeebo_Inst.mp3 differ
diff --git a/assets/music/Bopeebo_Voices.mp3 b/assets/music/Bopeebo_Voices.mp3
index 7675230..ebb468a 100644
Binary files a/assets/music/Bopeebo_Voices.mp3 and b/assets/music/Bopeebo_Voices.mp3 differ
diff --git a/assets/music/Dadbattle.mp3 b/assets/music/Dadbattle.mp3
index 51d658d..2527185 100644
Binary files a/assets/music/Dadbattle.mp3 and b/assets/music/Dadbattle.mp3 differ
diff --git a/assets/music/Dadbattle_Inst.mp3 b/assets/music/Dadbattle_Inst.mp3
index d4ee5c7..37a5752 100644
Binary files a/assets/music/Dadbattle_Inst.mp3 and b/assets/music/Dadbattle_Inst.mp3 differ
diff --git a/assets/music/Fresh_Inst.mp3 b/assets/music/Fresh_Inst.mp3
index cb5d71a..061f856 100644
Binary files a/assets/music/Fresh_Inst.mp3 and b/assets/music/Fresh_Inst.mp3 differ
diff --git a/assets/music/Monster.mp3 b/assets/music/Monster.mp3
new file mode 100644
index 0000000..a5bee76
Binary files /dev/null and b/assets/music/Monster.mp3 differ
diff --git a/assets/music/Monster.ogg b/assets/music/Monster.ogg
new file mode 100644
index 0000000..29357b2
Binary files /dev/null and b/assets/music/Monster.ogg differ
diff --git a/assets/music/Monster_Inst.mp3 b/assets/music/Monster_Inst.mp3
new file mode 100644
index 0000000..7beb7ee
Binary files /dev/null and b/assets/music/Monster_Inst.mp3 differ
diff --git a/assets/music/Monster_Inst.ogg b/assets/music/Monster_Inst.ogg
new file mode 100644
index 0000000..587e15a
Binary files /dev/null and b/assets/music/Monster_Inst.ogg differ
diff --git a/assets/music/Monster_Voices.mp3 b/assets/music/Monster_Voices.mp3
new file mode 100644
index 0000000..94694b7
Binary files /dev/null and b/assets/music/Monster_Voices.mp3 differ
diff --git a/assets/music/Monster_Voices.ogg b/assets/music/Monster_Voices.ogg
new file mode 100644
index 0000000..62f433c
Binary files /dev/null and b/assets/music/Monster_Voices.ogg differ
diff --git a/assets/music/South_Inst.mp3 b/assets/music/South_Inst.mp3
new file mode 100644
index 0000000..6b9d91b
Binary files /dev/null and b/assets/music/South_Inst.mp3 differ
diff --git a/assets/music/South_Inst.ogg b/assets/music/South_Inst.ogg
new file mode 100644
index 0000000..5f42cdd
Binary files /dev/null and b/assets/music/South_Inst.ogg differ
diff --git a/assets/music/South_Voices.mp3 b/assets/music/South_Voices.mp3
new file mode 100644
index 0000000..8e1c06e
Binary files /dev/null and b/assets/music/South_Voices.mp3 differ
diff --git a/assets/music/South_Voices.ogg b/assets/music/South_Voices.ogg
new file mode 100644
index 0000000..58ebbff
Binary files /dev/null and b/assets/music/South_Voices.ogg differ
diff --git a/assets/music/Spookeez.mp3 b/assets/music/Spookeez.mp3
new file mode 100644
index 0000000..74a958e
Binary files /dev/null and b/assets/music/Spookeez.mp3 differ
diff --git a/assets/music/Spookeez.ogg b/assets/music/Spookeez.ogg
new file mode 100644
index 0000000..ae1b4cc
Binary files /dev/null and b/assets/music/Spookeez.ogg differ
diff --git a/assets/music/Spookeez_Inst.mp3 b/assets/music/Spookeez_Inst.mp3
new file mode 100644
index 0000000..ee4577a
Binary files /dev/null and b/assets/music/Spookeez_Inst.mp3 differ
diff --git a/assets/music/Spookeez_Inst.ogg b/assets/music/Spookeez_Inst.ogg
new file mode 100644
index 0000000..e14fd8b
Binary files /dev/null and b/assets/music/Spookeez_Inst.ogg differ
diff --git a/assets/music/Spookeez_Voices.mp3 b/assets/music/Spookeez_Voices.mp3
new file mode 100644
index 0000000..854301d
Binary files /dev/null and b/assets/music/Spookeez_Voices.mp3 differ
diff --git a/assets/music/Spookeez_Voices.ogg b/assets/music/Spookeez_Voices.ogg
new file mode 100644
index 0000000..1429044
Binary files /dev/null and b/assets/music/Spookeez_Voices.ogg differ
diff --git a/assets/music/Tutorial_Inst.mp3 b/assets/music/Tutorial_Inst.mp3
index ee24510..473f008 100644
Binary files a/assets/music/Tutorial_Inst.mp3 and b/assets/music/Tutorial_Inst.mp3 differ
diff --git a/assets/music/freakyMenu.mp3 b/assets/music/freakyMenu.mp3
index caaf7c5..8132bfe 100644
Binary files a/assets/music/freakyMenu.mp3 and b/assets/music/freakyMenu.mp3 differ
diff --git a/assets/music/freakyMenu.ogg b/assets/music/freakyMenu.ogg
new file mode 100644
index 0000000..372111d
Binary files /dev/null and b/assets/music/freakyMenu.ogg differ
diff --git a/assets/music/gameOver.mp3 b/assets/music/gameOver.mp3
new file mode 100644
index 0000000..e8f76e0
Binary files /dev/null and b/assets/music/gameOver.mp3 differ
diff --git a/assets/music/gameOver.ogg b/assets/music/gameOver.ogg
new file mode 100644
index 0000000..7f42193
Binary files /dev/null and b/assets/music/gameOver.ogg differ
diff --git a/assets/music/gameOverEnd.mp3 b/assets/music/gameOverEnd.mp3
new file mode 100644
index 0000000..684181b
Binary files /dev/null and b/assets/music/gameOverEnd.mp3 differ
diff --git a/assets/music/gameOverEnd.ogg b/assets/music/gameOverEnd.ogg
new file mode 100644
index 0000000..f101074
Binary files /dev/null and b/assets/music/gameOverEnd.ogg differ
diff --git a/assets/sounds/fnf_loss_sfx.mp3 b/assets/sounds/fnf_loss_sfx.mp3
new file mode 100644
index 0000000..8d95560
Binary files /dev/null and b/assets/sounds/fnf_loss_sfx.mp3 differ
diff --git a/assets/sounds/fnf_loss_sfx.ogg b/assets/sounds/fnf_loss_sfx.ogg
new file mode 100644
index 0000000..1d70db2
Binary files /dev/null and b/assets/sounds/fnf_loss_sfx.ogg differ
diff --git a/assets/sounds/missnote1.ogg b/assets/sounds/missnote1.ogg
index 371503e..b8bfc8e 100644
Binary files a/assets/sounds/missnote1.ogg and b/assets/sounds/missnote1.ogg differ
diff --git a/source/Alphabet.hx b/source/Alphabet.hx
index bb8cce9..20556e3 100644
--- a/source/Alphabet.hx
+++ b/source/Alphabet.hx
@@ -17,6 +17,8 @@ class Alphabet extends FlxSpriteGroup
public var delay:Float = 0.05;
public var paused:Bool = false;
+ public var text:String = "";
+
var _finalText:String = "";
var _curText:String = "";
@@ -28,15 +30,79 @@ class Alphabet extends FlxSpriteGroup
// amp, backslash, question mark, apostrophy, comma, angry faic, period
var lastSprite:AlphaCharacter;
var xPosResetted:Bool = false;
+ var lastWasSpace:Bool = false;
- public function new(x:Float, y:Float, text:String = "", ?bold:Bool = false)
+ var splitWords:Array = [];
+
+ public function new(x:Float, y:Float, text:String = "", ?bold:Bool = false, typed:Bool = false)
{
super(x, y);
_finalText = text;
+ this.text = text;
- var arrayShit:Array = text.split("");
- trace(arrayShit);
+ if (typed)
+ {
+ startTypedText();
+ }
+ else
+ {
+ addText();
+ }
+ }
+
+ public function addText()
+ {
+ doSplitWords();
+
+ for (character in splitWords)
+ {
+ // if (character.fastCodeAt() == " ")
+ // {
+ // }
+
+ if (character == " ")
+ {
+ lastWasSpace = true;
+ }
+
+ if (AlphaCharacter.alphabet.contains(character.toLowerCase()))
+ {
+ var xPos:Float = 0;
+ if (lastSprite != null)
+ {
+ xPos = lastSprite.x + lastSprite.frameWidth;
+ }
+
+ if (lastWasSpace)
+ {
+ xPos += 40;
+ lastWasSpace = false;
+ }
+
+ // var letter:AlphaCharacter = new AlphaCharacter(30 * loopNum, 0);
+ var letter:AlphaCharacter = new AlphaCharacter(xPos, 0);
+ letter.createBold(character);
+ add(letter);
+
+ lastSprite = letter;
+ }
+
+ // loopNum += 1;
+ }
+ }
+
+ function doSplitWords():Void
+ {
+ splitWords = _finalText.split("");
+ }
+
+ public function startTypedText():Void
+ {
+ _finalText = text;
+ doSplitWords();
+
+ // trace(arrayShit);
var loopNum:Int = 0;
@@ -52,7 +118,7 @@ class Alphabet extends FlxSpriteGroup
// xPos = 0;
}
- if (AlphaCharacter.alphabet.contains(arrayShit[loopNum].toLowerCase()))
+ if (AlphaCharacter.alphabet.contains(splitWords[loopNum].toLowerCase()))
{
if (lastSprite != null && !xPosResetted)
{
@@ -67,7 +133,7 @@ class Alphabet extends FlxSpriteGroup
// var letter:AlphaCharacter = new AlphaCharacter(30 * loopNum, 0);
var letter:AlphaCharacter = new AlphaCharacter(xPos, 55 * yMulti);
- letter.createBold(arrayShit[loopNum]);
+ letter.createBold(splitWords[loopNum]);
add(letter);
lastSprite = letter;
@@ -76,32 +142,7 @@ class Alphabet extends FlxSpriteGroup
loopNum += 1;
tmr.time = FlxG.random.float(0.03, 0.09);
- }, arrayShit.length);
-
- for (character in arrayShit)
- {
- // if (character.fastCodeAt() == " ")
- // {
- // }
-
- if (AlphaCharacter.alphabet.contains(character.toLowerCase()))
- {
- /* var xPos:Float = 0;
- if (lastSprite != null)
- {
- xPos = lastSprite.x + lastSprite.frameWidth - 40;
- }
-
- // var letter:AlphaCharacter = new AlphaCharacter(30 * loopNum, 0);
- var letter:AlphaCharacter = new AlphaCharacter(xPos, 0);
- letter.createBold(character);
- add(letter);
-
- lastSprite = letter; */
- }
-
- // loopNum += 1;
- }
+ }, splitWords.length);
}
override function update(elapsed:Float)
diff --git a/source/AnimationDebug.hx b/source/AnimationDebug.hx
index ae3ca51..e74b45c 100644
--- a/source/AnimationDebug.hx
+++ b/source/AnimationDebug.hx
@@ -39,6 +39,9 @@ class AnimationDebug extends FlxState
gridBG.scrollFactor.set(0.5, 0.5);
add(gridBG);
+ if (daAnim == 'bf')
+ isDad = false;
+
if (isDad)
{
dad = new Character(0, 0, daAnim);
diff --git a/source/Boyfriend.hx b/source/Boyfriend.hx
index 4796b85..483f4d0 100644
--- a/source/Boyfriend.hx
+++ b/source/Boyfriend.hx
@@ -26,6 +26,10 @@ class Boyfriend extends Character
animation.addByPrefix('singRIGHTmiss', 'BF NOTE RIGHT MISS', 24, false);
animation.addByPrefix('singDOWNmiss', 'BF NOTE DOWN MISS', 24, false);
animation.addByPrefix('hey', 'BF HEY', 24, false);
+
+ animation.addByPrefix('firstDeath', "BF dies", 24, false);
+ animation.addByPrefix('deathLoop', "BF Dead Loop", 24, true);
+ animation.addByPrefix('deathConfirm', "BF Dead confirm", 24, false);
playAnim('idle');
antialiasing = true;
@@ -40,6 +44,9 @@ class Boyfriend extends Character
addOffset("singLEFTmiss", 12, 24);
addOffset("singDOWNmiss", -11, -19);
addOffset("hey", 7, 4);
+ addOffset('firstDeath', 37, 11);
+ addOffset('deathLoop', 37, 5);
+ addOffset('deathConfirm', 37, 69);
}
override function update(elapsed:Float)
@@ -48,6 +55,12 @@ class Boyfriend extends Character
{
playAnim('idle', true, false, 10);
}
+
+ if (animation.curAnim.name == 'firstDeath' && animation.curAnim.finished)
+ {
+ playAnim('deathLoop');
+ }
+
super.update(elapsed);
}
}
diff --git a/source/ButtonRemapSubstate.hx b/source/ButtonRemapSubstate.hx
new file mode 100644
index 0000000..64ff079
--- /dev/null
+++ b/source/ButtonRemapSubstate.hx
@@ -0,0 +1,11 @@
+package;
+
+import flixel.FlxSubState;
+
+class ButtonRemapSubstate extends FlxSubState
+{
+ public function new()
+ {
+ super();
+ }
+}
diff --git a/source/Character.hx b/source/Character.hx
index 85df326..af441f0 100644
--- a/source/Character.hx
+++ b/source/Character.hx
@@ -73,7 +73,7 @@ class Character extends FlxSprite
animation.addByPrefix('singDOWN', 'spooky DOWN note', 24, false);
animation.addByPrefix('singLEFT', 'note sing left', 24, false);
animation.addByPrefix('singRIGHT', 'spooky sing right', 24, false);
- animation.addByIndices('danceLeft', 'spooky dance idle', [16, 0, 2, 6], "", 12, false);
+ animation.addByIndices('danceLeft', 'spooky dance idle', [0, 2, 6], "", 12, false);
animation.addByIndices('danceRight', 'spooky dance idle', [8, 10, 12, 14], "", 12, false);
addOffset('danceLeft');
@@ -85,6 +85,21 @@ class Character extends FlxSprite
addOffset("singDOWN", -50, -130);
playAnim('danceRight');
+ case 'monster':
+ tex = FlxAtlasFrames.fromSparrow(AssetPaths.Monster_Assets__png, AssetPaths.Monster_Assets__xml);
+ frames = tex;
+ animation.addByPrefix('idle', 'monster idle', 24);
+ animation.addByPrefix('singUP', 'monster up note', 24, false);
+ animation.addByPrefix('singDOWN', 'monster down', 24, false);
+ animation.addByPrefix('singLEFT', 'Monster left note', 24, false);
+ animation.addByPrefix('singRIGHT', 'Monster Right note', 24, false);
+
+ addOffset('idle');
+ addOffset("singUP", -20, 50);
+ addOffset("singRIGHT", -51);
+ addOffset("singLEFT", -30);
+ addOffset("singDOWN", -30, -40);
+ playAnim('idle');
}
}
@@ -113,6 +128,8 @@ class Character extends FlxSprite
playAnim('danceLeft');
case 'dad':
playAnim('idle');
+ case 'monster':
+ playAnim('idle');
}
}
@@ -125,6 +142,23 @@ class Character extends FlxSprite
{
offset.set(daOffset[0], daOffset[1]);
}
+
+ if (curCharacter == 'gf')
+ {
+ if (AnimName == 'singLEFT')
+ {
+ danced = true;
+ }
+ else if (AnimName == 'singRIGHT')
+ {
+ danced = false;
+ }
+
+ if (AnimName == 'singUP' || AnimName == 'singDOWN')
+ {
+ danced = !danced;
+ }
+ }
}
public function addOffset(name:String, x:Float = 0, y:Float = 0)
diff --git a/source/ChartingState.hx b/source/ChartingState.hx
index 87d0409..a4cf96c 100644
--- a/source/ChartingState.hx
+++ b/source/ChartingState.hx
@@ -1,5 +1,6 @@
package;
+import Section.SwagSection;
import Song.SwagSong;
import flixel.FlxG;
import flixel.FlxSprite;
@@ -68,6 +69,8 @@ class ChartingState extends MusicBeatState
**/
var curSelectedNote:Array;
+ var tempBpm:Int = 0;
+
override function create()
{
gridBG = FlxGridOverlay.create(GRID_SIZE, GRID_SIZE, GRID_SIZE * 8, GRID_SIZE * 16);
@@ -81,9 +84,9 @@ class ChartingState extends MusicBeatState
else
{
_song = {
- song: 'tutorial',
+ song: 'Monster',
notes: [],
- bpm: 100,
+ bpm: 95,
sections: 0,
needsVoices: false,
player1: 'bf',
@@ -93,6 +96,8 @@ class ChartingState extends MusicBeatState
};
}
+ tempBpm = _song.bpm;
+
addSection();
// sections = _song.notes;
@@ -172,7 +177,7 @@ class ChartingState extends MusicBeatState
stepperBPM.value = Conductor.bpm;
stepperBPM.name = 'song_bpm';
- var characters:Array = ["bf", 'dad', 'gf', 'spooky'];
+ var characters:Array = ["bf", 'dad', 'gf', 'spooky', 'monster'];
var player1DropDown = new FlxUIDropDownMenu(10, 100, FlxUIDropDownMenu.makeStrIdLabelArray(characters, true), function(character:String)
{
@@ -208,6 +213,8 @@ class ChartingState extends MusicBeatState
var stepperLength:FlxUINumericStepper;
var check_mustHitSection:FlxUICheckBox;
+ var check_changeBPM:FlxUICheckBox;
+ var stepperSectionBPM:FlxUINumericStepper;
function addSectionUI():Void
{
@@ -218,7 +225,11 @@ class ChartingState extends MusicBeatState
stepperLength.value = _song.notes[curSection].lengthInSteps;
stepperLength.name = "section_length";
- var stepperCopy:FlxUINumericStepper = new FlxUINumericStepper(110, 30, 1, 1, 1, 999, 0);
+ stepperSectionBPM = new FlxUINumericStepper(10, 80, 1, Conductor.bpm, 0, 999, 0);
+ stepperSectionBPM.value = Conductor.bpm;
+ stepperSectionBPM.name = 'section_bpm';
+
+ var stepperCopy:FlxUINumericStepper = new FlxUINumericStepper(110, 30, 1, 1, -999, 999, 0);
var copyButton:FlxButton = new FlxButton(110, 8, "Copy last section", function()
{
@@ -229,15 +240,15 @@ class ChartingState extends MusicBeatState
check_mustHitSection.name = 'check_mustHit';
check_mustHitSection.checked = true;
// _song.needsVoices = check_mustHit.checked;
- check_mustHitSection.callback = function()
- {
- // _song.needsVoices = check_mustHit.checked;
- trace('CHECKED!');
- };
+
+ check_changeBPM = new FlxUICheckBox(10, 60, null, null, 'Change BPM', 100);
+ check_changeBPM.name = 'check_changeBPM';
tab_group_section.add(stepperLength);
+ tab_group_section.add(stepperSectionBPM);
tab_group_section.add(stepperCopy);
tab_group_section.add(check_mustHitSection);
+ tab_group_section.add(check_changeBPM);
tab_group_section.add(copyButton);
UI_box.addGroup(tab_group_section);
@@ -267,7 +278,7 @@ class ChartingState extends MusicBeatState
if (FlxG.sound.music != null)
FlxG.sound.music.stop();
- FlxG.sound.playMusic('assets/music/' + daSong + '.mp3', 0.6);
+ FlxG.sound.playMusic('assets/music/' + daSong + TitleState.soundExt, 0.6);
FlxG.sound.music.pause();
FlxG.sound.music.onComplete = function()
{
@@ -305,6 +316,9 @@ class ChartingState extends MusicBeatState
{
case 'Must hit section':
_song.notes[curSection].mustHitSection = check.checked;
+ case 'Change BPM':
+ _song.notes[curSection].changeBPM = check.checked;
+ FlxG.log.add('changed bpm shit');
}
}
else if (id == FlxUINumericStepper.CHANGE_EVENT && (sender is FlxUINumericStepper))
@@ -323,6 +337,7 @@ class ChartingState extends MusicBeatState
}
else if (wname == 'song_bpm')
{
+ tempBpm = Std.int(nums.value);
Conductor.changeBPM(Std.int(nums.value));
}
else if (wname == 'note_susLength')
@@ -330,6 +345,11 @@ class ChartingState extends MusicBeatState
curSelectedNote[2] = nums.value;
updateGrid();
}
+ else if (wname == 'section_bpm')
+ {
+ _song.notes[curSection].bpm = Std.int(nums.value);
+ updateGrid();
+ }
}
// FlxG.log.add(id + " WEED " + sender + " WEED " + data + " WEED " + params);
@@ -448,12 +468,12 @@ class ChartingState extends MusicBeatState
}
}
- _song.bpm = Conductor.bpm;
+ _song.bpm = tempBpm;
- if (FlxG.keys.justPressed.UP)
- Conductor.changeBPM(Conductor.bpm + 1);
- if (FlxG.keys.justPressed.DOWN)
- Conductor.changeBPM(Conductor.bpm - 1);
+ /* if (FlxG.keys.justPressed.UP)
+ Conductor.changeBPM(Conductor.bpm + 1);
+ if (FlxG.keys.justPressed.DOWN)
+ Conductor.changeBPM(Conductor.bpm - 1); */
if (FlxG.keys.justPressed.RIGHT)
changeSection(curSection + 1);
@@ -471,6 +491,7 @@ class ChartingState extends MusicBeatState
if (_song.notes[sec] != null)
{
curSection = sec;
+
updateGrid();
if (updateMusic)
@@ -489,6 +510,7 @@ class ChartingState extends MusicBeatState
updateCurStep();
}
+ updateGrid();
updateSectionUI();
}
}
@@ -514,6 +536,8 @@ class ChartingState extends MusicBeatState
stepperLength.value = sec.lengthInSteps;
check_mustHitSection.checked = sec.mustHitSection;
+ check_changeBPM.checked = sec.changeBPM;
+ stepperSectionBPM.value = sec.bpm;
}
function updateNoteUI():Void
@@ -535,6 +559,15 @@ class ChartingState extends MusicBeatState
var sectionInfo:Array = _song.notes[curSection].sectionNotes;
+ if (_song.notes[curSection].changeBPM && _song.notes[curSection].bpm > 0)
+ {
+ Conductor.changeBPM(_song.notes[curSection].bpm);
+ }
+ else
+ {
+ Conductor.changeBPM(tempBpm);
+ }
+
/* // PORT BULLSHIT, INCASE THERE'S NO SUSTAIN DATA FOR A NOTE
for (sec in 0..._song.notes.length)
{
@@ -567,8 +600,7 @@ class ChartingState extends MusicBeatState
if (daSus > 0)
{
var sustainVis:FlxSprite = new FlxSprite(note.x + (GRID_SIZE / 2),
- note.y + getYfromStrum(note.strumTime + Conductor.stepCrochet)).makeGraphic(8,
- Math.floor(FlxMath.remapToRange(daSus, 0, Conductor.stepCrochet * 16, 0, gridBG.height)));
+ note.y + GRID_SIZE).makeGraphic(8, Math.floor(FlxMath.remapToRange(daSus, 0, Conductor.stepCrochet * 16, 0, gridBG.height)));
curRenderedSustains.add(sustainVis);
}
}
@@ -576,7 +608,16 @@ class ChartingState extends MusicBeatState
private function addSection(lengthInSteps:Int = 16):Void
{
- _song.notes.push(new Section(lengthInSteps));
+ var sec:SwagSection = {
+ lengthInSteps: lengthInSteps,
+ bpm: _song.bpm,
+ changeBPM: false,
+ mustHitSection: true,
+ sectionNotes: [],
+ typeOfSection: 0
+ };
+
+ _song.notes.push(sec);
}
function selectNote(note:Note):Void
@@ -611,6 +652,16 @@ class ChartingState extends MusicBeatState
updateGrid();
}
+ function clearSong():Void
+ {
+ for (daSection in 0..._song.notes.length)
+ {
+ _song.notes[daSection].sectionNotes = [];
+ }
+
+ updateGrid();
+ }
+
private function addNote():Void
{
var noteStrum = Math.round(getStrumTime(dummyArrow.y) + (curSection * (Conductor.stepCrochet * 16)));
@@ -638,7 +689,7 @@ class ChartingState extends MusicBeatState
return FlxMath.remapToRange(strumTime, 0, 16 * Conductor.stepCrochet, gridBG.y, gridBG.y + gridBG.height);
}
- function calculateSectionLengths(?sec:Section):Int
+ function calculateSectionLengths(?sec:SwagSection):Int
{
var daLength:Int = 0;
diff --git a/source/FreeplayState.hx b/source/FreeplayState.hx
index 626e402..f2a717f 100644
--- a/source/FreeplayState.hx
+++ b/source/FreeplayState.hx
@@ -14,7 +14,7 @@ import flixel.text.FlxText;
class FreeplayState extends MusicBeatState
{
- var songs:Array = ["Bopeebo", "Dadbattle", "Fresh", "Tutorial\nlol"];
+ var songs:Array = ["Bopeebo", "Dadbattle", "Fresh", "Tutorial", "Spookeez", "South", "Monster"];
var selector:FlxText;
var curSelected:Int = 0;
@@ -30,11 +30,17 @@ class FreeplayState extends MusicBeatState
for (i in 0...songs.length)
{
- var songText:Alphabet = new Alphabet(40, (70 * i) + 30, songs[i]);
+ var songText:Alphabet = new Alphabet(0, (70 * i) + 30, songs[i], true, false);
add(songText);
+ songText.x += 40;
+ // DONT PUT X IN THE FIRST PARAMETER OF new ALPHABET() !!
+ // songText.screenCenter(X);
}
+ FlxG.sound.playMusic('assets/music/title' + TitleState.soundExt, 0);
+ FlxG.sound.music.fadeIn(2, 0, 0.8);
selector = new FlxText();
+
selector.size = 40;
selector.text = ">";
add(selector);
@@ -46,11 +52,16 @@ class FreeplayState extends MusicBeatState
override function update(elapsed:Float)
{
- if (FlxG.keys.justPressed.UP)
+ super.update(elapsed);
+ var upP = controls.UP_P;
+ var downP = controls.DOWN_P;
+ var accepted = controls.ACCEPT;
+
+ if (upP)
{
curSelected -= 1;
}
- if (FlxG.keys.justPressed.DOWN)
+ if (downP)
{
curSelected += 1;
}
@@ -73,10 +84,11 @@ class FreeplayState extends MusicBeatState
selector.y = (70 * curSelected) + 30;
- if (FlxG.keys.justPressed.ENTER)
+ if (accepted)
{
PlayState.SONG = Song.loadFromJson(songs[curSelected].toLowerCase());
FlxG.switchState(new PlayState());
+ FlxG.sound.music.stop();
}
#if switch
@@ -84,9 +96,8 @@ class FreeplayState extends MusicBeatState
{
PlayState.SONG = Song.loadFromJson(songs[curSelected].toLowerCase());
FlxG.switchState(new PlayState());
+ FlxG.sound.music.stop();
}
#end
-
- super.update(elapsed);
}
}
diff --git a/source/GameOverState.hx b/source/GameOverState.hx
index d3de483..0643254 100644
--- a/source/GameOverState.hx
+++ b/source/GameOverState.hx
@@ -10,26 +10,44 @@ import flixel.tweens.FlxTween;
class GameOverState extends FlxTransitionableState
{
+ var bfX:Float = 0;
+ var bfY:Float = 0;
+
+ public function new(x:Float, y:Float)
+ {
+ super();
+
+ bfX = x;
+ bfY = y;
+ }
+
override function create()
{
- var loser:FlxSprite = new FlxSprite(100, 100);
- var loseTex = FlxAtlasFrames.fromSparrow(AssetPaths.lose__png, AssetPaths.lose__xml);
- loser.frames = loseTex;
- loser.animation.addByPrefix('lose', 'lose', 24, false);
- loser.animation.play('lose');
- add(loser);
+ /* var loser:FlxSprite = new FlxSprite(100, 100);
+ var loseTex = FlxAtlasFrames.fromSparrow(AssetPaths.lose__png, AssetPaths.lose__xml);
+ loser.frames = loseTex;
+ loser.animation.addByPrefix('lose', 'lose', 24, false);
+ loser.animation.play('lose');
+ // add(loser); */
- var restart:FlxSprite = new FlxSprite(500, 50).loadGraphic(AssetPaths.restart__png);
- restart.setGraphicSize(Std.int(restart.width * 0.6));
- restart.updateHitbox();
- restart.alpha = 0;
- restart.antialiasing = true;
- add(restart);
+ var bf:Boyfriend = new Boyfriend(bfX, bfY);
+ // bf.scrollFactor.set();
+ add(bf);
+ bf.playAnim('firstDeath');
+
+ FlxG.camera.follow(bf, LOCKON, 0.001);
+ /*
+ var restart:FlxSprite = new FlxSprite(500, 50).loadGraphic(AssetPaths.restart__png);
+ restart.setGraphicSize(Std.int(restart.width * 0.6));
+ restart.updateHitbox();
+ restart.alpha = 0;
+ restart.antialiasing = true;
+ // add(restart); */
FlxG.sound.music.fadeOut(2, FlxG.sound.music.volume * 0.6);
- FlxTween.tween(restart, {alpha: 1}, 1, {ease: FlxEase.quartInOut});
- FlxTween.tween(restart, {y: restart.y + 40}, 7, {ease: FlxEase.quartInOut, type: PINGPONG});
+ // FlxTween.tween(restart, {alpha: 1}, 1, {ease: FlxEase.quartInOut});
+ // FlxTween.tween(restart, {y: restart.y + 40}, 7, {ease: FlxEase.quartInOut, type: PINGPONG});
super.create();
}
@@ -48,6 +66,8 @@ class GameOverState extends FlxTransitionableState
pressed = true;
}
+ pressed = false;
+
if (pressed && !fading)
{
fading = true;
diff --git a/source/GameOverSubstate.hx b/source/GameOverSubstate.hx
new file mode 100644
index 0000000..1a7d89d
--- /dev/null
+++ b/source/GameOverSubstate.hx
@@ -0,0 +1,89 @@
+package;
+
+import flixel.FlxG;
+import flixel.FlxObject;
+import flixel.FlxSubState;
+import flixel.math.FlxPoint;
+import flixel.util.FlxColor;
+import flixel.util.FlxTimer;
+
+class GameOverSubstate extends MusicBeatSubstate
+{
+ var bf:Boyfriend;
+ var camFollow:FlxObject;
+
+ public function new(x:Float, y:Float)
+ {
+ super();
+
+ Conductor.songPosition = 0;
+
+ bf = new Boyfriend(x, y);
+ add(bf);
+
+ camFollow = new FlxObject(bf.getGraphicMidpoint().x, bf.getGraphicMidpoint().y, 1, 1);
+ add(camFollow);
+
+ FlxG.sound.play('assets/sounds/fnf_loss_sfx' + TitleState.soundExt);
+ Conductor.changeBPM(100);
+
+ // FlxG.camera.followLerp = 1;
+ // FlxG.camera.focusOn(FlxPoint.get(FlxG.width / 2, FlxG.height / 2));
+ FlxG.camera.scroll.set();
+ FlxG.camera.target = null;
+
+ bf.playAnim('firstDeath');
+ }
+
+ override function update(elapsed:Float)
+ {
+ super.update(elapsed);
+
+ if (FlxG.keys.justPressed.ENTER)
+ {
+ endBullshit();
+ }
+
+ if (bf.animation.curAnim.name == 'firstDeath' && bf.animation.curAnim.curFrame == 12)
+ {
+ FlxG.camera.follow(camFollow, LOCKON, 0.01);
+ }
+
+ if (bf.animation.curAnim.name == 'firstDeath' && bf.animation.curAnim.finished)
+ {
+ FlxG.sound.playMusic('assets/music/gameOver' + TitleState.soundExt);
+ }
+
+ if (FlxG.sound.music.playing)
+ {
+ Conductor.songPosition = FlxG.sound.music.time;
+ }
+ }
+
+ override function beatHit()
+ {
+ super.beatHit();
+
+ FlxG.log.add('beat');
+ }
+
+ var isEnding:Bool = false;
+
+ function endBullshit():Void
+ {
+ if (!isEnding)
+ {
+ isEnding = true;
+ bf.playAnim('deathConfirm', true);
+ FlxG.sound.music.stop();
+ FlxG.sound.play('assets/music/gameOverEnd' + TitleState.soundExt);
+ new FlxTimer().start(0.7, function(tmr:FlxTimer)
+ {
+ FlxG.camera.fade(FlxColor.BLACK, 2, false, function()
+ {
+ FlxG.switchState(new PlayState());
+ });
+ });
+ }
+ }
+}
diff --git a/source/Main.hx b/source/Main.hx
index e2e0f4d..13376db 100644
--- a/source/Main.hx
+++ b/source/Main.hx
@@ -9,7 +9,7 @@ class Main extends Sprite
public function new()
{
super();
- addChild(new FlxGame(0, 0, FreeplayState));
+ addChild(new FlxGame(0, 0, TitleState));
#if !mobile
addChild(new FPS(10, 3, 0xFFFFFF));
diff --git a/source/MenuItem.hx b/source/MenuItem.hx
new file mode 100644
index 0000000..5e7ddc7
--- /dev/null
+++ b/source/MenuItem.hx
@@ -0,0 +1,38 @@
+package;
+
+import flixel.FlxSprite;
+import flixel.graphics.frames.FlxAtlasFrames;
+import flixel.group.FlxSpriteGroup;
+import flixel.math.FlxMath;
+
+class MenuItem extends FlxSpriteGroup
+{
+ public var targetY:Float = 0;
+
+ public function new(x:Float, y:Float, weekNum:Int = 0, unlocked:Bool = false)
+ {
+ super(x, y);
+
+ var tex = FlxAtlasFrames.fromSparrow(AssetPaths.campaign_menu_UI_assets__png, AssetPaths.campaign_menu_UI_assets__xml);
+
+ var week:FlxSprite = new FlxSprite();
+ week.frames = tex;
+ week.animation.addByPrefix('week0', "WEEK1 select", 24);
+ week.animation.addByPrefix('week1', "week2 select", 24);
+ add(week);
+
+ week.animation.play('week' + weekNum);
+ week.updateHitbox();
+
+ if (!unlocked)
+ {
+ week.alpha = 0.6;
+ }
+ }
+
+ override function update(elapsed:Float)
+ {
+ super.update(elapsed);
+ y = FlxMath.lerp(y, (targetY * 120) + 480, 0.17);
+ }
+}
diff --git a/source/MusicBeatState.hx b/source/MusicBeatState.hx
index 321dc29..791cd95 100644
--- a/source/MusicBeatState.hx
+++ b/source/MusicBeatState.hx
@@ -15,6 +15,10 @@ class MusicBeatState extends FlxUIState
private var curStep:Int = 0;
private var curBeat:Int = 0;
+ private var controls(get, never):Controls;
+
+ inline function get_controls():Controls
+ return PlayerSettings.player1.controls;
override function create()
{
diff --git a/source/MusicBeatSubstate.hx b/source/MusicBeatSubstate.hx
new file mode 100644
index 0000000..0e452e9
--- /dev/null
+++ b/source/MusicBeatSubstate.hx
@@ -0,0 +1,78 @@
+package;
+
+import flixel.FlxSubState;
+
+class MusicBeatSubstate extends FlxSubState
+{
+ public function new()
+ {
+ super();
+ }
+
+ private var lastBeat:Float = 0;
+ private var lastStep:Float = 0;
+
+ private var totalBeats:Int = 0;
+ private var totalSteps:Int = 0;
+
+ private var curStep:Int = 0;
+ private var curBeat:Int = 0;
+ private var controls(get, never):Controls;
+
+ inline function get_controls():Controls
+ return PlayerSettings.player1.controls;
+
+ override function create()
+ {
+ #if (!web)
+ TitleState.soundExt = '.ogg';
+ #end
+
+ super.create();
+ }
+
+ override function update(elapsed:Float)
+ {
+ everyStep();
+
+ updateCurStep();
+ curBeat = Math.round(curStep / 4);
+
+ super.update(elapsed);
+ }
+
+ /**
+ * CHECKS EVERY FRAME
+ */
+ private function everyStep():Void
+ {
+ if (Conductor.songPosition > lastStep + Conductor.stepCrochet - Conductor.safeZoneOffset
+ || Conductor.songPosition < lastStep + Conductor.safeZoneOffset)
+ {
+ if (Conductor.songPosition > lastStep + Conductor.stepCrochet)
+ {
+ stepHit();
+ }
+ }
+ }
+
+ private function updateCurStep():Void
+ {
+ curStep = Math.floor(Conductor.songPosition / Conductor.stepCrochet);
+ }
+
+ public function stepHit():Void
+ {
+ totalSteps += 1;
+ lastStep += Conductor.stepCrochet;
+
+ if (totalSteps % 4 == 0)
+ beatHit();
+ }
+
+ public function beatHit():Void
+ {
+ lastBeat += Conductor.crochet;
+ totalBeats += 1;
+ }
+}
diff --git a/source/Note.hx b/source/Note.hx
index 521dc22..748cbe1 100644
--- a/source/Note.hx
+++ b/source/Note.hx
@@ -130,8 +130,9 @@ class Note extends FlxSprite
if (mustPress)
{
+ // The * 0.5 us so that its easier to hit them too late, instead of too early
if (strumTime > Conductor.songPosition - Conductor.safeZoneOffset
- && strumTime < Conductor.songPosition + Conductor.safeZoneOffset)
+ && strumTime < Conductor.songPosition + (Conductor.safeZoneOffset * 0.5))
{
canBeHit = true;
}
diff --git a/source/PauseSubState.hx b/source/PauseSubState.hx
index a4a1278..dbf232b 100644
--- a/source/PauseSubState.hx
+++ b/source/PauseSubState.hx
@@ -9,7 +9,7 @@ import flixel.util.FlxColor;
class PauseSubState extends FlxSubState
{
- public function new()
+ public function new(x:Float, y:Float)
{
super();
var bg:FlxSprite = new FlxSprite().makeGraphic(FlxG.width, FlxG.height, FlxColor.BLACK);
@@ -17,6 +17,12 @@ class PauseSubState extends FlxSubState
bg.scrollFactor.set();
add(bg);
+ var bf:Boyfriend = new Boyfriend(x, y);
+ bf.scrollFactor.set();
+ // add(bf);
+
+ bf.playAnim('firstDeath');
+
bg.cameras = [FlxG.cameras.list[1]];
}
diff --git a/source/PlayState.hx b/source/PlayState.hx
index ef165d4..9f4784d 100644
--- a/source/PlayState.hx
+++ b/source/PlayState.hx
@@ -48,9 +48,6 @@ class PlayState extends MusicBeatState
private var strumLine:FlxSprite;
private var curSection:Int = 0;
- private var sectionScores:Array = [[], []];
- private var sectionLengths:Array = [];
-
private var camFollow:FlxObject;
private var strumLineNotes:FlxTypedGroup;
private var playerStrums:FlxTypedGroup;
@@ -72,11 +69,6 @@ class PlayState extends MusicBeatState
private var camHUD:FlxCamera;
private var camGame:FlxCamera;
- var controls(get, never):Controls;
-
- inline function get_controls():Controls
- return PlayerSettings.player1.controls;
-
override public function create()
{
// var gameCam:FlxCamera = FlxG.camera;
@@ -89,14 +81,14 @@ class PlayState extends MusicBeatState
FlxCamera.defaultCameras = [camGame];
- PlayerSettings.init();
-
persistentUpdate = true;
persistentDraw = true;
if (SONG == null)
SONG = Song.loadFromJson(curLevel);
+ Conductor.changeBPM(SONG.bpm);
+
var bg:FlxSprite = new FlxSprite(-600, -200).loadGraphic(AssetPaths.stageback__png);
// bg.setGraphicSize(Std.int(bg.width * 2.5));
// bg.updateHitbox();
@@ -135,6 +127,8 @@ class PlayState extends MusicBeatState
gf.visible = false;
case "spooky":
dad.y += 200;
+ case "monster":
+ dad.y += 100;
}
boyfriend = new Boyfriend(770, 450);
@@ -194,6 +188,12 @@ class PlayState extends MusicBeatState
strumLineNotes.cameras = [camHUD];
notes.cameras = [camHUD];
+ healthBar.cameras = [camHUD];
+ healthBarBG.cameras = [camHUD];
+ healthHeads.cameras = [camHUD];
+
+ // if (SONG.song == 'South')
+ // FlxG.camera.alpha = 0.7;
// UI_camera.zoom = 1;
// cameras = [FlxG.cameras.list[1]];
@@ -213,6 +213,10 @@ class PlayState extends MusicBeatState
startTimer = new FlxTimer().start(Conductor.crochet / 1000, function(tmr:FlxTimer)
{
+ dad.dance();
+ gf.dance();
+ boyfriend.playAnim('idle');
+
switch (swagCounter)
{
case 0:
@@ -307,11 +311,6 @@ class PlayState extends MusicBeatState
// NEW SHIT
noteData = songData.notes;
- for (i in 1...songData.sections + 1)
- {
- // noteData.push(ChartParser.parse(songData.song.toLowerCase(), i));
- }
-
var playerCounter:Int = 0;
var daBeats:Int = 0; // Not exactly representative of 'daBeats' lol, just how much it has looped
@@ -321,15 +320,12 @@ class PlayState extends MusicBeatState
for (songNotes in section.sectionNotes)
{
- sectionScores[0].push(0);
- sectionScores[1].push(0);
-
var daStrumTime:Float = songNotes[0];
var daNoteData:Int = Std.int(songNotes[1] % 4);
var gottaHitNote:Bool = section.mustHitSection;
- if (songNotes.noteData > 3)
+ if (songNotes[1] > 3)
{
gottaHitNote = !section.mustHitSection;
}
@@ -374,26 +370,7 @@ class PlayState extends MusicBeatState
else
{
}
-
- // WILL HAVE TO REDO SCORE SYSTEM
- /* if (section.mustHitSection)
- {
- if (playerCounter == 1) // is the player
- {
- swagNote.mustPress = true;
- }
- else
- {
- //sectionScores[0][daBeats] += swagNote.noteScore;
- }
- }
- */
}
-
- /* // only need to do it once
- if (section.mustHitSection)
- sectionLengths.push(Math.round(coolSection / 4));
- */
daBeats += 1;
}
@@ -471,8 +448,6 @@ class PlayState extends MusicBeatState
}
}
- var sectionScored:Bool = false;
-
override function openSubState(SubState:FlxSubState)
{
if (paused)
@@ -526,7 +501,7 @@ class PlayState extends MusicBeatState
persistentDraw = true;
paused = true;
- openSubState(new PauseSubState());
+ openSubState(new PauseSubState(boyfriend.getScreenPosition().x, boyfriend.getScreenPosition().y));
}
if (FlxG.keys.justPressed.ESCAPE)
@@ -581,16 +556,6 @@ class PlayState extends MusicBeatState
// Conductor.lastSongPos = FlxG.sound.music.time;
}
- var playerTurn:Int = 0;
- if (sectionLengths.length > curSection)
- playerTurn = totalBeats % (sectionLengths[curSection] * 8);
-
- if (playerTurn == (sectionLengths[curSection] * 8) - 1 && !sectionScored)
- {
- // popUpScore();
- sectionScored = true;
- }
-
if (generatedMusic && PlayState.SONG.notes[Std.int(curStep / 16)] != null)
{
if (curBeat % 4 == 0)
@@ -625,11 +590,6 @@ class PlayState extends MusicBeatState
FlxG.camera.zoom = FlxMath.lerp(1.05, FlxG.camera.zoom, 0.96);
}
- if (playerTurn < 4)
- {
- sectionScored = false;
- }
-
FlxG.watch.addQuick("beatShit", totalBeats);
if (curSong == 'Fresh')
@@ -667,7 +627,17 @@ class PlayState extends MusicBeatState
if (health <= 0)
{
boyfriend.stunned = true;
- FlxG.switchState(new GameOverState());
+
+ persistentUpdate = false;
+ persistentDraw = false;
+ paused = true;
+
+ vocals.stop();
+ FlxG.sound.music.stop();
+
+ openSubState(new GameOverSubstate(boyfriend.getScreenPosition().x, boyfriend.getScreenPosition().y));
+
+ // FlxG.switchState(new GameOverState(boyfriend.getScreenPosition().x, boyfriend.getScreenPosition().y));
}
if (unspawnNotes[0] != null)
@@ -702,15 +672,18 @@ class PlayState extends MusicBeatState
switch (Math.abs(daNote.noteData))
{
case 2:
- dad.playAnim('singUP');
+ dad.playAnim('singUP', true);
case 3:
- dad.playAnim('singRIGHT');
+ dad.playAnim('singRIGHT', true);
case 1:
- dad.playAnim('singDOWN');
+ dad.playAnim('singDOWN', true);
case 0:
- dad.playAnim('singLEFT');
+ dad.playAnim('singLEFT', true);
}
+ if (SONG.needsVoices)
+ vocals.volume = 1;
+
daNote.kill();
notes.remove(daNote, true);
daNote.destroy();
@@ -724,7 +697,7 @@ class PlayState extends MusicBeatState
{
if (daNote.tooLate)
{
- health -= 0.05;
+ health -= 0.03;
vocals.volume = 0;
}
@@ -744,12 +717,10 @@ class PlayState extends MusicBeatState
private function popUpScore(strumtime:Float):Void
{
var noteDiff:Float = Math.abs(strumtime - Conductor.songPosition);
-
// boyfriend.playAnim('hey');
- // vocals.volume = 1;
+ vocals.volume = 1;
var placement:String = Std.string(combo);
- // var placement:String = sectionScores[1][curSection] + '/' + sectionScores[0][curSection];
var coolText:FlxText = new FlxText(0, 0, 0, placement, 32);
coolText.screenCenter();
@@ -878,72 +849,6 @@ class PlayState extends MusicBeatState
var downR = controls.DOWN_R;
var leftR = controls.LEFT_R;
- /*
- var gamepad = FlxG.gamepads.lastActive;
- if (gamepad != null)
- {
- if (gamepad.anyPressed(["DPAD_LEFT", "LEFT_STICK_DIGITAL_LEFT", X]))
- {
- left = true;
- }
-
- if (gamepad.anyPressed(["DPAD_RIGHT", "LEFT_STICK_DIGITAL_RIGHT", B]))
- {
- right = true;
- }
-
- if (gamepad.anyPressed(['DPAD_UP', "LEFT_STICK_DIGITAL_UP", Y]))
- {
- up = true;
- }
-
- if (gamepad.anyPressed(["DPAD_DOWN", "LEFT_STICK_DIGITAL_DOWN", A]))
- {
- down = true;
- }
-
- if (gamepad.anyJustPressed(["DPAD_LEFT", "LEFT_STICK_DIGITAL_LEFT", X]))
- {
- leftP = true;
- }
-
- if (gamepad.anyJustPressed(["DPAD_RIGHT", "LEFT_STICK_DIGITAL_RIGHT", B]))
- {
- rightP = true;
- }
-
- if (gamepad.anyJustPressed(['DPAD_UP', "LEFT_STICK_DIGITAL_UP", Y]))
- {
- upP = true;
- }
-
- if (gamepad.anyJustPressed(["DPAD_DOWN", "LEFT_STICK_DIGITAL_DOWN", A]))
- {
- downP = true;
- }
-
- if (gamepad.anyJustReleased(["DPAD_LEFT", "LEFT_STICK_DIGITAL_LEFT", X]))
- {
- leftR = true;
- }
-
- if (gamepad.anyJustReleased(["DPAD_RIGHT", "LEFT_STICK_DIGITAL_RIGHT", B]))
- {
- rightR = true;
- }
-
- if (gamepad.anyJustReleased(['DPAD_UP', "LEFT_STICK_DIGITAL_UP", Y]))
- {
- upR = true;
- }
-
- if (gamepad.anyJustReleased(["DPAD_DOWN", "LEFT_STICK_DIGITAL_DOWN", A]))
- {
- downR = true;
- }
- }
- */
-
// FlxG.watch.addQuick('asdfa', upP);
if ((upP || rightP || downP || leftP) && !boyfriend.stunned && generatedMusic)
{
@@ -1067,14 +972,16 @@ class PlayState extends MusicBeatState
{
if (!boyfriend.stunned)
{
- health -= 0.08;
+ health -= 0.055;
if (combo > 5)
{
gf.playAnim('sad');
}
combo = 0;
- FlxG.sound.play('assets/sounds/missnote' + FlxG.random.int(1, 3) + TitleState.soundExt, FlxG.random.float(0.05, 0.2));
+ FlxG.sound.play('assets/sounds/missnote' + FlxG.random.int(1, 3) + TitleState.soundExt, FlxG.random.float(0.1, 0.2));
+ // FlxG.sound.play('assets/sounds/missnote1' + TitleState.soundExt, 1, false);
+ // FlxG.log.add('played imss note');
boyfriend.stunned = true;
@@ -1154,8 +1061,11 @@ class PlayState extends MusicBeatState
{
if (!note.wasGoodHit)
{
- popUpScore(note.strumTime);
- combo += 1;
+ if (!note.isSustainNote)
+ {
+ popUpScore(note.strumTime);
+ combo += 1;
+ }
if (note.noteData >= 0)
health += 0.03;
@@ -1182,7 +1092,6 @@ class PlayState extends MusicBeatState
}
});
- sectionScores[1][curSection] += note.noteScore;
note.wasGoodHit = true;
vocals.volume = 1;
@@ -1194,12 +1103,22 @@ class PlayState extends MusicBeatState
override function stepHit()
{
- if (vocals.time > Conductor.songPosition + Conductor.stepCrochet || vocals.time < Conductor.songPosition - Conductor.stepCrochet)
+ if (SONG.needsVoices)
{
- vocals.pause();
- vocals.time = Conductor.songPosition;
- vocals.play();
+ if (vocals.time > Conductor.songPosition + Conductor.stepCrochet
+ || vocals.time < Conductor.songPosition - Conductor.stepCrochet)
+ {
+ vocals.pause();
+ vocals.time = Conductor.songPosition;
+ vocals.play();
+ }
}
+
+ if (dad.curCharacter == 'spooky' && totalSteps % 4 == 2)
+ {
+ // dad.dance();
+ }
+
super.stepHit();
}
@@ -1212,16 +1131,40 @@ class PlayState extends MusicBeatState
notes.sort(FlxSort.byY, FlxSort.DESCENDING);
}
+ FlxG.log.add('change bpm' + SONG.notes[Std.int(curStep / 16)].changeBPM);
+ if (SONG.notes[Std.int(curStep / 16)].changeBPM)
+ {
+ Conductor.changeBPM(SONG.notes[Std.int(curStep / 16)].bpm);
+ FlxG.log.add('CHANGED BPM!');
+ }
+ else
+ Conductor.changeBPM(SONG.bpm);
+
if (camZooming && FlxG.camera.zoom < 1.35 && totalBeats % 4 == 0)
FlxG.camera.zoom += 0.025;
- dad.dance();
+ // Dad doesnt interupt his own notes
+ if (SONG.notes[Std.int(curStep / 16)].mustHitSection)
+ dad.dance();
+
healthHeads.setGraphicSize(Std.int(healthHeads.width + 20));
if (totalBeats % gfSpeed == 0)
+ {
gf.dance();
+ }
if (!boyfriend.animation.curAnim.name.startsWith("sing"))
boyfriend.playAnim('idle');
+
+ if (totalBeats % 8 == 6)
+ {
+ boyfriend.playAnim('hey', true);
+
+ if (SONG.song == 'Tutorial' && dad.curCharacter == 'gf')
+ {
+ dad.playAnim('cheer', true);
+ }
+ }
}
}
diff --git a/source/Section.hx b/source/Section.hx
index c811e30..19770b6 100644
--- a/source/Section.hx
+++ b/source/Section.hx
@@ -6,6 +6,8 @@ typedef SwagSection =
var lengthInSteps:Int;
var typeOfSection:Int;
var mustHitSection:Bool;
+ var bpm:Int;
+ var changeBPM:Bool;
}
class Section
diff --git a/source/StoryMenuState.hx b/source/StoryMenuState.hx
new file mode 100644
index 0000000..bae5703
--- /dev/null
+++ b/source/StoryMenuState.hx
@@ -0,0 +1,172 @@
+package;
+
+import flixel.FlxG;
+import flixel.FlxSprite;
+import flixel.graphics.frames.FlxAtlasFrames;
+import flixel.group.FlxGroup.FlxTypedGroup;
+import flixel.group.FlxGroup;
+import flixel.text.FlxText;
+
+using StringTools;
+
+class StoryMenuState extends MusicBeatState
+{
+ var scoreText:FlxText;
+
+ var weekData:Array = [['Tutorial', 'Bopeebo', 'Fresh', 'Dad Battle'], ['Spookeez', 'South', 'Monster']];
+ var weekUnlocked:Array = [true, false];
+
+ var curWeek:Int = 0;
+
+ var txtTracklist:FlxText;
+
+ var grpWeekText:FlxTypedGroup