diff --git a/assets/preload/data/events.json b/assets/preload/data/events.json
new file mode 100644
index 000000000..a398d2cc8
--- /dev/null
+++ b/assets/preload/data/events.json
@@ -0,0 +1,141 @@
+{
+ "song": {
+ "speed": 2.5,
+ "stage": "stage",
+ "player1": "bf",
+ "player2": "tord",
+ "player3": null,
+ "events": [
+ [
+ 38117.6470588235,
+ [
+ [
+ "Blammed Lights",
+ "4",
+ ""
+ ]
+ ]
+ ],
+ [
+ 39529.4117647059,
+ [
+ [
+ "Blammed Lights",
+ "4",
+ ""
+ ]
+ ]
+ ],
+ [
+ 67764.7058823529,
+ [
+ [
+ "Blammed Lights",
+ "4",
+ ""
+ ]
+ ]
+ ],
+ [
+ 70588.2352941176,
+ [
+ [
+ "Blammed Lights",
+ "4",
+ ""
+ ]
+ ]
+ ],
+ [
+ 101647.058823529,
+ [
+ [
+ "Blammed Lights",
+ "4",
+ ""
+ ]
+ ]
+ ],
+ [
+ 107294.117647059,
+ [
+ [
+ "Blammed Lights",
+ "4",
+ ""
+ ]
+ ]
+ ],
+ [
+ 112941.176470588,
+ [
+ [
+ "Blammed Lights",
+ "4",
+ ""
+ ]
+ ]
+ ],
+ [
+ 118500,
+ [
+ [
+ "Blammed Lights",
+ "4",
+ ""
+ ]
+ ]
+ ],
+ [
+ 144529.411764706,
+ [
+ [
+ "Blammed Lights",
+ "4",
+ ""
+ ]
+ ],
+ null,
+ "Hurt Note"
+ ],
+ [
+ 146647.058823529,
+ [
+ [
+ "Blammed Lights",
+ "4",
+ ""
+ ]
+ ]
+ ],
+ [
+ 189176.470588235,
+ [
+ [
+ "Blammed Lights",
+ "4",
+ ""
+ ]
+ ]
+ ],
+ [
+ 203294.117647058,
+ [
+ [
+ "Blammed Lights",
+ "4",
+ ""
+ ]
+ ]
+ ]
+ ],
+ "notes": [],
+ "splashSkin": "noteSplashes",
+ "validScore": false,
+ "gfVersion": "gf",
+ "bpm": 170,
+ "arrowSkin": "",
+ "needsVoices": true,
+ "song": "red-death"
+ }
+}
\ No newline at end of file
diff --git a/assets/preload/data/red-death b/assets/preload/data/red-death
new file mode 100644
index 000000000..8b1378917
--- /dev/null
+++ b/assets/preload/data/red-death
@@ -0,0 +1 @@
+
diff --git a/assets/preload/data/red-death-easy.json b/assets/preload/data/red-death-easy.json
new file mode 100644
index 000000000..f13b3993c
--- /dev/null
+++ b/assets/preload/data/red-death-easy.json
@@ -0,0 +1,6373 @@
+{
+ "song": {
+ "speed": 2.3,
+ "stage": "stage",
+ "player1": "bf",
+ "player2": "tord",
+ "player3": "gf",
+ "events": [],
+ "notes": [
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 0,
+ 2,
+ 0
+ ],
+ [
+ 529.411764705882,
+ 2,
+ 0
+ ],
+ [
+ 705.882352941177,
+ 3,
+ 0
+ ],
+ [
+ 882.352941176471,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 150,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 1411.76470588235,
+ 3,
+ 0
+ ],
+ [
+ 1588.23529411765,
+ 1,
+ 0
+ ],
+ [
+ 2294.11764705882,
+ 1,
+ 0
+ ],
+ [
+ 2647.05882352941,
+ 3,
+ 0
+ ],
+ [
+ 2470.58823529412,
+ 0,
+ 0
+ ],
+ [
+ 1764.70588235294,
+ 3,
+ 0
+ ],
+ [
+ 1941.17647058824,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 150,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 2823.52941176471,
+ 3,
+ 0
+ ],
+ [
+ 3088.23529411765,
+ 3,
+ 0
+ ],
+ [
+ 3352.94117647059,
+ 3,
+ 0
+ ],
+ [
+ 3617.64705882353,
+ 3,
+ 0
+ ],
+ [
+ 3882.35294117647,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 4058.82352941176,
+ 3,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 4235.29411764706,
+ 1,
+ 0
+ ],
+ [
+ 4411.76470588235,
+ 2,
+ 0
+ ],
+ [
+ 4588.23529411765,
+ 1,
+ 0
+ ],
+ [
+ 4764.70588235294,
+ 2,
+ 0
+ ],
+ [
+ 5117.64705882353,
+ 2,
+ 0
+ ],
+ [
+ 5294.11764705882,
+ 3,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 5647.05882352941,
+ 3,
+ 0
+ ],
+ [
+ 5735.29411764706,
+ 1,
+ 0
+ ],
+ [
+ 5823.52941176471,
+ 2,
+ 0
+ ],
+ [
+ 5911.76470588235,
+ 0,
+ 0
+ ],
+ [
+ 6000,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 6352.94117647059,
+ 3,
+ 0
+ ],
+ [
+ 6529.41176470588,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 7058.82352941176,
+ 3,
+ 0
+ ],
+ [
+ 7235.29411764706,
+ 1,
+ 0
+ ],
+ [
+ 7411.76470588235,
+ 3,
+ 0
+ ],
+ [
+ 7941.17647058824,
+ 1,
+ 0
+ ],
+ [
+ 7588.23529411765,
+ 1,
+ 176.470588235294
+ ],
+ [
+ 8117.64705882353,
+ 3,
+ 0
+ ],
+ [
+ 8294.11764705882,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 8470.58823529412,
+ 1,
+ 0
+ ],
+ [
+ 9000,
+ 3,
+ 0
+ ],
+ [
+ 9088.23529411765,
+ 1,
+ 0
+ ],
+ [
+ 9176.47058823529,
+ 3,
+ 0
+ ],
+ [
+ 9264.70588235294,
+ 2,
+ 0
+ ],
+ [
+ 9352.94117647059,
+ 0,
+ 0
+ ],
+ [
+ 9529.41176470588,
+ 3,
+ 0
+ ],
+ [
+ 9617.64705882353,
+ 2,
+ 0
+ ],
+ [
+ 9705.88235294118,
+ 1,
+ 0
+ ],
+ [
+ 9794.11764705882,
+ 0,
+ 0
+ ],
+ [
+ 8647.05882352941,
+ 7,
+ 0
+ ],
+ [
+ 9000,
+ 7,
+ 0
+ ],
+ [
+ 9176.47058823529,
+ 6,
+ 0
+ ],
+ [
+ 9352.94117647059,
+ 4,
+ 0
+ ],
+ [
+ 9529.41176470588,
+ 7,
+ 0
+ ],
+ [
+ 9705.88235294118,
+ 5,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 9882.35294117647,
+ 1,
+ 0
+ ],
+ [
+ 10058.8235294118,
+ 2,
+ 0
+ ],
+ [
+ 10500,
+ 2,
+ 0
+ ],
+ [
+ 10235.2941176471,
+ 1,
+ 0
+ ],
+ [
+ 10764.7058823529,
+ 2,
+ 0
+ ],
+ [
+ 11117.6470588235,
+ 1,
+ 0
+ ],
+ [
+ 9882.35294117647,
+ 4,
+ 0
+ ],
+ [
+ 10058.8235294118,
+ 7,
+ 0
+ ],
+ [
+ 10411.7647058824,
+ 4,
+ 0
+ ],
+ [
+ 10588.2352941176,
+ 7,
+ 0
+ ],
+ [
+ 10941.1764705882,
+ 4,
+ 0
+ ],
+ [
+ 11117.6470588235,
+ 7,
+ 0
+ ],
+ [
+ 10235.2941176471,
+ 5,
+ 0
+ ],
+ [
+ 10764.7058823529,
+ 5,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 11294.1176470588,
+ 2,
+ 0
+ ],
+ [
+ 11823.5294117647,
+ 2,
+ 0
+ ],
+ [
+ 12000,
+ 3,
+ 0
+ ],
+ [
+ 12176.4705882353,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 12705.8823529412,
+ 3,
+ 0
+ ],
+ [
+ 12882.3529411765,
+ 1,
+ 0
+ ],
+ [
+ 13588.2352941176,
+ 1,
+ 0
+ ],
+ [
+ 13941.1764705882,
+ 3,
+ 0
+ ],
+ [
+ 13764.7058823529,
+ 0,
+ 0
+ ],
+ [
+ 13058.8235294118,
+ 3,
+ 0
+ ],
+ [
+ 13235.2941176471,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 14117.6470588235,
+ 3,
+ 0
+ ],
+ [
+ 14382.3529411765,
+ 3,
+ 0
+ ],
+ [
+ 14647.0588235294,
+ 3,
+ 0
+ ],
+ [
+ 14911.7647058824,
+ 3,
+ 0
+ ],
+ [
+ 15176.4705882353,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 15352.9411764706,
+ 3,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 15529.4117647059,
+ 1,
+ 0
+ ],
+ [
+ 15705.8823529412,
+ 2,
+ 0
+ ],
+ [
+ 15882.3529411765,
+ 1,
+ 0
+ ],
+ [
+ 16058.8235294118,
+ 2,
+ 0
+ ],
+ [
+ 16147.0588235294,
+ 1,
+ 0
+ ],
+ [
+ 16323.5294117647,
+ 2,
+ 0
+ ],
+ [
+ 16852.9411764706,
+ 3,
+ 0
+ ],
+ [
+ 16411.7647058824,
+ 1,
+ 352.941176470588
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 16941.1764705882,
+ 3,
+ 0
+ ],
+ [
+ 17029.4117647059,
+ 1,
+ 0
+ ],
+ [
+ 17117.6470588235,
+ 2,
+ 0
+ ],
+ [
+ 17205.8823529412,
+ 0,
+ 0
+ ],
+ [
+ 17294.1176470588,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 17647.0588235294,
+ 3,
+ 0
+ ],
+ [
+ 17823.5294117647,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 18352.9411764706,
+ 3,
+ 0
+ ],
+ [
+ 18529.4117647059,
+ 1,
+ 0
+ ],
+ [
+ 18705.8823529412,
+ 3,
+ 0
+ ],
+ [
+ 19235.2941176471,
+ 1,
+ 0
+ ],
+ [
+ 18882.3529411765,
+ 1,
+ 176.470588235294
+ ],
+ [
+ 19411.7647058824,
+ 3,
+ 0
+ ],
+ [
+ 19588.2352941176,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 20294.1176470588,
+ 3,
+ 0
+ ],
+ [
+ 20382.3529411765,
+ 1,
+ 0
+ ],
+ [
+ 20647.0588235294,
+ 0,
+ 0
+ ],
+ [
+ 20823.5294117647,
+ 3,
+ 0
+ ],
+ [
+ 19941.1764705882,
+ 7,
+ 0
+ ],
+ [
+ 20294.1176470588,
+ 7,
+ 0
+ ],
+ [
+ 20470.5882352941,
+ 6,
+ 0
+ ],
+ [
+ 20647.0588235294,
+ 4,
+ 0
+ ],
+ [
+ 20823.5294117647,
+ 7,
+ 0
+ ],
+ [
+ 21000,
+ 5,
+ 0
+ ],
+ [
+ 19764.7058823529,
+ 0,
+ 0
+ ],
+ [
+ 19852.9411764706,
+ 3,
+ 0
+ ],
+ [
+ 19941.1764705882,
+ 0,
+ 0
+ ],
+ [
+ 20029.4117647059,
+ 3,
+ 0
+ ],
+ [
+ 20470.5882352941,
+ 2,
+ 0
+ ],
+ [
+ 20823.5294117647,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 21529.4117647059,
+ 1,
+ 0
+ ],
+ [
+ 21176.4705882353,
+ 4,
+ 0
+ ],
+ [
+ 21352.9411764706,
+ 7,
+ 0
+ ],
+ [
+ 21705.8823529412,
+ 4,
+ 0
+ ],
+ [
+ 21882.3529411765,
+ 7,
+ 0
+ ],
+ [
+ 22235.2941176471,
+ 4,
+ 0
+ ],
+ [
+ 22411.7647058824,
+ 7,
+ 0
+ ],
+ [
+ 21529.4117647059,
+ 5,
+ 0
+ ],
+ [
+ 22058.8235294118,
+ 5,
+ 0
+ ],
+ [
+ 21176.4705882353,
+ 3,
+ 0
+ ],
+ [
+ 21441.1764705882,
+ 0,
+ 0
+ ],
+ [
+ 21485.2941176471,
+ 3,
+ 0
+ ],
+ [
+ 21352.9411764706,
+ 2,
+ 0
+ ],
+ [
+ 21705.8823529412,
+ 2,
+ 0
+ ],
+ [
+ 21794.1176470588,
+ 1,
+ 0
+ ],
+ [
+ 21970.5882352941,
+ 2,
+ 0
+ ],
+ [
+ 22058.8235294118,
+ 1,
+ 0
+ ],
+ [
+ 22235.2941176471,
+ 2,
+ 0
+ ],
+ [
+ 22323.5294117647,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 33882.3529411765,
+ 2,
+ 0
+ ],
+ [
+ 33970.5882352941,
+ 1,
+ 0
+ ],
+ [
+ 34147.0588235294,
+ 1,
+ 0
+ ],
+ [
+ 34235.2941176471,
+ 2,
+ 0
+ ],
+ [
+ 34500,
+ 2,
+ 0
+ ],
+ [
+ 34764.7058823529,
+ 2,
+ 0
+ ],
+ [
+ 35029.4117647059,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 35294.1176470588,
+ 2,
+ 176.470588235294
+ ],
+ [
+ 35647.0588235294,
+ 2,
+ 0
+ ],
+ [
+ 36441.1764705882,
+ 3,
+ 0
+ ],
+ [
+ 36617.6470588235,
+ 3,
+ 0
+ ],
+ [
+ 36352.9411764706,
+ 1,
+ 0
+ ],
+ [
+ 36529.4117647059,
+ 1,
+ 0
+ ],
+ [
+ 36000,
+ 0,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 36705.8823529412,
+ 0,
+ 0
+ ],
+ [
+ 36882.3529411765,
+ 0,
+ 0
+ ],
+ [
+ 37058.8235294118,
+ 2,
+ 0
+ ],
+ [
+ 37235.294117647,
+ 2,
+ 0
+ ],
+ [
+ 37411.7647058823,
+ 0,
+ 0
+ ],
+ [
+ 37588.2352941176,
+ 1,
+ 0
+ ],
+ [
+ 37764.7058823529,
+ 2,
+ 0
+ ],
+ [
+ 38029.4117647059,
+ 2,
+ 0
+ ],
+ [
+ 37897.0588235294,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 38117.6470588235,
+ 3,
+ 264.705882352941
+ ],
+ [
+ 38117.6470588235,
+ 1,
+ 264.705882352941
+ ],
+ [
+ 38470.5882352941,
+ 0,
+ 0
+ ],
+ [
+ 38470.5882352941,
+ 2,
+ 0
+ ],
+ [
+ 38558.8235294118,
+ 2,
+ 0
+ ],
+ [
+ 38558.8235294118,
+ 0,
+ 0
+ ],
+ [
+ 38647.0588235294,
+ 0,
+ 0
+ ],
+ [
+ 38647.0588235294,
+ 2,
+ 0
+ ],
+ [
+ 38735.294117647,
+ 2,
+ 0
+ ],
+ [
+ 38735.294117647,
+ 0,
+ 0
+ ],
+ [
+ 38823.5294117647,
+ 3,
+ 617.647058823529
+ ],
+ [
+ 38823.5294117647,
+ 1,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 39529.4117647059,
+ 2,
+ 0
+ ],
+ [
+ 39705.8823529412,
+ 2,
+ 0
+ ],
+ [
+ 39617.6470588235,
+ 7,
+ 0
+ ],
+ [
+ 39794.1176470588,
+ 7,
+ 0
+ ],
+ [
+ 39529.4117647059,
+ 4,
+ 0
+ ],
+ [
+ 39705.8823529412,
+ 4,
+ 0
+ ],
+ [
+ 39882.3529411765,
+ 1,
+ 0
+ ],
+ [
+ 40235.294117647,
+ 1,
+ 0
+ ],
+ [
+ 40323.5294117647,
+ 3,
+ 0
+ ],
+ [
+ 40411.7647058823,
+ 2,
+ 0
+ ],
+ [
+ 40588.2352941176,
+ 0,
+ 0
+ ],
+ [
+ 40764.7058823529,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 40941.1764705882,
+ 2,
+ 0
+ ],
+ [
+ 41029.4117647059,
+ 1,
+ 0
+ ],
+ [
+ 41117.6470588235,
+ 0,
+ 0
+ ],
+ [
+ 41205.8823529412,
+ 3,
+ 0
+ ],
+ [
+ 41294.1176470588,
+ 2,
+ 0
+ ],
+ [
+ 41382.3529411765,
+ 1,
+ 0
+ ],
+ [
+ 41470.5882352941,
+ 0,
+ 0
+ ],
+ [
+ 41558.8235294117,
+ 1,
+ 0
+ ],
+ [
+ 41647.0588235294,
+ 2,
+ 0
+ ],
+ [
+ 41735.294117647,
+ 1,
+ 0
+ ],
+ [
+ 41823.5294117647,
+ 3,
+ 0
+ ],
+ [
+ 41911.7647058823,
+ 0,
+ 0
+ ],
+ [
+ 42000,
+ 2,
+ 0
+ ],
+ [
+ 42088.2352941176,
+ 3,
+ 0
+ ],
+ [
+ 42176.4705882353,
+ 0,
+ 0
+ ],
+ [
+ 42264.7058823529,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 42352.9411764706,
+ 0,
+ 0
+ ],
+ [
+ 42529.4117647059,
+ 0,
+ 0
+ ],
+ [
+ 42705.8823529412,
+ 2,
+ 0
+ ],
+ [
+ 42882.3529411764,
+ 2,
+ 0
+ ],
+ [
+ 43058.8235294117,
+ 0,
+ 0
+ ],
+ [
+ 43235.294117647,
+ 3,
+ 0
+ ],
+ [
+ 43411.7647058823,
+ 2,
+ 0
+ ],
+ [
+ 43588.2352941176,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 43764.7058823529,
+ 3,
+ 264.705882352941
+ ],
+ [
+ 43764.7058823529,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 44117.6470588235,
+ 1,
+ 264.705882352941
+ ],
+ [
+ 44470.5882352941,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 44823.5294117647,
+ 3,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 45176.4705882353,
+ 3,
+ 0
+ ],
+ [
+ 45264.7058823529,
+ 0,
+ 0
+ ],
+ [
+ 45352.9411764706,
+ 3,
+ 0
+ ],
+ [
+ 45441.1764705882,
+ 0,
+ 0
+ ],
+ [
+ 45529.4117647059,
+ 3,
+ 0
+ ],
+ [
+ 45882.3529411764,
+ 3,
+ 0
+ ],
+ [
+ 46235.294117647,
+ 3,
+ 264.705882352941
+ ],
+ [
+ 46411.7647058823,
+ 1,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 46588.2352941176,
+ 0,
+ 0
+ ],
+ [
+ 46764.7058823529,
+ 1,
+ 0
+ ],
+ [
+ 46941.1764705882,
+ 3,
+ 0
+ ],
+ [
+ 47205.8823529411,
+ 2,
+ 0
+ ],
+ [
+ 47294.1176470588,
+ 0,
+ 0
+ ],
+ [
+ 47470.5882352941,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 47823.5294117647,
+ 1,
+ 0
+ ],
+ [
+ 47911.7647058823,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 48000,
+ 1,
+ 0
+ ],
+ [
+ 48176.4705882353,
+ 1,
+ 0
+ ],
+ [
+ 48352.9411764706,
+ 1,
+ 0
+ ],
+ [
+ 48441.1764705882,
+ 3,
+ 0
+ ],
+ [
+ 48529.4117647058,
+ 1,
+ 0
+ ],
+ [
+ 48617.6470588235,
+ 3,
+ 0
+ ],
+ [
+ 48705.8823529411,
+ 1,
+ 0
+ ],
+ [
+ 48794.1176470588,
+ 3,
+ 0
+ ],
+ [
+ 48882.3529411764,
+ 1,
+ 0
+ ],
+ [
+ 49058.8235294117,
+ 1,
+ 0
+ ],
+ [
+ 49235.294117647,
+ 1,
+ 0
+ ],
+ [
+ 49323.5294117647,
+ 3,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 49411.7647058823,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 49764.7058823529,
+ 2,
+ 0
+ ],
+ [
+ 49808.8235294117,
+ 1,
+ 0
+ ],
+ [
+ 49852.9411764706,
+ 0,
+ 0
+ ],
+ [
+ 49897.0588235294,
+ 1,
+ 0
+ ],
+ [
+ 49941.1764705882,
+ 2,
+ 0
+ ],
+ [
+ 49985.294117647,
+ 3,
+ 0
+ ],
+ [
+ 50029.4117647058,
+ 2,
+ 0
+ ],
+ [
+ 50073.5294117647,
+ 1,
+ 0
+ ],
+ [
+ 50117.6470588235,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 50470.5882352941,
+ 3,
+ 0
+ ],
+ [
+ 50558.8235294117,
+ 3,
+ 0
+ ],
+ [
+ 50647.0588235294,
+ 3,
+ 0
+ ],
+ [
+ 50735.294117647,
+ 3,
+ 0
+ ],
+ [
+ 50691.1764705882,
+ 0,
+ 0
+ ],
+ [
+ 50779.4117647058,
+ 0,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 50911.7647058823,
+ 0,
+ 0
+ ],
+ [
+ 51088.2352941176,
+ 0,
+ 0
+ ],
+ [
+ 50823.5294117647,
+ 2,
+ 0
+ ],
+ [
+ 51000,
+ 2,
+ 0
+ ],
+ [
+ 51176.4705882353,
+ 2,
+ 0
+ ],
+ [
+ 51529.4117647058,
+ 2,
+ 0
+ ],
+ [
+ 51882.3529411764,
+ 2,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 52235.294117647,
+ 2,
+ 0
+ ],
+ [
+ 52411.7647058823,
+ 0,
+ 0
+ ],
+ [
+ 52588.2352941176,
+ 2,
+ 0
+ ],
+ [
+ 52764.7058823529,
+ 3,
+ 0
+ ],
+ [
+ 52941.1764705882,
+ 2,
+ 0
+ ],
+ [
+ 53117.6470588235,
+ 0,
+ 0
+ ],
+ [
+ 53294.1176470588,
+ 2,
+ 0
+ ],
+ [
+ 53470.5882352941,
+ 3,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 53647.0588235294,
+ 1,
+ 0
+ ],
+ [
+ 53823.5294117647,
+ 1,
+ 0
+ ],
+ [
+ 53999.9999999999,
+ 2,
+ 0
+ ],
+ [
+ 54088.2352941176,
+ 3,
+ 0
+ ],
+ [
+ 54176.4705882352,
+ 1,
+ 0
+ ],
+ [
+ 54529.4117647058,
+ 2,
+ 0
+ ],
+ [
+ 54882.3529411764,
+ 2,
+ 0
+ ],
+ [
+ 54352.9411764705,
+ 0,
+ 0
+ ],
+ [
+ 54705.8823529411,
+ 0,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 55058.8235294117,
+ 0,
+ 617.647058823529
+ ],
+ [
+ 55764.7058823529,
+ 2,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 56470.5882352941,
+ 1,
+ 1323.52941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 67764.7058823529,
+ 0,
+ 176.470588235294
+ ],
+ [
+ 68294.1176470588,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 68647.0588235293,
+ 3,
+ 0
+ ],
+ [
+ 68823.5294117646,
+ 2,
+ 88.2352941176471
+ ],
+ [
+ 68999.9999999999,
+ 0,
+ 0
+ ],
+ [
+ 69044.1176470588,
+ 2,
+ 0
+ ],
+ [
+ 69088.2352941176,
+ 0,
+ 0
+ ],
+ [
+ 69132.3529411764,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 69176.4705882352,
+ 3,
+ 0
+ ],
+ [
+ 69529.4117647058,
+ 3,
+ 0
+ ],
+ [
+ 69617.6470588235,
+ 1,
+ 0
+ ],
+ [
+ 69794.1176470587,
+ 1,
+ 0
+ ],
+ [
+ 69882.3529411764,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 70058.8235294117,
+ 3,
+ 0
+ ],
+ [
+ 70411.7647058823,
+ 1,
+ 0
+ ],
+ [
+ 70411.7647058823,
+ 2,
+ 0
+ ],
+ [
+ 70411.7647058823,
+ 3,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 70588.2352941176,
+ 2,
+ 176.470588235294
+ ],
+ [
+ 71117.6470588235,
+ 3,
+ 0
+ ],
+ [
+ 71294.1176470587,
+ 2,
+ 0
+ ],
+ [
+ 71249.9999999999,
+ 1,
+ 0
+ ],
+ [
+ 71470.588235294,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 71823.5294117646,
+ 3,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 71999.9999999999,
+ 2,
+ 176.470588235294
+ ],
+ [
+ 72352.9411764705,
+ 2,
+ 0
+ ],
+ [
+ 72441.1764705882,
+ 0,
+ 0
+ ],
+ [
+ 72529.4117647058,
+ 1,
+ 0
+ ],
+ [
+ 72882.3529411764,
+ 2,
+ 0
+ ],
+ [
+ 73058.8235294117,
+ 0,
+ 0
+ ],
+ [
+ 73235.294117647,
+ 1,
+ 0
+ ],
+ [
+ 72882.3529411764,
+ 1,
+ 0
+ ],
+ [
+ 73058.8235294117,
+ 3,
+ 0
+ ],
+ [
+ 73235.294117647,
+ 3,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 73411.7647058823,
+ 0,
+ 176.470588235294
+ ],
+ [
+ 73852.9411764705,
+ 0,
+ 0
+ ],
+ [
+ 73874.9999999999,
+ 1,
+ 0
+ ],
+ [
+ 73897.0588235293,
+ 2,
+ 0
+ ],
+ [
+ 73919.1176470587,
+ 3,
+ 0
+ ],
+ [
+ 74117.6470588234,
+ 0,
+ 0
+ ],
+ [
+ 74294.1176470587,
+ 2,
+ 0
+ ],
+ [
+ 74382.3529411764,
+ 0,
+ 0
+ ],
+ [
+ 74205.8823529411,
+ 3,
+ 0
+ ],
+ [
+ 74426.4705882352,
+ 3,
+ 0
+ ],
+ [
+ 74470.588235294,
+ 0,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 74823.5294117646,
+ 2,
+ 0
+ ],
+ [
+ 75220.588235294,
+ 0,
+ 0
+ ],
+ [
+ 75308.8235294117,
+ 0,
+ 0
+ ],
+ [
+ 75176.4705882352,
+ 1,
+ 0
+ ],
+ [
+ 75264.7058823528,
+ 1,
+ 0
+ ],
+ [
+ 75352.9411764705,
+ 1,
+ 0
+ ],
+ [
+ 75397.0588235293,
+ 0,
+ 0
+ ],
+ [
+ 75441.1764705881,
+ 1,
+ 0
+ ],
+ [
+ 75485.294117647,
+ 0,
+ 0
+ ],
+ [
+ 75529.4117647058,
+ 2,
+ 0
+ ],
+ [
+ 75705.8823529411,
+ 2,
+ 0
+ ],
+ [
+ 76058.8235294117,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 76235.294117647,
+ 0,
+ 0
+ ],
+ [
+ 76411.7647058823,
+ 0,
+ 0
+ ],
+ [
+ 76588.2352941175,
+ 3,
+ 0
+ ],
+ [
+ 76764.7058823528,
+ 0,
+ 0
+ ],
+ [
+ 76941.1764705881,
+ 3,
+ 0
+ ],
+ [
+ 77117.6470588234,
+ 2,
+ 0
+ ],
+ [
+ 77294.1176470587,
+ 0,
+ 0
+ ],
+ [
+ 77470.588235294,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 77647.0588235293,
+ 2,
+ 441.176470588235
+ ],
+ [
+ 78176.4705882352,
+ 3,
+ 0
+ ],
+ [
+ 78352.9411764705,
+ 2,
+ 529.411764705882
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 79058.8235294118,
+ 2,
+ 0
+ ],
+ [
+ 79588.2352941177,
+ 2,
+ 0
+ ],
+ [
+ 79764.7058823529,
+ 3,
+ 0
+ ],
+ [
+ 79941.1764705882,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 80470.5882352941,
+ 3,
+ 0
+ ],
+ [
+ 80647.0588235294,
+ 1,
+ 0
+ ],
+ [
+ 81352.9411764706,
+ 1,
+ 0
+ ],
+ [
+ 81705.8823529412,
+ 3,
+ 0
+ ],
+ [
+ 81529.4117647059,
+ 0,
+ 0
+ ],
+ [
+ 80823.5294117646,
+ 3,
+ 0
+ ],
+ [
+ 80999.9999999999,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 81882.3529411765,
+ 3,
+ 0
+ ],
+ [
+ 82147.0588235294,
+ 3,
+ 0
+ ],
+ [
+ 82411.7647058823,
+ 3,
+ 0
+ ],
+ [
+ 82676.4705882353,
+ 3,
+ 0
+ ],
+ [
+ 82941.1764705882,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 83117.6470588235,
+ 3,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 83294.1176470588,
+ 1,
+ 0
+ ],
+ [
+ 83470.5882352941,
+ 2,
+ 0
+ ],
+ [
+ 83647.0588235294,
+ 1,
+ 0
+ ],
+ [
+ 83823.5294117647,
+ 2,
+ 0
+ ],
+ [
+ 84176.4705882353,
+ 2,
+ 0
+ ],
+ [
+ 84352.9411764706,
+ 3,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 84705.8823529412,
+ 3,
+ 0
+ ],
+ [
+ 84794.1176470588,
+ 1,
+ 0
+ ],
+ [
+ 84882.3529411765,
+ 2,
+ 0
+ ],
+ [
+ 84970.5882352941,
+ 0,
+ 0
+ ],
+ [
+ 85058.8235294118,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 85411.7647058823,
+ 3,
+ 0
+ ],
+ [
+ 85588.2352941177,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 86117.6470588235,
+ 3,
+ 0
+ ],
+ [
+ 86294.1176470588,
+ 1,
+ 0
+ ],
+ [
+ 86470.5882352941,
+ 3,
+ 0
+ ],
+ [
+ 87000,
+ 1,
+ 0
+ ],
+ [
+ 86647.0588235294,
+ 1,
+ 176.470588235294
+ ],
+ [
+ 87176.4705882353,
+ 3,
+ 0
+ ],
+ [
+ 87352.9411764706,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 87529.4117647059,
+ 1,
+ 0
+ ],
+ [
+ 88058.8235294118,
+ 3,
+ 0
+ ],
+ [
+ 88147.0588235294,
+ 1,
+ 0
+ ],
+ [
+ 88235.294117647,
+ 3,
+ 0
+ ],
+ [
+ 88323.5294117647,
+ 2,
+ 0
+ ],
+ [
+ 88411.7647058823,
+ 0,
+ 0
+ ],
+ [
+ 88588.2352941177,
+ 3,
+ 0
+ ],
+ [
+ 88676.4705882353,
+ 2,
+ 0
+ ],
+ [
+ 88764.7058823529,
+ 1,
+ 0
+ ],
+ [
+ 88852.9411764706,
+ 0,
+ 0
+ ],
+ [
+ 87705.8823529412,
+ 7,
+ 0
+ ],
+ [
+ 88058.8235294118,
+ 7,
+ 0
+ ],
+ [
+ 88235.294117647,
+ 6,
+ 0
+ ],
+ [
+ 88411.7647058823,
+ 4,
+ 0
+ ],
+ [
+ 88588.2352941177,
+ 7,
+ 0
+ ],
+ [
+ 88764.7058823529,
+ 5,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 88941.1764705882,
+ 1,
+ 0
+ ],
+ [
+ 89117.6470588235,
+ 2,
+ 0
+ ],
+ [
+ 89558.8235294118,
+ 2,
+ 0
+ ],
+ [
+ 89294.1176470588,
+ 1,
+ 0
+ ],
+ [
+ 89823.5294117647,
+ 2,
+ 0
+ ],
+ [
+ 90176.4705882353,
+ 1,
+ 0
+ ],
+ [
+ 88941.1764705882,
+ 4,
+ 0
+ ],
+ [
+ 89117.6470588235,
+ 7,
+ 0
+ ],
+ [
+ 89470.5882352941,
+ 4,
+ 0
+ ],
+ [
+ 89647.0588235294,
+ 7,
+ 0
+ ],
+ [
+ 90000,
+ 4,
+ 0
+ ],
+ [
+ 90176.4705882353,
+ 7,
+ 0
+ ],
+ [
+ 89294.1176470588,
+ 5,
+ 0
+ ],
+ [
+ 89823.5294117647,
+ 5,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 90352.9411764706,
+ 2,
+ 0
+ ],
+ [
+ 90882.3529411765,
+ 2,
+ 0
+ ],
+ [
+ 91058.8235294118,
+ 3,
+ 0
+ ],
+ [
+ 91235.294117647,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 91764.7058823529,
+ 3,
+ 0
+ ],
+ [
+ 91941.1764705882,
+ 1,
+ 0
+ ],
+ [
+ 92647.0588235294,
+ 1,
+ 0
+ ],
+ [
+ 93000,
+ 3,
+ 0
+ ],
+ [
+ 92823.5294117647,
+ 0,
+ 0
+ ],
+ [
+ 92117.6470588234,
+ 3,
+ 0
+ ],
+ [
+ 92294.1176470587,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 93176.4705882353,
+ 3,
+ 0
+ ],
+ [
+ 93441.1764705882,
+ 3,
+ 0
+ ],
+ [
+ 93705.8823529412,
+ 3,
+ 0
+ ],
+ [
+ 93970.5882352941,
+ 3,
+ 0
+ ],
+ [
+ 94235.294117647,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 94411.7647058823,
+ 3,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 94588.2352941177,
+ 1,
+ 0
+ ],
+ [
+ 94764.7058823529,
+ 2,
+ 0
+ ],
+ [
+ 94941.1764705882,
+ 1,
+ 0
+ ],
+ [
+ 95117.6470588235,
+ 2,
+ 0
+ ],
+ [
+ 95205.8823529412,
+ 1,
+ 0
+ ],
+ [
+ 95382.3529411765,
+ 2,
+ 0
+ ],
+ [
+ 95911.7647058823,
+ 3,
+ 0
+ ],
+ [
+ 95470.5882352941,
+ 1,
+ 352.941176470588
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 96000,
+ 3,
+ 0
+ ],
+ [
+ 96088.2352941177,
+ 1,
+ 0
+ ],
+ [
+ 96176.4705882353,
+ 2,
+ 0
+ ],
+ [
+ 96264.7058823529,
+ 0,
+ 0
+ ],
+ [
+ 96352.9411764706,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 96705.8823529412,
+ 3,
+ 0
+ ],
+ [
+ 96882.3529411765,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 97411.7647058823,
+ 3,
+ 0
+ ],
+ [
+ 97588.2352941177,
+ 1,
+ 0
+ ],
+ [
+ 97764.7058823529,
+ 3,
+ 0
+ ],
+ [
+ 98294.1176470588,
+ 1,
+ 0
+ ],
+ [
+ 97941.1764705882,
+ 1,
+ 176.470588235294
+ ],
+ [
+ 98470.5882352941,
+ 3,
+ 0
+ ],
+ [
+ 98647.0588235294,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 99352.9411764706,
+ 3,
+ 0
+ ],
+ [
+ 99441.1764705882,
+ 1,
+ 0
+ ],
+ [
+ 99705.8823529412,
+ 0,
+ 0
+ ],
+ [
+ 99882.3529411765,
+ 3,
+ 0
+ ],
+ [
+ 99000,
+ 7,
+ 0
+ ],
+ [
+ 99352.9411764706,
+ 7,
+ 0
+ ],
+ [
+ 99529.4117647059,
+ 6,
+ 0
+ ],
+ [
+ 99705.8823529412,
+ 4,
+ 0
+ ],
+ [
+ 99882.3529411765,
+ 7,
+ 0
+ ],
+ [
+ 100058.823529412,
+ 5,
+ 0
+ ],
+ [
+ 98823.5294117647,
+ 0,
+ 0
+ ],
+ [
+ 98911.7647058823,
+ 3,
+ 0
+ ],
+ [
+ 99000,
+ 0,
+ 0
+ ],
+ [
+ 99088.2352941177,
+ 3,
+ 0
+ ],
+ [
+ 99529.4117647059,
+ 2,
+ 0
+ ],
+ [
+ 99882.3529411765,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 100588.235294118,
+ 1,
+ 0
+ ],
+ [
+ 100235.294117647,
+ 4,
+ 0
+ ],
+ [
+ 100411.764705882,
+ 7,
+ 0
+ ],
+ [
+ 100764.705882353,
+ 4,
+ 0
+ ],
+ [
+ 100941.176470588,
+ 7,
+ 0
+ ],
+ [
+ 101294.117647059,
+ 4,
+ 0
+ ],
+ [
+ 101470.588235294,
+ 7,
+ 0
+ ],
+ [
+ 100588.235294118,
+ 5,
+ 0
+ ],
+ [
+ 101117.647058824,
+ 5,
+ 0
+ ],
+ [
+ 100235.294117647,
+ 3,
+ 0
+ ],
+ [
+ 100500,
+ 0,
+ 0
+ ],
+ [
+ 100544.117647059,
+ 3,
+ 0
+ ],
+ [
+ 100411.764705882,
+ 2,
+ 0
+ ],
+ [
+ 100764.705882353,
+ 2,
+ 0
+ ],
+ [
+ 100852.941176471,
+ 1,
+ 0
+ ],
+ [
+ 101029.411764706,
+ 2,
+ 0
+ ],
+ [
+ 101117.647058824,
+ 1,
+ 0
+ ],
+ [
+ 101294.117647059,
+ 2,
+ 0
+ ],
+ [
+ 101382.352941176,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 101647.058823529,
+ 3,
+ 0
+ ],
+ [
+ 102000,
+ 1,
+ 0
+ ],
+ [
+ 102264.705882353,
+ 1,
+ 0
+ ],
+ [
+ 102529.411764706,
+ 1,
+ 0
+ ],
+ [
+ 102794.117647059,
+ 1,
+ 0
+ ],
+ [
+ 101693.382352941,
+ 0,
+ 0
+ ],
+ [
+ 101953.676470588,
+ 0,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 103058.823529412,
+ 0,
+ 794.117647058823
+ ],
+ [
+ 103941.176470588,
+ 2,
+ 0
+ ],
+ [
+ 104117.647058823,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 104294.117647059,
+ 1,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 104470.588235294,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 104823.529411765,
+ 3,
+ 264.705882352941
+ ],
+ [
+ 105176.470588235,
+ 1,
+ 264.705882352941
+ ],
+ [
+ 105529.411764706,
+ 0,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 105882.352941176,
+ 3,
+ 264.705882352941
+ ],
+ [
+ 106235.294117647,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 106588.235294117,
+ 2,
+ 0
+ ],
+ [
+ 106764.705882353,
+ 3,
+ 0
+ ],
+ [
+ 106941.176470588,
+ 2,
+ 0
+ ],
+ [
+ 107117.647058823,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 107294.117647059,
+ 1,
+ 0
+ ],
+ [
+ 107470.588235294,
+ 1,
+ 0
+ ],
+ [
+ 107647.058823529,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 108000,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 108352.94117647,
+ 1,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 108705.882352941,
+ 2,
+ 176.470588235294
+ ],
+ [
+ 109058.823529412,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 109411.764705882,
+ 3,
+ 264.705882352941
+ ],
+ [
+ 109764.705882353,
+ 2,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 110470.588235294,
+ 3,
+ 264.705882352941
+ ],
+ [
+ 110823.529411765,
+ 1,
+ 264.705882352941
+ ],
+ [
+ 111176.470588235,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 110117.647058823,
+ 1,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 111529.411764706,
+ 3,
+ 264.705882352941
+ ],
+ [
+ 111882.352941176,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 112235.294117647,
+ 1,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 112941.176470588,
+ 3,
+ 0
+ ],
+ [
+ 113029.411764706,
+ 2,
+ 0
+ ],
+ [
+ 113117.647058823,
+ 3,
+ 0
+ ],
+ [
+ 113294.117647059,
+ 2,
+ 0
+ ],
+ [
+ 113382.352941176,
+ 2,
+ 0
+ ],
+ [
+ 113338.235294117,
+ 0,
+ 0
+ ],
+ [
+ 113316.176470588,
+ 3,
+ 0
+ ],
+ [
+ 113404.411764706,
+ 3,
+ 0
+ ],
+ [
+ 113360.294117647,
+ 1,
+ 0
+ ],
+ [
+ 113426.470588235,
+ 0,
+ 0
+ ],
+ [
+ 113448.529411765,
+ 1,
+ 0
+ ],
+ [
+ 113470.588235294,
+ 2,
+ 0
+ ],
+ [
+ 113492.647058823,
+ 3,
+ 0
+ ],
+ [
+ 113514.705882353,
+ 0,
+ 0
+ ],
+ [
+ 113536.764705882,
+ 1,
+ 0
+ ],
+ [
+ 113558.823529412,
+ 2,
+ 0
+ ],
+ [
+ 113580.882352941,
+ 3,
+ 0
+ ],
+ [
+ 113647.058823529,
+ 0,
+ 0
+ ],
+ [
+ 113735.294117647,
+ 2,
+ 0
+ ],
+ [
+ 113823.529411765,
+ 1,
+ 0
+ ],
+ [
+ 113911.764705882,
+ 2,
+ 0
+ ],
+ [
+ 114000,
+ 3,
+ 264.705882352941
+ ],
+ [
+ 114088.235294117,
+ 1,
+ 0
+ ],
+ [
+ 114176.470588235,
+ 0,
+ 0
+ ],
+ [
+ 114264.705882353,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 114352.94117647,
+ 0,
+ 0
+ ],
+ [
+ 114529.411764706,
+ 0,
+ 0
+ ],
+ [
+ 114617.647058823,
+ 2,
+ 0
+ ],
+ [
+ 114794.117647059,
+ 2,
+ 0
+ ],
+ [
+ 114882.352941176,
+ 1,
+ 0
+ ],
+ [
+ 114705.882352941,
+ 3,
+ 0
+ ],
+ [
+ 114441.176470588,
+ 1,
+ 0
+ ],
+ [
+ 114970.588235294,
+ 2,
+ 0
+ ],
+ [
+ 115147.058823529,
+ 3,
+ 0
+ ],
+ [
+ 115235.294117647,
+ 2,
+ 0
+ ],
+ [
+ 115323.529411765,
+ 0,
+ 0
+ ],
+ [
+ 115058.823529412,
+ 2,
+ 0
+ ],
+ [
+ 115411.764705882,
+ 1,
+ 264.705882352941
+ ],
+ [
+ 115500,
+ 2,
+ 0
+ ],
+ [
+ 115588.235294117,
+ 2,
+ 0
+ ],
+ [
+ 115676.470588235,
+ 2,
+ 0
+ ],
+ [
+ 115235.294117647,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 115764.705882353,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 115764.705882353,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 116117.647058823,
+ 1,
+ 0
+ ],
+ [
+ 116205.882352941,
+ 1,
+ 0
+ ],
+ [
+ 116155.147058823,
+ 3,
+ 0
+ ],
+ [
+ 116252.205882353,
+ 3,
+ 0
+ ],
+ [
+ 116294.117647059,
+ 1,
+ 0
+ ],
+ [
+ 116351.470588235,
+ 3,
+ 0
+ ],
+ [
+ 116382.352941176,
+ 1,
+ 0
+ ],
+ [
+ 116470.588235294,
+ 2,
+ 176.470588235294
+ ],
+ [
+ 116470.588235294,
+ 0,
+ 176.470588235294
+ ],
+ [
+ 116823.529411765,
+ 2,
+ 176.470588235294
+ ],
+ [
+ 116823.529411765,
+ 0,
+ 176.470588235294
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 117176.470588235,
+ 2,
+ 617.647058823529
+ ],
+ [
+ 117176.470588235,
+ 3,
+ 617.647058823529
+ ],
+ [
+ 117882.352941176,
+ 0,
+ 0
+ ],
+ [
+ 118058.823529412,
+ 2,
+ 0
+ ],
+ [
+ 118235.294117647,
+ 0,
+ 0
+ ],
+ [
+ 118411.764705882,
+ 1,
+ 0
+ ],
+ [
+ 118058.823529412,
+ 3,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 118588.235294117,
+ 2,
+ 0
+ ],
+ [
+ 118676.470588235,
+ 1,
+ 0
+ ],
+ [
+ 118764.705882353,
+ 2,
+ 0
+ ],
+ [
+ 118852.94117647,
+ 2,
+ 0
+ ],
+ [
+ 118941.176470588,
+ 1,
+ 0
+ ],
+ [
+ 119029.411764706,
+ 0,
+ 0
+ ],
+ [
+ 119117.647058823,
+ 1,
+ 0
+ ],
+ [
+ 119382.352941176,
+ 1,
+ 0
+ ],
+ [
+ 119558.823529412,
+ 1,
+ 0
+ ],
+ [
+ 119205.882352941,
+ 3,
+ 0
+ ],
+ [
+ 119294.117647059,
+ 0,
+ 0
+ ],
+ [
+ 119470.588235294,
+ 3,
+ 0
+ ],
+ [
+ 119647.058823529,
+ 2,
+ 0
+ ],
+ [
+ 119735.294117647,
+ 0,
+ 0
+ ],
+ [
+ 119823.529411765,
+ 3,
+ 0
+ ],
+ [
+ 119911.764705882,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 120000,
+ 2,
+ 0
+ ],
+ [
+ 120088.235294117,
+ 3,
+ 0
+ ],
+ [
+ 120176.470588235,
+ 2,
+ 0
+ ],
+ [
+ 120264.705882353,
+ 1,
+ 0
+ ],
+ [
+ 120352.94117647,
+ 0,
+ 0
+ ],
+ [
+ 120441.176470588,
+ 1,
+ 0
+ ],
+ [
+ 120529.411764706,
+ 3,
+ 0
+ ],
+ [
+ 120617.647058823,
+ 1,
+ 0
+ ],
+ [
+ 120705.882352941,
+ 0,
+ 0
+ ],
+ [
+ 120794.117647059,
+ 3,
+ 0
+ ],
+ [
+ 120882.352941176,
+ 1,
+ 0
+ ],
+ [
+ 120970.588235294,
+ 2,
+ 0
+ ],
+ [
+ 121058.823529412,
+ 0,
+ 0
+ ],
+ [
+ 121147.058823529,
+ 1,
+ 0
+ ],
+ [
+ 121323.529411764,
+ 1,
+ 0
+ ],
+ [
+ 121235.294117647,
+ 0,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 121411.764705882,
+ 2,
+ 1147.05882352941
+ ],
+ [
+ 121411.764705882,
+ 3,
+ 1147.05882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 122823.529411764,
+ 2,
+ 529.411764705882
+ ],
+ [
+ 123529.411764706,
+ 3,
+ 617.647058823529
+ ],
+ [
+ 123529.411764706,
+ 2,
+ 617.647058823529
+ ],
+ [
+ 122823.529411764,
+ 0,
+ 529.411764705882
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 124235.294117647,
+ 0,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 125647.058823529,
+ 1,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 127058.823529412,
+ 2,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 128470.588235294,
+ 3,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 129882.352941176,
+ 0,
+ 0
+ ],
+ [
+ 130235.294117647,
+ 0,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 131294.117647059,
+ 1,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 132705.882352941,
+ 2,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 134117.647058823,
+ 3,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 135529.411764706,
+ 0,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 136941.176470588,
+ 1,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 138352.94117647,
+ 2,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 139764.705882353,
+ 3,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 141176.470588235,
+ 0,
+ 0
+ ],
+ [
+ 141529.411764706,
+ 0,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 142588.235294117,
+ 1,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 144000,
+ 6,
+ 617.647058823529
+ ],
+ [
+ 144529.411764706,
+ 2,
+ 0
+ ],
+ [
+ 144705.882352941,
+ 2,
+ 0
+ ],
+ [
+ 144794.117647059,
+ 2,
+ 0
+ ],
+ [
+ 144882.352941176,
+ 0,
+ 0
+ ],
+ [
+ 145323.529411764,
+ 3,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 145411.764705882,
+ 7,
+ 617.647058823529
+ ],
+ [
+ 145411.764705882,
+ 1,
+ 0
+ ],
+ [
+ 145676.470588235,
+ 2,
+ 0
+ ],
+ [
+ 145852.94117647,
+ 2,
+ 0
+ ],
+ [
+ 146029.411764706,
+ 3,
+ 0
+ ],
+ [
+ 146205.882352941,
+ 3,
+ 0
+ ],
+ [
+ 146382.352941176,
+ 3,
+ 0
+ ],
+ [
+ 146558.823529411,
+ 3,
+ 0
+ ],
+ [
+ 146647.058823529,
+ 3,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 147264.705882353,
+ 1,
+ 88.2352941176471
+ ],
+ [
+ 146823.529411764,
+ 0,
+ 529.411764705882
+ ],
+ [
+ 147529.411764706,
+ 0,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 148235.294117647,
+ 1,
+ 529.411764705882
+ ],
+ [
+ 148676.470588235,
+ 2,
+ 88.2352941176471
+ ],
+ [
+ 148941.176470588,
+ 1,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 150000,
+ 3,
+ 0
+ ],
+ [
+ 150352.94117647,
+ 2,
+ 617.647058823529
+ ],
+ [
+ 149647.058823529,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 150088.235294117,
+ 1,
+ 0
+ ],
+ [
+ 150176.470588235,
+ 3,
+ 0
+ ],
+ [
+ 150264.705882353,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 151058.823529411,
+ 3,
+ 264.705882352941
+ ],
+ [
+ 151411.764705882,
+ 1,
+ 264.705882352941
+ ],
+ [
+ 151764.705882353,
+ 3,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 152470.588235294,
+ 0,
+ 0
+ ],
+ [
+ 153176.470588235,
+ 0,
+ 617.647058823529
+ ],
+ [
+ 152823.529411764,
+ 0,
+ 176.470588235294
+ ],
+ [
+ 152911.764705882,
+ 1,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 153882.352941176,
+ 1,
+ 529.411764705882
+ ],
+ [
+ 154323.529411764,
+ 2,
+ 88.2352941176471
+ ],
+ [
+ 154588.235294117,
+ 1,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 155294.117647059,
+ 2,
+ 1323.52941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 156705.882352941,
+ 3,
+ 1323.52941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 158558.823529411,
+ 1,
+ 88.2352941176471
+ ],
+ [
+ 158117.647058823,
+ 0,
+ 529.411764705882
+ ],
+ [
+ 158823.529411764,
+ 0,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 159529.411764706,
+ 1,
+ 529.411764705882
+ ],
+ [
+ 159970.588235294,
+ 2,
+ 88.2352941176471
+ ],
+ [
+ 160235.294117647,
+ 1,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 161294.117647059,
+ 3,
+ 0
+ ],
+ [
+ 160941.176470588,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 161382.352941176,
+ 1,
+ 0
+ ],
+ [
+ 161470.588235294,
+ 0,
+ 0
+ ],
+ [
+ 161558.823529411,
+ 1,
+ 0
+ ],
+ [
+ 161647.058823529,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 162000,
+ 0,
+ 0
+ ],
+ [
+ 162176.470588235,
+ 3,
+ 1500
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 163764.705882353,
+ 0,
+ 0
+ ],
+ [
+ 164470.588235294,
+ 0,
+ 617.647058823529
+ ],
+ [
+ 164117.647058823,
+ 0,
+ 176.470588235294
+ ],
+ [
+ 164205.882352941,
+ 1,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 165176.470588235,
+ 1,
+ 529.411764705882
+ ],
+ [
+ 165617.647058823,
+ 2,
+ 88.2352941176471
+ ],
+ [
+ 165882.352941176,
+ 1,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 166588.235294117,
+ 2,
+ 1323.52941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 168000,
+ 3,
+ 1323.52941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 169411.764705882,
+ 2,
+ 0
+ ],
+ [
+ 169941.176470588,
+ 2,
+ 0
+ ],
+ [
+ 170117.647058824,
+ 3,
+ 0
+ ],
+ [
+ 170294.117647059,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 170823.529411765,
+ 3,
+ 0
+ ],
+ [
+ 171000,
+ 1,
+ 0
+ ],
+ [
+ 171705.882352941,
+ 1,
+ 0
+ ],
+ [
+ 172058.823529412,
+ 3,
+ 0
+ ],
+ [
+ 171882.352941176,
+ 0,
+ 0
+ ],
+ [
+ 171176.470588235,
+ 3,
+ 0
+ ],
+ [
+ 171352.94117647,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 172235.294117647,
+ 3,
+ 0
+ ],
+ [
+ 172500,
+ 3,
+ 0
+ ],
+ [
+ 172764.705882353,
+ 3,
+ 0
+ ],
+ [
+ 173029.411764706,
+ 3,
+ 0
+ ],
+ [
+ 173294.117647059,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 173470.588235294,
+ 3,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 173647.058823529,
+ 1,
+ 0
+ ],
+ [
+ 173823.529411765,
+ 2,
+ 0
+ ],
+ [
+ 174000,
+ 1,
+ 0
+ ],
+ [
+ 174176.470588235,
+ 2,
+ 0
+ ],
+ [
+ 174529.411764706,
+ 2,
+ 0
+ ],
+ [
+ 174705.882352941,
+ 3,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 175058.823529412,
+ 3,
+ 0
+ ],
+ [
+ 175147.058823529,
+ 1,
+ 0
+ ],
+ [
+ 175235.294117647,
+ 2,
+ 0
+ ],
+ [
+ 175323.529411765,
+ 0,
+ 0
+ ],
+ [
+ 175411.764705882,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 175764.705882353,
+ 3,
+ 0
+ ],
+ [
+ 175941.176470588,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 176470.588235294,
+ 3,
+ 0
+ ],
+ [
+ 176647.058823529,
+ 1,
+ 0
+ ],
+ [
+ 176823.529411765,
+ 3,
+ 0
+ ],
+ [
+ 177352.941176471,
+ 1,
+ 0
+ ],
+ [
+ 177000,
+ 1,
+ 176.470588235294
+ ],
+ [
+ 177529.411764706,
+ 3,
+ 0
+ ],
+ [
+ 177705.882352941,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 177882.352941176,
+ 1,
+ 0
+ ],
+ [
+ 178411.764705882,
+ 3,
+ 0
+ ],
+ [
+ 178500,
+ 1,
+ 0
+ ],
+ [
+ 178588.235294118,
+ 3,
+ 0
+ ],
+ [
+ 178676.470588235,
+ 2,
+ 0
+ ],
+ [
+ 178764.705882353,
+ 0,
+ 0
+ ],
+ [
+ 178941.176470588,
+ 3,
+ 0
+ ],
+ [
+ 179029.411764706,
+ 2,
+ 0
+ ],
+ [
+ 179117.647058824,
+ 1,
+ 0
+ ],
+ [
+ 179205.882352941,
+ 0,
+ 0
+ ],
+ [
+ 178058.823529412,
+ 7,
+ 0
+ ],
+ [
+ 178411.764705882,
+ 7,
+ 0
+ ],
+ [
+ 178588.235294118,
+ 6,
+ 0
+ ],
+ [
+ 178764.705882353,
+ 4,
+ 0
+ ],
+ [
+ 178941.176470588,
+ 7,
+ 0
+ ],
+ [
+ 179117.647058824,
+ 5,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 179294.117647059,
+ 1,
+ 0
+ ],
+ [
+ 179470.588235294,
+ 2,
+ 0
+ ],
+ [
+ 179911.764705882,
+ 2,
+ 0
+ ],
+ [
+ 179647.058823529,
+ 1,
+ 0
+ ],
+ [
+ 180176.470588235,
+ 2,
+ 0
+ ],
+ [
+ 180529.411764706,
+ 1,
+ 0
+ ],
+ [
+ 179294.117647059,
+ 4,
+ 0
+ ],
+ [
+ 179470.588235294,
+ 7,
+ 0
+ ],
+ [
+ 179823.529411765,
+ 4,
+ 0
+ ],
+ [
+ 180000,
+ 7,
+ 0
+ ],
+ [
+ 180352.941176471,
+ 4,
+ 0
+ ],
+ [
+ 180529.411764706,
+ 7,
+ 0
+ ],
+ [
+ 179647.058823529,
+ 5,
+ 0
+ ],
+ [
+ 180176.470588235,
+ 5,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 180705.882352941,
+ 2,
+ 0
+ ],
+ [
+ 181235.294117647,
+ 2,
+ 0
+ ],
+ [
+ 181411.764705882,
+ 3,
+ 0
+ ],
+ [
+ 181588.235294118,
+ 0,
+ 441.176470588235
+ ],
+ [
+ 181058.823529411,
+ 6,
+ 0
+ ],
+ [
+ 181235.294117647,
+ 6,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 182117.647058824,
+ 3,
+ 0
+ ],
+ [
+ 182294.117647059,
+ 1,
+ 0
+ ],
+ [
+ 183000,
+ 1,
+ 0
+ ],
+ [
+ 183352.941176471,
+ 3,
+ 0
+ ],
+ [
+ 183176.470588235,
+ 0,
+ 0
+ ],
+ [
+ 182470.588235294,
+ 3,
+ 0
+ ],
+ [
+ 182647.058823529,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 183529.411764706,
+ 3,
+ 0
+ ],
+ [
+ 183794.117647059,
+ 3,
+ 0
+ ],
+ [
+ 184058.823529412,
+ 3,
+ 0
+ ],
+ [
+ 184323.529411765,
+ 3,
+ 0
+ ],
+ [
+ 184588.235294118,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 184764.705882353,
+ 3,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 184941.176470588,
+ 1,
+ 0
+ ],
+ [
+ 185117.647058824,
+ 2,
+ 0
+ ],
+ [
+ 185294.117647059,
+ 1,
+ 0
+ ],
+ [
+ 185470.588235294,
+ 2,
+ 0
+ ],
+ [
+ 185558.823529412,
+ 1,
+ 0
+ ],
+ [
+ 185735.294117647,
+ 2,
+ 0
+ ],
+ [
+ 186264.705882353,
+ 3,
+ 0
+ ],
+ [
+ 185823.529411765,
+ 1,
+ 352.941176470588
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 186352.941176471,
+ 3,
+ 0
+ ],
+ [
+ 186441.176470588,
+ 1,
+ 0
+ ],
+ [
+ 186529.411764706,
+ 2,
+ 0
+ ],
+ [
+ 186617.647058824,
+ 0,
+ 0
+ ],
+ [
+ 186705.882352941,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 187058.823529412,
+ 3,
+ 0
+ ],
+ [
+ 187235.294117647,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 187764.705882353,
+ 3,
+ 0
+ ],
+ [
+ 187941.176470588,
+ 1,
+ 0
+ ],
+ [
+ 188117.647058824,
+ 3,
+ 0
+ ],
+ [
+ 188647.058823529,
+ 1,
+ 0
+ ],
+ [
+ 188294.117647059,
+ 1,
+ 176.470588235294
+ ],
+ [
+ 188823.529411765,
+ 3,
+ 0
+ ],
+ [
+ 189000,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 189705.882352941,
+ 3,
+ 0
+ ],
+ [
+ 189794.117647059,
+ 1,
+ 0
+ ],
+ [
+ 190058.823529412,
+ 0,
+ 0
+ ],
+ [
+ 190235.294117647,
+ 3,
+ 0
+ ],
+ [
+ 189352.941176471,
+ 7,
+ 0
+ ],
+ [
+ 189705.882352941,
+ 7,
+ 0
+ ],
+ [
+ 189882.352941176,
+ 6,
+ 0
+ ],
+ [
+ 190058.823529412,
+ 4,
+ 0
+ ],
+ [
+ 190235.294117647,
+ 7,
+ 0
+ ],
+ [
+ 190411.764705882,
+ 5,
+ 0
+ ],
+ [
+ 189176.470588235,
+ 0,
+ 0
+ ],
+ [
+ 189264.705882353,
+ 3,
+ 0
+ ],
+ [
+ 189352.941176471,
+ 0,
+ 0
+ ],
+ [
+ 189441.176470588,
+ 3,
+ 0
+ ],
+ [
+ 189882.352941176,
+ 2,
+ 0
+ ],
+ [
+ 190235.294117647,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 190941.176470588,
+ 1,
+ 0
+ ],
+ [
+ 190588.235294118,
+ 4,
+ 0
+ ],
+ [
+ 190764.705882353,
+ 7,
+ 0
+ ],
+ [
+ 191117.647058824,
+ 4,
+ 0
+ ],
+ [
+ 191294.117647059,
+ 7,
+ 0
+ ],
+ [
+ 191647.058823529,
+ 4,
+ 0
+ ],
+ [
+ 191823.529411765,
+ 7,
+ 0
+ ],
+ [
+ 190941.176470588,
+ 5,
+ 0
+ ],
+ [
+ 191470.588235294,
+ 5,
+ 0
+ ],
+ [
+ 190588.235294118,
+ 3,
+ 0
+ ],
+ [
+ 190852.941176471,
+ 0,
+ 0
+ ],
+ [
+ 190897.058823529,
+ 3,
+ 0
+ ],
+ [
+ 190764.705882353,
+ 2,
+ 0
+ ],
+ [
+ 191117.647058824,
+ 2,
+ 0
+ ],
+ [
+ 191205.882352941,
+ 1,
+ 0
+ ],
+ [
+ 191382.352941176,
+ 2,
+ 0
+ ],
+ [
+ 191470.588235294,
+ 1,
+ 0
+ ],
+ [
+ 191647.058823529,
+ 2,
+ 0
+ ],
+ [
+ 191735.294117647,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 192000,
+ 2,
+ 0
+ ],
+ [
+ 192529.411764706,
+ 2,
+ 0
+ ],
+ [
+ 192705.882352941,
+ 3,
+ 0
+ ],
+ [
+ 192882.352941176,
+ 0,
+ 441.176470588235
+ ],
+ [
+ 192176.470588235,
+ 5,
+ 0
+ ],
+ [
+ 192352.94117647,
+ 5,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 193411.764705882,
+ 3,
+ 0
+ ],
+ [
+ 193588.235294118,
+ 1,
+ 0
+ ],
+ [
+ 194294.117647059,
+ 1,
+ 0
+ ],
+ [
+ 194647.058823529,
+ 3,
+ 0
+ ],
+ [
+ 194470.588235294,
+ 0,
+ 0
+ ],
+ [
+ 193764.705882353,
+ 3,
+ 0
+ ],
+ [
+ 193941.176470588,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 194823.529411765,
+ 3,
+ 0
+ ],
+ [
+ 195352.94117647,
+ 3,
+ 0
+ ],
+ [
+ 195529.411764705,
+ 2,
+ 0
+ ],
+ [
+ 195705.882352941,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 196235.294117647,
+ 1,
+ 0
+ ],
+ [
+ 196411.764705882,
+ 2,
+ 0
+ ],
+ [
+ 196588.235294118,
+ 1,
+ 0
+ ],
+ [
+ 196764.705882353,
+ 2,
+ 0
+ ],
+ [
+ 197117.647058823,
+ 2,
+ 0
+ ],
+ [
+ 197294.117647058,
+ 1,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 197647.058823529,
+ 3,
+ 0
+ ],
+ [
+ 197735.294117647,
+ 1,
+ 0
+ ],
+ [
+ 197823.529411765,
+ 2,
+ 0
+ ],
+ [
+ 197911.764705882,
+ 0,
+ 0
+ ],
+ [
+ 198000,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 198352.941176471,
+ 3,
+ 0
+ ],
+ [
+ 198529.411764706,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 199058.823529412,
+ 3,
+ 0
+ ],
+ [
+ 199235.294117647,
+ 1,
+ 0
+ ],
+ [
+ 199411.764705882,
+ 3,
+ 0
+ ],
+ [
+ 199941.176470588,
+ 1,
+ 0
+ ],
+ [
+ 199588.235294118,
+ 1,
+ 176.470588235294
+ ],
+ [
+ 200117.647058824,
+ 3,
+ 0
+ ],
+ [
+ 200294.117647059,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 201000,
+ 3,
+ 0
+ ],
+ [
+ 201352.941176471,
+ 0,
+ 0
+ ],
+ [
+ 200647.058823529,
+ 7,
+ 0
+ ],
+ [
+ 201000,
+ 7,
+ 0
+ ],
+ [
+ 201176.470588235,
+ 6,
+ 0
+ ],
+ [
+ 201352.941176471,
+ 4,
+ 0
+ ],
+ [
+ 201529.411764706,
+ 7,
+ 0
+ ],
+ [
+ 201705.882352941,
+ 5,
+ 0
+ ],
+ [
+ 200470.588235294,
+ 0,
+ 0
+ ],
+ [
+ 201088.235294117,
+ 1,
+ 0
+ ],
+ [
+ 201176.470588235,
+ 2,
+ 0
+ ],
+ [
+ 201044.117647058,
+ 0,
+ 0
+ ],
+ [
+ 201132.352941176,
+ 3,
+ 0
+ ],
+ [
+ 201529.411764705,
+ 2,
+ 0
+ ],
+ [
+ 201529.411764705,
+ 3,
+ 0
+ ],
+ [
+ 201617.647058823,
+ 1,
+ 0
+ ],
+ [
+ 201617.647058823,
+ 0,
+ 0
+ ],
+ [
+ 201705.882352941,
+ 3,
+ 0
+ ],
+ [
+ 201705.882352941,
+ 2,
+ 0
+ ],
+ [
+ 201794.117647058,
+ 1,
+ 0
+ ],
+ [
+ 201794.117647058,
+ 0,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 201882.352941176,
+ 4,
+ 0
+ ],
+ [
+ 202058.823529412,
+ 7,
+ 0
+ ],
+ [
+ 202411.764705882,
+ 4,
+ 0
+ ],
+ [
+ 202588.235294118,
+ 7,
+ 0
+ ],
+ [
+ 202941.176470588,
+ 4,
+ 0
+ ],
+ [
+ 203117.647058824,
+ 7,
+ 0
+ ],
+ [
+ 202235.294117647,
+ 5,
+ 0
+ ],
+ [
+ 202764.705882353,
+ 5,
+ 0
+ ],
+ [
+ 201882.352941176,
+ 1,
+ 0
+ ],
+ [
+ 202058.823529411,
+ 2,
+ 0
+ ],
+ [
+ 202235.294117647,
+ 1,
+ 0
+ ],
+ [
+ 202411.764705882,
+ 1,
+ 0
+ ],
+ [
+ 202588.235294117,
+ 2,
+ 0
+ ],
+ [
+ 202764.705882353,
+ 1,
+ 0
+ ],
+ [
+ 203029.411764705,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 213529.411764705,
+ 2,
+ 176.470588235294
+ ],
+ [
+ 213529.411764705,
+ 3,
+ 176.470588235294
+ ],
+ [
+ 213882.352941176,
+ 2,
+ 176.470588235294
+ ],
+ [
+ 213882.352941176,
+ 0,
+ 176.470588235294
+ ],
+ [
+ 214235.294117647,
+ 1,
+ 176.470588235294
+ ],
+ [
+ 214235.294117647,
+ 3,
+ 176.470588235294
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ }
+ ],
+ "splashSkin": "noteSplashes",
+ "validScore": false,
+ "gfVersion": "gf",
+ "bpm": 170,
+ "arrowSkin": "",
+ "needsVoices": true,
+ "song": "red-death"
+ }
+}
\ No newline at end of file
diff --git a/assets/preload/data/red-death-hard.json b/assets/preload/data/red-death-hard.json
new file mode 100644
index 000000000..1f49332a6
--- /dev/null
+++ b/assets/preload/data/red-death-hard.json
@@ -0,0 +1,6373 @@
+{
+ "song": {
+ "speed": 3,
+ "stage": "stage",
+ "player1": "bf",
+ "player2": "tord",
+ "player3": "gf",
+ "events": [],
+ "notes": [
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 0,
+ 2,
+ 0
+ ],
+ [
+ 529.411764705882,
+ 2,
+ 0
+ ],
+ [
+ 705.882352941177,
+ 3,
+ 0
+ ],
+ [
+ 882.352941176471,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 150,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 1411.76470588235,
+ 3,
+ 0
+ ],
+ [
+ 1588.23529411765,
+ 1,
+ 0
+ ],
+ [
+ 2294.11764705882,
+ 1,
+ 0
+ ],
+ [
+ 2647.05882352941,
+ 3,
+ 0
+ ],
+ [
+ 2470.58823529412,
+ 0,
+ 0
+ ],
+ [
+ 1764.70588235294,
+ 3,
+ 0
+ ],
+ [
+ 1941.17647058824,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 150,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 2823.52941176471,
+ 3,
+ 0
+ ],
+ [
+ 3088.23529411765,
+ 3,
+ 0
+ ],
+ [
+ 3352.94117647059,
+ 3,
+ 0
+ ],
+ [
+ 3617.64705882353,
+ 3,
+ 0
+ ],
+ [
+ 3882.35294117647,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 4058.82352941176,
+ 3,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 4235.29411764706,
+ 1,
+ 0
+ ],
+ [
+ 4411.76470588235,
+ 2,
+ 0
+ ],
+ [
+ 4588.23529411765,
+ 1,
+ 0
+ ],
+ [
+ 4764.70588235294,
+ 2,
+ 0
+ ],
+ [
+ 5117.64705882353,
+ 2,
+ 0
+ ],
+ [
+ 5294.11764705882,
+ 3,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 5647.05882352941,
+ 3,
+ 0
+ ],
+ [
+ 5735.29411764706,
+ 1,
+ 0
+ ],
+ [
+ 5823.52941176471,
+ 2,
+ 0
+ ],
+ [
+ 5911.76470588235,
+ 0,
+ 0
+ ],
+ [
+ 6000,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 6352.94117647059,
+ 3,
+ 0
+ ],
+ [
+ 6529.41176470588,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 7058.82352941176,
+ 3,
+ 0
+ ],
+ [
+ 7235.29411764706,
+ 1,
+ 0
+ ],
+ [
+ 7411.76470588235,
+ 3,
+ 0
+ ],
+ [
+ 7941.17647058824,
+ 1,
+ 0
+ ],
+ [
+ 7588.23529411765,
+ 1,
+ 176.470588235294
+ ],
+ [
+ 8117.64705882353,
+ 3,
+ 0
+ ],
+ [
+ 8294.11764705882,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 8470.58823529412,
+ 1,
+ 0
+ ],
+ [
+ 9000,
+ 3,
+ 0
+ ],
+ [
+ 9088.23529411765,
+ 1,
+ 0
+ ],
+ [
+ 9176.47058823529,
+ 3,
+ 0
+ ],
+ [
+ 9264.70588235294,
+ 2,
+ 0
+ ],
+ [
+ 9352.94117647059,
+ 0,
+ 0
+ ],
+ [
+ 9529.41176470588,
+ 3,
+ 0
+ ],
+ [
+ 9617.64705882353,
+ 2,
+ 0
+ ],
+ [
+ 9705.88235294118,
+ 1,
+ 0
+ ],
+ [
+ 9794.11764705882,
+ 0,
+ 0
+ ],
+ [
+ 8647.05882352941,
+ 7,
+ 0
+ ],
+ [
+ 9000,
+ 7,
+ 0
+ ],
+ [
+ 9176.47058823529,
+ 6,
+ 0
+ ],
+ [
+ 9352.94117647059,
+ 4,
+ 0
+ ],
+ [
+ 9529.41176470588,
+ 7,
+ 0
+ ],
+ [
+ 9705.88235294118,
+ 5,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 9882.35294117647,
+ 1,
+ 0
+ ],
+ [
+ 10058.8235294118,
+ 2,
+ 0
+ ],
+ [
+ 10500,
+ 2,
+ 0
+ ],
+ [
+ 10235.2941176471,
+ 1,
+ 0
+ ],
+ [
+ 10764.7058823529,
+ 2,
+ 0
+ ],
+ [
+ 11117.6470588235,
+ 1,
+ 0
+ ],
+ [
+ 9882.35294117647,
+ 4,
+ 0
+ ],
+ [
+ 10058.8235294118,
+ 7,
+ 0
+ ],
+ [
+ 10411.7647058824,
+ 4,
+ 0
+ ],
+ [
+ 10588.2352941176,
+ 7,
+ 0
+ ],
+ [
+ 10941.1764705882,
+ 4,
+ 0
+ ],
+ [
+ 11117.6470588235,
+ 7,
+ 0
+ ],
+ [
+ 10235.2941176471,
+ 5,
+ 0
+ ],
+ [
+ 10764.7058823529,
+ 5,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 11294.1176470588,
+ 2,
+ 0
+ ],
+ [
+ 11823.5294117647,
+ 2,
+ 0
+ ],
+ [
+ 12000,
+ 3,
+ 0
+ ],
+ [
+ 12176.4705882353,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 12705.8823529412,
+ 3,
+ 0
+ ],
+ [
+ 12882.3529411765,
+ 1,
+ 0
+ ],
+ [
+ 13588.2352941176,
+ 1,
+ 0
+ ],
+ [
+ 13941.1764705882,
+ 3,
+ 0
+ ],
+ [
+ 13764.7058823529,
+ 0,
+ 0
+ ],
+ [
+ 13058.8235294118,
+ 3,
+ 0
+ ],
+ [
+ 13235.2941176471,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 14117.6470588235,
+ 3,
+ 0
+ ],
+ [
+ 14382.3529411765,
+ 3,
+ 0
+ ],
+ [
+ 14647.0588235294,
+ 3,
+ 0
+ ],
+ [
+ 14911.7647058824,
+ 3,
+ 0
+ ],
+ [
+ 15176.4705882353,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 15352.9411764706,
+ 3,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 15529.4117647059,
+ 1,
+ 0
+ ],
+ [
+ 15705.8823529412,
+ 2,
+ 0
+ ],
+ [
+ 15882.3529411765,
+ 1,
+ 0
+ ],
+ [
+ 16058.8235294118,
+ 2,
+ 0
+ ],
+ [
+ 16147.0588235294,
+ 1,
+ 0
+ ],
+ [
+ 16323.5294117647,
+ 2,
+ 0
+ ],
+ [
+ 16852.9411764706,
+ 3,
+ 0
+ ],
+ [
+ 16411.7647058824,
+ 1,
+ 352.941176470588
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 16941.1764705882,
+ 3,
+ 0
+ ],
+ [
+ 17029.4117647059,
+ 1,
+ 0
+ ],
+ [
+ 17117.6470588235,
+ 2,
+ 0
+ ],
+ [
+ 17205.8823529412,
+ 0,
+ 0
+ ],
+ [
+ 17294.1176470588,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 17647.0588235294,
+ 3,
+ 0
+ ],
+ [
+ 17823.5294117647,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 18352.9411764706,
+ 3,
+ 0
+ ],
+ [
+ 18529.4117647059,
+ 1,
+ 0
+ ],
+ [
+ 18705.8823529412,
+ 3,
+ 0
+ ],
+ [
+ 19235.2941176471,
+ 1,
+ 0
+ ],
+ [
+ 18882.3529411765,
+ 1,
+ 176.470588235294
+ ],
+ [
+ 19411.7647058824,
+ 3,
+ 0
+ ],
+ [
+ 19588.2352941176,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 20294.1176470588,
+ 3,
+ 0
+ ],
+ [
+ 20382.3529411765,
+ 1,
+ 0
+ ],
+ [
+ 20647.0588235294,
+ 0,
+ 0
+ ],
+ [
+ 20823.5294117647,
+ 3,
+ 0
+ ],
+ [
+ 19941.1764705882,
+ 7,
+ 0
+ ],
+ [
+ 20294.1176470588,
+ 7,
+ 0
+ ],
+ [
+ 20470.5882352941,
+ 6,
+ 0
+ ],
+ [
+ 20647.0588235294,
+ 4,
+ 0
+ ],
+ [
+ 20823.5294117647,
+ 7,
+ 0
+ ],
+ [
+ 21000,
+ 5,
+ 0
+ ],
+ [
+ 19764.7058823529,
+ 0,
+ 0
+ ],
+ [
+ 19852.9411764706,
+ 3,
+ 0
+ ],
+ [
+ 19941.1764705882,
+ 0,
+ 0
+ ],
+ [
+ 20029.4117647059,
+ 3,
+ 0
+ ],
+ [
+ 20470.5882352941,
+ 2,
+ 0
+ ],
+ [
+ 20823.5294117647,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 21529.4117647059,
+ 1,
+ 0
+ ],
+ [
+ 21176.4705882353,
+ 4,
+ 0
+ ],
+ [
+ 21352.9411764706,
+ 7,
+ 0
+ ],
+ [
+ 21705.8823529412,
+ 4,
+ 0
+ ],
+ [
+ 21882.3529411765,
+ 7,
+ 0
+ ],
+ [
+ 22235.2941176471,
+ 4,
+ 0
+ ],
+ [
+ 22411.7647058824,
+ 7,
+ 0
+ ],
+ [
+ 21529.4117647059,
+ 5,
+ 0
+ ],
+ [
+ 22058.8235294118,
+ 5,
+ 0
+ ],
+ [
+ 21176.4705882353,
+ 3,
+ 0
+ ],
+ [
+ 21441.1764705882,
+ 0,
+ 0
+ ],
+ [
+ 21485.2941176471,
+ 3,
+ 0
+ ],
+ [
+ 21352.9411764706,
+ 2,
+ 0
+ ],
+ [
+ 21705.8823529412,
+ 2,
+ 0
+ ],
+ [
+ 21794.1176470588,
+ 1,
+ 0
+ ],
+ [
+ 21970.5882352941,
+ 2,
+ 0
+ ],
+ [
+ 22058.8235294118,
+ 1,
+ 0
+ ],
+ [
+ 22235.2941176471,
+ 2,
+ 0
+ ],
+ [
+ 22323.5294117647,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 33882.3529411765,
+ 2,
+ 0
+ ],
+ [
+ 33970.5882352941,
+ 1,
+ 0
+ ],
+ [
+ 34147.0588235294,
+ 1,
+ 0
+ ],
+ [
+ 34235.2941176471,
+ 2,
+ 0
+ ],
+ [
+ 34500,
+ 2,
+ 0
+ ],
+ [
+ 34764.7058823529,
+ 2,
+ 0
+ ],
+ [
+ 35029.4117647059,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 35294.1176470588,
+ 2,
+ 176.470588235294
+ ],
+ [
+ 35647.0588235294,
+ 2,
+ 0
+ ],
+ [
+ 36441.1764705882,
+ 3,
+ 0
+ ],
+ [
+ 36617.6470588235,
+ 3,
+ 0
+ ],
+ [
+ 36352.9411764706,
+ 1,
+ 0
+ ],
+ [
+ 36529.4117647059,
+ 1,
+ 0
+ ],
+ [
+ 36000,
+ 0,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 36705.8823529412,
+ 0,
+ 0
+ ],
+ [
+ 36882.3529411765,
+ 0,
+ 0
+ ],
+ [
+ 37058.8235294118,
+ 2,
+ 0
+ ],
+ [
+ 37235.294117647,
+ 2,
+ 0
+ ],
+ [
+ 37411.7647058823,
+ 0,
+ 0
+ ],
+ [
+ 37588.2352941176,
+ 1,
+ 0
+ ],
+ [
+ 37764.7058823529,
+ 2,
+ 0
+ ],
+ [
+ 38029.4117647059,
+ 2,
+ 0
+ ],
+ [
+ 37897.0588235294,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 38117.6470588235,
+ 3,
+ 264.705882352941
+ ],
+ [
+ 38117.6470588235,
+ 1,
+ 264.705882352941
+ ],
+ [
+ 38470.5882352941,
+ 0,
+ 0
+ ],
+ [
+ 38470.5882352941,
+ 2,
+ 0
+ ],
+ [
+ 38558.8235294118,
+ 2,
+ 0
+ ],
+ [
+ 38558.8235294118,
+ 0,
+ 0
+ ],
+ [
+ 38647.0588235294,
+ 0,
+ 0
+ ],
+ [
+ 38647.0588235294,
+ 2,
+ 0
+ ],
+ [
+ 38735.294117647,
+ 2,
+ 0
+ ],
+ [
+ 38735.294117647,
+ 0,
+ 0
+ ],
+ [
+ 38823.5294117647,
+ 3,
+ 617.647058823529
+ ],
+ [
+ 38823.5294117647,
+ 1,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 39529.4117647059,
+ 2,
+ 0
+ ],
+ [
+ 39705.8823529412,
+ 2,
+ 0
+ ],
+ [
+ 39617.6470588235,
+ 7,
+ 0
+ ],
+ [
+ 39794.1176470588,
+ 7,
+ 0
+ ],
+ [
+ 39529.4117647059,
+ 4,
+ 0
+ ],
+ [
+ 39705.8823529412,
+ 4,
+ 0
+ ],
+ [
+ 39882.3529411765,
+ 1,
+ 0
+ ],
+ [
+ 40235.294117647,
+ 1,
+ 0
+ ],
+ [
+ 40323.5294117647,
+ 3,
+ 0
+ ],
+ [
+ 40411.7647058823,
+ 2,
+ 0
+ ],
+ [
+ 40588.2352941176,
+ 0,
+ 0
+ ],
+ [
+ 40764.7058823529,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 40941.1764705882,
+ 2,
+ 0
+ ],
+ [
+ 41029.4117647059,
+ 1,
+ 0
+ ],
+ [
+ 41117.6470588235,
+ 0,
+ 0
+ ],
+ [
+ 41205.8823529412,
+ 3,
+ 0
+ ],
+ [
+ 41294.1176470588,
+ 2,
+ 0
+ ],
+ [
+ 41382.3529411765,
+ 1,
+ 0
+ ],
+ [
+ 41470.5882352941,
+ 0,
+ 0
+ ],
+ [
+ 41558.8235294117,
+ 1,
+ 0
+ ],
+ [
+ 41647.0588235294,
+ 2,
+ 0
+ ],
+ [
+ 41735.294117647,
+ 1,
+ 0
+ ],
+ [
+ 41823.5294117647,
+ 3,
+ 0
+ ],
+ [
+ 41911.7647058823,
+ 0,
+ 0
+ ],
+ [
+ 42000,
+ 2,
+ 0
+ ],
+ [
+ 42088.2352941176,
+ 3,
+ 0
+ ],
+ [
+ 42176.4705882353,
+ 0,
+ 0
+ ],
+ [
+ 42264.7058823529,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 42352.9411764706,
+ 0,
+ 0
+ ],
+ [
+ 42529.4117647059,
+ 0,
+ 0
+ ],
+ [
+ 42705.8823529412,
+ 2,
+ 0
+ ],
+ [
+ 42882.3529411764,
+ 2,
+ 0
+ ],
+ [
+ 43058.8235294117,
+ 0,
+ 0
+ ],
+ [
+ 43235.294117647,
+ 3,
+ 0
+ ],
+ [
+ 43411.7647058823,
+ 2,
+ 0
+ ],
+ [
+ 43588.2352941176,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 43764.7058823529,
+ 3,
+ 264.705882352941
+ ],
+ [
+ 43764.7058823529,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 44117.6470588235,
+ 1,
+ 264.705882352941
+ ],
+ [
+ 44470.5882352941,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 44823.5294117647,
+ 3,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 45176.4705882353,
+ 3,
+ 0
+ ],
+ [
+ 45264.7058823529,
+ 0,
+ 0
+ ],
+ [
+ 45352.9411764706,
+ 3,
+ 0
+ ],
+ [
+ 45441.1764705882,
+ 0,
+ 0
+ ],
+ [
+ 45529.4117647059,
+ 3,
+ 0
+ ],
+ [
+ 45882.3529411764,
+ 3,
+ 0
+ ],
+ [
+ 46235.294117647,
+ 3,
+ 264.705882352941
+ ],
+ [
+ 46411.7647058823,
+ 1,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 46588.2352941176,
+ 0,
+ 0
+ ],
+ [
+ 46764.7058823529,
+ 1,
+ 0
+ ],
+ [
+ 46941.1764705882,
+ 3,
+ 0
+ ],
+ [
+ 47205.8823529411,
+ 2,
+ 0
+ ],
+ [
+ 47294.1176470588,
+ 0,
+ 0
+ ],
+ [
+ 47470.5882352941,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 47823.5294117647,
+ 1,
+ 0
+ ],
+ [
+ 47911.7647058823,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 48000,
+ 1,
+ 0
+ ],
+ [
+ 48176.4705882353,
+ 1,
+ 0
+ ],
+ [
+ 48352.9411764706,
+ 1,
+ 0
+ ],
+ [
+ 48441.1764705882,
+ 3,
+ 0
+ ],
+ [
+ 48529.4117647058,
+ 1,
+ 0
+ ],
+ [
+ 48617.6470588235,
+ 3,
+ 0
+ ],
+ [
+ 48705.8823529411,
+ 1,
+ 0
+ ],
+ [
+ 48794.1176470588,
+ 3,
+ 0
+ ],
+ [
+ 48882.3529411764,
+ 1,
+ 0
+ ],
+ [
+ 49058.8235294117,
+ 1,
+ 0
+ ],
+ [
+ 49235.294117647,
+ 1,
+ 0
+ ],
+ [
+ 49323.5294117647,
+ 3,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 49411.7647058823,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 49764.7058823529,
+ 2,
+ 0
+ ],
+ [
+ 49808.8235294117,
+ 1,
+ 0
+ ],
+ [
+ 49852.9411764706,
+ 0,
+ 0
+ ],
+ [
+ 49897.0588235294,
+ 1,
+ 0
+ ],
+ [
+ 49941.1764705882,
+ 2,
+ 0
+ ],
+ [
+ 49985.294117647,
+ 3,
+ 0
+ ],
+ [
+ 50029.4117647058,
+ 2,
+ 0
+ ],
+ [
+ 50073.5294117647,
+ 1,
+ 0
+ ],
+ [
+ 50117.6470588235,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 50470.5882352941,
+ 3,
+ 0
+ ],
+ [
+ 50558.8235294117,
+ 3,
+ 0
+ ],
+ [
+ 50647.0588235294,
+ 3,
+ 0
+ ],
+ [
+ 50735.294117647,
+ 3,
+ 0
+ ],
+ [
+ 50691.1764705882,
+ 0,
+ 0
+ ],
+ [
+ 50779.4117647058,
+ 0,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 50911.7647058823,
+ 0,
+ 0
+ ],
+ [
+ 51088.2352941176,
+ 0,
+ 0
+ ],
+ [
+ 50823.5294117647,
+ 2,
+ 0
+ ],
+ [
+ 51000,
+ 2,
+ 0
+ ],
+ [
+ 51176.4705882353,
+ 2,
+ 0
+ ],
+ [
+ 51529.4117647058,
+ 2,
+ 0
+ ],
+ [
+ 51882.3529411764,
+ 2,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 52235.294117647,
+ 2,
+ 0
+ ],
+ [
+ 52411.7647058823,
+ 0,
+ 0
+ ],
+ [
+ 52588.2352941176,
+ 2,
+ 0
+ ],
+ [
+ 52764.7058823529,
+ 3,
+ 0
+ ],
+ [
+ 52941.1764705882,
+ 2,
+ 0
+ ],
+ [
+ 53117.6470588235,
+ 0,
+ 0
+ ],
+ [
+ 53294.1176470588,
+ 2,
+ 0
+ ],
+ [
+ 53470.5882352941,
+ 3,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 53647.0588235294,
+ 1,
+ 0
+ ],
+ [
+ 53823.5294117647,
+ 1,
+ 0
+ ],
+ [
+ 53999.9999999999,
+ 2,
+ 0
+ ],
+ [
+ 54088.2352941176,
+ 3,
+ 0
+ ],
+ [
+ 54176.4705882352,
+ 1,
+ 0
+ ],
+ [
+ 54529.4117647058,
+ 2,
+ 0
+ ],
+ [
+ 54882.3529411764,
+ 2,
+ 0
+ ],
+ [
+ 54352.9411764705,
+ 0,
+ 0
+ ],
+ [
+ 54705.8823529411,
+ 0,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 55058.8235294117,
+ 0,
+ 617.647058823529
+ ],
+ [
+ 55764.7058823529,
+ 2,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 56470.5882352941,
+ 1,
+ 1323.52941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 67764.7058823529,
+ 0,
+ 176.470588235294
+ ],
+ [
+ 68294.1176470588,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 68647.0588235293,
+ 3,
+ 0
+ ],
+ [
+ 68823.5294117646,
+ 2,
+ 88.2352941176471
+ ],
+ [
+ 68999.9999999999,
+ 0,
+ 0
+ ],
+ [
+ 69044.1176470588,
+ 2,
+ 0
+ ],
+ [
+ 69088.2352941176,
+ 0,
+ 0
+ ],
+ [
+ 69132.3529411764,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 69176.4705882352,
+ 3,
+ 0
+ ],
+ [
+ 69529.4117647058,
+ 3,
+ 0
+ ],
+ [
+ 69617.6470588235,
+ 1,
+ 0
+ ],
+ [
+ 69794.1176470587,
+ 1,
+ 0
+ ],
+ [
+ 69882.3529411764,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 70058.8235294117,
+ 3,
+ 0
+ ],
+ [
+ 70411.7647058823,
+ 1,
+ 0
+ ],
+ [
+ 70411.7647058823,
+ 2,
+ 0
+ ],
+ [
+ 70411.7647058823,
+ 3,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 70588.2352941176,
+ 2,
+ 176.470588235294
+ ],
+ [
+ 71117.6470588235,
+ 3,
+ 0
+ ],
+ [
+ 71294.1176470587,
+ 2,
+ 0
+ ],
+ [
+ 71249.9999999999,
+ 1,
+ 0
+ ],
+ [
+ 71470.588235294,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 71823.5294117646,
+ 3,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 71999.9999999999,
+ 2,
+ 176.470588235294
+ ],
+ [
+ 72352.9411764705,
+ 2,
+ 0
+ ],
+ [
+ 72441.1764705882,
+ 0,
+ 0
+ ],
+ [
+ 72529.4117647058,
+ 1,
+ 0
+ ],
+ [
+ 72882.3529411764,
+ 2,
+ 0
+ ],
+ [
+ 73058.8235294117,
+ 0,
+ 0
+ ],
+ [
+ 73235.294117647,
+ 1,
+ 0
+ ],
+ [
+ 72882.3529411764,
+ 1,
+ 0
+ ],
+ [
+ 73058.8235294117,
+ 3,
+ 0
+ ],
+ [
+ 73235.294117647,
+ 3,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 73411.7647058823,
+ 0,
+ 176.470588235294
+ ],
+ [
+ 73852.9411764705,
+ 0,
+ 0
+ ],
+ [
+ 73874.9999999999,
+ 1,
+ 0
+ ],
+ [
+ 73897.0588235293,
+ 2,
+ 0
+ ],
+ [
+ 73919.1176470587,
+ 3,
+ 0
+ ],
+ [
+ 74117.6470588234,
+ 0,
+ 0
+ ],
+ [
+ 74294.1176470587,
+ 2,
+ 0
+ ],
+ [
+ 74382.3529411764,
+ 0,
+ 0
+ ],
+ [
+ 74205.8823529411,
+ 3,
+ 0
+ ],
+ [
+ 74426.4705882352,
+ 3,
+ 0
+ ],
+ [
+ 74470.588235294,
+ 0,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 74823.5294117646,
+ 2,
+ 0
+ ],
+ [
+ 75220.588235294,
+ 0,
+ 0
+ ],
+ [
+ 75308.8235294117,
+ 0,
+ 0
+ ],
+ [
+ 75176.4705882352,
+ 1,
+ 0
+ ],
+ [
+ 75264.7058823528,
+ 1,
+ 0
+ ],
+ [
+ 75352.9411764705,
+ 1,
+ 0
+ ],
+ [
+ 75397.0588235293,
+ 0,
+ 0
+ ],
+ [
+ 75441.1764705881,
+ 1,
+ 0
+ ],
+ [
+ 75485.294117647,
+ 0,
+ 0
+ ],
+ [
+ 75529.4117647058,
+ 2,
+ 0
+ ],
+ [
+ 75705.8823529411,
+ 2,
+ 0
+ ],
+ [
+ 76058.8235294117,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 76235.294117647,
+ 0,
+ 0
+ ],
+ [
+ 76411.7647058823,
+ 0,
+ 0
+ ],
+ [
+ 76588.2352941175,
+ 3,
+ 0
+ ],
+ [
+ 76764.7058823528,
+ 0,
+ 0
+ ],
+ [
+ 76941.1764705881,
+ 3,
+ 0
+ ],
+ [
+ 77117.6470588234,
+ 2,
+ 0
+ ],
+ [
+ 77294.1176470587,
+ 0,
+ 0
+ ],
+ [
+ 77470.588235294,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 77647.0588235293,
+ 2,
+ 441.176470588235
+ ],
+ [
+ 78176.4705882352,
+ 3,
+ 0
+ ],
+ [
+ 78352.9411764705,
+ 2,
+ 529.411764705882
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 79058.8235294118,
+ 2,
+ 0
+ ],
+ [
+ 79588.2352941177,
+ 2,
+ 0
+ ],
+ [
+ 79764.7058823529,
+ 3,
+ 0
+ ],
+ [
+ 79941.1764705882,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 80470.5882352941,
+ 3,
+ 0
+ ],
+ [
+ 80647.0588235294,
+ 1,
+ 0
+ ],
+ [
+ 81352.9411764706,
+ 1,
+ 0
+ ],
+ [
+ 81705.8823529412,
+ 3,
+ 0
+ ],
+ [
+ 81529.4117647059,
+ 0,
+ 0
+ ],
+ [
+ 80823.5294117646,
+ 3,
+ 0
+ ],
+ [
+ 80999.9999999999,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 81882.3529411765,
+ 3,
+ 0
+ ],
+ [
+ 82147.0588235294,
+ 3,
+ 0
+ ],
+ [
+ 82411.7647058823,
+ 3,
+ 0
+ ],
+ [
+ 82676.4705882353,
+ 3,
+ 0
+ ],
+ [
+ 82941.1764705882,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 83117.6470588235,
+ 3,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 83294.1176470588,
+ 1,
+ 0
+ ],
+ [
+ 83470.5882352941,
+ 2,
+ 0
+ ],
+ [
+ 83647.0588235294,
+ 1,
+ 0
+ ],
+ [
+ 83823.5294117647,
+ 2,
+ 0
+ ],
+ [
+ 84176.4705882353,
+ 2,
+ 0
+ ],
+ [
+ 84352.9411764706,
+ 3,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 84705.8823529412,
+ 3,
+ 0
+ ],
+ [
+ 84794.1176470588,
+ 1,
+ 0
+ ],
+ [
+ 84882.3529411765,
+ 2,
+ 0
+ ],
+ [
+ 84970.5882352941,
+ 0,
+ 0
+ ],
+ [
+ 85058.8235294118,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 85411.7647058823,
+ 3,
+ 0
+ ],
+ [
+ 85588.2352941177,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 86117.6470588235,
+ 3,
+ 0
+ ],
+ [
+ 86294.1176470588,
+ 1,
+ 0
+ ],
+ [
+ 86470.5882352941,
+ 3,
+ 0
+ ],
+ [
+ 87000,
+ 1,
+ 0
+ ],
+ [
+ 86647.0588235294,
+ 1,
+ 176.470588235294
+ ],
+ [
+ 87176.4705882353,
+ 3,
+ 0
+ ],
+ [
+ 87352.9411764706,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 87529.4117647059,
+ 1,
+ 0
+ ],
+ [
+ 88058.8235294118,
+ 3,
+ 0
+ ],
+ [
+ 88147.0588235294,
+ 1,
+ 0
+ ],
+ [
+ 88235.294117647,
+ 3,
+ 0
+ ],
+ [
+ 88323.5294117647,
+ 2,
+ 0
+ ],
+ [
+ 88411.7647058823,
+ 0,
+ 0
+ ],
+ [
+ 88588.2352941177,
+ 3,
+ 0
+ ],
+ [
+ 88676.4705882353,
+ 2,
+ 0
+ ],
+ [
+ 88764.7058823529,
+ 1,
+ 0
+ ],
+ [
+ 88852.9411764706,
+ 0,
+ 0
+ ],
+ [
+ 87705.8823529412,
+ 7,
+ 0
+ ],
+ [
+ 88058.8235294118,
+ 7,
+ 0
+ ],
+ [
+ 88235.294117647,
+ 6,
+ 0
+ ],
+ [
+ 88411.7647058823,
+ 4,
+ 0
+ ],
+ [
+ 88588.2352941177,
+ 7,
+ 0
+ ],
+ [
+ 88764.7058823529,
+ 5,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 88941.1764705882,
+ 1,
+ 0
+ ],
+ [
+ 89117.6470588235,
+ 2,
+ 0
+ ],
+ [
+ 89558.8235294118,
+ 2,
+ 0
+ ],
+ [
+ 89294.1176470588,
+ 1,
+ 0
+ ],
+ [
+ 89823.5294117647,
+ 2,
+ 0
+ ],
+ [
+ 90176.4705882353,
+ 1,
+ 0
+ ],
+ [
+ 88941.1764705882,
+ 4,
+ 0
+ ],
+ [
+ 89117.6470588235,
+ 7,
+ 0
+ ],
+ [
+ 89470.5882352941,
+ 4,
+ 0
+ ],
+ [
+ 89647.0588235294,
+ 7,
+ 0
+ ],
+ [
+ 90000,
+ 4,
+ 0
+ ],
+ [
+ 90176.4705882353,
+ 7,
+ 0
+ ],
+ [
+ 89294.1176470588,
+ 5,
+ 0
+ ],
+ [
+ 89823.5294117647,
+ 5,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 90352.9411764706,
+ 2,
+ 0
+ ],
+ [
+ 90882.3529411765,
+ 2,
+ 0
+ ],
+ [
+ 91058.8235294118,
+ 3,
+ 0
+ ],
+ [
+ 91235.294117647,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 91764.7058823529,
+ 3,
+ 0
+ ],
+ [
+ 91941.1764705882,
+ 1,
+ 0
+ ],
+ [
+ 92647.0588235294,
+ 1,
+ 0
+ ],
+ [
+ 93000,
+ 3,
+ 0
+ ],
+ [
+ 92823.5294117647,
+ 0,
+ 0
+ ],
+ [
+ 92117.6470588234,
+ 3,
+ 0
+ ],
+ [
+ 92294.1176470587,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 93176.4705882353,
+ 3,
+ 0
+ ],
+ [
+ 93441.1764705882,
+ 3,
+ 0
+ ],
+ [
+ 93705.8823529412,
+ 3,
+ 0
+ ],
+ [
+ 93970.5882352941,
+ 3,
+ 0
+ ],
+ [
+ 94235.294117647,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 94411.7647058823,
+ 3,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 94588.2352941177,
+ 1,
+ 0
+ ],
+ [
+ 94764.7058823529,
+ 2,
+ 0
+ ],
+ [
+ 94941.1764705882,
+ 1,
+ 0
+ ],
+ [
+ 95117.6470588235,
+ 2,
+ 0
+ ],
+ [
+ 95205.8823529412,
+ 1,
+ 0
+ ],
+ [
+ 95382.3529411765,
+ 2,
+ 0
+ ],
+ [
+ 95911.7647058823,
+ 3,
+ 0
+ ],
+ [
+ 95470.5882352941,
+ 1,
+ 352.941176470588
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 96000,
+ 3,
+ 0
+ ],
+ [
+ 96088.2352941177,
+ 1,
+ 0
+ ],
+ [
+ 96176.4705882353,
+ 2,
+ 0
+ ],
+ [
+ 96264.7058823529,
+ 0,
+ 0
+ ],
+ [
+ 96352.9411764706,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 96705.8823529412,
+ 3,
+ 0
+ ],
+ [
+ 96882.3529411765,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 97411.7647058823,
+ 3,
+ 0
+ ],
+ [
+ 97588.2352941177,
+ 1,
+ 0
+ ],
+ [
+ 97764.7058823529,
+ 3,
+ 0
+ ],
+ [
+ 98294.1176470588,
+ 1,
+ 0
+ ],
+ [
+ 97941.1764705882,
+ 1,
+ 176.470588235294
+ ],
+ [
+ 98470.5882352941,
+ 3,
+ 0
+ ],
+ [
+ 98647.0588235294,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 99352.9411764706,
+ 3,
+ 0
+ ],
+ [
+ 99441.1764705882,
+ 1,
+ 0
+ ],
+ [
+ 99705.8823529412,
+ 0,
+ 0
+ ],
+ [
+ 99882.3529411765,
+ 3,
+ 0
+ ],
+ [
+ 99000,
+ 7,
+ 0
+ ],
+ [
+ 99352.9411764706,
+ 7,
+ 0
+ ],
+ [
+ 99529.4117647059,
+ 6,
+ 0
+ ],
+ [
+ 99705.8823529412,
+ 4,
+ 0
+ ],
+ [
+ 99882.3529411765,
+ 7,
+ 0
+ ],
+ [
+ 100058.823529412,
+ 5,
+ 0
+ ],
+ [
+ 98823.5294117647,
+ 0,
+ 0
+ ],
+ [
+ 98911.7647058823,
+ 3,
+ 0
+ ],
+ [
+ 99000,
+ 0,
+ 0
+ ],
+ [
+ 99088.2352941177,
+ 3,
+ 0
+ ],
+ [
+ 99529.4117647059,
+ 2,
+ 0
+ ],
+ [
+ 99882.3529411765,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 100588.235294118,
+ 1,
+ 0
+ ],
+ [
+ 100235.294117647,
+ 4,
+ 0
+ ],
+ [
+ 100411.764705882,
+ 7,
+ 0
+ ],
+ [
+ 100764.705882353,
+ 4,
+ 0
+ ],
+ [
+ 100941.176470588,
+ 7,
+ 0
+ ],
+ [
+ 101294.117647059,
+ 4,
+ 0
+ ],
+ [
+ 101470.588235294,
+ 7,
+ 0
+ ],
+ [
+ 100588.235294118,
+ 5,
+ 0
+ ],
+ [
+ 101117.647058824,
+ 5,
+ 0
+ ],
+ [
+ 100235.294117647,
+ 3,
+ 0
+ ],
+ [
+ 100500,
+ 0,
+ 0
+ ],
+ [
+ 100544.117647059,
+ 3,
+ 0
+ ],
+ [
+ 100411.764705882,
+ 2,
+ 0
+ ],
+ [
+ 100764.705882353,
+ 2,
+ 0
+ ],
+ [
+ 100852.941176471,
+ 1,
+ 0
+ ],
+ [
+ 101029.411764706,
+ 2,
+ 0
+ ],
+ [
+ 101117.647058824,
+ 1,
+ 0
+ ],
+ [
+ 101294.117647059,
+ 2,
+ 0
+ ],
+ [
+ 101382.352941176,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 101647.058823529,
+ 3,
+ 0
+ ],
+ [
+ 102000,
+ 1,
+ 0
+ ],
+ [
+ 102264.705882353,
+ 1,
+ 0
+ ],
+ [
+ 102529.411764706,
+ 1,
+ 0
+ ],
+ [
+ 102794.117647059,
+ 1,
+ 0
+ ],
+ [
+ 101693.382352941,
+ 0,
+ 0
+ ],
+ [
+ 101953.676470588,
+ 0,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 103058.823529412,
+ 0,
+ 794.117647058823
+ ],
+ [
+ 103941.176470588,
+ 2,
+ 0
+ ],
+ [
+ 104117.647058823,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 104294.117647059,
+ 1,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 104470.588235294,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 104823.529411765,
+ 3,
+ 264.705882352941
+ ],
+ [
+ 105176.470588235,
+ 1,
+ 264.705882352941
+ ],
+ [
+ 105529.411764706,
+ 0,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 105882.352941176,
+ 3,
+ 264.705882352941
+ ],
+ [
+ 106235.294117647,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 106588.235294117,
+ 2,
+ 0
+ ],
+ [
+ 106764.705882353,
+ 3,
+ 0
+ ],
+ [
+ 106941.176470588,
+ 2,
+ 0
+ ],
+ [
+ 107117.647058823,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 107294.117647059,
+ 1,
+ 0
+ ],
+ [
+ 107470.588235294,
+ 1,
+ 0
+ ],
+ [
+ 107647.058823529,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 108000,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 108352.94117647,
+ 1,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 108705.882352941,
+ 2,
+ 176.470588235294
+ ],
+ [
+ 109058.823529412,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 109411.764705882,
+ 3,
+ 264.705882352941
+ ],
+ [
+ 109764.705882353,
+ 2,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 110470.588235294,
+ 3,
+ 264.705882352941
+ ],
+ [
+ 110823.529411765,
+ 1,
+ 264.705882352941
+ ],
+ [
+ 111176.470588235,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 110117.647058823,
+ 1,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 111529.411764706,
+ 3,
+ 264.705882352941
+ ],
+ [
+ 111882.352941176,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 112235.294117647,
+ 1,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 112941.176470588,
+ 3,
+ 0
+ ],
+ [
+ 113029.411764706,
+ 2,
+ 0
+ ],
+ [
+ 113117.647058823,
+ 3,
+ 0
+ ],
+ [
+ 113294.117647059,
+ 2,
+ 0
+ ],
+ [
+ 113382.352941176,
+ 2,
+ 0
+ ],
+ [
+ 113338.235294117,
+ 0,
+ 0
+ ],
+ [
+ 113316.176470588,
+ 3,
+ 0
+ ],
+ [
+ 113404.411764706,
+ 3,
+ 0
+ ],
+ [
+ 113360.294117647,
+ 1,
+ 0
+ ],
+ [
+ 113426.470588235,
+ 0,
+ 0
+ ],
+ [
+ 113448.529411765,
+ 1,
+ 0
+ ],
+ [
+ 113470.588235294,
+ 2,
+ 0
+ ],
+ [
+ 113492.647058823,
+ 3,
+ 0
+ ],
+ [
+ 113514.705882353,
+ 0,
+ 0
+ ],
+ [
+ 113536.764705882,
+ 1,
+ 0
+ ],
+ [
+ 113558.823529412,
+ 2,
+ 0
+ ],
+ [
+ 113580.882352941,
+ 3,
+ 0
+ ],
+ [
+ 113647.058823529,
+ 0,
+ 0
+ ],
+ [
+ 113735.294117647,
+ 2,
+ 0
+ ],
+ [
+ 113823.529411765,
+ 1,
+ 0
+ ],
+ [
+ 113911.764705882,
+ 2,
+ 0
+ ],
+ [
+ 114000,
+ 3,
+ 264.705882352941
+ ],
+ [
+ 114088.235294117,
+ 1,
+ 0
+ ],
+ [
+ 114176.470588235,
+ 0,
+ 0
+ ],
+ [
+ 114264.705882353,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 114352.94117647,
+ 0,
+ 0
+ ],
+ [
+ 114529.411764706,
+ 0,
+ 0
+ ],
+ [
+ 114617.647058823,
+ 2,
+ 0
+ ],
+ [
+ 114794.117647059,
+ 2,
+ 0
+ ],
+ [
+ 114882.352941176,
+ 1,
+ 0
+ ],
+ [
+ 114705.882352941,
+ 3,
+ 0
+ ],
+ [
+ 114441.176470588,
+ 1,
+ 0
+ ],
+ [
+ 114970.588235294,
+ 2,
+ 0
+ ],
+ [
+ 115147.058823529,
+ 3,
+ 0
+ ],
+ [
+ 115235.294117647,
+ 2,
+ 0
+ ],
+ [
+ 115323.529411765,
+ 0,
+ 0
+ ],
+ [
+ 115058.823529412,
+ 2,
+ 0
+ ],
+ [
+ 115411.764705882,
+ 1,
+ 264.705882352941
+ ],
+ [
+ 115500,
+ 2,
+ 0
+ ],
+ [
+ 115588.235294117,
+ 2,
+ 0
+ ],
+ [
+ 115676.470588235,
+ 2,
+ 0
+ ],
+ [
+ 115235.294117647,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 115764.705882353,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 115764.705882353,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 116117.647058823,
+ 1,
+ 0
+ ],
+ [
+ 116205.882352941,
+ 1,
+ 0
+ ],
+ [
+ 116155.147058823,
+ 3,
+ 0
+ ],
+ [
+ 116252.205882353,
+ 3,
+ 0
+ ],
+ [
+ 116294.117647059,
+ 1,
+ 0
+ ],
+ [
+ 116351.470588235,
+ 3,
+ 0
+ ],
+ [
+ 116382.352941176,
+ 1,
+ 0
+ ],
+ [
+ 116470.588235294,
+ 2,
+ 176.470588235294
+ ],
+ [
+ 116470.588235294,
+ 0,
+ 176.470588235294
+ ],
+ [
+ 116823.529411765,
+ 2,
+ 176.470588235294
+ ],
+ [
+ 116823.529411765,
+ 0,
+ 176.470588235294
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 117176.470588235,
+ 2,
+ 617.647058823529
+ ],
+ [
+ 117176.470588235,
+ 3,
+ 617.647058823529
+ ],
+ [
+ 117882.352941176,
+ 0,
+ 0
+ ],
+ [
+ 118058.823529412,
+ 2,
+ 0
+ ],
+ [
+ 118235.294117647,
+ 0,
+ 0
+ ],
+ [
+ 118411.764705882,
+ 1,
+ 0
+ ],
+ [
+ 118058.823529412,
+ 3,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 118588.235294117,
+ 2,
+ 0
+ ],
+ [
+ 118676.470588235,
+ 1,
+ 0
+ ],
+ [
+ 118764.705882353,
+ 2,
+ 0
+ ],
+ [
+ 118852.94117647,
+ 2,
+ 0
+ ],
+ [
+ 118941.176470588,
+ 1,
+ 0
+ ],
+ [
+ 119029.411764706,
+ 0,
+ 0
+ ],
+ [
+ 119117.647058823,
+ 1,
+ 0
+ ],
+ [
+ 119382.352941176,
+ 1,
+ 0
+ ],
+ [
+ 119558.823529412,
+ 1,
+ 0
+ ],
+ [
+ 119205.882352941,
+ 3,
+ 0
+ ],
+ [
+ 119294.117647059,
+ 0,
+ 0
+ ],
+ [
+ 119470.588235294,
+ 3,
+ 0
+ ],
+ [
+ 119647.058823529,
+ 2,
+ 0
+ ],
+ [
+ 119735.294117647,
+ 0,
+ 0
+ ],
+ [
+ 119823.529411765,
+ 3,
+ 0
+ ],
+ [
+ 119911.764705882,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 120000,
+ 2,
+ 0
+ ],
+ [
+ 120088.235294117,
+ 3,
+ 0
+ ],
+ [
+ 120176.470588235,
+ 2,
+ 0
+ ],
+ [
+ 120264.705882353,
+ 1,
+ 0
+ ],
+ [
+ 120352.94117647,
+ 0,
+ 0
+ ],
+ [
+ 120441.176470588,
+ 1,
+ 0
+ ],
+ [
+ 120529.411764706,
+ 3,
+ 0
+ ],
+ [
+ 120617.647058823,
+ 1,
+ 0
+ ],
+ [
+ 120705.882352941,
+ 0,
+ 0
+ ],
+ [
+ 120794.117647059,
+ 3,
+ 0
+ ],
+ [
+ 120882.352941176,
+ 1,
+ 0
+ ],
+ [
+ 120970.588235294,
+ 2,
+ 0
+ ],
+ [
+ 121058.823529412,
+ 0,
+ 0
+ ],
+ [
+ 121147.058823529,
+ 1,
+ 0
+ ],
+ [
+ 121323.529411764,
+ 1,
+ 0
+ ],
+ [
+ 121235.294117647,
+ 0,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 121411.764705882,
+ 2,
+ 1147.05882352941
+ ],
+ [
+ 121411.764705882,
+ 3,
+ 1147.05882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 122823.529411764,
+ 2,
+ 529.411764705882
+ ],
+ [
+ 123529.411764706,
+ 3,
+ 617.647058823529
+ ],
+ [
+ 123529.411764706,
+ 2,
+ 617.647058823529
+ ],
+ [
+ 122823.529411764,
+ 0,
+ 529.411764705882
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 124235.294117647,
+ 0,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 125647.058823529,
+ 1,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 127058.823529412,
+ 2,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 128470.588235294,
+ 3,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 129882.352941176,
+ 0,
+ 0
+ ],
+ [
+ 130235.294117647,
+ 0,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 131294.117647059,
+ 1,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 132705.882352941,
+ 2,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 134117.647058823,
+ 3,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 135529.411764706,
+ 0,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 136941.176470588,
+ 1,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 138352.94117647,
+ 2,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 139764.705882353,
+ 3,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 141176.470588235,
+ 0,
+ 0
+ ],
+ [
+ 141529.411764706,
+ 0,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 142588.235294117,
+ 1,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 144000,
+ 6,
+ 617.647058823529
+ ],
+ [
+ 144529.411764706,
+ 2,
+ 0
+ ],
+ [
+ 144705.882352941,
+ 2,
+ 0
+ ],
+ [
+ 144794.117647059,
+ 2,
+ 0
+ ],
+ [
+ 144882.352941176,
+ 0,
+ 0
+ ],
+ [
+ 145323.529411764,
+ 3,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 145411.764705882,
+ 7,
+ 617.647058823529
+ ],
+ [
+ 145411.764705882,
+ 1,
+ 0
+ ],
+ [
+ 145676.470588235,
+ 2,
+ 0
+ ],
+ [
+ 145852.94117647,
+ 2,
+ 0
+ ],
+ [
+ 146029.411764706,
+ 3,
+ 0
+ ],
+ [
+ 146205.882352941,
+ 3,
+ 0
+ ],
+ [
+ 146382.352941176,
+ 3,
+ 0
+ ],
+ [
+ 146558.823529411,
+ 3,
+ 0
+ ],
+ [
+ 146647.058823529,
+ 3,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 147264.705882353,
+ 1,
+ 88.2352941176471
+ ],
+ [
+ 146823.529411764,
+ 0,
+ 529.411764705882
+ ],
+ [
+ 147529.411764706,
+ 0,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 148235.294117647,
+ 1,
+ 529.411764705882
+ ],
+ [
+ 148676.470588235,
+ 2,
+ 88.2352941176471
+ ],
+ [
+ 148941.176470588,
+ 1,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 150000,
+ 3,
+ 0
+ ],
+ [
+ 150352.94117647,
+ 2,
+ 617.647058823529
+ ],
+ [
+ 149647.058823529,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 150088.235294117,
+ 1,
+ 0
+ ],
+ [
+ 150176.470588235,
+ 3,
+ 0
+ ],
+ [
+ 150264.705882353,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 151058.823529411,
+ 3,
+ 264.705882352941
+ ],
+ [
+ 151411.764705882,
+ 1,
+ 264.705882352941
+ ],
+ [
+ 151764.705882353,
+ 3,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 152470.588235294,
+ 0,
+ 0
+ ],
+ [
+ 153176.470588235,
+ 0,
+ 617.647058823529
+ ],
+ [
+ 152823.529411764,
+ 0,
+ 176.470588235294
+ ],
+ [
+ 152911.764705882,
+ 1,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 153882.352941176,
+ 1,
+ 529.411764705882
+ ],
+ [
+ 154323.529411764,
+ 2,
+ 88.2352941176471
+ ],
+ [
+ 154588.235294117,
+ 1,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 155294.117647059,
+ 2,
+ 1323.52941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 156705.882352941,
+ 3,
+ 1323.52941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 158558.823529411,
+ 1,
+ 88.2352941176471
+ ],
+ [
+ 158117.647058823,
+ 0,
+ 529.411764705882
+ ],
+ [
+ 158823.529411764,
+ 0,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 159529.411764706,
+ 1,
+ 529.411764705882
+ ],
+ [
+ 159970.588235294,
+ 2,
+ 88.2352941176471
+ ],
+ [
+ 160235.294117647,
+ 1,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 161294.117647059,
+ 3,
+ 0
+ ],
+ [
+ 160941.176470588,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 161382.352941176,
+ 1,
+ 0
+ ],
+ [
+ 161470.588235294,
+ 0,
+ 0
+ ],
+ [
+ 161558.823529411,
+ 1,
+ 0
+ ],
+ [
+ 161647.058823529,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 162000,
+ 0,
+ 0
+ ],
+ [
+ 162176.470588235,
+ 3,
+ 1500
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 163764.705882353,
+ 0,
+ 0
+ ],
+ [
+ 164470.588235294,
+ 0,
+ 617.647058823529
+ ],
+ [
+ 164117.647058823,
+ 0,
+ 176.470588235294
+ ],
+ [
+ 164205.882352941,
+ 1,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 165176.470588235,
+ 1,
+ 529.411764705882
+ ],
+ [
+ 165617.647058823,
+ 2,
+ 88.2352941176471
+ ],
+ [
+ 165882.352941176,
+ 1,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 166588.235294117,
+ 2,
+ 1323.52941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 168000,
+ 3,
+ 1323.52941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 169411.764705882,
+ 2,
+ 0
+ ],
+ [
+ 169941.176470588,
+ 2,
+ 0
+ ],
+ [
+ 170117.647058824,
+ 3,
+ 0
+ ],
+ [
+ 170294.117647059,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 170823.529411765,
+ 3,
+ 0
+ ],
+ [
+ 171000,
+ 1,
+ 0
+ ],
+ [
+ 171705.882352941,
+ 1,
+ 0
+ ],
+ [
+ 172058.823529412,
+ 3,
+ 0
+ ],
+ [
+ 171882.352941176,
+ 0,
+ 0
+ ],
+ [
+ 171176.470588235,
+ 3,
+ 0
+ ],
+ [
+ 171352.94117647,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 172235.294117647,
+ 3,
+ 0
+ ],
+ [
+ 172500,
+ 3,
+ 0
+ ],
+ [
+ 172764.705882353,
+ 3,
+ 0
+ ],
+ [
+ 173029.411764706,
+ 3,
+ 0
+ ],
+ [
+ 173294.117647059,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 173470.588235294,
+ 3,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 173647.058823529,
+ 1,
+ 0
+ ],
+ [
+ 173823.529411765,
+ 2,
+ 0
+ ],
+ [
+ 174000,
+ 1,
+ 0
+ ],
+ [
+ 174176.470588235,
+ 2,
+ 0
+ ],
+ [
+ 174529.411764706,
+ 2,
+ 0
+ ],
+ [
+ 174705.882352941,
+ 3,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 175058.823529412,
+ 3,
+ 0
+ ],
+ [
+ 175147.058823529,
+ 1,
+ 0
+ ],
+ [
+ 175235.294117647,
+ 2,
+ 0
+ ],
+ [
+ 175323.529411765,
+ 0,
+ 0
+ ],
+ [
+ 175411.764705882,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 175764.705882353,
+ 3,
+ 0
+ ],
+ [
+ 175941.176470588,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 176470.588235294,
+ 3,
+ 0
+ ],
+ [
+ 176647.058823529,
+ 1,
+ 0
+ ],
+ [
+ 176823.529411765,
+ 3,
+ 0
+ ],
+ [
+ 177352.941176471,
+ 1,
+ 0
+ ],
+ [
+ 177000,
+ 1,
+ 176.470588235294
+ ],
+ [
+ 177529.411764706,
+ 3,
+ 0
+ ],
+ [
+ 177705.882352941,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 177882.352941176,
+ 1,
+ 0
+ ],
+ [
+ 178411.764705882,
+ 3,
+ 0
+ ],
+ [
+ 178500,
+ 1,
+ 0
+ ],
+ [
+ 178588.235294118,
+ 3,
+ 0
+ ],
+ [
+ 178676.470588235,
+ 2,
+ 0
+ ],
+ [
+ 178764.705882353,
+ 0,
+ 0
+ ],
+ [
+ 178941.176470588,
+ 3,
+ 0
+ ],
+ [
+ 179029.411764706,
+ 2,
+ 0
+ ],
+ [
+ 179117.647058824,
+ 1,
+ 0
+ ],
+ [
+ 179205.882352941,
+ 0,
+ 0
+ ],
+ [
+ 178058.823529412,
+ 7,
+ 0
+ ],
+ [
+ 178411.764705882,
+ 7,
+ 0
+ ],
+ [
+ 178588.235294118,
+ 6,
+ 0
+ ],
+ [
+ 178764.705882353,
+ 4,
+ 0
+ ],
+ [
+ 178941.176470588,
+ 7,
+ 0
+ ],
+ [
+ 179117.647058824,
+ 5,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 179294.117647059,
+ 1,
+ 0
+ ],
+ [
+ 179470.588235294,
+ 2,
+ 0
+ ],
+ [
+ 179911.764705882,
+ 2,
+ 0
+ ],
+ [
+ 179647.058823529,
+ 1,
+ 0
+ ],
+ [
+ 180176.470588235,
+ 2,
+ 0
+ ],
+ [
+ 180529.411764706,
+ 1,
+ 0
+ ],
+ [
+ 179294.117647059,
+ 4,
+ 0
+ ],
+ [
+ 179470.588235294,
+ 7,
+ 0
+ ],
+ [
+ 179823.529411765,
+ 4,
+ 0
+ ],
+ [
+ 180000,
+ 7,
+ 0
+ ],
+ [
+ 180352.941176471,
+ 4,
+ 0
+ ],
+ [
+ 180529.411764706,
+ 7,
+ 0
+ ],
+ [
+ 179647.058823529,
+ 5,
+ 0
+ ],
+ [
+ 180176.470588235,
+ 5,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 180705.882352941,
+ 2,
+ 0
+ ],
+ [
+ 181235.294117647,
+ 2,
+ 0
+ ],
+ [
+ 181411.764705882,
+ 3,
+ 0
+ ],
+ [
+ 181588.235294118,
+ 0,
+ 441.176470588235
+ ],
+ [
+ 181058.823529411,
+ 6,
+ 0
+ ],
+ [
+ 181235.294117647,
+ 6,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 182117.647058824,
+ 3,
+ 0
+ ],
+ [
+ 182294.117647059,
+ 1,
+ 0
+ ],
+ [
+ 183000,
+ 1,
+ 0
+ ],
+ [
+ 183352.941176471,
+ 3,
+ 0
+ ],
+ [
+ 183176.470588235,
+ 0,
+ 0
+ ],
+ [
+ 182470.588235294,
+ 3,
+ 0
+ ],
+ [
+ 182647.058823529,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 183529.411764706,
+ 3,
+ 0
+ ],
+ [
+ 183794.117647059,
+ 3,
+ 0
+ ],
+ [
+ 184058.823529412,
+ 3,
+ 0
+ ],
+ [
+ 184323.529411765,
+ 3,
+ 0
+ ],
+ [
+ 184588.235294118,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 184764.705882353,
+ 3,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 184941.176470588,
+ 1,
+ 0
+ ],
+ [
+ 185117.647058824,
+ 2,
+ 0
+ ],
+ [
+ 185294.117647059,
+ 1,
+ 0
+ ],
+ [
+ 185470.588235294,
+ 2,
+ 0
+ ],
+ [
+ 185558.823529412,
+ 1,
+ 0
+ ],
+ [
+ 185735.294117647,
+ 2,
+ 0
+ ],
+ [
+ 186264.705882353,
+ 3,
+ 0
+ ],
+ [
+ 185823.529411765,
+ 1,
+ 352.941176470588
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 186352.941176471,
+ 3,
+ 0
+ ],
+ [
+ 186441.176470588,
+ 1,
+ 0
+ ],
+ [
+ 186529.411764706,
+ 2,
+ 0
+ ],
+ [
+ 186617.647058824,
+ 0,
+ 0
+ ],
+ [
+ 186705.882352941,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 187058.823529412,
+ 3,
+ 0
+ ],
+ [
+ 187235.294117647,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 187764.705882353,
+ 3,
+ 0
+ ],
+ [
+ 187941.176470588,
+ 1,
+ 0
+ ],
+ [
+ 188117.647058824,
+ 3,
+ 0
+ ],
+ [
+ 188647.058823529,
+ 1,
+ 0
+ ],
+ [
+ 188294.117647059,
+ 1,
+ 176.470588235294
+ ],
+ [
+ 188823.529411765,
+ 3,
+ 0
+ ],
+ [
+ 189000,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 189705.882352941,
+ 3,
+ 0
+ ],
+ [
+ 189794.117647059,
+ 1,
+ 0
+ ],
+ [
+ 190058.823529412,
+ 0,
+ 0
+ ],
+ [
+ 190235.294117647,
+ 3,
+ 0
+ ],
+ [
+ 189352.941176471,
+ 7,
+ 0
+ ],
+ [
+ 189705.882352941,
+ 7,
+ 0
+ ],
+ [
+ 189882.352941176,
+ 6,
+ 0
+ ],
+ [
+ 190058.823529412,
+ 4,
+ 0
+ ],
+ [
+ 190235.294117647,
+ 7,
+ 0
+ ],
+ [
+ 190411.764705882,
+ 5,
+ 0
+ ],
+ [
+ 189176.470588235,
+ 0,
+ 0
+ ],
+ [
+ 189264.705882353,
+ 3,
+ 0
+ ],
+ [
+ 189352.941176471,
+ 0,
+ 0
+ ],
+ [
+ 189441.176470588,
+ 3,
+ 0
+ ],
+ [
+ 189882.352941176,
+ 2,
+ 0
+ ],
+ [
+ 190235.294117647,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 190941.176470588,
+ 1,
+ 0
+ ],
+ [
+ 190588.235294118,
+ 4,
+ 0
+ ],
+ [
+ 190764.705882353,
+ 7,
+ 0
+ ],
+ [
+ 191117.647058824,
+ 4,
+ 0
+ ],
+ [
+ 191294.117647059,
+ 7,
+ 0
+ ],
+ [
+ 191647.058823529,
+ 4,
+ 0
+ ],
+ [
+ 191823.529411765,
+ 7,
+ 0
+ ],
+ [
+ 190941.176470588,
+ 5,
+ 0
+ ],
+ [
+ 191470.588235294,
+ 5,
+ 0
+ ],
+ [
+ 190588.235294118,
+ 3,
+ 0
+ ],
+ [
+ 190852.941176471,
+ 0,
+ 0
+ ],
+ [
+ 190897.058823529,
+ 3,
+ 0
+ ],
+ [
+ 190764.705882353,
+ 2,
+ 0
+ ],
+ [
+ 191117.647058824,
+ 2,
+ 0
+ ],
+ [
+ 191205.882352941,
+ 1,
+ 0
+ ],
+ [
+ 191382.352941176,
+ 2,
+ 0
+ ],
+ [
+ 191470.588235294,
+ 1,
+ 0
+ ],
+ [
+ 191647.058823529,
+ 2,
+ 0
+ ],
+ [
+ 191735.294117647,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 192000,
+ 2,
+ 0
+ ],
+ [
+ 192529.411764706,
+ 2,
+ 0
+ ],
+ [
+ 192705.882352941,
+ 3,
+ 0
+ ],
+ [
+ 192882.352941176,
+ 0,
+ 441.176470588235
+ ],
+ [
+ 192176.470588235,
+ 5,
+ 0
+ ],
+ [
+ 192352.94117647,
+ 5,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 193411.764705882,
+ 3,
+ 0
+ ],
+ [
+ 193588.235294118,
+ 1,
+ 0
+ ],
+ [
+ 194294.117647059,
+ 1,
+ 0
+ ],
+ [
+ 194647.058823529,
+ 3,
+ 0
+ ],
+ [
+ 194470.588235294,
+ 0,
+ 0
+ ],
+ [
+ 193764.705882353,
+ 3,
+ 0
+ ],
+ [
+ 193941.176470588,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 194823.529411765,
+ 3,
+ 0
+ ],
+ [
+ 195352.94117647,
+ 3,
+ 0
+ ],
+ [
+ 195529.411764705,
+ 2,
+ 0
+ ],
+ [
+ 195705.882352941,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 196235.294117647,
+ 1,
+ 0
+ ],
+ [
+ 196411.764705882,
+ 2,
+ 0
+ ],
+ [
+ 196588.235294118,
+ 1,
+ 0
+ ],
+ [
+ 196764.705882353,
+ 2,
+ 0
+ ],
+ [
+ 197117.647058823,
+ 2,
+ 0
+ ],
+ [
+ 197294.117647058,
+ 1,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 197647.058823529,
+ 3,
+ 0
+ ],
+ [
+ 197735.294117647,
+ 1,
+ 0
+ ],
+ [
+ 197823.529411765,
+ 2,
+ 0
+ ],
+ [
+ 197911.764705882,
+ 0,
+ 0
+ ],
+ [
+ 198000,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 198352.941176471,
+ 3,
+ 0
+ ],
+ [
+ 198529.411764706,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 199058.823529412,
+ 3,
+ 0
+ ],
+ [
+ 199235.294117647,
+ 1,
+ 0
+ ],
+ [
+ 199411.764705882,
+ 3,
+ 0
+ ],
+ [
+ 199941.176470588,
+ 1,
+ 0
+ ],
+ [
+ 199588.235294118,
+ 1,
+ 176.470588235294
+ ],
+ [
+ 200117.647058824,
+ 3,
+ 0
+ ],
+ [
+ 200294.117647059,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 201000,
+ 3,
+ 0
+ ],
+ [
+ 201352.941176471,
+ 0,
+ 0
+ ],
+ [
+ 200647.058823529,
+ 7,
+ 0
+ ],
+ [
+ 201000,
+ 7,
+ 0
+ ],
+ [
+ 201176.470588235,
+ 6,
+ 0
+ ],
+ [
+ 201352.941176471,
+ 4,
+ 0
+ ],
+ [
+ 201529.411764706,
+ 7,
+ 0
+ ],
+ [
+ 201705.882352941,
+ 5,
+ 0
+ ],
+ [
+ 200470.588235294,
+ 0,
+ 0
+ ],
+ [
+ 201088.235294117,
+ 1,
+ 0
+ ],
+ [
+ 201176.470588235,
+ 2,
+ 0
+ ],
+ [
+ 201044.117647058,
+ 0,
+ 0
+ ],
+ [
+ 201132.352941176,
+ 3,
+ 0
+ ],
+ [
+ 201529.411764705,
+ 2,
+ 0
+ ],
+ [
+ 201529.411764705,
+ 3,
+ 0
+ ],
+ [
+ 201617.647058823,
+ 1,
+ 0
+ ],
+ [
+ 201617.647058823,
+ 0,
+ 0
+ ],
+ [
+ 201705.882352941,
+ 3,
+ 0
+ ],
+ [
+ 201705.882352941,
+ 2,
+ 0
+ ],
+ [
+ 201794.117647058,
+ 1,
+ 0
+ ],
+ [
+ 201794.117647058,
+ 0,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 201882.352941176,
+ 4,
+ 0
+ ],
+ [
+ 202058.823529412,
+ 7,
+ 0
+ ],
+ [
+ 202411.764705882,
+ 4,
+ 0
+ ],
+ [
+ 202588.235294118,
+ 7,
+ 0
+ ],
+ [
+ 202941.176470588,
+ 4,
+ 0
+ ],
+ [
+ 203117.647058824,
+ 7,
+ 0
+ ],
+ [
+ 202235.294117647,
+ 5,
+ 0
+ ],
+ [
+ 202764.705882353,
+ 5,
+ 0
+ ],
+ [
+ 201882.352941176,
+ 1,
+ 0
+ ],
+ [
+ 202058.823529411,
+ 2,
+ 0
+ ],
+ [
+ 202235.294117647,
+ 1,
+ 0
+ ],
+ [
+ 202411.764705882,
+ 1,
+ 0
+ ],
+ [
+ 202588.235294117,
+ 2,
+ 0
+ ],
+ [
+ 202764.705882353,
+ 1,
+ 0
+ ],
+ [
+ 203029.411764705,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 213529.411764705,
+ 2,
+ 176.470588235294
+ ],
+ [
+ 213529.411764705,
+ 3,
+ 176.470588235294
+ ],
+ [
+ 213882.352941176,
+ 2,
+ 176.470588235294
+ ],
+ [
+ 213882.352941176,
+ 0,
+ 176.470588235294
+ ],
+ [
+ 214235.294117647,
+ 1,
+ 176.470588235294
+ ],
+ [
+ 214235.294117647,
+ 3,
+ 176.470588235294
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ }
+ ],
+ "splashSkin": "noteSplashes",
+ "validScore": false,
+ "gfVersion": "gf",
+ "bpm": 170,
+ "arrowSkin": "",
+ "needsVoices": true,
+ "song": "red-death"
+ }
+}
\ No newline at end of file
diff --git a/assets/preload/data/red-death.json b/assets/preload/data/red-death.json
new file mode 100644
index 000000000..5bb2f56dd
--- /dev/null
+++ b/assets/preload/data/red-death.json
@@ -0,0 +1,6373 @@
+{
+ "song": {
+ "speed": 2.5,
+ "stage": "stage",
+ "player1": "bf",
+ "player2": "tord",
+ "player3": "gf",
+ "events": [],
+ "notes": [
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 0,
+ 2,
+ 0
+ ],
+ [
+ 529.411764705882,
+ 2,
+ 0
+ ],
+ [
+ 705.882352941177,
+ 3,
+ 0
+ ],
+ [
+ 882.352941176471,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 150,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 1411.76470588235,
+ 3,
+ 0
+ ],
+ [
+ 1588.23529411765,
+ 1,
+ 0
+ ],
+ [
+ 2294.11764705882,
+ 1,
+ 0
+ ],
+ [
+ 2647.05882352941,
+ 3,
+ 0
+ ],
+ [
+ 2470.58823529412,
+ 0,
+ 0
+ ],
+ [
+ 1764.70588235294,
+ 3,
+ 0
+ ],
+ [
+ 1941.17647058824,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 150,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 2823.52941176471,
+ 3,
+ 0
+ ],
+ [
+ 3088.23529411765,
+ 3,
+ 0
+ ],
+ [
+ 3352.94117647059,
+ 3,
+ 0
+ ],
+ [
+ 3617.64705882353,
+ 3,
+ 0
+ ],
+ [
+ 3882.35294117647,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 4058.82352941176,
+ 3,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 4235.29411764706,
+ 1,
+ 0
+ ],
+ [
+ 4411.76470588235,
+ 2,
+ 0
+ ],
+ [
+ 4588.23529411765,
+ 1,
+ 0
+ ],
+ [
+ 4764.70588235294,
+ 2,
+ 0
+ ],
+ [
+ 5117.64705882353,
+ 2,
+ 0
+ ],
+ [
+ 5294.11764705882,
+ 3,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 5647.05882352941,
+ 3,
+ 0
+ ],
+ [
+ 5735.29411764706,
+ 1,
+ 0
+ ],
+ [
+ 5823.52941176471,
+ 2,
+ 0
+ ],
+ [
+ 5911.76470588235,
+ 0,
+ 0
+ ],
+ [
+ 6000,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 6352.94117647059,
+ 3,
+ 0
+ ],
+ [
+ 6529.41176470588,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 7058.82352941176,
+ 3,
+ 0
+ ],
+ [
+ 7235.29411764706,
+ 1,
+ 0
+ ],
+ [
+ 7411.76470588235,
+ 3,
+ 0
+ ],
+ [
+ 7941.17647058824,
+ 1,
+ 0
+ ],
+ [
+ 7588.23529411765,
+ 1,
+ 176.470588235294
+ ],
+ [
+ 8117.64705882353,
+ 3,
+ 0
+ ],
+ [
+ 8294.11764705882,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 8470.58823529412,
+ 1,
+ 0
+ ],
+ [
+ 9000,
+ 3,
+ 0
+ ],
+ [
+ 9088.23529411765,
+ 1,
+ 0
+ ],
+ [
+ 9176.47058823529,
+ 3,
+ 0
+ ],
+ [
+ 9264.70588235294,
+ 2,
+ 0
+ ],
+ [
+ 9352.94117647059,
+ 0,
+ 0
+ ],
+ [
+ 9529.41176470588,
+ 3,
+ 0
+ ],
+ [
+ 9617.64705882353,
+ 2,
+ 0
+ ],
+ [
+ 9705.88235294118,
+ 1,
+ 0
+ ],
+ [
+ 9794.11764705882,
+ 0,
+ 0
+ ],
+ [
+ 8647.05882352941,
+ 7,
+ 0
+ ],
+ [
+ 9000,
+ 7,
+ 0
+ ],
+ [
+ 9176.47058823529,
+ 6,
+ 0
+ ],
+ [
+ 9352.94117647059,
+ 4,
+ 0
+ ],
+ [
+ 9529.41176470588,
+ 7,
+ 0
+ ],
+ [
+ 9705.88235294118,
+ 5,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 9882.35294117647,
+ 1,
+ 0
+ ],
+ [
+ 10058.8235294118,
+ 2,
+ 0
+ ],
+ [
+ 10500,
+ 2,
+ 0
+ ],
+ [
+ 10235.2941176471,
+ 1,
+ 0
+ ],
+ [
+ 10764.7058823529,
+ 2,
+ 0
+ ],
+ [
+ 11117.6470588235,
+ 1,
+ 0
+ ],
+ [
+ 9882.35294117647,
+ 4,
+ 0
+ ],
+ [
+ 10058.8235294118,
+ 7,
+ 0
+ ],
+ [
+ 10411.7647058824,
+ 4,
+ 0
+ ],
+ [
+ 10588.2352941176,
+ 7,
+ 0
+ ],
+ [
+ 10941.1764705882,
+ 4,
+ 0
+ ],
+ [
+ 11117.6470588235,
+ 7,
+ 0
+ ],
+ [
+ 10235.2941176471,
+ 5,
+ 0
+ ],
+ [
+ 10764.7058823529,
+ 5,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 11294.1176470588,
+ 2,
+ 0
+ ],
+ [
+ 11823.5294117647,
+ 2,
+ 0
+ ],
+ [
+ 12000,
+ 3,
+ 0
+ ],
+ [
+ 12176.4705882353,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 12705.8823529412,
+ 3,
+ 0
+ ],
+ [
+ 12882.3529411765,
+ 1,
+ 0
+ ],
+ [
+ 13588.2352941176,
+ 1,
+ 0
+ ],
+ [
+ 13941.1764705882,
+ 3,
+ 0
+ ],
+ [
+ 13764.7058823529,
+ 0,
+ 0
+ ],
+ [
+ 13058.8235294118,
+ 3,
+ 0
+ ],
+ [
+ 13235.2941176471,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 14117.6470588235,
+ 3,
+ 0
+ ],
+ [
+ 14382.3529411765,
+ 3,
+ 0
+ ],
+ [
+ 14647.0588235294,
+ 3,
+ 0
+ ],
+ [
+ 14911.7647058824,
+ 3,
+ 0
+ ],
+ [
+ 15176.4705882353,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 15352.9411764706,
+ 3,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 15529.4117647059,
+ 1,
+ 0
+ ],
+ [
+ 15705.8823529412,
+ 2,
+ 0
+ ],
+ [
+ 15882.3529411765,
+ 1,
+ 0
+ ],
+ [
+ 16058.8235294118,
+ 2,
+ 0
+ ],
+ [
+ 16147.0588235294,
+ 1,
+ 0
+ ],
+ [
+ 16323.5294117647,
+ 2,
+ 0
+ ],
+ [
+ 16852.9411764706,
+ 3,
+ 0
+ ],
+ [
+ 16411.7647058824,
+ 1,
+ 352.941176470588
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 16941.1764705882,
+ 3,
+ 0
+ ],
+ [
+ 17029.4117647059,
+ 1,
+ 0
+ ],
+ [
+ 17117.6470588235,
+ 2,
+ 0
+ ],
+ [
+ 17205.8823529412,
+ 0,
+ 0
+ ],
+ [
+ 17294.1176470588,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 17647.0588235294,
+ 3,
+ 0
+ ],
+ [
+ 17823.5294117647,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 18352.9411764706,
+ 3,
+ 0
+ ],
+ [
+ 18529.4117647059,
+ 1,
+ 0
+ ],
+ [
+ 18705.8823529412,
+ 3,
+ 0
+ ],
+ [
+ 19235.2941176471,
+ 1,
+ 0
+ ],
+ [
+ 18882.3529411765,
+ 1,
+ 176.470588235294
+ ],
+ [
+ 19411.7647058824,
+ 3,
+ 0
+ ],
+ [
+ 19588.2352941176,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 20294.1176470588,
+ 3,
+ 0
+ ],
+ [
+ 20382.3529411765,
+ 1,
+ 0
+ ],
+ [
+ 20647.0588235294,
+ 0,
+ 0
+ ],
+ [
+ 20823.5294117647,
+ 3,
+ 0
+ ],
+ [
+ 19941.1764705882,
+ 7,
+ 0
+ ],
+ [
+ 20294.1176470588,
+ 7,
+ 0
+ ],
+ [
+ 20470.5882352941,
+ 6,
+ 0
+ ],
+ [
+ 20647.0588235294,
+ 4,
+ 0
+ ],
+ [
+ 20823.5294117647,
+ 7,
+ 0
+ ],
+ [
+ 21000,
+ 5,
+ 0
+ ],
+ [
+ 19764.7058823529,
+ 0,
+ 0
+ ],
+ [
+ 19852.9411764706,
+ 3,
+ 0
+ ],
+ [
+ 19941.1764705882,
+ 0,
+ 0
+ ],
+ [
+ 20029.4117647059,
+ 3,
+ 0
+ ],
+ [
+ 20470.5882352941,
+ 2,
+ 0
+ ],
+ [
+ 20823.5294117647,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 21529.4117647059,
+ 1,
+ 0
+ ],
+ [
+ 21176.4705882353,
+ 4,
+ 0
+ ],
+ [
+ 21352.9411764706,
+ 7,
+ 0
+ ],
+ [
+ 21705.8823529412,
+ 4,
+ 0
+ ],
+ [
+ 21882.3529411765,
+ 7,
+ 0
+ ],
+ [
+ 22235.2941176471,
+ 4,
+ 0
+ ],
+ [
+ 22411.7647058824,
+ 7,
+ 0
+ ],
+ [
+ 21529.4117647059,
+ 5,
+ 0
+ ],
+ [
+ 22058.8235294118,
+ 5,
+ 0
+ ],
+ [
+ 21176.4705882353,
+ 3,
+ 0
+ ],
+ [
+ 21441.1764705882,
+ 0,
+ 0
+ ],
+ [
+ 21485.2941176471,
+ 3,
+ 0
+ ],
+ [
+ 21352.9411764706,
+ 2,
+ 0
+ ],
+ [
+ 21705.8823529412,
+ 2,
+ 0
+ ],
+ [
+ 21794.1176470588,
+ 1,
+ 0
+ ],
+ [
+ 21970.5882352941,
+ 2,
+ 0
+ ],
+ [
+ 22058.8235294118,
+ 1,
+ 0
+ ],
+ [
+ 22235.2941176471,
+ 2,
+ 0
+ ],
+ [
+ 22323.5294117647,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 33882.3529411765,
+ 2,
+ 0
+ ],
+ [
+ 33970.5882352941,
+ 1,
+ 0
+ ],
+ [
+ 34147.0588235294,
+ 1,
+ 0
+ ],
+ [
+ 34235.2941176471,
+ 2,
+ 0
+ ],
+ [
+ 34500,
+ 2,
+ 0
+ ],
+ [
+ 34764.7058823529,
+ 2,
+ 0
+ ],
+ [
+ 35029.4117647059,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 35294.1176470588,
+ 2,
+ 176.470588235294
+ ],
+ [
+ 35647.0588235294,
+ 2,
+ 0
+ ],
+ [
+ 36441.1764705882,
+ 3,
+ 0
+ ],
+ [
+ 36617.6470588235,
+ 3,
+ 0
+ ],
+ [
+ 36352.9411764706,
+ 1,
+ 0
+ ],
+ [
+ 36529.4117647059,
+ 1,
+ 0
+ ],
+ [
+ 36000,
+ 0,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 36705.8823529412,
+ 0,
+ 0
+ ],
+ [
+ 36882.3529411765,
+ 0,
+ 0
+ ],
+ [
+ 37058.8235294118,
+ 2,
+ 0
+ ],
+ [
+ 37235.294117647,
+ 2,
+ 0
+ ],
+ [
+ 37411.7647058823,
+ 0,
+ 0
+ ],
+ [
+ 37588.2352941176,
+ 1,
+ 0
+ ],
+ [
+ 37764.7058823529,
+ 2,
+ 0
+ ],
+ [
+ 38029.4117647059,
+ 2,
+ 0
+ ],
+ [
+ 37897.0588235294,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 38117.6470588235,
+ 3,
+ 264.705882352941
+ ],
+ [
+ 38117.6470588235,
+ 1,
+ 264.705882352941
+ ],
+ [
+ 38470.5882352941,
+ 0,
+ 0
+ ],
+ [
+ 38470.5882352941,
+ 2,
+ 0
+ ],
+ [
+ 38558.8235294118,
+ 2,
+ 0
+ ],
+ [
+ 38558.8235294118,
+ 0,
+ 0
+ ],
+ [
+ 38647.0588235294,
+ 0,
+ 0
+ ],
+ [
+ 38647.0588235294,
+ 2,
+ 0
+ ],
+ [
+ 38735.294117647,
+ 2,
+ 0
+ ],
+ [
+ 38735.294117647,
+ 0,
+ 0
+ ],
+ [
+ 38823.5294117647,
+ 3,
+ 617.647058823529
+ ],
+ [
+ 38823.5294117647,
+ 1,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 39529.4117647059,
+ 2,
+ 0
+ ],
+ [
+ 39705.8823529412,
+ 2,
+ 0
+ ],
+ [
+ 39617.6470588235,
+ 7,
+ 0
+ ],
+ [
+ 39794.1176470588,
+ 7,
+ 0
+ ],
+ [
+ 39529.4117647059,
+ 4,
+ 0
+ ],
+ [
+ 39705.8823529412,
+ 4,
+ 0
+ ],
+ [
+ 39882.3529411765,
+ 1,
+ 0
+ ],
+ [
+ 40235.294117647,
+ 1,
+ 0
+ ],
+ [
+ 40323.5294117647,
+ 3,
+ 0
+ ],
+ [
+ 40411.7647058823,
+ 2,
+ 0
+ ],
+ [
+ 40588.2352941176,
+ 0,
+ 0
+ ],
+ [
+ 40764.7058823529,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 40941.1764705882,
+ 2,
+ 0
+ ],
+ [
+ 41029.4117647059,
+ 1,
+ 0
+ ],
+ [
+ 41117.6470588235,
+ 0,
+ 0
+ ],
+ [
+ 41205.8823529412,
+ 3,
+ 0
+ ],
+ [
+ 41294.1176470588,
+ 2,
+ 0
+ ],
+ [
+ 41382.3529411765,
+ 1,
+ 0
+ ],
+ [
+ 41470.5882352941,
+ 0,
+ 0
+ ],
+ [
+ 41558.8235294117,
+ 1,
+ 0
+ ],
+ [
+ 41647.0588235294,
+ 2,
+ 0
+ ],
+ [
+ 41735.294117647,
+ 1,
+ 0
+ ],
+ [
+ 41823.5294117647,
+ 3,
+ 0
+ ],
+ [
+ 41911.7647058823,
+ 0,
+ 0
+ ],
+ [
+ 42000,
+ 2,
+ 0
+ ],
+ [
+ 42088.2352941176,
+ 3,
+ 0
+ ],
+ [
+ 42176.4705882353,
+ 0,
+ 0
+ ],
+ [
+ 42264.7058823529,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 42352.9411764706,
+ 0,
+ 0
+ ],
+ [
+ 42529.4117647059,
+ 0,
+ 0
+ ],
+ [
+ 42705.8823529412,
+ 2,
+ 0
+ ],
+ [
+ 42882.3529411764,
+ 2,
+ 0
+ ],
+ [
+ 43058.8235294117,
+ 0,
+ 0
+ ],
+ [
+ 43235.294117647,
+ 3,
+ 0
+ ],
+ [
+ 43411.7647058823,
+ 2,
+ 0
+ ],
+ [
+ 43588.2352941176,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 43764.7058823529,
+ 3,
+ 264.705882352941
+ ],
+ [
+ 43764.7058823529,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 44117.6470588235,
+ 1,
+ 264.705882352941
+ ],
+ [
+ 44470.5882352941,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 44823.5294117647,
+ 3,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 45176.4705882353,
+ 3,
+ 0
+ ],
+ [
+ 45264.7058823529,
+ 0,
+ 0
+ ],
+ [
+ 45352.9411764706,
+ 3,
+ 0
+ ],
+ [
+ 45441.1764705882,
+ 0,
+ 0
+ ],
+ [
+ 45529.4117647059,
+ 3,
+ 0
+ ],
+ [
+ 45882.3529411764,
+ 3,
+ 0
+ ],
+ [
+ 46235.294117647,
+ 3,
+ 264.705882352941
+ ],
+ [
+ 46411.7647058823,
+ 1,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 46588.2352941176,
+ 0,
+ 0
+ ],
+ [
+ 46764.7058823529,
+ 1,
+ 0
+ ],
+ [
+ 46941.1764705882,
+ 3,
+ 0
+ ],
+ [
+ 47205.8823529411,
+ 2,
+ 0
+ ],
+ [
+ 47294.1176470588,
+ 0,
+ 0
+ ],
+ [
+ 47470.5882352941,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 47823.5294117647,
+ 1,
+ 0
+ ],
+ [
+ 47911.7647058823,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 48000,
+ 1,
+ 0
+ ],
+ [
+ 48176.4705882353,
+ 1,
+ 0
+ ],
+ [
+ 48352.9411764706,
+ 1,
+ 0
+ ],
+ [
+ 48441.1764705882,
+ 3,
+ 0
+ ],
+ [
+ 48529.4117647058,
+ 1,
+ 0
+ ],
+ [
+ 48617.6470588235,
+ 3,
+ 0
+ ],
+ [
+ 48705.8823529411,
+ 1,
+ 0
+ ],
+ [
+ 48794.1176470588,
+ 3,
+ 0
+ ],
+ [
+ 48882.3529411764,
+ 1,
+ 0
+ ],
+ [
+ 49058.8235294117,
+ 1,
+ 0
+ ],
+ [
+ 49235.294117647,
+ 1,
+ 0
+ ],
+ [
+ 49323.5294117647,
+ 3,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 49411.7647058823,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 49764.7058823529,
+ 2,
+ 0
+ ],
+ [
+ 49808.8235294117,
+ 1,
+ 0
+ ],
+ [
+ 49852.9411764706,
+ 0,
+ 0
+ ],
+ [
+ 49897.0588235294,
+ 1,
+ 0
+ ],
+ [
+ 49941.1764705882,
+ 2,
+ 0
+ ],
+ [
+ 49985.294117647,
+ 3,
+ 0
+ ],
+ [
+ 50029.4117647058,
+ 2,
+ 0
+ ],
+ [
+ 50073.5294117647,
+ 1,
+ 0
+ ],
+ [
+ 50117.6470588235,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 50470.5882352941,
+ 3,
+ 0
+ ],
+ [
+ 50558.8235294117,
+ 3,
+ 0
+ ],
+ [
+ 50647.0588235294,
+ 3,
+ 0
+ ],
+ [
+ 50735.294117647,
+ 3,
+ 0
+ ],
+ [
+ 50691.1764705882,
+ 0,
+ 0
+ ],
+ [
+ 50779.4117647058,
+ 0,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 50911.7647058823,
+ 0,
+ 0
+ ],
+ [
+ 51088.2352941176,
+ 0,
+ 0
+ ],
+ [
+ 50823.5294117647,
+ 2,
+ 0
+ ],
+ [
+ 51000,
+ 2,
+ 0
+ ],
+ [
+ 51176.4705882353,
+ 2,
+ 0
+ ],
+ [
+ 51529.4117647058,
+ 2,
+ 0
+ ],
+ [
+ 51882.3529411764,
+ 2,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 52235.294117647,
+ 2,
+ 0
+ ],
+ [
+ 52411.7647058823,
+ 0,
+ 0
+ ],
+ [
+ 52588.2352941176,
+ 2,
+ 0
+ ],
+ [
+ 52764.7058823529,
+ 3,
+ 0
+ ],
+ [
+ 52941.1764705882,
+ 2,
+ 0
+ ],
+ [
+ 53117.6470588235,
+ 0,
+ 0
+ ],
+ [
+ 53294.1176470588,
+ 2,
+ 0
+ ],
+ [
+ 53470.5882352941,
+ 3,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 53647.0588235294,
+ 1,
+ 0
+ ],
+ [
+ 53823.5294117647,
+ 1,
+ 0
+ ],
+ [
+ 53999.9999999999,
+ 2,
+ 0
+ ],
+ [
+ 54088.2352941176,
+ 3,
+ 0
+ ],
+ [
+ 54176.4705882352,
+ 1,
+ 0
+ ],
+ [
+ 54529.4117647058,
+ 2,
+ 0
+ ],
+ [
+ 54882.3529411764,
+ 2,
+ 0
+ ],
+ [
+ 54352.9411764705,
+ 0,
+ 0
+ ],
+ [
+ 54705.8823529411,
+ 0,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 55058.8235294117,
+ 0,
+ 617.647058823529
+ ],
+ [
+ 55764.7058823529,
+ 2,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 56470.5882352941,
+ 1,
+ 1323.52941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 67764.7058823529,
+ 0,
+ 176.470588235294
+ ],
+ [
+ 68294.1176470588,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 68647.0588235293,
+ 3,
+ 0
+ ],
+ [
+ 68823.5294117646,
+ 2,
+ 88.2352941176471
+ ],
+ [
+ 68999.9999999999,
+ 0,
+ 0
+ ],
+ [
+ 69044.1176470588,
+ 2,
+ 0
+ ],
+ [
+ 69088.2352941176,
+ 0,
+ 0
+ ],
+ [
+ 69132.3529411764,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 69176.4705882352,
+ 3,
+ 0
+ ],
+ [
+ 69529.4117647058,
+ 3,
+ 0
+ ],
+ [
+ 69617.6470588235,
+ 1,
+ 0
+ ],
+ [
+ 69794.1176470587,
+ 1,
+ 0
+ ],
+ [
+ 69882.3529411764,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 70058.8235294117,
+ 3,
+ 0
+ ],
+ [
+ 70411.7647058823,
+ 1,
+ 0
+ ],
+ [
+ 70411.7647058823,
+ 2,
+ 0
+ ],
+ [
+ 70411.7647058823,
+ 3,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 70588.2352941176,
+ 2,
+ 176.470588235294
+ ],
+ [
+ 71117.6470588235,
+ 3,
+ 0
+ ],
+ [
+ 71294.1176470587,
+ 2,
+ 0
+ ],
+ [
+ 71249.9999999999,
+ 1,
+ 0
+ ],
+ [
+ 71470.588235294,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 71823.5294117646,
+ 3,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 71999.9999999999,
+ 2,
+ 176.470588235294
+ ],
+ [
+ 72352.9411764705,
+ 2,
+ 0
+ ],
+ [
+ 72441.1764705882,
+ 0,
+ 0
+ ],
+ [
+ 72529.4117647058,
+ 1,
+ 0
+ ],
+ [
+ 72882.3529411764,
+ 2,
+ 0
+ ],
+ [
+ 73058.8235294117,
+ 0,
+ 0
+ ],
+ [
+ 73235.294117647,
+ 1,
+ 0
+ ],
+ [
+ 72882.3529411764,
+ 1,
+ 0
+ ],
+ [
+ 73058.8235294117,
+ 3,
+ 0
+ ],
+ [
+ 73235.294117647,
+ 3,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 73411.7647058823,
+ 0,
+ 176.470588235294
+ ],
+ [
+ 73852.9411764705,
+ 0,
+ 0
+ ],
+ [
+ 73874.9999999999,
+ 1,
+ 0
+ ],
+ [
+ 73897.0588235293,
+ 2,
+ 0
+ ],
+ [
+ 73919.1176470587,
+ 3,
+ 0
+ ],
+ [
+ 74117.6470588234,
+ 0,
+ 0
+ ],
+ [
+ 74294.1176470587,
+ 2,
+ 0
+ ],
+ [
+ 74382.3529411764,
+ 0,
+ 0
+ ],
+ [
+ 74205.8823529411,
+ 3,
+ 0
+ ],
+ [
+ 74426.4705882352,
+ 3,
+ 0
+ ],
+ [
+ 74470.588235294,
+ 0,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 74823.5294117646,
+ 2,
+ 0
+ ],
+ [
+ 75220.588235294,
+ 0,
+ 0
+ ],
+ [
+ 75308.8235294117,
+ 0,
+ 0
+ ],
+ [
+ 75176.4705882352,
+ 1,
+ 0
+ ],
+ [
+ 75264.7058823528,
+ 1,
+ 0
+ ],
+ [
+ 75352.9411764705,
+ 1,
+ 0
+ ],
+ [
+ 75397.0588235293,
+ 0,
+ 0
+ ],
+ [
+ 75441.1764705881,
+ 1,
+ 0
+ ],
+ [
+ 75485.294117647,
+ 0,
+ 0
+ ],
+ [
+ 75529.4117647058,
+ 2,
+ 0
+ ],
+ [
+ 75705.8823529411,
+ 2,
+ 0
+ ],
+ [
+ 76058.8235294117,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 76235.294117647,
+ 0,
+ 0
+ ],
+ [
+ 76411.7647058823,
+ 0,
+ 0
+ ],
+ [
+ 76588.2352941175,
+ 3,
+ 0
+ ],
+ [
+ 76764.7058823528,
+ 0,
+ 0
+ ],
+ [
+ 76941.1764705881,
+ 3,
+ 0
+ ],
+ [
+ 77117.6470588234,
+ 2,
+ 0
+ ],
+ [
+ 77294.1176470587,
+ 0,
+ 0
+ ],
+ [
+ 77470.588235294,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 77647.0588235293,
+ 2,
+ 441.176470588235
+ ],
+ [
+ 78176.4705882352,
+ 3,
+ 0
+ ],
+ [
+ 78352.9411764705,
+ 2,
+ 529.411764705882
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 79058.8235294118,
+ 2,
+ 0
+ ],
+ [
+ 79588.2352941177,
+ 2,
+ 0
+ ],
+ [
+ 79764.7058823529,
+ 3,
+ 0
+ ],
+ [
+ 79941.1764705882,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 80470.5882352941,
+ 3,
+ 0
+ ],
+ [
+ 80647.0588235294,
+ 1,
+ 0
+ ],
+ [
+ 81352.9411764706,
+ 1,
+ 0
+ ],
+ [
+ 81705.8823529412,
+ 3,
+ 0
+ ],
+ [
+ 81529.4117647059,
+ 0,
+ 0
+ ],
+ [
+ 80823.5294117646,
+ 3,
+ 0
+ ],
+ [
+ 80999.9999999999,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 81882.3529411765,
+ 3,
+ 0
+ ],
+ [
+ 82147.0588235294,
+ 3,
+ 0
+ ],
+ [
+ 82411.7647058823,
+ 3,
+ 0
+ ],
+ [
+ 82676.4705882353,
+ 3,
+ 0
+ ],
+ [
+ 82941.1764705882,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 83117.6470588235,
+ 3,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 83294.1176470588,
+ 1,
+ 0
+ ],
+ [
+ 83470.5882352941,
+ 2,
+ 0
+ ],
+ [
+ 83647.0588235294,
+ 1,
+ 0
+ ],
+ [
+ 83823.5294117647,
+ 2,
+ 0
+ ],
+ [
+ 84176.4705882353,
+ 2,
+ 0
+ ],
+ [
+ 84352.9411764706,
+ 3,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 84705.8823529412,
+ 3,
+ 0
+ ],
+ [
+ 84794.1176470588,
+ 1,
+ 0
+ ],
+ [
+ 84882.3529411765,
+ 2,
+ 0
+ ],
+ [
+ 84970.5882352941,
+ 0,
+ 0
+ ],
+ [
+ 85058.8235294118,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 85411.7647058823,
+ 3,
+ 0
+ ],
+ [
+ 85588.2352941177,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 86117.6470588235,
+ 3,
+ 0
+ ],
+ [
+ 86294.1176470588,
+ 1,
+ 0
+ ],
+ [
+ 86470.5882352941,
+ 3,
+ 0
+ ],
+ [
+ 87000,
+ 1,
+ 0
+ ],
+ [
+ 86647.0588235294,
+ 1,
+ 176.470588235294
+ ],
+ [
+ 87176.4705882353,
+ 3,
+ 0
+ ],
+ [
+ 87352.9411764706,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 87529.4117647059,
+ 1,
+ 0
+ ],
+ [
+ 88058.8235294118,
+ 3,
+ 0
+ ],
+ [
+ 88147.0588235294,
+ 1,
+ 0
+ ],
+ [
+ 88235.294117647,
+ 3,
+ 0
+ ],
+ [
+ 88323.5294117647,
+ 2,
+ 0
+ ],
+ [
+ 88411.7647058823,
+ 0,
+ 0
+ ],
+ [
+ 88588.2352941177,
+ 3,
+ 0
+ ],
+ [
+ 88676.4705882353,
+ 2,
+ 0
+ ],
+ [
+ 88764.7058823529,
+ 1,
+ 0
+ ],
+ [
+ 88852.9411764706,
+ 0,
+ 0
+ ],
+ [
+ 87705.8823529412,
+ 7,
+ 0
+ ],
+ [
+ 88058.8235294118,
+ 7,
+ 0
+ ],
+ [
+ 88235.294117647,
+ 6,
+ 0
+ ],
+ [
+ 88411.7647058823,
+ 4,
+ 0
+ ],
+ [
+ 88588.2352941177,
+ 7,
+ 0
+ ],
+ [
+ 88764.7058823529,
+ 5,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 88941.1764705882,
+ 1,
+ 0
+ ],
+ [
+ 89117.6470588235,
+ 2,
+ 0
+ ],
+ [
+ 89558.8235294118,
+ 2,
+ 0
+ ],
+ [
+ 89294.1176470588,
+ 1,
+ 0
+ ],
+ [
+ 89823.5294117647,
+ 2,
+ 0
+ ],
+ [
+ 90176.4705882353,
+ 1,
+ 0
+ ],
+ [
+ 88941.1764705882,
+ 4,
+ 0
+ ],
+ [
+ 89117.6470588235,
+ 7,
+ 0
+ ],
+ [
+ 89470.5882352941,
+ 4,
+ 0
+ ],
+ [
+ 89647.0588235294,
+ 7,
+ 0
+ ],
+ [
+ 90000,
+ 4,
+ 0
+ ],
+ [
+ 90176.4705882353,
+ 7,
+ 0
+ ],
+ [
+ 89294.1176470588,
+ 5,
+ 0
+ ],
+ [
+ 89823.5294117647,
+ 5,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 90352.9411764706,
+ 2,
+ 0
+ ],
+ [
+ 90882.3529411765,
+ 2,
+ 0
+ ],
+ [
+ 91058.8235294118,
+ 3,
+ 0
+ ],
+ [
+ 91235.294117647,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 91764.7058823529,
+ 3,
+ 0
+ ],
+ [
+ 91941.1764705882,
+ 1,
+ 0
+ ],
+ [
+ 92647.0588235294,
+ 1,
+ 0
+ ],
+ [
+ 93000,
+ 3,
+ 0
+ ],
+ [
+ 92823.5294117647,
+ 0,
+ 0
+ ],
+ [
+ 92117.6470588234,
+ 3,
+ 0
+ ],
+ [
+ 92294.1176470587,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 93176.4705882353,
+ 3,
+ 0
+ ],
+ [
+ 93441.1764705882,
+ 3,
+ 0
+ ],
+ [
+ 93705.8823529412,
+ 3,
+ 0
+ ],
+ [
+ 93970.5882352941,
+ 3,
+ 0
+ ],
+ [
+ 94235.294117647,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 94411.7647058823,
+ 3,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 94588.2352941177,
+ 1,
+ 0
+ ],
+ [
+ 94764.7058823529,
+ 2,
+ 0
+ ],
+ [
+ 94941.1764705882,
+ 1,
+ 0
+ ],
+ [
+ 95117.6470588235,
+ 2,
+ 0
+ ],
+ [
+ 95205.8823529412,
+ 1,
+ 0
+ ],
+ [
+ 95382.3529411765,
+ 2,
+ 0
+ ],
+ [
+ 95911.7647058823,
+ 3,
+ 0
+ ],
+ [
+ 95470.5882352941,
+ 1,
+ 352.941176470588
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 96000,
+ 3,
+ 0
+ ],
+ [
+ 96088.2352941177,
+ 1,
+ 0
+ ],
+ [
+ 96176.4705882353,
+ 2,
+ 0
+ ],
+ [
+ 96264.7058823529,
+ 0,
+ 0
+ ],
+ [
+ 96352.9411764706,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 96705.8823529412,
+ 3,
+ 0
+ ],
+ [
+ 96882.3529411765,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 97411.7647058823,
+ 3,
+ 0
+ ],
+ [
+ 97588.2352941177,
+ 1,
+ 0
+ ],
+ [
+ 97764.7058823529,
+ 3,
+ 0
+ ],
+ [
+ 98294.1176470588,
+ 1,
+ 0
+ ],
+ [
+ 97941.1764705882,
+ 1,
+ 176.470588235294
+ ],
+ [
+ 98470.5882352941,
+ 3,
+ 0
+ ],
+ [
+ 98647.0588235294,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 99352.9411764706,
+ 3,
+ 0
+ ],
+ [
+ 99441.1764705882,
+ 1,
+ 0
+ ],
+ [
+ 99705.8823529412,
+ 0,
+ 0
+ ],
+ [
+ 99882.3529411765,
+ 3,
+ 0
+ ],
+ [
+ 99000,
+ 7,
+ 0
+ ],
+ [
+ 99352.9411764706,
+ 7,
+ 0
+ ],
+ [
+ 99529.4117647059,
+ 6,
+ 0
+ ],
+ [
+ 99705.8823529412,
+ 4,
+ 0
+ ],
+ [
+ 99882.3529411765,
+ 7,
+ 0
+ ],
+ [
+ 100058.823529412,
+ 5,
+ 0
+ ],
+ [
+ 98823.5294117647,
+ 0,
+ 0
+ ],
+ [
+ 98911.7647058823,
+ 3,
+ 0
+ ],
+ [
+ 99000,
+ 0,
+ 0
+ ],
+ [
+ 99088.2352941177,
+ 3,
+ 0
+ ],
+ [
+ 99529.4117647059,
+ 2,
+ 0
+ ],
+ [
+ 99882.3529411765,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 100588.235294118,
+ 1,
+ 0
+ ],
+ [
+ 100235.294117647,
+ 4,
+ 0
+ ],
+ [
+ 100411.764705882,
+ 7,
+ 0
+ ],
+ [
+ 100764.705882353,
+ 4,
+ 0
+ ],
+ [
+ 100941.176470588,
+ 7,
+ 0
+ ],
+ [
+ 101294.117647059,
+ 4,
+ 0
+ ],
+ [
+ 101470.588235294,
+ 7,
+ 0
+ ],
+ [
+ 100588.235294118,
+ 5,
+ 0
+ ],
+ [
+ 101117.647058824,
+ 5,
+ 0
+ ],
+ [
+ 100235.294117647,
+ 3,
+ 0
+ ],
+ [
+ 100500,
+ 0,
+ 0
+ ],
+ [
+ 100544.117647059,
+ 3,
+ 0
+ ],
+ [
+ 100411.764705882,
+ 2,
+ 0
+ ],
+ [
+ 100764.705882353,
+ 2,
+ 0
+ ],
+ [
+ 100852.941176471,
+ 1,
+ 0
+ ],
+ [
+ 101029.411764706,
+ 2,
+ 0
+ ],
+ [
+ 101117.647058824,
+ 1,
+ 0
+ ],
+ [
+ 101294.117647059,
+ 2,
+ 0
+ ],
+ [
+ 101382.352941176,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 101647.058823529,
+ 3,
+ 0
+ ],
+ [
+ 102000,
+ 1,
+ 0
+ ],
+ [
+ 102264.705882353,
+ 1,
+ 0
+ ],
+ [
+ 102529.411764706,
+ 1,
+ 0
+ ],
+ [
+ 102794.117647059,
+ 1,
+ 0
+ ],
+ [
+ 101693.382352941,
+ 0,
+ 0
+ ],
+ [
+ 101953.676470588,
+ 0,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 103058.823529412,
+ 0,
+ 794.117647058823
+ ],
+ [
+ 103941.176470588,
+ 2,
+ 0
+ ],
+ [
+ 104117.647058823,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 104294.117647059,
+ 1,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 104470.588235294,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 104823.529411765,
+ 3,
+ 264.705882352941
+ ],
+ [
+ 105176.470588235,
+ 1,
+ 264.705882352941
+ ],
+ [
+ 105529.411764706,
+ 0,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 105882.352941176,
+ 3,
+ 264.705882352941
+ ],
+ [
+ 106235.294117647,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 106588.235294117,
+ 2,
+ 0
+ ],
+ [
+ 106764.705882353,
+ 3,
+ 0
+ ],
+ [
+ 106941.176470588,
+ 2,
+ 0
+ ],
+ [
+ 107117.647058823,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 107294.117647059,
+ 1,
+ 0
+ ],
+ [
+ 107470.588235294,
+ 1,
+ 0
+ ],
+ [
+ 107647.058823529,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 108000,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 108352.94117647,
+ 1,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 108705.882352941,
+ 2,
+ 176.470588235294
+ ],
+ [
+ 109058.823529412,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 109411.764705882,
+ 3,
+ 264.705882352941
+ ],
+ [
+ 109764.705882353,
+ 2,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 110470.588235294,
+ 3,
+ 264.705882352941
+ ],
+ [
+ 110823.529411765,
+ 1,
+ 264.705882352941
+ ],
+ [
+ 111176.470588235,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 110117.647058823,
+ 1,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 111529.411764706,
+ 3,
+ 264.705882352941
+ ],
+ [
+ 111882.352941176,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 112235.294117647,
+ 1,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 112941.176470588,
+ 3,
+ 0
+ ],
+ [
+ 113029.411764706,
+ 2,
+ 0
+ ],
+ [
+ 113117.647058823,
+ 3,
+ 0
+ ],
+ [
+ 113294.117647059,
+ 2,
+ 0
+ ],
+ [
+ 113382.352941176,
+ 2,
+ 0
+ ],
+ [
+ 113338.235294117,
+ 0,
+ 0
+ ],
+ [
+ 113316.176470588,
+ 3,
+ 0
+ ],
+ [
+ 113404.411764706,
+ 3,
+ 0
+ ],
+ [
+ 113360.294117647,
+ 1,
+ 0
+ ],
+ [
+ 113426.470588235,
+ 0,
+ 0
+ ],
+ [
+ 113448.529411765,
+ 1,
+ 0
+ ],
+ [
+ 113470.588235294,
+ 2,
+ 0
+ ],
+ [
+ 113492.647058823,
+ 3,
+ 0
+ ],
+ [
+ 113514.705882353,
+ 0,
+ 0
+ ],
+ [
+ 113536.764705882,
+ 1,
+ 0
+ ],
+ [
+ 113558.823529412,
+ 2,
+ 0
+ ],
+ [
+ 113580.882352941,
+ 3,
+ 0
+ ],
+ [
+ 113647.058823529,
+ 0,
+ 0
+ ],
+ [
+ 113735.294117647,
+ 2,
+ 0
+ ],
+ [
+ 113823.529411765,
+ 1,
+ 0
+ ],
+ [
+ 113911.764705882,
+ 2,
+ 0
+ ],
+ [
+ 114000,
+ 3,
+ 264.705882352941
+ ],
+ [
+ 114088.235294117,
+ 1,
+ 0
+ ],
+ [
+ 114176.470588235,
+ 0,
+ 0
+ ],
+ [
+ 114264.705882353,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 114352.94117647,
+ 0,
+ 0
+ ],
+ [
+ 114529.411764706,
+ 0,
+ 0
+ ],
+ [
+ 114617.647058823,
+ 2,
+ 0
+ ],
+ [
+ 114794.117647059,
+ 2,
+ 0
+ ],
+ [
+ 114882.352941176,
+ 1,
+ 0
+ ],
+ [
+ 114705.882352941,
+ 3,
+ 0
+ ],
+ [
+ 114441.176470588,
+ 1,
+ 0
+ ],
+ [
+ 114970.588235294,
+ 2,
+ 0
+ ],
+ [
+ 115147.058823529,
+ 3,
+ 0
+ ],
+ [
+ 115235.294117647,
+ 2,
+ 0
+ ],
+ [
+ 115323.529411765,
+ 0,
+ 0
+ ],
+ [
+ 115058.823529412,
+ 2,
+ 0
+ ],
+ [
+ 115411.764705882,
+ 1,
+ 264.705882352941
+ ],
+ [
+ 115500,
+ 2,
+ 0
+ ],
+ [
+ 115588.235294117,
+ 2,
+ 0
+ ],
+ [
+ 115676.470588235,
+ 2,
+ 0
+ ],
+ [
+ 115235.294117647,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 115764.705882353,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 115764.705882353,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 116117.647058823,
+ 1,
+ 0
+ ],
+ [
+ 116205.882352941,
+ 1,
+ 0
+ ],
+ [
+ 116155.147058823,
+ 3,
+ 0
+ ],
+ [
+ 116252.205882353,
+ 3,
+ 0
+ ],
+ [
+ 116294.117647059,
+ 1,
+ 0
+ ],
+ [
+ 116351.470588235,
+ 3,
+ 0
+ ],
+ [
+ 116382.352941176,
+ 1,
+ 0
+ ],
+ [
+ 116470.588235294,
+ 2,
+ 176.470588235294
+ ],
+ [
+ 116470.588235294,
+ 0,
+ 176.470588235294
+ ],
+ [
+ 116823.529411765,
+ 2,
+ 176.470588235294
+ ],
+ [
+ 116823.529411765,
+ 0,
+ 176.470588235294
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 117176.470588235,
+ 2,
+ 617.647058823529
+ ],
+ [
+ 117176.470588235,
+ 3,
+ 617.647058823529
+ ],
+ [
+ 117882.352941176,
+ 0,
+ 0
+ ],
+ [
+ 118058.823529412,
+ 2,
+ 0
+ ],
+ [
+ 118235.294117647,
+ 0,
+ 0
+ ],
+ [
+ 118411.764705882,
+ 1,
+ 0
+ ],
+ [
+ 118058.823529412,
+ 3,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 118588.235294117,
+ 2,
+ 0
+ ],
+ [
+ 118676.470588235,
+ 1,
+ 0
+ ],
+ [
+ 118764.705882353,
+ 2,
+ 0
+ ],
+ [
+ 118852.94117647,
+ 2,
+ 0
+ ],
+ [
+ 118941.176470588,
+ 1,
+ 0
+ ],
+ [
+ 119029.411764706,
+ 0,
+ 0
+ ],
+ [
+ 119117.647058823,
+ 1,
+ 0
+ ],
+ [
+ 119382.352941176,
+ 1,
+ 0
+ ],
+ [
+ 119558.823529412,
+ 1,
+ 0
+ ],
+ [
+ 119205.882352941,
+ 3,
+ 0
+ ],
+ [
+ 119294.117647059,
+ 0,
+ 0
+ ],
+ [
+ 119470.588235294,
+ 3,
+ 0
+ ],
+ [
+ 119647.058823529,
+ 2,
+ 0
+ ],
+ [
+ 119735.294117647,
+ 0,
+ 0
+ ],
+ [
+ 119823.529411765,
+ 3,
+ 0
+ ],
+ [
+ 119911.764705882,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 120000,
+ 2,
+ 0
+ ],
+ [
+ 120088.235294117,
+ 3,
+ 0
+ ],
+ [
+ 120176.470588235,
+ 2,
+ 0
+ ],
+ [
+ 120264.705882353,
+ 1,
+ 0
+ ],
+ [
+ 120352.94117647,
+ 0,
+ 0
+ ],
+ [
+ 120441.176470588,
+ 1,
+ 0
+ ],
+ [
+ 120529.411764706,
+ 3,
+ 0
+ ],
+ [
+ 120617.647058823,
+ 1,
+ 0
+ ],
+ [
+ 120705.882352941,
+ 0,
+ 0
+ ],
+ [
+ 120794.117647059,
+ 3,
+ 0
+ ],
+ [
+ 120882.352941176,
+ 1,
+ 0
+ ],
+ [
+ 120970.588235294,
+ 2,
+ 0
+ ],
+ [
+ 121058.823529412,
+ 0,
+ 0
+ ],
+ [
+ 121147.058823529,
+ 1,
+ 0
+ ],
+ [
+ 121323.529411764,
+ 1,
+ 0
+ ],
+ [
+ 121235.294117647,
+ 0,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 121411.764705882,
+ 2,
+ 1147.05882352941
+ ],
+ [
+ 121411.764705882,
+ 3,
+ 1147.05882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 122823.529411764,
+ 2,
+ 529.411764705882
+ ],
+ [
+ 123529.411764706,
+ 3,
+ 617.647058823529
+ ],
+ [
+ 123529.411764706,
+ 2,
+ 617.647058823529
+ ],
+ [
+ 122823.529411764,
+ 0,
+ 529.411764705882
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 124235.294117647,
+ 0,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 125647.058823529,
+ 1,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 127058.823529412,
+ 2,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 128470.588235294,
+ 3,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 129882.352941176,
+ 0,
+ 0
+ ],
+ [
+ 130235.294117647,
+ 0,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 131294.117647059,
+ 1,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 132705.882352941,
+ 2,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 134117.647058823,
+ 3,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 135529.411764706,
+ 0,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 136941.176470588,
+ 1,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 138352.94117647,
+ 2,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 139764.705882353,
+ 3,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 141176.470588235,
+ 0,
+ 0
+ ],
+ [
+ 141529.411764706,
+ 0,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 142588.235294117,
+ 1,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 144000,
+ 6,
+ 617.647058823529
+ ],
+ [
+ 144529.411764706,
+ 2,
+ 0
+ ],
+ [
+ 144705.882352941,
+ 2,
+ 0
+ ],
+ [
+ 144794.117647059,
+ 2,
+ 0
+ ],
+ [
+ 144882.352941176,
+ 0,
+ 0
+ ],
+ [
+ 145323.529411764,
+ 3,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 145411.764705882,
+ 7,
+ 617.647058823529
+ ],
+ [
+ 145411.764705882,
+ 1,
+ 0
+ ],
+ [
+ 145676.470588235,
+ 2,
+ 0
+ ],
+ [
+ 145852.94117647,
+ 2,
+ 0
+ ],
+ [
+ 146029.411764706,
+ 3,
+ 0
+ ],
+ [
+ 146205.882352941,
+ 3,
+ 0
+ ],
+ [
+ 146382.352941176,
+ 3,
+ 0
+ ],
+ [
+ 146558.823529411,
+ 3,
+ 0
+ ],
+ [
+ 146647.058823529,
+ 3,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 147264.705882353,
+ 1,
+ 88.2352941176471
+ ],
+ [
+ 146823.529411764,
+ 0,
+ 529.411764705882
+ ],
+ [
+ 147529.411764706,
+ 0,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 148235.294117647,
+ 1,
+ 529.411764705882
+ ],
+ [
+ 148676.470588235,
+ 2,
+ 88.2352941176471
+ ],
+ [
+ 148941.176470588,
+ 1,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 150000,
+ 3,
+ 0
+ ],
+ [
+ 150352.94117647,
+ 2,
+ 617.647058823529
+ ],
+ [
+ 149647.058823529,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 150088.235294117,
+ 1,
+ 0
+ ],
+ [
+ 150176.470588235,
+ 3,
+ 0
+ ],
+ [
+ 150264.705882353,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 151058.823529411,
+ 3,
+ 264.705882352941
+ ],
+ [
+ 151411.764705882,
+ 1,
+ 264.705882352941
+ ],
+ [
+ 151764.705882353,
+ 3,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 152470.588235294,
+ 0,
+ 0
+ ],
+ [
+ 153176.470588235,
+ 0,
+ 617.647058823529
+ ],
+ [
+ 152823.529411764,
+ 0,
+ 176.470588235294
+ ],
+ [
+ 152911.764705882,
+ 1,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 153882.352941176,
+ 1,
+ 529.411764705882
+ ],
+ [
+ 154323.529411764,
+ 2,
+ 88.2352941176471
+ ],
+ [
+ 154588.235294117,
+ 1,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 155294.117647059,
+ 2,
+ 1323.52941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 156705.882352941,
+ 3,
+ 1323.52941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 158558.823529411,
+ 1,
+ 88.2352941176471
+ ],
+ [
+ 158117.647058823,
+ 0,
+ 529.411764705882
+ ],
+ [
+ 158823.529411764,
+ 0,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 159529.411764706,
+ 1,
+ 529.411764705882
+ ],
+ [
+ 159970.588235294,
+ 2,
+ 88.2352941176471
+ ],
+ [
+ 160235.294117647,
+ 1,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 161294.117647059,
+ 3,
+ 0
+ ],
+ [
+ 160941.176470588,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 161382.352941176,
+ 1,
+ 0
+ ],
+ [
+ 161470.588235294,
+ 0,
+ 0
+ ],
+ [
+ 161558.823529411,
+ 1,
+ 0
+ ],
+ [
+ 161647.058823529,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 162000,
+ 0,
+ 0
+ ],
+ [
+ 162176.470588235,
+ 3,
+ 1500
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 163764.705882353,
+ 0,
+ 0
+ ],
+ [
+ 164470.588235294,
+ 0,
+ 617.647058823529
+ ],
+ [
+ 164117.647058823,
+ 0,
+ 176.470588235294
+ ],
+ [
+ 164205.882352941,
+ 1,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 165176.470588235,
+ 1,
+ 529.411764705882
+ ],
+ [
+ 165617.647058823,
+ 2,
+ 88.2352941176471
+ ],
+ [
+ 165882.352941176,
+ 1,
+ 617.647058823529
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 166588.235294117,
+ 2,
+ 1323.52941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 168000,
+ 3,
+ 1323.52941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 169411.764705882,
+ 2,
+ 0
+ ],
+ [
+ 169941.176470588,
+ 2,
+ 0
+ ],
+ [
+ 170117.647058824,
+ 3,
+ 0
+ ],
+ [
+ 170294.117647059,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 170823.529411765,
+ 3,
+ 0
+ ],
+ [
+ 171000,
+ 1,
+ 0
+ ],
+ [
+ 171705.882352941,
+ 1,
+ 0
+ ],
+ [
+ 172058.823529412,
+ 3,
+ 0
+ ],
+ [
+ 171882.352941176,
+ 0,
+ 0
+ ],
+ [
+ 171176.470588235,
+ 3,
+ 0
+ ],
+ [
+ 171352.94117647,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 172235.294117647,
+ 3,
+ 0
+ ],
+ [
+ 172500,
+ 3,
+ 0
+ ],
+ [
+ 172764.705882353,
+ 3,
+ 0
+ ],
+ [
+ 173029.411764706,
+ 3,
+ 0
+ ],
+ [
+ 173294.117647059,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 173470.588235294,
+ 3,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 173647.058823529,
+ 1,
+ 0
+ ],
+ [
+ 173823.529411765,
+ 2,
+ 0
+ ],
+ [
+ 174000,
+ 1,
+ 0
+ ],
+ [
+ 174176.470588235,
+ 2,
+ 0
+ ],
+ [
+ 174529.411764706,
+ 2,
+ 0
+ ],
+ [
+ 174705.882352941,
+ 3,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 175058.823529412,
+ 3,
+ 0
+ ],
+ [
+ 175147.058823529,
+ 1,
+ 0
+ ],
+ [
+ 175235.294117647,
+ 2,
+ 0
+ ],
+ [
+ 175323.529411765,
+ 0,
+ 0
+ ],
+ [
+ 175411.764705882,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 175764.705882353,
+ 3,
+ 0
+ ],
+ [
+ 175941.176470588,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 176470.588235294,
+ 3,
+ 0
+ ],
+ [
+ 176647.058823529,
+ 1,
+ 0
+ ],
+ [
+ 176823.529411765,
+ 3,
+ 0
+ ],
+ [
+ 177352.941176471,
+ 1,
+ 0
+ ],
+ [
+ 177000,
+ 1,
+ 176.470588235294
+ ],
+ [
+ 177529.411764706,
+ 3,
+ 0
+ ],
+ [
+ 177705.882352941,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 177882.352941176,
+ 1,
+ 0
+ ],
+ [
+ 178411.764705882,
+ 3,
+ 0
+ ],
+ [
+ 178500,
+ 1,
+ 0
+ ],
+ [
+ 178588.235294118,
+ 3,
+ 0
+ ],
+ [
+ 178676.470588235,
+ 2,
+ 0
+ ],
+ [
+ 178764.705882353,
+ 0,
+ 0
+ ],
+ [
+ 178941.176470588,
+ 3,
+ 0
+ ],
+ [
+ 179029.411764706,
+ 2,
+ 0
+ ],
+ [
+ 179117.647058824,
+ 1,
+ 0
+ ],
+ [
+ 179205.882352941,
+ 0,
+ 0
+ ],
+ [
+ 178058.823529412,
+ 7,
+ 0
+ ],
+ [
+ 178411.764705882,
+ 7,
+ 0
+ ],
+ [
+ 178588.235294118,
+ 6,
+ 0
+ ],
+ [
+ 178764.705882353,
+ 4,
+ 0
+ ],
+ [
+ 178941.176470588,
+ 7,
+ 0
+ ],
+ [
+ 179117.647058824,
+ 5,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 179294.117647059,
+ 1,
+ 0
+ ],
+ [
+ 179470.588235294,
+ 2,
+ 0
+ ],
+ [
+ 179911.764705882,
+ 2,
+ 0
+ ],
+ [
+ 179647.058823529,
+ 1,
+ 0
+ ],
+ [
+ 180176.470588235,
+ 2,
+ 0
+ ],
+ [
+ 180529.411764706,
+ 1,
+ 0
+ ],
+ [
+ 179294.117647059,
+ 4,
+ 0
+ ],
+ [
+ 179470.588235294,
+ 7,
+ 0
+ ],
+ [
+ 179823.529411765,
+ 4,
+ 0
+ ],
+ [
+ 180000,
+ 7,
+ 0
+ ],
+ [
+ 180352.941176471,
+ 4,
+ 0
+ ],
+ [
+ 180529.411764706,
+ 7,
+ 0
+ ],
+ [
+ 179647.058823529,
+ 5,
+ 0
+ ],
+ [
+ 180176.470588235,
+ 5,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 180705.882352941,
+ 2,
+ 0
+ ],
+ [
+ 181235.294117647,
+ 2,
+ 0
+ ],
+ [
+ 181411.764705882,
+ 3,
+ 0
+ ],
+ [
+ 181588.235294118,
+ 0,
+ 441.176470588235
+ ],
+ [
+ 181058.823529411,
+ 6,
+ 0
+ ],
+ [
+ 181235.294117647,
+ 6,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 182117.647058824,
+ 3,
+ 0
+ ],
+ [
+ 182294.117647059,
+ 1,
+ 0
+ ],
+ [
+ 183000,
+ 1,
+ 0
+ ],
+ [
+ 183352.941176471,
+ 3,
+ 0
+ ],
+ [
+ 183176.470588235,
+ 0,
+ 0
+ ],
+ [
+ 182470.588235294,
+ 3,
+ 0
+ ],
+ [
+ 182647.058823529,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 183529.411764706,
+ 3,
+ 0
+ ],
+ [
+ 183794.117647059,
+ 3,
+ 0
+ ],
+ [
+ 184058.823529412,
+ 3,
+ 0
+ ],
+ [
+ 184323.529411765,
+ 3,
+ 0
+ ],
+ [
+ 184588.235294118,
+ 0,
+ 264.705882352941
+ ],
+ [
+ 184764.705882353,
+ 3,
+ 88.2352941176471
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 184941.176470588,
+ 1,
+ 0
+ ],
+ [
+ 185117.647058824,
+ 2,
+ 0
+ ],
+ [
+ 185294.117647059,
+ 1,
+ 0
+ ],
+ [
+ 185470.588235294,
+ 2,
+ 0
+ ],
+ [
+ 185558.823529412,
+ 1,
+ 0
+ ],
+ [
+ 185735.294117647,
+ 2,
+ 0
+ ],
+ [
+ 186264.705882353,
+ 3,
+ 0
+ ],
+ [
+ 185823.529411765,
+ 1,
+ 352.941176470588
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 186352.941176471,
+ 3,
+ 0
+ ],
+ [
+ 186441.176470588,
+ 1,
+ 0
+ ],
+ [
+ 186529.411764706,
+ 2,
+ 0
+ ],
+ [
+ 186617.647058824,
+ 0,
+ 0
+ ],
+ [
+ 186705.882352941,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 187058.823529412,
+ 3,
+ 0
+ ],
+ [
+ 187235.294117647,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 187764.705882353,
+ 3,
+ 0
+ ],
+ [
+ 187941.176470588,
+ 1,
+ 0
+ ],
+ [
+ 188117.647058824,
+ 3,
+ 0
+ ],
+ [
+ 188647.058823529,
+ 1,
+ 0
+ ],
+ [
+ 188294.117647059,
+ 1,
+ 176.470588235294
+ ],
+ [
+ 188823.529411765,
+ 3,
+ 0
+ ],
+ [
+ 189000,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 189705.882352941,
+ 3,
+ 0
+ ],
+ [
+ 189794.117647059,
+ 1,
+ 0
+ ],
+ [
+ 190058.823529412,
+ 0,
+ 0
+ ],
+ [
+ 190235.294117647,
+ 3,
+ 0
+ ],
+ [
+ 189352.941176471,
+ 7,
+ 0
+ ],
+ [
+ 189705.882352941,
+ 7,
+ 0
+ ],
+ [
+ 189882.352941176,
+ 6,
+ 0
+ ],
+ [
+ 190058.823529412,
+ 4,
+ 0
+ ],
+ [
+ 190235.294117647,
+ 7,
+ 0
+ ],
+ [
+ 190411.764705882,
+ 5,
+ 0
+ ],
+ [
+ 189176.470588235,
+ 0,
+ 0
+ ],
+ [
+ 189264.705882353,
+ 3,
+ 0
+ ],
+ [
+ 189352.941176471,
+ 0,
+ 0
+ ],
+ [
+ 189441.176470588,
+ 3,
+ 0
+ ],
+ [
+ 189882.352941176,
+ 2,
+ 0
+ ],
+ [
+ 190235.294117647,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 190941.176470588,
+ 1,
+ 0
+ ],
+ [
+ 190588.235294118,
+ 4,
+ 0
+ ],
+ [
+ 190764.705882353,
+ 7,
+ 0
+ ],
+ [
+ 191117.647058824,
+ 4,
+ 0
+ ],
+ [
+ 191294.117647059,
+ 7,
+ 0
+ ],
+ [
+ 191647.058823529,
+ 4,
+ 0
+ ],
+ [
+ 191823.529411765,
+ 7,
+ 0
+ ],
+ [
+ 190941.176470588,
+ 5,
+ 0
+ ],
+ [
+ 191470.588235294,
+ 5,
+ 0
+ ],
+ [
+ 190588.235294118,
+ 3,
+ 0
+ ],
+ [
+ 190852.941176471,
+ 0,
+ 0
+ ],
+ [
+ 190897.058823529,
+ 3,
+ 0
+ ],
+ [
+ 190764.705882353,
+ 2,
+ 0
+ ],
+ [
+ 191117.647058824,
+ 2,
+ 0
+ ],
+ [
+ 191205.882352941,
+ 1,
+ 0
+ ],
+ [
+ 191382.352941176,
+ 2,
+ 0
+ ],
+ [
+ 191470.588235294,
+ 1,
+ 0
+ ],
+ [
+ 191647.058823529,
+ 2,
+ 0
+ ],
+ [
+ 191735.294117647,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 192000,
+ 2,
+ 0
+ ],
+ [
+ 192529.411764706,
+ 2,
+ 0
+ ],
+ [
+ 192705.882352941,
+ 3,
+ 0
+ ],
+ [
+ 192882.352941176,
+ 0,
+ 441.176470588235
+ ],
+ [
+ 192176.470588235,
+ 5,
+ 0
+ ],
+ [
+ 192352.94117647,
+ 5,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 193411.764705882,
+ 3,
+ 0
+ ],
+ [
+ 193588.235294118,
+ 1,
+ 0
+ ],
+ [
+ 194294.117647059,
+ 1,
+ 0
+ ],
+ [
+ 194647.058823529,
+ 3,
+ 0
+ ],
+ [
+ 194470.588235294,
+ 0,
+ 0
+ ],
+ [
+ 193764.705882353,
+ 3,
+ 0
+ ],
+ [
+ 193941.176470588,
+ 1,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 194823.529411765,
+ 3,
+ 0
+ ],
+ [
+ 195352.94117647,
+ 3,
+ 0
+ ],
+ [
+ 195529.411764705,
+ 2,
+ 0
+ ],
+ [
+ 195705.882352941,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 196235.294117647,
+ 1,
+ 0
+ ],
+ [
+ 196411.764705882,
+ 2,
+ 0
+ ],
+ [
+ 196588.235294118,
+ 1,
+ 0
+ ],
+ [
+ 196764.705882353,
+ 2,
+ 0
+ ],
+ [
+ 197117.647058823,
+ 2,
+ 0
+ ],
+ [
+ 197294.117647058,
+ 1,
+ 264.705882352941
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 197647.058823529,
+ 3,
+ 0
+ ],
+ [
+ 197735.294117647,
+ 1,
+ 0
+ ],
+ [
+ 197823.529411765,
+ 2,
+ 0
+ ],
+ [
+ 197911.764705882,
+ 0,
+ 0
+ ],
+ [
+ 198000,
+ 2,
+ 264.705882352941
+ ],
+ [
+ 198352.941176471,
+ 3,
+ 0
+ ],
+ [
+ 198529.411764706,
+ 0,
+ 441.176470588235
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 199058.823529412,
+ 3,
+ 0
+ ],
+ [
+ 199235.294117647,
+ 1,
+ 0
+ ],
+ [
+ 199411.764705882,
+ 3,
+ 0
+ ],
+ [
+ 199941.176470588,
+ 1,
+ 0
+ ],
+ [
+ 199588.235294118,
+ 1,
+ 176.470588235294
+ ],
+ [
+ 200117.647058824,
+ 3,
+ 0
+ ],
+ [
+ 200294.117647059,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 201000,
+ 3,
+ 0
+ ],
+ [
+ 201352.941176471,
+ 0,
+ 0
+ ],
+ [
+ 200647.058823529,
+ 7,
+ 0
+ ],
+ [
+ 201000,
+ 7,
+ 0
+ ],
+ [
+ 201176.470588235,
+ 6,
+ 0
+ ],
+ [
+ 201352.941176471,
+ 4,
+ 0
+ ],
+ [
+ 201529.411764706,
+ 7,
+ 0
+ ],
+ [
+ 201705.882352941,
+ 5,
+ 0
+ ],
+ [
+ 200470.588235294,
+ 0,
+ 0
+ ],
+ [
+ 201088.235294117,
+ 1,
+ 0
+ ],
+ [
+ 201176.470588235,
+ 2,
+ 0
+ ],
+ [
+ 201044.117647058,
+ 0,
+ 0
+ ],
+ [
+ 201132.352941176,
+ 3,
+ 0
+ ],
+ [
+ 201529.411764705,
+ 2,
+ 0
+ ],
+ [
+ 201529.411764705,
+ 3,
+ 0
+ ],
+ [
+ 201617.647058823,
+ 1,
+ 0
+ ],
+ [
+ 201617.647058823,
+ 0,
+ 0
+ ],
+ [
+ 201705.882352941,
+ 3,
+ 0
+ ],
+ [
+ 201705.882352941,
+ 2,
+ 0
+ ],
+ [
+ 201794.117647058,
+ 1,
+ 0
+ ],
+ [
+ 201794.117647058,
+ 0,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 201882.352941176,
+ 4,
+ 0
+ ],
+ [
+ 202058.823529412,
+ 7,
+ 0
+ ],
+ [
+ 202411.764705882,
+ 4,
+ 0
+ ],
+ [
+ 202588.235294118,
+ 7,
+ 0
+ ],
+ [
+ 202941.176470588,
+ 4,
+ 0
+ ],
+ [
+ 203117.647058824,
+ 7,
+ 0
+ ],
+ [
+ 202235.294117647,
+ 5,
+ 0
+ ],
+ [
+ 202764.705882353,
+ 5,
+ 0
+ ],
+ [
+ 201882.352941176,
+ 1,
+ 0
+ ],
+ [
+ 202058.823529411,
+ 2,
+ 0
+ ],
+ [
+ 202235.294117647,
+ 1,
+ 0
+ ],
+ [
+ 202411.764705882,
+ 1,
+ 0
+ ],
+ [
+ 202588.235294117,
+ 2,
+ 0
+ ],
+ [
+ 202764.705882353,
+ 1,
+ 0
+ ],
+ [
+ 203029.411764705,
+ 2,
+ 0
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [
+ [
+ 213529.411764705,
+ 2,
+ 176.470588235294
+ ],
+ [
+ 213529.411764705,
+ 3,
+ 176.470588235294
+ ],
+ [
+ 213882.352941176,
+ 2,
+ 176.470588235294
+ ],
+ [
+ 213882.352941176,
+ 0,
+ 176.470588235294
+ ],
+ [
+ 214235.294117647,
+ 1,
+ 176.470588235294
+ ],
+ [
+ 214235.294117647,
+ 3,
+ 176.470588235294
+ ]
+ ],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": false
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ },
+ {
+ "gfSection": false,
+ "lengthInSteps": 16,
+ "altAnim": false,
+ "typeOfSection": 0,
+ "sectionNotes": [],
+ "bpm": 170,
+ "changeBPM": false,
+ "mustHitSection": true
+ }
+ ],
+ "splashSkin": "noteSplashes",
+ "validScore": false,
+ "gfVersion": "gf",
+ "bpm": 170,
+ "arrowSkin": "",
+ "needsVoices": true,
+ "song": "red-death"
+ }
+}
\ No newline at end of file
diff --git a/example_mods/characters/BasicCat.json b/example_mods/characters/BasicCat.json
new file mode 100644
index 000000000..f037f2e34
--- /dev/null
+++ b/example_mods/characters/BasicCat.json
@@ -0,0 +1,78 @@
+{
+ "animations": [
+ {
+ "offsets": [
+ -9,
+ -270
+ ],
+ "loop": false,
+ "fps": 24,
+ "anim": "singLEFT",
+ "indices": [],
+ "name": "Battle Cat Left"
+ },
+ {
+ "offsets": [
+ -57,
+ -311
+ ],
+ "loop": false,
+ "fps": 24,
+ "anim": "singDOWN",
+ "indices": [],
+ "name": "Battle Cat Down"
+ },
+ {
+ "offsets": [
+ 9,
+ -292
+ ],
+ "loop": false,
+ "fps": 24,
+ "anim": "singUP",
+ "indices": [],
+ "name": "Battle Cat Up"
+ },
+ {
+ "offsets": [
+ -59,
+ -275
+ ],
+ "loop": false,
+ "fps": 24,
+ "anim": "singRIGHT",
+ "indices": [],
+ "name": "Battle Cat Right"
+ },
+ {
+ "offsets": [
+ -66,
+ -273
+ ],
+ "loop": false,
+ "fps": 24,
+ "anim": "idle",
+ "indices": [],
+ "name": "Battle Cat Idle"
+ }
+ ],
+ "no_antialiasing": false,
+ "image": "characters/BasicCat",
+ "position": [
+ 0,
+ 50
+ ],
+ "healthicon": "cat",
+ "flip_x": false,
+ "healthbar_colors": [
+ 210,
+ 225,
+ 255
+ ],
+ "camera_position": [
+ 0,
+ 310
+ ],
+ "sing_duration": 6.1,
+ "scale": 1
+}
\ No newline at end of file
diff --git a/example_mods/characters/DelinquentCat.json b/example_mods/characters/DelinquentCat.json
new file mode 100644
index 000000000..c53cf400b
--- /dev/null
+++ b/example_mods/characters/DelinquentCat.json
@@ -0,0 +1,122 @@
+{
+ "animations": [
+ {
+ "offsets": [
+ 25,
+ -1
+ ],
+ "loop": false,
+ "fps": 24,
+ "anim": "singUP",
+ "indices": [],
+ "name": "Delinquent Up"
+ },
+ {
+ "offsets": [
+ 97,
+ -11
+ ],
+ "loop": false,
+ "fps": 24,
+ "anim": "singLEFT",
+ "indices": [],
+ "name": "Delinquent Left"
+ },
+ {
+ "offsets": [
+ 41,
+ -48
+ ],
+ "loop": false,
+ "fps": 24,
+ "anim": "singDOWN",
+ "indices": [],
+ "name": "Delinquent Down"
+ },
+ {
+ "offsets": [
+ -4,
+ -22
+ ],
+ "loop": false,
+ "fps": 24,
+ "anim": "idle",
+ "indices": [],
+ "name": "Delinquent Idle"
+ },
+ {
+ "offsets": [
+ 9,
+ -19
+ ],
+ "loop": false,
+ "fps": 24,
+ "anim": "singRIGHT",
+ "indices": [],
+ "name": "Delinquent Right"
+ },
+ {
+ "offsets": [
+ 9,
+ -19
+ ],
+ "loop": false,
+ "fps": 24,
+ "anim": "singRIGHT-alt",
+ "indices": [],
+ "name": "Delinquent STAND RIGHT"
+ },
+ {
+ "offsets": [
+ 100,
+ 5
+ ],
+ "loop": false,
+ "fps": 24,
+ "anim": "singLEFT-alt",
+ "indices": [],
+ "name": "Delinquent STAND LEFT"
+ },
+ {
+ "offsets": [
+ 60,
+ -2
+ ],
+ "loop": false,
+ "fps": 24,
+ "anim": "singUP-alt",
+ "indices": [],
+ "name": "Delinquent STAND UP"
+ },
+ {
+ "offsets": [
+ 78,
+ -20
+ ],
+ "loop": false,
+ "fps": 24,
+ "anim": "singDOWN-alt",
+ "indices": [],
+ "name": "Delinquent STAND DOWN"
+ }
+ ],
+ "no_antialiasing": false,
+ "image": "characters/delinquent",
+ "position": [
+ -40,
+ 150
+ ],
+ "healthicon": "delinquent",
+ "flip_x": false,
+ "healthbar_colors": [
+ 95,
+ 85,
+ 115
+ ],
+ "camera_position": [
+ 30,
+ 130
+ ],
+ "sing_duration": 6.1,
+ "scale": 0.7
+}
\ No newline at end of file
diff --git a/example_mods/characters/MachoCat.json b/example_mods/characters/MachoCat.json
new file mode 100644
index 000000000..986cffd6c
--- /dev/null
+++ b/example_mods/characters/MachoCat.json
@@ -0,0 +1,78 @@
+{
+ "animations": [
+ {
+ "loop": false,
+ "offsets": [
+ -51,
+ -339
+ ],
+ "anim": "singDOWN",
+ "fps": 24,
+ "name": "Battle Cat Down",
+ "indices": []
+ },
+ {
+ "loop": false,
+ "offsets": [
+ 18,
+ -299
+ ],
+ "anim": "idle",
+ "fps": 24,
+ "name": "Battle Cat Idle",
+ "indices": []
+ },
+ {
+ "loop": false,
+ "offsets": [
+ -17,
+ -295
+ ],
+ "anim": "singLEFT",
+ "fps": 24,
+ "name": "Battle Cat Left",
+ "indices": []
+ },
+ {
+ "loop": false,
+ "offsets": [
+ 36,
+ -336
+ ],
+ "anim": "singUP",
+ "fps": 24,
+ "name": "Battle Cat Up",
+ "indices": []
+ },
+ {
+ "offsets": [
+ 27,
+ -308
+ ],
+ "loop": false,
+ "fps": 24,
+ "anim": "singRIGHT",
+ "indices": [],
+ "name": "Battle Cat Right"
+ }
+ ],
+ "no_antialiasing": false,
+ "image": "characters/macho",
+ "position": [
+ 0,
+ 0
+ ],
+ "healthicon": "macho",
+ "flip_x": false,
+ "healthbar_colors": [
+ 210,
+ 225,
+ 255
+ ],
+ "camera_position": [
+ -10,
+ 290
+ ],
+ "sing_duration": 6.1,
+ "scale": 1
+}
\ No newline at end of file
diff --git a/example_mods/characters/MohawkCat.json b/example_mods/characters/MohawkCat.json
new file mode 100644
index 000000000..1b4c08e67
--- /dev/null
+++ b/example_mods/characters/MohawkCat.json
@@ -0,0 +1,78 @@
+{
+ "animations": [
+ {
+ "loop": false,
+ "offsets": [
+ -27,
+ -304
+ ],
+ "anim": "singDOWN",
+ "fps": 24,
+ "name": "Battle Cat Down",
+ "indices": []
+ },
+ {
+ "loop": false,
+ "offsets": [
+ 8,
+ -279
+ ],
+ "anim": "idle",
+ "fps": 24,
+ "name": "Battle Cat Idle",
+ "indices": []
+ },
+ {
+ "loop": false,
+ "offsets": [
+ -9,
+ -275
+ ],
+ "anim": "singLEFT",
+ "fps": 24,
+ "name": "Battle Cat Left",
+ "indices": []
+ },
+ {
+ "loop": false,
+ "offsets": [
+ 36,
+ -253
+ ],
+ "anim": "singUP",
+ "fps": 24,
+ "name": "Battle Cat Up",
+ "indices": []
+ },
+ {
+ "offsets": [
+ 39,
+ -266
+ ],
+ "loop": false,
+ "fps": 24,
+ "anim": "singRIGHT",
+ "indices": [],
+ "name": "Battle Cat Right"
+ }
+ ],
+ "no_antialiasing": false,
+ "image": "characters/mohawk",
+ "position": [
+ 0,
+ 0
+ ],
+ "healthicon": "mohawk",
+ "flip_x": false,
+ "healthbar_colors": [
+ 22,
+ 33,
+ 44
+ ],
+ "camera_position": [
+ -10,
+ 290
+ ],
+ "sing_duration": 6.1,
+ "scale": 1
+}
\ No newline at end of file
diff --git a/example_mods/characters/TankCat.json b/example_mods/characters/TankCat.json
new file mode 100644
index 000000000..75b4da415
--- /dev/null
+++ b/example_mods/characters/TankCat.json
@@ -0,0 +1,78 @@
+{
+ "animations": [
+ {
+ "offsets": [
+ 1,
+ -90
+ ],
+ "loop": false,
+ "fps": 24,
+ "anim": "singLEFT",
+ "indices": [],
+ "name": "Battle Cat Left"
+ },
+ {
+ "offsets": [
+ -72,
+ -157
+ ],
+ "loop": false,
+ "fps": 24,
+ "anim": "singDOWN",
+ "indices": [],
+ "name": "Battle Cat Down"
+ },
+ {
+ "offsets": [
+ 55,
+ -78
+ ],
+ "loop": false,
+ "fps": 24,
+ "anim": "singUP",
+ "indices": [],
+ "name": "Battle Cat Up"
+ },
+ {
+ "offsets": [
+ -59,
+ -75
+ ],
+ "loop": false,
+ "fps": 24,
+ "anim": "singRIGHT",
+ "indices": [],
+ "name": "Battle Cat Right"
+ },
+ {
+ "offsets": [
+ -64,
+ -80
+ ],
+ "loop": false,
+ "fps": 24,
+ "anim": "idle",
+ "indices": [],
+ "name": "Battle Cat Idle"
+ }
+ ],
+ "no_antialiasing": false,
+ "image": "characters/tank",
+ "position": [
+ 0,
+ 40
+ ],
+ "healthicon": "tank",
+ "flip_x": false,
+ "healthbar_colors": [
+ 210,
+ 225,
+ 255
+ ],
+ "camera_position": [
+ -80,
+ 130
+ ],
+ "sing_duration": 6.1,
+ "scale": 1
+}
\ No newline at end of file
diff --git a/example_mods/images/characters/BasicCat.png b/example_mods/images/characters/BasicCat.png
new file mode 100644
index 000000000..b4a9e31f5
Binary files /dev/null and b/example_mods/images/characters/BasicCat.png differ
diff --git a/example_mods/images/characters/BasicCat.xml b/example_mods/images/characters/BasicCat.xml
new file mode 100644
index 000000000..891331909
--- /dev/null
+++ b/example_mods/images/characters/BasicCat.xml
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/example_mods/images/characters/delinquent.png b/example_mods/images/characters/delinquent.png
new file mode 100644
index 000000000..3e1f62496
Binary files /dev/null and b/example_mods/images/characters/delinquent.png differ
diff --git a/example_mods/images/characters/delinquent.xml b/example_mods/images/characters/delinquent.xml
new file mode 100644
index 000000000..5e2217b99
--- /dev/null
+++ b/example_mods/images/characters/delinquent.xml
@@ -0,0 +1,282 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/example_mods/images/characters/macho.png b/example_mods/images/characters/macho.png
new file mode 100644
index 000000000..b4b60f7dc
Binary files /dev/null and b/example_mods/images/characters/macho.png differ
diff --git a/example_mods/images/characters/macho.xml b/example_mods/images/characters/macho.xml
new file mode 100644
index 000000000..4a8a9f2eb
--- /dev/null
+++ b/example_mods/images/characters/macho.xml
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/example_mods/images/characters/mohawk.png b/example_mods/images/characters/mohawk.png
new file mode 100644
index 000000000..72ba54f27
Binary files /dev/null and b/example_mods/images/characters/mohawk.png differ
diff --git a/example_mods/images/characters/mohawk.xml b/example_mods/images/characters/mohawk.xml
new file mode 100644
index 000000000..7715e823a
--- /dev/null
+++ b/example_mods/images/characters/mohawk.xml
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/example_mods/images/characters/tank.png b/example_mods/images/characters/tank.png
new file mode 100644
index 000000000..240e82a6f
Binary files /dev/null and b/example_mods/images/characters/tank.png differ
diff --git a/example_mods/images/characters/tank.xml b/example_mods/images/characters/tank.xml
new file mode 100644
index 000000000..95192af81
--- /dev/null
+++ b/example_mods/images/characters/tank.xml
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/source/PlayState.hx b/source/PlayState.hx
index 7b789ff31..528e484d9 100644
--- a/source/PlayState.hx
+++ b/source/PlayState.hx
@@ -1,4145 +1,4153 @@
-package;
-
-#if desktop
-import Discord.DiscordClient;
-#end
-import Section.SwagSection;
-import ui.Mobilecontrols;
-import Song.SwagSong;
-import WiggleEffect.WiggleEffectType;
-import flixel.FlxBasic;
-import flixel.FlxCamera;
-import flixel.FlxG;
-import flixel.FlxGame;
-import flixel.FlxObject;
-import flixel.FlxSprite;
-import flixel.FlxState;
-import flixel.FlxSubState;
-import flixel.addons.display.FlxGridOverlay;
-import flixel.addons.effects.FlxTrail;
-import flixel.addons.effects.FlxTrailArea;
-import flixel.addons.effects.chainable.FlxEffectSprite;
-import flixel.addons.effects.chainable.FlxWaveEffect;
-import flixel.addons.transition.FlxTransitionableState;
-import flixel.graphics.atlas.FlxAtlas;
-import flixel.graphics.frames.FlxAtlasFrames;
-import flixel.group.FlxGroup.FlxTypedGroup;
-import flixel.math.FlxMath;
-import flixel.math.FlxPoint;
-import flixel.math.FlxRect;
-import flixel.system.FlxSound;
-import flixel.text.FlxText;
-import flixel.tweens.FlxEase;
-import flixel.tweens.FlxTween;
-import flixel.ui.FlxBar;
-import flixel.util.FlxCollision;
-import flixel.util.FlxColor;
-import flixel.util.FlxSort;
-import flixel.util.FlxStringUtil;
-import flixel.util.FlxTimer;
-import haxe.Json;
-import LoadingState;
-import lime.utils.Assets;
-import openfl.display.BlendMode;
-import openfl.display.StageQuality;
-import openfl.filters.ShaderFilter;
-import openfl.utils.Assets as OpenFlAssets;
-import editors.ChartingState;
-import editors.CharacterEditorState;
-import flixel.group.FlxSpriteGroup;
-import Achievements;
-import StageData;
-import FunkinLua;
-import DialogueBoxPsych;
-#if sys
-import Sys;
-import sys.FileSystem;
-import openfl.Assets;
-import sys.io.File;
-#end
-#if sys
-import sys.FileSystem;
-#end
-
-using StringTools;
-
-class PlayState extends MusicBeatState
-{
- public static var STRUM_X = 42;
- public static var STRUM_X_MIDDLESCROLL = -278;
- public static var songSpeed:Float = 0;
-
- public var isDad:Bool = false;
- public var isGF:Bool = false;
-
- public static var instance:PlayState;
- public static var ratingStuff:Array = [
- ['You Suck!', 0.2], //From 0% to 19%
- ['Shit', 0.4], //From 20% to 39%
- ['Bad', 0.5], //From 40% to 49%
- ['Bruh', 0.6], //From 50% to 59%
- ['Meh', 0.69], //From 60% to 68%
- ['Nice', 0.7], //69%
- ['Good', 0.8], //From 70% to 79%
- ['Great', 0.9], //From 80% to 89%
- ['Sick!', 1], //From 90% to 99%
- ['Perfect!!', 1] //The value on this one isn't used actually, since Perfect is always "1"
- ];
-
- #if (haxe >= "4.0.0")
- public var modchartTweens:Map = new Map();
- public var modchartSprites:Map = new Map();
- public var modchartTimers:Map = new Map();
- public var modchartSounds:Map = new Map();
- #else
- public var modchartTweens:Map = new Map();
- public var modchartSprites:Map = new Map();
- public var modchartTimers:Map = new Map();
- public var modchartSounds:Map = new Map();
- #end
-
- //event variables
- private var isCameraOnForcedPos:Bool = false;
- #if (haxe >= "4.0.0")
- public var boyfriendMap:Map = new Map();
- public var dadMap:Map = new Map();
- public var gfMap:Map = new Map();
- #else
- public var boyfriendMap:Map = new Map();
- public var dadMap:Map = new Map();
- public var gfMap:Map = new Map();
- #end
-
- public var BF_X:Float = 770;
- public var BF_Y:Float = 100;
- public var DAD_X:Float = 100;
- public var DAD_Y:Float = 100;
- public var GF_X:Float = 400;
- public var GF_Y:Float = 130;
-
- public static var shits:Int = 0;
- public static var bads:Int = 0;
- public static var goods:Int = 0;
- public static var sicks:Int = 0;
-
- public var boyfriendGroup:FlxSpriteGroup;
- public var dadGroup:FlxSpriteGroup;
- public var gfGroup:FlxSpriteGroup;
-
- public static var curStage:String = '';
- public static var isPixelStage:Bool = false;
- public static var antireanim:Bool = false;
- public static var SONG:SwagSong = null;
- public static var isStoryMode:Bool = false;
- public static var storyWeek:Int = 0;
- public static var storyPlaylist:Array = [];
- public static var storyDifficulty:Int = 1;
-
- public var vocals:FlxSound;
-
- public var dad:Character;
- public var gf:Character;
- public var boyfriend:Boyfriend;
-
- public var notes:FlxTypedGroup;
- public var unspawnNotes:Array = [];
- public var eventNotes:Array = [];
-
- private var strumLine:FlxSprite;
-
- //Handles the new epic mega sexy cam code that i've done
- private var camFollow:FlxPoint;
- private var camFollowPos:FlxObject;
- private static var prevCamFollow:FlxPoint;
- private static var prevCamFollowPos:FlxObject;
-
- public var strumLineNotes:FlxTypedGroup;
- public var opponentStrums:FlxTypedGroup;
- public var playerStrums:FlxTypedGroup;
- public var grpNoteSplashes:FlxTypedGroup;
-
- public var camZooming:Bool = false;
- private var curSong:String = "";
-
- public var gfSpeed:Int = 1;
- public var health:Float = 1;
- public var combo:Int = 0;
-
- private var healthBarBG:AttachedSprite;
- public var healthBar:FlxBar;
- var songPercent:Float = 0;
-
- private var timeBarBG:AttachedSprite;
- public var timeBar:FlxBar;
-
- private var generatedMusic:Bool = false;
- public var endingSong:Bool = false;
- private var startingSong:Bool = false;
- private var updateTime:Bool = false;
- public static var practiceMode:Bool = false;
- public static var usedPractice:Bool = false;
- public static var changedDifficulty:Bool = false;
- public static var cpuControlled:Bool = false;
-
- var botplaySine:Float = 0;
- var botplayTxt:FlxText;
-
- public var iconP1:HealthIcon;
- public var iconP2:HealthIcon;
- public var camHUD:FlxCamera;
- public var camGame:FlxCamera;
- public var camOther:FlxCamera;
- public var cameraSpeed:Float = 1;
-
- var dialogue:Array = ['blah blah blah', 'coolswag'];
- var dialogueJson:DialogueFile = null;
-
- var halloweenBG:BGSprite;
- var halloweenWhite:BGSprite;
-
- var phillyCityLights:FlxTypedGroup;
- var phillyTrain:BGSprite;
- var blammedLightsBlack:ModchartSprite;
- var blammedLightsBlackTween:FlxTween;
- var phillyCityLightsEvent:FlxTypedGroup;
- var phillyCityLightsEventTween:FlxTween;
- var trainSound:FlxSound;
-
- var limoKillingState:Int = 0;
- var limo:BGSprite;
- var limoMetalPole:BGSprite;
- var limoLight:BGSprite;
- var limoCorpse:BGSprite;
- var limoCorpseTwo:BGSprite;
- var bgLimo:BGSprite;
- var grpLimoParticles:FlxTypedGroup;
- var grpLimoDancers:FlxTypedGroup;
- var fastCar:BGSprite;
-
- var upperBoppers:BGSprite;
- var bottomBoppers:BGSprite;
- var santa:BGSprite;
- var heyTimer:Float;
-
- var bgGirls:BackgroundGirls;
- var wiggleShit:WiggleEffect = new WiggleEffect();
- var bgGhouls:BGSprite;
-
- public var songScore:Int = 0;
- public var songHits:Int = 0;
- public var songMisses:Int = 0;
- public var scoreTxt:FlxText;
- var timeTxt:FlxText;
- var scoreTxtTween:FlxTween;
-
- public static var campaignScore:Int = 0;
- public static var campaignMisses:Int = 0;
- public static var seenCutscene:Bool = false;
- public static var deathCounter:Int = 0;
-
- public var defaultCamZoom:Float = 1.05;
-
- // how big to stretch the pixel art assets
- public static var daPixelZoom:Float = 6;
- private var singAnimations:Array = ['singLEFT', 'singDOWN', 'singUP', 'singRIGHT'];
-
- public var inCutscene:Bool = false;
- var songLength:Float = 0;
-
- #if desktop
- // Discord RPC variables
- var storyDifficultyText:String = "";
- var detailsText:String = "";
- var detailsPausedText:String = "";
- #end
-
- //Achievement shit
- var keysPressed:Array = [false, false, false, false];
- var boyfriendIdleTime:Float = 0.0;
- var boyfriendIdled:Bool = false;
-
- // Lua shit
-
- private var luaArray:Array = [];
- private var luaDebugGroup:FlxTypedGroup;
- public var introSoundsSuffix:String = '';
-
- #if mobileC
- var mcontrols:Mobilecontrols;
- #end
-
- override public function create()
- {
- instance = this;
- #if MODS_ALLOWED
- Paths.destroyLoadedImages();
- #end
-
- if (FlxG.sound.music != null)
- FlxG.sound.music.stop();
-
- practiceMode = false;
- // var gameCam:FlxCamera = FlxG.camera;
- camGame = new FlxCamera();
- camHUD = new FlxCamera();
- camOther = new FlxCamera();
- camHUD.bgColor.alpha = 0;
- camOther.bgColor.alpha = 0;
-
- FlxG.cameras.reset(camGame);
- FlxG.cameras.add(camHUD);
- FlxG.cameras.add(camOther);
- grpNoteSplashes = new FlxTypedGroup();
-
- FlxCamera.defaultCameras = [camGame];
- CustomFadeTransition.nextCamera = camOther;
- //FlxG.cameras.setDefaultDrawTarget(camGame, true);
-
- persistentUpdate = true;
- persistentDraw = true;
-
- if (SONG == null)
- SONG = Song.loadFromJson('tutorial');
-
- Conductor.mapBPMChanges(SONG);
- Conductor.changeBPM(SONG.bpm);
-
- #if desktop
- storyDifficultyText = '' + CoolUtil.difficultyStuff[storyDifficulty][0];
-
- // String that contains the mode defined here so it isn't necessary to call changePresence for each mode
- if (isStoryMode)
- {
- detailsText = "Story Mode: " + WeekData.getCurrentWeek().weekName;
- }
- else
- {
- detailsText = "Freeplay";
- }
-
- // String for when the game is paused
- detailsPausedText = "Paused - " + detailsText;
- #end
-
- GameOverSubstate.resetVariables();
- var songName:String = Paths.formatToSongPath(SONG.song);
- curStage = PlayState.SONG.stage;
- //trace('stage is: ' + curStage);
- if(PlayState.SONG.stage == null || PlayState.SONG.stage.length < 1) {
- switch (songName)
- {
- case 'spookeez' | 'south' | 'monster':
- curStage = 'spooky';
- case 'pico' | 'blammed' | 'philly' | 'philly-nice':
- curStage = 'philly';
- case 'milf' | 'satin-panties' | 'high':
- curStage = 'limo';
- case 'cocoa' | 'eggnog':
- curStage = 'mall';
- case 'winter-horrorland':
- curStage = 'mallEvil';
- case 'senpai' | 'roses':
- curStage = 'school';
- case 'thorns':
- curStage = 'schoolEvil';
- default:
- curStage = 'stage';
- }
- }
-
- var stageData:StageFile = StageData.getStageFile(curStage);
- if(stageData == null) { //Stage couldn't be found, create a dummy stage for preventing a crash
- stageData = {
- directory: "",
- defaultZoom: 0.9,
- isPixelStage: false,
-
- boyfriend: [770, 100],
- girlfriend: [400, 130],
- opponent: [100, 100]
- };
- }
-
- defaultCamZoom = stageData.defaultZoom;
- isPixelStage = stageData.isPixelStage;
- BF_X = stageData.boyfriend[0];
- BF_Y = stageData.boyfriend[1];
- GF_X = stageData.girlfriend[0];
- GF_Y = stageData.girlfriend[1];
- DAD_X = stageData.opponent[0];
- DAD_Y = stageData.opponent[1];
-
- boyfriendGroup = new FlxSpriteGroup(BF_X, BF_Y);
- dadGroup = new FlxSpriteGroup(DAD_X, DAD_Y);
- gfGroup = new FlxSpriteGroup(GF_X, GF_Y);
-
- switch (curStage)
- {
- case 'stage': //Week 1
- var bg:BGSprite = new BGSprite('stageback', -600, -200, 0.9, 0.9);
- add(bg);
-
- var stageFront:BGSprite = new BGSprite('stagefront', -650, 600, 0.9, 0.9);
- stageFront.setGraphicSize(Std.int(stageFront.width * 1.1));
- stageFront.updateHitbox();
- add(stageFront);
-
- if(!ClientPrefs.lowQuality) {
- var stageLight:BGSprite = new BGSprite('stage_light', -125, -100, 0.9, 0.9);
- stageLight.setGraphicSize(Std.int(stageLight.width * 1.1));
- stageLight.updateHitbox();
- add(stageLight);
- var stageLight:BGSprite = new BGSprite('stage_light', 1225, -100, 0.9, 0.9);
- stageLight.setGraphicSize(Std.int(stageLight.width * 1.1));
- stageLight.updateHitbox();
- stageLight.flipX = true;
- add(stageLight);
-
- var stageCurtains:BGSprite = new BGSprite('stagecurtains', -500, -300, 1.3, 1.3);
- stageCurtains.setGraphicSize(Std.int(stageCurtains.width * 0.9));
- stageCurtains.updateHitbox();
- add(stageCurtains);
- }
-
- case 'spooky': //Week 2
- if(!ClientPrefs.lowQuality) {
- halloweenBG = new BGSprite('halloween_bg', -200, -100, ['halloweem bg0', 'halloweem bg lightning strike']);
- halloweenBG.setGraphicSize(Std.int(halloweenBG.width * 2));
- halloweenBG.updateHitbox();
- } else {
- halloweenBG = new BGSprite('halloween_bg_low', -200, -100);
- }
- add(halloweenBG);
-
- halloweenWhite = new BGSprite(null, -FlxG.width, -FlxG.height, 0, 0);
- halloweenWhite.makeGraphic(Std.int(FlxG.width * 3), Std.int(FlxG.height * 3), FlxColor.WHITE);
- halloweenWhite.alpha = 0;
- halloweenWhite.blend = ADD;
-
- //PRECACHE SOUNDS
- CoolUtil.precacheSound('thunder_1');
- CoolUtil.precacheSound('thunder_2');
-
- case 'philly': //Week 3
- if(!ClientPrefs.lowQuality) {
- var bg:BGSprite = new BGSprite('philly/sky', -100, 0, 0.1, 0.1);
- add(bg);
- }
-
- var city:BGSprite = new BGSprite('philly/city', -10, 0, 0.3, 0.3);
- city.setGraphicSize(Std.int(city.width * 0.85));
- city.updateHitbox();
- add(city);
-
- phillyCityLights = new FlxTypedGroup();
- add(phillyCityLights);
-
- for (i in 0...5)
- {
- var light:BGSprite = new BGSprite('philly/win' + i, city.x, city.y, 0.3, 0.3);
- light.visible = false;
- light.setGraphicSize(Std.int(light.width * 0.85));
- light.updateHitbox();
- phillyCityLights.add(light);
- }
-
- if(!ClientPrefs.lowQuality) {
- var streetBehind:BGSprite = new BGSprite('philly/behindTrain', -40, 50);
- add(streetBehind);
- }
-
- phillyTrain = new BGSprite('philly/train', 2000, 360);
- add(phillyTrain);
-
- trainSound = new FlxSound().loadEmbedded(Paths.sound('train_passes'));
- CoolUtil.precacheSound('train_passes');
- FlxG.sound.list.add(trainSound);
-
- var street:BGSprite = new BGSprite('philly/street', -40, 50);
- add(street);
-
- case 'limo': //Week 4
- var skyBG:BGSprite = new BGSprite('limo/limoSunset', -120, -50, 0.1, 0.1);
- add(skyBG);
- antireanim = true;
-
- if(!ClientPrefs.lowQuality) {
- limoMetalPole = new BGSprite('gore/metalPole', -500, 220, 0.4, 0.4);
- add(limoMetalPole);
-
- bgLimo = new BGSprite('limo/bgLimo', -150, 480, 0.4, 0.4, ['background limo pink'], true);
- add(bgLimo);
-
- limoCorpse = new BGSprite('gore/noooooo', -500, limoMetalPole.y - 130, 0.4, 0.4, ['Henchmen on rail'], true);
- add(limoCorpse);
-
- limoCorpseTwo = new BGSprite('gore/noooooo', -500, limoMetalPole.y, 0.4, 0.4, ['henchmen death'], true);
- add(limoCorpseTwo);
-
- 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);
- }
-
- limoLight = new BGSprite('gore/coldHeartKiller', limoMetalPole.x - 180, limoMetalPole.y - 80, 0.4, 0.4);
- add(limoLight);
-
- grpLimoParticles = new FlxTypedGroup();
- add(grpLimoParticles);
-
- //PRECACHE BLOOD
- var particle:BGSprite = new BGSprite('gore/stupidBlood', -400, -400, 0.4, 0.4, ['blood'], false);
- particle.alpha = 0.01;
- grpLimoParticles.add(particle);
- resetLimoKill();
-
- //PRECACHE SOUND
- CoolUtil.precacheSound('dancerdeath');
- }
-
- limo = new BGSprite('limo/limoDrive', -120, 550, 1, 1, ['Limo stage'], true);
-
- fastCar = new BGSprite('limo/fastCarLol', -300, 160);
- fastCar.active = true;
- limoKillingState = 0;
-
- case 'mall': //Week 5 - Cocoa, Eggnog
- var bg:BGSprite = new BGSprite('christmas/bgWalls', -1000, -500, 0.2, 0.2);
- bg.setGraphicSize(Std.int(bg.width * 0.8));
- bg.updateHitbox();
- add(bg);
- antireanim = true;
-
- if(!ClientPrefs.lowQuality) {
- upperBoppers = new BGSprite('christmas/upperBop', -240, -90, 0.33, 0.33, ['Upper Crowd Bob']);
- upperBoppers.setGraphicSize(Std.int(upperBoppers.width * 0.85));
- upperBoppers.updateHitbox();
- add(upperBoppers);
-
- var bgEscalator:BGSprite = new BGSprite('christmas/bgEscalator', -1100, -600, 0.3, 0.3);
- bgEscalator.setGraphicSize(Std.int(bgEscalator.width * 0.9));
- bgEscalator.updateHitbox();
- add(bgEscalator);
- }
-
- var tree:BGSprite = new BGSprite('christmas/christmasTree', 370, -250, 0.40, 0.40);
- add(tree);
-
- bottomBoppers = new BGSprite('christmas/bottomBop', -300, 140, 0.9, 0.9, ['Bottom Level Boppers Idle']);
- bottomBoppers.animation.addByPrefix('hey', 'Bottom Level Boppers HEY', 24, false);
- bottomBoppers.setGraphicSize(Std.int(bottomBoppers.width * 1));
- bottomBoppers.updateHitbox();
- add(bottomBoppers);
-
- var fgSnow:BGSprite = new BGSprite('christmas/fgSnow', -600, 700);
- add(fgSnow);
-
- santa = new BGSprite('christmas/santa', -840, 150, 1, 1, ['santa idle in fear']);
- add(santa);
- CoolUtil.precacheSound('Lights_Shut_off');
-
- case 'mallEvil': //Week 5 - Winter Horrorland
- var bg:BGSprite = new BGSprite('christmas/evilBG', -400, -500, 0.2, 0.2);
- bg.setGraphicSize(Std.int(bg.width * 0.8));
- bg.updateHitbox();
- add(bg);
- antireanim = true;
-
- var evilTree:BGSprite = new BGSprite('christmas/evilTree', 300, -300, 0.2, 0.2);
- add(evilTree);
-
- var evilSnow:BGSprite = new BGSprite('christmas/evilSnow', -200, 700);
- add(evilSnow);
-
- case 'school': //Week 6 - Senpai, Roses
-
- GameOverSubstate.deathSoundName = 'fnf_loss_sfx-pixel';
- GameOverSubstate.loopSoundName = 'gameOver-pixel';
- GameOverSubstate.endSoundName = 'gameOverEnd-pixel';
- GameOverSubstate.characterName = 'bf-pixel-dead';
-
- var bgSky:BGSprite = new BGSprite('weeb/weebSky', 0, 0, 0.1, 0.1);
- add(bgSky);
- bgSky.antialiasing = false;
-
- var repositionShit = -200;
-
- var bgSchool:BGSprite = new BGSprite('weeb/weebSchool', repositionShit, 0, 0.6, 0.90);
- add(bgSchool);
- bgSchool.antialiasing = false;
-
- var bgStreet:BGSprite = new BGSprite('weeb/weebStreet', repositionShit, 0, 0.95, 0.95);
- add(bgStreet);
- bgStreet.antialiasing = false;
-
- var widShit = Std.int(bgSky.width * 6);
- if(!ClientPrefs.lowQuality) {
- var fgTrees:BGSprite = new BGSprite('weeb/weebTreesBack', repositionShit + 170, 130, 0.9, 0.9);
- fgTrees.setGraphicSize(Std.int(widShit * 0.8));
- fgTrees.updateHitbox();
- add(fgTrees);
- fgTrees.antialiasing = false;
- }
-
- var bgTrees:FlxSprite = new FlxSprite(repositionShit - 380, -800);
- bgTrees.frames = Paths.getPackerAtlas('weeb/weebTrees');
- 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);
- bgTrees.antialiasing = false;
-
- if(!ClientPrefs.lowQuality) {
- var treeLeaves:BGSprite = new BGSprite('weeb/petals', repositionShit, -40, 0.85, 0.85, ['PETALS ALL'], true);
- treeLeaves.setGraphicSize(widShit);
- treeLeaves.updateHitbox();
- add(treeLeaves);
- treeLeaves.antialiasing = false;
- }
-
- bgSky.setGraphicSize(widShit);
- bgSchool.setGraphicSize(widShit);
- bgStreet.setGraphicSize(widShit);
- bgTrees.setGraphicSize(Std.int(widShit * 1.4));
-
- bgSky.updateHitbox();
- bgSchool.updateHitbox();
- bgStreet.updateHitbox();
- bgTrees.updateHitbox();
-
- if(!ClientPrefs.lowQuality) {
- bgGirls = new BackgroundGirls(-100, 190);
- bgGirls.scrollFactor.set(0.9, 0.9);
-
- bgGirls.setGraphicSize(Std.int(bgGirls.width * daPixelZoom));
- bgGirls.updateHitbox();
- add(bgGirls);
- }
-
- case 'schoolEvil': //Week 6 - Thorns
- GameOverSubstate.deathSoundName = 'fnf_loss_sfx-pixel';
- GameOverSubstate.loopSoundName = 'gameOver-pixel';
- GameOverSubstate.endSoundName = 'gameOverEnd-pixel';
- GameOverSubstate.characterName = 'bf-pixel-dead';
-
- /*if(!ClientPrefs.lowQuality) { //Does this even do something?
- 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;
- if(!ClientPrefs.lowQuality) {
- var bg:BGSprite = new BGSprite('weeb/animatedEvilSchool', posX, posY, 0.8, 0.9, ['background 2'], true);
- bg.scale.set(6, 6);
- bg.antialiasing = false;
- add(bg);
-
- bgGhouls = new BGSprite('weeb/bgGhouls', -100, 190, 0.9, 0.9, ['BG freaks glitch instance'], false);
- bgGhouls.setGraphicSize(Std.int(bgGhouls.width * daPixelZoom));
- bgGhouls.updateHitbox();
- bgGhouls.visible = false;
- bgGhouls.antialiasing = false;
- add(bgGhouls);
- } else {
- var bg:BGSprite = new BGSprite('weeb/animatedEvilSchool_low', posX, posY, 0.8, 0.9);
- bg.scale.set(6, 6);
- bg.antialiasing = false;
- add(bg);
- }
- }
-
- if(isPixelStage) {
- introSoundsSuffix = '-pixel';
- }
-
- add(gfGroup);
-
- // Shitty layering but whatev it works LOL
- if (curStage == 'limo')
- add(limo);
-
- add(dadGroup);
- add(boyfriendGroup);
-
- if(curStage == 'spooky') {
- add(halloweenWhite);
- }
-
- #if LUA_ALLOWED
- luaDebugGroup = new FlxTypedGroup();
- luaDebugGroup.cameras = [camOther];
- add(luaDebugGroup);
- #end
-
- var doPush:Bool = false;
- #if (MODS_ALLOWED && LUA_ALLOWED)
- if(openfl.utils.Assets.exists("assets/stages/" + curStage + ".lua"))
- {
- var path = Paths.luaAsset("stages/" + curStage);
- var luaFile = openfl.Assets.getBytes(path);
-
- FileSystem.createDirectory(Main.path + "assets");
- FileSystem.createDirectory(Main.path + "assets/stages");
-
- File.saveBytes(Paths.lua("stages/" + curStage), luaFile);
-
- doPush = true;
- }
-
- if(curStage == 'philly') {
- phillyCityLightsEvent = new FlxTypedGroup();
- for (i in 0...5)
- {
- var light:BGSprite = new BGSprite('philly/win' + i, -10, 0, 0.3, 0.3);
- light.visible = false;
- light.setGraphicSize(Std.int(light.width * 0.85));
- light.updateHitbox();
- phillyCityLightsEvent.add(light);
- }
- }
-
- if(doPush)
- luaArray.push(new FunkinLua(Paths.lua("stages/" + curStage)));
-
- if(!modchartSprites.exists('blammedLightsBlack')) { //Creates blammed light black fade in case you didn't make your own
- blammedLightsBlack = new ModchartSprite(FlxG.width * -0.5, FlxG.height * -0.5);
- blammedLightsBlack.makeGraphic(Std.int(FlxG.width * 2), Std.int(FlxG.height * 2), FlxColor.BLACK);
- var position:Int = members.indexOf(gfGroup);
- if(members.indexOf(boyfriendGroup) < position) {
- position = members.indexOf(boyfriendGroup);
- } else if(members.indexOf(dadGroup) < position) {
- position = members.indexOf(dadGroup);
- }
- insert(position, blammedLightsBlack);
-
- blammedLightsBlack.wasAdded = true;
- modchartSprites.set('blammedLightsBlack', blammedLightsBlack);
- }
- if(curStage == 'philly') insert(members.indexOf(blammedLightsBlack) + 1, phillyCityLightsEvent);
- blammedLightsBlack = modchartSprites.get('blammedLightsBlack');
- blammedLightsBlack.alpha = 0.0;
- #end
-
- var gfVersion:String = SONG.player3;
- if(gfVersion == null || gfVersion.length < 1) {
- switch (curStage)
- {
- case 'limo':
- gfVersion = 'gf-car';
- case 'mall' | 'mallEvil':
- gfVersion = 'gf-christmas';
- case 'school' | 'schoolEvil':
- gfVersion = 'gf-pixel';
- default:
- gfVersion = 'gf';
- }
- SONG.player3 = gfVersion; //Fix for the Chart Editor
- }
-
- if(ClientPrefs.girlfriend){
- gf = new Character(0, 0, 'invisibru');
- } else {
- gf = new Character(0, 0, gfVersion);
- }
- startCharacterPos(gf);
- gf.scrollFactor.set(0.95, 0.95);
- gfGroup.add(gf);
-
- dad = new Character(0, 0, SONG.player2);
- startCharacterPos(dad, true);
- dadGroup.add(dad);
-
- if(ClientPrefs.sussybest && !isPixelStage && !antireanim){
- boyfriend = new Boyfriend(0, 0, 'bfreanim');
- } else {
- boyfriend = new Boyfriend(0, 0, SONG.player1);
- }
- startCharacterPos(boyfriend);
- boyfriendGroup.add(boyfriend);
-
- var camPos:FlxPoint = new FlxPoint(gf.getGraphicMidpoint().x, gf.getGraphicMidpoint().y);
- camPos.x += gf.cameraPosition[0];
- camPos.y += gf.cameraPosition[1];
-
- if(dad.curCharacter.startsWith('gf')) {
- dad.setPosition(GF_X, GF_Y);
- gf.visible = false;
- }
-
- switch(curStage)
- {
- case 'limo':
- resetFastCar();
- insert(members.indexOf(gfGroup) - 1, fastCar);
-
- case 'schoolEvil':
- var evilTrail = new FlxTrail(dad, null, 4, 24, 0.3, 0.069); //nice
- insert(members.indexOf(dadGroup) - 1, evilTrail);
- }
-
- var file:String = Paths.json(songName + '/dialogue'); //Checks for json/Psych Engine dialogue
- if (OpenFlAssets.exists(file)) {
- dialogueJson = DialogueBoxPsych.parseDialogue(file);
- }
-
- var file:String = Paths.txt(songName + '/' + songName + 'Dialogue'); //Checks for vanilla/Senpai dialogue
- if (OpenFlAssets.exists(file)) {
- dialogue = CoolUtil.coolTextFile(file);
- }
- var doof:DialogueBox = new DialogueBox(false, dialogue);
- // doof.x += 70;
- // doof.y = FlxG.height * 0.5;
- doof.scrollFactor.set();
- doof.finishThing = startCountdown;
- doof.nextDialogueThing = startNextDialogue;
- doof.skipDialogueThing = skipDialogue;
-
- Conductor.songPosition = -5000;
-
- strumLine = new FlxSprite(ClientPrefs.middleScroll ? STRUM_X_MIDDLESCROLL : STRUM_X, 50).makeGraphic(FlxG.width, 10);
- if(ClientPrefs.downScroll) strumLine.y = FlxG.height - 150;
- strumLine.scrollFactor.set();
-
- timeTxt = new FlxText(STRUM_X + (FlxG.width / 2) - 248, 20, 400, "", 32);
- timeTxt.setFormat(Paths.font("vcr.ttf"), 32, FlxColor.WHITE, CENTER, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK);
- timeTxt.scrollFactor.set();
- timeTxt.alpha = 0;
- timeTxt.borderSize = 2;
- timeTxt.visible = !ClientPrefs.hideTime;
- if(ClientPrefs.downScroll) timeTxt.y = FlxG.height - 45;
-
- timeBarBG = new AttachedSprite('timeBar');
- timeBarBG.x = timeTxt.x;
- timeBarBG.y = timeTxt.y + (timeTxt.height / 4);
- timeBarBG.scrollFactor.set();
- timeBarBG.alpha = 0;
- timeBarBG.visible = !ClientPrefs.hideTime;
- timeBarBG.color = FlxColor.BLACK;
- timeBarBG.xAdd = -4;
- timeBarBG.yAdd = -4;
- add(timeBarBG);
-
- timeBar = new FlxBar(timeBarBG.x + 4, timeBarBG.y + 4, LEFT_TO_RIGHT, Std.int(timeBarBG.width - 8), Std.int(timeBarBG.height - 8), this,
- 'songPercent', 0, 1);
- timeBar.scrollFactor.set();
- timeBar.createFilledBar(0xFF000000, 0xFFFFFFFF);
- timeBar.numDivisions = 800; //How much lag this causes?? Should i tone it down to idk, 400 or 200?
- timeBar.alpha = 0;
- timeBar.visible = !ClientPrefs.hideTime;
- add(timeBar);
- add(timeTxt);
- timeBarBG.sprTracker = timeBar;
-
- strumLineNotes = new FlxTypedGroup();
- add(strumLineNotes);
- add(grpNoteSplashes);
-
- var splash:NoteSplash = new NoteSplash(100, 100, 0);
- grpNoteSplashes.add(splash);
- splash.alpha = 0.0;
-
- opponentStrums = new FlxTypedGroup();
- playerStrums = new FlxTypedGroup();
-
- // startCountdown();
-
- generateSong(SONG.song);
- #if LUA_ALLOWED
- for (notetype in noteTypeMap.keys()) {
- var luaToLoad:String = 'custom_notetypes/' + notetype + '.lua';
- luaToLoad = Paths.getPreloadPath(luaToLoad);
- if(OpenFlAssets.exists(luaToLoad)) {
- luaArray.push(new FunkinLua(Asset2File.getPath(luaToLoad)));
- }
- }
- for (event in eventPushedMap.keys()) {
- var luaToLoad:String = 'custom_events/' + event + '.lua';
- luaToLoad = Paths.getPreloadPath(luaToLoad);
- if(OpenFlAssets.exists(luaToLoad)) {
- luaArray.push(new FunkinLua(Asset2File.getPath(luaToLoad)));
- }
- }
- #end
- noteTypeMap.clear();
- noteTypeMap = null;
- eventPushedMap.clear();
- eventPushedMap = null;
-
- // After all characters being loaded, it makes then invisible 0.01s later so that the player won't freeze when you change characters
- // add(strumLine);
-
- camFollow = new FlxPoint();
- camFollowPos = new FlxObject(0, 0, 1, 1);
-
- snapCamFollowToPos(camPos.x, camPos.y);
- if (prevCamFollow != null)
- {
- camFollow = prevCamFollow;
- prevCamFollow = null;
- }
- if (prevCamFollowPos != null)
- {
- camFollowPos = prevCamFollowPos;
- prevCamFollowPos = null;
- }
- add(camFollowPos);
-
- FlxG.camera.follow(camFollowPos, LOCKON, 1);
- // FlxG.camera.setScrollBounds(0, FlxG.width, 0, FlxG.height);
- FlxG.camera.zoom = defaultCamZoom;
- FlxG.camera.focusOn(camFollow);
-
- FlxG.worldBounds.set(0, 0, FlxG.width, FlxG.height);
-
- FlxG.fixedTimestep = false;
- moveCameraSection(0);
-
- healthBarBG = new AttachedSprite('healthBar');
- healthBarBG.y = FlxG.height * 0.89;
- healthBarBG.screenCenter(X);
- healthBarBG.scrollFactor.set();
- healthBarBG.visible = !ClientPrefs.hideHud;
- healthBarBG.xAdd = -4;
- healthBarBG.yAdd = -4;
- add(healthBarBG);
- if(ClientPrefs.downScroll) healthBarBG.y = 0.11 * FlxG.height;
-
- healthBar = new FlxBar(healthBarBG.x + 4, healthBarBG.y + 4, RIGHT_TO_LEFT, Std.int(healthBarBG.width - 8), Std.int(healthBarBG.height - 8), this,
- 'health', 0, 2);
- healthBar.scrollFactor.set();
- // healthBar
- healthBar.visible = !ClientPrefs.hideHud;
- add(healthBar);
- healthBarBG.sprTracker = healthBar;
-
- iconP1 = new HealthIcon(boyfriend.healthIcon, true);
- iconP1.y = healthBar.y - (iconP1.height / 2);
- iconP1.visible = !ClientPrefs.hideHud;
- add(iconP1);
-
- iconP2 = new HealthIcon(dad.healthIcon, false);
- iconP2.y = healthBar.y - (iconP2.height / 2);
- iconP2.visible = !ClientPrefs.hideHud;
- add(iconP2);
- reloadHealthBarColors();
-
- scoreTxt = new FlxText(0, healthBarBG.y + 36, FlxG.width, "", 20);
- scoreTxt.setFormat(Paths.font("vcr.ttf"), 20, FlxColor.WHITE, CENTER, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK);
- scoreTxt.scrollFactor.set();
- scoreTxt.borderSize = 1.25;
- scoreTxt.visible = !ClientPrefs.hideHud;
- add(scoreTxt);
-
- botplayTxt = new FlxText(400, timeBarBG.y + 55, FlxG.width - 800, "BOTPLAY", 32);
- botplayTxt.setFormat(Paths.font("vcr.ttf"), 32, FlxColor.WHITE, CENTER, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK);
- botplayTxt.scrollFactor.set();
- botplayTxt.borderSize = 1.25;
- botplayTxt.visible = cpuControlled;
- add(botplayTxt);
- if(ClientPrefs.downScroll) {
- botplayTxt.y = timeBarBG.y - 78;
- }
-
- strumLineNotes.cameras = [camHUD];
- grpNoteSplashes.cameras = [camHUD];
- notes.cameras = [camHUD];
- healthBar.cameras = [camHUD];
- healthBarBG.cameras = [camHUD];
- iconP1.cameras = [camHUD];
- iconP2.cameras = [camHUD];
- scoreTxt.cameras = [camHUD];
- botplayTxt.cameras = [camHUD];
- timeBar.cameras = [camHUD];
- timeBarBG.cameras = [camHUD];
- timeTxt.cameras = [camHUD];
- doof.cameras = [camHUD];
-
- #if mobileC
- mcontrols = new Mobilecontrols();
- switch (mcontrols.mode)
- {
- case VIRTUALPAD_RIGHT | VIRTUALPAD_LEFT | VIRTUALPAD_CUSTOM:
- controls.setVirtualPad(mcontrols._virtualPad, FULL, NONE);
- case HITBOX:
- controls.setHitBox(mcontrols._hitbox);
- default:
- }
- trackedinputs = controls.trackedinputs;
- controls.trackedinputs = [];
- var camcontrol = new FlxCamera();
- FlxG.cameras.add(camcontrol);
- camcontrol.bgColor.alpha = 0;
- mcontrols.cameras = [camcontrol];
-
- mcontrols.visible = false;
-
- add(mcontrols);
- #end
-
-
- // if (SONG.song == 'South')
- // FlxG.camera.alpha = 0.7;
- // UI_camera.zoom = 1;
-
- // cameras = [FlxG.cameras.list[1]];
- startingSong = true;
- updateTime = true;
-
- #if (LUA_ALLOWED)
- var doPush:Bool = false;
- var luaFile:String = 'data/' + Paths.formatToSongPath(SONG.song) + '/script.lua';
- if(FileSystem.exists(luaFile)) {
- luaFile = Paths.getPreloadPath(luaFile);
- doPush = true;
- } else {
- luaFile = Paths.getPreloadPath(luaFile);
- if(FileSystem.exists(luaFile)) {
- doPush = true;
- }
- }
-
- if(doPush)
- luaArray.push(new FunkinLua(luaFile));
- #end
-
- var daSong:String = Paths.formatToSongPath(curSong);
- if (isStoryMode && !seenCutscene)
- {
- switch (daSong)
- {
- case "monster":
- var whiteScreen:FlxSprite = new FlxSprite(0, 0).makeGraphic(Std.int(FlxG.width * 2), Std.int(FlxG.height * 2), FlxColor.WHITE);
- add(whiteScreen);
- whiteScreen.scrollFactor.set();
- whiteScreen.blend = ADD;
- camHUD.visible = false;
- snapCamFollowToPos(dad.getMidpoint().x + 150, dad.getMidpoint().y - 100);
- inCutscene = true;
-
- FlxTween.tween(whiteScreen, {alpha: 0}, 1, {
- startDelay: 0.1,
- ease: FlxEase.linear,
- onComplete: function(twn:FlxTween)
- {
- camHUD.visible = true;
- remove(whiteScreen);
- startCountdown();
- }
- });
- FlxG.sound.play(Paths.soundRandom('thunder_', 1, 2));
- gf.playAnim('scared', true);
- boyfriend.playAnim('scared', true);
-
- case "winter-horrorland":
- var blackScreen:FlxSprite = new FlxSprite().makeGraphic(Std.int(FlxG.width * 2), Std.int(FlxG.height * 2), FlxColor.BLACK);
- add(blackScreen);
- blackScreen.scrollFactor.set();
- camHUD.visible = false;
- inCutscene = true;
-
- FlxTween.tween(blackScreen, {alpha: 0}, 0.7, {
- ease: FlxEase.linear,
- onComplete: function(twn:FlxTween) {
- remove(blackScreen);
- }
- });
- FlxG.sound.play(Paths.sound('Lights_Turn_On'));
- snapCamFollowToPos(400, -2050);
- FlxG.camera.focusOn(camFollow);
- FlxG.camera.zoom = 1.5;
-
- new FlxTimer().start(0.8, function(tmr:FlxTimer)
- {
- camHUD.visible = true;
- remove(blackScreen);
- FlxTween.tween(FlxG.camera, {zoom: defaultCamZoom}, 2.5, {
- ease: FlxEase.quadInOut,
- onComplete: function(twn:FlxTween)
- {
- startCountdown();
- }
- });
- });
- case 'senpai' | 'roses' | 'thorns':
- if(daSong == 'roses') FlxG.sound.play(Paths.sound('ANGRY'));
- schoolIntro(doof);
-
- default:
- startDialogue(dialogueJson);
- }
- seenCutscene = true;
- } else {
- startCountdown();
- }
- RecalculateRating();
-
- //PRECACHING MISS SOUNDS BECAUSE I THINK THEY CAN LAG PEOPLE AND FUCK THEM UP IDK HOW HAXE WORKS
- CoolUtil.precacheSound('missnote1');
- CoolUtil.precacheSound('missnote2');
- CoolUtil.precacheSound('missnote3');
- if (ClientPrefs.violence){CoolUtil.precacheSound('osu');}
-
- #if desktop
- // Updating Discord Rich Presence.
- DiscordClient.changePresence(detailsText, SONG.song + " (" + storyDifficultyText + ")", iconP2.getCharacter());
- #end
-
-
- callOnLuas('onCreatePost', []);
-
-
- super.create();
- }
-
- public function addTextToDebug(text:String) {
- #if LUA_ALLOWED
- luaDebugGroup.forEachAlive(function(spr:DebugLuaText) {
- spr.y += 20;
- });
- luaDebugGroup.add(new DebugLuaText(text, luaDebugGroup));
- #end
- }
-
- public function reloadHealthBarColors() {
- healthBar.createFilledBar(FlxColor.fromRGB(dad.healthColorArray[0], dad.healthColorArray[1], dad.healthColorArray[2]),
- FlxColor.fromRGB(boyfriend.healthColorArray[0], boyfriend.healthColorArray[1], boyfriend.healthColorArray[2]));
- healthBar.updateBar();
- }
-
- public function addCharacterToList(newCharacter:String, type:Int) {
- switch(type) {
- case 0:
- if(!boyfriendMap.exists(newCharacter)) {
- var newBoyfriend:Boyfriend = new Boyfriend(0, 0, newCharacter);
- boyfriendMap.set(newCharacter, newBoyfriend);
- boyfriendGroup.add(newBoyfriend);
- startCharacterPos(newBoyfriend);
- newBoyfriend.alpha = 0.00001;
- newBoyfriend.alreadyLoaded = false;
- }
-
- case 1:
- if(!dadMap.exists(newCharacter)) {
- var newDad:Character = new Character(0, 0, newCharacter);
- dadMap.set(newCharacter, newDad);
- dadGroup.add(newDad);
- startCharacterPos(newDad, true);
- newDad.alpha = 0.00001;
- newDad.alreadyLoaded = false;
- }
-
- case 2:
- if(!gfMap.exists(newCharacter)) {
- var newGf:Character = new Character(0, 0, newCharacter);
- newGf.scrollFactor.set(0.95, 0.95);
- gfMap.set(newCharacter, newGf);
- gfGroup.add(newGf);
- startCharacterPos(newGf);
- newGf.alpha = 0.00001;
- newGf.alreadyLoaded = false;
- }
- }
- }
- function startCharacterPos(char:Character, ?gfCheck:Bool = false) {
- if(gfCheck && char.curCharacter.startsWith('gf')) { //IF DAD IS GIRLFRIEND, HE GOES TO HER POSITION
- char.setPosition(GF_X, GF_Y);
- char.scrollFactor.set(0.95, 0.95);
- }
- char.x += char.positionArray[0];
- char.y += char.positionArray[1];
- }
-
- public function startVideo(name:String):Void {
- #if VIDEOS_ALLOWED
- var foundFile:Bool = false;
- var fileName:String = #if MODS_ALLOWED Paths.modFolders('videos/' + name + '.' + Paths.VIDEO_EXT); #else ''; #end
- #if sys
- if(FileSystem.exists(fileName)) {
- foundFile = true;
- }
- #end
-
- if(!foundFile) {
- fileName = Paths.video(name);
- #if sys
- if(FileSystem.exists(fileName)) {
- #else
- if(OpenFlAssets.exists(fileName)) {
- #end
- foundFile = true;
- }
- }
-
- if(foundFile) {
- inCutscene = true;
- var bg = new FlxSprite(-FlxG.width, -FlxG.height).makeGraphic(FlxG.width * 3, FlxG.height * 3, FlxColor.BLACK);
- bg.scrollFactor.set();
- bg.cameras = [camHUD];
- add(bg);
-
- (new FlxVideo(fileName)).finishCallback = function() {
- remove(bg);
- if(endingSong) {
- endSong();
- } else {
- startCountdown();
- }
- }
- return;
- } else {
- FlxG.log.warn('Couldnt find video file: ' + fileName);
- }
- #end
- if(endingSong) {
- endSong();
- } else {
- startCountdown();
- }
- }
-
- var dialogueCount:Int = 0;
- //You don't have to add a song, just saying. You can just do "startDialogue(dialogueJson);" and it should work
- public function startDialogue(dialogueFile:DialogueFile, ?song:String = null):Void
- {
- // TO DO: Make this more flexible, maybe?
- if(ClientPrefs.idkwhy && dialogueFile.dialogue.length > 1) { //Assim vai bugar menos com os dialogos da week 6
- inCutscene = true;
- CoolUtil.precacheSound('dialogue');
- CoolUtil.precacheSound('dialogueClose');
- var doof:DialogueBoxPsych = new DialogueBoxPsych(dialogueFile, song);
- doof.scrollFactor.set();
- if(endingSong) {
- doof.finishThing = endSong;
- } else {
- doof.finishThing = startCountdown;
- }
- doof.nextDialogueThing = startNextDialogue;
- doof.skipDialogueThing = skipDialogue;
- doof.cameras = [camHUD];
- add(doof);
- } else {
- if(endingSong) {
- endSong();
- } else {
- startCountdown();
- }
- }
- }
-
- function schoolIntro(?dialogueBox:DialogueBox):Void
- {
- inCutscene = true;
- var black:FlxSprite = new FlxSprite(-100, -100).makeGraphic(FlxG.width * 2, FlxG.height * 2, FlxColor.BLACK);
- black.scrollFactor.set();
- add(black);
-
- var red:FlxSprite = new FlxSprite(-100, -100).makeGraphic(FlxG.width * 2, FlxG.height * 2, 0xFFff1b31);
- red.scrollFactor.set();
-
- var senpaiEvil:FlxSprite = new FlxSprite();
- senpaiEvil.frames = Paths.getSparrowAtlas('weeb/senpaiCrazy');
- senpaiEvil.animation.addByPrefix('idle', 'Senpai Pre Explosion', 24, false);
- senpaiEvil.setGraphicSize(Std.int(senpaiEvil.width * 6));
- senpaiEvil.scrollFactor.set();
- senpaiEvil.updateHitbox();
- senpaiEvil.screenCenter();
- senpaiEvil.x += 300;
-
- var songName:String = Paths.formatToSongPath(SONG.song);
- if (songName == 'roses' || songName == 'thorns')
- {
- remove(black);
-
- if (songName == 'thorns')
- {
- add(red);
- camHUD.visible = false;
- }
- }
-
- new FlxTimer().start(0.3, function(tmr:FlxTimer)
- {
- black.alpha -= 0.15;
-
- if (black.alpha > 0)
- {
- tmr.reset(0.3);
- }
- else
- {
- if (dialogueBox != null)
- {
- if (Paths.formatToSongPath(SONG.song) == 'thorns')
- {
- add(senpaiEvil);
- senpaiEvil.alpha = 0;
- new FlxTimer().start(0.3, function(swagTimer:FlxTimer)
- {
- senpaiEvil.alpha += 0.15;
- if (senpaiEvil.alpha < 1)
- {
- swagTimer.reset();
- }
- else
- {
- senpaiEvil.animation.play('idle');
- FlxG.sound.play(Paths.sound('Senpai_Dies'), 1, false, null, true, function()
- {
- remove(senpaiEvil);
- remove(red);
- FlxG.camera.fade(FlxColor.WHITE, 0.01, true, function()
- {
- add(dialogueBox);
- camHUD.visible = true;
- }, true);
- });
- new FlxTimer().start(3.2, function(deadTime:FlxTimer)
- {
- FlxG.camera.fade(FlxColor.WHITE, 1.6, false);
- });
- }
- });
- }
- else
- {
- add(dialogueBox);
- }
- }
- else
- startCountdown();
-
- remove(black);
- }
- });
- }
-
- var startTimer:FlxTimer;
- var finishTimer:FlxTimer = null;
-
- // For being able to mess with the sprites on Lua
- public var countDownSprites:Array = [];
-
- public function startCountdown():Void
- {
-
- #if mobileC
- mcontrols.visible = true;
- #end
-
- if(startedCountdown) {
- callOnLuas('onStartCountdown', []);
- return;
- }
-
- inCutscene = false;
- var ret:Dynamic = callOnLuas('onStartCountdown', []);
- if(ret != FunkinLua.Function_Stop) {
- generateStaticArrows(0);
- generateStaticArrows(1);
- for (i in 0...playerStrums.length) {
- setOnLuas('defaultPlayerStrumX' + i, playerStrums.members[i].x);
- setOnLuas('defaultPlayerStrumY' + i, playerStrums.members[i].y);
- }
- for (i in 0...opponentStrums.length) {
- setOnLuas('defaultOpponentStrumX' + i, opponentStrums.members[i].x);
- setOnLuas('defaultOpponentStrumY' + i, opponentStrums.members[i].y);
- if(ClientPrefs.middleScroll) opponentStrums.members[i].visible = false;
- }
-
- startedCountdown = true;
- Conductor.songPosition = 0;
- Conductor.songPosition -= Conductor.crochet * 5;
- setOnLuas('startedCountdown', true);
-
- var swagCounter:Int = 0;
-
- startTimer = new FlxTimer().start(Conductor.crochet / 1000, function(tmr:FlxTimer)
- {
- if (tmr.loopsLeft % gfSpeed == 0 && !gf.stunned && gf.animation.curAnim.name != null && !gf.animation.curAnim.name.startsWith("sing"))
- {
- gf.dance();
- }
- if(tmr.loopsLeft % 2 == 0) {
- if (boyfriend.animation.curAnim != null && !boyfriend.animation.curAnim.name.startsWith('sing'))
- {
- boyfriend.dance();
- }
- if (dad.animation.curAnim != null && !dad.animation.curAnim.name.startsWith('sing') && !dad.stunned)
- {
- dad.dance();
- }
- }
- else if(dad.danceIdle && dad.animation.curAnim != null && !dad.stunned && !dad.curCharacter.startsWith('gf') && !dad.animation.curAnim.name.startsWith("sing"))
- {
- dad.dance();
- }
-
- var introAssets:Map> = new Map>();
- introAssets.set('default', ['ready', 'set', 'go']);
- introAssets.set('pixel', ['pixelUI/ready-pixel', 'pixelUI/set-pixel', 'pixelUI/date-pixel']);
-
- var introAlts:Array = introAssets.get('default');
- var antialias:Bool = ClientPrefs.globalAntialiasing;
- if(isPixelStage) {
- introAlts = introAssets.get('pixel');
- antialias = false;
- }
-
- // head bopping for bg characters on Mall
- if(curStage == 'mall') {
- if(!ClientPrefs.lowQuality)
- upperBoppers.dance(true);
-
- bottomBoppers.dance(true);
- santa.dance(true);
- }
-
- switch (swagCounter)
- {
- case 0:
- FlxG.sound.play(Paths.sound('intro3' + introSoundsSuffix), 0.6);
- case 1:
- var ready:FlxSprite = new FlxSprite().loadGraphic(Paths.image(introAlts[0]));
- ready.scrollFactor.set();
- ready.updateHitbox();
-
- if (PlayState.isPixelStage)
- ready.setGraphicSize(Std.int(ready.width * daPixelZoom));
-
- ready.screenCenter();
- ready.antialiasing = antialias;
- add(ready);
- countDownSprites.push(ready);
- FlxTween.tween(ready, {y: ready.y += 100, alpha: 0}, Conductor.crochet / 1000, {
- ease: FlxEase.cubeInOut,
- onComplete: function(twn:FlxTween)
- {
- countDownSprites.remove(ready);
- remove(ready);
- ready.destroy();
- }
- });
- FlxG.sound.play(Paths.sound('intro2' + introSoundsSuffix), 0.6);
- case 2:
- var set:FlxSprite = new FlxSprite().loadGraphic(Paths.image(introAlts[1]));
- set.scrollFactor.set();
-
- if (PlayState.isPixelStage)
- set.setGraphicSize(Std.int(set.width * daPixelZoom));
-
- set.screenCenter();
- set.antialiasing = antialias;
- add(set);
- countDownSprites.push(set);
- FlxTween.tween(set, {y: set.y += 100, alpha: 0}, Conductor.crochet / 1000, {
- ease: FlxEase.cubeInOut,
- onComplete: function(twn:FlxTween)
- {
- countDownSprites.remove(set);
- remove(set);
- set.destroy();
- }
- });
- FlxG.sound.play(Paths.sound('intro1' + introSoundsSuffix), 0.6);
- case 3:
- var go:FlxSprite = new FlxSprite().loadGraphic(Paths.image(introAlts[2]));
- go.scrollFactor.set();
-
- if (PlayState.isPixelStage)
- go.setGraphicSize(Std.int(go.width * daPixelZoom));
-
- go.updateHitbox();
-
- go.screenCenter();
- go.antialiasing = antialias;
- add(go);
- countDownSprites.push(go);
- FlxTween.tween(go, {y: go.y += 100, alpha: 0}, Conductor.crochet / 1000, {
- ease: FlxEase.cubeInOut,
- onComplete: function(twn:FlxTween)
- {
- countDownSprites.remove(go);
- remove(go);
- go.destroy();
- }
- });
- FlxG.sound.play(Paths.sound('introGo' + introSoundsSuffix), 0.6);
- case 4:
- }
-
- notes.forEachAlive(function(note:Note) {
- note.copyAlpha = false;
- note.alpha = 1 * note.multAlpha;
- });
- callOnLuas('onCountdownTick', [swagCounter]);
-
- if (generatedMusic)
- {
- notes.sort(FlxSort.byY, ClientPrefs.downScroll ? FlxSort.ASCENDING : FlxSort.DESCENDING);
- }
-
- swagCounter += 1;
- // generateSong('fresh');
- }, 5);
- }
- }
-
- function doFlash():Void
- {
- var flashValue:Int = 1;
- if (ClientPrefs.flashing)
- FlxG.camera.flash(FlxColor.WHITE, flashValue);
- else
- FlxG.camera.flash(FlxColor.BLACK, flashValue);
- }
-
- function startNextDialogue() {
- dialogueCount++;
- callOnLuas('onNextDialogue', [dialogueCount]);
- }
-
- function skipDialogue() {
- callOnLuas('onSkipDialogue', [dialogueCount]);
- }
-
- var previousFrameTime:Int = 0;
- var lastReportedPlayheadPosition:Int = 0;
- var songTime:Float = 0;
-
- function startSong():Void
- {
- startingSong = false;
-
- previousFrameTime = FlxG.game.ticks;
- lastReportedPlayheadPosition = 0;
-
- FlxG.sound.playMusic(Paths.inst(PlayState.SONG.song), 1, false);
- FlxG.sound.music.onComplete = finishSong;
- vocals.play();
-
- if(paused) {
- //trace('Oopsie doopsie! Paused sound');
- FlxG.sound.music.pause();
- vocals.pause();
- }
-
- // Song duration in a float, useful for the time left feature
- songLength = FlxG.sound.music.length;
- FlxTween.tween(timeBar, {alpha: 1}, 0.5, {ease: FlxEase.circOut});
- FlxTween.tween(timeTxt, {alpha: 1}, 0.5, {ease: FlxEase.circOut});
-
- #if desktop
- // Updating Discord Rich Presence (with Time Left)
- DiscordClient.changePresence(detailsText, SONG.song + " (" + storyDifficultyText + ")", iconP2.getCharacter(), true, songLength);
- #end
- setOnLuas('songLength', songLength);
- callOnLuas('onSongStart', []);
- }
-
- var debugNum:Int = 0;
- private var noteTypeMap:Map = new Map();
- private var eventPushedMap:Map = new Map();
-
- private function generateSong(dataPath:String):Void
- {
- // FlxG.log.add(ChartParser.parse());
-
- songSpeed = SONG.speed;
-
- var songData = SONG;
- Conductor.changeBPM(songData.bpm);
-
- curSong = songData.song;
-
- if (SONG.needsVoices)
- vocals = new FlxSound().loadEmbedded(Paths.voices(PlayState.SONG.song));
- else
- vocals = new FlxSound();
-
- FlxG.sound.list.add(vocals);
- FlxG.sound.list.add(new FlxSound().loadEmbedded(Paths.inst(PlayState.SONG.song)));
-
- notes = new FlxTypedGroup();
- add(notes);
-
- var noteData:Array;
-
- // NEW SHIT
- noteData = songData.notes;
-
- var playerCounter:Int = 0;
-
- var daBeats:Int = 0; // Not exactly representative of 'daBeats' lol, just how much it has looped
-
- var songName:String = Paths.formatToSongPath(SONG.song);
- var file:String = Paths.json(songName + '/events');
- #if desktop
- if (FileSystem.exists(Paths.modsJson(songName + '/events')) || FileSystem.exists(file)) {
- #else
- if (OpenFlAssets.exists(file)) {
- #end
- var eventsData:Array = Song.loadFromJson('events', songName).notes;
- for (section in eventsData)
- {
- for (songNotes in section.sectionNotes)
- {
- if(songNotes[1] < 0) {
- eventNotes.push([songNotes[0], songNotes[1], songNotes[2], songNotes[3], songNotes[4]]);
- eventPushed(songNotes);
- }
- }
- }
- }
-
- for (section in noteData)
- {
- for (songNotes in section.sectionNotes)
- {
- if(songNotes[1] > -1) { //Real notes
- var daStrumTime:Float = songNotes[0];
- var daNoteData:Int = Std.int(songNotes[1] % 4);
-
- var gottaHitNote:Bool = section.mustHitSection;
-
- if (songNotes[1] > 3)
- {
- gottaHitNote = !section.mustHitSection;
- }
-
- var oldNote:Note;
- if (unspawnNotes.length > 0)
- oldNote = unspawnNotes[Std.int(unspawnNotes.length - 1)];
- else
- oldNote = null;
-
- var swagNote:Note = new Note(daStrumTime, daNoteData, oldNote);
- swagNote.mustPress = gottaHitNote;
- swagNote.sustainLength = songNotes[2];
- swagNote.noteType = songNotes[3];
- if(!Std.isOfType(songNotes[3], String)) swagNote.noteType = editors.ChartingState.noteTypeList[songNotes[3]]; //Backward compatibility + compatibility with Week 7 charts
-
-
- if (section.gfSection){
- trace("got gf section");
- if (songNotes[3] == null || songNotes[3] == ''|| songNotes[3].length ==0){
- swagNote.noteType = 'GF Sing';
- trace("got gf notes");
- }
- }
-
- swagNote.scrollFactor.set();
-
- var susLength:Float = swagNote.sustainLength;
-
- susLength = susLength / Conductor.stepCrochet;
- unspawnNotes.push(swagNote);
-
- var floorSus:Int = Math.floor(susLength);
- if(floorSus > 0) {
- for (susNote in 0...floorSus+1)
- {
- oldNote = unspawnNotes[Std.int(unspawnNotes.length - 1)];
-
- var sustainNote:Note = new Note(daStrumTime + (Conductor.stepCrochet * susNote) + (Conductor.stepCrochet / FlxMath.roundDecimal(songSpeed, 2)), daNoteData, oldNote, true);
- sustainNote.mustPress = gottaHitNote;
- sustainNote.noteType = swagNote.noteType;
- sustainNote.scrollFactor.set();
- unspawnNotes.push(sustainNote);
-
- if (sustainNote.mustPress)
- {
- sustainNote.x += FlxG.width / 2; // general offset
- }
- }
- }
-
- if (swagNote.mustPress)
- {
- swagNote.x += FlxG.width / 2; // general offset
- }
- else {}
-
- if(!noteTypeMap.exists(swagNote.noteType)) {
- noteTypeMap.set(swagNote.noteType, true);
- }
- } else { //Event Notes
- eventNotes.push([songNotes[0], songNotes[1], songNotes[2], songNotes[3], songNotes[4]]);
- eventPushed(songNotes);
- }
- }
- daBeats += 1;
- }
-
- // trace(unspawnNotes.length);
- // playerCounter += 1;
-
- unspawnNotes.sort(sortByShit);
- if(eventNotes.length > 1) { //No need to sort if there's a single one or none at all
- eventNotes.sort(sortByTime);
- }
- checkEventNote();
- generatedMusic = true;
- }
-
- function eventPushed(event:Array) {
- switch(event[2]) {
- case 'Change Character':
- var charType:Int = 0;
- switch(event[3].toLowerCase()) {
- case 'gf' | 'girlfriend':
- charType = 2;
- case 'dad' | 'opponent':
- charType = 1;
- default:
- charType = Std.parseInt(event[3]);
- if(Math.isNaN(charType)) charType = 0;
- }
-
- var newCharacter:String = event[4];
- addCharacterToList(newCharacter, charType);
- }
-
- if(!eventPushedMap.exists(event[2])) {
- eventPushedMap.set(event[2], true);
- }
- }
-
- function eventNoteEarlyTrigger(event:Array):Float {
- var returnedValue:Float = callOnLuas('eventEarlyTrigger', [event[2]]);
- if(returnedValue != 0) {
- return returnedValue;
- }
-
- switch(event[2]) {
- case 'Kill Henchmen': //Better timing so that the kill sound matches the beat intended
- return 280; //Plays 280ms before the actual position
- }
- return 0;
- }
-
- function sortByShit(Obj1:Note, Obj2:Note):Int
- {
- return FlxSort.byValues(FlxSort.ASCENDING, Obj1.strumTime, Obj2.strumTime);
- }
-
- function sortByTime(Obj1:Array, Obj2:Array):Int
- {
- var earlyTime1:Float = eventNoteEarlyTrigger(Obj1);
- var earlyTime2:Float = eventNoteEarlyTrigger(Obj2);
- return FlxSort.byValues(FlxSort.ASCENDING, Obj1[0] - earlyTime1, Obj2[0] - earlyTime2);
- }
-
- private function generateStaticArrows(player:Int):Void
- {
- for (i in 0...4)
- {
- // FlxG.log.add(i);
- var babyArrow:StrumNote = new StrumNote(ClientPrefs.middleScroll ? STRUM_X_MIDDLESCROLL : STRUM_X, strumLine.y, i, player);
- if (!isStoryMode)
- {
- babyArrow.y -= 10;
- babyArrow.alpha = 0;
- FlxTween.tween(babyArrow, {y: babyArrow.y + 10, alpha: 1}, 1, {ease: FlxEase.circOut, startDelay: 0.5 + (0.2 * i)});
- }
-
- if (player == 1)
- {
- playerStrums.add(babyArrow);
- }
- else
- {
- opponentStrums.add(babyArrow);
- }
-
- strumLineNotes.add(babyArrow);
- babyArrow.postAddedToGroup();
- }
- }
-
- override function openSubState(SubState:FlxSubState)
- {
- if (paused)
- {
- if (FlxG.sound.music != null)
- {
- FlxG.sound.music.pause();
- vocals.pause();
- }
-
- if (!startTimer.finished)
- startTimer.active = false;
- if (finishTimer != null && !finishTimer.finished)
- finishTimer.active = false;
-
- if(blammedLightsBlackTween != null)
- blammedLightsBlackTween.active = false;
- if(phillyCityLightsEventTween != null)
- phillyCityLightsEventTween.active = false;
-
- if(carTimer != null) carTimer.active = false;
-
- var chars:Array = [boyfriend, gf, dad];
- for (i in 0...chars.length) {
- if(chars[i].colorTween != null) {
- chars[i].colorTween.active = false;
- }
- }
-
- for (tween in modchartTweens) {
- tween.active = false;
- }
- for (timer in modchartTimers) {
- timer.active = false;
- }
- }
-
- super.openSubState(SubState);
- }
-
- override function closeSubState()
- {
- if (paused)
- {
- if (FlxG.sound.music != null && !startingSong)
- {
- resyncVocals();
- }
-
- if (!startTimer.finished)
- startTimer.active = true;
- if (finishTimer != null && !finishTimer.finished)
- finishTimer.active = true;
-
- if(blammedLightsBlackTween != null)
- blammedLightsBlackTween.active = true;
- if(phillyCityLightsEventTween != null)
- phillyCityLightsEventTween.active = true;
-
- if(carTimer != null) carTimer.active = true;
-
- var chars:Array = [boyfriend, gf, dad];
- for (i in 0...chars.length) {
- if(chars[i].colorTween != null) {
- chars[i].colorTween.active = true;
- }
- }
-
- for (tween in modchartTweens) {
- tween.active = true;
- }
- for (timer in modchartTimers) {
- timer.active = true;
- }
- paused = false;
- callOnLuas('onResume', []);
-
- #if desktop
- if (startTimer.finished)
- {
- DiscordClient.changePresence(detailsText, SONG.song + " (" + storyDifficultyText + ")", iconP2.getCharacter(), true, songLength - Conductor.songPosition - ClientPrefs.noteOffset);
- }
- else
- {
- DiscordClient.changePresence(detailsText, SONG.song + " (" + storyDifficultyText + ")", iconP2.getCharacter());
- }
- #end
- }
-
- super.closeSubState();
- }
-
- override public function onFocus():Void
- {
- #if desktop
- if (health > 0 && !paused)
- {
- if (Conductor.songPosition > 0.0)
- {
- DiscordClient.changePresence(detailsText, SONG.song + " (" + storyDifficultyText + ")", iconP2.getCharacter(), true, songLength - Conductor.songPosition - ClientPrefs.noteOffset);
- }
- else
- {
- DiscordClient.changePresence(detailsText, SONG.song + " (" + storyDifficultyText + ")", iconP2.getCharacter());
- }
- }
- #end
-
- super.onFocus();
- }
-
- override public function onFocusLost():Void
- {
- #if desktop
- if (health > 0 && !paused)
- {
- DiscordClient.changePresence(detailsPausedText, SONG.song + " (" + storyDifficultyText + ")", iconP2.getCharacter());
- }
- #end
-
- super.onFocusLost();
- }
-
- function resyncVocals():Void
- {
- if(finishTimer != null) return;
-
- vocals.pause();
-
- FlxG.sound.music.play();
- Conductor.songPosition = FlxG.sound.music.time;
- vocals.time = Conductor.songPosition;
- vocals.play();
- }
-
- private var paused:Bool = false;
- var startedCountdown:Bool = false;
- var canPause:Bool = true;
- var limoSpeed:Float = 0;
-
- override public function update(elapsed:Float)
- {
- /*if (FlxG.keys.justPressed.NINE)
- {
- iconP1.swapOldIcon();
- }*/
-
- callOnLuas('onUpdate', [elapsed]);
-
- switch (curStage)
- {
- case 'schoolEvil':
- if(!ClientPrefs.lowQuality && bgGhouls.animation.curAnim.finished) {
- bgGhouls.visible = false;
- }
- case 'philly':
- if (trainMoving)
- {
- trainFrameTiming += elapsed;
-
- if (trainFrameTiming >= 1 / 24)
- {
- updateTrainPos();
- trainFrameTiming = 0;
- }
- }
- phillyCityLights.members[curLight].alpha -= (Conductor.crochet / 1000) * FlxG.elapsed * 1.5;
- case 'limo':
- if(!ClientPrefs.lowQuality) {
- grpLimoParticles.forEach(function(spr:BGSprite) {
- if(spr.animation.curAnim.finished) {
- spr.kill();
- grpLimoParticles.remove(spr, true);
- spr.destroy();
- }
- });
-
- switch(limoKillingState) {
- case 1:
- limoMetalPole.x += 5000 * elapsed;
- limoLight.x = limoMetalPole.x - 180;
- limoCorpse.x = limoLight.x - 50;
- limoCorpseTwo.x = limoLight.x + 35;
-
- var dancers:Array = grpLimoDancers.members;
- for (i in 0...dancers.length) {
- if(dancers[i].x < FlxG.width * 1.5 && limoLight.x > (370 * i) + 130) {
- switch(i) {
- case 0 | 3:
- if(i == 0) FlxG.sound.play(Paths.sound('dancerdeath'), 0.5);
-
- var diffStr:String = i == 3 ? ' 2 ' : ' ';
- var particle:BGSprite = new BGSprite('gore/noooooo', dancers[i].x + 200, dancers[i].y, 0.4, 0.4, ['hench leg spin' + diffStr + 'PINK'], false);
- grpLimoParticles.add(particle);
- var particle:BGSprite = new BGSprite('gore/noooooo', dancers[i].x + 160, dancers[i].y + 200, 0.4, 0.4, ['hench arm spin' + diffStr + 'PINK'], false);
- grpLimoParticles.add(particle);
- var particle:BGSprite = new BGSprite('gore/noooooo', dancers[i].x, dancers[i].y + 50, 0.4, 0.4, ['hench head spin' + diffStr + 'PINK'], false);
- grpLimoParticles.add(particle);
-
- var particle:BGSprite = new BGSprite('gore/stupidBlood', dancers[i].x - 110, dancers[i].y + 20, 0.4, 0.4, ['blood'], false);
- particle.flipX = true;
- particle.angle = -57.5;
- grpLimoParticles.add(particle);
- case 1:
- limoCorpse.visible = true;
- case 2:
- limoCorpseTwo.visible = true;
- } //Note: Nobody cares about the fifth dancer because he is mostly hidden offscreen :(
- dancers[i].x += FlxG.width * 2;
- }
- }
-
- if(limoMetalPole.x > FlxG.width * 2) {
- resetLimoKill();
- limoSpeed = 800;
- limoKillingState = 2;
- }
-
- case 2:
- limoSpeed -= 4000 * elapsed;
- bgLimo.x -= limoSpeed * elapsed;
- if(bgLimo.x > FlxG.width * 1.5) {
- limoSpeed = 3000;
- limoKillingState = 3;
- }
-
- case 3:
- limoSpeed -= 2000 * elapsed;
- if(limoSpeed < 1000) limoSpeed = 1000;
-
- bgLimo.x -= limoSpeed * elapsed;
- if(bgLimo.x < -275) {
- limoKillingState = 4;
- limoSpeed = 800;
- }
-
- case 4:
- bgLimo.x = FlxMath.lerp(bgLimo.x, -150, CoolUtil.boundTo(elapsed * 9, 0, 1));
- if(Math.round(bgLimo.x) == -150) {
- bgLimo.x = -150;
- limoKillingState = 0;
- }
- }
-
- if(limoKillingState > 2) {
- var dancers:Array = grpLimoDancers.members;
- for (i in 0...dancers.length) {
- dancers[i].x = (370 * i) + bgLimo.x + 280;
- }
- }
- }
- case 'mall':
- if(heyTimer > 0) {
- heyTimer -= elapsed;
- if(heyTimer <= 0) {
- bottomBoppers.dance(true);
- heyTimer = 0;
- }
- }
- }
-
- if(!inCutscene) {
- var lerpVal:Float = CoolUtil.boundTo(elapsed * 2.4 * cameraSpeed, 0, 1);
- camFollowPos.setPosition(FlxMath.lerp(camFollowPos.x, camFollow.x, lerpVal), FlxMath.lerp(camFollowPos.y, camFollow.y, lerpVal));
- if(!startingSong && !endingSong && boyfriend.animation.curAnim.name.startsWith('idle')) {
- boyfriendIdleTime += elapsed;
- if(boyfriendIdleTime >= 0.15) { // Kind of a mercy thing for making the achievement easier to get as it's apparently frustrating to some playerss
- boyfriendIdled = true;
- }
- } else {
- boyfriendIdleTime = 0;
- }
- }
-
- super.update(elapsed);
-
- if(ratingString == '?') {
- scoreTxt.text = 'Score: ' + songScore + ' | Misses: ' + songMisses + ' | Rating: ' + ratingString;
- } else {
- scoreTxt.text = 'Score: ' + songScore + ' | Misses: ' + songMisses + ' | Rating: ' + ratingString + ' (' + Math.floor(ratingPercent * 100) + '%)';
- }
-
- if(cpuControlled) {
- botplaySine += 180 * elapsed;
- botplayTxt.alpha = 1 - Math.sin((Math.PI * botplaySine) / 180);
- }
- botplayTxt.visible = cpuControlled;
-
- if (controls.PAUSE #if android || FlxG.android.justReleased.BACK #end && startedCountdown && canPause)
- {
- var ret:Dynamic = callOnLuas('onPause', []);
- if(ret != FunkinLua.Function_Stop) {
- persistentUpdate = false;
- persistentDraw = true;
- paused = true;
-
- // 1 / 1000 chance for Gitaroo Man easter egg
- /*if (FlxG.random.bool(0.1))
- {
- // gitaroo man easter egg
- cancelFadeTween();
- CustomFadeTransition.nextCamera = camOther;
- MusicBeatState.switchState(new GitarooPause());
- }
- else {*/
- if(FlxG.sound.music != null) {
- FlxG.sound.music.pause();
- vocals.pause();
- }
-
- PauseSubState.transCamera = camOther;
- openSubState(new PauseSubState(boyfriend.getScreenPosition().x, boyfriend.getScreenPosition().y));
- //}
-
- #if desktop
- DiscordClient.changePresence(detailsPausedText, SONG.song + " (" + storyDifficultyText + ")", iconP2.getCharacter());
- #end
- }
- }
-
- if (FlxG.keys.justPressed.SEVEN && !endingSong && !inCutscene)
- {
- persistentUpdate = false;
- paused = true;
- cancelFadeTween();
- CustomFadeTransition.nextCamera = camOther;
- MusicBeatState.switchState(new ChartingState());
-
- #if desktop
- DiscordClient.changePresence("Chart Editor", null, null, true);
- #end
- }
-
- // FlxG.watch.addQuick('VOL', vocals.amplitudeLeft);
- // FlxG.watch.addQuick('VOLRight', vocals.amplitudeRight);
-
- iconP1.setGraphicSize(Std.int(FlxMath.lerp(150, iconP1.width, CoolUtil.boundTo(1 - (elapsed * 30), 0, 1))));
- iconP2.setGraphicSize(Std.int(FlxMath.lerp(150, iconP2.width, CoolUtil.boundTo(1 - (elapsed * 30), 0, 1))));
-
- iconP1.updateHitbox();
- iconP2.updateHitbox();
-
- var iconOffset:Int = 26;
-
- iconP1.x = healthBar.x + (healthBar.width * (FlxMath.remapToRange(healthBar.percent, 0, 100, 100, 0) * 0.01) - iconOffset);
- iconP2.x = healthBar.x + (healthBar.width * (FlxMath.remapToRange(healthBar.percent, 0, 100, 100, 0) * 0.01)) - (iconP2.width - iconOffset);
-
- if (health > 2)
- health = 2;
-
- if (healthBar.percent < 20)
- iconP1.animation.curAnim.curFrame = 1;
- else
- iconP1.animation.curAnim.curFrame = 0;
-
- if (healthBar.percent > 80)
- iconP2.animation.curAnim.curFrame = 1;
- else
- iconP2.animation.curAnim.curFrame = 0;
-
- if (FlxG.keys.justPressed.EIGHT && !endingSong && !inCutscene) {
- persistentUpdate = false;
- paused = true;
- cancelFadeTween();
- CustomFadeTransition.nextCamera = camOther;
- MusicBeatState.switchState(new CharacterEditorState(SONG.player2));
- }
-
- if (startingSong)
- {
- if (startedCountdown)
- {
- Conductor.songPosition += FlxG.elapsed * 1000;
- if (Conductor.songPosition >= 0)
- startSong();
- }
- }
- else
- {
- Conductor.songPosition += FlxG.elapsed * 1000;
-
- if (!paused)
- {
- songTime += FlxG.game.ticks - previousFrameTime;
- previousFrameTime = FlxG.game.ticks;
-
- // Interpolation type beat
- if (Conductor.lastSongPos != Conductor.songPosition)
- {
- songTime = (songTime + Conductor.songPosition) / 2;
- Conductor.lastSongPos = Conductor.songPosition;
- // Conductor.songPosition += FlxG.elapsed * 1000;
- // trace('MISSED FRAME');
- }
-
- if(updateTime) {
- var curTime:Float = Conductor.songPosition - ClientPrefs.noteOffset;
- if(curTime < 0) curTime = 0;
- songPercent = (curTime / songLength);
-
- var secondsTotal:Int = Math.floor((songLength - curTime) / 1000);
- if(secondsTotal < 0) secondsTotal = 0;
-
- timeTxt.text = FlxStringUtil.formatTime(secondsTotal, false);
- }
- }
-
- // Conductor.lastSongPos = FlxG.sound.music.time;
- }
-
- if (camZooming)
- {
- FlxG.camera.zoom = FlxMath.lerp(defaultCamZoom, FlxG.camera.zoom, CoolUtil.boundTo(1 - (elapsed * 3.125), 0, 1));
- camHUD.zoom = FlxMath.lerp(1, camHUD.zoom, CoolUtil.boundTo(1 - (elapsed * 3.125), 0, 1));
- }
-
- FlxG.watch.addQuick("beatShit", curBeat);
- FlxG.watch.addQuick("stepShit", curStep);
-
- // RESET = Quick Game Over Screen
- if (controls.RESET && !inCutscene && !endingSong)
- {
- health = 0;
- trace("RESET = True");
- }
- doDeathCheck();
-
- var roundedSpeed:Float = FlxMath.roundDecimal(songSpeed, 2);
- if (unspawnNotes[0] != null)
- {
- var time:Float = 1500;
- if(roundedSpeed < 1) time /= roundedSpeed;
-
- while (unspawnNotes.length > 0 && unspawnNotes[0].strumTime - Conductor.songPosition < time)
- {
- var dunceNote:Note = unspawnNotes[0];
- notes.add(dunceNote);
-
- var index:Int = unspawnNotes.indexOf(dunceNote);
- unspawnNotes.splice(index, 1);
- }
- }
-
- if (generatedMusic)
- {
- var fakeCrochet:Float = (60 / SONG.bpm) * 1000;
- notes.forEachAlive(function(daNote:Note)
- {
- if(!daNote.mustPress && ClientPrefs.middleScroll)
- {
- daNote.active = true;
- daNote.visible = false;
- }
- else if (daNote.y > FlxG.height)
- {
- daNote.active = false;
- daNote.visible = false;
- }
- else
- {
- daNote.visible = true;
- daNote.active = true;
- }
-
- // i am so fucking sorry for this if condition
- var strumX:Float = 0;
- var strumY:Float = 0;
- var strumAngle:Float = 0;
- var strumAlpha:Float = 0;
- if(daNote.mustPress) {
- strumX = playerStrums.members[daNote.noteData].x;
- strumY = playerStrums.members[daNote.noteData].y;
- strumAngle = playerStrums.members[daNote.noteData].angle;
- strumAlpha = playerStrums.members[daNote.noteData].alpha;
- } else {
- strumX = opponentStrums.members[daNote.noteData].x;
- strumY = opponentStrums.members[daNote.noteData].y;
- strumAngle = opponentStrums.members[daNote.noteData].angle;
- strumAlpha = opponentStrums.members[daNote.noteData].alpha;
- }
-
- strumX += daNote.offsetX;
- strumY += daNote.offsetY;
- strumAngle += daNote.offsetAngle;
- strumAlpha *= daNote.multAlpha;
- var center:Float = strumY + Note.swagWidth / 2;
-
- if(daNote.copyX) {
- daNote.x = strumX;
- }
- if(daNote.copyAngle) {
- daNote.angle = strumAngle;
- }
- if(daNote.copyAlpha) {
- daNote.alpha = strumAlpha;
- }
- if(daNote.copyY) {
- if (ClientPrefs.downScroll) {
- daNote.y = (strumY + 0.45 * (Conductor.songPosition - daNote.strumTime) * roundedSpeed);
- if (daNote.isSustainNote) {
- //Jesus fuck this took me so much mother fucking time AAAAAAAAAA
- if (daNote.animation.curAnim.name.endsWith('end')) {
- daNote.y += 10.5 * (fakeCrochet / 400) * 1.5 * roundedSpeed + (46 * (roundedSpeed - 1));
- daNote.y -= 46 * (1 - (fakeCrochet / 600)) * roundedSpeed;
- if(PlayState.isPixelStage) {
- daNote.y += 8;
- } else {
- daNote.y -= 19;
- }
- }
- daNote.y += (Note.swagWidth / 2) - (60.5 * (roundedSpeed - 1));
- daNote.y += 27.5 * ((SONG.bpm / 100) - 1) * (roundedSpeed - 1);
-
- if(daNote.mustPress || !daNote.ignoreNote)
- {
- if(daNote.y - daNote.offset.y * daNote.scale.y + daNote.height >= center
- && (!daNote.mustPress || (daNote.wasGoodHit || (daNote.prevNote.wasGoodHit && !daNote.canBeHit))))
- {
- var swagRect = new FlxRect(0, 0, daNote.frameWidth, daNote.frameHeight);
- swagRect.height = (center - daNote.y) / daNote.scale.y;
- swagRect.y = daNote.frameHeight - swagRect.height;
-
- daNote.clipRect = swagRect;
- }
- }
- }
- } else {
- daNote.y = (strumY - 0.45 * (Conductor.songPosition - daNote.strumTime) * roundedSpeed);
-
- if(daNote.mustPress || !daNote.ignoreNote)
- {
- if (daNote.isSustainNote
- && daNote.y + daNote.offset.y * daNote.scale.y <= center
- && (!daNote.mustPress || (daNote.wasGoodHit || (daNote.prevNote.wasGoodHit && !daNote.canBeHit))))
- {
- var swagRect = new FlxRect(0, 0, daNote.width / daNote.scale.x, daNote.height / daNote.scale.y);
- swagRect.y = (center - daNote.y) / daNote.scale.y;
- swagRect.height -= swagRect.y;
-
- daNote.clipRect = swagRect;
- }
- }
- }
- }
-
- if (!daNote.mustPress && daNote.wasGoodHit && !daNote.hitByOpponent && !daNote.ignoreNote)
- {
- if (Paths.formatToSongPath(SONG.song) != 'tutorial')
- camZooming = true;
-
- if(daNote.noteType == 'Hey!' && dad.animOffsets.exists('hey')) {
- dad.playAnim('hey', true);
- dad.specialAnim = true;
- dad.heyTimer = 0.6;
- } else if(!daNote.noAnimation) {
- var altAnim:String = "";
-
- if (SONG.notes[Math.floor(curStep / 16)] != null)
- {
- if (SONG.notes[Math.floor(curStep / 16)].altAnim || daNote.noteType == 'Alt Animation') {
- altAnim = '-alt';
- }
- }
-
- var char:Character = dad;
- var animToPlay:String = singAnimations[Std.int(Math.abs(daNote.noteData))] + altAnim;
- if(isGF) {
- char = gf;
- }
- char.playAnim(animToPlay, true);
- char.holdTimer = 0;
- if (isDad) {
- dad.playAnim(animToPlay + altAnim, true);
- dad.holdTimer = 0;
- }
- }
-
- if (SONG.needsVoices)
- vocals.volume = 1;
-
- var time:Float = 0.15;
- if(daNote.isSustainNote && !daNote.animation.curAnim.name.endsWith('end')) {
- time += 0.15;
- }
- StrumPlayAnim(true, Std.int(Math.abs(daNote.noteData)) % 4, time);
- daNote.hitByOpponent = true;
-
- callOnLuas('opponentNoteHit', [notes.members.indexOf(daNote), Math.abs(daNote.noteData), daNote.noteType, daNote.isSustainNote]);
-
- if (!daNote.isSustainNote)
- {
- daNote.kill();
- notes.remove(daNote, true);
- daNote.destroy();
- }
- }
-
- if(daNote.mustPress && cpuControlled) {
- if(daNote.isSustainNote) {
- if(daNote.canBeHit) {
- goodNoteHit(daNote);
- }
- } else if(daNote.strumTime <= Conductor.songPosition || (daNote.isSustainNote && daNote.canBeHit && daNote.mustPress)) {
- goodNoteHit(daNote);
- }
- }
-
- // WIP interpolation shit? Need to fix the pause issue
- // daNote.y = (strumLine.y - (songTime - daNote.strumTime) * (0.45 * songSpeed));
-
- var doKill:Bool = daNote.y < -daNote.height;
- if(ClientPrefs.downScroll) doKill = daNote.y > FlxG.height;
-
- if (doKill)
- {
- if (daNote.mustPress && !cpuControlled &&!daNote.ignoreNote && !endingSong && (daNote.tooLate || !daNote.wasGoodHit)) {
- noteMiss(daNote);
- }
-
- daNote.active = false;
- daNote.visible = false;
-
- daNote.kill();
- notes.remove(daNote, true);
- daNote.destroy();
- }
- });
- }
- checkEventNote();
-
- if (!inCutscene) {
- if(!cpuControlled) {
- keyShit();
- } else if(boyfriend.holdTimer > Conductor.stepCrochet * 0.001 * boyfriend.singDuration && boyfriend.animation.curAnim.name.startsWith('sing') && !boyfriend.animation.curAnim.name.endsWith('miss')) {
- boyfriend.dance();
- }
- }
-
- #if debug
- if(!endingSong && !startingSong) {
- if (FlxG.keys.justPressed.ONE) {
- KillNotes();
- FlxG.sound.music.onComplete();
- }
- if(FlxG.keys.justPressed.TWO) { //Go 10 seconds into the future :O
- FlxG.sound.music.pause();
- vocals.pause();
- Conductor.songPosition += 10000;
- notes.forEachAlive(function(daNote:Note)
- {
- if(daNote.strumTime + 800 < Conductor.songPosition) {
- daNote.active = false;
- daNote.visible = false;
-
- daNote.kill();
- notes.remove(daNote, true);
- daNote.destroy();
- }
- });
- for (i in 0...unspawnNotes.length) {
- var daNote:Note = unspawnNotes[0];
- if(daNote.strumTime + 800 >= Conductor.songPosition) {
- break;
- }
-
- daNote.active = false;
- daNote.visible = false;
-
- daNote.kill();
- unspawnNotes.splice(unspawnNotes.indexOf(daNote), 1);
- daNote.destroy();
- }
-
- FlxG.sound.music.time = Conductor.songPosition;
- FlxG.sound.music.play();
-
- vocals.time = Conductor.songPosition;
- vocals.play();
- }
- }
-
- setOnLuas('cameraX', camFollowPos.x);
- setOnLuas('cameraY', camFollowPos.y);
- setOnLuas('botPlay', PlayState.cpuControlled);
- callOnLuas('onUpdatePost', [elapsed]);
- #end
- }
-
- var isDead:Bool = false;
- function doDeathCheck() {
- if (health <= 0 && !practiceMode && !isDead)
- {
- var ret:Dynamic = callOnLuas('onGameOver', []);
- if(ret != FunkinLua.Function_Stop) {
- boyfriend.stunned = true;
- deathCounter++;
-
- persistentUpdate = false;
- persistentDraw = false;
- paused = true;
-
- vocals.stop();
- FlxG.sound.music.stop();
-
- openSubState(new GameOverSubstate(boyfriend.getScreenPosition().x, boyfriend.getScreenPosition().y, camFollowPos.x, camFollowPos.y, this));
- for (tween in modchartTweens) {
- tween.active = true;
- }
- for (timer in modchartTimers) {
- timer.active = true;
- }
-
- // MusicBeatState.switchState(new GameOverState(boyfriend.getScreenPosition().x, boyfriend.getScreenPosition().y));
-
- #if desktop
- // Game Over doesn't get his own variable because it's only used here
- DiscordClient.changePresence("Game Over - " + detailsText, SONG.song + " (" + storyDifficultyText + ")", iconP2.getCharacter());
- #end
- isDead = true;
- return true;
- }
- }
- return false;
- }
-
- public function checkEventNote() {
- while(eventNotes.length > 0) {
- var early:Float = eventNoteEarlyTrigger(eventNotes[0]);
- var leStrumTime:Float = eventNotes[0][0];
- if(Conductor.songPosition < leStrumTime - early) {
- break;
- }
-
- var value1:String = '';
- if(eventNotes[0][3] != null)
- value1 = eventNotes[0][3];
-
- var value2:String = '';
- if(eventNotes[0][4] != null)
- value2 = eventNotes[0][4];
-
- triggerEventNote(eventNotes[0][2], value1, value2);
- eventNotes.shift();
- }
- }
-
- public function getControl(key:String) {
- var pressed:Bool = Reflect.getProperty(controls, key);
- //trace('Control result: ' + pressed);
- return pressed;
- }
-
- public function triggerEventNote(eventName:String, value1:String, value2:String) {
- switch(eventName) {
- case 'Hey!':
- var value:Int = 2;
- switch(value1.toLowerCase().trim()) {
- case 'bf' | 'boyfriend' | '0':
- value = 0;
- case 'gf' | 'girlfriend' | '1':
- value = 1;
- }
-
- var time:Float = Std.parseFloat(value2);
- if(Math.isNaN(time) || time <= 0) time = 0.6;
-
- if(value != 0) {
- if(dad.curCharacter.startsWith('gf')) { //Tutorial GF is actually Dad! The GF is an imposter!! ding ding ding ding ding ding ding, dindinding, end my suffering
- dad.playAnim('cheer', true);
- dad.specialAnim = true;
- dad.heyTimer = time;
- } else {
- gf.playAnim('cheer', true);
- gf.specialAnim = true;
- gf.heyTimer = time;
- }
-
- if(curStage == 'mall') {
- bottomBoppers.animation.play('hey', true);
- heyTimer = time;
- }
- }
- if(value != 1) {
- boyfriend.playAnim('hey', true);
- boyfriend.specialAnim = true;
- boyfriend.heyTimer = time;
- }
-
- case 'Set GF Speed':
- var value:Int = Std.parseInt(value1);
- if(Math.isNaN(value)) value = 1;
- gfSpeed = value;
-
- case 'Blammed Lights':
- var lightId:Int = Std.parseInt(value1);
- if(Math.isNaN(lightId)) lightId = 0;
-
- if(lightId > 0 && curLightEvent != lightId) {
- if(lightId > 5) lightId = FlxG.random.int(1, 5, [curLightEvent]);
-
- var color:Int = 0xffffffff;
- switch(lightId) {
- case 1: //Blue
- color = 0xff31a2fd;
- case 2: //Green
- color = 0xff31fd8c;
- case 3: //Pink
- color = 0xfff794f7;
- case 4: //Red
- color = 0xfff96d63;
- case 5: //Orange
- color = 0xfffba633;
- }
- curLightEvent = lightId;
-
- if(blammedLightsBlack.alpha == 0) {
- if(blammedLightsBlackTween != null) {
- blammedLightsBlackTween.cancel();
- }
- blammedLightsBlackTween = FlxTween.tween(blammedLightsBlack, {alpha: 1}, 1, {ease: FlxEase.quadInOut,
- onComplete: function(twn:FlxTween) {
- blammedLightsBlackTween = null;
- }
- });
-
- var chars:Array = [boyfriend, gf, dad];
- for (i in 0...chars.length) {
- if(chars[i].colorTween != null) {
- chars[i].colorTween.cancel();
- }
- chars[i].colorTween = FlxTween.color(chars[i], 1, FlxColor.WHITE, color, {onComplete: function(twn:FlxTween) {
- chars[i].colorTween = null;
- }, ease: FlxEase.quadInOut});
- }
- } else {
- if(blammedLightsBlackTween != null) {
- blammedLightsBlackTween.cancel();
- }
- blammedLightsBlackTween = null;
- blammedLightsBlack.alpha = 1;
-
- var chars:Array = [boyfriend, gf, dad];
- for (i in 0...chars.length) {
- if(chars[i].colorTween != null) {
- chars[i].colorTween.cancel();
- }
- chars[i].colorTween = null;
- }
- dad.color = color;
- boyfriend.color = color;
- gf.color = color;
- }
-
- if(curStage == 'philly') {
- if(phillyCityLightsEvent != null) {
- phillyCityLightsEvent.forEach(function(spr:BGSprite) {
- spr.visible = false;
- });
- phillyCityLightsEvent.members[lightId - 1].visible = true;
- phillyCityLightsEvent.members[lightId - 1].alpha = 1;
- }
- }
- } else {
- if(blammedLightsBlack.alpha != 0) {
- if(blammedLightsBlackTween != null) {
- blammedLightsBlackTween.cancel();
- }
- blammedLightsBlackTween = FlxTween.tween(blammedLightsBlack, {alpha: 0}, 1, {ease: FlxEase.quadInOut,
- onComplete: function(twn:FlxTween) {
- blammedLightsBlackTween = null;
- }
- });
- }
-
- if(curStage == 'philly') {
- phillyCityLights.forEach(function(spr:BGSprite) {
- spr.visible = false;
- });
- phillyCityLightsEvent.forEach(function(spr:BGSprite) {
- spr.visible = false;
- });
-
- var memb:FlxSprite = phillyCityLightsEvent.members[curLightEvent - 1];
- if(memb != null) {
- memb.visible = true;
- memb.alpha = 1;
- if(phillyCityLightsEventTween != null)
- phillyCityLightsEventTween.cancel();
-
- phillyCityLightsEventTween = FlxTween.tween(memb, {alpha: 0}, 1, {onComplete: function(twn:FlxTween) {
- phillyCityLightsEventTween = null;
- }, ease: FlxEase.quadInOut});
- }
- }
-
- var chars:Array = [boyfriend, gf, dad];
- for (i in 0...chars.length) {
- if(chars[i].colorTween != null) {
- chars[i].colorTween.cancel();
- }
- chars[i].colorTween = FlxTween.color(chars[i], 1, chars[i].color, FlxColor.WHITE, {onComplete: function(twn:FlxTween) {
- chars[i].colorTween = null;
- }, ease: FlxEase.quadInOut});
- }
-
- curLight = 0;
- curLightEvent = 0;
- }
-
- case 'Kill Henchmen':
- killHenchmen();
-
- case 'Add Camera Zoom':
- if(ClientPrefs.camZooms && FlxG.camera.zoom < 1.35) {
- var camZoom:Float = Std.parseFloat(value1);
- var hudZoom:Float = Std.parseFloat(value2);
- if(Math.isNaN(camZoom)) camZoom = 0.015;
- if(Math.isNaN(hudZoom)) hudZoom = 0.03;
-
- FlxG.camera.zoom += camZoom;
- camHUD.zoom += hudZoom;
- }
-
- case 'Trigger BG Ghouls':
- if(curStage == 'schoolEvil' && !ClientPrefs.lowQuality) {
- bgGhouls.dance(true);
- bgGhouls.visible = true;
- }
-
- case 'Play Animation':
- //trace('Anim to play: ' + value1);
- var char:Character = dad;
- switch(value2.toLowerCase().trim()) {
- case 'bf' | 'boyfriend':
- char = boyfriend;
- case 'gf' | 'girlfriend':
- char = gf;
- default:
- var val2:Int = Std.parseInt(value2);
- if(Math.isNaN(val2)) val2 = 0;
-
- switch(val2) {
- case 1: char = boyfriend;
- case 2: char = gf;
- }
- }
- char.playAnim(value1, true);
- char.specialAnim = true;
-
- case 'Camera Follow Pos':
- var val1:Float = Std.parseFloat(value1);
- var val2:Float = Std.parseFloat(value2);
- if(Math.isNaN(val1)) val1 = 0;
- if(Math.isNaN(val2)) val2 = 0;
-
- isCameraOnForcedPos = false;
- if(!Math.isNaN(Std.parseFloat(value1)) || !Math.isNaN(Std.parseFloat(value2))) {
- camFollow.x = val1;
- camFollow.y = val2;
- isCameraOnForcedPos = true;
- }
-
- case 'Alt Idle Animation':
- var char:Character = dad;
- switch(value1.toLowerCase()) {
- case 'gf' | 'girlfriend':
- char = gf;
- case 'boyfriend' | 'bf':
- char = boyfriend;
- default:
- var val:Int = Std.parseInt(value1);
- if(Math.isNaN(val)) val = 0;
-
- switch(val) {
- case 1: char = boyfriend;
- case 2: char = gf;
- }
- }
- char.idleSuffix = value2;
- char.recalculateDanceIdle();
-
- case 'Screen Shake':
- var valuesArray:Array = [value1, value2];
- var targetsArray:Array = [camGame, camHUD];
- for (i in 0...targetsArray.length) {
- var split:Array = valuesArray[i].split(',');
- var duration:Float = Std.parseFloat(split[0].trim());
- var intensity:Float = Std.parseFloat(split[1].trim());
- if(Math.isNaN(duration)) duration = 0;
- if(Math.isNaN(intensity)) intensity = 0;
-
- if(duration > 0 && intensity != 0) {
- targetsArray[i].shake(intensity, duration);
- }
- }
-
-
- case 'Change Character':
- var charType:Int = 0;
- switch(value1) {
- case 'gf' | 'girlfriend':
- charType = 2;
- case 'dad' | 'opponent':
- charType = 1;
- default:
- charType = Std.parseInt(value1);
- if(Math.isNaN(charType)) charType = 0;
- }
-
- switch(charType) {
- case 0:
- if(boyfriend.curCharacter != value2) {
- if(!boyfriendMap.exists(value2)) {
- addCharacterToList(value2, charType);
- }
-
- boyfriend.visible = false;
- boyfriend = boyfriendMap.get(value2);
- if(!boyfriend.alreadyLoaded) {
- boyfriend.alpha = 1;
- boyfriend.alreadyLoaded = true;
- }
- boyfriend.visible = true;
- iconP1.changeIcon(boyfriend.healthIcon);
- }
-
- case 1:
- if(dad.curCharacter != value2) {
- if(!dadMap.exists(value2)) {
- addCharacterToList(value2, charType);
- }
-
- var wasGf:Bool = dad.curCharacter.startsWith('gf');
- dad.visible = false;
- dad = dadMap.get(value2);
- if(!dad.curCharacter.startsWith('gf')) {
- if(wasGf) {
- gf.visible = true;
- }
- } else {
- gf.visible = false;
- }
- if(!dad.alreadyLoaded) {
- dad.alpha = 1;
- dad.alreadyLoaded = true;
- }
- dad.visible = true;
- iconP2.changeIcon(dad.healthIcon);
- }
-
- case 2:
- if(gf.curCharacter != value2) {
- if(!gfMap.exists(value2)) {
- addCharacterToList(value2, charType);
- }
-
- gf.visible = false;
- gf = gfMap.get(value2);
- if(!gf.alreadyLoaded) {
- gf.alpha = 1;
- gf.alreadyLoaded = true;
- }
- }
- }
- reloadHealthBarColors();
-
- case 'BG Freaks Expression':
- if(bgGirls != null) bgGirls.swapDanceType();
-
- case 'Opponent Anim':
- var activeChar:Int = 0;
- var gfSection:Int = Std.parseInt(value2);
-
- switch(value1) {
- case 'dad' | 'opponent' | 'superidol':
- activeChar = 0;
- case 'gf' | 'girlfriend' | 'gfidol':
- activeChar = 1;
- case 'both':
- activeChar = 2;
- default:
- activeChar = Std.parseInt(value1);
- if(Math.isNaN(activeChar)) activeChar = 0;
- }
-
- switch(activeChar) {
- case 0:
- isDad = true;
- isGF = false;
- gf.dance();
-
- case 1:
- isDad = false;
- isGF = true;
- dad.dance();
-
- case 2:
- isDad = true;
- isGF = true;
-
- }
-
- switch (gfSection) {
- case 0:
- isCameraOnForcedPos = false;
- case 1:
- camFollow.set(gf.getMidpoint().x, gf.getMidpoint().y - 50);
- //defaultCamZoom = 0.9;
- isCameraOnForcedPos = true;
- }
-
- case 'Super Fade':
- var fade:Int = Std.parseInt(value1);
-
- blammedLightsBlackTween = FlxTween.tween(dad, {alpha: fade}, 1, {ease: FlxEase.quadInOut,
- onComplete: function(twn:FlxTween) {
- blammedLightsBlackTween = null;
- }
- });
-
- case 'Super Flash':
- var flashValue:Int = Std.parseInt(value1);
-
- if (ClientPrefs.flashing)
- FlxG.camera.flash(FlxColor.WHITE, flashValue);
- else
- FlxG.camera.flash(FlxColor.BLACK, flashValue);
-
- case 'Zoom Amount':
- var zoom:Float = Std.parseFloat(value1);
-
- defaultCamZoom = zoom;
- }
- callOnLuas('onEvent', [eventName, value1, value2]);
- }
-
- function moveCameraSection(?id:Int = 0):Void {
- if(SONG.notes[id] == null) return;
-
- if (!SONG.notes[id].mustHitSection)
- {
- moveCamera(true);
-
- if (SONG.notes[id].gfSection){
- callOnLuas('onMoveCamera', ['gf']);
- }else{
- callOnLuas('onMoveCamera', ['dad']);
- }
- }
- else
- {
- moveCamera(false);
- if (SONG.notes[id].gfSection){
- callOnLuas('onMoveCamera', ['gf']);
- }else{
- callOnLuas('onMoveCamera', ['boyfriend']);
- }
- }
- }
-
- var cameraTwn:FlxTween;
- public function moveCamera(isDad:Bool) {
- if(isDad) {
- camFollow.set(dad.getMidpoint().x + 150, dad.getMidpoint().y - 100);
- camFollow.x += dad.cameraPosition[0];
- camFollow.y += dad.cameraPosition[1];
- tweenCamIn();
- } else {
- camFollow.set(boyfriend.getMidpoint().x - 100, boyfriend.getMidpoint().y - 100);
-
- switch (curStage)
- {
- case 'limo':
- camFollow.x = boyfriend.getMidpoint().x - 300;
- case 'mall':
- camFollow.y = boyfriend.getMidpoint().y - 200;
- case 'school' | 'schoolEvil':
- camFollow.x = boyfriend.getMidpoint().x - 200;
- camFollow.y = boyfriend.getMidpoint().y - 200;
- }
- camFollow.x -= boyfriend.cameraPosition[0];
- camFollow.y += boyfriend.cameraPosition[1];
-
- if (Paths.formatToSongPath(SONG.song) == 'tutorial' && cameraTwn == null && FlxG.camera.zoom != 1) {
- cameraTwn = FlxTween.tween(FlxG.camera, {zoom: 1}, (Conductor.stepCrochet * 4 / 1000), {ease: FlxEase.elasticInOut, onComplete:
- function (twn:FlxTween) {
- cameraTwn = null;
- }
- });
- }
- }
-
-
-
- if (SONG.notes[Std.int(curStep / 16)].gfSection){
-
- camFollow.set(gf.getMidpoint().x, gf.getMidpoint().y);
- camFollow.x += gf.cameraPosition[0];
- camFollow.y += gf.cameraPosition[1];
- tweenCamIn();
- }
-
- }
-
- function tweenCamIn() {
- if (Paths.formatToSongPath(SONG.song) == 'tutorial' && cameraTwn == null && FlxG.camera.zoom != 1.3) {
- cameraTwn = FlxTween.tween(FlxG.camera, {zoom: 1.3}, (Conductor.stepCrochet * 4 / 1000), {ease: FlxEase.elasticInOut, onComplete:
- function (twn:FlxTween) {
- cameraTwn = null;
- }
- });
- }
- }
-
- function snapCamFollowToPos(x:Float, y:Float) {
- camFollow.set(x, y);
- camFollowPos.setPosition(x, y);
- }
-
- function finishSong():Void
- {
- var finishCallback:Void->Void = endSong; //In case you want to change it in a specific song.
-
- updateTime = false;
- FlxG.sound.music.volume = 0;
- vocals.volume = 0;
- vocals.pause();
- if(ClientPrefs.noteOffset <= 0) {
- finishCallback();
- } else {
- finishTimer = new FlxTimer().start(ClientPrefs.noteOffset / 1000, function(tmr:FlxTimer) {
- finishCallback();
- });
- }
- }
-
-
- var transitioning = false;
- public function endSong():Void
- {
- antireanim = false;
- timeBarBG.visible = false;
- timeBar.visible = false;
- timeTxt.visible = false;
- canPause = false;
- endingSong = true;
- camZooming = false;
- inCutscene = false;
- updateTime = false;
-
- deathCounter = 0;
- seenCutscene = false;
-
- #if ACHIEVEMENTS_ALLOWED
- if(achievementObj != null) {
- return;
- } else {
- var achieve:String = checkForAchievement(['week1_nomiss', 'week2_nomiss', 'week3_nomiss', 'week4_nomiss',
- 'week5_nomiss', 'week6_nomiss', 'ur_bad',
- 'ur_good', 'hype', 'two_keys', 'toastie', 'debugger']);
-
- if(achieve != null) {
- startAchievement(achieve);
- return;
- }
- }
- #end
-
-
- #if LUA_ALLOWED
- var ret:Dynamic = callOnLuas('onEndSong', []);
- #else
- var ret:Dynamic = FunkinLua.Function_Continue;
- #end
-
- if(ret != FunkinLua.Function_Stop && !transitioning) {
- if (SONG.validScore)
- {
- #if !switch
- var percent:Float = ratingPercent;
- if(Math.isNaN(percent)) percent = 0;
- Highscore.saveScore(SONG.song, songScore, storyDifficulty, percent);
- #end
- }
-
- if (isStoryMode)
- {
- campaignScore += songScore;
- campaignMisses += songMisses;
-
- storyPlaylist.remove(storyPlaylist[0]);
-
- if (storyPlaylist.length <= 0)
- {
- FlxG.sound.playMusic(Paths.music('freakyMenu'));
-
- cancelFadeTween();
- CustomFadeTransition.nextCamera = camOther;
- if(FlxTransitionableState.skipNextTransIn) {
- CustomFadeTransition.nextCamera = null;
- }
- MusicBeatState.switchState(new StoryMenuState());
-
- // if ()
- if(!usedPractice) {
- StoryMenuState.weekCompleted.set(WeekData.weeksList[storyWeek], true);
-
- if (SONG.validScore)
- {
- Highscore.saveWeekScore(WeekData.getWeekFileName(), campaignScore, storyDifficulty);
- }
-
- FlxG.save.data.weekCompleted = StoryMenuState.weekCompleted;
- FlxG.save.flush();
- }
- usedPractice = false;
- changedDifficulty = false;
- cpuControlled = false;
- }
- else
- {
- var difficulty:String = '' + CoolUtil.difficultyStuff[storyDifficulty][1];
-
- //trace('LOADING NEXT SONG');
- //trace(Paths.formatToSongPath(PlayState.storyPlaylist[0]) + difficulty);
-
- var winterHorrorlandNext = (Paths.formatToSongPath(SONG.song) == "eggnog");
- if (winterHorrorlandNext)
- {
- var blackShit:FlxSprite = new FlxSprite(-FlxG.width * FlxG.camera.zoom,
- -FlxG.height * FlxG.camera.zoom).makeGraphic(FlxG.width * 3, FlxG.height * 3, FlxColor.BLACK);
- blackShit.scrollFactor.set();
- add(blackShit);
- camHUD.visible = false;
-
- FlxG.sound.play(Paths.sound('Lights_Shut_off'));
- }
-
- FlxTransitionableState.skipNextTransIn = true;
- FlxTransitionableState.skipNextTransOut = true;
-
- prevCamFollow = camFollow;
- prevCamFollowPos = camFollowPos;
-
- PlayState.SONG = Song.loadFromJson(PlayState.storyPlaylist[0] + difficulty, PlayState.storyPlaylist[0]);
- FlxG.sound.music.stop();
-
- if(winterHorrorlandNext) { //marca duvidosa
- new FlxTimer().start(1.5, function(tmr:FlxTimer) {
- cancelFadeTween();
- LoadingState.loadAndSwitchState(new PlayState());
- });
- } else {
- cancelFadeTween();
- LoadingState.loadAndSwitchState(new PlayState());
- }
- }
- }
- else
- {
- //trace('WENT BACK TO FREEPLAY??');
- cancelFadeTween();
- CustomFadeTransition.nextCamera = camOther;
- if(FlxTransitionableState.skipNextTransIn) {
- CustomFadeTransition.nextCamera = null;
- }
- MusicBeatState.switchState(new FreeplayState());
- FlxG.sound.playMusic(Paths.music('freakyMenu'));
- usedPractice = false;
- changedDifficulty = false;
- cpuControlled = false;
- }
- transitioning = true;
- }
- }
-
- #if ACHIEVEMENTS_ALLOWED
- var achievementObj:AchievementObject = null;
- function startAchievement(achieve:String) {
- achievementObj = new AchievementObject(achieve, camOther);
- achievementObj.onFinish = achievementEnd;
- add(achievementObj);
- //trace('Giving achievement ' + achieve);
- }
- function achievementEnd():Void
- {
- achievementObj = null;
- if(endingSong && !inCutscene) {
- endSong();
- }
- }
- #end
-
- public function KillNotes() {
- while(notes.length > 0) {
- var daNote:Note = notes.members[0];
- daNote.active = false;
- daNote.visible = false;
-
- daNote.kill();
- notes.remove(daNote, true);
- daNote.destroy();
- }
- unspawnNotes = [];
- eventNotes = [];
- }
-
- private function popUpScore(note:Note = null):Void
- {
- var noteDiff:Float = Math.abs(note.strumTime - Conductor.songPosition + 8);
-
- // boyfriend.playAnim('hey');
- vocals.volume = 1;
-
- var placement:String = Std.string(combo);
-
- var coolText:FlxText = new FlxText(0, 0, 0, placement, 32);
- coolText.screenCenter();
- coolText.x = FlxG.width * 0.55;
- //
-
- var rating:FlxSprite = new FlxSprite();
- var score:Int = 350;
-
- var daRating:String = "sick";
-
- if (noteDiff > Conductor.safeZoneOffset * 0.75)
- {
- daRating = 'shit';
- score = 50;
- shits++;
- }
- else if (noteDiff > Conductor.safeZoneOffset * 0.5)
- {
- daRating = 'bad';
- score = 100;
- bads++;
- }
- else if (noteDiff > Conductor.safeZoneOffset * 0.25)
- {
- daRating = 'good';
- score = 200;
- goods++;
- }
-
- if(daRating == 'sick' && !note.noteSplashDisabled)
- {
- spawnNoteSplashOnNote(note);
- sicks++;
- }
-
- if(!practiceMode && !cpuControlled) {
- songScore += score;
- songHits++;
- RecalculateRating();
- if(scoreTxtTween != null) {
- scoreTxtTween.cancel();
- }
- scoreTxt.scale.x = 1.1;
- scoreTxt.scale.y = 1.1;
- scoreTxtTween = FlxTween.tween(scoreTxt.scale, {x: 1, y: 1}, 0.2, {
- onComplete: function(twn:FlxTween) {
- scoreTxtTween = null;
- }
- });
- }
-
- /* if (combo > 60)
- daRating = 'sick';
- else if (combo > 12)
- daRating = 'good'
- else if (combo > 4)
- daRating = 'bad';
- */
-
- var pixelShitPart1:String = "";
- var pixelShitPart2:String = '';
-
- if (PlayState.isPixelStage)
- {
- pixelShitPart1 = 'pixelUI/';
- pixelShitPart2 = '-pixel';
- }
-
- rating.loadGraphic(Paths.image(pixelShitPart1 + daRating + pixelShitPart2));
- rating.screenCenter();
- rating.x = coolText.x - 40;
- rating.y -= 60;
- rating.acceleration.y = 550;
- rating.velocity.y -= FlxG.random.int(140, 175);
- rating.velocity.x -= FlxG.random.int(0, 10);
- rating.visible = !ClientPrefs.hideHud;
-
- var comboSpr:FlxSprite = new FlxSprite().loadGraphic(Paths.image(pixelShitPart1 + 'combo' + pixelShitPart2));
- comboSpr.screenCenter();
- comboSpr.x = coolText.x;
- comboSpr.acceleration.y = 600;
- comboSpr.velocity.y -= 150;
- comboSpr.visible = !ClientPrefs.hideHud;
-
- comboSpr.velocity.x += FlxG.random.int(1, 10);
- add(rating);
-
- if (!PlayState.isPixelStage)
- {
- rating.setGraphicSize(Std.int(rating.width * 0.7));
- rating.antialiasing = ClientPrefs.globalAntialiasing;
- comboSpr.setGraphicSize(Std.int(comboSpr.width * 0.7));
- comboSpr.antialiasing = ClientPrefs.globalAntialiasing;
- }
- else
- {
- rating.setGraphicSize(Std.int(rating.width * daPixelZoom * 0.7));
- comboSpr.setGraphicSize(Std.int(comboSpr.width * daPixelZoom * 0.7));
- }
-
- comboSpr.updateHitbox();
- rating.updateHitbox();
-
- var seperatedScore:Array = [];
-
- if(combo >= 1000) {
- seperatedScore.push(Math.floor(combo / 1000) % 10);
- }
- seperatedScore.push(Math.floor(combo / 100) % 10);
- seperatedScore.push(Math.floor(combo / 10) % 10);
- seperatedScore.push(combo % 10);
-
- var daLoop:Int = 0;
- for (i in seperatedScore)
- {
- var numScore:FlxSprite = new FlxSprite().loadGraphic(Paths.image(pixelShitPart1 + 'num' + Std.int(i) + pixelShitPart2));
- numScore.screenCenter();
- numScore.x = rating.x + (43 * daLoop) - 50;
- numScore.y = rating.y + 100;
- numScore.cameras = [camHUD];
-
- if (!PlayState.isPixelStage)
- {
- numScore.antialiasing = ClientPrefs.globalAntialiasing;
- numScore.setGraphicSize(Std.int(numScore.width * 0.5));
- }
- else
- {
- numScore.setGraphicSize(Std.int(numScore.width * daPixelZoom));
- }
- numScore.updateHitbox();
-
- numScore.acceleration.y = FlxG.random.int(200, 300);
- numScore.velocity.y -= FlxG.random.int(140, 160);
- numScore.velocity.x = FlxG.random.float(-5, 5);
- numScore.visible = !ClientPrefs.hideHud;
-
- if (combo >= 10 || combo == 0)
- add(numScore);
-
- FlxTween.tween(numScore, {alpha: 0}, 0.2, {
- onComplete: function(tween:FlxTween)
- {
- numScore.destroy();
- },
- startDelay: Conductor.crochet * 0.002
- });
-
- daLoop++;
- }
- /*
- //trace(combo);
- //trace(seperatedScore);
- */
-
- coolText.text = Std.string(seperatedScore);
- // add(coolText);
-
- FlxTween.tween(rating, {alpha: 0}, 0.2, {
- startDelay: Conductor.crochet * 0.001
- });
-
- FlxTween.tween(comboSpr, {alpha: 0}, 0.2, {
- onComplete: function(tween:FlxTween)
- {
- coolText.destroy();
- comboSpr.destroy();
-
- rating.destroy();
- },
- startDelay: Conductor.crochet * 0.001
- });
- }
-
- private function keyShit():Void
- {
- // HOLDING
- var up = controls.UI_UP;
- var right = controls.UI_RIGHT;
- var down = controls.UI_DOWN;
- var left = controls.UI_LEFT;
-
- var upP = controls.UI_UP_P;
- var rightP = controls.UI_RIGHT_P;
- var downP = controls.UI_DOWN_P;
- var leftP = controls.UI_LEFT_P;
-
- var upR = controls.UI_UP_R;
- var rightR = controls.UI_RIGHT_R;
- var downR = controls.UI_DOWN_R;
- var leftR = controls.UI_LEFT_R;
-
- var controlArray:Array = [leftP, downP, upP, rightP];
- var controlReleaseArray:Array = [leftR, downR, upR, rightR];
- var controlHoldArray:Array = [left, down, up, right];
-
- // FlxG.watch.addQuick('asdfa', upP);
- if (!boyfriend.stunned && generatedMusic)
- {
- // rewritten inputs???
- notes.forEachAlive(function(daNote:Note)
- {
- // hold note functions
- if (daNote.isSustainNote && controlHoldArray[daNote.noteData] && daNote.canBeHit
- && daNote.mustPress && !daNote.tooLate && !daNote.wasGoodHit) {
- goodNoteHit(daNote);
- }
- });
-
- if ((controlHoldArray.contains(true) || controlArray.contains(true)) && !endingSong) {
- var canMiss:Bool = !ClientPrefs.ghostTapping;
- if (controlArray.contains(true)) {
- for (i in 0...controlArray.length) {
- // heavily based on my own code LOL if it aint broke dont fix it
- var pressNotes:Array = [];
- var notesDatas:Array = [];
- var notesStopped:Bool = false;
-
- var sortedNotesList:Array = [];
- notes.forEachAlive(function(daNote:Note)
- {
- if (daNote.canBeHit && daNote.mustPress && !daNote.tooLate
- && !daNote.wasGoodHit && daNote.noteData == i) {
- sortedNotesList.push(daNote);
- notesDatas.push(daNote.noteData);
- canMiss = true;
- }
- });
- sortedNotesList.sort((a, b) -> Std.int(a.strumTime - b.strumTime));
-
- if (sortedNotesList.length > 0) {
- for (epicNote in sortedNotesList)
- {
- for (doubleNote in pressNotes) {
- if (Math.abs(doubleNote.strumTime - epicNote.strumTime) < 10) {
- doubleNote.kill();
- notes.remove(doubleNote, true);
- doubleNote.destroy();
- } else
- notesStopped = true;
- }
-
- // eee jack detection before was not super good
- if (controlArray[epicNote.noteData] && !notesStopped) {
- goodNoteHit(epicNote);
- pressNotes.push(epicNote);
- }
-
- }
- }
- else if (canMiss)
- ghostMiss(controlArray[i], i, true);
-
- // I dunno what you need this for but here you go
- // - Shubs
-
- // Shubs, this is for the "Just the Two of Us" achievement lol
- // - Shadow Mario
- if (!keysPressed[i] && controlArray[i])
- keysPressed[i] = true;
- }
- }
-
- #if ACHIEVEMENTS_ALLOWED
- var achieve:String = checkForAchievement(['oversinging']);
- if (achieve != null) {
- startAchievement(achieve);
- }
- #end
- } else if (boyfriend.holdTimer > Conductor.stepCrochet * 0.001 * boyfriend.singDuration && boyfriend.animation.curAnim.name.startsWith('sing')
- && !boyfriend.animation.curAnim.name.endsWith('miss'))
- boyfriend.dance();
- }
-
- playerStrums.forEach(function(spr:StrumNote)
- {
- if(controlArray[spr.ID] && spr.animation.curAnim.name != 'confirm') {
- spr.playAnim('pressed');
- spr.resetAnim = 0;
- }
- if(controlReleaseArray[spr.ID]) {
- spr.playAnim('static');
- spr.resetAnim = 0;
- }
- });
- }
-
- function ghostMiss(statement:Bool = false, direction:Int = 0, ?ghostMiss:Bool = false) {
- if (statement) {
- noteMissPress(direction, ghostMiss);
- callOnLuas('noteMissPress', [direction]);
- }
- }
-
- function noteMiss(daNote:Note):Void { //You didn't hit the key and let it go offscreen, also used by Hurt Notes
- //Dupe note remove
- notes.forEachAlive(function(note:Note) {
- if (daNote != note && daNote.mustPress && daNote.noteData == note.noteData && daNote.isSustainNote == note.isSustainNote && Math.abs(daNote.strumTime - note.strumTime) < 10) {
- note.kill();
- notes.remove(note, true);
- note.destroy();
- }
- });
-
- health -= daNote.missHealth; //For testing purposes
- //trace(daNote.missHealth);
- songMisses++;
- vocals.volume = 0;
- if(!practiceMode) songScore -= 10;
- RecalculateRating();
-
- var char:Character = boyfriend;
- if(daNote.noteType == 'GF Sing') {
- char = gf;
- }
-
- if(char.hasMissAnimations)
- {
- var daAlt = '';
- if(daNote.noteType == 'Alt Animation') daAlt = '-alt';
-
- var animToPlay:String = singAnimations[Std.int(Math.abs(daNote.noteData))] + 'miss' + daAlt;
- char.playAnim(animToPlay, true);
- }
-
- callOnLuas('noteMiss', [notes.members.indexOf(daNote), daNote.noteData, daNote.noteType, daNote.isSustainNote]);
- }
-
- function noteMissPress(direction:Int = 1, ?ghostMiss:Bool = false):Void //You pressed a key when there was no notes to press for this key
- {
- if (!boyfriend.stunned)
- {
- health -= 0.04;
- if (combo > 5 && gf.animOffsets.exists('sad'))
- {
- gf.playAnim('sad');
- }
- combo = 0;
-
- if(!practiceMode) songScore -= 10;
- if(!endingSong) {
- songMisses++;
- }
- RecalculateRating();
-
- FlxG.sound.play(Paths.soundRandom('missnote', 1, 3), FlxG.random.float(0.1, 0.2));
- // FlxG.sound.play(Paths.sound('missnote1'), 1, false);
- // FlxG.log.add('played imss note');
-
- /*boyfriend.stunned = true;
-
- // get stunned for 1/60 of a second, makes you able to
- new FlxTimer().start(1 / 60, function(tmr:FlxTimer)
- {
- boyfriend.stunned = false;
- });*/
-
- if(boyfriend.hasMissAnimations) {
- boyfriend.playAnim(singAnimations[Std.int(Math.abs(direction))] + 'miss', true);
- }
- vocals.volume = 0;
- }
- }
-
- function goodNoteHit(note:Note):Void
- {
- if (!note.wasGoodHit)
- {
- if(cpuControlled && (note.ignoreNote || note.hitCausesMiss)) return;
-
- if(note.hitCausesMiss) {
- noteMiss(note);
- if(!note.noteSplashDisabled && !note.isSustainNote) {
- spawnNoteSplashOnNote(note);
- }
-
- switch(note.noteType) {
- case 'Hurt Note': //Hurt note
- if(boyfriend.animation.getByName('hurt') != null) {
- boyfriend.playAnim('hurt', true);
- boyfriend.specialAnim = true;
- }
- }
-
- note.wasGoodHit = true;
- if (!note.isSustainNote)
- {
- note.kill();
- notes.remove(note, true);
- note.destroy();
- }
- return;
- }
-
- if (!note.isSustainNote)
- {
- popUpScore(note);
- combo += 1;
- if(combo > 9999) combo = 9999;
- }
- health += note.hitHealth;
-
- if(!note.noAnimation) {
- var daAlt = '';
- if(note.noteType == 'Alt Animation') daAlt = '-alt';
-
- var animToPlay:String = singAnimations[Std.int(Math.abs(note.noteData))];
-
- if(note.noteType == 'GF Sing') {
- gf.playAnim(animToPlay + daAlt, true);
- gf.holdTimer = 0;
- } else {
- boyfriend.playAnim(animToPlay + daAlt, true);
- boyfriend.holdTimer = 0;
- }
-
- if(note.noteType == 'Hey!') {
- if(boyfriend.animOffsets.exists('hey')) {
- boyfriend.playAnim('hey', true);
- boyfriend.specialAnim = true;
- if(ClientPrefs.sussybest && !isPixelStage && !antireanim){boyfriend.heyTimer = 1.4;}
- else{boyfriend.heyTimer = 0.6;}
- }
-
- if(gf.animOffsets.exists('cheer')) {
- gf.playAnim('cheer', true);
- gf.specialAnim = true;
- gf.heyTimer = 0.6;
- }
- }
- }
-
- if(cpuControlled) {
- var time:Float = 0.15;
- if(note.isSustainNote && !note.animation.curAnim.name.endsWith('end')) {
- time += 0.15;
- }
- StrumPlayAnim(false, Std.int(Math.abs(note.noteData)) % 4, time);
- } else {
- playerStrums.forEach(function(spr:StrumNote)
- {
- if (Math.abs(note.noteData) == spr.ID)
- {
- spr.playAnim('confirm', true);
- }
- });
- }
- note.wasGoodHit = true;
- vocals.volume = 1;
-
- var isSus:Bool = note.isSustainNote; //GET OUT OF MY HEAD, GET OUT OF MY HEAD, GET OUT OF MY HEAD
- var leData:Int = Math.round(Math.abs(note.noteData));
- var leType:String = note.noteType;
- callOnLuas('goodNoteHit', [notes.members.indexOf(note), leData, leType, isSus]);
-
- if (!note.isSustainNote)
- {
- note.kill();
- notes.remove(note, true);
- note.destroy();
- }
- }
- }
-
- function spawnNoteSplashOnNote(note:Note) {
- if(ClientPrefs.noteSplashes && note != null) {
- var strum:StrumNote = playerStrums.members[note.noteData];
- if(strum != null) {
- spawnNoteSplash(strum.x, strum.y, note.noteData, note);
- }
- }
- }
-
- public function spawnNoteSplash(x:Float, y:Float, data:Int, ?note:Note = null) {
- var skin:String = 'noteSplashes';
- if(PlayState.SONG.splashSkin != null && PlayState.SONG.splashSkin.length > 0) skin = PlayState.SONG.splashSkin;
-
- var hue:Float = ClientPrefs.arrowHSV[data % 4][0] / 360;
- var sat:Float = ClientPrefs.arrowHSV[data % 4][1] / 100;
- var brt:Float = ClientPrefs.arrowHSV[data % 4][2] / 100;
- if(note != null) {
- skin = note.noteSplashTexture;
- hue = note.noteSplashHue;
- sat = note.noteSplashSat;
- brt = note.noteSplashBrt;
- }
-
- var splash:NoteSplash = grpNoteSplashes.recycle(NoteSplash);
- splash.setupNoteSplash(x, y, data, skin, hue, sat, brt);
- grpNoteSplashes.add(splash);
- }
-
- var fastCarCanDrive:Bool = true;
-
- function resetFastCar():Void
- {
- fastCar.x = -12600;
- fastCar.y = FlxG.random.int(140, 250);
- fastCar.velocity.x = 0;
- fastCarCanDrive = true;
- }
-
- var carTimer:FlxTimer;
- function fastCarDrive()
- {
- //trace('Car drive');
- FlxG.sound.play(Paths.soundRandom('carPass', 0, 1), 0.7);
-
- fastCar.velocity.x = (FlxG.random.int(170, 220) / FlxG.elapsed) * 3;
- fastCarCanDrive = false;
- carTimer = new FlxTimer().start(2, function(tmr:FlxTimer)
- {
- resetFastCar();
- carTimer = null;
- });
- }
-
- var trainMoving:Bool = false;
- var trainFrameTiming:Float = 0;
-
- var trainCars:Int = 8;
- var trainFinishing:Bool = false;
- var trainCooldown:Int = 0;
-
- function trainStart():Void
- {
- trainMoving = true;
- if (!trainSound.playing)
- trainSound.play(true);
- }
-
- var startedMoving:Bool = false;
-
- function updateTrainPos():Void
- {
- if (trainSound.time >= 4700)
- {
- startedMoving = true;
- gf.playAnim('hairBlow');
- gf.specialAnim = true;
- }
-
- if (startedMoving)
- {
- phillyTrain.x -= 400;
-
- if (phillyTrain.x < -2000 && !trainFinishing)
- {
- phillyTrain.x = -1150;
- trainCars -= 1;
-
- if (trainCars <= 0)
- trainFinishing = true;
- }
-
- if (phillyTrain.x < -4000 && trainFinishing)
- trainReset();
- }
- }
-
- function trainReset():Void
- {
- gf.danced = false; //Sets head to the correct position once the animation ends
- gf.playAnim('hairFall');
- gf.specialAnim = true;
- phillyTrain.x = FlxG.width + 200;
- trainMoving = false;
- // trainSound.stop();
- // trainSound.time = 0;
- trainCars = 8;
- trainFinishing = false;
- startedMoving = false;
- }
-
- function lightningStrikeShit():Void
- {
- FlxG.sound.play(Paths.soundRandom('thunder_', 1, 2));
- if(!ClientPrefs.lowQuality) halloweenBG.animation.play('halloweem bg lightning strike');
-
- lightningStrikeBeat = curBeat;
- lightningOffset = FlxG.random.int(8, 24);
-
- if(boyfriend.animOffsets.exists('scared')) {
- boyfriend.playAnim('scared', true);
- }
- if(gf.animOffsets.exists('scared')) {
- gf.playAnim('scared', true);
- }
-
- if(ClientPrefs.camZooms) {
- FlxG.camera.zoom += 0.015;
- camHUD.zoom += 0.03;
-
- if(!camZooming) { //Just a way for preventing it to be permanently zoomed until Skid & Pump hits a note
- FlxTween.tween(FlxG.camera, {zoom: defaultCamZoom}, 0.5);
- FlxTween.tween(camHUD, {zoom: 1}, 0.5);
- }
- }
-
- if(ClientPrefs.flashing) {
- halloweenWhite.alpha = 0.4;
- FlxTween.tween(halloweenWhite, {alpha: 0.5}, 0.075);
- FlxTween.tween(halloweenWhite, {alpha: 0}, 0.25, {startDelay: 0.15});
- }
- }
-
- function killHenchmen():Void
- {
- if(!ClientPrefs.lowQuality && curStage == 'limo') {
- if(limoKillingState < 1) {
- limoMetalPole.x = -400;
- limoMetalPole.visible = true;
- limoLight.visible = true;
- limoCorpse.visible = false;
- limoCorpseTwo.visible = false;
- limoKillingState = 1;
-
- #if ACHIEVEMENTS_ALLOWED
- Achievements.henchmenDeath++;
- var achieve:String = checkForAchievement(['roadkill_enthusiast']);
- if (achieve != null) {
- startAchievement(achieve);
- } else {
- FlxG.save.data.henchmenDeath = Achievements.henchmenDeath;
- FlxG.save.flush();
- }
- FlxG.log.add('Deaths: ' + Achievements.henchmenDeath);
- #end
- }
- }
- }
-
- function resetLimoKill():Void
- {
- if(curStage == 'limo') {
- limoMetalPole.x = -500;
- limoMetalPole.visible = false;
- limoLight.x = -500;
- limoLight.visible = false;
- limoCorpse.x = -500;
- limoCorpse.visible = false;
- limoCorpseTwo.x = -500;
- limoCorpseTwo.visible = false;
- }
- }
-
- private var preventLuaRemove:Bool = false;
- override function destroy() {
- preventLuaRemove = true;
- for (i in 0...luaArray.length) {
- luaArray[i].call('onDestroy', []);
- luaArray[i].stop();
- }
- luaArray = [];
- super.destroy();
- }
-
- public function cancelFadeTween() {
- if(FlxG.sound.music.fadeTween != null) {
- FlxG.sound.music.fadeTween.cancel();
- }
- FlxG.sound.music.fadeTween = null;
- }
-
- public function removeLua(lua:FunkinLua) {
- if(luaArray != null && !preventLuaRemove) {
- luaArray.remove(lua);
- }
- }
-
- var lastStepHit:Int = -1;
- override function stepHit()
- {
- super.stepHit();
- if (FlxG.sound.music.time > Conductor.songPosition + 20 || FlxG.sound.music.time < Conductor.songPosition - 20)
- {
- resyncVocals();
- }
-
- if(curStep == lastStepHit) {
- return;
- }
-
- lastStepHit = curStep;
- setOnLuas('curStep', curStep);
- callOnLuas('onStepHit', []);
- }
-
- var lightningStrikeBeat:Int = 0;
- var lightningOffset:Int = 8;
-
- var lastBeatHit:Int = -1;
- override function beatHit()
- {
- super.beatHit();
-
- if(lastBeatHit >= curBeat) {
- //trace('BEAT HIT: ' + curBeat + ', LAST HIT: ' + lastBeatHit);
- return;
- }
-
- if (generatedMusic)
- {
- notes.sort(FlxSort.byY, ClientPrefs.downScroll ? FlxSort.ASCENDING : FlxSort.DESCENDING);
- }
-
- if (SONG.notes[Math.floor(curStep / 16)] != null)
- {
- if (SONG.notes[Math.floor(curStep / 16)].changeBPM)
- {
- Conductor.changeBPM(SONG.notes[Math.floor(curStep / 16)].bpm);
- //FlxG.log.add('CHANGED BPM!');
- setOnLuas('curBpm', Conductor.bpm);
- setOnLuas('crochet', Conductor.crochet);
- setOnLuas('stepCrochet', Conductor.stepCrochet);
- }
- setOnLuas('mustHitSection', SONG.notes[Math.floor(curStep / 16)].mustHitSection);
- // else
- // Conductor.changeBPM(SONG.bpm);
- }
- // FlxG.log.add('change bpm' + SONG.notes[Std.int(curStep / 16)].changeBPM);
-
- if (generatedMusic && PlayState.SONG.notes[Std.int(curStep / 16)] != null && !endingSong && !isCameraOnForcedPos)
- {
- moveCameraSection(Std.int(curStep / 16));
- }
- if (camZooming && FlxG.camera.zoom < 1.35 && ClientPrefs.camZooms && curBeat % 4 == 0)
- {
- FlxG.camera.zoom += 0.015;
- camHUD.zoom += 0.03;
- }
-
- iconP1.setGraphicSize(Std.int(iconP1.width + 30));
- iconP2.setGraphicSize(Std.int(iconP2.width + 30));
-
- iconP1.updateHitbox();
- iconP2.updateHitbox();
-
- if (curBeat % gfSpeed == 0 && !gf.stunned && gf.animation.curAnim.name != null && !gf.animation.curAnim.name.startsWith("sing"))
- {
- gf.dance();
- }
-
- if(curBeat % 2 == 0) {
- if (boyfriend.animation.curAnim.name != null && !boyfriend.animation.curAnim.name.startsWith("sing"))
- {
- boyfriend.dance();
- }
- if (dad.animation.curAnim.name != null && !dad.animation.curAnim.name.startsWith("sing") && !dad.stunned)
- {
- dad.dance();
- }
- } else if(dad.danceIdle && dad.animation.curAnim.name != null && !dad.curCharacter.startsWith('gf') && !dad.animation.curAnim.name.startsWith("sing") && !dad.stunned) {
- dad.dance();
- }
-
- switch (curStage)
- {
- case 'school':
- if(!ClientPrefs.lowQuality) {
- bgGirls.dance();
- }
-
- case 'mall':
- if(!ClientPrefs.lowQuality) {
- upperBoppers.dance(true);
- }
-
- if(heyTimer <= 0) bottomBoppers.dance(true);
- santa.dance(true);
-
- case 'limo':
- if(!ClientPrefs.lowQuality) {
- grpLimoDancers.forEach(function(dancer:BackgroundDancer)
- {
- dancer.dance();
- });
- }
-
- if (FlxG.random.bool(10) && fastCarCanDrive)
- fastCarDrive();
- case "philly":
- if (!trainMoving)
- trainCooldown += 1;
-
- if (curBeat % 4 == 0)
- {
- phillyCityLights.forEach(function(light:BGSprite)
- {
- light.visible = false;
- });
-
- curLight = FlxG.random.int(0, phillyCityLights.length - 1, [curLight]);
-
- phillyCityLights.members[curLight].visible = true;
- phillyCityLights.members[curLight].alpha = 1;
- }
-
- if (curBeat % 8 == 4 && FlxG.random.bool(30) && !trainMoving && trainCooldown > 8)
- {
- trainCooldown = FlxG.random.int(-4, 0);
- trainStart();
- }
- }
-
- if (curStage == 'spooky' && FlxG.random.bool(10) && curBeat > lightningStrikeBeat + lightningOffset)
- {
- lightningStrikeShit();
- }
- lastBeatHit = curBeat;
-
- setOnLuas('curBeat', curBeat);
- callOnLuas('onBeatHit', []);
- }
-
- public function callOnLuas(event:String, args:Array):Dynamic {
- var returnVal:Dynamic = FunkinLua.Function_Continue;
- #if LUA_ALLOWED
- for (i in 0...luaArray.length) {
- var ret:Dynamic = luaArray[i].call(event, args);
- if(ret != FunkinLua.Function_Continue) {
- returnVal = ret;
- }
- }
- #end
- return returnVal;
- }
-
- public function setOnLuas(variable:String, arg:Dynamic) {
- #if LUA_ALLOWED
- for (i in 0...luaArray.length) {
- luaArray[i].set(variable, arg);
- }
- #end
- }
-
- function StrumPlayAnim(isDad:Bool, id:Int, time:Float) {
- var spr:StrumNote = null;
- if(isDad) {
- spr = strumLineNotes.members[id];
- } else {
- spr = playerStrums.members[id];
- }
-
- if(spr != null) {
- spr.playAnim('confirm', true);
- spr.resetAnim = time;
- }
- }
-
- public var ratingString:String;
- public var ratingPercent:Float;
- public function RecalculateRating() {
- setOnLuas('score', songScore);
- setOnLuas('misses', songMisses);
- setOnLuas('hits', songHits);
-
- var ret:Dynamic = callOnLuas('onRecalculateRating', []);
- if(ret != FunkinLua.Function_Stop) {
- ratingPercent = songHits / (songHits + songMisses); //Hur dur eu sou do IME, sei fazer continha kekekekeke ah se lascar pra lá Marcos, deixe eu com minhas regras de 3
- if(!Math.isNaN(ratingPercent) && ratingPercent < 0) ratingPercent = 0;
-
- if(Math.isNaN(ratingPercent)) {
- ratingString = '?';
- } else if(ratingPercent >= 1) {
- ratingPercent = 1;
- ratingString = ratingStuff[ratingStuff.length-1][0]; //Uses last string
- } else {
- for (i in 0...ratingStuff.length-1) {
- if(ratingPercent < ratingStuff[i][1]) {
- ratingString = ratingStuff[i][0];
- break;
- }
- }
- }
-
- setOnLuas('rating', ratingPercent);
- setOnLuas('ratingName', ratingString);
- }
- }
-
- #if ACHIEVEMENTS_ALLOWED
- private function checkForAchievement(achievesToCheck:Array):String {
- for (i in 0...achievesToCheck.length) {
- var achievementName:String = achievesToCheck[i];
- if(!Achievements.isAchievementUnlocked(achievementName)) {
- var unlock:Bool = false;
- switch(achievementName)
- {
- case 'week1_nomiss' | 'week2_nomiss' | 'week3_nomiss' | 'week4_nomiss' | 'week5_nomiss' | 'week6_nomiss' | 'week7_nomiss':
- if(isStoryMode && campaignMisses + songMisses < 1 && CoolUtil.difficultyString() == 'HARD' && storyPlaylist.length <= 1 && !changedDifficulty && !usedPractice)
- {
- var weekName:String = WeekData.getWeekFileName();
- switch(weekName) //I know this is a lot of duplicated code, but it's easier readable and you can add weeks with different names than the achievement tag
- {
- case 'week1':
- if(achievementName == 'week1_nomiss') unlock = true;
- case 'week2':
- if(achievementName == 'week2_nomiss') unlock = true;
- case 'week3':
- if(achievementName == 'week3_nomiss') unlock = true;
- case 'week4':
- if(achievementName == 'week4_nomiss') unlock = true;
- case 'week5':
- if(achievementName == 'week5_nomiss') unlock = true;
- case 'week6':
- if(achievementName == 'week6_nomiss') unlock = true;
- case 'week7':
- if(achievementName == 'week7_nomiss') unlock = true;
- }
- }
- case 'ur_bad':
- if(ratingPercent < 0.2 && !practiceMode && !cpuControlled) {
- unlock = true;
- }
- case 'ur_good':
- if(ratingPercent >= 1 && !usedPractice && !cpuControlled) {
- unlock = true;
- }
- case 'roadkill_enthusiast':
- if(Achievements.henchmenDeath >= 100) {
- unlock = true;
- }
- case 'oversinging':
- if(boyfriend.holdTimer >= 20 && !usedPractice) {
- unlock = true;
- }
- case 'hype':
- if(!boyfriendIdled && !usedPractice) {
- unlock = true;
- }
- case 'two_keys':
- if(!usedPractice) {
- var howManyPresses:Int = 0;
- for (j in 0...keysPressed.length) {
- if(keysPressed[j]) howManyPresses++;
- }
-
- if(howManyPresses <= 2) {
- unlock = true;
- }
- }
- case 'toastie':
- if(/*ClientPrefs.framerate <= 60 &&*/ ClientPrefs.lowQuality && !ClientPrefs.globalAntialiasing && !ClientPrefs.imagesPersist) {
- unlock = true;
- }
- case 'debugger':
- if(Paths.formatToSongPath(SONG.song) == 'test' && !usedPractice) {
- unlock = true;
- }
- }
-
- if(unlock) {
- Achievements.unlockAchievement(achievementName);
- return achievementName;
- }
- }
- }
- return null;
- }
- #end
-
- var curLight:Int = 0;
- var curLightEvent:Int = 0;
-}
+package;
+
+#if desktop
+import Discord.DiscordClient;
+#end
+import Section.SwagSection;
+import ui.Mobilecontrols;
+import Song.SwagSong;
+import WiggleEffect.WiggleEffectType;
+import flixel.FlxBasic;
+import flixel.FlxCamera;
+import flixel.FlxG;
+import flixel.FlxGame;
+import flixel.FlxObject;
+import flixel.FlxSprite;
+import flixel.FlxState;
+import flixel.FlxSubState;
+import flixel.addons.display.FlxGridOverlay;
+import flixel.addons.effects.FlxTrail;
+import flixel.addons.effects.FlxTrailArea;
+import flixel.addons.effects.chainable.FlxEffectSprite;
+import flixel.addons.effects.chainable.FlxWaveEffect;
+import flixel.addons.transition.FlxTransitionableState;
+import flixel.graphics.atlas.FlxAtlas;
+import flixel.graphics.frames.FlxAtlasFrames;
+import flixel.group.FlxGroup.FlxTypedGroup;
+import flixel.math.FlxMath;
+import flixel.math.FlxPoint;
+import flixel.math.FlxRect;
+import flixel.system.FlxSound;
+import flixel.text.FlxText;
+import flixel.tweens.FlxEase;
+import flixel.tweens.FlxTween;
+import flixel.ui.FlxBar;
+import flixel.util.FlxCollision;
+import flixel.util.FlxColor;
+import flixel.util.FlxSort;
+import flixel.util.FlxStringUtil;
+import flixel.util.FlxTimer;
+import haxe.Json;
+import LoadingState;
+import lime.utils.Assets;
+import openfl.display.BlendMode;
+import openfl.display.StageQuality;
+import openfl.filters.ShaderFilter;
+import openfl.utils.Assets as OpenFlAssets;
+import editors.ChartingState;
+import editors.CharacterEditorState;
+import flixel.group.FlxSpriteGroup;
+import Achievements;
+import StageData;
+import FunkinLua;
+import DialogueBoxPsych;
+#if sys
+import Sys;
+import sys.FileSystem;
+import openfl.Assets;
+import sys.io.File;
+#end
+#if sys
+import sys.FileSystem;
+#end
+
+using StringTools;
+
+class PlayState extends MusicBeatState
+{
+ public static var STRUM_X = 42;
+ public static var STRUM_X_MIDDLESCROLL = -278;
+ public static var songSpeed:Float = 0;
+
+ public var isDad:Bool = false;
+ public var isGF:Bool = false;
+
+ public static var instance:PlayState;
+ public static var ratingStuff:Array = [
+ ['You Suck!', 0.2], //From 0% to 19%
+ ['Shit', 0.4], //From 20% to 39%
+ ['Bad', 0.5], //From 40% to 49%
+ ['Bruh', 0.6], //From 50% to 59%
+ ['Meh', 0.69], //From 60% to 68%
+ ['Nice', 0.7], //69%
+ ['Good', 0.8], //From 70% to 79%
+ ['Great', 0.9], //From 80% to 89%
+ ['Sick!', 1], //From 90% to 99%
+ ['Perfect!!', 1] //The value on this one isn't used actually, since Perfect is always "1"
+ ];
+
+ #if (haxe >= "4.0.0")
+ public var modchartTweens:Map = new Map();
+ public var modchartSprites:Map = new Map();
+ public var modchartTimers:Map = new Map();
+ public var modchartSounds:Map = new Map();
+ #else
+ public var modchartTweens:Map = new Map();
+ public var modchartSprites:Map = new Map();
+ public var modchartTimers:Map = new Map();
+ public var modchartSounds:Map = new Map();
+ #end
+
+ //event variables
+ private var isCameraOnForcedPos:Bool = false;
+ #if (haxe >= "4.0.0")
+ public var boyfriendMap:Map = new Map();
+ public var dadMap:Map = new Map();
+ public var gfMap:Map = new Map();
+ #else
+ public var boyfriendMap:Map = new Map();
+ public var dadMap:Map = new Map();
+ public var gfMap:Map = new Map();
+ #end
+
+ public var BF_X:Float = 770;
+ public var BF_Y:Float = 100;
+ public var DAD_X:Float = 100;
+ public var DAD_Y:Float = 100;
+ public var GF_X:Float = 400;
+ public var GF_Y:Float = 130;
+
+ public static var shits:Int = 0;
+ public static var bads:Int = 0;
+ public static var goods:Int = 0;
+ public static var sicks:Int = 0;
+
+ public var boyfriendGroup:FlxSpriteGroup;
+ public var dadGroup:FlxSpriteGroup;
+ public var gfGroup:FlxSpriteGroup;
+
+ public static var curStage:String = '';
+ public static var isPixelStage:Bool = false;
+ public static var antireanim:Bool = false;
+ public static var SONG:SwagSong = null;
+ public static var isStoryMode:Bool = false;
+ public static var storyWeek:Int = 0;
+ public static var storyPlaylist:Array = [];
+ public static var storyDifficulty:Int = 1;
+
+ public var vocals:FlxSound;
+
+ public var dad:Character;
+ public var gf:Character;
+ public var boyfriend:Boyfriend;
+
+ public var notes:FlxTypedGroup;
+ public var unspawnNotes:Array = [];
+ public var eventNotes:Array = [];
+
+ private var strumLine:FlxSprite;
+
+ //Handles the new epic mega sexy cam code that i've done
+ private var camFollow:FlxPoint;
+ private var camFollowPos:FlxObject;
+ private static var prevCamFollow:FlxPoint;
+ private static var prevCamFollowPos:FlxObject;
+
+ public var strumLineNotes:FlxTypedGroup;
+ public var opponentStrums:FlxTypedGroup;
+ public var playerStrums:FlxTypedGroup;
+ public var grpNoteSplashes:FlxTypedGroup;
+
+ public var camZooming:Bool = false;
+ private var curSong:String = "";
+
+ public var gfSpeed:Int = 1;
+ public var health:Float = 1;
+ public var combo:Int = 0;
+
+ private var healthBarBG:AttachedSprite;
+ public var healthBar:FlxBar;
+ var songPercent:Float = 0;
+
+ private var timeBarBG:AttachedSprite;
+ public var timeBar:FlxBar;
+
+ private var generatedMusic:Bool = false;
+ public var endingSong:Bool = false;
+ private var startingSong:Bool = false;
+ private var updateTime:Bool = false;
+ public static var practiceMode:Bool = false;
+ public static var usedPractice:Bool = false;
+ public static var changedDifficulty:Bool = false;
+ public static var cpuControlled:Bool = false;
+
+ var botplaySine:Float = 0;
+ var botplayTxt:FlxText;
+
+ public var iconP1:HealthIcon;
+ public var iconP2:HealthIcon;
+ public var camHUD:FlxCamera;
+ public var camGame:FlxCamera;
+ public var camOther:FlxCamera;
+ public var cameraSpeed:Float = 1;
+
+ var dialogue:Array = ['blah blah blah', 'coolswag'];
+ var dialogueJson:DialogueFile = null;
+
+ var halloweenBG:BGSprite;
+ var halloweenWhite:BGSprite;
+
+ var phillyCityLights:FlxTypedGroup;
+ var phillyTrain:BGSprite;
+ var blammedLightsBlack:ModchartSprite;
+ var blammedLightsBlackTween:FlxTween;
+ var phillyCityLightsEvent:FlxTypedGroup;
+ var phillyCityLightsEventTween:FlxTween;
+ var trainSound:FlxSound;
+
+ var limoKillingState:Int = 0;
+ var limo:BGSprite;
+ var limoMetalPole:BGSprite;
+ var limoLight:BGSprite;
+ var limoCorpse:BGSprite;
+ var limoCorpseTwo:BGSprite;
+ var bgLimo:BGSprite;
+ var grpLimoParticles:FlxTypedGroup;
+ var grpLimoDancers:FlxTypedGroup;
+ var fastCar:BGSprite;
+
+ var upperBoppers:BGSprite;
+ var bottomBoppers:BGSprite;
+ var santa:BGSprite;
+ var heyTimer:Float;
+
+ var bgGirls:BackgroundGirls;
+ var wiggleShit:WiggleEffect = new WiggleEffect();
+ var bgGhouls:BGSprite;
+
+ public var songScore:Int = 0;
+ public var songHits:Int = 0;
+ public var songMisses:Int = 0;
+ public var scoreTxt:FlxText;
+ var timeTxt:FlxText;
+ var scoreTxtTween:FlxTween;
+
+ public static var campaignScore:Int = 0;
+ public static var campaignMisses:Int = 0;
+ public static var seenCutscene:Bool = false;
+ public static var deathCounter:Int = 0;
+
+ public var defaultCamZoom:Float = 1.05;
+
+ // how big to stretch the pixel art assets
+ public static var daPixelZoom:Float = 6;
+ private var singAnimations:Array = ['singLEFT', 'singDOWN', 'singUP', 'singRIGHT'];
+
+ public var inCutscene:Bool = false;
+ var songLength:Float = 0;
+
+ #if desktop
+ // Discord RPC variables
+ var storyDifficultyText:String = "";
+ var detailsText:String = "";
+ var detailsPausedText:String = "";
+ #end
+
+ //Achievement shit
+ var keysPressed:Array = [false, false, false, false];
+ var boyfriendIdleTime:Float = 0.0;
+ var boyfriendIdled:Bool = false;
+
+ // Lua shit
+
+ private var luaArray:Array = [];
+ private var luaDebugGroup:FlxTypedGroup;
+ public var introSoundsSuffix:String = '';
+
+ #if mobileC
+ var mcontrols:Mobilecontrols;
+ #end
+
+ override public function create()
+ {
+ instance = this;
+ #if MODS_ALLOWED
+ Paths.destroyLoadedImages();
+ #end
+
+ if (FlxG.sound.music != null)
+ FlxG.sound.music.stop();
+
+ practiceMode = false;
+ // var gameCam:FlxCamera = FlxG.camera;
+ camGame = new FlxCamera();
+ camHUD = new FlxCamera();
+ camOther = new FlxCamera();
+ camHUD.bgColor.alpha = 0;
+ camOther.bgColor.alpha = 0;
+
+ FlxG.cameras.reset(camGame);
+ FlxG.cameras.add(camHUD);
+ FlxG.cameras.add(camOther);
+ grpNoteSplashes = new FlxTypedGroup();
+
+ FlxCamera.defaultCameras = [camGame];
+ CustomFadeTransition.nextCamera = camOther;
+ //FlxG.cameras.setDefaultDrawTarget(camGame, true);
+
+ persistentUpdate = true;
+ persistentDraw = true;
+
+ if (SONG == null)
+ SONG = Song.loadFromJson('tutorial');
+
+ Conductor.mapBPMChanges(SONG);
+ Conductor.changeBPM(SONG.bpm);
+
+ #if desktop
+ storyDifficultyText = '' + CoolUtil.difficultyStuff[storyDifficulty][0];
+
+ // String that contains the mode defined here so it isn't necessary to call changePresence for each mode
+ if (isStoryMode)
+ {
+ detailsText = "Story Mode: " + WeekData.getCurrentWeek().weekName;
+ }
+ else
+ {
+ detailsText = "Freeplay";
+ }
+
+ // String for when the game is paused
+ detailsPausedText = "Paused - " + detailsText;
+ #end
+
+ GameOverSubstate.resetVariables();
+ var songName:String = Paths.formatToSongPath(SONG.song);
+ curStage = PlayState.SONG.stage;
+ //trace('stage is: ' + curStage);
+ if(PlayState.SONG.stage == null || PlayState.SONG.stage.length < 1) {
+ switch (songName)
+ {
+ case 'spookeez' | 'south' | 'monster':
+ curStage = 'spooky';
+ case 'pico' | 'blammed' | 'philly' | 'philly-nice':
+ curStage = 'philly';
+ case 'milf' | 'satin-panties' | 'high':
+ curStage = 'limo';
+ case 'cocoa' | 'eggnog':
+ curStage = 'mall';
+ case 'winter-horrorland':
+ curStage = 'mallEvil';
+ case 'senpai' | 'roses':
+ curStage = 'school';
+ case 'thorns':
+ curStage = 'schoolEvil';
+ default:
+ curStage = 'stage';
+ }
+ }
+
+ var stageData:StageFile = StageData.getStageFile(curStage);
+ if(stageData == null) { //Stage couldn't be found, create a dummy stage for preventing a crash
+ stageData = {
+ directory: "",
+ defaultZoom: 0.9,
+ isPixelStage: false,
+
+ boyfriend: [770, 100],
+ girlfriend: [400, 130],
+ opponent: [100, 100]
+ };
+ }
+
+ defaultCamZoom = stageData.defaultZoom;
+ isPixelStage = stageData.isPixelStage;
+ BF_X = stageData.boyfriend[0];
+ BF_Y = stageData.boyfriend[1];
+ GF_X = stageData.girlfriend[0];
+ GF_Y = stageData.girlfriend[1];
+ DAD_X = stageData.opponent[0];
+ DAD_Y = stageData.opponent[1];
+
+ boyfriendGroup = new FlxSpriteGroup(BF_X, BF_Y);
+ dadGroup = new FlxSpriteGroup(DAD_X, DAD_Y);
+ gfGroup = new FlxSpriteGroup(GF_X, GF_Y);
+
+ switch (curStage)
+ {
+ case 'stage': //Week 1
+ var bg:BGSprite = new BGSprite('stageback', -600, -200, 0.9, 0.9);
+ add(bg);
+
+ var stageFront:BGSprite = new BGSprite('stagefront', -650, 600, 0.9, 0.9);
+ stageFront.setGraphicSize(Std.int(stageFront.width * 1.1));
+ stageFront.updateHitbox();
+ add(stageFront);
+
+ if(!ClientPrefs.lowQuality) {
+ var stageLight:BGSprite = new BGSprite('stage_light', -125, -100, 0.9, 0.9);
+ stageLight.setGraphicSize(Std.int(stageLight.width * 1.1));
+ stageLight.updateHitbox();
+ add(stageLight);
+ var stageLight:BGSprite = new BGSprite('stage_light', 1225, -100, 0.9, 0.9);
+ stageLight.setGraphicSize(Std.int(stageLight.width * 1.1));
+ stageLight.updateHitbox();
+ stageLight.flipX = true;
+ add(stageLight);
+
+ var stageCurtains:BGSprite = new BGSprite('stagecurtains', -500, -300, 1.3, 1.3);
+ stageCurtains.setGraphicSize(Std.int(stageCurtains.width * 0.9));
+ stageCurtains.updateHitbox();
+ add(stageCurtains);
+ }
+
+ case 'spooky': //Week 2
+ if(!ClientPrefs.lowQuality) {
+ halloweenBG = new BGSprite('halloween_bg', -200, -100, ['halloweem bg0', 'halloweem bg lightning strike']);
+ halloweenBG.setGraphicSize(Std.int(halloweenBG.width * 2));
+ halloweenBG.updateHitbox();
+ } else {
+ halloweenBG = new BGSprite('halloween_bg_low', -200, -100);
+ }
+ add(halloweenBG);
+
+ halloweenWhite = new BGSprite(null, -FlxG.width, -FlxG.height, 0, 0);
+ halloweenWhite.makeGraphic(Std.int(FlxG.width * 3), Std.int(FlxG.height * 3), FlxColor.WHITE);
+ halloweenWhite.alpha = 0;
+ halloweenWhite.blend = ADD;
+
+ //PRECACHE SOUNDS
+ CoolUtil.precacheSound('thunder_1');
+ CoolUtil.precacheSound('thunder_2');
+
+ case 'philly': //Week 3
+ if(!ClientPrefs.lowQuality) {
+ var bg:BGSprite = new BGSprite('philly/sky', -100, 0, 0.1, 0.1);
+ add(bg);
+ }
+
+ var city:BGSprite = new BGSprite('philly/city', -10, 0, 0.3, 0.3);
+ city.setGraphicSize(Std.int(city.width * 0.85));
+ city.updateHitbox();
+ add(city);
+
+ phillyCityLights = new FlxTypedGroup();
+ add(phillyCityLights);
+
+ for (i in 0...5)
+ {
+ var light:BGSprite = new BGSprite('philly/win' + i, city.x, city.y, 0.3, 0.3);
+ light.visible = false;
+ light.setGraphicSize(Std.int(light.width * 0.85));
+ light.updateHitbox();
+ phillyCityLights.add(light);
+ }
+
+ if(!ClientPrefs.lowQuality) {
+ var streetBehind:BGSprite = new BGSprite('philly/behindTrain', -40, 50);
+ add(streetBehind);
+ }
+
+ phillyTrain = new BGSprite('philly/train', 2000, 360);
+ add(phillyTrain);
+
+ trainSound = new FlxSound().loadEmbedded(Paths.sound('train_passes'));
+ CoolUtil.precacheSound('train_passes');
+ FlxG.sound.list.add(trainSound);
+
+ var street:BGSprite = new BGSprite('philly/street', -40, 50);
+ add(street);
+
+ case 'limo': //Week 4
+ var skyBG:BGSprite = new BGSprite('limo/limoSunset', -120, -50, 0.1, 0.1);
+ add(skyBG);
+ antireanim = true;
+
+ if(!ClientPrefs.lowQuality) {
+ limoMetalPole = new BGSprite('gore/metalPole', -500, 220, 0.4, 0.4);
+ add(limoMetalPole);
+
+ bgLimo = new BGSprite('limo/bgLimo', -150, 480, 0.4, 0.4, ['background limo pink'], true);
+ add(bgLimo);
+
+ limoCorpse = new BGSprite('gore/noooooo', -500, limoMetalPole.y - 130, 0.4, 0.4, ['Henchmen on rail'], true);
+ add(limoCorpse);
+
+ limoCorpseTwo = new BGSprite('gore/noooooo', -500, limoMetalPole.y, 0.4, 0.4, ['henchmen death'], true);
+ add(limoCorpseTwo);
+
+ 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);
+ }
+
+ limoLight = new BGSprite('gore/coldHeartKiller', limoMetalPole.x - 180, limoMetalPole.y - 80, 0.4, 0.4);
+ add(limoLight);
+
+ grpLimoParticles = new FlxTypedGroup();
+ add(grpLimoParticles);
+
+ //PRECACHE BLOOD
+ var particle:BGSprite = new BGSprite('gore/stupidBlood', -400, -400, 0.4, 0.4, ['blood'], false);
+ particle.alpha = 0.01;
+ grpLimoParticles.add(particle);
+ resetLimoKill();
+
+ //PRECACHE SOUND
+ CoolUtil.precacheSound('dancerdeath');
+ }
+
+ limo = new BGSprite('limo/limoDrive', -120, 550, 1, 1, ['Limo stage'], true);
+
+ fastCar = new BGSprite('limo/fastCarLol', -300, 160);
+ fastCar.active = true;
+ limoKillingState = 0;
+
+ case 'mall': //Week 5 - Cocoa, Eggnog
+ var bg:BGSprite = new BGSprite('christmas/bgWalls', -1000, -500, 0.2, 0.2);
+ bg.setGraphicSize(Std.int(bg.width * 0.8));
+ bg.updateHitbox();
+ add(bg);
+ antireanim = true;
+
+ if(!ClientPrefs.lowQuality) {
+ upperBoppers = new BGSprite('christmas/upperBop', -240, -90, 0.33, 0.33, ['Upper Crowd Bob']);
+ upperBoppers.setGraphicSize(Std.int(upperBoppers.width * 0.85));
+ upperBoppers.updateHitbox();
+ add(upperBoppers);
+
+ var bgEscalator:BGSprite = new BGSprite('christmas/bgEscalator', -1100, -600, 0.3, 0.3);
+ bgEscalator.setGraphicSize(Std.int(bgEscalator.width * 0.9));
+ bgEscalator.updateHitbox();
+ add(bgEscalator);
+ }
+
+ var tree:BGSprite = new BGSprite('christmas/christmasTree', 370, -250, 0.40, 0.40);
+ add(tree);
+
+ bottomBoppers = new BGSprite('christmas/bottomBop', -300, 140, 0.9, 0.9, ['Bottom Level Boppers Idle']);
+ bottomBoppers.animation.addByPrefix('hey', 'Bottom Level Boppers HEY', 24, false);
+ bottomBoppers.setGraphicSize(Std.int(bottomBoppers.width * 1));
+ bottomBoppers.updateHitbox();
+ add(bottomBoppers);
+
+ var fgSnow:BGSprite = new BGSprite('christmas/fgSnow', -600, 700);
+ add(fgSnow);
+
+ santa = new BGSprite('christmas/santa', -840, 150, 1, 1, ['santa idle in fear']);
+ add(santa);
+ CoolUtil.precacheSound('Lights_Shut_off');
+
+ case 'mallEvil': //Week 5 - Winter Horrorland
+ var bg:BGSprite = new BGSprite('christmas/evilBG', -400, -500, 0.2, 0.2);
+ bg.setGraphicSize(Std.int(bg.width * 0.8));
+ bg.updateHitbox();
+ add(bg);
+ antireanim = true;
+
+ var evilTree:BGSprite = new BGSprite('christmas/evilTree', 300, -300, 0.2, 0.2);
+ add(evilTree);
+
+ var evilSnow:BGSprite = new BGSprite('christmas/evilSnow', -200, 700);
+ add(evilSnow);
+
+ case 'school': //Week 6 - Senpai, Roses
+
+ GameOverSubstate.deathSoundName = 'fnf_loss_sfx-pixel';
+ GameOverSubstate.loopSoundName = 'gameOver-pixel';
+ GameOverSubstate.endSoundName = 'gameOverEnd-pixel';
+ GameOverSubstate.characterName = 'bf-pixel-dead';
+
+ var bgSky:BGSprite = new BGSprite('weeb/weebSky', 0, 0, 0.1, 0.1);
+ add(bgSky);
+ bgSky.antialiasing = false;
+
+ var repositionShit = -200;
+
+ var bgSchool:BGSprite = new BGSprite('weeb/weebSchool', repositionShit, 0, 0.6, 0.90);
+ add(bgSchool);
+ bgSchool.antialiasing = false;
+
+ var bgStreet:BGSprite = new BGSprite('weeb/weebStreet', repositionShit, 0, 0.95, 0.95);
+ add(bgStreet);
+ bgStreet.antialiasing = false;
+
+ var widShit = Std.int(bgSky.width * 6);
+ if(!ClientPrefs.lowQuality) {
+ var fgTrees:BGSprite = new BGSprite('weeb/weebTreesBack', repositionShit + 170, 130, 0.9, 0.9);
+ fgTrees.setGraphicSize(Std.int(widShit * 0.8));
+ fgTrees.updateHitbox();
+ add(fgTrees);
+ fgTrees.antialiasing = false;
+ }
+
+ var bgTrees:FlxSprite = new FlxSprite(repositionShit - 380, -800);
+ bgTrees.frames = Paths.getPackerAtlas('weeb/weebTrees');
+ 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);
+ bgTrees.antialiasing = false;
+
+ if(!ClientPrefs.lowQuality) {
+ var treeLeaves:BGSprite = new BGSprite('weeb/petals', repositionShit, -40, 0.85, 0.85, ['PETALS ALL'], true);
+ treeLeaves.setGraphicSize(widShit);
+ treeLeaves.updateHitbox();
+ add(treeLeaves);
+ treeLeaves.antialiasing = false;
+ }
+
+ bgSky.setGraphicSize(widShit);
+ bgSchool.setGraphicSize(widShit);
+ bgStreet.setGraphicSize(widShit);
+ bgTrees.setGraphicSize(Std.int(widShit * 1.4));
+
+ bgSky.updateHitbox();
+ bgSchool.updateHitbox();
+ bgStreet.updateHitbox();
+ bgTrees.updateHitbox();
+
+ if(!ClientPrefs.lowQuality) {
+ bgGirls = new BackgroundGirls(-100, 190);
+ bgGirls.scrollFactor.set(0.9, 0.9);
+
+ bgGirls.setGraphicSize(Std.int(bgGirls.width * daPixelZoom));
+ bgGirls.updateHitbox();
+ add(bgGirls);
+ }
+
+ case 'schoolEvil': //Week 6 - Thorns
+ GameOverSubstate.deathSoundName = 'fnf_loss_sfx-pixel';
+ GameOverSubstate.loopSoundName = 'gameOver-pixel';
+ GameOverSubstate.endSoundName = 'gameOverEnd-pixel';
+ GameOverSubstate.characterName = 'bf-pixel-dead';
+
+ /*if(!ClientPrefs.lowQuality) { //Does this even do something?
+ 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;
+ if(!ClientPrefs.lowQuality) {
+ var bg:BGSprite = new BGSprite('weeb/animatedEvilSchool', posX, posY, 0.8, 0.9, ['background 2'], true);
+ bg.scale.set(6, 6);
+ bg.antialiasing = false;
+ add(bg);
+
+ bgGhouls = new BGSprite('weeb/bgGhouls', -100, 190, 0.9, 0.9, ['BG freaks glitch instance'], false);
+ bgGhouls.setGraphicSize(Std.int(bgGhouls.width * daPixelZoom));
+ bgGhouls.updateHitbox();
+ bgGhouls.visible = false;
+ bgGhouls.antialiasing = false;
+ add(bgGhouls);
+ } else {
+ var bg:BGSprite = new BGSprite('weeb/animatedEvilSchool_low', posX, posY, 0.8, 0.9);
+ bg.scale.set(6, 6);
+ bg.antialiasing = false;
+ add(bg);
+ }
+ }
+
+ if(isPixelStage) {
+ introSoundsSuffix = '-pixel';
+ }
+
+ add(gfGroup);
+
+ // Shitty layering but whatev it works LOL
+ if (curStage == 'limo')
+ add(limo);
+
+ add(dadGroup);
+ add(boyfriendGroup);
+
+ if(curStage == 'spooky') {
+ add(halloweenWhite);
+ }
+
+ #if LUA_ALLOWED
+ luaDebugGroup = new FlxTypedGroup();
+ luaDebugGroup.cameras = [camOther];
+ add(luaDebugGroup);
+ #end
+
+ var doPush:Bool = false;
+ #if (MODS_ALLOWED && LUA_ALLOWED)
+ if(openfl.utils.Assets.exists("assets/stages/" + curStage + ".lua"))
+ {
+ var path = Paths.luaAsset("stages/" + curStage);
+ var luaFile = openfl.Assets.getBytes(path);
+
+ FileSystem.createDirectory(Main.path + "assets");
+ FileSystem.createDirectory(Main.path + "assets/stages");
+
+ File.saveBytes(Paths.lua("stages/" + curStage), luaFile);
+
+ doPush = true;
+ }
+
+ if(curStage == 'philly') {
+ phillyCityLightsEvent = new FlxTypedGroup();
+ for (i in 0...5)
+ {
+ var light:BGSprite = new BGSprite('philly/win' + i, -10, 0, 0.3, 0.3);
+ light.visible = false;
+ light.setGraphicSize(Std.int(light.width * 0.85));
+ light.updateHitbox();
+ phillyCityLightsEvent.add(light);
+ }
+ }
+
+ if(doPush)
+ luaArray.push(new FunkinLua(Paths.lua("stages/" + curStage)));
+
+ if(!modchartSprites.exists('blammedLightsBlack')) { //Creates blammed light black fade in case you didn't make your own
+ blammedLightsBlack = new ModchartSprite(FlxG.width * -0.5, FlxG.height * -0.5);
+ blammedLightsBlack.makeGraphic(Std.int(FlxG.width * 2), Std.int(FlxG.height * 2), FlxColor.BLACK);
+ var position:Int = members.indexOf(gfGroup);
+ if(members.indexOf(boyfriendGroup) < position) {
+ position = members.indexOf(boyfriendGroup);
+ } else if(members.indexOf(dadGroup) < position) {
+ position = members.indexOf(dadGroup);
+ }
+ insert(position, blammedLightsBlack);
+
+ blammedLightsBlack.wasAdded = true;
+ modchartSprites.set('blammedLightsBlack', blammedLightsBlack);
+ }
+ if(curStage == 'philly') insert(members.indexOf(blammedLightsBlack) + 1, phillyCityLightsEvent);
+ blammedLightsBlack = modchartSprites.get('blammedLightsBlack');
+ blammedLightsBlack.alpha = 0.0;
+ #end
+
+ var gfVersion:String = SONG.player3;
+ if(gfVersion == null || gfVersion.length < 1) {
+ switch (curStage)
+ {
+ case 'limo':
+ gfVersion = 'gf-car';
+ case 'mall' | 'mallEvil':
+ gfVersion = 'gf-christmas';
+ case 'school' | 'schoolEvil':
+ gfVersion = 'gf-pixel';
+ default:
+ gfVersion = 'gf';
+ }
+ SONG.player3 = gfVersion; //Fix for the Chart Editor
+ }
+
+ if(ClientPrefs.girlfriend){
+ gf = new Character(0, 0, 'invisibru');
+ } else {
+ gf = new Character(0, 0, gfVersion);
+ }
+ startCharacterPos(gf);
+ gf.scrollFactor.set(0.95, 0.95);
+ gfGroup.add(gf);
+
+ dad = new Character(0, 0, SONG.player2);
+ startCharacterPos(dad, true);
+ dadGroup.add(dad);
+
+ if(ClientPrefs.sussybest && !isPixelStage && !antireanim){
+ boyfriend = new Boyfriend(0, 0, 'bfreanim');
+ } else {
+ boyfriend = new Boyfriend(0, 0, SONG.player1);
+ }
+ startCharacterPos(boyfriend);
+ boyfriendGroup.add(boyfriend);
+
+ var camPos:FlxPoint = new FlxPoint(gf.getGraphicMidpoint().x, gf.getGraphicMidpoint().y);
+ camPos.x += gf.cameraPosition[0];
+ camPos.y += gf.cameraPosition[1];
+
+ if(dad.curCharacter.startsWith('gf')) {
+ dad.setPosition(GF_X, GF_Y);
+ gf.visible = false;
+ }
+
+ switch(curStage)
+ {
+ case 'limo':
+ resetFastCar();
+ insert(members.indexOf(gfGroup) - 1, fastCar);
+
+ case 'schoolEvil':
+ var evilTrail = new FlxTrail(dad, null, 4, 24, 0.3, 0.069); //nice
+ insert(members.indexOf(dadGroup) - 1, evilTrail);
+ }
+
+ var file:String = Paths.json(songName + '/dialogue'); //Checks for json/Psych Engine dialogue
+ if (OpenFlAssets.exists(file)) {
+ dialogueJson = DialogueBoxPsych.parseDialogue(file);
+ }
+
+ var file:String = Paths.txt(songName + '/' + songName + 'Dialogue'); //Checks for vanilla/Senpai dialogue
+ if (OpenFlAssets.exists(file)) {
+ dialogue = CoolUtil.coolTextFile(file);
+ }
+ var doof:DialogueBox = new DialogueBox(false, dialogue);
+ // doof.x += 70;
+ // doof.y = FlxG.height * 0.5;
+ doof.scrollFactor.set();
+ doof.finishThing = startCountdown;
+ doof.nextDialogueThing = startNextDialogue;
+ doof.skipDialogueThing = skipDialogue;
+
+ Conductor.songPosition = -5000;
+
+ strumLine = new FlxSprite(ClientPrefs.middleScroll ? STRUM_X_MIDDLESCROLL : STRUM_X, 50).makeGraphic(FlxG.width, 10);
+ if(ClientPrefs.downScroll) strumLine.y = FlxG.height - 150;
+ strumLine.scrollFactor.set();
+
+ timeTxt = new FlxText(STRUM_X + (FlxG.width / 2) - 248, 20, 400, "", 32);
+ timeTxt.setFormat(Paths.font("vcr.ttf"), 32, FlxColor.WHITE, CENTER, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK);
+ timeTxt.scrollFactor.set();
+ timeTxt.alpha = 0;
+ timeTxt.borderSize = 2;
+ timeTxt.visible = !ClientPrefs.hideTime;
+ if(ClientPrefs.downScroll) timeTxt.y = FlxG.height - 45;
+
+ timeBarBG = new AttachedSprite('timeBar');
+ timeBarBG.x = timeTxt.x;
+ timeBarBG.y = timeTxt.y + (timeTxt.height / 4);
+ timeBarBG.scrollFactor.set();
+ timeBarBG.alpha = 0;
+ timeBarBG.visible = !ClientPrefs.hideTime;
+ timeBarBG.color = FlxColor.BLACK;
+ timeBarBG.xAdd = -4;
+ timeBarBG.yAdd = -4;
+ add(timeBarBG);
+
+ timeBar = new FlxBar(timeBarBG.x + 4, timeBarBG.y + 4, LEFT_TO_RIGHT, Std.int(timeBarBG.width - 8), Std.int(timeBarBG.height - 8), this,
+ 'songPercent', 0, 1);
+ timeBar.scrollFactor.set();
+ timeBar.createFilledBar(0xFF000000, 0xFFFFFFFF);
+ timeBar.numDivisions = 800; //How much lag this causes?? Should i tone it down to idk, 400 or 200?
+ timeBar.alpha = 0;
+ timeBar.visible = !ClientPrefs.hideTime;
+ add(timeBar);
+ add(timeTxt);
+ timeBarBG.sprTracker = timeBar;
+
+ strumLineNotes = new FlxTypedGroup();
+ add(strumLineNotes);
+ add(grpNoteSplashes);
+
+ var splash:NoteSplash = new NoteSplash(100, 100, 0);
+ grpNoteSplashes.add(splash);
+ splash.alpha = 0.0;
+
+ opponentStrums = new FlxTypedGroup();
+ playerStrums = new FlxTypedGroup();
+
+ // startCountdown();
+
+ generateSong(SONG.song);
+ #if LUA_ALLOWED
+ for (notetype in noteTypeMap.keys()) {
+ var luaToLoad:String = 'custom_notetypes/' + notetype + '.lua';
+ luaToLoad = Paths.getPreloadPath(luaToLoad);
+ if(OpenFlAssets.exists(luaToLoad)) {
+ luaArray.push(new FunkinLua(Asset2File.getPath(luaToLoad)));
+ }
+ }
+ for (event in eventPushedMap.keys()) {
+ var luaToLoad:String = 'custom_events/' + event + '.lua';
+ luaToLoad = Paths.getPreloadPath(luaToLoad);
+ if(OpenFlAssets.exists(luaToLoad)) {
+ luaArray.push(new FunkinLua(Asset2File.getPath(luaToLoad)));
+ }
+ }
+ #end
+ noteTypeMap.clear();
+ noteTypeMap = null;
+ eventPushedMap.clear();
+ eventPushedMap = null;
+
+ // After all characters being loaded, it makes then invisible 0.01s later so that the player won't freeze when you change characters
+ // add(strumLine);
+
+ camFollow = new FlxPoint();
+ camFollowPos = new FlxObject(0, 0, 1, 1);
+
+ snapCamFollowToPos(camPos.x, camPos.y);
+ if (prevCamFollow != null)
+ {
+ camFollow = prevCamFollow;
+ prevCamFollow = null;
+ }
+ if (prevCamFollowPos != null)
+ {
+ camFollowPos = prevCamFollowPos;
+ prevCamFollowPos = null;
+ }
+ add(camFollowPos);
+
+ FlxG.camera.follow(camFollowPos, LOCKON, 1);
+ // FlxG.camera.setScrollBounds(0, FlxG.width, 0, FlxG.height);
+ FlxG.camera.zoom = defaultCamZoom;
+ FlxG.camera.focusOn(camFollow);
+
+ FlxG.worldBounds.set(0, 0, FlxG.width, FlxG.height);
+
+ FlxG.fixedTimestep = false;
+ moveCameraSection(0);
+
+ var creditTxt:FlxText = new FlxText(4,healthBarBG.y + 20,0,("Port by (EmirPlays) "), 24);
+ creditTxt.scrollFactor.set();
+ creditTxt.setFormat("VCR OSD Mono", 24, FlxColor.WHITE, LEFT, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK);
+ creditTxt.borderColor = FlxColor.BLACK;
+ creditTxt.borderSize = 3;
+ creditTxt.borderStyle = FlxTextBorderStyle.OUTLINE;
+ add(creditTxt);
+
+ healthBarBG = new AttachedSprite('healthBar');
+ healthBarBG.y = FlxG.height * 0.89;
+ healthBarBG.screenCenter(X);
+ healthBarBG.scrollFactor.set();
+ healthBarBG.visible = !ClientPrefs.hideHud;
+ healthBarBG.xAdd = -4;
+ healthBarBG.yAdd = -4;
+ add(healthBarBG);
+ if(ClientPrefs.downScroll) healthBarBG.y = 0.11 * FlxG.height;
+
+ healthBar = new FlxBar(healthBarBG.x + 4, healthBarBG.y + 4, RIGHT_TO_LEFT, Std.int(healthBarBG.width - 8), Std.int(healthBarBG.height - 8), this,
+ 'health', 0, 2);
+ healthBar.scrollFactor.set();
+ // healthBar
+ healthBar.visible = !ClientPrefs.hideHud;
+ add(healthBar);
+ healthBarBG.sprTracker = healthBar;
+
+ iconP1 = new HealthIcon(boyfriend.healthIcon, true);
+ iconP1.y = healthBar.y - (iconP1.height / 2);
+ iconP1.visible = !ClientPrefs.hideHud;
+ add(iconP1);
+
+ iconP2 = new HealthIcon(dad.healthIcon, false);
+ iconP2.y = healthBar.y - (iconP2.height / 2);
+ iconP2.visible = !ClientPrefs.hideHud;
+ add(iconP2);
+ reloadHealthBarColors();
+
+ scoreTxt = new FlxText(0, healthBarBG.y + 36, FlxG.width, "", 20);
+ scoreTxt.setFormat(Paths.font("vcr.ttf"), 20, FlxColor.WHITE, CENTER, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK);
+ scoreTxt.scrollFactor.set();
+ scoreTxt.borderSize = 1.25;
+ scoreTxt.visible = !ClientPrefs.hideHud;
+ add(scoreTxt);
+
+ botplayTxt = new FlxText(400, timeBarBG.y + 55, FlxG.width - 800, "BOTPLAY", 32);
+ botplayTxt.setFormat(Paths.font("vcr.ttf"), 32, FlxColor.WHITE, CENTER, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK);
+ botplayTxt.scrollFactor.set();
+ botplayTxt.borderSize = 1.25;
+ botplayTxt.visible = cpuControlled;
+ add(botplayTxt);
+ if(ClientPrefs.downScroll) {
+ botplayTxt.y = timeBarBG.y - 78;
+ }
+
+ strumLineNotes.cameras = [camHUD];
+ grpNoteSplashes.cameras = [camHUD];
+ notes.cameras = [camHUD];
+ healthBar.cameras = [camHUD];
+ healthBarBG.cameras = [camHUD];
+ iconP1.cameras = [camHUD];
+ iconP2.cameras = [camHUD];
+ scoreTxt.cameras = [camHUD];
+ botplayTxt.cameras = [camHUD];
+ timeBar.cameras = [camHUD];
+ timeBarBG.cameras = [camHUD];
+ timeTxt.cameras = [camHUD];
+ doof.cameras = [camHUD];
+
+ #if mobileC
+ mcontrols = new Mobilecontrols();
+ switch (mcontrols.mode)
+ {
+ case VIRTUALPAD_RIGHT | VIRTUALPAD_LEFT | VIRTUALPAD_CUSTOM:
+ controls.setVirtualPad(mcontrols._virtualPad, FULL, NONE);
+ case HITBOX:
+ controls.setHitBox(mcontrols._hitbox);
+ default:
+ }
+ trackedinputs = controls.trackedinputs;
+ controls.trackedinputs = [];
+ var camcontrol = new FlxCamera();
+ FlxG.cameras.add(camcontrol);
+ camcontrol.bgColor.alpha = 0;
+ mcontrols.cameras = [camcontrol];
+
+ mcontrols.visible = false;
+
+ add(mcontrols);
+ #end
+
+
+ // if (SONG.song == 'South')
+ // FlxG.camera.alpha = 0.7;
+ // UI_camera.zoom = 1;
+
+ // cameras = [FlxG.cameras.list[1]];
+ startingSong = true;
+ updateTime = true;
+
+ #if (LUA_ALLOWED)
+ var doPush:Bool = false;
+ var luaFile:String = 'data/' + Paths.formatToSongPath(SONG.song) + '/script.lua';
+ if(FileSystem.exists(luaFile)) {
+ luaFile = Paths.getPreloadPath(luaFile);
+ doPush = true;
+ } else {
+ luaFile = Paths.getPreloadPath(luaFile);
+ if(FileSystem.exists(luaFile)) {
+ doPush = true;
+ }
+ }
+
+ if(doPush)
+ luaArray.push(new FunkinLua(luaFile));
+ #end
+
+ var daSong:String = Paths.formatToSongPath(curSong);
+ if (isStoryMode && !seenCutscene)
+ {
+ switch (daSong)
+ {
+ case "monster":
+ var whiteScreen:FlxSprite = new FlxSprite(0, 0).makeGraphic(Std.int(FlxG.width * 2), Std.int(FlxG.height * 2), FlxColor.WHITE);
+ add(whiteScreen);
+ whiteScreen.scrollFactor.set();
+ whiteScreen.blend = ADD;
+ camHUD.visible = false;
+ snapCamFollowToPos(dad.getMidpoint().x + 150, dad.getMidpoint().y - 100);
+ inCutscene = true;
+
+ FlxTween.tween(whiteScreen, {alpha: 0}, 1, {
+ startDelay: 0.1,
+ ease: FlxEase.linear,
+ onComplete: function(twn:FlxTween)
+ {
+ camHUD.visible = true;
+ remove(whiteScreen);
+ startCountdown();
+ }
+ });
+ FlxG.sound.play(Paths.soundRandom('thunder_', 1, 2));
+ gf.playAnim('scared', true);
+ boyfriend.playAnim('scared', true);
+
+ case "winter-horrorland":
+ var blackScreen:FlxSprite = new FlxSprite().makeGraphic(Std.int(FlxG.width * 2), Std.int(FlxG.height * 2), FlxColor.BLACK);
+ add(blackScreen);
+ blackScreen.scrollFactor.set();
+ camHUD.visible = false;
+ inCutscene = true;
+
+ FlxTween.tween(blackScreen, {alpha: 0}, 0.7, {
+ ease: FlxEase.linear,
+ onComplete: function(twn:FlxTween) {
+ remove(blackScreen);
+ }
+ });
+ FlxG.sound.play(Paths.sound('Lights_Turn_On'));
+ snapCamFollowToPos(400, -2050);
+ FlxG.camera.focusOn(camFollow);
+ FlxG.camera.zoom = 1.5;
+
+ new FlxTimer().start(0.8, function(tmr:FlxTimer)
+ {
+ camHUD.visible = true;
+ remove(blackScreen);
+ FlxTween.tween(FlxG.camera, {zoom: defaultCamZoom}, 2.5, {
+ ease: FlxEase.quadInOut,
+ onComplete: function(twn:FlxTween)
+ {
+ startCountdown();
+ }
+ });
+ });
+ case 'senpai' | 'roses' | 'thorns':
+ if(daSong == 'roses') FlxG.sound.play(Paths.sound('ANGRY'));
+ schoolIntro(doof);
+
+ default:
+ startDialogue(dialogueJson);
+ }
+ seenCutscene = true;
+ } else {
+ startCountdown();
+ }
+ RecalculateRating();
+
+ //PRECACHING MISS SOUNDS BECAUSE I THINK THEY CAN LAG PEOPLE AND FUCK THEM UP IDK HOW HAXE WORKS
+ CoolUtil.precacheSound('missnote1');
+ CoolUtil.precacheSound('missnote2');
+ CoolUtil.precacheSound('missnote3');
+ if (ClientPrefs.violence){CoolUtil.precacheSound('osu');}
+
+ #if desktop
+ // Updating Discord Rich Presence.
+ DiscordClient.changePresence(detailsText, SONG.song + " (" + storyDifficultyText + ")", iconP2.getCharacter());
+ #end
+
+
+ callOnLuas('onCreatePost', []);
+
+
+ super.create();
+ }
+
+ public function addTextToDebug(text:String) {
+ #if LUA_ALLOWED
+ luaDebugGroup.forEachAlive(function(spr:DebugLuaText) {
+ spr.y += 20;
+ });
+ luaDebugGroup.add(new DebugLuaText(text, luaDebugGroup));
+ #end
+ }
+
+ public function reloadHealthBarColors() {
+ healthBar.createFilledBar(FlxColor.fromRGB(dad.healthColorArray[0], dad.healthColorArray[1], dad.healthColorArray[2]),
+ FlxColor.fromRGB(boyfriend.healthColorArray[0], boyfriend.healthColorArray[1], boyfriend.healthColorArray[2]));
+ healthBar.updateBar();
+ }
+
+ public function addCharacterToList(newCharacter:String, type:Int) {
+ switch(type) {
+ case 0:
+ if(!boyfriendMap.exists(newCharacter)) {
+ var newBoyfriend:Boyfriend = new Boyfriend(0, 0, newCharacter);
+ boyfriendMap.set(newCharacter, newBoyfriend);
+ boyfriendGroup.add(newBoyfriend);
+ startCharacterPos(newBoyfriend);
+ newBoyfriend.alpha = 0.00001;
+ newBoyfriend.alreadyLoaded = false;
+ }
+
+ case 1:
+ if(!dadMap.exists(newCharacter)) {
+ var newDad:Character = new Character(0, 0, newCharacter);
+ dadMap.set(newCharacter, newDad);
+ dadGroup.add(newDad);
+ startCharacterPos(newDad, true);
+ newDad.alpha = 0.00001;
+ newDad.alreadyLoaded = false;
+ }
+
+ case 2:
+ if(!gfMap.exists(newCharacter)) {
+ var newGf:Character = new Character(0, 0, newCharacter);
+ newGf.scrollFactor.set(0.95, 0.95);
+ gfMap.set(newCharacter, newGf);
+ gfGroup.add(newGf);
+ startCharacterPos(newGf);
+ newGf.alpha = 0.00001;
+ newGf.alreadyLoaded = false;
+ }
+ }
+ }
+ function startCharacterPos(char:Character, ?gfCheck:Bool = false) {
+ if(gfCheck && char.curCharacter.startsWith('gf')) { //IF DAD IS GIRLFRIEND, HE GOES TO HER POSITION
+ char.setPosition(GF_X, GF_Y);
+ char.scrollFactor.set(0.95, 0.95);
+ }
+ char.x += char.positionArray[0];
+ char.y += char.positionArray[1];
+ }
+
+ public function startVideo(name:String):Void {
+ #if VIDEOS_ALLOWED
+ var foundFile:Bool = false;
+ var fileName:String = #if MODS_ALLOWED Paths.modFolders('videos/' + name + '.' + Paths.VIDEO_EXT); #else ''; #end
+ #if sys
+ if(FileSystem.exists(fileName)) {
+ foundFile = true;
+ }
+ #end
+
+ if(!foundFile) {
+ fileName = Paths.video(name);
+ #if sys
+ if(FileSystem.exists(fileName)) {
+ #else
+ if(OpenFlAssets.exists(fileName)) {
+ #end
+ foundFile = true;
+ }
+ }
+
+ if(foundFile) {
+ inCutscene = true;
+ var bg = new FlxSprite(-FlxG.width, -FlxG.height).makeGraphic(FlxG.width * 3, FlxG.height * 3, FlxColor.BLACK);
+ bg.scrollFactor.set();
+ bg.cameras = [camHUD];
+ add(bg);
+
+ (new FlxVideo(fileName)).finishCallback = function() {
+ remove(bg);
+ if(endingSong) {
+ endSong();
+ } else {
+ startCountdown();
+ }
+ }
+ return;
+ } else {
+ FlxG.log.warn('Couldnt find video file: ' + fileName);
+ }
+ #end
+ if(endingSong) {
+ endSong();
+ } else {
+ startCountdown();
+ }
+ }
+
+ var dialogueCount:Int = 0;
+ //You don't have to add a song, just saying. You can just do "startDialogue(dialogueJson);" and it should work
+ public function startDialogue(dialogueFile:DialogueFile, ?song:String = null):Void
+ {
+ // TO DO: Make this more flexible, maybe?
+ if(ClientPrefs.idkwhy && dialogueFile.dialogue.length > 1) { //Assim vai bugar menos com os dialogos da week 6
+ inCutscene = true;
+ CoolUtil.precacheSound('dialogue');
+ CoolUtil.precacheSound('dialogueClose');
+ var doof:DialogueBoxPsych = new DialogueBoxPsych(dialogueFile, song);
+ doof.scrollFactor.set();
+ if(endingSong) {
+ doof.finishThing = endSong;
+ } else {
+ doof.finishThing = startCountdown;
+ }
+ doof.nextDialogueThing = startNextDialogue;
+ doof.skipDialogueThing = skipDialogue;
+ doof.cameras = [camHUD];
+ add(doof);
+ } else {
+ if(endingSong) {
+ endSong();
+ } else {
+ startCountdown();
+ }
+ }
+ }
+
+ function schoolIntro(?dialogueBox:DialogueBox):Void
+ {
+ inCutscene = true;
+ var black:FlxSprite = new FlxSprite(-100, -100).makeGraphic(FlxG.width * 2, FlxG.height * 2, FlxColor.BLACK);
+ black.scrollFactor.set();
+ add(black);
+
+ var red:FlxSprite = new FlxSprite(-100, -100).makeGraphic(FlxG.width * 2, FlxG.height * 2, 0xFFff1b31);
+ red.scrollFactor.set();
+
+ var senpaiEvil:FlxSprite = new FlxSprite();
+ senpaiEvil.frames = Paths.getSparrowAtlas('weeb/senpaiCrazy');
+ senpaiEvil.animation.addByPrefix('idle', 'Senpai Pre Explosion', 24, false);
+ senpaiEvil.setGraphicSize(Std.int(senpaiEvil.width * 6));
+ senpaiEvil.scrollFactor.set();
+ senpaiEvil.updateHitbox();
+ senpaiEvil.screenCenter();
+ senpaiEvil.x += 300;
+
+ var songName:String = Paths.formatToSongPath(SONG.song);
+ if (songName == 'roses' || songName == 'thorns')
+ {
+ remove(black);
+
+ if (songName == 'thorns')
+ {
+ add(red);
+ camHUD.visible = false;
+ }
+ }
+
+ new FlxTimer().start(0.3, function(tmr:FlxTimer)
+ {
+ black.alpha -= 0.15;
+
+ if (black.alpha > 0)
+ {
+ tmr.reset(0.3);
+ }
+ else
+ {
+ if (dialogueBox != null)
+ {
+ if (Paths.formatToSongPath(SONG.song) == 'thorns')
+ {
+ add(senpaiEvil);
+ senpaiEvil.alpha = 0;
+ new FlxTimer().start(0.3, function(swagTimer:FlxTimer)
+ {
+ senpaiEvil.alpha += 0.15;
+ if (senpaiEvil.alpha < 1)
+ {
+ swagTimer.reset();
+ }
+ else
+ {
+ senpaiEvil.animation.play('idle');
+ FlxG.sound.play(Paths.sound('Senpai_Dies'), 1, false, null, true, function()
+ {
+ remove(senpaiEvil);
+ remove(red);
+ FlxG.camera.fade(FlxColor.WHITE, 0.01, true, function()
+ {
+ add(dialogueBox);
+ camHUD.visible = true;
+ }, true);
+ });
+ new FlxTimer().start(3.2, function(deadTime:FlxTimer)
+ {
+ FlxG.camera.fade(FlxColor.WHITE, 1.6, false);
+ });
+ }
+ });
+ }
+ else
+ {
+ add(dialogueBox);
+ }
+ }
+ else
+ startCountdown();
+
+ remove(black);
+ }
+ });
+ }
+
+ var startTimer:FlxTimer;
+ var finishTimer:FlxTimer = null;
+
+ // For being able to mess with the sprites on Lua
+ public var countDownSprites:Array = [];
+
+ public function startCountdown():Void
+ {
+
+ #if mobileC
+ mcontrols.visible = true;
+ #end
+
+ if(startedCountdown) {
+ callOnLuas('onStartCountdown', []);
+ return;
+ }
+
+ inCutscene = false;
+ var ret:Dynamic = callOnLuas('onStartCountdown', []);
+ if(ret != FunkinLua.Function_Stop) {
+ generateStaticArrows(0);
+ generateStaticArrows(1);
+ for (i in 0...playerStrums.length) {
+ setOnLuas('defaultPlayerStrumX' + i, playerStrums.members[i].x);
+ setOnLuas('defaultPlayerStrumY' + i, playerStrums.members[i].y);
+ }
+ for (i in 0...opponentStrums.length) {
+ setOnLuas('defaultOpponentStrumX' + i, opponentStrums.members[i].x);
+ setOnLuas('defaultOpponentStrumY' + i, opponentStrums.members[i].y);
+ if(ClientPrefs.middleScroll) opponentStrums.members[i].visible = false;
+ }
+
+ startedCountdown = true;
+ Conductor.songPosition = 0;
+ Conductor.songPosition -= Conductor.crochet * 5;
+ setOnLuas('startedCountdown', true);
+
+ var swagCounter:Int = 0;
+
+ startTimer = new FlxTimer().start(Conductor.crochet / 1000, function(tmr:FlxTimer)
+ {
+ if (tmr.loopsLeft % gfSpeed == 0 && !gf.stunned && gf.animation.curAnim.name != null && !gf.animation.curAnim.name.startsWith("sing"))
+ {
+ gf.dance();
+ }
+ if(tmr.loopsLeft % 2 == 0) {
+ if (boyfriend.animation.curAnim != null && !boyfriend.animation.curAnim.name.startsWith('sing'))
+ {
+ boyfriend.dance();
+ }
+ if (dad.animation.curAnim != null && !dad.animation.curAnim.name.startsWith('sing') && !dad.stunned)
+ {
+ dad.dance();
+ }
+ }
+ else if(dad.danceIdle && dad.animation.curAnim != null && !dad.stunned && !dad.curCharacter.startsWith('gf') && !dad.animation.curAnim.name.startsWith("sing"))
+ {
+ dad.dance();
+ }
+
+ var introAssets:Map> = new Map>();
+ introAssets.set('default', ['ready', 'set', 'go']);
+ introAssets.set('pixel', ['pixelUI/ready-pixel', 'pixelUI/set-pixel', 'pixelUI/date-pixel']);
+
+ var introAlts:Array = introAssets.get('default');
+ var antialias:Bool = ClientPrefs.globalAntialiasing;
+ if(isPixelStage) {
+ introAlts = introAssets.get('pixel');
+ antialias = false;
+ }
+
+ // head bopping for bg characters on Mall
+ if(curStage == 'mall') {
+ if(!ClientPrefs.lowQuality)
+ upperBoppers.dance(true);
+
+ bottomBoppers.dance(true);
+ santa.dance(true);
+ }
+
+ switch (swagCounter)
+ {
+ case 0:
+ FlxG.sound.play(Paths.sound('intro3' + introSoundsSuffix), 0.6);
+ case 1:
+ var ready:FlxSprite = new FlxSprite().loadGraphic(Paths.image(introAlts[0]));
+ ready.scrollFactor.set();
+ ready.updateHitbox();
+
+ if (PlayState.isPixelStage)
+ ready.setGraphicSize(Std.int(ready.width * daPixelZoom));
+
+ ready.screenCenter();
+ ready.antialiasing = antialias;
+ add(ready);
+ countDownSprites.push(ready);
+ FlxTween.tween(ready, {y: ready.y += 100, alpha: 0}, Conductor.crochet / 1000, {
+ ease: FlxEase.cubeInOut,
+ onComplete: function(twn:FlxTween)
+ {
+ countDownSprites.remove(ready);
+ remove(ready);
+ ready.destroy();
+ }
+ });
+ FlxG.sound.play(Paths.sound('intro2' + introSoundsSuffix), 0.6);
+ case 2:
+ var set:FlxSprite = new FlxSprite().loadGraphic(Paths.image(introAlts[1]));
+ set.scrollFactor.set();
+
+ if (PlayState.isPixelStage)
+ set.setGraphicSize(Std.int(set.width * daPixelZoom));
+
+ set.screenCenter();
+ set.antialiasing = antialias;
+ add(set);
+ countDownSprites.push(set);
+ FlxTween.tween(set, {y: set.y += 100, alpha: 0}, Conductor.crochet / 1000, {
+ ease: FlxEase.cubeInOut,
+ onComplete: function(twn:FlxTween)
+ {
+ countDownSprites.remove(set);
+ remove(set);
+ set.destroy();
+ }
+ });
+ FlxG.sound.play(Paths.sound('intro1' + introSoundsSuffix), 0.6);
+ case 3:
+ var go:FlxSprite = new FlxSprite().loadGraphic(Paths.image(introAlts[2]));
+ go.scrollFactor.set();
+
+ if (PlayState.isPixelStage)
+ go.setGraphicSize(Std.int(go.width * daPixelZoom));
+
+ go.updateHitbox();
+
+ go.screenCenter();
+ go.antialiasing = antialias;
+ add(go);
+ countDownSprites.push(go);
+ FlxTween.tween(go, {y: go.y += 100, alpha: 0}, Conductor.crochet / 1000, {
+ ease: FlxEase.cubeInOut,
+ onComplete: function(twn:FlxTween)
+ {
+ countDownSprites.remove(go);
+ remove(go);
+ go.destroy();
+ }
+ });
+ FlxG.sound.play(Paths.sound('introGo' + introSoundsSuffix), 0.6);
+ case 4:
+ }
+
+ notes.forEachAlive(function(note:Note) {
+ note.copyAlpha = false;
+ note.alpha = 1 * note.multAlpha;
+ });
+ callOnLuas('onCountdownTick', [swagCounter]);
+
+ if (generatedMusic)
+ {
+ notes.sort(FlxSort.byY, ClientPrefs.downScroll ? FlxSort.ASCENDING : FlxSort.DESCENDING);
+ }
+
+ swagCounter += 1;
+ // generateSong('fresh');
+ }, 5);
+ }
+ }
+
+ function doFlash():Void
+ {
+ var flashValue:Int = 1;
+ if (ClientPrefs.flashing)
+ FlxG.camera.flash(FlxColor.WHITE, flashValue);
+ else
+ FlxG.camera.flash(FlxColor.BLACK, flashValue);
+ }
+
+ function startNextDialogue() {
+ dialogueCount++;
+ callOnLuas('onNextDialogue', [dialogueCount]);
+ }
+
+ function skipDialogue() {
+ callOnLuas('onSkipDialogue', [dialogueCount]);
+ }
+
+ var previousFrameTime:Int = 0;
+ var lastReportedPlayheadPosition:Int = 0;
+ var songTime:Float = 0;
+
+ function startSong():Void
+ {
+ startingSong = false;
+
+ previousFrameTime = FlxG.game.ticks;
+ lastReportedPlayheadPosition = 0;
+
+ FlxG.sound.playMusic(Paths.inst(PlayState.SONG.song), 1, false);
+ FlxG.sound.music.onComplete = finishSong;
+ vocals.play();
+
+ if(paused) {
+ //trace('Oopsie doopsie! Paused sound');
+ FlxG.sound.music.pause();
+ vocals.pause();
+ }
+
+ // Song duration in a float, useful for the time left feature
+ songLength = FlxG.sound.music.length;
+ FlxTween.tween(timeBar, {alpha: 1}, 0.5, {ease: FlxEase.circOut});
+ FlxTween.tween(timeTxt, {alpha: 1}, 0.5, {ease: FlxEase.circOut});
+
+ #if desktop
+ // Updating Discord Rich Presence (with Time Left)
+ DiscordClient.changePresence(detailsText, SONG.song + " (" + storyDifficultyText + ")", iconP2.getCharacter(), true, songLength);
+ #end
+ setOnLuas('songLength', songLength);
+ callOnLuas('onSongStart', []);
+ }
+
+ var debugNum:Int = 0;
+ private var noteTypeMap:Map = new Map();
+ private var eventPushedMap:Map = new Map();
+
+ private function generateSong(dataPath:String):Void
+ {
+ // FlxG.log.add(ChartParser.parse());
+
+ songSpeed = SONG.speed;
+
+ var songData = SONG;
+ Conductor.changeBPM(songData.bpm);
+
+ curSong = songData.song;
+
+ if (SONG.needsVoices)
+ vocals = new FlxSound().loadEmbedded(Paths.voices(PlayState.SONG.song));
+ else
+ vocals = new FlxSound();
+
+ FlxG.sound.list.add(vocals);
+ FlxG.sound.list.add(new FlxSound().loadEmbedded(Paths.inst(PlayState.SONG.song)));
+
+ notes = new FlxTypedGroup();
+ add(notes);
+
+ var noteData:Array;
+
+ // NEW SHIT
+ noteData = songData.notes;
+
+ var playerCounter:Int = 0;
+
+ var daBeats:Int = 0; // Not exactly representative of 'daBeats' lol, just how much it has looped
+
+ var songName:String = Paths.formatToSongPath(SONG.song);
+ var file:String = Paths.json(songName + '/events');
+ #if desktop
+ if (FileSystem.exists(Paths.modsJson(songName + '/events')) || FileSystem.exists(file)) {
+ #else
+ if (OpenFlAssets.exists(file)) {
+ #end
+ var eventsData:Array = Song.loadFromJson('events', songName).notes;
+ for (section in eventsData)
+ {
+ for (songNotes in section.sectionNotes)
+ {
+ if(songNotes[1] < 0) {
+ eventNotes.push([songNotes[0], songNotes[1], songNotes[2], songNotes[3], songNotes[4]]);
+ eventPushed(songNotes);
+ }
+ }
+ }
+ }
+
+ for (section in noteData)
+ {
+ for (songNotes in section.sectionNotes)
+ {
+ if(songNotes[1] > -1) { //Real notes
+ var daStrumTime:Float = songNotes[0];
+ var daNoteData:Int = Std.int(songNotes[1] % 4);
+
+ var gottaHitNote:Bool = section.mustHitSection;
+
+ if (songNotes[1] > 3)
+ {
+ gottaHitNote = !section.mustHitSection;
+ }
+
+ var oldNote:Note;
+ if (unspawnNotes.length > 0)
+ oldNote = unspawnNotes[Std.int(unspawnNotes.length - 1)];
+ else
+ oldNote = null;
+
+ var swagNote:Note = new Note(daStrumTime, daNoteData, oldNote);
+ swagNote.mustPress = gottaHitNote;
+ swagNote.sustainLength = songNotes[2];
+ swagNote.noteType = songNotes[3];
+ if(!Std.isOfType(songNotes[3], String)) swagNote.noteType = editors.ChartingState.noteTypeList[songNotes[3]]; //Backward compatibility + compatibility with Week 7 charts
+
+
+ if (section.gfSection){
+ trace("got gf section");
+ if (songNotes[3] == null || songNotes[3] == ''|| songNotes[3].length ==0){
+ swagNote.noteType = 'GF Sing';
+ trace("got gf notes");
+ }
+ }
+
+ swagNote.scrollFactor.set();
+
+ var susLength:Float = swagNote.sustainLength;
+
+ susLength = susLength / Conductor.stepCrochet;
+ unspawnNotes.push(swagNote);
+
+ var floorSus:Int = Math.floor(susLength);
+ if(floorSus > 0) {
+ for (susNote in 0...floorSus+1)
+ {
+ oldNote = unspawnNotes[Std.int(unspawnNotes.length - 1)];
+
+ var sustainNote:Note = new Note(daStrumTime + (Conductor.stepCrochet * susNote) + (Conductor.stepCrochet / FlxMath.roundDecimal(songSpeed, 2)), daNoteData, oldNote, true);
+ sustainNote.mustPress = gottaHitNote;
+ sustainNote.noteType = swagNote.noteType;
+ sustainNote.scrollFactor.set();
+ unspawnNotes.push(sustainNote);
+
+ if (sustainNote.mustPress)
+ {
+ sustainNote.x += FlxG.width / 2; // general offset
+ }
+ }
+ }
+
+ if (swagNote.mustPress)
+ {
+ swagNote.x += FlxG.width / 2; // general offset
+ }
+ else {}
+
+ if(!noteTypeMap.exists(swagNote.noteType)) {
+ noteTypeMap.set(swagNote.noteType, true);
+ }
+ } else { //Event Notes
+ eventNotes.push([songNotes[0], songNotes[1], songNotes[2], songNotes[3], songNotes[4]]);
+ eventPushed(songNotes);
+ }
+ }
+ daBeats += 1;
+ }
+
+ // trace(unspawnNotes.length);
+ // playerCounter += 1;
+
+ unspawnNotes.sort(sortByShit);
+ if(eventNotes.length > 1) { //No need to sort if there's a single one or none at all
+ eventNotes.sort(sortByTime);
+ }
+ checkEventNote();
+ generatedMusic = true;
+ }
+
+ function eventPushed(event:Array) {
+ switch(event[2]) {
+ case 'Change Character':
+ var charType:Int = 0;
+ switch(event[3].toLowerCase()) {
+ case 'gf' | 'girlfriend':
+ charType = 2;
+ case 'dad' | 'opponent':
+ charType = 1;
+ default:
+ charType = Std.parseInt(event[3]);
+ if(Math.isNaN(charType)) charType = 0;
+ }
+
+ var newCharacter:String = event[4];
+ addCharacterToList(newCharacter, charType);
+ }
+
+ if(!eventPushedMap.exists(event[2])) {
+ eventPushedMap.set(event[2], true);
+ }
+ }
+
+ function eventNoteEarlyTrigger(event:Array):Float {
+ var returnedValue:Float = callOnLuas('eventEarlyTrigger', [event[2]]);
+ if(returnedValue != 0) {
+ return returnedValue;
+ }
+
+ switch(event[2]) {
+ case 'Kill Henchmen': //Better timing so that the kill sound matches the beat intended
+ return 280; //Plays 280ms before the actual position
+ }
+ return 0;
+ }
+
+ function sortByShit(Obj1:Note, Obj2:Note):Int
+ {
+ return FlxSort.byValues(FlxSort.ASCENDING, Obj1.strumTime, Obj2.strumTime);
+ }
+
+ function sortByTime(Obj1:Array, Obj2:Array):Int
+ {
+ var earlyTime1:Float = eventNoteEarlyTrigger(Obj1);
+ var earlyTime2:Float = eventNoteEarlyTrigger(Obj2);
+ return FlxSort.byValues(FlxSort.ASCENDING, Obj1[0] - earlyTime1, Obj2[0] - earlyTime2);
+ }
+
+ private function generateStaticArrows(player:Int):Void
+ {
+ for (i in 0...4)
+ {
+ // FlxG.log.add(i);
+ var babyArrow:StrumNote = new StrumNote(ClientPrefs.middleScroll ? STRUM_X_MIDDLESCROLL : STRUM_X, strumLine.y, i, player);
+ if (!isStoryMode)
+ {
+ babyArrow.y -= 10;
+ babyArrow.alpha = 0;
+ FlxTween.tween(babyArrow, {y: babyArrow.y + 10, alpha: 1}, 1, {ease: FlxEase.circOut, startDelay: 0.5 + (0.2 * i)});
+ }
+
+ if (player == 1)
+ {
+ playerStrums.add(babyArrow);
+ }
+ else
+ {
+ opponentStrums.add(babyArrow);
+ }
+
+ strumLineNotes.add(babyArrow);
+ babyArrow.postAddedToGroup();
+ }
+ }
+
+ override function openSubState(SubState:FlxSubState)
+ {
+ if (paused)
+ {
+ if (FlxG.sound.music != null)
+ {
+ FlxG.sound.music.pause();
+ vocals.pause();
+ }
+
+ if (!startTimer.finished)
+ startTimer.active = false;
+ if (finishTimer != null && !finishTimer.finished)
+ finishTimer.active = false;
+
+ if(blammedLightsBlackTween != null)
+ blammedLightsBlackTween.active = false;
+ if(phillyCityLightsEventTween != null)
+ phillyCityLightsEventTween.active = false;
+
+ if(carTimer != null) carTimer.active = false;
+
+ var chars:Array = [boyfriend, gf, dad];
+ for (i in 0...chars.length) {
+ if(chars[i].colorTween != null) {
+ chars[i].colorTween.active = false;
+ }
+ }
+
+ for (tween in modchartTweens) {
+ tween.active = false;
+ }
+ for (timer in modchartTimers) {
+ timer.active = false;
+ }
+ }
+
+ super.openSubState(SubState);
+ }
+
+ override function closeSubState()
+ {
+ if (paused)
+ {
+ if (FlxG.sound.music != null && !startingSong)
+ {
+ resyncVocals();
+ }
+
+ if (!startTimer.finished)
+ startTimer.active = true;
+ if (finishTimer != null && !finishTimer.finished)
+ finishTimer.active = true;
+
+ if(blammedLightsBlackTween != null)
+ blammedLightsBlackTween.active = true;
+ if(phillyCityLightsEventTween != null)
+ phillyCityLightsEventTween.active = true;
+
+ if(carTimer != null) carTimer.active = true;
+
+ var chars:Array = [boyfriend, gf, dad];
+ for (i in 0...chars.length) {
+ if(chars[i].colorTween != null) {
+ chars[i].colorTween.active = true;
+ }
+ }
+
+ for (tween in modchartTweens) {
+ tween.active = true;
+ }
+ for (timer in modchartTimers) {
+ timer.active = true;
+ }
+ paused = false;
+ callOnLuas('onResume', []);
+
+ #if desktop
+ if (startTimer.finished)
+ {
+ DiscordClient.changePresence(detailsText, SONG.song + " (" + storyDifficultyText + ")", iconP2.getCharacter(), true, songLength - Conductor.songPosition - ClientPrefs.noteOffset);
+ }
+ else
+ {
+ DiscordClient.changePresence(detailsText, SONG.song + " (" + storyDifficultyText + ")", iconP2.getCharacter());
+ }
+ #end
+ }
+
+ super.closeSubState();
+ }
+
+ override public function onFocus():Void
+ {
+ #if desktop
+ if (health > 0 && !paused)
+ {
+ if (Conductor.songPosition > 0.0)
+ {
+ DiscordClient.changePresence(detailsText, SONG.song + " (" + storyDifficultyText + ")", iconP2.getCharacter(), true, songLength - Conductor.songPosition - ClientPrefs.noteOffset);
+ }
+ else
+ {
+ DiscordClient.changePresence(detailsText, SONG.song + " (" + storyDifficultyText + ")", iconP2.getCharacter());
+ }
+ }
+ #end
+
+ super.onFocus();
+ }
+
+ override public function onFocusLost():Void
+ {
+ #if desktop
+ if (health > 0 && !paused)
+ {
+ DiscordClient.changePresence(detailsPausedText, SONG.song + " (" + storyDifficultyText + ")", iconP2.getCharacter());
+ }
+ #end
+
+ super.onFocusLost();
+ }
+
+ function resyncVocals():Void
+ {
+ if(finishTimer != null) return;
+
+ vocals.pause();
+
+ FlxG.sound.music.play();
+ Conductor.songPosition = FlxG.sound.music.time;
+ vocals.time = Conductor.songPosition;
+ vocals.play();
+ }
+
+ private var paused:Bool = false;
+ var startedCountdown:Bool = false;
+ var canPause:Bool = true;
+ var limoSpeed:Float = 0;
+
+ override public function update(elapsed:Float)
+ {
+ /*if (FlxG.keys.justPressed.NINE)
+ {
+ iconP1.swapOldIcon();
+ }*/
+
+ callOnLuas('onUpdate', [elapsed]);
+
+ switch (curStage)
+ {
+ case 'schoolEvil':
+ if(!ClientPrefs.lowQuality && bgGhouls.animation.curAnim.finished) {
+ bgGhouls.visible = false;
+ }
+ case 'philly':
+ if (trainMoving)
+ {
+ trainFrameTiming += elapsed;
+
+ if (trainFrameTiming >= 1 / 24)
+ {
+ updateTrainPos();
+ trainFrameTiming = 0;
+ }
+ }
+ phillyCityLights.members[curLight].alpha -= (Conductor.crochet / 1000) * FlxG.elapsed * 1.5;
+ case 'limo':
+ if(!ClientPrefs.lowQuality) {
+ grpLimoParticles.forEach(function(spr:BGSprite) {
+ if(spr.animation.curAnim.finished) {
+ spr.kill();
+ grpLimoParticles.remove(spr, true);
+ spr.destroy();
+ }
+ });
+
+ switch(limoKillingState) {
+ case 1:
+ limoMetalPole.x += 5000 * elapsed;
+ limoLight.x = limoMetalPole.x - 180;
+ limoCorpse.x = limoLight.x - 50;
+ limoCorpseTwo.x = limoLight.x + 35;
+
+ var dancers:Array = grpLimoDancers.members;
+ for (i in 0...dancers.length) {
+ if(dancers[i].x < FlxG.width * 1.5 && limoLight.x > (370 * i) + 130) {
+ switch(i) {
+ case 0 | 3:
+ if(i == 0) FlxG.sound.play(Paths.sound('dancerdeath'), 0.5);
+
+ var diffStr:String = i == 3 ? ' 2 ' : ' ';
+ var particle:BGSprite = new BGSprite('gore/noooooo', dancers[i].x + 200, dancers[i].y, 0.4, 0.4, ['hench leg spin' + diffStr + 'PINK'], false);
+ grpLimoParticles.add(particle);
+ var particle:BGSprite = new BGSprite('gore/noooooo', dancers[i].x + 160, dancers[i].y + 200, 0.4, 0.4, ['hench arm spin' + diffStr + 'PINK'], false);
+ grpLimoParticles.add(particle);
+ var particle:BGSprite = new BGSprite('gore/noooooo', dancers[i].x, dancers[i].y + 50, 0.4, 0.4, ['hench head spin' + diffStr + 'PINK'], false);
+ grpLimoParticles.add(particle);
+
+ var particle:BGSprite = new BGSprite('gore/stupidBlood', dancers[i].x - 110, dancers[i].y + 20, 0.4, 0.4, ['blood'], false);
+ particle.flipX = true;
+ particle.angle = -57.5;
+ grpLimoParticles.add(particle);
+ case 1:
+ limoCorpse.visible = true;
+ case 2:
+ limoCorpseTwo.visible = true;
+ } //Note: Nobody cares about the fifth dancer because he is mostly hidden offscreen :(
+ dancers[i].x += FlxG.width * 2;
+ }
+ }
+
+ if(limoMetalPole.x > FlxG.width * 2) {
+ resetLimoKill();
+ limoSpeed = 800;
+ limoKillingState = 2;
+ }
+
+ case 2:
+ limoSpeed -= 4000 * elapsed;
+ bgLimo.x -= limoSpeed * elapsed;
+ if(bgLimo.x > FlxG.width * 1.5) {
+ limoSpeed = 3000;
+ limoKillingState = 3;
+ }
+
+ case 3:
+ limoSpeed -= 2000 * elapsed;
+ if(limoSpeed < 1000) limoSpeed = 1000;
+
+ bgLimo.x -= limoSpeed * elapsed;
+ if(bgLimo.x < -275) {
+ limoKillingState = 4;
+ limoSpeed = 800;
+ }
+
+ case 4:
+ bgLimo.x = FlxMath.lerp(bgLimo.x, -150, CoolUtil.boundTo(elapsed * 9, 0, 1));
+ if(Math.round(bgLimo.x) == -150) {
+ bgLimo.x = -150;
+ limoKillingState = 0;
+ }
+ }
+
+ if(limoKillingState > 2) {
+ var dancers:Array = grpLimoDancers.members;
+ for (i in 0...dancers.length) {
+ dancers[i].x = (370 * i) + bgLimo.x + 280;
+ }
+ }
+ }
+ case 'mall':
+ if(heyTimer > 0) {
+ heyTimer -= elapsed;
+ if(heyTimer <= 0) {
+ bottomBoppers.dance(true);
+ heyTimer = 0;
+ }
+ }
+ }
+
+ if(!inCutscene) {
+ var lerpVal:Float = CoolUtil.boundTo(elapsed * 2.4 * cameraSpeed, 0, 1);
+ camFollowPos.setPosition(FlxMath.lerp(camFollowPos.x, camFollow.x, lerpVal), FlxMath.lerp(camFollowPos.y, camFollow.y, lerpVal));
+ if(!startingSong && !endingSong && boyfriend.animation.curAnim.name.startsWith('idle')) {
+ boyfriendIdleTime += elapsed;
+ if(boyfriendIdleTime >= 0.15) { // Kind of a mercy thing for making the achievement easier to get as it's apparently frustrating to some playerss
+ boyfriendIdled = true;
+ }
+ } else {
+ boyfriendIdleTime = 0;
+ }
+ }
+
+ super.update(elapsed);
+
+ if(ratingString == '?') {
+ scoreTxt.text = 'Score: ' + songScore + ' | Misses: ' + songMisses + ' | Rating: ' + ratingString;
+ } else {
+ scoreTxt.text = 'Score: ' + songScore + ' | Misses: ' + songMisses + ' | Rating: ' + ratingString + ' (' + Math.floor(ratingPercent * 100) + '%)';
+ }
+
+ if(cpuControlled) {
+ botplaySine += 180 * elapsed;
+ botplayTxt.alpha = 1 - Math.sin((Math.PI * botplaySine) / 180);
+ }
+ botplayTxt.visible = cpuControlled;
+
+ if (controls.PAUSE #if android || FlxG.android.justReleased.BACK #end && startedCountdown && canPause)
+ {
+ var ret:Dynamic = callOnLuas('onPause', []);
+ if(ret != FunkinLua.Function_Stop) {
+ persistentUpdate = false;
+ persistentDraw = true;
+ paused = true;
+
+ // 1 / 1000 chance for Gitaroo Man easter egg
+ /*if (FlxG.random.bool(0.1))
+ {
+ // gitaroo man easter egg
+ cancelFadeTween();
+ CustomFadeTransition.nextCamera = camOther;
+ MusicBeatState.switchState(new GitarooPause());
+ }
+ else {*/
+ if(FlxG.sound.music != null) {
+ FlxG.sound.music.pause();
+ vocals.pause();
+ }
+
+ PauseSubState.transCamera = camOther;
+ openSubState(new PauseSubState(boyfriend.getScreenPosition().x, boyfriend.getScreenPosition().y));
+ //}
+
+ #if desktop
+ DiscordClient.changePresence(detailsPausedText, SONG.song + " (" + storyDifficultyText + ")", iconP2.getCharacter());
+ #end
+ }
+ }
+
+ if (FlxG.keys.justPressed.SEVEN && !endingSong && !inCutscene)
+ {
+ persistentUpdate = false;
+ paused = true;
+ cancelFadeTween();
+ CustomFadeTransition.nextCamera = camOther;
+ MusicBeatState.switchState(new ChartingState());
+
+ #if desktop
+ DiscordClient.changePresence("Chart Editor", null, null, true);
+ #end
+ }
+
+ // FlxG.watch.addQuick('VOL', vocals.amplitudeLeft);
+ // FlxG.watch.addQuick('VOLRight', vocals.amplitudeRight);
+
+ iconP1.setGraphicSize(Std.int(FlxMath.lerp(150, iconP1.width, CoolUtil.boundTo(1 - (elapsed * 30), 0, 1))));
+ iconP2.setGraphicSize(Std.int(FlxMath.lerp(150, iconP2.width, CoolUtil.boundTo(1 - (elapsed * 30), 0, 1))));
+
+ iconP1.updateHitbox();
+ iconP2.updateHitbox();
+
+ var iconOffset:Int = 26;
+
+ iconP1.x = healthBar.x + (healthBar.width * (FlxMath.remapToRange(healthBar.percent, 0, 100, 100, 0) * 0.01) - iconOffset);
+ iconP2.x = healthBar.x + (healthBar.width * (FlxMath.remapToRange(healthBar.percent, 0, 100, 100, 0) * 0.01)) - (iconP2.width - iconOffset);
+
+ if (health > 2)
+ health = 2;
+
+ if (healthBar.percent < 20)
+ iconP1.animation.curAnim.curFrame = 1;
+ else
+ iconP1.animation.curAnim.curFrame = 0;
+
+ if (healthBar.percent > 80)
+ iconP2.animation.curAnim.curFrame = 1;
+ else
+ iconP2.animation.curAnim.curFrame = 0;
+
+ if (FlxG.keys.justPressed.EIGHT && !endingSong && !inCutscene) {
+ persistentUpdate = false;
+ paused = true;
+ cancelFadeTween();
+ CustomFadeTransition.nextCamera = camOther;
+ MusicBeatState.switchState(new CharacterEditorState(SONG.player2));
+ }
+
+ if (startingSong)
+ {
+ if (startedCountdown)
+ {
+ Conductor.songPosition += FlxG.elapsed * 1000;
+ if (Conductor.songPosition >= 0)
+ startSong();
+ }
+ }
+ else
+ {
+ Conductor.songPosition += FlxG.elapsed * 1000;
+
+ if (!paused)
+ {
+ songTime += FlxG.game.ticks - previousFrameTime;
+ previousFrameTime = FlxG.game.ticks;
+
+ // Interpolation type beat
+ if (Conductor.lastSongPos != Conductor.songPosition)
+ {
+ songTime = (songTime + Conductor.songPosition) / 2;
+ Conductor.lastSongPos = Conductor.songPosition;
+ // Conductor.songPosition += FlxG.elapsed * 1000;
+ // trace('MISSED FRAME');
+ }
+
+ if(updateTime) {
+ var curTime:Float = Conductor.songPosition - ClientPrefs.noteOffset;
+ if(curTime < 0) curTime = 0;
+ songPercent = (curTime / songLength);
+
+ var secondsTotal:Int = Math.floor((songLength - curTime) / 1000);
+ if(secondsTotal < 0) secondsTotal = 0;
+
+ timeTxt.text = FlxStringUtil.formatTime(secondsTotal, false);
+ }
+ }
+
+ // Conductor.lastSongPos = FlxG.sound.music.time;
+ }
+
+ if (camZooming)
+ {
+ FlxG.camera.zoom = FlxMath.lerp(defaultCamZoom, FlxG.camera.zoom, CoolUtil.boundTo(1 - (elapsed * 3.125), 0, 1));
+ camHUD.zoom = FlxMath.lerp(1, camHUD.zoom, CoolUtil.boundTo(1 - (elapsed * 3.125), 0, 1));
+ }
+
+ FlxG.watch.addQuick("beatShit", curBeat);
+ FlxG.watch.addQuick("stepShit", curStep);
+
+ // RESET = Quick Game Over Screen
+ if (controls.RESET && !inCutscene && !endingSong)
+ {
+ health = 0;
+ trace("RESET = True");
+ }
+ doDeathCheck();
+
+ var roundedSpeed:Float = FlxMath.roundDecimal(songSpeed, 2);
+ if (unspawnNotes[0] != null)
+ {
+ var time:Float = 1500;
+ if(roundedSpeed < 1) time /= roundedSpeed;
+
+ while (unspawnNotes.length > 0 && unspawnNotes[0].strumTime - Conductor.songPosition < time)
+ {
+ var dunceNote:Note = unspawnNotes[0];
+ notes.add(dunceNote);
+
+ var index:Int = unspawnNotes.indexOf(dunceNote);
+ unspawnNotes.splice(index, 1);
+ }
+ }
+
+ if (generatedMusic)
+ {
+ var fakeCrochet:Float = (60 / SONG.bpm) * 1000;
+ notes.forEachAlive(function(daNote:Note)
+ {
+ if(!daNote.mustPress && ClientPrefs.middleScroll)
+ {
+ daNote.active = true;
+ daNote.visible = false;
+ }
+ else if (daNote.y > FlxG.height)
+ {
+ daNote.active = false;
+ daNote.visible = false;
+ }
+ else
+ {
+ daNote.visible = true;
+ daNote.active = true;
+ }
+
+ // i am so fucking sorry for this if condition
+ var strumX:Float = 0;
+ var strumY:Float = 0;
+ var strumAngle:Float = 0;
+ var strumAlpha:Float = 0;
+ if(daNote.mustPress) {
+ strumX = playerStrums.members[daNote.noteData].x;
+ strumY = playerStrums.members[daNote.noteData].y;
+ strumAngle = playerStrums.members[daNote.noteData].angle;
+ strumAlpha = playerStrums.members[daNote.noteData].alpha;
+ } else {
+ strumX = opponentStrums.members[daNote.noteData].x;
+ strumY = opponentStrums.members[daNote.noteData].y;
+ strumAngle = opponentStrums.members[daNote.noteData].angle;
+ strumAlpha = opponentStrums.members[daNote.noteData].alpha;
+ }
+
+ strumX += daNote.offsetX;
+ strumY += daNote.offsetY;
+ strumAngle += daNote.offsetAngle;
+ strumAlpha *= daNote.multAlpha;
+ var center:Float = strumY + Note.swagWidth / 2;
+
+ if(daNote.copyX) {
+ daNote.x = strumX;
+ }
+ if(daNote.copyAngle) {
+ daNote.angle = strumAngle;
+ }
+ if(daNote.copyAlpha) {
+ daNote.alpha = strumAlpha;
+ }
+ if(daNote.copyY) {
+ if (ClientPrefs.downScroll) {
+ daNote.y = (strumY + 0.45 * (Conductor.songPosition - daNote.strumTime) * roundedSpeed);
+ if (daNote.isSustainNote) {
+ //Jesus fuck this took me so much mother fucking time AAAAAAAAAA
+ if (daNote.animation.curAnim.name.endsWith('end')) {
+ daNote.y += 10.5 * (fakeCrochet / 400) * 1.5 * roundedSpeed + (46 * (roundedSpeed - 1));
+ daNote.y -= 46 * (1 - (fakeCrochet / 600)) * roundedSpeed;
+ if(PlayState.isPixelStage) {
+ daNote.y += 8;
+ } else {
+ daNote.y -= 19;
+ }
+ }
+ daNote.y += (Note.swagWidth / 2) - (60.5 * (roundedSpeed - 1));
+ daNote.y += 27.5 * ((SONG.bpm / 100) - 1) * (roundedSpeed - 1);
+
+ if(daNote.mustPress || !daNote.ignoreNote)
+ {
+ if(daNote.y - daNote.offset.y * daNote.scale.y + daNote.height >= center
+ && (!daNote.mustPress || (daNote.wasGoodHit || (daNote.prevNote.wasGoodHit && !daNote.canBeHit))))
+ {
+ var swagRect = new FlxRect(0, 0, daNote.frameWidth, daNote.frameHeight);
+ swagRect.height = (center - daNote.y) / daNote.scale.y;
+ swagRect.y = daNote.frameHeight - swagRect.height;
+
+ daNote.clipRect = swagRect;
+ }
+ }
+ }
+ } else {
+ daNote.y = (strumY - 0.45 * (Conductor.songPosition - daNote.strumTime) * roundedSpeed);
+
+ if(daNote.mustPress || !daNote.ignoreNote)
+ {
+ if (daNote.isSustainNote
+ && daNote.y + daNote.offset.y * daNote.scale.y <= center
+ && (!daNote.mustPress || (daNote.wasGoodHit || (daNote.prevNote.wasGoodHit && !daNote.canBeHit))))
+ {
+ var swagRect = new FlxRect(0, 0, daNote.width / daNote.scale.x, daNote.height / daNote.scale.y);
+ swagRect.y = (center - daNote.y) / daNote.scale.y;
+ swagRect.height -= swagRect.y;
+
+ daNote.clipRect = swagRect;
+ }
+ }
+ }
+ }
+
+ if (!daNote.mustPress && daNote.wasGoodHit && !daNote.hitByOpponent && !daNote.ignoreNote)
+ {
+ if (Paths.formatToSongPath(SONG.song) != 'tutorial')
+ camZooming = true;
+
+ if(daNote.noteType == 'Hey!' && dad.animOffsets.exists('hey')) {
+ dad.playAnim('hey', true);
+ dad.specialAnim = true;
+ dad.heyTimer = 0.6;
+ } else if(!daNote.noAnimation) {
+ var altAnim:String = "";
+
+ if (SONG.notes[Math.floor(curStep / 16)] != null)
+ {
+ if (SONG.notes[Math.floor(curStep / 16)].altAnim || daNote.noteType == 'Alt Animation') {
+ altAnim = '-alt';
+ }
+ }
+
+ var char:Character = dad;
+ var animToPlay:String = singAnimations[Std.int(Math.abs(daNote.noteData))] + altAnim;
+ if(isGF) {
+ char = gf;
+ }
+ char.playAnim(animToPlay, true);
+ char.holdTimer = 0;
+ if (isDad) {
+ dad.playAnim(animToPlay + altAnim, true);
+ dad.holdTimer = 0;
+ }
+ }
+
+ if (SONG.needsVoices)
+ vocals.volume = 1;
+
+ var time:Float = 0.15;
+ if(daNote.isSustainNote && !daNote.animation.curAnim.name.endsWith('end')) {
+ time += 0.15;
+ }
+ StrumPlayAnim(true, Std.int(Math.abs(daNote.noteData)) % 4, time);
+ daNote.hitByOpponent = true;
+
+ callOnLuas('opponentNoteHit', [notes.members.indexOf(daNote), Math.abs(daNote.noteData), daNote.noteType, daNote.isSustainNote]);
+
+ if (!daNote.isSustainNote)
+ {
+ daNote.kill();
+ notes.remove(daNote, true);
+ daNote.destroy();
+ }
+ }
+
+ if(daNote.mustPress && cpuControlled) {
+ if(daNote.isSustainNote) {
+ if(daNote.canBeHit) {
+ goodNoteHit(daNote);
+ }
+ } else if(daNote.strumTime <= Conductor.songPosition || (daNote.isSustainNote && daNote.canBeHit && daNote.mustPress)) {
+ goodNoteHit(daNote);
+ }
+ }
+
+ // WIP interpolation shit? Need to fix the pause issue
+ // daNote.y = (strumLine.y - (songTime - daNote.strumTime) * (0.45 * songSpeed));
+
+ var doKill:Bool = daNote.y < -daNote.height;
+ if(ClientPrefs.downScroll) doKill = daNote.y > FlxG.height;
+
+ if (doKill)
+ {
+ if (daNote.mustPress && !cpuControlled &&!daNote.ignoreNote && !endingSong && (daNote.tooLate || !daNote.wasGoodHit)) {
+ noteMiss(daNote);
+ }
+
+ daNote.active = false;
+ daNote.visible = false;
+
+ daNote.kill();
+ notes.remove(daNote, true);
+ daNote.destroy();
+ }
+ });
+ }
+ checkEventNote();
+
+ if (!inCutscene) {
+ if(!cpuControlled) {
+ keyShit();
+ } else if(boyfriend.holdTimer > Conductor.stepCrochet * 0.001 * boyfriend.singDuration && boyfriend.animation.curAnim.name.startsWith('sing') && !boyfriend.animation.curAnim.name.endsWith('miss')) {
+ boyfriend.dance();
+ }
+ }
+
+ #if debug
+ if(!endingSong && !startingSong) {
+ if (FlxG.keys.justPressed.ONE) {
+ KillNotes();
+ FlxG.sound.music.onComplete();
+ }
+ if(FlxG.keys.justPressed.TWO) { //Go 10 seconds into the future :O
+ FlxG.sound.music.pause();
+ vocals.pause();
+ Conductor.songPosition += 10000;
+ notes.forEachAlive(function(daNote:Note)
+ {
+ if(daNote.strumTime + 800 < Conductor.songPosition) {
+ daNote.active = false;
+ daNote.visible = false;
+
+ daNote.kill();
+ notes.remove(daNote, true);
+ daNote.destroy();
+ }
+ });
+ for (i in 0...unspawnNotes.length) {
+ var daNote:Note = unspawnNotes[0];
+ if(daNote.strumTime + 800 >= Conductor.songPosition) {
+ break;
+ }
+
+ daNote.active = false;
+ daNote.visible = false;
+
+ daNote.kill();
+ unspawnNotes.splice(unspawnNotes.indexOf(daNote), 1);
+ daNote.destroy();
+ }
+
+ FlxG.sound.music.time = Conductor.songPosition;
+ FlxG.sound.music.play();
+
+ vocals.time = Conductor.songPosition;
+ vocals.play();
+ }
+ }
+
+ setOnLuas('cameraX', camFollowPos.x);
+ setOnLuas('cameraY', camFollowPos.y);
+ setOnLuas('botPlay', PlayState.cpuControlled);
+ callOnLuas('onUpdatePost', [elapsed]);
+ #end
+ }
+
+ var isDead:Bool = false;
+ function doDeathCheck() {
+ if (health <= 0 && !practiceMode && !isDead)
+ {
+ var ret:Dynamic = callOnLuas('onGameOver', []);
+ if(ret != FunkinLua.Function_Stop) {
+ boyfriend.stunned = true;
+ deathCounter++;
+
+ persistentUpdate = false;
+ persistentDraw = false;
+ paused = true;
+
+ vocals.stop();
+ FlxG.sound.music.stop();
+
+ openSubState(new GameOverSubstate(boyfriend.getScreenPosition().x, boyfriend.getScreenPosition().y, camFollowPos.x, camFollowPos.y, this));
+ for (tween in modchartTweens) {
+ tween.active = true;
+ }
+ for (timer in modchartTimers) {
+ timer.active = true;
+ }
+
+ // MusicBeatState.switchState(new GameOverState(boyfriend.getScreenPosition().x, boyfriend.getScreenPosition().y));
+
+ #if desktop
+ // Game Over doesn't get his own variable because it's only used here
+ DiscordClient.changePresence("Game Over - " + detailsText, SONG.song + " (" + storyDifficultyText + ")", iconP2.getCharacter());
+ #end
+ isDead = true;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public function checkEventNote() {
+ while(eventNotes.length > 0) {
+ var early:Float = eventNoteEarlyTrigger(eventNotes[0]);
+ var leStrumTime:Float = eventNotes[0][0];
+ if(Conductor.songPosition < leStrumTime - early) {
+ break;
+ }
+
+ var value1:String = '';
+ if(eventNotes[0][3] != null)
+ value1 = eventNotes[0][3];
+
+ var value2:String = '';
+ if(eventNotes[0][4] != null)
+ value2 = eventNotes[0][4];
+
+ triggerEventNote(eventNotes[0][2], value1, value2);
+ eventNotes.shift();
+ }
+ }
+
+ public function getControl(key:String) {
+ var pressed:Bool = Reflect.getProperty(controls, key);
+ //trace('Control result: ' + pressed);
+ return pressed;
+ }
+
+ public function triggerEventNote(eventName:String, value1:String, value2:String) {
+ switch(eventName) {
+ case 'Hey!':
+ var value:Int = 2;
+ switch(value1.toLowerCase().trim()) {
+ case 'bf' | 'boyfriend' | '0':
+ value = 0;
+ case 'gf' | 'girlfriend' | '1':
+ value = 1;
+ }
+
+ var time:Float = Std.parseFloat(value2);
+ if(Math.isNaN(time) || time <= 0) time = 0.6;
+
+ if(value != 0) {
+ if(dad.curCharacter.startsWith('gf')) { //Tutorial GF is actually Dad! The GF is an imposter!! ding ding ding ding ding ding ding, dindinding, end my suffering
+ dad.playAnim('cheer', true);
+ dad.specialAnim = true;
+ dad.heyTimer = time;
+ } else {
+ gf.playAnim('cheer', true);
+ gf.specialAnim = true;
+ gf.heyTimer = time;
+ }
+
+ if(curStage == 'mall') {
+ bottomBoppers.animation.play('hey', true);
+ heyTimer = time;
+ }
+ }
+ if(value != 1) {
+ boyfriend.playAnim('hey', true);
+ boyfriend.specialAnim = true;
+ boyfriend.heyTimer = time;
+ }
+
+ case 'Set GF Speed':
+ var value:Int = Std.parseInt(value1);
+ if(Math.isNaN(value)) value = 1;
+ gfSpeed = value;
+
+ case 'Blammed Lights':
+ var lightId:Int = Std.parseInt(value1);
+ if(Math.isNaN(lightId)) lightId = 0;
+
+ if(lightId > 0 && curLightEvent != lightId) {
+ if(lightId > 5) lightId = FlxG.random.int(1, 5, [curLightEvent]);
+
+ var color:Int = 0xffffffff;
+ switch(lightId) {
+ case 1: //Blue
+ color = 0xff31a2fd;
+ case 2: //Green
+ color = 0xff31fd8c;
+ case 3: //Pink
+ color = 0xfff794f7;
+ case 4: //Red
+ color = 0xfff96d63;
+ case 5: //Orange
+ color = 0xfffba633;
+ }
+ curLightEvent = lightId;
+
+ if(blammedLightsBlack.alpha == 0) {
+ if(blammedLightsBlackTween != null) {
+ blammedLightsBlackTween.cancel();
+ }
+ blammedLightsBlackTween = FlxTween.tween(blammedLightsBlack, {alpha: 1}, 1, {ease: FlxEase.quadInOut,
+ onComplete: function(twn:FlxTween) {
+ blammedLightsBlackTween = null;
+ }
+ });
+
+ var chars:Array = [boyfriend, gf, dad];
+ for (i in 0...chars.length) {
+ if(chars[i].colorTween != null) {
+ chars[i].colorTween.cancel();
+ }
+ chars[i].colorTween = FlxTween.color(chars[i], 1, FlxColor.WHITE, color, {onComplete: function(twn:FlxTween) {
+ chars[i].colorTween = null;
+ }, ease: FlxEase.quadInOut});
+ }
+ } else {
+ if(blammedLightsBlackTween != null) {
+ blammedLightsBlackTween.cancel();
+ }
+ blammedLightsBlackTween = null;
+ blammedLightsBlack.alpha = 1;
+
+ var chars:Array = [boyfriend, gf, dad];
+ for (i in 0...chars.length) {
+ if(chars[i].colorTween != null) {
+ chars[i].colorTween.cancel();
+ }
+ chars[i].colorTween = null;
+ }
+ dad.color = color;
+ boyfriend.color = color;
+ gf.color = color;
+ }
+
+ if(curStage == 'philly') {
+ if(phillyCityLightsEvent != null) {
+ phillyCityLightsEvent.forEach(function(spr:BGSprite) {
+ spr.visible = false;
+ });
+ phillyCityLightsEvent.members[lightId - 1].visible = true;
+ phillyCityLightsEvent.members[lightId - 1].alpha = 1;
+ }
+ }
+ } else {
+ if(blammedLightsBlack.alpha != 0) {
+ if(blammedLightsBlackTween != null) {
+ blammedLightsBlackTween.cancel();
+ }
+ blammedLightsBlackTween = FlxTween.tween(blammedLightsBlack, {alpha: 0}, 1, {ease: FlxEase.quadInOut,
+ onComplete: function(twn:FlxTween) {
+ blammedLightsBlackTween = null;
+ }
+ });
+ }
+
+ if(curStage == 'philly') {
+ phillyCityLights.forEach(function(spr:BGSprite) {
+ spr.visible = false;
+ });
+ phillyCityLightsEvent.forEach(function(spr:BGSprite) {
+ spr.visible = false;
+ });
+
+ var memb:FlxSprite = phillyCityLightsEvent.members[curLightEvent - 1];
+ if(memb != null) {
+ memb.visible = true;
+ memb.alpha = 1;
+ if(phillyCityLightsEventTween != null)
+ phillyCityLightsEventTween.cancel();
+
+ phillyCityLightsEventTween = FlxTween.tween(memb, {alpha: 0}, 1, {onComplete: function(twn:FlxTween) {
+ phillyCityLightsEventTween = null;
+ }, ease: FlxEase.quadInOut});
+ }
+ }
+
+ var chars:Array = [boyfriend, gf, dad];
+ for (i in 0...chars.length) {
+ if(chars[i].colorTween != null) {
+ chars[i].colorTween.cancel();
+ }
+ chars[i].colorTween = FlxTween.color(chars[i], 1, chars[i].color, FlxColor.WHITE, {onComplete: function(twn:FlxTween) {
+ chars[i].colorTween = null;
+ }, ease: FlxEase.quadInOut});
+ }
+
+ curLight = 0;
+ curLightEvent = 0;
+ }
+
+ case 'Kill Henchmen':
+ killHenchmen();
+
+ case 'Add Camera Zoom':
+ if(ClientPrefs.camZooms && FlxG.camera.zoom < 1.35) {
+ var camZoom:Float = Std.parseFloat(value1);
+ var hudZoom:Float = Std.parseFloat(value2);
+ if(Math.isNaN(camZoom)) camZoom = 0.015;
+ if(Math.isNaN(hudZoom)) hudZoom = 0.03;
+
+ FlxG.camera.zoom += camZoom;
+ camHUD.zoom += hudZoom;
+ }
+
+ case 'Trigger BG Ghouls':
+ if(curStage == 'schoolEvil' && !ClientPrefs.lowQuality) {
+ bgGhouls.dance(true);
+ bgGhouls.visible = true;
+ }
+
+ case 'Play Animation':
+ //trace('Anim to play: ' + value1);
+ var char:Character = dad;
+ switch(value2.toLowerCase().trim()) {
+ case 'bf' | 'boyfriend':
+ char = boyfriend;
+ case 'gf' | 'girlfriend':
+ char = gf;
+ default:
+ var val2:Int = Std.parseInt(value2);
+ if(Math.isNaN(val2)) val2 = 0;
+
+ switch(val2) {
+ case 1: char = boyfriend;
+ case 2: char = gf;
+ }
+ }
+ char.playAnim(value1, true);
+ char.specialAnim = true;
+
+ case 'Camera Follow Pos':
+ var val1:Float = Std.parseFloat(value1);
+ var val2:Float = Std.parseFloat(value2);
+ if(Math.isNaN(val1)) val1 = 0;
+ if(Math.isNaN(val2)) val2 = 0;
+
+ isCameraOnForcedPos = false;
+ if(!Math.isNaN(Std.parseFloat(value1)) || !Math.isNaN(Std.parseFloat(value2))) {
+ camFollow.x = val1;
+ camFollow.y = val2;
+ isCameraOnForcedPos = true;
+ }
+
+ case 'Alt Idle Animation':
+ var char:Character = dad;
+ switch(value1.toLowerCase()) {
+ case 'gf' | 'girlfriend':
+ char = gf;
+ case 'boyfriend' | 'bf':
+ char = boyfriend;
+ default:
+ var val:Int = Std.parseInt(value1);
+ if(Math.isNaN(val)) val = 0;
+
+ switch(val) {
+ case 1: char = boyfriend;
+ case 2: char = gf;
+ }
+ }
+ char.idleSuffix = value2;
+ char.recalculateDanceIdle();
+
+ case 'Screen Shake':
+ var valuesArray:Array = [value1, value2];
+ var targetsArray:Array = [camGame, camHUD];
+ for (i in 0...targetsArray.length) {
+ var split:Array = valuesArray[i].split(',');
+ var duration:Float = Std.parseFloat(split[0].trim());
+ var intensity:Float = Std.parseFloat(split[1].trim());
+ if(Math.isNaN(duration)) duration = 0;
+ if(Math.isNaN(intensity)) intensity = 0;
+
+ if(duration > 0 && intensity != 0) {
+ targetsArray[i].shake(intensity, duration);
+ }
+ }
+
+
+ case 'Change Character':
+ var charType:Int = 0;
+ switch(value1) {
+ case 'gf' | 'girlfriend':
+ charType = 2;
+ case 'dad' | 'opponent':
+ charType = 1;
+ default:
+ charType = Std.parseInt(value1);
+ if(Math.isNaN(charType)) charType = 0;
+ }
+
+ switch(charType) {
+ case 0:
+ if(boyfriend.curCharacter != value2) {
+ if(!boyfriendMap.exists(value2)) {
+ addCharacterToList(value2, charType);
+ }
+
+ boyfriend.visible = false;
+ boyfriend = boyfriendMap.get(value2);
+ if(!boyfriend.alreadyLoaded) {
+ boyfriend.alpha = 1;
+ boyfriend.alreadyLoaded = true;
+ }
+ boyfriend.visible = true;
+ iconP1.changeIcon(boyfriend.healthIcon);
+ }
+
+ case 1:
+ if(dad.curCharacter != value2) {
+ if(!dadMap.exists(value2)) {
+ addCharacterToList(value2, charType);
+ }
+
+ var wasGf:Bool = dad.curCharacter.startsWith('gf');
+ dad.visible = false;
+ dad = dadMap.get(value2);
+ if(!dad.curCharacter.startsWith('gf')) {
+ if(wasGf) {
+ gf.visible = true;
+ }
+ } else {
+ gf.visible = false;
+ }
+ if(!dad.alreadyLoaded) {
+ dad.alpha = 1;
+ dad.alreadyLoaded = true;
+ }
+ dad.visible = true;
+ iconP2.changeIcon(dad.healthIcon);
+ }
+
+ case 2:
+ if(gf.curCharacter != value2) {
+ if(!gfMap.exists(value2)) {
+ addCharacterToList(value2, charType);
+ }
+
+ gf.visible = false;
+ gf = gfMap.get(value2);
+ if(!gf.alreadyLoaded) {
+ gf.alpha = 1;
+ gf.alreadyLoaded = true;
+ }
+ }
+ }
+ reloadHealthBarColors();
+
+ case 'BG Freaks Expression':
+ if(bgGirls != null) bgGirls.swapDanceType();
+
+ case 'Opponent Anim':
+ var activeChar:Int = 0;
+ var gfSection:Int = Std.parseInt(value2);
+
+ switch(value1) {
+ case 'dad' | 'opponent' | 'superidol':
+ activeChar = 0;
+ case 'gf' | 'girlfriend' | 'gfidol':
+ activeChar = 1;
+ case 'both':
+ activeChar = 2;
+ default:
+ activeChar = Std.parseInt(value1);
+ if(Math.isNaN(activeChar)) activeChar = 0;
+ }
+
+ switch(activeChar) {
+ case 0:
+ isDad = true;
+ isGF = false;
+ gf.dance();
+
+ case 1:
+ isDad = false;
+ isGF = true;
+ dad.dance();
+
+ case 2:
+ isDad = true;
+ isGF = true;
+
+ }
+
+ switch (gfSection) {
+ case 0:
+ isCameraOnForcedPos = false;
+ case 1:
+ camFollow.set(gf.getMidpoint().x, gf.getMidpoint().y - 50);
+ //defaultCamZoom = 0.9;
+ isCameraOnForcedPos = true;
+ }
+
+ case 'Super Fade':
+ var fade:Int = Std.parseInt(value1);
+
+ blammedLightsBlackTween = FlxTween.tween(dad, {alpha: fade}, 1, {ease: FlxEase.quadInOut,
+ onComplete: function(twn:FlxTween) {
+ blammedLightsBlackTween = null;
+ }
+ });
+
+ case 'Super Flash':
+ var flashValue:Int = Std.parseInt(value1);
+
+ if (ClientPrefs.flashing)
+ FlxG.camera.flash(FlxColor.WHITE, flashValue);
+ else
+ FlxG.camera.flash(FlxColor.BLACK, flashValue);
+
+ case 'Zoom Amount':
+ var zoom:Float = Std.parseFloat(value1);
+
+ defaultCamZoom = zoom;
+ }
+ callOnLuas('onEvent', [eventName, value1, value2]);
+ }
+
+ function moveCameraSection(?id:Int = 0):Void {
+ if(SONG.notes[id] == null) return;
+
+ if (!SONG.notes[id].mustHitSection)
+ {
+ moveCamera(true);
+
+ if (SONG.notes[id].gfSection){
+ callOnLuas('onMoveCamera', ['gf']);
+ }else{
+ callOnLuas('onMoveCamera', ['dad']);
+ }
+ }
+ else
+ {
+ moveCamera(false);
+ if (SONG.notes[id].gfSection){
+ callOnLuas('onMoveCamera', ['gf']);
+ }else{
+ callOnLuas('onMoveCamera', ['boyfriend']);
+ }
+ }
+ }
+
+ var cameraTwn:FlxTween;
+ public function moveCamera(isDad:Bool) {
+ if(isDad) {
+ camFollow.set(dad.getMidpoint().x + 150, dad.getMidpoint().y - 100);
+ camFollow.x += dad.cameraPosition[0];
+ camFollow.y += dad.cameraPosition[1];
+ tweenCamIn();
+ } else {
+ camFollow.set(boyfriend.getMidpoint().x - 100, boyfriend.getMidpoint().y - 100);
+
+ switch (curStage)
+ {
+ case 'limo':
+ camFollow.x = boyfriend.getMidpoint().x - 300;
+ case 'mall':
+ camFollow.y = boyfriend.getMidpoint().y - 200;
+ case 'school' | 'schoolEvil':
+ camFollow.x = boyfriend.getMidpoint().x - 200;
+ camFollow.y = boyfriend.getMidpoint().y - 200;
+ }
+ camFollow.x -= boyfriend.cameraPosition[0];
+ camFollow.y += boyfriend.cameraPosition[1];
+
+ if (Paths.formatToSongPath(SONG.song) == 'tutorial' && cameraTwn == null && FlxG.camera.zoom != 1) {
+ cameraTwn = FlxTween.tween(FlxG.camera, {zoom: 1}, (Conductor.stepCrochet * 4 / 1000), {ease: FlxEase.elasticInOut, onComplete:
+ function (twn:FlxTween) {
+ cameraTwn = null;
+ }
+ });
+ }
+ }
+
+
+
+ if (SONG.notes[Std.int(curStep / 16)].gfSection){
+
+ camFollow.set(gf.getMidpoint().x, gf.getMidpoint().y);
+ camFollow.x += gf.cameraPosition[0];
+ camFollow.y += gf.cameraPosition[1];
+ tweenCamIn();
+ }
+
+ }
+
+ function tweenCamIn() {
+ if (Paths.formatToSongPath(SONG.song) == 'tutorial' && cameraTwn == null && FlxG.camera.zoom != 1.3) {
+ cameraTwn = FlxTween.tween(FlxG.camera, {zoom: 1.3}, (Conductor.stepCrochet * 4 / 1000), {ease: FlxEase.elasticInOut, onComplete:
+ function (twn:FlxTween) {
+ cameraTwn = null;
+ }
+ });
+ }
+ }
+
+ function snapCamFollowToPos(x:Float, y:Float) {
+ camFollow.set(x, y);
+ camFollowPos.setPosition(x, y);
+ }
+
+ function finishSong():Void
+ {
+ var finishCallback:Void->Void = endSong; //In case you want to change it in a specific song.
+
+ updateTime = false;
+ FlxG.sound.music.volume = 0;
+ vocals.volume = 0;
+ vocals.pause();
+ if(ClientPrefs.noteOffset <= 0) {
+ finishCallback();
+ } else {
+ finishTimer = new FlxTimer().start(ClientPrefs.noteOffset / 1000, function(tmr:FlxTimer) {
+ finishCallback();
+ });
+ }
+ }
+
+
+ var transitioning = false;
+ public function endSong():Void
+ {
+ antireanim = false;
+ timeBarBG.visible = false;
+ timeBar.visible = false;
+ timeTxt.visible = false;
+ canPause = false;
+ endingSong = true;
+ camZooming = false;
+ inCutscene = false;
+ updateTime = false;
+
+ deathCounter = 0;
+ seenCutscene = false;
+
+ #if ACHIEVEMENTS_ALLOWED
+ if(achievementObj != null) {
+ return;
+ } else {
+ var achieve:String = checkForAchievement(['week1_nomiss', 'week2_nomiss', 'week3_nomiss', 'week4_nomiss',
+ 'week5_nomiss', 'week6_nomiss', 'ur_bad',
+ 'ur_good', 'hype', 'two_keys', 'toastie', 'debugger']);
+
+ if(achieve != null) {
+ startAchievement(achieve);
+ return;
+ }
+ }
+ #end
+
+
+ #if LUA_ALLOWED
+ var ret:Dynamic = callOnLuas('onEndSong', []);
+ #else
+ var ret:Dynamic = FunkinLua.Function_Continue;
+ #end
+
+ if(ret != FunkinLua.Function_Stop && !transitioning) {
+ if (SONG.validScore)
+ {
+ #if !switch
+ var percent:Float = ratingPercent;
+ if(Math.isNaN(percent)) percent = 0;
+ Highscore.saveScore(SONG.song, songScore, storyDifficulty, percent);
+ #end
+ }
+
+ if (isStoryMode)
+ {
+ campaignScore += songScore;
+ campaignMisses += songMisses;
+
+ storyPlaylist.remove(storyPlaylist[0]);
+
+ if (storyPlaylist.length <= 0)
+ {
+ FlxG.sound.playMusic(Paths.music('freakyMenu'));
+
+ cancelFadeTween();
+ CustomFadeTransition.nextCamera = camOther;
+ if(FlxTransitionableState.skipNextTransIn) {
+ CustomFadeTransition.nextCamera = null;
+ }
+ MusicBeatState.switchState(new StoryMenuState());
+
+ // if ()
+ if(!usedPractice) {
+ StoryMenuState.weekCompleted.set(WeekData.weeksList[storyWeek], true);
+
+ if (SONG.validScore)
+ {
+ Highscore.saveWeekScore(WeekData.getWeekFileName(), campaignScore, storyDifficulty);
+ }
+
+ FlxG.save.data.weekCompleted = StoryMenuState.weekCompleted;
+ FlxG.save.flush();
+ }
+ usedPractice = false;
+ changedDifficulty = false;
+ cpuControlled = false;
+ }
+ else
+ {
+ var difficulty:String = '' + CoolUtil.difficultyStuff[storyDifficulty][1];
+
+ //trace('LOADING NEXT SONG');
+ //trace(Paths.formatToSongPath(PlayState.storyPlaylist[0]) + difficulty);
+
+ var winterHorrorlandNext = (Paths.formatToSongPath(SONG.song) == "eggnog");
+ if (winterHorrorlandNext)
+ {
+ var blackShit:FlxSprite = new FlxSprite(-FlxG.width * FlxG.camera.zoom,
+ -FlxG.height * FlxG.camera.zoom).makeGraphic(FlxG.width * 3, FlxG.height * 3, FlxColor.BLACK);
+ blackShit.scrollFactor.set();
+ add(blackShit);
+ camHUD.visible = false;
+
+ FlxG.sound.play(Paths.sound('Lights_Shut_off'));
+ }
+
+ FlxTransitionableState.skipNextTransIn = true;
+ FlxTransitionableState.skipNextTransOut = true;
+
+ prevCamFollow = camFollow;
+ prevCamFollowPos = camFollowPos;
+
+ PlayState.SONG = Song.loadFromJson(PlayState.storyPlaylist[0] + difficulty, PlayState.storyPlaylist[0]);
+ FlxG.sound.music.stop();
+
+ if(winterHorrorlandNext) { //marca duvidosa
+ new FlxTimer().start(1.5, function(tmr:FlxTimer) {
+ cancelFadeTween();
+ LoadingState.loadAndSwitchState(new PlayState());
+ });
+ } else {
+ cancelFadeTween();
+ LoadingState.loadAndSwitchState(new PlayState());
+ }
+ }
+ }
+ else
+ {
+ //trace('WENT BACK TO FREEPLAY??');
+ cancelFadeTween();
+ CustomFadeTransition.nextCamera = camOther;
+ if(FlxTransitionableState.skipNextTransIn) {
+ CustomFadeTransition.nextCamera = null;
+ }
+ MusicBeatState.switchState(new FreeplayState());
+ FlxG.sound.playMusic(Paths.music('freakyMenu'));
+ usedPractice = false;
+ changedDifficulty = false;
+ cpuControlled = false;
+ }
+ transitioning = true;
+ }
+ }
+
+ #if ACHIEVEMENTS_ALLOWED
+ var achievementObj:AchievementObject = null;
+ function startAchievement(achieve:String) {
+ achievementObj = new AchievementObject(achieve, camOther);
+ achievementObj.onFinish = achievementEnd;
+ add(achievementObj);
+ //trace('Giving achievement ' + achieve);
+ }
+ function achievementEnd():Void
+ {
+ achievementObj = null;
+ if(endingSong && !inCutscene) {
+ endSong();
+ }
+ }
+ #end
+
+ public function KillNotes() {
+ while(notes.length > 0) {
+ var daNote:Note = notes.members[0];
+ daNote.active = false;
+ daNote.visible = false;
+
+ daNote.kill();
+ notes.remove(daNote, true);
+ daNote.destroy();
+ }
+ unspawnNotes = [];
+ eventNotes = [];
+ }
+
+ private function popUpScore(note:Note = null):Void
+ {
+ var noteDiff:Float = Math.abs(note.strumTime - Conductor.songPosition + 8);
+
+ // boyfriend.playAnim('hey');
+ vocals.volume = 1;
+
+ var placement:String = Std.string(combo);
+
+ var coolText:FlxText = new FlxText(0, 0, 0, placement, 32);
+ coolText.screenCenter();
+ coolText.x = FlxG.width * 0.55;
+ //
+
+ var rating:FlxSprite = new FlxSprite();
+ var score:Int = 350;
+
+ var daRating:String = "sick";
+
+ if (noteDiff > Conductor.safeZoneOffset * 0.75)
+ {
+ daRating = 'shit';
+ score = 50;
+ shits++;
+ }
+ else if (noteDiff > Conductor.safeZoneOffset * 0.5)
+ {
+ daRating = 'bad';
+ score = 100;
+ bads++;
+ }
+ else if (noteDiff > Conductor.safeZoneOffset * 0.25)
+ {
+ daRating = 'good';
+ score = 200;
+ goods++;
+ }
+
+ if(daRating == 'sick' && !note.noteSplashDisabled)
+ {
+ spawnNoteSplashOnNote(note);
+ sicks++;
+ }
+
+ if(!practiceMode && !cpuControlled) {
+ songScore += score;
+ songHits++;
+ RecalculateRating();
+ if(scoreTxtTween != null) {
+ scoreTxtTween.cancel();
+ }
+ scoreTxt.scale.x = 1.1;
+ scoreTxt.scale.y = 1.1;
+ scoreTxtTween = FlxTween.tween(scoreTxt.scale, {x: 1, y: 1}, 0.2, {
+ onComplete: function(twn:FlxTween) {
+ scoreTxtTween = null;
+ }
+ });
+ }
+
+ /* if (combo > 60)
+ daRating = 'sick';
+ else if (combo > 12)
+ daRating = 'good'
+ else if (combo > 4)
+ daRating = 'bad';
+ */
+
+ var pixelShitPart1:String = "";
+ var pixelShitPart2:String = '';
+
+ if (PlayState.isPixelStage)
+ {
+ pixelShitPart1 = 'pixelUI/';
+ pixelShitPart2 = '-pixel';
+ }
+
+ rating.loadGraphic(Paths.image(pixelShitPart1 + daRating + pixelShitPart2));
+ rating.screenCenter();
+ rating.x = coolText.x - 40;
+ rating.y -= 60;
+ rating.acceleration.y = 550;
+ rating.velocity.y -= FlxG.random.int(140, 175);
+ rating.velocity.x -= FlxG.random.int(0, 10);
+ rating.visible = !ClientPrefs.hideHud;
+
+ var comboSpr:FlxSprite = new FlxSprite().loadGraphic(Paths.image(pixelShitPart1 + 'combo' + pixelShitPart2));
+ comboSpr.screenCenter();
+ comboSpr.x = coolText.x;
+ comboSpr.acceleration.y = 600;
+ comboSpr.velocity.y -= 150;
+ comboSpr.visible = !ClientPrefs.hideHud;
+
+ comboSpr.velocity.x += FlxG.random.int(1, 10);
+ add(rating);
+
+ if (!PlayState.isPixelStage)
+ {
+ rating.setGraphicSize(Std.int(rating.width * 0.7));
+ rating.antialiasing = ClientPrefs.globalAntialiasing;
+ comboSpr.setGraphicSize(Std.int(comboSpr.width * 0.7));
+ comboSpr.antialiasing = ClientPrefs.globalAntialiasing;
+ }
+ else
+ {
+ rating.setGraphicSize(Std.int(rating.width * daPixelZoom * 0.7));
+ comboSpr.setGraphicSize(Std.int(comboSpr.width * daPixelZoom * 0.7));
+ }
+
+ comboSpr.updateHitbox();
+ rating.updateHitbox();
+
+ var seperatedScore:Array = [];
+
+ if(combo >= 1000) {
+ seperatedScore.push(Math.floor(combo / 1000) % 10);
+ }
+ seperatedScore.push(Math.floor(combo / 100) % 10);
+ seperatedScore.push(Math.floor(combo / 10) % 10);
+ seperatedScore.push(combo % 10);
+
+ var daLoop:Int = 0;
+ for (i in seperatedScore)
+ {
+ var numScore:FlxSprite = new FlxSprite().loadGraphic(Paths.image(pixelShitPart1 + 'num' + Std.int(i) + pixelShitPart2));
+ numScore.screenCenter();
+ numScore.x = rating.x + (43 * daLoop) - 50;
+ numScore.y = rating.y + 100;
+ numScore.cameras = [camHUD];
+
+ if (!PlayState.isPixelStage)
+ {
+ numScore.antialiasing = ClientPrefs.globalAntialiasing;
+ numScore.setGraphicSize(Std.int(numScore.width * 0.5));
+ }
+ else
+ {
+ numScore.setGraphicSize(Std.int(numScore.width * daPixelZoom));
+ }
+ numScore.updateHitbox();
+
+ numScore.acceleration.y = FlxG.random.int(200, 300);
+ numScore.velocity.y -= FlxG.random.int(140, 160);
+ numScore.velocity.x = FlxG.random.float(-5, 5);
+ numScore.visible = !ClientPrefs.hideHud;
+
+ if (combo >= 10 || combo == 0)
+ add(numScore);
+
+ FlxTween.tween(numScore, {alpha: 0}, 0.2, {
+ onComplete: function(tween:FlxTween)
+ {
+ numScore.destroy();
+ },
+ startDelay: Conductor.crochet * 0.002
+ });
+
+ daLoop++;
+ }
+ /*
+ //trace(combo);
+ //trace(seperatedScore);
+ */
+
+ coolText.text = Std.string(seperatedScore);
+ // add(coolText);
+
+ FlxTween.tween(rating, {alpha: 0}, 0.2, {
+ startDelay: Conductor.crochet * 0.001
+ });
+
+ FlxTween.tween(comboSpr, {alpha: 0}, 0.2, {
+ onComplete: function(tween:FlxTween)
+ {
+ coolText.destroy();
+ comboSpr.destroy();
+
+ rating.destroy();
+ },
+ startDelay: Conductor.crochet * 0.001
+ });
+ }
+
+ private function keyShit():Void
+ {
+ // HOLDING
+ var up = controls.UI_UP;
+ var right = controls.UI_RIGHT;
+ var down = controls.UI_DOWN;
+ var left = controls.UI_LEFT;
+
+ var upP = controls.UI_UP_P;
+ var rightP = controls.UI_RIGHT_P;
+ var downP = controls.UI_DOWN_P;
+ var leftP = controls.UI_LEFT_P;
+
+ var upR = controls.UI_UP_R;
+ var rightR = controls.UI_RIGHT_R;
+ var downR = controls.UI_DOWN_R;
+ var leftR = controls.UI_LEFT_R;
+
+ var controlArray:Array = [leftP, downP, upP, rightP];
+ var controlReleaseArray:Array = [leftR, downR, upR, rightR];
+ var controlHoldArray:Array = [left, down, up, right];
+
+ // FlxG.watch.addQuick('asdfa', upP);
+ if (!boyfriend.stunned && generatedMusic)
+ {
+ // rewritten inputs???
+ notes.forEachAlive(function(daNote:Note)
+ {
+ // hold note functions
+ if (daNote.isSustainNote && controlHoldArray[daNote.noteData] && daNote.canBeHit
+ && daNote.mustPress && !daNote.tooLate && !daNote.wasGoodHit) {
+ goodNoteHit(daNote);
+ }
+ });
+
+ if ((controlHoldArray.contains(true) || controlArray.contains(true)) && !endingSong) {
+ var canMiss:Bool = !ClientPrefs.ghostTapping;
+ if (controlArray.contains(true)) {
+ for (i in 0...controlArray.length) {
+ // heavily based on my own code LOL if it aint broke dont fix it
+ var pressNotes:Array = [];
+ var notesDatas:Array = [];
+ var notesStopped:Bool = false;
+
+ var sortedNotesList:Array = [];
+ notes.forEachAlive(function(daNote:Note)
+ {
+ if (daNote.canBeHit && daNote.mustPress && !daNote.tooLate
+ && !daNote.wasGoodHit && daNote.noteData == i) {
+ sortedNotesList.push(daNote);
+ notesDatas.push(daNote.noteData);
+ canMiss = true;
+ }
+ });
+ sortedNotesList.sort((a, b) -> Std.int(a.strumTime - b.strumTime));
+
+ if (sortedNotesList.length > 0) {
+ for (epicNote in sortedNotesList)
+ {
+ for (doubleNote in pressNotes) {
+ if (Math.abs(doubleNote.strumTime - epicNote.strumTime) < 10) {
+ doubleNote.kill();
+ notes.remove(doubleNote, true);
+ doubleNote.destroy();
+ } else
+ notesStopped = true;
+ }
+
+ // eee jack detection before was not super good
+ if (controlArray[epicNote.noteData] && !notesStopped) {
+ goodNoteHit(epicNote);
+ pressNotes.push(epicNote);
+ }
+
+ }
+ }
+ else if (canMiss)
+ ghostMiss(controlArray[i], i, true);
+
+ // I dunno what you need this for but here you go
+ // - Shubs
+
+ // Shubs, this is for the "Just the Two of Us" achievement lol
+ // - Shadow Mario
+ if (!keysPressed[i] && controlArray[i])
+ keysPressed[i] = true;
+ }
+ }
+
+ #if ACHIEVEMENTS_ALLOWED
+ var achieve:String = checkForAchievement(['oversinging']);
+ if (achieve != null) {
+ startAchievement(achieve);
+ }
+ #end
+ } else if (boyfriend.holdTimer > Conductor.stepCrochet * 0.001 * boyfriend.singDuration && boyfriend.animation.curAnim.name.startsWith('sing')
+ && !boyfriend.animation.curAnim.name.endsWith('miss'))
+ boyfriend.dance();
+ }
+
+ playerStrums.forEach(function(spr:StrumNote)
+ {
+ if(controlArray[spr.ID] && spr.animation.curAnim.name != 'confirm') {
+ spr.playAnim('pressed');
+ spr.resetAnim = 0;
+ }
+ if(controlReleaseArray[spr.ID]) {
+ spr.playAnim('static');
+ spr.resetAnim = 0;
+ }
+ });
+ }
+
+ function ghostMiss(statement:Bool = false, direction:Int = 0, ?ghostMiss:Bool = false) {
+ if (statement) {
+ noteMissPress(direction, ghostMiss);
+ callOnLuas('noteMissPress', [direction]);
+ }
+ }
+
+ function noteMiss(daNote:Note):Void { //You didn't hit the key and let it go offscreen, also used by Hurt Notes
+ //Dupe note remove
+ notes.forEachAlive(function(note:Note) {
+ if (daNote != note && daNote.mustPress && daNote.noteData == note.noteData && daNote.isSustainNote == note.isSustainNote && Math.abs(daNote.strumTime - note.strumTime) < 10) {
+ note.kill();
+ notes.remove(note, true);
+ note.destroy();
+ }
+ });
+
+ health -= daNote.missHealth; //For testing purposes
+ //trace(daNote.missHealth);
+ songMisses++;
+ vocals.volume = 0;
+ if(!practiceMode) songScore -= 10;
+ RecalculateRating();
+
+ var char:Character = boyfriend;
+ if(daNote.noteType == 'GF Sing') {
+ char = gf;
+ }
+
+ if(char.hasMissAnimations)
+ {
+ var daAlt = '';
+ if(daNote.noteType == 'Alt Animation') daAlt = '-alt';
+
+ var animToPlay:String = singAnimations[Std.int(Math.abs(daNote.noteData))] + 'miss' + daAlt;
+ char.playAnim(animToPlay, true);
+ }
+
+ callOnLuas('noteMiss', [notes.members.indexOf(daNote), daNote.noteData, daNote.noteType, daNote.isSustainNote]);
+ }
+
+ function noteMissPress(direction:Int = 1, ?ghostMiss:Bool = false):Void //You pressed a key when there was no notes to press for this key
+ {
+ if (!boyfriend.stunned)
+ {
+ health -= 0.04;
+ if (combo > 5 && gf.animOffsets.exists('sad'))
+ {
+ gf.playAnim('sad');
+ }
+ combo = 0;
+
+ if(!practiceMode) songScore -= 10;
+ if(!endingSong) {
+ songMisses++;
+ }
+ RecalculateRating();
+
+ FlxG.sound.play(Paths.soundRandom('missnote', 1, 3), FlxG.random.float(0.1, 0.2));
+ // FlxG.sound.play(Paths.sound('missnote1'), 1, false);
+ // FlxG.log.add('played imss note');
+
+ /*boyfriend.stunned = true;
+
+ // get stunned for 1/60 of a second, makes you able to
+ new FlxTimer().start(1 / 60, function(tmr:FlxTimer)
+ {
+ boyfriend.stunned = false;
+ });*/
+
+ if(boyfriend.hasMissAnimations) {
+ boyfriend.playAnim(singAnimations[Std.int(Math.abs(direction))] + 'miss', true);
+ }
+ vocals.volume = 0;
+ }
+ }
+
+ function goodNoteHit(note:Note):Void
+ {
+ if (!note.wasGoodHit)
+ {
+ if(cpuControlled && (note.ignoreNote || note.hitCausesMiss)) return;
+
+ if(note.hitCausesMiss) {
+ noteMiss(note);
+ if(!note.noteSplashDisabled && !note.isSustainNote) {
+ spawnNoteSplashOnNote(note);
+ }
+
+ switch(note.noteType) {
+ case 'Hurt Note': //Hurt note
+ if(boyfriend.animation.getByName('hurt') != null) {
+ boyfriend.playAnim('hurt', true);
+ boyfriend.specialAnim = true;
+ }
+ }
+
+ note.wasGoodHit = true;
+ if (!note.isSustainNote)
+ {
+ note.kill();
+ notes.remove(note, true);
+ note.destroy();
+ }
+ return;
+ }
+
+ if (!note.isSustainNote)
+ {
+ popUpScore(note);
+ combo += 1;
+ if(combo > 9999) combo = 9999;
+ }
+ health += note.hitHealth;
+
+ if(!note.noAnimation) {
+ var daAlt = '';
+ if(note.noteType == 'Alt Animation') daAlt = '-alt';
+
+ var animToPlay:String = singAnimations[Std.int(Math.abs(note.noteData))];
+
+ if(note.noteType == 'GF Sing') {
+ gf.playAnim(animToPlay + daAlt, true);
+ gf.holdTimer = 0;
+ } else {
+ boyfriend.playAnim(animToPlay + daAlt, true);
+ boyfriend.holdTimer = 0;
+ }
+
+ if(note.noteType == 'Hey!') {
+ if(boyfriend.animOffsets.exists('hey')) {
+ boyfriend.playAnim('hey', true);
+ boyfriend.specialAnim = true;
+ if(ClientPrefs.sussybest && !isPixelStage && !antireanim){boyfriend.heyTimer = 1.4;}
+ else{boyfriend.heyTimer = 0.6;}
+ }
+
+ if(gf.animOffsets.exists('cheer')) {
+ gf.playAnim('cheer', true);
+ gf.specialAnim = true;
+ gf.heyTimer = 0.6;
+ }
+ }
+ }
+
+ if(cpuControlled) {
+ var time:Float = 0.15;
+ if(note.isSustainNote && !note.animation.curAnim.name.endsWith('end')) {
+ time += 0.15;
+ }
+ StrumPlayAnim(false, Std.int(Math.abs(note.noteData)) % 4, time);
+ } else {
+ playerStrums.forEach(function(spr:StrumNote)
+ {
+ if (Math.abs(note.noteData) == spr.ID)
+ {
+ spr.playAnim('confirm', true);
+ }
+ });
+ }
+ note.wasGoodHit = true;
+ vocals.volume = 1;
+
+ var isSus:Bool = note.isSustainNote; //GET OUT OF MY HEAD, GET OUT OF MY HEAD, GET OUT OF MY HEAD
+ var leData:Int = Math.round(Math.abs(note.noteData));
+ var leType:String = note.noteType;
+ callOnLuas('goodNoteHit', [notes.members.indexOf(note), leData, leType, isSus]);
+
+ if (!note.isSustainNote)
+ {
+ note.kill();
+ notes.remove(note, true);
+ note.destroy();
+ }
+ }
+ }
+
+ function spawnNoteSplashOnNote(note:Note) {
+ if(ClientPrefs.noteSplashes && note != null) {
+ var strum:StrumNote = playerStrums.members[note.noteData];
+ if(strum != null) {
+ spawnNoteSplash(strum.x, strum.y, note.noteData, note);
+ }
+ }
+ }
+
+ public function spawnNoteSplash(x:Float, y:Float, data:Int, ?note:Note = null) {
+ var skin:String = 'noteSplashes';
+ if(PlayState.SONG.splashSkin != null && PlayState.SONG.splashSkin.length > 0) skin = PlayState.SONG.splashSkin;
+
+ var hue:Float = ClientPrefs.arrowHSV[data % 4][0] / 360;
+ var sat:Float = ClientPrefs.arrowHSV[data % 4][1] / 100;
+ var brt:Float = ClientPrefs.arrowHSV[data % 4][2] / 100;
+ if(note != null) {
+ skin = note.noteSplashTexture;
+ hue = note.noteSplashHue;
+ sat = note.noteSplashSat;
+ brt = note.noteSplashBrt;
+ }
+
+ var splash:NoteSplash = grpNoteSplashes.recycle(NoteSplash);
+ splash.setupNoteSplash(x, y, data, skin, hue, sat, brt);
+ grpNoteSplashes.add(splash);
+ }
+
+ var fastCarCanDrive:Bool = true;
+
+ function resetFastCar():Void
+ {
+ fastCar.x = -12600;
+ fastCar.y = FlxG.random.int(140, 250);
+ fastCar.velocity.x = 0;
+ fastCarCanDrive = true;
+ }
+
+ var carTimer:FlxTimer;
+ function fastCarDrive()
+ {
+ //trace('Car drive');
+ FlxG.sound.play(Paths.soundRandom('carPass', 0, 1), 0.7);
+
+ fastCar.velocity.x = (FlxG.random.int(170, 220) / FlxG.elapsed) * 3;
+ fastCarCanDrive = false;
+ carTimer = new FlxTimer().start(2, function(tmr:FlxTimer)
+ {
+ resetFastCar();
+ carTimer = null;
+ });
+ }
+
+ var trainMoving:Bool = false;
+ var trainFrameTiming:Float = 0;
+
+ var trainCars:Int = 8;
+ var trainFinishing:Bool = false;
+ var trainCooldown:Int = 0;
+
+ function trainStart():Void
+ {
+ trainMoving = true;
+ if (!trainSound.playing)
+ trainSound.play(true);
+ }
+
+ var startedMoving:Bool = false;
+
+ function updateTrainPos():Void
+ {
+ if (trainSound.time >= 4700)
+ {
+ startedMoving = true;
+ gf.playAnim('hairBlow');
+ gf.specialAnim = true;
+ }
+
+ if (startedMoving)
+ {
+ phillyTrain.x -= 400;
+
+ if (phillyTrain.x < -2000 && !trainFinishing)
+ {
+ phillyTrain.x = -1150;
+ trainCars -= 1;
+
+ if (trainCars <= 0)
+ trainFinishing = true;
+ }
+
+ if (phillyTrain.x < -4000 && trainFinishing)
+ trainReset();
+ }
+ }
+
+ function trainReset():Void
+ {
+ gf.danced = false; //Sets head to the correct position once the animation ends
+ gf.playAnim('hairFall');
+ gf.specialAnim = true;
+ phillyTrain.x = FlxG.width + 200;
+ trainMoving = false;
+ // trainSound.stop();
+ // trainSound.time = 0;
+ trainCars = 8;
+ trainFinishing = false;
+ startedMoving = false;
+ }
+
+ function lightningStrikeShit():Void
+ {
+ FlxG.sound.play(Paths.soundRandom('thunder_', 1, 2));
+ if(!ClientPrefs.lowQuality) halloweenBG.animation.play('halloweem bg lightning strike');
+
+ lightningStrikeBeat = curBeat;
+ lightningOffset = FlxG.random.int(8, 24);
+
+ if(boyfriend.animOffsets.exists('scared')) {
+ boyfriend.playAnim('scared', true);
+ }
+ if(gf.animOffsets.exists('scared')) {
+ gf.playAnim('scared', true);
+ }
+
+ if(ClientPrefs.camZooms) {
+ FlxG.camera.zoom += 0.015;
+ camHUD.zoom += 0.03;
+
+ if(!camZooming) { //Just a way for preventing it to be permanently zoomed until Skid & Pump hits a note
+ FlxTween.tween(FlxG.camera, {zoom: defaultCamZoom}, 0.5);
+ FlxTween.tween(camHUD, {zoom: 1}, 0.5);
+ }
+ }
+
+ if(ClientPrefs.flashing) {
+ halloweenWhite.alpha = 0.4;
+ FlxTween.tween(halloweenWhite, {alpha: 0.5}, 0.075);
+ FlxTween.tween(halloweenWhite, {alpha: 0}, 0.25, {startDelay: 0.15});
+ }
+ }
+
+ function killHenchmen():Void
+ {
+ if(!ClientPrefs.lowQuality && curStage == 'limo') {
+ if(limoKillingState < 1) {
+ limoMetalPole.x = -400;
+ limoMetalPole.visible = true;
+ limoLight.visible = true;
+ limoCorpse.visible = false;
+ limoCorpseTwo.visible = false;
+ limoKillingState = 1;
+
+ #if ACHIEVEMENTS_ALLOWED
+ Achievements.henchmenDeath++;
+ var achieve:String = checkForAchievement(['roadkill_enthusiast']);
+ if (achieve != null) {
+ startAchievement(achieve);
+ } else {
+ FlxG.save.data.henchmenDeath = Achievements.henchmenDeath;
+ FlxG.save.flush();
+ }
+ FlxG.log.add('Deaths: ' + Achievements.henchmenDeath);
+ #end
+ }
+ }
+ }
+
+ function resetLimoKill():Void
+ {
+ if(curStage == 'limo') {
+ limoMetalPole.x = -500;
+ limoMetalPole.visible = false;
+ limoLight.x = -500;
+ limoLight.visible = false;
+ limoCorpse.x = -500;
+ limoCorpse.visible = false;
+ limoCorpseTwo.x = -500;
+ limoCorpseTwo.visible = false;
+ }
+ }
+
+ private var preventLuaRemove:Bool = false;
+ override function destroy() {
+ preventLuaRemove = true;
+ for (i in 0...luaArray.length) {
+ luaArray[i].call('onDestroy', []);
+ luaArray[i].stop();
+ }
+ luaArray = [];
+ super.destroy();
+ }
+
+ public function cancelFadeTween() {
+ if(FlxG.sound.music.fadeTween != null) {
+ FlxG.sound.music.fadeTween.cancel();
+ }
+ FlxG.sound.music.fadeTween = null;
+ }
+
+ public function removeLua(lua:FunkinLua) {
+ if(luaArray != null && !preventLuaRemove) {
+ luaArray.remove(lua);
+ }
+ }
+
+ var lastStepHit:Int = -1;
+ override function stepHit()
+ {
+ super.stepHit();
+ if (FlxG.sound.music.time > Conductor.songPosition + 20 || FlxG.sound.music.time < Conductor.songPosition - 20)
+ {
+ resyncVocals();
+ }
+
+ if(curStep == lastStepHit) {
+ return;
+ }
+
+ lastStepHit = curStep;
+ setOnLuas('curStep', curStep);
+ callOnLuas('onStepHit', []);
+ }
+
+ var lightningStrikeBeat:Int = 0;
+ var lightningOffset:Int = 8;
+
+ var lastBeatHit:Int = -1;
+ override function beatHit()
+ {
+ super.beatHit();
+
+ if(lastBeatHit >= curBeat) {
+ //trace('BEAT HIT: ' + curBeat + ', LAST HIT: ' + lastBeatHit);
+ return;
+ }
+
+ if (generatedMusic)
+ {
+ notes.sort(FlxSort.byY, ClientPrefs.downScroll ? FlxSort.ASCENDING : FlxSort.DESCENDING);
+ }
+
+ if (SONG.notes[Math.floor(curStep / 16)] != null)
+ {
+ if (SONG.notes[Math.floor(curStep / 16)].changeBPM)
+ {
+ Conductor.changeBPM(SONG.notes[Math.floor(curStep / 16)].bpm);
+ //FlxG.log.add('CHANGED BPM!');
+ setOnLuas('curBpm', Conductor.bpm);
+ setOnLuas('crochet', Conductor.crochet);
+ setOnLuas('stepCrochet', Conductor.stepCrochet);
+ }
+ setOnLuas('mustHitSection', SONG.notes[Math.floor(curStep / 16)].mustHitSection);
+ // else
+ // Conductor.changeBPM(SONG.bpm);
+ }
+ // FlxG.log.add('change bpm' + SONG.notes[Std.int(curStep / 16)].changeBPM);
+
+ if (generatedMusic && PlayState.SONG.notes[Std.int(curStep / 16)] != null && !endingSong && !isCameraOnForcedPos)
+ {
+ moveCameraSection(Std.int(curStep / 16));
+ }
+ if (camZooming && FlxG.camera.zoom < 1.35 && ClientPrefs.camZooms && curBeat % 4 == 0)
+ {
+ FlxG.camera.zoom += 0.015;
+ camHUD.zoom += 0.03;
+ }
+
+ iconP1.setGraphicSize(Std.int(iconP1.width + 30));
+ iconP2.setGraphicSize(Std.int(iconP2.width + 30));
+
+ iconP1.updateHitbox();
+ iconP2.updateHitbox();
+
+ if (curBeat % gfSpeed == 0 && !gf.stunned && gf.animation.curAnim.name != null && !gf.animation.curAnim.name.startsWith("sing"))
+ {
+ gf.dance();
+ }
+
+ if(curBeat % 2 == 0) {
+ if (boyfriend.animation.curAnim.name != null && !boyfriend.animation.curAnim.name.startsWith("sing"))
+ {
+ boyfriend.dance();
+ }
+ if (dad.animation.curAnim.name != null && !dad.animation.curAnim.name.startsWith("sing") && !dad.stunned)
+ {
+ dad.dance();
+ }
+ } else if(dad.danceIdle && dad.animation.curAnim.name != null && !dad.curCharacter.startsWith('gf') && !dad.animation.curAnim.name.startsWith("sing") && !dad.stunned) {
+ dad.dance();
+ }
+
+ switch (curStage)
+ {
+ case 'school':
+ if(!ClientPrefs.lowQuality) {
+ bgGirls.dance();
+ }
+
+ case 'mall':
+ if(!ClientPrefs.lowQuality) {
+ upperBoppers.dance(true);
+ }
+
+ if(heyTimer <= 0) bottomBoppers.dance(true);
+ santa.dance(true);
+
+ case 'limo':
+ if(!ClientPrefs.lowQuality) {
+ grpLimoDancers.forEach(function(dancer:BackgroundDancer)
+ {
+ dancer.dance();
+ });
+ }
+
+ if (FlxG.random.bool(10) && fastCarCanDrive)
+ fastCarDrive();
+ case "philly":
+ if (!trainMoving)
+ trainCooldown += 1;
+
+ if (curBeat % 4 == 0)
+ {
+ phillyCityLights.forEach(function(light:BGSprite)
+ {
+ light.visible = false;
+ });
+
+ curLight = FlxG.random.int(0, phillyCityLights.length - 1, [curLight]);
+
+ phillyCityLights.members[curLight].visible = true;
+ phillyCityLights.members[curLight].alpha = 1;
+ }
+
+ if (curBeat % 8 == 4 && FlxG.random.bool(30) && !trainMoving && trainCooldown > 8)
+ {
+ trainCooldown = FlxG.random.int(-4, 0);
+ trainStart();
+ }
+ }
+
+ if (curStage == 'spooky' && FlxG.random.bool(10) && curBeat > lightningStrikeBeat + lightningOffset)
+ {
+ lightningStrikeShit();
+ }
+ lastBeatHit = curBeat;
+
+ setOnLuas('curBeat', curBeat);
+ callOnLuas('onBeatHit', []);
+ }
+
+ public function callOnLuas(event:String, args:Array):Dynamic {
+ var returnVal:Dynamic = FunkinLua.Function_Continue;
+ #if LUA_ALLOWED
+ for (i in 0...luaArray.length) {
+ var ret:Dynamic = luaArray[i].call(event, args);
+ if(ret != FunkinLua.Function_Continue) {
+ returnVal = ret;
+ }
+ }
+ #end
+ return returnVal;
+ }
+
+ public function setOnLuas(variable:String, arg:Dynamic) {
+ #if LUA_ALLOWED
+ for (i in 0...luaArray.length) {
+ luaArray[i].set(variable, arg);
+ }
+ #end
+ }
+
+ function StrumPlayAnim(isDad:Bool, id:Int, time:Float) {
+ var spr:StrumNote = null;
+ if(isDad) {
+ spr = strumLineNotes.members[id];
+ } else {
+ spr = playerStrums.members[id];
+ }
+
+ if(spr != null) {
+ spr.playAnim('confirm', true);
+ spr.resetAnim = time;
+ }
+ }
+
+ public var ratingString:String;
+ public var ratingPercent:Float;
+ public function RecalculateRating() {
+ setOnLuas('score', songScore);
+ setOnLuas('misses', songMisses);
+ setOnLuas('hits', songHits);
+
+ var ret:Dynamic = callOnLuas('onRecalculateRating', []);
+ if(ret != FunkinLua.Function_Stop) {
+ ratingPercent = songHits / (songHits + songMisses); //Hur dur eu sou do IME, sei fazer continha kekekekeke ah se lascar pra lá Marcos, deixe eu com minhas regras de 3
+ if(!Math.isNaN(ratingPercent) && ratingPercent < 0) ratingPercent = 0;
+
+ if(Math.isNaN(ratingPercent)) {
+ ratingString = '?';
+ } else if(ratingPercent >= 1) {
+ ratingPercent = 1;
+ ratingString = ratingStuff[ratingStuff.length-1][0]; //Uses last string
+ } else {
+ for (i in 0...ratingStuff.length-1) {
+ if(ratingPercent < ratingStuff[i][1]) {
+ ratingString = ratingStuff[i][0];
+ break;
+ }
+ }
+ }
+
+ setOnLuas('rating', ratingPercent);
+ setOnLuas('ratingName', ratingString);
+ }
+ }
+
+ #if ACHIEVEMENTS_ALLOWED
+ private function checkForAchievement(achievesToCheck:Array):String {
+ for (i in 0...achievesToCheck.length) {
+ var achievementName:String = achievesToCheck[i];
+ if(!Achievements.isAchievementUnlocked(achievementName)) {
+ var unlock:Bool = false;
+ switch(achievementName)
+ {
+ case 'week1_nomiss' | 'week2_nomiss' | 'week3_nomiss' | 'week4_nomiss' | 'week5_nomiss' | 'week6_nomiss' | 'week7_nomiss':
+ if(isStoryMode && campaignMisses + songMisses < 1 && CoolUtil.difficultyString() == 'HARD' && storyPlaylist.length <= 1 && !changedDifficulty && !usedPractice)
+ {
+ var weekName:String = WeekData.getWeekFileName();
+ switch(weekName) //I know this is a lot of duplicated code, but it's easier readable and you can add weeks with different names than the achievement tag
+ {
+ case 'week1':
+ if(achievementName == 'week1_nomiss') unlock = true;
+ case 'week2':
+ if(achievementName == 'week2_nomiss') unlock = true;
+ case 'week3':
+ if(achievementName == 'week3_nomiss') unlock = true;
+ case 'week4':
+ if(achievementName == 'week4_nomiss') unlock = true;
+ case 'week5':
+ if(achievementName == 'week5_nomiss') unlock = true;
+ case 'week6':
+ if(achievementName == 'week6_nomiss') unlock = true;
+ case 'week7':
+ if(achievementName == 'week7_nomiss') unlock = true;
+ }
+ }
+ case 'ur_bad':
+ if(ratingPercent < 0.2 && !practiceMode && !cpuControlled) {
+ unlock = true;
+ }
+ case 'ur_good':
+ if(ratingPercent >= 1 && !usedPractice && !cpuControlled) {
+ unlock = true;
+ }
+ case 'roadkill_enthusiast':
+ if(Achievements.henchmenDeath >= 100) {
+ unlock = true;
+ }
+ case 'oversinging':
+ if(boyfriend.holdTimer >= 20 && !usedPractice) {
+ unlock = true;
+ }
+ case 'hype':
+ if(!boyfriendIdled && !usedPractice) {
+ unlock = true;
+ }
+ case 'two_keys':
+ if(!usedPractice) {
+ var howManyPresses:Int = 0;
+ for (j in 0...keysPressed.length) {
+ if(keysPressed[j]) howManyPresses++;
+ }
+
+ if(howManyPresses <= 2) {
+ unlock = true;
+ }
+ }
+ case 'toastie':
+ if(/*ClientPrefs.framerate <= 60 &&*/ ClientPrefs.lowQuality && !ClientPrefs.globalAntialiasing && !ClientPrefs.imagesPersist) {
+ unlock = true;
+ }
+ case 'debugger':
+ if(Paths.formatToSongPath(SONG.song) == 'test' && !usedPractice) {
+ unlock = true;
+ }
+ }
+
+ if(unlock) {
+ Achievements.unlockAchievement(achievementName);
+ return achievementName;
+ }
+ }
+ }
+ return null;
+ }
+ #end
+
+ var curLight:Int = 0;
+ var curLightEvent:Int = 0;
+}
\ No newline at end of file