diff --git a/CHANGELOG.md b/CHANGELOG.md
index cc5d7fa84..5efcd3d6f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,8 +5,15 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
+### Added
+- TANKMAN! 3 NEW SONGS BY KAWAISPRITE (UGH, GUNS, STRESS)! Charting help by MtH!
+- Monster added into week 2, FINALLY (Charting help by MtH and ChaoticGamer!)
+- Can now change song difficulty mid-game.
+- Shows some song info on pause screen.
+- Cute little icons onto freeplay menu
### Changed
- ASSET LOADING OVERHAUL, WAY FASTER LOAD TIMES ON WEB!!! (THANKS TO GEOKURELI WOKE KING)
+- Made difficulty selector on freeplay menu more apparent
### Fixed
- That one random note on Bopeebo
diff --git a/Project.xml b/Project.xml
index df0bfa6a3..85284f76c 100644
--- a/Project.xml
+++ b/Project.xml
@@ -40,6 +40,8 @@
+
+
@@ -57,6 +59,7 @@
+
@@ -89,8 +93,13 @@
+
+
-
+
+
+
+
diff --git a/art/flashFiles/Monster_Assets.fla b/art/flashFiles/Monster_Assets.fla
index a3ecb7691..2cab4ea40 100644
Binary files a/art/flashFiles/Monster_Assets.fla and b/art/flashFiles/Monster_Assets.fla differ
diff --git a/art/flashFiles/TANKMAN_BG_ASSETS.fla b/art/flashFiles/TANKMAN_BG_ASSETS.fla
new file mode 100644
index 000000000..79524b8c1
Binary files /dev/null and b/art/flashFiles/TANKMAN_BG_ASSETS.fla differ
diff --git a/art/flashFiles/Tankman_Assets_pack.fla b/art/flashFiles/Tankman_Assets_pack.fla
new file mode 100644
index 000000000..4e0e49941
Binary files /dev/null and b/art/flashFiles/Tankman_Assets_pack.fla differ
diff --git a/art/flashFiles/pico_killin_assetss.fla b/art/flashFiles/pico_killin_assetss.fla
new file mode 100644
index 000000000..8b34b73c7
Binary files /dev/null and b/art/flashFiles/pico_killin_assetss.fla differ
diff --git a/art/readme.txt b/art/readme.txt
index 99aa167e8..c49e8d3e6 100644
--- a/art/readme.txt
+++ b/art/readme.txt
@@ -15,6 +15,11 @@
| | | (_| (_| \/ | ) | (_) | ) |_ \/ (- (_| | )
/ _/ /
+FRIDAY NIGHT FUNKIN IS A GAME AND IT IS MID-DEVELOPMENT!!!
+PLAY AT YOUR OWN RISK LOL!
+WE ARE UPDATING SOMEWHAT REGULARLY!!
+BUT THE GAME IS ACTIVELY BEING DEVELOPED!
+
HEY
Thanks for downloadin Friday Night FUNKIN'
If you downloaded this from any other place than ninja-muffin24.itch.io/FUNKIN
diff --git a/assets/preload/data/characterList.txt b/assets/preload/data/characterList.txt
index dca94b8e8..1f0e50d2f 100644
--- a/assets/preload/data/characterList.txt
+++ b/assets/preload/data/characterList.txt
@@ -14,4 +14,6 @@ monster
bf-pixel
senpai
senpai-angry
-spirit
\ No newline at end of file
+spirit
+tankman
+pico-speaker
\ No newline at end of file
diff --git a/assets/preload/data/guns/guns.json b/assets/preload/data/guns/guns.json
new file mode 100644
index 000000000..6527f2c8b
--- /dev/null
+++ b/assets/preload/data/guns/guns.json
@@ -0,0 +1 @@
+{"song":{"player1":"bf","notes":[{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[10378.3779,1,0],[10540.54,0,0],[10702.7021,3,324.3243],[11027.0264,2,0],[11189.1885,3,0],[11351.3506,0,0],[11513.5127,3,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[11675.6748,1,0],[11837.8369,0,0],[11999.999,1,0],[12162.1611,0,0],[12324.3232,2,162.162155],[12648.6475,1,162.162155]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[12972.9717,1,0],[13297.2969,2,0],[13621.6211,0,0],[13702.7021,0,0],[13783.7832,0,0],[13945.9453,1,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[14270.27,2,0],[14432.4316,3,0],[14594.5938,1,0],[14756.7559,3,0],[14918.918,0,0],[15081.08,3,0],[15243.2422,1,0],[15405.4043,3,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[15567.5664,1,0],[15729.7285,0,0],[15891.8906,3,324.3243],[16216.2148,2,0],[16378.377,3,0],[16540.54,0,0],[16702.7012,3,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[16864.8633,1,0],[17027.0254,0,0],[17189.1875,1,0],[17351.35,0,0],[17513.5117,2,162.162155],[17837.8359,1,162.162155]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[18162.16,1,0],[18486.4844,2,0],[18810.8086,0,0],[18891.89,0,0],[18972.9727,0,0],[19135.1348,1,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[19459.459,2,0],[19621.6211,3,0],[19783.7832,1,0],[19945.9453,3,0],[20108.1074,0,0],[20270.27,3,0],[20432.4316,1,0],[20594.5938,3,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[20756.7559,0,324.3243],[21081.08,1,0],[21243.2422,3,0],[21405.4043,0,324.3243],[21729.7285,1,0],[21891.89,2,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[22054.0527,3,0],[22216.2148,1,0],[22378.377,3,0],[22540.54,2,0],[22702.7012,0,0],[22864.8633,1,0],[23027.0254,3,0],[23189.1875,2,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[23351.35,0,0],[23432.4316,0,0],[23513.5117,0,0],[23675.6738,1,0],[23837.8359,3,0],[23999.998,2,0],[24162.16,2,0],[24324.3223,2,0],[24486.4844,0,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[24648.6465,3,0],[24810.8086,1,0],[24972.97,3,0],[25135.1328,2,0],[25297.2949,2,0],[25378.377,3,0],[25459.457,0,0],[25621.62,1,0],[25702.7012,0,0],[25783.7813,3,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[25945.9434,0,324.3243],[26270.2676,1,0],[26432.4316,3,0],[26594.5938,0,324.3243],[26918.918,1,0],[27081.08,2,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[27243.2422,3,0],[27405.4043,1,0],[27567.5664,3,0],[27729.7285,2,0],[27891.89,0,0],[28054.0527,1,0],[28216.2148,3,0],[28378.377,2,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[28540.54,0,0],[28621.62,0,0],[28702.7012,0,0],[28864.8633,1,0],[29027.0254,3,0],[29189.1875,2,0],[29351.35,2,0],[29513.5117,2,0],[29675.6738,0,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[29837.8359,3,0],[29999.998,1,0],[30162.16,3,0],[30324.3223,2,0],[30486.4844,2,0],[30567.5664,3,0],[30648.6465,0,0],[30810.8086,1,0],[30891.89,0,0],[30972.97,3,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[31135.1328,3,0],[31216.2148,1,0],[31459.457,0,0],[31621.62,3,0],[31783.7813,2,0],[31945.9434,0,0],[32108.1055,1,0],[32270.2676,1,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[32432.43,3,0],[32513.5117,1,0],[32756.7539,0,0],[32918.918,3,0],[33081.08,2,0],[33243.2422,0,0],[33405.4023,1,0],[33567.5664,1,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[33729.7266,2,0],[33729.7266,6,324.3243],[33810.81,0,0],[34054.05,0,0],[34216.2148,3,0],[34378.375,2,0],[34540.54,3,0],[34702.7,1,0],[34864.8633,3,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[35027.0234,2,0],[35027.0234,5,648.6486],[35108.1055,0,0],[35351.3477,0,0],[35513.51,3,0],[35675.67,2,0],[35675.67,4,648.6486],[35837.8359,3,0],[35999.9961,1,0],[36162.16,3,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[36324.32,3,0],[36405.4023,1,0],[36648.6445,0,0],[36810.81,3,0],[36972.97,2,0],[37135.1328,0,0],[37297.293,1,0],[37459.457,1,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[37621.6172,3,0],[37702.7,1,0],[37945.9453,0,0],[38108.1055,3,0],[38270.27,2,0],[38432.43,0,0],[38594.5938,1,0],[38756.7539,1,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[38918.918,2,0],[38999.9961,0,0],[39243.2422,0,0],[39405.4023,3,0],[39567.5664,2,0],[39729.7266,3,0],[39891.89,1,0],[40054.05,3,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[40216.2148,2,0],[40297.293,0,0],[40540.54,0,0],[40702.7,3,0],[40864.8633,2,0],[40945.94,0,0],[41027.0234,3,0],[41189.1875,1,0],[41351.3477,3,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[41675.6756756757,3,0],[41513.5135135135,0,0],[41837.8378378378,2,0],[42000,3,0],[42162.1621621622,2,0],[42486.4864864865,0,0],[42567.5675675676,0,0],[42324.3243243243,1,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[42810.8108108108,1,0],[43135.1351351351,2,0],[43459.4594594595,1,0],[43783.7837837838,2,0],[42972.972972973,0,0],[43297.2972972973,0,0],[43621.6216216216,0,0],[43945.945945946,0,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[44270.2702702703,3,0],[44108.1081081081,0,0],[44432.4324324324,2,0],[44594.5945945946,3,0],[44756.7567567568,2,0],[45081.0810810811,0,0],[45162.1621621622,0,0],[44189.1891891892,0,0],[44918.9189189189,1,0],[44675.6756756757,3,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[45405.4054054054,1,0],[45729.7297297297,2,0],[46378.3783783784,2,0],[46540.5405405405,3,0],[45729.7297297297,5,243.243243243243],[45405.4054054054,7,243.243243243243],[46054.0540540541,6,243.243243243243],[46378.3783783784,4,243.243243243243],[45567.5675675676,0,0],[45891.8918918919,0,0],[46054.0540540541,2,0],[46135.1351351351,3,0],[46216.2162162162,1,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[46864.8648648649,3,0],[46702.7027027027,0,0],[47027.027027027,2,0],[47189.1891891892,3,0],[47351.3513513514,2,0],[47675.6756756757,0,0],[47756.7567567568,0,0],[47513.5135135135,1,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[48000,1,0],[48324.3243243243,2,0],[48648.6486486487,1,0],[48972.972972973,2,0],[48162.1621621622,0,0],[48486.4864864865,0,0],[48810.8108108108,0,0],[49135.1351351351,0,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[49459.4594594595,3,0],[49297.2972972973,0,0],[49621.6216216216,2,0],[49783.7837837838,3,0],[49945.9459459459,2,0],[50270.2702702703,0,0],[50351.3513513514,0,0],[49378.3783783784,0,0],[50108.1081081081,1,0],[49864.8648648649,3,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[50594.5945945946,1,0],[50918.9189189189,2,0],[51567.5675675676,2,0],[51729.7297297297,3,0],[50756.7567567568,0,0],[51081.0810810811,0,0],[51405.4054054054,1,0],[51243.2432432433,2,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[51891.8867,2,0],[52054.05,3,0],[52216.21,0,0],[52297.293,1,0],[52378.375,2,0],[52540.5352,1,0],[52702.7,0,0],[52864.8633,1,0],[52945.94,2,0],[53027.0234,3,324.3243]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[53351.3477,2,0],[53432.43,1,0],[53513.51,0,0],[53675.67,2,0],[53837.8359,0,0],[53999.9961,3,0],[54162.16,1,0],[54324.32,0,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[54486.4844,2,0],[54567.5625,1,0],[54648.6445,0,0],[54810.81,3,0],[54972.97,0,0],[55135.1328,2,0],[55216.21,1,0],[55297.293,0,0],[55459.457,0,0],[55621.6172,3,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[55783.78,1,0],[55945.94,2,0],[56108.1055,0,0],[56270.2656,2,0],[56432.43,3,0],[56594.59,1,0],[56756.7539,0,0],[56918.9141,2,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[57081.08,2,0],[57081.08,7,324.3243],[57243.24,3,0],[57405.4023,0,0],[57486.4844,1,0],[57567.5625,2,0],[57729.7266,1,0],[57891.8867,0,0],[58054.05,1,0],[58135.1328,2,0],[58216.21,3,324.3243]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[58540.5352,2,0],[58621.6172,1,0],[58702.7,0,0],[58864.86,2,0],[59027.0234,0,0],[59189.1836,3,0],[59351.3477,1,0],[59513.5078,0,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[59675.67,2,0],[59756.7539,1,0],[59837.832,0,0],[59999.9961,3,0],[60162.1563,0,0],[60324.32,2,0],[60405.4023,1,0],[60486.4844,0,0],[60648.6445,0,0],[60810.81,3,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[60972.97,1,0],[61135.1328,2,0],[61297.293,0,0],[61459.457,2,0],[61621.6172,3,0],[61783.78,1,0],[61945.94,0,0],[62108.1055,2,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[62270.2656,5,324.3243],[62270.2656,1,0],[62432.43,3,0],[62594.59,2,0],[62756.7539,3,0],[62918.9141,1,0],[63081.08,0,0],[63243.24,2,0],[63405.4023,3,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[63567.5625,1,0],[63729.7266,3,0],[63891.8867,2,0],[64054.05,3,0],[64216.21,1,0],[64378.375,0,0],[64540.5352,2,0],[64702.7,3,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[64864.86,2,0],[64945.94,0,0],[65027.0234,1,0],[65189.1836,2,0],[65270.2656,0,0],[65351.3477,1,0],[65513.5078,1,0],[65594.59,3,0],[65675.67,2,0],[65837.8359,1,0],[65918.9141,3,0],[65999.99,2,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[66162.16,2,0],[66324.32,3,0],[66486.4844,2,0],[66648.64,3,0],[66810.8047,1,0],[66972.97,0,0],[67135.13,3,0],[67297.29,0,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[67459.45,1,0],[67621.62,3,0],[67783.78,2,0],[67945.9453,3,0],[68108.1,1,0],[68270.2656,0,0],[68432.43,2,0],[68594.59,3,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[68756.75,1,0],[68918.9141,3,0],[69081.08,2,0],[69243.24,3,0],[69405.4,1,0],[69567.56,0,0],[69729.73,2,0],[69891.89,3,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[70054.05,2,0],[70135.13,0,0],[70216.21,1,0],[70378.375,2,0],[70459.45,0,0],[70540.54,1,0],[70702.6953,1,0],[70783.78,3,0],[70864.86,2,0],[71027.02,1,0],[71108.1,3,0],[71189.19,2,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[71351.34,2,0],[71513.51,3,0],[71675.67,2,0],[71837.8359,3,0],[71999.99,1,0],[72162.16,0,0],[72324.32,3,0],[72486.4844,0,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[72648.64,2,0],[72648.64,6,648.6486],[72810.8047,0,0],[72972.97,1,0],[73135.13,0,0],[73297.29,3,324.3243],[73621.62,2,0],[73702.6953,0,0],[73783.78,3,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[73945.94,1,0],[74027.02,0,0],[74108.1,3,0],[74270.2656,2,0],[74432.43,3,0],[74594.5859,1,0],[74675.67,0,0],[74756.75,3,0],[74918.9141,2,0],[75081.08,3,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[75243.2344,2,0],[75405.4,2,0],[75486.4844,3,0],[75567.56,2,0],[75729.73,2,0],[75810.8047,0,0],[75891.89,1,0],[76054.05,0,0],[76216.21,2,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[76540.54,3,0],[76702.6953,1,0],[76783.78,0,0],[76864.86,1,0],[76945.94,0,0],[77027.02,2,0],[77108.1,3,0],[77189.19,1,0],[77270.2656,0,0],[77351.34,3,0],[77513.51,0,0],[77675.67,1,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[77837.8359,3,0],[77999.99,2,0],[78162.16,1,0],[78324.32,0,0],[78405.4,1,0],[78486.4844,3,0],[78648.64,1,0],[78810.8047,1,0],[78972.97,0,0],[79054.05,3,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[79135.13,1,0],[79135.13,1,0],[79297.29,3,0],[79297.29,3,0],[79459.45,2,0],[79459.45,2,0],[79621.62,3,0],[79621.62,3,0],[79783.78,2,0],[79783.78,2,0],[79945.94,0,0],[79945.94,0,0],[80108.1,1,0],[80108.1,1,0],[80270.2656,0,0],[80270.2656,0,0],[80351.34,1,0],[80351.34,1,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[80432.43,3,0],[80432.43,3,0],[80594.5859,2,0],[80756.75,1,0],[80918.9141,0,0],[80999.99,1,0],[81081.08,3,0],[81243.2344,1,0],[81405.4,1,0],[81567.56,0,0],[81648.64,3,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[81729.73,1,0],[81891.88,3,0],[82054.05,2,0],[82216.21,3,0],[82378.375,2,0],[82540.53,0,0],[82702.6953,1,0],[82864.86,0,0],[82945.94,1,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[83027.02,2,0],[83189.19,0,0],[83351.34,1,0],[83513.51,0,0],[83675.67,3,324.3243],[83999.99,2,0],[84081.08,0,0],[84162.16,3,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[84324.32,1,0],[84405.4,0,0],[84486.4844,3,0],[84648.64,2,0],[84810.8047,3,0],[84972.97,1,0],[85054.05,0,0],[85135.13,3,0],[85297.29,2,0],[85459.45,3,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[85621.62,2,0],[85783.78,2,0],[85864.86,3,0],[85945.94,2,0],[86108.1,2,0],[86189.18,0,0],[86270.2656,1,0],[86432.43,0,0],[86594.5859,2,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[86918.9141,3,0],[87081.08,1,0],[87162.16,0,0],[87243.2344,1,0],[87324.32,0,0],[87405.4,2,0],[87486.4844,3,0],[87567.56,1,0],[87648.64,0,0],[87729.73,3,0],[87891.88,0,0],[88054.05,1,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[88216.21,3,0],[88378.375,2,0],[88540.53,1,0],[88702.6953,0,0],[88783.78,1,0],[88864.86,3,0],[89027.02,1,0],[89189.18,1,0],[89351.34,0,0],[89432.43,3,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[89513.51,1,0],[89513.51,1,0],[89675.67,3,0],[89675.67,3,0],[89837.83,2,0],[89837.83,2,0],[89999.99,3,0],[89999.99,3,0],[90162.16,2,0],[90162.16,2,0],[90324.32,0,0],[90324.32,0,0],[90486.48,1,0],[90486.48,1,0],[90648.64,0,0],[90648.64,0,0],[90729.73,1,0],[90729.73,1,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[90810.8047,3,0],[90810.8047,3,0],[90972.97,2,0],[91135.13,1,0],[91297.29,0,0],[91378.375,1,0],[91459.45,3,0],[91621.62,1,0],[91783.78,1,0],[91945.94,0,0],[92027.02,3,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[92108.1,1,0],[92270.2656,3,0],[92432.43,2,0],[92594.5859,3,0],[92756.75,2,0],[92918.9141,0,0],[93081.08,1,0],[93243.2344,0,0],[93324.32,1,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[93405.4,7,324.3243],[93405.4,2,0],[93567.56,1,0],[93729.73,0,0],[93891.88,1,0],[94054.05,2,0],[94216.21,2,0],[94378.375,3,0],[94459.45,2,0],[94540.53,3,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[94702.6953,2,0],[94864.86,0,0],[95027.02,3,0],[95189.18,1,0],[95351.34,2,0],[95513.51,0,0],[95675.67,3,0],[95837.83,1,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[95999.99,2,0],[96162.16,3,0],[96324.32,2,0],[96486.48,0,0],[96567.56,3,0],[96648.64,1,0],[96810.8047,3,0],[96972.97,1,0],[97135.125,0,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[97297.29,2,0],[97459.45,3,0],[97621.62,2,0],[97783.77,0,0],[97945.94,1,0],[98108.1,0,0],[98270.2656,1,0],[98432.43,3,324.3243]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[98756.75,1,0],[98918.9141,3,0],[99081.08,2,0],[99162.16,0,0],[99243.2344,3,0],[99405.4,0,0],[99567.56,1,0],[99729.73,2,0],[99810.8047,3,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[99891.88,1,0],[100054.047,3,0],[100216.211,2,0],[100378.375,3,0],[100540.531,2,0],[100702.695,0,0],[100864.859,3,0],[101027.023,2,0],[101108.1,0,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[101189.18,3,0],[101351.344,0,0],[101513.508,1,0],[101675.672,2,0],[101756.75,0,0],[101837.828,3,0],[101999.992,0,0],[102162.156,1,0],[102324.32,2,0],[102405.4,3,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[102486.477,1,0],[102648.641,3,0],[102810.805,2,0],[102972.969,3,0],[103135.125,2,0],[103297.289,0,0],[103459.453,3,0],[103621.617,2,0],[103702.695,0,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[103783.773,2,0],[103945.938,1,0],[104108.1,0,0],[104270.266,1,0],[104432.422,2,0],[104594.586,2,0],[104756.75,3,0],[104837.828,2,0],[104918.914,3,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[105081.07,2,0],[105243.234,0,0],[105405.4,3,0],[105567.563,1,0],[105729.727,2,0],[105891.883,0,0],[106054.047,3,0],[106216.211,1,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[106378.375,2,0],[106540.531,3,0],[106702.695,2,0],[106864.859,0,0],[106945.938,3,0],[107027.023,1,0],[107189.18,3,0],[107351.344,1,0],[107513.508,0,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[107675.672,2,0],[107837.828,3,0],[107999.992,2,0],[108162.156,0,0],[108324.32,1,0],[108486.477,0,0],[108648.641,1,0],[108810.805,3,324.3243]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[109135.125,1,0],[109297.289,3,0],[109459.453,2,0],[109540.531,0,0],[109621.617,3,0],[109783.773,0,0],[109945.938,1,0],[110108.1,2,0],[110189.18,3,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[110270.266,1,0],[110432.422,3,0],[110594.586,2,0],[110756.75,3,0],[110918.914,2,0],[111081.07,0,0],[111243.234,3,0],[111405.4,2,0],[111486.477,0,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[111567.563,3,0],[111729.719,0,0],[111891.883,1,0],[112054.047,2,0],[112135.125,0,0],[112216.211,3,0],[112378.367,0,0],[112540.531,1,0],[112702.695,2,0],[112783.773,3,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[112864.859,1,0],[113027.016,3,0],[113189.18,2,0],[113351.344,3,0],[113513.508,2,0],[113675.672,0,0],[113837.828,3,0],[113999.992,2,0],[114081.07,0,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[114162.156,3,0],[114324.32,1,0],[114486.477,0,0],[114567.563,1,0],[114648.641,3,162.162155],[114810.805,2,0],[114972.969,3,0],[115135.125,0,0],[115216.211,1,0],[115297.289,3,162.162155]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[115459.453,1,0],[115540.531,0,0],[115621.617,2,0],[115783.773,3,0],[115945.938,1,0],[116108.1,1,0],[116189.18,0,0],[116270.266,2,0],[116432.422,3,0],[116594.586,1,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[116756.75,2,162.162155],[116918.914,1,0],[116999.992,3,0],[117081.07,1,162.162155],[117243.234,3,0],[117324.32,1,0],[117405.4,0,0],[117567.563,1,0],[117729.719,0,0],[117891.883,2,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[118054.047,2,162.162155],[118216.211,1,0],[118297.289,3,0],[118378.367,1,162.162155],[118540.531,3,0],[118621.617,1,0],[118702.695,0,0],[118864.859,1,0],[119027.016,0,0],[119189.18,2,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[119351.344,1,0],[119513.508,3,0],[119675.664,2,0],[119756.75,0,0],[119837.828,3,0],[119999.992,0,0],[120162.156,1,0],[120324.313,2,0],[120405.4,3,0],[120486.477,1,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[120648.641,3,0],[120810.805,2,0],[120972.969,3,0],[121135.125,2,0],[121297.289,0,0],[121459.453,3,0],[121621.617,2,0],[121702.695,0,0],[121783.773,3,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[121945.938,0,0],[122108.1,1,0],[122270.266,2,0],[122351.344,0,0],[122432.422,3,0],[122594.586,0,0],[122756.75,1,0],[122918.914,2,0],[122999.992,3,0],[123081.07,1,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[123243.234,3,0],[123405.4,2,0],[123567.563,3,0],[123729.719,2,0],[123891.883,0,0],[124054.047,3,0],[124216.211,2,0],[124297.289,0,0]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[124540.531,3,0],[124702.695,1,0],[124864.859,0,0],[124945.938,1,0],[125027.016,3,162.162155],[125189.18,2,0],[125351.344,3,0],[125513.508,0,0],[125594.586,1,0],[125675.664,3,162.162155]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[125837.828,1,0],[125918.914,0,0],[125999.992,2,0],[126162.156,3,0],[126324.313,1,0],[126486.477,1,0],[126567.563,0,0],[126648.641,2,0],[126810.805,3,0],[126972.961,1,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[127135.125,2,162.162155],[127297.289,1,0],[127378.367,3,0],[127459.453,1,162.162155],[127621.609,3,0],[127702.695,1,0],[127783.773,0,0],[127945.938,1,0],[128108.1,0,0],[128270.258,2,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[128432.422,2,162.162155],[128594.586,1,0],[128675.664,3,0],[128756.75,1,162.162155],[128918.914,3,0],[128999.992,1,0],[129081.07,0,0],[129243.234,1,0],[129405.4,0,0],[129567.563,2,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[129729.719,1,0],[129891.883,3,0],[130054.047,2,0],[130135.125,0,0],[130216.211,3,0],[130378.367,0,0],[130540.531,1,0],[130702.695,2,0],[130783.773,3,0],[130864.859,1,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[131027.016,3,0],[131189.188,2,0],[131351.344,3,0],[131513.5,2,0],[131675.672,0,0],[131837.828,3,0],[131999.984,2,0],[132081.078,0,0],[132162.156,3,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[132324.313,0,0],[132486.484,1,0],[132648.641,2,0],[132729.719,0,0],[132810.8,3,0],[132972.969,0,0],[133135.125,1,0],[133297.281,2,0],[133378.375,3,0],[133459.453,1,0]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[133621.609,3,0],[133783.781,2,0],[133945.938,3,0],[134108.1,2,0],[134270.266,0,0],[134432.422,3,0],[134594.578,2,0],[134675.672,0,0]],"lengthInSteps":16,"mustHitSection":true},{"typeOfSection":0,"sectionNotes":[],"lengthInSteps":16,"altAnim":false,"bpm":185,"changeBPM":false,"mustHitSection":true},{"typeOfSection":0,"sectionNotes":[],"lengthInSteps":16,"altAnim":false,"bpm":185,"changeBPM":false,"mustHitSection":true},{"lengthInSteps":16,"altAnim":false,"typeOfSection":0,"sectionNotes":[],"bpm":185,"changeBPM":false,"mustHitSection":true},{"lengthInSteps":16,"altAnim":false,"typeOfSection":0,"sectionNotes":[],"bpm":185,"changeBPM":false,"mustHitSection":true},{"lengthInSteps":16,"altAnim":false,"typeOfSection":0,"sectionNotes":[],"bpm":185,"changeBPM":false,"mustHitSection":true}],"player2":"tankman","song":"Guns","validScore":true,"needsVoices":true,"speed":2.5,"bpm":185}}
\ No newline at end of file
diff --git a/assets/preload/data/introText.txt b/assets/preload/data/introText.txt
index 8e2a6ba89..d46167950 100644
--- a/assets/preload/data/introText.txt
+++ b/assets/preload/data/introText.txt
@@ -39,3 +39,6 @@ pico funny--pico funny
updates each friday--on time every time
shoutouts to mason--for da homies
bonk--get in the discord call
+carpal tunnel--game design
+downscroll--i dont know what that is
+warning--choking hazard
\ No newline at end of file
diff --git a/assets/preload/data/specialThanks.txt b/assets/preload/data/specialThanks.txt
index bbef17bb1..fcd88a44c 100644
--- a/assets/preload/data/specialThanks.txt
+++ b/assets/preload/data/specialThanks.txt
@@ -19,5 +19,6 @@ Etika
Foamymuffin (insert travis scott lyrics here)
SiIvaGunner
Masaya Matsuura
+Mackenzie Mckee
BIT BOY - MIKE WELSH
\ No newline at end of file
diff --git a/assets/preload/data/stress/stress.json b/assets/preload/data/stress/stress.json
new file mode 100644
index 000000000..3b8137d00
--- /dev/null
+++ b/assets/preload/data/stress/stress.json
@@ -0,0 +1 @@
+{"song":{"song":"Stress","bpm":178,"needsVoices":true,"player1":"bf","player2":"tankman","speed":2.6000000000000005,"notes":[{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[0,1,0],[168.539322,2,0],[337.078644,0,0],[505.617981,0,0],[674.1573,2,0],[842.696655,3,0],[1011.2359550561798,1,0],[1179.7752808988764,3,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[1348.31458,0,0],[1516.85388,3,0],[1685.39331,2,0],[1853.93262,3,0],[2022.47192,1,0],[2191.01123,3,0],[2359.55054,0,0],[2528.08984,3,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[2696.629213483146,1,0],[2865.168535483146,2,0],[3033.707857483146,0,0],[3202.247194483146,0,0],[3370.786513483146,2,0],[3539.325868483146,3,0],[3707.865168539326,1,0],[3876.4044943820227,3,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[4044.94385,0,0],[4213.483,3,0],[4382.02246,2,0],[4550.562,3,0],[4719.101,1,0],[4887.64063,3,0],[5056.17969,0,0],[5224.719,3,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[5393.258426966292,1,0],[5561.797748966292,2,0],[5730.337070966292,0,0],[5898.876407966292,0,0],[6067.415726966292,2,0],[6235.955081966292,3,0],[6404.494382022472,1,0],[6573.033707865168,3,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[6741.573,0,0],[6910.1123,3,0],[7078.652,2,0],[7247.191,3,0],[7415.73047,1,0],[7584.26953,3,0],[7752.809,0,0],[7921.348,3,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[8089.887640449439,1,0],[8258.426962449437,2,0],[8426.966284449438,0,0],[8595.505621449438,0,0],[8764.044940449437,2,0],[8932.584295449438,3,0],[9101.123595505618,1,0],[9269.662921348314,3,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[9438.202,0,0],[9606.741,3,0],[9775.281,2,0],[9943.82,3,0],[10112.3594,1,0],[10280.8984,3,0],[10449.4385,0,0],[10617.9775,3,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[11123.5957,0,0],[11292.1348,1,0],[11797.7529,1,0],[11460.67415730337,3,252.80898876404495]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[12134.8311,0,0],[12471.91,0,0],[12808.9883,0,0],[12977.5283,0,0],[13146.0674,2,0],[13230.3369,3,0],[13314.6064,2,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[13483.1465,1,0],[13651.6855,3,0],[13820.2246,2,0],[13988.7637,1,0],[14157.3037,3,0],[14325.8428,2,0],[14494.3818,1,0],[14578.6514,3,0],[14662.9209,2,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[14831.460426966292,4,0],[14999.999426966293,7,0],[15168.539426966294,6,0],[15337.07842696629,7,0],[15505.617826966292,5,0],[15674.156826966293,7,0],[15842.696926966291,4,0],[16011.235926966292,7,0],[14831.460674157302,1,252.80898876404495],[15168.539325842696,2,252.80898876404495],[15505.617977528089,3,252.80898876404495],[15842.696629213482,0,252.80898876404495]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[16179.775280898875,1,252.80898876404495],[16516.854126966293,0,0],[16685.39322696629,1,0],[17191.01132696629,1,0],[16853.932584269663,3,252.80898876404495]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[17528.08952696629,0,0],[17865.16842696629,0,0],[18202.246726966292,0,0],[18370.786726966293,0,0],[18539.32582696629,2,0],[18623.595326966293,3,0],[18707.86482696629,2,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[18876.404926966294,1,0],[19044.94392696629,3,0],[19213.483026966293,2,0],[19382.02212696629,1,0],[19550.56212696629,3,0],[19719.101226966293,2,0],[19887.64022696629,1,0],[19971.909826966294,3,0],[20056.179326966292,2,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[20393.25842696629,3,0],[20730.337526966294,3,0],[20224.719101123595,1,0],[20561.79775280899,2,0],[20898.876404494382,0,0],[21067.415730337078,1,0],[21235.955056179777,2,0],[21404.494382022473,3,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[21573.0332,3,0],[21573.0332,5,0],[21741.5723,2,0],[21910.1133,5,0],[21910.1133,0,0],[22078.6523,3,0],[22247.1914,7,0],[22247.1914,3,0],[22415.73,2,0],[22584.27,5,0],[22584.27,0,0],[22752.8086,3,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[22921.3477,6,0],[22921.3477,0,0],[23005.6172,2,0],[23089.8867,0,0],[23258.4277,3,0],[23258.4277,6,0],[23426.9668,2,0],[23595.5059,3,0],[23595.5059,7,337.078644],[23764.0449,0,0],[23932.584,1,0],[23932.584,4,337.078644],[24101.123,0,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[24269.6621,7,0],[24269.6621,3,0],[24438.2031,2,0],[24606.7422,0,0],[24775.2813,3,0],[24943.82,3,0],[25112.36,2,0],[25280.8984,0,0],[25449.4375,3,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[25617.9766,0,0],[25702.248,2,0],[25786.5176,0,0],[25955.0566,3,0],[26123.5957,2,0],[26292.1348,3,0],[26460.6738,0,0],[26629.2129,1,0],[26797.752,0,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[26966.293,6,674.1573],[26966.293,3,0],[27134.832,2,0],[27303.3711,3,0],[27471.91,0,0],[27640.45,3,0],[27640.45,7,674.1573],[27808.9883,2,0],[27977.5273,3,0],[28146.0684,0,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[28314.6074,1,674.1573],[28314.6074,7,0],[28398.877,6,0],[28483.1465,7,0],[28651.6855,7,0],[28820.2246,4,0],[28988.7637,2,674.1573],[29157.3027,4,0],[29325.8418,7,0],[29494.3828,5,0],[28567.415730337078,4,0],[28988.76404494382,6,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[29662.9219,4,0],[29662.9219,3,0],[29831.46,2,0],[30000,3,0],[30000,4,0],[30168.54,0,0],[30337.0781,3,0],[30337.0781,4,0],[30505.6172,2,0],[30674.1582,3,0],[30674.1582,4,0],[30842.6973,0,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[31011.236613483146,7,0],[31095.506213483146,6,0],[31179.775713483145,7,0],[31348.314713483145,7,0],[31516.853813483147,4,0],[31853.931913483146,4,0],[32022.471013483144,7,0],[32191.012013483145,5,0],[31264.044943820223,4,0],[31685.393258426964,6,0],[31011.235955056178,0,0],[31348.314606741573,0,0],[31601.123595505615,0,0],[31769.662921348314,0,0],[31938.20224719101,0,0],[32106.741573033705,0,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[32359.55056179775,2,0],[32528.089887640446,3,0],[32696.629213483146,1,0],[32865.16853932584,2,0],[33033.70786516854,0,0],[33202.247191011236,3,0],[33370.78651685393,1,0],[33539.32584269663,2,0],[33623.595505617974,2,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[34887.64,3,0],[34971.91,1,0],[33707.86516853933,1,0],[33876.404494382026,3,0],[34044.94382022472,1,0],[34213.48314606742,2,0],[34382.02247191012,0,0],[34550.56179775281,2,0],[34719.10112359551,0,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[35056.18,2,0],[35224.72,3,0],[35898.875,1,0],[36067.4141,0,0],[36151.6836,2,0],[36235.9531,0,0],[35561.79775280899,3,0],[35730.33707865169,0,0],[35393.25842696629,2,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[36404.4961,3,0],[36573.0352,1,0],[36741.5742,0,0],[36910.1133,1,0],[37078.6523,0,0],[37247.19,1,0],[37415.73,1,0],[37584.27,3,0],[37668.54,3,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[37752.808426966294,0,0],[37921.348426966295,2,0],[38258.42642696629,0,0],[38595.50452696629,0,0],[38932.582626966294,2,0],[39016.85222696629,2,0],[38426.96629213483,1,0],[38764.04494382022,3,0],[38089.88764044944,3,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[40280.89842696629,3,0],[40365.168426966295,1,0],[39101.12359550562,1,0],[39269.66292134832,3,0],[39438.20224719101,1,0],[39606.74157303371,2,0],[39775.28089887641,0,0],[39943.8202247191,2,0],[40112.3595505618,0,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[40449.43842696629,2,0],[40617.97842696629,3,0],[41292.13342696629,1,0],[41460.67252696629,0,0],[41544.94202696629,2,0],[41629.21152696629,0,0],[40955.05617977528,3,0],[41123.59550561798,0,0],[40786.51685393258,2,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[41797.75452696629,3,0],[41966.29362696629,1,0],[42134.832626966294,0,0],[42303.37172696629,1,0],[42471.91072696629,0,0],[42640.44842696629,1,0],[42808.988426966294,1,0],[42977.52842696629,3,0],[43061.79842696629,3,0],[42219.10112359551,3,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[43146.0664,3,0],[43230.3359,1,0],[43314.6055,3,0],[43483.1445,0,0],[43651.6836,3,0],[43735.9531,1,0],[43820.2266,2,0],[43988.7656,0,0],[44157.3047,1,0],[44325.8438,3,0],[44410.1133,3,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[44494.3828,2,0],[44578.6523,3,0],[44662.92,0,0],[44747.19,3,0],[44831.46,1,0],[45000,0,0],[45168.54,2,0],[45337.08,3,0],[45505.6172,1,0],[45674.1563,3,0],[45758.4258,2,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[45842.6953,0,0],[46011.2344,3,0],[46179.7734,1,0],[46348.3164,3,0],[46516.8555,0,0],[46685.3945,1,0],[46853.9336,3,0],[46938.2031,2,0],[47022.4727,3,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[47191.01,1,0],[47359.55,3,0],[47528.09,0,0],[47696.63,3,0],[47865.168,1,0],[48033.707,3,0],[48202.2461,2,0],[48370.7852,2,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[48539.3242,3,0],[48623.5938,1,0],[48707.8633,3,0],[48876.4063,0,0],[49044.9453,3,0],[49129.2148,1,0],[49213.4844,2,0],[49382.0234,0,0],[49550.5625,1,0],[49719.1,3,0],[49803.37,3,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[49887.64,2,0],[49971.91,3,0],[50056.18,0,0],[50140.45,3,0],[50224.72,1,0],[50393.2578,0,0],[50561.7969,2,0],[50730.3359,3,0],[50898.875,1,0],[51067.4141,3,0],[51151.6836,2,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[51235.9531,0,0],[51404.4961,3,0],[51573.0352,1,0],[51741.5742,3,0],[51910.1133,0,0],[52078.6523,1,0],[52247.19,3,0],[52331.46,2,0],[52415.73,3,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[52584.27,1,0],[52752.81,3,0],[52921.3477,0,0],[53089.8867,3,0],[53258.4258,1,0],[53426.9648,3,0],[53595.5039,2,0],[53764.043,2,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[53932.5859,1,0],[54101.125,2,0],[54269.6641,0,0],[54438.2031,0,0],[54606.7422,2,0],[54775.28,3,0],[54943.82,3,0],[55112.36,1,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[55280.9,0,0],[55449.4375,2,0],[55617.9766,3,0],[55786.5156,1,0],[55955.0547,1,0],[56123.5938,3,0],[56292.1367,0,0],[56460.6758,3,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[56629.2148,1,0],[56797.7539,2,0],[56966.293,0,0],[57134.832,0,0],[57303.37,2,0],[57471.91,3,0],[57640.45,3,0],[57808.99,1,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[57977.5273,0,0],[58146.0664,2,0],[58230.3359,3,0],[58314.6055,1,0],[58483.1445,3,0],[58651.6836,1,0],[58820.2266,3,0],[58988.7656,0,0],[59157.3047,3,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[59325.8438,1,0],[59494.3828,2,0],[59662.92,0,0],[59831.46,0,0],[60000,2,0],[60168.54,3,0],[60337.08,3,0],[60505.6172,1,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[60674.1563,0,0],[60842.6953,2,0],[61011.2344,3,0],[61179.7734,1,0],[61348.3164,1,0],[61516.8555,3,0],[61685.3945,0,0],[61853.9336,3,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[62022.4727,5,0],[62191.01,6,0],[62359.55,4,0],[62528.09,4,0],[62696.63,6,0],[62865.168,7,0],[63033.707,7,0],[63202.2461,5,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[63370.7852,4,0],[63539.3242,6,0],[63623.5938,7,0],[63707.8633,5,0],[63876.4063,7,0],[64044.9453,5,0],[64213.4844,7,0],[64382.0234,4,0],[64550.5625,7,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[64719.1,1,337.078644],[64719.1,5,337.078644],[65056.18,0,0],[65056.18,4,0],[65224.72,1,0],[65224.72,5,0],[65393.2578,3,337.078644],[65393.2578,7,337.078644],[65730.3359,1,0],[65730.3359,5,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[66067.4141,7,337.078644],[66067.4141,0,0],[66404.49,0,0],[66573.03,4,168.539322],[66741.57,5,505.617981],[66741.57,0,0],[66910.11,0,0],[67078.65,2,0],[67162.92,3,0],[67247.19,4,0],[67247.19,2,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[67415.73,2,674.1573],[67415.73,5,0],[67584.27,7,0],[67752.81,6,0],[67921.35,5,0],[68089.89,1,337.078644],[68089.89,7,0],[68258.43,6,0],[68426.97,2,337.078644],[68426.97,5,0],[68511.2344,7,0],[68595.51,6,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[68764.05,3,674.1573],[68764.05,5,0],[68932.5859,7,0],[69101.125,6,0],[69269.6641,7,0],[69438.2,0,674.1573],[69438.2,5,0],[69606.74,4,0],[69775.28,7,0],[69943.82,6,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[70112.36,1,337.078644],[70449.44,0,0],[70617.98,1,0],[70786.5156,3,337.078644],[71123.59,1,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[71460.67,0,0],[71797.75,0,0],[72134.83,0,0],[72303.37,0,0],[72471.91,2,0],[72556.18,3,0],[72640.45,2,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[72808.99,1,0],[72977.53,3,0],[73146.07,2,0],[73314.61,1,0],[73483.15,3,0],[73651.69,2,0],[73820.23,1,0],[73904.49,3,0],[73988.7656,2,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[74157.3047,1,0],[74325.84,3,0],[74494.38,2,0],[74662.92,3,0],[74831.46,1,0],[75000,0,0],[75168.54,3,0],[75337.08,2,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[75505.62,5,1348.31458],[75505.62,0,0],[75674.16,0,0],[75842.6953,1,0],[76011.2344,0,0],[76095.51,2,0],[76179.77,0,0],[76348.31,1,0],[76516.85,3,0],[76685.39,0,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[76853.93,4,1348.31458],[76853.93,1,0],[76938.2,3,0],[77022.47,1,0],[77106.74,3,0],[77191.01,0,0],[77359.55,1,0],[77528.0859,2,337.078644],[77865.17,0,0],[78033.71,0,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[78202.25,7,1348.31458],[78202.25,1,0],[78370.79,0,0],[78455.0547,3,0],[78539.33,3,0],[78707.87,3,0],[78792.13,0,0],[78876.41,1,0],[79044.9453,1,0],[79129.21,3,0],[79213.4844,2,0],[79382.02,0,0],[79466.29,1,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[79550.56,4,1348.31458],[79550.56,2,0],[79719.1,2,0],[79803.37,0,0],[79887.64,0,0],[80056.18,3,0],[80224.72,0,0],[80393.26,3,0],[80561.8,0,0],[80730.3359,2,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[80898.875,0,0],[81067.4141,0,0],[81235.95,1,0],[81404.49,0,0],[81488.7656,2,0],[81573.03,0,0],[81741.57,1,0],[81910.11,3,0],[82078.65,0,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[82247.19,1,0],[82331.46,3,0],[82415.73,1,0],[82500,3,0],[82584.27,0,0],[82752.81,1,0],[82921.35,2,337.078644],[83258.43,0,0],[83426.97,0,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[83595.51,1,0],[83764.05,0,0],[83848.31,3,0],[83932.5859,3,0],[84101.125,3,0],[84185.39,0,0],[84269.6641,1,0],[84438.2,1,0],[84522.47,3,0],[84606.74,2,0],[84775.28,0,0],[84859.55,1,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[84943.82,2,0],[85112.36,2,0],[85196.63,0,0],[85280.9,0,0],[85449.44,3,0],[85617.98,0,0],[85786.5156,3,0],[85955.0547,0,0],[86123.59,2,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[86292.13,1,0],[86376.41,0,0],[86460.67,3,0],[86629.21,2,0],[86713.4844,1,0],[86797.75,3,0],[86966.29,2,0],[87134.83,3,0],[87303.37,2,0],[87471.91,0,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[87640.45,1,0],[87724.72,0,0],[87808.99,3,0],[87977.53,2,0],[88061.8,1,0],[88146.07,3,0],[88314.61,2,0],[88483.15,3,0],[88651.69,1,0],[88820.23,3,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[88988.7656,2,0],[89073.03,3,0],[89157.3047,2,0],[89325.84,1,0],[89410.11,0,0],[89662.92,3,0],[89831.46,3,0],[89915.73,1,0],[90000,3,0],[90168.54,2,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[90337.08,0,0],[90421.35,3,0],[90505.62,1,0],[90589.89,0,0],[90674.16,1,0],[90842.6953,0,0],[91011.2344,0,0],[91095.51,3,0],[91179.77,1,0],[91264.05,0,0],[91348.31,1,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[91685.39,1,0],[91769.6641,0,0],[91853.93,3,0],[92022.47,2,0],[92106.74,1,0],[92191.01,3,0],[92359.55,2,0],[92528.0859,3,0],[92696.63,2,0],[92865.17,0,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[93033.71,1,0],[93117.98,0,0],[93202.25,3,0],[93370.79,2,0],[93455.0547,1,0],[93539.33,3,0],[93707.87,2,0],[93876.41,3,0],[94044.9453,1,0],[94213.4844,3,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[94382.02,2,0],[94466.29,3,0],[94550.56,2,0],[94719.1,1,0],[94803.37,0,0],[95056.18,3,0],[95224.72,3,0],[95308.99,1,0],[95393.26,3,0],[95561.8,2,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[95730.3359,0,0],[95814.61,3,0],[95898.875,1,0],[95983.15,0,0],[96067.4141,1,0],[96235.95,0,0],[96404.49,0,0],[96488.7656,3,0],[96573.03,1,0],[96657.3047,0,0],[96741.57,1,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[97078.65,0,0],[97162.92,3,0],[97247.19,2,0],[97415.73,3,0],[97584.27,0,0],[97668.54,3,0],[97752.81,2,0],[97921.35,3,0],[98089.89,0,0],[98174.16,3,0],[98258.43,2,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[98426.97,4,674.1573],[98426.97,3,0],[98595.51,0,0],[98679.77,3,0],[98764.05,2,0],[98932.5859,3,0],[99101.125,6,674.1573],[99101.125,2,0],[99269.6641,1,0],[99438.2,0,0],[99606.74,3,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[99775.28,0,0],[99859.55,3,0],[99943.82,2,0],[100112.359,3,0],[100280.9,0,0],[100365.172,3,0],[100449.438,2,0],[100617.977,3,0],[100786.516,0,0],[100870.789,3,0],[100955.055,2,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[101123.594,4,674.1573],[101123.594,3,0],[101292.133,0,0],[101376.406,3,0],[101460.672,2,0],[101629.211,3,0],[101797.75,6,674.1573],[101797.75,2,0],[101966.289,1,0],[102134.828,0,0],[102303.367,3,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[102471.906,3,0],[102471.906,4,0],[102556.18,0,0],[102556.18,7,0],[102640.453,6,0],[102640.453,2,0],[102808.992,7,0],[102808.992,0,0],[102977.531,3,0],[102977.531,4,0],[103061.8,0,0],[103061.8,7,0],[103146.07,6,0],[103146.07,2,0],[103314.609,7,0],[103314.609,0,0],[103483.148,3,0],[103483.148,4,0],[103567.414,0,0],[103567.414,7,0],[103651.688,6,0],[103651.688,2,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[103820.227,7,0],[103820.227,0,0],[103988.766,3,0],[103988.766,4,0],[104073.031,0,0],[104073.031,7,0],[104157.305,6,0],[104157.305,2,0],[104325.844,7,0],[104325.844,0,0],[104494.383,6,0],[104494.383,2,0],[104662.922,5,0],[104662.922,1,0],[104831.461,4,0],[104831.461,3,0],[105000,7,0],[105000,0,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[105168.539,3,0],[105168.539,4,0],[105252.813,0,0],[105252.813,7,0],[105337.078,6,0],[105337.078,2,0],[105505.617,7,0],[105505.617,0,0],[105674.156,3,0],[105674.156,4,0],[105758.43,0,0],[105758.43,7,0],[105842.695,6,0],[105842.695,2,0],[106011.234,7,0],[106011.234,0,0],[106179.773,3,0],[106179.773,4,0],[106264.047,0,0],[106264.047,7,0],[106348.313,6,0],[106348.313,2,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[106516.852,7,0],[106516.852,0,0],[106685.391,3,0],[106685.391,4,0],[106769.664,0,0],[106769.664,7,0],[106853.93,6,0],[106853.93,2,0],[107022.469,7,0],[107022.469,0,0],[107191.008,6,0],[107191.008,2,0],[107359.547,5,0],[107359.547,1,0],[107528.086,4,0],[107528.086,3,0],[107696.633,7,0],[107696.633,0,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[107865.172,7,674.1573],[107865.172,3,0],[107949.438,2,0],[108033.711,3,0],[108117.977,3,0],[108202.25,1,0],[108370.789,0,0],[108539.328,5,674.1573],[108539.328,3,0],[108623.594,2,0],[108707.867,3,0],[108792.133,3,0],[108876.406,1,0],[109044.945,0,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[109213.484,3,0],[109213.484,6,674.1573],[109297.75,0,0],[109382.023,2,0],[109466.289,3,0],[109550.563,1,0],[109719.1,0,0],[109887.641,5,674.1573],[109887.641,3,0],[109971.906,2,0],[110056.18,3,0],[110140.453,3,0],[110224.719,1,0],[110393.258,0,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[110561.8,7,0],[110646.07,6,0],[110730.336,7,0],[110814.609,7,0],[110898.875,5,0],[111067.414,4,0],[111235.953,7,0],[111320.227,6,0],[111404.492,7,0],[111488.766,7,0],[111573.031,5,0],[111741.57,4,0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[111910.109,7,0],[111994.383,4,0],[112078.648,6,0],[112162.922,7,0],[112247.188,5,0],[112415.727,4,0],[112584.273,7,0],[112668.539,6,0],[112752.813,7,0],[112837.078,7,0],[112921.352,5,0],[113089.891,4,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[113258.43,3,674.1573],[113258.43,6,0],[113426.969,5,0],[113595.508,7,0],[113764.047,4,0],[113932.586,1,674.1573],[113932.586,7,0],[114101.125,5,0],[114269.664,6,0],[114353.93,7,0],[114438.2,5,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[114606.742,0,674.1573],[114606.742,6,0],[114775.281,5,0],[114943.82,7,0],[115112.359,6,0],[115280.9,1,674.1573],[115280.9,4,0],[115365.172,7,0],[115449.438,5,0],[115617.977,7,0],[115786.516,4,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[115955.055,2,0],[116123.594,1,0],[116292.133,3,0],[116460.672,0,0],[116629.211,3,0],[116797.75,1,0],[116966.289,2,0],[117050.563,3,0],[117134.828,1,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[117303.367,2,0],[117471.906,1,0],[117640.453,3,0],[117808.992,2,0],[117977.531,0,0],[118061.8,3,0],[118146.07,1,0],[118314.609,3,0],[118483.148,0,0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"bpm":178,"changeBPM":false,"mustHitSection":true,"sectionNotes":[],"typeOfSection":0,"altAnim":false},{"lengthInSteps":16,"bpm":178,"changeBPM":false,"mustHitSection":true,"sectionNotes":[],"typeOfSection":0,"altAnim":false},{"lengthInSteps":16,"bpm":178,"changeBPM":false,"mustHitSection":true,"sectionNotes":[],"typeOfSection":0,"altAnim":false},{"lengthInSteps":16,"bpm":178,"changeBPM":false,"mustHitSection":true,"sectionNotes":[],"typeOfSection":0,"altAnim":false},{"lengthInSteps":16,"bpm":178,"changeBPM":false,"mustHitSection":true,"sectionNotes":[],"typeOfSection":0,"altAnim":false},{"lengthInSteps":16,"bpm":178,"changeBPM":false,"mustHitSection":true,"sectionNotes":[],"typeOfSection":0,"altAnim":false},{"lengthInSteps":16,"bpm":178,"changeBPM":false,"mustHitSection":true,"sectionNotes":[],"typeOfSection":0,"altAnim":false},{"lengthInSteps":16,"bpm":178,"changeBPM":false,"mustHitSection":true,"sectionNotes":[],"typeOfSection":0,"altAnim":false}],"validScore":true}}
\ No newline at end of file
diff --git a/assets/preload/data/ugh/ugh-easy.json b/assets/preload/data/ugh/ugh-easy.json
new file mode 100644
index 000000000..8c9ecd26a
--- /dev/null
+++ b/assets/preload/data/ugh/ugh-easy.json
@@ -0,0 +1 @@
+{"song":{"song":"Ugh","bpm":160,"needsVoices":true,"player1":"bf","player2":"tankman","speed":1.4,"notes":[{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[0.0,3,0.0],[187.5,3,0.0],[375.0,0,0.0],[750.0,2,0.0],[937.5,3,0.0],[1125.0,0,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[1500.0,3,0.0],[1687.5,3,0.0],[1875.0,1,0.0],[2250.0,1,281.25],[2625.0,3,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[3000.0,3,0.0],[3187.5,3,0.0],[3375.0,0,0.0],[3750.0,1,0.0],[3937.5,3,0.0],[4125.0,1,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[4500.0,3,0.0],[4687.5,2,0.0],[4875.0,3,0.0],[5062.5,2,0.0],[5250.0,0,281.25],[5625.0,1,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[6000.0,3,0.0],[6187.5,3,0.0],[6375.0,0,0.0],[6750.0,2,0.0],[6937.5,3,0.0],[7125.0,0,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[7500.0,3,0.0],[7687.5,3,0.0],[7875.0,1,0.0],[8250.0,1,281.25],[8625.0,3,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[9000.0,3,0.0],[9187.5,3,0.0],[9375.0,0,0.0],[9750.0,1,0.0],[9937.5,3,0.0],[10125.0,1,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[10500.0,3,0.0],[10687.5,2,0.0],[10875.0,3,0.0],[11062.5,2,0.0],[11250.0,0,281.25],[11625.0,1,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[12000.0,3,0.0],[12187.5,1,0.0],[12375.0,0,0.0],[12562.5,1,0.0],[12750.0,0,281.25],[13125.0,3,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[13500.0,3,0.0],[13687.5,0,0.0],[13875.0,3,0.0],[14062.5,0,0.0],[14250.0,2,281.25],[14625.0,0,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[15000.0,3,0.0],[15187.5,0,0.0],[15375.0,3,0.0],[15562.5,0,0.0],[15750.0,3,0.0],[15937.5,0,0.0],[16125.0,3,0.0],[16312.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[16500.0,1,0.0],[16687.5,0,0.0],[16875.0,3,0.0],[17250.0,1,0.0],[17437.5,0,0.0],[17625.0,3,0.0],[17812.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[18000.0,3,0.0],[18000.0,7,281.25],[18187.5,1,0.0],[18375.0,0,0.0],[18562.5,1,0.0],[18750.0,0,281.25],[19125.0,3,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[19500.0,3,0.0],[19687.5,0,0.0],[19875.0,3,0.0],[20062.5,0,0.0],[20250.0,2,281.25],[20625.0,0,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[21000.0,3,0.0],[21187.5,0,0.0],[21375.0,3,0.0],[21562.5,0,0.0],[21750.0,3,0.0],[21937.5,0,0.0],[22125.0,3,0.0],[22312.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[22500.0,1,0.0],[22687.5,0,0.0],[22875.0,3,0.0],[23250.0,1,0.0],[23437.5,0,0.0],[23625.0,3,0.0],[23812.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24000.0,0,0.0],[24000.0,7,281.25],[24187.5,1,0.0],[24375.0,3,0.0],[24562.5,0,0.0],[24750.0,1,0.0],[24937.5,3,0.0],[25125.0,0,0.0],[25312.5,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[25500.0,3,0.0],[25687.5,0,0.0],[25875.0,1,0.0],[26062.5,3,0.0],[26250.0,0,281.25],[26625.0,1,0.0],[26812.5,3,93.75]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[27000.0,0,0.0],[27000.0,5,281.25],[27187.5,1,0.0],[27375.0,3,0.0],[27375.0,6,281.25],[27562.5,0,0.0],[27750.0,1,0.0],[27750.0,7,281.25],[27937.5,3,0.0],[28125.0,0,0.0],[28125.0,5,281.25],[28312.5,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[28500.0,3,0.0],[28500.0,4,281.25],[28687.5,0,0.0],[28875.0,1,0.0],[28875.0,5,281.25],[29062.5,3,0.0],[29250.0,0,281.25],[29250.0,7,281.25],[29625.0,1,0.0],[29625.0,7,281.25],[29812.5,3,93.75]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[30000.0,5,656.25],[30000.0,0,0.0],[30187.5,3,0.0],[30375.0,2,0.0],[30562.5,0,0.0],[30750.0,3,0.0],[30937.5,2,0.0],[31125.0,0,0.0],[31312.5,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[31500.0,2,0.0],[31687.5,0,0.0],[31875.0,3,0.0],[31968.75,2,0.0],[32062.5,3,93.75],[32250.0,2,281.25],[32625.0,3,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[33000.0,0,0.0],[33000.0,5,281.25],[33187.5,3,0.0],[33375.0,2,0.0],[33375.0,6,281.25],[33562.5,0,0.0],[33750.0,3,0.0],[33750.0,7,281.25],[33937.5,2,0.0],[34125.0,0,0.0],[34125.0,5,281.25],[34312.5,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[34500.0,2,0.0],[34500.0,4,281.25],[34687.5,0,0.0],[34875.0,3,0.0],[34875.0,5,281.25],[34968.75,2,0.0],[35062.5,3,93.75],[35250.0,2,281.25],[35250.0,7,281.25],[35625.0,3,281.25],[35625.0,7,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[36000.0,3,0.0],[36000.0,5,468.75],[36187.5,3,0.0],[36375.0,2,0.0],[36750.0,0,0.0],[36937.5,3,0.0],[37125.0,0,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[37500.0,3,0.0],[37687.5,3,0.0],[37875.0,1,0.0],[38250.0,1,281.25],[38625.0,3,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[39000.0,3,0.0],[39187.5,3,0.0],[39375.0,2,0.0],[39750.0,0,0.0],[39937.5,3,0.0],[40125.0,0,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[40500.0,0,0.0],[40687.5,1,0.0],[40875.0,0,0.0],[41062.5,1,0.0],[41250.0,3,281.25],[41625.0,1,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[42000.0,3,0.0],[42187.5,3,0.0],[42375.0,2,0.0],[42750.0,0,0.0],[42937.5,3,0.0],[43125.0,0,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[43500.0,3,0.0],[43687.5,3,0.0],[43875.0,1,0.0],[44250.0,1,281.25],[44625.0,3,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[45000.0,3,0.0],[45187.5,3,0.0],[45375.0,2,0.0],[45750.0,0,0.0],[45937.5,3,0.0],[46125.0,0,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[46500.0,0,0.0],[46687.5,1,0.0],[46875.0,0,0.0],[47062.5,1,0.0],[47250.0,3,281.25],[47625.0,1,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[48000.0,0,0.0],[48187.5,1,0.0],[48375.0,3,0.0],[48562.5,0,0.0],[48750.0,1,0.0],[48937.5,3,0.0],[49125.0,1,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[49500.0,3,0.0],[49687.5,0,0.0],[49875.0,3,0.0],[50062.5,0,0.0],[50250.0,2,281.25],[50625.0,0,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[51000.0,3,0.0],[51187.5,0,0.0],[51375.0,3,0.0],[51562.5,0,0.0],[51750.0,3,0.0],[51937.5,0,0.0],[52125.0,3,0.0],[52312.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[52500.0,1,0.0],[52687.5,0,0.0],[52875.0,3,0.0],[53250.0,1,0.0],[53437.5,0,0.0],[53625.0,3,0.0],[53812.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[54000.0,0,0.0],[54000.0,7,281.25],[54187.5,1,0.0],[54375.0,3,0.0],[54562.5,0,0.0],[54750.0,1,0.0],[54937.5,3,0.0],[55125.0,1,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[55500.0,3,0.0],[55687.5,0,0.0],[55875.0,3,0.0],[56062.5,0,0.0],[56250.0,2,281.25],[56625.0,0,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[57000.0,3,0.0],[57187.5,0,0.0],[57375.0,3,0.0],[57562.5,0,0.0],[57750.0,3,0.0],[57937.5,0,0.0],[58125.0,3,0.0],[58312.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[58500.0,1,0.0],[58687.5,0,0.0],[58875.0,3,0.0],[59250.0,1,0.0],[59437.5,0,0.0],[59625.0,3,0.0],[59812.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[60000.0,7,281.25],[60000.0,3,0.0],[60187.5,1,0.0],[60375.0,0,0.0],[60562.5,1,0.0],[60750.0,0,281.25],[61125.0,3,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[61500.0,3,0.0],[61687.5,0,0.0],[61875.0,3,0.0],[62062.5,0,0.0],[62250.0,2,281.25],[62625.0,0,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[63000.0,3,0.0],[63187.5,0,0.0],[63375.0,3,0.0],[63562.5,0,0.0],[63750.0,3,0.0],[63937.5,0,0.0],[64125.0,3,0.0],[64312.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[64500.0,1,0.0],[64687.5,0,0.0],[64875.0,3,0.0],[65250.0,1,0.0],[65437.5,0,0.0],[65625.0,3,0.0],[65812.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[66000.0,3,0.0],[66000.0,7,281.25],[66187.5,1,0.0],[66375.0,0,0.0],[66562.5,1,0.0],[66750.0,0,281.25],[67125.0,3,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[67500.0,3,0.0],[67687.5,0,0.0],[67875.0,3,0.0],[68062.5,0,0.0],[68250.0,2,281.25],[68625.0,0,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[69000.0,3,0.0],[69187.5,0,0.0],[69375.0,3,0.0],[69562.5,0,0.0],[69750.0,3,0.0],[69937.5,0,0.0],[70125.0,3,0.0],[70312.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[70500.0,1,0.0],[70687.5,0,0.0],[70875.0,3,0.0],[71250.0,1,0.0],[71437.5,0,0.0],[71625.0,3,0.0],[71812.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[72000.0,7,281.25],[72000.0,3,0.0],[72187.5,3,0.0],[72375.0,2,0.0],[72750.0,0,0.0],[72937.5,3,0.0],[73125.0,0,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[73500.0,3,0.0],[73687.5,3,0.0],[73875.0,1,0.0],[74250.0,1,281.25],[74625.0,3,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[75000.0,3,0.0],[75187.5,3,0.0],[75375.0,2,0.0],[75750.0,0,0.0],[75937.5,3,0.0],[76125.0,0,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[76500.0,0,0.0],[76687.5,1,0.0],[76875.0,0,0.0],[77062.5,1,0.0],[77250.0,3,281.25],[77625.0,1,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[78000.0,3,0.0],[78187.5,3,0.0],[78375.0,2,0.0],[78750.0,0,0.0],[78937.5,3,0.0],[79125.0,0,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[79500.0,3,0.0],[79687.5,3,0.0],[79875.0,1,0.0],[80250.0,1,281.25],[80625.0,3,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[81000.0,3,0.0],[81187.5,3,0.0],[81375.0,2,0.0],[81750.0,0,0.0],[81937.5,3,0.0],[82125.0,0,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[82500.0,0,0.0],[82687.5,1,0.0],[82875.0,0,0.0],[83062.5,1,0.0],[83250.0,3,281.25],[83625.0,1,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]}]},"generatedBy":"SNIFF ver.5"}
\ No newline at end of file
diff --git a/assets/preload/data/ugh/ugh-hard.json b/assets/preload/data/ugh/ugh-hard.json
new file mode 100644
index 000000000..17dd1d079
--- /dev/null
+++ b/assets/preload/data/ugh/ugh-hard.json
@@ -0,0 +1 @@
+{"song":{"song":"Ugh","bpm":160,"needsVoices":true,"player1":"bf","player2":"tankman","speed":2.3,"notes":[{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[0.0,3,0.0],[187.5,3,0.0],[375.0,0,93.75],[562.5,3,0.0],[750.0,2,93.75],[937.5,3,0.0],[1125.0,0,93.75],[1312.5,2,0.0],[1406.25,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[1500.0,3,0.0],[1593.75,2,0.0],[1687.5,3,0.0],[1781.25,1,0.0],[1875.0,0,0.0],[1968.75,1,0.0],[2062.5,0,93.75],[2250.0,1,281.25],[2625.0,3,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[3000.0,3,0.0],[3187.5,3,0.0],[3375.0,0,93.75],[3562.5,3,0.0],[3750.0,2,93.75],[3937.5,3,0.0],[4125.0,1,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[4500.0,3,0.0],[4687.5,2,0.0],[4875.0,1,0.0],[5062.5,0,0.0],[5250.0,3,281.25],[5625.0,1,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[6000.0,3,0.0],[6187.5,3,0.0],[6375.0,0,93.75],[6562.5,3,0.0],[6750.0,2,93.75],[6937.5,3,0.0],[7125.0,0,93.75],[7312.5,2,0.0],[7406.25,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[7500.0,3,0.0],[7593.75,2,0.0],[7687.5,3,0.0],[7781.25,1,0.0],[7875.0,0,0.0],[7968.75,1,0.0],[8062.5,0,93.75],[8250.0,1,281.25],[8625.0,3,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[9000.0,3,0.0],[9187.5,3,0.0],[9375.0,0,93.75],[9562.5,3,0.0],[9750.0,2,93.75],[9937.5,3,0.0],[10125.0,1,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[10500.0,3,0.0],[10687.5,2,0.0],[10875.0,1,0.0],[11062.5,0,0.0],[11250.0,3,281.25],[11625.0,1,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[12000.0,3,0.0],[12093.75,3,0.0],[12187.5,1,0.0],[12375.0,0,0.0],[12562.5,1,0.0],[12750.0,0,0.0],[12843.75,1,0.0],[12937.5,3,0.0],[13031.25,1,0.0],[13125.0,0,93.75],[13312.5,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[13500.0,3,93.75],[13687.5,1,0.0],[13875.0,3,93.75],[14062.5,0,0.0],[14250.0,2,0.0],[14437.5,3,0.0],[14625.0,0,0.0],[14812.5,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[15000.0,3,0.0],[15187.5,3,0.0],[15281.25,2,0.0],[15375.0,3,0.0],[15562.5,2,0.0],[15656.25,1,0.0],[15750.0,2,0.0],[15937.5,1,0.0],[16031.25,0,0.0],[16125.0,1,0.0],[16312.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[16500.0,1,93.75],[16687.5,2,93.75],[16875.0,3,93.75],[17062.5,0,93.75],[17250.0,1,93.75],[17437.5,0,0.0],[17531.25,1,0.0],[17625.0,3,93.75],[17812.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[18000.0,3,0.0],[18000.0,7,281.25],[18093.75,3,0.0],[18187.5,1,0.0],[18375.0,0,0.0],[18562.5,1,0.0],[18750.0,0,0.0],[18843.75,1,0.0],[18937.5,3,0.0],[19031.25,1,0.0],[19125.0,0,93.75],[19312.5,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[19500.0,3,93.75],[19687.5,1,0.0],[19875.0,3,93.75],[20062.5,0,0.0],[20250.0,2,0.0],[20437.5,3,0.0],[20625.0,0,0.0],[20812.5,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[21000.0,3,0.0],[21187.5,3,0.0],[21281.25,2,0.0],[21375.0,3,0.0],[21562.5,2,0.0],[21656.25,1,0.0],[21750.0,2,0.0],[21937.5,1,0.0],[22031.25,0,0.0],[22125.0,1,0.0],[22312.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[22500.0,1,93.75],[22687.5,2,93.75],[22875.0,3,93.75],[23062.5,0,93.75],[23250.0,1,93.75],[23437.5,0,0.0],[23531.25,1,0.0],[23625.0,3,93.75],[23812.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24000.0,1,0.0],[24000.0,7,281.25],[24093.75,0,0.0],[24187.5,1,0.0],[24281.25,2,0.0],[24375.0,3,0.0],[24562.5,1,0.0],[24656.25,0,0.0],[24750.0,1,0.0],[24843.75,2,0.0],[24937.5,3,0.0],[25125.0,1,0.0],[25218.75,0,0.0],[25312.5,1,0.0],[25406.25,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[25500.0,3,0.0],[25687.5,1,0.0],[25781.25,0,0.0],[25875.0,1,0.0],[25968.75,2,0.0],[26062.5,3,93.75],[26250.0,0,281.25],[26625.0,1,93.75],[26812.5,3,93.75]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[27000.0,1,0.0],[27000.0,5,281.25],[27093.75,0,0.0],[27187.5,1,0.0],[27281.25,2,0.0],[27375.0,3,0.0],[27375.0,6,281.25],[27562.5,1,0.0],[27656.25,0,0.0],[27750.0,1,0.0],[27750.0,7,281.25],[27843.75,2,0.0],[27937.5,3,0.0],[28125.0,1,0.0],[28125.0,5,281.25],[28218.75,0,0.0],[28312.5,1,0.0],[28406.25,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[28500.0,3,0.0],[28500.0,4,281.25],[28687.5,1,0.0],[28781.25,0,0.0],[28875.0,1,0.0],[28875.0,5,281.25],[28968.75,2,0.0],[29062.5,3,93.75],[29250.0,0,281.25],[29250.0,7,281.25],[29625.0,1,93.75],[29625.0,7,281.25],[29812.5,3,93.75]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[30000.0,5,656.25],[30000.0,0,93.75],[30187.5,1,0.0],[30281.25,2,0.0],[30375.0,3,0.0],[30562.5,0,93.75],[30750.0,1,0.0],[30843.75,2,0.0],[30937.5,3,0.0],[31125.0,0,93.75],[31312.5,1,0.0],[31406.25,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[31500.0,3,0.0],[31687.5,0,93.75],[31875.0,0,0.0],[31968.75,1,0.0],[32062.5,2,93.75],[32250.0,1,281.25],[32625.0,3,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[33000.0,0,93.75],[33000.0,5,281.25],[33187.5,1,0.0],[33281.25,2,0.0],[33375.0,3,0.0],[33375.0,6,281.25],[33562.5,0,93.75],[33750.0,1,0.0],[33750.0,7,281.25],[33843.75,2,0.0],[33937.5,3,0.0],[34125.0,0,93.75],[34125.0,5,281.25],[34312.5,1,0.0],[34406.25,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[34500.0,3,0.0],[34500.0,4,281.25],[34687.5,0,93.75],[34875.0,0,0.0],[34875.0,5,281.25],[34968.75,1,0.0],[35062.5,2,93.75],[35250.0,1,281.25],[35250.0,7,281.25],[35625.0,3,281.25],[35625.0,7,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[36000.0,3,0.0],[36000.0,5,468.75],[36187.5,3,0.0],[36375.0,2,93.75],[36562.5,3,0.0],[36750.0,1,93.75],[36937.5,3,0.0],[37125.0,0,93.75],[37312.5,2,0.0],[37406.25,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[37500.0,3,0.0],[37593.75,2,0.0],[37687.5,3,0.0],[37781.25,1,0.0],[37875.0,0,0.0],[37968.75,1,0.0],[38062.5,0,93.75],[38250.0,1,281.25],[38625.0,3,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[39000.0,3,0.0],[39187.5,3,0.0],[39375.0,2,93.75],[39562.5,3,0.0],[39750.0,1,93.75],[39937.5,3,0.0],[40125.0,0,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[40500.0,0,0.0],[40687.5,1,0.0],[40875.0,2,0.0],[41062.5,3,0.0],[41250.0,0,281.25],[41625.0,1,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[42000.0,3,0.0],[42187.5,3,0.0],[42375.0,2,93.75],[42562.5,3,0.0],[42750.0,1,93.75],[42937.5,3,0.0],[43125.0,0,93.75],[43312.5,2,0.0],[43406.25,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[43500.0,3,0.0],[43593.75,2,0.0],[43687.5,3,0.0],[43781.25,1,0.0],[43875.0,0,0.0],[43968.75,1,0.0],[44062.5,0,93.75],[44250.0,1,281.25],[44625.0,3,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[45000.0,3,0.0],[45187.5,3,0.0],[45375.0,2,93.75],[45562.5,3,0.0],[45750.0,1,93.75],[45937.5,3,0.0],[46125.0,0,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[46500.0,0,0.0],[46687.5,1,0.0],[46875.0,2,0.0],[47062.5,3,0.0],[47250.0,0,281.25],[47625.0,1,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[48000.0,1,0.0],[48093.75,0,0.0],[48187.5,1,0.0],[48281.25,2,0.0],[48375.0,3,0.0],[48562.5,1,0.0],[48656.25,0,0.0],[48750.0,1,0.0],[48843.75,2,0.0],[48937.5,3,0.0],[49125.0,1,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[49500.0,3,93.75],[49687.5,1,0.0],[49875.0,3,93.75],[50062.5,0,0.0],[50250.0,2,0.0],[50437.5,3,0.0],[50625.0,0,0.0],[50812.5,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[51000.0,3,0.0],[51187.5,3,0.0],[51281.25,2,0.0],[51375.0,3,0.0],[51562.5,2,0.0],[51656.25,1,0.0],[51750.0,2,0.0],[51937.5,1,0.0],[52031.25,0,0.0],[52125.0,1,0.0],[52312.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[52500.0,1,93.75],[52687.5,2,93.75],[52875.0,3,93.75],[53062.5,0,93.75],[53250.0,1,93.75],[53437.5,0,0.0],[53531.25,1,0.0],[53625.0,3,93.75],[53812.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[54000.0,1,0.0],[54000.0,7,281.25],[54093.75,0,0.0],[54187.5,1,0.0],[54281.25,2,0.0],[54375.0,3,0.0],[54562.5,1,0.0],[54656.25,0,0.0],[54750.0,1,0.0],[54843.75,2,0.0],[54937.5,3,0.0],[55125.0,1,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[55500.0,3,93.75],[55687.5,1,0.0],[55875.0,3,93.75],[56062.5,0,0.0],[56250.0,2,0.0],[56437.5,3,0.0],[56625.0,0,0.0],[56812.5,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[57000.0,3,0.0],[57187.5,3,0.0],[57281.25,2,0.0],[57375.0,3,0.0],[57562.5,2,0.0],[57656.25,1,0.0],[57750.0,2,0.0],[57937.5,1,0.0],[58031.25,0,0.0],[58125.0,1,0.0],[58312.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[58500.0,1,93.75],[58687.5,2,93.75],[58875.0,3,93.75],[59062.5,0,93.75],[59250.0,1,93.75],[59437.5,0,0.0],[59531.25,1,0.0],[59625.0,3,93.75],[59812.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[60000.0,3,0.0],[60000.0,7,281.25],[60093.75,3,0.0],[60187.5,1,0.0],[60375.0,0,0.0],[60562.5,1,0.0],[60750.0,0,0.0],[60843.75,1,0.0],[60937.5,3,0.0],[61031.25,1,0.0],[61125.0,0,93.75],[61312.5,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[61500.0,3,93.75],[61687.5,1,0.0],[61875.0,3,93.75],[62062.5,0,0.0],[62250.0,2,0.0],[62437.5,3,0.0],[62625.0,0,0.0],[62812.5,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[63000.0,3,0.0],[63187.5,3,0.0],[63281.25,2,0.0],[63375.0,3,0.0],[63562.5,2,0.0],[63656.25,1,0.0],[63750.0,2,0.0],[63937.5,1,0.0],[64031.25,0,0.0],[64125.0,1,0.0],[64312.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[64500.0,1,93.75],[64687.5,2,93.75],[64875.0,3,93.75],[65062.5,0,93.75],[65250.0,1,93.75],[65437.5,0,0.0],[65531.25,1,0.0],[65625.0,3,93.75],[65812.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[66000.0,3,0.0],[66000.0,7,281.25],[66093.75,3,0.0],[66187.5,1,0.0],[66375.0,0,0.0],[66562.5,1,0.0],[66750.0,0,0.0],[66843.75,1,0.0],[66937.5,3,0.0],[67031.25,1,0.0],[67125.0,0,93.75],[67312.5,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[67500.0,3,93.75],[67687.5,1,0.0],[67875.0,3,93.75],[68062.5,0,0.0],[68250.0,2,0.0],[68437.5,3,0.0],[68625.0,0,0.0],[68812.5,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[69000.0,3,0.0],[69187.5,3,0.0],[69281.25,2,0.0],[69375.0,3,0.0],[69562.5,2,0.0],[69656.25,1,0.0],[69750.0,2,0.0],[69937.5,1,0.0],[70031.25,0,0.0],[70125.0,1,0.0],[70312.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[70500.0,1,93.75],[70687.5,2,93.75],[70875.0,3,93.75],[71062.5,0,93.75],[71250.0,1,93.75],[71437.5,0,0.0],[71531.25,1,0.0],[71625.0,3,93.75],[71812.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[72000.0,7,281.25],[72000.0,3,0.0],[72187.5,3,0.0],[72375.0,2,93.75],[72562.5,3,0.0],[72750.0,1,93.75],[72937.5,3,0.0],[73125.0,0,93.75],[73312.5,2,0.0],[73406.25,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[73500.0,3,0.0],[73593.75,2,0.0],[73687.5,3,0.0],[73781.25,1,0.0],[73875.0,0,0.0],[73968.75,1,0.0],[74062.5,0,93.75],[74250.0,1,281.25],[74625.0,3,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[75000.0,3,0.0],[75187.5,3,0.0],[75375.0,2,93.75],[75562.5,3,0.0],[75750.0,1,93.75],[75937.5,3,0.0],[76125.0,0,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[76500.0,0,0.0],[76687.5,1,0.0],[76875.0,2,0.0],[77062.5,3,0.0],[77250.0,0,281.25],[77625.0,1,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[78000.0,3,0.0],[78187.5,3,0.0],[78375.0,2,93.75],[78562.5,3,0.0],[78750.0,1,93.75],[78937.5,3,0.0],[79125.0,0,93.75],[79312.5,2,0.0],[79406.25,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[79500.0,3,0.0],[79593.75,2,0.0],[79687.5,3,0.0],[79781.25,1,0.0],[79875.0,0,0.0],[79968.75,1,0.0],[80062.5,0,93.75],[80250.0,1,281.25],[80625.0,3,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[81000.0,3,0.0],[81187.5,3,0.0],[81375.0,2,93.75],[81562.5,3,0.0],[81750.0,1,93.75],[81937.5,3,0.0],[82125.0,0,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[82500.0,0,0.0],[82687.5,1,0.0],[82875.0,2,0.0],[83062.5,3,0.0],[83250.0,0,281.25],[83625.0,1,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]}]},"generatedBy":"SNIFF ver.5"}
\ No newline at end of file
diff --git a/assets/preload/data/ugh/ugh.json b/assets/preload/data/ugh/ugh.json
new file mode 100644
index 000000000..7a6ff5cbc
--- /dev/null
+++ b/assets/preload/data/ugh/ugh.json
@@ -0,0 +1 @@
+{"song":{"song":"Ugh","bpm":160,"needsVoices":true,"player1":"bf","player2":"tankman","speed":1.8,"notes":[{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[0.0,3,0.0],[187.5,3,0.0],[375.0,0,0.0],[562.5,3,0.0],[750.0,2,0.0],[937.5,3,0.0],[1125.0,0,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[1500.0,3,0.0],[1687.5,3,0.0],[1875.0,0,0.0],[1968.75,1,0.0],[2062.5,0,93.75],[2250.0,1,281.25],[2625.0,3,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[3000.0,3,0.0],[3187.5,3,0.0],[3375.0,0,0.0],[3562.5,3,0.0],[3750.0,2,0.0],[3937.5,3,0.0],[4125.0,1,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[4500.0,3,0.0],[4687.5,2,0.0],[4875.0,1,0.0],[5062.5,0,0.0],[5250.0,3,281.25],[5625.0,1,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[6000.0,3,0.0],[6187.5,3,0.0],[6375.0,0,0.0],[6562.5,3,0.0],[6750.0,2,0.0],[6937.5,3,0.0],[7125.0,0,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[7500.0,3,0.0],[7687.5,3,0.0],[7875.0,0,0.0],[7968.75,1,0.0],[8062.5,0,93.75],[8250.0,1,281.25],[8625.0,3,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[9000.0,3,0.0],[9187.5,3,0.0],[9375.0,0,0.0],[9562.5,3,0.0],[9750.0,2,0.0],[9937.5,3,0.0],[10125.0,1,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[10500.0,3,0.0],[10687.5,2,0.0],[10875.0,1,0.0],[11062.5,0,0.0],[11250.0,3,281.25],[11625.0,1,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[12000.0,3,0.0],[12187.5,1,0.0],[12375.0,0,0.0],[12562.5,1,0.0],[12750.0,0,0.0],[12843.75,1,0.0],[12937.5,3,0.0],[13031.25,1,0.0],[13125.0,0,0.0],[13312.5,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[13500.0,3,0.0],[13687.5,1,0.0],[13875.0,3,0.0],[14062.5,0,0.0],[14250.0,2,0.0],[14437.5,3,0.0],[14625.0,0,0.0],[14812.5,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[15000.0,3,0.0],[15187.5,3,0.0],[15375.0,2,0.0],[15562.5,2,0.0],[15750.0,1,0.0],[15937.5,1,0.0],[16125.0,0,0.0],[16312.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[16500.0,1,0.0],[16687.5,2,0.0],[16875.0,3,0.0],[17062.5,0,0.0],[17250.0,1,0.0],[17437.5,0,0.0],[17531.25,1,0.0],[17625.0,3,0.0],[17812.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[18000.0,3,0.0],[18000.0,7,281.25],[18187.5,1,0.0],[18375.0,0,0.0],[18562.5,1,0.0],[18750.0,0,0.0],[18843.75,1,0.0],[18937.5,3,0.0],[19031.25,1,0.0],[19125.0,0,0.0],[19312.5,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[19500.0,3,0.0],[19687.5,1,0.0],[19875.0,3,0.0],[20062.5,0,0.0],[20250.0,2,0.0],[20437.5,3,0.0],[20625.0,0,0.0],[20812.5,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[21000.0,3,0.0],[21187.5,3,0.0],[21375.0,2,0.0],[21562.5,2,0.0],[21750.0,1,0.0],[21937.5,1,0.0],[22125.0,0,0.0],[22312.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[22500.0,1,0.0],[22687.5,2,0.0],[22875.0,3,0.0],[23062.5,0,0.0],[23250.0,1,0.0],[23437.5,0,0.0],[23531.25,1,0.0],[23625.0,3,0.0],[23812.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24000.0,3,0.0],[24000.0,7,281.25],[24187.5,1,0.0],[24281.25,0,0.0],[24375.0,1,0.0],[24562.5,3,0.0],[24750.0,1,0.0],[24843.75,0,0.0],[24937.5,1,0.0],[25125.0,3,0.0],[25312.5,1,0.0],[25406.25,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[25500.0,1,0.0],[25687.5,3,0.0],[25875.0,1,0.0],[25968.75,0,0.0],[26062.5,1,0.0],[26250.0,0,281.25],[26625.0,1,0.0],[26812.5,3,93.75]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[27000.0,3,0.0],[27000.0,5,281.25],[27187.5,1,0.0],[27281.25,0,0.0],[27375.0,1,0.0],[27375.0,6,281.25],[27562.5,3,0.0],[27750.0,1,0.0],[27750.0,7,281.25],[27843.75,0,0.0],[27937.5,1,0.0],[28125.0,3,0.0],[28125.0,5,281.25],[28312.5,1,0.0],[28406.25,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[28500.0,1,0.0],[28500.0,4,281.25],[28687.5,3,0.0],[28875.0,1,0.0],[28875.0,5,281.25],[28968.75,0,0.0],[29062.5,1,0.0],[29250.0,0,281.25],[29250.0,7,281.25],[29625.0,1,0.0],[29625.0,7,281.25],[29812.5,3,93.75]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[30000.0,5,656.25],[30000.0,0,0.0],[30187.5,3,0.0],[30281.25,2,0.0],[30375.0,3,0.0],[30562.5,0,0.0],[30750.0,3,0.0],[30843.75,2,0.0],[30937.5,3,0.0],[31125.0,0,0.0],[31312.5,3,0.0],[31406.25,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[31500.0,3,0.0],[31687.5,0,0.0],[31875.0,0,0.0],[31968.75,1,0.0],[32062.5,0,93.75],[32250.0,1,281.25],[32625.0,3,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[33000.0,0,0.0],[33000.0,5,281.25],[33187.5,3,0.0],[33281.25,2,0.0],[33375.0,3,0.0],[33375.0,6,281.25],[33562.5,0,0.0],[33750.0,3,0.0],[33750.0,7,281.25],[33843.75,2,0.0],[33937.5,3,0.0],[34125.0,0,0.0],[34125.0,5,281.25],[34312.5,3,0.0],[34406.25,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[34500.0,3,0.0],[34500.0,4,281.25],[34687.5,0,0.0],[34875.0,0,0.0],[34875.0,5,281.25],[34968.75,1,0.0],[35062.5,0,93.75],[35250.0,1,281.25],[35250.0,7,281.25],[35625.0,3,281.25],[35625.0,7,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[36000.0,3,0.0],[36000.0,5,468.75],[36187.5,3,0.0],[36375.0,2,0.0],[36562.5,3,0.0],[36750.0,0,0.0],[36937.5,3,0.0],[37125.0,0,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[37500.0,3,0.0],[37687.5,3,0.0],[37875.0,0,0.0],[37968.75,1,0.0],[38062.5,0,93.75],[38250.0,1,281.25],[38625.0,3,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[39000.0,3,0.0],[39187.5,3,0.0],[39375.0,2,0.0],[39562.5,3,0.0],[39750.0,0,0.0],[39937.5,3,0.0],[40125.0,0,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[40500.0,0,0.0],[40687.5,1,0.0],[40875.0,2,0.0],[41062.5,3,0.0],[41250.0,0,281.25],[41625.0,1,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[42000.0,3,0.0],[42187.5,3,0.0],[42375.0,2,0.0],[42562.5,3,0.0],[42750.0,0,0.0],[42937.5,3,0.0],[43125.0,0,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[43500.0,3,0.0],[43687.5,3,0.0],[43875.0,0,0.0],[43968.75,1,0.0],[44062.5,0,93.75],[44250.0,1,281.25],[44625.0,3,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[45000.0,3,0.0],[45187.5,3,0.0],[45375.0,2,0.0],[45562.5,3,0.0],[45750.0,0,0.0],[45937.5,3,0.0],[46125.0,0,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[46500.0,0,0.0],[46687.5,1,0.0],[46875.0,2,0.0],[47062.5,3,0.0],[47250.0,0,281.25],[47625.0,1,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[48000.0,3,0.0],[48187.5,1,0.0],[48281.25,0,0.0],[48375.0,1,0.0],[48562.5,3,0.0],[48750.0,1,0.0],[48843.75,0,0.0],[48937.5,1,0.0],[49125.0,1,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[49500.0,3,0.0],[49687.5,1,0.0],[49875.0,3,0.0],[50062.5,0,0.0],[50250.0,2,0.0],[50437.5,3,0.0],[50625.0,0,0.0],[50812.5,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[51000.0,3,0.0],[51187.5,3,0.0],[51375.0,2,0.0],[51562.5,2,0.0],[51750.0,1,0.0],[51937.5,1,0.0],[52125.0,0,0.0],[52312.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[52500.0,1,0.0],[52687.5,2,0.0],[52875.0,3,0.0],[53062.5,0,0.0],[53250.0,1,0.0],[53437.5,0,0.0],[53531.25,1,0.0],[53625.0,3,0.0],[53812.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[54000.0,3,0.0],[54000.0,7,281.25],[54187.5,1,0.0],[54281.25,0,0.0],[54375.0,1,0.0],[54562.5,3,0.0],[54750.0,1,0.0],[54843.75,0,0.0],[54937.5,1,0.0],[55125.0,1,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[55500.0,3,0.0],[55687.5,1,0.0],[55875.0,3,0.0],[56062.5,0,0.0],[56250.0,2,0.0],[56437.5,3,0.0],[56625.0,0,0.0],[56812.5,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[57000.0,3,0.0],[57187.5,3,0.0],[57375.0,2,0.0],[57562.5,2,0.0],[57750.0,1,0.0],[57937.5,1,0.0],[58125.0,0,0.0],[58312.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[58500.0,1,0.0],[58687.5,2,0.0],[58875.0,3,0.0],[59062.5,0,0.0],[59250.0,1,0.0],[59437.5,0,0.0],[59531.25,1,0.0],[59625.0,3,0.0],[59812.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[60000.0,3,0.0],[60000.0,7,281.25],[60187.5,1,0.0],[60375.0,0,0.0],[60562.5,1,0.0],[60750.0,0,0.0],[60843.75,1,0.0],[60937.5,3,0.0],[61031.25,1,0.0],[61125.0,0,0.0],[61312.5,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[61500.0,3,0.0],[61687.5,1,0.0],[61875.0,3,0.0],[62062.5,0,0.0],[62250.0,2,0.0],[62437.5,3,0.0],[62625.0,0,0.0],[62812.5,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[63000.0,3,0.0],[63187.5,3,0.0],[63375.0,2,0.0],[63562.5,2,0.0],[63750.0,1,0.0],[63937.5,1,0.0],[64125.0,0,0.0],[64312.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[64500.0,1,0.0],[64687.5,2,0.0],[64875.0,3,0.0],[65062.5,0,0.0],[65250.0,1,0.0],[65437.5,0,0.0],[65531.25,1,0.0],[65625.0,3,0.0],[65812.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[66000.0,3,0.0],[66000.0,7,281.25],[66187.5,1,0.0],[66375.0,0,0.0],[66562.5,1,0.0],[66750.0,0,0.0],[66843.75,1,0.0],[66937.5,3,0.0],[67031.25,1,0.0],[67125.0,0,0.0],[67312.5,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[67500.0,3,0.0],[67687.5,1,0.0],[67875.0,3,0.0],[68062.5,0,0.0],[68250.0,2,0.0],[68437.5,3,0.0],[68625.0,0,0.0],[68812.5,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[69000.0,3,0.0],[69187.5,3,0.0],[69375.0,2,0.0],[69562.5,2,0.0],[69750.0,1,0.0],[69937.5,1,0.0],[70125.0,0,0.0],[70312.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[70500.0,1,0.0],[70687.5,2,0.0],[70875.0,3,0.0],[71062.5,0,0.0],[71250.0,1,0.0],[71437.5,0,0.0],[71531.25,1,0.0],[71625.0,3,0.0],[71812.5,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[72000.0,3,0.0],[72000.0,7,281.25],[72187.5,3,0.0],[72375.0,2,0.0],[72562.5,3,0.0],[72750.0,0,0.0],[72937.5,3,0.0],[73125.0,0,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[73500.0,3,0.0],[73687.5,3,0.0],[73875.0,0,0.0],[73968.75,1,0.0],[74062.5,0,93.75],[74250.0,1,281.25],[74625.0,3,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[75000.0,3,0.0],[75187.5,3,0.0],[75375.0,2,0.0],[75562.5,3,0.0],[75750.0,0,0.0],[75937.5,3,0.0],[76125.0,0,281.25]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[76500.0,0,0.0],[76687.5,1,0.0],[76875.0,2,0.0],[77062.5,3,0.0],[77250.0,0,281.25],[77625.0,1,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[78000.0,3,0.0],[78187.5,3,0.0],[78375.0,2,0.0],[78562.5,3,0.0],[78750.0,0,0.0],[78937.5,3,0.0],[79125.0,0,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[79500.0,3,0.0],[79687.5,3,0.0],[79875.0,0,0.0],[79968.75,1,0.0],[80062.5,0,93.75],[80250.0,1,281.25],[80625.0,3,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[81000.0,3,0.0],[81187.5,3,0.0],[81375.0,2,0.0],[81562.5,3,0.0],[81750.0,0,0.0],[81937.5,3,0.0],[82125.0,0,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[82500.0,0,0.0],[82687.5,1,0.0],[82875.0,2,0.0],[83062.5,3,0.0],[83250.0,0,281.25],[83625.0,1,281.25]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]}]},"generatedBy":"SNIFF ver.5"}
\ No newline at end of file
diff --git a/assets/shared/images/characters/pico-speakerOffsets.txt b/assets/shared/images/characters/pico-speakerOffsets.txt
new file mode 100644
index 000000000..5ccd7b432
Binary files /dev/null and b/assets/shared/images/characters/pico-speakerOffsets.txt differ
diff --git a/assets/shared/images/characters/picoSpeaker.png b/assets/shared/images/characters/picoSpeaker.png
new file mode 100644
index 000000000..0fe481b0c
Binary files /dev/null and b/assets/shared/images/characters/picoSpeaker.png differ
diff --git a/assets/shared/images/characters/picoSpeaker.xml b/assets/shared/images/characters/picoSpeaker.xml
new file mode 100644
index 000000000..52a62a587
--- /dev/null
+++ b/assets/shared/images/characters/picoSpeaker.xml
@@ -0,0 +1,197 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/shared/images/characters/tankmanCaptain.png b/assets/shared/images/characters/tankmanCaptain.png
new file mode 100644
index 000000000..15ae005d3
Binary files /dev/null and b/assets/shared/images/characters/tankmanCaptain.png differ
diff --git a/assets/shared/images/characters/tankmanCaptain.xml b/assets/shared/images/characters/tankmanCaptain.xml
new file mode 100644
index 000000000..7eb1405e8
--- /dev/null
+++ b/assets/shared/images/characters/tankmanCaptain.xml
@@ -0,0 +1,106 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/shared/images/characters/tankmanOffsets.txt b/assets/shared/images/characters/tankmanOffsets.txt
new file mode 100644
index 000000000..e145d0b31
Binary files /dev/null and b/assets/shared/images/characters/tankmanOffsets.txt differ
diff --git a/assets/shared/images/opensauceforever.png b/assets/shared/images/opensauceforever.png
new file mode 100644
index 000000000..2467cc96e
Binary files /dev/null and b/assets/shared/images/opensauceforever.png differ
diff --git a/assets/songs/guns/Inst.mp3 b/assets/songs/guns/Inst.mp3
new file mode 100644
index 000000000..11e19b940
Binary files /dev/null and b/assets/songs/guns/Inst.mp3 differ
diff --git a/assets/songs/guns/Inst.ogg b/assets/songs/guns/Inst.ogg
new file mode 100644
index 000000000..fdcfdfc90
Binary files /dev/null and b/assets/songs/guns/Inst.ogg differ
diff --git a/assets/songs/guns/Voices.mp3 b/assets/songs/guns/Voices.mp3
new file mode 100644
index 000000000..5f2bfe8fe
Binary files /dev/null and b/assets/songs/guns/Voices.mp3 differ
diff --git a/assets/songs/guns/Voices.ogg b/assets/songs/guns/Voices.ogg
new file mode 100644
index 000000000..d3a29711d
Binary files /dev/null and b/assets/songs/guns/Voices.ogg differ
diff --git a/assets/songs/stress/Inst.mp3 b/assets/songs/stress/Inst.mp3
new file mode 100644
index 000000000..ef01c68af
Binary files /dev/null and b/assets/songs/stress/Inst.mp3 differ
diff --git a/assets/songs/stress/Inst.ogg b/assets/songs/stress/Inst.ogg
new file mode 100644
index 000000000..a6f16b6d0
Binary files /dev/null and b/assets/songs/stress/Inst.ogg differ
diff --git a/assets/songs/stress/Voices.mp3 b/assets/songs/stress/Voices.mp3
new file mode 100644
index 000000000..f3576b3ff
Binary files /dev/null and b/assets/songs/stress/Voices.mp3 differ
diff --git a/assets/songs/stress/Voices.ogg b/assets/songs/stress/Voices.ogg
new file mode 100644
index 000000000..ac604ad7e
Binary files /dev/null and b/assets/songs/stress/Voices.ogg differ
diff --git a/assets/songs/ugh/Inst.mp3 b/assets/songs/ugh/Inst.mp3
new file mode 100644
index 000000000..80e88d549
Binary files /dev/null and b/assets/songs/ugh/Inst.mp3 differ
diff --git a/assets/songs/ugh/Inst.ogg b/assets/songs/ugh/Inst.ogg
new file mode 100644
index 000000000..4c457369d
Binary files /dev/null and b/assets/songs/ugh/Inst.ogg differ
diff --git a/assets/songs/ugh/Voices.mp3 b/assets/songs/ugh/Voices.mp3
new file mode 100644
index 000000000..87ebb4e4a
Binary files /dev/null and b/assets/songs/ugh/Voices.mp3 differ
diff --git a/assets/songs/ugh/Voices.ogg b/assets/songs/ugh/Voices.ogg
new file mode 100644
index 000000000..c3dec77ab
Binary files /dev/null and b/assets/songs/ugh/Voices.ogg differ
diff --git a/assets/week2/images/Monster_Assets.png b/assets/week2/images/Monster_Assets.png
index 10b7bbee9..3a22e1cb1 100644
Binary files a/assets/week2/images/Monster_Assets.png and b/assets/week2/images/Monster_Assets.png differ
diff --git a/assets/week2/images/Monster_Assets.xml b/assets/week2/images/Monster_Assets.xml
index 687d2944b..b50802490 100644
--- a/assets/week2/images/Monster_Assets.xml
+++ b/assets/week2/images/Monster_Assets.xml
@@ -1,109 +1,109 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/week7/images/smokeLeft.png b/assets/week7/images/smokeLeft.png
new file mode 100644
index 000000000..d58777f11
Binary files /dev/null and b/assets/week7/images/smokeLeft.png differ
diff --git a/assets/week7/images/smokeLeft.xml b/assets/week7/images/smokeLeft.xml
new file mode 100644
index 000000000..b38fa759a
--- /dev/null
+++ b/assets/week7/images/smokeLeft.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/week7/images/smokeRight.png b/assets/week7/images/smokeRight.png
new file mode 100644
index 000000000..c4416e995
Binary files /dev/null and b/assets/week7/images/smokeRight.png differ
diff --git a/assets/week7/images/smokeRight.xml b/assets/week7/images/smokeRight.xml
new file mode 100644
index 000000000..9f33c7970
--- /dev/null
+++ b/assets/week7/images/smokeRight.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/week7/images/tank0.png b/assets/week7/images/tank0.png
new file mode 100644
index 000000000..bff545ad8
Binary files /dev/null and b/assets/week7/images/tank0.png differ
diff --git a/assets/week7/images/tank0.xml b/assets/week7/images/tank0.xml
new file mode 100644
index 000000000..6abcdb034
--- /dev/null
+++ b/assets/week7/images/tank0.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/week7/images/tank1.png b/assets/week7/images/tank1.png
new file mode 100644
index 000000000..dfde28914
Binary files /dev/null and b/assets/week7/images/tank1.png differ
diff --git a/assets/week7/images/tank1.xml b/assets/week7/images/tank1.xml
new file mode 100644
index 000000000..1168c2e2f
--- /dev/null
+++ b/assets/week7/images/tank1.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/week7/images/tank2.png b/assets/week7/images/tank2.png
new file mode 100644
index 000000000..1d42cc566
Binary files /dev/null and b/assets/week7/images/tank2.png differ
diff --git a/assets/week7/images/tank2.xml b/assets/week7/images/tank2.xml
new file mode 100644
index 000000000..030810def
--- /dev/null
+++ b/assets/week7/images/tank2.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/week7/images/tank3.png b/assets/week7/images/tank3.png
new file mode 100644
index 000000000..6ea9ebb4a
Binary files /dev/null and b/assets/week7/images/tank3.png differ
diff --git a/assets/week7/images/tank3.xml b/assets/week7/images/tank3.xml
new file mode 100644
index 000000000..477ea92a2
--- /dev/null
+++ b/assets/week7/images/tank3.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/week7/images/tank4.png b/assets/week7/images/tank4.png
new file mode 100644
index 000000000..788e5e1f7
Binary files /dev/null and b/assets/week7/images/tank4.png differ
diff --git a/assets/week7/images/tank4.xml b/assets/week7/images/tank4.xml
new file mode 100644
index 000000000..c3e9c8b19
--- /dev/null
+++ b/assets/week7/images/tank4.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/week7/images/tank5.png b/assets/week7/images/tank5.png
new file mode 100644
index 000000000..647b137b7
Binary files /dev/null and b/assets/week7/images/tank5.png differ
diff --git a/assets/week7/images/tank5.xml b/assets/week7/images/tank5.xml
new file mode 100644
index 000000000..4c2cd37d2
--- /dev/null
+++ b/assets/week7/images/tank5.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/week7/images/tankBuildings.png b/assets/week7/images/tankBuildings.png
new file mode 100644
index 000000000..1265e5882
Binary files /dev/null and b/assets/week7/images/tankBuildings.png differ
diff --git a/assets/week7/images/tankClouds.png b/assets/week7/images/tankClouds.png
new file mode 100644
index 000000000..85b7267d9
Binary files /dev/null and b/assets/week7/images/tankClouds.png differ
diff --git a/assets/week7/images/tankGround.png b/assets/week7/images/tankGround.png
new file mode 100644
index 000000000..6db8c409b
Binary files /dev/null and b/assets/week7/images/tankGround.png differ
diff --git a/assets/week7/images/tankMountains.png b/assets/week7/images/tankMountains.png
new file mode 100644
index 000000000..d120b23c6
Binary files /dev/null and b/assets/week7/images/tankMountains.png differ
diff --git a/assets/week7/images/tankRuins.png b/assets/week7/images/tankRuins.png
new file mode 100644
index 000000000..a7657dbfc
Binary files /dev/null and b/assets/week7/images/tankRuins.png differ
diff --git a/assets/week7/images/tankSky.png b/assets/week7/images/tankSky.png
new file mode 100644
index 000000000..4beebc55b
Binary files /dev/null and b/assets/week7/images/tankSky.png differ
diff --git a/assets/week7/images/tankWatchtower.png b/assets/week7/images/tankWatchtower.png
new file mode 100644
index 000000000..d317691bb
Binary files /dev/null and b/assets/week7/images/tankWatchtower.png differ
diff --git a/example_mods/introMod/assets/preload/data/introText.txt b/example_mods/introMod/assets/preload/data/introText.txt
new file mode 100644
index 000000000..f0dd8224a
--- /dev/null
+++ b/example_mods/introMod/assets/preload/data/introText.txt
@@ -0,0 +1 @@
+awesomes tream--really awesome
\ No newline at end of file
diff --git a/example_mods/introMod/assets/preload/images/gfDanceTitle.png b/example_mods/introMod/assets/preload/images/gfDanceTitle.png
new file mode 100644
index 000000000..989f2a68a
Binary files /dev/null and b/example_mods/introMod/assets/preload/images/gfDanceTitle.png differ
diff --git a/source/AnimationDebug.hx b/source/AnimationDebug.hx
index 05b40d632..15454ef49 100644
--- a/source/AnimationDebug.hx
+++ b/source/AnimationDebug.hx
@@ -8,6 +8,11 @@ import flixel.addons.display.FlxGridOverlay;
import flixel.group.FlxGroup.FlxTypedGroup;
import flixel.text.FlxText;
import flixel.util.FlxColor;
+import openfl.events.Event;
+import openfl.events.IOErrorEvent;
+import openfl.net.FileReference;
+
+using StringTools;
/**
*DEBUG MODE
@@ -190,6 +195,65 @@ class AnimationDebug extends FlxState
char.playAnim(animList[curAnim]);
}
+ if (FlxG.keys.justPressed.ESCAPE)
+ {
+ var outputString:String = "";
+
+ for (swagAnim in animList)
+ {
+ outputString += swagAnim + " " + char.animOffsets.get(swagAnim)[0] + " " + char.animOffsets.get(swagAnim)[1] + "\n";
+ }
+
+ outputString.trim();
+ saveOffsets(outputString);
+ }
+
super.update(elapsed);
}
+
+ var _file:FileReference;
+
+ private function saveOffsets(saveString:String)
+ {
+ if ((saveString != null) && (saveString.length > 0))
+ {
+ _file = new FileReference();
+ _file.addEventListener(Event.COMPLETE, onSaveComplete);
+ _file.addEventListener(Event.CANCEL, onSaveCancel);
+ _file.addEventListener(IOErrorEvent.IO_ERROR, onSaveError);
+ _file.save(saveString, daAnim + "Offsets.txt");
+ }
+ }
+
+ function onSaveComplete(_):Void
+ {
+ _file.removeEventListener(Event.COMPLETE, onSaveComplete);
+ _file.removeEventListener(Event.CANCEL, onSaveCancel);
+ _file.removeEventListener(IOErrorEvent.IO_ERROR, onSaveError);
+ _file = null;
+ FlxG.log.notice("Successfully saved LEVEL DATA.");
+ }
+
+ /**
+ * Called when the save file dialog is cancelled.
+ */
+ function onSaveCancel(_):Void
+ {
+ _file.removeEventListener(Event.COMPLETE, onSaveComplete);
+ _file.removeEventListener(Event.CANCEL, onSaveCancel);
+ _file.removeEventListener(IOErrorEvent.IO_ERROR, onSaveError);
+ _file = null;
+ }
+
+ /**
+ * Called if there is an error while saving the gameplay recording.
+ */
+ function onSaveError(_):Void
+ {
+ _file.removeEventListener(Event.COMPLETE, onSaveComplete);
+ _file.removeEventListener(Event.CANCEL, onSaveCancel);
+ _file.removeEventListener(IOErrorEvent.IO_ERROR, onSaveError);
+ _file = null;
+ FlxG.log.error("Problem saving Level data");
+ }
}
diff --git a/source/BGSprite.hx b/source/BGSprite.hx
new file mode 100644
index 000000000..a1013b015
--- /dev/null
+++ b/source/BGSprite.hx
@@ -0,0 +1,43 @@
+package;
+
+import flixel.FlxSprite;
+
+class BGSprite extends FlxSprite
+{
+ /**
+ Cool lil utility thing just so that it can easy do antialiasing and scrollfactor bullshit
+ */
+ public var idleAnim:String;
+
+ public function new(image:String, x:Float = 0, y:Float = 0, parX:Float = 1, parY:Float = 1, ?daAnimations:Array)
+ {
+ super(x, y);
+
+ if (daAnimations != null)
+ {
+ frames = Paths.getSparrowAtlas(image);
+ for (anims in daAnimations)
+ {
+ animation.addByPrefix(anims, anims, 24, false);
+ animation.play(anims);
+
+ if (idleAnim == null)
+ idleAnim = anims;
+ }
+ }
+ else
+ {
+ loadGraphic(Paths.image(image));
+ active = false;
+ }
+
+ scrollFactor.set(parX, parY);
+ antialiasing = true;
+ }
+
+ public function dance():Void
+ {
+ if (idleAnim != null)
+ animation.play(idleAnim);
+ }
+}
diff --git a/source/Character.hx b/source/Character.hx
index 810d21047..965b89ab6 100644
--- a/source/Character.hx
+++ b/source/Character.hx
@@ -4,6 +4,7 @@ import flixel.FlxG;
import flixel.FlxSprite;
import flixel.animation.FlxBaseAnimation;
import flixel.graphics.frames.FlxAtlasFrames;
+import haxe.io.Path;
using StringTools;
@@ -47,7 +48,7 @@ class Character extends FlxSprite
animation.addByPrefix('scared', 'GF FEAR', 24);
addOffset('cheer');
- addOffset('sad', -2, -2);
+ addOffset('sad', -2, -21);
addOffset('danceLeft', 0, -9);
addOffset('danceRight', 0, -9);
@@ -78,7 +79,7 @@ class Character extends FlxSprite
animation.addByPrefix('scared', 'GF FEAR', 24);
addOffset('cheer');
- addOffset('sad', -2, -2);
+ addOffset('sad', -2, -21);
addOffset('danceLeft', 0, -9);
addOffset('danceRight', 0, -9);
@@ -207,10 +208,10 @@ class Character extends FlxSprite
animation.addByPrefix('singRIGHT', 'Monster Right note', 24, false);
addOffset('idle');
- addOffset("singUP", -20, 50);
- addOffset("singRIGHT", -51);
- addOffset("singLEFT", -30);
- addOffset("singDOWN", -30, -40);
+ addOffset("singUP", -20, 94);
+ addOffset("singRIGHT", -51, 30);
+ addOffset("singLEFT", -30, 20);
+ addOffset("singDOWN", -50, -80);
playAnim('idle');
case 'monster-christmas':
tex = Paths.getSparrowAtlas('christmas/monsterChristmas');
@@ -266,6 +267,18 @@ class Character extends FlxSprite
flipX = true;
+ case 'pico-speaker':
+ frames = Paths.getSparrowAtlas('characters/picoSpeaker');
+
+ quickAnimAdd('shoot1', "Pico shoot 1");
+ quickAnimAdd('shoot2', "Pico shoot 2");
+ quickAnimAdd('shoot3', "Pico shoot 3");
+ quickAnimAdd('shoot4', "Pico shoot 4");
+
+ // here for now, will be replaced later for less copypaste
+ loadOffsetFile(curCharacter);
+ playAnim('shoot1');
+
case 'bf':
var tex = Paths.getSparrowAtlas('BOYFRIEND');
frames = tex;
@@ -495,6 +508,37 @@ class Character extends FlxSprite
addOffset("singDOWN-alt", -30, -27);
playAnim('idle');
+ case 'tankman':
+ frames = Paths.getSparrowAtlas('characters/tankmanCaptain');
+
+ animation.addByPrefix('idle', "Tankman Idle Dance", 24, false);
+
+ if (isPlayer)
+ {
+ animation.addByPrefix('singLEFT', 'Tankman Note Left0', 24, false);
+ animation.addByPrefix('singRIGHT', 'Tankman Right Note0', 24, false);
+ animation.addByPrefix('singLEFTmiss', 'Tankman Note Left MISS', 24, false);
+ animation.addByPrefix('singRIGHTmiss', 'Tankman Right Note MISS', 24, false);
+ }
+ else
+ {
+ // Need to be flipped! REDO THIS LATER
+ animation.addByPrefix('singLEFT', 'Tankman Right Note0', 24, false);
+ animation.addByPrefix('singRIGHT', 'Tankman Note Left0', 24, false);
+ animation.addByPrefix('singLEFTmiss', 'Tankman Right Note MISS', 24, false);
+ animation.addByPrefix('singRIGHTmiss', 'Tankman Note Left MISS', 24, false);
+ }
+
+ animation.addByPrefix('singUP', 'Tankman UP note0', 24, false);
+ animation.addByPrefix('singDOWN', 'Tankman DOWN note0', 24, false);
+ animation.addByPrefix('singUPmiss', 'Tankman UP note MISS', 24, false);
+ animation.addByPrefix('singDOWNmiss', 'Tankman DOWN note MISS', 24, false);
+
+ loadOffsetFile(curCharacter);
+
+ playAnim('idle');
+
+ flipX = true;
}
dance();
@@ -522,6 +566,22 @@ class Character extends FlxSprite
}
}
+ function quickAnimAdd(name:String, prefix:String)
+ {
+ animation.addByPrefix(name, prefix, 24, false);
+ }
+
+ private function loadOffsetFile(offsetCharacter:String)
+ {
+ var daFile:Array = CoolUtil.coolTextFile(Paths.file("images/characters/" + offsetCharacter + "Offsets.txt"));
+
+ for (i in daFile)
+ {
+ var splitWords:Array = i.split(" ");
+ addOffset(splitWords[0], Std.parseInt(splitWords[1]), Std.parseInt(splitWords[2]));
+ }
+ }
+
override function update(elapsed:Float)
{
if (!curCharacter.startsWith('bf'))
@@ -605,6 +665,8 @@ class Character extends FlxSprite
else
playAnim('danceLeft');
}
+ case 'pico-speaker':
+ playAnim('shoot' + FlxG.random.int(1, 4), true);
case 'spooky':
danced = !danced;
diff --git a/source/FreeplayState.hx b/source/FreeplayState.hx
index 19fb3e178..bf0cc3dac 100644
--- a/source/FreeplayState.hx
+++ b/source/FreeplayState.hx
@@ -7,6 +7,7 @@ import flixel.addons.display.FlxGridOverlay;
import flixel.group.FlxGroup.FlxTypedGroup;
import flixel.math.FlxMath;
import flixel.text.FlxText;
+import flixel.tweens.FlxTween;
import flixel.util.FlxColor;
import lime.utils.Assets;
@@ -25,10 +26,13 @@ class FreeplayState extends MusicBeatState
var lerpScore:Int = 0;
var intendedScore:Int = 0;
+ var coolColors:Array = [0xff223344, 0xff123456, 0xFFFFFFFF, 0xFFADAD];
+
private var grpSongs:FlxTypedGroup;
private var curPlaying:Bool = false;
private var iconArray:Array = [];
+ var bg:FlxSprite;
override function create()
{
@@ -39,13 +43,11 @@ class FreeplayState extends MusicBeatState
songs.push(new SongMetadata(initSonglist[i], 1, 'gf'));
}
- /*
- if (FlxG.sound.music != null)
- {
- if (!FlxG.sound.music.playing)
- FlxG.sound.playMusic(Paths.music('freakyMenu'));
- }
- */
+ if (FlxG.sound.music != null)
+ {
+ if (!FlxG.sound.music.playing)
+ FlxG.sound.playMusic(Paths.music('freakyMenu'));
+ }
var isDebug:Bool = false;
@@ -71,11 +73,14 @@ class FreeplayState extends MusicBeatState
if (StoryMenuState.weekUnlocked[6] || isDebug)
addWeek(['Senpai', 'Roses', 'Thorns'], 6, ['senpai', 'senpai', 'spirit']);
+ if (StoryMenuState.weekUnlocked[7] || isDebug)
+ addWeek(['Ugh', 'Guns', 'Stress'], 7, ['tankman']);
+
// LOAD MUSIC
// LOAD CHARACTERS
- var bg:FlxSprite = new FlxSprite().loadGraphic(Paths.image('menuBGBlue'));
+ bg = new FlxSprite().loadGraphic(Paths.image('menuDesat'));
add(bg);
grpSongs = new FlxTypedGroup();
@@ -105,7 +110,7 @@ class FreeplayState extends MusicBeatState
scoreText.setFormat(Paths.font("vcr.ttf"), 32, FlxColor.WHITE, RIGHT);
// scoreText.alignment = RIGHT;
- var scoreBG:FlxSprite = new FlxSprite(scoreText.x - 6, 0).makeGraphic(Std.int(FlxG.width * 0.35), 66, 0xFF000000);
+ var scoreBG:FlxSprite = new FlxSprite(scoreText.x - 6, 0).makeGraphic(Std.int(FlxG.width * 0.3), 66, 0xFF000000);
scoreBG.alpha = 0.6;
add(scoreBG);
@@ -172,12 +177,16 @@ class FreeplayState extends MusicBeatState
{
super.update(elapsed);
- if (FlxG.sound.music.volume < 0.7)
+ if (FlxG.sound.music != null)
{
- FlxG.sound.music.volume += 0.5 * FlxG.elapsed;
+ if (FlxG.sound.music.volume < 0.7)
+ {
+ FlxG.sound.music.volume += 0.5 * FlxG.elapsed;
+ }
}
lerpScore = Math.floor(FlxMath.lerp(lerpScore, intendedScore, 0.4));
+ bg.color = FlxColor.interpolate(bg.color, coolColors[curSelected % coolColors.length], 0.045);
if (Math.abs(lerpScore - intendedScore) <= 10)
lerpScore = intendedScore;
@@ -210,9 +219,6 @@ class FreeplayState extends MusicBeatState
if (accepted)
{
var poop:String = Highscore.formatSong(songs[curSelected].songName.toLowerCase(), curDifficulty);
-
- trace(poop);
-
PlayState.SONG = Song.loadFromJson(poop, songs[curSelected].songName.toLowerCase());
PlayState.isStoryMode = false;
PlayState.storyDifficulty = curDifficulty;
@@ -234,15 +240,11 @@ class FreeplayState extends MusicBeatState
intendedScore = Highscore.getScore(songs[curSelected].songName, curDifficulty);
- switch (curDifficulty)
- {
- case 0:
- diffText.text = "EASY";
- case 1:
- diffText.text = 'NORMAL';
- case 2:
- diffText.text = "HARD";
- }
+ PlayState.storyDifficulty = curDifficulty;
+
+ diffText.text = "< " + CoolUtil.difficultyString() + " >";
+ diffText.x = FlxG.width * 0.85;
+ diffText.x -= (diffText.width / 2);
}
function changeSelection(change:Int = 0)
diff --git a/source/HealthIcon.hx b/source/HealthIcon.hx
index ff967e990..c821a84b3 100644
--- a/source/HealthIcon.hx
+++ b/source/HealthIcon.hx
@@ -21,6 +21,7 @@ class HealthIcon extends FlxSprite
animation.add('bf-pixel', [21, 21], 0, false, isPlayer);
animation.add('spooky', [2, 3], 0, false, isPlayer);
animation.add('pico', [4, 5], 0, false, isPlayer);
+ animation.add('pico-speaker', [4, 5], 0, false, isPlayer);
animation.add('mom', [6, 7], 0, false, isPlayer);
animation.add('mom-car', [6, 7], 0, false, isPlayer);
animation.add('tankman', [8, 9], 0, false, isPlayer);
diff --git a/source/LoadingState.hx b/source/LoadingState.hx
index b479250d7..9ed103e54 100644
--- a/source/LoadingState.hx
+++ b/source/LoadingState.hx
@@ -1,39 +1,37 @@
package;
-import lime.app.Promise;
-import lime.app.Future;
import flixel.FlxG;
-import flixel.FlxState;
import flixel.FlxSprite;
+import flixel.FlxState;
import flixel.graphics.frames.FlxAtlasFrames;
import flixel.util.FlxTimer;
-
-import openfl.utils.Assets;
-import lime.utils.Assets as LimeAssets;
+import haxe.io.Path;
+import lime.app.Future;
+import lime.app.Promise;
import lime.utils.AssetLibrary;
import lime.utils.AssetManifest;
-
-import haxe.io.Path;
+import lime.utils.Assets as LimeAssets;
+import openfl.utils.Assets;
class LoadingState extends MusicBeatState
{
inline static var MIN_TIME = 1.0;
-
+
var target:FlxState;
var stopMusic = false;
var callbacks:MultiCallback;
-
+
var logo:FlxSprite;
var gfDance:FlxSprite;
var danceLeft = false;
-
+
function new(target:FlxState, stopMusic:Bool)
{
super();
this.target = target;
this.stopMusic = stopMusic;
}
-
+
override function create()
{
logo = new FlxSprite(-150, -100);
@@ -52,29 +50,26 @@ class LoadingState extends MusicBeatState
gfDance.antialiasing = true;
add(gfDance);
add(logo);
-
- initSongsManifest().onComplete
- (
- function (lib)
- {
- callbacks = new MultiCallback(onLoad);
- var introComplete = callbacks.add("introComplete");
- checkLoadSong(getSongPath());
- if (PlayState.SONG.needsVoices)
- checkLoadSong(getVocalPath());
- checkLibrary("shared");
- if (PlayState.storyWeek > 0)
- checkLibrary("week" + PlayState.storyWeek);
- else
- checkLibrary("tutorial");
-
- var fadeTime = 0.5;
- FlxG.camera.fade(FlxG.camera.bgColor, fadeTime, true);
- new FlxTimer().start(fadeTime + MIN_TIME, function(_) introComplete());
- }
- );
+
+ initSongsManifest().onComplete(function(lib)
+ {
+ callbacks = new MultiCallback(onLoad);
+ var introComplete = callbacks.add("introComplete");
+ checkLoadSong(getSongPath());
+ if (PlayState.SONG.needsVoices)
+ checkLoadSong(getVocalPath());
+ checkLibrary("shared");
+ if (PlayState.storyWeek > 0)
+ checkLibrary("week" + PlayState.storyWeek);
+ else
+ checkLibrary("tutorial");
+
+ var fadeTime = 0.5;
+ FlxG.camera.fade(FlxG.camera.bgColor, fadeTime, true);
+ new FlxTimer().start(fadeTime + MIN_TIME, function(_) introComplete());
+ });
}
-
+
function checkLoadSong(path:String)
{
if (!Assets.cache.hasSound(path))
@@ -86,10 +81,13 @@ class LoadingState extends MusicBeatState
// @:privateAccess
// library.pathGroups.set(symbolPath, [library.__cacheBreak(symbolPath)]);
var callback = callbacks.add("song:" + path);
- Assets.loadSound(path).onComplete(function (_) { callback(); });
+ Assets.loadSound(path).onComplete(function(_)
+ {
+ callback();
+ });
}
}
-
+
function checkLibrary(library:String)
{
trace(Assets.hasLibrary(library));
@@ -98,25 +96,28 @@ class LoadingState extends MusicBeatState
@:privateAccess
if (!LimeAssets.libraryPaths.exists(library))
throw "Missing library: " + library;
-
+
var callback = callbacks.add("library:" + library);
- Assets.loadLibrary(library).onComplete(function (_) { callback(); });
+ Assets.loadLibrary(library).onComplete(function(_)
+ {
+ callback();
+ });
}
}
-
+
override function beatHit()
{
super.beatHit();
-
+
logo.animation.play('bump');
danceLeft = !danceLeft;
-
+
if (danceLeft)
gfDance.animation.play('danceRight');
else
gfDance.animation.play('danceLeft');
}
-
+
override function update(elapsed:Float)
{
super.update(elapsed);
@@ -125,30 +126,30 @@ class LoadingState extends MusicBeatState
trace('fired: ' + callbacks.getFired() + " unfired:" + callbacks.getUnfired());
#end
}
-
+
function onLoad()
{
if (stopMusic && FlxG.sound.music != null)
FlxG.sound.music.stop();
-
+
FlxG.switchState(target);
}
-
+
static function getSongPath()
{
return Paths.inst(PlayState.SONG.song);
}
-
+
static function getVocalPath()
{
return Paths.voices(PlayState.SONG.song);
}
-
+
inline static public function loadAndSwitchState(target:FlxState, stopMusic = false)
{
FlxG.switchState(getNextState(target, stopMusic));
}
-
+
static function getNextState(target:FlxState, stopMusic = false):FlxState
{
Paths.setCurrentLevel("week" + PlayState.storyWeek);
@@ -156,35 +157,35 @@ class LoadingState extends MusicBeatState
var loaded = isSoundLoaded(getSongPath())
&& (!PlayState.SONG.needsVoices || isSoundLoaded(getVocalPath()))
&& isLibraryLoaded("shared");
-
+
if (!loaded)
return new LoadingState(target, stopMusic);
#end
if (stopMusic && FlxG.sound.music != null)
FlxG.sound.music.stop();
-
+
return target;
}
-
+
#if NO_PRELOAD_ALL
static function isSoundLoaded(path:String):Bool
{
return Assets.cache.hasSound(path);
}
-
+
static function isLibraryLoaded(library:String):Bool
{
return Assets.getLibrary(library) != null;
}
#end
-
+
override function destroy()
{
super.destroy();
-
+
callbacks = null;
}
-
+
static function initSongsManifest()
{
var id = "songs";
@@ -245,7 +246,7 @@ class LoadingState extends MusicBeatState
}
}).onError(function(_)
{
- promise.error("There is no asset library with an ID of \"" + id + "\"");
+ promise.error("There is no asset library with an ID of \"" + id + "\"");
});
return promise.future;
@@ -258,33 +259,33 @@ class MultiCallback
public var logId:String = null;
public var length(default, null) = 0;
public var numRemaining(default, null) = 0;
-
+
var unfired = new MapVoid>();
var fired = new Array();
-
- public function new (callback:Void->Void, logId:String = null)
+
+ public function new(callback:Void->Void, logId:String = null)
{
this.callback = callback;
this.logId = logId;
}
-
+
public function add(id = "untitled")
{
id = '$length:$id';
length++;
numRemaining++;
var func:Void->Void = null;
- func = function ()
+ func = function()
{
if (unfired.exists(id))
{
unfired.remove(id);
fired.push(id);
numRemaining--;
-
+
if (logId != null)
log('fired $id, $numRemaining remaining');
-
+
if (numRemaining == 0)
{
if (logId != null)
@@ -298,13 +299,16 @@ class MultiCallback
unfired[id] = func;
return func;
}
-
+
inline function log(msg):Void
{
if (logId != null)
trace('$logId: $msg');
}
-
- public function getFired() return fired.copy();
- public function getUnfired() return [for (id in unfired.keys()) id];
-}
\ No newline at end of file
+
+ public function getFired()
+ return fired.copy();
+
+ public function getUnfired()
+ return [for (id in unfired.keys()) id];
+}
diff --git a/source/Main.hx b/source/Main.hx
index 7f287f87e..95b4e792f 100644
--- a/source/Main.hx
+++ b/source/Main.hx
@@ -6,7 +6,13 @@ import openfl.Assets;
import openfl.Lib;
import openfl.display.FPS;
import openfl.display.Sprite;
+import openfl.events.AsyncErrorEvent;
import openfl.events.Event;
+import openfl.events.MouseEvent;
+import openfl.events.NetStatusEvent;
+import openfl.media.Video;
+import openfl.net.NetConnection;
+import openfl.net.NetStream;
class Main extends Sprite
{
@@ -14,7 +20,12 @@ class Main extends Sprite
var gameHeight:Int = 720; // Height of the game in pixels (might be less / more in actual pixels depending on your zoom).
var initialState:Class = TitleState; // The FlxState the game starts with.
var zoom:Float = -1; // If -1, zoom is automatically calculated to fit the window dimensions.
+ #if web
var framerate:Int = 60; // How many frames per second the game should run at.
+ #else
+ var framerate:Int = 144; // How many frames per second the game should run at.
+
+ #end
var skipSplash:Bool = true; // Whether to skip the flixel splash screen that appears in release mode.
var startFullscreen:Bool = false; // Whether to start the game in fullscreen on desktop targets
@@ -49,6 +60,10 @@ class Main extends Sprite
setupGame();
}
+ var video:Video;
+ var netStream:NetStream;
+ private var overlay:Sprite;
+
private function setupGame():Void
{
var stageWidth:Int = Lib.current.stage.stageWidth;
@@ -72,5 +87,52 @@ class Main extends Sprite
#if !mobile
addChild(new FPS(10, 3, 0xFFFFFF));
#end
+ /*
+ video = new Video();
+ addChild(video);
+
+ var netConnection = new NetConnection();
+ netConnection.connect(null);
+
+ netStream = new NetStream(netConnection);
+ netStream.client = {onMetaData: client_onMetaData};
+ netStream.addEventListener(AsyncErrorEvent.ASYNC_ERROR, netStream_onAsyncError);
+
+ #if (js && html5)
+ overlay = new Sprite();
+ overlay.graphics.beginFill(0, 0.5);
+ overlay.graphics.drawRect(0, 0, 560, 320);
+ overlay.addEventListener(MouseEvent.MOUSE_DOWN, overlay_onMouseDown);
+ overlay.buttonMode = true;
+ addChild(overlay);
+
+ netConnection.addEventListener(NetStatusEvent.NET_STATUS, netConnection_onNetStatus);
+ #else
+ netStream.play("assets/preload/music/dredd.mp4");
+ #end
+ */
}
+ /*
+ private function client_onMetaData(metaData:Dynamic)
+ {
+ video.attachNetStream(netStream);
+
+ video.width = video.videoWidth;
+ video.height = video.videoHeight;
+ }
+
+ private function netStream_onAsyncError(event:AsyncErrorEvent):Void
+ {
+ trace("Error loading video");
+ }
+
+ private function netConnection_onNetStatus(event:NetStatusEvent):Void
+ {
+ }
+
+ private function overlay_onMouseDown(event:MouseEvent):Void
+ {
+ netStream.play("assets/preload/music/dredd.mp4");
+ }
+ */
}
diff --git a/source/ModdingSubstate.hx b/source/ModdingSubstate.hx
new file mode 100644
index 000000000..57264a3b4
--- /dev/null
+++ b/source/ModdingSubstate.hx
@@ -0,0 +1,150 @@
+package;
+
+import Controls.Control;
+import flixel.FlxG;
+import flixel.group.FlxGroup.FlxTypedGroup;
+import flixel.text.FlxText;
+import flixel.util.FlxColor;
+import polymod.Polymod;
+#if desktop
+import sys.FileSystem;
+#end
+
+class ModdingSubstate extends MusicBeatSubstate
+{
+ var grpMods:FlxTypedGroup;
+ var enabledMods:Array = [];
+ var modFolders:Array = [];
+
+ var curSelected:Int = 0;
+
+ public function new():Void
+ {
+ super();
+
+ grpMods = new FlxTypedGroup();
+ add(grpMods);
+
+ refreshModList();
+ }
+
+ override function update(elapsed:Float)
+ {
+ if (FlxG.keys.justPressed.R)
+ refreshModList();
+
+ selections();
+
+ if (controls.UP_P)
+ selections(-1);
+ if (controls.DOWN_P)
+ selections(1);
+
+ if (FlxG.keys.justPressed.SPACE)
+ grpMods.members[curSelected].modEnabled = !grpMods.members[curSelected].modEnabled;
+
+ if (FlxG.keys.justPressed.I && curSelected != 0)
+ {
+ var oldOne = grpMods.members[curSelected - 1];
+ grpMods.members[curSelected - 1] = grpMods.members[curSelected];
+ grpMods.members[curSelected] = oldOne;
+ selections(-1);
+ }
+
+ if (FlxG.keys.justPressed.K && curSelected < grpMods.members.length - 1)
+ {
+ var oldOne = grpMods.members[curSelected + 1];
+ grpMods.members[curSelected + 1] = grpMods.members[curSelected];
+ grpMods.members[curSelected] = oldOne;
+ selections(1);
+ }
+
+ super.update(elapsed);
+ }
+
+ private function selections(change:Int = 0):Void
+ {
+ curSelected += change;
+
+ if (curSelected >= modFolders.length)
+ curSelected = 0;
+ if (curSelected < 0)
+ curSelected = modFolders.length - 1;
+
+ for (txt in 0...grpMods.length)
+ {
+ if (txt == curSelected)
+ {
+ grpMods.members[txt].color = FlxColor.YELLOW;
+ }
+ else
+ grpMods.members[txt].color = FlxColor.WHITE;
+ }
+
+ organizeByY();
+ }
+
+ private function refreshModList():Void
+ {
+ while (grpMods.members.length > 0)
+ {
+ grpMods.remove(grpMods.members[0], true);
+ }
+
+ var modList = [];
+ modFolders = [];
+
+ #if desktop
+ for (file in FileSystem.readDirectory('./mods'))
+ {
+ if (FileSystem.isDirectory('./mods/' + file))
+ modFolders.push(file);
+ }
+
+ enabledMods = [];
+
+ modList = Polymod.scan('./mods');
+
+ trace(modList);
+
+ var loopNum:Int = 0;
+ for (i in modFolders)
+ {
+ var txt:ModMenuItem = new ModMenuItem(0, 10 + (40 * loopNum), 0, i, 32);
+ txt.text = i;
+ grpMods.add(txt);
+
+ loopNum++;
+ }
+ #end
+ }
+
+ private function organizeByY():Void
+ {
+ for (i in 0...grpMods.length)
+ {
+ grpMods.members[i].y = 10 + (40 * i);
+ }
+ }
+}
+
+class ModMenuItem extends FlxText
+{
+ public var modEnabled:Bool = false;
+ public var daMod:String;
+
+ public function new(x:Float, y:Float, w:Float, str:String, size:Int)
+ {
+ super(x, y, w, str, size);
+ }
+
+ override function update(elapsed:Float)
+ {
+ if (modEnabled)
+ alpha = 1;
+ else
+ alpha = 0.5;
+
+ super.update(elapsed);
+ }
+}
diff --git a/source/OptionsSubState.hx b/source/OptionsSubState.hx
index 2b63e0c2f..00ca548f1 100644
--- a/source/OptionsSubState.hx
+++ b/source/OptionsSubState.hx
@@ -15,10 +15,16 @@ class OptionsSubState extends MusicBeatSubstate
var grpOptionsTexts:FlxTypedGroup;
+ // public static var isDownscroll:Bool = false;
+
public function new()
{
super();
+ #if desktop
+ textMenuItems.push('Mods');
+ #end
+
grpOptionsTexts = new FlxTypedGroup();
add(grpOptionsTexts);
@@ -64,6 +70,9 @@ class OptionsSubState extends MusicBeatSubstate
case "Controls":
FlxG.state.closeSubState();
FlxG.state.openSubState(new ControlsSubState());
+ case "Mods":
+ FlxG.state.closeSubState();
+ FlxG.state.openSubState(new ModdingSubstate());
}
}
}
diff --git a/source/PauseSubState.hx b/source/PauseSubState.hx
index f42950c6e..a46955902 100644
--- a/source/PauseSubState.hx
+++ b/source/PauseSubState.hx
@@ -17,15 +17,28 @@ class PauseSubState extends MusicBeatSubstate
{
var grpMenuShit:FlxTypedGroup;
- var menuItems:Array = ['Resume', 'Restart Song', 'Exit to menu'];
+ var pauseOG:Array = [
+ 'Resume',
+ 'Restart Song',
+ 'Change Difficulty',
+ 'Toggle Practice Mode',
+ 'Exit to menu'
+ ];
+ var difficultyChoices:Array = ['EASY', 'NORMAL', 'HARD', 'BACK'];
+
+ var menuItems:Array = [];
var curSelected:Int = 0;
var pauseMusic:FlxSound;
+ var practiceText:FlxText;
+
public function new(x:Float, y:Float)
{
super();
+ menuItems = pauseOG;
+
pauseMusic = new FlxSound().loadEmbedded(Paths.music('breakfast'), true, true);
pauseMusic.volume = 0;
pauseMusic.play(false, FlxG.random.int(0, Std.int(pauseMusic.length / 2)));
@@ -51,19 +64,49 @@ class PauseSubState extends MusicBeatSubstate
levelDifficulty.updateHitbox();
add(levelDifficulty);
+ var deathCounter:FlxText = new FlxText(20, 15 + 64, 0, "", 32);
+ deathCounter.text = "Blue balled: " + PlayState.deathCounter;
+ deathCounter.scrollFactor.set();
+ deathCounter.setFormat(Paths.font('vcr.ttf'), 32);
+ deathCounter.updateHitbox();
+ add(deathCounter);
+
+ practiceText = new FlxText(20, 15 + 64 + 32, 0, "PRACTICE MODE", 32);
+ practiceText.scrollFactor.set();
+ practiceText.setFormat(Paths.font('vcr.ttf'), 32);
+ practiceText.updateHitbox();
+ practiceText.x = FlxG.width - (practiceText.width + 20);
+ practiceText.visible = PlayState.practiceMode;
+ add(practiceText);
+
levelDifficulty.alpha = 0;
levelInfo.alpha = 0;
+ deathCounter.alpha = 0;
levelInfo.x = FlxG.width - (levelInfo.width + 20);
levelDifficulty.x = FlxG.width - (levelDifficulty.width + 20);
+ deathCounter.x = FlxG.width - (deathCounter.width + 20);
FlxTween.tween(bg, {alpha: 0.6}, 0.4, {ease: FlxEase.quartInOut});
FlxTween.tween(levelInfo, {alpha: 1, y: 20}, 0.4, {ease: FlxEase.quartInOut, startDelay: 0.3});
FlxTween.tween(levelDifficulty, {alpha: 1, y: levelDifficulty.y + 5}, 0.4, {ease: FlxEase.quartInOut, startDelay: 0.5});
+ FlxTween.tween(deathCounter, {alpha: 1, y: deathCounter.y + 5}, 0.4, {ease: FlxEase.quartInOut, startDelay: 0.7});
grpMenuShit = new FlxTypedGroup();
add(grpMenuShit);
+ regenMenu();
+
+ // cameras = [FlxG.cameras.list[FlxG.cameras.list.length - 1]];
+ }
+
+ private function regenMenu():Void
+ {
+ while (grpMenuShit.members.length > 0)
+ {
+ grpMenuShit.remove(grpMenuShit.members[0], true);
+ }
+
for (i in 0...menuItems.length)
{
var songText:Alphabet = new Alphabet(0, (70 * i) + 30, menuItems[i], true, false);
@@ -72,9 +115,8 @@ class PauseSubState extends MusicBeatSubstate
grpMenuShit.add(songText);
}
+ curSelected = 0;
changeSelection();
-
- // cameras = [FlxG.cameras.list[FlxG.cameras.list.length - 1]];
}
override function update(elapsed:Float)
@@ -105,9 +147,28 @@ class PauseSubState extends MusicBeatSubstate
{
case "Resume":
close();
+ case "EASY" | 'NORMAL' | "HARD":
+ PlayState.SONG = Song.loadFromJson(Highscore.formatSong(PlayState.SONG.song.toLowerCase(), curSelected),
+ PlayState.SONG.song.toLowerCase());
+
+ PlayState.storyDifficulty = curSelected;
+
+ FlxG.resetState();
+
+ case 'Toggle Practice Mode':
+ PlayState.practiceMode = !PlayState.practiceMode;
+ practiceText.visible = PlayState.practiceMode;
+
+ case 'Change Difficulty':
+ menuItems = difficultyChoices;
+ regenMenu();
+ case 'BACK':
+ menuItems = pauseOG;
+ regenMenu();
case "Restart Song":
FlxG.resetState();
case "Exit to menu":
+ PlayState.deathCounter = 0;
FlxG.switchState(new MainMenuState());
}
}
diff --git a/source/PlayState.hx b/source/PlayState.hx
index a8f5d0015..44b56a0c4 100644
--- a/source/PlayState.hx
+++ b/source/PlayState.hx
@@ -49,6 +49,8 @@ class PlayState extends MusicBeatState
public static var storyWeek:Int = 0;
public static var storyPlaylist:Array = [];
public static var storyDifficulty:Int = 1;
+ public static var deathCounter:Int = 0;
+ public static var practiceMode:Bool = false;
var halloweenLevel:Bool = false;
@@ -98,6 +100,8 @@ class PlayState extends MusicBeatState
var phillyTrain:FlxSprite;
var trainSound:FlxSound;
+ var foregroundSprites:FlxTypedGroup;
+
var limo:FlxSprite;
var grpLimoDancers:FlxTypedGroup;
var fastCar:FlxSprite;
@@ -124,7 +128,6 @@ class PlayState extends MusicBeatState
override public function create()
{
-
if (FlxG.sound.music != null)
FlxG.sound.music.stop();
@@ -147,6 +150,8 @@ class PlayState extends MusicBeatState
Conductor.mapBPMChanges(SONG);
Conductor.changeBPM(SONG.bpm);
+ foregroundSprites = new FlxTypedGroup();
+
switch (SONG.song.toLowerCase())
{
case 'tutorial':
@@ -174,272 +179,256 @@ class PlayState extends MusicBeatState
dialogue = CoolUtil.coolTextFile(Paths.txt('thorns/thornsDialogue'));
}
- if (SONG.song.toLowerCase() == 'spookeez' || SONG.song.toLowerCase() == 'monster' || SONG.song.toLowerCase() == 'south')
+ switch (SONG.song.toLowerCase())
{
- curStage = "spooky";
- halloweenLevel = true;
+ case 'spookeez' | 'monster' | 'south':
+ curStage = "spooky";
+ halloweenLevel = true;
- var hallowTex = Paths.getSparrowAtlas('halloween_bg');
+ var hallowTex = Paths.getSparrowAtlas('halloween_bg');
- halloweenBG = new FlxSprite(-200, -100);
- halloweenBG.frames = hallowTex;
- halloweenBG.animation.addByPrefix('idle', 'halloweem bg0');
- halloweenBG.animation.addByPrefix('lightning', 'halloweem bg lightning strike', 24, false);
- halloweenBG.animation.play('idle');
- halloweenBG.antialiasing = true;
- add(halloweenBG);
+ halloweenBG = new FlxSprite(-200, -100);
+ halloweenBG.frames = hallowTex;
+ halloweenBG.animation.addByPrefix('idle', 'halloweem bg0');
+ halloweenBG.animation.addByPrefix('lightning', 'halloweem bg lightning strike', 24, false);
+ halloweenBG.animation.play('idle');
+ halloweenBG.antialiasing = true;
+ add(halloweenBG);
- isHalloween = true;
- }
- else if (SONG.song.toLowerCase() == 'pico' || SONG.song.toLowerCase() == 'blammed' || SONG.song.toLowerCase() == 'philly')
- {
- curStage = 'philly';
+ isHalloween = true;
+ case 'pico' | 'blammed' | 'philly':
+ curStage = 'philly';
- var bg:FlxSprite = new FlxSprite(-100).loadGraphic(Paths.image('philly/sky'));
- bg.scrollFactor.set(0.1, 0.1);
- add(bg);
+ var bg:FlxSprite = new FlxSprite(-100).loadGraphic(Paths.image('philly/sky'));
+ bg.scrollFactor.set(0.1, 0.1);
+ add(bg);
- var city:FlxSprite = new FlxSprite(-10).loadGraphic(Paths.image('philly/city'));
- city.scrollFactor.set(0.3, 0.3);
- city.setGraphicSize(Std.int(city.width * 0.85));
- city.updateHitbox();
- add(city);
+ var city:FlxSprite = new FlxSprite(-10).loadGraphic(Paths.image('philly/city'));
+ city.scrollFactor.set(0.3, 0.3);
+ city.setGraphicSize(Std.int(city.width * 0.85));
+ city.updateHitbox();
+ add(city);
- phillyCityLights = new FlxTypedGroup();
- add(phillyCityLights);
+ phillyCityLights = new FlxTypedGroup();
+ add(phillyCityLights);
- for (i in 0...5)
- {
- var light:FlxSprite = new FlxSprite(city.x).loadGraphic(Paths.image('philly/win' + i));
- light.scrollFactor.set(0.3, 0.3);
- light.visible = false;
- light.setGraphicSize(Std.int(light.width * 0.85));
- light.updateHitbox();
- light.antialiasing = true;
- phillyCityLights.add(light);
- }
+ for (i in 0...5)
+ {
+ var light:FlxSprite = new FlxSprite(city.x).loadGraphic(Paths.image('philly/win' + i));
+ light.scrollFactor.set(0.3, 0.3);
+ light.visible = false;
+ light.setGraphicSize(Std.int(light.width * 0.85));
+ light.updateHitbox();
+ light.antialiasing = true;
+ phillyCityLights.add(light);
+ }
- var streetBehind:FlxSprite = new FlxSprite(-40, 50).loadGraphic(Paths.image('philly/behindTrain'));
- add(streetBehind);
+ var streetBehind:FlxSprite = new FlxSprite(-40, 50).loadGraphic(Paths.image('philly/behindTrain'));
+ add(streetBehind);
- phillyTrain = new FlxSprite(2000, 360).loadGraphic(Paths.image('philly/train'));
- add(phillyTrain);
+ phillyTrain = new FlxSprite(2000, 360).loadGraphic(Paths.image('philly/train'));
+ add(phillyTrain);
- trainSound = new FlxSound().loadEmbedded(Paths.sound('train_passes'));
- FlxG.sound.list.add(trainSound);
+ trainSound = new FlxSound().loadEmbedded(Paths.sound('train_passes'));
+ FlxG.sound.list.add(trainSound);
- // var cityLights:FlxSprite = new FlxSprite().loadGraphic(AssetPaths.win0.png);
+ // var cityLights:FlxSprite = new FlxSprite().loadGraphic(AssetPaths.win0.png);
- var street:FlxSprite = new FlxSprite(-40, streetBehind.y).loadGraphic(Paths.image('philly/street'));
- add(street);
- }
- else if (SONG.song.toLowerCase() == 'milf' || SONG.song.toLowerCase() == 'satin-panties' || SONG.song.toLowerCase() == 'high')
- {
- curStage = 'limo';
- defaultCamZoom = 0.90;
+ var street:FlxSprite = new FlxSprite(-40, streetBehind.y).loadGraphic(Paths.image('philly/street'));
+ add(street);
+ case "milf" | 'satin-panties' | 'high':
+ curStage = 'limo';
+ defaultCamZoom = 0.90;
- var skyBG:FlxSprite = new FlxSprite(-120, -50).loadGraphic(Paths.image('limo/limoSunset'));
- skyBG.scrollFactor.set(0.1, 0.1);
- add(skyBG);
+ var skyBG:FlxSprite = new FlxSprite(-120, -50).loadGraphic(Paths.image('limo/limoSunset'));
+ skyBG.scrollFactor.set(0.1, 0.1);
+ add(skyBG);
- var bgLimo:FlxSprite = new FlxSprite(-200, 480);
- bgLimo.frames = Paths.getSparrowAtlas('limo/bgLimo');
- bgLimo.animation.addByPrefix('drive', "background limo pink", 24);
- bgLimo.animation.play('drive');
- bgLimo.scrollFactor.set(0.4, 0.4);
- add(bgLimo);
+ var bgLimo:FlxSprite = new FlxSprite(-200, 480);
+ bgLimo.frames = Paths.getSparrowAtlas('limo/bgLimo');
+ bgLimo.animation.addByPrefix('drive', "background limo pink", 24);
+ bgLimo.animation.play('drive');
+ bgLimo.scrollFactor.set(0.4, 0.4);
+ add(bgLimo);
- grpLimoDancers = new FlxTypedGroup();
- add(grpLimoDancers);
+ grpLimoDancers = new FlxTypedGroup();
+ add(grpLimoDancers);
- for (i in 0...5)
- {
- var dancer:BackgroundDancer = new BackgroundDancer((370 * i) + 130, bgLimo.y - 400);
- dancer.scrollFactor.set(0.4, 0.4);
- grpLimoDancers.add(dancer);
- }
+ for (i in 0...5)
+ {
+ var dancer:BackgroundDancer = new BackgroundDancer((370 * i) + 130, bgLimo.y - 400);
+ dancer.scrollFactor.set(0.4, 0.4);
+ grpLimoDancers.add(dancer);
+ }
- var overlayShit:FlxSprite = new FlxSprite(-500, -600).loadGraphic(Paths.image('limo/limoOverlay'));
- overlayShit.alpha = 0.5;
- // add(overlayShit);
+ var overlayShit:FlxSprite = new FlxSprite(-500, -600).loadGraphic(Paths.image('limo/limoOverlay'));
+ overlayShit.alpha = 0.5;
+ // add(overlayShit);
+ // var shaderBullshit = new BlendModeEffect(new OverlayShader(), FlxColor.RED);
+ // FlxG.camera.setFilters([new ShaderFilter(cast shaderBullshit.shader)]);
+ // overlayShit.shader = shaderBullshit;
- // var shaderBullshit = new BlendModeEffect(new OverlayShader(), FlxColor.RED);
+ limo = new FlxSprite(-120, 550);
+ limo.frames = Paths.getSparrowAtlas('limo/limoDrive');
+ limo.animation.addByPrefix('drive', "Limo stage", 24);
+ limo.animation.play('drive');
+ limo.antialiasing = true;
- // FlxG.camera.setFilters([new ShaderFilter(cast shaderBullshit.shader)]);
-
- // overlayShit.shader = shaderBullshit;
-
- var limoTex = Paths.getSparrowAtlas('limo/limoDrive');
-
- limo = new FlxSprite(-120, 550);
- limo.frames = limoTex;
- limo.animation.addByPrefix('drive', "Limo stage", 24);
- limo.animation.play('drive');
- limo.antialiasing = true;
-
- fastCar = new FlxSprite(-300, 160).loadGraphic(Paths.image('limo/fastCarLol'));
+ fastCar = new FlxSprite(-300, 160).loadGraphic(Paths.image('limo/fastCarLol'));
// add(limo);
- }
- else if (SONG.song.toLowerCase() == 'cocoa' || SONG.song.toLowerCase() == 'eggnog')
- {
- curStage = 'mall';
+ case "cocoa" | 'eggnog':
+ curStage = 'mall';
- defaultCamZoom = 0.80;
+ defaultCamZoom = 0.80;
- var bg:FlxSprite = new FlxSprite(-1000, -500).loadGraphic(Paths.image('christmas/bgWalls'));
- bg.antialiasing = true;
- bg.scrollFactor.set(0.2, 0.2);
- bg.active = false;
- bg.setGraphicSize(Std.int(bg.width * 0.8));
- bg.updateHitbox();
- add(bg);
+ var bg:FlxSprite = new FlxSprite(-1000, -500).loadGraphic(Paths.image('christmas/bgWalls'));
+ bg.antialiasing = true;
+ bg.scrollFactor.set(0.2, 0.2);
+ bg.active = false;
+ bg.setGraphicSize(Std.int(bg.width * 0.8));
+ bg.updateHitbox();
+ add(bg);
- upperBoppers = new FlxSprite(-240, -90);
- upperBoppers.frames = Paths.getSparrowAtlas('christmas/upperBop');
- upperBoppers.animation.addByPrefix('bop', "Upper Crowd Bob", 24, false);
- upperBoppers.antialiasing = true;
- upperBoppers.scrollFactor.set(0.33, 0.33);
- upperBoppers.setGraphicSize(Std.int(upperBoppers.width * 0.85));
- upperBoppers.updateHitbox();
- add(upperBoppers);
+ upperBoppers = new FlxSprite(-240, -90);
+ upperBoppers.frames = Paths.getSparrowAtlas('christmas/upperBop');
+ upperBoppers.animation.addByPrefix('bop', "Upper Crowd Bob", 24, false);
+ upperBoppers.antialiasing = true;
+ upperBoppers.scrollFactor.set(0.33, 0.33);
+ upperBoppers.setGraphicSize(Std.int(upperBoppers.width * 0.85));
+ upperBoppers.updateHitbox();
+ add(upperBoppers);
- var bgEscalator:FlxSprite = new FlxSprite(-1100, -600).loadGraphic(Paths.image('christmas/bgEscalator'));
- bgEscalator.antialiasing = true;
- bgEscalator.scrollFactor.set(0.3, 0.3);
- bgEscalator.active = false;
- bgEscalator.setGraphicSize(Std.int(bgEscalator.width * 0.9));
- bgEscalator.updateHitbox();
- add(bgEscalator);
+ var bgEscalator:FlxSprite = new FlxSprite(-1100, -600).loadGraphic(Paths.image('christmas/bgEscalator'));
+ bgEscalator.antialiasing = true;
+ bgEscalator.scrollFactor.set(0.3, 0.3);
+ bgEscalator.active = false;
+ bgEscalator.setGraphicSize(Std.int(bgEscalator.width * 0.9));
+ bgEscalator.updateHitbox();
+ add(bgEscalator);
- var tree:FlxSprite = new FlxSprite(370, -250).loadGraphic(Paths.image('christmas/christmasTree'));
- tree.antialiasing = true;
- tree.scrollFactor.set(0.40, 0.40);
- add(tree);
+ var tree:FlxSprite = new FlxSprite(370, -250).loadGraphic(Paths.image('christmas/christmasTree'));
+ tree.antialiasing = true;
+ tree.scrollFactor.set(0.40, 0.40);
+ add(tree);
- bottomBoppers = new FlxSprite(-300, 140);
- bottomBoppers.frames = Paths.getSparrowAtlas('christmas/bottomBop');
- bottomBoppers.animation.addByPrefix('bop', 'Bottom Level Boppers', 24, false);
- bottomBoppers.antialiasing = true;
- bottomBoppers.scrollFactor.set(0.9, 0.9);
- bottomBoppers.setGraphicSize(Std.int(bottomBoppers.width * 1));
- bottomBoppers.updateHitbox();
- add(bottomBoppers);
+ bottomBoppers = new FlxSprite(-300, 140);
+ bottomBoppers.frames = Paths.getSparrowAtlas('christmas/bottomBop');
+ bottomBoppers.animation.addByPrefix('bop', 'Bottom Level Boppers', 24, false);
+ bottomBoppers.antialiasing = true;
+ bottomBoppers.scrollFactor.set(0.9, 0.9);
+ bottomBoppers.setGraphicSize(Std.int(bottomBoppers.width * 1));
+ bottomBoppers.updateHitbox();
+ add(bottomBoppers);
- var fgSnow:FlxSprite = new FlxSprite(-600, 700).loadGraphic(Paths.image('christmas/fgSnow'));
- fgSnow.active = false;
- fgSnow.antialiasing = true;
- add(fgSnow);
+ var fgSnow:FlxSprite = new FlxSprite(-600, 700).loadGraphic(Paths.image('christmas/fgSnow'));
+ fgSnow.active = false;
+ fgSnow.antialiasing = true;
+ add(fgSnow);
- santa = new FlxSprite(-840, 150);
- santa.frames = Paths.getSparrowAtlas('christmas/santa');
- santa.animation.addByPrefix('idle', 'santa idle in fear', 24, false);
- santa.antialiasing = true;
- add(santa);
- }
- else if (SONG.song.toLowerCase() == 'winter-horrorland')
- {
- curStage = 'mallEvil';
- var bg:FlxSprite = new FlxSprite(-400, -500).loadGraphic(Paths.image('christmas/evilBG'));
- bg.antialiasing = true;
- bg.scrollFactor.set(0.2, 0.2);
- bg.active = false;
- bg.setGraphicSize(Std.int(bg.width * 0.8));
- bg.updateHitbox();
- add(bg);
+ santa = new FlxSprite(-840, 150);
+ santa.frames = Paths.getSparrowAtlas('christmas/santa');
+ santa.animation.addByPrefix('idle', 'santa idle in fear', 24, false);
+ santa.antialiasing = true;
+ add(santa);
+ case 'winter-horrorland':
+ curStage = 'mallEvil';
+ var bg:FlxSprite = new FlxSprite(-400, -500).loadGraphic(Paths.image('christmas/evilBG'));
+ bg.antialiasing = true;
+ bg.scrollFactor.set(0.2, 0.2);
+ bg.active = false;
+ bg.setGraphicSize(Std.int(bg.width * 0.8));
+ bg.updateHitbox();
+ add(bg);
- var evilTree:FlxSprite = new FlxSprite(300, -300).loadGraphic(Paths.image('christmas/evilTree'));
- evilTree.antialiasing = true;
- evilTree.scrollFactor.set(0.2, 0.2);
- add(evilTree);
+ var evilTree:FlxSprite = new FlxSprite(300, -300).loadGraphic(Paths.image('christmas/evilTree'));
+ evilTree.antialiasing = true;
+ evilTree.scrollFactor.set(0.2, 0.2);
+ add(evilTree);
- var evilSnow:FlxSprite = new FlxSprite(-200, 700).loadGraphic(Paths.image("christmas/evilSnow"));
- evilSnow.antialiasing = true;
- add(evilSnow);
- }
- else if (SONG.song.toLowerCase() == 'senpai' || SONG.song.toLowerCase() == 'roses')
- {
- curStage = 'school';
+ var evilSnow:FlxSprite = new FlxSprite(-200, 700).loadGraphic(Paths.image("christmas/evilSnow"));
+ evilSnow.antialiasing = true;
+ add(evilSnow);
+ case 'senpai' | 'roses':
+ curStage = 'school';
- // defaultCamZoom = 0.9;
+ // defaultCamZoom = 0.9;
- var bgSky = new FlxSprite().loadGraphic(Paths.image('weeb/weebSky'));
- bgSky.scrollFactor.set(0.1, 0.1);
- add(bgSky);
+ var bgSky = new FlxSprite().loadGraphic(Paths.image('weeb/weebSky'));
+ bgSky.scrollFactor.set(0.1, 0.1);
+ add(bgSky);
- var repositionShit = -200;
+ var repositionShit = -200;
- var bgSchool:FlxSprite = new FlxSprite(repositionShit, 0).loadGraphic(Paths.image('weeb/weebSchool'));
- bgSchool.scrollFactor.set(0.6, 0.90);
- add(bgSchool);
+ var bgSchool:FlxSprite = new FlxSprite(repositionShit, 0).loadGraphic(Paths.image('weeb/weebSchool'));
+ bgSchool.scrollFactor.set(0.6, 0.90);
+ add(bgSchool);
- var bgStreet:FlxSprite = new FlxSprite(repositionShit).loadGraphic(Paths.image('weeb/weebStreet'));
- bgStreet.scrollFactor.set(0.95, 0.95);
- add(bgStreet);
+ var bgStreet:FlxSprite = new FlxSprite(repositionShit).loadGraphic(Paths.image('weeb/weebStreet'));
+ bgStreet.scrollFactor.set(0.95, 0.95);
+ add(bgStreet);
- var fgTrees:FlxSprite = new FlxSprite(repositionShit + 170, 130).loadGraphic(Paths.image('weeb/weebTreesBack'));
- fgTrees.scrollFactor.set(0.9, 0.9);
- add(fgTrees);
+ var fgTrees:FlxSprite = new FlxSprite(repositionShit + 170, 130).loadGraphic(Paths.image('weeb/weebTreesBack'));
+ fgTrees.scrollFactor.set(0.9, 0.9);
+ add(fgTrees);
- var bgTrees:FlxSprite = new FlxSprite(repositionShit - 380, -800);
- var treetex = Paths.getPackerAtlas('weeb/weebTrees');
- bgTrees.frames = treetex;
- bgTrees.animation.add('treeLoop', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18], 12);
- bgTrees.animation.play('treeLoop');
- bgTrees.scrollFactor.set(0.85, 0.85);
- add(bgTrees);
+ var bgTrees:FlxSprite = new FlxSprite(repositionShit - 380, -800);
+ var treetex = Paths.getPackerAtlas('weeb/weebTrees');
+ bgTrees.frames = treetex;
+ bgTrees.animation.add('treeLoop', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18], 12);
+ bgTrees.animation.play('treeLoop');
+ bgTrees.scrollFactor.set(0.85, 0.85);
+ add(bgTrees);
- var treeLeaves:FlxSprite = new FlxSprite(repositionShit, -40);
- treeLeaves.frames = Paths.getSparrowAtlas('weeb/petals');
- treeLeaves.animation.addByPrefix('leaves', 'PETALS ALL', 24, true);
- treeLeaves.animation.play('leaves');
- treeLeaves.scrollFactor.set(0.85, 0.85);
- add(treeLeaves);
+ var treeLeaves:FlxSprite = new FlxSprite(repositionShit, -40);
+ treeLeaves.frames = Paths.getSparrowAtlas('weeb/petals');
+ treeLeaves.animation.addByPrefix('leaves', 'PETALS ALL', 24, true);
+ treeLeaves.animation.play('leaves');
+ treeLeaves.scrollFactor.set(0.85, 0.85);
+ add(treeLeaves);
- var widShit = Std.int(bgSky.width * 6);
+ var widShit = Std.int(bgSky.width * 6);
- bgSky.setGraphicSize(widShit);
- bgSchool.setGraphicSize(widShit);
- bgStreet.setGraphicSize(widShit);
- bgTrees.setGraphicSize(Std.int(widShit * 1.4));
- fgTrees.setGraphicSize(Std.int(widShit * 0.8));
- treeLeaves.setGraphicSize(widShit);
+ bgSky.setGraphicSize(widShit);
+ bgSchool.setGraphicSize(widShit);
+ bgStreet.setGraphicSize(widShit);
+ bgTrees.setGraphicSize(Std.int(widShit * 1.4));
+ fgTrees.setGraphicSize(Std.int(widShit * 0.8));
+ treeLeaves.setGraphicSize(widShit);
- fgTrees.updateHitbox();
- bgSky.updateHitbox();
- bgSchool.updateHitbox();
- bgStreet.updateHitbox();
- bgTrees.updateHitbox();
- treeLeaves.updateHitbox();
+ fgTrees.updateHitbox();
+ bgSky.updateHitbox();
+ bgSchool.updateHitbox();
+ bgStreet.updateHitbox();
+ bgTrees.updateHitbox();
+ treeLeaves.updateHitbox();
- bgGirls = new BackgroundGirls(-100, 190);
- bgGirls.scrollFactor.set(0.9, 0.9);
+ bgGirls = new BackgroundGirls(-100, 190);
+ bgGirls.scrollFactor.set(0.9, 0.9);
- if (SONG.song.toLowerCase() == 'roses')
- {
- bgGirls.getScared();
- }
+ if (SONG.song.toLowerCase() == 'roses')
+ {
+ bgGirls.getScared();
+ }
- bgGirls.setGraphicSize(Std.int(bgGirls.width * daPixelZoom));
- bgGirls.updateHitbox();
- add(bgGirls);
- }
- else if (SONG.song.toLowerCase() == 'thorns')
- {
- curStage = 'schoolEvil';
+ bgGirls.setGraphicSize(Std.int(bgGirls.width * daPixelZoom));
+ bgGirls.updateHitbox();
+ add(bgGirls);
+ case 'thorns':
+ curStage = 'schoolEvil';
- var waveEffectBG = new FlxWaveEffect(FlxWaveMode.ALL, 2, -1, 3, 2);
- var waveEffectFG = new FlxWaveEffect(FlxWaveMode.ALL, 2, -1, 5, 2);
+ var waveEffectBG = new FlxWaveEffect(FlxWaveMode.ALL, 2, -1, 3, 2);
+ var waveEffectFG = new FlxWaveEffect(FlxWaveMode.ALL, 2, -1, 5, 2);
- var posX = 400;
- var posY = 200;
+ var posX = 400;
+ var posY = 200;
- var bg:FlxSprite = new FlxSprite(posX, posY);
- bg.frames = Paths.getSparrowAtlas('weeb/animatedEvilSchool');
- bg.animation.addByPrefix('idle', 'background 2', 24);
- bg.animation.play('idle');
- bg.scrollFactor.set(0.8, 0.9);
- bg.scale.set(6, 6);
- add(bg);
+ var bg:FlxSprite = new FlxSprite(posX, posY);
+ bg.frames = Paths.getSparrowAtlas('weeb/animatedEvilSchool');
+ bg.animation.addByPrefix('idle', 'background 2', 24);
+ bg.animation.play('idle');
+ bg.scrollFactor.set(0.8, 0.9);
+ bg.scale.set(6, 6);
+ add(bg);
/*
var bg:FlxSprite = new FlxSprite(posX, posY).loadGraphic(Paths.image('weeb/evilSchoolBG'));
@@ -484,33 +473,74 @@ class PlayState extends MusicBeatState
add(waveSprite);
add(waveSpriteFG);
*/
- }
- else
- {
- defaultCamZoom = 0.9;
- curStage = 'stage';
- var bg:FlxSprite = new FlxSprite(-600, -200).loadGraphic(Paths.image('stageback'));
- bg.antialiasing = true;
- bg.scrollFactor.set(0.9, 0.9);
- bg.active = false;
- add(bg);
- var stageFront:FlxSprite = new FlxSprite(-650, 600).loadGraphic(Paths.image('stagefront'));
- stageFront.setGraphicSize(Std.int(stageFront.width * 1.1));
- stageFront.updateHitbox();
- stageFront.antialiasing = true;
- stageFront.scrollFactor.set(0.9, 0.9);
- stageFront.active = false;
- add(stageFront);
+ case 'guns' | 'stress' | 'ugh':
+ // defaultCamZoom = 0.95;
+ curStage = 'tank';
- var stageCurtains:FlxSprite = new FlxSprite(-500, -300).loadGraphic(Paths.image('stagecurtains'));
- stageCurtains.setGraphicSize(Std.int(stageCurtains.width * 0.9));
- stageCurtains.updateHitbox();
- stageCurtains.antialiasing = true;
- stageCurtains.scrollFactor.set(1.3, 1.3);
- stageCurtains.active = false;
+ var bg:BGSprite = new BGSprite('tankSky', 0, -200, 0, 0);
+ add(bg);
- add(stageCurtains);
+ var tankSky:BGSprite = new BGSprite('tankClouds', 0, 10, 0.1, 0.1);
+ add(tankSky);
+
+ var tankMountains:BGSprite = new BGSprite('tankMountains', -100, 150, 0.2, 0.2);
+ add(tankMountains);
+
+ var tankBuildings:BGSprite = new BGSprite('tankBuildings', -200, 370, 0.25, 0.25);
+ add(tankBuildings);
+
+ var tankRuins:BGSprite = new BGSprite('tankRuins', -200, 170, 0.35, 0.35);
+ add(tankRuins);
+
+ var tankWatchtower:BGSprite = new BGSprite('tankWatchtower', 300, 50, 0.5, 0.5);
+ add(tankWatchtower);
+
+ var tankGround:BGSprite = new BGSprite('tankGround', -200, -20);
+ add(tankGround);
+
+ var fgTank0:BGSprite = new BGSprite('tank0', -290, 400, 1.7, 1.5, ['fg']);
+ foregroundSprites.add(fgTank0);
+
+ var fgTank1:BGSprite = new BGSprite('tank1', -100, 680, 2, 0.2, ['fg']);
+ foregroundSprites.add(fgTank1);
+
+ // just called 'foreground' just cuz small inconsistency no bbiggei
+ var fgTank2:BGSprite = new BGSprite('tank2', 450, 840, 1.5, 1.5, ['foreground']);
+ foregroundSprites.add(fgTank2);
+
+ var fgTank4:BGSprite = new BGSprite('tank4', 1000, 880, 1.5, 1.5, ['fg']);
+ foregroundSprites.add(fgTank4);
+
+ var fgTank5:BGSprite = new BGSprite('tank5', 1400, 600, 1.5, 1.5, ['fg']);
+ foregroundSprites.add(fgTank5);
+
+ var fgTank3:BGSprite = new BGSprite('tank3', 1300, 1130, 3.5, 2.5, ['fg']);
+ foregroundSprites.add(fgTank3);
+
+ default:
+ defaultCamZoom = 0.9;
+ curStage = 'stage';
+
+ var bg:BGSprite = new BGSprite('stageback', -600, -200, 0.9, 0.9);
+ add(bg);
+
+ var stageFront:FlxSprite = new FlxSprite(-650, 600).loadGraphic(Paths.image('stagefront'));
+ stageFront.setGraphicSize(Std.int(stageFront.width * 1.1));
+ stageFront.updateHitbox();
+ stageFront.antialiasing = true;
+ stageFront.scrollFactor.set(0.9, 0.9);
+ stageFront.active = false;
+ add(stageFront);
+
+ var stageCurtains:FlxSprite = new FlxSprite(-500, -300).loadGraphic(Paths.image('stagecurtains'));
+ stageCurtains.setGraphicSize(Std.int(stageCurtains.width * 0.9));
+ stageCurtains.updateHitbox();
+ stageCurtains.antialiasing = true;
+ stageCurtains.scrollFactor.set(1.3, 1.3);
+ stageCurtains.active = false;
+
+ add(stageCurtains);
}
var gfVersion:String = 'gf';
@@ -530,9 +560,19 @@ class PlayState extends MusicBeatState
if (curStage == 'limo')
gfVersion = 'gf-car';
+ if (SONG.song.toLowerCase() == 'stress')
+ gfVersion = 'pico-speaker';
+
gf = new Character(400, 130, gfVersion);
gf.scrollFactor.set(0.95, 0.95);
+ switch (gfVersion)
+ {
+ case 'pico-speaker':
+ gf.x -= 50;
+ gf.y -= 200;
+ }
+
dad = new Character(100, 100, SONG.player2);
var camPos:FlxPoint = new FlxPoint(dad.getGraphicMidpoint().x, dad.getGraphicMidpoint().y);
@@ -573,6 +613,8 @@ class PlayState extends MusicBeatState
dad.x -= 150;
dad.y += 100;
camPos.set(dad.getGraphicMidpoint().x + 300, dad.getGraphicMidpoint().y);
+ case 'tankman':
+ dad.y += 180;
}
boyfriend = new Boyfriend(770, 450, SONG.player1);
@@ -622,6 +664,8 @@ class PlayState extends MusicBeatState
add(dad);
add(boyfriend);
+ add(foregroundSprites);
+
var doof:DialogueBox = new DialogueBox(false, dialogue);
// doof.x += 70;
// doof.y = FlxG.height * 0.5;
@@ -870,16 +914,8 @@ class PlayState extends MusicBeatState
var introAssets:Map> = new Map>();
introAssets.set('default', ['ready', "set", "go"]);
- introAssets.set('school', [
- 'weeb/pixelUI/ready-pixel',
- 'weeb/pixelUI/set-pixel',
- 'weeb/pixelUI/date-pixel'
- ]);
- introAssets.set('schoolEvil', [
- 'weeb/pixelUI/ready-pixel',
- 'weeb/pixelUI/set-pixel',
- 'weeb/pixelUI/date-pixel'
- ]);
+ introAssets.set('school', ['weeb/pixelUI/ready-pixel', 'weeb/pixelUI/set-pixel', 'weeb/pixelUI/date-pixel']);
+ introAssets.set('schoolEvil', ['weeb/pixelUI/ready-pixel', 'weeb/pixelUI/set-pixel', 'weeb/pixelUI/date-pixel']);
var introAlts:Array = introAssets.get('default');
var altSuffix:String = "";
@@ -1477,7 +1513,7 @@ class PlayState extends MusicBeatState
}
#end
- if (health <= 0)
+ if (health <= 0 && !practiceMode)
{
boyfriend.stunned = true;
@@ -1488,6 +1524,8 @@ class PlayState extends MusicBeatState
vocals.stop();
FlxG.sound.music.stop();
+ deathCounter += 1;
+
openSubState(new GameOverSubstate(boyfriend.getScreenPosition().x, boyfriend.getScreenPosition().y));
// FlxG.switchState(new GameOverState(boyfriend.getScreenPosition().x, boyfriend.getScreenPosition().y));
@@ -1601,6 +1639,7 @@ class PlayState extends MusicBeatState
function endSong():Void
{
+ deathCounter = 0;
canPause = false;
FlxG.sound.music.volume = 0;
vocals.volume = 0;
@@ -1925,29 +1964,29 @@ class PlayState extends MusicBeatState
*/
// trace(daNote.noteData);
/*
- switch (daNote.noteData)
+ switch (daNote.noteData)
+ {
+ case 2: // NOTES YOU JUST PRESSED
+ if (upP || rightP || downP || leftP)
+ noteCheck(upP, daNote);
+ case 3:
+ if (upP || rightP || downP || leftP)
+ noteCheck(rightP, daNote);
+ case 1:
+ if (upP || rightP || downP || leftP)
+ noteCheck(downP, daNote);
+ case 0:
+ if (upP || rightP || downP || leftP)
+ noteCheck(leftP, daNote);
+ }
+
+ //this is already done in noteCheck / goodNoteHit
+ if (daNote.wasGoodHit)
{
- case 2: // NOTES YOU JUST PRESSED
- if (upP || rightP || downP || leftP)
- noteCheck(upP, daNote);
- case 3:
- if (upP || rightP || downP || leftP)
- noteCheck(rightP, daNote);
- case 1:
- if (upP || rightP || downP || leftP)
- noteCheck(downP, daNote);
- case 0:
- if (upP || rightP || downP || leftP)
- noteCheck(leftP, daNote);
+ daNote.kill();
+ notes.remove(daNote, true);
+ daNote.destroy();
}
-
- //this is already done in noteCheck / goodNoteHit
- if (daNote.wasGoodHit)
- {
- daNote.kill();
- notes.remove(daNote, true);
- daNote.destroy();
- }
*/
}
else
@@ -2312,6 +2351,11 @@ class PlayState extends MusicBeatState
}
}
+ foregroundSprites.forEach(function(spr:BGSprite)
+ {
+ spr.dance();
+ });
+
switch (curStage)
{
case 'school':
diff --git a/source/TitleState.hx b/source/TitleState.hx
index 27359557f..01668d72c 100644
--- a/source/TitleState.hx
+++ b/source/TitleState.hx
@@ -2,20 +2,14 @@ package;
import flixel.FlxG;
import flixel.FlxSprite;
-import flixel.FlxState;
-import flixel.addons.display.FlxGridOverlay;
import flixel.addons.transition.FlxTransitionSprite.GraphicTransTileDiamond;
import flixel.addons.transition.FlxTransitionableState;
import flixel.addons.transition.TransitionData;
import flixel.graphics.FlxGraphic;
-import flixel.graphics.frames.FlxAtlasFrames;
import flixel.group.FlxGroup;
import flixel.input.gamepad.FlxGamepad;
import flixel.math.FlxPoint;
import flixel.math.FlxRect;
-import flixel.system.FlxSound;
-import flixel.system.ui.FlxSoundTray;
-import flixel.text.FlxText;
import flixel.tweens.FlxEase;
import flixel.tweens.FlxTween;
import flixel.util.FlxColor;
@@ -42,9 +36,11 @@ class TitleState extends MusicBeatState
override public function create():Void
{
#if polymod
- polymod.Polymod.init({modRoot: "mods", dirs: ['introMod']});
+ polymod.Polymod.init({modRoot: "mods", dirs: ['introMod'], framework: OPENFL});
#end
-
+
+ FlxG.sound.muteKeys = [ZERO];
+
PlayerSettings.init();
curWacky = FlxG.random.getObject(getIntroTextShit());
@@ -217,6 +213,17 @@ class TitleState extends MusicBeatState
override function update(elapsed:Float)
{
+ /*
+ if (FlxG.keys.justPressed.R)
+ {
+ #if polymod
+ polymod.Polymod.init({modRoot: "mods", dirs: ['introMod']});
+ trace('reinitialized');
+ #end
+ }
+
+ */
+
if (FlxG.sound.music != null)
Conductor.songPosition = FlxG.sound.music.time;
// FlxG.watch.addQuick('amp', FlxG.sound.music.amplitude);