diff --git a/appveyor-linux.yml b/appveyor-linux.yml
index dc06bb0..6dfee0f 100644
--- a/appveyor-linux.yml
+++ b/appveyor-linux.yml
@@ -9,7 +9,7 @@ install:
- cd /home/appveyor
- sudo add-apt-repository ppa:haxe/releases -y
- sudo apt update
- - sudo apt install neko tar gcc-multilib g++-multilib -y
+ - sudo apt install neko tar gcc-7 g++-7 gcc-7-multilib g++-7-multilib -y
- wget https://github.com/HaxeFoundation/haxe/releases/download/4.1.5/haxe-4.1.5-linux64.tar.gz
- mkdir $HAXE_INSTALLDIR
- tar -xf haxe-4.1.5-linux64.tar.gz -C $HAXE_INSTALLDIR
diff --git a/appveyor-windows.yml b/appveyor-windows.yml
index f1d47f5..58d5d98 100644
--- a/appveyor-windows.yml
+++ b/appveyor-windows.yml
@@ -36,7 +36,10 @@ install:
- haxelib git extension-webm https://github.com/KadeDev/extension-webm
- haxelib run lime rebuild extension-webm windows
- haxelib install linc_luajit
- - haxelib install actuate
+ - haxelib install actuate
+ #- haxelib git extension-webm https://github.com/KadeDev/extension-webm
+ #- haxelib run lime rebuild extension-webm windows
+ #why here's dublicate lmao
- haxelib list
# No tests idk lol
diff --git a/assets/preload/data/freeplaySonglist.txt b/assets/preload/data/freeplaySonglist.txt
index a5939ad..7af8115 100644
--- a/assets/preload/data/freeplaySonglist.txt
+++ b/assets/preload/data/freeplaySonglist.txt
@@ -1,4 +1,4 @@
-Tutorial:gf:1
+Tutorial:gf:0
Bopeebo:dad:1
Fresh:dad:1
Dad Battle:dad:1
diff --git a/assets/preload/data/test/test.json b/assets/preload/data/test/test.json
new file mode 100644
index 0000000..6ccba5e
--- /dev/null
+++ b/assets/preload/data/test/test.json
@@ -0,0 +1 @@
+{"song": {"song": "Test", "notes": [{"lengthInSteps": 16, "bpm": 95.0, "changeBPM": false, "mustHitSection": true, "typeOfSection": 0, "sectionNotes": [[668.578947368421, 3, 947.3684210526317], [1615.9473684210527, 1, 631.578947368421], [2247.5263157894738, 0, 315.7894736842104]]}, {"lengthInSteps": 16, "bpm": 95.0, "changeBPM": false, "mustHitSection": true, "typeOfSection": 0, "sectionNotes": [[2563.315789473684, 3, 631.5789473684213], [3194.8947368421054, 2, 631.5789473684208], [3826.4736842105262, 1, 631.5789473684213], [4773.8421052631575, 1, 0]]}, {"lengthInSteps": 16, "bpm": 95.0, "changeBPM": false, "mustHitSection": true, "typeOfSection": 0, "sectionNotes": [[5089.631578947368, 2, 0], [5563.315789473684, 1, 0], [5879.105263157895, 3, 0], [6037.0, 1, 0], [6194.894736842105, 0, 0], [6352.789473684211, 2, 315.78947368420995], [6668.578947368421, 1, 315.78947368421086], [6984.368421052632, 0, 0], [7142.263157894737, 1, 0], [7300.1578947368425, 2, 0], [7458.0526315789475, 0, 0]]}, {"lengthInSteps": 16, "bpm": 95.0, "changeBPM": false, "mustHitSection": true, "typeOfSection": 0, "sectionNotes": [[7615.9473684210525, 1, 1578.9473684210525], [7615.9473684210525, 3, 947.3684210526326], [8721.21052631579, 3, 0], [8879.105263157895, 0, 0], [9194.894736842105, 2, 0], [9352.78947368421, 1, 0], [9352.78947368421, 3, 0], [9510.684210526315, 0, 0], [9510.684210526315, 2, 0], [9668.578947368422, 0, 0], [9668.578947368422, 2, 0], [9826.473684210527, 1, 0], [9826.473684210527, 3, 0], [9984.368421052632, 0, 0], [9984.368421052632, 2, 0]]}, {"lengthInSteps": 16, "bpm": 95.0, "changeBPM": false, "mustHitSection": true, "typeOfSection": 0, "sectionNotes": [[10142.263157894737, 3, 0], [10458.052631578947, 3, 0], [10773.842105263158, 3, 0], [11089.631578947368, 1, 0], [11247.526315789473, 2, 0], [11405.421052631578, 0, 0], [11721.21052631579, 0, 0], [12037.0, 0, 0], [12194.894736842105, 2, 0], [12352.78947368421, 1, 0], [12510.684210526315, 2, 0]]}, {"lengthInSteps": 16, "bpm": 95.0, "changeBPM": false, "mustHitSection": true, "typeOfSection": 0, "sectionNotes": [[12668.578947368422, 3, 0], [12984.368421052632, 1, 0], [13300.157894736842, 2, 315.78947368421177], [13615.947368421053, 0, 0], [13773.842105263158, 1, 0], [13931.736842105263, 3, 1263.1578947368416], [14563.315789473685, 0, 0], [14721.21052631579, 1, 0], [14879.105263157895, 2, 0], [15037.0, 1, 0]]}, {"lengthInSteps": 16, "bpm": 95.0, "changeBPM": false, "mustHitSection": true, "typeOfSection": 0, "sectionNotes": [[15194.894736842105, 0, 0], [15352.78947368421, 2, 0], [15510.684210526315, 0, 631.5789473684217], [16142.263157894737, 2, 0], [16300.157894736842, 1, 0], [16458.052631578947, 0, 0], [16773.842105263157, 0, 0], [17089.63157894737, 0, 0], [17405.42105263158, 1, 315.78947368420995]]}, {"lengthInSteps": 16, "bpm": 95.0, "changeBPM": false, "mustHitSection": true, "typeOfSection": 0, "sectionNotes": [[17721.21052631579, 0, 1263.1578947368398], [17721.21052631579, 3, 1263.1578947368398], [18984.36842105263, 1, 0], [18984.36842105263, 2, 0], [19300.157894736843, 1, 0], [19300.157894736843, 2, 0], [19615.947368421053, 1, 0], [19615.947368421053, 2, 0], [19826.473684210527, 1, 0], [19826.473684210527, 2, 0], [20037.0, 1, 0], [20037.0, 2, 0]]}, {"lengthInSteps": 16, "bpm": 95.0, "changeBPM": false, "mustHitSection": true, "typeOfSection": 0, "sectionNotes": [[20247.526315789473, 3, 631.5789473684199], [20879.105263157893, 1, 0], [21194.894736842107, 1, 0], [21510.684210526317, 1, 0], [21826.473684210527, 1, 0], [22142.263157894737, 1, 0], [22300.157894736843, 2, 0], [22458.052631578947, 0, 0], [22615.947368421053, 2, 0]]}, {"lengthInSteps": 16, "bpm": 95.0, "changeBPM": false, "mustHitSection": true, "typeOfSection": 0, "sectionNotes": [[22773.842105263157, 3, 0], [22931.736842105263, 1, 0], [23089.63157894737, 2, 0], [23405.42105263158, 1, 0], [23721.21052631579, 1, 0], [24037.0, 1, 0], [24352.78947368421, 2, 0], [24510.684210526317, 3, 0], [24668.57894736842, 1, 0], [24826.473684210527, 2, 0], [24984.36842105263, 1, 0], [25142.263157894737, 0, 473.68421052631675]]}, {"lengthInSteps": 16, "bpm": 95.0, "changeBPM": false, "mustHitSection": true, "typeOfSection": 0, "sectionNotes": [[25773.842105263157, 2, 0], [25931.736842105263, 3, 0], [26089.63157894737, 1, 0], [26247.526315789473, 2, 0], [26563.315789473683, 1, 0], [26879.105263157893, 0, 0], [27194.894736842107, 0, 0], [27352.78947368421, 1, 0], [27510.684210526317, 2, 0], [27668.57894736842, 3, 0]]}, {"lengthInSteps": 16, "bpm": 95.0, "changeBPM": false, "mustHitSection": true, "typeOfSection": 0, "sectionNotes": [[27826.473684210527, 2, 0], [28142.263157894737, 2, 0], [28458.052631578947, 3, 1894.7368421052633], [28615.947368421053, 2, 0], [28773.842105263157, 1, 0], [28931.736842105263, 0, 0], [29089.63157894737, 2, 0], [29247.526315789473, 1, 0], [29405.42105263158, 0, 0], [29563.315789473683, 1, 0], [29879.105263157893, 2, 0], [30037.0, 1, 0], [30194.894736842107, 0, 0]]}, {"lengthInSteps": 16, "bpm": 95.0, "changeBPM": false, "mustHitSection": true, "typeOfSection": 0, "sectionNotes": [[30352.78947368421, 2, 0], [30431.736842105263, 1, 0], [30510.684210526317, 0, 0], [30668.57894736842, 0, 0], [30826.473684210527, 0, 0], [30905.42105263158, 1, 0], [30984.36842105263, 2, 0], [31142.263157894737, 3, 0], [31300.157894736843, 1, 0], [31458.052631578947, 2, 0], [31615.947368421053, 0, 0], [31773.842105263157, 2, 0], [31931.736842105263, 1, 0], [32089.63157894737, 2, 0], [32405.42105263158, 2, 0], [32721.21052631579, 2, 0]]}, {"lengthInSteps": 16, "bpm": 95.0, "changeBPM": false, "mustHitSection": true, "typeOfSection": 0, "sectionNotes": [[32879.10526315789, 2, 0], [32958.05263157895, 3, 0], [33037.0, 1, 0], [33194.89473684211, 0, 0], [33352.78947368421, 2, 0], [33510.68421052631, 1, 0], [33668.57894736842, 2, 0], [33826.47368421053, 3, 0], [33984.36842105263, 1, 0], [34063.31578947369, 2, 0], [34142.26315789474, 0, 0], [34300.15789473684, 0, 0], [34458.05263157895, 1, 0], [34615.94736842105, 2, 0], [34694.89473684211, 1, 0], [34773.84210526316, 2, 0], [34931.73684210526, 3, 0], [35089.63157894737, 1, 0], [35247.52631578947, 2, 0]]}, {"lengthInSteps": 16, "bpm": 95.0, "changeBPM": false, "mustHitSection": true, "typeOfSection": 0, "sectionNotes": [[35405.42105263158, 0, 0], [35563.31578947369, 1, 0], [35721.21052631579, 2, 0], [35879.10526315789, 3, 0], [36194.89473684211, 2, 0], [36352.78947368421, 1, 0], [36510.68421052631, 0, 0], [36826.47368421053, 2, 0], [36984.36842105263, 1, 0], [37142.26315789474, 0, 236.84210526315292], [37458.05263157895, 0, 236.8421052631602], [37773.84210526316, 0, 0]]}, {"lengthInSteps": 16, "bpm": 95.0, "changeBPM": false, "mustHitSection": true, "typeOfSection": 0, "sectionNotes": [[37931.73684210526, 2, 0], [38089.63157894737, 1, 0], [38247.52631578947, 0, 0], [38405.42105263158, 1, 0], [38563.31578947369, 3, 0], [38721.21052631579, 3, 0], [38879.10526315789, 2, 552.6315789473665], [39510.68421052631, 1, 315.7894736842136], [39826.47368421053, 3, 1263.1578947368398]]}, {"lengthInSteps": 16, "bpm": 95.0, "changeBPM": false, "mustHitSection": true, "typeOfSection": 0, "sectionNotes": [[41721.21052631579, 1, 631.5789473684272], [42431.73684210526, 0, 0], [42510.68421052631, 1, 0], [42589.63157894737, 2, 0], [42668.57894736842, 3, 0], [42747.52631578947, 2, 0], [42826.47368421053, 1, 0], [42905.42105263158, 0, 0]]}, {"lengthInSteps": 16, "bpm": 95.0, "changeBPM": false, "mustHitSection": true, "typeOfSection": 0, "sectionNotes": [[42984.36842105263, 3, 631.5789473684199], [43615.94736842105, 1, 552.6315789473665], [44247.52631578947, 1, 631.5789473684199], [44958.05263157895, 0, 0], [45037.0, 1, 0], [45115.94736842105, 2, 0], [45194.89473684211, 3, 0], [45273.84210526316, 1, 0], [45352.78947368421, 2, 0], [45431.73684210526, 1, 0]]}, {"lengthInSteps": 16, "bpm": 95.0, "changeBPM": false, "mustHitSection": true, "typeOfSection": 0, "sectionNotes": [[45510.68421052631, 3, 631.5789473684272], [46142.26315789474, 1, 0], [46142.26315789474, 2, 631.5789473684199], [46300.15789473684, 0, 0], [46458.05263157895, 1, 0], [46615.94736842105, 0, 0], [46773.84210526316, 1, 0], [46773.84210526316, 3, 631.5789473684199], [46931.73684210526, 0, 0], [47089.63157894737, 1, 0], [47247.52631578947, 0, 0], [47405.42105263158, 1, 0], [47405.42105263158, 2, 631.5789473684199], [47484.36842105263, 0, 0], [47563.31578947369, 1, 0], [47642.26315789474, 0, 0], [47721.21052631579, 1, 0], [47800.15789473684, 0, 0], [47879.10526315789, 1, 0], [47958.05263157895, 0, 0]]}, {"lengthInSteps": 16, "bpm": 95.0, "changeBPM": false, "mustHitSection": true, "typeOfSection": 0, "sectionNotes": [[48037.0, 1, 0], [48194.89473684211, 2, 0], [48352.78947368421, 1, 315.7894736842063], [48668.57894736842, 2, 236.8421052631602], [48984.36842105263, 1, 0], [49063.31578947369, 2, 0], [49142.26315789474, 3, 0], [49221.21052631579, 2, 0], [49300.15789473684, 0, 631.5789473684199], [49458.05263157895, 1, 0], [49615.94736842105, 2, 0], [49773.84210526316, 1, 0], [49931.73684210526, 2, 0], [50010.68421052631, 0, 0], [50089.63157894737, 1, 0], [50168.57894736842, 2, 0], [50247.52631578947, 1, 0], [50326.47368421053, 2, 0], [50405.42105263158, 3, 0], [50484.36842105263, 2, 0]]}, {"lengthInSteps": 16, "bpm": 95.0, "changeBPM": false, "mustHitSection": true, "typeOfSection": 0, "sectionNotes": [[50563.31578947369, 1, 631.5789473684199], [50563.31578947369, 3, 631.5789473684199], [51194.89473684211, 0, 631.5789473684199], [51194.89473684211, 2, 631.5789473684199], [51826.47368421053, 3, 0], [51984.36842105263, 2, 0], [52142.26315789474, 1, 0], [52300.15789473684, 3, 0], [52458.05263157895, 2, 0], [52615.94736842105, 1, 0], [52773.84210526316, 3, 0], [52931.73684210526, 2, 0]]}, {"lengthInSteps": 16, "bpm": 95.0, "changeBPM": false, "mustHitSection": true, "typeOfSection": 0, "sectionNotes": [[53089.63157894737, 1, 0], [53247.52631578947, 3, 0], [53405.42105263158, 2, 0], [53563.31578947369, 1, 0], [53721.21052631579, 3, 0], [53879.10526315789, 2, 0], [54037.0, 1, 0], [54194.89473684211, 0, 0], [54352.78947368421, 1, 0], [54510.68421052631, 2, 0], [54668.57894736842, 3, 0], [54826.47368421053, 2, 0], [54984.36842105263, 1, 0], [55142.26315789474, 3, 0], [55300.15789473684, 2, 0], [55458.05263157895, 1, 0]]}, {"lengthInSteps": 16, "bpm": 95.0, "changeBPM": false, "mustHitSection": true, "typeOfSection": 0, "sectionNotes": [[55615.94736842105, 3, 0], [55773.84210526316, 2, 0], [55931.73684210526, 1, 0], [56089.63157894737, 3, 0], [56247.52631578947, 2, 0], [56405.42105263158, 1, 0], [56563.31578947369, 3, 0], [56721.21052631579, 2, 0], [56879.10526315789, 1, 0], [57037.0, 0, 0], [57194.89473684211, 1, 0], [57352.78947368421, 0, 0], [57510.68421052631, 1, 0], [57668.57894736842, 2, 0], [57826.47368421053, 0, 0], [57984.36842105263, 1, 0]]}, {"lengthInSteps": 16, "bpm": 95.0, "changeBPM": false, "mustHitSection": true, "typeOfSection": 0, "sectionNotes": [[58142.26315789474, 2, 0], [58300.15789473684, 3, 0], [58458.05263157895, 2, 0], [58615.94736842105, 1, 0], [58773.84210526316, 0, 0], [58931.73684210526, 1, 0], [59089.63157894737, 2, 0], [59247.52631578947, 3, 0], [59405.42105263158, 2, 0], [59563.31578947369, 3, 0], [59721.21052631579, 0, 0], [59879.10526315789, 1, 0], [60037.0, 2, 0], [60194.89473684211, 0, 0], [60352.78947368421, 1, 0], [60510.68421052631, 2, 0]]}, {"lengthInSteps": 16, "bpm": 95.0, "changeBPM": false, "mustHitSection": true, "typeOfSection": 0, "sectionNotes": [[60668.57894736842, 3, 0], [60826.47368421053, 2, 0], [60984.36842105263, 0, 0], [61142.26315789474, 1, 0], [61300.15789473684, 2, 0], [61458.05263157895, 0, 0], [61615.94736842105, 1, 0], [61773.84210526316, 2, 0], [61931.73684210526, 3, 0], [62089.63157894737, 2, 0], [62247.52631578947, 1, 2210.5263157894733]]}, {"lengthInSteps": 16, "bpm": 95.0, "changeBPM": false, "mustHitSection": true, "typeOfSection": 0, "sectionNotes": []}], "bpm": 95.0, "sections": 0, "needsVoices": false, "player1": "bf", "player2": "gf", "sectionLengths": [], "speed": 3}}
\ No newline at end of file
diff --git a/assets/preload/music/freakyMenu.mp3 b/assets/preload/music/freakyMenu.mp3
deleted file mode 100644
index 8132bfe..0000000
Binary files a/assets/preload/music/freakyMenu.mp3 and /dev/null differ
diff --git a/assets/preload/music/freakyMenu.ogg b/assets/preload/music/freakyMenu.ogg
index 372111d..38abc15 100644
Binary files a/assets/preload/music/freakyMenu.ogg and b/assets/preload/music/freakyMenu.ogg differ
diff --git a/assets/shared/images/NOTE_assets.png b/assets/shared/images/NOTE_assets.png
index 8e9f3a0..3259d0b 100644
Binary files a/assets/shared/images/NOTE_assets.png and b/assets/shared/images/NOTE_assets.png differ
diff --git a/assets/shared/images/NOTE_assets.xml b/assets/shared/images/NOTE_assets.xml
index 6e80b13..76224ce 100644
--- a/assets/shared/images/NOTE_assets.xml
+++ b/assets/shared/images/NOTE_assets.xml
@@ -1,92 +1,45 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/shared/images/characters/bf-carOffsets.txt b/assets/shared/images/characters/bf-carOffsets.txt
new file mode 100644
index 0000000..5bbfae1
--- /dev/null
+++ b/assets/shared/images/characters/bf-carOffsets.txt
@@ -0,0 +1,9 @@
+idle -5 0
+singUP -29 27
+singRIGHT -38 -7
+singLEFT 12 -6
+singDOWN -10 -50
+singUPmiss -29 27
+singRIGHTmiss -30 21
+singLEFTmiss 12 24
+singDOWNmiss -11 -19
diff --git a/assets/shared/images/characters/bf-christmasOffsets.txt b/assets/shared/images/characters/bf-christmasOffsets.txt
new file mode 100644
index 0000000..0142844
--- /dev/null
+++ b/assets/shared/images/characters/bf-christmasOffsets.txt
@@ -0,0 +1,10 @@
+idle -5 0
+singUP -29 27
+singRIGHT -38 -7
+singLEFT 12 -6
+singDOWN -10 -50
+singUPmiss -29 27
+singRIGHTmiss -30 21
+singLEFTmiss 12 24
+singDOWNmiss -11 -19
+hey 7 4
diff --git a/assets/shared/images/characters/bf-pixel-deadOffsets.txt b/assets/shared/images/characters/bf-pixel-deadOffsets.txt
new file mode 100644
index 0000000..3544a2c
--- /dev/null
+++ b/assets/shared/images/characters/bf-pixel-deadOffsets.txt
@@ -0,0 +1,3 @@
+firstDeath 0 0
+deathLoop -30 -12
+deathConfirm -30 -12
diff --git a/assets/shared/images/characters/bf-pixelOffsets.txt b/assets/shared/images/characters/bf-pixelOffsets.txt
new file mode 100644
index 0000000..b8a8292
--- /dev/null
+++ b/assets/shared/images/characters/bf-pixelOffsets.txt
@@ -0,0 +1,9 @@
+idle 0 0
+singUP 0 0
+singRIGHT 0 0
+singLEFT 0 0
+singDOWN 0 0
+singUPmiss 0 0
+singRIGHTmiss 0 0
+singLEFTmiss 0 0
+singDOWNmiss 0 0
diff --git a/assets/shared/images/characters/bfOffsets.txt b/assets/shared/images/characters/bfOffsets.txt
new file mode 100644
index 0000000..6ec2321
--- /dev/null
+++ b/assets/shared/images/characters/bfOffsets.txt
@@ -0,0 +1,14 @@
+idle -5 0
+singUP -29 27
+singRIGHT -38 -7
+singLEFT 12 -6
+singDOWN -10 -50
+singUPmiss -29 27
+singRIGHTmiss -30 21
+singLEFTmiss 12 24
+singDOWNmiss -11 -19
+hey 7 4
+firstDeath 37 11
+deathLoop 37 5
+deathConfirm 37 69
+scared -4 0
diff --git a/assets/shared/images/characters/bfPixelsDEAD.xml b/assets/shared/images/characters/bfPixelsDEAD.xml
index 2d741ca..be3478c 100644
--- a/assets/shared/images/characters/bfPixelsDEAD.xml
+++ b/assets/shared/images/characters/bfPixelsDEAD.xml
@@ -1,7 +1,7 @@
-
-
+
+
@@ -58,8 +58,8 @@
-
-
+
+
diff --git a/assets/shared/images/characters/dadOffsets.txt b/assets/shared/images/characters/dadOffsets.txt
new file mode 100644
index 0000000..69ba153
--- /dev/null
+++ b/assets/shared/images/characters/dadOffsets.txt
@@ -0,0 +1,5 @@
+idle 0 0
+singUP -6 50
+singRIGHT 0 27
+singLEFT -10 10
+singDOWN 0 -30
diff --git a/assets/shared/images/characters/gf-carOffsets.txt b/assets/shared/images/characters/gf-carOffsets.txt
new file mode 100644
index 0000000..9862aae
--- /dev/null
+++ b/assets/shared/images/characters/gf-carOffsets.txt
@@ -0,0 +1,2 @@
+danceLeft 0 0
+danceRight 0 0
diff --git a/assets/shared/images/characters/gf-christmasOffsets.txt b/assets/shared/images/characters/gf-christmasOffsets.txt
new file mode 100644
index 0000000..05abb7a
--- /dev/null
+++ b/assets/shared/images/characters/gf-christmasOffsets.txt
@@ -0,0 +1,11 @@
+cheer 0 0
+sad -2 -21
+danceLeft 0 -9
+danceRight 0 -9
+singUP 0 4
+singRIGHT 0 -20
+singLEFT 0 -19
+singDOWN 0 -20
+hairBlow 45 -8
+hairFall 0 -9
+scared -2 -17
diff --git a/assets/shared/images/characters/gf-pixelOffsets.txt b/assets/shared/images/characters/gf-pixelOffsets.txt
new file mode 100644
index 0000000..9862aae
--- /dev/null
+++ b/assets/shared/images/characters/gf-pixelOffsets.txt
@@ -0,0 +1,2 @@
+danceLeft 0 0
+danceRight 0 0
diff --git a/assets/shared/images/characters/gfOffsets.txt b/assets/shared/images/characters/gfOffsets.txt
new file mode 100644
index 0000000..05abb7a
--- /dev/null
+++ b/assets/shared/images/characters/gfOffsets.txt
@@ -0,0 +1,11 @@
+cheer 0 0
+sad -2 -21
+danceLeft 0 -9
+danceRight 0 -9
+singUP 0 4
+singRIGHT 0 -20
+singLEFT 0 -19
+singDOWN 0 -20
+hairBlow 45 -8
+hairFall 0 -9
+scared -2 -17
diff --git a/assets/shared/images/characters/mom-carOffsets.txt b/assets/shared/images/characters/mom-carOffsets.txt
new file mode 100644
index 0000000..65cbecd
--- /dev/null
+++ b/assets/shared/images/characters/mom-carOffsets.txt
@@ -0,0 +1,5 @@
+idle 0 0
+singUP 14 71
+singRIGHT 10 -60
+singLEFT 250 -23
+singDOWN 20 -160
diff --git a/assets/shared/images/characters/momOffsets.txt b/assets/shared/images/characters/momOffsets.txt
new file mode 100644
index 0000000..65cbecd
--- /dev/null
+++ b/assets/shared/images/characters/momOffsets.txt
@@ -0,0 +1,5 @@
+idle 0 0
+singUP 14 71
+singRIGHT 10 -60
+singLEFT 250 -23
+singDOWN 20 -160
diff --git a/assets/shared/images/characters/monster-christmasOffsets.txt b/assets/shared/images/characters/monster-christmasOffsets.txt
new file mode 100644
index 0000000..a357046
--- /dev/null
+++ b/assets/shared/images/characters/monster-christmasOffsets.txt
@@ -0,0 +1,5 @@
+idle 0 0
+singUP -20 50
+singRIGHT -51 0
+singLEFT -30 0
+singDOWN -40 -94
diff --git a/assets/shared/images/characters/monsterOffsets.txt b/assets/shared/images/characters/monsterOffsets.txt
new file mode 100644
index 0000000..e211a5f
--- /dev/null
+++ b/assets/shared/images/characters/monsterOffsets.txt
@@ -0,0 +1,5 @@
+idle 0 0
+singUP -20 94
+singRIGHT -51 30
+singLEFT -30 20
+singDOWN -50 -80
diff --git a/assets/shared/images/characters/parents-christmasOffsets.txt b/assets/shared/images/characters/parents-christmasOffsets.txt
new file mode 100644
index 0000000..bdee13c
--- /dev/null
+++ b/assets/shared/images/characters/parents-christmasOffsets.txt
@@ -0,0 +1,9 @@
+idle 0 0
+singUP -47 24
+singRIGHT -1 -23
+singLEFT -30 16
+singDOWN -31 -29
+singUP-alt -47 24
+singRIGHT-alt -1 -24
+singLEFT-alt -30 15
+singDOWN-alt -30 -27
diff --git a/assets/shared/images/characters/picoOffsets.txt b/assets/shared/images/characters/picoOffsets.txt
new file mode 100644
index 0000000..e209da7
--- /dev/null
+++ b/assets/shared/images/characters/picoOffsets.txt
@@ -0,0 +1,9 @@
+idle 0 0
+singUP -29 27
+singRIGHT -68 -7
+singLEFT 65 9
+singDOWN 200 -70
+singUPmiss -19 67
+singRIGHTmiss -60 41
+singLEFTmiss 62 64
+singDOWNmiss 210 -28
diff --git a/assets/shared/images/characters/senpai-angryOffsets.txt b/assets/shared/images/characters/senpai-angryOffsets.txt
new file mode 100644
index 0000000..c118259
--- /dev/null
+++ b/assets/shared/images/characters/senpai-angryOffsets.txt
@@ -0,0 +1,5 @@
+idle 0 0
+singUP 5 37
+singRIGHT 0 0
+singLEFT 40 0
+singDOWN 14 0
diff --git a/assets/shared/images/characters/senpaiOffsets.txt b/assets/shared/images/characters/senpaiOffsets.txt
new file mode 100644
index 0000000..c118259
--- /dev/null
+++ b/assets/shared/images/characters/senpaiOffsets.txt
@@ -0,0 +1,5 @@
+idle 0 0
+singUP 5 37
+singRIGHT 0 0
+singLEFT 40 0
+singDOWN 14 0
diff --git a/assets/shared/images/characters/spiritOffsets.txt b/assets/shared/images/characters/spiritOffsets.txt
new file mode 100644
index 0000000..ed2442d
--- /dev/null
+++ b/assets/shared/images/characters/spiritOffsets.txt
@@ -0,0 +1,5 @@
+idle -220 -280
+singUP -220 -240
+singRIGHT -220 -280
+singLEFT -200 -280
+singDOWN 170 110
diff --git a/assets/shared/images/characters/spookyOffsets.txt b/assets/shared/images/characters/spookyOffsets.txt
new file mode 100644
index 0000000..c14c5e7
--- /dev/null
+++ b/assets/shared/images/characters/spookyOffsets.txt
@@ -0,0 +1,6 @@
+danceLeft 0 0
+danceRight 0 0
+singUP -20 26
+singRIGHT -130 -14
+singLEFT 130 -10
+singDOWN -50 -130
diff --git a/assets/songs/test/Inst.mp3 b/assets/songs/test/Inst.mp3
deleted file mode 100644
index 87d9932..0000000
Binary files a/assets/songs/test/Inst.mp3 and /dev/null differ
diff --git a/assets/songs/test/Inst.ogg b/assets/songs/test/Inst.ogg
index f39e2b1..7a16671 100644
Binary files a/assets/songs/test/Inst.ogg and b/assets/songs/test/Inst.ogg differ
diff --git a/assets/songs/test/Voices.mp3 b/assets/songs/test/Voices.mp3
deleted file mode 100644
index 9625266..0000000
Binary files a/assets/songs/test/Voices.mp3 and /dev/null differ
diff --git a/assets/songs/test/Voices.ogg b/assets/songs/test/Voices.ogg
deleted file mode 100644
index 49f0f5d..0000000
Binary files a/assets/songs/test/Voices.ogg and /dev/null differ
diff --git a/docs/guides/weeks.md b/docs/guides/weeks.md
index 90b89ca..f2097cb 100644
--- a/docs/guides/weeks.md
+++ b/docs/guides/weeks.md
@@ -15,8 +15,10 @@ Scroll down to Line 26, or Search (Windows/Linux: `Ctrl+F`, Mac: `Cmd+F`) for "w
---
```haxe
-var weekData:Array = [
-
+static function weekData():Array
+{
+ return [
+
['Tutorial'],
['Bopeebo', 'Fresh', 'Dadbattle'],
@@ -30,8 +32,9 @@ var weekData:Array = [
['Cocoa', 'Eggnog', 'Winter-Horrorland'],
['Senpai', 'Roses', 'Thorns']
-
-];
+
+ ];
+}
```
---
@@ -45,8 +48,10 @@ Example
---
```haxe
-var weekData:Array = [
-
+static function weekData():Array
+{
+ return [
+
['Tutorial'],
['Bopeebo', 'Fresh', 'Dadbattle'],
@@ -58,12 +63,13 @@ var weekData:Array = [
['Satin-Panties', "High", "Milf"],
['Cocoa', 'Eggnog', 'Winter-Horrorland'],
-
+
['Senpai', 'Roses', 'Thorns'],
['Ugh', 'Guns', 'Stress']
-
-];
+
+ ];
+}
```
---
diff --git a/source/Caching.hx b/source/Caching.hx
index 2c6fb50..1cbbcd6 100644
--- a/source/Caching.hx
+++ b/source/Caching.hx
@@ -83,6 +83,7 @@ class Caching extends MusicBeatState
var images = [];
var music = [];
+ var charts = [];
trace("caching images...");
@@ -99,6 +100,7 @@ class Caching extends MusicBeatState
{
music.push(i);
}
+
toBeDone = Lambda.count(images) + Lambda.count(music);
@@ -120,6 +122,7 @@ class Caching extends MusicBeatState
done++;
}
+
trace("Finished caching...");
FlxG.switchState(new TitleState());
diff --git a/source/Character.hx b/source/Character.hx
index f9df179..73ff66c 100644
--- a/source/Character.hx
+++ b/source/Character.hx
@@ -46,19 +46,7 @@ class Character extends FlxSprite
animation.addByIndices('hairFall', "GF Dancing Beat Hair Landing", [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], "", 24, false);
animation.addByPrefix('scared', 'GF FEAR', 24);
- addOffset('cheer');
- addOffset('sad', -2, -2);
- addOffset('danceLeft', 0, -9);
- addOffset('danceRight', 0, -9);
-
- addOffset("singUP", 0, 4);
- addOffset("singRIGHT", 0, -20);
- addOffset("singLEFT", 0, -19);
- addOffset("singDOWN", 0, -20);
- addOffset('hairBlow', 45, -8);
- addOffset('hairFall', 0, -9);
-
- addOffset('scared', -2, -17);
+ loadOffsetFile(curCharacter);
playAnim('danceRight');
@@ -77,19 +65,7 @@ class Character extends FlxSprite
animation.addByIndices('hairFall', "GF Dancing Beat Hair Landing", [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], "", 24, false);
animation.addByPrefix('scared', 'GF FEAR', 24);
- addOffset('cheer');
- addOffset('sad', -2, -2);
- addOffset('danceLeft', 0, -9);
- addOffset('danceRight', 0, -9);
-
- addOffset("singUP", 0, 4);
- addOffset("singRIGHT", 0, -20);
- addOffset("singLEFT", 0, -19);
- addOffset("singDOWN", 0, -20);
- addOffset('hairBlow', 45, -8);
- addOffset('hairFall', 0, -9);
-
- addOffset('scared', -2, -17);
+ loadOffsetFile(curCharacter);
playAnim('danceRight');
@@ -101,8 +77,7 @@ class Character extends FlxSprite
animation.addByIndices('danceRight', 'GF Dancing Beat Hair blowing CAR', [15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29], "", 24,
false);
- addOffset('danceLeft', 0);
- addOffset('danceRight', 0);
+ loadOffsetFile(curCharacter);
playAnim('danceRight');
@@ -113,8 +88,7 @@ class Character extends FlxSprite
animation.addByIndices('danceLeft', 'GF IDLE', [30, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "", 24, false);
animation.addByIndices('danceRight', 'GF IDLE', [15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29], "", 24, false);
- addOffset('danceLeft', 0);
- addOffset('danceRight', 0);
+ loadOffsetFile(curCharacter);
playAnim('danceRight');
@@ -132,11 +106,7 @@ class Character extends FlxSprite
animation.addByPrefix('singDOWN', 'Dad Sing Note DOWN', 24);
animation.addByPrefix('singLEFT', 'Dad Sing Note LEFT', 24);
- addOffset('idle');
- addOffset("singUP", -6, 50);
- addOffset("singRIGHT", 0, 27);
- addOffset("singLEFT", -10, 10);
- addOffset("singDOWN", 0, -30);
+ loadOffsetFile(curCharacter);
playAnim('idle');
case 'spooky':
@@ -149,13 +119,7 @@ class Character extends FlxSprite
animation.addByIndices('danceLeft', 'spooky dance idle', [0, 2, 6], "", 12, false);
animation.addByIndices('danceRight', 'spooky dance idle', [8, 10, 12, 14], "", 12, false);
- addOffset('danceLeft');
- addOffset('danceRight');
-
- addOffset("singUP", -20, 26);
- addOffset("singRIGHT", -130, -14);
- addOffset("singLEFT", 130, -10);
- addOffset("singDOWN", -50, -130);
+ loadOffsetFile(curCharacter);
playAnim('danceRight');
case 'mom':
@@ -170,11 +134,7 @@ class Character extends FlxSprite
// CUZ DAVE IS DUMB!
animation.addByPrefix('singRIGHT', 'Mom Pose Left', 24, false);
- addOffset('idle');
- addOffset("singUP", 14, 71);
- addOffset("singRIGHT", 10, -60);
- addOffset("singLEFT", 250, -23);
- addOffset("singDOWN", 20, -160);
+ loadOffsetFile(curCharacter);
playAnim('idle');
@@ -190,11 +150,7 @@ class Character extends FlxSprite
// CUZ DAVE IS DUMB!
animation.addByPrefix('singRIGHT', 'Mom Pose Left', 24, false);
- addOffset('idle');
- addOffset("singUP", 14, 71);
- addOffset("singRIGHT", 10, -60);
- addOffset("singLEFT", 250, -23);
- addOffset("singDOWN", 20, -160);
+ loadOffsetFile(curCharacter);
playAnim('idle');
case 'monster':
@@ -206,11 +162,7 @@ class Character extends FlxSprite
animation.addByPrefix('singLEFT', 'Monster left note', 24, false);
animation.addByPrefix('singRIGHT', 'Monster Right note', 24, false);
- addOffset('idle');
- addOffset("singUP", -20, 50);
- addOffset("singRIGHT", -51);
- addOffset("singLEFT", -30);
- addOffset("singDOWN", -30, -40);
+ loadOffsetFile(curCharacter);
playAnim('idle');
case 'monster-christmas':
tex = Paths.getSparrowAtlas('characters/monsterChristmas');
@@ -221,11 +173,7 @@ class Character extends FlxSprite
animation.addByPrefix('singLEFT', 'Monster left note', 24, false);
animation.addByPrefix('singRIGHT', 'Monster Right note', 24, false);
- addOffset('idle');
- addOffset("singUP", -20, 50);
- addOffset("singRIGHT", -51);
- addOffset("singLEFT", -30);
- addOffset("singDOWN", -40, -94);
+ loadOffsetFile(curCharacter);
playAnim('idle');
case 'pico':
tex = Paths.getSparrowAtlas('characters/Pico_FNF_assetss');
@@ -252,15 +200,7 @@ class Character extends FlxSprite
animation.addByPrefix('singUPmiss', 'pico Up note miss', 24);
animation.addByPrefix('singDOWNmiss', 'Pico Down Note MISS', 24);
- addOffset('idle');
- addOffset("singUP", -29, 27);
- addOffset("singRIGHT", -68, -7);
- addOffset("singLEFT", 65, 9);
- addOffset("singDOWN", 200, -70);
- addOffset("singUPmiss", -19, 67);
- addOffset("singRIGHTmiss", -60, 41);
- addOffset("singLEFTmiss", 62, 64);
- addOffset("singDOWNmiss", 210, -28);
+ loadOffsetFile(curCharacter);
playAnim('idle');
@@ -289,20 +229,7 @@ class Character extends FlxSprite
animation.addByPrefix('scared', 'BF idle shaking', 24);
- addOffset('idle', -5);
- addOffset("singUP", -29, 27);
- addOffset("singRIGHT", -38, -7);
- addOffset("singLEFT", 12, -6);
- addOffset("singDOWN", -10, -50);
- addOffset("singUPmiss", -29, 27);
- addOffset("singRIGHTmiss", -30, 21);
- addOffset("singLEFTmiss", 12, 24);
- addOffset("singDOWNmiss", -11, -19);
- addOffset("hey", 7, 4);
- addOffset('firstDeath', 37, 11);
- addOffset('deathLoop', 37, 5);
- addOffset('deathConfirm', 37, 69);
- addOffset('scared', -4);
+ loadOffsetFile(curCharacter);
playAnim('idle');
@@ -322,16 +249,7 @@ class Character extends FlxSprite
animation.addByPrefix('singDOWNmiss', 'BF NOTE DOWN MISS', 24, false);
animation.addByPrefix('hey', 'BF HEY', 24, false);
- addOffset('idle', -5);
- addOffset("singUP", -29, 27);
- addOffset("singRIGHT", -38, -7);
- addOffset("singLEFT", 12, -6);
- addOffset("singDOWN", -10, -50);
- addOffset("singUPmiss", -29, 27);
- addOffset("singRIGHTmiss", -30, 21);
- addOffset("singLEFTmiss", 12, 24);
- addOffset("singDOWNmiss", -11, -19);
- addOffset("hey", 7, 4);
+ loadOffsetFile(curCharacter);
playAnim('idle');
@@ -349,15 +267,7 @@ class Character extends FlxSprite
animation.addByPrefix('singRIGHTmiss', 'BF NOTE RIGHT MISS', 24, false);
animation.addByPrefix('singDOWNmiss', 'BF NOTE DOWN MISS', 24, false);
- addOffset('idle', -5);
- addOffset("singUP", -29, 27);
- addOffset("singRIGHT", -38, -7);
- addOffset("singLEFT", 12, -6);
- addOffset("singDOWN", -10, -50);
- addOffset("singUPmiss", -29, 27);
- addOffset("singRIGHTmiss", -30, 21);
- addOffset("singLEFTmiss", 12, 24);
- addOffset("singDOWNmiss", -11, -19);
+ loadOffsetFile(curCharacter);
playAnim('idle');
flipX = true;
@@ -373,15 +283,7 @@ class Character extends FlxSprite
animation.addByPrefix('singRIGHTmiss', 'BF RIGHT MISS', 24, false);
animation.addByPrefix('singDOWNmiss', 'BF DOWN MISS', 24, false);
- addOffset('idle');
- addOffset("singUP");
- addOffset("singRIGHT");
- addOffset("singLEFT");
- addOffset("singDOWN");
- addOffset("singUPmiss");
- addOffset("singRIGHTmiss");
- addOffset("singLEFTmiss");
- addOffset("singDOWNmiss");
+ loadOffsetFile(curCharacter);
setGraphicSize(Std.int(width * 6));
updateHitbox();
@@ -402,9 +304,7 @@ class Character extends FlxSprite
animation.addByPrefix('deathConfirm', "RETRY CONFIRM", 24, false);
animation.play('firstDeath');
- addOffset('firstDeath');
- addOffset('deathLoop', -37);
- addOffset('deathConfirm', -37);
+ loadOffsetFile(curCharacter);
playAnim('firstDeath');
// pixel bullshit
setGraphicSize(Std.int(width * 6));
@@ -420,11 +320,7 @@ class Character extends FlxSprite
animation.addByPrefix('singRIGHT', 'SENPAI RIGHT NOTE', 24, false);
animation.addByPrefix('singDOWN', 'SENPAI DOWN NOTE', 24, false);
- addOffset('idle');
- addOffset("singUP", 5, 37);
- addOffset("singRIGHT");
- addOffset("singLEFT", 40);
- addOffset("singDOWN", 14);
+ loadOffsetFile(curCharacter);
playAnim('idle');
@@ -440,11 +336,7 @@ class Character extends FlxSprite
animation.addByPrefix('singRIGHT', 'Angry Senpai RIGHT NOTE', 24, false);
animation.addByPrefix('singDOWN', 'Angry Senpai DOWN NOTE', 24, false);
- addOffset('idle');
- addOffset("singUP", 5, 37);
- addOffset("singRIGHT");
- addOffset("singLEFT", 40);
- addOffset("singDOWN", 14);
+ loadOffsetFile(curCharacter);
playAnim('idle');
setGraphicSize(Std.int(width * 6));
@@ -460,11 +352,7 @@ class Character extends FlxSprite
animation.addByPrefix('singLEFT', "left_", 24, false);
animation.addByPrefix('singDOWN', "spirit down_", 24, false);
- addOffset('idle', -220, -280);
- addOffset('singUP', -220, -240);
- addOffset("singRIGHT", -220, -280);
- addOffset("singLEFT", -200, -280);
- addOffset("singDOWN", 170, 110);
+ loadOffsetFile(curCharacter);
setGraphicSize(Std.int(width * 6));
updateHitbox();
@@ -487,15 +375,7 @@ class Character extends FlxSprite
animation.addByPrefix('singLEFT-alt', 'Parent Left Note Mom', 24, false);
animation.addByPrefix('singRIGHT-alt', 'Parent Right Note Mom', 24, false);
- addOffset('idle');
- addOffset("singUP", -47, 24);
- addOffset("singRIGHT", -1, -23);
- addOffset("singLEFT", -30, 16);
- addOffset("singDOWN", -31, -29);
- addOffset("singUP-alt", -47, 24);
- addOffset("singRIGHT-alt", -1, -24);
- addOffset("singLEFT-alt", -30, 15);
- addOffset("singDOWN-alt", -30, -27);
+ loadOffsetFile(curCharacter);
playAnim('idle');
}
@@ -525,6 +405,17 @@ class Character extends FlxSprite
}
}
+ public function loadOffsetFile(character:String)
+ {
+ var offset:Array = CoolUtil.coolTextFile(Paths.txt('images/characters/' + character + "Offsets"));
+
+ for (i in 0...offset.length)
+ {
+ var data:Array = offset[i].split(' ');
+ addOffset(data[0], Std.parseInt(data[1]), Std.parseInt(data[2]));
+ }
+ }
+
override function update(elapsed:Float)
{
if (!curCharacter.startsWith('bf'))
diff --git a/source/ChartingState.hx b/source/ChartingState.hx
index 4371fad..154ac67 100644
--- a/source/ChartingState.hx
+++ b/source/ChartingState.hx
@@ -309,10 +309,10 @@ class ChartingState extends MusicBeatState
shiftNotes(Std.int(stepperShiftNoteDial.value),Std.int(stepperShiftNoteDialstep.value),Std.int(stepperShiftNoteDialms.value));
});
- var characters:Array = CoolUtil.coolTextFile(Paths.txt('characterList'));
- var gfVersions:Array = CoolUtil.coolTextFile(Paths.txt('gfVersionList'));
- var stages:Array = CoolUtil.coolTextFile(Paths.txt('stageList'));
- var noteStyles:Array = CoolUtil.coolTextFile(Paths.txt('noteStyleList'));
+ var characters:Array = CoolUtil.coolTextFile(Paths.txt('data/characterList'));
+ var gfVersions:Array = CoolUtil.coolTextFile(Paths.txt('data/gfVersionList'));
+ var stages:Array = CoolUtil.coolTextFile(Paths.txt('data/stageList'));
+ var noteStyles:Array = CoolUtil.coolTextFile(Paths.txt('data/noteStyleList'));
var player1DropDown = new FlxUIDropDownMenu(10, 100, FlxUIDropDownMenu.makeStrIdLabelArray(characters, true), function(character:String)
{
@@ -1240,6 +1240,7 @@ class ChartingState extends MusicBeatState
var daSus = i[2];
var note:Note = new Note(daStrumTime, daNoteInfo % 4,null,false,true);
+ note.rawNoteData = daNoteInfo;
note.sustainLength = daSus;
note.setGraphicSize(GRID_SIZE, GRID_SIZE);
note.updateHitbox();
@@ -1282,7 +1283,7 @@ class ChartingState extends MusicBeatState
for (i in _song.notes[curSection].sectionNotes)
{
- if (i.strumTime == note.strumTime && i.noteData % 4 == note.noteData)
+ if (i[0] == note.strumTime && i[1] == note.rawNoteData)
{
curSelectedNote = _song.notes[curSection].sectionNotes[swagNum];
}
@@ -1300,7 +1301,7 @@ class ChartingState extends MusicBeatState
lastNote = note;
for (i in _song.notes[curSection].sectionNotes)
{
- if (i[0] == note.strumTime && i[1] % 4 == note.noteData)
+ if (i[0] == note.strumTime && i[1] == note.rawNoteData)
{
_song.notes[curSection].sectionNotes.remove(i);
}
diff --git a/source/DialogueBox.hx b/source/DialogueBox.hx
index d52358c..07363c6 100644
--- a/source/DialogueBox.hx
+++ b/source/DialogueBox.hx
@@ -155,7 +155,7 @@ class DialogueBox extends FlxSpriteGroup
portraitLeft.visible = false;
if (PlayState.SONG.song.toLowerCase() == 'thorns')
{
- portraitLeft.color = FlxColor.BLACK;
+ portraitLeft.visible = false;
swagDialogue.color = FlxColor.WHITE;
dropText.color = FlxColor.BLACK;
}
diff --git a/source/DiffCalc.hx b/source/DiffCalc.hx
new file mode 100644
index 0000000..a1c7a7a
--- /dev/null
+++ b/source/DiffCalc.hx
@@ -0,0 +1,140 @@
+import Song.SwagSong;
+
+class SmallNote // basically Note.hx but small as fuck
+{
+ public var strumTime:Float;
+ public var noteData:Int;
+
+ public function new(strum,data)
+ {
+ strumTime = strum;
+ noteData = data;
+ }
+}
+
+class DiffCalc
+{
+ public static function CalculateDiff(song:SwagSong)
+ {
+ // cleaned notes
+ var cleanedNotes:Array = [];
+
+ // find all of the notes
+ for(i in song.notes) // sections
+ {
+ for (ii in i.sectionNotes) // notes
+ {
+ if (ii[2] != 0) // skip helds
+ continue;
+ var gottaHitNote:Bool = i.mustHitSection;
+
+ if (ii[1] > 3)
+ gottaHitNote = !i.mustHitSection;
+
+ if (gottaHitNote)
+ cleanedNotes.push(new SmallNote(ii[0],Math.floor(Math.abs(ii[1]))));
+ }
+ }
+
+ var handOne:Array = [];
+ var handTwo:Array = [];
+
+ cleanedNotes.sort((a, b) -> Std.int(a.strumTime - b.strumTime));
+
+ var firstNoteTime = cleanedNotes[0].strumTime;
+
+ // normalize the notes
+
+ for(i in cleanedNotes)
+ {
+ i.strumTime = (i.strumTime - firstNoteTime) * 2;
+ }
+
+ for (i in cleanedNotes)
+ {
+ switch(i.noteData)
+ {
+ case 0:
+ handOne.push(i);
+ case 1:
+ handTwo.push(i);
+ case 2:
+ handTwo.push(i);
+ case 3:
+ handOne.push(i);
+ }
+ }
+
+
+ // length in segments of the song
+ var length = ((cleanedNotes[cleanedNotes.length - 1].strumTime / 1000) / 0.5);
+
+ // hackey way of creating a array with a length
+ var segmentsOne:Array = new_Array(1,Std.int(length));
+ var segmentsTwo:Array = new_Array(1,Std.int(length));
+
+ // algo loop
+ for(i in handOne)
+ {
+ var index = Std.int(((i.strumTime / 1000)));
+ if (index + 1 > segmentsOne.length)
+ continue;
+ segmentsOne[index] = segmentsOne[index] + 1;
+ }
+
+ for(i in handTwo)
+ {
+ var index = Std.int(((i.strumTime / 1000)));
+ if (index + 1 > segmentsTwo.length)
+ continue;
+ segmentsTwo[index] = segmentsTwo[index] + 1;
+ }
+
+ // get the average of all of the segments
+ var sumOne:Float = 0;
+ var sumTwo:Float = 0;
+
+
+ var lone = segmentsOne.length;
+ var ltwo = segmentsOne.length;
+
+ for (i in segmentsOne)
+ {
+ if (i == 0) // remove empty/breaks
+ {
+ lone--;
+ continue;
+ }
+ //trace(i);
+ sumOne += i / .5; // half it because otherwise instead of nps its just fucking notes per half second which is dumb and stupid
+ }
+
+ for (i in segmentsTwo)
+ {
+ if (i == 0) // remove empty/breaks
+ {
+ ltwo--;
+ continue;
+ }
+ //trace(i);
+ sumTwo += i / .5; // half it because otherwise instead of nps its just fucking notes per half second which is dumb and stupid
+ }
+
+
+ var handOneAvg = sumOne / lone;
+ var handTwoAvg = sumTwo / ltwo;
+
+ return HelperFunctions.truncateFloat(handOneAvg > handTwoAvg ? handOneAvg : handTwoAvg,2);
+ }
+
+ static public function new_Array( ArrayType:T, Length:Int ):Array {
+ var empty:Null = null;
+ var newArray:Array = new Array();
+
+ for ( i in 0...Length ) {
+ newArray.push( empty );
+ }
+
+ return newArray;
+ }
+}
\ No newline at end of file
diff --git a/source/FreeplayState.hx b/source/FreeplayState.hx
index 243d970..d62c538 100644
--- a/source/FreeplayState.hx
+++ b/source/FreeplayState.hx
@@ -1,5 +1,6 @@
package;
+import Song.SwagSong;
import flixel.input.gamepad.FlxGamepad;
import flash.text.TextField;
import flixel.FlxG;
@@ -29,6 +30,7 @@ class FreeplayState extends MusicBeatState
var scoreText:FlxText;
var comboText:FlxText;
var diffText:FlxText;
+ var diffCalcText:FlxText;
var lerpScore:Int = 0;
var intendedScore:Int = 0;
var combo:String = '';
@@ -38,16 +40,66 @@ class FreeplayState extends MusicBeatState
private var iconArray:Array = [];
+ public static var songData:Map> = [];
+
+ public static function loadDiff(diff:Int, format:String, name:String, array:Array)
+ {
+ try
+ {
+ array.push(Song.loadFromJson(Highscore.formatSong(format, diff), name));
+ }
+ catch(ex)
+ {
+ // do nada
+ }
+ }
+
override function create()
{
- var initSonglist = CoolUtil.coolTextFile(Paths.txt('freeplaySonglist'));
+ var initSonglist = CoolUtil.coolTextFile(Paths.txt('data/freeplaySonglist'));
+
+ //var diffList = "";
for (i in 0...initSonglist.length)
{
var data:Array = initSonglist[i].split(':');
- songs.push(new SongMetadata(data[0], Std.parseInt(data[2]), data[1]));
+ var meta = new SongMetadata(data[0], Std.parseInt(data[2]), data[1]);
+ #if debug
+ songs.push(meta);
+ var format = StringTools.replace(meta.songName, " ", "-");
+ switch (format) {
+ case 'Dad-Battle': format = 'Dadbattle';
+ case 'Philly-Nice': format = 'Philly';
+ }
+
+ var diffs = [];
+ FreeplayState.loadDiff(0,format,meta.songName,diffs);
+ FreeplayState.loadDiff(1,format,meta.songName,diffs);
+ FreeplayState.loadDiff(2,format,meta.songName,diffs);
+ FreeplayState.songData.set(meta.songName,diffs);
+ trace('loaded diffs for ' + meta.songName);
+ #else
+ if(Std.parseInt(data[2]) <= FlxG.save.data.weekUnlocked - 1)
+ {
+ songs.push(meta);
+ var format = StringTools.replace(meta.songName, " ", "-");
+ switch (format) {
+ case 'Dad-Battle': format = 'Dadbattle';
+ case 'Philly-Nice': format = 'Philly';
+ }
+
+ var diffs = [];
+ FreeplayState.loadDiff(0,format,meta.songName,diffs);
+ FreeplayState.loadDiff(1,format,meta.songName,diffs);
+ FreeplayState.loadDiff(2,format,meta.songName,diffs);
+ FreeplayState.songData.set(meta.songName,diffs);
+ trace('loaded diffs for ' + meta.songName);
+ }
+ #end
}
+ //trace("\n" + diffList);
+
/*
if (FlxG.sound.music != null)
{
@@ -101,7 +153,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.35), 105, 0xFF000000);
scoreBG.alpha = 0.6;
add(scoreBG);
@@ -109,6 +161,10 @@ class FreeplayState extends MusicBeatState
diffText.font = scoreText.font;
add(diffText);
+ diffCalcText = new FlxText(scoreText.x, scoreText.y + 66, 0, "", 24);
+ diffCalcText.font = scoreText.font;
+ add(diffCalcText);
+
comboText = new FlxText(diffText.x + 100, diffText.y, 0, "", 24);
comboText.font = diffText.font;
add(comboText);
@@ -238,14 +294,20 @@ class FreeplayState extends MusicBeatState
case 'Dad-Battle': songFormat = 'Dadbattle';
case 'Philly-Nice': songFormat = 'Philly';
}
-
- trace(songs[curSelected].songName);
+ var hmm;
+ try
+ {
+ hmm = songData.get(songs[curSelected].songName)[curDifficulty];
+ if (hmm == null)
+ return;
+ }
+ catch(ex)
+ {
+ return;
+ }
- var poop:String = Highscore.formatSong(songFormat, curDifficulty);
- trace(poop);
-
- PlayState.SONG = Song.loadFromJson(poop, songs[curSelected].songName);
+ PlayState.SONG = hmm;
PlayState.isStoryMode = false;
PlayState.storyDifficulty = curDifficulty;
PlayState.storyWeek = songs[curSelected].week;
@@ -274,7 +336,7 @@ class FreeplayState extends MusicBeatState
intendedScore = Highscore.getScore(songHighscore, curDifficulty);
combo = Highscore.getCombo(songHighscore, curDifficulty);
#end
-
+ diffCalcText.text = 'RATING: ${DiffCalc.CalculateDiff(songData.get(songs[curSelected].songName)[curDifficulty])}';
diffText.text = CoolUtil.difficultyFromInt(curDifficulty).toUpperCase();
}
@@ -310,6 +372,8 @@ class FreeplayState extends MusicBeatState
// lerpScore = 0;
#end
+ diffCalcText.text = 'RATING: ${DiffCalc.CalculateDiff(songData.get(songs[curSelected].songName)[curDifficulty])}';
+
#if PRELOAD_ALL
FlxG.sound.playMusic(Paths.inst(songs[curSelected].songName), 0);
#end
diff --git a/source/KadeEngineData.hx b/source/KadeEngineData.hx
index 0a26829..2e5b424 100644
--- a/source/KadeEngineData.hx
+++ b/source/KadeEngineData.hx
@@ -6,7 +6,10 @@ class KadeEngineData
{
public static function initSave()
{
- if (FlxG.save.data.newInput == null)
+ if (FlxG.save.data.weekUnlocked == null)
+ FlxG.save.data.weekUnlocked = 7;
+
+ if (FlxG.save.data.newInput == null)
FlxG.save.data.newInput = true;
if (FlxG.save.data.downscroll == null)
diff --git a/source/KeyBindMenu.hx b/source/KeyBindMenu.hx
index d5a3d41..ff826bb 100644
--- a/source/KeyBindMenu.hx
+++ b/source/KeyBindMenu.hx
@@ -320,7 +320,7 @@ class KeyBindMenu extends FlxSubState
var shouldReturn:Bool = true;
- var notAllowed:Array = ["START", "RIGHT_TRIGGER", "LEFT_TRIGGER"];
+ var notAllowed:Array = ["START"];
for(x in 0...gpKeys.length)
{
diff --git a/source/Main.hx b/source/Main.hx
index a065da2..6c06d39 100644
--- a/source/Main.hx
+++ b/source/Main.hx
@@ -23,7 +23,7 @@ class Main extends Sprite
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
- public static var watermarks = true; // Whether to put Kade Engine liteartly anywhere
+ public static var watermarks = true; // Whether to put Kade Engine literally anywhere
// You can pretty much ignore everything from here on - your code should go in your states.
diff --git a/source/ModchartState.hx b/source/ModchartState.hx
index 6e194d1..571edbf 100644
--- a/source/ModchartState.hx
+++ b/source/ModchartState.hx
@@ -250,7 +250,7 @@ class ModchartState
PlayState.instance.removeObject(PlayState.boyfriend);
PlayState.boyfriend = new Boyfriend(oldboyfriendx, oldboyfriendy, id);
PlayState.instance.addObject(PlayState.boyfriend);
- PlayState.instance.iconP2.animation.play(id);
+ PlayState.instance.iconP1.animation.play(id);
}
function makeAnimatedLuaSprite(spritePath:String,names:Array,prefixes:Array,startAnim:String, id:String)
diff --git a/source/Note.hx b/source/Note.hx
index ec67490..d4c4a76 100644
--- a/source/Note.hx
+++ b/source/Note.hx
@@ -19,6 +19,7 @@ class Note extends FlxSprite
public var mustPress:Bool = false;
public var noteData:Int = 0;
+ public var rawNoteData:Int = 0;
public var canBeHit:Bool = false;
public var tooLate:Bool = false;
public var wasGoodHit:Bool = false;
@@ -99,20 +100,20 @@ class Note extends FlxSprite
default:
frames = Paths.getSparrowAtlas('NOTE_assets');
- animation.addByPrefix('greenScroll', 'green instance 1');
- animation.addByPrefix('redScroll', 'red instance 1');
- animation.addByPrefix('blueScroll', 'blue instance 1');
- animation.addByPrefix('purpleScroll', 'purple instance 1');
+ animation.addByPrefix('greenScroll', 'green0');
+ animation.addByPrefix('redScroll', 'red0');
+ animation.addByPrefix('blueScroll', 'blue0');
+ animation.addByPrefix('purpleScroll', 'purple0');
- animation.addByPrefix('purpleholdend', 'pruple end hold instance 1');
- animation.addByPrefix('greenholdend', 'green hold end instance 1');
- animation.addByPrefix('redholdend', 'red hold end instance 1');
- animation.addByPrefix('blueholdend', 'blue hold end instance 1');
+ animation.addByPrefix('purpleholdend', 'pruple end hold');
+ animation.addByPrefix('greenholdend', 'green hold end');
+ animation.addByPrefix('redholdend', 'red hold end');
+ animation.addByPrefix('blueholdend', 'blue hold end');
- animation.addByPrefix('purplehold', 'purple hold piece instance 1');
- animation.addByPrefix('greenhold', 'green hold piece instance 1');
- animation.addByPrefix('redhold', 'red hold piece instance 1');
- animation.addByPrefix('bluehold', 'blue hold piece instance 1');
+ animation.addByPrefix('purplehold', 'purple hold piece');
+ animation.addByPrefix('greenhold', 'green hold piece');
+ animation.addByPrefix('redhold', 'red hold piece');
+ animation.addByPrefix('bluehold', 'blue hold piece');
setGraphicSize(Std.int(width * 0.7));
updateHitbox();
@@ -166,7 +167,7 @@ class Note extends FlxSprite
x -= width / 2;
- if (PlayState.curStage.startsWith('school'))
+ if (noteTypeCheck == 'pixel')
x += 30;
if (prevNote.isSustainNote)
diff --git a/source/Options.hx b/source/Options.hx
index 7c8f411..8be193e 100644
--- a/source/Options.hx
+++ b/source/Options.hx
@@ -698,3 +698,127 @@ class CamZoomOption extends Option
return "Camera Zoom " + (!FlxG.save.data.camzoom ? "off" : "on");
}
}
+
+class LockWeeksOption extends Option
+{
+ var confirm:Bool = false;
+
+ public function new(desc:String)
+ {
+ super();
+ description = desc;
+ }
+ public override function press():Bool
+ {
+ if(!confirm)
+ {
+ confirm = true;
+ display = updateDisplay();
+ return true;
+ }
+ FlxG.save.data.weekUnlocked = 1;
+ StoryMenuState.weekUnlocked = [true, true];
+ trace('Weeks Locked');
+ display = updateDisplay();
+ return true;
+ }
+
+ private override function updateDisplay():String
+ {
+ return confirm ? "Confirm Story Reset" : "Reset Story Progress";
+ }
+}
+
+class ResetScoreOption extends Option
+{
+ var confirm:Bool = false;
+
+ public function new(desc:String)
+ {
+ super();
+ description = desc;
+ }
+ public override function press():Bool
+ {
+ if(!confirm)
+ {
+ confirm = true;
+ display = updateDisplay();
+ return true;
+ }
+ FlxG.save.data.songScores = null;
+ for(key in Highscore.songScores.keys())
+ {
+ Highscore.songScores[key] = 0;
+ }
+ FlxG.save.data.songCombos = null;
+ for(key in Highscore.songCombos.keys())
+ {
+ Highscore.songCombos[key] = '';
+ }
+ confirm = false;
+ trace('Highscores Wiped');
+ display = updateDisplay();
+ return true;
+ }
+
+ private override function updateDisplay():String
+ {
+ return confirm ? "Confirm Score Reset" : "Reset Score";
+ }
+}
+
+class ResetSettings extends Option
+{
+ var confirm:Bool = false;
+
+ public function new(desc:String)
+ {
+ super();
+ description = desc;
+ }
+ public override function press():Bool
+ {
+ if(!confirm)
+ {
+ confirm = true;
+ display = updateDisplay();
+ return true;
+ }
+ FlxG.save.data.weekUnlocked = null;
+ FlxG.save.data.newInput = null;
+ FlxG.save.data.downscroll = null;
+ FlxG.save.data.dfjk = null;
+ FlxG.save.data.accuracyDisplay = null;
+ FlxG.save.data.offset = null;
+ FlxG.save.data.songPosition = null;
+ FlxG.save.data.fps = null;
+ FlxG.save.data.changedHit = null;
+ FlxG.save.data.fpsRain = null;
+ FlxG.save.data.fpsCap = null;
+ FlxG.save.data.scrollSpeed = null;
+ FlxG.save.data.npsDisplay = null;
+ FlxG.save.data.frames = null;
+ FlxG.save.data.accuracyMod = null;
+ FlxG.save.data.watermark = null;
+ FlxG.save.data.ghost = null;
+ FlxG.save.data.distractions = null;
+ FlxG.save.data.flashing = null;
+ FlxG.save.data.resetButton = null;
+ FlxG.save.data.botplay = null;
+ FlxG.save.data.cpuStrums = null;
+ FlxG.save.data.strumline = null;
+ FlxG.save.data.customStrumLine = null;
+ FlxG.save.data.camzoom = null;
+ KadeEngineData.initSave();
+ confirm = false;
+ trace('All settings have been reset');
+ display = updateDisplay();
+ return true;
+ }
+
+ private override function updateDisplay():String
+ {
+ return confirm ? "Confirm Settings Reset" : "Reset Settings";
+ }
+}
diff --git a/source/OptionsMenu.hx b/source/OptionsMenu.hx
index 6581771..c46f81e 100644
--- a/source/OptionsMenu.hx
+++ b/source/OptionsMenu.hx
@@ -42,18 +42,16 @@ class OptionsMenu extends MusicBeatState
new OptionCategory("Appearance", [
new DistractionsAndEffectsOption("Toggle stage distractions that can hinder your gameplay."),
new CamZoomOption("Toggle the camera zoom in-game."),
- #if desktop
new RainbowFPSOption("Make the FPS Counter Rainbow"),
new AccuracyOption("Display accuracy information."),
new NPSDisplayOption("Shows your current Notes Per Second."),
new SongPositionOption("Show the songs current position (as a bar)"),
new CpuStrums("CPU's strumline lights up when a note hits it."),
- #end
]),
new OptionCategory("Misc", [
- #if desktop
new FPSOption("Toggle the FPS Counter"),
+ #if desktop
new ReplayOption("View replays"),
#end
new FlashingLightsOption("Toggle flashing lights that can cause epileptic seizures and strain."),
@@ -61,7 +59,13 @@ class OptionsMenu extends MusicBeatState
new ScoreScreen("Show the score screen after the end of a song"),
new ShowInput("Display every single input in the score screen."),
new Optimization("No backgrounds, no characters, centered notes, no player 2."),
- new BotPlay("Showcase your charts and mods with autoplay."),
+ new BotPlay("Showcase your charts and mods with autoplay.")
+ ]),
+
+ new OptionCategory("Manage Save Data", [
+ new ResetScoreOption("Reset your score on all songs and weeks."),
+ new LockWeeksOption("Reset your storymode progress. (only Tutorial + Week 1 will be unlocked)"),
+ new ResetSettings("Reset ALL your settings.")
])
];
diff --git a/source/Paths.hx b/source/Paths.hx
index 075adbd..71b4b8b 100644
--- a/source/Paths.hx
+++ b/source/Paths.hx
@@ -67,7 +67,7 @@ class Paths
inline static public function txt(key:String, ?library:String)
{
- return getPath('data/$key.txt', TEXT, library);
+ return getPath('$key.txt', TEXT, library);
}
inline static public function xml(key:String, ?library:String)
diff --git a/source/PlayState.hx b/source/PlayState.hx
index af3babe..960af79 100644
--- a/source/PlayState.hx
+++ b/source/PlayState.hx
@@ -253,6 +253,8 @@ class PlayState extends MusicBeatState
}
misses = 0;
+
+ highestCombo = 0;
repPresses = 0;
repReleases = 0;
@@ -360,11 +362,11 @@ class PlayState extends MusicBeatState
"Only then I will even CONSIDER letting you\ndate my daughter!"
];
case 'senpai':
- dialogue = CoolUtil.coolTextFile(Paths.txt('senpai/senpaiDialogue'));
+ dialogue = CoolUtil.coolTextFile(Paths.txt('data/senpai/senpaiDialogue'));
case 'roses':
- dialogue = CoolUtil.coolTextFile(Paths.txt('roses/rosesDialogue'));
+ dialogue = CoolUtil.coolTextFile(Paths.txt('data/roses/rosesDialogue'));
case 'thorns':
- dialogue = CoolUtil.coolTextFile(Paths.txt('thorns/thornsDialogue'));
+ dialogue = CoolUtil.coolTextFile(Paths.txt('data/thorns/thornsDialogue'));
}
//defaults if no stage was found in chart
@@ -1127,6 +1129,7 @@ class PlayState extends MusicBeatState
rep = new Replay("na");
FlxG.stage.addEventListener(KeyboardEvent.KEY_DOWN,handleInput);
+ FlxG.stage.addEventListener(KeyboardEvent.KEY_UP,releaseInput);
super.create();
}
@@ -1366,6 +1369,41 @@ class PlayState extends MusicBeatState
return null;
}
+ var keys = [false,false,false,false];
+
+ private function releaseInput(evt:KeyboardEvent):Void // handles releases
+ {
+ @:privateAccess
+ var key = FlxKey.toStringMap.get(Keyboard.__convertKeyCode(evt.keyCode));
+
+ var binds:Array = [FlxG.save.data.leftBind,FlxG.save.data.downBind, FlxG.save.data.upBind, FlxG.save.data.rightBind];
+
+ var data = -1;
+
+ switch(evt.keyCode) // arrow keys
+ {
+ case 37:
+ data = 0;
+ case 40:
+ data = 1;
+ case 38:
+ data = 2;
+ case 39:
+ data = 3;
+ }
+
+ for (i in 0...binds.length) // binds
+ {
+ if (binds[i].toLowerCase() == key.toLowerCase())
+ data = i;
+ }
+
+ if (data == -1)
+ return;
+
+ keys[data] = false;
+ }
+
private function handleInput(evt:KeyboardEvent):Void { // this actually handles press inputs
if (PlayStateChangeables.botPlay || loadRep || paused)
@@ -1399,15 +1437,16 @@ class PlayState extends MusicBeatState
if (binds[i].toLowerCase() == key.toLowerCase())
data = i;
}
-
- if (evt.keyLocation == KeyLocation.NUM_PAD)
- {
- trace(String.fromCharCode(evt.charCode) + " " + key);
- }
-
if (data == -1)
return;
+ if (keys[data])
+ {
+ return;
+ }
+
+ keys[data] = true;
+
var ana = new Ana(Conductor.songPosition, null, false, "miss", data);
var dataNotes = [];
@@ -1419,7 +1458,7 @@ class PlayState extends MusicBeatState
dataNotes.sort((a, b) -> Std.int(a.strumTime - b.strumTime)); // sort by the earliest note
-
+
if (dataNotes.length != 0)
{
var coolNote = dataNotes[0];
@@ -1592,6 +1631,7 @@ class PlayState extends MusicBeatState
swagNote.sustainLength = songNotes[2];
swagNote.scrollFactor.set(0, 0);
+
var susLength:Float = swagNote.sustainLength;
susLength = susLength / Conductor.stepCrochet;
@@ -1695,70 +1735,70 @@ class PlayState extends MusicBeatState
case 'normal':
babyArrow.frames = Paths.getSparrowAtlas('NOTE_assets');
- babyArrow.animation.addByPrefix('green', 'arrow static instance 1');
- babyArrow.animation.addByPrefix('blue', 'arrow static instance 2');
- babyArrow.animation.addByPrefix('purple', 'arrow static instance 3');
- babyArrow.animation.addByPrefix('red', 'arrow static instance 4');
-
+ babyArrow.animation.addByPrefix('green', 'arrowUP');
+ babyArrow.animation.addByPrefix('blue', 'arrowDOWN');
+ babyArrow.animation.addByPrefix('purple', 'arrowLEFT');
+ babyArrow.animation.addByPrefix('red', 'arrowRIGHT');
+
babyArrow.antialiasing = true;
babyArrow.setGraphicSize(Std.int(babyArrow.width * 0.7));
-
+
switch (Math.abs(i))
{
- case 0:
- babyArrow.x += Note.swagWidth * 0;
- babyArrow.animation.addByPrefix('static', 'arrow static instance 1');
- babyArrow.animation.addByPrefix('pressed', 'left press instance 1', 24, false);
- babyArrow.animation.addByPrefix('confirm', 'left confirm instance 1', 24, false);
- case 1:
- babyArrow.x += Note.swagWidth * 1;
- babyArrow.animation.addByPrefix('static', 'arrow static instance 2');
- babyArrow.animation.addByPrefix('pressed', 'down press instance 1', 24, false);
- babyArrow.animation.addByPrefix('confirm', 'down confirm instance 1', 24, false);
case 2:
babyArrow.x += Note.swagWidth * 2;
- babyArrow.animation.addByPrefix('static', 'arrow static instance 4');
- babyArrow.animation.addByPrefix('pressed', 'up press instance 1', 24, false);
- babyArrow.animation.addByPrefix('confirm', 'up confirm instance 1', 24, false);
+ babyArrow.animation.addByPrefix('static', 'arrowUP');
+ babyArrow.animation.addByPrefix('pressed', 'up press', 24, false);
+ babyArrow.animation.addByPrefix('confirm', 'up confirm', 24, false);
case 3:
babyArrow.x += Note.swagWidth * 3;
- babyArrow.animation.addByPrefix('static', 'arrow static instance 3');
- babyArrow.animation.addByPrefix('pressed', 'right press instance 1', 24, false);
- babyArrow.animation.addByPrefix('confirm', 'right confirm instance 1', 24, false);
- }
+ babyArrow.animation.addByPrefix('static', 'arrowRIGHT');
+ babyArrow.animation.addByPrefix('pressed', 'right press', 24, false);
+ babyArrow.animation.addByPrefix('confirm', 'right confirm', 24, false);
+ case 1:
+ babyArrow.x += Note.swagWidth * 1;
+ babyArrow.animation.addByPrefix('static', 'arrowDOWN');
+ babyArrow.animation.addByPrefix('pressed', 'down press', 24, false);
+ babyArrow.animation.addByPrefix('confirm', 'down confirm', 24, false);
+ case 0:
+ babyArrow.x += Note.swagWidth * 0;
+ babyArrow.animation.addByPrefix('static', 'arrowLEFT');
+ babyArrow.animation.addByPrefix('pressed', 'left press', 24, false);
+ babyArrow.animation.addByPrefix('confirm', 'left confirm', 24, false);
+ }
default:
babyArrow.frames = Paths.getSparrowAtlas('NOTE_assets');
- babyArrow.animation.addByPrefix('green', 'arrow static instance 1');
- babyArrow.animation.addByPrefix('blue', 'arrow static instance 2');
- babyArrow.animation.addByPrefix('purple', 'arrow static instance 3');
- babyArrow.animation.addByPrefix('red', 'arrow static instance 4');
+ babyArrow.animation.addByPrefix('green', 'arrowUP');
+ babyArrow.animation.addByPrefix('blue', 'arrowDOWN');
+ babyArrow.animation.addByPrefix('purple', 'arrowLEFT');
+ babyArrow.animation.addByPrefix('red', 'arrowRIGHT');
babyArrow.antialiasing = true;
babyArrow.setGraphicSize(Std.int(babyArrow.width * 0.7));
switch (Math.abs(i))
{
- case 0:
- babyArrow.x += Note.swagWidth * 0;
- babyArrow.animation.addByPrefix('static', 'arrow static instance 1');
- babyArrow.animation.addByPrefix('pressed', 'left press instance 1', 24, false);
- babyArrow.animation.addByPrefix('confirm', 'left confirm instance 1', 24, false);
- case 1:
- babyArrow.x += Note.swagWidth * 1;
- babyArrow.animation.addByPrefix('static', 'arrow static instance 2');
- babyArrow.animation.addByPrefix('pressed', 'down press instance 1', 24, false);
- babyArrow.animation.addByPrefix('confirm', 'down confirm instance 1', 24, false);
case 2:
babyArrow.x += Note.swagWidth * 2;
- babyArrow.animation.addByPrefix('static', 'arrow static instance 4');
- babyArrow.animation.addByPrefix('pressed', 'up press instance 1', 24, false);
- babyArrow.animation.addByPrefix('confirm', 'up confirm instance 1', 24, false);
+ babyArrow.animation.addByPrefix('static', 'arrowUP');
+ babyArrow.animation.addByPrefix('pressed', 'up press', 24, false);
+ babyArrow.animation.addByPrefix('confirm', 'up confirm', 24, false);
case 3:
babyArrow.x += Note.swagWidth * 3;
- babyArrow.animation.addByPrefix('static', 'arrow static instance 3');
- babyArrow.animation.addByPrefix('pressed', 'right press instance 1', 24, false);
- babyArrow.animation.addByPrefix('confirm', 'right confirm instance 1', 24, false);
+ babyArrow.animation.addByPrefix('static', 'arrowRIGHT');
+ babyArrow.animation.addByPrefix('pressed', 'right press', 24, false);
+ babyArrow.animation.addByPrefix('confirm', 'right confirm', 24, false);
+ case 1:
+ babyArrow.x += Note.swagWidth * 1;
+ babyArrow.animation.addByPrefix('static', 'arrowDOWN');
+ babyArrow.animation.addByPrefix('pressed', 'down press', 24, false);
+ babyArrow.animation.addByPrefix('confirm', 'down confirm', 24, false);
+ case 0:
+ babyArrow.x += Note.swagWidth * 0;
+ babyArrow.animation.addByPrefix('static', 'arrowLEFT');
+ babyArrow.animation.addByPrefix('pressed', 'left press', 24, false);
+ babyArrow.animation.addByPrefix('confirm', 'left confirm', 24, false);
}
}
@@ -2039,6 +2079,7 @@ class PlayState extends MusicBeatState
#end
FlxG.switchState(new ChartingState());
FlxG.stage.removeEventListener(KeyboardEvent.KEY_DOWN,handleInput);
+ FlxG.stage.removeEventListener(KeyboardEvent.KEY_UP,releaseInput);
#if windows
if (luaModchart != null)
{
@@ -2091,6 +2132,7 @@ class PlayState extends MusicBeatState
FlxG.switchState(new AnimationDebug(SONG.player2));
FlxG.stage.removeEventListener(KeyboardEvent.KEY_DOWN,handleInput);
+ FlxG.stage.removeEventListener(KeyboardEvent.KEY_UP,releaseInput);
#if windows
if (luaModchart != null)
{
@@ -2104,6 +2146,7 @@ class PlayState extends MusicBeatState
{
FlxG.switchState(new AnimationDebug(SONG.player1));
FlxG.stage.removeEventListener(KeyboardEvent.KEY_DOWN,handleInput);
+ FlxG.stage.removeEventListener(KeyboardEvent.KEY_UP,releaseInput);
#if windows
if (luaModchart != null)
{
@@ -2275,18 +2318,12 @@ class PlayState extends MusicBeatState
switch (dad.curCharacter)
{
- case 'mom':
+ case 'mom' | 'mom-car':
camFollow.y = dad.getMidpoint().y;
- case 'senpai':
- camFollow.y = dad.getMidpoint().y - 430;
- camFollow.x = dad.getMidpoint().x - 100;
- case 'senpai-angry':
+ case 'senpai' | 'senpai-angry':
camFollow.y = dad.getMidpoint().y - 430;
camFollow.x = dad.getMidpoint().x - 100;
}
-
- if (dad.curCharacter == 'mom')
- vocals.volume = 1;
}
if (PlayState.SONG.notes[Std.int(curStep / 16)].mustHitSection && camFollow.x != boyfriend.getMidpoint().x - 100)
@@ -2645,7 +2682,7 @@ class PlayState extends MusicBeatState
});
}
- if (!inCutscene)
+ if (!inCutscene && songStarted)
keyShit();
@@ -2658,6 +2695,7 @@ class PlayState extends MusicBeatState
function endSong():Void
{
FlxG.stage.removeEventListener(KeyboardEvent.KEY_DOWN,handleInput);
+ FlxG.stage.removeEventListener(KeyboardEvent.KEY_UP,releaseInput);
if (useVideo)
{
GlobalVideo.get().stop();
@@ -2750,17 +2788,13 @@ class PlayState extends MusicBeatState
}
#end
- // if ()
- StoryMenuState.weekUnlocked[Std.int(Math.min(storyWeek + 1, StoryMenuState.weekUnlocked.length - 1))] = true;
-
if (SONG.validScore)
{
NGio.unlockMedal(60961);
Highscore.saveWeekScore(storyWeek, campaignScore, storyDifficulty);
}
- FlxG.save.data.weekUnlocked = StoryMenuState.weekUnlocked;
- FlxG.save.flush();
+ StoryMenuState.unlockNextWeek(storyWeek);
}
else
{
@@ -3147,6 +3181,8 @@ class PlayState extends MusicBeatState
};
#end
+ var nonCpp = false;
+
// Prevent player input if botplay is on
if(PlayStateChangeables.botPlay)
@@ -3156,6 +3192,10 @@ class PlayState extends MusicBeatState
releaseArray = [false, false, false, false];
}
+ #if !cpp
+ nonCpp = true;
+ #end
+
var anas:Array = [null,null,null,null];
for (i in 0...pressArray.length)
@@ -3172,7 +3212,7 @@ class PlayState extends MusicBeatState
});
}
- if (KeyBinds.gamepad && !FlxG.keys.justPressed.ANY)
+ if ((KeyBinds.gamepad && !FlxG.keys.justPressed.ANY) || nonCpp)
{
// PRESSES, check for note hits
if (pressArray.contains(true) && generatedMusic)
@@ -3876,6 +3916,10 @@ class PlayState extends MusicBeatState
boyfriend.playAnim('idle');
}
+ if (!dad.animation.curAnim.name.startsWith("sing"))
+ {
+ dad.dance();
+ }
if (curBeat % 8 == 7 && curSong == 'Bopeebo')
{
diff --git a/source/Section.hx b/source/Section.hx
index f153da5..c1af6ac 100644
--- a/source/Section.hx
+++ b/source/Section.hx
@@ -2,7 +2,7 @@ package;
typedef SwagSection =
{
- var sectionNotes:Array;
+ var sectionNotes:Array>;
var lengthInSteps:Int;
var typeOfSection:Int;
var mustHitSection:Bool;
@@ -13,7 +13,7 @@ typedef SwagSection =
class Section
{
- public var sectionNotes:Array = [];
+ public var sectionNotes:Array> = [];
public var lengthInSteps:Int = 16;
public var typeOfSection:Int = 0;
diff --git a/source/StoryMenuState.hx b/source/StoryMenuState.hx
index 5957720..b842c98 100644
--- a/source/StoryMenuState.hx
+++ b/source/StoryMenuState.hx
@@ -24,18 +24,21 @@ class StoryMenuState extends MusicBeatState
{
var scoreText:FlxText;
- var weekData:Array = [
- ['Tutorial'],
- ['Bopeebo', 'Fresh', 'Dad Battle'],
- ['Spookeez', 'South', "Monster"],
- ['Pico', 'Philly Nice', "Blammed"],
- ['Satin Panties', "High", "Milf"],
- ['Cocoa', 'Eggnog', 'Winter Horrorland'],
- ['Senpai', 'Roses', 'Thorns']
- ];
+ static function weekData():Array
+ {
+ return [
+ ['Tutorial'],
+ ['Bopeebo', 'Fresh', 'Dad Battle'],
+ ['Spookeez', 'South', "Monster"],
+ ['Pico', 'Philly Nice', "Blammed"],
+ ['Satin Panties', "High", "Milf"],
+ ['Cocoa', 'Eggnog', 'Winter Horrorland'],
+ ['Senpai', 'Roses', 'Thorns']
+ ];
+ }
var curDifficulty:Int = 1;
- public static var weekUnlocked:Array = [true, true, true, true, true, true, true];
+ public static var weekUnlocked:Array = [];
var weekCharacters:Array = [
['', 'bf', 'gf'],
@@ -73,8 +76,28 @@ class StoryMenuState extends MusicBeatState
var leftArrow:FlxSprite;
var rightArrow:FlxSprite;
+ function unlockWeeks():Array
+ {
+ var weeks:Array = [];
+ #if debug
+ for(i in 0...weekNames.length)
+ weeks.push(true);
+ return weeks;
+ #end
+
+ weeks.push(true);
+
+ for(i in 0...FlxG.save.data.weekUnlocked)
+ {
+ weeks.push(true);
+ }
+ return weeks;
+ }
+
override function create()
{
+ weekUnlocked = unlockWeeks();
+
#if windows
// Updating Discord Rich Presence
DiscordClient.changePresence("In the Story Mode Menu", null);
@@ -110,17 +133,17 @@ class StoryMenuState extends MusicBeatState
grpWeekText = new FlxTypedGroup