diff --git a/.github/ISSUE_TEMPLATE/bugs.yml b/.github/ISSUE_TEMPLATE/bugs.yml new file mode 100644 index 000000000..2f59723cb --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bugs.yml @@ -0,0 +1,16 @@ +name: Bug report +description: Report bugs with the engine here +labels: [bug] +body: + - type: textarea + attributes: + label: Bug report + validations: + required: true + + - type: input + attributes: + label: Did you edit anything? If so, mention or summarize your changes. + description: 'For example: "Yes, i edited PlayState.hx and tried to mess with how health icon animation frames are handled" or "No, everything is the same as the base engine!"' + validations: + required: true \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 000000000..8e9f9162b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,2 @@ +blank_issues_enabled: false +contact_links: [] \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml new file mode 100644 index 000000000..9214af5b4 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -0,0 +1,9 @@ +name: Feature Request +description: No, i won't add 6K/etc to the engine or winning icons, stop asking for it. +labels: [enhancement] +body: + - type: textarea + attributes: + label: What feature do you want to get added on the base engine? + validations: + required: true \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/help.yml b/.github/ISSUE_TEMPLATE/help.yml new file mode 100644 index 000000000..eb2beccc2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/help.yml @@ -0,0 +1,19 @@ +name: Help wanted +description: If you need help using the engine. +labels: [help wanted] +body: + + - type: dropdown + attributes: + label: Are you trying to code on Source Code (Haxe) or on the Downloaded Build (Lua)? + options: + - Source Code + - Downloaded Build + validations: + required: true + - type: textarea + attributes: + label: Show an screenshot/video of your problem. + description: Put down here an screenshot of your compiling issue or whatever is happening to you. + validations: + required: true \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/missing-docs.yml b/.github/ISSUE_TEMPLATE/missing-docs.yml new file mode 100644 index 000000000..ab8ae2b74 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/missing-docs.yml @@ -0,0 +1,10 @@ +name: Missing Documentation +description: Ask for documentation if something is missing. +labels: [documentation] +body: + - type: textarea + attributes: + label: What needs to be documented? + description: 'For example: "There is no page explaining how to create an Achievement!"' + validations: + required: true \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/question.yml b/.github/ISSUE_TEMPLATE/question.yml new file mode 100644 index 000000000..8e04906bd --- /dev/null +++ b/.github/ISSUE_TEMPLATE/question.yml @@ -0,0 +1,9 @@ +name: Question +description: Ask about something here. +labels: [question] +body: + - type: textarea + attributes: + label: What is your question? + validations: + required: true \ No newline at end of file diff --git a/.gitignore b/.gitignore index 7dbb7d607..d547585d0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ export/ .vscode/ -APIStuff.hx \ No newline at end of file +APIStuff.hx +art/build_x32-officialrelease.bat +art/build_x64-officialrelease.bat +art/test_x64-debug-officialrelease.bat \ No newline at end of file diff --git a/Project.xml b/Project.xml index 8431213d8..11a9ab76f 100644 --- a/Project.xml +++ b/Project.xml @@ -2,7 +2,7 @@ - + @@ -14,6 +14,8 @@ + + @@ -33,13 +35,13 @@ - + - + @@ -47,20 +49,22 @@ - - - + + + + + + +
- - @@ -71,8 +75,6 @@
- - @@ -80,14 +82,13 @@
+ - - - - diff --git a/README.md b/README.md index 9d65626d6..9ed0e8748 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,30 @@ -

- -

- -This is the repository for Psych Engine, original game by "NinjaMuffin99". +# Friday Night Funkin' - Psych Engine +Engine originally used on [Mind Games Mod](https://gamebanana.com/mods/301107), intended to be a fix for the vanilla version's many issues while keeping the casual play aspect of it. Also aiming to be an easier alternative to newbie coders. -Play the Ludum Dare prototype here: https://ninja-muffin24.itch.io/friday-night-funkin -Play the Newgrounds one here: https://www.newgrounds.com/portal/view/770371 -Support the project on the itch.io page: https://ninja-muffin24.itch.io/funkin +## Installation: +Follow a Friday Night Funkin' source code compilation tutorial, after this you will need to install LuaJIT. -IF YOU MAKE A MOD AND DISTRIBUTE A MODIFIED / RECOMIPLED VERSION, YOU MUST OPEN SOURCE YOUR MOD AS WELL +You can do this with: `haxelib install linc_luajit` on a Command prompt/PowerShell + +...Or if you don't want your mod to be able to run .lua scripts, delete the "LUA_ALLOWED" line on Project.xml + +## Credits: +* Shadow Mario - Coding +* RiverOaken - Arts and Animations + +### Special Thanks +* Keoiki - Note Splash Animations + +WARNING: This engine is still very early in development! You can request new features though +_____________________________________ + +# Features ## Attractive animated dialogue boxes: ![](https://user-images.githubusercontent.com/44785097/127706669-71cd5cdb-5c2a-4ecc-871b-98a276ae8070.gif) + ## Atleast one change to every week: ### Week 1: * New Dad Left sing sprite @@ -35,71 +46,41 @@ IF YOU MAKE A MOD AND DISTRIBUTE A MODIFIED / RECOMIPLED VERSION, YOU MUST OPEN * On Thorns, the HUD is hidden during the cutscene * Also there's the Background girls being spooky during the "Hey!" parts of the Instrumental -# download - -https://github.com/kviks/Psych-Engine-Android/releases/ - - -# screenshots -
- - - - -
- -# Build instructions (by luckydog7) - -1. first of all we need to set up haxe and haxeflixel read more here - https://github.com/ninjamuffin99/Funkin - - - Install haxe 4.2.2 instead of 4.1.5 - - if you updated it dont forget execute this command `haxelib upgrade` and press 'y' everywhere - - Also get extension-webm using this command: `haxelib git extension-webm https://github.com/KlavierGayming/extension-webm` - - the reason we use a different repo again is cuz of a lil error that happens with the audio sync, just adds a "public var renderedFrames" instead of "var renderedFrames", that's all extra that's needed - - -2. after that, download Android studio, Jdk, Ndk revision 15c from these sites - - - jdk - https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html - - - android studio - https://developer.android.com/studio - - - ndk - https://developer.android.com/ndk/downloads/older_releases?hl=fi - - -3.install jdk, android studio - - unzip ndk (ndk does not need to be installed) - - -4. we need to set up android studio for this go to android studio and find android sdk (in settings -> Appearance & Behavior -> system settings -> android sdk) -![andr](https://user-images.githubusercontent.com/59097731/104179652-44346000-541d-11eb-8ad1-1e4dfae304a8.PNG) -![andr2](https://user-images.githubusercontent.com/59097731/104179943-a9885100-541d-11eb-8f69-7fb5a4bfdd37.PNG) - - -5.and run command `lime setup android` - - you need to insert the program paths - - - as in this picture (use jdk, not jre) -![lime](https://user-images.githubusercontent.com/59097731/104179268-9e80f100-541c-11eb-948d-a00d85317b1a.PNG) - - - Now do "lime rebuild extension-webm windows" (in the command line), if you're planning to build for windows. If you're plannin to build for android (which you obviously are), use "lime rebuild extension-webm android". If you get an error, download [this](https://www.mediafire.com/file/8jteungeq2bzc3l/Android.zip/file) and put the folder inside it in C:/HaxeToolkit/haxe/lib/extension-webm/git/ndll - - -7. open project in command line `cd (path to fnf source)` - - and run command `haxelib install linc-luajit` - - and run command `lime build android` - - apk will be generated in this path (path to source)\export\release\android\bin\app\build\outputs\apk\debug\Funkin-debug.apk - - -## Credits -- Shadow Mario - Coding Psych Engine -- RiverOaken - Arts and Animations Psych Engine -- Keoiki - Note Splash Animations Psych Engine -- ninjamuffin99 - Programmer original FNF -- PhantomArcade3K - Art original FNF -- Evilsk8r - Art original FNF -- Kawaisprite- Musician original FNF -- luckydog - original android port -- kviks (me!) - psych engine port - -This game was made with love to Newgrounds and it's community. Extra love to Tom Fulp. +## Cool new Chart Editor changes and countless bug fixes +![](https://i.imgur.com/h6Ja7eT.png) +* You can now chart "Event" notes, which are bookmarks that trigger specific actions that usually were hardcoded on the vanilla version of the game. +* Your song's BPM can now have decimal values +* You can manually adjust a Note's strum time if you're really going for milisecond precision +* You can change a note's type on the Editor, it comes with two example types: + * Alt Animation: Forces an alt animation to play, useful for songs like Ugh/Stress + * Hey: Forces a "Hey" animation instead of the base Sing animation, if Boyfriend hits this note, Girlfriend will do a "Hey!" too. + +## Improved Animation Debug menu (Press 8 in-game on a Debug build) +![](https://user-images.githubusercontent.com/44785097/127721062-f912853c-2513-41b8-bd66-fd80d9d4ee0f.png) +* You can now press Save Offsets to save a .txt file with the editted offsets +* You can also now change the characters while on the Menu +* Go back to the game by pressing Escape +NOTE: This should be used for fixing your character floating or being slightly under the ground! It's not for texture editting. + +## Story mode menu rework: +![](https://i.imgur.com/UB2EKpV.png) +* Added a different BG to every song (less Tutorial) +* All menu characters are now in individual spritesheets, makes modding it easier. + +## Credits menu +![](https://i.imgur.com/NdIQt3d.png) +* You can add a head icon, name, description and a Redirect link for when the player presses Enter while the item is currently selected. + +## Awards/Achievements +* The engine comes with 16 example achievements that you can mess with and learn how it works (Check Achievements.hx and search for "checkForAchievement" on PlayState.hx) + +## Options menu: +* You can change Note colors, Controls and Preferences there. + * On Preferences you can toggle Downscroll, Anti-Aliasing, Framerate, Low Quality, Note Splashes, Hide Hud elements, Flashing Lights, etc. + +## Other gameplay features: +* When the enemy hits a note, it plays the note hit animation on their strum, just like when the player hits a note. +* Lag doesn't impact the camera movement and player icon scaling anymore. +* Some stuff based on Week 7's changes has been put in (Background colors on Freeplay, Note splashes) +* You can reset your Score on Freeplay/Story Mode by pressing Reset button. +* You can listen to a song on Freeplay by pressing Space once. diff --git a/art/build_x32.bat b/art/build_x32.bat index 3a5e616c3..3e8c61324 100644 --- a/art/build_x32.bat +++ b/art/build_x32.bat @@ -2,9 +2,9 @@ color 0a cd .. echo BUILDING GAME -lime build windows -release -32 +lime build windows -32 -release -D 32bits echo. echo done. pause pwd -explorer.exe export\release\windows\bin \ No newline at end of file +explorer.exe export\32bit\windows\bin \ No newline at end of file diff --git a/art/flashFiles/DADDY_DEAREST.fla b/art/flashFiles/DADDY_DEAREST.fla new file mode 100644 index 000000000..a72e90b2b Binary files /dev/null and b/art/flashFiles/DADDY_DEAREST.fla differ diff --git a/art/flashFiles/dialogueStuff.fla b/art/flashFiles/dialogueStuff.fla index 7e38fdc26..7eaa632ed 100644 Binary files a/art/flashFiles/dialogueStuff.fla and b/art/flashFiles/dialogueStuff.fla differ diff --git a/assets/preload/characters/bf.json b/assets/preload/characters/bf.json index 7252b2957..5fdbf4390 100644 --- a/assets/preload/characters/bf.json +++ b/assets/preload/characters/bf.json @@ -14,7 +14,7 @@ { "loop": false, "offsets": [ - 12, + 5, -6 ], "anim": "singLEFT", @@ -47,7 +47,7 @@ { "loop": false, "offsets": [ - -38, + -48, -7 ], "anim": "singRIGHT", @@ -58,8 +58,8 @@ { "loop": false, "offsets": [ - 12, - 24 + 7, + 19 ], "anim": "singLEFTmiss", "fps": 24, @@ -69,7 +69,7 @@ { "loop": false, "offsets": [ - -11, + -15, -19 ], "anim": "singDOWNmiss", @@ -80,7 +80,7 @@ { "loop": false, "offsets": [ - -29, + -36, 27 ], "anim": "singUPmiss", @@ -91,8 +91,8 @@ { "loop": false, "offsets": [ - -30, - 21 + -44, + 22 ], "anim": "singRIGHTmiss", "fps": 24, @@ -164,6 +164,39 @@ "fps": 24, "name": "BF Dead confirm", "indices": [] + }, + { + "loop": false, + "offsets": [ + -10, + -16 + ], + "anim": "dodge", + "fps": 24, + "name": "boyfriend dodge", + "indices": [] + }, + { + "loop": false, + "offsets": [ + 294, + 267 + ], + "anim": "attack", + "fps": 24, + "name": "boyfriend attack", + "indices": [] + }, + { + "loop": false, + "offsets": [ + -40, + -40 + ], + "anim": "pre-attack", + "fps": 24, + "name": "bf pre attack", + "indices": [] } ], "no_antialiasing": false, diff --git a/assets/preload/characters/dad.json b/assets/preload/characters/dad.json index fe7e97664..7cf13a022 100644 --- a/assets/preload/characters/dad.json +++ b/assets/preload/characters/dad.json @@ -118,6 +118,17 @@ 59 ], "name": "Dad Sing Note UP" + }, + { + "loop": false, + "offsets": [ + 140, + -100 + ], + "anim": "hey", + "fps": 24, + "name": "WhatYouKnowAboutRollingDownInTheDeep", + "indices": [] } ], "no_antialiasing": false, diff --git a/assets/preload/characters/senpai-angry.json b/assets/preload/characters/senpai-angry.json index cf1920aa6..a7c1777ad 100644 --- a/assets/preload/characters/senpai-angry.json +++ b/assets/preload/characters/senpai-angry.json @@ -1,59 +1,59 @@ { "animations": [ { - "loop": false, "offsets": [ 2, 0 ], - "fps": 24, + "loop": false, "anim": "idle", - "indices": [], - "name": "Angry Senpai Idle" + "fps": 24, + "name": "Angry Senpai Idle", + "indices": [] }, { - "loop": false, "offsets": [ 5, 37 ], - "fps": 24, + "loop": false, "anim": "singUP", - "indices": [], - "name": "Angry Senpai UP NOTE" + "fps": 24, + "name": "Angry Senpai UP NOTE", + "indices": [] }, { - "loop": false, "offsets": [ 40, 0 ], - "fps": 24, + "loop": false, "anim": "singLEFT", - "indices": [], - "name": "Angry Senpai LEFT NOTE" + "fps": 24, + "name": "Angry Senpai LEFT NOTE", + "indices": [] }, { - "loop": false, "offsets": [ 0, 0 ], - "fps": 24, + "loop": false, "anim": "singRIGHT", - "indices": [], - "name": "Angry Senpai RIGHT NOTE" + "fps": 24, + "name": "Angry Senpai RIGHT NOTE", + "indices": [] }, { - "loop": false, "offsets": [ 14, 0 ], - "fps": 24, + "loop": false, "anim": "singDOWN", - "indices": [], - "name": "Angry Senpai DOWN NOTE" + "fps": 24, + "name": "Angry Senpai DOWN NOTE", + "indices": [] } ], "no_antialiasing": true, @@ -62,7 +62,7 @@ 150, 360 ], - "healthicon": "senpai", + "healthicon": "senpai-pixel", "flip_x": false, "healthbar_colors": [ 255, diff --git a/assets/preload/characters/senpai.json b/assets/preload/characters/senpai.json index 27857dcb4..88c5143e5 100644 --- a/assets/preload/characters/senpai.json +++ b/assets/preload/characters/senpai.json @@ -1,59 +1,59 @@ { "animations": [ { - "loop": false, "offsets": [ 1, 0 ], - "fps": 24, + "loop": false, "anim": "idle", - "indices": [], - "name": "Senpai Idle" + "fps": 24, + "name": "Senpai Idle", + "indices": [] }, { - "loop": false, "offsets": [ 5, 37 ], - "anim": "singUP", + "loop": false, "fps": 24, - "name": "SENPAI UP NOTE", - "indices": [] + "anim": "singUP", + "indices": [], + "name": "SENPAI UP NOTE" }, { - "loop": false, "offsets": [ 0, 0 ], - "anim": "singRIGHT", + "loop": false, "fps": 24, - "name": "SENPAI RIGHT NOTE", - "indices": [] + "anim": "singRIGHT", + "indices": [], + "name": "SENPAI RIGHT NOTE" }, { - "loop": false, "offsets": [ 40, 0 ], - "anim": "singLEFT", + "loop": false, "fps": 24, - "name": "SENPAI LEFT NOTE", - "indices": [] + "anim": "singLEFT", + "indices": [], + "name": "SENPAI LEFT NOTE" }, { - "loop": false, "offsets": [ 14, 0 ], - "anim": "singDOWN", + "loop": false, "fps": 24, - "name": "SENPAI DOWN NOTE", - "indices": [] + "anim": "singDOWN", + "indices": [], + "name": "SENPAI DOWN NOTE" } ], "no_antialiasing": true, @@ -62,7 +62,7 @@ 150, 360 ], - "healthicon": "senpai", + "healthicon": "senpai-pixel", "flip_x": false, "healthbar_colors": [ 255, diff --git a/assets/preload/characters/spirit.json b/assets/preload/characters/spirit.json index 0e936e4cb..6d300bcaa 100644 --- a/assets/preload/characters/spirit.json +++ b/assets/preload/characters/spirit.json @@ -1,59 +1,59 @@ { "animations": [ { - "loop": false, "offsets": [ -218, -280 ], - "fps": 24, + "loop": false, "anim": "idle", - "indices": [], - "name": "idle spirit_" + "fps": 24, + "name": "idle spirit_", + "indices": [] }, { - "loop": false, "offsets": [ -200, -280 ], - "fps": 24, + "loop": false, "anim": "singLEFT", - "indices": [], - "name": "left_" + "fps": 24, + "name": "left_", + "indices": [] }, { - "loop": false, "offsets": [ 170, 110 ], - "fps": 24, + "loop": false, "anim": "singDOWN", - "indices": [], - "name": "spirit down_" + "fps": 24, + "name": "spirit down_", + "indices": [] }, { - "loop": false, "offsets": [ -220, -280 ], - "fps": 24, + "loop": false, "anim": "singRIGHT", - "indices": [], - "name": "right_" + "fps": 24, + "name": "right_", + "indices": [] }, { - "loop": false, "offsets": [ -220, -240 ], - "fps": 24, + "loop": false, "anim": "singUP", - "indices": [], - "name": "up_" + "fps": 24, + "name": "up_", + "indices": [] } ], "no_antialiasing": true, @@ -62,7 +62,7 @@ -150, 100 ], - "healthicon": "spirit", + "healthicon": "spirit-pixel", "flip_x": false, "healthbar_colors": [ 255, diff --git a/assets/preload/data/bopeebo/bopeebo-easy.json b/assets/preload/data/bopeebo/bopeebo-easy.json index f32e1dd27..937ce4a9a 100644 --- a/assets/preload/data/bopeebo/bopeebo-easy.json +++ b/assets/preload/data/bopeebo/bopeebo-easy.json @@ -1 +1,810 @@ -{"song":{"song":"Bopeebo","bpm":100.0,"needsVoices":true,"player1":"bf","player2":"dad","speed":1.0,"notes":[{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[0.0,2,0.0],[600.0,3,450.0],[1200.0,3,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[2400.0,2,0.0],[3000.0,3,450.0],[3600.0,3,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[4800.0,1,300.0],[5400.0,0,300.0],[6000.0,3,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[7200.0,1,300.0],[7800.0,0,300.0],[8400.0,3,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[9600.0,1,0.0],[10200.0,3,0.0],[10500.0,0,0.0],[10800.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[12000.0,1,0.0],[12600.0,3,0.0],[12900.0,0,0.0],[13200.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[14400.0,3,0.0],[14700.0,1,0.0],[15300.0,0,0.0],[15600.0,2,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[16800.0,3,0.0],[17100.0,1,0.0],[17700.0,0,0.0],[18000.0,2,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[19200.0,0,0.0],[19500.0,3,0.0],[19800.0,1,900.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[21600.0,0,0.0],[21900.0,3,0.0],[22200.0,1,900.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24000.0,1,0.0],[24300.0,3,0.0],[24600.0,0,900.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[26400.0,1,0.0],[26700.0,3,0.0],[27000.0,0,900.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[28800.0,2,0.0],[29100.0,3,0.0],[29400.0,0,1200.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[31200.0,2,0.0],[31500.0,3,0.0],[31800.0,0,1200.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[33600.0,0,0.0],[33900.0,3,0.0],[34500.0,2,0.0],[34800.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[36000.0,0,0.0],[36300.0,3,0.0],[36900.0,2,0.0],[37200.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[38400.0,2,450.0],[39000.0,3,300.0],[39600.0,0,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[40800.0,2,450.0],[41400.0,3,300.0],[42000.0,0,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[43200.0,1,0.0],[43800.0,2,0.0],[44400.0,1,0.0],[44700.0,1,0.0],[45000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[45600.0,1,0.0],[46200.0,2,0.0],[46800.0,1,0.0],[47100.0,1,0.0],[47400.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[48000.0,2,450.0],[48600.0,3,300.0],[49200.0,0,450.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[50400.0,2,450.0],[51000.0,3,300.0],[51600.0,0,450.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[52800.0,3,1800.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[55200.0,3,1800.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[57600.0,2,0.0],[57900.0,3,0.0],[58200.0,0,1200.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[60000.0,2,0.0],[60300.0,3,0.0],[60600.0,0,1200.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[62400.0,0,0.0],[62700.0,3,0.0],[63300.0,2,0.0],[63600.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[64800.0,0,0.0],[65100.0,3,0.0],[65700.0,2,0.0],[66000.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[67200.0,2,0.0],[67500.0,3,0.0],[67800.0,0,0.0],[68100.0,2,0.0],[68400.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[69600.0,2,0.0],[69900.0,3,0.0],[70200.0,0,0.0],[70500.0,2,0.0],[70800.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[72000.0,0,0.0],[72300.0,3,0.0],[72900.0,2,0.0],[73200.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[74400.0,0,0.0],[74700.0,3,0.0],[75300.0,2,0.0],[75600.0,1,600.0]]}]},"generatedBy":"SNIFF ver.6"} \ No newline at end of file +{ + "song": { + "player1": "bf", + "notes": [ + { + "sectionNotes": [ + [ + 0, + 2, + 0 + ], + [ + 600, + 3, + 450 + ], + [ + 1200, + 3, + 450 + ] + ], + "lengthInSteps": 16, + "mustHitSection": false + }, + { + "sectionNotes": [ + [ + 2400, + 2, + 0 + ], + [ + 3000, + 3, + 450 + ], + [ + 3600, + 3, + 450 + ] + ], + "lengthInSteps": 16, + "mustHitSection": true + }, + { + "sectionNotes": [ + [ + 4800, + 1, + 300 + ], + [ + 5400, + 0, + 300 + ], + [ + 6000, + 3, + 525 + ] + ], + "lengthInSteps": 16, + "mustHitSection": false + }, + { + "sectionNotes": [ + [ + 7200, + 1, + 300 + ], + [ + 7800, + 0, + 300 + ], + [ + 8400, + 3, + 525 + ] + ], + "lengthInSteps": 16, + "mustHitSection": true + }, + { + "sectionNotes": [ + [ + 9600, + 1, + 0 + ], + [ + 10200, + 3, + 0 + ], + [ + 10500, + 0, + 0 + ], + [ + 10800, + 1, + 600 + ] + ], + "lengthInSteps": 16, + "mustHitSection": false + }, + { + "sectionNotes": [ + [ + 12000, + 1, + 0 + ], + [ + 12600, + 3, + 0 + ], + [ + 12900, + 0, + 0 + ], + [ + 13200, + 1, + 600 + ] + ], + "lengthInSteps": 16, + "mustHitSection": true + }, + { + "sectionNotes": [ + [ + 14400, + 3, + 0 + ], + [ + 14700, + 1, + 0 + ], + [ + 15300, + 0, + 0 + ], + [ + 15600, + 2, + 600 + ] + ], + "lengthInSteps": 16, + "mustHitSection": false + }, + { + "sectionNotes": [ + [ + 16800, + 3, + 0 + ], + [ + 17100, + 1, + 0 + ], + [ + 17700, + 0, + 0 + ], + [ + 18000, + 2, + 600 + ] + ], + "lengthInSteps": 16, + "mustHitSection": true + }, + { + "sectionNotes": [ + [ + 19200, + 0, + 0 + ], + [ + 19500, + 3, + 0 + ], + [ + 19800, + 1, + 900 + ] + ], + "lengthInSteps": 16, + "mustHitSection": false + }, + { + "sectionNotes": [ + [ + 21600, + 0, + 0 + ], + [ + 21900, + 3, + 0 + ], + [ + 22200, + 1, + 900 + ] + ], + "lengthInSteps": 16, + "mustHitSection": true + }, + { + "sectionNotes": [ + [ + 24000, + 1, + 0 + ], + [ + 24300, + 3, + 0 + ], + [ + 24600, + 0, + 900 + ] + ], + "lengthInSteps": 16, + "mustHitSection": false + }, + { + "sectionNotes": [ + [ + 26400, + 1, + 0 + ], + [ + 26700, + 3, + 0 + ], + [ + 27000, + 0, + 900 + ] + ], + "lengthInSteps": 16, + "mustHitSection": true + }, + { + "sectionNotes": [ + [ + 28800, + 2, + 0 + ], + [ + 29100, + 3, + 0 + ], + [ + 29400, + 0, + 1125 + ] + ], + "lengthInSteps": 16, + "mustHitSection": false + }, + { + "sectionNotes": [ + [ + 31200, + 2, + 0 + ], + [ + 31500, + 3, + 0 + ], + [ + 31800, + 0, + 1125 + ] + ], + "lengthInSteps": 16, + "mustHitSection": true + }, + { + "sectionNotes": [ + [ + 33600, + 0, + 0 + ], + [ + 33900, + 3, + 0 + ], + [ + 34500, + 2, + 0 + ], + [ + 34800, + 1, + 600 + ] + ], + "lengthInSteps": 16, + "mustHitSection": false + }, + { + "sectionNotes": [ + [ + 36000, + 0, + 0 + ], + [ + 36300, + 3, + 0 + ], + [ + 36900, + 2, + 0 + ], + [ + 37200, + 1, + 600 + ] + ], + "lengthInSteps": 16, + "mustHitSection": true + }, + { + "sectionNotes": [ + [ + 38400, + 2, + 450 + ], + [ + 39000, + 3, + 300 + ], + [ + 39600, + 0, + 525 + ] + ], + "lengthInSteps": 16, + "mustHitSection": false + }, + { + "sectionNotes": [ + [ + 40800, + 2, + 450 + ], + [ + 41400, + 3, + 300 + ], + [ + 42000, + 0, + 525 + ] + ], + "lengthInSteps": 16, + "mustHitSection": true + }, + { + "sectionNotes": [ + [ + 43200, + 1, + 0 + ], + [ + 43800, + 2, + 0 + ], + [ + 44400, + 1, + 0 + ], + [ + 44700, + 1, + 0 + ], + [ + 45000, + 2, + 0 + ] + ], + "lengthInSteps": 16, + "mustHitSection": false + }, + { + "sectionNotes": [ + [ + 45600, + 1, + 0 + ], + [ + 46200, + 2, + 0 + ], + [ + 46800, + 1, + 0 + ], + [ + 47100, + 1, + 0 + ], + [ + 47400, + 2, + 0 + ] + ], + "lengthInSteps": 16, + "mustHitSection": true + }, + { + "sectionNotes": [ + [ + 48000, + 2, + 450 + ], + [ + 48600, + 3, + 300 + ], + [ + 49200, + 0, + 450 + ] + ], + "lengthInSteps": 16, + "mustHitSection": false + }, + { + "sectionNotes": [ + [ + 50400, + 2, + 450 + ], + [ + 51000, + 3, + 300 + ], + [ + 51600, + 0, + 450 + ] + ], + "lengthInSteps": 16, + "mustHitSection": true + }, + { + "sectionNotes": [ + [ + 52800, + 3, + 1725 + ] + ], + "lengthInSteps": 16, + "mustHitSection": false + }, + { + "sectionNotes": [ + [ + 55200, + 3, + 1725 + ] + ], + "lengthInSteps": 16, + "mustHitSection": true + }, + { + "sectionNotes": [ + [ + 57600, + 2, + 0 + ], + [ + 57900, + 3, + 0 + ], + [ + 58200, + 0, + 1125 + ] + ], + "lengthInSteps": 16, + "mustHitSection": false + }, + { + "sectionNotes": [ + [ + 60000, + 2, + 0 + ], + [ + 60300, + 3, + 0 + ], + [ + 60600, + 0, + 1125 + ] + ], + "lengthInSteps": 16, + "mustHitSection": true + }, + { + "sectionNotes": [ + [ + 62400, + 0, + 0 + ], + [ + 62700, + 3, + 0 + ], + [ + 63300, + 2, + 0 + ], + [ + 63600, + 1, + 525 + ] + ], + "lengthInSteps": 16, + "mustHitSection": false + }, + { + "sectionNotes": [ + [ + 64800, + 0, + 0 + ], + [ + 65100, + 3, + 0 + ], + [ + 65700, + 2, + 0 + ], + [ + 66000, + 1, + 525 + ] + ], + "lengthInSteps": 16, + "mustHitSection": true + }, + { + "sectionNotes": [ + [ + 67200, + 2, + 0 + ], + [ + 67500, + 3, + 0 + ], + [ + 67800, + 0, + 0 + ], + [ + 68100, + 2, + 0 + ], + [ + 68400, + 1, + 525 + ] + ], + "lengthInSteps": 16, + "mustHitSection": false + }, + { + "sectionNotes": [ + [ + 69600, + 2, + 0 + ], + [ + 69900, + 3, + 0 + ], + [ + 70200, + 0, + 0 + ], + [ + 70500, + 2, + 0 + ], + [ + 70800, + 1, + 525 + ] + ], + "lengthInSteps": 16, + "mustHitSection": true + }, + { + "sectionNotes": [ + [ + 72000, + 0, + 0 + ], + [ + 72300, + 3, + 0 + ], + [ + 72900, + 2, + 0 + ], + [ + 73200, + 1, + 525 + ] + ], + "lengthInSteps": 16, + "mustHitSection": false + }, + { + "sectionNotes": [ + [ + 74400, + 0, + 0 + ], + [ + 74700, + 3, + 0 + ], + [ + 75300, + 2, + 0 + ], + [ + 75600, + 1, + 525 + ] + ], + "lengthInSteps": 16, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 100, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 100, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 100, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 100, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 100, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 100, + "changeBPM": false, + "mustHitSection": true + } + ], + "player2": "dad", + "player3": "gf", + "song": "Bopeebo", + "needsVoices": true, + "validScore": true, + "bpm": 100, + "speed": 1 + } +} \ No newline at end of file diff --git a/assets/preload/data/bopeebo/bopeebo.json b/assets/preload/data/bopeebo/bopeebo.json index 3567ce5e4..c931cbf68 100644 --- a/assets/preload/data/bopeebo/bopeebo.json +++ b/assets/preload/data/bopeebo/bopeebo.json @@ -1 +1,850 @@ -{"song":{"song":"Bopeebo","bpm":100.0,"needsVoices":true,"player1":"bf","player2":"dad","speed":1.0,"notes":[{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[0.0,2,0.0],[600.0,3,600.0],[1200.0,3,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[2400.0,2,0.0],[3000.0,3,600.0],[3600.0,3,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[4800.0,1,300.0],[5400.0,0,300.0],[6000.0,3,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[7200.0,1,300.0],[7800.0,0,300.0],[8400.0,3,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[9600.0,1,300.0],[10200.0,3,0.0],[10500.0,0,0.0],[10800.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[12000.0,1,300.0],[12600.0,3,0.0],[12900.0,0,0.0],[13200.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[14400.0,3,0.0],[14700.0,1,0.0],[15300.0,0,0.0],[15600.0,2,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[16800.0,3,0.0],[17100.0,1,0.0],[17700.0,0,0.0],[18000.0,2,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[19200.0,0,0.0],[19500.0,3,0.0],[19800.0,1,900.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[21600.0,0,0.0],[21900.0,3,0.0],[22200.0,1,900.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24000.0,1,0.0],[24300.0,3,0.0],[24600.0,0,900.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[26400.0,1,0.0],[26700.0,3,0.0],[27000.0,0,900.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[28800.0,2,0.0],[29100.0,3,0.0],[29400.0,0,1200.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[31200.0,2,0.0],[31500.0,3,0.0],[31800.0,0,1200.0],[33300.0,6,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[33600.0,0,0.0],[33900.0,3,0.0],[34500.0,2,0.0],[34800.0,1,600.0],[35700.0,6,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[36000.0,0,0.0],[36300.0,3,0.0],[36900.0,2,0.0],[37200.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[38400.0,2,450.0],[39000.0,3,300.0],[39600.0,0,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[40800.0,2,450.0],[41400.0,3,300.0],[42000.0,0,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[43200.0,1,0.0],[43800.0,2,0.0],[44400.0,1,0.0],[44550.0,1,0.0],[44700.0,1,0.0],[45000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[45600.0,1,0.0],[46200.0,2,0.0],[46800.0,1,0.0],[46950.0,1,0.0],[47100.0,1,0.0],[47400.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[48000.0,2,450.0],[48600.0,3,300.0],[49200.0,0,450.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[50400.0,2,450.0],[51000.0,3,300.0],[51600.0,0,450.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[52800.0,3,1800.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[55200.0,3,1800.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[57600.0,2,0.0],[57900.0,3,0.0],[58200.0,0,1200.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[60000.0,2,0.0],[60300.0,3,0.0],[60600.0,0,1200.0],[62100.0,6,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[62400.0,0,0.0],[62700.0,3,0.0],[63300.0,2,0.0],[63600.0,1,600.0],[64500.0,6,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[64800.0,0,0.0],[65100.0,3,0.0],[65700.0,2,0.0],[66000.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[67200.0,2,0.0],[67500.0,3,0.0],[67800.0,0,0.0],[68100.0,2,0.0],[68400.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[69600.0,2,0.0],[69900.0,3,0.0],[70200.0,0,0.0],[70500.0,2,0.0],[70800.0,1,600.0],[71700.0,6,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[72000.0,0,0.0],[72300.0,3,0.0],[72900.0,2,0.0],[73200.0,1,600.0],[74100.0,6,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[74400.0,0,0.0],[74700.0,3,0.0],[75300.0,2,0.0],[75600.0,1,600.0]]}]},"generatedBy":"SNIFF ver.6"} \ No newline at end of file +{ + "song": { + "player1": "bf", + "player2": "dad", + "notes": [ + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 0, + 2, + 0 + ], + [ + 600, + 3, + 600 + ], + [ + 1200, + 3, + 525 + ] + ], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 2400, + 2, + 0 + ], + [ + 3000, + 3, + 600 + ], + [ + 3600, + 3, + 525 + ] + ], + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 4800, + 1, + 300 + ], + [ + 5400, + 0, + 300 + ], + [ + 6000, + 3, + 525 + ] + ], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 7200, + 1, + 300 + ], + [ + 7800, + 0, + 300 + ], + [ + 8400, + 3, + 525 + ] + ], + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 9600, + 1, + 300 + ], + [ + 10200, + 3, + 0 + ], + [ + 10500, + 0, + 0 + ], + [ + 10800, + 1, + 525 + ] + ], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 12000, + 1, + 300 + ], + [ + 12600, + 3, + 0 + ], + [ + 12900, + 0, + 0 + ], + [ + 13200, + 1, + 525 + ] + ], + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 14400, + 3, + 0 + ], + [ + 14700, + 1, + 0 + ], + [ + 15300, + 0, + 0 + ], + [ + 15600, + 2, + 525 + ] + ], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 16800, + 3, + 0 + ], + [ + 17100, + 1, + 0 + ], + [ + 17700, + 0, + 0 + ], + [ + 18000, + 2, + 525 + ] + ], + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 19200, + 0, + 0 + ], + [ + 19500, + 3, + 0 + ], + [ + 19800, + 1, + 900 + ] + ], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 21600, + 0, + 0 + ], + [ + 21900, + 3, + 0 + ], + [ + 22200, + 1, + 900 + ] + ], + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 24000, + 1, + 0 + ], + [ + 24300, + 3, + 0 + ], + [ + 24600, + 0, + 900 + ] + ], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 26400, + 1, + 0 + ], + [ + 26700, + 3, + 0 + ], + [ + 27000, + 0, + 900 + ] + ], + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 28800, + 2, + 0 + ], + [ + 29100, + 3, + 0 + ], + [ + 29400, + 0, + 1125 + ] + ], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 31200, + 2, + 0 + ], + [ + 31500, + 3, + 0 + ], + [ + 31800, + 0, + 1125 + ], + [ + 33300, + 6, + 0 + ] + ], + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 33600, + 0, + 0 + ], + [ + 33900, + 3, + 0 + ], + [ + 34500, + 2, + 0 + ], + [ + 34800, + 1, + 525 + ], + [ + 35700, + 6, + 0 + ] + ], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 36000, + 0, + 0 + ], + [ + 36300, + 3, + 0 + ], + [ + 36900, + 2, + 0 + ], + [ + 37200, + 1, + 525 + ] + ], + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 38400, + 2, + 450 + ], + [ + 39000, + 3, + 300 + ], + [ + 39600, + 0, + 525 + ] + ], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 40800, + 2, + 450 + ], + [ + 41400, + 3, + 300 + ], + [ + 42000, + 0, + 525 + ] + ], + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 43200, + 1, + 0 + ], + [ + 43800, + 2, + 0 + ], + [ + 44400, + 1, + 0 + ], + [ + 44550, + 1, + 0 + ], + [ + 44700, + 1, + 0 + ], + [ + 45000, + 2, + 0 + ] + ], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 45600, + 1, + 0 + ], + [ + 46200, + 2, + 0 + ], + [ + 46800, + 1, + 0 + ], + [ + 46950, + 1, + 0 + ], + [ + 47100, + 1, + 0 + ], + [ + 47400, + 2, + 0 + ] + ], + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 48000, + 2, + 450 + ], + [ + 48600, + 3, + 300 + ], + [ + 49200, + 0, + 375 + ] + ], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 50400, + 2, + 450 + ], + [ + 51000, + 3, + 300 + ], + [ + 51600, + 0, + 375 + ] + ], + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 52800, + 3, + 1725 + ] + ], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 55200, + 3, + 1725 + ] + ], + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 57600, + 2, + 0 + ], + [ + 57900, + 3, + 0 + ], + [ + 58200, + 0, + 1125 + ] + ], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 60000, + 2, + 0 + ], + [ + 60300, + 3, + 0 + ], + [ + 60600, + 0, + 1125 + ], + [ + 62100, + 6, + 0 + ] + ], + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 62400, + 0, + 0 + ], + [ + 62700, + 3, + 0 + ], + [ + 63300, + 2, + 0 + ], + [ + 63600, + 1, + 525 + ], + [ + 64500, + 6, + 0 + ] + ], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 64800, + 0, + 0 + ], + [ + 65100, + 3, + 0 + ], + [ + 65700, + 2, + 0 + ], + [ + 66000, + 1, + 525 + ] + ], + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 67200, + 2, + 0 + ], + [ + 67500, + 3, + 0 + ], + [ + 67800, + 0, + 0 + ], + [ + 68100, + 2, + 0 + ], + [ + 68400, + 1, + 525 + ] + ], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 69600, + 2, + 0 + ], + [ + 69900, + 3, + 0 + ], + [ + 70200, + 0, + 0 + ], + [ + 70500, + 2, + 0 + ], + [ + 70800, + 1, + 525 + ], + [ + 71700, + 6, + 0 + ] + ], + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 72000, + 0, + 0 + ], + [ + 72300, + 3, + 0 + ], + [ + 72900, + 2, + 0 + ], + [ + 73200, + 1, + 525 + ], + [ + 74100, + 6, + 0 + ] + ], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 74400, + 0, + 0 + ], + [ + 74700, + 3, + 0 + ], + [ + 75300, + 2, + 0 + ], + [ + 75600, + 1, + 525 + ] + ], + "mustHitSection": true + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 100 + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 100, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 100, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 100, + "changeBPM": false, + "mustHitSection": true + } + ], + "player3": "gf", + "song": "Bopeebo", + "needsVoices": true, + "validScore": true, + "speed": 1, + "bpm": 100 + } +} \ No newline at end of file diff --git a/assets/preload/data/bopeebo/events.json b/assets/preload/data/bopeebo/events.json index bf1ca1254..f6a5c294d 100644 --- a/assets/preload/data/bopeebo/events.json +++ b/assets/preload/data/bopeebo/events.json @@ -1 +1,346 @@ -{"song":{"player1":"bf","notes":[{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[4275,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[9075,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[13875,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[18675,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[23475,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[28275,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[33075,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[37875,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[42675,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[47475,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[52275,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[57075,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[61875,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[66675,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[71475,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[[76275,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":true},{"lengthInSteps":16,"altAnim":false,"typeOfSection":0,"sectionNotes":[],"bpm":100,"changeBPM":false,"mustHitSection":true},{"lengthInSteps":16,"altAnim":false,"typeOfSection":0,"sectionNotes":[],"bpm":100,"changeBPM":false,"mustHitSection":true},{"lengthInSteps":16,"altAnim":false,"typeOfSection":0,"sectionNotes":[],"bpm":100,"changeBPM":false,"mustHitSection":true},{"lengthInSteps":16,"altAnim":false,"typeOfSection":0,"sectionNotes":[],"bpm":100,"changeBPM":false,"mustHitSection":true}],"player2":"dad","song":"Bopeebo","validScore":true,"needsVoices":true,"speed":1.3,"bpm":100}} \ No newline at end of file +{ + "song": { + "player1": "bf", + "song": "Bopeebo", + "player2": "dad", + "notes": [ + { + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 4290, + -1, + "Hey!", + "0", + "" + ] + ], + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 9090, + -1, + "Hey!", + "0", + "" + ] + ], + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 13890, + -1, + "Hey!", + "0", + "" + ] + ], + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 18690, + -1, + "Hey!", + "0", + "" + ] + ], + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 23490, + -1, + "Hey!", + "0", + "" + ] + ], + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 28290, + -1, + "Hey!", + "0", + "" + ] + ], + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 33090, + -1, + "Hey!", + "0", + "" + ] + ], + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 37890, + -1, + "Hey!", + "0", + "" + ] + ], + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 42690, + -1, + "Hey!", + "0", + "" + ] + ], + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 47490, + -1, + "Hey!", + "0", + "" + ] + ], + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 52290, + -1, + "Hey!", + "0", + "" + ] + ], + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 57090, + -1, + "Hey!", + "0", + "" + ] + ], + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 61890, + -1, + "Hey!", + "0", + "" + ] + ], + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 66690, + -1, + "Hey!", + "0", + "" + ] + ], + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 71490, + -1, + "Hey!", + "0", + "" + ] + ], + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 76290, + -1, + "Hey!", + "0", + "" + ] + ], + "mustHitSection": true + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 100 + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 100, + "changeBPM": false, + "mustHitSection": true + } + ], + "needsVoices": true, + "validScore": true, + "bpm": 100, + "speed": 1.3 + } +} \ No newline at end of file diff --git a/assets/preload/data/controls.txt b/assets/preload/data/controls.txt deleted file mode 100644 index 7db8a8a86..000000000 --- a/assets/preload/data/controls.txt +++ /dev/null @@ -1,32 +0,0 @@ -setUP -W -setUP (ALTERNATE) -FlxKey.UP -setDOWN -S -setDOWN (ALTERNATE) -FlxKey.DOWN -setLEFT -A -setLEFT (ALTERNATE) -FlxKey.LEFT -setRIGHT -D -setRIGHT (ALTERNATE) -FlxKey.RIGHT -setACCEPT -Z -setACCEPT (ALTERNATE) -ENTER -setBACK -BACKSPACE -setBACK (ALTERNATE) -ESCAPE -setPAUSE -P -setPAUSE (ALTERNATE) -ENTER -setRESET -R -setRESET (ALTERNATE) -null \ No newline at end of file diff --git a/assets/preload/data/dad-battle/dad-battle-easy.json b/assets/preload/data/dad-battle/dad-battle-easy.json index 0f7a6fb22..3a933bfcd 100644 --- a/assets/preload/data/dad-battle/dad-battle-easy.json +++ b/assets/preload/data/dad-battle/dad-battle-easy.json @@ -1 +1 @@ -{"song":{"song":"Dad-Battle","bpm":180.0,"needsVoices":true,"player1":"bf","player2":"dad","speed":1.3,"notes":[{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[10666.667,2,0.0],[11000.0,0,0.0],[11333.334,2,0.0],[11666.667,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[12000.0,2,0.0],[12166.667,3,0.0],[12333.334,0,0.0],[12666.667,2,0.0],[13000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[13333.334,2,0.0],[13666.667,0,0.0],[14000.0,2,0.0],[14333.334,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[14666.667,2,0.0],[14833.334,3,0.0],[15000.0,0,0.0],[15333.334,2,0.0],[15666.667,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[16000.0,1,0.0],[16333.334,0,0.0],[16666.668,1,0.0],[17000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[17333.334,1,0.0],[17666.668,0,0.0],[18000.0,3,0.0],[18333.334,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[18666.668,1,0.0],[19000.0,0,0.0],[19333.334,1,0.0],[19666.668,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[20000.0,1,0.0],[20333.334,0,0.0],[20666.668,3,0.0],[21000.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[21666.668,2,0.0],[22000.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[22833.334,1,0.0],[23000.0,3,0.0],[23333.334,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24333.334,2,0.0],[24666.668,1,0.0],[25000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[25333.334,2,0.0],[25666.668,0,0.0],[26000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[27000.0,2,0.0],[27333.334,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[28166.668,1,0.0],[28333.334,3,0.0],[28666.668,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[29666.668,2,0.0],[30000.0,1,0.0],[30333.334,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[30666.668,4,0.0],[30666.668,2,0.0],[31000.0,6,0.0],[31000.0,0,0.0],[31333.334,6,0.0],[31333.334,2,0.0],[31666.668,4,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[32166.668,0,0.0],[32666.668,1,0.0],[33000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[33500.0,2,0.0],[34000.0,2,0.0],[34333.3359,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[34666.668,0,0.0],[35000.0,1,0.0],[35333.3359,3,0.0],[35666.668,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[36000.0,2,0.0],[36333.3359,3,0.0],[36666.668,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[37500.0,1,0.0],[37666.668,3,0.0],[38000.0,0,0.0],[38333.3359,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[38666.668,0,0.0],[39000.0,1,0.0],[39166.668,0,0.0],[39333.3359,2,0.0],[39666.668,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[40166.668,0,0.0],[40333.3359,3,0.0],[40666.668,2,0.0],[41000.0,1,0.0],[41166.668,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[41333.3359,4,0.0],[41333.3359,0,0.0],[41666.668,6,0.0],[41666.668,0,0.0],[42000.0,6,0.0],[42000.0,2,0.0],[42333.3359,4,0.0],[42333.3359,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[42833.3359,0,0.0],[43333.3359,1,0.0],[43666.668,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[44166.668,2,0.0],[44666.668,2,0.0],[45000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[45333.3359,0,0.0],[45666.668,1,0.0],[46000.0,3,0.0],[46333.3359,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[46666.668,2,0.0],[47000.0,3,0.0],[47333.3359,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[48166.668,1,0.0],[48333.3359,3,0.0],[48666.668,0,0.0],[49000.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[49333.3359,0,0.0],[49666.668,1,0.0],[49833.3359,0,0.0],[50000.0,2,0.0],[50333.3359,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[50833.3359,0,0.0],[51000.0,3,0.0],[51333.3359,2,0.0],[51666.668,1,0.0],[51833.3359,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[52000.0,0,0.0],[52333.3359,0,0.0],[52666.668,2,0.0],[53000.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[53333.3359,2,0.0],[53666.668,0,0.0],[54000.0,2,0.0],[54333.3359,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[54666.668,2,0.0],[54833.3359,3,0.0],[55000.0,0,0.0],[55333.3359,2,0.0],[55666.668,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[56000.0,2,0.0],[56333.3359,0,0.0],[56666.668,2,0.0],[57000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[57333.3359,2,0.0],[57500.0,3,0.0],[57666.668,0,0.0],[58000.0,2,0.0],[58333.3359,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[58666.668,1,0.0],[59000.0,0,0.0],[59333.3359,1,0.0],[59666.668,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[60000.0,1,0.0],[60333.3359,0,0.0],[60666.668,3,0.0],[61000.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[61333.3359,1,0.0],[61666.668,0,0.0],[62000.0,1,0.0],[62333.3359,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[62666.668,4,0.0],[62666.668,1,0.0],[63000.0,6,0.0],[63000.0,0,0.0],[63333.3359,6,0.0],[63333.3359,3,0.0],[63666.668,4,0.0],[63666.668,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[64333.3359,2,0.0],[64666.668,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[65500.0039,1,0.0],[65666.67,3,0.0],[66000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[67000.0,2,0.0],[67333.3359,1,0.0],[67666.67,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[68000.0,2,0.0],[68000.0,4,0.0],[68333.3359,0,0.0],[68333.3359,6,0.0],[68666.67,2,0.0],[68666.67,6,0.0],[69000.0,4,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[69666.67,2,0.0],[70000.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[70833.3359,1,0.0],[71000.0,3,0.0],[71333.3359,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[72333.3359,2,0.0],[72666.67,1,0.0],[73000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[73333.3359,2,0.0],[73666.67,0,0.0],[74000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[74666.67,2,0.0],[75000.0,0,0.0],[75333.3359,2,0.0],[75666.67,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[76000.0,2,0.0],[76333.3359,0,0.0],[76666.67,2,0.0],[77000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[77333.3359,2,0.0],[77666.67,0,0.0],[78000.0,2,0.0],[78333.3359,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[78666.67,2,0.0],[79000.0,0,0.0],[79333.3359,2,0.0],[79666.67,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[80000.0,1,0.0],[80333.3359,0,0.0],[80500.0,3,0.0],[80666.67,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[81333.3359,1,0.0],[81666.67,1,0.0],[82000.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[82666.67,1,0.0],[83000.0,0,0.0],[83166.67,3,0.0],[83333.3359,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[84000.0,1,0.0],[84333.3359,1,0.0],[84666.67,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]}]},"generatedBy":"SNIFF ver.6"} \ No newline at end of file +{"song":{"song":"Dad Battle","bpm":180.0,"needsVoices":true,"player1":"bf","player2":"dad","speed":1.3,"notes":[{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[10666.667,2,0.0],[11000.0,0,0.0],[11333.334,2,0.0],[11666.667,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[12000.0,2,0.0],[12166.667,3,0.0],[12333.334,0,0.0],[12666.667,2,0.0],[13000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[13333.334,2,0.0],[13666.667,0,0.0],[14000.0,2,0.0],[14333.334,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[14666.667,2,0.0],[14833.334,3,0.0],[15000.0,0,0.0],[15333.334,2,0.0],[15666.667,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[16000.0,1,0.0],[16333.334,0,0.0],[16666.668,1,0.0],[17000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[17333.334,1,0.0],[17666.668,0,0.0],[18000.0,3,0.0],[18333.334,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[18666.668,1,0.0],[19000.0,0,0.0],[19333.334,1,0.0],[19666.668,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[20000.0,1,0.0],[20333.334,0,0.0],[20666.668,3,0.0],[21000.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[21666.668,2,0.0],[22000.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[22833.334,1,0.0],[23000.0,3,0.0],[23333.334,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24333.334,2,0.0],[24666.668,1,0.0],[25000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[25333.334,2,0.0],[25666.668,0,0.0],[26000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[27000.0,2,0.0],[27333.334,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[28166.668,1,0.0],[28333.334,3,0.0],[28666.668,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[29666.668,2,0.0],[30000.0,1,0.0],[30333.334,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[30666.668,4,0.0],[30666.668,2,0.0],[31000.0,6,0.0],[31000.0,0,0.0],[31333.334,6,0.0],[31333.334,2,0.0],[31666.668,4,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[32166.668,0,0.0],[32666.668,1,0.0],[33000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[33500.0,2,0.0],[34000.0,2,0.0],[34333.3359,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[34666.668,0,0.0],[35000.0,1,0.0],[35333.3359,3,0.0],[35666.668,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[36000.0,2,0.0],[36333.3359,3,0.0],[36666.668,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[37500.0,1,0.0],[37666.668,3,0.0],[38000.0,0,0.0],[38333.3359,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[38666.668,0,0.0],[39000.0,1,0.0],[39166.668,0,0.0],[39333.3359,2,0.0],[39666.668,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[40166.668,0,0.0],[40333.3359,3,0.0],[40666.668,2,0.0],[41000.0,1,0.0],[41166.668,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[41333.3359,4,0.0],[41333.3359,0,0.0],[41666.668,6,0.0],[41666.668,0,0.0],[42000.0,6,0.0],[42000.0,2,0.0],[42333.3359,4,0.0],[42333.3359,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[42833.3359,0,0.0],[43333.3359,1,0.0],[43666.668,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[44166.668,2,0.0],[44666.668,2,0.0],[45000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[45333.3359,0,0.0],[45666.668,1,0.0],[46000.0,3,0.0],[46333.3359,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[46666.668,2,0.0],[47000.0,3,0.0],[47333.3359,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[48166.668,1,0.0],[48333.3359,3,0.0],[48666.668,0,0.0],[49000.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[49333.3359,0,0.0],[49666.668,1,0.0],[49833.3359,0,0.0],[50000.0,2,0.0],[50333.3359,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[50833.3359,0,0.0],[51000.0,3,0.0],[51333.3359,2,0.0],[51666.668,1,0.0],[51833.3359,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[52000.0,0,0.0],[52333.3359,0,0.0],[52666.668,2,0.0],[53000.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[53333.3359,2,0.0],[53666.668,0,0.0],[54000.0,2,0.0],[54333.3359,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[54666.668,2,0.0],[54833.3359,3,0.0],[55000.0,0,0.0],[55333.3359,2,0.0],[55666.668,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[56000.0,2,0.0],[56333.3359,0,0.0],[56666.668,2,0.0],[57000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[57333.3359,2,0.0],[57500.0,3,0.0],[57666.668,0,0.0],[58000.0,2,0.0],[58333.3359,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[58666.668,1,0.0],[59000.0,0,0.0],[59333.3359,1,0.0],[59666.668,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[60000.0,1,0.0],[60333.3359,0,0.0],[60666.668,3,0.0],[61000.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[61333.3359,1,0.0],[61666.668,0,0.0],[62000.0,1,0.0],[62333.3359,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[62666.668,4,0.0],[62666.668,1,0.0],[63000.0,6,0.0],[63000.0,0,0.0],[63333.3359,6,0.0],[63333.3359,3,0.0],[63666.668,4,0.0],[63666.668,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[64333.3359,2,0.0],[64666.668,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[65500.0039,1,0.0],[65666.67,3,0.0],[66000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[67000.0,2,0.0],[67333.3359,1,0.0],[67666.67,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[68000.0,2,0.0],[68000.0,4,0.0],[68333.3359,0,0.0],[68333.3359,6,0.0],[68666.67,2,0.0],[68666.67,6,0.0],[69000.0,4,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[69666.67,2,0.0],[70000.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[70833.3359,1,0.0],[71000.0,3,0.0],[71333.3359,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[72333.3359,2,0.0],[72666.67,1,0.0],[73000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[73333.3359,2,0.0],[73666.67,0,0.0],[74000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[74666.67,2,0.0],[75000.0,0,0.0],[75333.3359,2,0.0],[75666.67,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[76000.0,2,0.0],[76333.3359,0,0.0],[76666.67,2,0.0],[77000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[77333.3359,2,0.0],[77666.67,0,0.0],[78000.0,2,0.0],[78333.3359,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[78666.67,2,0.0],[79000.0,0,0.0],[79333.3359,2,0.0],[79666.67,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[80000.0,1,0.0],[80333.3359,0,0.0],[80500.0,3,0.0],[80666.67,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[81333.3359,1,0.0],[81666.67,1,0.0],[82000.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[82666.67,1,0.0],[83000.0,0,0.0],[83166.67,3,0.0],[83333.3359,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[84000.0,1,0.0],[84333.3359,1,0.0],[84666.67,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]}]},"generatedBy":"SNIFF ver.6"} \ No newline at end of file diff --git a/assets/preload/data/dad-battle/dad-battle-hard.json b/assets/preload/data/dad-battle/dad-battle-hard.json index bc85655d0..106521fe5 100644 --- a/assets/preload/data/dad-battle/dad-battle-hard.json +++ b/assets/preload/data/dad-battle/dad-battle-hard.json @@ -1 +1 @@ -{"song":{"song":"Dad-Battle","bpm":180.0,"needsVoices":true,"player1":"bf","player2":"dad","speed":2.3,"notes":[{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[10666.667,2,0.0],[11000.0,0,0.0],[11166.667,1,0.0],[11333.334,2,0.0],[11666.667,0,0.0],[11833.334,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[12000.0,2,0.0],[12166.667,3,0.0],[12333.334,0,0.0],[12500.0,1,0.0],[12666.667,2,0.0],[13000.0,0,0.0],[13166.667,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[13333.334,2,0.0],[13666.667,0,0.0],[13833.334,1,0.0],[14000.0,2,0.0],[14333.334,0,0.0],[14500.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[14666.667,2,0.0],[14833.334,3,0.0],[15000.0,0,0.0],[15166.667,1,0.0],[15333.334,2,0.0],[15666.667,0,0.0],[15833.334,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[16000.0,1,0.0],[16333.334,0,0.0],[16500.0,3,0.0],[16666.668,1,0.0],[17000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[17333.334,1,0.0],[17666.668,0,0.0],[17833.334,0,0.0],[18000.0,3,0.0],[18166.668,3,0.0],[18333.334,3,0.0],[18500.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[18666.668,1,0.0],[19000.0,0,0.0],[19166.668,3,0.0],[19333.334,1,0.0],[19666.668,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[20000.0,1,0.0],[20333.334,0,0.0],[20500.0,0,0.0],[20666.668,3,0.0],[20833.334,3,0.0],[21000.0,3,0.0],[21166.668,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[21666.668,2,0.0],[21833.334,1,0.0],[22000.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[22833.334,1,0.0],[23000.0,3,0.0],[23333.334,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24333.334,2,0.0],[24666.668,1,0.0],[25000.0,0,0.0],[25166.668,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[25333.334,2,0.0],[25500.0,3,0.0],[25666.668,0,0.0],[25833.334,3,0.0],[26000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[27000.0,2,0.0],[27166.668,1,0.0],[27333.334,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[28166.668,1,0.0],[28333.334,3,0.0],[28666.668,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[29666.668,2,0.0],[30000.0,1,0.0],[30333.334,0,0.0],[30500.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[30666.668,4,0.0],[30666.668,2,0.0],[30833.334,5,0.0],[30833.334,3,0.0],[31000.0,6,0.0],[31000.0,0,0.0],[31166.668,7,0.0],[31166.668,3,0.0],[31333.334,6,0.0],[31333.334,2,0.0],[31500.0,5,0.0],[31666.668,4,0.0],[31833.334,5,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[32166.668,0,0.0],[32333.334,3,0.0],[32500.002,2,0.0],[32666.668,1,0.0],[33000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[33500.0,2,0.0],[33666.668,3,0.0],[33833.3359,1,0.0],[34000.0,2,0.0],[34333.3359,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[34666.668,0,0.0],[35000.0,1,0.0],[35333.3359,3,0.0],[35666.668,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[36000.0,2,0.0],[36333.3359,3,0.0],[36666.668,0,0.0],[36666.668,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[37500.0,1,0.0],[37666.668,3,0.0],[37833.3359,2,0.0],[38000.0,0,0.0],[38166.668,2,0.0],[38333.3359,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[38666.668,0,0.0],[38750.0,3,0.0],[38833.3359,0,0.0],[39000.0,1,0.0],[39166.668,0,0.0],[39333.3359,2,0.0],[39500.0,3,0.0],[39666.668,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[40166.668,0,0.0],[40333.3359,3,0.0],[40500.0,1,0.0],[40666.668,2,0.0],[40833.3359,3,0.0],[41000.0,1,0.0],[41166.668,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[41333.3359,0,0.0],[41333.3359,4,0.0],[41500.0,1,0.0],[41500.0,5,0.0],[41666.668,0,0.0],[41666.668,6,0.0],[41833.3359,3,0.0],[41833.3359,7,0.0],[42000.0,2,0.0],[42000.0,6,0.0],[42166.668,5,0.0],[42333.3359,3,0.0],[42333.3359,4,0.0],[42500.0,5,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[42833.3359,0,0.0],[43000.0,3,0.0],[43166.668,2,0.0],[43333.3359,1,0.0],[43666.668,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[44166.668,2,0.0],[44333.3359,3,0.0],[44500.0,1,0.0],[44666.668,2,0.0],[45000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[45333.3359,0,0.0],[45666.668,1,0.0],[46000.0,3,0.0],[46333.3359,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[46666.668,2,0.0],[47000.0,3,0.0],[47333.3359,0,0.0],[47333.3359,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[48166.668,1,0.0],[48333.3359,3,0.0],[48500.0,2,0.0],[48666.668,0,0.0],[48833.3359,2,0.0],[49000.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[49333.3359,0,0.0],[49416.668,3,0.0],[49500.0,0,0.0],[49666.668,1,0.0],[49833.3359,0,0.0],[50000.0,2,0.0],[50166.668,3,0.0],[50333.3359,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[50833.3359,0,0.0],[51000.0,3,0.0],[51166.668,1,0.0],[51333.3359,2,0.0],[51500.0,3,0.0],[51666.668,1,0.0],[51833.3359,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[52000.0,0,0.0],[52166.668,0,0.0],[52333.3359,2,0.0],[52500.0,2,0.0],[52666.668,3,0.0],[53000.0,3,0.0],[53000.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[53333.3359,2,0.0],[53666.668,0,0.0],[53833.3359,1,0.0],[54000.0,2,0.0],[54333.3359,0,0.0],[54500.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[54666.668,2,0.0],[54833.3359,3,0.0],[55000.0,0,0.0],[55166.668,1,0.0],[55333.3359,2,0.0],[55666.668,0,0.0],[55833.3359,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[56000.0,2,0.0],[56333.3359,0,0.0],[56500.0,1,0.0],[56666.668,2,0.0],[57000.0,0,0.0],[57166.668,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[57333.3359,2,0.0],[57500.0,3,0.0],[57666.668,0,0.0],[57833.3359,1,0.0],[58000.0,2,0.0],[58333.3359,0,0.0],[58500.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[58666.668,1,0.0],[59000.0,0,0.0],[59166.668,3,0.0],[59333.3359,1,0.0],[59666.668,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[60000.0,1,0.0],[60333.3359,0,0.0],[60500.0,0,0.0],[60666.668,3,0.0],[60833.3359,3,0.0],[61000.0,3,0.0],[61166.668,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[61333.3359,1,0.0],[61666.668,0,0.0],[61833.3359,3,0.0],[62000.0,1,0.0],[62333.3359,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[62666.668,1,0.0],[62666.668,4,0.0],[62833.3359,5,0.0],[63000.0,0,0.0],[63000.0,6,0.0],[63166.668,0,0.0],[63166.668,7,0.0],[63333.3359,3,0.0],[63333.3359,6,0.0],[63500.0,3,0.0],[63500.0,5,0.0],[63666.668,3,0.0],[63666.668,4,0.0],[63833.3359,5,333.333344],[63833.3359,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[64333.3359,2,0.0],[64500.0039,1,0.0],[64666.668,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[65500.0039,1,0.0],[65666.67,3,0.0],[66000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[67000.0,2,0.0],[67333.3359,1,0.0],[67666.67,0,0.0],[67833.3359,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[68000.0,2,0.0],[68000.0,4,0.0],[68166.67,3,0.0],[68166.67,5,0.0],[68333.3359,0,0.0],[68333.3359,6,0.0],[68500.0,3,0.0],[68500.0,7,0.0],[68666.67,2,0.0],[68666.67,6,0.0],[68833.3359,5,0.0],[69000.0,4,0.0],[69166.67,5,333.333344]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[69666.67,2,0.0],[69833.3359,1,0.0],[70000.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[70833.3359,1,0.0],[71000.0,3,0.0],[71333.3359,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[72333.3359,2,0.0],[72666.67,1,0.0],[73000.0,0,0.0],[73166.67,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[73333.3359,2,0.0],[73500.0,3,0.0],[73666.67,0,0.0],[73833.3359,3,0.0],[74000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[74666.67,2,0.0],[75000.0,0,0.0],[75166.67,1,0.0],[75333.3359,2,0.0],[75666.67,0,0.0],[75833.3359,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[76000.0,2,0.0],[76166.67,3,0.0],[76333.3359,0,0.0],[76500.0,1,0.0],[76666.67,2,0.0],[77000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[77333.3359,2,0.0],[77666.67,0,0.0],[77833.3359,1,0.0],[78000.0,2,0.0],[78333.3359,0,0.0],[78500.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[78666.67,2,0.0],[78833.3359,3,0.0],[79000.0,0,0.0],[79166.67,1,0.0],[79333.3359,2,0.0],[79666.67,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[80000.0,1,0.0],[80333.3359,0,0.0],[80500.0,3,0.0],[80666.67,1,0.0],[81000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[81333.3359,1,0.0],[81666.67,1,0.0],[82000.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[82666.67,1,0.0],[83000.0,0,0.0],[83166.67,3,0.0],[83333.3359,1,0.0],[83666.67,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[84000.0,1,0.0],[84333.3359,1,0.0],[84666.67,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]}]},"generatedBy":"SNIFF ver.6"} \ No newline at end of file +{"song":{"song":"Dad Battle","bpm":180.0,"needsVoices":true,"player1":"bf","player2":"dad","speed":2.3,"notes":[{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[10666.667,2,0.0],[11000.0,0,0.0],[11166.667,1,0.0],[11333.334,2,0.0],[11666.667,0,0.0],[11833.334,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[12000.0,2,0.0],[12166.667,3,0.0],[12333.334,0,0.0],[12500.0,1,0.0],[12666.667,2,0.0],[13000.0,0,0.0],[13166.667,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[13333.334,2,0.0],[13666.667,0,0.0],[13833.334,1,0.0],[14000.0,2,0.0],[14333.334,0,0.0],[14500.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[14666.667,2,0.0],[14833.334,3,0.0],[15000.0,0,0.0],[15166.667,1,0.0],[15333.334,2,0.0],[15666.667,0,0.0],[15833.334,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[16000.0,1,0.0],[16333.334,0,0.0],[16500.0,3,0.0],[16666.668,1,0.0],[17000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[17333.334,1,0.0],[17666.668,0,0.0],[17833.334,0,0.0],[18000.0,3,0.0],[18166.668,3,0.0],[18333.334,3,0.0],[18500.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[18666.668,1,0.0],[19000.0,0,0.0],[19166.668,3,0.0],[19333.334,1,0.0],[19666.668,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[20000.0,1,0.0],[20333.334,0,0.0],[20500.0,0,0.0],[20666.668,3,0.0],[20833.334,3,0.0],[21000.0,3,0.0],[21166.668,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[21666.668,2,0.0],[21833.334,1,0.0],[22000.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[22833.334,1,0.0],[23000.0,3,0.0],[23333.334,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24333.334,2,0.0],[24666.668,1,0.0],[25000.0,0,0.0],[25166.668,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[25333.334,2,0.0],[25500.0,3,0.0],[25666.668,0,0.0],[25833.334,3,0.0],[26000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[27000.0,2,0.0],[27166.668,1,0.0],[27333.334,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[28166.668,1,0.0],[28333.334,3,0.0],[28666.668,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[29666.668,2,0.0],[30000.0,1,0.0],[30333.334,0,0.0],[30500.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[30666.668,4,0.0],[30666.668,2,0.0],[30833.334,5,0.0],[30833.334,3,0.0],[31000.0,6,0.0],[31000.0,0,0.0],[31166.668,7,0.0],[31166.668,3,0.0],[31333.334,6,0.0],[31333.334,2,0.0],[31500.0,5,0.0],[31666.668,4,0.0],[31833.334,5,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[32166.668,0,0.0],[32333.334,3,0.0],[32500.002,2,0.0],[32666.668,1,0.0],[33000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[33500.0,2,0.0],[33666.668,3,0.0],[33833.3359,1,0.0],[34000.0,2,0.0],[34333.3359,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[34666.668,0,0.0],[35000.0,1,0.0],[35333.3359,3,0.0],[35666.668,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[36000.0,2,0.0],[36333.3359,3,0.0],[36666.668,0,0.0],[36666.668,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[37500.0,1,0.0],[37666.668,3,0.0],[37833.3359,2,0.0],[38000.0,0,0.0],[38166.668,2,0.0],[38333.3359,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[38666.668,0,0.0],[38750.0,3,0.0],[38833.3359,0,0.0],[39000.0,1,0.0],[39166.668,0,0.0],[39333.3359,2,0.0],[39500.0,3,0.0],[39666.668,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[40166.668,0,0.0],[40333.3359,3,0.0],[40500.0,1,0.0],[40666.668,2,0.0],[40833.3359,3,0.0],[41000.0,1,0.0],[41166.668,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[41333.3359,0,0.0],[41333.3359,4,0.0],[41500.0,1,0.0],[41500.0,5,0.0],[41666.668,0,0.0],[41666.668,6,0.0],[41833.3359,3,0.0],[41833.3359,7,0.0],[42000.0,2,0.0],[42000.0,6,0.0],[42166.668,5,0.0],[42333.3359,3,0.0],[42333.3359,4,0.0],[42500.0,5,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[42833.3359,0,0.0],[43000.0,3,0.0],[43166.668,2,0.0],[43333.3359,1,0.0],[43666.668,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[44166.668,2,0.0],[44333.3359,3,0.0],[44500.0,1,0.0],[44666.668,2,0.0],[45000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[45333.3359,0,0.0],[45666.668,1,0.0],[46000.0,3,0.0],[46333.3359,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[46666.668,2,0.0],[47000.0,3,0.0],[47333.3359,0,0.0],[47333.3359,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[48166.668,1,0.0],[48333.3359,3,0.0],[48500.0,2,0.0],[48666.668,0,0.0],[48833.3359,2,0.0],[49000.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[49333.3359,0,0.0],[49416.668,3,0.0],[49500.0,0,0.0],[49666.668,1,0.0],[49833.3359,0,0.0],[50000.0,2,0.0],[50166.668,3,0.0],[50333.3359,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[50833.3359,0,0.0],[51000.0,3,0.0],[51166.668,1,0.0],[51333.3359,2,0.0],[51500.0,3,0.0],[51666.668,1,0.0],[51833.3359,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[52000.0,0,0.0],[52166.668,0,0.0],[52333.3359,2,0.0],[52500.0,2,0.0],[52666.668,3,0.0],[53000.0,3,0.0],[53000.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[53333.3359,2,0.0],[53666.668,0,0.0],[53833.3359,1,0.0],[54000.0,2,0.0],[54333.3359,0,0.0],[54500.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[54666.668,2,0.0],[54833.3359,3,0.0],[55000.0,0,0.0],[55166.668,1,0.0],[55333.3359,2,0.0],[55666.668,0,0.0],[55833.3359,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[56000.0,2,0.0],[56333.3359,0,0.0],[56500.0,1,0.0],[56666.668,2,0.0],[57000.0,0,0.0],[57166.668,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[57333.3359,2,0.0],[57500.0,3,0.0],[57666.668,0,0.0],[57833.3359,1,0.0],[58000.0,2,0.0],[58333.3359,0,0.0],[58500.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[58666.668,1,0.0],[59000.0,0,0.0],[59166.668,3,0.0],[59333.3359,1,0.0],[59666.668,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[60000.0,1,0.0],[60333.3359,0,0.0],[60500.0,0,0.0],[60666.668,3,0.0],[60833.3359,3,0.0],[61000.0,3,0.0],[61166.668,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[61333.3359,1,0.0],[61666.668,0,0.0],[61833.3359,3,0.0],[62000.0,1,0.0],[62333.3359,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[62666.668,1,0.0],[62666.668,4,0.0],[62833.3359,5,0.0],[63000.0,0,0.0],[63000.0,6,0.0],[63166.668,0,0.0],[63166.668,7,0.0],[63333.3359,3,0.0],[63333.3359,6,0.0],[63500.0,3,0.0],[63500.0,5,0.0],[63666.668,3,0.0],[63666.668,4,0.0],[63833.3359,5,333.333344],[63833.3359,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[64333.3359,2,0.0],[64500.0039,1,0.0],[64666.668,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[65500.0039,1,0.0],[65666.67,3,0.0],[66000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[67000.0,2,0.0],[67333.3359,1,0.0],[67666.67,0,0.0],[67833.3359,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[68000.0,2,0.0],[68000.0,4,0.0],[68166.67,3,0.0],[68166.67,5,0.0],[68333.3359,0,0.0],[68333.3359,6,0.0],[68500.0,3,0.0],[68500.0,7,0.0],[68666.67,2,0.0],[68666.67,6,0.0],[68833.3359,5,0.0],[69000.0,4,0.0],[69166.67,5,333.333344]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[69666.67,2,0.0],[69833.3359,1,0.0],[70000.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[70833.3359,1,0.0],[71000.0,3,0.0],[71333.3359,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[72333.3359,2,0.0],[72666.67,1,0.0],[73000.0,0,0.0],[73166.67,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[73333.3359,2,0.0],[73500.0,3,0.0],[73666.67,0,0.0],[73833.3359,3,0.0],[74000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[74666.67,2,0.0],[75000.0,0,0.0],[75166.67,1,0.0],[75333.3359,2,0.0],[75666.67,0,0.0],[75833.3359,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[76000.0,2,0.0],[76166.67,3,0.0],[76333.3359,0,0.0],[76500.0,1,0.0],[76666.67,2,0.0],[77000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[77333.3359,2,0.0],[77666.67,0,0.0],[77833.3359,1,0.0],[78000.0,2,0.0],[78333.3359,0,0.0],[78500.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[78666.67,2,0.0],[78833.3359,3,0.0],[79000.0,0,0.0],[79166.67,1,0.0],[79333.3359,2,0.0],[79666.67,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[80000.0,1,0.0],[80333.3359,0,0.0],[80500.0,3,0.0],[80666.67,1,0.0],[81000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[81333.3359,1,0.0],[81666.67,1,0.0],[82000.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[82666.67,1,0.0],[83000.0,0,0.0],[83166.67,3,0.0],[83333.3359,1,0.0],[83666.67,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[84000.0,1,0.0],[84333.3359,1,0.0],[84666.67,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]}]},"generatedBy":"SNIFF ver.6"} \ No newline at end of file diff --git a/assets/preload/data/dad-battle/dad-battle.json b/assets/preload/data/dad-battle/dad-battle.json index b63b41970..db78a3da4 100644 --- a/assets/preload/data/dad-battle/dad-battle.json +++ b/assets/preload/data/dad-battle/dad-battle.json @@ -1 +1 @@ -{"song":{"song":"Dad-Battle","bpm":180.0,"needsVoices":true,"player1":"bf","player2":"dad","speed":1.5,"notes":[{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[10666.667,2,0.0],[11000.0,0,0.0],[11333.334,2,0.0],[11666.667,0,0.0],[11833.334,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[12000.0,2,0.0],[12166.667,3,0.0],[12333.334,0,0.0],[12666.667,2,0.0],[13000.0,0,0.0],[13166.667,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[13333.334,2,0.0],[13666.667,0,0.0],[14000.0,2,0.0],[14333.334,0,0.0],[14500.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[14666.667,2,0.0],[14833.334,3,0.0],[15000.0,0,0.0],[15333.334,2,0.0],[15666.667,0,0.0],[15833.334,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[16000.0,1,0.0],[16333.334,0,0.0],[16500.0,3,0.0],[16666.668,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[17333.334,1,0.0],[17666.668,0,0.0],[17833.334,0,0.0],[18000.0,3,0.0],[18166.668,3,0.0],[18333.334,3,0.0],[18500.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[18666.668,1,0.0],[19000.0,0,0.0],[19166.668,3,0.0],[19333.334,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[20000.0,1,0.0],[20333.334,0,0.0],[20500.0,0,0.0],[20666.668,3,0.0],[20833.334,3,0.0],[21000.0,3,0.0],[21166.668,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[21666.668,2,0.0],[22000.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[22833.334,1,0.0],[23000.0,3,0.0],[23333.334,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24333.334,2,0.0],[24666.668,1,0.0],[25000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[25333.334,2,0.0],[25666.668,0,0.0],[25833.334,3,0.0],[26000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[27000.0,2,0.0],[27333.334,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[28166.668,1,0.0],[28333.334,3,0.0],[28666.668,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[29666.668,2,0.0],[30000.0,1,0.0],[30333.334,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[30666.668,4,0.0],[30666.668,2,0.0],[30833.334,5,0.0],[31000.0,7,0.0],[31000.0,0,0.0],[31166.668,5,0.0],[31166.668,3,0.0],[31333.334,4,0.0],[31333.334,2,0.0],[31500.0,5,0.0],[31666.668,7,0.0],[31833.334,5,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[32166.668,0,0.0],[32333.334,3,0.0],[32666.668,1,0.0],[33000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[33500.0,2,0.0],[33666.668,3,0.0],[34000.0,2,0.0],[34333.3359,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[34666.668,0,0.0],[35000.0,1,0.0],[35333.3359,3,0.0],[35666.668,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[36000.0,2,0.0],[36333.3359,3,0.0],[36666.668,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[37500.0,1,0.0],[37666.668,3,0.0],[38000.0,0,0.0],[38333.3359,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[38666.668,0,0.0],[39000.0,1,0.0],[39333.3359,2,0.0],[39500.0,3,0.0],[39666.668,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[40166.668,0,0.0],[40333.3359,3,0.0],[40666.668,2,0.0],[40833.3359,3,0.0],[41000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[41333.3359,4,0.0],[41333.3359,0,0.0],[41500.0,5,0.0],[41666.668,7,0.0],[41666.668,2,0.0],[41833.3359,5,0.0],[42000.0,4,0.0],[42000.0,3,0.0],[42166.668,5,0.0],[42333.3359,7,0.0],[42333.3359,3,0.0],[42500.0,5,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[42833.3359,0,0.0],[43000.0,3,0.0],[43333.3359,1,0.0],[43666.668,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[44166.668,2,0.0],[44333.3359,3,0.0],[44666.668,2,0.0],[45000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[45333.3359,0,0.0],[45666.668,1,0.0],[46000.0,3,0.0],[46333.3359,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[46666.668,2,0.0],[47000.0,3,0.0],[47333.3359,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[48166.668,1,0.0],[48333.3359,3,0.0],[48666.668,0,0.0],[49000.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[49333.3359,0,0.0],[49666.668,1,0.0],[50000.0,2,0.0],[50166.668,3,0.0],[50333.3359,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[50833.3359,0,0.0],[51000.0,3,0.0],[51333.3359,2,0.0],[51500.0,3,0.0],[51666.668,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[52000.0,0,0.0],[52333.3359,2,0.0],[52666.668,3,0.0],[53000.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[53333.3359,2,0.0],[53666.668,0,0.0],[54000.0,2,0.0],[54333.3359,0,0.0],[54500.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[54666.668,2,0.0],[55000.0,0,0.0],[55333.3359,2,0.0],[55666.668,0,0.0],[55833.3359,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[56000.0,2,0.0],[56333.3359,0,0.0],[56666.668,2,0.0],[57000.0,0,0.0],[57166.668,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[57333.3359,2,0.0],[57500.0,3,0.0],[57666.668,0,0.0],[58000.0,2,0.0],[58333.3359,0,0.0],[58500.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[58666.668,1,0.0],[59000.0,0,0.0],[59166.668,3,0.0],[59333.3359,1,0.0],[59666.668,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[60000.0,1,0.0],[60333.3359,0,0.0],[60500.0,0,0.0],[60666.668,3,0.0],[60833.3359,3,0.0],[61000.0,3,0.0],[61166.668,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[61333.3359,1,0.0],[61666.668,0,0.0],[61833.3359,3,0.0],[62000.0,1,0.0],[62333.3359,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[62666.668,4,0.0],[62666.668,1,0.0],[62833.3359,5,0.0],[63000.0,7,0.0],[63000.0,0,0.0],[63166.668,5,0.0],[63166.668,0,0.0],[63333.3359,4,0.0],[63333.3359,3,0.0],[63500.0,5,0.0],[63500.0,3,0.0],[63666.668,7,0.0],[63666.668,3,0.0],[63833.3359,5,333.333344],[63833.3359,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[64333.3359,2,0.0],[64500.0039,1,0.0],[64666.668,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[65500.0039,1,0.0],[65666.67,3,0.0],[66000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[67000.0,2,0.0],[67333.3359,1,0.0],[67666.67,0,0.0],[67833.3359,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[68000.0,4,0.0],[68000.0,2,0.0],[68166.67,5,0.0],[68166.67,3,0.0],[68333.3359,7,0.0],[68333.3359,0,0.0],[68500.0,5,0.0],[68500.0,3,0.0],[68666.67,4,0.0],[68666.67,2,0.0],[68833.3359,5,0.0],[69000.0,7,0.0],[69166.67,5,333.333344]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[69666.67,2,0.0],[69833.3359,1,0.0],[70000.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[70833.3359,1,0.0],[71000.0,3,0.0],[71333.3359,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[72333.3359,2,0.0],[72666.67,1,0.0],[73000.0,0,0.0],[73166.67,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[73333.3359,2,0.0],[73500.0,3,0.0],[73666.67,0,0.0],[73833.3359,3,0.0],[74000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[74666.67,2,0.0],[75000.0,0,0.0],[75333.3359,2,0.0],[75666.67,0,0.0],[75833.3359,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[76000.0,2,0.0],[76166.67,3,0.0],[76333.3359,0,0.0],[76666.67,2,0.0],[77000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[77333.3359,2,0.0],[77666.67,0,0.0],[78000.0,2,0.0],[78333.3359,0,0.0],[78500.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[78666.67,2,0.0],[78833.3359,3,0.0],[79000.0,0,0.0],[79333.3359,2,0.0],[79666.67,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[80000.0,1,0.0],[80333.3359,0,0.0],[80500.0,3,0.0],[80666.67,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[81333.3359,1,0.0],[81666.67,1,0.0],[82000.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[82666.67,1,0.0],[83000.0,0,0.0],[83166.67,3,0.0],[83333.3359,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[84000.0,1,0.0],[84333.3359,1,0.0],[84666.67,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]}]},"generatedBy":"SNIFF ver.6"} \ No newline at end of file +{"song":{"song":"Dad Battle","bpm":180.0,"needsVoices":true,"player1":"bf","player2":"dad","speed":1.5,"notes":[{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[10666.667,2,0.0],[11000.0,0,0.0],[11333.334,2,0.0],[11666.667,0,0.0],[11833.334,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[12000.0,2,0.0],[12166.667,3,0.0],[12333.334,0,0.0],[12666.667,2,0.0],[13000.0,0,0.0],[13166.667,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[13333.334,2,0.0],[13666.667,0,0.0],[14000.0,2,0.0],[14333.334,0,0.0],[14500.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[14666.667,2,0.0],[14833.334,3,0.0],[15000.0,0,0.0],[15333.334,2,0.0],[15666.667,0,0.0],[15833.334,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[16000.0,1,0.0],[16333.334,0,0.0],[16500.0,3,0.0],[16666.668,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[17333.334,1,0.0],[17666.668,0,0.0],[17833.334,0,0.0],[18000.0,3,0.0],[18166.668,3,0.0],[18333.334,3,0.0],[18500.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[18666.668,1,0.0],[19000.0,0,0.0],[19166.668,3,0.0],[19333.334,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[20000.0,1,0.0],[20333.334,0,0.0],[20500.0,0,0.0],[20666.668,3,0.0],[20833.334,3,0.0],[21000.0,3,0.0],[21166.668,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[21666.668,2,0.0],[22000.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[22833.334,1,0.0],[23000.0,3,0.0],[23333.334,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24333.334,2,0.0],[24666.668,1,0.0],[25000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[25333.334,2,0.0],[25666.668,0,0.0],[25833.334,3,0.0],[26000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[27000.0,2,0.0],[27333.334,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[28166.668,1,0.0],[28333.334,3,0.0],[28666.668,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[29666.668,2,0.0],[30000.0,1,0.0],[30333.334,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[30666.668,4,0.0],[30666.668,2,0.0],[30833.334,5,0.0],[31000.0,7,0.0],[31000.0,0,0.0],[31166.668,5,0.0],[31166.668,3,0.0],[31333.334,4,0.0],[31333.334,2,0.0],[31500.0,5,0.0],[31666.668,7,0.0],[31833.334,5,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[32166.668,0,0.0],[32333.334,3,0.0],[32666.668,1,0.0],[33000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[33500.0,2,0.0],[33666.668,3,0.0],[34000.0,2,0.0],[34333.3359,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[34666.668,0,0.0],[35000.0,1,0.0],[35333.3359,3,0.0],[35666.668,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[36000.0,2,0.0],[36333.3359,3,0.0],[36666.668,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[37500.0,1,0.0],[37666.668,3,0.0],[38000.0,0,0.0],[38333.3359,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[38666.668,0,0.0],[39000.0,1,0.0],[39333.3359,2,0.0],[39500.0,3,0.0],[39666.668,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[40166.668,0,0.0],[40333.3359,3,0.0],[40666.668,2,0.0],[40833.3359,3,0.0],[41000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[41333.3359,4,0.0],[41333.3359,0,0.0],[41500.0,5,0.0],[41666.668,7,0.0],[41666.668,2,0.0],[41833.3359,5,0.0],[42000.0,4,0.0],[42000.0,3,0.0],[42166.668,5,0.0],[42333.3359,7,0.0],[42333.3359,3,0.0],[42500.0,5,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[42833.3359,0,0.0],[43000.0,3,0.0],[43333.3359,1,0.0],[43666.668,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[44166.668,2,0.0],[44333.3359,3,0.0],[44666.668,2,0.0],[45000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[45333.3359,0,0.0],[45666.668,1,0.0],[46000.0,3,0.0],[46333.3359,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[46666.668,2,0.0],[47000.0,3,0.0],[47333.3359,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[48166.668,1,0.0],[48333.3359,3,0.0],[48666.668,0,0.0],[49000.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[49333.3359,0,0.0],[49666.668,1,0.0],[50000.0,2,0.0],[50166.668,3,0.0],[50333.3359,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[50833.3359,0,0.0],[51000.0,3,0.0],[51333.3359,2,0.0],[51500.0,3,0.0],[51666.668,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[52000.0,0,0.0],[52333.3359,2,0.0],[52666.668,3,0.0],[53000.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[53333.3359,2,0.0],[53666.668,0,0.0],[54000.0,2,0.0],[54333.3359,0,0.0],[54500.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[54666.668,2,0.0],[55000.0,0,0.0],[55333.3359,2,0.0],[55666.668,0,0.0],[55833.3359,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[56000.0,2,0.0],[56333.3359,0,0.0],[56666.668,2,0.0],[57000.0,0,0.0],[57166.668,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[57333.3359,2,0.0],[57500.0,3,0.0],[57666.668,0,0.0],[58000.0,2,0.0],[58333.3359,0,0.0],[58500.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[58666.668,1,0.0],[59000.0,0,0.0],[59166.668,3,0.0],[59333.3359,1,0.0],[59666.668,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[60000.0,1,0.0],[60333.3359,0,0.0],[60500.0,0,0.0],[60666.668,3,0.0],[60833.3359,3,0.0],[61000.0,3,0.0],[61166.668,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[61333.3359,1,0.0],[61666.668,0,0.0],[61833.3359,3,0.0],[62000.0,1,0.0],[62333.3359,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[62666.668,4,0.0],[62666.668,1,0.0],[62833.3359,5,0.0],[63000.0,7,0.0],[63000.0,0,0.0],[63166.668,5,0.0],[63166.668,0,0.0],[63333.3359,4,0.0],[63333.3359,3,0.0],[63500.0,5,0.0],[63500.0,3,0.0],[63666.668,7,0.0],[63666.668,3,0.0],[63833.3359,5,333.333344],[63833.3359,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[64333.3359,2,0.0],[64500.0039,1,0.0],[64666.668,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[65500.0039,1,0.0],[65666.67,3,0.0],[66000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[67000.0,2,0.0],[67333.3359,1,0.0],[67666.67,0,0.0],[67833.3359,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[68000.0,4,0.0],[68000.0,2,0.0],[68166.67,5,0.0],[68166.67,3,0.0],[68333.3359,7,0.0],[68333.3359,0,0.0],[68500.0,5,0.0],[68500.0,3,0.0],[68666.67,4,0.0],[68666.67,2,0.0],[68833.3359,5,0.0],[69000.0,7,0.0],[69166.67,5,333.333344]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[69666.67,2,0.0],[69833.3359,1,0.0],[70000.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[70833.3359,1,0.0],[71000.0,3,0.0],[71333.3359,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[72333.3359,2,0.0],[72666.67,1,0.0],[73000.0,0,0.0],[73166.67,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[73333.3359,2,0.0],[73500.0,3,0.0],[73666.67,0,0.0],[73833.3359,3,0.0],[74000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[74666.67,2,0.0],[75000.0,0,0.0],[75333.3359,2,0.0],[75666.67,0,0.0],[75833.3359,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[76000.0,2,0.0],[76166.67,3,0.0],[76333.3359,0,0.0],[76666.67,2,0.0],[77000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[77333.3359,2,0.0],[77666.67,0,0.0],[78000.0,2,0.0],[78333.3359,0,0.0],[78500.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[78666.67,2,0.0],[78833.3359,3,0.0],[79000.0,0,0.0],[79333.3359,2,0.0],[79666.67,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[80000.0,1,0.0],[80333.3359,0,0.0],[80500.0,3,0.0],[80666.67,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[81333.3359,1,0.0],[81666.67,1,0.0],[82000.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[82666.67,1,0.0],[83000.0,0,0.0],[83166.67,3,0.0],[83333.3359,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[84000.0,1,0.0],[84333.3359,1,0.0],[84666.67,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]}]},"generatedBy":"SNIFF ver.6"} \ No newline at end of file diff --git a/assets/preload/data/freeplaySonglist.txt b/assets/preload/data/freeplaySonglist.txt index 03a449122..e69de29bb 100644 --- a/assets/preload/data/freeplaySonglist.txt +++ b/assets/preload/data/freeplaySonglist.txt @@ -1 +0,0 @@ -Tutorial:gf:0xFF9271FD \ No newline at end of file diff --git a/assets/preload/data/hot-dilf/events.json b/assets/preload/data/hot-dilf/events.json new file mode 100644 index 000000000..3dffc62b8 --- /dev/null +++ b/assets/preload/data/hot-dilf/events.json @@ -0,0 +1,1981 @@ +{ + "song": { + "player1": "bf", + "sectionLengths": [], + "notes": [ + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + -6000, + -1, + "Set GF Speed", + "2", + "" + ] + ], + "mustHitSection": true + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": true + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 9587.5, + -1, + "Camera Follow Pos", + "500", + "550" + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 9600, + -1, + "Screen Shake", + "0.9, 0.015", + "0.9, 0.015" + ], + [ + 10400, + -1, + "Play Animation", + "idle", + "0" + ], + [ + 10387.5, + -1, + "Camera Follow Pos", + "", + "" + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 12787.5, + -1, + "Camera Follow Pos", + "500", + "550" + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 12800, + -1, + "Screen Shake", + "0.9, 0.015", + "0.9, 0.015" + ], + [ + 13600, + -1, + "Play Animation", + "idle", + "0" + ], + [ + 13587.5, + -1, + "Camera Follow Pos", + "", + "" + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 15987.5, + -1, + "Camera Follow Pos", + "500", + "550" + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 16000, + -1, + "Screen Shake", + "0.9, 0.015", + "0.9, 0.015" + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 17600, + -1, + "Camera Follow Pos", + "", + "" + ], + [ + 19187.5, + -1, + "Camera Follow Pos", + "500", + "550" + ] + ], + "mustHitSection": true + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 19200, + -1, + "Screen Shake", + "0.9, 0.015", + "0.9, 0.015" + ], + [ + 20200, + -1, + "Play Animation", + "idle", + "" + ], + [ + 20150, + -1, + "Camera Follow Pos", + "", + "" + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 22387.5, + -1, + "Camera Follow Pos", + "500", + "550" + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 23187.5, + -1, + "Camera Follow Pos", + "", + "" + ], + [ + 23200, + -1, + "Play Animation", + "idle", + "" + ], + [ + 22400, + -1, + "Screen Shake", + "0.9, 0.015", + "0.9, 0.015" + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 25587.5, + -1, + "Camera Follow Pos", + "500", + "550" + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 25600, + -1, + "Screen Shake", + "0.9, 0.015", + "0.9, 0.015" + ], + [ + 26400, + -1, + "Camera Follow Pos", + "", + "" + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 28787.5, + -1, + "Camera Follow Pos", + "500", + "550" + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 28800, + -1, + "Screen Shake", + "0.9, 0.015", + "0.9, 0.015" + ], + [ + 29600, + -1, + "Play Animation", + "idle", + "" + ], + [ + 29587.5, + -1, + "Camera Follow Pos", + "", + "" + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 31987.5, + -1, + "Camera Follow Pos", + "500", + "550" + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 32800, + -1, + "Play Animation", + "idle", + "" + ], + [ + 32000, + -1, + "Screen Shake", + "0.9, 0.015", + "0.9, 0.015" + ], + [ + 32787.5, + -1, + "Camera Follow Pos", + "", + "" + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 35187.5, + -1, + "Camera Follow Pos", + "500", + "550" + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 36000, + -1, + "Play Animation", + "idle", + "" + ], + [ + 35200, + -1, + "Screen Shake", + "0.9, 0.015", + "0.9, 0.015" + ], + [ + 35987.5, + -1, + "Camera Follow Pos", + "", + "" + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 38387.5, + -1, + "Camera Follow Pos", + "500", + "550" + ], + [ + 62387.5, + -1, + "Camera Follow Pos", + "500", + "550" + ] + ], + "altAnim": false, + "mustHitSection": false, + "changeBPM": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 38400, + -1, + "Screen Shake", + "0.9, 0.015", + "0.9, 0.015" + ], + [ + 39200, + -1, + "Camera Follow Pos", + "", + "" + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 41587.5, + -1, + "Camera Follow Pos", + "500", + "550" + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 42300, + -1, + "Play Animation", + "idle", + "" + ], + [ + 41600, + -1, + "Screen Shake", + "0.9, 0.015", + "0.9, 0.015" + ], + [ + 42287.5, + -1, + "Camera Follow Pos", + "", + "" + ] + ], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [ + [ + 44787.5, + -1, + "Camera Follow Pos", + "500", + "550" + ] + ], + "typeOfSection": 0, + "mustHitSection": true, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 44800, + -1, + "Screen Shake", + "0.9, 0.015", + "0.9, 0.015" + ], + [ + 45600, + -1, + "Play Animation", + "idle", + "" + ], + [ + 45587.5, + -1, + "Camera Follow Pos", + "", + "" + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 47987.5, + -1, + "Camera Follow Pos", + "500", + "550" + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 48000, + -1, + "Screen Shake", + "0.9, 0.015", + "0.9, 0.015" + ], + [ + 48775, + -1, + "Camera Follow Pos", + "", + "" + ], + [ + 48800, + -1, + "Play Animation", + "idle", + "" + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 51187.5, + -1, + "Camera Follow Pos", + "500", + "550" + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 51200, + -1, + "Screen Shake", + "0.9, 0.015", + "0.9, 0.015" + ], + [ + 52000, + -1, + "Camera Follow Pos", + "", + "" + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 54387.5, + -1, + "Camera Follow Pos", + "500", + "550" + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 54400, + -1, + "Screen Shake", + "0.9, 0.015", + "0.9, 0.015" + ], + [ + 55187.5, + -1, + "Camera Follow Pos", + "", + "" + ], + [ + 55200, + -1, + "Play Animation", + "idle", + "" + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 57587.5, + -1, + "Camera Follow Pos", + "500", + "550" + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 57600, + -1, + "Screen Shake", + "0.9, 0.015", + "0.9, 0.015" + ], + [ + 58387.5, + -1, + "Camera Follow Pos", + "", + "" + ], + [ + 58400, + -1, + "Play Animation", + "idle", + "" + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 60775, + -1, + "Camera Follow Pos", + "500", + "550" + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 60800, + -1, + "Screen Shake", + "0.8, 0.02", + "0.8, 0.02" + ], + [ + 61600, + -1, + "Screen Shake", + "0.8, 0.02", + "0.8, 0.02" + ], + [ + 61550, + -1, + "Play Animation", + "idle", + "" + ], + [ + 62350, + -1, + "Play Animation", + "idle", + "" + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 62400, + -1, + "Screen Shake", + "0.8, 0.02", + "0.8, 0.02" + ], + [ + 63200, + -1, + "Screen Shake", + "0.8, 0.02", + "0.8, 0.02" + ], + [ + 62800, + -1, + "Camera Follow Pos", + "", + "" + ], + [ + 63987.5, + -1, + "Camera Follow Pos", + "500", + "550" + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 64000, + -1, + "Screen Shake", + "0.8, 0.02", + "0.8, 0.02" + ], + [ + 64800, + -1, + "Screen Shake", + "0.8, 0.02", + "0.8, 0.02" + ], + [ + 65575, + -1, + "Play Animation", + "idle", + "" + ], + [ + 64750, + -1, + "Play Animation", + "idle", + "" + ], + [ + 64400, + -1, + "Camera Follow Pos", + "", + "" + ], + [ + 65587.5, + -1, + "Camera Follow Pos", + "", + "" + ], + [ + 65300, + -1, + "Camera Follow Pos", + "500", + "550" + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 65600, + -1, + "Screen Shake", + "0.8, 0.02", + "0.8, 0.02" + ], + [ + 66400, + -1, + "Screen Shake", + "0.8, 0.02", + "0.8, 0.02" + ], + [ + 67187.5, + -1, + "Camera Follow Pos", + "", + "" + ], + [ + 66700, + -1, + "Camera Follow Pos", + "500", + "550" + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 67200, + -1, + "Screen Shake", + "0.8, 0.02", + "0.8, 0.02" + ], + [ + 68000, + -1, + "Screen Shake", + "0.8, 0.02", + "0.8, 0.02" + ], + [ + 68787.5, + -1, + "Camera Follow Pos", + "", + "" + ], + [ + 68300, + -1, + "Camera Follow Pos", + "500", + "550" + ], + [ + 68750, + -1, + "Play Animation", + "idle", + "" + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 68800, + -1, + "Screen Shake", + "0.8, 0.02", + "0.8, 0.02" + ], + [ + 69600, + -1, + "Screen Shake", + "0.8, 0.02", + "0.8, 0.02" + ], + [ + 69550, + -1, + "Play Animation", + "idle", + "" + ], + [ + 70350, + -1, + "Play Animation", + "idle", + "" + ], + [ + 68900, + -1, + "Camera Follow Pos", + "500", + "550" + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 70400, + -1, + "Screen Shake", + "0.8, 0.02", + "0.8, 0.02" + ], + [ + 71200, + -1, + "Screen Shake", + "0.8, 0.02", + "0.8, 0.02" + ], + [ + 71150, + -1, + "Play Animation", + "idle", + "" + ], + [ + 71950, + -1, + "Play Animation", + "idle", + "" + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 72000, + -1, + "Screen Shake", + "0.8, 0.02", + "0.8, 0.02" + ], + [ + 72800, + -1, + "Play Animation", + "idle", + "" + ], + [ + 72787.5, + -1, + "Camera Follow Pos", + "", + "" + ], + [ + 73575, + -1, + "Camera Follow Pos", + "500", + "550" + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 73600, + -1, + "Screen Shake", + "0.8, 0.02", + "0.8, 0.02" + ], + [ + 74400, + -1, + "Screen Shake", + "0.8, 0.02", + "0.8, 0.02" + ], + [ + 74350, + -1, + "Play Animation", + "idle", + "" + ], + [ + 75150, + -1, + "Play Animation", + "idle", + "" + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 75200, + -1, + "Screen Shake", + "0.8, 0.02", + "0.8, 0.02" + ], + [ + 76000, + -1, + "Screen Shake", + "0.8, 0.02", + "0.8, 0.02" + ], + [ + 75600, + -1, + "Camera Follow Pos", + "", + "" + ], + [ + 76775, + -1, + "Camera Follow Pos", + "500", + "550" + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 76800, + -1, + "Screen Shake", + "0.8, 0.02", + "0.8, 0.02" + ], + [ + 77600, + -1, + "Screen Shake", + "0.8, 0.02", + "0.8, 0.02" + ], + [ + 77550, + -1, + "Play Animation", + "idle", + "" + ], + [ + 78350, + -1, + "Play Animation", + "idle", + "" + ], + [ + 78375, + -1, + "Camera Follow Pos", + "", + "" + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 78400, + -1, + "Screen Shake", + "0.8, 0.02", + "0.8, 0.02" + ], + [ + 79200, + -1, + "Screen Shake", + "0.8, 0.02", + "0.8, 0.02" + ], + [ + 79950, + -1, + "Play Animation", + "idle", + "" + ], + [ + 79600, + -1, + "Camera Follow Pos", + "500", + "550" + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 80000, + -1, + "Screen Shake", + "0.8, 0.02", + "0.8, 0.02" + ], + [ + 80800, + -1, + "Screen Shake", + "0.8, 0.02", + "0.8, 0.02" + ], + [ + 80750, + -1, + "Play Animation", + "idle", + "" + ], + [ + 81550, + -1, + "Play Animation", + "idle", + "" + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 81600, + -1, + "Screen Shake", + "0.8, 0.02", + "0.8, 0.02" + ], + [ + 82400, + -1, + "Screen Shake", + "0.8, 0.02", + "0.8, 0.02" + ], + [ + 82350, + -1, + "Play Animation", + "idle", + "" + ], + [ + 83150, + -1, + "Play Animation", + "idle", + "" + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 83200, + -1, + "Screen Shake", + "0.8, 0.02", + "0.8, 0.02" + ], + [ + 84000, + -1, + "Screen Shake", + "0.8, 0.02", + "0.8, 0.02" + ], + [ + 83950, + -1, + "Play Animation", + "idle", + "" + ], + [ + 84750, + -1, + "Play Animation", + "idle", + "" + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [ + [ + 84800, + -1, + "Screen Shake", + "0.8, 0.02", + "0.8, 0.02" + ], + [ + 85600, + -1, + "Play Animation", + "idle", + "" + ], + [ + 85550, + -1, + "Camera Follow Pos", + "", + "" + ] + ], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + } + ], + "player2": "dad", + "player3": "gf", + "song": "Hot Dilf", + "validScore": true, + "sections": 0, + "needsVoices": true, + "bpm": 150, + "speed": 1.6 + } +} \ No newline at end of file diff --git a/assets/preload/data/hot-dilf/hot-dilf-easy.json b/assets/preload/data/hot-dilf/hot-dilf-easy.json new file mode 100644 index 000000000..42bb4fa58 --- /dev/null +++ b/assets/preload/data/hot-dilf/hot-dilf-easy.json @@ -0,0 +1,2000 @@ +{ + "song": { + "player1": "bf", + "sectionLengths": [], + "notes": [ + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": true + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": true + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 4800, + 2, + 300, + 0 + ], + [ + 5200, + 1, + 300, + 0 + ], + [ + 5600, + 0, + 300, + 0 + ], + [ + 6000, + 3, + 300, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 6400, + 1, + 700, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 8800, + 2, + 0, + 0 + ], + [ + 8400, + 3, + 0, + 0 + ], + [ + 9200, + 0, + 0, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 9600, + 1, + 700, + 2 + ], + [ + 9600, + 6, + 700, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 11600, + 3, + 0 + ], + [ + 12400, + 0, + 0 + ], + [ + 12000, + 2, + 0, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 12800, + 1, + 700, + 2 + ], + [ + 12800, + 4, + 700, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 14450, + 1, + 650, + 0 + ], + [ + 15600, + 2, + 0, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 16000, + 3, + 1000, + 2 + ], + [ + 16000, + 7, + 700, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": true + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 19200, + 4, + 700, + 0 + ], + [ + 19200, + 1, + 900, + 2 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 21200, + 3, + 0, + 0 + ], + [ + 22000, + 0, + 0, + 0 + ], + [ + 21600, + 2, + 0, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 22400, + 1, + 700, + 2 + ], + [ + 22400, + 4, + 700, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 24000, + 3, + 200, + 0 + ], + [ + 24400, + 2, + 0, + 0 + ], + [ + 24800, + 1, + 0, + 0 + ], + [ + 25200, + 2, + 0, + 0 + ], + [ + 25500, + 1, + 0, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 25600, + 0, + 700, + 2 + ], + [ + 25600, + 4, + 700, + 0 + ], + [ + 26400, + 3, + 700, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 27200, + 0, + 300, + 0 + ], + [ + 27600, + 2, + 300, + 0 + ], + [ + 28000, + 3, + 300, + 0 + ], + [ + 28400, + 1, + 300, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 28800, + 2, + 700, + 2 + ], + [ + 28800, + 7, + 700, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 32000, + 1, + 700, + 2 + ], + [ + 32000, + 4, + 700, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 35200, + 3, + 700, + 2 + ], + [ + 35200, + 6, + 700, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 36800, + 3, + 200, + 0 + ], + [ + 37200, + 2, + 0, + 0 + ], + [ + 37600, + 1, + 0, + 0 + ], + [ + 38000, + 2, + 0, + 0 + ], + [ + 38300, + 1, + 0, + 0 + ] + ], + "altAnim": false, + "mustHitSection": false, + "changeBPM": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 38400, + 0, + 700, + 2 + ], + [ + 39200, + 3, + 700, + 0 + ], + [ + 38400, + 7, + 700, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 40000, + 0, + 300, + 0 + ], + [ + 40400, + 2, + 300, + 0 + ], + [ + 40800, + 3, + 300, + 0 + ], + [ + 41200, + 1, + 300, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 41600, + 2, + 600, + 2 + ], + [ + 41600, + 5, + 600, + 0 + ] + ], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [], + "typeOfSection": 0, + "mustHitSection": true, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 44800, + 1, + 700, + 2 + ], + [ + 44800, + 6, + 700, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 47600, + 0, + 0, + 0 + ], + [ + 46800, + 3, + 0, + 0 + ], + [ + 47200, + 2, + 0, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 48000, + 1, + 650, + 2 + ], + [ + 48000, + 6, + 700, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 49600, + 3, + 200 + ], + [ + 50000, + 2, + 0 + ], + [ + 50400, + 1, + 0 + ], + [ + 50800, + 2, + 0 + ], + [ + 51100, + 1, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 52000, + 3, + 700, + 0 + ], + [ + 51200, + 7, + 700, + 0 + ], + [ + 51200, + 0, + 700, + 2 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 52800, + 0, + 300, + 0 + ], + [ + 53200, + 2, + 300, + 0 + ], + [ + 53600, + 3, + 300, + 0 + ], + [ + 54000, + 1, + 300, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 54400, + 2, + 700, + 2 + ], + [ + 54400, + 5, + 700, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 57600, + 6, + 700, + 0 + ], + [ + 57600, + 1, + 700, + 2 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 59600, + 3, + 0, + 0 + ], + [ + 60000, + 2, + 0, + 0 + ], + [ + 60400, + 0, + 0, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 60800, + 6, + 700, + 0 + ], + [ + 61600, + 7, + 700, + 0 + ], + [ + 60800, + 3, + 650, + 2 + ], + [ + 61600, + 0, + 650, + 2 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 62400, + 4, + 700, + 0 + ], + [ + 63200, + 7, + 700, + 0 + ], + [ + 62400, + 3, + 300, + 2 + ], + [ + 62800, + 3, + 0, + 0 + ], + [ + 63200, + 2, + 0, + 0 + ], + [ + 63600, + 0, + 0, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 64000, + 4, + 700, + 0 + ], + [ + 64800, + 7, + 700, + 0 + ], + [ + 64000, + 1, + 300, + 2 + ], + [ + 64400, + 3, + 0, + 0 + ], + [ + 64800, + 2, + 0, + 0 + ], + [ + 65400, + 1, + 0, + 2 + ], + [ + 65200, + 0, + 0, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 65600, + 5, + 700, + 0 + ], + [ + 66400, + 7, + 700, + 0 + ], + [ + 65600, + 3, + 0, + 0 + ], + [ + 66800, + 2, + 0, + 2 + ], + [ + 65700, + 1, + 600, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 67200, + 5, + 700, + 0 + ], + [ + 68000, + 6, + 700, + 0 + ], + [ + 67200, + 3, + 0, + 0 + ], + [ + 68400, + 2, + 0, + 2 + ], + [ + 67300, + 1, + 600, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 68800, + 4, + 700, + 0 + ], + [ + 69600, + 7, + 700, + 0 + ], + [ + 68800, + 3, + 650, + 2 + ], + [ + 69600, + 0, + 650, + 2 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 70400, + 5, + 700, + 0 + ], + [ + 71200, + 6, + 700, + 0 + ], + [ + 70400, + 3, + 650, + 2 + ], + [ + 71200, + 0, + 650, + 2 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 72000, + 5, + 700, + 0 + ], + [ + 73000, + 1, + 0, + 0 + ], + [ + 72000, + 1, + 700, + 2 + ], + [ + 73200, + 2, + 0, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 73600, + 3, + 650, + 2 + ], + [ + 74400, + 0, + 650, + 2 + ], + [ + 73600, + 4, + 700, + 0 + ], + [ + 74400, + 6, + 700, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 75200, + 3, + 300, + 2 + ], + [ + 75600, + 3, + 0, + 0 + ], + [ + 76000, + 2, + 0, + 0 + ], + [ + 75200, + 5, + 800, + 0 + ], + [ + 76100, + 7, + 600, + 0 + ], + [ + 76400, + 0, + 0, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 76800, + 3, + 650, + 2 + ], + [ + 77600, + 0, + 650, + 2 + ], + [ + 77600, + 7, + 700, + 0 + ], + [ + 76800, + 4, + 700, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 78400, + 3, + 0, + 0 + ], + [ + 78500, + 1, + 500, + 0 + ], + [ + 79600, + 2, + 0, + 2 + ], + [ + 79200, + 4, + 700, + 0 + ], + [ + 78400, + 5, + 700, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 80000, + 3, + 650, + 2 + ], + [ + 80800, + 0, + 650, + 2 + ], + [ + 80000, + 5, + 700, + 0 + ], + [ + 80800, + 6, + 700, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 81600, + 3, + 650, + 2 + ], + [ + 82400, + 0, + 650, + 2 + ], + [ + 81600, + 7, + 700, + 0 + ], + [ + 82400, + 6, + 700, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 83200, + 3, + 650, + 2 + ], + [ + 84000, + 0, + 650, + 2 + ], + [ + 83200, + 4, + 700, + 0 + ], + [ + 84000, + 7, + 700, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [ + [ + 84800, + 3, + 650, + 2 + ], + [ + 84800, + 6, + 700, + 0 + ] + ], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + } + ], + "player2": "dad", + "player3": "gf", + "song": "Hot Dilf", + "sections": 0, + "needsVoices": true, + "validScore": true, + "bpm": 150, + "speed": 1.2 + } +} \ No newline at end of file diff --git a/assets/preload/data/hot-dilf/hot-dilf-hard.json b/assets/preload/data/hot-dilf/hot-dilf-hard.json new file mode 100644 index 000000000..9d6e42489 --- /dev/null +++ b/assets/preload/data/hot-dilf/hot-dilf-hard.json @@ -0,0 +1,2507 @@ +{ + "song": { + "player1": "bf", + "sectionLengths": [], + "notes": [ + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": true + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": true + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 4800, + 2, + 300, + 0 + ], + [ + 5200, + 1, + 300, + 0 + ], + [ + 5600, + 0, + 300, + 0 + ], + [ + 6000, + 3, + 300, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 6400, + 1, + 700, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 8800, + 2, + 0, + 0 + ], + [ + 8400, + 3, + 0, + 0 + ], + [ + 8600, + 1, + 0, + 0 + ], + [ + 9000, + 1, + 0, + 0 + ], + [ + 9200, + 0, + 0, + 0 + ], + [ + 9400, + 1, + 0, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 9600, + 1, + 700, + 2 + ], + [ + 9600, + 6, + 700, + 0 + ], + [ + 9600, + 7, + 700, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 12000, + 2, + 0 + ], + [ + 11600, + 3, + 0 + ], + [ + 11800, + 1, + 0 + ], + [ + 12200, + 1, + 0 + ], + [ + 12400, + 0, + 0 + ], + [ + 12600, + 1, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 12800, + 1, + 700, + 2 + ], + [ + 12800, + 4, + 700, + 0 + ], + [ + 12800, + 6, + 700, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 14400, + 3, + 0, + 0 + ], + [ + 14450, + 1, + 650, + 0 + ], + [ + 15200, + 3, + 0, + 0 + ], + [ + 15600, + 2, + 0, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 16000, + 3, + 1000, + 2 + ], + [ + 16000, + 7, + 700, + 0 + ], + [ + 16000, + 5, + 700, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": true + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 19200, + 4, + 700, + 0 + ], + [ + 19200, + 1, + 900, + 2 + ], + [ + 19200, + 7, + 700, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 21200, + 3, + 0, + 0 + ], + [ + 21400, + 1, + 0, + 0 + ], + [ + 21600, + 2, + 0, + 0 + ], + [ + 21800, + 1, + 0, + 0 + ], + [ + 22000, + 0, + 0, + 0 + ], + [ + 22200, + 1, + 0, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 22400, + 1, + 700, + 2 + ], + [ + 22400, + 6, + 700, + 0 + ], + [ + 22400, + 4, + 700, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 24000, + 3, + 200, + 0 + ], + [ + 24300, + 0, + 0, + 0 + ], + [ + 24400, + 2, + 0, + 0 + ], + [ + 24700, + 3, + 0, + 0 + ], + [ + 24800, + 1, + 0, + 0 + ], + [ + 25100, + 0, + 0, + 0 + ], + [ + 25200, + 2, + 0, + 0 + ], + [ + 25500, + 1, + 0, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 25600, + 0, + 700, + 2 + ], + [ + 25600, + 4, + 700, + 0 + ], + [ + 26400, + 3, + 700, + 0 + ], + [ + 25600, + 7, + 700, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 27200, + 0, + 300, + 0 + ], + [ + 27600, + 2, + 300, + 0 + ], + [ + 28000, + 3, + 300, + 0 + ], + [ + 28400, + 1, + 300, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 28800, + 2, + 700, + 2 + ], + [ + 28800, + 7, + 700, + 0 + ], + [ + 28800, + 6, + 700, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 32000, + 1, + 700, + 2 + ], + [ + 32000, + 4, + 700, + 0 + ], + [ + 32000, + 7, + 700, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 35200, + 3, + 700, + 2 + ], + [ + 35200, + 6, + 700, + 0 + ], + [ + 35200, + 4, + 700, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 36800, + 3, + 200, + 0 + ], + [ + 37100, + 0, + 0, + 0 + ], + [ + 37200, + 2, + 0, + 0 + ], + [ + 37500, + 3, + 0, + 0 + ], + [ + 37600, + 1, + 0, + 0 + ], + [ + 37900, + 0, + 0, + 0 + ], + [ + 38000, + 2, + 0, + 0 + ], + [ + 38300, + 1, + 0, + 0 + ] + ], + "altAnim": false, + "mustHitSection": false, + "changeBPM": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 38400, + 0, + 700, + 2 + ], + [ + 39200, + 3, + 700, + 0 + ], + [ + 38400, + 7, + 700, + 0 + ], + [ + 38400, + 6, + 700, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 40000, + 0, + 300, + 0 + ], + [ + 40400, + 2, + 300, + 0 + ], + [ + 40800, + 3, + 300, + 0 + ], + [ + 41200, + 1, + 300, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 41600, + 2, + 600, + 2 + ], + [ + 41600, + 7, + 600 + ], + [ + 41600, + 5, + 600, + 0 + ] + ], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [], + "typeOfSection": 0, + "mustHitSection": true, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 44800, + 1, + 700, + 2 + ], + [ + 44800, + 4, + 700 + ], + [ + 44800, + 6, + 700, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 47800, + 1, + 0, + 0 + ], + [ + 47600, + 0, + 0, + 0 + ], + [ + 47400, + 1, + 0, + 0 + ], + [ + 47200, + 2, + 0, + 0 + ], + [ + 47000, + 1, + 0, + 0 + ], + [ + 46800, + 3, + 0, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 48000, + 1, + 650, + 2 + ], + [ + 48000, + 6, + 700, + 0 + ], + [ + 48000, + 7, + 700, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 49600, + 3, + 200 + ], + [ + 49900, + 0, + 0 + ], + [ + 50000, + 2, + 0 + ], + [ + 50300, + 3, + 0 + ], + [ + 50400, + 1, + 0 + ], + [ + 50700, + 0, + 0 + ], + [ + 50800, + 2, + 0 + ], + [ + 51100, + 1, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 52000, + 3, + 700, + 0 + ], + [ + 51200, + 7, + 700, + 0 + ], + [ + 51200, + 6, + 700, + 0 + ], + [ + 51200, + 0, + 700, + 2 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 52800, + 0, + 300, + 0 + ], + [ + 53200, + 2, + 300, + 0 + ], + [ + 53600, + 3, + 300, + 0 + ], + [ + 54000, + 1, + 300, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 54400, + 2, + 700, + 2 + ], + [ + 54400, + 7, + 700, + 0 + ], + [ + 54400, + 5, + 700, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 57600, + 6, + 700, + 0 + ], + [ + 57600, + 7, + 700, + 0 + ], + [ + 57600, + 1, + 700, + 2 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 59600, + 3, + 0, + 0 + ], + [ + 59800, + 1, + 0, + 0 + ], + [ + 60000, + 2, + 0, + 0 + ], + [ + 60200, + 1, + 0, + 0 + ], + [ + 60400, + 0, + 0, + 0 + ], + [ + 60600, + 1, + 0, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 60800, + 5, + 700, + 0 + ], + [ + 60800, + 6, + 700, + 0 + ], + [ + 61600, + 4, + 700, + 0 + ], + [ + 61600, + 7, + 700, + 0 + ], + [ + 60800, + 3, + 650, + 2 + ], + [ + 61600, + 0, + 650, + 2 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 62400, + 4, + 700, + 0 + ], + [ + 62400, + 5, + 700, + 0 + ], + [ + 63200, + 6, + 700, + 0 + ], + [ + 63200, + 7, + 700, + 0 + ], + [ + 62400, + 3, + 300, + 2 + ], + [ + 62800, + 3, + 0, + 0 + ], + [ + 63000, + 1, + 0, + 0 + ], + [ + 63200, + 2, + 0, + 0 + ], + [ + 63400, + 1, + 0, + 0 + ], + [ + 63600, + 0, + 0, + 0 + ], + [ + 63800, + 1, + 0, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 64000, + 6, + 700, + 0 + ], + [ + 64000, + 4, + 700, + 0 + ], + [ + 64800, + 5, + 700, + 0 + ], + [ + 64800, + 7, + 700, + 0 + ], + [ + 64000, + 1, + 300, + 2 + ], + [ + 64400, + 3, + 0, + 0 + ], + [ + 64600, + 1, + 0, + 0 + ], + [ + 64800, + 2, + 0, + 0 + ], + [ + 65000, + 1, + 0, + 0 + ], + [ + 65200, + 0, + 0, + 0 + ], + [ + 65400, + 1, + 0, + 2 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 65600, + 5, + 700, + 0 + ], + [ + 65600, + 6, + 700, + 0 + ], + [ + 66400, + 4, + 700, + 0 + ], + [ + 66400, + 7, + 700, + 0 + ], + [ + 65600, + 3, + 0, + 0 + ], + [ + 66400, + 3, + 0, + 0 + ], + [ + 66800, + 2, + 0, + 2 + ], + [ + 65700, + 1, + 600, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 67200, + 4, + 700, + 0 + ], + [ + 67200, + 5, + 700, + 0 + ], + [ + 68000, + 6, + 700, + 0 + ], + [ + 68000, + 7, + 700, + 0 + ], + [ + 68000, + 3, + 0, + 0 + ], + [ + 67200, + 3, + 0, + 0 + ], + [ + 68400, + 2, + 0, + 2 + ], + [ + 67300, + 1, + 600, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 68800, + 4, + 700, + 0 + ], + [ + 68800, + 6, + 700, + 0 + ], + [ + 69600, + 5, + 700, + 0 + ], + [ + 69600, + 7, + 700, + 0 + ], + [ + 68800, + 3, + 650, + 2 + ], + [ + 69600, + 0, + 650, + 2 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 70400, + 5, + 700, + 0 + ], + [ + 71200, + 7, + 700, + 0 + ], + [ + 71200, + 6, + 700, + 0 + ], + [ + 70400, + 4, + 700, + 0 + ], + [ + 70400, + 3, + 650, + 2 + ], + [ + 71200, + 0, + 650, + 2 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 72000, + 6, + 700, + 0 + ], + [ + 72000, + 5, + 700, + 0 + ], + [ + 73000, + 1, + 0, + 0 + ], + [ + 73200, + 2, + 0, + 0 + ], + [ + 73400, + 0, + 0, + 0 + ], + [ + 72000, + 1, + 700, + 2 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 73600, + 3, + 650, + 2 + ], + [ + 74400, + 0, + 650, + 2 + ], + [ + 73600, + 4, + 700, + 0 + ], + [ + 73600, + 7, + 700, + 0 + ], + [ + 74400, + 5, + 700, + 0 + ], + [ + 74400, + 6, + 700, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 75200, + 3, + 300, + 2 + ], + [ + 75600, + 3, + 0, + 0 + ], + [ + 75800, + 1, + 0, + 0 + ], + [ + 76000, + 2, + 0, + 0 + ], + [ + 76200, + 1, + 0, + 0 + ], + [ + 76400, + 0, + 0, + 0 + ], + [ + 76600, + 1, + 0, + 0 + ], + [ + 75200, + 5, + 800, + 0 + ], + [ + 75200, + 4, + 800, + 0 + ], + [ + 76100, + 6, + 600, + 0 + ], + [ + 76100, + 7, + 600, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 76800, + 3, + 650, + 2 + ], + [ + 77600, + 0, + 650, + 2 + ], + [ + 77600, + 6, + 700, + 0 + ], + [ + 77600, + 7, + 700, + 0 + ], + [ + 76800, + 4, + 700, + 0 + ], + [ + 76800, + 7, + 700, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 78400, + 3, + 0, + 0 + ], + [ + 78500, + 1, + 500, + 0 + ], + [ + 79200, + 3, + 0, + 0 + ], + [ + 79600, + 2, + 0, + 2 + ], + [ + 79200, + 4, + 700, + 0 + ], + [ + 79200, + 5, + 700, + 0 + ], + [ + 78400, + 5, + 700, + 0 + ], + [ + 78400, + 6, + 700, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 80000, + 3, + 650, + 2 + ], + [ + 80800, + 0, + 650, + 2 + ], + [ + 80000, + 5, + 700, + 0 + ], + [ + 80800, + 6, + 700, + 0 + ], + [ + 80800, + 7, + 700, + 0 + ], + [ + 80000, + 6, + 700, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 81600, + 3, + 650, + 2 + ], + [ + 82400, + 0, + 650, + 2 + ], + [ + 81600, + 7, + 700, + 0 + ], + [ + 82400, + 4, + 700, + 0 + ], + [ + 82400, + 6, + 700, + 0 + ], + [ + 81600, + 5, + 700, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 83200, + 3, + 650, + 2 + ], + [ + 84000, + 0, + 650, + 2 + ], + [ + 83200, + 4, + 700, + 0 + ], + [ + 83200, + 5, + 700, + 0 + ], + [ + 84000, + 7, + 700, + 0 + ], + [ + 84000, + 6, + 700, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [ + [ + 84800, + 3, + 650, + 2 + ], + [ + 84800, + 6, + 700, + 0 + ], + [ + 84800, + 5, + 700, + 0 + ], + [ + 84800, + 7, + 700, + 0 + ], + [ + 84800, + 4, + 700, + 0 + ] + ], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + } + ], + "player2": "dad", + "player3": "gf", + "song": "Hot Dilf", + "sections": 0, + "needsVoices": true, + "validScore": true, + "bpm": 150, + "speed": 1.6 + } +} \ No newline at end of file diff --git a/assets/preload/data/hot-dilf/hot-dilf.json b/assets/preload/data/hot-dilf/hot-dilf.json new file mode 100644 index 000000000..71784fec4 --- /dev/null +++ b/assets/preload/data/hot-dilf/hot-dilf.json @@ -0,0 +1,2200 @@ +{ + "song": { + "player1": "bf", + "sectionLengths": [], + "notes": [ + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": true + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": true + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 4800, + 2, + 300, + 0 + ], + [ + 5200, + 1, + 300, + 0 + ], + [ + 5600, + 0, + 300, + 0 + ], + [ + 6000, + 3, + 300, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 6400, + 1, + 700, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 8800, + 2, + 0, + 0 + ], + [ + 8400, + 3, + 0, + 0 + ], + [ + 8600, + 1, + 0, + 0 + ], + [ + 9200, + 0, + 0, + 0 + ], + [ + 9400, + 1, + 0, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 9600, + 1, + 700, + 2 + ], + [ + 9600, + 6, + 700, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 11600, + 3, + 0 + ], + [ + 11800, + 1, + 0 + ], + [ + 12200, + 1, + 0 + ], + [ + 12400, + 0, + 0 + ], + [ + 12600, + 1, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 12800, + 1, + 700, + 2 + ], + [ + 12800, + 4, + 700, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 14450, + 1, + 650, + 0 + ], + [ + 15200, + 3, + 0, + 0 + ], + [ + 15600, + 2, + 0, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 16000, + 3, + 1000, + 2 + ], + [ + 16000, + 7, + 700, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": true + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 19200, + 4, + 700, + 0 + ], + [ + 19200, + 1, + 900, + 2 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 21200, + 3, + 0, + 0 + ], + [ + 21400, + 1, + 0, + 0 + ], + [ + 21800, + 1, + 0, + 0 + ], + [ + 22000, + 0, + 0, + 0 + ], + [ + 22200, + 1, + 0, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 22400, + 1, + 700, + 2 + ], + [ + 22400, + 4, + 700, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 24000, + 3, + 200, + 0 + ], + [ + 24400, + 2, + 0, + 0 + ], + [ + 24700, + 3, + 0, + 0 + ], + [ + 24800, + 1, + 0, + 0 + ], + [ + 25200, + 2, + 0, + 0 + ], + [ + 25500, + 1, + 0, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 25600, + 0, + 700, + 2 + ], + [ + 25600, + 4, + 700, + 0 + ], + [ + 26400, + 3, + 700, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 27200, + 0, + 300, + 0 + ], + [ + 27600, + 2, + 300, + 0 + ], + [ + 28000, + 3, + 300, + 0 + ], + [ + 28400, + 1, + 300, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 28800, + 2, + 700, + 2 + ], + [ + 28800, + 7, + 700, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 32000, + 1, + 700, + 2 + ], + [ + 32000, + 4, + 700, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 35200, + 3, + 700, + 2 + ], + [ + 35200, + 6, + 700, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 36800, + 3, + 200, + 0 + ], + [ + 37200, + 2, + 0, + 0 + ], + [ + 37500, + 3, + 0, + 0 + ], + [ + 37600, + 1, + 0, + 0 + ], + [ + 38000, + 2, + 0, + 0 + ], + [ + 38300, + 1, + 0, + 0 + ] + ], + "altAnim": false, + "mustHitSection": false, + "changeBPM": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 38400, + 0, + 700, + 2 + ], + [ + 39200, + 3, + 700, + 0 + ], + [ + 38400, + 7, + 700, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 40000, + 0, + 300, + 0 + ], + [ + 40400, + 2, + 300, + 0 + ], + [ + 40800, + 3, + 300, + 0 + ], + [ + 41200, + 1, + 300, + 0 + ] + ], + "mustHitSection": false + }, + { + "typeOfSection": 0, + "lengthInSteps": 16, + "sectionNotes": [ + [ + 41600, + 2, + 600, + 2 + ], + [ + 41600, + 5, + 600, + 0 + ] + ], + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "sectionNotes": [], + "typeOfSection": 0, + "mustHitSection": true, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 44800, + 1, + 700, + 2 + ], + [ + 44800, + 6, + 700, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 47800, + 1, + 0, + 0 + ], + [ + 47600, + 0, + 0, + 0 + ], + [ + 47400, + 1, + 0, + 0 + ], + [ + 47000, + 1, + 0, + 0 + ], + [ + 46800, + 3, + 0, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 48000, + 1, + 650, + 2 + ], + [ + 48000, + 6, + 700, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 49600, + 3, + 200 + ], + [ + 50000, + 2, + 0 + ], + [ + 50300, + 3, + 0 + ], + [ + 50400, + 1, + 0 + ], + [ + 50800, + 2, + 0 + ], + [ + 51100, + 1, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 52000, + 3, + 700, + 0 + ], + [ + 51200, + 7, + 700, + 0 + ], + [ + 51200, + 0, + 700, + 2 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 52800, + 0, + 300, + 0 + ], + [ + 53200, + 2, + 300, + 0 + ], + [ + 53600, + 3, + 300, + 0 + ], + [ + 54000, + 1, + 300, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 54400, + 2, + 700, + 2 + ], + [ + 54400, + 5, + 700, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 57600, + 6, + 700, + 0 + ], + [ + 57600, + 1, + 700, + 2 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 59600, + 3, + 0, + 0 + ], + [ + 59800, + 1, + 0, + 0 + ], + [ + 60000, + 2, + 0, + 0 + ], + [ + 60200, + 1, + 0, + 0 + ], + [ + 60600, + 1, + 0, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 60800, + 6, + 700, + 0 + ], + [ + 61600, + 4, + 700, + 0 + ], + [ + 61600, + 7, + 700, + 0 + ], + [ + 60800, + 3, + 650, + 2 + ], + [ + 61600, + 0, + 650, + 2 + ], + [ + 60800, + 5, + 700, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 62400, + 4, + 700, + 0 + ], + [ + 63200, + 7, + 700, + 0 + ], + [ + 62400, + 3, + 300, + 2 + ], + [ + 62800, + 3, + 0, + 0 + ], + [ + 63200, + 2, + 0, + 0 + ], + [ + 63400, + 1, + 0, + 0 + ], + [ + 63800, + 1, + 0, + 0 + ], + [ + 63000, + 1, + 0, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 64000, + 4, + 700, + 0 + ], + [ + 64800, + 7, + 700, + 0 + ], + [ + 64000, + 1, + 300, + 2 + ], + [ + 64400, + 3, + 0, + 0 + ], + [ + 64600, + 1, + 0, + 0 + ], + [ + 64800, + 2, + 0, + 0 + ], + [ + 65000, + 1, + 0, + 0 + ], + [ + 65400, + 1, + 0, + 2 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 65600, + 5, + 700, + 0 + ], + [ + 65600, + 6, + 700, + 0 + ], + [ + 66400, + 4, + 700, + 0 + ], + [ + 66400, + 7, + 700, + 0 + ], + [ + 65600, + 3, + 0, + 0 + ], + [ + 66400, + 3, + 0, + 0 + ], + [ + 66800, + 2, + 0, + 2 + ], + [ + 65700, + 1, + 600, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 100 + }, + { + "sectionNotes": [ + [ + 67200, + 5, + 700, + 0 + ], + [ + 68000, + 6, + 700, + 0 + ], + [ + 68000, + 3, + 0, + 0 + ], + [ + 67200, + 3, + 0, + 0 + ], + [ + 68400, + 2, + 0, + 2 + ], + [ + 67300, + 1, + 600, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 68800, + 4, + 700, + 0 + ], + [ + 68800, + 6, + 700, + 0 + ], + [ + 69600, + 5, + 700, + 0 + ], + [ + 69600, + 7, + 700, + 0 + ], + [ + 68800, + 3, + 650, + 2 + ], + [ + 69600, + 0, + 650, + 2 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 70400, + 5, + 700, + 0 + ], + [ + 71200, + 6, + 700, + 0 + ], + [ + 70400, + 3, + 650, + 2 + ], + [ + 71200, + 0, + 650, + 2 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 72000, + 6, + 700, + 0 + ], + [ + 72000, + 5, + 700, + 0 + ], + [ + 73000, + 1, + 0, + 0 + ], + [ + 73200, + 2, + 0, + 0 + ], + [ + 73400, + 0, + 0, + 0 + ], + [ + 72000, + 1, + 700, + 2 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 73600, + 3, + 650, + 2 + ], + [ + 74400, + 0, + 650, + 2 + ], + [ + 73600, + 4, + 700, + 0 + ], + [ + 74400, + 6, + 700, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 75200, + 3, + 300, + 2 + ], + [ + 75600, + 3, + 0, + 0 + ], + [ + 75800, + 1, + 0, + 0 + ], + [ + 76000, + 2, + 0, + 0 + ], + [ + 76200, + 1, + 0, + 0 + ], + [ + 76600, + 1, + 0, + 0 + ], + [ + 75200, + 5, + 800, + 0 + ], + [ + 76100, + 7, + 600, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 76800, + 3, + 650, + 2 + ], + [ + 77600, + 0, + 650, + 2 + ], + [ + 77600, + 7, + 700, + 0 + ], + [ + 76800, + 4, + 700, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 78400, + 3, + 0, + 0 + ], + [ + 78500, + 1, + 500, + 0 + ], + [ + 79200, + 3, + 0, + 0 + ], + [ + 79600, + 2, + 0, + 2 + ], + [ + 79200, + 4, + 700, + 0 + ], + [ + 78400, + 5, + 700, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 80000, + 3, + 650, + 2 + ], + [ + 80800, + 0, + 650, + 2 + ], + [ + 80000, + 5, + 700, + 0 + ], + [ + 80800, + 6, + 700, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 81600, + 3, + 650, + 2 + ], + [ + 82400, + 0, + 650, + 2 + ], + [ + 81600, + 7, + 700, + 0 + ], + [ + 82400, + 4, + 700, + 0 + ], + [ + 82400, + 6, + 700, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [ + [ + 83200, + 3, + 650, + 2 + ], + [ + 84000, + 0, + 650, + 2 + ], + [ + 83200, + 4, + 700, + 0 + ], + [ + 83200, + 5, + 700, + 0 + ], + [ + 84000, + 7, + 700, + 0 + ], + [ + 84000, + 6, + 700, + 0 + ] + ], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": false, + "changeBPM": false, + "bpm": 150 + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [ + [ + 84800, + 3, + 650, + 2 + ], + [ + 84800, + 6, + 700, + 0 + ], + [ + 84800, + 5, + 700, + 0 + ] + ], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "lengthInSteps": 16, + "typeOfSection": 0, + "sectionNotes": [], + "altAnim": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "sectionNotes": [], + "typeOfSection": 0, + "lengthInSteps": 16, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 150 + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + } + ], + "player2": "dad", + "player3": "gf", + "song": "Hot Dilf", + "sections": 0, + "needsVoices": true, + "validScore": true, + "bpm": 150, + "speed": 1.2 + } +} \ No newline at end of file diff --git a/assets/preload/data/introText.txt b/assets/preload/data/introText.txt index 66f7dc5ab..9104649f9 100644 --- a/assets/preload/data/introText.txt +++ b/assets/preload/data/introText.txt @@ -40,4 +40,23 @@ updates each friday--on time every time shoutouts to mason--for da homies bonk--get in the discord call kbhgames--steal mods -this is just a demo--okay \ No newline at end of file +this isn't a copy of ke--*vine boom* +we do a little trolling--h +sexiest engine--in da block +he's named evilsk8er--not evilsker +actual functional--input system +its nerf--or nothing +penis--balls even +fnf is not for kids--go outside +little herobrine--im cumming in your mom +what you know about--rolling down in the deep +oh god i'm white--and i'm on twitter +i gotta--bucket of chicken +dream stans--literally scare me +weeg mod--check it out +what da dog--doin +go mango go--go mango go +go pico yeah yeah--*twerks cutely* +forever engine--my beloved +wash your hands--stay safe bro +wear a mask--even if vaccinated \ No newline at end of file diff --git a/assets/preload/data/philly-nice/events.json b/assets/preload/data/philly-nice/events.json index d59aa64b4..5048008f7 100644 --- a/assets/preload/data/philly-nice/events.json +++ b/assets/preload/data/philly-nice/events.json @@ -1 +1 @@ -{"song":{"player1":"bf","notes":[{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[2742.85714285714,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[13714.2857142857,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[24685.7142857143,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[35657.1428571429,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[46628.5714285714,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[57600,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[68571.4285714286,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[79542.8571428571,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"lengthInSteps":16,"altAnim":false,"typeOfSection":0,"sectionNotes":[],"bpm":175,"changeBPM":false,"mustHitSection":true},{"lengthInSteps":16,"altAnim":false,"typeOfSection":0,"sectionNotes":[],"bpm":175,"changeBPM":false,"mustHitSection":true}],"player2":"pico","song":"Philly-Nice","validScore":true,"needsVoices":true,"speed":2,"bpm":175}} \ No newline at end of file +{"song":{"player1":"bf","notes":[{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[2742.85714285714,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[13714.2857142857,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[24685.7142857143,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[35657.1428571429,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[46628.5714285714,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[57600,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[68571.4285714286,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[79542.8571428571,-1,"Hey!","0",""]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"lengthInSteps":16,"altAnim":false,"typeOfSection":0,"sectionNotes":[],"bpm":175,"changeBPM":false,"mustHitSection":true},{"lengthInSteps":16,"altAnim":false,"typeOfSection":0,"sectionNotes":[],"bpm":175,"changeBPM":false,"mustHitSection":true}],"player2":"pico","song":"Philly Nice","validScore":true,"needsVoices":true,"speed":2,"bpm":175}} \ No newline at end of file diff --git a/assets/preload/data/philly-nice/philly-nice-easy.json b/assets/preload/data/philly-nice/philly-nice-easy.json index e89a70c04..e0f6a42f7 100644 --- a/assets/preload/data/philly-nice/philly-nice-easy.json +++ b/assets/preload/data/philly-nice/philly-nice-easy.json @@ -1 +1 @@ -{"song":{"song":"Philly-Nice","bpm":175.0,"needsVoices":true,"player1":"bf","player2":"pico","speed":1.0,"notes":[{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[2914.28564,2,0.0],[3428.57129,1,257.142853],[3771.42847,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[4285.71436,2,0.0],[4800.0,1,257.142853],[5142.857,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[5657.14258,2,0.0],[6171.42871,1,257.142853],[6514.28564,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[6857.14258,0,0.0],[7200.0,2,0.0],[7542.857,2,0.0],[7885.71436,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[8400.0,2,0.0],[8914.285,1,257.142853],[9257.143,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[9771.429,2,0.0],[10285.7139,1,257.142853],[10628.5713,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[11142.8574,2,0.0],[11657.1426,1,257.142853],[12000.0,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[12342.8574,0,0.0],[12685.7139,2,0.0],[13028.5713,2,0.0],[13371.4287,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[14057.1426,2,0.0],[14400.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[15428.5713,3,0.0],[15771.4287,2,0.0],[16285.7139,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[16800.0,3,0.0],[17142.8574,0,0.0],[17485.7148,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[17828.57,3,0.0],[18171.4277,1,0.0],[18514.2852,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[19542.8574,2,0.0],[19885.7148,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[20914.2852,3,0.0],[21257.1426,2,0.0],[21771.4277,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[22285.7148,3,0.0],[22628.57,0,0.0],[22971.4277,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[23314.2852,3,0.0],[23657.1426,1,0.0],[24000.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24685.7148,2,0.0],[25371.4277,0,0.0],[25714.2852,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[26400.0,3,0.0],[26742.8574,2,0.0],[27257.1426,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[27771.4277,3,0.0],[28114.2852,0,0.0],[28457.1426,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[28800.0,3,0.0],[29142.8574,1,0.0],[29485.7148,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[30171.4277,2,0.0],[30857.1426,0,0.0],[31200.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[31885.7148,3,0.0],[32228.57,2,0.0],[32742.8574,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[33257.14,3,0.0],[33600.0,0,0.0],[33942.8555,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[34285.7148,3,0.0],[34628.57,1,0.0],[34971.43,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[35657.14,2,0.0],[36342.8555,2,0.0],[36685.7148,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[37028.57,2,0.0],[37714.2852,2,0.0],[38057.14,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[38400.0,2,0.0],[39085.7148,2,0.0],[39428.57,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[39771.43,2,0.0],[40457.14,2,0.0],[40800.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[41142.8555,2,0.0],[41828.57,2,0.0],[42171.43,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[42514.2852,2,0.0],[43200.0,2,0.0],[43542.8555,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[43885.7148,2,0.0],[44571.43,2,0.0],[44914.2852,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[45257.14,2,0.0],[45942.8555,2,0.0],[46285.7148,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[46628.57,2,0.0],[47314.2852,2,0.0],[47657.14,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[48000.0,2,0.0],[48685.7148,2,0.0],[49028.57,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[49371.43,2,0.0],[50057.14,2,0.0],[50400.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[50742.8555,3,0.0],[51428.57,2,0.0],[51771.43,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[52114.2852,2,0.0],[52800.0,2,0.0],[53142.8555,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[53485.7148,2,0.0],[54171.43,2,0.0],[54514.2852,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[54857.14,2,0.0],[55542.8555,2,0.0],[55885.7148,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[56228.57,3,0.0],[56914.2852,2,0.0],[57257.14,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[57600.0,3,0.0],[58285.7148,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[58971.43,2,0.0],[59314.2852,3,0.0],[59657.14,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[60342.8555,3,0.0],[61028.57,2,0.0],[61542.8555,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[61714.2852,2,0.0],[62057.14,0,0.0],[62400.0,2,0.0],[62742.8555,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[63085.7148,3,0.0],[63771.43,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[64457.14,2,0.0],[64800.0,3,0.0],[65142.8555,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[65828.57,3,0.0],[66514.28,2,0.0],[67028.57,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[67200.0,2,0.0],[67542.86,0,0.0],[67885.71,2,0.0],[68228.57,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[68571.43,2,0.0],[69257.14,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[69942.86,0,0.0],[70628.57,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[71314.28,3,0.0],[72000.0,2,0.0],[72342.86,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[72685.71,3,0.0],[73371.43,2,0.0],[73714.28,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[74057.14,2,0.0],[74742.86,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[75428.57,0,0.0],[76114.28,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[76800.0,3,0.0],[77485.71,2,0.0],[77828.57,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[78171.43,3,0.0],[78857.14,2,0.0],[79200.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[79542.86,2,0.0],[80228.57,2,0.0],[80571.43,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[80914.28,2,0.0],[81600.0,2,0.0],[81942.86,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[82285.71,2,0.0],[82971.43,2,0.0],[83314.28,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[83657.14,3,0.0],[84342.86,2,0.0],[84685.71,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[85028.57,2,0.0],[85714.28,2,0.0],[86057.14,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[86400.0,2,0.0],[87085.71,2,0.0],[87428.57,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[87771.43,2,0.0],[88457.14,2,0.0],[88800.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[89142.86,3,0.0],[89828.57,2,0.0],[90171.43,0,0.0],[90342.86,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[90514.28,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]}]},"generatedBy":"SNIFF ver.6"} \ No newline at end of file +{"song":{"song":"Philly Nice","bpm":175.0,"needsVoices":true,"player1":"bf","player2":"pico","speed":1.0,"notes":[{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[2914.28564,2,0.0],[3428.57129,1,257.142853],[3771.42847,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[4285.71436,2,0.0],[4800.0,1,257.142853],[5142.857,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[5657.14258,2,0.0],[6171.42871,1,257.142853],[6514.28564,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[6857.14258,0,0.0],[7200.0,2,0.0],[7542.857,2,0.0],[7885.71436,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[8400.0,2,0.0],[8914.285,1,257.142853],[9257.143,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[9771.429,2,0.0],[10285.7139,1,257.142853],[10628.5713,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[11142.8574,2,0.0],[11657.1426,1,257.142853],[12000.0,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[12342.8574,0,0.0],[12685.7139,2,0.0],[13028.5713,2,0.0],[13371.4287,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[14057.1426,2,0.0],[14400.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[15428.5713,3,0.0],[15771.4287,2,0.0],[16285.7139,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[16800.0,3,0.0],[17142.8574,0,0.0],[17485.7148,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[17828.57,3,0.0],[18171.4277,1,0.0],[18514.2852,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[19542.8574,2,0.0],[19885.7148,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[20914.2852,3,0.0],[21257.1426,2,0.0],[21771.4277,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[22285.7148,3,0.0],[22628.57,0,0.0],[22971.4277,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[23314.2852,3,0.0],[23657.1426,1,0.0],[24000.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24685.7148,2,0.0],[25371.4277,0,0.0],[25714.2852,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[26400.0,3,0.0],[26742.8574,2,0.0],[27257.1426,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[27771.4277,3,0.0],[28114.2852,0,0.0],[28457.1426,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[28800.0,3,0.0],[29142.8574,1,0.0],[29485.7148,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[30171.4277,2,0.0],[30857.1426,0,0.0],[31200.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[31885.7148,3,0.0],[32228.57,2,0.0],[32742.8574,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[33257.14,3,0.0],[33600.0,0,0.0],[33942.8555,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[34285.7148,3,0.0],[34628.57,1,0.0],[34971.43,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[35657.14,2,0.0],[36342.8555,2,0.0],[36685.7148,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[37028.57,2,0.0],[37714.2852,2,0.0],[38057.14,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[38400.0,2,0.0],[39085.7148,2,0.0],[39428.57,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[39771.43,2,0.0],[40457.14,2,0.0],[40800.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[41142.8555,2,0.0],[41828.57,2,0.0],[42171.43,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[42514.2852,2,0.0],[43200.0,2,0.0],[43542.8555,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[43885.7148,2,0.0],[44571.43,2,0.0],[44914.2852,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[45257.14,2,0.0],[45942.8555,2,0.0],[46285.7148,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[46628.57,2,0.0],[47314.2852,2,0.0],[47657.14,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[48000.0,2,0.0],[48685.7148,2,0.0],[49028.57,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[49371.43,2,0.0],[50057.14,2,0.0],[50400.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[50742.8555,3,0.0],[51428.57,2,0.0],[51771.43,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[52114.2852,2,0.0],[52800.0,2,0.0],[53142.8555,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[53485.7148,2,0.0],[54171.43,2,0.0],[54514.2852,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[54857.14,2,0.0],[55542.8555,2,0.0],[55885.7148,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[56228.57,3,0.0],[56914.2852,2,0.0],[57257.14,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[57600.0,3,0.0],[58285.7148,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[58971.43,2,0.0],[59314.2852,3,0.0],[59657.14,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[60342.8555,3,0.0],[61028.57,2,0.0],[61542.8555,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[61714.2852,2,0.0],[62057.14,0,0.0],[62400.0,2,0.0],[62742.8555,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[63085.7148,3,0.0],[63771.43,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[64457.14,2,0.0],[64800.0,3,0.0],[65142.8555,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[65828.57,3,0.0],[66514.28,2,0.0],[67028.57,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[67200.0,2,0.0],[67542.86,0,0.0],[67885.71,2,0.0],[68228.57,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[68571.43,2,0.0],[69257.14,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[69942.86,0,0.0],[70628.57,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[71314.28,3,0.0],[72000.0,2,0.0],[72342.86,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[72685.71,3,0.0],[73371.43,2,0.0],[73714.28,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[74057.14,2,0.0],[74742.86,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[75428.57,0,0.0],[76114.28,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[76800.0,3,0.0],[77485.71,2,0.0],[77828.57,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[78171.43,3,0.0],[78857.14,2,0.0],[79200.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[79542.86,2,0.0],[80228.57,2,0.0],[80571.43,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[80914.28,2,0.0],[81600.0,2,0.0],[81942.86,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[82285.71,2,0.0],[82971.43,2,0.0],[83314.28,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[83657.14,3,0.0],[84342.86,2,0.0],[84685.71,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[85028.57,2,0.0],[85714.28,2,0.0],[86057.14,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[86400.0,2,0.0],[87085.71,2,0.0],[87428.57,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[87771.43,2,0.0],[88457.14,2,0.0],[88800.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[89142.86,3,0.0],[89828.57,2,0.0],[90171.43,0,0.0],[90342.86,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[90514.28,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]}]},"generatedBy":"SNIFF ver.6"} \ No newline at end of file diff --git a/assets/preload/data/philly-nice/philly-nice-hard.json b/assets/preload/data/philly-nice/philly-nice-hard.json index afe150ea9..895ebc0ba 100644 --- a/assets/preload/data/philly-nice/philly-nice-hard.json +++ b/assets/preload/data/philly-nice/philly-nice-hard.json @@ -1 +1 @@ -{"song":{"song":"Philly-Nice","bpm":175.0,"needsVoices":true,"player1":"bf","player2":"pico","speed":2.0,"notes":[{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[2914.28564,2,0.0],[3085.71436,0,0.0],[3428.57129,1,257.142853],[3771.42847,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[4285.71436,2,0.0],[4457.14258,0,0.0],[4800.0,1,257.142853],[5142.857,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[5657.14258,2,0.0],[5828.57129,0,0.0],[6171.42871,1,257.142853],[6514.28564,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[6857.14258,0,0.0],[7028.57129,3,0.0],[7200.0,2,0.0],[7542.857,2,0.0],[7885.71436,0,0.0],[8057.14258,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[8400.0,2,0.0],[8571.429,0,0.0],[8914.285,1,257.142853],[9257.143,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[9771.429,2,0.0],[9942.857,0,0.0],[10285.7139,1,257.142853],[10628.5713,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[11142.8574,2,0.0],[11314.2852,0,0.0],[11657.1426,1,257.142853],[12000.0,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[12342.8574,0,0.0],[12514.2852,3,0.0],[12685.7139,2,0.0],[13028.5713,2,0.0],[13371.4287,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[13885.7139,2,0.0],[14057.1426,0,0.0],[14400.0,0,0.0],[14742.8574,3,0.0],[14914.2852,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[15257.1426,3,0.0],[15428.5713,0,0.0],[15771.4287,2,0.0],[16114.2852,0,0.0],[16285.7139,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[16628.57,0,0.0],[16800.0,1,0.0],[16971.4277,3,0.0],[17142.8574,1,0.0],[17314.2852,0,0.0],[17485.7148,1,0.0],[17657.1426,3,0.0],[17742.8574,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[17828.57,3,0.0],[18000.0,3,0.0],[18171.4277,1,0.0],[18514.2852,2,0.0],[18857.1426,2,0.0],[19028.57,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[19371.4277,2,0.0],[19542.8574,0,0.0],[19885.7148,0,0.0],[20228.57,3,0.0],[20400.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[20742.8574,3,0.0],[20914.2852,0,0.0],[21257.1426,2,0.0],[21600.0,0,0.0],[21771.4277,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[22114.2852,0,0.0],[22285.7148,1,0.0],[22457.1426,3,0.0],[22628.57,1,0.0],[22800.0,0,0.0],[22971.4277,1,0.0],[23142.8574,3,0.0],[23228.57,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[23314.2852,3,0.0],[23485.7148,3,0.0],[23657.1426,1,0.0],[24000.0,2,0.0],[24342.8574,2,0.0],[24514.2852,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24685.7148,2,0.0],[24857.1426,2,0.0],[25028.57,0,0.0],[25371.4277,0,0.0],[25714.2852,3,0.0],[25885.7148,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[26228.57,3,0.0],[26400.0,0,0.0],[26742.8574,2,0.0],[27085.7148,0,0.0],[27257.1426,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[27600.0,0,0.0],[27771.4277,1,0.0],[27942.8574,3,0.0],[28114.2852,1,0.0],[28285.7148,0,0.0],[28457.1426,1,0.0],[28628.57,3,0.0],[28714.2852,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[28800.0,3,0.0],[28971.4277,3,0.0],[29142.8574,1,0.0],[29485.7148,2,0.0],[29828.57,2,0.0],[30000.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[30171.4277,2,0.0],[30342.8574,2,0.0],[30514.2852,0,0.0],[30857.1426,0,0.0],[31200.0,3,0.0],[31371.4277,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[31714.2852,3,0.0],[31885.7148,0,0.0],[32228.57,2,0.0],[32571.4277,0,0.0],[32742.8574,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[33085.7148,0,0.0],[33257.14,1,0.0],[33428.57,3,0.0],[33600.0,1,0.0],[33771.43,0,0.0],[33942.8555,1,0.0],[34114.2852,3,0.0],[34200.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[34285.7148,3,0.0],[34457.14,3,0.0],[34628.57,1,0.0],[34971.43,2,0.0],[35314.2852,2,0.0],[35485.7148,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[35657.14,2,0.0],[35828.57,3,0.0],[36000.0,1,0.0],[36171.43,0,0.0],[36342.8555,2,0.0],[36514.2852,3,0.0],[36685.7148,0,0.0],[36857.14,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[37028.57,2,0.0],[37200.0,3,0.0],[37371.43,2,0.0],[37542.8555,0,0.0],[37714.2852,2,0.0],[37885.7148,3,0.0],[38057.14,0,0.0],[38228.57,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[38400.0,2,0.0],[38571.43,3,0.0],[38742.8555,1,0.0],[38914.2852,0,0.0],[39085.7148,2,0.0],[39257.14,3,0.0],[39428.57,0,0.0],[39600.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[39771.43,2,0.0],[39942.8555,3,0.0],[40114.2852,2,0.0],[40285.7148,0,0.0],[40457.14,2,0.0],[40628.57,3,0.0],[40800.0,0,0.0],[40971.43,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[41142.8555,2,0.0],[41314.2852,3,0.0],[41485.7148,1,0.0],[41657.14,0,0.0],[41828.57,2,0.0],[42000.0,3,0.0],[42171.43,0,0.0],[42342.8555,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[42514.2852,2,0.0],[42685.7148,3,0.0],[42857.14,2,0.0],[43028.57,0,0.0],[43200.0,2,0.0],[43371.43,3,0.0],[43542.8555,0,0.0],[43714.2852,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[43885.7148,2,0.0],[44057.14,3,0.0],[44228.57,1,0.0],[44400.0,0,0.0],[44571.43,2,0.0],[44742.8555,3,0.0],[44914.2852,0,0.0],[45085.7148,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[45257.14,2,0.0],[45428.57,3,0.0],[45600.0,2,0.0],[45771.43,0,0.0],[45942.8555,2,0.0],[46114.2852,3,0.0],[46285.7148,0,0.0],[46457.14,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[46628.57,2,0.0],[46800.0,3,0.0],[46971.43,1,0.0],[47142.8555,0,0.0],[47314.2852,2,0.0],[47485.7148,3,0.0],[47657.14,0,0.0],[47828.57,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[48000.0,2,0.0],[48171.43,3,0.0],[48342.8555,2,0.0],[48514.2852,0,0.0],[48685.7148,2,0.0],[48857.14,3,0.0],[49028.57,0,0.0],[49200.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[49371.43,2,0.0],[49542.8555,3,0.0],[49714.2852,1,0.0],[49885.7148,0,0.0],[50057.14,2,0.0],[50228.57,3,0.0],[50400.0,0,0.0],[50571.43,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[50742.8555,2,0.0],[50914.2852,3,0.0],[51085.7148,2,0.0],[51257.14,0,0.0],[51428.57,2,0.0],[51600.0,3,0.0],[51771.43,0,0.0],[51942.8555,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[52114.2852,2,0.0],[52285.7148,3,0.0],[52457.14,1,0.0],[52628.57,0,0.0],[52800.0,2,0.0],[52971.43,3,0.0],[53142.8555,0,0.0],[53314.2852,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[53485.7148,2,0.0],[53657.14,3,0.0],[53828.57,2,0.0],[54000.0,0,0.0],[54171.43,2,0.0],[54342.8555,3,0.0],[54514.2852,0,0.0],[54685.7148,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[54857.14,2,0.0],[55028.57,3,0.0],[55200.0,1,0.0],[55371.43,0,0.0],[55542.8555,2,0.0],[55714.2852,3,0.0],[55885.7148,0,0.0],[56057.14,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[56228.57,2,0.0],[56400.0,3,0.0],[56571.43,2,0.0],[56742.8555,0,0.0],[56914.2852,2,0.0],[57085.7148,3,0.0],[57257.14,0,0.0],[57428.57,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[57600.0,3,0.0],[57771.43,3,0.0],[57942.8555,1,0.0],[58114.2852,1,0.0],[58285.7148,2,0.0],[58457.14,2,0.0],[58800.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[58971.43,2,0.0],[59142.8555,3,0.0],[59228.57,0,0.0],[59314.2852,3,0.0],[59485.7148,3,0.0],[59657.14,2,0.0],[59828.57,0,0.0],[60000.0,0,0.0],[60171.43,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[60342.8555,3,0.0],[60514.2852,3,0.0],[60600.0,0,0.0],[60685.7148,3,0.0],[60857.14,1,0.0],[61028.57,2,0.0],[61200.0,2,0.0],[61371.43,0,0.0],[61542.8555,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[61714.2852,2,0.0],[61885.7148,3,0.0],[62057.14,0,0.0],[62228.57,3,0.0],[62400.0,2,0.0],[62742.8555,1,0.0],[62914.2852,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[63085.7148,3,0.0],[63257.14,3,0.0],[63428.57,1,0.0],[63600.0,1,0.0],[63771.43,2,0.0],[63942.8555,2,0.0],[64285.7148,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[64457.14,2,0.0],[64628.57,3,0.0],[64714.2852,0,0.0],[64800.0,3,0.0],[64971.43,3,0.0],[65142.8555,2,0.0],[65314.2852,0,0.0],[65485.7148,0,0.0],[65657.14,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[65828.57,3,0.0],[66000.0,3,0.0],[66085.71,0,0.0],[66171.43,3,0.0],[66342.86,1,0.0],[66514.28,2,0.0],[66685.71,2,0.0],[66857.14,0,0.0],[67028.57,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[67200.0,2,0.0],[67371.43,3,0.0],[67542.86,0,0.0],[67714.28,3,0.0],[67885.71,2,0.0],[68228.57,1,0.0],[68400.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[68571.43,2,0.0],[68914.28,1,0.0],[69085.71,3,0.0],[69257.14,2,0.0],[69600.0,1,0.0],[69771.43,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[69942.86,0,0.0],[70114.28,3,0.0],[70285.71,1,0.0],[70457.14,3,0.0],[70628.57,2,0.0],[70971.43,2,0.0],[71142.86,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[71314.28,3,0.0],[71485.71,1,0.0],[71657.14,0,0.0],[71828.57,3,0.0],[72000.0,2,0.0],[72342.86,0,0.0],[72514.28,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[72685.71,3,0.0],[72857.14,3,0.0],[73028.57,2,0.0],[73200.0,0,0.0],[73371.43,2,0.0],[73542.86,3,0.0],[73714.28,0,0.0],[73885.71,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[74057.14,2,0.0],[74400.0,1,0.0],[74571.43,3,0.0],[74742.86,2,0.0],[75085.71,1,0.0],[75257.14,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[75428.57,0,0.0],[75600.0,3,0.0],[75771.43,1,0.0],[75942.86,3,0.0],[76114.28,2,0.0],[76457.14,2,0.0],[76628.57,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[76800.0,3,0.0],[76971.43,1,0.0],[77142.86,0,0.0],[77314.28,3,0.0],[77485.71,2,0.0],[77828.57,0,0.0],[78000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[78171.43,3,0.0],[78342.86,3,0.0],[78514.28,2,0.0],[78685.71,0,0.0],[78857.14,2,0.0],[79028.57,3,0.0],[79200.0,0,0.0],[79371.43,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[79542.86,2,0.0],[79714.28,3,0.0],[79885.71,1,0.0],[80057.14,0,0.0],[80228.57,2,0.0],[80400.0,3,0.0],[80571.43,0,0.0],[80742.86,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[80914.28,2,0.0],[81085.71,3,0.0],[81257.14,2,0.0],[81428.57,0,0.0],[81600.0,2,0.0],[81771.43,3,0.0],[81942.86,0,0.0],[82114.28,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[82285.71,2,0.0],[82457.14,3,0.0],[82628.57,1,0.0],[82800.0,0,0.0],[82971.43,2,0.0],[83142.86,3,0.0],[83314.28,0,0.0],[83485.71,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[83657.14,2,0.0],[83828.57,3,0.0],[84000.0,2,0.0],[84171.43,0,0.0],[84342.86,2,0.0],[84514.28,3,0.0],[84685.71,0,0.0],[84857.14,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[85028.57,2,0.0],[85200.0,3,0.0],[85371.43,1,0.0],[85542.86,0,0.0],[85714.28,2,0.0],[85885.71,3,0.0],[86057.14,0,0.0],[86228.57,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[86400.0,2,0.0],[86571.43,3,0.0],[86742.86,2,0.0],[86914.28,0,0.0],[87085.71,2,0.0],[87257.14,3,0.0],[87428.57,0,0.0],[87600.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[87771.43,2,0.0],[87942.86,3,0.0],[88114.28,1,0.0],[88285.71,0,0.0],[88457.14,2,0.0],[88628.57,3,0.0],[88800.0,0,0.0],[88971.43,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[89142.86,2,0.0],[89314.28,3,0.0],[89485.71,2,0.0],[89657.14,0,0.0],[89828.57,2,0.0],[90000.0,3,0.0],[90171.43,0,0.0],[90342.86,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[90514.28,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]}]},"generatedBy":"SNIFF ver.6"} \ No newline at end of file +{"song":{"song":"Philly Nice","bpm":175.0,"needsVoices":true,"player1":"bf","player2":"pico","speed":2.0,"notes":[{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[2914.28564,2,0.0],[3085.71436,0,0.0],[3428.57129,1,257.142853],[3771.42847,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[4285.71436,2,0.0],[4457.14258,0,0.0],[4800.0,1,257.142853],[5142.857,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[5657.14258,2,0.0],[5828.57129,0,0.0],[6171.42871,1,257.142853],[6514.28564,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[6857.14258,0,0.0],[7028.57129,3,0.0],[7200.0,2,0.0],[7542.857,2,0.0],[7885.71436,0,0.0],[8057.14258,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[8400.0,2,0.0],[8571.429,0,0.0],[8914.285,1,257.142853],[9257.143,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[9771.429,2,0.0],[9942.857,0,0.0],[10285.7139,1,257.142853],[10628.5713,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[11142.8574,2,0.0],[11314.2852,0,0.0],[11657.1426,1,257.142853],[12000.0,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[12342.8574,0,0.0],[12514.2852,3,0.0],[12685.7139,2,0.0],[13028.5713,2,0.0],[13371.4287,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[13885.7139,2,0.0],[14057.1426,0,0.0],[14400.0,0,0.0],[14742.8574,3,0.0],[14914.2852,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[15257.1426,3,0.0],[15428.5713,0,0.0],[15771.4287,2,0.0],[16114.2852,0,0.0],[16285.7139,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[16628.57,0,0.0],[16800.0,1,0.0],[16971.4277,3,0.0],[17142.8574,1,0.0],[17314.2852,0,0.0],[17485.7148,1,0.0],[17657.1426,3,0.0],[17742.8574,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[17828.57,3,0.0],[18000.0,3,0.0],[18171.4277,1,0.0],[18514.2852,2,0.0],[18857.1426,2,0.0],[19028.57,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[19371.4277,2,0.0],[19542.8574,0,0.0],[19885.7148,0,0.0],[20228.57,3,0.0],[20400.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[20742.8574,3,0.0],[20914.2852,0,0.0],[21257.1426,2,0.0],[21600.0,0,0.0],[21771.4277,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[22114.2852,0,0.0],[22285.7148,1,0.0],[22457.1426,3,0.0],[22628.57,1,0.0],[22800.0,0,0.0],[22971.4277,1,0.0],[23142.8574,3,0.0],[23228.57,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[23314.2852,3,0.0],[23485.7148,3,0.0],[23657.1426,1,0.0],[24000.0,2,0.0],[24342.8574,2,0.0],[24514.2852,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24685.7148,2,0.0],[24857.1426,2,0.0],[25028.57,0,0.0],[25371.4277,0,0.0],[25714.2852,3,0.0],[25885.7148,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[26228.57,3,0.0],[26400.0,0,0.0],[26742.8574,2,0.0],[27085.7148,0,0.0],[27257.1426,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[27600.0,0,0.0],[27771.4277,1,0.0],[27942.8574,3,0.0],[28114.2852,1,0.0],[28285.7148,0,0.0],[28457.1426,1,0.0],[28628.57,3,0.0],[28714.2852,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[28800.0,3,0.0],[28971.4277,3,0.0],[29142.8574,1,0.0],[29485.7148,2,0.0],[29828.57,2,0.0],[30000.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[30171.4277,2,0.0],[30342.8574,2,0.0],[30514.2852,0,0.0],[30857.1426,0,0.0],[31200.0,3,0.0],[31371.4277,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[31714.2852,3,0.0],[31885.7148,0,0.0],[32228.57,2,0.0],[32571.4277,0,0.0],[32742.8574,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[33085.7148,0,0.0],[33257.14,1,0.0],[33428.57,3,0.0],[33600.0,1,0.0],[33771.43,0,0.0],[33942.8555,1,0.0],[34114.2852,3,0.0],[34200.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[34285.7148,3,0.0],[34457.14,3,0.0],[34628.57,1,0.0],[34971.43,2,0.0],[35314.2852,2,0.0],[35485.7148,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[35657.14,2,0.0],[35828.57,3,0.0],[36000.0,1,0.0],[36171.43,0,0.0],[36342.8555,2,0.0],[36514.2852,3,0.0],[36685.7148,0,0.0],[36857.14,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[37028.57,2,0.0],[37200.0,3,0.0],[37371.43,2,0.0],[37542.8555,0,0.0],[37714.2852,2,0.0],[37885.7148,3,0.0],[38057.14,0,0.0],[38228.57,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[38400.0,2,0.0],[38571.43,3,0.0],[38742.8555,1,0.0],[38914.2852,0,0.0],[39085.7148,2,0.0],[39257.14,3,0.0],[39428.57,0,0.0],[39600.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[39771.43,2,0.0],[39942.8555,3,0.0],[40114.2852,2,0.0],[40285.7148,0,0.0],[40457.14,2,0.0],[40628.57,3,0.0],[40800.0,0,0.0],[40971.43,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[41142.8555,2,0.0],[41314.2852,3,0.0],[41485.7148,1,0.0],[41657.14,0,0.0],[41828.57,2,0.0],[42000.0,3,0.0],[42171.43,0,0.0],[42342.8555,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[42514.2852,2,0.0],[42685.7148,3,0.0],[42857.14,2,0.0],[43028.57,0,0.0],[43200.0,2,0.0],[43371.43,3,0.0],[43542.8555,0,0.0],[43714.2852,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[43885.7148,2,0.0],[44057.14,3,0.0],[44228.57,1,0.0],[44400.0,0,0.0],[44571.43,2,0.0],[44742.8555,3,0.0],[44914.2852,0,0.0],[45085.7148,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[45257.14,2,0.0],[45428.57,3,0.0],[45600.0,2,0.0],[45771.43,0,0.0],[45942.8555,2,0.0],[46114.2852,3,0.0],[46285.7148,0,0.0],[46457.14,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[46628.57,2,0.0],[46800.0,3,0.0],[46971.43,1,0.0],[47142.8555,0,0.0],[47314.2852,2,0.0],[47485.7148,3,0.0],[47657.14,0,0.0],[47828.57,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[48000.0,2,0.0],[48171.43,3,0.0],[48342.8555,2,0.0],[48514.2852,0,0.0],[48685.7148,2,0.0],[48857.14,3,0.0],[49028.57,0,0.0],[49200.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[49371.43,2,0.0],[49542.8555,3,0.0],[49714.2852,1,0.0],[49885.7148,0,0.0],[50057.14,2,0.0],[50228.57,3,0.0],[50400.0,0,0.0],[50571.43,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[50742.8555,2,0.0],[50914.2852,3,0.0],[51085.7148,2,0.0],[51257.14,0,0.0],[51428.57,2,0.0],[51600.0,3,0.0],[51771.43,0,0.0],[51942.8555,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[52114.2852,2,0.0],[52285.7148,3,0.0],[52457.14,1,0.0],[52628.57,0,0.0],[52800.0,2,0.0],[52971.43,3,0.0],[53142.8555,0,0.0],[53314.2852,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[53485.7148,2,0.0],[53657.14,3,0.0],[53828.57,2,0.0],[54000.0,0,0.0],[54171.43,2,0.0],[54342.8555,3,0.0],[54514.2852,0,0.0],[54685.7148,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[54857.14,2,0.0],[55028.57,3,0.0],[55200.0,1,0.0],[55371.43,0,0.0],[55542.8555,2,0.0],[55714.2852,3,0.0],[55885.7148,0,0.0],[56057.14,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[56228.57,2,0.0],[56400.0,3,0.0],[56571.43,2,0.0],[56742.8555,0,0.0],[56914.2852,2,0.0],[57085.7148,3,0.0],[57257.14,0,0.0],[57428.57,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[57600.0,3,0.0],[57771.43,3,0.0],[57942.8555,1,0.0],[58114.2852,1,0.0],[58285.7148,2,0.0],[58457.14,2,0.0],[58800.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[58971.43,2,0.0],[59142.8555,3,0.0],[59228.57,0,0.0],[59314.2852,3,0.0],[59485.7148,3,0.0],[59657.14,2,0.0],[59828.57,0,0.0],[60000.0,0,0.0],[60171.43,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[60342.8555,3,0.0],[60514.2852,3,0.0],[60600.0,0,0.0],[60685.7148,3,0.0],[60857.14,1,0.0],[61028.57,2,0.0],[61200.0,2,0.0],[61371.43,0,0.0],[61542.8555,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[61714.2852,2,0.0],[61885.7148,3,0.0],[62057.14,0,0.0],[62228.57,3,0.0],[62400.0,2,0.0],[62742.8555,1,0.0],[62914.2852,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[63085.7148,3,0.0],[63257.14,3,0.0],[63428.57,1,0.0],[63600.0,1,0.0],[63771.43,2,0.0],[63942.8555,2,0.0],[64285.7148,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[64457.14,2,0.0],[64628.57,3,0.0],[64714.2852,0,0.0],[64800.0,3,0.0],[64971.43,3,0.0],[65142.8555,2,0.0],[65314.2852,0,0.0],[65485.7148,0,0.0],[65657.14,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[65828.57,3,0.0],[66000.0,3,0.0],[66085.71,0,0.0],[66171.43,3,0.0],[66342.86,1,0.0],[66514.28,2,0.0],[66685.71,2,0.0],[66857.14,0,0.0],[67028.57,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[67200.0,2,0.0],[67371.43,3,0.0],[67542.86,0,0.0],[67714.28,3,0.0],[67885.71,2,0.0],[68228.57,1,0.0],[68400.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[68571.43,2,0.0],[68914.28,1,0.0],[69085.71,3,0.0],[69257.14,2,0.0],[69600.0,1,0.0],[69771.43,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[69942.86,0,0.0],[70114.28,3,0.0],[70285.71,1,0.0],[70457.14,3,0.0],[70628.57,2,0.0],[70971.43,2,0.0],[71142.86,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[71314.28,3,0.0],[71485.71,1,0.0],[71657.14,0,0.0],[71828.57,3,0.0],[72000.0,2,0.0],[72342.86,0,0.0],[72514.28,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[72685.71,3,0.0],[72857.14,3,0.0],[73028.57,2,0.0],[73200.0,0,0.0],[73371.43,2,0.0],[73542.86,3,0.0],[73714.28,0,0.0],[73885.71,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[74057.14,2,0.0],[74400.0,1,0.0],[74571.43,3,0.0],[74742.86,2,0.0],[75085.71,1,0.0],[75257.14,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[75428.57,0,0.0],[75600.0,3,0.0],[75771.43,1,0.0],[75942.86,3,0.0],[76114.28,2,0.0],[76457.14,2,0.0],[76628.57,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[76800.0,3,0.0],[76971.43,1,0.0],[77142.86,0,0.0],[77314.28,3,0.0],[77485.71,2,0.0],[77828.57,0,0.0],[78000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[78171.43,3,0.0],[78342.86,3,0.0],[78514.28,2,0.0],[78685.71,0,0.0],[78857.14,2,0.0],[79028.57,3,0.0],[79200.0,0,0.0],[79371.43,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[79542.86,2,0.0],[79714.28,3,0.0],[79885.71,1,0.0],[80057.14,0,0.0],[80228.57,2,0.0],[80400.0,3,0.0],[80571.43,0,0.0],[80742.86,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[80914.28,2,0.0],[81085.71,3,0.0],[81257.14,2,0.0],[81428.57,0,0.0],[81600.0,2,0.0],[81771.43,3,0.0],[81942.86,0,0.0],[82114.28,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[82285.71,2,0.0],[82457.14,3,0.0],[82628.57,1,0.0],[82800.0,0,0.0],[82971.43,2,0.0],[83142.86,3,0.0],[83314.28,0,0.0],[83485.71,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[83657.14,2,0.0],[83828.57,3,0.0],[84000.0,2,0.0],[84171.43,0,0.0],[84342.86,2,0.0],[84514.28,3,0.0],[84685.71,0,0.0],[84857.14,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[85028.57,2,0.0],[85200.0,3,0.0],[85371.43,1,0.0],[85542.86,0,0.0],[85714.28,2,0.0],[85885.71,3,0.0],[86057.14,0,0.0],[86228.57,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[86400.0,2,0.0],[86571.43,3,0.0],[86742.86,2,0.0],[86914.28,0,0.0],[87085.71,2,0.0],[87257.14,3,0.0],[87428.57,0,0.0],[87600.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[87771.43,2,0.0],[87942.86,3,0.0],[88114.28,1,0.0],[88285.71,0,0.0],[88457.14,2,0.0],[88628.57,3,0.0],[88800.0,0,0.0],[88971.43,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[89142.86,2,0.0],[89314.28,3,0.0],[89485.71,2,0.0],[89657.14,0,0.0],[89828.57,2,0.0],[90000.0,3,0.0],[90171.43,0,0.0],[90342.86,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[90514.28,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]}]},"generatedBy":"SNIFF ver.6"} \ No newline at end of file diff --git a/assets/preload/data/philly-nice/philly-nice.json b/assets/preload/data/philly-nice/philly-nice.json index 20876f5f1..0e1f9dfe3 100644 --- a/assets/preload/data/philly-nice/philly-nice.json +++ b/assets/preload/data/philly-nice/philly-nice.json @@ -1 +1 @@ -{"song":{"song":"Philly-Nice","bpm":175.0,"needsVoices":true,"player1":"bf","player2":"pico","speed":1.3,"notes":[{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[2914.28564,2,0.0],[3428.57129,1,257.142853],[3771.42847,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[4285.71436,2,0.0],[4800.0,1,257.142853],[5142.857,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[5657.14258,2,0.0],[6171.42871,1,257.142853],[6514.28564,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[6857.14258,0,0.0],[7542.857,2,0.0],[7885.71436,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[8400.0,2,0.0],[8914.285,1,257.142853],[9257.143,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[9771.429,2,0.0],[10285.7139,1,257.142853],[10628.5713,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[11142.8574,2,0.0],[11657.1426,1,257.142853],[12000.0,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[12342.8574,0,0.0],[12685.7139,2,0.0],[13028.5713,2,0.0],[13371.4287,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[14057.1426,2,0.0],[14400.0,0,0.0],[14742.8574,3,0.0],[14914.2852,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[15428.5713,3,0.0],[15771.4287,2,0.0],[16114.2852,0,0.0],[16285.7139,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[16628.57,0,0.0],[16800.0,3,0.0],[17142.8574,0,0.0],[17485.7148,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[17828.57,3,0.0],[18171.4277,1,0.0],[18514.2852,2,0.0],[18857.1426,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[19542.8574,2,0.0],[19885.7148,0,0.0],[20228.57,3,0.0],[20400.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[20914.2852,3,0.0],[21257.1426,2,0.0],[21600.0,0,0.0],[21771.4277,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[22114.2852,0,0.0],[22285.7148,3,0.0],[22628.57,0,0.0],[22971.4277,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[23314.2852,3,0.0],[23657.1426,1,0.0],[24000.0,2,0.0],[24342.8574,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24685.7148,2,0.0],[24857.1426,2,0.0],[25028.57,2,0.0],[25371.4277,0,0.0],[25714.2852,3,0.0],[25885.7148,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[26400.0,3,0.0],[26742.8574,2,0.0],[27085.7148,0,0.0],[27257.1426,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[27600.0,0,0.0],[27771.4277,3,0.0],[27942.8574,3,0.0],[28114.2852,0,0.0],[28285.7148,0,0.0],[28457.1426,3,0.0],[28628.57,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[28800.0,3,0.0],[29142.8574,1,0.0],[29485.7148,2,0.0],[29828.57,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[30171.4277,2,0.0],[30342.8574,2,0.0],[30514.2852,2,0.0],[30857.1426,0,0.0],[31200.0,3,0.0],[31371.4277,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[31885.7148,3,0.0],[32228.57,2,0.0],[32571.4277,0,0.0],[32742.8574,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[33085.7148,0,0.0],[33257.14,3,0.0],[33428.57,3,0.0],[33600.0,0,0.0],[33771.43,0,0.0],[33942.8555,3,0.0],[34114.2852,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[34285.7148,3,0.0],[34628.57,1,0.0],[34971.43,2,0.0],[35314.2852,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[35657.14,2,0.0],[36342.8555,2,0.0],[36514.2852,3,0.0],[36685.7148,0,0.0],[36857.14,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[37028.57,2,0.0],[37714.2852,2,0.0],[37885.7148,3,0.0],[38057.14,0,0.0],[38228.57,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[38400.0,2,0.0],[39085.7148,2,0.0],[39257.14,3,0.0],[39428.57,0,0.0],[39600.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[39771.43,2,0.0],[40457.14,2,0.0],[40628.57,3,0.0],[40800.0,0,0.0],[40971.43,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[41142.8555,2,0.0],[41828.57,2,0.0],[42000.0,3,0.0],[42171.43,0,0.0],[42342.8555,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[42514.2852,2,0.0],[43200.0,2,0.0],[43371.43,3,0.0],[43542.8555,0,0.0],[43714.2852,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[43885.7148,2,0.0],[44571.43,2,0.0],[44742.8555,3,0.0],[44914.2852,0,0.0],[45085.7148,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[45257.14,2,0.0],[45942.8555,2,0.0],[46114.2852,3,0.0],[46285.7148,0,0.0],[46457.14,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[46628.57,2,0.0],[46971.43,1,0.0],[47314.2852,2,0.0],[47485.7148,3,0.0],[47657.14,0,0.0],[47828.57,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[48000.0,2,0.0],[48342.8555,2,0.0],[48685.7148,2,0.0],[48857.14,3,0.0],[49028.57,0,0.0],[49200.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[49371.43,2,0.0],[49714.2852,1,0.0],[50057.14,2,0.0],[50228.57,3,0.0],[50400.0,0,0.0],[50571.43,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[50742.8555,2,0.0],[51085.7148,2,0.0],[51428.57,2,0.0],[51600.0,3,0.0],[51771.43,0,0.0],[51942.8555,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[52114.2852,2,0.0],[52457.14,1,0.0],[52800.0,2,0.0],[52971.43,3,0.0],[53142.8555,0,0.0],[53314.2852,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[53485.7148,2,0.0],[53828.57,2,0.0],[54171.43,2,0.0],[54342.8555,3,0.0],[54514.2852,0,0.0],[54685.7148,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[54857.14,2,0.0],[55200.0,1,0.0],[55542.8555,2,0.0],[55714.2852,3,0.0],[55885.7148,0,0.0],[56057.14,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[56228.57,2,0.0],[56571.43,2,0.0],[56914.2852,2,0.0],[57085.7148,3,0.0],[57257.14,0,0.0],[57428.57,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[57600.0,3,0.0],[57942.8555,1,0.0],[58285.7148,2,0.0],[58800.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[58971.43,2,0.0],[59314.2852,3,0.0],[59657.14,2,0.0],[60171.43,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[60342.8555,3,0.0],[60685.7148,1,0.0],[61028.57,2,0.0],[61542.8555,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[61714.2852,2,0.0],[62057.14,0,0.0],[62400.0,2,0.0],[62742.8555,0,0.0],[62914.2852,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[63085.7148,3,0.0],[63428.57,1,0.0],[63771.43,2,0.0],[64285.7148,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[64457.14,2,0.0],[64800.0,3,0.0],[65142.8555,2,0.0],[65657.14,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[65828.57,3,0.0],[66171.43,1,0.0],[66514.28,2,0.0],[67028.57,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[67200.0,2,0.0],[67542.86,0,0.0],[67885.71,2,0.0],[68228.57,0,0.0],[68400.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[68571.43,2,0.0],[68914.28,1,0.0],[69257.14,2,0.0],[69600.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[69942.86,0,0.0],[70285.71,1,0.0],[70628.57,2,0.0],[70971.43,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[71314.28,3,0.0],[71657.14,0,0.0],[72000.0,2,0.0],[72342.86,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[72685.71,3,0.0],[73028.57,2,0.0],[73371.43,2,0.0],[73542.86,3,0.0],[73714.28,0,0.0],[73885.71,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[74057.14,2,0.0],[74400.0,1,0.0],[74742.86,2,0.0],[75085.71,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[75428.57,0,0.0],[75771.43,1,0.0],[76114.28,2,0.0],[76457.14,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[76800.0,3,0.0],[77142.86,0,0.0],[77485.71,2,0.0],[77828.57,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[78171.43,3,0.0],[78514.28,2,0.0],[78857.14,2,0.0],[79028.57,3,0.0],[79200.0,0,0.0],[79371.43,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[79542.86,2,0.0],[79885.71,1,0.0],[80228.57,2,0.0],[80400.0,3,0.0],[80571.43,0,0.0],[80742.86,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[80914.28,2,0.0],[81257.14,2,0.0],[81600.0,2,0.0],[81771.43,3,0.0],[81942.86,0,0.0],[82114.28,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[82285.71,2,0.0],[82628.57,1,0.0],[82971.43,2,0.0],[83142.86,3,0.0],[83314.28,0,0.0],[83485.71,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[83657.14,2,0.0],[84000.0,2,0.0],[84342.86,2,0.0],[84514.28,3,0.0],[84685.71,0,0.0],[84857.14,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[85028.57,2,0.0],[85371.43,1,0.0],[85714.28,2,0.0],[85885.71,3,0.0],[86057.14,0,0.0],[86228.57,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[86400.0,2,0.0],[86742.86,2,0.0],[87085.71,2,0.0],[87257.14,3,0.0],[87428.57,0,0.0],[87600.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[87771.43,2,0.0],[88114.28,1,0.0],[88457.14,2,0.0],[88628.57,3,0.0],[88800.0,0,0.0],[88971.43,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[89142.86,2,0.0],[89485.71,2,0.0],[89828.57,2,0.0],[90000.0,3,0.0],[90171.43,0,0.0],[90342.86,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[90514.28,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]}]},"generatedBy":"SNIFF ver.6"} \ No newline at end of file +{"song":{"song":"Philly Nice","bpm":175.0,"needsVoices":true,"player1":"bf","player2":"pico","speed":1.3,"notes":[{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[2914.28564,2,0.0],[3428.57129,1,257.142853],[3771.42847,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[4285.71436,2,0.0],[4800.0,1,257.142853],[5142.857,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[5657.14258,2,0.0],[6171.42871,1,257.142853],[6514.28564,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[6857.14258,0,0.0],[7542.857,2,0.0],[7885.71436,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[8400.0,2,0.0],[8914.285,1,257.142853],[9257.143,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[9771.429,2,0.0],[10285.7139,1,257.142853],[10628.5713,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[11142.8574,2,0.0],[11657.1426,1,257.142853],[12000.0,3,171.428574]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[12342.8574,0,0.0],[12685.7139,2,0.0],[13028.5713,2,0.0],[13371.4287,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[14057.1426,2,0.0],[14400.0,0,0.0],[14742.8574,3,0.0],[14914.2852,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[15428.5713,3,0.0],[15771.4287,2,0.0],[16114.2852,0,0.0],[16285.7139,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[16628.57,0,0.0],[16800.0,3,0.0],[17142.8574,0,0.0],[17485.7148,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[17828.57,3,0.0],[18171.4277,1,0.0],[18514.2852,2,0.0],[18857.1426,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[19542.8574,2,0.0],[19885.7148,0,0.0],[20228.57,3,0.0],[20400.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[20914.2852,3,0.0],[21257.1426,2,0.0],[21600.0,0,0.0],[21771.4277,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[22114.2852,0,0.0],[22285.7148,3,0.0],[22628.57,0,0.0],[22971.4277,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[23314.2852,3,0.0],[23657.1426,1,0.0],[24000.0,2,0.0],[24342.8574,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24685.7148,2,0.0],[24857.1426,2,0.0],[25028.57,2,0.0],[25371.4277,0,0.0],[25714.2852,3,0.0],[25885.7148,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[26400.0,3,0.0],[26742.8574,2,0.0],[27085.7148,0,0.0],[27257.1426,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[27600.0,0,0.0],[27771.4277,3,0.0],[27942.8574,3,0.0],[28114.2852,0,0.0],[28285.7148,0,0.0],[28457.1426,3,0.0],[28628.57,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[28800.0,3,0.0],[29142.8574,1,0.0],[29485.7148,2,0.0],[29828.57,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[30171.4277,2,0.0],[30342.8574,2,0.0],[30514.2852,2,0.0],[30857.1426,0,0.0],[31200.0,3,0.0],[31371.4277,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[31885.7148,3,0.0],[32228.57,2,0.0],[32571.4277,0,0.0],[32742.8574,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[33085.7148,0,0.0],[33257.14,3,0.0],[33428.57,3,0.0],[33600.0,0,0.0],[33771.43,0,0.0],[33942.8555,3,0.0],[34114.2852,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[34285.7148,3,0.0],[34628.57,1,0.0],[34971.43,2,0.0],[35314.2852,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[35657.14,2,0.0],[36342.8555,2,0.0],[36514.2852,3,0.0],[36685.7148,0,0.0],[36857.14,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[37028.57,2,0.0],[37714.2852,2,0.0],[37885.7148,3,0.0],[38057.14,0,0.0],[38228.57,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[38400.0,2,0.0],[39085.7148,2,0.0],[39257.14,3,0.0],[39428.57,0,0.0],[39600.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[39771.43,2,0.0],[40457.14,2,0.0],[40628.57,3,0.0],[40800.0,0,0.0],[40971.43,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[41142.8555,2,0.0],[41828.57,2,0.0],[42000.0,3,0.0],[42171.43,0,0.0],[42342.8555,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[42514.2852,2,0.0],[43200.0,2,0.0],[43371.43,3,0.0],[43542.8555,0,0.0],[43714.2852,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[43885.7148,2,0.0],[44571.43,2,0.0],[44742.8555,3,0.0],[44914.2852,0,0.0],[45085.7148,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[45257.14,2,0.0],[45942.8555,2,0.0],[46114.2852,3,0.0],[46285.7148,0,0.0],[46457.14,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[46628.57,2,0.0],[46971.43,1,0.0],[47314.2852,2,0.0],[47485.7148,3,0.0],[47657.14,0,0.0],[47828.57,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[48000.0,2,0.0],[48342.8555,2,0.0],[48685.7148,2,0.0],[48857.14,3,0.0],[49028.57,0,0.0],[49200.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[49371.43,2,0.0],[49714.2852,1,0.0],[50057.14,2,0.0],[50228.57,3,0.0],[50400.0,0,0.0],[50571.43,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[50742.8555,2,0.0],[51085.7148,2,0.0],[51428.57,2,0.0],[51600.0,3,0.0],[51771.43,0,0.0],[51942.8555,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[52114.2852,2,0.0],[52457.14,1,0.0],[52800.0,2,0.0],[52971.43,3,0.0],[53142.8555,0,0.0],[53314.2852,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[53485.7148,2,0.0],[53828.57,2,0.0],[54171.43,2,0.0],[54342.8555,3,0.0],[54514.2852,0,0.0],[54685.7148,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[54857.14,2,0.0],[55200.0,1,0.0],[55542.8555,2,0.0],[55714.2852,3,0.0],[55885.7148,0,0.0],[56057.14,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[56228.57,2,0.0],[56571.43,2,0.0],[56914.2852,2,0.0],[57085.7148,3,0.0],[57257.14,0,0.0],[57428.57,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[57600.0,3,0.0],[57942.8555,1,0.0],[58285.7148,2,0.0],[58800.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[58971.43,2,0.0],[59314.2852,3,0.0],[59657.14,2,0.0],[60171.43,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[60342.8555,3,0.0],[60685.7148,1,0.0],[61028.57,2,0.0],[61542.8555,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[61714.2852,2,0.0],[62057.14,0,0.0],[62400.0,2,0.0],[62742.8555,0,0.0],[62914.2852,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[63085.7148,3,0.0],[63428.57,1,0.0],[63771.43,2,0.0],[64285.7148,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[64457.14,2,0.0],[64800.0,3,0.0],[65142.8555,2,0.0],[65657.14,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[65828.57,3,0.0],[66171.43,1,0.0],[66514.28,2,0.0],[67028.57,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[67200.0,2,0.0],[67542.86,0,0.0],[67885.71,2,0.0],[68228.57,0,0.0],[68400.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[68571.43,2,0.0],[68914.28,1,0.0],[69257.14,2,0.0],[69600.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[69942.86,0,0.0],[70285.71,1,0.0],[70628.57,2,0.0],[70971.43,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[71314.28,3,0.0],[71657.14,0,0.0],[72000.0,2,0.0],[72342.86,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[72685.71,3,0.0],[73028.57,2,0.0],[73371.43,2,0.0],[73542.86,3,0.0],[73714.28,0,0.0],[73885.71,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[74057.14,2,0.0],[74400.0,1,0.0],[74742.86,2,0.0],[75085.71,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[75428.57,0,0.0],[75771.43,1,0.0],[76114.28,2,0.0],[76457.14,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[76800.0,3,0.0],[77142.86,0,0.0],[77485.71,2,0.0],[77828.57,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[78171.43,3,0.0],[78514.28,2,0.0],[78857.14,2,0.0],[79028.57,3,0.0],[79200.0,0,0.0],[79371.43,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[79542.86,2,0.0],[79885.71,1,0.0],[80228.57,2,0.0],[80400.0,3,0.0],[80571.43,0,0.0],[80742.86,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[80914.28,2,0.0],[81257.14,2,0.0],[81600.0,2,0.0],[81771.43,3,0.0],[81942.86,0,0.0],[82114.28,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[82285.71,2,0.0],[82628.57,1,0.0],[82971.43,2,0.0],[83142.86,3,0.0],[83314.28,0,0.0],[83485.71,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[83657.14,2,0.0],[84000.0,2,0.0],[84342.86,2,0.0],[84514.28,3,0.0],[84685.71,0,0.0],[84857.14,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[85028.57,2,0.0],[85371.43,1,0.0],[85714.28,2,0.0],[85885.71,3,0.0],[86057.14,0,0.0],[86228.57,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[86400.0,2,0.0],[86742.86,2,0.0],[87085.71,2,0.0],[87257.14,3,0.0],[87428.57,0,0.0],[87600.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[87771.43,2,0.0],[88114.28,1,0.0],[88457.14,2,0.0],[88628.57,3,0.0],[88800.0,0,0.0],[88971.43,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[89142.86,2,0.0],[89485.71,2,0.0],[89828.57,2,0.0],[90000.0,3,0.0],[90171.43,0,0.0],[90342.86,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[90514.28,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]}]},"generatedBy":"SNIFF ver.6"} \ No newline at end of file diff --git a/assets/preload/data/roses/events.json b/assets/preload/data/roses/events.json new file mode 100644 index 000000000..efba8787c --- /dev/null +++ b/assets/preload/data/roses/events.json @@ -0,0 +1,466 @@ +{ + "song": { + "speed": 1.5, + "stage": null, + "player1": "bf-pixel", + "player2": "senpai-angry", + "player3": "gf-pixel", + "notes": [ + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [ + [ + -5999, + -1, + "BG Freaks Expression", + "", + "" + ] + ], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + }, + { + "lengthInSteps": 16, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 0, + "changeBPM": false, + "mustHitSection": false + } + ], + "splashSkin": null, + "validScore": false, + "bpm": 120, + "arrowSkin": null, + "needsVoices": true, + "song": "Roses" + } +} \ No newline at end of file diff --git a/assets/preload/data/satin-panties/events.json b/assets/preload/data/satin-panties/events.json index d74fe0686..979e285e7 100644 --- a/assets/preload/data/satin-panties/events.json +++ b/assets/preload/data/satin-panties/events.json @@ -1 +1 @@ -{"song":{"player1":"bf-car","notes":[{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[21818.1818181818,-1,"Kill Henchmen","",""]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[56727.2727272728,-1,"Kill Henchmen","",""]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"lengthInSteps":16,"altAnim":false,"typeOfSection":0,"sectionNotes":[],"bpm":110,"changeBPM":false,"mustHitSection":true},{"lengthInSteps":16,"altAnim":false,"typeOfSection":0,"sectionNotes":[],"bpm":110,"changeBPM":false,"mustHitSection":true}],"player2":"mom-car","song":"Satin-Panties","validScore":true,"needsVoices":true,"speed":1.8,"bpm":110}} \ No newline at end of file +{"song":{"player1":"bf-car","notes":[{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[21818.1818181818,-1,"Kill Henchmen","",""]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[[56727.2727272728,-1,"Kill Henchmen","",""]],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":false},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"sectionNotes":[],"lengthInSteps":16,"mustHitSection":true},{"lengthInSteps":16,"altAnim":false,"typeOfSection":0,"sectionNotes":[],"bpm":110,"changeBPM":false,"mustHitSection":true},{"lengthInSteps":16,"altAnim":false,"typeOfSection":0,"sectionNotes":[],"bpm":110,"changeBPM":false,"mustHitSection":true}],"player2":"mom-car","song":"Satin Panties","validScore":true,"needsVoices":true,"speed":1.8,"bpm":110}} \ No newline at end of file diff --git a/assets/preload/data/satin-panties/satin-panties-easy.json b/assets/preload/data/satin-panties/satin-panties-easy.json index 7b867be5a..3e246b36f 100644 --- a/assets/preload/data/satin-panties/satin-panties-easy.json +++ b/assets/preload/data/satin-panties/satin-panties-easy.json @@ -1 +1 @@ -{"song":{"song":"Satin-Panties","bpm":110.0,"needsVoices":true,"player1":"bf-car","player2":"mom-car","speed":1.3,"notes":[{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[0.0,0,0.0],[545.4545,0,0.0],[954.5454,0,0.0],[1363.63635,0,0.0],[1636.36353,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[2181.818,3,0.0],[2727.27271,3,0.0],[3136.36353,3,0.0],[3545.45435,3,0.0],[3818.18164,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[4636.36328,2,0.0],[4909.091,3,0.0],[5318.18164,3,0.0],[6000.0,3,0.0],[6272.727,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[6818.18164,2,0.0],[7090.90869,3,0.0],[7500.0,3,0.0],[8181.818,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[8727.272,6,545.4545],[9000.0,2,0.0],[9272.727,3,0.0],[9681.818,3,0.0],[10363.6357,3,0.0],[10636.3633,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[11181.8174,2,0.0],[11454.5449,3,0.0],[11863.6357,3,0.0],[12545.4541,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[13090.9082,6,545.4545],[13363.6357,1,0.0],[13636.3633,0,0.0],[14181.8174,2,272.727264],[14727.2725,0,0.0],[15000.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[15272.7266,3,272.727264],[15681.8174,0,0.0],[16363.6357,2,272.727264],[16772.7266,3,0.0],[16909.09,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[17454.5449,6,545.4545],[17727.2715,1,0.0],[18000.0,0,0.0],[18545.4531,2,272.727264],[19090.9082,0,0.0],[19363.6367,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[19636.3633,3,272.727264],[20045.4531,0,0.0],[20727.2715,2,272.727264],[21136.3633,3,0.0],[21272.7266,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[21818.1816,6,409.090881],[21818.1816,2,409.090881],[22363.6348,7,0.0],[22363.6348,3,0.0],[22909.09,4,0.0],[22909.09,0,0.0],[23181.8184,4,0.0],[23181.8184,0,0.0],[23454.5449,4,0.0],[23454.5449,0,0.0],[23727.2715,4,0.0],[23727.2715,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24000.0,1,409.090881],[24000.0,5,409.090881],[24545.4531,4,0.0],[24545.4531,0,0.0],[24818.1816,4,0.0],[24818.1816,0,0.0],[25090.9082,6,136.363632],[25090.9082,2,136.363632],[25636.3633,7,0.0],[25636.3633,3,0.0],[25909.09,5,0.0],[25909.09,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[26181.8164,4,409.090881],[26181.8164,3,409.090881],[26727.2715,0,409.090881],[26727.2715,7,409.090881],[27272.7266,6,0.0],[27272.7266,2,0.0],[27818.1816,7,409.090881],[27818.1816,0,409.090881]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[28363.6348,5,409.090881],[28363.6348,1,409.090881],[28909.09,7,409.090881],[28909.09,3,409.090881],[29454.5449,6,409.090881],[29454.5449,2,409.090881],[30000.0,4,0.0],[30000.0,0,0.0],[30272.7266,7,409.090881]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[30545.4531,5,545.4545],[30818.1816,2,0.0],[31090.9082,0,0.0],[31636.3633,3,0.0],[31909.09,3,0.0],[32181.8164,3,0.0],[32454.5449,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[33000.0,1,0.0],[33272.7266,0,136.363632],[33818.18,2,0.0],[34090.9063,0,0.0],[34363.6367,3,0.0],[34636.3633,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[34909.09,7,0.0],[35181.8164,7,0.0],[35181.8164,2,0.0],[35454.543,0,0.0],[36000.0,3,0.0],[36272.7266,3,0.0],[36545.4531,3,0.0],[36818.18,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[37363.6367,1,0.0],[37636.3633,0,136.363632],[38181.8164,2,0.0],[38454.543,0,0.0],[38727.2734,7,0.0],[38727.2734,3,0.0],[39000.0,7,0.0],[39000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[39272.7266,2,0.0],[39272.7266,7,0.0],[39545.4531,2,0.0],[39545.4531,7,0.0],[39818.18,0,0.0],[40090.9063,3,0.0],[40363.6367,3,0.0],[40636.3633,3,0.0],[40909.09,3,0.0],[41181.8164,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[41454.543,0,0.0],[42000.0,0,0.0],[42272.7266,1,0.0],[42545.4531,2,0.0],[42818.18,0,0.0],[43090.9063,3,0.0],[43090.9063,7,0.0],[43363.6367,0,0.0],[43363.6367,7,0.0],[43500.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[43636.3633,2,0.0],[43909.09,2,0.0],[44181.8164,0,0.0],[44454.543,3,0.0],[44727.27,3,0.0],[45000.0,3,0.0],[45272.7266,3,0.0],[45545.4531,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[45818.18,0,0.0],[46363.6367,0,0.0],[46636.3633,1,0.0],[46909.09,2,0.0],[47181.8164,0,0.0],[47454.543,3,0.0],[47727.27,0,0.0],[47863.6367,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[48272.7266,2,0.0],[48545.4531,0,0.0],[48818.18,0,0.0],[49090.9063,3,0.0],[49363.6367,3,0.0],[49636.3633,1,0.0],[49909.09,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[50454.543,3,0.0],[50727.27,0,0.0],[51272.7266,0,0.0],[51545.4531,2,0.0],[51818.18,0,0.0],[52090.9063,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[52363.6328,6,545.4545],[52636.3633,2,0.0],[52909.09,0,0.0],[53181.8164,0,0.0],[53454.543,3,0.0],[53727.27,3,0.0],[54000.0,1,0.0],[54272.7266,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[54818.18,3,0.0],[55090.9063,0,0.0],[55636.3633,0,0.0],[55909.09,2,0.0],[56181.8164,0,0.0],[56454.543,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[56727.27,2,409.090881],[56727.27,6,409.090881],[57272.7266,3,0.0],[57272.7266,7,0.0],[57818.18,0,0.0],[57818.18,4,0.0],[58090.9063,0,0.0],[58090.9063,4,0.0],[58363.6328,0,0.0],[58363.6328,4,0.0],[58636.3633,0,0.0],[58636.3633,4,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[58909.09,1,409.090881],[58909.09,5,409.090881],[59454.543,4,0.0],[59454.543,0,0.0],[59727.27,4,0.0],[59727.27,0,0.0],[60000.0,6,136.363632],[60000.0,2,136.363632],[60545.4531,7,0.0],[60545.4531,3,0.0],[60818.18,5,0.0],[60818.18,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[61090.9063,0,409.090881],[61090.9063,7,409.090881],[61636.3633,4,409.090881],[61636.3633,3,409.090881],[62181.8164,2,0.0],[62181.8164,6,0.0],[62727.27,3,409.090881],[62727.27,4,409.090881]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[63272.7266,5,409.090881],[63272.7266,1,409.090881],[63818.18,7,409.090881],[63818.18,3,409.090881],[64363.6328,6,409.090881],[64363.6328,2,409.090881],[64909.09,0,0.0],[64909.09,4,0.0],[65181.8164,7,409.090881]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[65454.543,5,545.4545],[65727.27,2,0.0],[66000.0,0,0.0],[66545.45,3,0.0],[66818.18,3,0.0],[67090.91,3,0.0],[67363.63,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[67909.0859,1,0.0],[68181.81,0,136.363632],[68727.27,3,0.0],[69000.0,0,0.0],[69272.73,3,0.0],[69545.45,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[69818.18,5,409.090881],[70090.91,2,0.0],[70363.63,0,0.0],[70363.63,7,409.090881],[70909.0859,6,409.090881],[70909.0859,3,0.0],[71181.81,3,0.0],[71454.55,3,0.0],[71454.55,7,409.090881],[71727.27,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[72000.0,5,409.090881],[72272.73,1,0.0],[72545.45,0,136.363632],[72545.45,7,409.090881],[73090.91,3,0.0],[73363.63,0,0.0],[73636.36,3,0.0],[73909.0859,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[74181.81,2,0.0],[74181.81,5,409.090881],[74454.55,2,0.0],[74727.27,0,0.0],[74727.27,7,409.090881],[75000.0,3,0.0],[75272.73,3,0.0],[75272.73,6,409.090881],[75545.45,3,0.0],[75818.18,3,0.0],[75818.18,7,409.090881],[76090.91,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[76363.63,0,0.0],[76363.63,5,409.090881],[76909.0859,0,0.0],[76909.0859,7,409.090881],[77181.81,1,0.0],[77454.55,2,0.0],[77454.55,6,409.090881],[77727.27,0,0.0],[78000.0,3,0.0],[78000.0,7,0.0],[78272.73,0,0.0],[78272.73,7,0.0],[78409.0859,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[78545.45,2,0.0],[78818.18,2,0.0],[79090.91,0,0.0],[79363.63,3,0.0],[79636.36,3,0.0],[79909.0859,3,0.0],[80181.81,3,0.0],[80454.55,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[80727.27,0,0.0],[81272.73,0,0.0],[81545.45,1,0.0],[81818.18,2,0.0],[82090.91,0,0.0],[82363.63,3,0.0],[82636.36,0,0.0],[82772.73,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[82909.0859,7,1090.909],[83181.81,2,0.0],[83454.54,3,0.0],[83863.63,3,0.0],[84545.45,3,0.0],[84818.18,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[85363.63,2,0.0],[85636.36,3,0.0],[86045.45,3,0.0],[86727.27,3,0.0],[87000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[87272.73,2,545.4545]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]}]},"generatedBy":"SNIFF ver.6"} \ No newline at end of file +{"song":{"song":"Satin Panties","bpm":110.0,"needsVoices":true,"player1":"bf-car","player2":"mom-car","speed":1.3,"notes":[{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[0.0,0,0.0],[545.4545,0,0.0],[954.5454,0,0.0],[1363.63635,0,0.0],[1636.36353,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[2181.818,3,0.0],[2727.27271,3,0.0],[3136.36353,3,0.0],[3545.45435,3,0.0],[3818.18164,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[4636.36328,2,0.0],[4909.091,3,0.0],[5318.18164,3,0.0],[6000.0,3,0.0],[6272.727,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[6818.18164,2,0.0],[7090.90869,3,0.0],[7500.0,3,0.0],[8181.818,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[8727.272,6,545.4545],[9000.0,2,0.0],[9272.727,3,0.0],[9681.818,3,0.0],[10363.6357,3,0.0],[10636.3633,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[11181.8174,2,0.0],[11454.5449,3,0.0],[11863.6357,3,0.0],[12545.4541,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[13090.9082,6,545.4545],[13363.6357,1,0.0],[13636.3633,0,0.0],[14181.8174,2,272.727264],[14727.2725,0,0.0],[15000.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[15272.7266,3,272.727264],[15681.8174,0,0.0],[16363.6357,2,272.727264],[16772.7266,3,0.0],[16909.09,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[17454.5449,6,545.4545],[17727.2715,1,0.0],[18000.0,0,0.0],[18545.4531,2,272.727264],[19090.9082,0,0.0],[19363.6367,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[19636.3633,3,272.727264],[20045.4531,0,0.0],[20727.2715,2,272.727264],[21136.3633,3,0.0],[21272.7266,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[21818.1816,6,409.090881],[21818.1816,2,409.090881],[22363.6348,7,0.0],[22363.6348,3,0.0],[22909.09,4,0.0],[22909.09,0,0.0],[23181.8184,4,0.0],[23181.8184,0,0.0],[23454.5449,4,0.0],[23454.5449,0,0.0],[23727.2715,4,0.0],[23727.2715,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24000.0,1,409.090881],[24000.0,5,409.090881],[24545.4531,4,0.0],[24545.4531,0,0.0],[24818.1816,4,0.0],[24818.1816,0,0.0],[25090.9082,6,136.363632],[25090.9082,2,136.363632],[25636.3633,7,0.0],[25636.3633,3,0.0],[25909.09,5,0.0],[25909.09,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[26181.8164,4,409.090881],[26181.8164,3,409.090881],[26727.2715,0,409.090881],[26727.2715,7,409.090881],[27272.7266,6,0.0],[27272.7266,2,0.0],[27818.1816,7,409.090881],[27818.1816,0,409.090881]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[28363.6348,5,409.090881],[28363.6348,1,409.090881],[28909.09,7,409.090881],[28909.09,3,409.090881],[29454.5449,6,409.090881],[29454.5449,2,409.090881],[30000.0,4,0.0],[30000.0,0,0.0],[30272.7266,7,409.090881]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[30545.4531,5,545.4545],[30818.1816,2,0.0],[31090.9082,0,0.0],[31636.3633,3,0.0],[31909.09,3,0.0],[32181.8164,3,0.0],[32454.5449,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[33000.0,1,0.0],[33272.7266,0,136.363632],[33818.18,2,0.0],[34090.9063,0,0.0],[34363.6367,3,0.0],[34636.3633,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[34909.09,7,0.0],[35181.8164,7,0.0],[35181.8164,2,0.0],[35454.543,0,0.0],[36000.0,3,0.0],[36272.7266,3,0.0],[36545.4531,3,0.0],[36818.18,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[37363.6367,1,0.0],[37636.3633,0,136.363632],[38181.8164,2,0.0],[38454.543,0,0.0],[38727.2734,7,0.0],[38727.2734,3,0.0],[39000.0,7,0.0],[39000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[39272.7266,2,0.0],[39272.7266,7,0.0],[39545.4531,2,0.0],[39545.4531,7,0.0],[39818.18,0,0.0],[40090.9063,3,0.0],[40363.6367,3,0.0],[40636.3633,3,0.0],[40909.09,3,0.0],[41181.8164,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[41454.543,0,0.0],[42000.0,0,0.0],[42272.7266,1,0.0],[42545.4531,2,0.0],[42818.18,0,0.0],[43090.9063,3,0.0],[43090.9063,7,0.0],[43363.6367,0,0.0],[43363.6367,7,0.0],[43500.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[43636.3633,2,0.0],[43909.09,2,0.0],[44181.8164,0,0.0],[44454.543,3,0.0],[44727.27,3,0.0],[45000.0,3,0.0],[45272.7266,3,0.0],[45545.4531,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[45818.18,0,0.0],[46363.6367,0,0.0],[46636.3633,1,0.0],[46909.09,2,0.0],[47181.8164,0,0.0],[47454.543,3,0.0],[47727.27,0,0.0],[47863.6367,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[48272.7266,2,0.0],[48545.4531,0,0.0],[48818.18,0,0.0],[49090.9063,3,0.0],[49363.6367,3,0.0],[49636.3633,1,0.0],[49909.09,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[50454.543,3,0.0],[50727.27,0,0.0],[51272.7266,0,0.0],[51545.4531,2,0.0],[51818.18,0,0.0],[52090.9063,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[52363.6328,6,545.4545],[52636.3633,2,0.0],[52909.09,0,0.0],[53181.8164,0,0.0],[53454.543,3,0.0],[53727.27,3,0.0],[54000.0,1,0.0],[54272.7266,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[54818.18,3,0.0],[55090.9063,0,0.0],[55636.3633,0,0.0],[55909.09,2,0.0],[56181.8164,0,0.0],[56454.543,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[56727.27,2,409.090881],[56727.27,6,409.090881],[57272.7266,3,0.0],[57272.7266,7,0.0],[57818.18,0,0.0],[57818.18,4,0.0],[58090.9063,0,0.0],[58090.9063,4,0.0],[58363.6328,0,0.0],[58363.6328,4,0.0],[58636.3633,0,0.0],[58636.3633,4,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[58909.09,1,409.090881],[58909.09,5,409.090881],[59454.543,4,0.0],[59454.543,0,0.0],[59727.27,4,0.0],[59727.27,0,0.0],[60000.0,6,136.363632],[60000.0,2,136.363632],[60545.4531,7,0.0],[60545.4531,3,0.0],[60818.18,5,0.0],[60818.18,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[61090.9063,0,409.090881],[61090.9063,7,409.090881],[61636.3633,4,409.090881],[61636.3633,3,409.090881],[62181.8164,2,0.0],[62181.8164,6,0.0],[62727.27,3,409.090881],[62727.27,4,409.090881]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[63272.7266,5,409.090881],[63272.7266,1,409.090881],[63818.18,7,409.090881],[63818.18,3,409.090881],[64363.6328,6,409.090881],[64363.6328,2,409.090881],[64909.09,0,0.0],[64909.09,4,0.0],[65181.8164,7,409.090881]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[65454.543,5,545.4545],[65727.27,2,0.0],[66000.0,0,0.0],[66545.45,3,0.0],[66818.18,3,0.0],[67090.91,3,0.0],[67363.63,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[67909.0859,1,0.0],[68181.81,0,136.363632],[68727.27,3,0.0],[69000.0,0,0.0],[69272.73,3,0.0],[69545.45,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[69818.18,5,409.090881],[70090.91,2,0.0],[70363.63,0,0.0],[70363.63,7,409.090881],[70909.0859,6,409.090881],[70909.0859,3,0.0],[71181.81,3,0.0],[71454.55,3,0.0],[71454.55,7,409.090881],[71727.27,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[72000.0,5,409.090881],[72272.73,1,0.0],[72545.45,0,136.363632],[72545.45,7,409.090881],[73090.91,3,0.0],[73363.63,0,0.0],[73636.36,3,0.0],[73909.0859,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[74181.81,2,0.0],[74181.81,5,409.090881],[74454.55,2,0.0],[74727.27,0,0.0],[74727.27,7,409.090881],[75000.0,3,0.0],[75272.73,3,0.0],[75272.73,6,409.090881],[75545.45,3,0.0],[75818.18,3,0.0],[75818.18,7,409.090881],[76090.91,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[76363.63,0,0.0],[76363.63,5,409.090881],[76909.0859,0,0.0],[76909.0859,7,409.090881],[77181.81,1,0.0],[77454.55,2,0.0],[77454.55,6,409.090881],[77727.27,0,0.0],[78000.0,3,0.0],[78000.0,7,0.0],[78272.73,0,0.0],[78272.73,7,0.0],[78409.0859,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[78545.45,2,0.0],[78818.18,2,0.0],[79090.91,0,0.0],[79363.63,3,0.0],[79636.36,3,0.0],[79909.0859,3,0.0],[80181.81,3,0.0],[80454.55,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[80727.27,0,0.0],[81272.73,0,0.0],[81545.45,1,0.0],[81818.18,2,0.0],[82090.91,0,0.0],[82363.63,3,0.0],[82636.36,0,0.0],[82772.73,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[82909.0859,7,1090.909],[83181.81,2,0.0],[83454.54,3,0.0],[83863.63,3,0.0],[84545.45,3,0.0],[84818.18,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[85363.63,2,0.0],[85636.36,3,0.0],[86045.45,3,0.0],[86727.27,3,0.0],[87000.0,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[87272.73,2,545.4545]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]}]},"generatedBy":"SNIFF ver.6"} \ No newline at end of file diff --git a/assets/preload/data/satin-panties/satin-panties-hard.json b/assets/preload/data/satin-panties/satin-panties-hard.json index 61915ae64..bff017bcb 100644 --- a/assets/preload/data/satin-panties/satin-panties-hard.json +++ b/assets/preload/data/satin-panties/satin-panties-hard.json @@ -1 +1 @@ -{"song":{"song":"Satin-Panties","bpm":110.0,"needsVoices":true,"player1":"bf-car","player2":"mom-car","speed":1.8,"notes":[{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[0.0,0,0.0],[272.727264,0,0.0],[545.4545,0,0.0],[818.181763,0,0.0],[954.5454,0,0.0],[1227.27271,0,0.0],[1363.63635,0,0.0],[1636.36353,0,0.0],[1909.09082,0,0.0],[2045.45447,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[2181.818,3,0.0],[2454.54541,3,0.0],[2727.27271,3,0.0],[3000.0,3,0.0],[3136.36353,3,0.0],[3409.09082,3,0.0],[3545.45435,3,0.0],[3818.18164,3,0.0],[4090.909,3,0.0],[4227.27246,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[4636.36328,2,0.0],[4909.091,3,0.0],[5181.818,2,0.0],[5318.18164,3,0.0],[5590.90869,0,0.0],[5863.636,2,0.0],[6000.0,3,0.0],[6272.727,0,0.0],[6409.091,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[6818.18164,2,0.0],[7090.90869,3,0.0],[7363.636,2,0.0],[7500.0,3,0.0],[7772.727,0,0.0],[8045.454,2,0.0],[8181.818,3,0.0],[8318.182,0,0.0],[8454.545,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[8727.272,6,545.4545],[9000.0,2,0.0],[9272.727,3,0.0],[9545.454,2,0.0],[9681.818,3,0.0],[9954.545,0,0.0],[10227.2725,2,0.0],[10363.6357,3,0.0],[10636.3633,0,0.0],[10772.7266,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[11181.8174,2,0.0],[11454.5449,3,0.0],[11727.2725,2,0.0],[11863.6357,3,0.0],[12136.3633,0,0.0],[12409.0908,2,0.0],[12545.4541,3,0.0],[12681.8174,0,0.0],[12818.1816,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[13090.9082,6,545.4545],[13363.6357,1,0.0],[13500.0,1,0.0],[13636.3633,0,0.0],[13909.0908,0,0.0],[14045.4541,3,0.0],[14181.8174,2,272.727264],[14590.9082,3,0.0],[14727.2725,0,0.0],[15000.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[15272.7266,3,272.727264],[15681.8174,0,0.0],[15954.5449,0,0.0],[16090.9082,0,0.0],[16227.2725,0,0.0],[16363.6357,2,272.727264],[16772.7266,3,0.0],[16909.09,0,0.0],[17045.4531,1,0.0],[17181.8184,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[17454.5449,6,545.4545],[17727.2715,1,0.0],[17863.6367,1,0.0],[18000.0,0,0.0],[18272.7266,0,0.0],[18409.09,3,0.0],[18545.4531,2,272.727264],[18954.5449,3,0.0],[19090.9082,0,0.0],[19363.6367,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[19636.3633,3,272.727264],[20045.4531,0,0.0],[20318.1816,0,0.0],[20454.5449,0,0.0],[20590.9082,0,0.0],[20727.2715,2,272.727264],[21136.3633,3,0.0],[21272.7266,0,0.0],[21409.09,1,0.0],[21545.4531,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[21818.1816,6,409.090881],[21818.1816,2,409.090881],[22363.6348,7,0.0],[22363.6348,3,0.0],[22500.0,6,0.0],[22500.0,2,0.0],[22636.3633,7,0.0],[22636.3633,3,0.0],[22772.7266,6,0.0],[22772.7266,2,0.0],[22909.09,4,0.0],[22909.09,0,0.0],[23045.4531,5,0.0],[23045.4531,1,0.0],[23181.8184,4,0.0],[23181.8184,0,0.0],[23318.1816,5,0.0],[23318.1816,1,0.0],[23454.5449,4,0.0],[23454.5449,0,0.0],[23590.9082,7,0.0],[23590.9082,3,0.0],[23727.2715,4,0.0],[23727.2715,0,0.0],[23863.6348,7,0.0],[23863.6348,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24000.0,1,409.090881],[24000.0,5,409.090881],[24545.4531,4,0.0],[24545.4531,0,0.0],[24681.8184,7,0.0],[24681.8184,3,0.0],[24818.1816,4,0.0],[24818.1816,0,0.0],[24954.5449,7,0.0],[24954.5449,3,0.0],[25090.9082,6,136.363632],[25090.9082,2,136.363632],[25363.6348,7,0.0],[25363.6348,3,0.0],[25636.3633,7,0.0],[25636.3633,3,0.0],[25909.09,5,0.0],[25909.09,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[26181.8164,4,409.090881],[26181.8164,3,409.090881],[26727.2715,0,409.090881],[26727.2715,7,409.090881],[27272.7266,6,0.0],[27272.7266,2,0.0],[27545.4531,6,0.0],[27545.4531,2,0.0],[27681.8164,6,0.0],[27681.8164,2,0.0],[27818.1816,7,409.090881],[27818.1816,0,409.090881]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[28363.6348,5,409.090881],[28363.6348,1,409.090881],[28909.09,7,409.090881],[28909.09,3,409.090881],[29454.5449,6,409.090881],[29454.5449,2,409.090881],[30000.0,4,0.0],[30000.0,0,0.0],[30272.7266,7,409.090881],[30272.7266,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[30545.4531,5,545.4545],[30818.1816,2,0.0],[30954.5449,3,0.0],[31090.9082,0,0.0],[31363.6348,1,0.0],[31636.3633,3,0.0],[31772.7266,0,0.0],[31909.09,3,0.0],[32181.8164,3,0.0],[32318.1816,0,0.0],[32454.5449,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[33000.0,1,0.0],[33136.3633,3,0.0],[33272.7266,0,136.363632],[33545.4531,1,0.0],[33818.18,2,0.0],[33954.543,3,0.0],[34090.9063,0,0.0],[34227.2734,0,0.0],[34363.6367,3,0.0],[34500.0,0,0.0],[34636.3633,0,0.0],[34772.7266,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[34909.09,7,0.0],[35045.4531,6,0.0],[35181.8164,2,0.0],[35181.8164,7,0.0],[35318.18,3,0.0],[35454.543,0,0.0],[35727.2734,1,0.0],[36000.0,3,0.0],[36136.3633,0,0.0],[36272.7266,3,0.0],[36545.4531,3,0.0],[36681.8164,0,0.0],[36818.18,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[37363.6367,1,0.0],[37500.0,3,0.0],[37636.3633,0,136.363632],[37909.09,1,0.0],[38181.8164,2,0.0],[38318.18,3,0.0],[38454.543,0,0.0],[38590.9063,0,0.0],[38727.2734,7,0.0],[38727.2734,3,0.0],[38863.6367,4,0.0],[38863.6367,0,0.0],[39000.0,5,0.0],[39000.0,0,0.0],[39136.3633,7,0.0],[39136.3633,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[39272.7266,2,136.363632],[39272.7266,7,0.0],[39409.09,6,0.0],[39545.4531,7,0.0],[39545.4531,2,0.0],[39681.8164,3,0.0],[39818.18,0,0.0],[39954.543,1,0.0],[40090.9063,3,0.0],[40227.2734,1,0.0],[40363.6367,3,0.0],[40500.0,0,0.0],[40636.3633,3,0.0],[40772.7266,1,0.0],[40909.09,3,0.0],[41045.4531,0,0.0],[41181.8164,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[41454.543,0,0.0],[41727.27,1,0.0],[41863.6367,3,0.0],[42000.0,0,136.363632],[42272.7266,1,0.0],[42545.4531,2,0.0],[42681.8164,3,0.0],[42818.18,0,0.0],[42954.543,0,0.0],[43090.9063,7,0.0],[43090.9063,3,0.0],[43227.27,4,0.0],[43227.27,0,0.0],[43363.6367,5,0.0],[43363.6367,0,0.0],[43500.0,7,0.0],[43500.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[43636.3633,2,136.363632],[43909.09,2,0.0],[44045.4531,3,0.0],[44181.8164,0,0.0],[44318.18,1,0.0],[44454.543,3,0.0],[44590.9063,1,0.0],[44727.27,3,0.0],[44863.6367,0,0.0],[45000.0,3,0.0],[45136.3633,1,0.0],[45272.7266,3,0.0],[45409.09,0,0.0],[45545.4531,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[45818.18,0,0.0],[46090.9063,1,0.0],[46227.27,3,0.0],[46363.6367,0,136.363632],[46636.3633,1,0.0],[46909.09,2,0.0],[47045.4531,3,0.0],[47181.8164,0,0.0],[47318.18,0,0.0],[47454.543,3,0.0],[47590.9063,0,0.0],[47727.27,0,0.0],[47863.6367,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[48272.7266,2,0.0],[48409.09,3,0.0],[48545.4531,0,0.0],[48681.8164,3,0.0],[48818.18,0,0.0],[48954.543,2,0.0],[49090.9063,3,0.0],[49363.6367,3,0.0],[49636.3633,1,0.0],[49909.09,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[50454.543,3,0.0],[50590.9063,1,0.0],[50727.27,0,0.0],[50863.6367,3,0.0],[51000.0,2,0.0],[51272.7266,0,0.0],[51545.4531,2,0.0],[51818.18,0,0.0],[52090.9063,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[52363.6328,6,545.4545],[52636.3633,2,0.0],[52772.7266,3,0.0],[52909.09,0,0.0],[53045.4531,3,0.0],[53181.8164,0,0.0],[53318.18,2,0.0],[53454.543,3,0.0],[53727.27,3,0.0],[54000.0,1,0.0],[54272.7266,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[54818.18,3,0.0],[54954.543,1,0.0],[55090.9063,0,0.0],[55227.27,3,0.0],[55363.6328,2,0.0],[55636.3633,0,0.0],[55909.09,2,0.0],[56181.8164,0,0.0],[56454.543,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[56727.27,6,409.090881],[56727.27,2,409.090881],[57272.7266,3,0.0],[57272.7266,7,0.0],[57409.09,2,0.0],[57409.09,6,0.0],[57545.4531,3,0.0],[57545.4531,7,0.0],[57681.8164,2,0.0],[57681.8164,6,0.0],[57818.18,0,0.0],[57818.18,4,0.0],[57954.543,1,0.0],[57954.543,5,0.0],[58090.9063,0,0.0],[58090.9063,4,0.0],[58227.27,1,0.0],[58227.27,5,0.0],[58363.6328,0,0.0],[58363.6328,4,0.0],[58500.0,3,0.0],[58500.0,7,0.0],[58636.3633,0,0.0],[58636.3633,4,0.0],[58772.7266,3,0.0],[58772.7266,7,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[58909.09,1,409.090881],[58909.09,5,409.090881],[59454.543,4,0.0],[59454.543,0,0.0],[59590.9063,7,0.0],[59590.9063,3,0.0],[59727.27,4,0.0],[59727.27,0,0.0],[59863.6328,7,0.0],[59863.6328,3,0.0],[60000.0,6,136.363632],[60000.0,2,136.363632],[60272.7266,7,0.0],[60272.7266,3,0.0],[60545.4531,7,0.0],[60545.4531,3,0.0],[60818.18,5,0.0],[60818.18,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[61090.9063,0,409.090881],[61090.9063,7,409.090881],[61636.3633,4,409.090881],[61636.3633,3,409.090881],[62181.8164,2,0.0],[62181.8164,6,0.0],[62454.543,2,0.0],[62454.543,6,0.0],[62590.9063,2,0.0],[62590.9063,6,0.0],[62727.27,3,409.090881],[62727.27,4,409.090881]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[63272.7266,5,409.090881],[63272.7266,1,409.090881],[63818.18,7,409.090881],[63818.18,3,409.090881],[64363.6328,6,409.090881],[64363.6328,2,409.090881],[64909.09,4,0.0],[64909.09,0,0.0],[65181.8164,7,0.0],[65181.8164,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[65454.543,5,545.4545],[65454.543,2,0.0],[65727.27,2,0.0],[65863.63,3,0.0],[66000.0,0,0.0],[66272.73,1,0.0],[66545.45,3,0.0],[66681.81,0,0.0],[66818.18,3,0.0],[67090.91,3,0.0],[67227.27,0,0.0],[67363.63,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[67909.0859,1,0.0],[68045.45,3,0.0],[68181.81,0,136.363632],[68454.55,1,0.0],[68727.27,2,0.0],[68818.18,0,0.0],[68909.0859,3,0.0],[69000.0,0,0.0],[69181.81,0,0.0],[69272.73,3,0.0],[69363.63,0,0.0],[69454.55,3,0.0],[69545.45,1,0.0],[69727.27,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[69818.18,5,409.090881],[70090.91,2,0.0],[70227.27,3,0.0],[70363.63,0,0.0],[70363.63,7,409.090881],[70636.36,1,0.0],[70909.0859,3,0.0],[70909.0859,6,409.090881],[71045.45,0,0.0],[71181.81,3,0.0],[71454.55,3,0.0],[71454.55,7,409.090881],[71590.91,0,0.0],[71727.27,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[72000.0,5,409.090881],[72272.73,1,0.0],[72409.0859,3,0.0],[72545.45,0,136.363632],[72545.45,7,409.090881],[72818.18,1,0.0],[73090.91,2,0.0],[73181.81,0,0.0],[73272.73,3,0.0],[73363.63,0,0.0],[73545.45,0,0.0],[73636.36,3,0.0],[73727.27,0,0.0],[73818.18,3,0.0],[73909.0859,1,0.0],[74090.91,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[74181.81,0,136.363632],[74181.81,5,409.090881],[74454.55,2,0.0],[74590.91,3,0.0],[74727.27,0,0.0],[74727.27,7,409.090881],[74863.63,1,0.0],[75000.0,3,0.0],[75136.36,1,0.0],[75272.73,3,0.0],[75272.73,6,409.090881],[75409.0859,0,0.0],[75545.45,3,0.0],[75681.81,1,0.0],[75818.18,3,0.0],[75818.18,7,409.090881],[75954.55,0,0.0],[76090.91,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[76363.63,0,0.0],[76363.63,5,409.090881],[76636.36,1,0.0],[76772.73,3,0.0],[76909.0859,0,136.363632],[76909.0859,7,409.090881],[77181.81,1,0.0],[77454.55,2,0.0],[77454.55,6,409.090881],[77590.91,3,0.0],[77727.27,0,0.0],[77863.63,0,0.0],[78000.0,3,0.0],[78000.0,7,0.0],[78136.36,0,0.0],[78136.36,4,0.0],[78272.73,0,0.0],[78272.73,4,0.0],[78409.0859,1,0.0],[78409.0859,5,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[78545.45,0,136.363632],[78818.18,2,0.0],[78954.55,3,0.0],[79090.91,0,0.0],[79227.27,1,0.0],[79363.63,3,0.0],[79500.0,1,0.0],[79636.36,3,0.0],[79772.73,0,0.0],[79909.0859,3,0.0],[80045.45,1,0.0],[80181.81,3,0.0],[80318.18,0,0.0],[80454.55,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[80727.27,0,0.0],[81000.0,1,0.0],[81136.36,3,0.0],[81272.73,0,136.363632],[81545.45,1,0.0],[81818.18,2,0.0],[81954.54,3,0.0],[82090.91,0,0.0],[82227.27,0,0.0],[82363.63,3,0.0],[82500.0,0,0.0],[82636.36,0,0.0],[82772.73,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[82909.0859,7,1090.909],[83181.81,2,0.0],[83454.54,3,0.0],[83727.27,2,0.0],[83863.63,3,0.0],[84136.36,0,0.0],[84409.0859,2,0.0],[84545.45,3,0.0],[84818.18,0,0.0],[84954.54,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[85363.63,2,0.0],[85636.36,3,0.0],[85909.0859,2,0.0],[86045.45,3,0.0],[86318.18,0,0.0],[86590.91,2,0.0],[86727.27,3,0.0],[86863.63,0,0.0],[87000.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[87272.73,2,545.4545]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]}]},"generatedBy":"SNIFF ver.6"} \ No newline at end of file +{"song":{"song":"Satin Panties","bpm":110.0,"needsVoices":true,"player1":"bf-car","player2":"mom-car","speed":1.8,"notes":[{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[0.0,0,0.0],[272.727264,0,0.0],[545.4545,0,0.0],[818.181763,0,0.0],[954.5454,0,0.0],[1227.27271,0,0.0],[1363.63635,0,0.0],[1636.36353,0,0.0],[1909.09082,0,0.0],[2045.45447,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[2181.818,3,0.0],[2454.54541,3,0.0],[2727.27271,3,0.0],[3000.0,3,0.0],[3136.36353,3,0.0],[3409.09082,3,0.0],[3545.45435,3,0.0],[3818.18164,3,0.0],[4090.909,3,0.0],[4227.27246,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[4636.36328,2,0.0],[4909.091,3,0.0],[5181.818,2,0.0],[5318.18164,3,0.0],[5590.90869,0,0.0],[5863.636,2,0.0],[6000.0,3,0.0],[6272.727,0,0.0],[6409.091,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[6818.18164,2,0.0],[7090.90869,3,0.0],[7363.636,2,0.0],[7500.0,3,0.0],[7772.727,0,0.0],[8045.454,2,0.0],[8181.818,3,0.0],[8318.182,0,0.0],[8454.545,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[8727.272,6,545.4545],[9000.0,2,0.0],[9272.727,3,0.0],[9545.454,2,0.0],[9681.818,3,0.0],[9954.545,0,0.0],[10227.2725,2,0.0],[10363.6357,3,0.0],[10636.3633,0,0.0],[10772.7266,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[11181.8174,2,0.0],[11454.5449,3,0.0],[11727.2725,2,0.0],[11863.6357,3,0.0],[12136.3633,0,0.0],[12409.0908,2,0.0],[12545.4541,3,0.0],[12681.8174,0,0.0],[12818.1816,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[13090.9082,6,545.4545],[13363.6357,1,0.0],[13500.0,1,0.0],[13636.3633,0,0.0],[13909.0908,0,0.0],[14045.4541,3,0.0],[14181.8174,2,272.727264],[14590.9082,3,0.0],[14727.2725,0,0.0],[15000.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[15272.7266,3,272.727264],[15681.8174,0,0.0],[15954.5449,0,0.0],[16090.9082,0,0.0],[16227.2725,0,0.0],[16363.6357,2,272.727264],[16772.7266,3,0.0],[16909.09,0,0.0],[17045.4531,1,0.0],[17181.8184,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[17454.5449,6,545.4545],[17727.2715,1,0.0],[17863.6367,1,0.0],[18000.0,0,0.0],[18272.7266,0,0.0],[18409.09,3,0.0],[18545.4531,2,272.727264],[18954.5449,3,0.0],[19090.9082,0,0.0],[19363.6367,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[19636.3633,3,272.727264],[20045.4531,0,0.0],[20318.1816,0,0.0],[20454.5449,0,0.0],[20590.9082,0,0.0],[20727.2715,2,272.727264],[21136.3633,3,0.0],[21272.7266,0,0.0],[21409.09,1,0.0],[21545.4531,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[21818.1816,6,409.090881],[21818.1816,2,409.090881],[22363.6348,7,0.0],[22363.6348,3,0.0],[22500.0,6,0.0],[22500.0,2,0.0],[22636.3633,7,0.0],[22636.3633,3,0.0],[22772.7266,6,0.0],[22772.7266,2,0.0],[22909.09,4,0.0],[22909.09,0,0.0],[23045.4531,5,0.0],[23045.4531,1,0.0],[23181.8184,4,0.0],[23181.8184,0,0.0],[23318.1816,5,0.0],[23318.1816,1,0.0],[23454.5449,4,0.0],[23454.5449,0,0.0],[23590.9082,7,0.0],[23590.9082,3,0.0],[23727.2715,4,0.0],[23727.2715,0,0.0],[23863.6348,7,0.0],[23863.6348,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24000.0,1,409.090881],[24000.0,5,409.090881],[24545.4531,4,0.0],[24545.4531,0,0.0],[24681.8184,7,0.0],[24681.8184,3,0.0],[24818.1816,4,0.0],[24818.1816,0,0.0],[24954.5449,7,0.0],[24954.5449,3,0.0],[25090.9082,6,136.363632],[25090.9082,2,136.363632],[25363.6348,7,0.0],[25363.6348,3,0.0],[25636.3633,7,0.0],[25636.3633,3,0.0],[25909.09,5,0.0],[25909.09,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[26181.8164,4,409.090881],[26181.8164,3,409.090881],[26727.2715,0,409.090881],[26727.2715,7,409.090881],[27272.7266,6,0.0],[27272.7266,2,0.0],[27545.4531,6,0.0],[27545.4531,2,0.0],[27681.8164,6,0.0],[27681.8164,2,0.0],[27818.1816,7,409.090881],[27818.1816,0,409.090881]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[28363.6348,5,409.090881],[28363.6348,1,409.090881],[28909.09,7,409.090881],[28909.09,3,409.090881],[29454.5449,6,409.090881],[29454.5449,2,409.090881],[30000.0,4,0.0],[30000.0,0,0.0],[30272.7266,7,409.090881],[30272.7266,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[30545.4531,5,545.4545],[30818.1816,2,0.0],[30954.5449,3,0.0],[31090.9082,0,0.0],[31363.6348,1,0.0],[31636.3633,3,0.0],[31772.7266,0,0.0],[31909.09,3,0.0],[32181.8164,3,0.0],[32318.1816,0,0.0],[32454.5449,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[33000.0,1,0.0],[33136.3633,3,0.0],[33272.7266,0,136.363632],[33545.4531,1,0.0],[33818.18,2,0.0],[33954.543,3,0.0],[34090.9063,0,0.0],[34227.2734,0,0.0],[34363.6367,3,0.0],[34500.0,0,0.0],[34636.3633,0,0.0],[34772.7266,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[34909.09,7,0.0],[35045.4531,6,0.0],[35181.8164,2,0.0],[35181.8164,7,0.0],[35318.18,3,0.0],[35454.543,0,0.0],[35727.2734,1,0.0],[36000.0,3,0.0],[36136.3633,0,0.0],[36272.7266,3,0.0],[36545.4531,3,0.0],[36681.8164,0,0.0],[36818.18,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[37363.6367,1,0.0],[37500.0,3,0.0],[37636.3633,0,136.363632],[37909.09,1,0.0],[38181.8164,2,0.0],[38318.18,3,0.0],[38454.543,0,0.0],[38590.9063,0,0.0],[38727.2734,7,0.0],[38727.2734,3,0.0],[38863.6367,4,0.0],[38863.6367,0,0.0],[39000.0,5,0.0],[39000.0,0,0.0],[39136.3633,7,0.0],[39136.3633,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[39272.7266,2,136.363632],[39272.7266,7,0.0],[39409.09,6,0.0],[39545.4531,7,0.0],[39545.4531,2,0.0],[39681.8164,3,0.0],[39818.18,0,0.0],[39954.543,1,0.0],[40090.9063,3,0.0],[40227.2734,1,0.0],[40363.6367,3,0.0],[40500.0,0,0.0],[40636.3633,3,0.0],[40772.7266,1,0.0],[40909.09,3,0.0],[41045.4531,0,0.0],[41181.8164,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[41454.543,0,0.0],[41727.27,1,0.0],[41863.6367,3,0.0],[42000.0,0,136.363632],[42272.7266,1,0.0],[42545.4531,2,0.0],[42681.8164,3,0.0],[42818.18,0,0.0],[42954.543,0,0.0],[43090.9063,7,0.0],[43090.9063,3,0.0],[43227.27,4,0.0],[43227.27,0,0.0],[43363.6367,5,0.0],[43363.6367,0,0.0],[43500.0,7,0.0],[43500.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[43636.3633,2,136.363632],[43909.09,2,0.0],[44045.4531,3,0.0],[44181.8164,0,0.0],[44318.18,1,0.0],[44454.543,3,0.0],[44590.9063,1,0.0],[44727.27,3,0.0],[44863.6367,0,0.0],[45000.0,3,0.0],[45136.3633,1,0.0],[45272.7266,3,0.0],[45409.09,0,0.0],[45545.4531,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[45818.18,0,0.0],[46090.9063,1,0.0],[46227.27,3,0.0],[46363.6367,0,136.363632],[46636.3633,1,0.0],[46909.09,2,0.0],[47045.4531,3,0.0],[47181.8164,0,0.0],[47318.18,0,0.0],[47454.543,3,0.0],[47590.9063,0,0.0],[47727.27,0,0.0],[47863.6367,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[48272.7266,2,0.0],[48409.09,3,0.0],[48545.4531,0,0.0],[48681.8164,3,0.0],[48818.18,0,0.0],[48954.543,2,0.0],[49090.9063,3,0.0],[49363.6367,3,0.0],[49636.3633,1,0.0],[49909.09,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[50454.543,3,0.0],[50590.9063,1,0.0],[50727.27,0,0.0],[50863.6367,3,0.0],[51000.0,2,0.0],[51272.7266,0,0.0],[51545.4531,2,0.0],[51818.18,0,0.0],[52090.9063,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[52363.6328,6,545.4545],[52636.3633,2,0.0],[52772.7266,3,0.0],[52909.09,0,0.0],[53045.4531,3,0.0],[53181.8164,0,0.0],[53318.18,2,0.0],[53454.543,3,0.0],[53727.27,3,0.0],[54000.0,1,0.0],[54272.7266,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[54818.18,3,0.0],[54954.543,1,0.0],[55090.9063,0,0.0],[55227.27,3,0.0],[55363.6328,2,0.0],[55636.3633,0,0.0],[55909.09,2,0.0],[56181.8164,0,0.0],[56454.543,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[56727.27,6,409.090881],[56727.27,2,409.090881],[57272.7266,3,0.0],[57272.7266,7,0.0],[57409.09,2,0.0],[57409.09,6,0.0],[57545.4531,3,0.0],[57545.4531,7,0.0],[57681.8164,2,0.0],[57681.8164,6,0.0],[57818.18,0,0.0],[57818.18,4,0.0],[57954.543,1,0.0],[57954.543,5,0.0],[58090.9063,0,0.0],[58090.9063,4,0.0],[58227.27,1,0.0],[58227.27,5,0.0],[58363.6328,0,0.0],[58363.6328,4,0.0],[58500.0,3,0.0],[58500.0,7,0.0],[58636.3633,0,0.0],[58636.3633,4,0.0],[58772.7266,3,0.0],[58772.7266,7,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[58909.09,1,409.090881],[58909.09,5,409.090881],[59454.543,4,0.0],[59454.543,0,0.0],[59590.9063,7,0.0],[59590.9063,3,0.0],[59727.27,4,0.0],[59727.27,0,0.0],[59863.6328,7,0.0],[59863.6328,3,0.0],[60000.0,6,136.363632],[60000.0,2,136.363632],[60272.7266,7,0.0],[60272.7266,3,0.0],[60545.4531,7,0.0],[60545.4531,3,0.0],[60818.18,5,0.0],[60818.18,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[61090.9063,0,409.090881],[61090.9063,7,409.090881],[61636.3633,4,409.090881],[61636.3633,3,409.090881],[62181.8164,2,0.0],[62181.8164,6,0.0],[62454.543,2,0.0],[62454.543,6,0.0],[62590.9063,2,0.0],[62590.9063,6,0.0],[62727.27,3,409.090881],[62727.27,4,409.090881]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[63272.7266,5,409.090881],[63272.7266,1,409.090881],[63818.18,7,409.090881],[63818.18,3,409.090881],[64363.6328,6,409.090881],[64363.6328,2,409.090881],[64909.09,4,0.0],[64909.09,0,0.0],[65181.8164,7,0.0],[65181.8164,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[65454.543,5,545.4545],[65454.543,2,0.0],[65727.27,2,0.0],[65863.63,3,0.0],[66000.0,0,0.0],[66272.73,1,0.0],[66545.45,3,0.0],[66681.81,0,0.0],[66818.18,3,0.0],[67090.91,3,0.0],[67227.27,0,0.0],[67363.63,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[67909.0859,1,0.0],[68045.45,3,0.0],[68181.81,0,136.363632],[68454.55,1,0.0],[68727.27,2,0.0],[68818.18,0,0.0],[68909.0859,3,0.0],[69000.0,0,0.0],[69181.81,0,0.0],[69272.73,3,0.0],[69363.63,0,0.0],[69454.55,3,0.0],[69545.45,1,0.0],[69727.27,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[69818.18,5,409.090881],[70090.91,2,0.0],[70227.27,3,0.0],[70363.63,0,0.0],[70363.63,7,409.090881],[70636.36,1,0.0],[70909.0859,3,0.0],[70909.0859,6,409.090881],[71045.45,0,0.0],[71181.81,3,0.0],[71454.55,3,0.0],[71454.55,7,409.090881],[71590.91,0,0.0],[71727.27,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[72000.0,5,409.090881],[72272.73,1,0.0],[72409.0859,3,0.0],[72545.45,0,136.363632],[72545.45,7,409.090881],[72818.18,1,0.0],[73090.91,2,0.0],[73181.81,0,0.0],[73272.73,3,0.0],[73363.63,0,0.0],[73545.45,0,0.0],[73636.36,3,0.0],[73727.27,0,0.0],[73818.18,3,0.0],[73909.0859,1,0.0],[74090.91,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[74181.81,0,136.363632],[74181.81,5,409.090881],[74454.55,2,0.0],[74590.91,3,0.0],[74727.27,0,0.0],[74727.27,7,409.090881],[74863.63,1,0.0],[75000.0,3,0.0],[75136.36,1,0.0],[75272.73,3,0.0],[75272.73,6,409.090881],[75409.0859,0,0.0],[75545.45,3,0.0],[75681.81,1,0.0],[75818.18,3,0.0],[75818.18,7,409.090881],[75954.55,0,0.0],[76090.91,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[76363.63,0,0.0],[76363.63,5,409.090881],[76636.36,1,0.0],[76772.73,3,0.0],[76909.0859,0,136.363632],[76909.0859,7,409.090881],[77181.81,1,0.0],[77454.55,2,0.0],[77454.55,6,409.090881],[77590.91,3,0.0],[77727.27,0,0.0],[77863.63,0,0.0],[78000.0,3,0.0],[78000.0,7,0.0],[78136.36,0,0.0],[78136.36,4,0.0],[78272.73,0,0.0],[78272.73,4,0.0],[78409.0859,1,0.0],[78409.0859,5,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[78545.45,0,136.363632],[78818.18,2,0.0],[78954.55,3,0.0],[79090.91,0,0.0],[79227.27,1,0.0],[79363.63,3,0.0],[79500.0,1,0.0],[79636.36,3,0.0],[79772.73,0,0.0],[79909.0859,3,0.0],[80045.45,1,0.0],[80181.81,3,0.0],[80318.18,0,0.0],[80454.55,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[80727.27,0,0.0],[81000.0,1,0.0],[81136.36,3,0.0],[81272.73,0,136.363632],[81545.45,1,0.0],[81818.18,2,0.0],[81954.54,3,0.0],[82090.91,0,0.0],[82227.27,0,0.0],[82363.63,3,0.0],[82500.0,0,0.0],[82636.36,0,0.0],[82772.73,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[82909.0859,7,1090.909],[83181.81,2,0.0],[83454.54,3,0.0],[83727.27,2,0.0],[83863.63,3,0.0],[84136.36,0,0.0],[84409.0859,2,0.0],[84545.45,3,0.0],[84818.18,0,0.0],[84954.54,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[85363.63,2,0.0],[85636.36,3,0.0],[85909.0859,2,0.0],[86045.45,3,0.0],[86318.18,0,0.0],[86590.91,2,0.0],[86727.27,3,0.0],[86863.63,0,0.0],[87000.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[87272.73,2,545.4545]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]}]},"generatedBy":"SNIFF ver.6"} \ No newline at end of file diff --git a/assets/preload/data/satin-panties/satin-panties.json b/assets/preload/data/satin-panties/satin-panties.json index c76cd4a56..d9650f31c 100644 --- a/assets/preload/data/satin-panties/satin-panties.json +++ b/assets/preload/data/satin-panties/satin-panties.json @@ -1 +1 @@ -{"song":{"song":"Satin-Panties","bpm":110.0,"needsVoices":true,"player1":"bf-car","player2":"mom-car","speed":1.6,"notes":[{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[0.0,0,0.0],[272.727264,0,0.0],[545.4545,0,0.0],[954.5454,0,0.0],[1363.63635,0,0.0],[1636.36353,0,0.0],[1909.09082,0,0.0],[2045.45447,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[2181.818,3,0.0],[2454.54541,3,0.0],[2727.27271,3,0.0],[3136.36353,3,0.0],[3545.45435,3,0.0],[3818.18164,3,0.0],[4090.909,3,0.0],[4227.27246,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[4636.36328,2,0.0],[4909.091,3,0.0],[5181.818,2,0.0],[5318.18164,3,0.0],[5863.636,2,0.0],[6000.0,3,0.0],[6272.727,0,0.0],[6409.091,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[6818.18164,2,0.0],[7090.90869,3,0.0],[7363.636,2,0.0],[7500.0,3,0.0],[7772.727,0,0.0],[8045.454,2,0.0],[8181.818,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[8727.272,6,545.4545],[9000.0,2,0.0],[9272.727,3,0.0],[9545.454,2,0.0],[9681.818,3,0.0],[10227.2725,2,0.0],[10363.6357,3,0.0],[10636.3633,0,0.0],[10772.7266,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[11181.8174,2,0.0],[11454.5449,3,0.0],[11727.2725,2,0.0],[11863.6357,3,0.0],[12136.3633,0,0.0],[12409.0908,2,0.0],[12545.4541,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[13090.9082,6,545.4545],[13363.6357,1,0.0],[13636.3633,0,0.0],[13909.0908,0,0.0],[14181.8174,2,272.727264],[14590.9082,3,0.0],[14727.2725,0,0.0],[15000.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[15272.7266,3,272.727264],[15681.8174,0,0.0],[15954.5449,0,0.0],[16090.9082,0,0.0],[16363.6357,2,272.727264],[16772.7266,3,0.0],[16909.09,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[17454.5449,6,545.4545],[17727.2715,1,0.0],[18000.0,0,0.0],[18272.7266,0,0.0],[18545.4531,2,272.727264],[18954.5449,3,0.0],[19090.9082,0,0.0],[19363.6367,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[19636.3633,3,272.727264],[20045.4531,0,0.0],[20318.1816,0,0.0],[20454.5449,0,0.0],[20727.2715,2,272.727264],[21136.3633,3,0.0],[21272.7266,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[21818.1816,6,409.090881],[21818.1816,2,409.090881],[22363.6348,7,0.0],[22363.6348,3,0.0],[22636.3633,7,0.0],[22636.3633,3,0.0],[22909.09,4,0.0],[22909.09,0,0.0],[23181.8184,4,0.0],[23181.8184,0,0.0],[23318.1816,5,0.0],[23318.1816,1,0.0],[23454.5449,4,0.0],[23454.5449,0,0.0],[23727.2715,4,0.0],[23727.2715,0,0.0],[23863.6348,7,0.0],[23863.6348,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24000.0,1,409.090881],[24000.0,5,409.090881],[24545.4531,4,0.0],[24545.4531,0,0.0],[24818.1816,4,0.0],[24818.1816,0,0.0],[24954.5449,7,0.0],[24954.5449,3,0.0],[25090.9082,6,136.363632],[25090.9082,2,136.363632],[25363.6348,7,0.0],[25363.6348,3,0.0],[25636.3633,7,0.0],[25636.3633,3,0.0],[25909.09,5,0.0],[25909.09,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[26181.8164,4,409.090881],[26181.8164,3,409.090881],[26727.2715,0,409.090881],[26727.2715,7,409.090881],[27272.7266,6,0.0],[27272.7266,2,0.0],[27545.4531,6,0.0],[27545.4531,2,0.0],[27818.1816,7,409.090881],[27818.1816,0,409.090881]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[28363.6348,5,409.090881],[28363.6348,1,409.090881],[28909.09,7,409.090881],[28909.09,3,409.090881],[29454.5449,6,409.090881],[29454.5449,2,409.090881],[30000.0,4,0.0],[30000.0,0,0.0],[30272.7266,7,409.090881],[30272.7266,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[30545.4531,5,545.4545],[30818.1816,2,0.0],[31090.9082,0,0.0],[31363.6348,1,0.0],[31636.3633,3,0.0],[31772.7266,0,0.0],[31909.09,3,0.0],[32181.8164,3,0.0],[32454.5449,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[33000.0,1,0.0],[33136.3633,3,0.0],[33272.7266,0,136.363632],[33545.4531,1,0.0],[33818.18,2,0.0],[34090.9063,0,0.0],[34363.6367,3,0.0],[34636.3633,0,0.0],[34772.7266,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[34909.09,7,0.0],[35181.8164,7,0.0],[35181.8164,2,0.0],[35454.543,0,0.0],[35727.2734,1,0.0],[36000.0,3,0.0],[36136.3633,0,0.0],[36272.7266,3,0.0],[36545.4531,3,0.0],[36818.18,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[37363.6367,1,0.0],[37500.0,3,0.0],[37636.3633,0,136.363632],[37909.09,1,0.0],[38181.8164,2,0.0],[38454.543,0,0.0],[38727.2734,3,0.0],[38727.2734,7,0.0],[39000.0,5,0.0],[39000.0,0,0.0],[39136.3633,7,0.0],[39136.3633,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[39272.7266,2,0.0],[39272.7266,7,0.0],[39545.4531,2,0.0],[39545.4531,7,0.0],[39818.18,0,0.0],[39954.543,1,0.0],[40090.9063,3,0.0],[40363.6367,3,0.0],[40500.0,0,0.0],[40636.3633,3,0.0],[40909.09,3,0.0],[41181.8164,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[41454.543,0,0.0],[41727.27,1,0.0],[41863.6367,3,0.0],[42000.0,0,136.363632],[42272.7266,1,0.0],[42545.4531,2,0.0],[42818.18,0,0.0],[43090.9063,7,0.0],[43090.9063,3,0.0],[43363.6367,5,0.0],[43363.6367,0,0.0],[43500.0,7,0.0],[43500.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[43636.3633,2,0.0],[43909.09,2,0.0],[44181.8164,0,0.0],[44318.18,1,0.0],[44454.543,3,0.0],[44727.27,3,0.0],[44863.6367,0,0.0],[45000.0,3,0.0],[45272.7266,3,0.0],[45545.4531,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[45818.18,0,0.0],[46090.9063,1,0.0],[46227.27,3,0.0],[46363.6367,0,136.363632],[46636.3633,1,0.0],[46909.09,2,0.0],[47181.8164,0,0.0],[47454.543,3,0.0],[47727.27,0,0.0],[47863.6367,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[48272.7266,2,0.0],[48409.09,3,0.0],[48545.4531,0,0.0],[48818.18,0,0.0],[49090.9063,3,0.0],[49363.6367,3,0.0],[49636.3633,1,0.0],[49909.09,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[50454.543,3,0.0],[50590.9063,1,0.0],[50727.27,0,0.0],[51000.0,2,0.0],[51272.7266,0,0.0],[51545.4531,2,0.0],[51818.18,0,0.0],[52090.9063,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[52363.6328,6,545.4545],[52636.3633,2,0.0],[52772.7266,3,0.0],[52909.09,0,0.0],[53181.8164,0,0.0],[53454.543,3,0.0],[53727.27,3,0.0],[54000.0,1,0.0],[54272.7266,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[54818.18,3,0.0],[54954.543,1,0.0],[55090.9063,0,0.0],[55363.6328,2,0.0],[55636.3633,0,0.0],[55909.09,2,0.0],[56181.8164,0,0.0],[56454.543,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[56727.27,2,409.090881],[56727.27,6,409.090881],[57272.7266,3,0.0],[57272.7266,7,0.0],[57545.4531,3,0.0],[57545.4531,7,0.0],[57818.18,0,0.0],[57818.18,4,0.0],[58090.9063,0,0.0],[58090.9063,4,0.0],[58227.27,1,0.0],[58227.27,5,0.0],[58363.6328,0,0.0],[58363.6328,4,0.0],[58636.3633,0,0.0],[58636.3633,4,0.0],[58772.7266,3,0.0],[58772.7266,7,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[58909.09,1,409.090881],[58909.09,5,409.090881],[59454.543,4,0.0],[59454.543,0,0.0],[59727.27,4,0.0],[59727.27,0,0.0],[59863.6328,7,0.0],[59863.6328,3,0.0],[60000.0,6,136.363632],[60000.0,2,136.363632],[60272.7266,7,0.0],[60272.7266,3,0.0],[60545.4531,7,0.0],[60545.4531,3,0.0],[60818.18,5,0.0],[60818.18,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[61090.9063,0,409.090881],[61090.9063,7,409.090881],[61636.3633,4,409.090881],[61636.3633,3,409.090881],[62181.8164,2,0.0],[62181.8164,6,0.0],[62454.543,2,0.0],[62454.543,6,0.0],[62727.27,3,409.090881],[62727.27,4,409.090881]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[63272.7266,5,409.090881],[63272.7266,1,409.090881],[63818.18,7,409.090881],[63818.18,3,409.090881],[64363.6328,6,409.090881],[64363.6328,2,409.090881],[64909.09,4,0.0],[64909.09,0,0.0],[65181.8164,7,0.0],[65181.8164,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[65454.543,5,545.4545],[65727.27,2,0.0],[66000.0,0,0.0],[66272.73,1,0.0],[66545.45,3,0.0],[66681.81,0,0.0],[66818.18,3,0.0],[67090.91,3,0.0],[67363.63,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[67909.0859,1,0.0],[68045.45,3,0.0],[68181.81,0,136.363632],[68454.55,1,0.0],[68727.27,3,0.0],[69000.0,0,0.0],[69181.81,0,0.0],[69272.73,3,0.0],[69545.45,1,0.0],[69727.27,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[69818.18,5,409.090881],[70090.91,2,0.0],[70363.63,0,0.0],[70363.63,7,409.090881],[70636.36,1,0.0],[70909.0859,3,0.0],[70909.0859,6,409.090881],[71045.45,0,0.0],[71181.81,3,0.0],[71454.55,3,0.0],[71454.55,7,409.090881],[71727.27,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[72000.0,5,409.090881],[72272.73,1,0.0],[72409.0859,3,0.0],[72545.45,0,136.363632],[72545.45,7,409.090881],[72818.18,1,0.0],[73090.91,3,0.0],[73363.63,0,0.0],[73545.45,0,0.0],[73636.36,3,0.0],[73909.0859,1,0.0],[74090.91,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[74181.81,2,0.0],[74181.81,5,409.090881],[74454.55,2,0.0],[74727.27,0,0.0],[74727.27,7,409.090881],[74863.63,1,0.0],[75000.0,3,0.0],[75272.73,3,0.0],[75272.73,6,409.090881],[75409.0859,0,0.0],[75545.45,3,0.0],[75818.18,3,0.0],[75818.18,7,409.090881],[76090.91,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[76363.63,0,0.0],[76363.63,5,409.090881],[76636.36,1,0.0],[76772.73,3,0.0],[76909.0859,0,136.363632],[76909.0859,7,409.090881],[77181.81,1,0.0],[77454.55,2,0.0],[77454.55,6,409.090881],[77727.27,0,0.0],[78000.0,3,0.0],[78000.0,7,0.0],[78136.36,4,0.0],[78272.73,0,0.0],[78409.0859,1,0.0],[78409.0859,5,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[78545.45,2,0.0],[78818.18,2,0.0],[79090.91,0,0.0],[79227.27,1,0.0],[79363.63,3,0.0],[79636.36,3,0.0],[79772.73,0,0.0],[79909.0859,3,0.0],[80181.81,3,0.0],[80454.55,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[80727.27,0,0.0],[81000.0,1,0.0],[81136.36,3,0.0],[81272.73,0,136.363632],[81545.45,1,0.0],[81818.18,2,0.0],[82090.91,0,0.0],[82363.63,3,0.0],[82636.36,0,0.0],[82772.73,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[82909.0859,7,1090.909],[83181.81,2,0.0],[83454.54,3,0.0],[83727.27,2,0.0],[83863.63,3,0.0],[84409.0859,2,0.0],[84545.45,3,0.0],[84818.18,0,0.0],[84954.54,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[85363.63,2,0.0],[85636.36,3,0.0],[85909.0859,2,0.0],[86045.45,3,0.0],[86590.91,2,0.0],[86727.27,3,0.0],[87000.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[87272.73,2,545.4545]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]}]},"generatedBy":"SNIFF ver.6"} \ No newline at end of file +{"song":{"song":"Satin Panties","bpm":110.0,"needsVoices":true,"player1":"bf-car","player2":"mom-car","speed":1.6,"notes":[{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[0.0,0,0.0],[272.727264,0,0.0],[545.4545,0,0.0],[954.5454,0,0.0],[1363.63635,0,0.0],[1636.36353,0,0.0],[1909.09082,0,0.0],[2045.45447,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[2181.818,3,0.0],[2454.54541,3,0.0],[2727.27271,3,0.0],[3136.36353,3,0.0],[3545.45435,3,0.0],[3818.18164,3,0.0],[4090.909,3,0.0],[4227.27246,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[4636.36328,2,0.0],[4909.091,3,0.0],[5181.818,2,0.0],[5318.18164,3,0.0],[5863.636,2,0.0],[6000.0,3,0.0],[6272.727,0,0.0],[6409.091,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[6818.18164,2,0.0],[7090.90869,3,0.0],[7363.636,2,0.0],[7500.0,3,0.0],[7772.727,0,0.0],[8045.454,2,0.0],[8181.818,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[8727.272,6,545.4545],[9000.0,2,0.0],[9272.727,3,0.0],[9545.454,2,0.0],[9681.818,3,0.0],[10227.2725,2,0.0],[10363.6357,3,0.0],[10636.3633,0,0.0],[10772.7266,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[11181.8174,2,0.0],[11454.5449,3,0.0],[11727.2725,2,0.0],[11863.6357,3,0.0],[12136.3633,0,0.0],[12409.0908,2,0.0],[12545.4541,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[13090.9082,6,545.4545],[13363.6357,1,0.0],[13636.3633,0,0.0],[13909.0908,0,0.0],[14181.8174,2,272.727264],[14590.9082,3,0.0],[14727.2725,0,0.0],[15000.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[15272.7266,3,272.727264],[15681.8174,0,0.0],[15954.5449,0,0.0],[16090.9082,0,0.0],[16363.6357,2,272.727264],[16772.7266,3,0.0],[16909.09,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[17454.5449,6,545.4545],[17727.2715,1,0.0],[18000.0,0,0.0],[18272.7266,0,0.0],[18545.4531,2,272.727264],[18954.5449,3,0.0],[19090.9082,0,0.0],[19363.6367,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[19636.3633,3,272.727264],[20045.4531,0,0.0],[20318.1816,0,0.0],[20454.5449,0,0.0],[20727.2715,2,272.727264],[21136.3633,3,0.0],[21272.7266,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[21818.1816,6,409.090881],[21818.1816,2,409.090881],[22363.6348,7,0.0],[22363.6348,3,0.0],[22636.3633,7,0.0],[22636.3633,3,0.0],[22909.09,4,0.0],[22909.09,0,0.0],[23181.8184,4,0.0],[23181.8184,0,0.0],[23318.1816,5,0.0],[23318.1816,1,0.0],[23454.5449,4,0.0],[23454.5449,0,0.0],[23727.2715,4,0.0],[23727.2715,0,0.0],[23863.6348,7,0.0],[23863.6348,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24000.0,1,409.090881],[24000.0,5,409.090881],[24545.4531,4,0.0],[24545.4531,0,0.0],[24818.1816,4,0.0],[24818.1816,0,0.0],[24954.5449,7,0.0],[24954.5449,3,0.0],[25090.9082,6,136.363632],[25090.9082,2,136.363632],[25363.6348,7,0.0],[25363.6348,3,0.0],[25636.3633,7,0.0],[25636.3633,3,0.0],[25909.09,5,0.0],[25909.09,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[26181.8164,4,409.090881],[26181.8164,3,409.090881],[26727.2715,0,409.090881],[26727.2715,7,409.090881],[27272.7266,6,0.0],[27272.7266,2,0.0],[27545.4531,6,0.0],[27545.4531,2,0.0],[27818.1816,7,409.090881],[27818.1816,0,409.090881]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[28363.6348,5,409.090881],[28363.6348,1,409.090881],[28909.09,7,409.090881],[28909.09,3,409.090881],[29454.5449,6,409.090881],[29454.5449,2,409.090881],[30000.0,4,0.0],[30000.0,0,0.0],[30272.7266,7,409.090881],[30272.7266,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[30545.4531,5,545.4545],[30818.1816,2,0.0],[31090.9082,0,0.0],[31363.6348,1,0.0],[31636.3633,3,0.0],[31772.7266,0,0.0],[31909.09,3,0.0],[32181.8164,3,0.0],[32454.5449,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[33000.0,1,0.0],[33136.3633,3,0.0],[33272.7266,0,136.363632],[33545.4531,1,0.0],[33818.18,2,0.0],[34090.9063,0,0.0],[34363.6367,3,0.0],[34636.3633,0,0.0],[34772.7266,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[34909.09,7,0.0],[35181.8164,7,0.0],[35181.8164,2,0.0],[35454.543,0,0.0],[35727.2734,1,0.0],[36000.0,3,0.0],[36136.3633,0,0.0],[36272.7266,3,0.0],[36545.4531,3,0.0],[36818.18,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[37363.6367,1,0.0],[37500.0,3,0.0],[37636.3633,0,136.363632],[37909.09,1,0.0],[38181.8164,2,0.0],[38454.543,0,0.0],[38727.2734,3,0.0],[38727.2734,7,0.0],[39000.0,5,0.0],[39000.0,0,0.0],[39136.3633,7,0.0],[39136.3633,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[39272.7266,2,0.0],[39272.7266,7,0.0],[39545.4531,2,0.0],[39545.4531,7,0.0],[39818.18,0,0.0],[39954.543,1,0.0],[40090.9063,3,0.0],[40363.6367,3,0.0],[40500.0,0,0.0],[40636.3633,3,0.0],[40909.09,3,0.0],[41181.8164,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[41454.543,0,0.0],[41727.27,1,0.0],[41863.6367,3,0.0],[42000.0,0,136.363632],[42272.7266,1,0.0],[42545.4531,2,0.0],[42818.18,0,0.0],[43090.9063,7,0.0],[43090.9063,3,0.0],[43363.6367,5,0.0],[43363.6367,0,0.0],[43500.0,7,0.0],[43500.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[43636.3633,2,0.0],[43909.09,2,0.0],[44181.8164,0,0.0],[44318.18,1,0.0],[44454.543,3,0.0],[44727.27,3,0.0],[44863.6367,0,0.0],[45000.0,3,0.0],[45272.7266,3,0.0],[45545.4531,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[45818.18,0,0.0],[46090.9063,1,0.0],[46227.27,3,0.0],[46363.6367,0,136.363632],[46636.3633,1,0.0],[46909.09,2,0.0],[47181.8164,0,0.0],[47454.543,3,0.0],[47727.27,0,0.0],[47863.6367,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[48272.7266,2,0.0],[48409.09,3,0.0],[48545.4531,0,0.0],[48818.18,0,0.0],[49090.9063,3,0.0],[49363.6367,3,0.0],[49636.3633,1,0.0],[49909.09,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[50454.543,3,0.0],[50590.9063,1,0.0],[50727.27,0,0.0],[51000.0,2,0.0],[51272.7266,0,0.0],[51545.4531,2,0.0],[51818.18,0,0.0],[52090.9063,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[52363.6328,6,545.4545],[52636.3633,2,0.0],[52772.7266,3,0.0],[52909.09,0,0.0],[53181.8164,0,0.0],[53454.543,3,0.0],[53727.27,3,0.0],[54000.0,1,0.0],[54272.7266,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[54818.18,3,0.0],[54954.543,1,0.0],[55090.9063,0,0.0],[55363.6328,2,0.0],[55636.3633,0,0.0],[55909.09,2,0.0],[56181.8164,0,0.0],[56454.543,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[56727.27,2,409.090881],[56727.27,6,409.090881],[57272.7266,3,0.0],[57272.7266,7,0.0],[57545.4531,3,0.0],[57545.4531,7,0.0],[57818.18,0,0.0],[57818.18,4,0.0],[58090.9063,0,0.0],[58090.9063,4,0.0],[58227.27,1,0.0],[58227.27,5,0.0],[58363.6328,0,0.0],[58363.6328,4,0.0],[58636.3633,0,0.0],[58636.3633,4,0.0],[58772.7266,3,0.0],[58772.7266,7,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[58909.09,1,409.090881],[58909.09,5,409.090881],[59454.543,4,0.0],[59454.543,0,0.0],[59727.27,4,0.0],[59727.27,0,0.0],[59863.6328,7,0.0],[59863.6328,3,0.0],[60000.0,6,136.363632],[60000.0,2,136.363632],[60272.7266,7,0.0],[60272.7266,3,0.0],[60545.4531,7,0.0],[60545.4531,3,0.0],[60818.18,5,0.0],[60818.18,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[61090.9063,0,409.090881],[61090.9063,7,409.090881],[61636.3633,4,409.090881],[61636.3633,3,409.090881],[62181.8164,2,0.0],[62181.8164,6,0.0],[62454.543,2,0.0],[62454.543,6,0.0],[62727.27,3,409.090881],[62727.27,4,409.090881]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[63272.7266,5,409.090881],[63272.7266,1,409.090881],[63818.18,7,409.090881],[63818.18,3,409.090881],[64363.6328,6,409.090881],[64363.6328,2,409.090881],[64909.09,4,0.0],[64909.09,0,0.0],[65181.8164,7,0.0],[65181.8164,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[65454.543,5,545.4545],[65727.27,2,0.0],[66000.0,0,0.0],[66272.73,1,0.0],[66545.45,3,0.0],[66681.81,0,0.0],[66818.18,3,0.0],[67090.91,3,0.0],[67363.63,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[67909.0859,1,0.0],[68045.45,3,0.0],[68181.81,0,136.363632],[68454.55,1,0.0],[68727.27,3,0.0],[69000.0,0,0.0],[69181.81,0,0.0],[69272.73,3,0.0],[69545.45,1,0.0],[69727.27,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[69818.18,5,409.090881],[70090.91,2,0.0],[70363.63,0,0.0],[70363.63,7,409.090881],[70636.36,1,0.0],[70909.0859,3,0.0],[70909.0859,6,409.090881],[71045.45,0,0.0],[71181.81,3,0.0],[71454.55,3,0.0],[71454.55,7,409.090881],[71727.27,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[72000.0,5,409.090881],[72272.73,1,0.0],[72409.0859,3,0.0],[72545.45,0,136.363632],[72545.45,7,409.090881],[72818.18,1,0.0],[73090.91,3,0.0],[73363.63,0,0.0],[73545.45,0,0.0],[73636.36,3,0.0],[73909.0859,1,0.0],[74090.91,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[74181.81,2,0.0],[74181.81,5,409.090881],[74454.55,2,0.0],[74727.27,0,0.0],[74727.27,7,409.090881],[74863.63,1,0.0],[75000.0,3,0.0],[75272.73,3,0.0],[75272.73,6,409.090881],[75409.0859,0,0.0],[75545.45,3,0.0],[75818.18,3,0.0],[75818.18,7,409.090881],[76090.91,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[76363.63,0,0.0],[76363.63,5,409.090881],[76636.36,1,0.0],[76772.73,3,0.0],[76909.0859,0,136.363632],[76909.0859,7,409.090881],[77181.81,1,0.0],[77454.55,2,0.0],[77454.55,6,409.090881],[77727.27,0,0.0],[78000.0,3,0.0],[78000.0,7,0.0],[78136.36,4,0.0],[78272.73,0,0.0],[78409.0859,1,0.0],[78409.0859,5,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[78545.45,2,0.0],[78818.18,2,0.0],[79090.91,0,0.0],[79227.27,1,0.0],[79363.63,3,0.0],[79636.36,3,0.0],[79772.73,0,0.0],[79909.0859,3,0.0],[80181.81,3,0.0],[80454.55,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[80727.27,0,0.0],[81000.0,1,0.0],[81136.36,3,0.0],[81272.73,0,136.363632],[81545.45,1,0.0],[81818.18,2,0.0],[82090.91,0,0.0],[82363.63,3,0.0],[82636.36,0,0.0],[82772.73,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[82909.0859,7,1090.909],[83181.81,2,0.0],[83454.54,3,0.0],[83727.27,2,0.0],[83863.63,3,0.0],[84409.0859,2,0.0],[84545.45,3,0.0],[84818.18,0,0.0],[84954.54,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[85363.63,2,0.0],[85636.36,3,0.0],[85909.0859,2,0.0],[86045.45,3,0.0],[86590.91,2,0.0],[86727.27,3,0.0],[87000.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[87272.73,2,545.4545]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]}]},"generatedBy":"SNIFF ver.6"} \ No newline at end of file diff --git a/assets/preload/data/stageList.txt b/assets/preload/data/stageList.txt new file mode 100644 index 000000000..dba2e33b6 --- /dev/null +++ b/assets/preload/data/stageList.txt @@ -0,0 +1,8 @@ +stage +spooky +philly +limo +mall +mallEvil +school +schoolEvil \ No newline at end of file diff --git a/assets/preload/data/winter-horrorland/events.json b/assets/preload/data/winter-horrorland/events.json index 9bf9f6a4c..7cd1d4113 100644 --- a/assets/preload/data/winter-horrorland/events.json +++ b/assets/preload/data/winter-horrorland/events.json @@ -1 +1 @@ -{"song":{"player1":"bf-christmas","song":"Winter-Horrorland","player2":"monster-christmas","notes":[{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[[21132.0754716981,-1,"Set GF Speed","2",""]],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[[45283.0188679245,-1,"Set GF Speed","1",""]],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[[57358.4905660377,-1,"Set GF Speed","2",""]],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[[81509.4339622642,-1,"Set GF Speed","1",""]],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[[105660.377358491,-1,"Set GF Speed","2",""]],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[[117735.849056604,-1,"Set GF Speed","1",""]],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"sectionNotes":[],"typeOfSection":0,"lengthInSteps":16,"altAnim":false,"mustHitSection":true,"changeBPM":false,"bpm":159},{"sectionNotes":[],"typeOfSection":0,"lengthInSteps":16,"altAnim":false,"mustHitSection":true,"changeBPM":false,"bpm":159},{"lengthInSteps":16,"altAnim":false,"typeOfSection":0,"sectionNotes":[],"bpm":159,"changeBPM":false,"mustHitSection":true}],"needsVoices":true,"validScore":true,"bpm":159,"speed":1.3}} \ No newline at end of file +{"song":{"player1":"bf-christmas","song":"Winter Horrorland","player2":"monster-christmas","notes":[{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[[21132.0754716981,-1,"Set GF Speed","2",""]],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[[45283.0188679245,-1,"Set GF Speed","1",""]],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[[57358.4905660377,-1,"Set GF Speed","2",""]],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[[81509.4339622642,-1,"Set GF Speed","1",""]],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[[105660.377358491,-1,"Set GF Speed","2",""]],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[[117735.849056604,-1,"Set GF Speed","1",""]],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":false},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"lengthInSteps":16,"sectionNotes":[],"mustHitSection":true},{"sectionNotes":[],"typeOfSection":0,"lengthInSteps":16,"altAnim":false,"mustHitSection":true,"changeBPM":false,"bpm":159},{"sectionNotes":[],"typeOfSection":0,"lengthInSteps":16,"altAnim":false,"mustHitSection":true,"changeBPM":false,"bpm":159},{"lengthInSteps":16,"altAnim":false,"typeOfSection":0,"sectionNotes":[],"bpm":159,"changeBPM":false,"mustHitSection":true}],"needsVoices":true,"validScore":true,"bpm":159,"speed":1.3}} \ No newline at end of file diff --git a/assets/preload/data/winter-horrorland/winter-horrorland-easy.json b/assets/preload/data/winter-horrorland/winter-horrorland-easy.json index 2e4666876..020fc5749 100644 --- a/assets/preload/data/winter-horrorland/winter-horrorland-easy.json +++ b/assets/preload/data/winter-horrorland/winter-horrorland-easy.json @@ -1 +1 @@ -{"song":{"song":"Winter-Horrorland","bpm":159.0,"needsVoices":true,"player1":"bf-christmas","player2":"monster-christmas","speed":1.0,"notes":[{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[9433.962,0,283.01886],[9811.32,2,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[10566.0381,0,660.3774],[11320.7549,2,660.3774]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[12452.83,0,283.01886],[12830.1885,2,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[13584.9053,1,0.0],[14339.623,3,283.01886],[14716.9814,2,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[15094.34,5,754.717],[15471.6982,0,283.01886],[15849.0566,2,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[16603.7734,0,660.3774],[17358.49,2,660.3774]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[18490.5664,0,283.01886],[18867.9238,2,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[19622.64,1,0.0],[20377.36,3,283.01886],[20754.7168,2,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[21132.0762,1,283.01886],[21132.0762,5,754.717],[21886.793,2,283.01886],[22264.15,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[22641.51,1,471.69812],[23396.2266,0,0.0],[23773.584,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24150.9434,3,283.01886],[24528.3027,2,0.0],[24905.66,2,0.0],[25283.02,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[25660.377,1,471.69812],[26415.0938,3,0.0],[26792.4531,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[27169.81,1,283.01886],[27924.5273,2,283.01886],[28301.8867,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[28679.2461,1,471.69812],[29433.9629,0,0.0],[29811.32,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[30188.68,3,283.01886],[30566.0371,2,0.0],[30943.3965,2,0.0],[31320.7539,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[31698.1133,1,471.69812],[32452.83,3,0.0],[32830.1875,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[33584.9063,2,0.0],[33962.2656,0,283.01886],[34528.3,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[35094.34,2,283.01886],[35471.7,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[36603.7734,2,0.0],[36981.1328,0,283.01886],[37358.4922,1,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[37735.8477,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[39622.64,2,0.0],[40000.0,0,283.01886],[40566.04,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[41132.0742,2,283.01886],[41509.4336,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[42641.5078,2,0.0],[43018.8672,0,283.01886],[43396.2266,1,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[43773.5859,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[45283.02,0,283.01886],[46037.7344,2,0.0],[46415.0938,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[46792.4531,5,283.01886],[47169.8125,0,0.0],[47547.168,3,0.0],[47924.5273,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[48301.8867,2,283.01886],[48301.8867,6,849.0566],[48679.2461,0,188.679245],[49056.6055,3,0.0],[49433.96,3,0.0],[49622.64,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[49937.1055,2,0.0],[50188.68,2,0.0],[50440.25,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[51320.7539,0,283.01886],[52075.4727,2,0.0],[52452.832,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[52830.1875,5,283.01886],[53207.5469,0,0.0],[53584.9063,3,0.0],[53962.2656,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[54339.62,6,1132.07544],[54339.62,2,283.01886],[54716.98,0,188.679245],[55094.34,3,0.0],[55471.7,3,0.0],[55660.38,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[56037.7344,2,0.0],[56415.0938,2,0.0],[56603.7734,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[57547.168,2,0.0],[58113.207,2,0.0],[58490.5664,2,0.0],[58679.2461,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[58867.9258,1,0.0],[59245.28,3,283.01886],[59622.64,2,0.0],[60000.0,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[60566.04,2,0.0],[61132.0742,2,0.0],[61509.4336,2,0.0],[61698.1133,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[61886.793,1,0.0],[62264.1523,3,283.01886],[62641.5078,2,0.0],[63018.8672,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[63396.2266,3,0.0],[63773.5859,1,283.01886],[64150.94,0,0.0],[64528.3,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[64905.66,4,0.0],[64905.66,3,0.0],[65283.02,1,283.01886],[65660.375,0,0.0],[66037.7344,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[66415.09,0,0.0],[66415.09,4,0.0],[66981.13,7,0.0],[66981.13,3,0.0],[67358.49,6,0.0],[67358.49,2,0.0],[67735.85,5,754.717],[67735.85,1,754.717]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[69622.64,0,0.0],[70188.68,1,0.0],[70754.72,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[71132.08,2,0.0],[71320.76,1,0.0],[71698.11,2,0.0],[72075.47,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[72452.83,2,283.01886],[72830.19,0,283.01886],[73207.55,3,283.01886],[73584.91,0,0.0],[73773.5859,1,566.0377]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[74716.9844,3,0.0],[74905.6641,0,0.0],[75094.3359,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[75660.375,0,0.0],[76226.4141,1,0.0],[76792.45,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[77169.81,2,0.0],[77358.49,1,0.0],[77735.85,2,0.0],[78113.21,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[78490.56,2,283.01886],[78867.92,0,283.01886],[79245.28,3,283.01886],[79622.64,0,0.0],[79811.32,1,566.0377]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[80754.72,3,0.0],[80943.4,0,0.0],[81132.08,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[81509.44,1,0.0],[81886.79,3,0.0],[82264.15,0,0.0],[82641.51,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[83018.87,1,0.0],[83396.23,3,0.0],[83773.5859,0,0.0],[84150.9453,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[84528.3047,2,0.0],[84905.6641,2,0.0],[85094.3359,0,0.0],[85283.0156,2,0.0],[85660.375,2,0.0],[85849.0547,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[86037.7344,2,0.0],[86415.09,2,0.0],[86603.77,0,0.0],[86792.45,2,0.0],[87169.81,2,0.0],[87358.49,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[87547.17,3,283.01886],[88113.21,1,283.01886],[88301.88,4,0.0],[88679.24,7,283.01886],[88679.24,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[89056.6,5,283.01886],[89056.6,3,0.0],[89433.96,3,0.0],[89811.32,1,283.01886],[89811.32,7,0.0],[90188.68,6,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[90566.04,5,283.01886],[90566.04,0,0.0],[91132.08,3,0.0],[91698.11,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[92075.47,2,566.0377],[92075.47,6,566.0377],[92830.19,3,566.0377],[92830.19,4,566.0377]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[93773.5859,3,0.0],[94150.9453,7,0.0],[94339.625,0,283.01886],[94716.9844,4,283.01886],[94905.6641,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[95283.0156,3,283.01886],[95471.6953,6,283.01886],[95849.0547,4,283.01886],[95849.0547,2,283.01886],[96226.4141,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[96792.45,7,94.33962],[96981.13,6,0.0],[97169.81,3,94.33962],[97358.49,4,283.01886],[97358.49,2,0.0],[97735.85,0,283.01886],[97735.85,5,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[98113.21,5,283.01886],[98113.21,0,283.01886],[98490.56,7,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[99811.32,3,0.0],[100188.68,7,0.0],[100377.359,0,283.01886],[100754.719,4,283.01886],[100943.4,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[101320.758,3,283.01886],[101509.438,6,283.01886],[101886.789,4,283.01886],[101886.789,2,283.01886],[102264.148,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[102830.188,3,94.33962],[103207.547,7,94.33962],[103396.227,0,283.01886],[103773.586,1,283.01886],[103773.586,4,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[104150.945,5,283.01886],[104150.945,0,283.01886],[104528.305,7,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[105849.055,2,0.0],[106415.094,2,0.0],[106792.453,2,0.0],[106981.133,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[107169.813,1,0.0],[107547.172,3,283.01886],[107924.531,2,0.0],[108301.883,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[108867.922,2,0.0],[109433.961,2,0.0],[109811.32,2,0.0],[110000.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[110188.68,1,0.0],[110566.039,3,283.01886],[110943.4,2,0.0],[111320.758,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[111698.109,3,0.0],[112075.469,1,283.01886],[112452.828,0,0.0],[112830.188,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[113207.547,4,0.0],[113207.547,3,0.0],[113584.906,1,283.01886],[113962.266,0,0.0],[114339.625,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[114716.984,4,0.0],[114716.984,0,0.0],[115283.016,3,0.0],[115283.016,7,0.0],[115660.375,6,0.0],[115660.375,2,0.0],[116037.734,1,754.717],[116037.734,5,754.717]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[117924.531,0,0.0],[118490.563,1,0.0],[118867.922,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[119245.281,2,283.01886],[119622.641,3,283.01886],[120000.0,0,283.01886],[120377.359,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[120754.719,6,754.717],[120943.4,0,0.0],[121509.438,1,0.0],[121886.789,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[122264.148,2,283.01886],[122641.508,3,283.01886],[123018.867,0,283.01886],[123396.227,3,754.717]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[123773.586,1,94.33962],[124150.945,3,0.0],[124528.305,2,283.01886],[124905.664,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[125283.016,2,0.0],[125283.016,5,283.01886],[125660.375,1,283.01886],[126037.734,3,0.0],[126415.094,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[126792.453,0,0.0],[126792.453,4,0.0],[127358.492,3,0.0],[127358.492,7,0.0],[127735.852,6,0.0],[127735.852,2,0.0],[128113.211,1,377.3585],[128113.211,5,377.3585]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[129056.6,0,0.0],[129245.281,3,0.0],[129433.961,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[129811.32,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]}]},"generatedBy":"SNIFF ver.6"} \ No newline at end of file +{"song":{"song":"Winter Horrorland","bpm":159.0,"needsVoices":true,"player1":"bf-christmas","player2":"monster-christmas","speed":1.0,"notes":[{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[9433.962,0,283.01886],[9811.32,2,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[10566.0381,0,660.3774],[11320.7549,2,660.3774]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[12452.83,0,283.01886],[12830.1885,2,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[13584.9053,1,0.0],[14339.623,3,283.01886],[14716.9814,2,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[15094.34,5,754.717],[15471.6982,0,283.01886],[15849.0566,2,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[16603.7734,0,660.3774],[17358.49,2,660.3774]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[18490.5664,0,283.01886],[18867.9238,2,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[19622.64,1,0.0],[20377.36,3,283.01886],[20754.7168,2,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[21132.0762,1,283.01886],[21132.0762,5,754.717],[21886.793,2,283.01886],[22264.15,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[22641.51,1,471.69812],[23396.2266,0,0.0],[23773.584,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24150.9434,3,283.01886],[24528.3027,2,0.0],[24905.66,2,0.0],[25283.02,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[25660.377,1,471.69812],[26415.0938,3,0.0],[26792.4531,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[27169.81,1,283.01886],[27924.5273,2,283.01886],[28301.8867,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[28679.2461,1,471.69812],[29433.9629,0,0.0],[29811.32,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[30188.68,3,283.01886],[30566.0371,2,0.0],[30943.3965,2,0.0],[31320.7539,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[31698.1133,1,471.69812],[32452.83,3,0.0],[32830.1875,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[33584.9063,2,0.0],[33962.2656,0,283.01886],[34528.3,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[35094.34,2,283.01886],[35471.7,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[36603.7734,2,0.0],[36981.1328,0,283.01886],[37358.4922,1,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[37735.8477,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[39622.64,2,0.0],[40000.0,0,283.01886],[40566.04,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[41132.0742,2,283.01886],[41509.4336,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[42641.5078,2,0.0],[43018.8672,0,283.01886],[43396.2266,1,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[43773.5859,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[45283.02,0,283.01886],[46037.7344,2,0.0],[46415.0938,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[46792.4531,5,283.01886],[47169.8125,0,0.0],[47547.168,3,0.0],[47924.5273,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[48301.8867,2,283.01886],[48301.8867,6,849.0566],[48679.2461,0,188.679245],[49056.6055,3,0.0],[49433.96,3,0.0],[49622.64,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[49937.1055,2,0.0],[50188.68,2,0.0],[50440.25,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[51320.7539,0,283.01886],[52075.4727,2,0.0],[52452.832,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[52830.1875,5,283.01886],[53207.5469,0,0.0],[53584.9063,3,0.0],[53962.2656,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[54339.62,6,1132.07544],[54339.62,2,283.01886],[54716.98,0,188.679245],[55094.34,3,0.0],[55471.7,3,0.0],[55660.38,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[56037.7344,2,0.0],[56415.0938,2,0.0],[56603.7734,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[57547.168,2,0.0],[58113.207,2,0.0],[58490.5664,2,0.0],[58679.2461,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[58867.9258,1,0.0],[59245.28,3,283.01886],[59622.64,2,0.0],[60000.0,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[60566.04,2,0.0],[61132.0742,2,0.0],[61509.4336,2,0.0],[61698.1133,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[61886.793,1,0.0],[62264.1523,3,283.01886],[62641.5078,2,0.0],[63018.8672,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[63396.2266,3,0.0],[63773.5859,1,283.01886],[64150.94,0,0.0],[64528.3,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[64905.66,4,0.0],[64905.66,3,0.0],[65283.02,1,283.01886],[65660.375,0,0.0],[66037.7344,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[66415.09,0,0.0],[66415.09,4,0.0],[66981.13,7,0.0],[66981.13,3,0.0],[67358.49,6,0.0],[67358.49,2,0.0],[67735.85,5,754.717],[67735.85,1,754.717]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[69622.64,0,0.0],[70188.68,1,0.0],[70754.72,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[71132.08,2,0.0],[71320.76,1,0.0],[71698.11,2,0.0],[72075.47,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[72452.83,2,283.01886],[72830.19,0,283.01886],[73207.55,3,283.01886],[73584.91,0,0.0],[73773.5859,1,566.0377]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[74716.9844,3,0.0],[74905.6641,0,0.0],[75094.3359,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[75660.375,0,0.0],[76226.4141,1,0.0],[76792.45,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[77169.81,2,0.0],[77358.49,1,0.0],[77735.85,2,0.0],[78113.21,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[78490.56,2,283.01886],[78867.92,0,283.01886],[79245.28,3,283.01886],[79622.64,0,0.0],[79811.32,1,566.0377]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[80754.72,3,0.0],[80943.4,0,0.0],[81132.08,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[81509.44,1,0.0],[81886.79,3,0.0],[82264.15,0,0.0],[82641.51,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[83018.87,1,0.0],[83396.23,3,0.0],[83773.5859,0,0.0],[84150.9453,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[84528.3047,2,0.0],[84905.6641,2,0.0],[85094.3359,0,0.0],[85283.0156,2,0.0],[85660.375,2,0.0],[85849.0547,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[86037.7344,2,0.0],[86415.09,2,0.0],[86603.77,0,0.0],[86792.45,2,0.0],[87169.81,2,0.0],[87358.49,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[87547.17,3,283.01886],[88113.21,1,283.01886],[88301.88,4,0.0],[88679.24,7,283.01886],[88679.24,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[89056.6,5,283.01886],[89056.6,3,0.0],[89433.96,3,0.0],[89811.32,1,283.01886],[89811.32,7,0.0],[90188.68,6,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[90566.04,5,283.01886],[90566.04,0,0.0],[91132.08,3,0.0],[91698.11,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[92075.47,2,566.0377],[92075.47,6,566.0377],[92830.19,3,566.0377],[92830.19,4,566.0377]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[93773.5859,3,0.0],[94150.9453,7,0.0],[94339.625,0,283.01886],[94716.9844,4,283.01886],[94905.6641,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[95283.0156,3,283.01886],[95471.6953,6,283.01886],[95849.0547,4,283.01886],[95849.0547,2,283.01886],[96226.4141,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[96792.45,7,94.33962],[96981.13,6,0.0],[97169.81,3,94.33962],[97358.49,4,283.01886],[97358.49,2,0.0],[97735.85,0,283.01886],[97735.85,5,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[98113.21,5,283.01886],[98113.21,0,283.01886],[98490.56,7,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[99811.32,3,0.0],[100188.68,7,0.0],[100377.359,0,283.01886],[100754.719,4,283.01886],[100943.4,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[101320.758,3,283.01886],[101509.438,6,283.01886],[101886.789,4,283.01886],[101886.789,2,283.01886],[102264.148,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[102830.188,3,94.33962],[103207.547,7,94.33962],[103396.227,0,283.01886],[103773.586,1,283.01886],[103773.586,4,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[104150.945,5,283.01886],[104150.945,0,283.01886],[104528.305,7,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[105849.055,2,0.0],[106415.094,2,0.0],[106792.453,2,0.0],[106981.133,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[107169.813,1,0.0],[107547.172,3,283.01886],[107924.531,2,0.0],[108301.883,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[108867.922,2,0.0],[109433.961,2,0.0],[109811.32,2,0.0],[110000.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[110188.68,1,0.0],[110566.039,3,283.01886],[110943.4,2,0.0],[111320.758,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[111698.109,3,0.0],[112075.469,1,283.01886],[112452.828,0,0.0],[112830.188,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[113207.547,4,0.0],[113207.547,3,0.0],[113584.906,1,283.01886],[113962.266,0,0.0],[114339.625,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[114716.984,4,0.0],[114716.984,0,0.0],[115283.016,3,0.0],[115283.016,7,0.0],[115660.375,6,0.0],[115660.375,2,0.0],[116037.734,1,754.717],[116037.734,5,754.717]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[117924.531,0,0.0],[118490.563,1,0.0],[118867.922,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[119245.281,2,283.01886],[119622.641,3,283.01886],[120000.0,0,283.01886],[120377.359,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[120754.719,6,754.717],[120943.4,0,0.0],[121509.438,1,0.0],[121886.789,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[122264.148,2,283.01886],[122641.508,3,283.01886],[123018.867,0,283.01886],[123396.227,3,754.717]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[123773.586,1,94.33962],[124150.945,3,0.0],[124528.305,2,283.01886],[124905.664,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[125283.016,2,0.0],[125283.016,5,283.01886],[125660.375,1,283.01886],[126037.734,3,0.0],[126415.094,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[126792.453,0,0.0],[126792.453,4,0.0],[127358.492,3,0.0],[127358.492,7,0.0],[127735.852,6,0.0],[127735.852,2,0.0],[128113.211,1,377.3585],[128113.211,5,377.3585]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[129056.6,0,0.0],[129245.281,3,0.0],[129433.961,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[129811.32,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]}]},"generatedBy":"SNIFF ver.6"} \ No newline at end of file diff --git a/assets/preload/data/winter-horrorland/winter-horrorland-hard.json b/assets/preload/data/winter-horrorland/winter-horrorland-hard.json index 947ee8e84..8689ed76b 100644 --- a/assets/preload/data/winter-horrorland/winter-horrorland-hard.json +++ b/assets/preload/data/winter-horrorland/winter-horrorland-hard.json @@ -1 +1 @@ -{"song":{"song":"Winter-Horrorland","bpm":159.0,"needsVoices":true,"player1":"bf-christmas","player2":"monster-christmas","speed":1.3,"notes":[{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[9433.962,0,283.01886],[9811.32,2,283.01886],[10188.68,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[10566.0381,0,660.3774],[11320.7549,2,566.0377]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[12452.83,0,283.01886],[12830.1885,2,283.01886],[13207.5469,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[13584.9053,1,0.0],[14150.9434,2,0.0],[14339.623,3,283.01886],[14716.9814,2,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[15094.34,5,754.717],[15471.6982,0,283.01886],[15849.0566,2,283.01886],[16226.415,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[16603.7734,0,660.3774],[17358.49,2,660.3774]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[18490.5664,0,283.01886],[18867.9238,2,283.01886],[19245.2832,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[19622.64,1,0.0],[20188.68,2,0.0],[20377.36,3,283.01886],[20754.7168,2,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[21132.0762,1,283.01886],[21132.0762,5,754.717],[21509.4336,3,283.01886],[21886.793,2,283.01886],[22264.15,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[22641.51,1,471.69812],[23207.5469,0,0.0],[23301.8867,2,0.0],[23396.2266,0,0.0],[23584.9063,3,0.0],[23773.584,0,0.0],[23962.2637,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24150.9434,3,283.01886],[24528.3027,2,0.0],[24716.98,0,0.0],[24905.66,2,0.0],[25094.34,0,0.0],[25283.02,2,0.0],[25471.6973,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[25660.377,1,471.69812],[26226.416,2,0.0],[26415.0938,3,0.0],[26603.7734,2,0.0],[26792.4531,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[27169.81,1,283.01886],[27547.17,3,283.01886],[27924.5273,2,283.01886],[28301.8867,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[28679.2461,1,471.69812],[29245.2832,0,0.0],[29339.623,2,0.0],[29433.9629,0,0.0],[29622.64,3,0.0],[29811.32,0,0.0],[30000.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[30188.68,3,283.01886],[30566.0371,2,0.0],[30754.7168,0,0.0],[30943.3965,2,0.0],[31132.0762,0,0.0],[31320.7539,2,0.0],[31509.4336,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[31698.1133,1,471.69812],[32264.15,2,0.0],[32452.83,3,0.0],[32641.51,2,0.0],[32830.1875,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[33396.2266,3,0.0],[33490.5664,3,0.0],[33584.9063,2,0.0],[33773.5859,1,0.0],[33962.2656,0,283.01886],[34528.3,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[35094.34,2,283.01886],[35471.7,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[36415.0938,3,94.33962],[36603.7734,2,94.33962],[36792.4531,1,94.33962],[36981.1328,0,283.01886],[37358.4922,1,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[37735.8477,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[39433.96,3,0.0],[39528.3,3,0.0],[39622.64,2,0.0],[39811.32,1,0.0],[40000.0,0,283.01886],[40566.04,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[41132.0742,2,283.01886],[41509.4336,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[42452.832,3,94.33962],[42641.5078,2,94.33962],[42830.1875,1,94.33962],[43018.8672,0,283.01886],[43396.2266,1,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[43773.5859,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[45283.02,0,283.01886],[45660.38,1,283.01886],[46037.7344,2,0.0],[46226.4141,3,0.0],[46415.0938,2,0.0],[46603.7734,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[46792.4531,5,283.01886],[47169.8125,0,0.0],[47547.168,3,0.0],[47924.5273,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[48301.8867,6,849.0566],[48301.8867,2,283.01886],[48679.2461,0,188.679245],[49056.6055,3,0.0],[49245.28,0,0.0],[49339.62,0,0.0],[49433.96,3,0.0],[49622.64,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[49937.1055,2,0.0],[50188.68,2,0.0],[50440.25,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[51320.7539,0,283.01886],[51698.1133,1,283.01886],[52075.4727,2,0.0],[52264.1523,3,0.0],[52452.832,2,0.0],[52641.5078,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[52830.1875,5,283.01886],[53207.5469,0,0.0],[53584.9063,3,0.0],[53962.2656,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[54339.62,6,1132.07544],[54339.62,2,188.679245],[54716.98,0,188.679245],[55094.34,3,0.0],[55283.02,0,0.0],[55377.36,0,0.0],[55471.7,3,0.0],[55660.38,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[56037.7344,2,0.0],[56415.0938,2,0.0],[56603.7734,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[57547.168,2,0.0],[57924.5273,2,0.0],[58018.8672,3,0.0],[58113.207,2,0.0],[58301.8867,0,0.0],[58490.5664,2,0.0],[58679.2461,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[58867.9258,1,0.0],[59056.6055,0,0.0],[59245.28,3,283.01886],[59622.64,2,0.0],[59811.32,3,0.0],[60000.0,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[60566.04,2,0.0],[60943.3945,2,0.0],[61037.7344,3,0.0],[61132.0742,2,0.0],[61320.7539,0,0.0],[61509.4336,2,0.0],[61698.1133,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[61886.793,1,0.0],[62075.4727,0,0.0],[62264.1523,3,283.01886],[62641.5078,2,0.0],[62830.1875,3,0.0],[63018.8672,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[63396.2266,3,0.0],[63584.9063,3,0.0],[63773.5859,1,283.01886],[64150.94,0,0.0],[64528.3,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[64905.66,4,0.0],[64905.66,3,0.0],[65094.34,3,0.0],[65283.02,1,283.01886],[65660.375,0,0.0],[65849.0547,0,0.0],[66037.7344,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[66415.09,4,0.0],[66415.09,0,0.0],[66603.77,5,0.0],[66603.77,1,0.0],[66981.13,7,0.0],[66981.13,3,0.0],[67358.49,6,0.0],[67358.49,2,0.0],[67735.85,1,754.717],[67735.85,5,754.717]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[69622.64,0,0.0],[69716.9844,0,0.0],[69811.32,3,0.0],[70188.68,1,0.0],[70377.36,0,0.0],[70566.04,2,0.0],[70754.72,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[71132.08,2,0.0],[71226.4141,3,0.0],[71320.76,1,0.0],[71509.44,0,0.0],[71698.11,2,0.0],[71886.79,3,0.0],[72075.47,0,0.0],[72264.15,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[72452.83,2,283.01886],[72830.19,0,283.01886],[73207.55,3,283.01886],[73584.91,0,0.0],[73773.5859,1,566.0377]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[74528.3047,0,0.0],[74716.9844,3,0.0],[74905.6641,0,0.0],[75094.3359,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[75660.375,0,0.0],[75754.72,0,0.0],[75849.0547,3,0.0],[76226.4141,1,0.0],[76415.09,0,0.0],[76603.77,2,0.0],[76792.45,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[77169.81,2,0.0],[77264.15,3,0.0],[77358.49,1,0.0],[77547.17,0,0.0],[77735.85,2,0.0],[77924.53,3,0.0],[78113.21,0,0.0],[78301.88,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[78490.56,2,283.01886],[78867.92,0,283.01886],[79245.28,3,283.01886],[79622.64,0,0.0],[79811.32,1,566.0377]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[80566.04,0,0.0],[80754.72,3,0.0],[80943.4,0,0.0],[81132.08,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[81509.44,1,0.0],[81698.11,1,0.0],[81886.79,3,0.0],[82075.47,3,0.0],[82264.15,0,0.0],[82452.83,3,0.0],[82641.51,2,0.0],[82830.19,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[83018.87,1,0.0],[83207.55,1,0.0],[83396.23,3,0.0],[83584.91,3,0.0],[83773.5859,0,0.0],[83962.2656,3,0.0],[84150.9453,2,0.0],[84339.625,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[84528.3047,2,0.0],[84716.9844,3,0.0],[84905.6641,2,0.0],[85094.3359,0,0.0],[85283.0156,2,0.0],[85471.6953,3,0.0],[85660.375,2,0.0],[85849.0547,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[86037.7344,2,0.0],[86226.4141,3,0.0],[86415.09,2,0.0],[86603.77,0,0.0],[86792.45,2,0.0],[86981.13,3,0.0],[87169.81,2,0.0],[87358.49,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[87547.17,3,283.01886],[87924.53,0,94.33962],[88113.21,1,283.01886],[88301.88,4,0.0],[88490.56,0,0.0],[88490.56,7,0.0],[88679.24,1,0.0],[88679.24,7,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[89056.6,5,283.01886],[89056.6,3,0.0],[89433.96,3,0.0],[89811.32,1,283.01886],[89811.32,7,0.0],[90000.0,4,0.0],[90188.68,6,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[90566.04,5,283.01886],[90566.04,0,0.0],[91132.08,3,0.0],[91698.11,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[92075.47,6,566.0377],[92075.47,2,566.0377],[92830.19,3,566.0377],[92830.19,4,566.0377]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[93773.5859,3,0.0],[93867.92,3,0.0],[93962.2656,2,0.0],[94150.9453,1,0.0],[94150.9453,7,0.0],[94245.28,7,0.0],[94339.625,0,283.01886],[94339.625,6,0.0],[94528.3047,5,0.0],[94716.9844,4,283.01886],[94905.6641,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[95283.0156,3,283.01886],[95471.6953,6,283.01886],[95849.0547,2,283.01886],[95849.0547,4,283.01886],[96226.4141,0,283.01886],[96226.4141,7,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[96603.77,3,0.0],[96792.45,7,94.33962],[96981.13,6,94.33962],[97169.81,5,94.33962],[97169.81,3,94.33962],[97358.49,4,283.01886],[97358.49,2,94.33962],[97547.17,1,94.33962],[97735.85,0,283.01886],[97735.85,5,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[98113.21,5,283.01886],[98113.21,0,283.01886],[98490.56,7,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[99811.32,3,0.0],[99905.6641,3,0.0],[100000.0,2,0.0],[100188.68,7,0.0],[100188.68,1,0.0],[100283.016,7,0.0],[100377.359,6,0.0],[100377.359,0,283.01886],[100566.039,5,0.0],[100754.719,4,283.01886],[100943.4,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[101320.758,3,283.01886],[101509.438,6,283.01886],[101886.789,2,283.01886],[101886.789,4,283.01886],[102264.148,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[102830.188,3,94.33962],[103018.867,2,94.33962],[103207.547,7,94.33962],[103207.547,1,94.33962],[103396.227,0,283.01886],[103396.227,6,94.33962],[103584.906,5,94.33962],[103773.586,1,283.01886],[103773.586,4,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[104150.945,0,283.01886],[104150.945,5,283.01886],[104528.305,7,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[105849.055,2,0.0],[106226.414,2,0.0],[106320.758,3,0.0],[106415.094,2,0.0],[106603.773,0,0.0],[106792.453,2,0.0],[106981.133,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[107169.813,1,0.0],[107358.492,0,0.0],[107547.172,3,283.01886],[107924.531,2,0.0],[108113.211,3,0.0],[108301.883,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[108867.922,2,0.0],[109245.281,2,0.0],[109339.625,3,0.0],[109433.961,2,0.0],[109622.641,0,0.0],[109811.32,2,0.0],[110000.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[110188.68,1,0.0],[110377.359,0,0.0],[110566.039,3,283.01886],[110943.4,2,0.0],[111132.078,3,0.0],[111320.758,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[111698.109,3,0.0],[111886.789,3,0.0],[112075.469,1,283.01886],[112452.828,0,0.0],[112830.188,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[113207.547,4,0.0],[113207.547,3,0.0],[113396.227,3,0.0],[113584.906,1,283.01886],[113962.266,0,0.0],[114150.945,0,0.0],[114339.625,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[114716.984,0,0.0],[114716.984,4,0.0],[114905.664,1,0.0],[114905.664,5,0.0],[115283.016,3,0.0],[115283.016,7,0.0],[115660.375,2,0.0],[115660.375,6,0.0],[116037.734,5,754.717],[116037.734,1,754.717]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[117924.531,0,0.0],[118301.883,3,0.0],[118490.563,1,0.0],[118679.242,0,0.0],[118867.922,2,0.0],[119056.6,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[119245.281,2,283.01886],[119622.641,3,283.01886],[120000.0,0,283.01886],[120377.359,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[120754.719,6,754.717],[120943.4,0,0.0],[121320.758,3,0.0],[121509.438,1,0.0],[121698.109,0,0.0],[121886.789,2,0.0],[122075.469,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[122264.148,2,283.01886],[122641.508,3,283.01886],[123018.867,0,283.01886],[123396.227,3,754.717]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[123773.586,1,94.33962],[124150.945,3,0.0],[124339.625,3,0.0],[124528.305,2,283.01886],[124905.664,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[125283.016,5,283.01886],[125283.016,2,0.0],[125471.695,3,0.0],[125660.375,1,283.01886],[126037.734,3,0.0],[126226.414,0,0.0],[126415.094,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[126792.453,0,0.0],[126792.453,4,0.0],[126981.133,1,0.0],[126981.133,5,0.0],[127358.492,3,0.0],[127358.492,7,0.0],[127735.852,2,0.0],[127735.852,6,0.0],[128113.211,1,377.3585],[128113.211,5,377.3585]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[129056.6,0,0.0],[129245.281,3,0.0],[129433.961,0,0.0],[129622.641,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[129811.32,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]}]},"generatedBy":"SNIFF ver.6"} \ No newline at end of file +{"song":{"song":"Winter Horrorland","bpm":159.0,"needsVoices":true,"player1":"bf-christmas","player2":"monster-christmas","speed":1.3,"notes":[{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[9433.962,0,283.01886],[9811.32,2,283.01886],[10188.68,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[10566.0381,0,660.3774],[11320.7549,2,566.0377]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[12452.83,0,283.01886],[12830.1885,2,283.01886],[13207.5469,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[13584.9053,1,0.0],[14150.9434,2,0.0],[14339.623,3,283.01886],[14716.9814,2,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[15094.34,5,754.717],[15471.6982,0,283.01886],[15849.0566,2,283.01886],[16226.415,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[16603.7734,0,660.3774],[17358.49,2,660.3774]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[18490.5664,0,283.01886],[18867.9238,2,283.01886],[19245.2832,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[19622.64,1,0.0],[20188.68,2,0.0],[20377.36,3,283.01886],[20754.7168,2,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[21132.0762,1,283.01886],[21132.0762,5,754.717],[21509.4336,3,283.01886],[21886.793,2,283.01886],[22264.15,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[22641.51,1,471.69812],[23207.5469,0,0.0],[23301.8867,2,0.0],[23396.2266,0,0.0],[23584.9063,3,0.0],[23773.584,0,0.0],[23962.2637,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24150.9434,3,283.01886],[24528.3027,2,0.0],[24716.98,0,0.0],[24905.66,2,0.0],[25094.34,0,0.0],[25283.02,2,0.0],[25471.6973,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[25660.377,1,471.69812],[26226.416,2,0.0],[26415.0938,3,0.0],[26603.7734,2,0.0],[26792.4531,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[27169.81,1,283.01886],[27547.17,3,283.01886],[27924.5273,2,283.01886],[28301.8867,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[28679.2461,1,471.69812],[29245.2832,0,0.0],[29339.623,2,0.0],[29433.9629,0,0.0],[29622.64,3,0.0],[29811.32,0,0.0],[30000.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[30188.68,3,283.01886],[30566.0371,2,0.0],[30754.7168,0,0.0],[30943.3965,2,0.0],[31132.0762,0,0.0],[31320.7539,2,0.0],[31509.4336,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[31698.1133,1,471.69812],[32264.15,2,0.0],[32452.83,3,0.0],[32641.51,2,0.0],[32830.1875,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[33396.2266,3,0.0],[33490.5664,3,0.0],[33584.9063,2,0.0],[33773.5859,1,0.0],[33962.2656,0,283.01886],[34528.3,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[35094.34,2,283.01886],[35471.7,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[36415.0938,3,94.33962],[36603.7734,2,94.33962],[36792.4531,1,94.33962],[36981.1328,0,283.01886],[37358.4922,1,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[37735.8477,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[39433.96,3,0.0],[39528.3,3,0.0],[39622.64,2,0.0],[39811.32,1,0.0],[40000.0,0,283.01886],[40566.04,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[41132.0742,2,283.01886],[41509.4336,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[42452.832,3,94.33962],[42641.5078,2,94.33962],[42830.1875,1,94.33962],[43018.8672,0,283.01886],[43396.2266,1,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[43773.5859,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[45283.02,0,283.01886],[45660.38,1,283.01886],[46037.7344,2,0.0],[46226.4141,3,0.0],[46415.0938,2,0.0],[46603.7734,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[46792.4531,5,283.01886],[47169.8125,0,0.0],[47547.168,3,0.0],[47924.5273,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[48301.8867,6,849.0566],[48301.8867,2,283.01886],[48679.2461,0,188.679245],[49056.6055,3,0.0],[49245.28,0,0.0],[49339.62,0,0.0],[49433.96,3,0.0],[49622.64,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[49937.1055,2,0.0],[50188.68,2,0.0],[50440.25,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[51320.7539,0,283.01886],[51698.1133,1,283.01886],[52075.4727,2,0.0],[52264.1523,3,0.0],[52452.832,2,0.0],[52641.5078,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[52830.1875,5,283.01886],[53207.5469,0,0.0],[53584.9063,3,0.0],[53962.2656,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[54339.62,6,1132.07544],[54339.62,2,188.679245],[54716.98,0,188.679245],[55094.34,3,0.0],[55283.02,0,0.0],[55377.36,0,0.0],[55471.7,3,0.0],[55660.38,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[56037.7344,2,0.0],[56415.0938,2,0.0],[56603.7734,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[57547.168,2,0.0],[57924.5273,2,0.0],[58018.8672,3,0.0],[58113.207,2,0.0],[58301.8867,0,0.0],[58490.5664,2,0.0],[58679.2461,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[58867.9258,1,0.0],[59056.6055,0,0.0],[59245.28,3,283.01886],[59622.64,2,0.0],[59811.32,3,0.0],[60000.0,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[60566.04,2,0.0],[60943.3945,2,0.0],[61037.7344,3,0.0],[61132.0742,2,0.0],[61320.7539,0,0.0],[61509.4336,2,0.0],[61698.1133,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[61886.793,1,0.0],[62075.4727,0,0.0],[62264.1523,3,283.01886],[62641.5078,2,0.0],[62830.1875,3,0.0],[63018.8672,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[63396.2266,3,0.0],[63584.9063,3,0.0],[63773.5859,1,283.01886],[64150.94,0,0.0],[64528.3,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[64905.66,4,0.0],[64905.66,3,0.0],[65094.34,3,0.0],[65283.02,1,283.01886],[65660.375,0,0.0],[65849.0547,0,0.0],[66037.7344,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[66415.09,4,0.0],[66415.09,0,0.0],[66603.77,5,0.0],[66603.77,1,0.0],[66981.13,7,0.0],[66981.13,3,0.0],[67358.49,6,0.0],[67358.49,2,0.0],[67735.85,1,754.717],[67735.85,5,754.717]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[69622.64,0,0.0],[69716.9844,0,0.0],[69811.32,3,0.0],[70188.68,1,0.0],[70377.36,0,0.0],[70566.04,2,0.0],[70754.72,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[71132.08,2,0.0],[71226.4141,3,0.0],[71320.76,1,0.0],[71509.44,0,0.0],[71698.11,2,0.0],[71886.79,3,0.0],[72075.47,0,0.0],[72264.15,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[72452.83,2,283.01886],[72830.19,0,283.01886],[73207.55,3,283.01886],[73584.91,0,0.0],[73773.5859,1,566.0377]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[74528.3047,0,0.0],[74716.9844,3,0.0],[74905.6641,0,0.0],[75094.3359,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[75660.375,0,0.0],[75754.72,0,0.0],[75849.0547,3,0.0],[76226.4141,1,0.0],[76415.09,0,0.0],[76603.77,2,0.0],[76792.45,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[77169.81,2,0.0],[77264.15,3,0.0],[77358.49,1,0.0],[77547.17,0,0.0],[77735.85,2,0.0],[77924.53,3,0.0],[78113.21,0,0.0],[78301.88,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[78490.56,2,283.01886],[78867.92,0,283.01886],[79245.28,3,283.01886],[79622.64,0,0.0],[79811.32,1,566.0377]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[80566.04,0,0.0],[80754.72,3,0.0],[80943.4,0,0.0],[81132.08,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[81509.44,1,0.0],[81698.11,1,0.0],[81886.79,3,0.0],[82075.47,3,0.0],[82264.15,0,0.0],[82452.83,3,0.0],[82641.51,2,0.0],[82830.19,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[83018.87,1,0.0],[83207.55,1,0.0],[83396.23,3,0.0],[83584.91,3,0.0],[83773.5859,0,0.0],[83962.2656,3,0.0],[84150.9453,2,0.0],[84339.625,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[84528.3047,2,0.0],[84716.9844,3,0.0],[84905.6641,2,0.0],[85094.3359,0,0.0],[85283.0156,2,0.0],[85471.6953,3,0.0],[85660.375,2,0.0],[85849.0547,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[86037.7344,2,0.0],[86226.4141,3,0.0],[86415.09,2,0.0],[86603.77,0,0.0],[86792.45,2,0.0],[86981.13,3,0.0],[87169.81,2,0.0],[87358.49,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[87547.17,3,283.01886],[87924.53,0,94.33962],[88113.21,1,283.01886],[88301.88,4,0.0],[88490.56,0,0.0],[88490.56,7,0.0],[88679.24,1,0.0],[88679.24,7,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[89056.6,5,283.01886],[89056.6,3,0.0],[89433.96,3,0.0],[89811.32,1,283.01886],[89811.32,7,0.0],[90000.0,4,0.0],[90188.68,6,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[90566.04,5,283.01886],[90566.04,0,0.0],[91132.08,3,0.0],[91698.11,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[92075.47,6,566.0377],[92075.47,2,566.0377],[92830.19,3,566.0377],[92830.19,4,566.0377]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[93773.5859,3,0.0],[93867.92,3,0.0],[93962.2656,2,0.0],[94150.9453,1,0.0],[94150.9453,7,0.0],[94245.28,7,0.0],[94339.625,0,283.01886],[94339.625,6,0.0],[94528.3047,5,0.0],[94716.9844,4,283.01886],[94905.6641,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[95283.0156,3,283.01886],[95471.6953,6,283.01886],[95849.0547,2,283.01886],[95849.0547,4,283.01886],[96226.4141,0,283.01886],[96226.4141,7,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[96603.77,3,0.0],[96792.45,7,94.33962],[96981.13,6,94.33962],[97169.81,5,94.33962],[97169.81,3,94.33962],[97358.49,4,283.01886],[97358.49,2,94.33962],[97547.17,1,94.33962],[97735.85,0,283.01886],[97735.85,5,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[98113.21,5,283.01886],[98113.21,0,283.01886],[98490.56,7,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[99811.32,3,0.0],[99905.6641,3,0.0],[100000.0,2,0.0],[100188.68,7,0.0],[100188.68,1,0.0],[100283.016,7,0.0],[100377.359,6,0.0],[100377.359,0,283.01886],[100566.039,5,0.0],[100754.719,4,283.01886],[100943.4,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[101320.758,3,283.01886],[101509.438,6,283.01886],[101886.789,2,283.01886],[101886.789,4,283.01886],[102264.148,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[102830.188,3,94.33962],[103018.867,2,94.33962],[103207.547,7,94.33962],[103207.547,1,94.33962],[103396.227,0,283.01886],[103396.227,6,94.33962],[103584.906,5,94.33962],[103773.586,1,283.01886],[103773.586,4,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[104150.945,0,283.01886],[104150.945,5,283.01886],[104528.305,7,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[105849.055,2,0.0],[106226.414,2,0.0],[106320.758,3,0.0],[106415.094,2,0.0],[106603.773,0,0.0],[106792.453,2,0.0],[106981.133,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[107169.813,1,0.0],[107358.492,0,0.0],[107547.172,3,283.01886],[107924.531,2,0.0],[108113.211,3,0.0],[108301.883,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[108867.922,2,0.0],[109245.281,2,0.0],[109339.625,3,0.0],[109433.961,2,0.0],[109622.641,0,0.0],[109811.32,2,0.0],[110000.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[110188.68,1,0.0],[110377.359,0,0.0],[110566.039,3,283.01886],[110943.4,2,0.0],[111132.078,3,0.0],[111320.758,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[111698.109,3,0.0],[111886.789,3,0.0],[112075.469,1,283.01886],[112452.828,0,0.0],[112830.188,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[113207.547,4,0.0],[113207.547,3,0.0],[113396.227,3,0.0],[113584.906,1,283.01886],[113962.266,0,0.0],[114150.945,0,0.0],[114339.625,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[114716.984,0,0.0],[114716.984,4,0.0],[114905.664,1,0.0],[114905.664,5,0.0],[115283.016,3,0.0],[115283.016,7,0.0],[115660.375,2,0.0],[115660.375,6,0.0],[116037.734,5,754.717],[116037.734,1,754.717]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[117924.531,0,0.0],[118301.883,3,0.0],[118490.563,1,0.0],[118679.242,0,0.0],[118867.922,2,0.0],[119056.6,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[119245.281,2,283.01886],[119622.641,3,283.01886],[120000.0,0,283.01886],[120377.359,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[120754.719,6,754.717],[120943.4,0,0.0],[121320.758,3,0.0],[121509.438,1,0.0],[121698.109,0,0.0],[121886.789,2,0.0],[122075.469,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[122264.148,2,283.01886],[122641.508,3,283.01886],[123018.867,0,283.01886],[123396.227,3,754.717]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[123773.586,1,94.33962],[124150.945,3,0.0],[124339.625,3,0.0],[124528.305,2,283.01886],[124905.664,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[125283.016,5,283.01886],[125283.016,2,0.0],[125471.695,3,0.0],[125660.375,1,283.01886],[126037.734,3,0.0],[126226.414,0,0.0],[126415.094,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[126792.453,0,0.0],[126792.453,4,0.0],[126981.133,1,0.0],[126981.133,5,0.0],[127358.492,3,0.0],[127358.492,7,0.0],[127735.852,2,0.0],[127735.852,6,0.0],[128113.211,1,377.3585],[128113.211,5,377.3585]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[129056.6,0,0.0],[129245.281,3,0.0],[129433.961,0,0.0],[129622.641,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[129811.32,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]}]},"generatedBy":"SNIFF ver.6"} \ No newline at end of file diff --git a/assets/preload/data/winter-horrorland/winter-horrorland.json b/assets/preload/data/winter-horrorland/winter-horrorland.json index a7b2f9f11..bb5c61e2e 100644 --- a/assets/preload/data/winter-horrorland/winter-horrorland.json +++ b/assets/preload/data/winter-horrorland/winter-horrorland.json @@ -1 +1 @@ -{"song":{"song":"Winter-Horrorland","bpm":159.0,"needsVoices":true,"player1":"bf-christmas","player2":"monster-christmas","speed":1.1,"notes":[{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[9433.962,0,283.01886],[9811.32,2,283.01886],[10188.68,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[10566.0381,0,660.3774],[11320.7549,2,660.3774]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[12452.83,0,283.01886],[12830.1885,2,283.01886],[13207.5469,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[13584.9053,1,0.0],[14339.623,3,283.01886],[14716.9814,2,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[15094.34,5,754.717],[15471.6982,0,283.01886],[15849.0566,2,283.01886],[16226.415,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[16603.7734,0,660.3774],[17358.49,2,660.3774]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[18490.5664,0,283.01886],[18867.9238,2,283.01886],[19245.2832,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[19622.64,1,0.0],[20377.36,3,283.01886],[20754.7168,2,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[21132.0762,1,283.01886],[21132.0762,5,754.717],[21509.4336,3,283.01886],[21886.793,2,283.01886],[22264.15,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[22641.51,1,471.69812],[23207.5469,0,0.0],[23396.2266,0,0.0],[23773.584,0,0.0],[23962.2637,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24150.9434,3,283.01886],[24528.3027,2,0.0],[24905.66,2,0.0],[25283.02,2,0.0],[25471.6973,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[25660.377,1,471.69812],[26226.416,2,0.0],[26415.0938,3,0.0],[26603.7734,2,0.0],[26792.4531,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[27169.81,1,283.01886],[27547.17,3,283.01886],[27924.5273,2,283.01886],[28301.8867,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[28679.2461,1,471.69812],[29245.2832,0,0.0],[29433.9629,0,0.0],[29811.32,0,0.0],[30000.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[30188.68,3,283.01886],[30566.0371,2,0.0],[30943.3965,2,0.0],[31320.7539,2,0.0],[31509.4336,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[31698.1133,1,471.69812],[32264.15,2,0.0],[32452.83,3,0.0],[32641.51,2,0.0],[32830.1875,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[33396.2266,3,0.0],[33584.9063,2,0.0],[33962.2656,0,283.01886],[34528.3,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[35094.34,2,283.01886],[35471.7,0,283.01886],[35849.0547,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[36603.7734,2,0.0],[36981.1328,0,283.01886],[37358.4922,1,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[37735.8477,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[39433.96,3,0.0],[39622.64,2,0.0],[40000.0,0,283.01886],[40566.04,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[41132.0742,2,283.01886],[41509.4336,0,283.01886],[41886.793,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[42641.5078,2,0.0],[43018.8672,0,283.01886],[43396.2266,1,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[43773.5859,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[45283.02,0,283.01886],[45660.38,1,283.01886],[46037.7344,2,0.0],[46415.0938,2,0.0],[46603.7734,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[46792.4531,5,283.01886],[47169.8125,0,0.0],[47547.168,3,0.0],[47924.5273,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[48301.8867,2,283.01886],[48301.8867,6,849.0566],[48679.2461,0,188.679245],[49056.6055,3,0.0],[49245.28,0,0.0],[49433.96,3,0.0],[49622.64,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[49937.1055,2,0.0],[50188.68,2,0.0],[50440.25,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[51320.7539,0,283.01886],[51698.1133,1,283.01886],[52075.4727,2,0.0],[52452.832,2,0.0],[52641.5078,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[52830.1875,5,283.01886],[53207.5469,0,0.0],[53584.9063,3,0.0],[53962.2656,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[54339.62,6,1132.07544],[54339.62,2,188.679245],[54716.98,0,188.679245],[55094.34,3,0.0],[55283.02,0,0.0],[55471.7,3,0.0],[55660.38,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[56037.7344,2,0.0],[56415.0938,2,0.0],[56603.7734,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[57547.168,2,0.0],[57924.5273,2,0.0],[58113.207,2,0.0],[58490.5664,2,0.0],[58679.2461,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[58867.9258,1,0.0],[59245.28,3,283.01886],[59622.64,2,0.0],[60000.0,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[60566.04,2,0.0],[60943.3945,2,0.0],[61132.0742,2,0.0],[61509.4336,2,0.0],[61698.1133,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[61886.793,1,0.0],[62264.1523,3,283.01886],[62641.5078,2,0.0],[63018.8672,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[63396.2266,3,0.0],[63773.5859,1,283.01886],[64150.94,0,0.0],[64528.3,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[64905.66,4,0.0],[64905.66,3,0.0],[65283.02,1,283.01886],[65660.375,0,0.0],[66037.7344,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[66415.09,4,0.0],[66415.09,0,0.0],[66981.13,7,0.0],[66981.13,3,0.0],[67358.49,6,0.0],[67358.49,2,0.0],[67735.85,5,754.717],[67735.85,1,754.717]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[69622.64,0,0.0],[69811.32,3,0.0],[70188.68,1,0.0],[70566.04,2,0.0],[70754.72,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[71132.08,2,0.0],[71320.76,1,0.0],[71698.11,2,0.0],[72075.47,0,0.0],[72264.15,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[72452.83,2,283.01886],[72830.19,0,283.01886],[73207.55,3,283.01886],[73584.91,0,0.0],[73773.5859,1,566.0377]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[74528.3047,0,0.0],[74716.9844,3,0.0],[74905.6641,0,0.0],[75094.3359,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[75660.375,0,0.0],[75849.0547,3,0.0],[76226.4141,1,0.0],[76603.77,2,0.0],[76792.45,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[77169.81,2,0.0],[77358.49,1,0.0],[77735.85,2,0.0],[78113.21,0,0.0],[78301.88,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[78490.56,2,283.01886],[78867.92,0,283.01886],[79245.28,3,283.01886],[79622.64,0,0.0],[79811.32,1,566.0377]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[80566.04,0,0.0],[80754.72,3,0.0],[80943.4,0,0.0],[81132.08,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[81509.44,1,0.0],[81886.79,3,0.0],[82264.15,0,0.0],[82641.51,2,0.0],[82830.19,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[83018.87,1,0.0],[83396.23,3,0.0],[83773.5859,0,0.0],[84150.9453,2,0.0],[84339.625,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[84528.3047,2,0.0],[84905.6641,2,0.0],[85094.3359,0,0.0],[85283.0156,2,0.0],[85660.375,2,0.0],[85849.0547,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[86037.7344,2,0.0],[86415.09,2,0.0],[86603.77,0,0.0],[86792.45,2,0.0],[87169.81,2,0.0],[87358.49,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[87547.17,3,283.01886],[87924.53,0,94.33962],[88113.21,1,283.01886],[88301.88,4,0.0],[88679.24,1,0.0],[88679.24,7,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[89056.6,5,283.01886],[89056.6,3,0.0],[89433.96,3,0.0],[89811.32,1,283.01886],[89811.32,7,0.0],[90188.68,6,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[90566.04,5,283.01886],[90566.04,0,0.0],[91132.08,3,0.0],[91698.11,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[92075.47,2,566.0377],[92075.47,6,566.0377],[92830.19,3,566.0377],[92830.19,4,566.0377]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[93773.5859,3,0.0],[93962.2656,2,0.0],[94150.9453,7,0.0],[94339.625,6,0.0],[94339.625,0,283.01886],[94716.9844,4,283.01886],[94905.6641,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[95283.0156,3,283.01886],[95471.6953,6,283.01886],[95849.0547,2,283.01886],[95849.0547,4,283.01886],[96226.4141,0,283.01886],[96226.4141,7,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[96603.77,3,0.0],[96981.13,6,0.0],[97358.49,2,0.0],[97358.49,4,283.01886],[97735.85,0,283.01886],[97735.85,5,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[98113.21,5,283.01886],[98113.21,0,283.01886],[98490.56,7,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[99811.32,3,0.0],[100000.0,2,0.0],[100188.68,7,0.0],[100377.359,0,283.01886],[100377.359,6,0.0],[100754.719,4,283.01886],[100943.4,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[101320.758,3,283.01886],[101509.438,6,283.01886],[101886.789,2,283.01886],[101886.789,4,283.01886],[102264.148,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[102830.188,3,94.33962],[103018.867,2,94.33962],[103207.547,7,94.33962],[103396.227,0,283.01886],[103396.227,6,94.33962],[103773.586,1,283.01886],[103773.586,4,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[104150.945,0,283.01886],[104150.945,5,283.01886],[104528.305,7,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[105849.055,2,0.0],[106226.414,2,0.0],[106415.094,2,0.0],[106792.453,2,0.0],[106981.133,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[107169.813,1,0.0],[107547.172,3,283.01886],[107924.531,2,0.0],[108301.883,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[108867.922,2,0.0],[109245.281,2,0.0],[109433.961,2,0.0],[109811.32,2,0.0],[110000.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[110188.68,1,0.0],[110566.039,3,283.01886],[110943.4,2,0.0],[111320.758,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[111698.109,3,0.0],[112075.469,1,283.01886],[112452.828,0,0.0],[112830.188,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[113207.547,3,0.0],[113207.547,4,0.0],[113584.906,1,283.01886],[113962.266,0,0.0],[114339.625,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[114716.984,4,0.0],[114716.984,0,0.0],[115283.016,7,0.0],[115283.016,3,0.0],[115660.375,6,0.0],[115660.375,2,0.0],[116037.734,5,754.717],[116037.734,1,754.717]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[117924.531,0,0.0],[118490.563,1,0.0],[118867.922,2,0.0],[119056.6,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[119245.281,2,283.01886],[119622.641,3,283.01886],[120000.0,0,283.01886],[120377.359,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[120754.719,6,754.717],[120943.4,0,0.0],[121509.438,1,0.0],[121886.789,2,0.0],[122075.469,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[122264.148,2,283.01886],[122641.508,3,283.01886],[123018.867,0,283.01886],[123396.227,3,754.717]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[123773.586,1,94.33962],[124150.945,3,0.0],[124528.305,2,283.01886],[124905.664,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[125283.016,5,283.01886],[125283.016,2,0.0],[125660.375,1,283.01886],[126037.734,3,0.0],[126226.414,0,0.0],[126415.094,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[126792.453,0,0.0],[126792.453,4,0.0],[127358.492,3,0.0],[127358.492,7,0.0],[127735.852,2,0.0],[127735.852,6,0.0],[128113.211,1,377.3585],[128113.211,5,377.3585]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[129056.6,0,0.0],[129245.281,3,0.0],[129433.961,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[129811.32,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]}]},"generatedBy":"SNIFF ver.6"} \ No newline at end of file +{"song":{"song":"Winter Horrorland","bpm":159.0,"needsVoices":true,"player1":"bf-christmas","player2":"monster-christmas","speed":1.1,"notes":[{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[9433.962,0,283.01886],[9811.32,2,283.01886],[10188.68,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[10566.0381,0,660.3774],[11320.7549,2,660.3774]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[12452.83,0,283.01886],[12830.1885,2,283.01886],[13207.5469,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[13584.9053,1,0.0],[14339.623,3,283.01886],[14716.9814,2,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[15094.34,5,754.717],[15471.6982,0,283.01886],[15849.0566,2,283.01886],[16226.415,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[16603.7734,0,660.3774],[17358.49,2,660.3774]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[18490.5664,0,283.01886],[18867.9238,2,283.01886],[19245.2832,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[19622.64,1,0.0],[20377.36,3,283.01886],[20754.7168,2,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[21132.0762,1,283.01886],[21132.0762,5,754.717],[21509.4336,3,283.01886],[21886.793,2,283.01886],[22264.15,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[22641.51,1,471.69812],[23207.5469,0,0.0],[23396.2266,0,0.0],[23773.584,0,0.0],[23962.2637,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24150.9434,3,283.01886],[24528.3027,2,0.0],[24905.66,2,0.0],[25283.02,2,0.0],[25471.6973,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[25660.377,1,471.69812],[26226.416,2,0.0],[26415.0938,3,0.0],[26603.7734,2,0.0],[26792.4531,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[27169.81,1,283.01886],[27547.17,3,283.01886],[27924.5273,2,283.01886],[28301.8867,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[28679.2461,1,471.69812],[29245.2832,0,0.0],[29433.9629,0,0.0],[29811.32,0,0.0],[30000.0,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[30188.68,3,283.01886],[30566.0371,2,0.0],[30943.3965,2,0.0],[31320.7539,2,0.0],[31509.4336,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[31698.1133,1,471.69812],[32264.15,2,0.0],[32452.83,3,0.0],[32641.51,2,0.0],[32830.1875,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[33396.2266,3,0.0],[33584.9063,2,0.0],[33962.2656,0,283.01886],[34528.3,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[35094.34,2,283.01886],[35471.7,0,283.01886],[35849.0547,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[36603.7734,2,0.0],[36981.1328,0,283.01886],[37358.4922,1,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[37735.8477,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[39433.96,3,0.0],[39622.64,2,0.0],[40000.0,0,283.01886],[40566.04,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[41132.0742,2,283.01886],[41509.4336,0,283.01886],[41886.793,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[42641.5078,2,0.0],[43018.8672,0,283.01886],[43396.2266,1,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[43773.5859,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[45283.02,0,283.01886],[45660.38,1,283.01886],[46037.7344,2,0.0],[46415.0938,2,0.0],[46603.7734,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[46792.4531,5,283.01886],[47169.8125,0,0.0],[47547.168,3,0.0],[47924.5273,1,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[48301.8867,2,283.01886],[48301.8867,6,849.0566],[48679.2461,0,188.679245],[49056.6055,3,0.0],[49245.28,0,0.0],[49433.96,3,0.0],[49622.64,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[49937.1055,2,0.0],[50188.68,2,0.0],[50440.25,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[51320.7539,0,283.01886],[51698.1133,1,283.01886],[52075.4727,2,0.0],[52452.832,2,0.0],[52641.5078,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[52830.1875,5,283.01886],[53207.5469,0,0.0],[53584.9063,3,0.0],[53962.2656,1,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[54339.62,6,1132.07544],[54339.62,2,188.679245],[54716.98,0,188.679245],[55094.34,3,0.0],[55283.02,0,0.0],[55471.7,3,0.0],[55660.38,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[56037.7344,2,0.0],[56415.0938,2,0.0],[56603.7734,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[57547.168,2,0.0],[57924.5273,2,0.0],[58113.207,2,0.0],[58490.5664,2,0.0],[58679.2461,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[58867.9258,1,0.0],[59245.28,3,283.01886],[59622.64,2,0.0],[60000.0,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[60566.04,2,0.0],[60943.3945,2,0.0],[61132.0742,2,0.0],[61509.4336,2,0.0],[61698.1133,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[61886.793,1,0.0],[62264.1523,3,283.01886],[62641.5078,2,0.0],[63018.8672,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[63396.2266,3,0.0],[63773.5859,1,283.01886],[64150.94,0,0.0],[64528.3,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[64905.66,4,0.0],[64905.66,3,0.0],[65283.02,1,283.01886],[65660.375,0,0.0],[66037.7344,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[66415.09,4,0.0],[66415.09,0,0.0],[66981.13,7,0.0],[66981.13,3,0.0],[67358.49,6,0.0],[67358.49,2,0.0],[67735.85,5,754.717],[67735.85,1,754.717]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[69622.64,0,0.0],[69811.32,3,0.0],[70188.68,1,0.0],[70566.04,2,0.0],[70754.72,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[71132.08,2,0.0],[71320.76,1,0.0],[71698.11,2,0.0],[72075.47,0,0.0],[72264.15,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[72452.83,2,283.01886],[72830.19,0,283.01886],[73207.55,3,283.01886],[73584.91,0,0.0],[73773.5859,1,566.0377]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[74528.3047,0,0.0],[74716.9844,3,0.0],[74905.6641,0,0.0],[75094.3359,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[75660.375,0,0.0],[75849.0547,3,0.0],[76226.4141,1,0.0],[76603.77,2,0.0],[76792.45,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[77169.81,2,0.0],[77358.49,1,0.0],[77735.85,2,0.0],[78113.21,0,0.0],[78301.88,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[78490.56,2,283.01886],[78867.92,0,283.01886],[79245.28,3,283.01886],[79622.64,0,0.0],[79811.32,1,566.0377]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[80566.04,0,0.0],[80754.72,3,0.0],[80943.4,0,0.0],[81132.08,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[81509.44,1,0.0],[81886.79,3,0.0],[82264.15,0,0.0],[82641.51,2,0.0],[82830.19,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[83018.87,1,0.0],[83396.23,3,0.0],[83773.5859,0,0.0],[84150.9453,2,0.0],[84339.625,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[84528.3047,2,0.0],[84905.6641,2,0.0],[85094.3359,0,0.0],[85283.0156,2,0.0],[85660.375,2,0.0],[85849.0547,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[86037.7344,2,0.0],[86415.09,2,0.0],[86603.77,0,0.0],[86792.45,2,0.0],[87169.81,2,0.0],[87358.49,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[87547.17,3,283.01886],[87924.53,0,94.33962],[88113.21,1,283.01886],[88301.88,4,0.0],[88679.24,1,0.0],[88679.24,7,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[89056.6,5,283.01886],[89056.6,3,0.0],[89433.96,3,0.0],[89811.32,1,283.01886],[89811.32,7,0.0],[90188.68,6,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[90566.04,5,283.01886],[90566.04,0,0.0],[91132.08,3,0.0],[91698.11,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[92075.47,2,566.0377],[92075.47,6,566.0377],[92830.19,3,566.0377],[92830.19,4,566.0377]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[93773.5859,3,0.0],[93962.2656,2,0.0],[94150.9453,7,0.0],[94339.625,6,0.0],[94339.625,0,283.01886],[94716.9844,4,283.01886],[94905.6641,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[95283.0156,3,283.01886],[95471.6953,6,283.01886],[95849.0547,2,283.01886],[95849.0547,4,283.01886],[96226.4141,0,283.01886],[96226.4141,7,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[96603.77,3,0.0],[96981.13,6,0.0],[97358.49,2,0.0],[97358.49,4,283.01886],[97735.85,0,283.01886],[97735.85,5,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[98113.21,5,283.01886],[98113.21,0,283.01886],[98490.56,7,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[99811.32,3,0.0],[100000.0,2,0.0],[100188.68,7,0.0],[100377.359,0,283.01886],[100377.359,6,0.0],[100754.719,4,283.01886],[100943.4,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[101320.758,3,283.01886],[101509.438,6,283.01886],[101886.789,2,283.01886],[101886.789,4,283.01886],[102264.148,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[102830.188,3,94.33962],[103018.867,2,94.33962],[103207.547,7,94.33962],[103396.227,0,283.01886],[103396.227,6,94.33962],[103773.586,1,283.01886],[103773.586,4,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[104150.945,0,283.01886],[104150.945,5,283.01886],[104528.305,7,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[105849.055,2,0.0],[106226.414,2,0.0],[106415.094,2,0.0],[106792.453,2,0.0],[106981.133,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[107169.813,1,0.0],[107547.172,3,283.01886],[107924.531,2,0.0],[108301.883,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[108867.922,2,0.0],[109245.281,2,0.0],[109433.961,2,0.0],[109811.32,2,0.0],[110000.0,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[110188.68,1,0.0],[110566.039,3,283.01886],[110943.4,2,0.0],[111320.758,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[111698.109,3,0.0],[112075.469,1,283.01886],[112452.828,0,0.0],[112830.188,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[113207.547,3,0.0],[113207.547,4,0.0],[113584.906,1,283.01886],[113962.266,0,0.0],[114339.625,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[114716.984,4,0.0],[114716.984,0,0.0],[115283.016,7,0.0],[115283.016,3,0.0],[115660.375,6,0.0],[115660.375,2,0.0],[116037.734,5,754.717],[116037.734,1,754.717]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[117924.531,0,0.0],[118490.563,1,0.0],[118867.922,2,0.0],[119056.6,3,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[119245.281,2,283.01886],[119622.641,3,283.01886],[120000.0,0,283.01886],[120377.359,3,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[120754.719,6,754.717],[120943.4,0,0.0],[121509.438,1,0.0],[121886.789,2,0.0],[122075.469,3,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[122264.148,2,283.01886],[122641.508,3,283.01886],[123018.867,0,283.01886],[123396.227,3,754.717]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[123773.586,1,94.33962],[124150.945,3,0.0],[124528.305,2,283.01886],[124905.664,0,283.01886]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[125283.016,5,283.01886],[125283.016,2,0.0],[125660.375,1,283.01886],[126037.734,3,0.0],[126226.414,0,0.0],[126415.094,0,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[126792.453,0,0.0],[126792.453,4,0.0],[127358.492,3,0.0],[127358.492,7,0.0],[127735.852,2,0.0],[127735.852,6,0.0],[128113.211,1,377.3585],[128113.211,5,377.3585]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[129056.6,0,0.0],[129245.281,3,0.0],[129433.961,0,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[129811.32,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[]}]},"generatedBy":"SNIFF ver.6"} \ No newline at end of file diff --git a/assets/preload/images/credits/bubba.png b/assets/preload/images/credits/bubba.png new file mode 100644 index 000000000..109c92623 Binary files /dev/null and b/assets/preload/images/credits/bubba.png differ diff --git a/assets/preload/images/credits/gedehari.png b/assets/preload/images/credits/gedehari.png new file mode 100644 index 000000000..df330144c Binary files /dev/null and b/assets/preload/images/credits/gedehari.png differ diff --git a/assets/preload/images/credits/kviks.png b/assets/preload/images/credits/kviks.png new file mode 100644 index 000000000..0e48cd46b Binary files /dev/null and b/assets/preload/images/credits/kviks.png differ diff --git a/assets/preload/images/credits/luckydog.png b/assets/preload/images/credits/luckydog.png new file mode 100644 index 000000000..dc4c85ca6 Binary files /dev/null and b/assets/preload/images/credits/luckydog.png differ diff --git a/assets/preload/images/credits/polybiusproxy.png b/assets/preload/images/credits/polybiusproxy.png new file mode 100644 index 000000000..6f9c8a1ff Binary files /dev/null and b/assets/preload/images/credits/polybiusproxy.png differ diff --git a/assets/preload/images/credits/sandplanet.png b/assets/preload/images/credits/sandplanet.png new file mode 100644 index 000000000..4b81b8fd9 Binary files /dev/null and b/assets/preload/images/credits/sandplanet.png differ diff --git a/assets/preload/images/credits/shubs.png b/assets/preload/images/credits/shubs.png new file mode 100644 index 000000000..2ad7bce51 Binary files /dev/null and b/assets/preload/images/credits/shubs.png differ diff --git a/assets/preload/images/dialogue/bf.json b/assets/preload/images/dialogue/bf.json new file mode 100644 index 000000000..4c4db8d71 --- /dev/null +++ b/assets/preload/images/dialogue/bf.json @@ -0,0 +1,63 @@ +{ + "position": [ + 0, + 50 + ], + "dialogue_pos": "right", + "scale": 1.25, + "image": "BF_Dialogue", + "animations": [ + { + "idle_offsets": [ + -1, + -11 + ], + "loop_offsets": [ + 0, + 0 + ], + "anim": "talk", + "idle_name": "BF0", + "loop_name": "BF LOOP" + }, + { + "idle_offsets": [ + 4, + -8 + ], + "anim": "excited", + "loop_offsets": [ + 5, + 0 + ], + "idle_name": "BF EXCITED0", + "loop_name": "BF EXCITED LOOP" + }, + { + "idle_offsets": [ + 0, + 0 + ], + "anim": "pissed", + "loop_offsets": [ + 0, + 0 + ], + "idle_name": "BF PISSED0", + "loop_name": "BF PISSED LOOP" + }, + { + "idle_offsets": [ + -6, + -11 + ], + "anim": "shocked", + "loop_offsets": [ + -4, + 0 + ], + "idle_name": "BF SHOCK0", + "loop_name": "BF SHOCK LOOP" + } + ] +} \ No newline at end of file diff --git a/assets/preload/images/dialogue/gf.json b/assets/preload/images/dialogue/gf.json new file mode 100644 index 000000000..26ace7559 --- /dev/null +++ b/assets/preload/images/dialogue/gf.json @@ -0,0 +1,63 @@ +{ + "position": [ + 20, + 40 + ], + "dialogue_pos": "center", + "scale": 1.3, + "image": "GF_Dialogue", + "animations": [ + { + "idle_offsets": [ + -3, + -6 + ], + "loop_offsets": [ + 0, + 1 + ], + "anim": "talk", + "idle_name": "GF0", + "loop_name": "GF LOOP" + }, + { + "idle_offsets": [ + 70, + -11 + ], + "anim": "shocked", + "loop_offsets": [ + 70, + 0 + ], + "idle_name": "GF SHOCK0", + "loop_name": "GF SHOCK LOOP" + }, + { + "idle_offsets": [ + -3, + -6 + ], + "anim": "confused", + "loop_offsets": [ + 0, + 0 + ], + "idle_name": "GF CONFUSED0", + "loop_name": "GF CONFUSED LOOP" + }, + { + "idle_offsets": [ + -3, + -6 + ], + "anim": "demon", + "loop_offsets": [ + 0, + 0 + ], + "idle_name": "GF DEMON0", + "loop_name": "GF DEMON LOOP" + } + ] +} \ No newline at end of file diff --git a/assets/preload/images/hahadumb.png b/assets/preload/images/hahadumb.png new file mode 100644 index 000000000..c3b9b70b1 Binary files /dev/null and b/assets/preload/images/hahadumb.png differ diff --git a/assets/preload/images/icons/icon-senpai.png b/assets/preload/images/icons/icon-senpai-pixel.png similarity index 100% rename from assets/preload/images/icons/icon-senpai.png rename to assets/preload/images/icons/icon-senpai-pixel.png diff --git a/assets/preload/images/icons/icon-spirit.png b/assets/preload/images/icons/icon-spirit-pixel.png similarity index 100% rename from assets/preload/images/icons/icon-spirit.png rename to assets/preload/images/icons/icon-spirit-pixel.png diff --git a/assets/preload/images/menucharacters/bf.json b/assets/preload/images/menucharacters/bf.json new file mode 100644 index 000000000..9fb104979 --- /dev/null +++ b/assets/preload/images/menucharacters/bf.json @@ -0,0 +1,11 @@ +{ + + "image": "Menu_BF", + "position": [ + 15, + -40 + ], + "scale": 1, + "idle_anim": "M BF Idle", + "confirm_anim": "M bf HEY" +} \ No newline at end of file diff --git a/assets/preload/images/menucharacters/dad.json b/assets/preload/images/menucharacters/dad.json new file mode 100644 index 000000000..73069707c --- /dev/null +++ b/assets/preload/images/menucharacters/dad.json @@ -0,0 +1,11 @@ +{ + + "image": "Menu_Dad", + "position": [ + 0, + 0 + ], + "scale": 1, + "idle_anim": "M Dad Idle", + "confirm_anim": "M Dad Idle" +} \ No newline at end of file diff --git a/assets/preload/images/menucharacters/gf.json b/assets/preload/images/menucharacters/gf.json new file mode 100644 index 000000000..bdd62cecc --- /dev/null +++ b/assets/preload/images/menucharacters/gf.json @@ -0,0 +1,11 @@ +{ + + "image": "Menu_GF", + "position": [ + 0, + -25 + ], + "scale": 1, + "idle_anim": "M GF Idle", + "confirm_anim": "M GF Idle" +} \ No newline at end of file diff --git a/assets/preload/images/menucharacters/mom.json b/assets/preload/images/menucharacters/mom.json new file mode 100644 index 000000000..fd9c74aa9 --- /dev/null +++ b/assets/preload/images/menucharacters/mom.json @@ -0,0 +1,10 @@ +{ + "idle_anim": "M Mom Idle", + "image": "Menu_Mom", + "position": [ + 0, + 10 + ], + "scale": 1, + "confirm_anim": "M Dad Idle" +} \ No newline at end of file diff --git a/assets/preload/images/menucharacters/parents-christmas.json b/assets/preload/images/menucharacters/parents-christmas.json new file mode 100644 index 000000000..9c9af269d --- /dev/null +++ b/assets/preload/images/menucharacters/parents-christmas.json @@ -0,0 +1,10 @@ +{ + "idle_anim": "M Parents Idle", + "image": "Menu_Parents", + "position": [ + 110, + 10 + ], + "scale": 1, + "confirm_anim": "M Dad Idle" +} \ No newline at end of file diff --git a/assets/preload/images/menucharacters/pico.json b/assets/preload/images/menucharacters/pico.json new file mode 100644 index 000000000..331ae2175 --- /dev/null +++ b/assets/preload/images/menucharacters/pico.json @@ -0,0 +1,10 @@ +{ + "idle_anim": "M Pico Idle", + "image": "Menu_Pico", + "position": [ + 0, + -120 + ], + "scale": 1, + "confirm_anim": "M Dad Idle" +} \ No newline at end of file diff --git a/assets/preload/images/menucharacters/senpai.json b/assets/preload/images/menucharacters/senpai.json new file mode 100644 index 000000000..b6c3fa687 --- /dev/null +++ b/assets/preload/images/menucharacters/senpai.json @@ -0,0 +1,10 @@ +{ + "idle_anim": "M Senpai Idle", + "image": "Menu_Senpai", + "position": [ + 60, + -70 + ], + "scale": 1, + "confirm_anim": "M Dad Idle" +} \ No newline at end of file diff --git a/assets/preload/images/menucharacters/spooky.json b/assets/preload/images/menucharacters/spooky.json new file mode 100644 index 000000000..0084338ba --- /dev/null +++ b/assets/preload/images/menucharacters/spooky.json @@ -0,0 +1,10 @@ +{ + "idle_anim": "M Spooky Kids Idle", + "image": "Menu_Spooky_Kids", + "position": [ + 0, + -80 + ], + "scale": 1, + "confirm_anim": "M Dad Idle" +} \ No newline at end of file diff --git a/assets/week6/images/weeb/pixelUI/HURTNOTE_assets.png b/assets/preload/images/pixelUI/HURTNOTE_assets.png similarity index 100% rename from assets/week6/images/weeb/pixelUI/HURTNOTE_assets.png rename to assets/preload/images/pixelUI/HURTNOTE_assets.png diff --git a/assets/week6/images/weeb/pixelUI/HURTNOTE_assetsENDS.png b/assets/preload/images/pixelUI/HURTNOTE_assetsENDS.png similarity index 100% rename from assets/week6/images/weeb/pixelUI/HURTNOTE_assetsENDS.png rename to assets/preload/images/pixelUI/HURTNOTE_assetsENDS.png diff --git a/assets/week6/images/weeb/pixelUI/NOTE_assets.png b/assets/preload/images/pixelUI/NOTE_assets.png similarity index 100% rename from assets/week6/images/weeb/pixelUI/NOTE_assets.png rename to assets/preload/images/pixelUI/NOTE_assets.png diff --git a/assets/week6/images/weeb/pixelUI/NOTE_assetsENDS.png b/assets/preload/images/pixelUI/NOTE_assetsENDS.png similarity index 100% rename from assets/week6/images/weeb/pixelUI/NOTE_assetsENDS.png rename to assets/preload/images/pixelUI/NOTE_assetsENDS.png diff --git a/assets/week6/images/weeb/pixelUI/bad-pixel.png b/assets/preload/images/pixelUI/bad-pixel.png similarity index 100% rename from assets/week6/images/weeb/pixelUI/bad-pixel.png rename to assets/preload/images/pixelUI/bad-pixel.png diff --git a/assets/week6/images/weeb/pixelUI/combo-pixel.png b/assets/preload/images/pixelUI/combo-pixel.png similarity index 100% rename from assets/week6/images/weeb/pixelUI/combo-pixel.png rename to assets/preload/images/pixelUI/combo-pixel.png diff --git a/assets/week6/images/weeb/pixelUI/date-pixel.png b/assets/preload/images/pixelUI/date-pixel.png similarity index 100% rename from assets/week6/images/weeb/pixelUI/date-pixel.png rename to assets/preload/images/pixelUI/date-pixel.png diff --git a/assets/week6/images/weeb/pixelUI/good-pixel.png b/assets/preload/images/pixelUI/good-pixel.png similarity index 100% rename from assets/week6/images/weeb/pixelUI/good-pixel.png rename to assets/preload/images/pixelUI/good-pixel.png diff --git a/assets/week6/images/weeb/pixelUI/num0-pixel.png b/assets/preload/images/pixelUI/num0-pixel.png similarity index 100% rename from assets/week6/images/weeb/pixelUI/num0-pixel.png rename to assets/preload/images/pixelUI/num0-pixel.png diff --git a/assets/week6/images/weeb/pixelUI/num1-pixel.png b/assets/preload/images/pixelUI/num1-pixel.png similarity index 100% rename from assets/week6/images/weeb/pixelUI/num1-pixel.png rename to assets/preload/images/pixelUI/num1-pixel.png diff --git a/assets/week6/images/weeb/pixelUI/num2-pixel.png b/assets/preload/images/pixelUI/num2-pixel.png similarity index 100% rename from assets/week6/images/weeb/pixelUI/num2-pixel.png rename to assets/preload/images/pixelUI/num2-pixel.png diff --git a/assets/week6/images/weeb/pixelUI/num3-pixel.png b/assets/preload/images/pixelUI/num3-pixel.png similarity index 100% rename from assets/week6/images/weeb/pixelUI/num3-pixel.png rename to assets/preload/images/pixelUI/num3-pixel.png diff --git a/assets/week6/images/weeb/pixelUI/num4-pixel.png b/assets/preload/images/pixelUI/num4-pixel.png similarity index 100% rename from assets/week6/images/weeb/pixelUI/num4-pixel.png rename to assets/preload/images/pixelUI/num4-pixel.png diff --git a/assets/week6/images/weeb/pixelUI/num5-pixel.png b/assets/preload/images/pixelUI/num5-pixel.png similarity index 100% rename from assets/week6/images/weeb/pixelUI/num5-pixel.png rename to assets/preload/images/pixelUI/num5-pixel.png diff --git a/assets/week6/images/weeb/pixelUI/num6-pixel.png b/assets/preload/images/pixelUI/num6-pixel.png similarity index 100% rename from assets/week6/images/weeb/pixelUI/num6-pixel.png rename to assets/preload/images/pixelUI/num6-pixel.png diff --git a/assets/week6/images/weeb/pixelUI/num7-pixel.png b/assets/preload/images/pixelUI/num7-pixel.png similarity index 100% rename from assets/week6/images/weeb/pixelUI/num7-pixel.png rename to assets/preload/images/pixelUI/num7-pixel.png diff --git a/assets/week6/images/weeb/pixelUI/num8-pixel.png b/assets/preload/images/pixelUI/num8-pixel.png similarity index 100% rename from assets/week6/images/weeb/pixelUI/num8-pixel.png rename to assets/preload/images/pixelUI/num8-pixel.png diff --git a/assets/week6/images/weeb/pixelUI/num9-pixel.png b/assets/preload/images/pixelUI/num9-pixel.png similarity index 100% rename from assets/week6/images/weeb/pixelUI/num9-pixel.png rename to assets/preload/images/pixelUI/num9-pixel.png diff --git a/assets/week6/images/weeb/pixelUI/ready-pixel.png b/assets/preload/images/pixelUI/ready-pixel.png similarity index 100% rename from assets/week6/images/weeb/pixelUI/ready-pixel.png rename to assets/preload/images/pixelUI/ready-pixel.png diff --git a/assets/week6/images/weeb/pixelUI/set-pixel.png b/assets/preload/images/pixelUI/set-pixel.png similarity index 100% rename from assets/week6/images/weeb/pixelUI/set-pixel.png rename to assets/preload/images/pixelUI/set-pixel.png diff --git a/assets/week6/images/weeb/pixelUI/shit-pixel.png b/assets/preload/images/pixelUI/shit-pixel.png similarity index 100% rename from assets/week6/images/weeb/pixelUI/shit-pixel.png rename to assets/preload/images/pixelUI/shit-pixel.png diff --git a/assets/week6/images/weeb/pixelUI/sick-pixel.png b/assets/preload/images/pixelUI/sick-pixel.png similarity index 100% rename from assets/week6/images/weeb/pixelUI/sick-pixel.png rename to assets/preload/images/pixelUI/sick-pixel.png diff --git a/assets/preload/images/psyka.png b/assets/preload/images/psyka.png new file mode 100644 index 000000000..be3703db8 Binary files /dev/null and b/assets/preload/images/psyka.png differ diff --git a/assets/preload/images/psykaDanceTitle.png b/assets/preload/images/psykaDanceTitle.png new file mode 100644 index 000000000..3788f1dad Binary files /dev/null and b/assets/preload/images/psykaDanceTitle.png differ diff --git a/assets/preload/images/psykaDanceTitle.xml b/assets/preload/images/psykaDanceTitle.xml new file mode 100644 index 000000000..da8b4cb2e --- /dev/null +++ b/assets/preload/images/psykaDanceTitle.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/preload/images/storymenu/week0.png b/assets/preload/images/storymenu/tutorial.png similarity index 100% rename from assets/preload/images/storymenu/week0.png rename to assets/preload/images/storymenu/tutorial.png diff --git a/assets/week6/sounds/intro1-pixel.mp3 b/assets/preload/sounds/intro1-pixel.mp3 similarity index 100% rename from assets/week6/sounds/intro1-pixel.mp3 rename to assets/preload/sounds/intro1-pixel.mp3 diff --git a/assets/week6/sounds/intro1-pixel.ogg b/assets/preload/sounds/intro1-pixel.ogg similarity index 100% rename from assets/week6/sounds/intro1-pixel.ogg rename to assets/preload/sounds/intro1-pixel.ogg diff --git a/assets/week6/sounds/intro2-pixel.mp3 b/assets/preload/sounds/intro2-pixel.mp3 similarity index 100% rename from assets/week6/sounds/intro2-pixel.mp3 rename to assets/preload/sounds/intro2-pixel.mp3 diff --git a/assets/week6/sounds/intro2-pixel.ogg b/assets/preload/sounds/intro2-pixel.ogg similarity index 100% rename from assets/week6/sounds/intro2-pixel.ogg rename to assets/preload/sounds/intro2-pixel.ogg diff --git a/assets/week6/sounds/intro3-pixel.mp3 b/assets/preload/sounds/intro3-pixel.mp3 similarity index 100% rename from assets/week6/sounds/intro3-pixel.mp3 rename to assets/preload/sounds/intro3-pixel.mp3 diff --git a/assets/week6/sounds/intro3-pixel.ogg b/assets/preload/sounds/intro3-pixel.ogg similarity index 100% rename from assets/week6/sounds/intro3-pixel.ogg rename to assets/preload/sounds/intro3-pixel.ogg diff --git a/assets/week6/sounds/introGo-pixel.mp3 b/assets/preload/sounds/introGo-pixel.mp3 similarity index 100% rename from assets/week6/sounds/introGo-pixel.mp3 rename to assets/preload/sounds/introGo-pixel.mp3 diff --git a/assets/week6/sounds/introGo-pixel.ogg b/assets/preload/sounds/introGo-pixel.ogg similarity index 100% rename from assets/week6/sounds/introGo-pixel.ogg rename to assets/preload/sounds/introGo-pixel.ogg diff --git a/assets/preload/sounds/secretSound.mp3 b/assets/preload/sounds/secretSound.mp3 new file mode 100644 index 000000000..0da07c44f Binary files /dev/null and b/assets/preload/sounds/secretSound.mp3 differ diff --git a/assets/preload/sounds/secretSound.ogg b/assets/preload/sounds/secretSound.ogg new file mode 100644 index 000000000..760554987 Binary files /dev/null and b/assets/preload/sounds/secretSound.ogg differ diff --git a/assets/preload/stages/limo.json b/assets/preload/stages/limo.json new file mode 100644 index 000000000..f628cb34b --- /dev/null +++ b/assets/preload/stages/limo.json @@ -0,0 +1,9 @@ +{ + "directory": "week4", + "defaultZoom": 0.9, + "isPixelStage": false, + + "boyfriend": [1030, -120], + "girlfriend": [400, 130], + "opponent": [100, 100] +} \ No newline at end of file diff --git a/assets/preload/stages/mall.json b/assets/preload/stages/mall.json new file mode 100644 index 000000000..08b380dfc --- /dev/null +++ b/assets/preload/stages/mall.json @@ -0,0 +1,9 @@ +{ + "directory": "week5", + "defaultZoom": 0.8, + "isPixelStage": false, + + "boyfriend": [970, 100], + "girlfriend": [400, 130], + "opponent": [100, 100] +} \ No newline at end of file diff --git a/assets/preload/stages/mallEvil.json b/assets/preload/stages/mallEvil.json new file mode 100644 index 000000000..360e5b820 --- /dev/null +++ b/assets/preload/stages/mallEvil.json @@ -0,0 +1,9 @@ +{ + "directory": "week5", + "defaultZoom": 1.05, + "isPixelStage": false, + + "boyfriend": [1090, 100], + "girlfriend": [400, 130], + "opponent": [100, 20] +} \ No newline at end of file diff --git a/assets/preload/stages/philly.json b/assets/preload/stages/philly.json new file mode 100644 index 000000000..9b8fdec24 --- /dev/null +++ b/assets/preload/stages/philly.json @@ -0,0 +1,9 @@ +{ + "directory": "week3", + "defaultZoom": 1.05, + "isPixelStage": false, + + "boyfriend": [770, 100], + "girlfriend": [400, 130], + "opponent": [100, 100] +} \ No newline at end of file diff --git a/assets/preload/stages/school.json b/assets/preload/stages/school.json new file mode 100644 index 000000000..2b1c6e4c5 --- /dev/null +++ b/assets/preload/stages/school.json @@ -0,0 +1,9 @@ +{ + "directory": "week6", + "defaultZoom": 1.05, + "isPixelStage": true, + + "boyfriend": [970, 320], + "girlfriend": [580, 430], + "opponent": [100, 100] +} \ No newline at end of file diff --git a/assets/preload/stages/schoolEvil.json b/assets/preload/stages/schoolEvil.json new file mode 100644 index 000000000..2b1c6e4c5 --- /dev/null +++ b/assets/preload/stages/schoolEvil.json @@ -0,0 +1,9 @@ +{ + "directory": "week6", + "defaultZoom": 1.05, + "isPixelStage": true, + + "boyfriend": [970, 320], + "girlfriend": [580, 430], + "opponent": [100, 100] +} \ No newline at end of file diff --git a/assets/preload/stages/spooky.json b/assets/preload/stages/spooky.json new file mode 100644 index 000000000..3e65425fa --- /dev/null +++ b/assets/preload/stages/spooky.json @@ -0,0 +1,9 @@ +{ + "directory": "week2", + "defaultZoom": 1.05, + "isPixelStage": false, + + "boyfriend": [770, 100], + "girlfriend": [400, 130], + "opponent": [100, 100] +} \ No newline at end of file diff --git a/assets/preload/stages/stage.json b/assets/preload/stages/stage.json new file mode 100644 index 000000000..674ee120c --- /dev/null +++ b/assets/preload/stages/stage.json @@ -0,0 +1,9 @@ +{ + "directory": "", + "defaultZoom": 0.9, + "isPixelStage": false, + + "boyfriend": [770, 100], + "girlfriend": [400, 130], + "opponent": [100, 100] +} \ No newline at end of file diff --git a/assets/preload/weeks/tutorial.json b/assets/preload/weeks/tutorial.json new file mode 100644 index 000000000..6ac6083f2 --- /dev/null +++ b/assets/preload/weeks/tutorial.json @@ -0,0 +1,20 @@ +{ + "songs": [ + ["Tutorial", "gf", [165, 0, 77]] + ], + + "weekCharacters": [ + "", + "bf", + "gf" + ], + "weekBackground": "stage", + + "storyName": "", + "weekBefore": "tutorial", + "weekName": "Tutorial", + "startUnlocked": true, + + "hideStoryMode": false, + "hideFreeplay": false +} diff --git a/assets/preload/weeks/week1.json b/assets/preload/weeks/week1.json new file mode 100644 index 000000000..1ff2b009c --- /dev/null +++ b/assets/preload/weeks/week1.json @@ -0,0 +1,22 @@ +{ + "songs": [ + ["Bopeebo", "dad", [146, 113, 253]], + ["Fresh", "dad", [146, 113, 253]], + ["Dad Battle", "dad", [146, 113, 253]] + ], + + "weekCharacters": [ + "dad", + "bf", + "gf" + ], + "weekBackground": "stage", + + "storyName": "Daddy Dearest", + "weekBefore": "tutorial", + "weekName": "Week 1", + "startUnlocked": true, + + "hideStoryMode": false, + "hideFreeplay": false +} \ No newline at end of file diff --git a/assets/preload/weeks/week2.json b/assets/preload/weeks/week2.json new file mode 100644 index 000000000..54f063903 --- /dev/null +++ b/assets/preload/weeks/week2.json @@ -0,0 +1,22 @@ +{ + "songs": [ + ["Spookeez", "spooky", [34, 51, 68]], + ["South", "spooky", [34, 51, 68]], + ["Monster", "monster", [34, 51, 68]] + ], + + "weekCharacters": [ + "spooky", + "bf", + "gf" + ], + "weekBackground": "halloween", + + "storyName": "Spooky Month", + "weekBefore": "week1", + "weekName": "Week 2", + "startUnlocked": true, + + "hideStoryMode": false, + "hideFreeplay": false +} \ No newline at end of file diff --git a/assets/preload/weeks/week3.json b/assets/preload/weeks/week3.json new file mode 100644 index 000000000..3a86b4c37 --- /dev/null +++ b/assets/preload/weeks/week3.json @@ -0,0 +1,22 @@ +{ + "songs": [ + ["Pico", "pico", [148, 22, 83]], + ["Philly Nice", "pico", [148, 22, 83]], + ["Blammed", "pico", [148, 22, 83]] + ], + + "weekCharacters": [ + "pico", + "bf", + "gf" + ], + "weekBackground": "philly", + + "storyName": "PICO", + "weekBefore": "week2", + "weekName": "Week 3", + "startUnlocked": true, + + "hideStoryMode": false, + "hideFreeplay": false +} \ No newline at end of file diff --git a/assets/preload/weeks/week4.json b/assets/preload/weeks/week4.json new file mode 100644 index 000000000..c71985632 --- /dev/null +++ b/assets/preload/weeks/week4.json @@ -0,0 +1,22 @@ +{ + "songs": [ + ["Satin Panties", "mom", [252, 150, 215]], + ["High", "mom", [252, 150, 215]], + ["Milf", "mom", [252, 150, 215]] + ], + + "weekCharacters": [ + "mom", + "bf", + "gf" + ], + "weekBackground": "limo", + + "storyName": "MOMMY MUST MURDER", + "weekBefore": "week3", + "weekName": "Week 4", + "startUnlocked": true, + + "hideStoryMode": false, + "hideFreeplay": false +} \ No newline at end of file diff --git a/assets/preload/weeks/week5.json b/assets/preload/weeks/week5.json new file mode 100644 index 000000000..6d4102f77 --- /dev/null +++ b/assets/preload/weeks/week5.json @@ -0,0 +1,22 @@ +{ + "songs": [ + ["Cocoa", "parents", [160, 209, 255]], + ["Eggnog", "parents", [160, 209, 255]], + ["Winter Horrorland", "monster", [160, 209, 255]] + ], + + "weekCharacters": [ + "parents-christmas", + "bf", + "gf" + ], + "weekBackground": "christmas", + + "storyName": "RED SNOW", + "weekBefore": "week4", + "weekName": "Week 5", + "startUnlocked": true, + + "hideStoryMode": false, + "hideFreeplay": false +} \ No newline at end of file diff --git a/assets/preload/weeks/week6.json b/assets/preload/weeks/week6.json new file mode 100644 index 000000000..95c735d6d --- /dev/null +++ b/assets/preload/weeks/week6.json @@ -0,0 +1,22 @@ +{ + "songs": [ + ["Senpai", "senpai-pixel", [255, 120, 191]], + ["Roses", "senpai-pixel", [255, 120, 191]], + ["Thorns", "spirit-pixel", [255, 120, 191]] + ], + + "weekCharacters": [ + "senpai", + "bf", + "gf" + ], + "weekBackground": "school", + + "storyName": "hating simulator ft. moawling", + "weekBefore": "week5", + "weekName": "Week 6", + "startUnlocked": true, + + "hideStoryMode": false, + "hideFreeplay": false +} \ No newline at end of file diff --git a/assets/preload/weeks/weekList.txt b/assets/preload/weeks/weekList.txt new file mode 100644 index 000000000..55c6d900f --- /dev/null +++ b/assets/preload/weeks/weekList.txt @@ -0,0 +1,7 @@ +tutorial +week1 +week2 +week3 +week4 +week5 +week6 \ No newline at end of file diff --git a/assets/shared/images/characters/DADDY_DEAREST.png b/assets/shared/images/characters/DADDY_DEAREST.png index ebe43bc3a..1c6a5d978 100644 Binary files a/assets/shared/images/characters/DADDY_DEAREST.png and b/assets/shared/images/characters/DADDY_DEAREST.png differ diff --git a/assets/shared/images/characters/DADDY_DEAREST.xml b/assets/shared/images/characters/DADDY_DEAREST.xml index 5ef329130..f4b37f4d6 100644 --- a/assets/shared/images/characters/DADDY_DEAREST.xml +++ b/assets/shared/images/characters/DADDY_DEAREST.xml @@ -1,129 +1,153 @@  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/shared/images/characters/Mom_Assets.xml b/assets/shared/images/characters/Mom_Assets.xml index 67eeb6b74..2ee00093c 100644 --- a/assets/shared/images/characters/Mom_Assets.xml +++ b/assets/shared/images/characters/Mom_Assets.xml @@ -15,8 +15,6 @@ - - diff --git a/assets/shared/images/dialogue/BF_Dialogue.png b/assets/shared/images/dialogue/BF_Dialogue.png index d8f5aecc1..1086ce405 100644 Binary files a/assets/shared/images/dialogue/BF_Dialogue.png and b/assets/shared/images/dialogue/BF_Dialogue.png differ diff --git a/assets/shared/images/dialogue/BF_Dialogue.xml b/assets/shared/images/dialogue/BF_Dialogue.xml index 2dc9c0ec5..8ce0762b4 100644 --- a/assets/shared/images/dialogue/BF_Dialogue.xml +++ b/assets/shared/images/dialogue/BF_Dialogue.xml @@ -2,11 +2,44 @@ - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/shared/images/dialogue/GF_Dialogue.png b/assets/shared/images/dialogue/GF_Dialogue.png new file mode 100644 index 000000000..d2590064f Binary files /dev/null and b/assets/shared/images/dialogue/GF_Dialogue.png differ diff --git a/assets/shared/images/dialogue/GF_Dialogue.xml b/assets/shared/images/dialogue/GF_Dialogue.xml new file mode 100644 index 000000000..77c7fb2d4 --- /dev/null +++ b/assets/shared/images/dialogue/GF_Dialogue.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/shared/images/dialogue/Psy_Dialogue.png b/assets/shared/images/dialogue/Psy_Dialogue.png deleted file mode 100644 index d0a05c062..000000000 Binary files a/assets/shared/images/dialogue/Psy_Dialogue.png and /dev/null differ diff --git a/assets/shared/images/dialogue/Psy_Dialogue.xml b/assets/shared/images/dialogue/Psy_Dialogue.xml deleted file mode 100644 index 3816cc0f0..000000000 --- a/assets/shared/images/dialogue/Psy_Dialogue.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/shared/images/funkay.png b/assets/shared/images/funkay.png new file mode 100644 index 000000000..01c3ef79a Binary files /dev/null and b/assets/shared/images/funkay.png differ diff --git a/assets/shared/sounds/ChartingTick.mp3 b/assets/shared/sounds/ChartingTick.mp3 new file mode 100644 index 000000000..fe275dfa1 Binary files /dev/null and b/assets/shared/sounds/ChartingTick.mp3 differ diff --git a/assets/shared/sounds/ChartingTick.ogg b/assets/shared/sounds/ChartingTick.ogg new file mode 100644 index 000000000..67b1f99df Binary files /dev/null and b/assets/shared/sounds/ChartingTick.ogg differ diff --git a/assets/shared/sounds/Charting_1.mp3 b/assets/shared/sounds/Charting_1.mp3 deleted file mode 100644 index ccf3f4af3..000000000 Binary files a/assets/shared/sounds/Charting_1.mp3 and /dev/null differ diff --git a/assets/shared/sounds/Charting_1.ogg b/assets/shared/sounds/Charting_1.ogg deleted file mode 100644 index 7412e013f..000000000 Binary files a/assets/shared/sounds/Charting_1.ogg and /dev/null differ diff --git a/assets/shared/sounds/Charting_2.mp3 b/assets/shared/sounds/Charting_2.mp3 deleted file mode 100644 index 5e9bc7145..000000000 Binary files a/assets/shared/sounds/Charting_2.mp3 and /dev/null differ diff --git a/assets/shared/sounds/Charting_2.ogg b/assets/shared/sounds/Charting_2.ogg deleted file mode 100644 index 0ce1cb575..000000000 Binary files a/assets/shared/sounds/Charting_2.ogg and /dev/null differ diff --git a/assets/shared/sounds/Charting_3.mp3 b/assets/shared/sounds/Charting_3.mp3 deleted file mode 100644 index 485cf6cee..000000000 Binary files a/assets/shared/sounds/Charting_3.mp3 and /dev/null differ diff --git a/assets/shared/sounds/Charting_3.ogg b/assets/shared/sounds/Charting_3.ogg deleted file mode 100644 index 49be63edf..000000000 Binary files a/assets/shared/sounds/Charting_3.ogg and /dev/null differ diff --git a/assets/shared/sounds/Charting_4.mp3 b/assets/shared/sounds/Charting_4.mp3 deleted file mode 100644 index 75266a3f6..000000000 Binary files a/assets/shared/sounds/Charting_4.mp3 and /dev/null differ diff --git a/assets/shared/sounds/Charting_4.ogg b/assets/shared/sounds/Charting_4.ogg deleted file mode 100644 index cff837b7c..000000000 Binary files a/assets/shared/sounds/Charting_4.ogg and /dev/null differ diff --git a/assets/songs/hot-dilf/Inst.ogg b/assets/songs/hot-dilf/Inst.ogg new file mode 100644 index 000000000..49f24f1bd Binary files /dev/null and b/assets/songs/hot-dilf/Inst.ogg differ diff --git a/assets/songs/hot-dilf/Voices.ogg b/assets/songs/hot-dilf/Voices.ogg new file mode 100644 index 000000000..ec973b4d7 Binary files /dev/null and b/assets/songs/hot-dilf/Voices.ogg differ diff --git a/assets/tutorial/tutorial_stuff_here.txt b/assets/tutorial/tutorial_stuff_here.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/assets/week1/week1_stuff_here.txt b/assets/week1/week1_stuff_here.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/example_mods/characters/readme.txt b/example_mods/characters/readme.txt index 4bbf64455..948a19e12 100644 --- a/example_mods/characters/readme.txt +++ b/example_mods/characters/readme.txt @@ -1 +1 @@ -put your custom character .json files here! \ No newline at end of file +Put your custom character .json files here! \ No newline at end of file diff --git a/example_mods/custom_events/readme.txt b/example_mods/custom_events/readme.txt new file mode 100644 index 000000000..0006a1f7e --- /dev/null +++ b/example_mods/custom_events/readme.txt @@ -0,0 +1,3 @@ +Add your custom event's .txt file and .lua file here + +The .txt file is the event's description on Chart Editor \ No newline at end of file diff --git a/example_mods/custom_notetypes/readme.txt b/example_mods/custom_notetypes/readme.txt new file mode 100644 index 000000000..3c356deb8 --- /dev/null +++ b/example_mods/custom_notetypes/readme.txt @@ -0,0 +1 @@ +Add your custom note type's .lua file here \ No newline at end of file diff --git a/example_mods/data/readme.txt b/example_mods/data/readme.txt new file mode 100644 index 000000000..90fb593c0 --- /dev/null +++ b/example_mods/data/readme.txt @@ -0,0 +1 @@ +Put your custom charts here \ No newline at end of file diff --git a/example_mods/images/characters/readme.txt b/example_mods/images/characters/readme.txt index e166cac73..d4b9ddd98 100644 --- a/example_mods/images/characters/readme.txt +++ b/example_mods/images/characters/readme.txt @@ -1 +1 @@ -put your custom character image and .xml/.txt files here! \ No newline at end of file +Put your custom character image and .xml/.txt files here! \ No newline at end of file diff --git a/example_mods/images/dialogue/readme.txt b/example_mods/images/dialogue/readme.txt new file mode 100644 index 000000000..741cd4ce7 --- /dev/null +++ b/example_mods/images/dialogue/readme.txt @@ -0,0 +1,4 @@ +Drop your Dialogue characters shit here + +If you're asking "How do i make dialogues play?" or any other questions, read this: +https://github.com/ShadowMario/FNF-PsychEngine/wiki/Dialogues \ No newline at end of file diff --git a/example_mods/images/icons/readme.txt b/example_mods/images/icons/readme.txt index 4eed00751..7b97c2f82 100644 --- a/example_mods/images/icons/readme.txt +++ b/example_mods/images/icons/readme.txt @@ -1,2 +1,3 @@ -put your custom character icons here! -Icons should start with "icon-" or it won't be read! \ No newline at end of file +Put your custom character icons here! +Icons must start with "icon-" or it won't be read! +The image resolution must have a minimal of 300x150 \ No newline at end of file diff --git a/example_mods/images/menubackgrounds/readme.txt b/example_mods/images/menubackgrounds/readme.txt new file mode 100644 index 000000000..8360559e0 --- /dev/null +++ b/example_mods/images/menubackgrounds/readme.txt @@ -0,0 +1,2 @@ +Put your week backgrounds here! +They must start with "menu_" \ No newline at end of file diff --git a/example_mods/images/menucharacters/readme.txt b/example_mods/images/menucharacters/readme.txt new file mode 100644 index 000000000..51045d1eb --- /dev/null +++ b/example_mods/images/menucharacters/readme.txt @@ -0,0 +1 @@ +Drop your Menu characters shit here \ No newline at end of file diff --git a/example_mods/images/storymenu/readme.txt b/example_mods/images/storymenu/readme.txt new file mode 100644 index 000000000..ecec35753 --- /dev/null +++ b/example_mods/images/storymenu/readme.txt @@ -0,0 +1 @@ +Put your week image here! \ No newline at end of file diff --git a/example_mods/readme.txt b/example_mods/readme.txt index 0d0e92ae1..319618a3a 100644 --- a/example_mods/readme.txt +++ b/example_mods/readme.txt @@ -1,8 +1,5 @@ -You can either edit Images, XML and TXT files or add entirely new ones. +You can either edit files or add entirely new ones here. -EDITTING: +ABOUT EDITTING: It doesn't matter if you want to edit something in assets/shared/images/ or assets/preload/images/, -you will have to put the editted files in mods/images/, it will be handled automatically by the engine. - -You can also add your own characters json files! -Create a "characters" folder here and put your json files there. \ No newline at end of file +you will have to put the editted files in mods/images/, it will be handled automatically by the engine. \ No newline at end of file diff --git a/example_mods/songs/readme.txt b/example_mods/songs/readme.txt new file mode 100644 index 000000000..3834b5b8f --- /dev/null +++ b/example_mods/songs/readme.txt @@ -0,0 +1,2 @@ +Put your custom songs here +It should be a folder with your custom song's name, and inside of it should include two files: "Inst.ogg" and "Voices.ogg" \ No newline at end of file diff --git a/example_mods/stages/readme.txt b/example_mods/stages/readme.txt new file mode 100644 index 000000000..de0be043a --- /dev/null +++ b/example_mods/stages/readme.txt @@ -0,0 +1 @@ +Add your stage .json and .lua files here! \ No newline at end of file diff --git a/example_mods/videos/readme.txt b/example_mods/videos/readme.txt new file mode 100644 index 000000000..abc1517d8 --- /dev/null +++ b/example_mods/videos/readme.txt @@ -0,0 +1,2 @@ +Put your custom .mp4 videos here! +They MUST be in 1280x720 resolution \ No newline at end of file diff --git a/example_mods/weeks/readme.txt b/example_mods/weeks/readme.txt new file mode 100644 index 000000000..59d534e0e --- /dev/null +++ b/example_mods/weeks/readme.txt @@ -0,0 +1 @@ +Drop your custom week .json files here! \ No newline at end of file diff --git a/gitVersion.txt b/gitVersion.txt new file mode 100644 index 000000000..ea2303bc0 --- /dev/null +++ b/gitVersion.txt @@ -0,0 +1 @@ +0.5 \ No newline at end of file diff --git a/source/Achievements.hx b/source/Achievements.hx index f853fe93e..ebd6bc562 100644 --- a/source/Achievements.hx +++ b/source/Achievements.hx @@ -10,62 +10,59 @@ import flixel.text.FlxText; using StringTools; class Achievements { - public static var achievementsStuff:Array = [ //Name, Description, Hidden achievement - ["Freaky on a Friday Night", "Play on a Friday... Night.", true], - ["She Calls Me Daddy Too", "Beat Week 1 on Hard with no Misses.", false], - ["No More Tricks", "Beat Week 2 on Hard with no Misses.", false], - ["Call Me The Hitman", "Beat Week 3 on Hard with no Misses.", false], - ["Lady Killer", "Beat Week 4 on Hard with no Misses.", false], - ["Missless Christmas", "Beat Week 5 on Hard with no Misses.", false], - ["Highscore!!", "Beat Week 6 on Hard with no Misses.", false], - ["You'll Pay For That...", "Beat Week 7 on Hard with no Misses.", true], - ["What a Funkin' Disaster!", "Complete a Song with a rating lower than 20%.", false], - ["Perfectionist", "Complete a Song with a rating of 100%.", false], - ["Roadkill Enthusiast", "Watch the Henchmen die over 100 times.", false], - ["Oversinging Much...?", "Hold down a note for 20 seconds.", false], - ["Hyperactive", "Finish a Song without going Idle.", false], - ["Just the Two of Us", "Finish a Song pressing only two keys.", false], - ["Toaster Gamer", "Have you tried to run the game on a toaster?", false], - ["Debugger", "Beat the \"Test\" Stage from the Chart Editor.", true] - ]; - - public static var achievementsUnlocked:Array = [ //Save string and Achievement tag + is it unlocked? - ['friday_night_play', false], //0 - ['week1_nomiss', false], //1 - ['week2_nomiss', false], //2 - ['week3_nomiss', false], //3 - ['week4_nomiss', false], //4 - ['week5_nomiss', false], //5 - ['week6_nomiss', false], //6 - ['week7_nomiss', false], //7 - ['ur_bad', false], //8 - ['ur_good', false], //9 - ['roadkill_enthusiast', false], //10 - ['oversinging', false], //11 - ['hype', false], //12 - ['two_keys', false], //13 - ['toastie', false], //14 - ['debugger', false], //15 + public static var achievementsStuff:Array = [ //Name, Description, Achievement save tag, Hidden achievement + ["Freaky on a Friday Night", "Play on a Friday... Night.", 'friday_night_play', true], + ["She Calls Me Daddy Too", "Beat Week 1 on Hard with no Misses.", 'week1_nomiss', false], + ["No More Tricks", "Beat Week 2 on Hard with no Misses.", 'week2_nomiss', false], + ["Call Me The Hitman", "Beat Week 3 on Hard with no Misses.", 'week3_nomiss', false], + ["Lady Killer", "Beat Week 4 on Hard with no Misses.", 'week4_nomiss', false], + ["Missless Christmas", "Beat Week 5 on Hard with no Misses.", 'week5_nomiss', false], + ["Highscore!!", "Beat Week 6 on Hard with no Misses.", 'week6_nomiss', false], + ["You'll Pay For That...", "Beat Week 7 on Hard with no Misses.", 'week7_nomiss', true], + ["What a Funkin' Disaster!", "Complete a Song with a rating lower than 20%.", 'ur_bad', false], + ["Perfectionist", "Complete a Song with a rating of 100%.", 'ur_good', false], + ["Roadkill Enthusiast", "Watch the Henchmen die over 100 times.", 'roadkill_enthusiast', false], + ["Oversinging Much...?", "Hold down a note for 20 seconds.", 'oversinging', false], + ["Hyperactive", "Finish a Song without going Idle.", 'hype', false], + ["Just the Two of Us", "Finish a Song pressing only two keys.", 'two_keys', false], + ["Toaster Gamer", "Have you tried to run the game on a toaster?", 'toastie', false], + ["Debugger", "Beat the \"Test\" Stage from the Chart Editor.", 'debugger', true] ]; + public static var achievementsMap:Map = new Map(); public static var henchmenDeath:Int = 0; - public static function unlockAchievement(id:Int):Void { - FlxG.log.add('Completed achievement "' + achievementsStuff[id][0] +'"'); - achievementsUnlocked[id][1] = true; + public static function unlockAchievement(name:String):Void { + FlxG.log.add('Completed achievement "' + name +'"'); + achievementsMap.set(name, true); FlxG.sound.play(Paths.sound('confirmMenu'), 0.7); } + public static function isAchievementUnlocked(name:String) { + if(achievementsMap.exists(name) && achievementsMap.get(name)) { + return true; + } + return false; + } + + public static function getAchievementIndex(name:String) { + for (i in 0...achievementsStuff.length) { + if(achievementsStuff[i][2] == name) { + return i; + } + } + return -1; + } + public static function loadAchievements():Void { if(FlxG.save.data != null) { + if(FlxG.save.data.achievementsMap != null) { + achievementsMap = FlxG.save.data.achievementsMap; + } if(FlxG.save.data.achievementsUnlocked != null) { FlxG.log.add("Trying to load stuff"); var savedStuff:Array = FlxG.save.data.achievementsUnlocked; - for (i in 0...achievementsUnlocked.length) { - for (j in 0...savedStuff.length) { - if(achievementsUnlocked[i][0] == savedStuff[j]) { - achievementsUnlocked[i][1] = true; - } - } + for (i in 0...savedStuff.length) { + achievementsMap.set(savedStuff[i], true); } } if(henchmenDeath == 0 && FlxG.save.data.henchmenDeath != null) { @@ -89,19 +86,29 @@ class Achievements { class AttachedAchievement extends FlxSprite { public var sprTracker:FlxSprite; - public function new(x:Float = 0, y:Float = 0, id:Int = 0) { + private var tag:String; + public function new(x:Float = 0, y:Float = 0, name:String) { super(x, y); - if(Achievements.achievementsUnlocked[id][1]) { + changeAchievement(name); + antialiasing = ClientPrefs.globalAntialiasing; + } + + public function changeAchievement(tag:String) { + this.tag = tag; + reloadAchievementImage(); + } + + public function reloadAchievementImage() { + if(Achievements.isAchievementUnlocked(tag)) { loadGraphic(Paths.image('achievementgrid'), true, 150, 150); - animation.add('icon', [id], 0, false, false); + animation.add('icon', [Achievements.getAchievementIndex(tag)], 0, false, false); animation.play('icon'); } else { loadGraphic(Paths.image('lockedachievement')); } - setGraphicSize(Std.int(width * 0.7)); + scale.set(0.7, 0.7); updateHitbox(); - antialiasing = ClientPrefs.globalAntialiasing; } override function update(elapsed:Float) { @@ -115,10 +122,12 @@ class AttachedAchievement extends FlxSprite { class AchievementObject extends FlxSpriteGroup { public var onFinish:Void->Void = null; var alphaTween:FlxTween; - public function new(id:Int, ?camera:FlxCamera = null) + public function new(name:String, ?camera:FlxCamera = null) { super(x, y); ClientPrefs.saveSettings(); + + var id:Int = Achievements.getAchievementIndex(name); var achievementBG:FlxSprite = new FlxSprite(60, 50).makeGraphic(420, 120, FlxColor.BLACK); achievementBG.scrollFactor.set(); diff --git a/source/AchievementsMenuState.hx b/source/AchievementsMenuState.hx index c10c97fad..2d167b5ee 100644 --- a/source/AchievementsMenuState.hx +++ b/source/AchievementsMenuState.hx @@ -42,21 +42,22 @@ class AchievementsMenuState extends MusicBeatState add(grpOptions); for (i in 0...Achievements.achievementsStuff.length) { - if(!Achievements.achievementsStuff[i][2] || Achievements.achievementsUnlocked[i][1]) { + if(!Achievements.achievementsStuff[i][3] || Achievements.achievementsMap.exists(Achievements.achievementsStuff[i][2])) { options.push(Achievements.achievementsStuff[i]); achievementIndex.push(i); } } for (i in 0...options.length) { - var optionText:Alphabet = new Alphabet(0, (100 * i) + 210, Achievements.achievementsUnlocked[achievementIndex[i]][1] ? Achievements.achievementsStuff[achievementIndex[i]][0] : '?', false, false); + var achieveName:String = Achievements.achievementsStuff[achievementIndex[i]][2]; + var optionText:Alphabet = new Alphabet(0, (100 * i) + 210, Achievements.isAchievementUnlocked(achieveName) ? Achievements.achievementsStuff[achievementIndex[i]][0] : '?', false, false); optionText.isMenuItem = true; optionText.x += 280; optionText.xAdd = 200; optionText.targetY = i; grpOptions.add(optionText); - var icon:AttachedAchievement = new AttachedAchievement(optionText.x - 105, optionText.y, achievementIndex[i]); + var icon:AttachedAchievement = new AttachedAchievement(optionText.x - 105, optionText.y, achieveName); icon.sprTracker = optionText; achievementArray.push(icon); add(icon); @@ -69,7 +70,7 @@ class AchievementsMenuState extends MusicBeatState add(descText); changeSelection(); - addVirtualPad(UP_DOWN, A); + addVirtualPad(FULL, A_B); super.create(); } @@ -84,7 +85,7 @@ class AchievementsMenuState extends MusicBeatState changeSelection(1); } - if (controls.ACCEPT) { + if (controls.BACK) { FlxG.sound.play(Paths.sound('cancelMenu')); FlxG.switchState(new MainMenuState()); } diff --git a/source/Alphabet.hx b/source/Alphabet.hx index 883240452..c67512a7b 100644 --- a/source/Alphabet.hx +++ b/source/Alphabet.hx @@ -30,7 +30,6 @@ class Alphabet extends FlxSpriteGroup public var text:String = ""; var _finalText:String = ""; - var _curText:String = ""; var yMulti:Float = 1; // custom shit @@ -82,7 +81,6 @@ class Alphabet extends FlxSpriteGroup } lettersArray = []; splitWords = []; - _curText = ""; loopNum = 0; xPos = 0; curRow = 0; @@ -123,7 +121,7 @@ class Alphabet extends FlxSpriteGroup // { // } - var spaceChar:Bool = (character == " " || character == "-" || character == "_"); + var spaceChar:Bool = (character == " " || character == "_"); if (spaceChar) { consecutiveSpaces++; @@ -156,8 +154,7 @@ class Alphabet extends FlxSpriteGroup } else if (isSymbol) { - if(character != '-') - letter.createBoldSymbol(character); + letter.createBoldSymbol(character); } else { @@ -197,7 +194,7 @@ class Alphabet extends FlxSpriteGroup var loopNum:Int = 0; var xPos:Float = 0; - var curRow:Int = 0; + public var curRow:Int = 0; var dialogueSound:FlxSound = null; var consecutiveSpaces:Int = 0; @@ -210,10 +207,9 @@ class Alphabet extends FlxSpriteGroup // trace(arrayShit); if(speed <= 0) { - while(loopNum < splitWords.length) { + while(!finishedText) { timerCheck(); } - finishedText = true; if(dialogueSound != null) dialogueSound.stop(); dialogueSound = FlxG.sound.play(Paths.sound('dialogue')); } else { @@ -225,19 +221,28 @@ class Alphabet extends FlxSpriteGroup } } + var LONG_TEXT_ADD:Float = -24; //text is over 2 rows long, make it go up a bit public function timerCheck(?tmr:FlxTimer = null) { - if (loopNum <= splitWords.length - 2 && splitWords[loopNum] == "\\" && splitWords[loopNum+1] == "n") + var autoBreak:Bool = false; + if ((loopNum <= splitWords.length - 2 && splitWords[loopNum] == "\\" && splitWords[loopNum+1] == "n") || + ((autoBreak = true) && xPos >= FlxG.width * 0.65 && splitWords[loopNum] == ' ' )) { - if(tmr != null) tmr.loops -= 2; - loopNum += 2; + if(autoBreak) { + if(tmr != null) tmr.loops -= 1; + loopNum += 1; + } else { + if(tmr != null) tmr.loops -= 2; + loopNum += 2; + } yMulti += 1; xPosResetted = true; xPos = 0; curRow += 1; + if(curRow == 2) y += LONG_TEXT_ADD; } - if(loopNum <= splitWords.length) { - var spaceChar:Bool = (splitWords[loopNum] == " " || splitWords[loopNum] == "-" || splitWords[loopNum] == "_"); + if(loopNum <= splitWords.length && splitWords[loopNum] != null) { + var spaceChar:Bool = (splitWords[loopNum] == " " || splitWords[loopNum] == "_"); if (spaceChar) { consecutiveSpaces++; @@ -313,11 +318,13 @@ class Alphabet extends FlxSpriteGroup } } - loopNum += 1; - if(loopNum >= splitWords.length && tmr != null) { - typeTimer = null; - tmr.cancel(); - tmr.destroy(); + loopNum++; + if(loopNum >= splitWords.length) { + if(tmr != null) { + typeTimer = null; + tmr.cancel(); + tmr.destroy(); + } finishedText = true; } } @@ -413,8 +420,8 @@ class AlphaCharacter extends FlxSprite case "'": y -= 20 * textSize; case '-': - x -= 35 - (90 * (1.0 - textSize)); - y -= 16 * textSize; + //x -= 35 - (90 * (1.0 - textSize)); + y += 20 * textSize; case '(': x -= 65 * textSize; y -= 5 * textSize; @@ -423,6 +430,10 @@ class AlphaCharacter extends FlxSprite x -= 20 / textSize; y -= 5 * textSize; offset.x = 12 * textSize; + case '.': + y += 45 * textSize; + x += 5 * textSize; + offset.x += 3 * textSize; } } @@ -484,7 +495,7 @@ class AlphaCharacter extends FlxSprite case "'": y -= 20; case '-': - x -= 35 - (90 * (1.0 - textSize)); + //x -= 35 - (90 * (1.0 - textSize)); y -= 16; } } diff --git a/source/AttachedText.hx b/source/AttachedText.hx index 454f97d62..6cdbd4f2a 100644 --- a/source/AttachedText.hx +++ b/source/AttachedText.hx @@ -8,7 +8,7 @@ class AttachedText extends Alphabet public var offsetX:Float = 0; public var offsetY:Float = 0; public var sprTracker:FlxSprite; - public var isAlt:Bool = false; + public var copyVisible:Bool = true; public function new(text:String = "", ?offsetX:Float = 0, ?offsetY:Float = 0, ?bold = false) { super(0, 0, text, bold); isMenuItem = false; @@ -17,8 +17,12 @@ class AttachedText extends Alphabet } override function update(elapsed:Float) { - if (sprTracker != null) + if (sprTracker != null) { setPosition(sprTracker.x + offsetX, sprTracker.y + offsetY); + if(copyVisible) { + visible = sprTracker.visible; + } + } super.update(elapsed); } diff --git a/source/BackgroundGirls.hx b/source/BackgroundGirls.hx index c37b16f91..9109bf19c 100644 --- a/source/BackgroundGirls.hx +++ b/source/BackgroundGirls.hx @@ -5,6 +5,7 @@ import flixel.graphics.frames.FlxAtlasFrames; class BackgroundGirls extends FlxSprite { + var isPissed:Bool = true; public function new(x:Float, y:Float) { super(x, y); @@ -12,18 +13,23 @@ class BackgroundGirls extends FlxSprite // BG fangirls dissuaded frames = Paths.getSparrowAtlas('weeb/bgFreaks'); - animation.addByIndices('danceLeft', 'BG girls group', CoolUtil.numberArray(14), "", 24, false); - animation.addByIndices('danceRight', 'BG girls group', CoolUtil.numberArray(30, 15), "", 24, false); + swapDanceType(); animation.play('danceLeft'); } var danceDir:Bool = false; - public function getScared():Void + public function swapDanceType():Void { - animation.addByIndices('danceLeft', 'BG fangirls dissuaded', CoolUtil.numberArray(14), "", 24, false); - animation.addByIndices('danceRight', 'BG fangirls dissuaded', CoolUtil.numberArray(30, 15), "", 24, false); + isPissed = !isPissed; + if(!isPissed) { //Gets unpissed + animation.addByIndices('danceLeft', 'BG girls group', CoolUtil.numberArray(14), "", 24, false); + animation.addByIndices('danceRight', 'BG girls group', CoolUtil.numberArray(30, 15), "", 24, false); + } else { //Pisses + animation.addByIndices('danceLeft', 'BG fangirls dissuaded', CoolUtil.numberArray(14), "", 24, false); + animation.addByIndices('danceRight', 'BG fangirls dissuaded', CoolUtil.numberArray(30, 15), "", 24, false); + } dance(); } diff --git a/source/Character.hx b/source/Character.hx index 08b8ede9e..3db79fe93 100644 --- a/source/Character.hx +++ b/source/Character.hx @@ -71,6 +71,7 @@ class Character extends FlxSprite public var noAntialiasing:Bool = false; public var originalFlipX:Bool = false; public var healthColorArray:Array = [255, 0, 0]; + public var alreadyLoaded:Bool = true; //Used by "Change Character" event public static var DEFAULT_CHARACTER:String = 'bf'; //In case a character is missing, it will use BF on its place public function new(x:Float, y:Float, ?character:String = 'bf', ?isPlayer:Bool = false) @@ -93,22 +94,22 @@ class Character extends FlxSprite default: var characterPath:String = 'characters/' + curCharacter + '.json'; - #if MODS_ALLOWED - var path:String = Paths.mods(characterPath); - if (!Utils.existsCheck(path)) { + #if dontUseManifest + var path:String = Paths.modFolders(characterPath); + if (!FileSystem.exists(path)) { path = Paths.getPreloadPath(characterPath); } - if (!Utils.existsCheck(path)) + if (!FileSystem.exists(path)) #else var path:String = Paths.getPreloadPath(characterPath); - if (!Utils.existsCheck(path)) + if (!Assets.exists(path)) #end { path = Paths.getPreloadPath('characters/' + DEFAULT_CHARACTER + '.json'); //If a character couldn't be found, change him to BF just to prevent a crash } - #if windows + #if dontUseManifest var rawJson = File.getContent(path); #else var rawJson = Assets.getText(path); @@ -134,8 +135,10 @@ class Character extends FlxSprite healthIcon = json.healthicon; singDuration = json.sing_duration; flipX = !!json.flip_x; - if(json.no_antialiasing) + if(json.no_antialiasing) { + antialiasing = false; noAntialiasing = true; + } if(json.healthbar_colors != null && json.healthbar_colors.length > 2) healthColorArray = json.healthbar_colors; @@ -175,8 +178,8 @@ class Character extends FlxSprite { flipX = !flipX; - // Doesn't flip for BF, since his are already in the right place??? - /*if (!curCharacter.startsWith('bf')) + /*// Doesn't flip for BF, since his are already in the right place??? + if (!curCharacter.startsWith('bf')) { // var animArray if(animation.getByName('singLEFT') != null && animation.getByName('singRIGHT') != null) @@ -199,7 +202,6 @@ class Character extends FlxSprite override function update(elapsed:Float) { - if(!debugMode && animation.curAnim != null) { if(heyTimer > 0) diff --git a/source/ClientPrefs.hx b/source/ClientPrefs.hx index d6303650e..e07f6147d 100644 --- a/source/ClientPrefs.hx +++ b/source/ClientPrefs.hx @@ -7,7 +7,6 @@ import flixel.graphics.FlxGraphic; import Controls; class ClientPrefs { - //TO DO: Redo ClientPrefs in a way that isn't too stupid public static var downScroll:Bool = false; public static var middleScroll:Bool = false; public static var showFPS:Bool = true; @@ -26,41 +25,31 @@ class ClientPrefs { public static var ghostTapping:Bool = true; public static var hideTime:Bool = false; - public static var defaultKeys:Array = [ - A, LEFT, //Note Left - S, DOWN, //Note Down - W, UP, //Note Up - D, RIGHT, //Note Right + //Every key has two binds, these binds are defined on defaultKeys! If you want your control to be changeable, you have to add it on ControlsSubState (inside OptionsState.hx)'s list + public static var keyBinds:Map = new Map(); + public static var defaultKeys:Map; - A, LEFT, //UI Left - S, DOWN, //UI Down - W, UP, //UI Up - D, RIGHT, //UI Right - - R, NONE, //Reset - SPACE, ENTER, //Accept - BACKSPACE, ESCAPE, //Back - ENTER, ESCAPE //Pause - ]; - //Every key has two binds, these binds are defined on defaultKeys! If you want your control to be changeable, you have to add it on ControlsSubState (inside OptionsState)'s list - public static var keyBinds:Array = [ + public static function startControls() { //Key Bind, Name for ControlsSubState - [Control.NOTE_LEFT, 'Left'], - [Control.NOTE_DOWN, 'Down'], - [Control.NOTE_UP, 'Up'], - [Control.NOTE_RIGHT, 'Right'], + keyBinds.set('note_left', [A, LEFT]); + keyBinds.set('note_down', [S, DOWN]); + keyBinds.set('note_up', [W, UP]); + keyBinds.set('note_right', [D, RIGHT]); + + keyBinds.set('ui_left', [A, LEFT]); + keyBinds.set('ui_down', [S, DOWN]); + keyBinds.set('ui_up', [W, UP]); + keyBinds.set('ui_right', [D, RIGHT]); + + keyBinds.set('accept', [SPACE, ENTER]); + keyBinds.set('back', [BACKSPACE, ESCAPE]); + keyBinds.set('pause', [ENTER, ESCAPE]); + keyBinds.set('reset', [R, NONE]); - [Control.UI_LEFT, 'Left '], //Added a space for not conflicting on ControlsSubState - [Control.UI_DOWN, 'Down '], //Added a space for not conflicting on ControlsSubState - [Control.UI_UP, 'Up '], //Added a space for not conflicting on ControlsSubState - [Control.UI_RIGHT, 'Right '], //Added a space for not conflicting on ControlsSubState - [Control.RESET, 'Reset'], - [Control.ACCEPT, 'Accept'], - [Control.BACK, 'Back'], - [Control.PAUSE, 'Pause'] - ]; - public static var lastControls:Array = defaultKeys.copy(); + // Don't delete this + defaultKeys = keyBinds.copy(); + } public static function saveSettings() { FlxG.save.data.downScroll = downScroll; @@ -71,8 +60,8 @@ class ClientPrefs { FlxG.save.data.noteSplashes = noteSplashes; FlxG.save.data.lowQuality = lowQuality; FlxG.save.data.framerate = framerate; - FlxG.save.data.cursing = cursing; - FlxG.save.data.violence = violence; + //FlxG.save.data.cursing = cursing; + //FlxG.save.data.violence = violence; FlxG.save.data.camZooms = camZooms; FlxG.save.data.noteOffset = noteOffset; FlxG.save.data.hideHud = hideHud; @@ -80,20 +69,13 @@ class ClientPrefs { FlxG.save.data.imagesPersist = imagesPersist; FlxG.save.data.ghostTapping = ghostTapping; FlxG.save.data.hideTime = hideTime; - - var achieves:Array = []; - for (i in 0...Achievements.achievementsUnlocked.length) { - if(Achievements.achievementsUnlocked[i][1]) { - achieves.push(Achievements.achievementsUnlocked[i][0]); - } - } - FlxG.save.data.achievementsUnlocked = achieves; + FlxG.save.data.achievementsMap = Achievements.achievementsMap; FlxG.save.data.henchmenDeath = Achievements.henchmenDeath; FlxG.save.flush(); var save:FlxSave = new FlxSave(); - save.bind('controls', 'ninjamuffin99'); //Placing this in a separate save so that it can be manually deleted without removing your Score and stuff - save.data.customControls = lastControls; + save.bind('controls_v2', 'ninjamuffin99'); //Placing this in a separate save so that it can be manually deleted without removing your Score and stuff + save.data.customControls = keyBinds; save.flush(); FlxG.log.add("Settings saved!"); } @@ -163,44 +145,17 @@ class ClientPrefs { } var save:FlxSave = new FlxSave(); - save.bind('controls', 'ninjamuffin99'); + save.bind('controls_v2', 'ninjamuffin99'); if(save != null && save.data.customControls != null) { - reloadControls(save.data.customControls); - } - } - - public static function reloadControls(newKeys:Array) { - ClientPrefs.removeControls(ClientPrefs.lastControls); - ClientPrefs.lastControls = newKeys.copy(); - ClientPrefs.loadControls(ClientPrefs.lastControls); - } - - private static function removeControls(controlArray:Array) { - for (i in 0...keyBinds.length) { - var controlValue:Int = i*2; - var controlsToRemove:Array = []; - for (j in 0...2) { - if(controlArray[controlValue+j] != NONE) { - controlsToRemove.push(controlArray[controlValue+j]); - } - } - if(controlsToRemove.length > 0) { - PlayerSettings.player1.controls.unbindKeys(keyBinds[i][0], controlsToRemove); + var loadedControls:Map = save.data.customControls; + for (control => keys in loadedControls) { + keyBinds.set(control, keys); } + reloadControls(); } } - private static function loadControls(controlArray:Array) { - for (i in 0...keyBinds.length) { - var controlValue:Int = i*2; - var controlsToAdd:Array = []; - for (j in 0...2) { - if(controlArray[controlValue+j] != NONE) { - controlsToAdd.push(controlArray[controlValue+j]); - } - } - if(controlsToAdd.length > 0) { - PlayerSettings.player1.controls.bindKeys(keyBinds[i][0], controlsToAdd); - } - } + + public static function reloadControls() { + PlayerSettings.player1.controls.setKeyboardScheme(KeyboardScheme.Solo); } } \ No newline at end of file diff --git a/source/ColorSwap.hx b/source/ColorSwap.hx index 34852a24c..526d96e2a 100644 --- a/source/ColorSwap.hx +++ b/source/ColorSwap.hx @@ -121,8 +121,10 @@ class ColorSwapShader extends FlxShader { vec4 swagColor = vec4(rgb2hsv(vec3(color[0], color[1], color[2])), color[3]); // [0] is the hue??? - swagColor[0] += uTime[0]; - swagColor[1] += uTime[1]; + swagColor[0] = swagColor[0] + uTime[0]; + swagColor[1] = swagColor[1] + uTime[1]; + swagColor[2] = swagColor[2] * (1.0 + uTime[2]); + if(swagColor[1] < 0.0) { swagColor[1] = 0.0; @@ -131,7 +133,6 @@ class ColorSwapShader extends FlxShader { { swagColor[1] = 1.0; } - swagColor[2] *= 1.0 + uTime[2]; color = vec4(hsv2rgb(vec3(swagColor[0], swagColor[1], swagColor[2])), swagColor[3]); diff --git a/source/Controls.hx b/source/Controls.hx index f1d8be597..c32912325 100644 --- a/source/Controls.hx +++ b/source/Controls.hx @@ -460,7 +460,7 @@ class Controls extends FlxActionSet var x = Tinputs.length; while (x-- > 0) - if (Tinputs[x] == input) + //if (Tinputs[x] == input) action.remove(input); } } @@ -702,7 +702,6 @@ class Controls extends FlxActionSet #end } - inline static function addKeys(action:FlxActionDigital, keys:Array, state:FlxInputState) { for (key in keys) @@ -727,23 +726,25 @@ class Controls extends FlxActionSet removeKeyboard(); keyboardScheme = scheme; + var keysMap = ClientPrefs.keyBinds; #if (haxe >= "4.0.0") switch (scheme) { case Solo: - inline bindKeys(Control.UI_UP, [W, FlxKey.UP]); - inline bindKeys(Control.UI_DOWN, [S, FlxKey.DOWN]); - inline bindKeys(Control.UI_LEFT, [A, FlxKey.LEFT]); - inline bindKeys(Control.UI_RIGHT, [D, FlxKey.RIGHT]); - inline bindKeys(Control.NOTE_UP, [W, FlxKey.UP]); - inline bindKeys(Control.NOTE_DOWN, [S, FlxKey.DOWN]); - inline bindKeys(Control.NOTE_LEFT, [A, FlxKey.LEFT]); - inline bindKeys(Control.NOTE_RIGHT, [D, FlxKey.RIGHT]); - inline bindKeys(Control.ACCEPT, [Z, SPACE, ENTER]); - inline bindKeys(Control.BACK, [X, BACKSPACE, ESCAPE]); - inline bindKeys(Control.PAUSE, [P, ENTER, ESCAPE]); - inline bindKeys(Control.RESET, [R]); + inline bindKeys(Control.UI_UP, keysMap.get('ui_up')); + inline bindKeys(Control.UI_DOWN, keysMap.get('ui_down')); + inline bindKeys(Control.UI_LEFT, keysMap.get('ui_left')); + inline bindKeys(Control.UI_RIGHT, keysMap.get('ui_right')); + inline bindKeys(Control.NOTE_UP, keysMap.get('note_up')); + inline bindKeys(Control.NOTE_DOWN, keysMap.get('note_down')); + inline bindKeys(Control.NOTE_LEFT, keysMap.get('note_left')); + inline bindKeys(Control.NOTE_RIGHT, keysMap.get('note_right')); + + inline bindKeys(Control.ACCEPT, keysMap.get('accept')); + inline bindKeys(Control.BACK, keysMap.get('back')); + inline bindKeys(Control.PAUSE, keysMap.get('pause')); + inline bindKeys(Control.RESET, keysMap.get('reset')); case Duo(true): inline bindKeys(Control.UI_UP, [W]); inline bindKeys(Control.UI_DOWN, [S]); diff --git a/source/CoolUtil.hx b/source/CoolUtil.hx index 4bd8eb1de..4b29a601c 100644 --- a/source/CoolUtil.hx +++ b/source/CoolUtil.hx @@ -34,7 +34,7 @@ class CoolUtil public static function coolTextFile(path:String):Array { - #if windows + #if dontUseManifest var daList:Array = File.getContent(path).trim().split('\n'); #else var daList:Array = Assets.getText(path).trim().split('\n'); diff --git a/source/CreditsState.hx b/source/CreditsState.hx index 99a391675..b484ea86b 100644 --- a/source/CreditsState.hx +++ b/source/CreditsState.hx @@ -24,9 +24,9 @@ class CreditsState extends MusicBeatState private var iconArray:Array = []; private static var creditsStuff:Array = [ //Name - Icon name - Description - Link - BG Color - ['Ported By'], - ['Kviks', 'ninjamuffin99', 'coder', 'https://youtube.com/channel/UChPjrBq7z7oSVcB3FcHMDCA', 0xFFF73838], - ['Sirox', 'kawaisprite', 'coder', 'https://youtube.com/channel/UCsLtQdVo4cDwJ1olJvJi_lQ', 0xFF6475F3], + ['Psych Engine Android by'], + ['Kviks', 'kviks', 'real sus guy', 'https://youtube.com/channel/UChPjrBq7z7oSVcB3FcHMDCA', 0xFFF73838], + ['LuckyDog7', 'luckydog', 'sussy', 'https://youtube.com/channel/UCeHXKGpDKo2eqYKVkqCUdaA', 0xFFFFFFFF], [''], ['Psych Engine Team'], ['Shadow Mario', 'shadowmario', 'Main Programmer of Psych Engine', 'https://twitter.com/Shadow_Mario_', 0xFFFFDD33], @@ -37,8 +37,14 @@ class CreditsState extends MusicBeatState ['PolybiusProxy', 'polybiusproxy', '.MP4 Video Loader Extension', 'https://twitter.com/polybiusproxy', 0xFFE01F32], ['gedehari', 'gedehari', 'Chart Editor\'s Sound Waveform base', 'https://twitter.com/gedehari', 0xFFFF9300], ['Keoiki', 'keoiki', 'Note Splash Animations', 'https://twitter.com/Keoiki_', 0xFFFFFFFF], - ['SandPlanet', 'sandplanet', 'Psych Engine Preacher\nAlso cool guy lol', 'https://twitter.com/SandPlanetNG', 0xFFD10616], - ['bubba', 'bubba', 'Guest Composer for "Hot Dilf"', 'https://www.youtube.com/channel/UCxQTnLmv0OAS63yzk9pVfaw', 0xFF61536A] + ['SandPlanet', 'sandplanet', 'Mascot\'s Owner\nMain Supporter of the Engine', 'https://twitter.com/SandPlanetNG', 0xFFD10616], + ['bubba', 'bubba', 'Guest Composer for "Hot Dilf"', 'https://www.youtube.com/channel/UCxQTnLmv0OAS63yzk9pVfaw', 0xFF61536A], + [''], + ["Funkin' Crew"], + ['ninjamuffin99', 'ninjamuffin99', "Programmer of Friday Night Funkin'", 'https://twitter.com/ninja_muffin99', 0xFFF73838], + ['PhantomArcade', 'phantomarcade', "Animator of Friday Night Funkin'", 'https://twitter.com/PhantomArcade3K', 0xFFFFBB1B], + ['evilsk8r', 'evilsk8r', "Artist of Friday Night Funkin'", 'https://twitter.com/evilsk8r', 0xFF53E52C], + ['kawaisprite', 'kawaisprite', "Composer of Friday Night Funkin'", 'https://twitter.com/kawaisprite', 0xFF6475F3] ]; var bg:FlxSprite; @@ -95,7 +101,7 @@ class CreditsState extends MusicBeatState changeSelection(); addVirtualPad(FULL, A_B); - + super.create(); } diff --git a/source/CustomFadeTransition.hx b/source/CustomFadeTransition.hx index 2d034b92f..6351faee1 100644 --- a/source/CustomFadeTransition.hx +++ b/source/CustomFadeTransition.hx @@ -12,21 +12,28 @@ import flixel.util.FlxColor; import flixel.util.FlxGradient; import flixel.FlxSubState; import flixel.FlxSprite; +import flixel.FlxCamera; class CustomFadeTransition extends MusicBeatSubstate { public static var finishCallback:Void->Void; private var leTween:FlxTween = null; + public static var nextCamera:FlxCamera; + var isTransIn:Bool = false; + var transBlack:FlxSprite; + var transGradient:FlxSprite; + public function new(duration:Float, isTransIn:Bool) { super(); + this.isTransIn = isTransIn; var zoom:Float = CoolUtil.boundTo(FlxG.camera.zoom, 0.05, 1); var width:Int = Std.int(FlxG.width / zoom); var height:Int = Std.int(FlxG.height / zoom); - var transGradient:FlxSprite = FlxGradient.createGradientFlxSprite(width, height, (isTransIn ? [0x0, FlxColor.BLACK] : [FlxColor.BLACK, 0x0])); + transGradient = FlxGradient.createGradientFlxSprite(width, height, (isTransIn ? [0x0, FlxColor.BLACK] : [FlxColor.BLACK, 0x0])); transGradient.scrollFactor.set(); add(transGradient); - var transBlack:FlxSprite = new FlxSprite().makeGraphic(width, height + 400, FlxColor.BLACK); + transBlack = new FlxSprite().makeGraphic(width, height + 400, FlxColor.BLACK); transBlack.scrollFactor.set(); add(transBlack); @@ -35,25 +42,51 @@ class CustomFadeTransition extends MusicBeatSubstate { if(isTransIn) { transGradient.y = transBlack.y - transBlack.height; - FlxTween.tween(transGradient, {y: transGradient.height + 50}, duration, {onUpdate: function(twn:FlxTween) { - transBlack.y = transGradient.y + transGradient.height; - }, onComplete: function(twn:FlxTween) { - close(); - }, ease: FlxEase.linear}); + FlxTween.tween(transGradient, {y: transGradient.height + 50}, duration, { + onComplete: function(twn:FlxTween) { + close(); + }, + ease: FlxEase.linear}); } else { transGradient.y = -transGradient.height; transBlack.y = transGradient.y - transBlack.height + 50; - leTween = FlxTween.tween(transGradient, {y: transGradient.height + 50}, duration, {onUpdate: function(twn:FlxTween) { - transBlack.y = transBlack.y = transGradient.y - transBlack.height + 50; - if(transBlack.y > 0) transBlack.y = 0; - }, onComplete: function(twn:FlxTween) { - finishCallback(); - }, ease: FlxEase.linear}); + leTween = FlxTween.tween(transGradient, {y: transGradient.height + 50}, duration, { + onComplete: function(twn:FlxTween) { + if(finishCallback != null) { + finishCallback(); + } + }, + ease: FlxEase.linear}); + } + + if(nextCamera != null) { + transBlack.cameras = [nextCamera]; + transGradient.cameras = [nextCamera]; + } + nextCamera = null; + } + + override function update(elapsed:Float) { + if(isTransIn) { + transBlack.y = transGradient.y + transGradient.height; + } else { + transBlack.y = transGradient.y - transBlack.height; + } + super.update(elapsed); + if(isTransIn) { + transBlack.y = transGradient.y + transGradient.height; + } else { + transBlack.y = transGradient.y - transBlack.height; } } override function destroy() { if(leTween != null) { + #if MODS_ALLOWED + if(isTransIn) { + Paths.destroyLoadedImages(); + } + #end finishCallback(); leTween.cancel(); } diff --git a/source/DialogueBox.hx b/source/DialogueBox.hx index 7d76b0443..4a76ddb50 100644 --- a/source/DialogueBox.hx +++ b/source/DialogueBox.hx @@ -28,6 +28,7 @@ class DialogueBox extends FlxSpriteGroup public var finishThing:Void->Void; public var nextDialogueThing:Void->Void = null; + public var skipDialogueThing:Void->Void = null; var portraitLeft:FlxSprite; var portraitRight:FlxSprite; @@ -181,6 +182,7 @@ class DialogueBox extends FlxSpriteGroup startDialogue(); dialogueStarted = true; } + #if mobile var justTouched:Bool = false; @@ -230,13 +232,17 @@ class DialogueBox extends FlxSpriteGroup { dialogueList.remove(dialogueList[0]); startDialogue(); - FlxG.sound.play(Paths.sound('clickText'), 0.8); + FlxG.sound.play(Paths.sound('clickText'), 0.8); } } else if (dialogueStarted) { - FlxG.sound.play(Paths.sound('clickText'), 0.8); + FlxG.sound.play(Paths.sound('clickText'), 0.8); swagDialogue.skip(); + + if(skipDialogueThing != null) { + skipDialogueThing(); + } } } diff --git a/source/DialogueBoxPsych.hx b/source/DialogueBoxPsych.hx index 9b001d3db..e0bca76c6 100644 --- a/source/DialogueBoxPsych.hx +++ b/source/DialogueBoxPsych.hx @@ -10,56 +10,173 @@ import flixel.text.FlxText; import flixel.util.FlxColor; import flixel.util.FlxTimer; import flixel.FlxSubState; +import haxe.Json; +import haxe.format.JsonParser; +#if sys +import sys.FileSystem; +import sys.io.File; +#end +import openfl.utils.Assets; using StringTools; +typedef DialogueCharacterFile = { + var image:String; + var dialogue_pos:String; + + var animations:Array; + var position:Array; + var scale:Float; +} + +typedef DialogueAnimArray = { + var anim:String; + var loop_name:String; + var loop_offsets:Array; + var idle_name:String; + var idle_offsets:Array; +} + +// Gonna try to kind of make it compatible to Forever Engine, +// love u Shubs no homo :flushedh4: +typedef DialogueFile = { + var dialogue:Array; +} + +typedef DialogueLine = { + var portrait:Null; + var expression:Null; + var text:Null; + var boxState:Null; + var speed:Null; +} + +class DialogueCharacter extends FlxSprite +{ + private static var IDLE_SUFFIX:String = '-IDLE'; + public static var DEFAULT_CHARACTER:String = 'bf'; + public static var DEFAULT_SCALE:Float = 0.7; + + public var jsonFile:DialogueCharacterFile = null; + #if (haxe >= "4.0.0") + public var dialogueAnimations:Map = new Map(); + #else + public var dialogueAnimations:Map = new Map(); + #end + + public var startingPos:Float = 0; //For center characters, it works as the starting Y, for everything else it works as starting X + public var isGhost:Bool = false; //For the editor + public var curCharacter:String = 'bf'; + + public function new(x:Float = 0, y:Float = 0, character:String = null) + { + super(x, y); + + if(character == null) character = DEFAULT_CHARACTER; + this.curCharacter = character; + + reloadCharacterJson(character); + frames = Paths.getSparrowAtlas('dialogue/' + jsonFile.image); + reloadAnimations(); + } + + public function reloadCharacterJson(character:String) { + var characterPath:String = 'images/dialogue/' + character + '.json'; + var rawJson = null; + + #if dontUseManifest + var path:String = Paths.modFolders(characterPath); + if (!FileSystem.exists(path)) { + path = Paths.getPreloadPath(characterPath); + } + + if(!FileSystem.exists(path)) { + path = Paths.getPreloadPath('images/dialogue/' + DEFAULT_CHARACTER + '.json'); + } + rawJson = File.getContent(path); + + #else + var path:String = Paths.getPreloadPath(characterPath); + rawJson = Assets.getText(path); + #end + + jsonFile = cast Json.parse(rawJson); + } + + public function reloadAnimations() { + dialogueAnimations.clear(); + if(jsonFile.animations != null && jsonFile.animations.length > 0) { + for (anim in jsonFile.animations) { + animation.addByPrefix(anim.anim, anim.loop_name, 24, isGhost); + animation.addByPrefix(anim.anim + IDLE_SUFFIX, anim.idle_name, 24, true); + dialogueAnimations.set(anim.anim, anim); + } + } + } + + public function playAnim(animName:String = null, playIdle:Bool = false) { + var leAnim:String = animName; + if(animName == null || !dialogueAnimations.exists(animName)) { //Anim is null, get a random animation + var arrayAnims:Array = []; + for (anim in dialogueAnimations) { + arrayAnims.push(anim.anim); + } + if(arrayAnims.length > 0) { + leAnim = arrayAnims[FlxG.random.int(0, arrayAnims.length-1)]; + } + } + + if(dialogueAnimations.exists(leAnim) && + (dialogueAnimations.get(leAnim).loop_name == null || + dialogueAnimations.get(leAnim).loop_name.length < 1 || + dialogueAnimations.get(leAnim).loop_name == dialogueAnimations.get(leAnim).idle_name)) { + playIdle = true; + } + animation.play(playIdle ? leAnim + IDLE_SUFFIX : leAnim, false); + + if(dialogueAnimations.exists(leAnim)) { + var anim:DialogueAnimArray = dialogueAnimations.get(leAnim); + if(playIdle) { + offset.set(anim.idle_offsets[0], anim.idle_offsets[1]); + //trace('Setting idle offsets: ' + anim.idle_offsets); + } else { + offset.set(anim.loop_offsets[0], anim.loop_offsets[1]); + //trace('Setting loop offsets: ' + anim.loop_offsets); + } + } else { + offset.set(0, 0); + trace('Offsets not found! Dialogue character is badly formatted, anim: ' + leAnim + ', ' + (playIdle ? 'idle anim' : 'loop anim')); + } + } + + public function animationIsLoop():Bool { + if(animation.curAnim == null) return false; + return !animation.curAnim.name.endsWith(IDLE_SUFFIX); + } +} + // TO DO: Clean code? Maybe? idk class DialogueBoxPsych extends FlxSpriteGroup { var dialogue:Alphabet; - var dialogueList:Array = []; + var dialogueList:DialogueFile = null; public var finishThing:Void->Void; public var nextDialogueThing:Void->Void = null; + public var skipDialogueThing:Void->Void = null; var bgFade:FlxSprite = null; var box:FlxSprite; var textToType:String = ''; - var arrayCharacters:Array = []; - var arrayStartPos:Array = []; //For 'center', it works as the starting Y, for everything else it works as starting X - var arrayPosition:Array = []; + var arrayCharacters:Array = []; - var currentText:Int = 1; + var currentText:Int = 0; var offsetPos:Float = -600; var textBoxTypes:Array = ['normal', 'angry']; - var charPositionList:Array = ['left', 'center', 'right']; - - // This is where you add your characters, ez pz - function addCharacter(char:FlxSprite, name:String) { - switch(name) { - case 'bf': - char.frames = Paths.getSparrowAtlas('dialogue/BF_Dialogue'); - char.animation.addByPrefix('talkIdle', 'BFTalk', 24, true); //Dialogue ended - char.animation.addByPrefix('talk', 'bftalkloop', 24, true); //During dialogue - char.flipX = !char.flipX; - - case 'psychic': - char.frames = Paths.getSparrowAtlas('dialogue/Psy_Dialogue'); //oppa gangnam style xddddd kill me - char.animation.addByPrefix('talkIdle', 'PSYtalk', 24, true); - char.animation.addByPrefix('talk', 'PSY loop', 24, true); - char.animation.addByPrefix('angryIdle', 'PSY angry', 24, true); - char.animation.addByPrefix('angry', 'PSY ANGRY loop', 24, true); - char.animation.addByPrefix('unamusedIdle', 'PSY unamused', 24, true); - char.animation.addByPrefix('unamused', 'PSY UNAMUSED loop', 24, true); - char.y -= 140; - } - char.animation.play('talkIdle', true); - } - - + //var charPositionList:Array = ['left', 'center', 'right']; - public function new(?dialogueList:Array, song:String) + public function new(dialogueList:DialogueFile, ?song:String = null) { super(); @@ -75,7 +192,7 @@ class DialogueBoxPsych extends FlxSpriteGroup add(bgFade); this.dialogueList = dialogueList; - spawnCharacters(dialogueList[0].split(" ")); + spawnCharacters(); box = new FlxSprite(70, 370); box.frames = Paths.getSparrowAtlas('speech_bubble'); @@ -89,6 +206,7 @@ class DialogueBoxPsych extends FlxSpriteGroup box.animation.addByPrefix('center-normalOpen', 'Speech Bubble Middle Open', 24, false); box.animation.addByPrefix('center-angry', 'AHH Speech Bubble middle', 24); box.animation.addByPrefix('center-angryOpen', 'speech bubble Middle loud open', 24, false); + box.animation.play('normal', true); box.visible = false; box.setGraphicSize(Std.int(box.width * 0.9)); box.updateHitbox(); @@ -100,55 +218,76 @@ class DialogueBoxPsych extends FlxSpriteGroup var dialogueStarted:Bool = false; var dialogueEnded:Bool = false; - function spawnCharacters(splitSpace:Array) { - for (i in 0...splitSpace.length) { - var splitName:Array = splitSpace[i].split(":"); - var y:Float = 180; - var x:Float = 50; - var char:FlxSprite = new FlxSprite(x, y); - char.x += offsetPos; - addCharacter(char, splitName[0]); + public static var LEFT_CHAR_X:Float = -60; + public static var RIGHT_CHAR_X:Float = -100; + public static var DEFAULT_CHAR_Y:Float = 60; + + function spawnCharacters() { + #if (haxe >= "4.0.0") + var charsMap:Map = new Map(); + #else + var charsMap:Map = new Map(); + #end + for (i in 0...dialogueList.dialogue.length) { + if(dialogueList.dialogue[i] != null) { + var charToAdd:String = dialogueList.dialogue[i].portrait; + if(!charsMap.exists(charToAdd) || !charsMap.get(charToAdd)) { + charsMap.set(charToAdd, true); + } + } + } + + for (individualChar in charsMap.keys()) { + var x:Float = LEFT_CHAR_X; + var y:Float = DEFAULT_CHAR_Y; + var char:DialogueCharacter = new DialogueCharacter(x + offsetPos, y, individualChar); - char.setGraphicSize(Std.int(char.width * 0.7)); + char.setGraphicSize(Std.int(char.width * DialogueCharacter.DEFAULT_SCALE * char.jsonFile.scale)); char.updateHitbox(); char.antialiasing = ClientPrefs.globalAntialiasing; char.scrollFactor.set(); - char.alpha = 0; + char.alpha = 0.00001; add(char); var saveY:Bool = false; - var pos:Int = 0; - switch(splitName[1]) { + switch(char.jsonFile.dialogue_pos) { case 'center': - pos = 1; char.x = FlxG.width / 2; char.x -= char.width / 2; y = char.y; char.y = FlxG.height + 50; saveY = true; case 'right': - pos = 2; - char.flipX = !char.flipX; - x = FlxG.width - char.width - 100; + x = FlxG.width - char.width + RIGHT_CHAR_X; char.x = x - offsetPos; } + x += char.jsonFile.position[0]; + y += char.jsonFile.position[1]; + char.x += char.jsonFile.position[0]; + char.y += char.jsonFile.position[1]; + char.startingPos = (saveY ? y : x); arrayCharacters.push(char); - arrayStartPos.push(saveY ? y : x); - arrayPosition.push(pos); } } - var textX = 90; - var textY = 430; + public static var DEFAULT_TEXT_X = 90; + public static var DEFAULT_TEXT_Y = 430; var scrollSpeed = 4500; var daText:Alphabet = null; + var ignoreThisFrame:Bool = true; //First frame is reserved for loading dialogue images override function update(elapsed:Float) { + if(ignoreThisFrame) { + ignoreThisFrame = false; + super.update(elapsed); + return; + } + if(!dialogueEnded) { bgFade.alpha += 0.5 * elapsed; if(bgFade.alpha > 0.5) bgFade.alpha = 0.5; - #if mobile + #if mobile var justTouched:Bool = false; for (touch in FlxG.touches.list) @@ -164,13 +303,17 @@ class DialogueBoxPsych extends FlxSpriteGroup if(!daText.finishedText) { if(daText != null) { daText.killTheTimer(); + daText.kill(); remove(daText); + daText.destroy(); } - daText = new Alphabet(0, 0, textToType, false, true, 0.0, 0.7); - daText.x = textX; - daText.y = textY; + daText = new Alphabet(DEFAULT_TEXT_X, DEFAULT_TEXT_Y, textToType, false, true, 0.0, 0.7); add(daText); - } else if(currentText >= dialogueList.length) { + + if(skipDialogueThing != null) { + skipDialogueThing(); + } + } else if(currentText >= dialogueList.dialogue.length) { dialogueEnded = true; for (i in 0...textBoxTypes.length) { var checkArray:Array = ['', 'center-']; @@ -184,18 +327,25 @@ class DialogueBoxPsych extends FlxSpriteGroup box.animation.curAnim.curFrame = box.animation.curAnim.frames.length - 1; box.animation.curAnim.reverse(); + daText.kill(); remove(daText); + daText.destroy(); daText = null; - updateBoxOffsets(); + updateBoxOffsets(box); FlxG.sound.music.fadeOut(1, 0); } else { startNextDialog(); } FlxG.sound.play(Paths.sound('dialogueClose')); } else if(daText.finishedText) { - var char:FlxSprite = arrayCharacters[lastCharacter]; - if(char != null && !char.animation.curAnim.name.endsWith('Idle') && char.animation.curAnim.curFrame >= char.animation.curAnim.frames.length - 1) { - char.animation.play(char.animation.curAnim.name + 'Idle'); + var char:DialogueCharacter = arrayCharacters[lastCharacter]; + if(char != null && char.animation.curAnim != null && char.animationIsLoop() && char.animation.finished) { + char.playAnim(char.animation.curAnim.name, true); + } + } else { + var char:DialogueCharacter = arrayCharacters[lastCharacter]; + if(char != null && char.animation.curAnim != null && char.animation.finished) { + char.animation.curAnim.restart(); } } @@ -209,7 +359,7 @@ class DialogueBoxPsych extends FlxSpriteGroup } } } - updateBoxOffsets(); + updateBoxOffsets(box); } if(lastCharacter != -1 && arrayCharacters.length > 0) { @@ -217,30 +367,30 @@ class DialogueBoxPsych extends FlxSpriteGroup var char = arrayCharacters[i]; if(char != null) { if(i != lastCharacter) { - switch(charPositionList[arrayPosition[i]]) { + switch(char.jsonFile.dialogue_pos) { case 'left': char.x -= scrollSpeed * elapsed; - if(char.x < arrayStartPos[i] + offsetPos) char.x = arrayStartPos[i] + offsetPos; + if(char.x < char.startingPos + offsetPos) char.x = char.startingPos + offsetPos; case 'center': char.y += scrollSpeed * elapsed; - if(char.y > FlxG.height + 50) char.y = FlxG.height + 50; + if(char.y > char.startingPos + FlxG.height) char.y = char.startingPos + FlxG.height; case 'right': char.x += scrollSpeed * elapsed; - if(char.x > arrayStartPos[i] - offsetPos) char.x = arrayStartPos[i] - offsetPos; + if(char.x > char.startingPos - offsetPos) char.x = char.startingPos - offsetPos; } char.alpha -= 3 * elapsed; - if(char.alpha < 0) char.alpha = 0; + if(char.alpha < 0.00001) char.alpha = 0.00001; } else { - switch(charPositionList[arrayPosition[i]]) { + switch(char.jsonFile.dialogue_pos) { case 'left': char.x += scrollSpeed * elapsed; - if(char.x > arrayStartPos[i]) char.x = arrayStartPos[i]; + if(char.x > char.startingPos) char.x = char.startingPos; case 'center': char.y -= scrollSpeed * elapsed; - if(char.y < arrayStartPos[i]) char.y = arrayStartPos[i]; + if(char.y < char.startingPos) char.y = char.startingPos; case 'right': char.x -= scrollSpeed * elapsed; - if(char.x < arrayStartPos[i]) char.x = arrayStartPos[i]; + if(char.x < char.startingPos) char.x = char.startingPos; } char.alpha += 3 * elapsed; if(char.alpha > 1) char.alpha = 1; @@ -250,32 +400,45 @@ class DialogueBoxPsych extends FlxSpriteGroup } } else { //Dialogue ending if(box != null && box.animation.curAnim.curFrame <= 0) { + box.kill(); remove(box); + box.destroy(); box = null; } if(bgFade != null) { bgFade.alpha -= 0.5 * elapsed; if(bgFade.alpha <= 0) { + bgFade.kill(); remove(bgFade); + bgFade.destroy(); bgFade = null; } } for (i in 0...arrayCharacters.length) { - var leChar:FlxSprite = arrayCharacters[i]; + var leChar:DialogueCharacter = arrayCharacters[i]; if(leChar != null) { - leChar.x += scrollSpeed * (i == 1 ? 1 : -1) * elapsed; + switch(arrayCharacters[i].jsonFile.dialogue_pos) { + case 'left': + leChar.x -= scrollSpeed * elapsed; + case 'center': + leChar.y += scrollSpeed * elapsed; + case 'right': + leChar.x += scrollSpeed * elapsed; + } leChar.alpha -= elapsed * 10; } } if(box == null && bgFade == null) { for (i in 0...arrayCharacters.length) { - var leChar:FlxSprite = arrayCharacters[0]; + var leChar:DialogueCharacter = arrayCharacters[0]; if(leChar != null) { arrayCharacters.remove(leChar); + leChar.kill(); remove(leChar); + leChar.destroy(); } } finishThing(); @@ -289,11 +452,16 @@ class DialogueBoxPsych extends FlxSpriteGroup var lastBoxType:String = ''; function startNextDialog():Void { - var splitName:Array = dialogueList[currentText].split(":"); - var character:Int = Std.parseInt(splitName[1]); - var speed:Float = Std.parseFloat(splitName[3]); + var curDialogue:DialogueLine = null; + do { + curDialogue = dialogueList.dialogue[currentText]; + } while(curDialogue == null); + + if(curDialogue.text == null || curDialogue.text.length < 1) curDialogue.text = ' '; + if(curDialogue.boxState == null) curDialogue.boxState = 'normal'; + if(curDialogue.speed == null || Math.isNaN(curDialogue.speed)) curDialogue.speed = 0.05; - var animName:String = splitName[4]; + var animName:String = curDialogue.boxState; var boxType:String = textBoxTypes[0]; for (i in 0...textBoxTypes.length) { if(textBoxTypes[i] == animName) { @@ -301,38 +469,49 @@ class DialogueBoxPsych extends FlxSpriteGroup } } - textToType = splitName[5]; - //FlxG.log.add(textToType); + var character:Int = 0; box.visible = true; - + for (i in 0...arrayCharacters.length) { + if(arrayCharacters[i].curCharacter == curDialogue.portrait) { + character = i; + break; + } + } var centerPrefix:String = ''; - if(charPositionList[arrayPosition[character]] == 'center') centerPrefix = 'center-'; + var lePosition:String = arrayCharacters[character].jsonFile.dialogue_pos; + if(lePosition == 'center') centerPrefix = 'center-'; if(character != lastCharacter) { box.animation.play(centerPrefix + boxType + 'Open', true); - updateBoxOffsets(); - box.flipX = (charPositionList[arrayPosition[character]] == 'left'); + updateBoxOffsets(box); + box.flipX = (lePosition == 'left'); } else if(boxType != lastBoxType) { box.animation.play(centerPrefix + boxType, true); - updateBoxOffsets(); + updateBoxOffsets(box); } lastCharacter = character; lastBoxType = boxType; if(daText != null) { daText.killTheTimer(); + daText.kill(); remove(daText); + daText.destroy(); } - daText = new Alphabet(textX, textY, textToType, false, true, speed, 0.7); + + textToType = curDialogue.text; + daText = new Alphabet(DEFAULT_TEXT_X, DEFAULT_TEXT_Y, textToType, false, true, curDialogue.speed, 0.7); add(daText); - var char:FlxSprite = arrayCharacters[character]; + var char:DialogueCharacter = arrayCharacters[character]; if(char != null) { - char.animation.play(splitName[2], true); - var rate:Float = 24 - (((speed - 0.05) / 5) * 480); - if(rate < 12) rate = 12; - else if(rate > 48) rate = 48; - char.animation.curAnim.frameRate = rate; + char.playAnim(curDialogue.expression, daText.finishedText); + if(char.animation.curAnim != null) { + var rate:Float = 24 - (((curDialogue.speed - 0.05) / 5) * 480); + if(rate < 12) rate = 12; + else if(rate > 48) rate = 48; + char.animation.curAnim.frameRate = rate; + } } currentText++; @@ -341,7 +520,16 @@ class DialogueBoxPsych extends FlxSpriteGroup } } - function updateBoxOffsets() { + public static function parseDialogue(path:String):DialogueFile { + #if MODS_ALLOWED + var rawJson = File.getContent(path); + #else + var rawJson = Assets.getText(path); + #end + return cast Json.parse(rawJson); + } + + public static function updateBoxOffsets(box:FlxSprite) { //Had to make it static because of the editors box.centerOffsets(); box.updateHitbox(); if(box.animation.curAnim.name.startsWith('angry')) { diff --git a/source/FlxVideo.hx b/source/FlxVideo.hx new file mode 100644 index 000000000..1b57cafcf --- /dev/null +++ b/source/FlxVideo.hx @@ -0,0 +1,133 @@ +#if windows +import openfl.net.NetConnection; +import openfl.net.NetStream; +import openfl.events.NetStatusEvent; +import openfl.media.Video; +#else +import openfl.events.Event; +import vlc.VlcBitmap; +#end +import flixel.FlxBasic; +import flixel.FlxG; + +class FlxVideo extends FlxBasic { + #if VIDEOS_ALLOWED + public var finishCallback:Void->Void = null; + + #if desktop + public static var vlcBitmap:VlcBitmap; + #end + + public function new(name:String) { + super(); + + #if web + var player:Video = new Video(); + player.x = 0; + player.y = 0; + FlxG.addChildBelowMouse(player); + var netConnect = new NetConnection(); + netConnect.connect(null); + var netStream = new NetStream(netConnect); + netStream.client = { + onMetaData: function() { + player.attachNetStream(netStream); + player.width = FlxG.width; + player.height = FlxG.height; + } + }; + netConnect.addEventListener(NetStatusEvent.NET_STATUS, function(event:NetStatusEvent) { + if(event.info.code == "NetStream.Play.Complete") { + netStream.dispose(); + if(FlxG.game.contains(player)) FlxG.game.removeChild(player); + + if(finishCallback != null) finishCallback(); + } + }); + netStream.play(name); + + #elseif desktop + // by Polybius, check out PolyEngine! https://github.com/polybiusproxy/PolyEngine + + vlcBitmap = new VlcBitmap(); + vlcBitmap.set_height(FlxG.stage.stageHeight); + vlcBitmap.set_width(FlxG.stage.stageHeight * (16 / 9)); + + vlcBitmap.onComplete = onVLCComplete; + vlcBitmap.onError = onVLCError; + + FlxG.stage.addEventListener(Event.ENTER_FRAME, fixVolume); + vlcBitmap.repeat = 0; + vlcBitmap.inWindow = false; + vlcBitmap.fullscreen = false; + fixVolume(null); + + FlxG.addChildBelowMouse(vlcBitmap); + vlcBitmap.play(checkFile(name)); + #end + } + + #if desktop + function checkFile(fileName:String):String + { + var pDir = ""; + var appDir = "file:///" + Sys.getCwd() + "/"; + + if (fileName.indexOf(":") == -1) // Not a path + pDir = appDir; + else if (fileName.indexOf("file://") == -1 || fileName.indexOf("http") == -1) // C:, D: etc? ..missing "file:///" ? + pDir = "file:///"; + + return pDir + fileName; + } + + public static function onFocus() { + if(vlcBitmap != null) { + vlcBitmap.resume(); + } + } + + public static function onFocusLost() { + if(vlcBitmap != null) { + vlcBitmap.pause(); + } + } + + function fixVolume(e:Event) + { + // shitty volume fix + vlcBitmap.volume = 0; + if(!FlxG.sound.muted && FlxG.sound.volume > 0.01) { //Kind of fixes the volume being too low when you decrease it + vlcBitmap.volume = FlxG.sound.volume * 0.5 + 0.5; + } + } + + public function onVLCComplete() + { + vlcBitmap.stop(); + + // Clean player, just in case! + vlcBitmap.dispose(); + + if (FlxG.game.contains(vlcBitmap)) + { + FlxG.game.removeChild(vlcBitmap); + } + + if (finishCallback != null) + { + finishCallback(); + } + } + + + function onVLCError() + { + trace("An error has occured while trying to load the video.\nPlease, check if the file you're loading exists."); + if (finishCallback != null) { + finishCallback(); + } + } + #end + #end +} \ No newline at end of file diff --git a/source/FreeplayState.hx b/source/FreeplayState.hx index 6d4313577..150837e70 100644 --- a/source/FreeplayState.hx +++ b/source/FreeplayState.hx @@ -16,21 +16,12 @@ import flixel.tweens.FlxTween; import lime.utils.Assets; import flixel.system.FlxSound; import openfl.utils.Assets as OpenFlAssets; +import WeekData; using StringTools; class FreeplayState extends MusicBeatState { - //Character head icons for your songs - static var songsHeads:Array = [ - ['dad'], //Week 1 - ['spooky', 'spooky', 'monster'], //Week 2 - ['pico'], //Week 3 - ['mom'], //Week 4 - ['parents', 'parents', 'monster'], //Week 5 - ['senpai', 'senpai', 'spirit'] //Week 6 - ]; - var songs:Array = []; var selector:FlxText; @@ -49,7 +40,6 @@ class FreeplayState extends MusicBeatState private var curPlaying:Bool = false; private var iconArray:Array = []; - public static var coolColors:Array = []; var bg:FlxSprite; var intendedColor:Int; @@ -57,39 +47,42 @@ class FreeplayState extends MusicBeatState override function create() { - transIn = FlxTransitionableState.defaultTransIn; - transOut = FlxTransitionableState.defaultTransOut; - var initSonglist = CoolUtil.coolTextFile(Paths.txt('freeplaySonglist')); - for (i in 0...initSonglist.length) - { - var songArray:Array = initSonglist[i].split(":"); - addSong(songArray[0], 0, songArray[1]); - songs[songs.length-1].color = Std.parseInt(songArray[2]); - } - var colorsList = CoolUtil.coolTextFile(Paths.txt('freeplayColors')); - for (i in 0...colorsList.length) - { - coolColors.push(Std.parseInt(colorsList[i])); - } - - /* - if (FlxG.sound.music != null) - { - if (!FlxG.sound.music.playing) - FlxG.sound.playMusic(Paths.music('freakyMenu')); - } - */ - + #if MODS_ALLOWED + Paths.destroyLoadedImages(); + #end + WeekData.reloadWeekFiles(false); #if desktop // Updating Discord Rich Presence DiscordClient.changePresence("In the Menus", null); #end - for (i in 1...WeekData.songsNames.length) { - #if !debug - if (StoryMenuState.weekUnlocked[i]) - #end - addWeek(WeekData.songsNames[i], i, songsHeads[i-1]); + for (i in 0...WeekData.weeksList.length) { + var leWeek:WeekData = WeekData.weeksLoaded.get(WeekData.weeksList[i]); + var leSongs:Array = []; + var leChars:Array = []; + for (j in 0...leWeek.songs.length) { + leSongs.push(leWeek.songs[j][0]); + leChars.push(leWeek.songs[j][1]); + } + + WeekData.setDirectoryFromWeek(leWeek); + for (song in leWeek.songs) { + var colors:Array = song[2]; + if(colors == null || colors.length < 3) { + colors = [146, 113, 253]; + } + addSong(song[0], i, song[1], FlxColor.fromRGB(colors[0], colors[1], colors[2])); + } + } + WeekData.setDirectoryFromWeek(); + + var initSonglist = CoolUtil.coolTextFile(Paths.txt('freeplaySonglist')); + for (i in 0...initSonglist.length) + { + if(initSonglist[i] != null && initSonglist[i].length > 0) { + var songArray:Array = initSonglist[i].split(":"); + addSong(songArray[0], 0, songArray[1], Std.parseInt(songArray[2])); + } } // LOAD MUSIC @@ -97,6 +90,7 @@ class FreeplayState extends MusicBeatState // LOAD CHARACTERS bg = new FlxSprite().loadGraphic(Paths.image('menuDesat')); + bg.antialiasing = ClientPrefs.globalAntialiasing; add(bg); grpSongs = new FlxTypedGroup(); @@ -109,6 +103,7 @@ class FreeplayState extends MusicBeatState songText.targetY = i; grpSongs.add(songText); + Paths.currentModDirectory = songs[i].folder; var icon:HealthIcon = new HealthIcon(songs[i].songCharacter); icon.sprTracker = songText; @@ -120,6 +115,7 @@ class FreeplayState extends MusicBeatState // DONT PUT X IN THE FIRST PARAMETER OF new ALPHABET() !! // songText.screenCenter(X); } + WeekData.setDirectoryFromWeek(); scoreText = new FlxText(FlxG.width * 0.7, 5, 0, "", 32); scoreText.setFormat(Paths.font("vcr.ttf"), 32, FlxColor.WHITE, RIGHT); @@ -134,6 +130,7 @@ class FreeplayState extends MusicBeatState add(scoreText); + if(curSelected >= songs.length) curSelected = 0; bg.color = songs[curSelected].color; intendedColor = bg.color; changeSelection(); @@ -180,12 +177,12 @@ class FreeplayState extends MusicBeatState super.closeSubState(); } - public function addSong(songName:String, weekNum:Int, songCharacter:String) + public function addSong(songName:String, weekNum:Int, songCharacter:String, color:Int) { - songs.push(new SongMetadata(songName, weekNum, songCharacter)); + songs.push(new SongMetadata(songName, weekNum, songCharacter, color)); } - public function addWeek(songs:Array, weekNum:Int, ?songCharacters:Array) + /*public function addWeek(songs:Array, weekNum:Int, weekColor:Int, ?songCharacters:Array) { if (songCharacters == null) songCharacters = ['bf']; @@ -194,11 +191,12 @@ class FreeplayState extends MusicBeatState for (song in songs) { addSong(song, weekNum, songCharacters[num]); + this.songs[this.songs.length-1].color = weekColor; if (songCharacters.length != 1) num++; } - } + }*/ var instPlaying:Int = -1; private static var vocals:FlxSound = null; @@ -225,13 +223,16 @@ class FreeplayState extends MusicBeatState var accepted = controls.ACCEPT; var space = FlxG.keys.justPressed.SPACE; + var shiftMult:Int = 1; + if(FlxG.keys.pressed.SHIFT) shiftMult = 3; + if (upP) { - changeSelection(-1); + changeSelection(-shiftMult); } if (downP) { - changeSelection(1); + changeSelection(shiftMult); } if (controls.UI_LEFT_P) @@ -252,6 +253,7 @@ class FreeplayState extends MusicBeatState if(space && instPlaying != curSelected) { destroyFreeplayVocals(); + Paths.currentModDirectory = songs[curSelected].folder; var poop:String = Highscore.formatSong(songs[curSelected].songName.toLowerCase(), curDifficulty); PlayState.SONG = Song.loadFromJson(poop, songs[curSelected].songName.toLowerCase()); if (PlayState.SONG.needsVoices) @@ -269,9 +271,13 @@ class FreeplayState extends MusicBeatState } else #end if (accepted) { - var songLowercase:String = songs[curSelected].songName.toLowerCase(); + var songLowercase:String = Paths.formatToSongPath(songs[curSelected].songName); var poop:String = Highscore.formatSong(songLowercase, curDifficulty); + #if dontUseManifest + if(!sys.FileSystem.exists(Paths.modsJson(songLowercase + '/' + poop)) && !sys.FileSystem.exists(Paths.json(songLowercase + '/' + poop))) { + #else if(!OpenFlAssets.exists(Paths.json(songLowercase + '/' + poop))) { + #end poop = songLowercase; curDifficulty = 1; trace('Couldnt find file'); @@ -283,7 +289,7 @@ class FreeplayState extends MusicBeatState PlayState.storyDifficulty = curDifficulty; PlayState.storyWeek = songs[curSelected].week; - trace('CURRENT WEEK: ' + WeekData.getCurrentWeekNumber()); + trace('CURRENT WEEK: ' + WeekData.getWeekFileName()); if(colorTween != null) { colorTween.cancel(); } @@ -383,6 +389,7 @@ class FreeplayState extends MusicBeatState } } changeDiff(); + Paths.currentModDirectory = songs[curSelected].folder; } private function positionHighscore() { @@ -401,14 +408,15 @@ class SongMetadata public var week:Int = 0; public var songCharacter:String = ""; public var color:Int = -7179779; + public var folder:String = ""; - public function new(song:String, week:Int, songCharacter:String) + public function new(song:String, week:Int, songCharacter:String, color:Int) { this.songName = song; this.week = week; this.songCharacter = songCharacter; - if(week < FreeplayState.coolColors.length) { - this.color = FreeplayState.coolColors[week]; - } + this.color = color; + this.folder = Paths.currentModDirectory; + if(this.folder == null) this.folder = ''; } } diff --git a/source/FunkinLua.hx b/source/FunkinLua.hx index f1d0cb250..e9ac2e712 100644 --- a/source/FunkinLua.hx +++ b/source/FunkinLua.hx @@ -8,17 +8,25 @@ import llua.Convert; import flixel.FlxG; import flixel.tweens.FlxTween; import flixel.tweens.FlxEase; +import flixel.text.FlxText; import flixel.group.FlxGroup.FlxTypedGroup; import flixel.math.FlxPoint; +import flixel.system.FlxSound; import flixel.util.FlxTimer; import flixel.FlxSprite; import flixel.FlxCamera; +import flixel.util.FlxColor; +import flixel.FlxBasic; +import flixel.FlxObject; +import flixel.FlxSprite; +import openfl.display.BlendMode; #if sys import sys.FileSystem; import sys.io.File; #end import Type.ValueType; import Controls; +import DialogueBoxPsych; using StringTools; @@ -27,23 +35,14 @@ class FunkinLua { public static var Function_Continue = 0; #if LUA_ALLOWED - private var lua:State = null; + public var lua:State = null; #end var lePlayState:PlayState = null; + var scriptName:String = ''; + var gonnaClose:Bool = false; - #if (haxe >= "4.0.0") - public var tweens:Map = new Map(); - public var sprites:Map = new Map(); - public var accessedProps:Map = new Map(); - public var timers:Map = new Map(); - #else - public var tweens:Map = new Map(); - public var sprites:Map = new Map(); - public var accessedProps:Map = new Map(); - public var timers:Map = new Map(); - #end - + public var accessedProps:Map = null; public function new(script:String) { #if LUA_ALLOWED lua = LuaL.newstate(); @@ -61,8 +60,15 @@ class FunkinLua { lua = null; return; } + scriptName = script; trace('Lua file loaded succesfully:' + script); + #if (haxe >= "4.0.0") + accessedProps = new Map(); + #else + accessedProps = new Map(); + #end + var curState:Dynamic = FlxG.state; lePlayState = curState; @@ -71,6 +77,7 @@ class FunkinLua { set('Function_Continue', Function_Continue); set('luaDebugMode', false); set('luaDeprecatedWarnings', true); + set('inChartEditor', false); // Song/Week shit set('curBpm', Conductor.bpm); @@ -85,7 +92,7 @@ class FunkinLua { set('isStoryMode', PlayState.isStoryMode); set('difficulty', PlayState.storyDifficulty); set('weekRaw', PlayState.storyWeek); - set('week', WeekData.getCurrentWeekNumber()); + set('week', WeekData.weeksList[PlayState.storyWeek]); set('seenCutscene', PlayState.seenCutscene); // Camera poo @@ -102,11 +109,13 @@ class FunkinLua { set('score', 0); set('misses', 0); + set('ghostMisses', 0); set('hits', 0); set('rating', 0); set('ratingName', ''); + set('inGameOver', false); set('mustHitSection', false); set('botPlay', PlayState.cpuControlled); @@ -117,6 +126,14 @@ class FunkinLua { set('defaultOpponentStrumY' + i, 0); } + // Default character positions woooo + set('defaultBoyfriendX', lePlayState.BF_X); + set('defaultBoyfriendY', lePlayState.BF_Y); + set('defaultOpponentX', lePlayState.DAD_X); + set('defaultOpponentY', lePlayState.DAD_Y); + set('defaultGirlfriendX', lePlayState.GF_X); + set('defaultGirlfriendY', lePlayState.GF_Y); + // Some settings, no jokes set('downscroll', ClientPrefs.downScroll); set('middlescroll', ClientPrefs.middleScroll); @@ -133,7 +150,13 @@ class FunkinLua { Lua_helper.add_callback(lua, "getProperty", function(variable:String) { var killMe:Array = variable.split('.'); if(killMe.length > 1) { - var coverMeInPiss:Dynamic = Reflect.getProperty(lePlayState, killMe[0]); + var coverMeInPiss:Dynamic = null; + if(lePlayState.modchartSprites.exists(killMe[0])) { + coverMeInPiss = lePlayState.modchartSprites.get(killMe[0]); + } else { + coverMeInPiss = Reflect.getProperty(lePlayState, killMe[0]); + } + for (i in 1...killMe.length-1) { coverMeInPiss = Reflect.getProperty(coverMeInPiss, killMe[i]); } @@ -144,7 +167,13 @@ class FunkinLua { Lua_helper.add_callback(lua, "setProperty", function(variable:String, value:Dynamic) { var killMe:Array = variable.split('.'); if(killMe.length > 1) { - var coverMeInPiss:Dynamic = Reflect.getProperty(lePlayState, killMe[0]); + var coverMeInPiss:Dynamic = null; + if(lePlayState.modchartSprites.exists(killMe[0])) { + coverMeInPiss = lePlayState.modchartSprites.get(killMe[0]); + } else { + coverMeInPiss = Reflect.getProperty(lePlayState, killMe[0]); + } + for (i in 1...killMe.length-1) { coverMeInPiss = Reflect.getProperty(coverMeInPiss, killMe[i]); } @@ -162,8 +191,17 @@ class FunkinLua { if(Type.typeof(variable) == ValueType.TInt) { return leArray[variable]; } + var killMe:Array = variable.split('.'); + if(killMe.length > 1) { + var coverMeInPiss:Dynamic = Reflect.getProperty(leArray, killMe[0]); + for (i in 1...killMe.length-1) { + coverMeInPiss = Reflect.getProperty(coverMeInPiss, killMe[i]); + } + return Reflect.getProperty(coverMeInPiss, killMe[killMe.length-1]); + } return Reflect.getProperty(leArray, variable); } + luaTrace("Object #" + index + " from group: " + obj + " doesn't exist!"); return null; }); Lua_helper.add_callback(lua, "setPropertyFromGroup", function(obj:String, index:Int, variable:Dynamic, value:Dynamic) { @@ -176,13 +214,21 @@ class FunkinLua { if(Type.typeof(variable) == ValueType.TInt) { return leArray[variable] = value; } + var killMe:Array = variable.split('.'); + if(killMe.length > 1) { + var coverMeInPiss:Dynamic = Reflect.getProperty(leArray, killMe[0]); + for (i in 1...killMe.length-1) { + coverMeInPiss = Reflect.getProperty(coverMeInPiss, killMe[i]); + } + return Reflect.setProperty(coverMeInPiss, killMe[killMe.length-1], value); + } return Reflect.setProperty(leArray, variable, value); } }); - Lua_helper.add_callback(lua, "removeFromGroup", function(obj:String, index:Int, dontKill:Bool = false, dontDestroy:Bool = false) { + Lua_helper.add_callback(lua, "removeFromGroup", function(obj:String, index:Int, dontDestroy:Bool = false) { if(Std.isOfType(Reflect.getProperty(lePlayState, obj), FlxTypedGroup)) { var sex = Reflect.getProperty(lePlayState, obj).members[index]; - if(!dontKill) + if(!dontDestroy) sex.kill(); Reflect.getProperty(lePlayState, obj).remove(sex, true); if(!dontDestroy) @@ -216,157 +262,190 @@ class FunkinLua { }); //shitass stuff for epic coders like me B) *image of obama giving himself a medal* - Lua_helper.add_callback(lua, "accessPropertyFirst", function(tag:String, classVar:String, variable:String) { - accessedProps.set(tag , Reflect.getProperty(classVar != null ? Type.resolveClass(classVar) : lePlayState, variable)); - }); - Lua_helper.add_callback(lua, "accessPropertyFromGroupFirst", function(tag:String, classVar:String, obj:String, index:Int, variable:Dynamic) { - if(Std.isOfType(Reflect.getProperty(classVar != null ? Type.resolveClass(classVar) : lePlayState, variable), FlxTypedGroup)) { - accessedProps.set(tag, Reflect.getProperty(Reflect.getProperty(classVar != null ? Type.resolveClass(classVar) : lePlayState, obj).members[index], variable)); + Lua_helper.add_callback(lua, "getObjectOrder", function(obj:String) { + if(lePlayState.modchartSprites.exists(obj) && lePlayState.modchartSprites.get(obj).wasAdded) { + return lePlayState.members.indexOf(lePlayState.modchartSprites.get(obj)); } - var leArray:Dynamic = Reflect.getProperty(classVar != null ? Type.resolveClass(classVar) : lePlayState, variable)[index]; - if(leArray != null) { - if(Type.typeof(variable) == ValueType.TInt) { - accessedProps.set(tag, leArray[variable]); - } - accessedProps.set(tag, Reflect.getProperty(leArray, variable)); + var leObj:FlxBasic = Reflect.getProperty(lePlayState, obj); + if(leObj != null) { + return lePlayState.members.indexOf(leObj); } + luaTrace("Object " + obj + " doesn't exist!"); + return -1; }); - Lua_helper.add_callback(lua, "accessProperty", function(tag:String, variable:String) { - if(accessedProps.exists(tag)) { - accessedProps.set(tag, Reflect.getProperty(accessedProps.get(tag), variable)); - } - }); - Lua_helper.add_callback(lua, "accessPropertyFromGroup", function(tag:String, index:Int, variable:Dynamic) { - if(!accessedProps.exists(tag)) { - return; - } - - if(Std.isOfType(accessedProps.get(tag), FlxTypedGroup)) { - accessedProps.set(tag, Reflect.getProperty(accessedProps.get(tag).members[index], variable)); - } - - var leArray:Dynamic = accessedProps.get(tag)[index]; - if(leArray != null) { - if(Type.typeof(variable) == ValueType.TInt) { - accessedProps.set(tag, leArray[variable]); + Lua_helper.add_callback(lua, "setObjectOrder", function(obj:String, position:Int) { + if(lePlayState.modchartSprites.exists(obj)) { + var spr:ModchartSprite = lePlayState.modchartSprites.get(obj); + if(spr.wasAdded) { + lePlayState.remove(spr, true); + lePlayState.insert(position, spr); + return; } - accessedProps.set(tag, Reflect.getProperty(leArray, variable)); } - }); - Lua_helper.add_callback(lua, "getAccessedPropertyValue", function(tag:String, variable:String) { - if(accessedProps.exists(tag)) { - return Reflect.getProperty(accessedProps.get(tag), variable); - } - return null; - }); - Lua_helper.add_callback(lua, "setAccessedPropertyValue", function(tag:String, variable:String, value:Dynamic) { - if(accessedProps.exists(tag)) { - return Reflect.setProperty(accessedProps.get(tag), variable, value); - } - }); - Lua_helper.add_callback(lua, "getAccessedPropertyValueFromGroup", function(tag:String, index:Int, variable:Dynamic) { - if(accessedProps.exists(tag)) { - if(Std.isOfType(accessedProps.get(tag), FlxTypedGroup)) { - return Reflect.getProperty(accessedProps.get(tag).members[index], variable); - } - var leArray:Dynamic = accessedProps.get(tag)[index]; - if(leArray != null) { - if(Type.typeof(variable) == ValueType.TInt) { - return leArray[variable]; - } - return Reflect.getProperty(leArray, variable); - } + var leObj:FlxBasic = Reflect.getProperty(lePlayState, obj); + if(leObj != null) { + lePlayState.remove(leObj, true); + lePlayState.insert(position, leObj); + return; } - return null; + luaTrace("Object " + obj + " doesn't exist!"); }); - Lua_helper.add_callback(lua, "setAccessedPropertyValueFromGroup", function(tag:String, index:Int, variable:Dynamic, value:Dynamic) { - if(accessedProps.exists(tag)) { - if(Std.isOfType(accessedProps.get(tag), FlxTypedGroup)) { - return Reflect.setProperty(accessedProps.get(tag).members[index], variable, value); - } - var leArray:Dynamic = accessedProps.get(tag)[index]; - if(leArray != null) { - if(Type.typeof(variable) == ValueType.TInt) { - return leArray[variable] = value; + // gay ass tweens + Lua_helper.add_callback(lua, "doTweenX", function(tag:String, vars:String, value:Dynamic, duration:Float, ease:String) { + var penisExam:Dynamic = tweenShit(tag, vars); + if(penisExam != null) { + lePlayState.modchartTweens.set(tag, FlxTween.tween(penisExam, {x: value}, duration, {ease: getFlxEaseByString(ease), + onComplete: function(twn:FlxTween) { + lePlayState.callOnLuas('onTweenCompleted', [tag]); + lePlayState.modchartTweens.remove(tag); } - return Reflect.setProperty(leArray, variable, value); - } + })); + } else { + luaTrace('Couldnt find object: ' + vars); } }); - - // gay ass tweens - Lua_helper.add_callback(lua, "doTweenX", function(tag:String, vars:String, value:Dynamic, duration:Float, ease:String, delay:Float = 0) { + Lua_helper.add_callback(lua, "doTweenY", function(tag:String, vars:String, value:Dynamic, duration:Float, ease:String) { var penisExam:Dynamic = tweenShit(tag, vars); if(penisExam != null) { - tweens.set(tag, FlxTween.tween(penisExam, {x: value}, duration, {ease: getFlxEaseByString(ease), startDelay: delay, + lePlayState.modchartTweens.set(tag, FlxTween.tween(penisExam, {y: value}, duration, {ease: getFlxEaseByString(ease), onComplete: function(twn:FlxTween) { - call('onTweenCompleted', [tag]); - tweens.remove(tag); + lePlayState.callOnLuas('onTweenCompleted', [tag]); + lePlayState.modchartTweens.remove(tag); } })); + } else { + luaTrace('Couldnt find object: ' + vars); } }); - Lua_helper.add_callback(lua, "doTweenY", function(tag:String, vars:String, value:Dynamic, duration:Float, ease:String, delay:Float = 0) { + Lua_helper.add_callback(lua, "doTweenAngle", function(tag:String, vars:String, value:Dynamic, duration:Float, ease:String) { var penisExam:Dynamic = tweenShit(tag, vars); if(penisExam != null) { - tweens.set(tag, FlxTween.tween(penisExam, {y: value}, duration, {ease: getFlxEaseByString(ease), startDelay: delay, + lePlayState.modchartTweens.set(tag, FlxTween.tween(penisExam, {angle: value}, duration, {ease: getFlxEaseByString(ease), onComplete: function(twn:FlxTween) { - call('onTweenCompleted', [tag]); - tweens.remove(tag); + lePlayState.callOnLuas('onTweenCompleted', [tag]); + lePlayState.modchartTweens.remove(tag); } })); + } else { + luaTrace('Couldnt find object: ' + vars); } }); - Lua_helper.add_callback(lua, "doTweenAlpha", function(tag:String, vars:String, value:Dynamic, duration:Float, ease:String, delay:Float = 0) { + Lua_helper.add_callback(lua, "doTweenAlpha", function(tag:String, vars:String, value:Dynamic, duration:Float, ease:String) { var penisExam:Dynamic = tweenShit(tag, vars); if(penisExam != null) { - tweens.set(tag, FlxTween.tween(penisExam, {alpha: value}, duration, {ease: getFlxEaseByString(ease), startDelay: delay, + lePlayState.modchartTweens.set(tag, FlxTween.tween(penisExam, {alpha: value}, duration, {ease: getFlxEaseByString(ease), onComplete: function(twn:FlxTween) { - call('onTweenCompleted', [tag]); - tweens.remove(tag); + lePlayState.callOnLuas('onTweenCompleted', [tag]); + lePlayState.modchartTweens.remove(tag); } })); + } else { + luaTrace('Couldnt find object: ' + vars); } }); - Lua_helper.add_callback(lua, "doTweenZoom", function(tag:String, vars:String, value:Dynamic, duration:Float, ease:String, delay:Float = 0) { + Lua_helper.add_callback(lua, "doTweenZoom", function(tag:String, vars:String, value:Dynamic, duration:Float, ease:String) { var penisExam:Dynamic = tweenShit(tag, vars); if(penisExam != null) { - tweens.set(tag, FlxTween.tween(penisExam, {zoom: value}, duration, {ease: getFlxEaseByString(ease), startDelay: delay, + lePlayState.modchartTweens.set(tag, FlxTween.tween(penisExam, {zoom: value}, duration, {ease: getFlxEaseByString(ease), onComplete: function(twn:FlxTween) { - call('onTweenCompleted', [tag]); - tweens.remove(tag); + lePlayState.callOnLuas('onTweenCompleted', [tag]); + lePlayState.modchartTweens.remove(tag); } })); + } else { + luaTrace('Couldnt find object: ' + vars); } }); - Lua_helper.add_callback(lua, "doTweenColor", function(tag:String, vars:String, targetColor:String, duration:Float, ease:String, delay:Float = 0) { + Lua_helper.add_callback(lua, "doTweenColor", function(tag:String, vars:String, targetColor:String, duration:Float, ease:String) { var penisExam:Dynamic = tweenShit(tag, vars); if(penisExam != null) { var color:Int = Std.parseInt(targetColor); if(!targetColor.startsWith('0x')) color = Std.parseInt('0xff' + targetColor); - tweens.set(tag, FlxTween.color(penisExam, duration, penisExam.color, color, {ease: getFlxEaseByString(ease), startDelay: delay, + lePlayState.modchartTweens.set(tag, FlxTween.color(penisExam, duration, penisExam.color, color, {ease: getFlxEaseByString(ease), + onComplete: function(twn:FlxTween) { + lePlayState.modchartTweens.remove(tag); + lePlayState.callOnLuas('onTweenCompleted', [tag]); + } + })); + } else { + luaTrace('Couldnt find object: ' + vars); + } + }); + + //Tween shit, but for strums + Lua_helper.add_callback(lua, "noteTweenX", function(tag:String, note:Int, value:Dynamic, duration:Float, ease:String) { + cancelTween(tag); + if(note < 0) note = 0; + var testicle:StrumNote = lePlayState.strumLineNotes.members[note % lePlayState.strumLineNotes.length]; + + if(testicle != null) { + lePlayState.modchartTweens.set(tag, FlxTween.tween(testicle, {x: value}, duration, {ease: getFlxEaseByString(ease), + onComplete: function(twn:FlxTween) { + lePlayState.callOnLuas('onTweenCompleted', [tag]); + lePlayState.modchartTweens.remove(tag); + } + })); + } + }); + Lua_helper.add_callback(lua, "noteTweenY", function(tag:String, note:Int, value:Dynamic, duration:Float, ease:String) { + cancelTween(tag); + if(note < 0) note = 0; + var testicle:StrumNote = lePlayState.strumLineNotes.members[note % lePlayState.strumLineNotes.length]; + + if(testicle != null) { + lePlayState.modchartTweens.set(tag, FlxTween.tween(testicle, {y: value}, duration, {ease: getFlxEaseByString(ease), onComplete: function(twn:FlxTween) { - tweens.remove(tag); - call('onTweenCompleted', [tag]); + lePlayState.callOnLuas('onTweenCompleted', [tag]); + lePlayState.modchartTweens.remove(tag); } })); } }); + Lua_helper.add_callback(lua, "noteTweenAngle", function(tag:String, note:Int, value:Dynamic, duration:Float, ease:String) { + cancelTween(tag); + if(note < 0) note = 0; + var testicle:StrumNote = lePlayState.strumLineNotes.members[note % lePlayState.strumLineNotes.length]; + + if(testicle != null) { + lePlayState.modchartTweens.set(tag, FlxTween.tween(testicle, {angle: value}, duration, {ease: getFlxEaseByString(ease), + onComplete: function(twn:FlxTween) { + lePlayState.callOnLuas('onTweenCompleted', [tag]); + lePlayState.modchartTweens.remove(tag); + } + })); + } + }); + Lua_helper.add_callback(lua, "noteTweenAlpha", function(tag:String, note:Int, value:Dynamic, duration:Float, ease:String) { + cancelTween(tag); + if(note < 0) note = 0; + var testicle:StrumNote = lePlayState.strumLineNotes.members[note % lePlayState.strumLineNotes.length]; + + if(testicle != null) { + lePlayState.modchartTweens.set(tag, FlxTween.tween(testicle, {alpha: value}, duration, {ease: getFlxEaseByString(ease), + onComplete: function(twn:FlxTween) { + lePlayState.callOnLuas('onTweenCompleted', [tag]); + lePlayState.modchartTweens.remove(tag); + } + })); + } + }); + Lua_helper.add_callback(lua, "cancelTween", function(tag:String) { cancelTween(tag); }); Lua_helper.add_callback(lua, "runTimer", function(tag:String, time:Float = 1, loops:Int = 1) { cancelTimer(tag); - timers.set(tag, new FlxTimer().start(time, function(tmr:FlxTimer) { + lePlayState.modchartTimers.set(tag, new FlxTimer().start(time, function(tmr:FlxTimer) { if(tmr.finished) { - timers.remove(tag); + lePlayState.modchartTimers.remove(tag); } - call('onTimerCompleted', [tag, tmr.loops, tmr.loopsLeft]); + lePlayState.callOnLuas('onTimerCompleted', [tag, tmr.loops, tmr.loopsLeft]); + //trace('Timer Completed: ' + tag); }, loops)); }); Lua_helper.add_callback(lua, "cancelTimer", function(tag:String) { @@ -477,79 +556,68 @@ class FunkinLua { } lePlayState.addCharacterToList(name, charType); }); + Lua_helper.add_callback(lua, "precacheImage", function(name:String) { + Paths.addCustomGraphic(name); + }); + Lua_helper.add_callback(lua, "precacheSound", function(name:String) { + CoolUtil.precacheSound(name); + }); Lua_helper.add_callback(lua, "triggerEvent", function(name:String, arg1:Dynamic, arg2:Dynamic) { var value1:String = arg1; var value2:String = arg2; - lePlayState.triggerEventNote(name, value1, value2, true); + lePlayState.triggerEventNote(name, value1, value2); //trace('Triggered event: ' + name + ', ' + value1 + ', ' + value2); }); - Lua_helper.add_callback(lua, "playSound", function(sound:String, volume:Float = 1) { - FlxG.sound.play(Paths.sound(sound), volume); - }); Lua_helper.add_callback(lua, "startCountdown", function(variable:String) { lePlayState.startCountdown(); }); + Lua_helper.add_callback(lua, "endSong", function() { + lePlayState.KillNotes(); + lePlayState.endSong(); + }); Lua_helper.add_callback(lua, "getSongPosition", function() { return Conductor.songPosition; }); Lua_helper.add_callback(lua, "getCharacterX", function(type:String) { switch(type.toLowerCase()) { - case 'dad': - return lePlayState.DAD_X; + case 'dad' | 'opponent': + return lePlayState.dadGroup.x; case 'gf' | 'girlfriend': - return lePlayState.GF_X; + return lePlayState.gfGroup.x; default: - return lePlayState.BF_X; + return lePlayState.boyfriendGroup.x; } }); Lua_helper.add_callback(lua, "setCharacterX", function(type:String, value:Float) { switch(type.toLowerCase()) { - case 'dad': - lePlayState.DAD_X = value; - lePlayState.dadGroup.forEachAlive(function (char:Character) { - char.x = lePlayState.DAD_X + char.positionArray[0]; - }); + case 'dad' | 'opponent': + lePlayState.dadGroup.x = value; case 'gf' | 'girlfriend': - lePlayState.BF_X = value; - lePlayState.boyfriendGroup.forEachAlive(function (char:Boyfriend) { - char.x = lePlayState.BF_X + char.positionArray[0]; - }); + lePlayState.gfGroup.x = value; default: - lePlayState.GF_X = value; - lePlayState.gfGroup.forEachAlive(function (char:Character) { - char.x = lePlayState.GF_X + char.positionArray[0]; - }); + lePlayState.boyfriendGroup.x = value; } }); Lua_helper.add_callback(lua, "getCharacterY", function(type:String) { switch(type.toLowerCase()) { - case 'dad': - return lePlayState.DAD_Y; + case 'dad' | 'opponent': + return lePlayState.dadGroup.y; case 'gf' | 'girlfriend': - return lePlayState.GF_Y; + return lePlayState.gfGroup.y; default: - return lePlayState.BF_Y; + return lePlayState.boyfriendGroup.y; } }); Lua_helper.add_callback(lua, "setCharacterY", function(type:String, value:Float) { switch(type.toLowerCase()) { - case 'dad': - lePlayState.DAD_Y = value; - lePlayState.dadGroup.forEachAlive(function (char:Character) { - char.y = lePlayState.DAD_Y + char.positionArray[1]; - }); + case 'dad' | 'opponent': + lePlayState.dadGroup.y = value; case 'gf' | 'girlfriend': - lePlayState.GF_Y = value; - lePlayState.gfGroup.forEachAlive(function (char:Character) { - char.y = lePlayState.GF_Y + char.positionArray[1]; - }); + lePlayState.gfGroup.y = value; default: - lePlayState.BF_Y = value; - lePlayState.boyfriendGroup.forEachAlive(function (char:Boyfriend) { - char.y = lePlayState.BF_Y + char.positionArray[1]; - }); + lePlayState.boyfriendGroup.y = value; } }); Lua_helper.add_callback(lua, "cameraSetTarget", function(target:String) { @@ -559,6 +627,9 @@ class FunkinLua { } lePlayState.moveCamera(isDad); }); + Lua_helper.add_callback(lua, "cameraShake", function(camera:String, intensity:Float, duration:Float) { + cameraFromString(camera).shake(intensity, duration); + }); Lua_helper.add_callback(lua, "setRatingPercent", function(value:Float) { lePlayState.ratingPercent = value; }); @@ -566,24 +637,13 @@ class FunkinLua { lePlayState.ratingString = value; }); Lua_helper.add_callback(lua, "getMouseX", function(camera:String) { - var cam:FlxCamera = lePlayState.camGame; - switch(camera.toLowerCase()) { - case 'camhud' | 'hud': cam = lePlayState.camHUD; - case 'camother' | 'other': cam = lePlayState.camOther; - } + var cam:FlxCamera = cameraFromString(camera); return FlxG.mouse.getScreenPosition(cam).x; }); Lua_helper.add_callback(lua, "getMouseY", function(camera:String) { - var cam:FlxCamera = lePlayState.camGame; - switch(camera.toLowerCase()) { - case 'camhud' | 'hud': cam = lePlayState.camHUD; - case 'camother' | 'other': cam = lePlayState.camOther; - } + var cam:FlxCamera = cameraFromString(camera); return FlxG.mouse.getScreenPosition(cam).y; }); - Lua_helper.add_callback(lua, "spawnNoteSplashes", function(x:Float, y:Float, data:Int = 0, type:Int = 0) { - lePlayState.spawnNoteSplash(x, y, data, type); - }); Lua_helper.add_callback(lua, "characterPlayAnim", function(character:String, anim:String, ?forced:Bool = false) { switch(character.toLowerCase()) { case 'dad': @@ -606,136 +666,500 @@ class FunkinLua { }); Lua_helper.add_callback(lua, "makeLuaSprite", function(tag:String, image:String, x:Float, y:Float) { + tag = tag.replace('.', ''); resetSpriteTag(tag); - var leSprite:LuaSprite = new LuaSprite(x, y); - leSprite.loadGraphic(Paths.image(image)); + var leSprite:ModchartSprite = new ModchartSprite(x, y); + if(image != null && image.length > 0) { + leSprite.loadGraphic(Paths.image(image)); + } leSprite.antialiasing = ClientPrefs.globalAntialiasing; - sprites.set(tag, leSprite); - leSprite.active = false; + lePlayState.modchartSprites.set(tag, leSprite); + leSprite.active = true; }); Lua_helper.add_callback(lua, "makeAnimatedLuaSprite", function(tag:String, image:String, x:Float, y:Float) { + tag = tag.replace('.', ''); resetSpriteTag(tag); - var leSprite:LuaSprite = new LuaSprite(x, y); + var leSprite:ModchartSprite = new ModchartSprite(x, y); leSprite.frames = Paths.getSparrowAtlas(image); leSprite.antialiasing = ClientPrefs.globalAntialiasing; - sprites.set(tag, leSprite); + lePlayState.modchartSprites.set(tag, leSprite); }); - Lua_helper.add_callback(lua, "luaSpriteAddAnimationByPrefix", function(tag:String, name:String, prefix:String, framerate:Int = 24, loop:Bool = true) { - if(sprites.exists(tag)) { - var cock:LuaSprite = sprites.get(tag); + Lua_helper.add_callback(lua, "makeGraphic", function(obj:String, width:Int, height:Int, color:String) { + var colorNum:Int = Std.parseInt(color); + if(!color.startsWith('0x')) colorNum = Std.parseInt('0xff' + color); + + if(lePlayState.modchartSprites.exists(obj)) { + lePlayState.modchartSprites.get(obj).makeGraphic(width, height, colorNum); + return; + } + + var object:FlxSprite = Reflect.getProperty(lePlayState, obj); + if(object != null) { + object.makeGraphic(width, height, colorNum); + } + }); + Lua_helper.add_callback(lua, "addAnimationByPrefix", function(obj:String, name:String, prefix:String, framerate:Int = 24, loop:Bool = true) { + if(lePlayState.modchartSprites.exists(obj)) { + var cock:ModchartSprite = lePlayState.modchartSprites.get(obj); + cock.animation.addByPrefix(name, prefix, framerate, loop); + if(cock.animation.curAnim == null) { + cock.animation.play(name, true); + } + return; + } + + var cock:FlxSprite = Reflect.getProperty(lePlayState, obj); + if(cock != null) { cock.animation.addByPrefix(name, prefix, framerate, loop); if(cock.animation.curAnim == null) { cock.animation.play(name, true); } } }); - Lua_helper.add_callback(lua, "luaSpriteAddAnimationByIndices", function(tag:String, name:String, prefix:String, indices:String, framerate:Int = 24) { - if(sprites.exists(tag)) { - var strIndices:Array = indices.trim().split(','); - var die:Array = []; - for (i in 0...strIndices.length) { - die.push(Std.parseInt(strIndices[i])); + Lua_helper.add_callback(lua, "addAnimationByIndices", function(obj:String, name:String, prefix:String, indices:String, framerate:Int = 24) { + var strIndices:Array = indices.trim().split(','); + var die:Array = []; + for (i in 0...strIndices.length) { + die.push(Std.parseInt(strIndices[i])); + } + + if(lePlayState.modchartSprites.exists(obj)) { + var pussy:ModchartSprite = lePlayState.modchartSprites.get(obj); + pussy.animation.addByIndices(name, prefix, die, '', framerate, false); + if(pussy.animation.curAnim == null) { + pussy.animation.play(name, true); } - var pussy:LuaSprite = sprites.get(tag); + return; + } + + var pussy:FlxSprite = Reflect.getProperty(lePlayState, obj); + if(pussy != null) { pussy.animation.addByIndices(name, prefix, die, '', framerate, false); if(pussy.animation.curAnim == null) { pussy.animation.play(name, true); } } }); - Lua_helper.add_callback(lua, "luaSpritePlayAnimation", function(tag:String, name:String, forced:Bool = false) { - if(sprites.exists(tag)) { - sprites.get(tag).animation.play(name, forced); + Lua_helper.add_callback(lua, "objectPlayAnimation", function(obj:String, name:String, forced:Bool = false) { + if(lePlayState.modchartSprites.exists(obj)) { + lePlayState.modchartSprites.get(obj).animation.play(name, forced); + return; + } + + var spr:FlxSprite = Reflect.getProperty(lePlayState, obj); + if(spr != null) { + spr.animation.play(name, forced); } }); - Lua_helper.add_callback(lua, "setLuaSpriteScrollFactor", function(tag:String, scrollX:Float, scrollY:Float) { - if(sprites.exists(tag)) { - sprites.get(tag).scrollFactor.set(scrollX, scrollY); + Lua_helper.add_callback(lua, "setScrollFactor", function(obj:String, scrollX:Float, scrollY:Float) { + if(lePlayState.modchartSprites.exists(obj)) { + lePlayState.modchartSprites.get(obj).scrollFactor.set(scrollX, scrollY); + return; + } + + var object:FlxObject = Reflect.getProperty(lePlayState, obj); + if(object != null) { + object.scrollFactor.set(scrollX, scrollY); } }); Lua_helper.add_callback(lua, "addLuaSprite", function(tag:String, front:Bool = false) { - if(sprites.exists(tag)) { - var shit:LuaSprite = sprites.get(tag); + if(lePlayState.modchartSprites.exists(tag)) { + var shit:ModchartSprite = lePlayState.modchartSprites.get(tag); if(!shit.wasAdded) { if(front) { - lePlayState.foregroundGroup.add(shit); + lePlayState.add(shit); } else { - lePlayState.backgroundGroup.add(shit); + var position:Int = lePlayState.members.indexOf(lePlayState.gfGroup); + if(lePlayState.members.indexOf(lePlayState.boyfriendGroup) < position) { + position = lePlayState.members.indexOf(lePlayState.boyfriendGroup); + } else if(lePlayState.members.indexOf(lePlayState.dadGroup) < position) { + position = lePlayState.members.indexOf(lePlayState.dadGroup); + } + lePlayState.insert(position, shit); } - shit.isInFront = front; shit.wasAdded = true; } } }); - Lua_helper.add_callback(lua, "removeLuaSprite", function(tag:String) { - resetSpriteTag(tag); + Lua_helper.add_callback(lua, "setGraphicSize", function(obj:String, x:Int, y:Int = 0) { + if(lePlayState.modchartSprites.exists(obj)) { + var shit:ModchartSprite = lePlayState.modchartSprites.get(obj); + shit.setGraphicSize(x, y); + shit.updateHitbox(); + return; + } + + var poop:FlxSprite = Reflect.getProperty(lePlayState, obj); + if(poop != null) { + poop.setGraphicSize(x, y); + poop.updateHitbox(); + return; + } + luaTrace('Couldnt find object: ' + obj); + }); + Lua_helper.add_callback(lua, "scaleObject", function(obj:String, x:Float, y:Float) { + if(lePlayState.modchartSprites.exists(obj)) { + var shit:ModchartSprite = lePlayState.modchartSprites.get(obj); + shit.scale.set(x, y); + shit.updateHitbox(); + return; + } + + var poop:FlxSprite = Reflect.getProperty(lePlayState, obj); + if(poop != null) { + poop.scale.set(x, y); + poop.updateHitbox(); + return; + } + luaTrace('Couldnt find object: ' + obj); + }); + Lua_helper.add_callback(lua, "updateHitbox", function(obj:String) { + if(lePlayState.modchartSprites.exists(obj)) { + var shit:ModchartSprite = lePlayState.modchartSprites.get(obj); + shit.updateHitbox(); + return; + } + + var poop:FlxSprite = Reflect.getProperty(lePlayState, obj); + if(poop != null) { + poop.updateHitbox(); + return; + } + luaTrace('Couldnt find object: ' + obj); + }); + Lua_helper.add_callback(lua, "removeLuaSprite", function(tag:String, destroy:Bool = true) { + if(!lePlayState.modchartSprites.exists(tag)) { + return; + } + + var pee:ModchartSprite = lePlayState.modchartSprites.get(tag); + if(destroy) { + pee.kill(); + } + + if(pee.wasAdded) { + lePlayState.remove(pee, true); + pee.wasAdded = false; + } + + if(destroy) { + pee.destroy(); + lePlayState.modchartSprites.remove(tag); + } + }); + + Lua_helper.add_callback(lua, "setObjectCamera", function(obj:String, camera:String = '') { + if(lePlayState.modchartSprites.exists(obj)) { + lePlayState.modchartSprites.get(obj).cameras = [cameraFromString(camera)]; + return true; + } + + var object:FlxObject = Reflect.getProperty(lePlayState, obj); + if(object != null) { + object.cameras = [cameraFromString(camera)]; + return true; + } + luaTrace("Object " + obj + " doesn't exist!"); + return false; + }); + Lua_helper.add_callback(lua, "setBlendMode", function(obj:String, blend:String = '') { + if(lePlayState.modchartSprites.exists(obj)) { + lePlayState.modchartSprites.get(obj).blend = blendModeFromString(blend); + return true; + } + + var spr:FlxSprite = Reflect.getProperty(lePlayState, obj); + if(spr != null) { + spr.blend = blendModeFromString(blend); + return true; + } + luaTrace("Object " + obj + " doesn't exist!"); + return false; + }); + Lua_helper.add_callback(lua, "startDialogue", function(dialogueFile:String, music:String = null) { + var path:String = Paths.modsJson(Paths.formatToSongPath(PlayState.SONG.song) + '/' + dialogueFile); + luaTrace('Trying to load dialogue: ' + path); + + if(FileSystem.exists(path)) { + var shit:DialogueFile = DialogueBoxPsych.parseDialogue(path); + if(shit.dialogue.length > 0) { + lePlayState.startDialogue(shit, music); + luaTrace('Successfully loaded dialogue'); + } else { + luaTrace('Your dialogue file is badly formatted!'); + } + } else { + luaTrace('Dialogue file not found'); + if(lePlayState.endingSong) { + lePlayState.endSong(); + } else { + lePlayState.startCountdown(); + } + } + }); + Lua_helper.add_callback(lua, "startVideo", function(videoFile:String) { + #if VIDEOS_ALLOWED + if(FileSystem.exists(Paths.modsVideo(videoFile))) { + lePlayState.startVideo(videoFile); + } else { + luaTrace('Video file not found: ' + videoFile); + } + #else + if(lePlayState.endingSong) { + lePlayState.endSong(); + } else { + lePlayState.startCountdown(); + } + #end + }); + + Lua_helper.add_callback(lua, "playMusic", function(sound:String, volume:Float = 1, loop:Bool = false) { + FlxG.sound.playMusic(Paths.music(sound), volume, loop); + }); + Lua_helper.add_callback(lua, "playSound", function(sound:String, volume:Float = 1, ?tag:String = null) { + if(tag != null && tag.length > 0) { + tag = tag.replace('.', ''); + if(lePlayState.modchartSounds.exists(tag)) { + lePlayState.modchartSounds.get(tag).stop(); + } + lePlayState.modchartSounds.set(tag, FlxG.sound.play(Paths.sound(sound), volume, false, function() { + lePlayState.modchartSounds.remove(tag); + lePlayState.callOnLuas('onSoundFinished', [tag]); + })); + return; + } + FlxG.sound.play(Paths.sound(sound), volume); + }); + Lua_helper.add_callback(lua, "stopSound", function(tag:String) { + if(tag != null && tag.length > 1 && lePlayState.modchartSounds.exists(tag)) { + lePlayState.modchartSounds.get(tag).stop(); + lePlayState.modchartSounds.remove(tag); + } + }); + Lua_helper.add_callback(lua, "pauseSound", function(tag:String) { + if(tag != null && tag.length > 1 && lePlayState.modchartSounds.exists(tag)) { + lePlayState.modchartSounds.get(tag).pause(); + } + }); + Lua_helper.add_callback(lua, "resumeSound", function(tag:String) { + if(tag != null && tag.length > 1 && lePlayState.modchartSounds.exists(tag)) { + lePlayState.modchartSounds.get(tag).play(); + } + }); + Lua_helper.add_callback(lua, "soundFadeIn", function(tag:String, duration:Float, fromValue:Float = 0, toValue:Float = 1) { + if(tag == null || tag.length < 1) { + FlxG.sound.music.fadeIn(duration, fromValue, toValue); + } else if(lePlayState.modchartSounds.exists(tag)) { + lePlayState.modchartSounds.get(tag).fadeIn(duration, fromValue, toValue); + } + + }); + Lua_helper.add_callback(lua, "soundFadeOut", function(tag:String, duration:Float, toValue:Float = 0) { + if(tag == null || tag.length < 1) { + FlxG.sound.music.fadeOut(duration, toValue); + } else if(lePlayState.modchartSounds.exists(tag)) { + lePlayState.modchartSounds.get(tag).fadeOut(duration, toValue); + } + }); + Lua_helper.add_callback(lua, "soundFadeCancel", function(tag:String) { + if(tag == null || tag.length < 1) { + if(FlxG.sound.music.fadeTween != null) { + FlxG.sound.music.fadeTween.cancel(); + } + } else if(lePlayState.modchartSounds.exists(tag)) { + var theSound:FlxSound = lePlayState.modchartSounds.get(tag); + if(theSound.fadeTween != null) { + theSound.fadeTween.cancel(); + lePlayState.modchartSounds.remove(tag); + } + } + }); + Lua_helper.add_callback(lua, "getSoundVolume", function(tag:String) { + if(tag == null || tag.length < 1) { + if(FlxG.sound.music != null) { + return FlxG.sound.music.volume; + } + } else if(lePlayState.modchartSounds.exists(tag)) { + return lePlayState.modchartSounds.get(tag).volume; + } + return 0; + }); + Lua_helper.add_callback(lua, "setSoundVolume", function(tag:String, value:Float) { + if(tag == null || tag.length < 1) { + if(FlxG.sound.music != null) { + FlxG.sound.music.volume = value; + } + } else if(lePlayState.modchartSounds.exists(tag)) { + lePlayState.modchartSounds.get(tag).volume = value; + } + }); + Lua_helper.add_callback(lua, "getSoundTime", function(tag:String) { + if(tag != null && tag.length > 0 && lePlayState.modchartSounds.exists(tag)) { + return lePlayState.modchartSounds.get(tag).time; + } + return 0; + }); + Lua_helper.add_callback(lua, "setSoundTime", function(tag:String, value:Float) { + if(tag != null && tag.length > 0 && lePlayState.modchartSounds.exists(tag)) { + var theSound:FlxSound = lePlayState.modchartSounds.get(tag); + if(theSound != null) { + var wasResumed:Bool = theSound.playing; + theSound.pause(); + theSound.time = value; + if(wasResumed) theSound.play(); + } + } + }); + + Lua_helper.add_callback(lua, "debugPrint", function(text1:Dynamic = '', text2:Dynamic = '', text3:Dynamic = '', text4:Dynamic = '', text5:Dynamic = '') { + if (text1 == null) text1 = ''; + if (text2 == null) text2 = ''; + if (text3 == null) text3 = ''; + if (text4 == null) text4 = ''; + if (text5 == null) text5 = ''; + luaTrace('' + text1 + text2 + text3 + text4 + text5, true, false); }); + Lua_helper.add_callback(lua, "close", function(printMessage:Bool) { + if(!gonnaClose) { + if(printMessage) { + luaTrace('Stopping lua script in 100ms: ' + scriptName); + } + new FlxTimer().start(0.1, function(tmr:FlxTimer) { + stop(); + }); + } + gonnaClose = true; + }); + + // DEPRECATED, DONT MESS WITH THESE SHITS, ITS JUST THERE FOR BACKWARD COMPATIBILITY + Lua_helper.add_callback(lua, "luaSpriteMakeGraphic", function(tag:String, width:Int, height:Int, color:String) { + luaTrace("luaSpriteMakeGraphic is deprecated! Use makeGraphic instead", false, true); + if(lePlayState.modchartSprites.exists(tag)) { + var colorNum:Int = Std.parseInt(color); + if(!color.startsWith('0x')) colorNum = Std.parseInt('0xff' + color); + + lePlayState.modchartSprites.get(tag).makeGraphic(width, height, colorNum); + } + }); + Lua_helper.add_callback(lua, "luaSpriteAddAnimationByPrefix", function(tag:String, name:String, prefix:String, framerate:Int = 24, loop:Bool = true) { + luaTrace("luaSpriteAddAnimationByPrefix is deprecated! Use addAnimationByPrefix instead", false, true); + if(lePlayState.modchartSprites.exists(tag)) { + var cock:ModchartSprite = lePlayState.modchartSprites.get(tag); + cock.animation.addByPrefix(name, prefix, framerate, loop); + if(cock.animation.curAnim == null) { + cock.animation.play(name, true); + } + } + }); + Lua_helper.add_callback(lua, "luaSpriteAddAnimationByIndices", function(tag:String, name:String, prefix:String, indices:String, framerate:Int = 24) { + luaTrace("luaSpriteAddAnimationByIndices is deprecated! Use addAnimationByIndices instead", false, true); + if(lePlayState.modchartSprites.exists(tag)) { + var strIndices:Array = indices.trim().split(','); + var die:Array = []; + for (i in 0...strIndices.length) { + die.push(Std.parseInt(strIndices[i])); + } + var pussy:ModchartSprite = lePlayState.modchartSprites.get(tag); + pussy.animation.addByIndices(name, prefix, die, '', framerate, false); + if(pussy.animation.curAnim == null) { + pussy.animation.play(name, true); + } + } + }); + Lua_helper.add_callback(lua, "luaSpritePlayAnimation", function(tag:String, name:String, forced:Bool = false) { + luaTrace("luaSpritePlayAnimation is deprecated! Use objectPlayAnimation instead", false, true); + if(lePlayState.modchartSprites.exists(tag)) { + lePlayState.modchartSprites.get(tag).animation.play(name, forced); + } + }); + Lua_helper.add_callback(lua, "setLuaSpriteCamera", function(tag:String, camera:String = '') { + luaTrace("setLuaSpriteCamera is deprecated! Use setObjectCamera instead", false, true); + if(lePlayState.modchartSprites.exists(tag)) { + lePlayState.modchartSprites.get(tag).cameras = [cameraFromString(camera)]; + return true; + } + luaTrace("Lua sprite with tag: " + tag + " doesn't exist!"); + return false; + }); + Lua_helper.add_callback(lua, "setLuaSpriteScrollFactor", function(tag:String, scrollX:Float, scrollY:Float) { + luaTrace("setLuaSpriteScrollFactor is deprecated! Use setScrollFactor instead", false, true); + if(lePlayState.modchartSprites.exists(tag)) { + lePlayState.modchartSprites.get(tag).scrollFactor.set(scrollX, scrollY); + } + }); + Lua_helper.add_callback(lua, "scaleLuaSprite", function(tag:String, x:Float, y:Float) { + luaTrace("scaleLuaSprite is deprecated! Use scaleObject instead", false, true); + if(lePlayState.modchartSprites.exists(tag)) { + var shit:ModchartSprite = lePlayState.modchartSprites.get(tag); + shit.scale.set(x, y); + shit.updateHitbox(); + } + }); Lua_helper.add_callback(lua, "getPropertyLuaSprite", function(tag:String, variable:String) { - if(sprites.exists(tag)) { + luaTrace("getPropertyLuaSprite is deprecated! Use getProperty instead", false, true); + if(lePlayState.modchartSprites.exists(tag)) { var killMe:Array = variable.split('.'); if(killMe.length > 1) { - var coverMeInPiss:Dynamic = Reflect.getProperty(sprites.get(tag), killMe[0]); + var coverMeInPiss:Dynamic = Reflect.getProperty(lePlayState.modchartSprites.get(tag), killMe[0]); for (i in 1...killMe.length-1) { coverMeInPiss = Reflect.getProperty(coverMeInPiss, killMe[i]); } return Reflect.getProperty(coverMeInPiss, killMe[killMe.length-1]); } - return Reflect.getProperty(sprites.get(tag), variable); + return Reflect.getProperty(lePlayState.modchartSprites.get(tag), variable); } return null; }); Lua_helper.add_callback(lua, "setPropertyLuaSprite", function(tag:String, variable:String, value:Dynamic) { - if(sprites.exists(tag)) { + luaTrace("setPropertyLuaSprite is deprecated! Use setProperty instead", false, true); + if(lePlayState.modchartSprites.exists(tag)) { var killMe:Array = variable.split('.'); if(killMe.length > 1) { - var coverMeInPiss:Dynamic = Reflect.getProperty(sprites.get(tag), killMe[0]); + var coverMeInPiss:Dynamic = Reflect.getProperty(lePlayState.modchartSprites.get(tag), killMe[0]); for (i in 1...killMe.length-1) { coverMeInPiss = Reflect.getProperty(coverMeInPiss, killMe[i]); } return Reflect.setProperty(coverMeInPiss, killMe[killMe.length-1], value); } - return Reflect.setProperty(sprites.get(tag), variable, value); + return Reflect.setProperty(lePlayState.modchartSprites.get(tag), variable, value); } + luaTrace("Lua sprite with tag: " + tag + " doesn't exist!"); }); - Lua_helper.add_callback(lua, "startDialogue", function(dialogueFile:String, ?song:String = null) { - if(FileSystem.exists(Paths.mods('data/' + dialogueFile + '.txt'))) { - var shit:Array = File.getContent(Paths.mods('data/' + dialogueFile + '.txt')).trim().split('\n'); - for (i in 0...shit.length) { - shit[i] = shit[i].trim(); - } - lePlayState.dialogueIntro(shit, song); - } + Lua_helper.add_callback(lua, "musicFadeIn", function(duration:Float, fromValue:Float = 0, toValue:Float = 1) { + FlxG.sound.music.fadeIn(duration, fromValue, toValue); + luaTrace('musicFadeIn is deprecated! Use soundFadeIn instead.', false, true); + + }); + Lua_helper.add_callback(lua, "musicFadeOut", function(duration:Float, toValue:Float = 0) { + FlxG.sound.music.fadeOut(duration, toValue); + luaTrace('musicFadeOut is deprecated! Use soundFadeOut instead.', false, true); }); call('onCreate', []); #end } function resetSpriteTag(tag:String) { - if(!sprites.exists(tag)) { + if(!lePlayState.modchartSprites.exists(tag)) { return; } - var pee:LuaSprite = sprites.get(tag); + var pee:ModchartSprite = lePlayState.modchartSprites.get(tag); pee.kill(); if(pee.wasAdded) { - if(pee.isInFront) { - lePlayState.foregroundGroup.remove(pee, true); - } else { - lePlayState.backgroundGroup.remove(pee, true); - } + lePlayState.remove(pee, true); } pee.destroy(); - sprites.remove(tag); + lePlayState.modchartSprites.remove(tag); } function cancelTween(tag:String) { - if(tweens.exists(tag)) { - tweens.get(tag).cancel(); - tweens.get(tag).destroy(); - tweens.remove(tag); + if(lePlayState.modchartTweens.exists(tag)) { + lePlayState.modchartTweens.get(tag).cancel(); + lePlayState.modchartTweens.get(tag).destroy(); + lePlayState.modchartTweens.remove(tag); } } @@ -743,8 +1167,8 @@ class FunkinLua { cancelTween(tag); var variables:Array = vars.replace(' ', '').split('.'); var sexyProp:Dynamic = Reflect.getProperty(lePlayState, variables[0]); - if(sexyProp == null && sprites.exists(variables[0])) { - sexyProp = sprites.get(variables[0]); + if(sexyProp == null && lePlayState.modchartSprites.exists(variables[0])) { + sexyProp = lePlayState.modchartSprites.get(variables[0]); } for (i in 1...variables.length) { @@ -754,16 +1178,17 @@ class FunkinLua { } function cancelTimer(tag:String) { - if(timers.exists(tag)) { - timers.get(tag).cancel(); - timers.get(tag).destroy(); - timers.remove(tag); + if(lePlayState.modchartTimers.exists(tag)) { + var theTimer:FlxTimer = lePlayState.modchartTimers.get(tag); + theTimer.cancel(); + theTimer.destroy(); + lePlayState.modchartTimers.remove(tag); } } //Better optimized than using some getProperty shit or idk function getFlxEaseByString(?ease:String = '') { - switch(ease.toLowerCase()) { + switch(ease.toLowerCase().trim()) { case 'backin': return FlxEase.backIn; case 'backinout': return FlxEase.backInOut; case 'backout': return FlxEase.backOut; @@ -803,6 +1228,46 @@ class FunkinLua { } return FlxEase.linear; } + + function blendModeFromString(blend:String):BlendMode { + switch(blend.toLowerCase().trim()) { + case 'add': return ADD; + case 'alpha': return ALPHA; + case 'darken': return DARKEN; + case 'difference': return DIFFERENCE; + case 'erase': return ERASE; + case 'hardlight': return HARDLIGHT; + case 'invert': return INVERT; + case 'layer': return LAYER; + case 'lighten': return LIGHTEN; + case 'multiply': return MULTIPLY; + case 'overlay': return OVERLAY; + case 'screen': return SCREEN; + case 'shader': return SHADER; + case 'subtract': return SUBTRACT; + } + return NORMAL; + } + + function cameraFromString(cam:String):FlxCamera { + switch(cam.toLowerCase()) { + case 'camhud' | 'hud': return lePlayState.camHUD; + case 'camother' | 'other': return lePlayState.camOther; + } + return lePlayState.camGame; + } + + public function luaTrace(text:String, ignoreCheck:Bool = false, deprecated:Bool = false) { + #if LUA_ALLOWED + if(ignoreCheck || getBool('luaDebugMode')) { + if(deprecated && !getBool('luaDeprecatedWarnings')) { + return; + } + lePlayState.addTextToDebug(text); + trace(text); + } + #end + } public function call(event:String, args:Array):Dynamic { #if LUA_ALLOWED @@ -823,12 +1288,13 @@ class FunkinLua { Lua.pop(lua, 1);*/ if(Lua.type(lua, -1) == Lua.LUA_TSTRING) { var error:String = Lua.tostring(lua, -1); + Lua.pop(lua, 1); if(error == 'attempt to call a nil value') { //Makes it ignore warnings and not break stuff if you didn't put the functions on your lua file return Function_Continue; } } + var conv:Dynamic = Convert.fromLua(lua, result); - //Lua.pop(lua, 1); return conv; } #end @@ -856,36 +1322,65 @@ class FunkinLua { #end } - public function setTweensActive(value:Bool) { - #if LUA_ALLOWED - if(lua == null) { - return; - } + #if LUA_ALLOWED + public function getBool(variable:String) { + var result:String = null; + Lua.getglobal(lua, variable); + result = Convert.fromLua(lua, -1); + Lua.pop(lua, 1); - for (tween in tweens) { - tween.active = value; + if(result == null) { + return false; } - #end + + // YES! FINALLY IT WORKS + //trace('variable: ' + variable + ', ' + result); + return (result == 'true'); } + #end public function stop() { #if LUA_ALLOWED - sprites.clear(); - accessedProps.clear(); - tweens.clear(); - if(lua == null) { return; } + if(accessedProps != null) { + accessedProps.clear(); + } + lePlayState.removeLua(this); Lua.close(lua); lua = null; #end } } -class LuaSprite extends FlxSprite +class ModchartSprite extends FlxSprite { public var wasAdded:Bool = false; - public var isInFront:Bool = false; + //public var isInFront:Bool = false; +} + +class DebugLuaText extends FlxText +{ + private var disableTime:Float = 6; + public var parentGroup:FlxTypedGroup; + public function new(text:String, parentGroup:FlxTypedGroup) { + this.parentGroup = parentGroup; + super(10, 10, 0, text, 16); + setFormat(Paths.font("vcr.ttf"), 20, FlxColor.WHITE, LEFT, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK); + scrollFactor.set(); + borderSize = 1; + } + + override function update(elapsed:Float) { + super.update(elapsed); + disableTime -= elapsed; + if(disableTime <= 0) { + kill(); + parentGroup.remove(this); + destroy(); + } + else if(disableTime < 1) alpha = disableTime; + } } \ No newline at end of file diff --git a/source/GameOverSubstate.hx b/source/GameOverSubstate.hx index 33e61f6ee..218ec1164 100644 --- a/source/GameOverSubstate.hx +++ b/source/GameOverSubstate.hx @@ -19,28 +19,34 @@ class GameOverSubstate extends MusicBeatSubstate var stageSuffix:String = ""; - public function new(x:Float, y:Float, camX:Float, camY:Float) - { - var daBf:String = ''; - switch (PlayState.curStage) - { - case 'school' | 'schoolEvil': - stageSuffix = '-pixel'; - daBf = 'bf-pixel-dead'; - default: - daBf = 'bf'; - } + var lePlayState:PlayState; + + public static var characterName:String = 'bf'; + public static var deathSoundName:String = 'fnf_loss_sfx'; + public static var loopSoundName:String = 'gameOver'; + public static var endSoundName:String = 'gameOverEnd'; + + public static function resetVariables() { + characterName = 'bf'; + deathSoundName = 'fnf_loss_sfx'; + loopSoundName = 'gameOver'; + endSoundName = 'gameOverEnd'; + } + public function new(x:Float, y:Float, camX:Float, camY:Float, state:PlayState) + { + lePlayState = state; + state.setOnLuas('inGameOver', true); super(); Conductor.songPosition = 0; - bf = new Boyfriend(x, y, daBf); + bf = new Boyfriend(x, y, characterName); add(bf); camFollow = new FlxPoint(bf.getGraphicMidpoint().x, bf.getGraphicMidpoint().y); - FlxG.sound.play(Paths.sound('fnf_loss_sfx' + stageSuffix)); + FlxG.sound.play(Paths.sound(deathSoundName)); Conductor.changeBPM(100); // FlxG.camera.followLerp = 1; // FlxG.camera.focusOn(FlxPoint.get(FlxG.width / 2, FlxG.height / 2)); @@ -62,6 +68,7 @@ class GameOverSubstate extends MusicBeatSubstate { super.update(elapsed); + lePlayState.callOnLuas('onUpdate', [elapsed]); if(updateCamera) { var lerpVal:Float = CoolUtil.boundTo(elapsed * 0.6, 0, 1); camFollowPos.setPosition(FlxMath.lerp(camFollowPos.x, camFollow.x, lerpVal), FlxMath.lerp(camFollowPos.y, camFollow.y, lerpVal)); @@ -84,6 +91,7 @@ class GameOverSubstate extends MusicBeatSubstate MusicBeatState.switchState(new FreeplayState()); FlxG.sound.playMusic(Paths.music('freakyMenu')); + lePlayState.callOnLuas('onGameOverConfirm', [false]); } if (bf.animation.curAnim.name == 'firstDeath') @@ -105,6 +113,7 @@ class GameOverSubstate extends MusicBeatSubstate { Conductor.songPosition = FlxG.sound.music.time; } + lePlayState.callOnLuas('onUpdatePost', [elapsed]); } override function beatHit() @@ -118,7 +127,7 @@ class GameOverSubstate extends MusicBeatSubstate function coolStartDeath(?volume:Float = 1):Void { - FlxG.sound.playMusic(Paths.music('gameOver' + stageSuffix), volume); + FlxG.sound.playMusic(Paths.music(loopSoundName), volume); } function endBullshit():Void @@ -128,14 +137,15 @@ class GameOverSubstate extends MusicBeatSubstate isEnding = true; bf.playAnim('deathConfirm', true); FlxG.sound.music.stop(); - FlxG.sound.play(Paths.music('gameOverEnd' + stageSuffix)); + FlxG.sound.play(Paths.music(endSoundName)); new FlxTimer().start(0.7, function(tmr:FlxTimer) { FlxG.camera.fade(FlxColor.BLACK, 2, false, function() { - LoadingState.loadAndSwitchState(new PlayState()); + MusicBeatState.resetState(); }); }); + lePlayState.callOnLuas('onGameOverConfirm', [true]); } } } diff --git a/source/GitarooPause.hx b/source/GitarooPause.hx index a6e32f6e0..94a1856e3 100644 --- a/source/GitarooPause.hx +++ b/source/GitarooPause.hx @@ -47,7 +47,7 @@ class GitarooPause extends MusicBeatState changeThing(); - addVirtualPad(LEFT_RIGHT, A_B); + addVirtualPad(FULL, A_B); super.create(); } diff --git a/source/HealthIcon.hx b/source/HealthIcon.hx index b9bdfb0e0..f1db7b961 100644 --- a/source/HealthIcon.hx +++ b/source/HealthIcon.hx @@ -12,9 +12,6 @@ class HealthIcon extends FlxSprite private var isPlayer:Bool = false; private var char:String = ''; - // The following icons have antialiasing forced to be disabled - var noAntialiasing:Array = ['bf-pixel', 'senpai', 'spirit']; - public function new(char:String = 'bf', isPlayer:Bool = false) { super(); @@ -39,7 +36,8 @@ class HealthIcon extends FlxSprite public function changeIcon(char:String) { if(this.char != char) { - var name:String = 'icons/icon-' + char; + var name:String = 'icons/' + char; + if(!Paths.fileExists('images/' + name + '.png', IMAGE)) name = 'icons/icon-' + char; //Older versions of psych engine's support if(!Paths.fileExists('images/' + name + '.png', IMAGE)) name = 'icons/icon-face'; //Prevents crash from missing icon var file:Dynamic = Paths.image(name); @@ -49,11 +47,8 @@ class HealthIcon extends FlxSprite this.char = char; antialiasing = ClientPrefs.globalAntialiasing; - for (i in 0...noAntialiasing.length) { - if(char == noAntialiasing[i]) { - antialiasing = false; - break; - } + if(char.endsWith('-pixel')) { + antialiasing = false; } } } diff --git a/source/Highscore.hx b/source/Highscore.hx index 16e6a8049..5f7be9a90 100644 --- a/source/Highscore.hx +++ b/source/Highscore.hx @@ -2,12 +2,16 @@ package; import flixel.FlxG; +using StringTools; + class Highscore { #if (haxe >= "4.0.0") + public static var weekScores:Map = new Map(); public static var songScores:Map = new Map(); public static var songRating:Map = new Map(); #else + public static var weekScores:Map = new Map(); public static var songScores:Map = new Map(); public static var songRating:Map = new Map(); #end @@ -16,14 +20,14 @@ class Highscore public static function resetSong(song:String, diff:Int = 0):Void { var daSong:String = formatSong(song, diff); - setScore(daSong, 0); setRating(daSong, 0); } - public static function resetWeek(week:Int, diff:Int = 0):Void + public static function resetWeek(week:String, diff:Int = 0):Void { - setScore(formatSong('week' + week, diff), 0); + var daWeek:String = formatSong(week, diff); + setWeekScore(daWeek, 0); } public static function saveScore(song:String, score:Int = 0, ?diff:Int = 0, ?rating:Float = -1):Void @@ -42,17 +46,17 @@ class Highscore } } - public static function saveWeekScore(week:Int = 1, score:Int = 0, ?diff:Int = 0):Void + public static function saveWeekScore(week:String, score:Int = 0, ?diff:Int = 0):Void { - var daWeek:String = formatSong('week' + week, diff); + var daWeek:String = formatSong(week, diff); - if (songScores.exists(daWeek)) + if (weekScores.exists(daWeek)) { - if (songScores.get(daWeek) < score) - setScore(daWeek, score); + if (weekScores.get(daWeek) < score) + setWeekScore(daWeek, score); } else - setScore(daWeek, score); + setWeekScore(daWeek, score); } /** @@ -65,6 +69,13 @@ class Highscore FlxG.save.data.songScores = songScores; FlxG.save.flush(); } + static function setWeekScore(week:String, score:Int):Void + { + // Reminder that I don't need to format this song, it should come formatted! + weekScores.set(week, score); + FlxG.save.data.weekScores = weekScores; + FlxG.save.flush(); + } static function setRating(song:String, rating:Float):Void { @@ -76,35 +87,42 @@ class Highscore public static function formatSong(song:String, diff:Int):String { - return song + CoolUtil.difficultyStuff[diff][1]; + return Paths.formatToSongPath(song) + CoolUtil.difficultyStuff[diff][1]; } public static function getScore(song:String, diff:Int):Int { - if (!songScores.exists(formatSong(song, diff))) - setScore(formatSong(song, diff), 0); + var daSong:String = formatSong(song, diff); + if (!songScores.exists(daSong)) + setScore(daSong, 0); - return songScores.get(formatSong(song, diff)); + return songScores.get(daSong); } public static function getRating(song:String, diff:Int):Float { - if (!songRating.exists(formatSong(song, diff))) - setRating(formatSong(song, diff), 0); + var daSong:String = formatSong(song, diff); + if (!songRating.exists(daSong)) + setRating(daSong, 0); - return songRating.get(formatSong(song, diff)); + return songRating.get(daSong); } - public static function getWeekScore(week:Int, diff:Int):Int + public static function getWeekScore(week:String, diff:Int):Int { - if (!songScores.exists(formatSong('week' + week, diff))) - setScore(formatSong('week' + week, diff), 0); + var daWeek:String = formatSong(week, diff); + if (!weekScores.exists(daWeek)) + setWeekScore(daWeek, 0); - return songScores.get(formatSong('week' + week, diff)); + return weekScores.get(daWeek); } public static function load():Void { + if (FlxG.save.data.weekScores != null) + { + weekScores = FlxG.save.data.weekScores; + } if (FlxG.save.data.songScores != null) { songScores = FlxG.save.data.songScores; diff --git a/source/LoadingState.hx b/source/LoadingState.hx index a1cde21d8..7440ef481 100644 --- a/source/LoadingState.hx +++ b/source/LoadingState.hx @@ -28,14 +28,16 @@ class LoadingState extends MusicBeatState var target:FlxState; var stopMusic = false; + var directory:String; var callbacks:MultiCallback; var targetShit:Float = 0; - function new(target:FlxState, stopMusic:Bool) + function new(target:FlxState, stopMusic:Bool, directory:String) { super(); this.target = target; this.stopMusic = stopMusic; + this.directory = directory; } var funkay:FlxSprite; @@ -43,18 +45,19 @@ class LoadingState extends MusicBeatState override function create() { var bg:FlxSprite = new FlxSprite(0, 0).makeGraphic(FlxG.width, FlxG.height, 0xffcaff4d); - add(bg); funkay = new FlxSprite(0, 0).loadGraphic(Paths.getPath('images/funkay.png', IMAGE)); funkay.setGraphicSize(0, FlxG.height); funkay.updateHitbox(); funkay.antialiasing = ClientPrefs.globalAntialiasing; - add(funkay); funkay.scrollFactor.set(); funkay.screenCenter(); loadBar = new FlxSprite(0, FlxG.height - 20).makeGraphic(FlxG.width, 10, 0xffff16d2); loadBar.screenCenter(X); loadBar.antialiasing = ClientPrefs.globalAntialiasing; + + add(bg); + add(funkay); add(loadBar); initSongsManifest().onComplete @@ -69,9 +72,9 @@ class LoadingState extends MusicBeatState checkLoadSong(getVocalPath()); } checkLibrary("shared"); - - var directory:String = WeekData.getWeekDirectory(); - checkLibrary(directory); + if(directory != null && directory.length > 0 && directory != 'shared') { + checkLibrary(directory); + } var fadeTime = 0.5; FlxG.camera.fade(FlxG.camera.bgColor, fadeTime, true); @@ -95,18 +98,16 @@ class LoadingState extends MusicBeatState } } - function checkLibrary(library:String, ?doCheck:Bool = false) { - if(!doCheck || !ClientPrefs.lowQuality) { - trace(Assets.hasLibrary(library)); - if (Assets.getLibrary(library) == null) - { - @:privateAccess - if (!LimeAssets.libraryPaths.exists(library)) - throw "Missing library: " + library; + function checkLibrary(library:String) { + trace(Assets.hasLibrary(library)); + if (Assets.getLibrary(library) == null) + { + @:privateAccess + if (!LimeAssets.libraryPaths.exists(library)) + throw "Missing library: " + library; - var callback = callbacks.add("library:" + library); - Assets.loadLibrary(library).onComplete(function (_) { callback(); }); - } + var callback = callbacks.add("library:" + library); + Assets.loadLibrary(library).onComplete(function (_) { callback(); }); } } @@ -152,19 +153,23 @@ class LoadingState extends MusicBeatState static function getNextState(target:FlxState, stopMusic = false):FlxState { - Paths.setCurrentLevel(WeekData.getWeekDirectory()); + var directory:String = 'shared'; + var weekDir:String = StageData.forceNextDirectory; + StageData.forceNextDirectory = null; + + if(weekDir != null && weekDir.length > 0 && weekDir != '') directory = weekDir; + + Paths.setCurrentLevel(directory); + trace('Setting asset folder to ' + directory); #if NO_PRELOAD_ALL - var directory:String = WeekData.getWeekDirectory(); var loaded:Bool = false; if (PlayState.SONG != null) { - loaded = isSoundLoaded(getSongPath()) - && (!PlayState.SONG.needsVoices || isSoundLoaded(getVocalPath())) - && isLibraryLoaded("shared") && isLibraryLoaded(directory); + loaded = isSoundLoaded(getSongPath()) && (!PlayState.SONG.needsVoices || isSoundLoaded(getVocalPath())) && isLibraryLoaded("shared") && isLibraryLoaded(directory); } if (!loaded) - return new LoadingState(target, stopMusic); + return new LoadingState(target, stopMusic, directory); #end if (stopMusic && FlxG.sound.music != null) FlxG.sound.music.stop(); diff --git a/source/Main.hx b/source/Main.hx index 1febeefcb..b6f2e1a18 100644 --- a/source/Main.hx +++ b/source/Main.hx @@ -69,13 +69,17 @@ class Main extends Sprite initialState = TitleState; #end + Paths.getModFolders(); + ClientPrefs.startControls(); addChild(new FlxGame(gameWidth, gameHeight, initialState, zoom, framerate, framerate, skipSplash, startFullscreen)); + // #if !mobile fpsVar = new FPS(10, 3, 0xFFFFFF); addChild(fpsVar); if(fpsVar != null) { fpsVar.visible = ClientPrefs.showFPS; } + // #end #if html5 FlxG.autoPause = false; diff --git a/source/MainMenuState.hx b/source/MainMenuState.hx index dba5ba546..2ef842980 100644 --- a/source/MainMenuState.hx +++ b/source/MainMenuState.hx @@ -18,24 +18,32 @@ import flixel.tweens.FlxTween; import flixel.util.FlxColor; import lime.app.Application; import Achievements; +import editors.MasterEditorMenu; +import flixel.ui.FlxButton; + +//import ui.FlxVirtualPad; // lol using StringTools; class MainMenuState extends MusicBeatState { - public static var psychEngineVersion:String = '0.3.2'; //This is also used for Discord RPC + public static var psychEngineVersion:String = '0.4.2'; //This is also used for Discord RPC public static var curSelected:Int = 0; var menuItems:FlxTypedGroup; private var camGame:FlxCamera; private var camAchievement:FlxCamera; + + var key_space:FlxButton; - var optionShit:Array = ['story_mode', 'freeplay', #if ACHIEVEMENTS_ALLOWED 'awards', #end 'credits', #if !switch 'donate', #end 'options']; + var optionShit:Array = ['story_mode', 'freeplay', #if ACHIEVEMENTS_ALLOWED 'awards', #end 'credits', #if !switch 'donate', #end 'options'/*, 'lol'*/]; var magenta:FlxSprite; var camFollow:FlxObject; var camFollowPos:FlxObject; + //var _pad:FlxVirtualPad; + override function create() { #if desktop @@ -121,25 +129,36 @@ class MainMenuState extends MusicBeatState #if ACHIEVEMENTS_ALLOWED Achievements.loadAchievements(); var leDate = Date.now(); - if (!Achievements.achievementsUnlocked[achievementID][1] && leDate.getDay() == 5 && leDate.getHours() >= 18) { //It's a friday night. WEEEEEEEEEEEEEEEEEE - Achievements.achievementsUnlocked[achievementID][1] = true; - giveAchievement(); - ClientPrefs.saveSettings(); + if (leDate.getDay() == 5 && leDate.getHours() >= 18) { + var achieveID:Int = Achievements.getAchievementIndex('friday_night_play'); + if(!Achievements.isAchievementUnlocked(Achievements.achievementsStuff[achieveID][2])) { //It's a friday night. WEEEEEEEEEEEEEEEEEE + Achievements.achievementsMap.set(Achievements.achievementsStuff[achieveID][2], true); + giveAchievement(); + ClientPrefs.saveSettings(); + } } #end - addVirtualPad(FULL, A_B); + // _pad = new FlxVirtualPad(UP_DOWN, A_B_C); + // _pad.alpha = 0.75; + // this.add(_pad); + + key_space = new FlxButton(60, 60, ""); + key_space.loadGraphic(Paths.image("key_space")); //"assets/images/key_space.png" + key_space.alpha = 0.75; + add(key_space); + + addVirtualPad(FULL, A_B); super.create(); } #if ACHIEVEMENTS_ALLOWED // Unlocks "Freaky on a Friday Night" achievement - var achievementID:Int = 0; function giveAchievement() { - add(new AchievementObject(achievementID, camAchievement)); + add(new AchievementObject('friday_night_play', camAchievement)); FlxG.sound.play(Paths.sound('confirmMenu'), 0.7); - trace('Giving achievement ' + achievementID); + trace('Giving achievement "friday_night_play"'); } #end @@ -157,25 +176,26 @@ class MainMenuState extends MusicBeatState if (!selectedSomethin) { - if (controls.UI_UP_P) + if (controls.UI_UP_P/* || _pad.buttonUp.justPressed*/) { FlxG.sound.play(Paths.sound('scrollMenu')); changeItem(-1); } - if (controls.UI_DOWN_P) + if (controls.UI_DOWN_P/* || _pad.buttonDown.justPressed*/) { FlxG.sound.play(Paths.sound('scrollMenu')); changeItem(1); } - if (controls.BACK) + if (controls.BACK/* || _pad.buttonB.justPressed*/) { + selectedSomethin = true; FlxG.sound.play(Paths.sound('cancelMenu')); MusicBeatState.switchState(new TitleState()); } - if (controls.ACCEPT) + if (controls.ACCEPT/* || _pad.buttonA.justPressed*/) { if (optionShit[curSelected] == 'donate') { @@ -218,12 +238,21 @@ class MainMenuState extends MusicBeatState MusicBeatState.switchState(new CreditsState()); case 'options': MusicBeatState.switchState(new OptionsState()); + /*case 'lol': + MusicBeatState.switchState(new MasterEditorMenu());*/ // for test } }); } }); } } + //#if mobile + else if (FlxG.keys.justPressed.SEVEN || key_space.justPressed) + { + selectedSomethin = true; + MusicBeatState.switchState(new MasterEditorMenu()); + } + //#end } super.update(elapsed); diff --git a/source/MenuCharacter.hx b/source/MenuCharacter.hx index 1f0c2b034..16919d083 100644 --- a/source/MenuCharacter.hx +++ b/source/MenuCharacter.hx @@ -2,10 +2,26 @@ package; import flixel.FlxSprite; import flixel.graphics.frames.FlxAtlasFrames; +#if MODS_ALLOWED +import sys.io.File; +import sys.FileSystem; +#end +import openfl.utils.Assets; +import haxe.Json; +import haxe.format.JsonParser; + +typedef MenuCharacterFile = { + var image:String; + var scale:Float; + var position:Array; + var idle_anim:String; + var confirm_anim:String; +} class MenuCharacter extends FlxSprite { public var character:String; + private static var DEFAULT_CHARACTER:String = 'bf'; public function new(x:Float, character:String = 'bf') { @@ -15,69 +31,55 @@ class MenuCharacter extends FlxSprite } public function changeCharacter(?character:String = 'bf') { + if(character == null) character = ''; if(character == this.character) return; - + this.character = character; antialiasing = ClientPrefs.globalAntialiasing; + visible = true; - switch(character) { - case 'bf': - frames = Paths.getSparrowAtlas('menucharacters/Menu_BF'); - animation.addByPrefix('idle', "M BF Idle", 24); - animation.addByPrefix('confirm', 'M bf HEY', 24, false); - - case 'gf': - frames = Paths.getSparrowAtlas('menucharacters/Menu_GF'); - animation.addByPrefix('idle', "M GF Idle", 24); - - case 'dad': - frames = Paths.getSparrowAtlas('menucharacters/Menu_Dad'); - animation.addByPrefix('idle', "M Dad Idle", 24); - - case 'spooky': - frames = Paths.getSparrowAtlas('menucharacters/Menu_Spooky_Kids'); - animation.addByPrefix('idle', "M Spooky Kids Idle", 24); - - case 'pico': - frames = Paths.getSparrowAtlas('menucharacters/Menu_Pico'); - animation.addByPrefix('idle', "M Pico Idle", 24); - - case 'mom': - frames = Paths.getSparrowAtlas('menucharacters/Menu_Mom'); - animation.addByPrefix('idle', "M Mom Idle", 24); - - case 'parents-christmas': - frames = Paths.getSparrowAtlas('menucharacters/Menu_Parents'); - animation.addByPrefix('idle', "M Parents Idle", 24); - - case 'senpai': - frames = Paths.getSparrowAtlas('menucharacters/Menu_Senpai'); - animation.addByPrefix('idle', "M Senpai Idle", 24); - } - animation.play('idle'); + var dontPlayAnim:Bool = false; + scale.set(1, 1); updateHitbox(); switch(character) { - case 'bf': - offset.set(15, -40); - - case 'gf': - offset.set(0, -25); - - case 'spooky': - offset.set(0, -80); - - case 'pico': - offset.set(0, -120); - - case 'mom': - offset.set(0, 10); - - case 'parents-christmas': - offset.set(110, 10); - - case 'senpai': - offset.set(60, -70); + case '': + visible = false; + dontPlayAnim = true; + default: + var characterPath:String = 'images/menucharacters/' + character + '.json'; + var rawJson = null; + + #if dontUseManifest + var path:String = Paths.modFolders(characterPath); + if (!FileSystem.exists(path)) { + path = Paths.getPreloadPath(characterPath); + } + + if(!FileSystem.exists(path)) { + path = Paths.getPreloadPath('images/menucharacters/' + DEFAULT_CHARACTER + '.json'); + } + rawJson = File.getContent(path); + + #else + var path:String = Paths.getPreloadPath(characterPath); + if(!Assets.exists(path)) { + path = Paths.getPreloadPath('images/menucharacters/' + DEFAULT_CHARACTER + '.json'); + } + rawJson = Assets.getText(path); + #end + + var charFile:MenuCharacterFile = cast Json.parse(rawJson); + frames = Paths.getSparrowAtlas('menucharacters/' + charFile.image); + animation.addByPrefix('idle', charFile.idle_anim, 24); + animation.addByPrefix('confirm', charFile.confirm_anim, 24, false); + + if(charFile.scale != 1) { + scale.set(charFile.scale, charFile.scale); + updateHitbox(); + } + offset.set(charFile.position[0], charFile.position[1]); + animation.play('idle'); } } } diff --git a/source/MenuItem.hx b/source/MenuItem.hx index 5429c9a4d..2501463df 100644 --- a/source/MenuItem.hx +++ b/source/MenuItem.hx @@ -3,23 +3,20 @@ package; import flixel.FlxG; import flixel.FlxSprite; import flixel.graphics.frames.FlxAtlasFrames; -import flixel.group.FlxSpriteGroup; import flixel.math.FlxMath; import flixel.util.FlxColor; -class MenuItem extends FlxSpriteGroup +class MenuItem extends FlxSprite { public var targetY:Float = 0; - public var week:FlxSprite; public var flashingInt:Int = 0; - public function new(x:Float, y:Float, weekNum:Int = 0) + public function new(x:Float, y:Float, weekName:String = '') { super(x, y); - week = new FlxSprite().loadGraphic(Paths.image('storymenu/week' + WeekData.getWeekNumber(weekNum))); + loadGraphic(Paths.image('storymenu/' + weekName)); //trace('Test added: ' + WeekData.getWeekNumber(weekNum) + ' (' + weekNum + ')'); - week.antialiasing = ClientPrefs.globalAntialiasing; - add(week); + antialiasing = ClientPrefs.globalAntialiasing; } private var isFlashing:Bool = false; @@ -44,8 +41,8 @@ class MenuItem extends FlxSpriteGroup flashingInt += 1; if (flashingInt % fakeFramerate >= Math.floor(fakeFramerate / 2)) - week.color = 0xFF33ffff; + color = 0xFF33ffff; else - week.color = FlxColor.WHITE; + color = FlxColor.WHITE; } } diff --git a/source/MusicBeatState.hx b/source/MusicBeatState.hx index b313a5f0a..e4841924d 100644 --- a/source/MusicBeatState.hx +++ b/source/MusicBeatState.hx @@ -12,6 +12,7 @@ import flixel.FlxSprite; import flixel.util.FlxColor; import flixel.util.FlxGradient; import flixel.FlxState; +import flixel.FlxBasic; #if mobileC import flixel.FlxCamera; import ui.FlxVirtualPad; @@ -29,6 +30,7 @@ class MusicBeatState extends FlxUIState inline function get_controls():Controls return PlayerSettings.player1.controls; + #if mobileC var _virtualpad:FlxVirtualPad; @@ -62,19 +64,29 @@ class MusicBeatState extends FlxUIState #end override function create() { - #if MODS_ALLOWED - if(!ClientPrefs.imagesPersist) { - Paths.customImagesLoaded.clear(); - } - #end + var skip:Bool = FlxTransitionableState.skipNextTransOut; super.create(); // Custom made Trans out - if(!FlxTransitionableState.skipNextTransOut) { + if(!skip) { openSubState(new CustomFadeTransition(1, true)); } FlxTransitionableState.skipNextTransOut = false; } + + #if (VIDEOS_ALLOWED && windows) + override public function onFocus():Void + { + FlxVideo.onFocus(); + super.onFocus(); + } + + override public function onFocusLost():Void + { + FlxVideo.onFocusLost(); + super.onFocusLost(); + } + #end override function update(elapsed:Float) { diff --git a/source/MusicBeatSubstate.hx b/source/MusicBeatSubstate.hx index 74f018e48..d01724db9 100644 --- a/source/MusicBeatSubstate.hx +++ b/source/MusicBeatSubstate.hx @@ -3,6 +3,8 @@ package; import Conductor.BPMChangeEvent; import flixel.FlxG; import flixel.FlxSubState; +import flixel.FlxBasic; +import flixel.FlxSprite; #if mobileC import flixel.FlxCamera; import ui.FlxVirtualPad; @@ -25,6 +27,7 @@ class MusicBeatSubstate extends FlxSubState inline function get_controls():Controls return PlayerSettings.player1.controls; + #if mobileC var _virtualpad:FlxVirtualPad; diff --git a/source/Note.hx b/source/Note.hx index 5e58af95b..7d3b8628c 100644 --- a/source/Note.hx +++ b/source/Note.hx @@ -6,6 +6,7 @@ import flixel.graphics.frames.FlxAtlasFrames; import flixel.math.FlxMath; import flixel.util.FlxColor; import flash.display.BitmapData; +import editors.ChartingState; using StringTools; @@ -19,11 +20,13 @@ class Note extends FlxSprite public var tooLate:Bool = false; public var wasGoodHit:Bool = false; public var ignoreNote:Bool = false; + public var hitByOpponent:Bool = false; + public var noteWasHit:Bool = false; public var prevNote:Note; public var sustainLength:Float = 0; public var isSustainNote:Bool = false; - public var noteType(default, set):Int = 0; + public var noteType(default, set):String = null; public var eventName:String = ''; public var eventVal1:String = ''; @@ -31,6 +34,7 @@ class Note extends FlxSprite public var colorSwap:ColorSwap; public var inEditor:Bool = false; + private var earlyHitMult:Float = 0.5; public static var swagWidth:Float = 160 * 0.7; public static var PURP_NOTE:Int = 0; @@ -38,26 +42,71 @@ class Note extends FlxSprite public static var BLUE_NOTE:Int = 1; public static var RED_NOTE:Int = 3; - private function set_noteType(value:Int):Int { + // Lua shit + public var noteSplashDisabled:Bool = false; + public var noteSplashTexture:String = null; + public var noteSplashHue:Float = 0; + public var noteSplashSat:Float = 0; + public var noteSplashBrt:Float = 0; + + public var offsetX:Float = 0; + public var offsetY:Float = 0; + public var offsetAngle:Float = 0; + public var multAlpha:Float = 1; + + public var copyX:Bool = true; + public var copyY:Bool = true; + public var copyAngle:Bool = true; + public var copyAlpha:Bool = true; + + public var hitHealth:Float = 0.023; + public var missHealth:Float = 0.0475; + + public var texture(default, set):String = null; + + public var noAnimation:Bool = false; + public var hitCausesMiss:Bool = false; + + private function set_texture(value:String):String { + if(texture != value) { + reloadNote('', value); + } + texture = value; + return value; + } + + private function set_noteType(value:String):String { + noteSplashTexture = PlayState.SONG.splashSkin; + colorSwap.hue = ClientPrefs.arrowHSV[noteData % 4][0] / 360; + colorSwap.saturation = ClientPrefs.arrowHSV[noteData % 4][1] / 100; + colorSwap.brightness = ClientPrefs.arrowHSV[noteData % 4][2] / 100; + if(noteData > -1 && noteType != value) { switch(value) { - case 3: //Hurt note + case 'Hurt Note': + ignoreNote = mustPress; reloadNote('HURT'); + noteSplashTexture = 'HURTnoteSplashes'; colorSwap.hue = 0; colorSwap.saturation = 0; colorSwap.brightness = 0; - - default: - colorSwap.hue = ClientPrefs.arrowHSV[noteData % 4][0] / 360; - colorSwap.saturation = ClientPrefs.arrowHSV[noteData % 4][1] / 100; - colorSwap.brightness = ClientPrefs.arrowHSV[noteData % 4][2] / 100; + if(isSustainNote) { + missHealth = 0.1; + } else { + missHealth = 0.3; + } + hitCausesMiss = true; + case 'No Animation': + noAnimation = true; } noteType = value; } + noteSplashHue = colorSwap.hue; + noteSplashSat = colorSwap.saturation; + noteSplashBrt = colorSwap.brightness; return value; } - var isPixel:Bool = false; public function new(strumTime:Float, noteData:Int, ?prevNote:Note, ?sustainNote:Bool = false, ?inEditor:Bool = false) { super(); @@ -77,42 +126,10 @@ class Note extends FlxSprite this.noteData = noteData; - var daStage:String = PlayState.curStage; - - switch (daStage) - { - case 'school' | 'schoolEvil': - if (isSustainNote) - { - loadGraphic(Paths.image('weeb/pixelUI/NOTE_assetsENDS')); - width = width / 4; - height = height / 2; - loadGraphic(Paths.image('weeb/pixelUI/NOTE_assetsENDS'), true, Math.floor(width), Math.floor(height)); - } else { - loadGraphic(Paths.image('weeb/pixelUI/NOTE_assets')); - width = width / 4; - height = height / 5; - loadGraphic(Paths.image('weeb/pixelUI/NOTE_assets'), true, Math.floor(width), Math.floor(height)); - } - loadPixelNoteAnims(); - - setGraphicSize(Std.int(width * PlayState.daPixelZoom)); - updateHitbox(); - isPixel = true; - - default: - frames = Paths.getSparrowAtlas('NOTE_assets'); - loadNoteAnims(); - antialiasing = ClientPrefs.globalAntialiasing; - } - if(noteData > -1) { + texture = ''; colorSwap = new ColorSwap(); shader = colorSwap.shader; - - colorSwap.hue = ClientPrefs.arrowHSV[noteData % 4][0] / 360; - colorSwap.saturation = ClientPrefs.arrowHSV[noteData % 4][1] / 100; - colorSwap.brightness = ClientPrefs.arrowHSV[noteData % 4][2] / 100; x += swagWidth * (noteData % 4); if(!isSustainNote) { //Doing this 'if' check to fix the warnings on Senpai songs @@ -137,9 +154,11 @@ class Note extends FlxSprite if (isSustainNote && prevNote != null) { alpha = 0.6; + multAlpha = 0.6; if(ClientPrefs.downScroll) flipY = true; - x += width / 2; + offsetX += width / 2; + copyAngle = false; switch (noteData) { @@ -155,10 +174,10 @@ class Note extends FlxSprite updateHitbox(); - x -= width / 2; + offsetX -= width / 2; - if (PlayState.curStage.startsWith('school')) - x += 30; + if (PlayState.isPixelStage) + offsetX += 30; if (prevNote.isSustainNote) { @@ -174,19 +193,35 @@ class Note extends FlxSprite prevNote.animation.play('redhold'); } - prevNote.scale.y *= Conductor.stepCrochet / 100 * 1.5 * PlayState.SONG.speed; + prevNote.scale.y *= Conductor.stepCrochet / 100 * 1.05 * PlayState.SONG.speed; + if(PlayState.isPixelStage) { + prevNote.scale.y *= 1.19; + } prevNote.updateHitbox(); // prevNote.setGraphicSize(); } - } - if(!isPixel && noteData > -1) reloadNote(); + if(PlayState.isPixelStage) { + scale.y *= PlayState.daPixelZoom; + updateHitbox(); + } + } else if(!isSustainNote) { + earlyHitMult = 1; + } + x += offsetX; } - function reloadNote(?prefix:String = '', ?suffix:String = '') { - var skin:String = PlayState.SONG.arrowSkin; - if(skin == null || skin.length < 1) { - skin = 'NOTE_assets'; + function reloadNote(?prefix:String = '', ?texture:String = '', ?suffix:String = '') { + if(prefix == null) prefix = ''; + if(texture == null) texture = ''; + if(suffix == null) suffix = ''; + + var skin:String = texture; + if(texture.length < 1) { + skin = PlayState.SONG.arrowSkin; + if(skin == null || skin.length < 1) { + skin = 'NOTE_assets'; + } } var animName:String = null; @@ -194,25 +229,38 @@ class Note extends FlxSprite animName = animation.curAnim.name; } - var blahblah:String = prefix + skin + suffix; - if(isPixel) { + var arraySkin:Array = skin.split('/'); + arraySkin[arraySkin.length-1] = prefix + arraySkin[arraySkin.length-1] + suffix; + + var lastScaleY:Float = scale.y; + var blahblah:String = arraySkin.join('/'); + if(PlayState.isPixelStage) { if(isSustainNote) { - loadGraphic(Paths.image('weeb/pixelUI/' + blahblah + 'ENDS')); + loadGraphic(Paths.image('pixelUI/' + blahblah + 'ENDS')); width = width / 4; height = height / 2; - loadGraphic(Paths.image('weeb/pixelUI/' + blahblah + 'ENDS'), true, Math.floor(width), Math.floor(height)); + loadGraphic(Paths.image('pixelUI/' + blahblah + 'ENDS'), true, Math.floor(width), Math.floor(height)); } else { - loadGraphic(Paths.image('weeb/pixelUI/' + blahblah)); + loadGraphic(Paths.image('pixelUI/' + blahblah)); width = width / 4; height = height / 5; - loadGraphic(Paths.image('weeb/pixelUI/' + blahblah), true, Math.floor(width), Math.floor(height)); + loadGraphic(Paths.image('pixelUI/' + blahblah), true, Math.floor(width), Math.floor(height)); } + setGraphicSize(Std.int(width * PlayState.daPixelZoom)); loadPixelNoteAnims(); + antialiasing = false; } else { frames = Paths.getSparrowAtlas(blahblah); loadNoteAnims(); + antialiasing = ClientPrefs.globalAntialiasing; } - animation.play(animName, true); + if(isSustainNote) { + scale.y = lastScaleY; + } + updateHitbox(); + + if(animName != null) + animation.play(animName, true); if(inEditor) { setGraphicSize(ChartingState.GRID_SIZE, ChartingState.GRID_SIZE); @@ -268,9 +316,9 @@ class Note extends FlxSprite if (mustPress) { - // The * 0.5 is so that it's easier to hit them too late, instead of too early + // ok river if (strumTime > Conductor.songPosition - Conductor.safeZoneOffset - && strumTime < Conductor.songPosition + (Conductor.safeZoneOffset * 0.5)) + && strumTime < Conductor.songPosition + (Conductor.safeZoneOffset * earlyHitMult)) canBeHit = true; else canBeHit = false; diff --git a/source/NoteSplash.hx b/source/NoteSplash.hx index b99b0de78..2814f59da 100644 --- a/source/NoteSplash.hx +++ b/source/NoteSplash.hx @@ -8,7 +8,7 @@ class NoteSplash extends FlxSprite { public var colorSwap:ColorSwap = null; private var idleAnim:String; - private var lastNoteType:Int = -1; + private var textureLoaded:String = null; public function new(x:Float = 0, y:Float = 0, ?note:Int = 0) { super(x, y); @@ -25,35 +25,21 @@ class NoteSplash extends FlxSprite antialiasing = ClientPrefs.globalAntialiasing; } - public function setupNoteSplash(x:Float, y:Float, note:Int = 0, noteType:Int = 0) { + public function setupNoteSplash(x:Float, y:Float, note:Int = 0, texture:String = null, hueColor:Float = 0, satColor:Float = 0, brtColor:Float = 0) { setPosition(x - Note.swagWidth * 0.95, y - Note.swagWidth); alpha = 0.6; - if(lastNoteType != noteType) { - var skin:String = 'noteSplashes'; - if(PlayState.SONG.splashSkin != null && PlayState.SONG.splashSkin.length > 0) skin = PlayState.SONG.splashSkin; - - switch(noteType) { - case 3: //Hurt note - loadAnims('HURT' + skin); - - default: - loadAnims(skin); - } - lastNoteType = noteType; + if(texture == null) { + texture = 'noteSplashes'; + if(PlayState.SONG.splashSkin != null && PlayState.SONG.splashSkin.length > 0) texture = PlayState.SONG.splashSkin; } - switch(noteType) { - case 3: - colorSwap.hue = 0; - colorSwap.saturation = 0; - colorSwap.brightness = 0; - - default: - colorSwap.hue = ClientPrefs.arrowHSV[note % 4][0] / 360; - colorSwap.saturation = ClientPrefs.arrowHSV[note % 4][1] / 100; - colorSwap.brightness = ClientPrefs.arrowHSV[note % 4][2] / 100; + if(textureLoaded != texture) { + loadAnims(texture); } + colorSwap.hue = hueColor; + colorSwap.saturation = satColor; + colorSwap.brightness = brtColor; offset.set(10, 10); var animNum:Int = FlxG.random.int(1, 2); diff --git a/source/OptionsState.hx b/source/OptionsState.hx index c9746916c..fb9f89b6c 100644 --- a/source/OptionsState.hx +++ b/source/OptionsState.hx @@ -25,16 +25,12 @@ import flixel.input.keyboard.FlxKey; import flixel.graphics.FlxGraphic; import Controls; -import options.CustomControlsState; -import options.AboutState; -import ui.FlxVirtualPad; - using StringTools; // TO DO: Redo the menu creation system for not being as dumb class OptionsState extends MusicBeatState { - var options:Array = ['Preferences', 'Notes', 'Mobile Controls', 'About']; + var options:Array = ['Notes', 'Mobile Controls', 'About', 'Preferences']; private var grpOptions:FlxTypedGroup; private static var curSelected:Int = 0; public static var menuBG:FlxSprite; @@ -188,11 +184,6 @@ class NotesSubstate extends MusicBeatSubstate } hsvText = new Alphabet(0, 0, "Hue Saturation Brightness", false, false, 0, 0.65); add(hsvText); - - #if mobileC - addVirtualPad(FULL, A_B); - #end - changeSelection(); } @@ -407,35 +398,36 @@ class NotesSubstate extends MusicBeatSubstate class ControlsSubstate extends MusicBeatSubstate { - private static var curSelected:Int = 1; + private static var curSelected:Int = -1; private static var curAlt:Bool = false; private static var defaultKey:String = 'Reset to Default Keys'; - - var optionShit:Array = [ - 'NOTES', - ClientPrefs.keyBinds[0][1], - ClientPrefs.keyBinds[1][1], - ClientPrefs.keyBinds[2][1], - ClientPrefs.keyBinds[3][1], - '', - 'UI', - ClientPrefs.keyBinds[4][1], - ClientPrefs.keyBinds[5][1], - ClientPrefs.keyBinds[6][1], - ClientPrefs.keyBinds[7][1], - '', - ClientPrefs.keyBinds[8][1], - ClientPrefs.keyBinds[9][1], - ClientPrefs.keyBinds[10][1], - ClientPrefs.keyBinds[11][1], - '', - defaultKey]; + private var bindLength:Int = 0; + + var optionShit:Array = [ + ['NOTES'], + ['Left', 'note_left'], + ['Down', 'note_down'], + ['Up', 'note_up'], + ['Right', 'note_right'], + [''], + ['UI'], + ['Left', 'ui_left'], + ['Down', 'ui_down'], + ['Up', 'ui_up'], + ['Right', 'ui_right'], + [''], + ['Reset', 'reset'], + ['Accept', 'accept'], + ['Back', 'back'], + ['Pause', 'pause'], + ]; private var grpOptions:FlxTypedGroup; private var grpInputs:Array = []; - private var controlArray:Array = []; - var rebindingKey:Int = -1; + private var grpInputsAlt:Array = []; + private var controlMap:Map; + var rebindingKey:Bool = false; var nextAccept:Int = 5; public function new() { @@ -443,15 +435,18 @@ class ControlsSubstate extends MusicBeatSubstate { grpOptions = new FlxTypedGroup(); add(grpOptions); - controlArray = ClientPrefs.lastControls.copy(); + controlMap = ClientPrefs.keyBinds.copy(); + optionShit.push(['']); + optionShit.push([defaultKey]); + for (i in 0...optionShit.length) { var isCentered:Bool = false; - var isDefaultKey:Bool = (optionShit[i] == defaultKey); + var isDefaultKey:Bool = (optionShit[i][0] == defaultKey); if(unselectableCheck(i, true)) { isCentered = true; } - var optionText:Alphabet = new Alphabet(0, (10 * i), optionShit[i], (!isCentered || isDefaultKey), false); + var optionText:Alphabet = new Alphabet(0, (10 * i), optionShit[i][0], (!isCentered || isDefaultKey), false); optionText.isMenuItem = true; if(isCentered) { optionText.screenCenter(X); @@ -465,7 +460,9 @@ class ControlsSubstate extends MusicBeatSubstate { grpOptions.add(optionText); if(!isCentered) { - addBindTexts(optionText); + addBindTexts(optionText, i); + bindLength++; + if(curSelected < 0) curSelected = i; } } changeSelection(); @@ -474,7 +471,7 @@ class ControlsSubstate extends MusicBeatSubstate { var leaving:Bool = false; var bindingTime:Float = 0; override function update(elapsed:Float) { - if(rebindingKey < 0) { + if(!rebindingKey) { if (controls.UI_UP_P) { changeSelection(-1); } @@ -486,58 +483,58 @@ class ControlsSubstate extends MusicBeatSubstate { } if (controls.BACK) { - ClientPrefs.reloadControls(controlArray); + ClientPrefs.keyBinds = controlMap.copy(); + ClientPrefs.reloadControls(); grpOptions.forEachAlive(function(spr:Alphabet) { spr.alpha = 0; }); - for (i in 0...grpInputs.length) { - var spr:AttachedText = grpInputs[i]; - if(spr != null) { - spr.alpha = 0; - } - } close(); FlxG.sound.play(Paths.sound('cancelMenu')); } if(controls.ACCEPT && nextAccept <= 0) { - if(optionShit[curSelected] == defaultKey) { - controlArray = ClientPrefs.defaultKeys.copy(); + if(optionShit[curSelected][0] == defaultKey) { + controlMap = ClientPrefs.defaultKeys.copy(); reloadKeys(); changeSelection(); FlxG.sound.play(Paths.sound('confirmMenu')); - } else { + } else if(!unselectableCheck(curSelected)) { bindingTime = 0; - rebindingKey = getSelectedKey(); - if(rebindingKey > -1) { - grpInputs[rebindingKey].visible = false; - FlxG.sound.play(Paths.sound('scrollMenu')); + rebindingKey = true; + if (curAlt) { + grpInputsAlt[getInputTextNum()].alpha = 0; } else { - FlxG.log.warn('Error! No input found/badly configured'); - FlxG.sound.play(Paths.sound('cancelMenu')); + grpInputs[getInputTextNum()].alpha = 0; } + FlxG.sound.play(Paths.sound('scrollMenu')); } } } else { var keyPressed:Int = FlxG.keys.firstJustPressed(); if (keyPressed > -1) { - controlArray[rebindingKey] = keyPressed; - var opposite:Int = rebindingKey + (rebindingKey % 2 == 1 ? -1 : 1); - trace('Rebinded key with ID: ' + rebindingKey + ', Opposite is: ' + opposite); - if(controlArray[opposite] == controlArray[rebindingKey]) { - controlArray[opposite] = NONE; + var keysArray:Array = controlMap.get(optionShit[curSelected][1]); + keysArray[curAlt ? 1 : 0] = keyPressed; + + var opposite:Int = (curAlt ? 0 : 1); + if(keysArray[opposite] == keysArray[1 - opposite]) { + keysArray[opposite] = NONE; } + controlMap.set(optionShit[curSelected][1], keysArray); reloadKeys(); FlxG.sound.play(Paths.sound('confirmMenu')); - rebindingKey = -1; + rebindingKey = false; } bindingTime += elapsed; if(bindingTime > 5) { - grpInputs[rebindingKey].visible = true; + if (curAlt) { + grpInputsAlt[curSelected].alpha = 1; + } else { + grpInputs[curSelected].alpha = 1; + } FlxG.sound.play(Paths.sound('scrollMenu')); - rebindingKey = -1; + rebindingKey = false; bindingTime = 0; } } @@ -547,6 +544,16 @@ class ControlsSubstate extends MusicBeatSubstate { } super.update(elapsed); } + + function getInputTextNum() { + var num:Int = 0; + for (i in 0...curSelected) { + if(optionShit[i].length > 1) { + num++; + } + } + return num; + } function changeSelection(change:Int = 0) { do { @@ -562,6 +569,9 @@ class ControlsSubstate extends MusicBeatSubstate { for (i in 0...grpInputs.length) { grpInputs[i].alpha = 0.6; } + for (i in 0...grpInputsAlt.length) { + grpInputsAlt[i].alpha = 0.6; + } for (item in grpOptions.members) { item.targetY = bullShit - curSelected; @@ -571,9 +581,19 @@ class ControlsSubstate extends MusicBeatSubstate { item.alpha = 0.6; if (item.targetY == 0) { item.alpha = 1; - for (i in 0...grpInputs.length) { - if(grpInputs[i].sprTracker == item && grpInputs[i].isAlt == curAlt) { - grpInputs[i].alpha = 1; + if(curAlt) { + for (i in 0...grpInputsAlt.length) { + if(grpInputsAlt[i].sprTracker == item) { + grpInputsAlt[i].alpha = 1; + break; + } + } + } else { + for (i in 0...grpInputs.length) { + if(grpInputs[i].sprTracker == item) { + grpInputs[i].alpha = 1; + break; + } } } } @@ -587,62 +607,63 @@ class ControlsSubstate extends MusicBeatSubstate { for (i in 0...grpInputs.length) { if(grpInputs[i].sprTracker == grpOptions.members[curSelected]) { grpInputs[i].alpha = 0.6; - if(grpInputs[i].isAlt == curAlt) { + if(!curAlt) { grpInputs[i].alpha = 1; } + break; + } + } + for (i in 0...grpInputsAlt.length) { + if(grpInputsAlt[i].sprTracker == grpOptions.members[curSelected]) { + grpInputsAlt[i].alpha = 0.6; + if(curAlt) { + grpInputsAlt[i].alpha = 1; + } + break; } } FlxG.sound.play(Paths.sound('scrollMenu')); } private function unselectableCheck(num:Int, ?checkDefaultKey:Bool = false):Bool { - if(optionShit[num] == defaultKey) { + if(optionShit[num][0] == defaultKey) { return checkDefaultKey; } - - for (i in 0...ClientPrefs.keyBinds.length) { - if(ClientPrefs.keyBinds[i][1] == optionShit[num]) { - return false; - } - } - return true; - } - - private function getSelectedKey():Int { - var altValue:Int = (curAlt ? 1 : 0); - for (i in 0...ClientPrefs.keyBinds.length) { - if(ClientPrefs.keyBinds[i][1] == optionShit[curSelected]) { - return i*2 + altValue; - } - } - return -1; + return optionShit[num].length < 2 && optionShit[num][0] != defaultKey; } - private function addBindTexts(optionText:Alphabet) { - var text1 = new AttachedText(InputFormatter.getKeyName(controlArray[grpInputs.length]), 400, -55); + private function addBindTexts(optionText:Alphabet, num:Int) { + var keys:Array = controlMap.get(optionShit[num][1]); + var text1 = new AttachedText(InputFormatter.getKeyName(keys[0]), 400, -55); text1.setPosition(optionText.x + 400, optionText.y - 55); text1.sprTracker = optionText; grpInputs.push(text1); add(text1); - var text2 = new AttachedText(InputFormatter.getKeyName(controlArray[grpInputs.length]), 650, -55); + var text2 = new AttachedText(InputFormatter.getKeyName(keys[1]), 650, -55); text2.setPosition(optionText.x + 650, optionText.y - 55); text2.sprTracker = optionText; - text2.isAlt = true; - grpInputs.push(text2); + grpInputsAlt.push(text2); add(text2); } function reloadKeys() { while(grpInputs.length > 0) { var item:AttachedText = grpInputs[0]; + item.kill(); grpInputs.remove(item); - remove(item); + item.destroy(); + } + while(grpInputsAlt.length > 0) { + var item:AttachedText = grpInputsAlt[0]; + item.kill(); + grpInputsAlt.remove(item); + item.destroy(); } for (i in 0...grpOptions.length) { if(!unselectableCheck(i, true)) { - addBindTexts(grpOptions.members[i]); + addBindTexts(grpOptions.members[i], i); } } @@ -651,6 +672,9 @@ class ControlsSubstate extends MusicBeatSubstate { for (i in 0...grpInputs.length) { grpInputs[i].alpha = 0.6; } + for (i in 0...grpInputsAlt.length) { + grpInputsAlt[i].alpha = 0.6; + } for (item in grpOptions.members) { item.targetY = bullShit - curSelected; @@ -660,9 +684,17 @@ class ControlsSubstate extends MusicBeatSubstate { item.alpha = 0.6; if (item.targetY == 0) { item.alpha = 1; - for (i in 0...grpInputs.length) { - if(grpInputs[i].sprTracker == item && grpInputs[i].isAlt == curAlt) { - grpInputs[i].alpha = 1; + if(curAlt) { + for (i in 0...grpInputsAlt.length) { + if(grpInputsAlt[i].sprTracker == item) { + grpInputsAlt[i].alpha = 1; + } + } + } else { + for (i in 0...grpInputs.length) { + if(grpInputs[i].sprTracker == item) { + grpInputs[i].alpha = 1; + } } } } @@ -714,15 +746,19 @@ class PreferencesSubstate extends MusicBeatSubstate private var grpTexts:FlxTypedGroup; private var textNumber:Array = []; - private var characterLayer:FlxTypedGroup; private var showCharacter:Character = null; private var descText:FlxText; public function new() { super(); - characterLayer = new FlxTypedGroup(); - add(characterLayer); + // avoids lagspikes while scrolling through menus! + showCharacter = new Character(840, 170, 'bf', true); + showCharacter.setGraphicSize(Std.int(showCharacter.width * 0.8)); + showCharacter.updateHitbox(); + showCharacter.dance(); + add(showCharacter); + showCharacter.visible = false; grpOptions = new FlxTypedGroup(); add(grpOptions); @@ -782,11 +818,6 @@ class PreferencesSubstate extends MusicBeatSubstate break; } } - - #if mobileC - addVirtualPad(FULL, A_B); - #end - changeSelection(); reloadValues(); } @@ -888,7 +919,7 @@ class PreferencesSubstate extends MusicBeatSubstate case 'Persistent Cached Data': ClientPrefs.imagesPersist = !ClientPrefs.imagesPersist; FlxGraphic.defaultPersist = ClientPrefs.imagesPersist; - + case 'Hide Song Length': ClientPrefs.hideTime = !ClientPrefs.hideTime; } @@ -1018,18 +1049,7 @@ class PreferencesSubstate extends MusicBeatSubstate } } - if(options[curSelected] == 'Anti-Aliasing') { - if(showCharacter == null) { - showCharacter = new Character(840, 170, 'bf', true); - showCharacter.setGraphicSize(Std.int(showCharacter.width * 0.8)); - showCharacter.updateHitbox(); - showCharacter.dance(); - characterLayer.add(showCharacter); - } - } else if(showCharacter != null) { - characterLayer.clear(); - showCharacter = null; - } + showCharacter.visible = (options[curSelected] == 'Anti-Aliasing'); FlxG.sound.play(Paths.sound('scrollMenu')); } @@ -1095,6 +1115,6 @@ class PreferencesSubstate extends MusicBeatSubstate return true; } } - return options[num] == ''; + return options[num] == null || options[num].length < 1; } } diff --git a/source/OutdatedState.hx b/source/OutdatedState.hx new file mode 100644 index 000000000..6990142db --- /dev/null +++ b/source/OutdatedState.hx @@ -0,0 +1,54 @@ +package; + +import flixel.FlxG; +import flixel.FlxSprite; +import flixel.FlxSubState; +import flixel.text.FlxText; +import flixel.util.FlxColor; +import flixel.effects.FlxFlicker; +import lime.app.Application; +import flixel.addons.transition.FlxTransitionableState; +import flixel.tweens.FlxTween; +import flixel.util.FlxTimer; + +class OutdatedState extends MusicBeatState +{ + public static var leftState:Bool = false; + + var warnText:FlxText; + override function create() + { + super.create(); + + var bg:FlxSprite = new FlxSprite().makeGraphic(FlxG.width, FlxG.height, FlxColor.BLACK); + add(bg); + + warnText = new FlxText(0, 0, FlxG.width, + "Sup bro, looks like you're running an \n + outdated version of Psych Engine (" + MainMenuState.psychEngineVersion + "),\n + please update to " + TitleState.updateVersion + "!\n + \n + Thank you for using the Engine!", + 32); + warnText.setFormat("VCR OSD Mono", 32, FlxColor.WHITE, CENTER); + warnText.screenCenter(Y); + add(warnText); + } + + override function update(elapsed:Float) + { + if(!leftState) { + if (controls.ACCEPT || controls.BACK) { + leftState = true; + CoolUtil.browserLoad("https://github.com/ShadowMario/FNF-PsychEngine/releases"); + FlxG.sound.play(Paths.sound('cancelMenu')); + FlxTween.tween(warnText, {alpha: 0}, 1, { + onComplete: function (twn:FlxTween) { + MusicBeatState.switchState(new MainMenuState()); + } + }); + } + } + super.update(elapsed); + } +} diff --git a/source/OutdatedSubState.hx b/source/OutdatedSubState.hx deleted file mode 100644 index 962edd932..000000000 --- a/source/OutdatedSubState.hx +++ /dev/null @@ -1,45 +0,0 @@ -package; - -import flixel.FlxG; -import flixel.FlxSprite; -import flixel.FlxSubState; -import flixel.text.FlxText; -import flixel.util.FlxColor; -import lime.app.Application; - -class OutdatedSubState extends MusicBeatState -{ - public static var leftState:Bool = false; - - override function create() - { - super.create(); - var bg:FlxSprite = new FlxSprite().makeGraphic(FlxG.width, FlxG.height, FlxColor.BLACK); - add(bg); - var ver = "v" + Application.current.meta.get('version'); - var txt:FlxText = new FlxText(0, 0, FlxG.width, - "HEY! You're running an outdated version of the game!\nCurrent version is " - + ver - + " while the most recent version is " - + NGio.GAME_VER - + "! Press Space to go to itch.io, or ESCAPE to ignore this!!", - 32); - txt.setFormat("VCR OSD Mono", 32, FlxColor.WHITE, CENTER); - txt.screenCenter(); - add(txt); - } - - override function update(elapsed:Float) - { - if (controls.ACCEPT) - { - FlxG.openURL("https://ninja-muffin24.itch.io/funkin"); - } - if (controls.BACK) - { - leftState = true; - FlxG.switchState(new MainMenuState()); - } - super.update(elapsed); - } -} diff --git a/source/Paths.hx b/source/Paths.hx index 3adab261e..d34f0c617 100644 --- a/source/Paths.hx +++ b/source/Paths.hx @@ -13,20 +13,61 @@ import flixel.graphics.FlxGraphic; import openfl.display.BitmapData; #end +import flash.media.Sound; + using StringTools; class Paths { inline public static var SOUND_EXT = #if web "mp3" #else "ogg" #end; + inline public static var VIDEO_EXT = "mp4"; #if MODS_ALLOWED - #if (haxe >= "4.0.0") - public static var customImagesLoaded:Map = new Map(); - #else - public static var customImagesLoaded:Map = new Map(); - #end + #if (haxe >= "4.0.0") + public static var ignoreModFolders:Map = new Map(); + public static var customImagesLoaded:Map = new Map(); + public static var customSoundsLoaded:Map = new Map(); + #else + public static var ignoreModFolders:Map = new Map(); + public static var customImagesLoaded:Map = new Map(); + public static var customSoundsLoaded:Map = new Map(); #end + #end + + public static function destroyLoadedImages(ignoreCheck:Bool = false) { + #if MODS_ALLOWED + if(!ignoreCheck && ClientPrefs.imagesPersist) return; //If there's 20+ images loaded, do a cleanup just for preventing a crash + + for (key in customImagesLoaded.keys()) { + var graphic:FlxGraphic = FlxG.bitmap.get(key); + if(graphic != null) { + graphic.bitmap.dispose(); + graphic.destroy(); + FlxG.bitmap.removeByKey(key); + } + } + Paths.customImagesLoaded.clear(); + #end + } + + static public var currentModDirectory:String = null; static var currentLevel:String; + static public function getModFolders() + { + #if MODS_ALLOWED + ignoreModFolders.set('characters', true); + ignoreModFolders.set('custom_events', true); + ignoreModFolders.set('custom_notetypes', true); + ignoreModFolders.set('data', true); + ignoreModFolders.set('songs', true); + ignoreModFolders.set('music', true); + ignoreModFolders.set('sounds', true); + ignoreModFolders.set('videos', true); + ignoreModFolders.set('images', true); + ignoreModFolders.set('stages', true); + ignoreModFolders.set('weeks', true); + #end + } static public function setCurrentLevel(name:String) { @@ -65,7 +106,7 @@ class Paths return '$library:assets/$library/$file'; } - inline public static function getPreloadPath(file:String) + inline public static function getPreloadPath(file:String = '') { return 'assets/$file'; } @@ -95,34 +136,88 @@ class Paths return getPath('$key.lua', TEXT, library); } - static public function sound(key:String, ?library:String) + static public function video(key:String) { - return getPath('sounds/$key.$SOUND_EXT', SOUND, library); + #if dontUseManifest + var file:String = modsVideo(key); + if(FileSystem.exists(file)) { + return file; + } + #end + return 'assets/videos/$key.$VIDEO_EXT'; } + static public function sound(key:String, ?library:String):Dynamic + { + #if dontUseManifest + var file:String = modsSounds(key); + if(FileSystem.exists(file)) { + if(!customSoundsLoaded.exists(file)) { + customSoundsLoaded.set(file, Sound.fromFile(file)); + } + return customSoundsLoaded.get(file); + } + #end + return getPath('sounds/$key.$SOUND_EXT', SOUND, library); + } + inline static public function soundRandom(key:String, min:Int, max:Int, ?library:String) { return sound(key + FlxG.random.int(min, max), library); } - inline static public function music(key:String, ?library:String) + inline static public function music(key:String, ?library:String):Dynamic { + #if dontUseManifest + var file:String = modsMusic(key); + if(FileSystem.exists(file)) { + if(!customSoundsLoaded.exists(file)) { + customSoundsLoaded.set(file, Sound.fromFile(file)); + } + return customSoundsLoaded.get(file); + } + #end return getPath('music/$key.$SOUND_EXT', MUSIC, library); } - inline static public function voices(song:String) + inline static public function voices(song:String):Any + { + #if dontUseManifest + var file:Sound = returnSongFile(modsSongs(song.toLowerCase().replace(' ', '-') + '/Voices')); + if(file != null) { + return file; + } + #end + return 'songs:assets/songs/${song.toLowerCase().replace(' ', '-')}/Voices.$SOUND_EXT'; + } + + inline static public function inst(song:String):Any { - return 'songs:assets/songs/${song.toLowerCase()}/Voices.$SOUND_EXT'; + #if dontUseManifest + var file:Sound = returnSongFile(modsSongs(song.toLowerCase().replace(' ', '-') + '/Inst')); + if(file != null) { + return file; + } + #end + return 'songs:assets/songs/${song.toLowerCase().replace(' ', '-')}/Inst.$SOUND_EXT'; } - inline static public function inst(song:String) + #if dontUseManifest + inline static private function returnSongFile(file:String):Sound { - return 'songs:assets/songs/${song.toLowerCase()}/Inst.$SOUND_EXT'; + if(FileSystem.exists(file)) { + if(!customSoundsLoaded.exists(file)) { + customSoundsLoaded.set(file, Sound.fromFile(file)); + } + return customSoundsLoaded.get(file); + } + return null; } + #end inline static public function image(key:String, ?library:String):Dynamic { - #if MODS_ALLOWED + #if dontUseManifest var imageToReturn:FlxGraphic = addCustomGraphic(key); if(imageToReturn != null) return imageToReturn; #end @@ -131,7 +226,7 @@ class Paths static public function getTextFromFile(key:String, ?ignoreMods:Bool = false):String { - #if sys + #if dontUseManifest if (!ignoreMods && FileSystem.exists(mods(key))) return File.getContent(mods(key)); @@ -162,21 +257,21 @@ class Paths inline static public function fileExists(key:String, type:AssetType, ?ignoreMods:Bool = false, ?library:String) { - if(OpenFlAssets.exists(Paths.getPath(key, type))) { + #if dontUseManifest + if(FileSystem.exists(mods(currentModDirectory + '/' + key)) || FileSystem.exists(mods(key))) { return true; } - - #if MODS_ALLOWED - if(FileSystem.exists(mods(key))) { + #end + + if(OpenFlAssets.exists(Paths.getPath(key, type))) { return true; } - #end return false; } inline static public function getSparrowAtlas(key:String, ?library:String) { - #if MODS_ALLOWED + #if dontUseManifest var imageLoaded:FlxGraphic = addCustomGraphic(key); var xmlExists:Bool = false; if(FileSystem.exists(modsXml(key))) { @@ -191,7 +286,7 @@ class Paths inline static public function getPackerAtlas(key:String, ?library:String) { - #if MODS_ALLOWED + #if dontUseManifest var imageLoaded:FlxGraphic = addCustomGraphic(key); var txtExists:Bool = false; if(FileSystem.exists(modsTxt(key))) { @@ -203,32 +298,70 @@ class Paths return FlxAtlasFrames.fromSpriteSheetPacker(image(key, library), file('images/$key.txt', library)); #end } + + inline static public function formatToSongPath(path:String) { + return path.toLowerCase().replace(' ', '-'); + } - #if MODS_ALLOWED - static private function addCustomGraphic(key:String):FlxGraphic { + #if dontUseManifest + static public function addCustomGraphic(key:String):FlxGraphic { if(FileSystem.exists(modsImages(key))) { if(!customImagesLoaded.exists(key)) { - var newGraphic:FlxGraphic = FlxGraphic.fromBitmapData(BitmapData.fromFile(modsImages(key))); + var newBitmap:BitmapData = BitmapData.fromFile(modsImages(key)); + var newGraphic:FlxGraphic = FlxGraphic.fromBitmapData(newBitmap, false, key); newGraphic.persist = true; - customImagesLoaded.set(key, newGraphic); + FlxG.bitmap.addGraphic(newGraphic); + customImagesLoaded.set(key, true); } - return customImagesLoaded.get(key); + return FlxG.bitmap.get(key); } return null; } - inline static public function mods(key:String) { + inline static public function mods(key:String = '') { return 'mods/' + key; } + + inline static public function modsJson(key:String) { + return modFolders('data/' + key + '.json'); + } + + inline static public function modsVideo(key:String) { + return modFolders('videos/' + key + '.' + VIDEO_EXT); + } + + inline static public function modsMusic(key:String) { + return modFolders('music/' + key + '.' + SOUND_EXT); + } + + inline static public function modsSounds(key:String) { + return modFolders('sounds/' + key + '.' + SOUND_EXT); + } + + inline static public function modsSongs(key:String) { + return modFolders('songs/' + key + '.' + SOUND_EXT); + } + inline static public function modsImages(key:String) { - return mods('images/' + key + '.png'); + return modFolders('images/' + key + '.png'); } - + inline static public function modsXml(key:String) { - return mods('images/' + key + '.xml'); + return modFolders('images/' + key + '.xml'); } + inline static public function modsTxt(key:String) { - return mods('images/' + key + '.xml'); + return modFolders('images/' + key + '.txt'); + } + + static public function modFolders(key:String) { + if(currentModDirectory != null && currentModDirectory.length > 0) { + var fileToCheck:String = mods(currentModDirectory + '/' + key); + if(FileSystem.exists(fileToCheck)) { + return fileToCheck; + } + } + return 'mods/' + key; } #end -} \ No newline at end of file +} diff --git a/source/PauseSubState.hx b/source/PauseSubState.hx index bd7b6a20b..09b03a1c1 100644 --- a/source/PauseSubState.hx +++ b/source/PauseSubState.hx @@ -12,13 +12,14 @@ import flixel.text.FlxText; import flixel.tweens.FlxEase; import flixel.tweens.FlxTween; import flixel.util.FlxColor; +import flixel.FlxCamera; class PauseSubState extends MusicBeatSubstate { var grpMenuShit:FlxTypedGroup; var menuItems:Array = []; - var menuItemsOG:Array = ['Resume', 'Restart Song', 'Chart editor', 'Character editor', 'Change Difficulty', 'Toggle Practice Mode', 'Botplay', 'Exit to menu']; + var menuItemsOG:Array = ['Resume', 'Restart Song', 'Charting State', 'Change Difficulty', 'Toggle Practice Mode', 'Botplay', 'Exit to menu']; var difficultyChoices = []; var curSelected:Int = 0; @@ -26,6 +27,8 @@ class PauseSubState extends MusicBeatSubstate var practiceText:FlxText; var botplayText:FlxText; + public static var transCamera:FlxCamera; + public function new(x:Float, y:Float) { super(); @@ -49,7 +52,7 @@ class PauseSubState extends MusicBeatSubstate add(bg); var levelInfo:FlxText = new FlxText(20, 15, 0, "", 32); - levelInfo.text += PlayState.displaySongName; + levelInfo.text += PlayState.SONG.song; levelInfo.scrollFactor.set(); levelInfo.setFormat(Paths.font("vcr.ttf"), 32); levelInfo.updateHitbox(); @@ -77,7 +80,7 @@ class PauseSubState extends MusicBeatSubstate practiceText.visible = PlayState.practiceMode; add(practiceText); - botplayText = new FlxText(20, 20 + 121, 0, "BOTPLAY", 32); + botplayText = new FlxText(20, FlxG.height - 40, 0, "BOTPLAY", 32); botplayText.scrollFactor.set(); botplayText.setFormat(Paths.font('vcr.ttf'), 32); botplayText.x = FlxG.width - (botplayText.width + 20); @@ -112,8 +115,9 @@ class PauseSubState extends MusicBeatSubstate changeSelection(); cameras = [FlxG.cameras.list[FlxG.cameras.list.length - 1]]; - + addVirtualPad(FULL, A_B); + } override function update(elapsed:Float) @@ -145,6 +149,7 @@ class PauseSubState extends MusicBeatSubstate var poop = Highscore.formatSong(name, curSelected); PlayState.SONG = Song.loadFromJson(poop, name); PlayState.storyDifficulty = curSelected; + CustomFadeTransition.nextCamera = transCamera; MusicBeatState.resetState(); FlxG.sound.music.volume = 0; PlayState.changedDifficulty = true; @@ -164,15 +169,12 @@ class PauseSubState extends MusicBeatSubstate PlayState.practiceMode = !PlayState.practiceMode; PlayState.usedPractice = true; practiceText.visible = PlayState.practiceMode; + case 'Charting State': + MusicBeatState.switchState(new editors.ChartingState()); case "Restart Song": + CustomFadeTransition.nextCamera = transCamera; MusicBeatState.resetState(); FlxG.sound.music.volume = 0; - case "Chart editor": - FlxG.switchState(new ChartingState()); - case "Character editor": - FlxG.switchState(new CharacterEditorState()); - /*case "Change Control": - FlxG.switchState(new options.PauseControlsState()); */ case 'Botplay': PlayState.cpuControlled = !PlayState.cpuControlled; PlayState.usedPractice = true; @@ -180,6 +182,7 @@ class PauseSubState extends MusicBeatSubstate case "Exit to menu": PlayState.deathCounter = 0; PlayState.seenCutscene = false; + CustomFadeTransition.nextCamera = transCamera; if(PlayState.isStoryMode) { MusicBeatState.switchState(new StoryMenuState()); } else { @@ -207,7 +210,7 @@ class PauseSubState extends MusicBeatSubstate function changeSelection(change:Int = 0):Void { curSelected += change; - + FlxG.sound.play(Paths.sound('scrollMenu'), 0.4); if (curSelected < 0) diff --git a/source/PlayState.hx b/source/PlayState.hx index f7a3888f4..b835f1369 100644 --- a/source/PlayState.hx +++ b/source/PlayState.hx @@ -41,12 +41,20 @@ import lime.utils.Assets; import openfl.display.BlendMode; import openfl.display.StageQuality; import openfl.filters.ShaderFilter; -import openfl.media.Video; -import Achievements; 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 mobileC import ui.Mobilecontrols; #end +#if sys +import sys.FileSystem; +#end using StringTools; @@ -70,7 +78,19 @@ class PlayState extends MusicBeatState ['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; @@ -91,11 +111,12 @@ class PlayState extends MusicBeatState public var GF_X:Float = 400; public var GF_Y:Float = 130; - public var boyfriendGroup:FlxTypedGroup; - public var dadGroup:FlxTypedGroup; - public var gfGroup:FlxTypedGroup; + 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 SONG:SwagSong = null; public static var isStoryMode:Bool = false; public static var storyWeek:Int = 0; @@ -113,35 +134,35 @@ class PlayState extends MusicBeatState public var eventNotes:Array = []; private var strumLine:FlxSprite; - private var curSection:Int = 0; //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; + private static var resetSpriteCache:Bool = false; public var strumLineNotes:FlxTypedGroup; public var opponentStrums:FlxTypedGroup; public var playerStrums:FlxTypedGroup; - private var grpNoteSplashes:FlxTypedGroup; + public var grpNoteSplashes:FlxTypedGroup; - private var camZooming:Bool = false; + public var camZooming:Bool = false; private var curSong:String = ""; - private var gfSpeed:Int = 1; - private var health:Float = 1; - private var combo:Int = 0; + 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:FlxSprite; - private var timeBar:FlxBar; + private var timeBarBG:AttachedSprite; + public var timeBar:FlxBar; private var generatedMusic:Bool = false; - private var endingSong:Bool = false; + public var endingSong:Bool = false; private var startingSong:Bool = false; private var updateTime:Bool = false; public static var practiceMode:Bool = false; @@ -157,16 +178,18 @@ class PlayState extends MusicBeatState 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 phillyBlack:BGSprite; - var phillyBlackTween:FlxTween; + var blammedLightsBlack:ModchartSprite; + var blammedLightsBlackTween:FlxTween; var phillyCityLightsEvent:FlxTypedGroup; var phillyCityLightsEventTween:FlxTween; var trainSound:FlxSound; @@ -194,6 +217,7 @@ class PlayState extends MusicBeatState public var songScore:Int = 0; public var songHits:Int = 0; public var songMisses:Int = 0; + public var ghostMisses:Int = 0; public var scoreTxt:FlxText; var timeTxt:FlxText; var scoreTxtTween:FlxTween; @@ -210,7 +234,6 @@ class PlayState extends MusicBeatState public var inCutscene:Bool = false; var songLength:Float = 0; - public static var displaySongName:String = ""; #if desktop // Discord RPC variables @@ -219,7 +242,7 @@ class PlayState extends MusicBeatState var detailsPausedText:String = ""; #end - var luaArray:Array = []; + private var luaArray:Array = []; //Achievement shit var keysPressed:Array = [false, false, false, false]; @@ -227,11 +250,16 @@ class PlayState extends MusicBeatState var boyfriendIdled:Bool = false; // Lua shit - public var backgroundGroup:FlxTypedGroup; - public var foregroundGroup:FlxTypedGroup; + private var luaDebugGroup:FlxTypedGroup; + public var introSoundsSuffix:String = ''; override public function create() { + #if MODS_ALLOWED + Paths.destroyLoadedImages(resetSpriteCache); + #end + resetSpriteCache = false; + if (FlxG.sound.music != null) FlxG.sound.music.stop(); @@ -249,6 +277,7 @@ class PlayState extends MusicBeatState grpNoteSplashes = new FlxTypedGroup(); FlxCamera.defaultCameras = [camGame]; + CustomFadeTransition.nextCamera = camOther; //FlxG.cameras.setDefaultDrawTarget(camGame, true); persistentUpdate = true; @@ -260,22 +289,13 @@ class PlayState extends MusicBeatState Conductor.mapBPMChanges(SONG); Conductor.changeBPM(SONG.bpm); - var songName:String = SONG.song; - displaySongName = StringTools.replace(songName, '-', ' '); - #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) { - var weekCustomName = 'Week ' + storyWeek; - if(WeekData.weekResetName[storyWeek] != null) - weekCustomName = '' + WeekData.weekResetName[storyWeek]; - else if(WeekData.weekNumber[storyWeek] != null) - weekCustomName = 'Week ' + WeekData.weekNumber[storyWeek]; - - detailsText = "Story Mode: " + weekCustomName; + detailsText = "Story Mode: " + WeekData.getCurrentWeek().weekName; } else { @@ -286,11 +306,87 @@ class PlayState extends MusicBeatState detailsPausedText = "Paused - " + detailsText; #end - switch (SONG.song.toLowerCase()) + 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 'spookeez' | 'south' | 'monster': - curStage = 'spooky'; + 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']); } else { @@ -301,14 +397,13 @@ class PlayState extends MusicBeatState 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 'pico' | 'blammed' | 'philly-nice': - curStage = 'philly'; - + case 'philly': //Week 3 if(!ClientPrefs.lowQuality) { var bg:BGSprite = new BGSprite('philly/sky', -100, 0, 0.1, 0.1); add(bg); @@ -346,26 +441,7 @@ class PlayState extends MusicBeatState var street:BGSprite = new BGSprite('philly/street', -40, 50); add(street); - phillyBlack = new BGSprite(null, 0, 0, 0, 0); - phillyBlack.makeGraphic(Std.int(FlxG.width * 2), Std.int(FlxG.height * 2), FlxColor.BLACK); - phillyBlack.alpha = 0.0; - add(phillyBlack); - - phillyCityLightsEvent = new FlxTypedGroup(); - add(phillyCityLightsEvent); - 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(); - phillyCityLightsEvent.add(light); - } - - case 'milf' | 'satin-panties' | 'high': - curStage = 'limo'; - defaultCamZoom = 0.9; - + case 'limo': //Week 4 var skyBG:BGSprite = new BGSprite('limo/limoSunset', -120, -50, 0.1, 0.1); add(skyBG); @@ -414,11 +490,7 @@ class PlayState extends MusicBeatState fastCar.active = true; limoKillingState = 0; - case 'cocoa' | 'eggnog': - curStage = 'mall'; - - defaultCamZoom = 0.8; - + 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(); @@ -452,8 +524,7 @@ class PlayState extends MusicBeatState add(santa); CoolUtil.precacheSound('Lights_Shut_off'); - case 'winter-horrorland': - curStage = 'mallEvil'; + 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(); @@ -465,10 +536,11 @@ class PlayState extends MusicBeatState var evilSnow:BGSprite = new BGSprite('christmas/evilSnow', -200, 700); add(evilSnow); - case 'senpai' | 'roses': - curStage = 'school'; - - // defaultCamZoom = 0.9; + 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); @@ -523,22 +595,21 @@ class PlayState extends MusicBeatState bgGirls = new BackgroundGirls(-100, 190); bgGirls.scrollFactor.set(0.9, 0.9); - if (SONG.song.toLowerCase() == 'roses') { - bgGirls.getScared(); - } - bgGirls.setGraphicSize(Std.int(bgGirls.width * daPixelZoom)); bgGirls.updateHitbox(); add(bgGirls); } - case 'thorns': - curStage = 'schoolEvil'; + 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? + /*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; @@ -560,38 +631,77 @@ class PlayState extends MusicBeatState bg.antialiasing = false; add(bg); } + } - default: - defaultCamZoom = 0.9; - curStage = 'stage'; - var bg:BGSprite = new BGSprite('stageback', -600, -200, 0.9, 0.9); - add(bg); + if(isPixelStage) { + introSoundsSuffix = '-pixel'; + } - var stageFront:BGSprite = new BGSprite('stagefront', -650, 600, 0.9, 0.9); - stageFront.setGraphicSize(Std.int(stageFront.width * 1.1)); - stageFront.updateHitbox(); - add(stageFront); + add(gfGroup); - 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); + // Shitty layering but whatev it works LOL + if (curStage == 'limo') + add(limo); - var stageCurtains:BGSprite = new BGSprite('stagecurtains', -500, -300, 1.3, 1.3); - stageCurtains.setGraphicSize(Std.int(stageCurtains.width * 0.9)); - stageCurtains.updateHitbox(); - add(stageCurtains); - } + add(dadGroup); + add(boyfriendGroup); + + if(curStage == 'spooky') { + add(halloweenWhite); } - backgroundGroup = new FlxTypedGroup(); - add(backgroundGroup); + #if LUA_ALLOWED + luaDebugGroup = new FlxTypedGroup(); + luaDebugGroup.cameras = [camOther]; + add(luaDebugGroup); + #end + + #if (MODS_ALLOWED && LUA_ALLOWED) + var doPush:Bool = false; + var luaFile:String = 'stages/' + curStage + '.lua'; + if(FileSystem.exists(Paths.modFolders(luaFile))) { + luaFile = Paths.modFolders(luaFile); + doPush = true; + } else { + luaFile = Paths.getPreloadPath(luaFile); + if(FileSystem.exists(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(luaFile)); + + 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) { @@ -609,49 +719,17 @@ class PlayState extends MusicBeatState SONG.player3 = gfVersion; //Fix for the Chart Editor } - boyfriendGroup = new FlxTypedGroup(); - dadGroup = new FlxTypedGroup(); - gfGroup = new FlxTypedGroup(); - - // REPOSITIONING PER STAGE - switch (curStage) - { - case 'limo': - BF_Y -= 220; - BF_X += 260; - - case 'mall': - BF_X += 200; - - case 'mallEvil': - BF_X += 320; - DAD_Y -= 80; - case 'school': - BF_X += 200; - BF_Y += 220; - GF_X += 180; - GF_Y += 300; - case 'schoolEvil': - BF_X += 200; - BF_Y += 220; - GF_X += 180; - GF_Y += 300; - } - - gf = new Character(GF_X, GF_Y, gfVersion); - gf.x += gf.positionArray[0]; - gf.y += gf.positionArray[1]; + gf = new Character(0, 0, gfVersion); + startCharacterPos(gf); gf.scrollFactor.set(0.95, 0.95); gfGroup.add(gf); - dad = new Character(DAD_X, DAD_Y, SONG.player2); - dad.x += dad.positionArray[0]; - dad.y += dad.positionArray[1]; + dad = new Character(0, 0, SONG.player2); + startCharacterPos(dad, true); dadGroup.add(dad); - boyfriend = new Boyfriend(BF_X, BF_Y, SONG.player1); - boyfriend.x += boyfriend.positionArray[0]; - boyfriend.y += boyfriend.positionArray[1]; + boyfriend = new Boyfriend(0, 0, SONG.player1); + startCharacterPos(boyfriend); boyfriendGroup.add(boyfriend); var camPos:FlxPoint = new FlxPoint(gf.getGraphicMidpoint().x, gf.getGraphicMidpoint().y); @@ -661,43 +739,25 @@ class PlayState extends MusicBeatState if(dad.curCharacter.startsWith('gf')) { dad.setPosition(GF_X, GF_Y); gf.visible = false; - if (isStoryMode) - { - camPos.x += 300; - camPos.y -= 30; - tweenCamIn(); - } } switch(curStage) { case 'limo': resetFastCar(); - add(fastCar); + insert(members.indexOf(gfGroup) - 1, fastCar); case 'schoolEvil': - var evilTrail = new FlxTrail(dad, null, 4, 24, 0.3, 0.069); - add(evilTrail); + var evilTrail = new FlxTrail(dad, null, 4, 24, 0.3, 0.069); //nice + insert(members.indexOf(dadGroup) - 1, evilTrail); } - add(gfGroup); - - // Shitty layering but whatev it works LOL - if (curStage == 'limo') - add(limo); - - add(dadGroup); - add(boyfriendGroup); - - foregroundGroup = new FlxTypedGroup(); - add(foregroundGroup); - - if(curStage == 'spooky') { - add(halloweenWhite); + var file:String = Paths.json(songName + '/dialogue'); //Checks for json/Psych Engine dialogue + if (OpenFlAssets.exists(file)) { + dialogueJson = DialogueBoxPsych.parseDialogue(file); } - var lowercaseSong:String = SONG.song.toLowerCase(); - var file:String = Paths.txt(lowercaseSong + '/' + lowercaseSong + 'Dialogue'); + var file:String = Paths.txt(songName + '/' + songName + 'Dialogue'); //Checks for vanilla/Senpai dialogue if (OpenFlAssets.exists(file)) { dialogue = CoolUtil.coolTextFile(file); } @@ -707,6 +767,7 @@ class PlayState extends MusicBeatState doof.scrollFactor.set(); doof.finishThing = startCountdown; doof.nextDialogueThing = startNextDialogue; + doof.skipDialogueThing = skipDialogue; Conductor.songPosition = -5000; @@ -722,11 +783,15 @@ class PlayState extends MusicBeatState timeTxt.visible = !ClientPrefs.hideTime; if(ClientPrefs.downScroll) timeTxt.y = FlxG.height - 45; - timeBarBG = new FlxSprite(timeTxt.x, timeTxt.y + (timeTxt.height / 4)).loadGraphic(Paths.image('timeBar')); + 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, @@ -738,6 +803,7 @@ class PlayState extends MusicBeatState timeBar.visible = !ClientPrefs.hideTime; add(timeBar); add(timeTxt); + timeBarBG.sprTracker = timeBar; strumLineNotes = new FlxTypedGroup(); add(strumLineNotes); @@ -753,6 +819,24 @@ class PlayState extends MusicBeatState // startCountdown(); generateSong(SONG.song); + #if LUA_ALLOWED + for (notetype in noteTypeMap.keys()) { + var luaToLoad:String = Paths.modFolders('custom_notetypes/' + notetype + '.lua'); + if(FileSystem.exists(luaToLoad)) { + luaArray.push(new FunkinLua(luaToLoad)); + } + } + for (event in eventPushedMap.keys()) { + var luaToLoad:String = Paths.modFolders('custom_events/' + event + '.lua'); + if(FileSystem.exists(luaToLoad)) { + luaArray.push(new FunkinLua(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); @@ -781,6 +865,7 @@ class PlayState extends MusicBeatState FlxG.worldBounds.set(0, 0, FlxG.width, FlxG.height); FlxG.fixedTimestep = false; + moveCameraSection(0); healthBarBG = new AttachedSprite('healthBar'); healthBarBG.y = FlxG.height * 0.89; @@ -873,15 +958,15 @@ class PlayState extends MusicBeatState startingSong = true; updateTime = true; - #if MODS_ALLOWED + #if (MODS_ALLOWED && LUA_ALLOWED) var doPush:Bool = false; - var luaFile:String = 'data/' + PlayState.SONG.song.toLowerCase() + '/script.lua'; - if(sys.FileSystem.exists(Paths.mods(luaFile))) { - luaFile = Paths.mods(luaFile); + var luaFile:String = 'data/' + Paths.formatToSongPath(SONG.song) + '/script.lua'; + if(FileSystem.exists(Paths.modFolders(luaFile))) { + luaFile = Paths.modFolders(luaFile); doPush = true; } else { luaFile = Paths.getPreloadPath(luaFile); - if(sys.FileSystem.exists(luaFile)) { + if(FileSystem.exists(luaFile)) { doPush = true; } } @@ -890,7 +975,7 @@ class PlayState extends MusicBeatState luaArray.push(new FunkinLua(luaFile)); #end - var daSong:String = curSong.toLowerCase(); + var daSong:String = Paths.formatToSongPath(curSong); if (isStoryMode && !seenCutscene) { switch (daSong) @@ -899,6 +984,7 @@ class PlayState extends MusicBeatState 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; @@ -918,37 +1004,34 @@ class PlayState extends MusicBeatState boyfriend.playAnim('scared', true); case "winter-horrorland": - var blackScreen:FlxSprite = new FlxSprite(0, 0).makeGraphic(Std.int(FlxG.width * 2), Std.int(FlxG.height * 2), FlxColor.BLACK); + 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; - new FlxTimer().start(0.1, function(tmr:FlxTimer) + 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) { - FlxTween.tween(blackScreen, {alpha: 0}, 0.7, { - ease: FlxEase.linear, - onComplete: function(twn:FlxTween) { - remove(blackScreen); + camHUD.visible = true; + remove(blackScreen); + FlxTween.tween(FlxG.camera, {zoom: defaultCamZoom}, 2.5, { + ease: FlxEase.quadInOut, + onComplete: function(twn:FlxTween) + { + startCountdown(); } }); - 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')); @@ -967,14 +1050,23 @@ class PlayState extends MusicBeatState CoolUtil.precacheSound('missnote1'); CoolUtil.precacheSound('missnote2'); CoolUtil.precacheSound('missnote3'); - + #if desktop // Updating Discord Rich Presence. - DiscordClient.changePresence(detailsText, displaySongName + " (" + storyDifficultyText + ")", iconP2.getCharacter()); + DiscordClient.changePresence(detailsText, SONG.song + " (" + storyDifficultyText + ")", iconP2.getCharacter()); #end 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])); @@ -985,56 +1077,121 @@ class PlayState extends MusicBeatState switch(type) { case 0: if(!boyfriendMap.exists(newCharacter)) { - var newBoyfriend:Boyfriend = new Boyfriend(BF_X, BF_Y, newCharacter); + var newBoyfriend:Boyfriend = new Boyfriend(0, 0, newCharacter); boyfriendMap.set(newCharacter, newBoyfriend); boyfriendGroup.add(newBoyfriend); startCharacterPos(newBoyfriend); - newBoyfriend.visible = false; + newBoyfriend.alpha = 0.00001; + newBoyfriend.alreadyLoaded = false; } case 1: if(!dadMap.exists(newCharacter)) { - var newDad:Character = new Character(DAD_X, DAD_Y, newCharacter); + var newDad:Character = new Character(0, 0, newCharacter); dadMap.set(newCharacter, newDad); dadGroup.add(newDad); - startCharacterPos(newDad); - newDad.visible = false; + startCharacterPos(newDad, true); + newDad.alpha = 0.00001; + newDad.alreadyLoaded = false; } case 2: if(!gfMap.exists(newCharacter)) { - var newGf:Character = new Character(GF_X, GF_Y, 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.visible = false; + 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]; } - var dialogueCount:Int = 0; + 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 dontUseManifest + if(FileSystem.exists(fileName)) { + foundFile = true; + } + #end + + if(!foundFile) { + fileName = Paths.video(name); + #if dontUseManifest + 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(); + } + } - //You don't have to add a song, just saying. You can just do "dialogueIntro(dialogue);" and it should work - public function dialogueIntro(dialogue:Array, ?song:String = null):Void + 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? - inCutscene = true; - CoolUtil.precacheSound('dialogue'); - CoolUtil.precacheSound('dialogueClose'); - var doof:DialogueBoxPsych = new DialogueBoxPsych(dialogue, song); - doof.scrollFactor.set(); - doof.finishThing = startCountdown; - doof.nextDialogueThing = startNextDialogue; - doof.cameras = [camHUD]; - add(doof); + if(dialogueFile.dialogue.length > 0) { + 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 { + FlxG.log.warn('Your dialogue file is badly formatted!'); + if(endingSong) { + endSong(); + } else { + startCountdown(); + } + } } function schoolIntro(?dialogueBox:DialogueBox):Void @@ -1056,11 +1213,12 @@ class PlayState extends MusicBeatState senpaiEvil.screenCenter(); senpaiEvil.x += 300; - if (SONG.song.toLowerCase() == 'roses' || SONG.song.toLowerCase() == 'thorns') + var songName:String = Paths.formatToSongPath(SONG.song); + if (songName == 'roses' || songName == 'thorns') { remove(black); - if (SONG.song.toLowerCase() == 'thorns') + if (songName == 'thorns') { add(red); camHUD.visible = false; @@ -1079,7 +1237,7 @@ class PlayState extends MusicBeatState { if (dialogueBox != null) { - if (SONG.song.toLowerCase() == 'thorns') + if (Paths.formatToSongPath(SONG.song) == 'thorns') { add(senpaiEvil); senpaiEvil.alpha = 0; @@ -1125,11 +1283,18 @@ class PlayState extends MusicBeatState var startTimer:FlxTimer; var finishTimer:FlxTimer = null; + + // For being able to mess with the sprites on Lua + public var countDownSprites:Array = []; + + #if mobile var perfectMode:Bool = false; + #end public function startCountdown():Void { if(startedCountdown) { + callOnLuas('onStartCountdown', []); return; } @@ -1161,100 +1326,97 @@ class PlayState extends MusicBeatState startTimer = new FlxTimer().start(Conductor.crochet / 1000, function(tmr:FlxTimer) { - if (tmr.loopsLeft % gfSpeed == 0) + 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.name.startsWith('sing') && !boyfriend.specialAnim) + if (boyfriend.animation.curAnim != null && !boyfriend.animation.curAnim.name.startsWith('sing')) { boyfriend.dance(); } - if (!dad.animation.curAnim.name.startsWith('sing') && !dad.specialAnim) + if (dad.animation.curAnim != null && !dad.animation.curAnim.name.startsWith('sing') && !dad.stunned) { dad.dance(); } } - else if(dad.danceIdle && !dad.specialAnim && !dad.curCharacter.startsWith('gf') && !dad.animation.curAnim.name.startsWith("sing")) + 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('school', ['weeb/pixelUI/ready-pixel', 'weeb/pixelUI/set-pixel', 'weeb/pixelUI/date-pixel']); - introAssets.set('schoolEvil', ['weeb/pixelUI/ready-pixel', 'weeb/pixelUI/set-pixel', 'weeb/pixelUI/date-pixel']); + introAssets.set('pixel', ['pixelUI/ready-pixel', 'pixelUI/set-pixel', 'pixelUI/date-pixel']); var introAlts:Array = introAssets.get('default'); var antialias:Bool = ClientPrefs.globalAntialiasing; - var altSuffix:String = ""; - - for (value in introAssets.keys()) - { - if (value == curStage) - { - introAlts = introAssets.get(value); - altSuffix = '-pixel'; - } + if(isPixelStage) { + introAlts = introAssets.get('pixel'); + antialias = false; } - switch(curStage) { - case 'school' | 'schoolEvil': - antialias = false; - case 'mall': - if(!ClientPrefs.lowQuality) - upperBoppers.dance(true); - - bottomBoppers.dance(true); - santa.dance(true); + // 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' + altSuffix), 0.6); + 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 (curStage.startsWith('school')) + 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' + altSuffix), 0.6); + 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 (curStage.startsWith('school')) + 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' + altSuffix), 0.6); + 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 (curStage.startsWith('school')) + if (PlayState.isPixelStage) go.setGraphicSize(Std.int(go.width * daPixelZoom)); go.updateHitbox(); @@ -1262,16 +1424,24 @@ class PlayState extends MusicBeatState 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' + altSuffix), 0.6); + 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) @@ -1290,6 +1460,10 @@ class PlayState extends MusicBeatState callOnLuas('onNextDialogue', [dialogueCount]); } + function skipDialogue() { + callOnLuas('onSkipDialogue', [dialogueCount]); + } + var previousFrameTime:Int = 0; var lastReportedPlayheadPosition:Int = 0; var songTime:Float = 0; @@ -1313,19 +1487,20 @@ class PlayState extends MusicBeatState // Song duration in a float, useful for the time left feature songLength = FlxG.sound.music.length; - FlxTween.tween(timeBarBG, {alpha: 1}, 0.5, {ease: FlxEase.circOut}); 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, displaySongName + " (" + storyDifficultyText + ")", iconP2.getCharacter(), true, songLength); + 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 { @@ -1356,10 +1531,10 @@ class PlayState extends MusicBeatState var daBeats:Int = 0; // Not exactly representative of 'daBeats' lol, just how much it has looped - var songName:String = SONG.song.toLowerCase(); + var songName:String = Paths.formatToSongPath(SONG.song); var file:String = Paths.json(songName + '/events'); - #if sys - if (sys.FileSystem.exists(file)) { + #if dontUseManifest + if (FileSystem.exists(Paths.modsJson(songName + '/events')) || FileSystem.exists(file)) { #else if (OpenFlAssets.exists(file)) { #end @@ -1369,7 +1544,7 @@ class PlayState extends MusicBeatState for (songNotes in section.sectionNotes) { if(songNotes[1] < 0) { - eventNotes.push(songNotes); + eventNotes.push([songNotes[0], songNotes[1], songNotes[2], songNotes[3], songNotes[4]]); eventPushed(songNotes); } } @@ -1398,8 +1573,10 @@ class PlayState extends MusicBeatState 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 swagNote.scrollFactor.set(); var susLength:Float = swagNote.sustainLength; @@ -1414,12 +1591,11 @@ class PlayState extends MusicBeatState oldNote = unspawnNotes[Std.int(unspawnNotes.length - 1)]; var sustainNote:Note = new Note(daStrumTime + (Conductor.stepCrochet * susNote) + (Conductor.stepCrochet / FlxMath.roundDecimal(SONG.speed, 2)), daNoteData, oldNote, true); + sustainNote.mustPress = gottaHitNote; sustainNote.noteType = swagNote.noteType; sustainNote.scrollFactor.set(); unspawnNotes.push(sustainNote); - sustainNote.mustPress = gottaHitNote; - if (sustainNote.mustPress) { sustainNote.x += FlxG.width / 2; // general offset @@ -1427,15 +1603,17 @@ class PlayState extends MusicBeatState } } - swagNote.mustPress = gottaHitNote; - 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); + eventNotes.push([songNotes[0], songNotes[1], songNotes[2], songNotes[3], songNotes[4]]); eventPushed(songNotes); } } @@ -1449,19 +1627,31 @@ class PlayState extends MusicBeatState 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 = Std.parseInt(event[3]); - if(Math.isNaN(charType)) charType = 0; + 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 { @@ -1494,89 +1684,7 @@ class PlayState extends MusicBeatState for (i in 0...4) { // FlxG.log.add(i); - var babyArrow:StrumNote = new StrumNote(ClientPrefs.middleScroll ? STRUM_X_MIDDLESCROLL : STRUM_X, strumLine.y, i); - - switch (curStage) - { - case 'school' | 'schoolEvil': - babyArrow.loadGraphic(Paths.image('weeb/pixelUI/NOTE_assets')); - babyArrow.width = babyArrow.width / 4; - babyArrow.height = babyArrow.height / 5; - babyArrow.loadGraphic(Paths.image('weeb/pixelUI/NOTE_assets'), true, Math.floor(babyArrow.width), Math.floor(babyArrow.height)); - babyArrow.animation.add('green', [6]); - babyArrow.animation.add('red', [7]); - babyArrow.animation.add('blue', [5]); - babyArrow.animation.add('purplel', [4]); - - babyArrow.setGraphicSize(Std.int(babyArrow.width * daPixelZoom)); - babyArrow.updateHitbox(); - babyArrow.antialiasing = false; - - switch (Math.abs(i)) - { - case 0: - babyArrow.x += Note.swagWidth * 0; - babyArrow.animation.add('static', [0]); - babyArrow.animation.add('pressed', [4, 8], 12, false); - babyArrow.animation.add('confirm', [12, 16], 24, false); - case 1: - babyArrow.x += Note.swagWidth * 1; - babyArrow.animation.add('static', [1]); - babyArrow.animation.add('pressed', [5, 9], 12, false); - babyArrow.animation.add('confirm', [13, 17], 24, false); - case 2: - babyArrow.x += Note.swagWidth * 2; - babyArrow.animation.add('static', [2]); - babyArrow.animation.add('pressed', [6, 10], 12, false); - babyArrow.animation.add('confirm', [14, 18], 12, false); - case 3: - babyArrow.x += Note.swagWidth * 3; - babyArrow.animation.add('static', [3]); - babyArrow.animation.add('pressed', [7, 11], 12, false); - babyArrow.animation.add('confirm', [15, 19], 24, false); - } - - default: - var skin:String = 'NOTE_assets'; - if(SONG.arrowSkin != null && SONG.arrowSkin.length > 1) skin = SONG.arrowSkin; - - babyArrow.frames = Paths.getSparrowAtlas(skin); - babyArrow.animation.addByPrefix('green', 'arrowUP'); - babyArrow.animation.addByPrefix('blue', 'arrowDOWN'); - babyArrow.animation.addByPrefix('purple', 'arrowLEFT'); - babyArrow.animation.addByPrefix('red', 'arrowRIGHT'); - - babyArrow.antialiasing = ClientPrefs.globalAntialiasing; - babyArrow.setGraphicSize(Std.int(babyArrow.width * 0.7)); - - switch (Math.abs(i)) - { - case 0: - babyArrow.x += Note.swagWidth * 0; - babyArrow.animation.addByPrefix('static', 'arrowLEFT'); - babyArrow.animation.addByPrefix('pressed', 'left press', 24, false); - babyArrow.animation.addByPrefix('confirm', 'left confirm', 24, false); - case 1: - babyArrow.x += Note.swagWidth * 1; - babyArrow.animation.addByPrefix('static', 'arrowDOWN'); - babyArrow.animation.addByPrefix('pressed', 'down press', 24, false); - babyArrow.animation.addByPrefix('confirm', 'down confirm', 24, false); - case 2: - babyArrow.x += Note.swagWidth * 2; - babyArrow.animation.addByPrefix('static', 'arrowUP'); - babyArrow.animation.addByPrefix('pressed', 'up press', 24, false); - babyArrow.animation.addByPrefix('confirm', 'up confirm', 24, false); - case 3: - babyArrow.x += Note.swagWidth * 3; - babyArrow.animation.addByPrefix('static', 'arrowRIGHT'); - babyArrow.animation.addByPrefix('pressed', 'right press', 24, false); - babyArrow.animation.addByPrefix('confirm', 'right confirm', 24, false); - } - } - - babyArrow.updateHitbox(); - babyArrow.scrollFactor.set(); - + var babyArrow:StrumNote = new StrumNote(ClientPrefs.middleScroll ? STRUM_X_MIDDLESCROLL : STRUM_X, strumLine.y, i, player); if (!isStoryMode) { babyArrow.y -= 10; @@ -1584,8 +1692,6 @@ class PlayState extends MusicBeatState FlxTween.tween(babyArrow, {y: babyArrow.y + 10, alpha: 1}, 1, {ease: FlxEase.circOut, startDelay: 0.5 + (0.2 * i)}); } - babyArrow.ID = i; - if (player == 1) { playerStrums.add(babyArrow); @@ -1595,19 +1701,11 @@ class PlayState extends MusicBeatState opponentStrums.add(babyArrow); } - babyArrow.playAnim('static'); - babyArrow.x += 50; - babyArrow.x += ((FlxG.width / 2) * player); - strumLineNotes.add(babyArrow); + babyArrow.postAddedToGroup(); } } - function tweenCamIn():Void - { - FlxTween.tween(FlxG.camera, {zoom: 1.3}, (Conductor.stepCrochet * 4 / 1000), {ease: FlxEase.elasticInOut}); - } - override function openSubState(SubState:FlxSubState) { if (paused) @@ -1623,17 +1721,26 @@ class PlayState extends MusicBeatState if (finishTimer != null && !finishTimer.finished) finishTimer.active = false; - if(phillyBlackTween != null) - phillyBlackTween.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); @@ -1653,10 +1760,12 @@ class PlayState extends MusicBeatState if (finishTimer != null && !finishTimer.finished) finishTimer.active = true; - if(phillyBlackTween != null) - phillyBlackTween.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) { @@ -1664,17 +1773,24 @@ class PlayState extends MusicBeatState 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, displaySongName + " (" + storyDifficultyText + ")", iconP2.getCharacter(), true, songLength - Conductor.songPosition - ClientPrefs.noteOffset); + DiscordClient.changePresence(detailsText, SONG.song + " (" + storyDifficultyText + ")", iconP2.getCharacter(), true, songLength - Conductor.songPosition - ClientPrefs.noteOffset); } else { - DiscordClient.changePresence(detailsText, displaySongName + " (" + storyDifficultyText + ")", iconP2.getCharacter()); + DiscordClient.changePresence(detailsText, SONG.song + " (" + storyDifficultyText + ")", iconP2.getCharacter()); } #end } @@ -1689,11 +1805,11 @@ class PlayState extends MusicBeatState { if (Conductor.songPosition > 0.0) { - DiscordClient.changePresence(detailsText, displaySongName + " (" + storyDifficultyText + ")", iconP2.getCharacter(), true, songLength - Conductor.songPosition - ClientPrefs.noteOffset); + DiscordClient.changePresence(detailsText, SONG.song + " (" + storyDifficultyText + ")", iconP2.getCharacter(), true, songLength - Conductor.songPosition - ClientPrefs.noteOffset); } else { - DiscordClient.changePresence(detailsText, displaySongName + " (" + storyDifficultyText + ")", iconP2.getCharacter()); + DiscordClient.changePresence(detailsText, SONG.song + " (" + storyDifficultyText + ")", iconP2.getCharacter()); } } #end @@ -1706,7 +1822,7 @@ class PlayState extends MusicBeatState #if desktop if (health > 0 && !paused) { - DiscordClient.changePresence(detailsPausedText, displaySongName + " (" + storyDifficultyText + ")", iconP2.getCharacter()); + DiscordClient.changePresence(detailsPausedText, SONG.song + " (" + storyDifficultyText + ")", iconP2.getCharacter()); } #end @@ -1732,6 +1848,7 @@ class PlayState extends MusicBeatState override public function update(elapsed:Float) { + #if !debug perfectMode = false; #end @@ -1856,7 +1973,7 @@ class PlayState extends MusicBeatState } if(!inCutscene) { - var lerpVal:Float = CoolUtil.boundTo(elapsed * 2.4, 0, 1); + 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; @@ -1868,7 +1985,7 @@ class PlayState extends MusicBeatState } } - super.update(elapsed); //TEST + super.update(elapsed); if(ratingString == '?') { scoreTxt.text = 'Score: ' + songScore + ' | Misses: ' + songMisses + ' | Rating: ' + ratingString; @@ -1894,6 +2011,8 @@ class PlayState extends MusicBeatState if (FlxG.random.bool(0.1)) { // gitaroo man easter egg + cancelFadeTween(); + CustomFadeTransition.nextCamera = camOther; MusicBeatState.switchState(new GitarooPause()); } else { @@ -1901,19 +2020,22 @@ class PlayState extends MusicBeatState FlxG.sound.music.pause(); vocals.pause(); } + PauseSubState.transCamera = camOther; openSubState(new PauseSubState(boyfriend.getScreenPosition().x, boyfriend.getScreenPosition().y)); } #if desktop - DiscordClient.changePresence(detailsPausedText, displaySongName + " (" + storyDifficultyText + ")", iconP2.getCharacter()); + DiscordClient.changePresence(detailsPausedText, SONG.song + " (" + storyDifficultyText + ")", iconP2.getCharacter()); #end } } - if (FlxG.keys.justPressed.SEVEN && !endingSong) + if (FlxG.keys.justPressed.SEVEN && !endingSong && !inCutscene) { persistentUpdate = false; paused = true; + cancelFadeTween(); + CustomFadeTransition.nextCamera = camOther; MusicBeatState.switchState(new ChartingState()); #if desktop @@ -1948,9 +2070,11 @@ class PlayState extends MusicBeatState else iconP2.animation.curAnim.curFrame = 0; - if (FlxG.keys.justPressed.EIGHT) { + if (FlxG.keys.justPressed.EIGHT && !endingSong && !inCutscene) { persistentUpdate = false; paused = true; + cancelFadeTween(); + CustomFadeTransition.nextCamera = camOther; MusicBeatState.switchState(new CharacterEditorState(SONG.player2)); } @@ -1982,28 +2106,20 @@ class PlayState extends MusicBeatState } if(updateTime) { - var curTime:Float = FlxG.sound.music.time - ClientPrefs.noteOffset; + 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; - var minutesRemaining:Int = Math.floor(secondsTotal / 60); - var secondsRemaining:String = '' + secondsTotal % 60; - if(secondsRemaining.length < 2) secondsRemaining = '0' + secondsRemaining; //Dunno how to make it display a zero first in Haxe lol - timeTxt.text = minutesRemaining + ':' + secondsRemaining; + timeTxt.text = FlxStringUtil.formatTime(secondsTotal, false); } } // Conductor.lastSongPos = FlxG.sound.music.time; } - if (generatedMusic && PlayState.SONG.notes[Std.int(curStep / 16)] != null && !endingSong && !isCameraOnForcedPos) - { - moveCameraSection(Std.int(curStep / 16)); - } - if (camZooming) { FlxG.camera.zoom = FlxMath.lerp(defaultCamZoom, FlxG.camera.zoom, CoolUtil.boundTo(1 - (elapsed * 3.125), 0, 1)); @@ -2013,49 +2129,13 @@ class PlayState extends MusicBeatState FlxG.watch.addQuick("beatShit", curBeat); FlxG.watch.addQuick("stepShit", curStep); - if (curSong == 'Bopeebo') - { - switch (curBeat) - { - case 128, 129, 130: - //vocals.volume = 0; - // FlxG.sound.music.stop(); - // MusicBeatState.switchState(new PlayState()); - } - } - // better streaming of shit - // RESET = Quick Game Over Screen if (controls.RESET && !inCutscene && !endingSong) { health = 0; trace("RESET = True"); } - - if (health <= 0 && !practiceMode) - { - 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)); - - // 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, displaySongName + " (" + storyDifficultyText + ")", iconP2.getCharacter()); - #end - } - } + doDeathCheck(); var roundedSpeed:Float = FlxMath.roundDecimal(SONG.speed, 2); if (unspawnNotes[0] != null) @@ -2095,72 +2175,102 @@ class PlayState extends MusicBeatState } // 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 (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(curStage == 'school' || curStage == 'schoolEvil') { - daNote.y += 8; - } - } - daNote.y += (Note.swagWidth / 2) - (60.5 * (roundedSpeed - 1)); - daNote.y += 27.5 * ((SONG.bpm / 100) - 1) * (roundedSpeed - 1); + 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.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; + 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; + daNote.clipRect = swagRect; + } + } } - } - } else { - daNote.y = (strumY - 0.45 * (Conductor.songPosition - daNote.strumTime) * roundedSpeed); + } else { + daNote.y = (strumY - 0.45 * (Conductor.songPosition - daNote.strumTime) * roundedSpeed); - 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; + 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; + daNote.clipRect = swagRect; + } + } } } - if (!daNote.mustPress && daNote.wasGoodHit && !daNote.ignoreNote) + if (!daNote.mustPress && daNote.wasGoodHit && !daNote.hitByOpponent && !daNote.ignoreNote) { - if (SONG.song != 'Tutorial') + if (Paths.formatToSongPath(SONG.song) != 'tutorial') camZooming = true; - var isAlt:Bool = false; - - if(daNote.noteType == 2 && dad.animOffsets.exists('hey')) { + if(daNote.noteType == 'Hey!' && dad.animOffsets.exists('hey')) { dad.playAnim('hey', true); dad.specialAnim = true; dad.heyTimer = 0.6; - } else { + } 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 == 1) { + if (SONG.notes[Math.floor(curStep / 16)].altAnim || daNote.noteType == 'Alt Animation') { altAnim = '-alt'; - isAlt = true; } } @@ -2176,11 +2286,15 @@ class PlayState extends MusicBeatState case 3: animToPlay = 'singRIGHT'; } - dad.playAnim(animToPlay + altAnim, true); + if(daNote.noteType == 'GF Sing') { + gf.playAnim(animToPlay + altAnim, true); + gf.holdTimer = 0; + } else { + dad.playAnim(animToPlay + altAnim, true); + dad.holdTimer = 0; + } } - dad.holdTimer = 0; - if (SONG.needsVoices) vocals.volume = 1; @@ -2189,7 +2303,9 @@ class PlayState extends MusicBeatState time += 0.15; } StrumPlayAnim(true, Std.int(Math.abs(daNote.noteData)) % 4, time); - daNote.ignoreNote = true; + daNote.hitByOpponent = true; + + callOnLuas('opponentNoteHit', [notes.members.indexOf(daNote), Math.abs(daNote.noteData), daNote.noteType, daNote.isSustainNote]); if (!daNote.isSustainNote) { @@ -2204,7 +2320,7 @@ class PlayState extends MusicBeatState if(daNote.canBeHit) { goodNoteHit(daNote); } - } else if(daNote.strumTime <= Conductor.songPosition) { + } else if(daNote.strumTime <= Conductor.songPosition || (daNote.isSustainNote && daNote.canBeHit && daNote.mustPress)) { goodNoteHit(daNote); } } @@ -2217,47 +2333,8 @@ class PlayState extends MusicBeatState if (doKill) { - if (daNote.mustPress && !cpuControlled) - { - if (daNote.tooLate || !daNote.wasGoodHit) - { - if(!endingSong) { - //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(); - } - }); - - switch(daNote.noteType) { - case 3: - //Hurt note, does nothing. - - default: - health -= 0.0475; //For testing purposes - songMisses++; - vocals.volume = 0; - RecalculateRating(); - - if(ClientPrefs.ghostTapping) { - switch (daNote.noteData % 4) - { - case 0: - boyfriend.playAnim('singLEFTmiss', true); - case 1: - boyfriend.playAnim('singDOWNmiss', true); - case 2: - boyfriend.playAnim('singUPmiss', true); - case 3: - boyfriend.playAnim('singRIGHTmiss', true); - } - } - callOnLuas('noteMiss', [daNote.noteData, daNote.noteType]); - } - } - } + if (daNote.mustPress && !cpuControlled &&!daNote.ignoreNote && !endingSong && (daNote.tooLate || !daNote.wasGoodHit)) { + noteMiss(daNote); } daNote.active = false; @@ -2269,26 +2346,7 @@ class PlayState extends MusicBeatState } }); } - - - 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(); - } + checkEventNote(); if (!inCutscene) { if(!cpuControlled) { @@ -2297,13 +2355,13 @@ class PlayState extends MusicBeatState boyfriend.dance(); } } - - //super.update(elapsed); //TEST #if debug if(!endingSong && !startingSong) { - if (FlxG.keys.justPressed.ONE) + 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(); @@ -2348,21 +2406,86 @@ class PlayState extends MusicBeatState #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, ?onLua:Bool = false) { + public function triggerEventNote(eventName:String, value1:String, value2:String) { switch(eventName) { case 'Hey!': - var value:Int = Std.parseInt(value1); + 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 == 'gf') { //Tutorial GF is actually Dad! The GF is an imposter!! ding ding ding ding ding ding ding, dindinding, end my suffering + 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; @@ -2389,70 +2512,87 @@ class PlayState extends MusicBeatState gfSpeed = value; case 'Blammed Lights': - if(curStage == 'philly') { - 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; + 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(phillyBlack.alpha != 1) { - if(phillyBlackTween != null) { - phillyBlackTween.cancel(); + 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; } - phillyBlackTween = FlxTween.tween(phillyBlack, {alpha: 1}, 1, {ease: FlxEase.quadInOut, - onComplete: function(twn:FlxTween) { - phillyBlackTween = 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}); + var chars:Array = [boyfriend, gf, dad]; + for (i in 0...chars.length) { + if(chars[i].colorTween != null) { + chars[i].colorTween.cancel(); } - } else { - dad.color = color; - boyfriend.color = color; - gf.color = color; + chars[i].colorTween = FlxTween.color(chars[i], 1, FlxColor.WHITE, color, {onComplete: function(twn:FlxTween) { + chars[i].colorTween = null; + }, ease: FlxEase.quadInOut}); } - - phillyCityLightsEvent.forEach(function(spr:BGSprite) { - spr.visible = false; - }); - phillyCityLightsEvent.members[lightId - 1].visible = true; - phillyCityLightsEvent.members[lightId - 1].alpha = 1; } else { - if(phillyBlack.alpha != 0) { - if(phillyBlackTween != null) { - phillyBlackTween.cancel(); + 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(); } - phillyBlackTween = FlxTween.tween(phillyBlack, {alpha: 0}, 1, {ease: FlxEase.quadInOut, - onComplete: function(twn:FlxTween) { - phillyBlackTween = null; - } + 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; }); @@ -2471,20 +2611,20 @@ class PlayState extends MusicBeatState 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}); + var chars:Array = [boyfriend, gf, dad]; + for (i in 0...chars.length) { + if(chars[i].colorTween != null) { + chars[i].colorTween.cancel(); } - - curLight = 0; - curLightEvent = 0; + 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': @@ -2508,14 +2648,21 @@ class PlayState extends MusicBeatState } case 'Play Animation': - trace('Anim to play: ' + value1); - var val2:Int = Std.parseInt(value2); - if(Math.isNaN(val2)) val2 = 0; - + //trace('Anim to play: ' + value1); var char:Character = dad; - switch(val2) { - case 1: char = boyfriend; - case 2: char = gf; + 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; @@ -2534,13 +2681,20 @@ class PlayState extends MusicBeatState } case 'Alt Idle Animation': - var val:Int = Std.parseInt(value1); - if(Math.isNaN(val)) val = 0; - var char:Character = dad; - switch(val) { - case 1: char = boyfriend; - case 2: char = gf; + 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(); @@ -2561,8 +2715,16 @@ class PlayState extends MusicBeatState } case 'Change Character': - var charType:Int = Std.parseInt(value1); - if(Math.isNaN(charType)) charType = 0; + 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: @@ -2573,6 +2735,10 @@ class PlayState extends MusicBeatState boyfriend.visible = false; boyfriend = boyfriendMap.get(value2); + if(!boyfriend.alreadyLoaded) { + boyfriend.alpha = 1; + boyfriend.alreadyLoaded = true; + } boyfriend.visible = true; iconP1.changeIcon(boyfriend.healthIcon); } @@ -2593,6 +2759,10 @@ class PlayState extends MusicBeatState } else { gf.visible = false; } + if(!dad.alreadyLoaded) { + dad.alpha = 1; + dad.alreadyLoaded = true; + } dad.visible = true; iconP2.changeIcon(dad.healthIcon); } @@ -2603,46 +2773,44 @@ class PlayState extends MusicBeatState addCharacterToList(value2, charType); } - var isGfVisible:Bool = gf.visible; gf.visible = false; gf = gfMap.get(value2); - gf.visible = isGfVisible; + if(!gf.alreadyLoaded) { + gf.alpha = 1; + gf.alreadyLoaded = true; + } } - } + reloadHealthBarColors(); + + case 'BG Freaks Expression': + if(bgGirls != null) bgGirls.swapDanceType(); } - if(!onLua) { - callOnLuas('onEvent', [eventName, value1, value2]); - } + callOnLuas('onEvent', [eventName, value1, value2]); } function moveCameraSection(?id:Int = 0):Void { - if (SONG.notes[id] != null && camFollow.x != dad.getMidpoint().x + 150 && !SONG.notes[id].mustHitSection) + if(SONG.notes[id] == null) return; + + if (!SONG.notes[id].mustHitSection) { moveCamera(true); callOnLuas('onMoveCamera', ['dad']); } - - if (SONG.notes[id] != null && SONG.notes[id].mustHitSection && camFollow.x != boyfriend.getMidpoint().x - 100) + else { moveCamera(false); 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]; - - if (dad.curCharacter.startsWith('mom')) - vocals.volume = 1; - - if (SONG.song.toLowerCase() == 'tutorial') - { - tweenCamIn(); - } + tweenCamIn(); } else { camFollow.set(boyfriend.getMidpoint().x - 100, boyfriend.getMidpoint().y - 100); @@ -2659,13 +2827,26 @@ class PlayState extends MusicBeatState camFollow.x -= boyfriend.cameraPosition[0]; camFollow.y += boyfriend.cameraPosition[1]; - if (SONG.song.toLowerCase() == 'tutorial') - { - FlxTween.tween(FlxG.camera, {zoom: 1}, (Conductor.stepCrochet * 4 / 1000), {ease: FlxEase.elasticInOut}); + 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; + } + }); } } } + 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); @@ -2690,8 +2871,26 @@ class PlayState extends MusicBeatState var transitioning = false; - function endSong():Void + public function endSong():Void { + //Should kill you if you tried to cheat + if(!startingSong) { + notes.forEach(function(daNote:Note) { + if(daNote.strumTime < songLength - Conductor.safeZoneOffset) { + health -= 0.0475; + } + }); + for (daNote in unspawnNotes) { + if(daNote.strumTime < songLength - Conductor.safeZoneOffset) { + health -= 0.0475; + } + } + + if(doDeathCheck()) { + return; + } + } + timeBarBG.visible = false; timeBar.visible = false; timeTxt.visible = false; @@ -2703,111 +2902,135 @@ class PlayState extends MusicBeatState deathCounter = 0; seenCutscene = false; - KillNotes(); #if ACHIEVEMENTS_ALLOWED if(achievementObj != null) { return; } else { - var achieve:Int = checkForAchievement([1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 13, 14, 15]); - if(achieve > -1) { + var achieve:String = checkForAchievement(['week1_nomiss', 'week2_nomiss', 'week3_nomiss', 'week4_nomiss', + 'week5_nomiss', 'week6_nomiss', 'week7_nomiss', 'ur_bad', + 'ur_good', 'hype', 'two_keys', 'toastie', 'debugger']); + + if(achieve != null) { startAchievement(achieve); return; } } #end - callOnLuas('onEndSong', []); - 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 LUA_ALLOWED + var ret:Dynamic = callOnLuas('onEndSong', []); + #else + var ret:Dynamic = FunkinLua.Function_Continue; + #end - if (storyPlaylist.length <= 0) + if(ret != FunkinLua.Function_Stop && !transitioning) { + if (SONG.validScore) { - FlxG.sound.playMusic(Paths.music('freakyMenu')); - - transIn = FlxTransitionableState.defaultTransIn; - transOut = FlxTransitionableState.defaultTransOut; + #if !switch + var percent:Float = ratingPercent; + if(Math.isNaN(percent)) percent = 0; + Highscore.saveScore(SONG.song, songScore, storyDifficulty, percent); + #end + } - MusicBeatState.switchState(new StoryMenuState()); + if (isStoryMode) + { + campaignScore += songScore; + campaignMisses += songMisses; - // if () - StoryMenuState.weekUnlocked[Std.int(Math.min(storyWeek + 1, StoryMenuState.weekUnlocked.length - 1))] = true; + storyPlaylist.remove(storyPlaylist[0]); - if (SONG.validScore) + if (storyPlaylist.length <= 0) { - Highscore.saveWeekScore(WeekData.getCurrentWeekNumber(), campaignScore, storyDifficulty); - } + FlxG.sound.playMusic(Paths.music('freakyMenu')); - FlxG.save.data.weekUnlocked = StoryMenuState.weekUnlocked; - FlxG.save.flush(); - usedPractice = false; - changedDifficulty = false; - cpuControlled = false; - } - else - { - var difficulty:String = '' + CoolUtil.difficultyStuff[storyDifficulty][1]; + cancelFadeTween(); + CustomFadeTransition.nextCamera = camOther; + if(FlxTransitionableState.skipNextTransIn) { + CustomFadeTransition.nextCamera = null; + } + MusicBeatState.switchState(new StoryMenuState()); - trace('LOADING NEXT SONG'); - trace(PlayState.storyPlaylist[0].toLowerCase() + difficulty); + // if () + if(!usedPractice) { + StoryMenuState.weekCompleted.set(WeekData.weeksList[storyWeek], true); - var winterHorrorlandNext = (SONG.song.toLowerCase() == "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; + if (SONG.validScore) + { + Highscore.saveWeekScore(WeekData.getWeekFileName(), campaignScore, storyDifficulty); + } - FlxG.sound.play(Paths.sound('Lights_Shut_off')); + FlxG.save.data.weekCompleted = StoryMenuState.weekCompleted; + FlxG.save.flush(); + } + usedPractice = false; + changedDifficulty = false; + cpuControlled = false; } + else + { + var difficulty:String = '' + CoolUtil.difficultyStuff[storyDifficulty][1]; - FlxTransitionableState.skipNextTransIn = true; - FlxTransitionableState.skipNextTransOut = true; + trace('LOADING NEXT SONG'); + trace(Paths.formatToSongPath(PlayState.storyPlaylist[0]) + difficulty); - prevCamFollow = camFollow; - prevCamFollowPos = camFollowPos; + 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; - PlayState.SONG = Song.loadFromJson(PlayState.storyPlaylist[0].toLowerCase() + difficulty, PlayState.storyPlaylist[0]); - FlxG.sound.music.stop(); + FlxG.sound.play(Paths.sound('Lights_Shut_off')); + } + + FlxTransitionableState.skipNextTransIn = true; + FlxTransitionableState.skipNextTransOut = true; - if(winterHorrorlandNext) { - new FlxTimer().start(1.5, function(tmr:FlxTimer) { + prevCamFollow = camFollow; + prevCamFollowPos = camFollowPos; + + PlayState.SONG = Song.loadFromJson(PlayState.storyPlaylist[0] + difficulty, PlayState.storyPlaylist[0]); + FlxG.sound.music.stop(); + + if(winterHorrorlandNext) { + new FlxTimer().start(1.5, function(tmr:FlxTimer) { + cancelFadeTween(); + //resetSpriteCache = true; + LoadingState.loadAndSwitchState(new PlayState()); + }); + } else { + cancelFadeTween(); + //resetSpriteCache = true; LoadingState.loadAndSwitchState(new PlayState()); - }); - } else { - LoadingState.loadAndSwitchState(new PlayState()); + } } } - } - else - { - trace('WENT BACK TO FREEPLAY??'); - MusicBeatState.switchState(new FreeplayState()); - FlxG.sound.playMusic(Paths.music('freakyMenu')); - usedPractice = false; - changedDifficulty = false; - cpuControlled = false; + 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:Int) { + function startAchievement(achieve:String) { achievementObj = new AchievementObject(achieve, camOther); achievementObj.onFinish = achievementEnd; add(achievementObj); @@ -2822,7 +3045,7 @@ class PlayState extends MusicBeatState } #end - private function KillNotes() { + public function KillNotes() { while(notes.length > 0) { var daNote:Note = notes.members[0]; daNote.active = false; @@ -2855,12 +3078,12 @@ class PlayState extends MusicBeatState var daRating:String = "sick"; - if (noteDiff > Conductor.safeZoneOffset * 0.9) + if (noteDiff > Conductor.safeZoneOffset * 0.75) { daRating = 'shit'; score = 50; } - else if (noteDiff > Conductor.safeZoneOffset * 0.75) + else if (noteDiff > Conductor.safeZoneOffset * 0.5) { daRating = 'bad'; score = 100; @@ -2871,7 +3094,7 @@ class PlayState extends MusicBeatState score = 200; } - if(daRating == 'sick') + if(daRating == 'sick' && !note.noteSplashDisabled) { spawnNoteSplashOnNote(note); } @@ -2903,9 +3126,9 @@ class PlayState extends MusicBeatState var pixelShitPart1:String = ""; var pixelShitPart2:String = ''; - if (curStage.startsWith('school')) + if (PlayState.isPixelStage) { - pixelShitPart1 = 'weeb/pixelUI/'; + pixelShitPart1 = 'pixelUI/'; pixelShitPart2 = '-pixel'; } @@ -2928,7 +3151,7 @@ class PlayState extends MusicBeatState comboSpr.velocity.x += FlxG.random.int(1, 10); add(rating); - if (!curStage.startsWith('school')) + if (!PlayState.isPixelStage) { rating.setGraphicSize(Std.int(rating.width * 0.7)); rating.antialiasing = ClientPrefs.globalAntialiasing; @@ -2946,8 +3169,11 @@ class PlayState extends MusicBeatState var seperatedScore:Array = []; - seperatedScore.push(Math.floor(combo / 100)); - seperatedScore.push(Math.floor((combo - (seperatedScore[0] * 100)) / 10)); + 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; @@ -2958,7 +3184,7 @@ class PlayState extends MusicBeatState numScore.x = coolText.x + (43 * daLoop) - 90; numScore.y += 80; - if (!curStage.startsWith('school')) + if (!PlayState.isPixelStage) { numScore.antialiasing = ClientPrefs.globalAntialiasing; numScore.setGraphicSize(Std.int(numScore.width * 0.5)); @@ -3009,10 +3235,9 @@ class PlayState extends MusicBeatState }, startDelay: Conductor.crochet * 0.001 }); - - curSection += 1; } + #if mobileC // stupid way to fix keyshit for mobile bruh private function keyShit():Void { // HOLDING @@ -3045,11 +3270,17 @@ class PlayState extends MusicBeatState } }); - #if ACHIEVEMENTS_ALLOWED + /*#if ACHIEVEMENTS_ALLOWED var achieve:Int = checkForAchievement([11]); if(achieve > -1) { startAchievement(achieve); } + #end*/ + #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')) { @@ -3060,7 +3291,7 @@ class PlayState extends MusicBeatState if(!ClientPrefs.ghostTapping) boyfriend.holdTimer = 0; - var canMiss:Bool = !ClientPrefs.ghostTapping; + //var canMiss:Bool = !ClientPrefs.ghostTapping; // temp var notesHitArray:Array = []; var notesDatas:Array = []; @@ -3081,7 +3312,7 @@ class PlayState extends MusicBeatState notesHitArray.push(daNote); notesDatas.push(daNote.noteData); } - canMiss = true; + //canMiss = true; // temp } }); @@ -3098,11 +3329,11 @@ class PlayState extends MusicBeatState else if (notesHitArray.length > 0) { for (i in 0...controlArray.length) { if(controlArray[i] && notesDatas.indexOf(i) == -1) { - if(canMiss) { + /*if(canMiss) { noteMiss(i); callOnLuas('noteMissPress', [i]); break; - } + }*/ // temp } } for (i in 0...notesHitArray.length) { @@ -3113,9 +3344,8 @@ class PlayState extends MusicBeatState boyfriend.holdTimer = 0; } } - } else if(canMiss) { - badNoteHit(); - } + } /*else if (canMiss) + ghostMiss(controlArray[i], i, true);*/ for (i in 0...keysPressed.length) { if(!keysPressed[i] && controlArray[i]) keysPressed[i] = true; @@ -3135,18 +3365,169 @@ class PlayState extends MusicBeatState } }); } + #else + private function keyShit():Void + { + // HOLDING + var up = controls.NOTE_UP; + var right = controls.NOTE_RIGHT; + var down = controls.NOTE_DOWN; + var left = controls.NOTE_LEFT; + + var upP = controls.NOTE_UP_P; + var rightP = controls.NOTE_RIGHT_P; + var downP = controls.NOTE_DOWN_P; + var leftP = controls.NOTE_LEFT_P; + + var upR = controls.NOTE_UP_R; + var rightR = controls.NOTE_RIGHT_R; + var downR = controls.NOTE_DOWN_R; + var leftR = controls.NOTE_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; + } + }); + } + #end + + function ghostMiss(statement:Bool = false, direction:Int = 0, ?ghostMiss:Bool = false) { + if (statement) { + noteMissPress(direction, ghostMiss); + callOnLuas('noteMissPress', [direction]); + } + } - function badNoteHit():Void { - var controlArray:Array = [controls.NOTE_LEFT_P, controls.NOTE_DOWN_P, controls.NOTE_UP_P, controls.NOTE_RIGHT_P]; - for (i in 0...controlArray.length) { - if(controlArray[i]) { - noteMiss(i); - callOnLuas('noteMissPress', [i]); + 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; + RecalculateRating(); + + var animToPlay:String = ''; + switch (Math.abs(daNote.noteData) % 4) + { + case 0: + animToPlay = 'singLEFTmiss'; + case 1: + animToPlay = 'singDOWNmiss'; + case 2: + animToPlay = 'singUPmiss'; + case 3: + animToPlay = 'singRIGHTmiss'; } + + if(daNote.noteType == 'GF Sing') { + gf.playAnim(animToPlay, true); + } else { + var daAlt = ''; + if(daNote.noteType == 'Alt Animation') daAlt = '-alt'; + + boyfriend.playAnim(animToPlay + daAlt, true); + } + callOnLuas('noteMiss', [notes.members.indexOf(daNote), daNote.noteData, daNote.noteType, daNote.isSustainNote]); } - function noteMiss(direction:Int = 1):Void + 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) { @@ -3158,7 +3539,10 @@ class PlayState extends MusicBeatState combo = 0; if(!practiceMode) songScore -= 10; - if(!endingSong) songMisses++; + if(!endingSong) { + if(ghostMiss) ghostMisses++; + songMisses++; + } RecalculateRating(); FlxG.sound.play(Paths.soundRandom('missnote', 1, 3), FlxG.random.float(0.1, 0.2)); @@ -3192,65 +3576,44 @@ class PlayState extends MusicBeatState { if (!note.wasGoodHit) { - switch(note.noteType) { - case 3: //Hurt note - if(cpuControlled) return; + if(cpuControlled && (note.ignoreNote || note.hitCausesMiss)) return; - if(!boyfriend.stunned) - { - noteMiss(note.noteData); - if(!endingSong) - { - --songMisses; - RecalculateRating(); - if(!note.isSustainNote) { - health -= 0.26; //0.26 + 0.04 = -0.3 (-15%) of HP if you hit a hurt note - spawnNoteSplashOnNote(note); - } - else health -= 0.06; //0.06 + 0.04 = -0.1 (-5%) of HP if you hit a hurt sustain note - - if(boyfriend.animation.getByName('hurt') != null) { - boyfriend.playAnim('hurt', true); - boyfriend.specialAnim = true; - } - } - - note.wasGoodHit = true; - vocals.volume = 0; + if(note.hitCausesMiss) { + noteMiss(note); + if(!note.noteSplashDisabled && !note.isSustainNote) { + spawnNoteSplashOnNote(note); + } - if (!note.isSustainNote) - { - note.kill(); - notes.remove(note, true); - note.destroy(); + switch(note.noteType) { + case 'Hurt Note': //Hurt note + if(boyfriend.animation.getByName('hurt') != null) { + boyfriend.playAnim('hurt', true); + boyfriend.specialAnim = true; } - } - return; + } + + 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.noteData >= 0) - health += 0.023; - else - health += 0.004; - - if(note.noteType == 2) { - boyfriend.playAnim('hey', true); - boyfriend.specialAnim = true; - boyfriend.heyTimer = 0.6; - - gf.playAnim('cheer', true); - gf.specialAnim = true; - gf.heyTimer = 0.6; - } else { + if(!note.noAnimation) { var daAlt = ''; - if(note.noteType == 1) daAlt = '-alt'; - + if(note.noteType == 'Alt Animation') daAlt = '-alt'; + var animToPlay:String = ''; switch (Std.int(Math.abs(note.noteData))) { @@ -3263,7 +3626,28 @@ class PlayState extends MusicBeatState case 3: animToPlay = 'singRIGHT'; } - boyfriend.playAnim(animToPlay + daAlt, true); + + 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; + boyfriend.heyTimer = 0.6; + } + + if(gf.animOffsets.exists('cheer')) { + gf.playAnim('cheer', true); + gf.specialAnim = true; + gf.heyTimer = 0.6; + } + } } if(cpuControlled) { @@ -3281,28 +3665,20 @@ class PlayState extends MusicBeatState } }); } - 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 = note.noteData; - var leType:Int = note.noteType; + 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) { - if(cpuControlled) { - boyfriend.holdTimer = 0; - } note.kill(); notes.remove(note, true); note.destroy(); - } else if(cpuControlled) { - var targetHold:Float = Conductor.stepCrochet * 0.001 * boyfriend.singDuration; - if(boyfriend.holdTimer + 0.2 > targetHold) { - boyfriend.holdTimer = targetHold - 0.2; - } } - callOnLuas('goodNoteHit', [leData, leType, isSus]); } } @@ -3310,14 +3686,27 @@ class PlayState extends MusicBeatState if(ClientPrefs.noteSplashes && note != null) { var strum:StrumNote = playerStrums.members[note.noteData]; if(strum != null) { - spawnNoteSplash(strum.x, strum.y, note.noteData, note.noteType); + spawnNoteSplash(strum.x, strum.y, note.noteData, note); } } } - public function spawnNoteSplash(x:Float, y:Float, data:Int, type:Int) { + 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, type); + splash.setupNoteSplash(x, y, data, skin, hue, sat, brt); grpNoteSplashes.add(splash); } @@ -3331,15 +3720,18 @@ class PlayState extends MusicBeatState 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; - new FlxTimer().start(2, function(tmr:FlxTimer) + carTimer = new FlxTimer().start(2, function(tmr:FlxTimer) { resetFastCar(); + carTimer = null; }); } @@ -3426,8 +3818,8 @@ class PlayState extends MusicBeatState } if(ClientPrefs.flashing) { - halloweenWhite.alpha = 0.45; - FlxTween.tween(halloweenWhite, {alpha: 0.6}, 0.075); + halloweenWhite.alpha = 0.4; + FlxTween.tween(halloweenWhite, {alpha: 0.5}, 0.075); FlxTween.tween(halloweenWhite, {alpha: 0}, 0.25, {startDelay: 0.15}); } } @@ -3445,8 +3837,8 @@ class PlayState extends MusicBeatState #if ACHIEVEMENTS_ALLOWED Achievements.henchmenDeath++; - var achieve:Int = checkForAchievement([10]); - if(achieve > -1) { + var achieve:String = checkForAchievement(['roadkill_enthusiast']); + if (achieve != null) { startAchievement(achieve); } else { FlxG.save.data.henchmenDeath = Achievements.henchmenDeath; @@ -3472,14 +3864,30 @@ class PlayState extends MusicBeatState } } + 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() { @@ -3532,6 +3940,10 @@ class PlayState extends MusicBeatState } // 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; @@ -3544,21 +3956,21 @@ class PlayState extends MusicBeatState iconP1.updateHitbox(); iconP2.updateHitbox(); - if (curBeat % gfSpeed == 0 && !gf.stunned) + 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.startsWith("sing") && !boyfriend.specialAnim) + if (boyfriend.animation.curAnim.name != null && !boyfriend.animation.curAnim.name.startsWith("sing")) { boyfriend.dance(); } - if (!dad.animation.curAnim.name.startsWith("sing") && !dad.stunned) + if (dad.animation.curAnim.name != null && !dad.animation.curAnim.name.startsWith("sing") && !dad.stunned) { dad.dance(); } - } else if(dad.danceIdle && !dad.curCharacter.startsWith('gf') && !dad.animation.curAnim.name.startsWith("sing") && !dad.stunned) { + } else if(dad.danceIdle && dad.animation.curAnim.name != null && !dad.curCharacter.startsWith('gf') && !dad.animation.curAnim.name.startsWith("sing") && !dad.stunned) { dad.dance(); } @@ -3623,19 +4035,23 @@ class PlayState extends MusicBeatState 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) { @@ -3657,11 +4073,12 @@ class PlayState extends MusicBeatState public function RecalculateRating() { setOnLuas('score', songScore); setOnLuas('misses', songMisses); + setOnLuas('ghostMisses', songMisses); setOnLuas('hits', songHits); var ret:Dynamic = callOnLuas('onRecalculateRating', []); if(ret != FunkinLua.Function_Stop) { - ratingPercent = songScore / ((songHits + songMisses) * 350); + ratingPercent = songScore / ((songHits + songMisses - ghostMisses) * 350); if(!Math.isNaN(ratingPercent) && ratingPercent < 0) ratingPercent = 0; if(Math.isNaN(ratingPercent)) { @@ -3684,42 +4101,56 @@ class PlayState extends MusicBeatState } #if ACHIEVEMENTS_ALLOWED - private function checkForAchievement(arrayIDs:Array):Int { - for (i in 0...arrayIDs.length) { - if(!Achievements.achievementsUnlocked[arrayIDs[i]][1]) { - switch(arrayIDs[i]) { - case 1 | 2 | 3 | 4 | 5 | 6 | 7: - if(isStoryMode && campaignMisses + songMisses < 1 && CoolUtil.difficultyString() == 'Hard' && - storyPlaylist.length <= 1 && WeekData.getCurrentWeekNumber() == arrayIDs[i] && !changedDifficulty && !usedPractice) { - Achievements.unlockAchievement(arrayIDs[i]); - return arrayIDs[i]; + 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 8: + case 'ur_bad': if(ratingPercent < 0.2 && !practiceMode && !cpuControlled) { - Achievements.unlockAchievement(arrayIDs[i]); - return arrayIDs[i]; + unlock = true; } - case 9: + case 'ur_good': if(ratingPercent >= 1 && !usedPractice && !cpuControlled) { - Achievements.unlockAchievement(arrayIDs[i]); - return arrayIDs[i]; + unlock = true; } - case 10: + case 'roadkill_enthusiast': if(Achievements.henchmenDeath >= 100) { - Achievements.unlockAchievement(arrayIDs[i]); - return arrayIDs[i]; + unlock = true; } - case 11: + case 'oversinging': if(boyfriend.holdTimer >= 20 && !usedPractice) { - Achievements.unlockAchievement(arrayIDs[i]); - return arrayIDs[i]; + unlock = true; } - case 12: + case 'hype': if(!boyfriendIdled && !usedPractice) { - Achievements.unlockAchievement(arrayIDs[i]); - return arrayIDs[i]; + unlock = true; } - case 13: + case 'two_keys': if(!usedPractice) { var howManyPresses:Int = 0; for (j in 0...keysPressed.length) { @@ -3727,24 +4158,26 @@ class PlayState extends MusicBeatState } if(howManyPresses <= 2) { - Achievements.unlockAchievement(arrayIDs[i]); - return arrayIDs[i]; + unlock = true; } } - case 14: - if(ClientPrefs.framerate <= 60 && ClientPrefs.lowQuality && !ClientPrefs.globalAntialiasing && !ClientPrefs.imagesPersist) { - Achievements.unlockAchievement(arrayIDs[i]); - return arrayIDs[i]; + case 'toastie': + if(/*ClientPrefs.framerate <= 60 &&*/ ClientPrefs.lowQuality && !ClientPrefs.globalAntialiasing && !ClientPrefs.imagesPersist) { + unlock = true; } - case 15: - if(SONG.song.toLowerCase() == 'test' && !usedPractice) { - Achievements.unlockAchievement(arrayIDs[i]); - return arrayIDs[i]; + case 'debugger': + if(Paths.formatToSongPath(SONG.song) == 'test' && !usedPractice) { + unlock = true; } } + + if(unlock) { + Achievements.unlockAchievement(achievementName); + return achievementName; + } } } - return -1; + return null; } #end diff --git a/source/ResetScoreSubState.hx b/source/ResetScoreSubState.hx index d6adad513..9305fede3 100644 --- a/source/ResetScoreSubState.hx +++ b/source/ResetScoreSubState.hx @@ -28,12 +28,8 @@ class ResetScoreSubState extends MusicBeatSubstate super(); var name:String = song; - if(week != -1) { - name = 'Week ' + WeekData.getWeekNumber(week); - var leName:String = WeekData.weekResetName[week]; - if(leName != null) { - name = leName; - } + if(week > -1) { + name = WeekData.weeksLoaded.get(WeekData.weeksList[week]).weekName; } name += ' (' + CoolUtil.difficultyStuff[difficulty][0] + ')?'; @@ -72,8 +68,6 @@ class ResetScoreSubState extends MusicBeatSubstate noText.x += 200; add(noText); updateOptions(); - - addVirtualPad(FULL, A_B); } override function update(elapsed:Float) @@ -100,7 +94,7 @@ class ResetScoreSubState extends MusicBeatSubstate if(week == -1) { Highscore.resetSong(song, difficulty); } else { - Highscore.resetWeek(week, difficulty); + Highscore.resetWeek(WeekData.weeksList[week], difficulty); } } FlxG.sound.play(Paths.sound('cancelMenu'), 1); diff --git a/source/Song.hx b/source/Song.hx index f7c00eee1..479c1423e 100644 --- a/source/Song.hx +++ b/source/Song.hx @@ -5,6 +5,11 @@ import haxe.Json; import haxe.format.JsonParser; import lime.utils.Assets; +#if sys +import sys.io.File; +import sys.FileSystem; +#end + using StringTools; typedef SwagSong = @@ -18,6 +23,7 @@ typedef SwagSong = var player1:String; var player2:String; var player3:String; + var stage:String; var arrowSkin:String; var splashSkin:String; @@ -33,6 +39,7 @@ class Song public var arrowSkin:String; public var splashSkin:String; public var speed:Float = 1; + public var stage:String; public var player1:String = 'bf'; public var player2:String = 'dad'; @@ -47,15 +54,23 @@ class Song public static function loadFromJson(jsonInput:String, ?folder:String):SwagSong { - var rawJson; - if(jsonInput == 'events') { //Makes the game not crash while trying to load an events chart, doesn't work on HTML tho - #if sys - rawJson = sys.io.File.getContent(Paths.json(folder.toLowerCase() + '/events')).trim(); + var rawJson = null; + + var formattedFolder:String = Paths.formatToSongPath(folder); + var formattedSong:String = Paths.formatToSongPath(jsonInput); + #if dontUseManifest + var moddyFile:String = Paths.modsJson(formattedFolder + '/' + formattedSong); + if(FileSystem.exists(moddyFile)) { + rawJson = File.getContent(moddyFile).trim(); + } + #end + + if(rawJson == null) { + #if dontUseManifest + rawJson = File.getContent(Paths.json(formattedFolder + '/' + formattedSong)).trim(); #else - rawJson = Assets.getText(Paths.json(folder.toLowerCase() + '/events')).trim(); + rawJson = Assets.getText(Paths.json(formattedFolder + '/' + formattedSong)).trim(); #end - } else { - rawJson = Assets.getText(Paths.json(folder.toLowerCase() + '/' + jsonInput.toLowerCase())).trim(); } while (!rawJson.endsWith("}")) @@ -80,7 +95,9 @@ class Song daSong = songData.song; daBpm = songData.bpm; */ - return parseJSONshit(rawJson); + var songJson:SwagSong = parseJSONshit(rawJson); + if(jsonInput != 'events') StageData.loadDirectory(songJson); + return songJson; } public static function parseJSONshit(rawJson:String):SwagSong diff --git a/source/StageData.hx b/source/StageData.hx new file mode 100644 index 000000000..4569ad0de --- /dev/null +++ b/source/StageData.hx @@ -0,0 +1,85 @@ +package; + +#if dontUseManifest +import sys.io.File; +import sys.FileSystem; +#else +import openfl.utils.Assets; +#end +import haxe.Json; +import haxe.format.JsonParser; +import Song; + +using StringTools; + +typedef StageFile = { + var directory:String; + var defaultZoom:Float; + var isPixelStage:Bool; + + var boyfriend:Array; + var girlfriend:Array; + var opponent:Array; +} + +class StageData { + public static var forceNextDirectory:String = null; + public static function loadDirectory(SONG:SwagSong) { + var stage:String = ''; + if(SONG.stage != null) { + stage = SONG.stage; + } else if(SONG.song != null) { + switch (SONG.song.toLowerCase().replace(' ', '-')) + { + case 'spookeez' | 'south' | 'monster': + stage = 'spooky'; + case 'pico' | 'blammed' | 'philly' | 'philly-nice': + stage = 'philly'; + case 'milf' | 'satin-panties' | 'high': + stage = 'limo'; + case 'cocoa' | 'eggnog': + stage = 'mall'; + case 'winter-horrorland': + stage = 'mallEvil'; + case 'senpai' | 'roses': + stage = 'school'; + case 'thorns': + stage = 'schoolEvil'; + default: + stage = 'stage'; + } + } else { + stage = 'stage'; + } + + var stageFile:StageFile = getStageFile(stage); + if(stageFile == null) { //preventing crashes + forceNextDirectory = ''; + } else { + forceNextDirectory = stageFile.directory; + } + } + + public static function getStageFile(stage:String):StageFile { + var rawJson:String = null; + var path:String = Paths.getPreloadPath('stages/' + stage + '.json'); + + #if dontUseManifest + var modPath:String = Paths.modFolders('stages/' + stage + '.json'); + if(FileSystem.exists(modPath)) { + rawJson = File.getContent(modPath); + } else if(FileSystem.exists(path)) { + rawJson = File.getContent(path); + } + #else + if(Assets.exists(path)) { + rawJson = Assets.getText(path); + } + #end + else + { + return null; + } + return cast Json.parse(rawJson); + } +} \ No newline at end of file diff --git a/source/StoryMenuState.hx b/source/StoryMenuState.hx index 596fdda02..c453dab03 100644 --- a/source/StoryMenuState.hx +++ b/source/StoryMenuState.hx @@ -16,6 +16,7 @@ import flixel.tweens.FlxTween; import flixel.util.FlxColor; import flixel.util.FlxTimer; import lime.net.curl.CURLCode; +import WeekData; using StringTools; @@ -25,50 +26,8 @@ class StoryMenuState extends MusicBeatState // Not recommended, as people usually download your mod for, you know, // playing just the modded week then delete it. // defaults to True - public static var weekUnlocked:Array = [ - true, //Tutorial - true, //Week 1 - true, //Week 2 - true, //Week 3 - true, //Week 4 - true, //Week 5 - true //Week 6 - ]; - - //It works like this: - // ['Left character', 'Center character', 'Right character'] - var weekCharacters:Array = [ - ['dad', 'bf', 'gf'], - ['dad', 'bf', 'gf'], - ['spooky', 'bf', 'gf'], - ['pico', 'bf', 'gf'], - ['mom', 'bf', 'gf'], - ['parents-christmas', 'bf', 'gf'], - ['senpai', 'bf', 'gf'] - ]; - - //The week's name, displayed on top-right - var weekNames:Array = [ - "", - "Daddy Dearest", - "Spooky Month", - "PICO", - "MOMMY MUST MURDER", - "RED SNOW", - "hating simulator ft. moawling" - ]; - - //Background asset name, the background files are stored on assets/preload/menubackgrounds/ - var weekBackground:Array = [ - 'stage', - 'stage', - 'halloween', - 'philly', - 'limo', - 'christmas', - 'school' - ]; - + public static var weekCompleted:Map = new Map(); + var scoreText:FlxText; private static var curDifficulty:Int = 1; @@ -92,9 +51,11 @@ class StoryMenuState extends MusicBeatState override function create() { - transIn = FlxTransitionableState.defaultTransIn; - transOut = FlxTransitionableState.defaultTransOut; - + #if MODS_ALLOWED + Paths.destroyLoadedImages(); + #end + WeekData.reloadWeekFiles(true); + if(curWeek >= WeekData.weeksList.length) curWeek = 0; persistentUpdate = persistentDraw = true; scoreText = new FlxText(10, 10, 0, "SCORE: 49324858", 36); @@ -111,6 +72,7 @@ class StoryMenuState extends MusicBeatState rankText.screenCenter(X); var ui_tex = Paths.getSparrowAtlas('campaign_menu_UI_assets'); + var bgYellow:FlxSprite = new FlxSprite(0, 56).makeGraphic(FlxG.width, 386, 0xFFF9CF51); bgSprite = new FlxSprite(0, 56); bgSprite.antialiasing = ClientPrefs.globalAntialiasing; @@ -130,9 +92,10 @@ class StoryMenuState extends MusicBeatState DiscordClient.changePresence("In the Menus", null); #end - for (i in 0...WeekData.songsNames.length) + for (i in 0...WeekData.weeksList.length) { - var weekThing:MenuItem = new MenuItem(0, bgSprite.y + 396, i); + WeekData.setDirectoryFromWeek(WeekData.weeksLoaded.get(WeekData.weeksList[i])); + var weekThing:MenuItem = new MenuItem(0, bgSprite.y + 396, WeekData.weeksList[i]); weekThing.y += ((weekThing.height + 20) * i); weekThing.targetY = i; grpWeekText.add(weekThing); @@ -142,7 +105,7 @@ class StoryMenuState extends MusicBeatState // weekThing.updateHitbox(); // Needs an offset thingie - if (i < weekUnlocked.length && !weekUnlocked[i]) + if (weekIsLocked(i)) { var lock:FlxSprite = new FlxSprite(weekThing.width + 10 + weekThing.x); lock.frames = ui_tex; @@ -154,11 +117,12 @@ class StoryMenuState extends MusicBeatState } } + WeekData.setDirectoryFromWeek(WeekData.weeksLoaded.get(WeekData.weeksList[0])); + var charArray:Array = WeekData.weeksLoaded.get(WeekData.weeksList[0]).weekCharacters; for (char in 0...3) { - var weekCharacterThing:MenuCharacter = new MenuCharacter((FlxG.width * 0.25) * (1 + char) - 150, weekCharacters[0][char]); + var weekCharacterThing:MenuCharacter = new MenuCharacter((FlxG.width * 0.25) * (1 + char) - 150, charArray[char]); weekCharacterThing.y += 70; - weekCharacterThing.antialiasing = ClientPrefs.globalAntialiasing; grpWeekCharacters.add(weekCharacterThing); } @@ -196,10 +160,11 @@ class StoryMenuState extends MusicBeatState rightArrow.antialiasing = ClientPrefs.globalAntialiasing; difficultySelectors.add(rightArrow); + add(bgYellow); add(bgSprite); add(grpWeekCharacters); - var tracksSprite:FlxSprite = new FlxSprite(FlxG.width * 0.07, bgSprite.y + 435).loadGraphic(Paths.image('Menu_Tracks')); + var tracksSprite:FlxSprite = new FlxSprite(FlxG.width * 0.07, bgSprite.y + 425).loadGraphic(Paths.image('Menu_Tracks')); tracksSprite.antialiasing = ClientPrefs.globalAntialiasing; add(tracksSprite); @@ -235,12 +200,7 @@ class StoryMenuState extends MusicBeatState // FlxG.watch.addQuick('font', scoreText.font); - difficultySelectors.visible = weekUnlocked[curWeek]; - - grpLocks.forEach(function(lock:FlxSprite) - { - lock.y = grpWeekText.members[lock.ID].y; - }); + difficultySelectors.visible = !weekIsLocked(curWeek); if (!movedBack && !selectedWeek) { @@ -291,6 +251,11 @@ class StoryMenuState extends MusicBeatState } super.update(elapsed); + + grpLocks.forEach(function(lock:FlxSprite) + { + lock.y = grpWeekText.members[lock.ID].y; + }); } var movedBack:Bool = false; @@ -299,25 +264,25 @@ class StoryMenuState extends MusicBeatState function selectWeek() { - if (curWeek >= weekUnlocked.length || weekUnlocked[curWeek]) + if (!weekIsLocked(curWeek)) { if (stopspamming == false) { FlxG.sound.play(Paths.sound('confirmMenu')); grpWeekText.members[curWeek].startFlashing(); - grpWeekCharacters.members[1].animation.play('confirm'); + if(grpWeekCharacters.members[1].character != '') grpWeekCharacters.members[1].animation.play('confirm'); stopspamming = true; } // We can't use Dynamic Array .copy() because that crashes HTML5, here's a workaround. var songArray:Array = []; - var leWeek:Array = WeekData.songsNames[curWeek]; + var leWeek:Array = WeekData.weeksLoaded.get(WeekData.weeksList[curWeek]).songs; for (i in 0...leWeek.length) { - songArray.push(leWeek[i]); + songArray.push(leWeek[i][0]); } - // I'm a motherfucking genious + // Nevermind that's stupid lmao PlayState.storyPlaylist = songArray; PlayState.isStoryMode = true; selectedWeek = true; @@ -336,6 +301,8 @@ class StoryMenuState extends MusicBeatState LoadingState.loadAndSwitchState(new PlayState(), true); FreeplayState.destroyFreeplayVocals(); }); + } else { + FlxG.sound.play(Paths.sound('cancelMenu')); } } @@ -359,7 +326,7 @@ class StoryMenuState extends MusicBeatState }); #if !switch - intendedScore = Highscore.getWeekScore(WeekData.getWeekNumber(curWeek), curDifficulty); + intendedScore = Highscore.getWeekScore(WeekData.weeksList[curWeek], curDifficulty); #end } @@ -370,16 +337,15 @@ class StoryMenuState extends MusicBeatState { curWeek += change; - if (curWeek >= WeekData.songsNames.length) + if (curWeek >= WeekData.weeksList.length) curWeek = 0; if (curWeek < 0) - curWeek = WeekData.songsNames.length - 1; + curWeek = WeekData.weeksList.length - 1; - var leName:String = ''; - if(curWeek < weekNames.length) { - leName = weekNames[curWeek]; - } + var leWeek:WeekData = WeekData.weeksLoaded.get(WeekData.weeksList[curWeek]); + WeekData.setDirectoryFromWeek(leWeek); + var leName:String = leWeek.storyName; txtWeekTitle.text = leName.toUpperCase(); txtWeekTitle.x = FlxG.width - (txtWeekTitle.width + 10); @@ -388,30 +354,40 @@ class StoryMenuState extends MusicBeatState for (item in grpWeekText.members) { item.targetY = bullShit - curWeek; - if (item.targetY == Std.int(0) && weekUnlocked[curWeek]) + if (item.targetY == Std.int(0) && !weekIsLocked(curWeek)) item.alpha = 1; else item.alpha = 0.6; bullShit++; } - var assetName:String = weekBackground[0]; - if(curWeek < weekBackground.length) assetName = weekBackground[curWeek]; - - bgSprite.loadGraphic(Paths.image('menubackgrounds/menu_' + assetName)); + bgSprite.visible = true; + var assetName:String = leWeek.weekBackground; + if(assetName == null || assetName.length < 1) { + bgSprite.visible = false; + } else { + bgSprite.loadGraphic(Paths.image('menubackgrounds/menu_' + assetName)); + } updateText(); } + function weekIsLocked(weekNum:Int) { + var leWeek:WeekData = WeekData.weeksLoaded.get(WeekData.weeksList[weekNum]); + return (!leWeek.startUnlocked && leWeek.weekBefore.length > 0 && (!weekCompleted.exists(leWeek.weekBefore) || !weekCompleted.get(leWeek.weekBefore))); + } + function updateText() { - var weekArray:Array = weekCharacters[0]; - if(curWeek < weekCharacters.length) weekArray = weekCharacters[curWeek]; - + var weekArray:Array = WeekData.weeksLoaded.get(WeekData.weeksList[curWeek]).weekCharacters; for (i in 0...grpWeekCharacters.length) { grpWeekCharacters.members[i].changeCharacter(weekArray[i]); } - var stringThing:Array = WeekData.songsNames[curWeek]; + var leWeek:WeekData = WeekData.weeksLoaded.get(WeekData.weeksList[curWeek]); + var stringThing:Array = []; + for (i in 0...leWeek.songs.length) { + stringThing.push(leWeek.songs[i][0]); + } txtTracklist.text = ''; for (i in 0...stringThing.length) @@ -419,14 +395,13 @@ class StoryMenuState extends MusicBeatState txtTracklist.text += stringThing[i] + '\n'; } - txtTracklist.text = StringTools.replace(txtTracklist.text, '-', ' '); txtTracklist.text = txtTracklist.text.toUpperCase(); txtTracklist.screenCenter(X); txtTracklist.x -= FlxG.width * 0.35; #if !switch - intendedScore = Highscore.getWeekScore(WeekData.getWeekNumber(curWeek), curDifficulty); + intendedScore = Highscore.getWeekScore(WeekData.weeksList[curWeek], curDifficulty); #end } } diff --git a/source/StrumNote.hx b/source/StrumNote.hx index c0c38fc37..88d623071 100644 --- a/source/StrumNote.hx +++ b/source/StrumNote.hx @@ -1,5 +1,6 @@ package; +import flixel.FlxG; import flixel.FlxSprite; import flixel.graphics.frames.FlxAtlasFrames; @@ -11,11 +12,95 @@ class StrumNote extends FlxSprite public var resetAnim:Float = 0; private var noteData:Int = 0; - public function new(x:Float, y:Float, leData:Int) { + private var player:Int; + + public function new(x:Float, y:Float, leData:Int, player:Int) { colorSwap = new ColorSwap(); shader = colorSwap.shader; noteData = leData; + this.player = player; + this.noteData = leData; super(x, y); + + var skin:String = 'NOTE_assets'; + if(PlayState.SONG.arrowSkin != null && PlayState.SONG.arrowSkin.length > 1) skin = PlayState.SONG.arrowSkin; + + if(PlayState.isPixelStage) + { + loadGraphic(Paths.image('pixelUI/' + skin)); + width = width / 4; + height = height / 5; + loadGraphic(Paths.image('pixelUI/' + skin), true, Math.floor(width), Math.floor(height)); + animation.add('green', [6]); + animation.add('red', [7]); + animation.add('blue', [5]); + animation.add('purple', [4]); + + antialiasing = false; + setGraphicSize(Std.int(width * PlayState.daPixelZoom)); + + switch (Math.abs(leData)) + { + case 0: + animation.add('static', [0]); + animation.add('pressed', [4, 8], 12, false); + animation.add('confirm', [12, 16], 24, false); + case 1: + animation.add('static', [1]); + animation.add('pressed', [5, 9], 12, false); + animation.add('confirm', [13, 17], 24, false); + case 2: + animation.add('static', [2]); + animation.add('pressed', [6, 10], 12, false); + animation.add('confirm', [14, 18], 12, false); + case 3: + animation.add('static', [3]); + animation.add('pressed', [7, 11], 12, false); + animation.add('confirm', [15, 19], 24, false); + } + } + else + { + frames = Paths.getSparrowAtlas(skin); + animation.addByPrefix('green', 'arrowUP'); + animation.addByPrefix('blue', 'arrowDOWN'); + animation.addByPrefix('purple', 'arrowLEFT'); + animation.addByPrefix('red', 'arrowRIGHT'); + + antialiasing = ClientPrefs.globalAntialiasing; + setGraphicSize(Std.int(width * 0.7)); + + switch (Math.abs(leData)) + { + case 0: + animation.addByPrefix('static', 'arrowLEFT'); + animation.addByPrefix('pressed', 'left press', 24, false); + animation.addByPrefix('confirm', 'left confirm', 24, false); + case 1: + animation.addByPrefix('static', 'arrowDOWN'); + animation.addByPrefix('pressed', 'down press', 24, false); + animation.addByPrefix('confirm', 'down confirm', 24, false); + case 2: + animation.addByPrefix('static', 'arrowUP'); + animation.addByPrefix('pressed', 'up press', 24, false); + animation.addByPrefix('confirm', 'up confirm', 24, false); + case 3: + animation.addByPrefix('static', 'arrowRIGHT'); + animation.addByPrefix('pressed', 'right press', 24, false); + animation.addByPrefix('confirm', 'right confirm', 24, false); + } + } + + updateHitbox(); + scrollFactor.set(); + } + + public function postAddedToGroup() { + playAnim('static'); + x += Note.swagWidth * noteData; + x += 50; + x += ((FlxG.width / 2) * player); + ID = noteData; } override function update(elapsed:Float) { @@ -26,6 +111,10 @@ class StrumNote extends FlxSprite resetAnim = 0; } } + + /*if(animation.curAnim.name == 'confirm' && !PlayState.isPixelStage) { + updateConfirmOffset(); + }*/ super.update(elapsed); } @@ -33,7 +122,7 @@ class StrumNote extends FlxSprite public function playAnim(anim:String, ?force:Bool = false) { animation.play(anim, force); centerOffsets(); - if(animation.curAnim.name == 'static') { + if(animation.curAnim == null || animation.curAnim.name == 'static') { colorSwap.hue = 0; colorSwap.saturation = 0; colorSwap.brightness = 0; @@ -42,10 +131,15 @@ class StrumNote extends FlxSprite colorSwap.saturation = ClientPrefs.arrowHSV[noteData % 4][1] / 100; colorSwap.brightness = ClientPrefs.arrowHSV[noteData % 4][2] / 100; - if(animation.curAnim.name == 'confirm' && !PlayState.curStage.startsWith('school')) { - offset.x -= 13; - offset.y -= 13; + if(animation.curAnim.name == 'confirm' && !PlayState.isPixelStage) { + updateConfirmOffset(); } } } + + function updateConfirmOffset() { //TO DO: Find a calc to make the offset work fine on other angles + centerOffsets(); + offset.x -= 13; + offset.y -= 13; + } } diff --git a/source/TitleState.hx b/source/TitleState.hx index 2640d0110..8d555a2fc 100644 --- a/source/TitleState.hx +++ b/source/TitleState.hx @@ -48,6 +48,13 @@ class TitleState extends MusicBeatState var wackyImage:FlxSprite; + var easterEggEnabled:Bool = true; //Disable this to hide the easter egg + var easterEggKeyCombination:Array = [FlxKey.B, FlxKey.B]; //bb stands for bbpanzu cuz he wanted this lmao + var lastKeysPressed:Array = []; + + var mustUpdate:Bool = false; + public static var updateVersion:String = ''; + override public function create():Void { #if android @@ -55,20 +62,33 @@ class TitleState extends MusicBeatState #end #if (polymod && !html5) - if (sys.FileSystem.exists('mods/')) { - var folders:Array = []; - for (file in sys.FileSystem.readDirectory('mods/')) { - var path = haxe.io.Path.join(['mods/', file]); - if (sys.FileSystem.isDirectory(path)) { - folders.push(file); + polymod.Polymod.init({modRoot: "mods", dirs: folders}); + #end + + #if CHECK_FOR_UPDATES + if(!closedState) { + trace('checking for update'); + var http = new haxe.Http(" "); + + http.onData = function (data:String) + { + updateVersion = data.split('\n')[0].trim(); + var curVersion:String = MainMenuState.psychEngineVersion.trim(); + trace('version online: ' + updateVersion + ', your version: ' + curVersion); + if(updateVersion != curVersion) { + trace('versions arent matching!'); + mustUpdate = true; } } - if(folders.length > 0) { - polymod.Polymod.init({modRoot: "mods", dirs: folders}); + + http.onError = function (error) { + trace('error: $error'); } + + http.request(); } - //Gonna finish this later, probably #end + FlxG.game.focusLostFramerate = 60; FlxG.sound.muteKeys = muteKeys; FlxG.sound.volumeDownKeys = volumeDownKeys; @@ -88,18 +108,9 @@ class TitleState extends MusicBeatState Highscore.load(); - if (FlxG.save.data.weekUnlocked != null) + if (FlxG.save.data.weekCompleted != null) { - // FIX LATER!!! - // WEEK UNLOCK PROGRESSION!! - // StoryMenuState.weekUnlocked = FlxG.save.data.weekUnlocked; - - if (StoryMenuState.weekUnlocked.length < 4) - StoryMenuState.weekUnlocked.insert(0, true); - - // QUICK PATCH OOPS! - if (!StoryMenuState.weekUnlocked[0]) - StoryMenuState.weekUnlocked[0] = true; + StoryMenuState.weekCompleted = FlxG.save.data.weekCompleted; } FlxG.mouse.visible = false; @@ -184,10 +195,19 @@ class TitleState extends MusicBeatState // logoBl.color = FlxColor.BLACK; swagShader = new ColorSwap(); - gfDance = new FlxSprite(FlxG.width * 0.4, FlxG.height * 0.07); - gfDance.frames = Paths.getSparrowAtlas('gfDanceTitle'); - gfDance.animation.addByIndices('danceLeft', 'gfDance', [30, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "", 24, false); - gfDance.animation.addByIndices('danceRight', 'gfDance', [15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29], "", 24, false); + if(!FlxG.save.data.psykaEasterEgg || !easterEggEnabled) { + gfDance = new FlxSprite(FlxG.width * 0.4, FlxG.height * 0.07); + gfDance.frames = Paths.getSparrowAtlas('gfDanceTitle'); + gfDance.animation.addByIndices('danceLeft', 'gfDance', [30, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "", 24, false); + gfDance.animation.addByIndices('danceRight', 'gfDance', [15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29], "", 24, false); + } + else //Psyka easter egg + { + gfDance = new FlxSprite(FlxG.width * 0.4, FlxG.height * 0.04); + gfDance.frames = Paths.getSparrowAtlas('psykaDanceTitle'); + gfDance.animation.addByIndices('danceLeft', 'psykaDance', [30, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "", 24, false); + gfDance.animation.addByIndices('danceRight', 'psykaDance', [15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29], "", 24, false); + } gfDance.antialiasing = ClientPrefs.globalAntialiasing; add(gfDance); gfDance.shader = swagShader.shader; @@ -297,22 +317,74 @@ class TitleState extends MusicBeatState #end } - if (pressedEnter && !transitioning && skippedIntro) - { - if(titleText != null) titleText.animation.play('press'); - - FlxG.camera.flash(FlxColor.WHITE, 1); - FlxG.sound.play(Paths.sound('confirmMenu'), 0.7); - - transitioning = true; - // FlxG.sound.music.stop(); + // EASTER EGG - new FlxTimer().start(1, function(tmr:FlxTimer) + if (!transitioning && skippedIntro) + { + if(pressedEnter) { - MusicBeatState.switchState(new MainMenuState()); - closedState = true; - }); - // FlxG.sound.play(Paths.music('titleShoot'), 0.7); + if(titleText != null) titleText.animation.play('press'); + + FlxG.camera.flash(FlxColor.WHITE, 1); + FlxG.sound.play(Paths.sound('confirmMenu'), 0.7); + + transitioning = true; + // FlxG.sound.music.stop(); + + new FlxTimer().start(1, function(tmr:FlxTimer) + { + if (mustUpdate) { + MusicBeatState.switchState(new OutdatedState()); + } else { + MusicBeatState.switchState(new MainMenuState()); + } + closedState = true; + }); + // FlxG.sound.play(Paths.music('titleShoot'), 0.7); + } + else if(easterEggEnabled) + { + var finalKey:FlxKey = FlxG.keys.firstJustPressed(); + if(finalKey != FlxKey.NONE) { + lastKeysPressed.push(finalKey); //Convert int to FlxKey + if(lastKeysPressed.length > easterEggKeyCombination.length) + { + lastKeysPressed.shift(); + } + + if(lastKeysPressed.length == easterEggKeyCombination.length) + { + var isDifferent:Bool = false; + for (i in 0...lastKeysPressed.length) { + if(lastKeysPressed[i] != easterEggKeyCombination[i]) { + isDifferent = true; + break; + } + } + + if(!isDifferent) { + trace('Easter egg triggered!'); + FlxG.save.data.psykaEasterEgg = !FlxG.save.data.psykaEasterEgg; + FlxG.sound.play(Paths.sound('secretSound')); + + var black:FlxSprite = new FlxSprite(0, 0).makeGraphic(FlxG.width, FlxG.height, FlxColor.BLACK); + black.alpha = 0; + add(black); + + FlxTween.tween(black, {alpha: 1}, 1, {onComplete: + function(twn:FlxTween) { + FlxTransitionableState.skipNextTransIn = true; + FlxTransitionableState.skipNextTransOut = true; + MusicBeatState.switchState(new TitleState()); + } + }); + lastKeysPressed = []; + closedState = true; + transitioning = true; + } + } + } + } } if (pressedEnter && !skippedIntro) @@ -361,6 +433,7 @@ class TitleState extends MusicBeatState } } + private var sickBeats:Int = 0; //Basically curBeat but won't be skipped if you hold the tab or resize the screen private static var closedState:Bool = false; override function beatHit() { @@ -379,7 +452,8 @@ class TitleState extends MusicBeatState } if(!closedState) { - switch (curBeat) + sickBeats++; + switch (sickBeats) { case 1: createCoolText(['Psych Engine by'], 45); diff --git a/source/Utils.hx b/source/Utils.hx deleted file mode 100644 index cf4a76664..000000000 --- a/source/Utils.hx +++ /dev/null @@ -1,55 +0,0 @@ -package; - -import openfl.utils.AssetType; -import haxe.crypto.Md5; -import openfl.utils.Assets; -#if sys -import sys.FileSystem; -import sys.io.File; -#end - -class Utils -{ - #if android - - static var storagePath:String = lime.system.System.applicationStorageDirectory; - - /* - WARNING - DO NOT USE THAT FUNCTION WITH PATH THAT - CONTAINS LIME ASSETS OR OPENFL ASSETS - OR PATHS.HX FUNCTIONS - */ - public static function existsCheck(filePath:String, fileType:AssetType = null):Bool - { - if (openfl.utils.Assets.exists(filePath, fileType)) { - trace('!!!!!!!FILE IS EXISTING!!!!!!!'); - return true; - } else { - trace('!!!!!!!FILE IS NOT EXISTING!!!!!!!'); - return false; - } - } - - /* END OF WARNING */ - - // Asset2File shit, just copyed, idk why - - public static function getPathFromFile(id:String, ?ext:String = "") - { - var file = Assets.getBytes(id); - - var md5 = Md5.encode(Md5.make(file).toString()); - - if (FileSystem.exists(storagePath + md5 + ext)) - return storagePath + md5 + ext; - - - File.saveBytes(storagePath + md5 + ext, file); - - return storagePath + md5 + ext; - } - #else - trace('Utils.hx is unsupported not on android targets') - #end -} \ No newline at end of file diff --git a/source/WeekData.hx b/source/WeekData.hx index 0bd1c590c..9bba3158b 100644 --- a/source/WeekData.hx +++ b/source/WeekData.hx @@ -1,89 +1,186 @@ package; -class WeekData { - //Song names, used on both Story Mode and Freplay - //Go to FreeplayState.hx and add the head icons - //Go to StoryMenuState.hx and add the characters/backgrounds - public static var songsNames:Array = [ - ['Tutorial'], //Tutorial, this one isn't added to Freeplay, instead it is added from assets/preload/freeplaySonglist.txt - ['Bopeebo', 'Fresh', 'Dad-Battle'], //Week 1 - ['Spookeez', 'South', 'Monster'], //Week 2 - ['Pico', 'Philly-Nice', 'Blammed'], //Week 3 - ['Satin-Panties', 'High', 'Milf'], //Week 4 - ['Cocoa', 'Eggnog', 'Winter-Horrorland'], //Week 5 - ['Senpai', 'Roses', 'Thorns'] //Week 6 - ]; - - // Custom week number, used for your week's score not being overwritten by a new vanilla week when the game updates - // I'd recommend setting your week as -99 or something that new vanilla weeks will probably never ever use - // null = Don't change week number, it follows the vanilla weeks number order - public static var weekNumber:Array = [ - null, //Tutorial - null, //Week 1 - null, //Week 2 - null, //Week 3 - null, //Week 4 - null, //Week 5 - null //Week 6 - ]; - - //Tells which assets directory should it load - //Reminder that you have to add the directories on Project.xml too or they won't be compiled!!! - //Just copy week6/week6_high mentions and rename it to whatever your week will be named - //It ain't that hard, i guess - - //Oh yeah, quick reminder that files inside the folder that ends with _high are only loaded - //if you have the Low Quality option disabled on "Preferences" - public static var loadDirectory:Array = [ - 'tutorial', //Tutorial loads "tutorial" folder on assets/ - null, //Week 1 - null, //Week 2 - null, //Week 3 - null, //Week 4 - null, //Week 5 - null //Week 6 - ]; - - //The only use for this is to display a different name for the Week when you're on the score reset menu. - //Set it to null to make the Week be automatically called "Week (Number)" - - //Edit: This now also messes with Discord Rich Presence, so it's kind of relevant. - public static var weekResetName:Array = [ - "Tutorial", - null, //Week 1 - null, //Week 2 - null, //Week 3 - null, //Week 4 - null, //Week 5 - null //Week 6 - ]; +#if dontUseManifest +import sys.io.File; +import sys.FileSystem; +#end +import lime.utils.Assets; +import openfl.utils.Assets as OpenFlAssets; +import haxe.Json; +import haxe.format.JsonParser; +using StringTools; - // FUNCTIONS YOU WILL PROBABLY NEVER NEED TO USE +typedef WeekFile = +{ + // JSON variables + var songs:Array; + var weekCharacters:Array; + var weekBackground:String; + var weekBefore:String; + var storyName:String; + var weekName:String; + var freeplayColor:Array; + var startUnlocked:Bool; + var hideStoryMode:Bool; + var hideFreeplay:Bool; +} - //To use on PlayState.hx or Highscore stuff - public static function getCurrentWeekNumber():Int { - return getWeekNumber(PlayState.storyWeek); +class WeekData { + public static var weeksLoaded:Map = new Map(); + public static var weeksList:Array = []; + public var folder:String = ''; + + // JSON variables + public var songs:Array; + public var weekCharacters:Array; + public var weekBackground:String; + public var weekBefore:String; + public var storyName:String; + public var weekName:String; + public var freeplayColor:Array; + public var startUnlocked:Bool; + public var hideStoryMode:Bool; + public var hideFreeplay:Bool; + + public static function createWeekFile():WeekFile { + var weekFile:WeekFile = { + songs: [["Bopeebo", "dad", [146, 113, 253]], ["Fresh", "dad", [146, 113, 253]], ["Dad Battle", "dad", [146, 113, 253]]], + weekCharacters: ['dad', 'bf', 'gf'], + weekBackground: 'stage', + weekBefore: 'tutorial', + storyName: 'Your New Week', + weekName: 'Custom Week', + freeplayColor: [146, 113, 253], + startUnlocked: true, + hideStoryMode: false, + hideFreeplay: false + }; + return weekFile; + } + + // HELP: Is there any way to convert a WeekFile to WeekData without having to put all variables there manually? I'm kind of a noob in haxe lmao + public function new(weekFile:WeekFile) { + songs = weekFile.songs; + weekCharacters = weekFile.weekCharacters; + weekBackground = weekFile.weekBackground; + weekBefore = weekFile.weekBefore; + storyName = weekFile.storyName; + weekName = weekFile.weekName; + freeplayColor = weekFile.freeplayColor; + startUnlocked = weekFile.startUnlocked; + hideStoryMode = weekFile.hideStoryMode; + hideFreeplay = weekFile.hideFreeplay; } - public static function getWeekNumber(num:Int):Int { - var value:Int = 0; - if(num < weekNumber.length) { - value = num; - if(weekNumber[num] != null) { - value = weekNumber[num]; - //trace('Cur value: ' + value); + public static function reloadWeekFiles(isStoryMode:Null = false) + { + weeksList = []; + weeksLoaded.clear(); + #if dontUseManifest + var directories:Array = [Paths.mods(), Paths.getPreloadPath()]; + var originalLength:Int = directories.length; + if(FileSystem.exists(Paths.mods())) { + for (folder in FileSystem.readDirectory(Paths.mods())) { + var path = haxe.io.Path.join([Paths.mods(), folder]); + if (sys.FileSystem.isDirectory(path) && !Paths.ignoreModFolders.exists(folder)) { + directories.push(path + '/'); + //trace('pushed Directory: ' + folder); + } } } - return value; + #else + var directories:Array = [Paths.getPreloadPath()]; + var originalLength:Int = directories.length; + #end + + var sexList:Array = CoolUtil.coolTextFile(Paths.getPreloadPath('weeks/weekList.txt')); + for (i in 0...sexList.length) { + for (j in 0...directories.length) { + var fileToCheck:String = directories[j] + 'weeks/' + sexList[i] + '.json'; + if(!weeksLoaded.exists(sexList[i])) { + var week:WeekFile = getWeekFile(fileToCheck); + if(week != null) { + var weekFile:WeekData = new WeekData(week); + + #if dontUseManifest + if(j >= originalLength) { + weekFile.folder = directories[j].substring(Paths.mods().length, directories[j].length-1); + } + #end + + if(weekFile != null && (isStoryMode == null || (isStoryMode && !weekFile.hideStoryMode) || (!isStoryMode && !weekFile.hideFreeplay))) { + weeksLoaded.set(sexList[i], weekFile); + weeksList.push(sexList[i]); + } + } + } + } + } + + #if dontUseManifest + for (i in 0...directories.length) { + var directory:String = directories[i] + 'weeks/'; + if(FileSystem.exists(directory)) { + for (file in FileSystem.readDirectory(directory)) { + var path = haxe.io.Path.join([directory, file]); + if (!sys.FileSystem.isDirectory(path) && file.endsWith('.json')) { + var weekToCheck:String = file.substr(0, file.length - 5); + if(!weeksLoaded.exists(weekToCheck)) { + var week:WeekFile = getWeekFile(path); + if(week != null) { + var weekFile:WeekData = new WeekData(week); + if(i >= originalLength) { + weekFile.folder = directories[i].substring(Paths.mods().length, directories[i].length-1); + } + + if((isStoryMode && !weekFile.hideStoryMode) || (!isStoryMode && !weekFile.hideFreeplay)) { + weeksLoaded.set(weekToCheck, weekFile); + weeksList.push(weekToCheck); + } + } + } + } + } + } + } + #end + } + + private static function getWeekFile(path:String):WeekFile { + var rawJson:String = null; + #if dontUseManifest + if(FileSystem.exists(path)) { + rawJson = File.getContent(path); + } + #else + if(OpenFlAssets.exists(path)) { + rawJson = Assets.getText(path); + } + #end + + if(rawJson != null && rawJson.length > 0) { + return cast Json.parse(rawJson); + } + return null; + } + + // FUNCTIONS YOU WILL PROBABLY NEVER NEED TO USE + + //To use on PlayState.hx or Highscore stuff + public static function getWeekFileName():String { + return weeksList[PlayState.storyWeek]; } //Used on LoadingState, nothing really too relevant - public static function getWeekDirectory():String { - var value:String = loadDirectory[PlayState.storyWeek]; - if(value == null) { - value = "week" + getCurrentWeekNumber(); + public static function getCurrentWeek():WeekData { + return weeksLoaded.get(weeksList[PlayState.storyWeek]); + } + + public static function setDirectoryFromWeek(?data:WeekData = null) { + Paths.currentModDirectory = ''; + if(data != null && data.folder != null && data.folder.length > 0) { + Paths.currentModDirectory = data.folder; } - return value; } } \ No newline at end of file diff --git a/source/CharacterEditorState.hx b/source/editors/CharacterEditorState.hx similarity index 81% rename from source/CharacterEditorState.hx rename to source/editors/CharacterEditorState.hx index a082bd428..8ac260263 100644 --- a/source/CharacterEditorState.hx +++ b/source/editors/CharacterEditorState.hx @@ -1,4 +1,4 @@ -package; +package editors; #if desktop import Discord.DiscordClient; @@ -31,12 +31,14 @@ import haxe.Json; import Character; import flixel.system.debug.interaction.tools.Pointer.GraphicCursorCross; import lime.system.Clipboard; -import ui.FlxVirtualPad; -import flixel.system.FlxSound; -#if MODS_ALLOWED +import flixel.animation.FlxAnimation; + +#if dontUseManifest import sys.FileSystem; #end +import ui.FlxVirtualPad; + using StringTools; /** @@ -47,6 +49,7 @@ class CharacterEditorState extends MusicBeatState var _pad:FlxVirtualPad; var char:Character; + var ghostChar:Character; var textAnim:FlxText; var bgLayer:FlxTypedGroup; var charLayer:FlxTypedGroup; @@ -54,12 +57,14 @@ class CharacterEditorState extends MusicBeatState //var animList:Array = []; var curAnim:Int = 0; var daAnim:String = 'spooky'; + var goToPlayState:Bool = true; var camFollow:FlxObject; - public function new(daAnim:String = 'spooky') + public function new(daAnim:String = 'spooky', goToPlayState:Bool = true) { super(); this.daAnim = daAnim; + this.goToPlayState = goToPlayState; } var UI_box:FlxUITabMenu; @@ -76,11 +81,9 @@ class CharacterEditorState extends MusicBeatState var cameraFollowPointer:FlxSprite; var healthBarBG:FlxSprite; - var chartMusic:FlxSound; - override function create() { - chartMusic = new FlxSound().loadEmbedded(Paths.music('breakfast')); + //FlxG.sound.playMusic(Paths.music('breakfast'), 0.5); camEditor = new FlxCamera(); camHUD = new FlxCamera(); @@ -129,7 +132,7 @@ class CharacterEditorState extends MusicBeatState dumbTexts.cameras = [camHUD]; textAnim = new FlxText(300, 16); - textAnim.setFormat(Paths.font("vcr.ttf"), 32, FlxColor.WHITE, RIGHT, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK); + textAnim.setFormat(Paths.font("vcr.ttf"), 16, FlxColor.WHITE, RIGHT, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK); textAnim.borderSize = 1; textAnim.size = 32; textAnim.scrollFactor.set(); @@ -142,15 +145,20 @@ class CharacterEditorState extends MusicBeatState camFollow.screenCenter(); add(camFollow); - var tipText:FlxText = new FlxText(FlxG.width - 20, FlxG.height - 5, 0, - "BACK - Go back to the Game - \nLEFT/RIGHT - Previous/Next Animation - \nUP - Play Animation", 15); + var tipText:FlxText = new FlxText(FlxG.width - 20, FlxG.height, 0, + "E/Q - Camera Zoom In/Out + \nJKLI - Move Camera + + \nW/S - Previous/Next Animation + \nSpace - Play Animation + \nArrow Keys - Move Character Offset + \nHold Shift to Move 10x faster\n", 12); tipText.cameras = [camHUD]; + tipText.setFormat(null, 12, FlxColor.WHITE, CENTER, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK); tipText.scrollFactor.set(); - tipText.color = FlxColor.RED; + tipText.borderSize = 1; tipText.x -= tipText.width; - tipText.y -= tipText.height; + tipText.y -= tipText.height - 10; add(tipText); FlxG.camera.follow(camFollow); @@ -203,6 +211,16 @@ class CharacterEditorState extends MusicBeatState var onPixelBG:Bool = false; var OFFSET_X:Float = 300; function reloadBGs() { + var i:Int = bgLayer.members.length-1; + while(i >= 0) { + var memb:FlxSprite = bgLayer.members[i]; + if(memb != null) { + memb.kill(); + bgLayer.remove(memb); + memb.destroy(); + } + --i; + } bgLayer.clear(); var playerXDifference = 0; if(char.isPlayer) playerXDifference = 670; @@ -331,6 +349,7 @@ class CharacterEditorState extends MusicBeatState char.flipX = !char.flipX; updatePointerPos(); reloadBGs(); + ghostChar.flipX = char.flipX; }; charDropDown = new FlxUIDropDownMenuCustom(10, 30, FlxUIDropDownMenuCustom.makeStrIdLabelArray([''], true), function(character:String) @@ -395,7 +414,7 @@ class CharacterEditorState extends MusicBeatState singDurationStepper = new FlxUINumericStepper(15, healthIconInputText.y + 45, 0.1, 4, 0, 999, 1); - scaleStepper = new FlxUINumericStepper(15, singDurationStepper.y + 40, 0.1, 1, 0.1, 30, 1); + scaleStepper = new FlxUINumericStepper(15, singDurationStepper.y + 40, 0.1, 1, 0.05, 10, 1); flipXCheckBox = new FlxUICheckBox(singDurationStepper.x + 80, singDurationStepper.y, null, null, "Flip X", 50); flipXCheckBox.checked = char.flipX; @@ -404,6 +423,8 @@ class CharacterEditorState extends MusicBeatState char.originalFlipX = !char.originalFlipX; char.flipX = char.originalFlipX; if(char.isPlayer) char.flipX = !char.flipX; + + ghostChar.flipX = char.flipX; }; noAntialiasingCheckBox = new FlxUICheckBox(flipXCheckBox.x, flipXCheckBox.y + 40, null, null, "No Antialiasing", 80); @@ -455,6 +476,7 @@ class CharacterEditorState extends MusicBeatState UI_characterbox.addGroup(tab_group); } + var ghostDropDown:FlxUIDropDownMenuCustom; var animationDropDown:FlxUIDropDownMenuCustom; var animationInputText:FlxUIInputText; var animationNameInputText:FlxUIInputText; @@ -465,11 +487,6 @@ class CharacterEditorState extends MusicBeatState var tab_group = new FlxUI(null, UI_box); tab_group.name = "Animations"; - var anims:Array = []; - for (anim in char.animationsArray) { - anims.push(anim.anim); - } - animationInputText = new FlxUIInputText(15, 85, 80, '', 8); animationInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; animationNameInputText = new FlxUIInputText(animationInputText.x, animationInputText.y + 35, 150, '', 8); @@ -479,19 +496,26 @@ class CharacterEditorState extends MusicBeatState animationNameFramerate = new FlxUINumericStepper(animationInputText.x + 170, animationInputText.y, 1, 24, 0, 240, 0); animationLoopCheckBox = new FlxUICheckBox(animationNameInputText.x + 170, animationNameInputText.y - 1, null, null, "Should it Loop?", 100); - animationDropDown = new FlxUIDropDownMenuCustom(15, animationInputText.y - 55, FlxUIDropDownMenuCustom.makeStrIdLabelArray(anims, true), function(pressed:String) { + animationDropDown = new FlxUIDropDownMenuCustom(15, animationInputText.y - 55, FlxUIDropDownMenuCustom.makeStrIdLabelArray([''], true), function(pressed:String) { var selectedAnimation:Int = Std.parseInt(pressed); - for (anim in char.animationsArray) { - if(char.animationsArray[selectedAnimation].anim == anim.anim) { - animationInputText.text = anim.anim; - animationNameInputText.text = anim.name; - animationLoopCheckBox.checked = anim.loop; - animationNameFramerate.value = anim.fps; - - var indicesStr:String = anim.indices.toString(); - animationIndicesInputText.text = indicesStr.substr(1, indicesStr.length - 2); - break; - } + var anim:AnimArray = char.animationsArray[selectedAnimation]; + animationInputText.text = anim.anim; + animationNameInputText.text = anim.name; + animationLoopCheckBox.checked = anim.loop; + animationNameFramerate.value = anim.fps; + + var indicesStr:String = anim.indices.toString(); + animationIndicesInputText.text = indicesStr.substr(1, indicesStr.length - 2); + }); + + ghostDropDown = new FlxUIDropDownMenuCustom(animationDropDown.x + 150, animationDropDown.y, FlxUIDropDownMenuCustom.makeStrIdLabelArray([''], true), function(pressed:String) { + var selectedAnimation:Int = Std.parseInt(pressed); + ghostChar.visible = false; + char.alpha = 1; + if(selectedAnimation > 0) { + ghostChar.visible = true; + ghostChar.playAnim(ghostChar.animationsArray[selectedAnimation-1].anim, true); + char.alpha = 0.85; } }); @@ -508,8 +532,8 @@ class CharacterEditorState extends MusicBeatState } var lastAnim:String = ''; - if(char.animation.curAnim != null) { - lastAnim = char.animation.curAnim.name; + if(char.animationsArray[curAnim] != null) { + lastAnim = char.animationsArray[curAnim].anim; } var lastOffsets:Array = [0, 0]; @@ -543,7 +567,21 @@ class CharacterEditorState extends MusicBeatState char.animationsArray.push(newAnim); if(lastAnim == animationInputText.text) { - char.playAnim(lastAnim, true); + var leAnim:FlxAnimation = char.animation.getByName(lastAnim); + if(leAnim != null && leAnim.frames.length > 0) { + char.playAnim(lastAnim, true); + } else { + for(i in 0...char.animationsArray.length) { + if(char.animationsArray[i] != null) { + leAnim = char.animation.getByName(char.animationsArray[i].anim); + if(leAnim != null && leAnim.frames.length > 0) { + char.playAnim(char.animationsArray[i].anim, true); + curAnim = i; + break; + } + } + } + } } reloadAnimationDropDown(); @@ -577,6 +615,7 @@ class CharacterEditorState extends MusicBeatState }); tab_group.add(new FlxText(animationDropDown.x, animationDropDown.y - 18, 0, 'Animations:')); + tab_group.add(new FlxText(ghostDropDown.x, ghostDropDown.y - 18, 0, 'Animation Ghost:')); tab_group.add(new FlxText(animationInputText.x, animationInputText.y - 18, 0, 'Animation name:')); tab_group.add(new FlxText(animationNameFramerate.x, animationNameFramerate.y - 18, 0, 'Framerate:')); tab_group.add(new FlxText(animationNameInputText.x, animationNameInputText.y - 18, 0, 'Animation on .XML/.TXT file:')); @@ -589,6 +628,7 @@ class CharacterEditorState extends MusicBeatState tab_group.add(animationLoopCheckBox); tab_group.add(addUpdateButton); tab_group.add(removeButton); + tab_group.add(ghostDropDown); tab_group.add(animationDropDown); UI_characterbox.addGroup(tab_group); } @@ -610,6 +650,7 @@ class CharacterEditorState extends MusicBeatState char.jsonScale = sender.value; char.setGraphicSize(Std.int(char.width * char.jsonScale)); char.updateHitbox(); + reloadGhost(); updatePointerPos(); if(char.animation.curAnim != null) { @@ -691,19 +732,32 @@ class CharacterEditorState extends MusicBeatState } else { char.dance(); } + ghostDropDown.selectedLabel = ''; + reloadGhost(); } function genBoyOffsets():Void { var daLoop:Int = 0; + var i:Int = dumbTexts.members.length-1; + while(i >= 0) { + var memb:FlxText = dumbTexts.members[i]; + if(memb != null) { + memb.kill(); + dumbTexts.remove(memb); + memb.destroy(); + } + --i; + } dumbTexts.clear(); for (anim => offsets in char.animOffsets) { var text:FlxText = new FlxText(10, 20 + (18 * daLoop), 0, anim + ": " + offsets, 15); + text.setFormat(null, 16, FlxColor.WHITE, CENTER, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK); text.scrollFactor.set(); - text.color = FlxColor.BLUE; + text.borderSize = 1; dumbTexts.add(text); text.cameras = [camHUD]; @@ -714,18 +768,39 @@ class CharacterEditorState extends MusicBeatState if(dumbTexts.length < 1) { var text:FlxText = new FlxText(10, 38, 0, "ERROR! No animations found.", 15); text.scrollFactor.set(); - text.color = FlxColor.RED; + text.borderSize = 1; dumbTexts.add(text); textAnim.visible = false; } } function loadChar(isDad:Bool, blahBlahBlah:Bool = true) { + var i:Int = charLayer.members.length-1; + while(i >= 0) { + var memb:Character = charLayer.members[i]; + if(memb != null) { + memb.kill(); + charLayer.remove(memb); + memb.destroy(); + } + --i; + } charLayer.clear(); + ghostChar = new Character(0, 0, daAnim, !isDad); + ghostChar.screenCenter(); + ghostChar.debugMode = true; + ghostChar.alpha = 0.6; + char = new Character(0, 0, daAnim, !isDad); + if(char.animationsArray[0] != null) { + char.playAnim(char.animationsArray[0].anim, true); + } char.screenCenter(); char.debugMode = true; + + charLayer.add(ghostChar); charLayer.add(char); + char.setPosition(char.positionArray[0] + OFFSET_X + 100, char.positionArray[1]); /* THIS FUNCTION WAS USED TO PUT THE .TXT OFFSETS INTO THE .JSON @@ -790,20 +865,55 @@ class CharacterEditorState extends MusicBeatState function reloadAnimationDropDown() { var anims:Array = []; + var ghostAnims:Array = ['']; for (anim in char.animationsArray) { anims.push(anim.anim); + ghostAnims.push(anim.anim); } - if(anims.length < 1) anims.push(''); //Prevents crash + if(anims.length < 1) anims.push('NO ANIMATIONS'); //Prevents crash animationDropDown.setData(FlxUIDropDownMenuCustom.makeStrIdLabelArray(anims, true)); + ghostDropDown.setData(FlxUIDropDownMenuCustom.makeStrIdLabelArray(ghostAnims, true)); + reloadGhost(); + } + + function reloadGhost() { + ghostChar.frames = char.frames; + for (anim in char.animationsArray) { + var animAnim:String = '' + anim.anim; + var animName:String = '' + anim.name; + var animFps:Int = anim.fps; + var animLoop:Bool = !!anim.loop; //Bruh + var animIndices:Array = anim.indices; + if(animIndices != null && animIndices.length > 0) { + ghostChar.animation.addByIndices(animAnim, animName, animIndices, "", animFps, animLoop); + } else { + ghostChar.animation.addByPrefix(animAnim, animName, animFps, animLoop); + } + + if(anim.offsets != null && anim.offsets.length > 1) { + ghostChar.addOffset(anim.anim, anim.offsets[0], anim.offsets[1]); + } + } + + char.alpha = 0.85; + ghostChar.visible = true; + if(ghostDropDown.selectedLabel == '') { + ghostChar.visible = false; + char.alpha = 1; + } + ghostChar.color = 0xFF666688; + + ghostChar.setGraphicSize(Std.int(ghostChar.width * char.jsonScale)); + ghostChar.updateHitbox(); } function reloadCharacterDropDown() { var charsLoaded:Map = new Map(); - #if windows + #if dontUseManifest characterList = []; - var directories:Array = [Paths.mods('characters/'), Paths.getPreloadPath('characters/')]; + var directories:Array = [Paths.mods('characters/'), Paths.mods(Paths.currentModDirectory + '/characters/'), Paths.getPreloadPath('characters/')]; for (i in 0...directories.length) { var directory:String = directories[i]; if(FileSystem.exists(directory)) { @@ -843,8 +953,13 @@ class CharacterEditorState extends MusicBeatState override function update(elapsed:Float) { - if(char.animation.curAnim != null) { - textAnim.text = char.animation.curAnim.name; + if(char.animationsArray[curAnim] != null) { + textAnim.text = char.animationsArray[curAnim].anim; + + var curAnim:FlxAnimation = char.animation.getByName(char.animationsArray[curAnim].anim); + if(curAnim == null || curAnim.frames.length < 1) { + textAnim.text += ' (ERROR!)'; + } } else { textAnim.text = ''; } @@ -852,19 +967,12 @@ class CharacterEditorState extends MusicBeatState var inputTexts:Array = [animationInputText, imageInputText, healthIconInputText, animationNameInputText, animationIndicesInputText]; for (i in 0...inputTexts.length) { if(inputTexts[i].hasFocus) { - if(FlxG.keys.pressed.CONTROL && FlxG.keys.justPressed.V && lime.system.Clipboard.text != null) { //Copy paste + if(FlxG.keys.pressed.CONTROL && FlxG.keys.justPressed.V && Clipboard.text != null) { //Copy paste inputTexts[i].text = ClipboardAdd(inputTexts[i].text); inputTexts[i].caretIndex = inputTexts[i].text.length; getEvent(FlxUIInputText.CHANGE_EVENT, inputTexts[i], null, []); } - - /* #if android - var androidback = FlxG.android.justReleased.BACK; - #else - var androidback = false; - #end */ - - if (FlxG.keys.justPressed.ENTER) { + if(FlxG.keys.justPressed.ENTER) { inputTexts[i].hasFocus = false; } FlxG.sound.muteKeys = []; @@ -879,21 +987,30 @@ class CharacterEditorState extends MusicBeatState FlxG.sound.volumeUpKeys = TitleState.volumeUpKeys; if(!charDropDown.dropPanel.visible) { - #if android - var androidback = FlxG.android.justReleased.BACK; - #else - var androidback = false; - #end - - if (FlxG.keys.justPressed.ENTER || androidback) { - MusicBeatState.switchState(new PlayState()); + #if android + var androidback = FlxG.android.justReleased.BACK; + #else + var androidback = false; + #end + + if (FlxG.keys.justPressed.ESCAPE || androidback) { + if(goToPlayState) { + MusicBeatState.switchState(new PlayState()); + } else { + MusicBeatState.switchState(new editors.MasterEditorMenu()); + FlxG.sound.playMusic(Paths.music('freakyMenu')); + } FlxG.mouse.visible = false; return; } + + if (FlxG.keys.justPressed.R) { + FlxG.camera.zoom = 1; + } - if (FlxG.keys.pressed.E && FlxG.camera.zoom < 5) { + if (FlxG.keys.pressed.E && FlxG.camera.zoom < 3) { FlxG.camera.zoom += elapsed * FlxG.camera.zoom; - if(FlxG.camera.zoom > 5) FlxG.camera.zoom = 5; + if(FlxG.camera.zoom > 3) FlxG.camera.zoom = 3; } if (FlxG.keys.pressed.Q && FlxG.camera.zoom > 0.1) { FlxG.camera.zoom -= elapsed * FlxG.camera.zoom; @@ -902,36 +1019,28 @@ class CharacterEditorState extends MusicBeatState if (FlxG.keys.pressed.I || FlxG.keys.pressed.J || FlxG.keys.pressed.K || FlxG.keys.pressed.L) { - var shiftMult:Int = 1; + var addToCam:Float = 500 * elapsed; if (FlxG.keys.pressed.SHIFT) - shiftMult = 4; + addToCam *= 4; if (FlxG.keys.pressed.I) - camFollow.velocity.y = -90 * shiftMult; + camFollow.y -= addToCam; else if (FlxG.keys.pressed.K) - camFollow.velocity.y = 90 * shiftMult; - else - camFollow.velocity.y = 0; + camFollow.y += addToCam; if (FlxG.keys.pressed.J) - camFollow.velocity.x = -90 * shiftMult; + camFollow.x -= addToCam; else if (FlxG.keys.pressed.L) - camFollow.velocity.x = 90 * shiftMult; - else - camFollow.velocity.x = 0; - } - else - { - camFollow.velocity.set(); + camFollow.x += addToCam; } if(char.animationsArray.length > 0) { - if (FlxG.keys.justPressed.A || _pad.buttonLeft.justPressed) + if (FlxG.keys.justPressed.W || _pad.buttonUp.justPressed) { curAnim -= 1; } - if (FlxG.keys.justPressed.D || _pad.buttonRight.justPressed) + if (FlxG.keys.justPressed.S || _pad.buttonDown.justPressed) { curAnim += 1; } @@ -942,13 +1051,13 @@ class CharacterEditorState extends MusicBeatState if (curAnim >= char.animationsArray.length) curAnim = 0; - if (FlxG.keys.justPressed.A || FlxG.keys.justPressed.D || FlxG.keys.justPressed.UP || _pad.buttonLeft.justPressed || _pad.buttonRight.justPressed || _pad.buttonUp.justPressed) + if (FlxG.keys.justPressed.S || FlxG.keys.justPressed.W || FlxG.keys.justPressed.SPACE || _pad.buttonDown.justPressed || _pad.buttonUp.justPressed) { char.playAnim(char.animationsArray[curAnim].anim, true); genBoyOffsets(); } - var controlArray:Array = [controls.UI_LEFT, controls.UI_RIGHT, controls.UI_UP, controls.UI_DOWN]; + var controlArray:Array = [FlxG.keys.justPressed.LEFT, FlxG.keys.justPressed.RIGHT, FlxG.keys.justPressed.UP, FlxG.keys.justPressed.DOWN, _pad.buttonRight.justPressed, _pad.buttonLeft.justPressed, _pad.buttonUp.justPressed, _pad.buttonDown.justPressed]; for (i in 0...controlArray.length) { if(controlArray[i]) { var holdShift = FlxG.keys.pressed.SHIFT; @@ -963,14 +1072,19 @@ class CharacterEditorState extends MusicBeatState if(i % 2 == 1) negaMult = -1; char.animationsArray[curAnim].offsets[arrayVal] += negaMult * multiplier; char.addOffset(char.animationsArray[curAnim].anim, char.animationsArray[curAnim].offsets[0], char.animationsArray[curAnim].offsets[1]); - + ghostChar.addOffset(char.animationsArray[curAnim].anim, char.animationsArray[curAnim].offsets[0], char.animationsArray[curAnim].offsets[1]); + char.playAnim(char.animationsArray[curAnim].anim, false); + if(ghostChar.animation.curAnim != null && char.animation.curAnim != null && char.animation.curAnim.name == ghostChar.animation.curAnim.name) { + ghostChar.playAnim(char.animation.curAnim.name, false); + } genBoyOffsets(); } } } } camMenu.zoom = FlxG.camera.zoom; + ghostChar.setPosition(char.x, char.y); super.update(elapsed); } @@ -1060,7 +1174,7 @@ class CharacterEditorState extends MusicBeatState prefix = prefix.substring(0, prefix.length-1); } - var text:String = prefix + lime.system.Clipboard.text.replace('\n', ''); + var text:String = prefix + Clipboard.text.replace('\n', ''); return text; } } diff --git a/source/ChartingState.hx b/source/editors/ChartingState.hx similarity index 70% rename from source/ChartingState.hx rename to source/editors/ChartingState.hx index 5f2ca2cf6..394893947 100644 --- a/source/ChartingState.hx +++ b/source/editors/ChartingState.hx @@ -1,4 +1,4 @@ -package; +package editors; #if desktop import Discord.DiscordClient; @@ -19,6 +19,7 @@ import flixel.addons.ui.FlxUIInputText; import flixel.addons.ui.FlxUINumericStepper; import flixel.addons.ui.FlxUITabMenu; import flixel.addons.ui.FlxUITooltip.FlxUITooltipStyle; +import flixel.addons.transition.FlxTransitionableState; import flixel.group.FlxGroup.FlxTypedGroup; import flixel.group.FlxGroup; import flixel.math.FlxMath; @@ -37,46 +38,54 @@ import openfl.media.Sound; import openfl.net.FileReference; import openfl.utils.ByteArray; import openfl.utils.Assets as OpenFlAssets; - -//android -import ui.FlxVirtualPad; -// android - +import lime.media.AudioBuffer; +import haxe.io.Bytes; +import flash.geom.Rectangle; #if MODS_ALLOWED import sys.io.File; import sys.FileSystem; +import flash.media.Sound; #end +import ui.FlxVirtualPad; + using StringTools; class ChartingState extends MusicBeatState { - private static var noteTypeList:Array = + public static var noteTypeList:Array = //Used for backwards compatibility with 0.1 - 0.3.2 charts, though, you should add your hardcoded custom note types here too. [ '', - '1 - Alt Animation', - '2 - Hey!', - '3 - Hurt Note' + 'Alt Animation', + 'Hey!', + 'Hurt Note', + 'GF Sing', + 'No Animation' ]; + private var noteTypeIntMap:Map = new Map(); + private var noteTypeMap:Map> = new Map>(); - private static var eventStuff:Array = + var eventStuff:Array = [ ['', "Nothing. Yep, that's right."], - ['Hey!', "Plays the \"Hey!\" animation from Bopeebo,\nValue 1: 0 = Only Boyfriend, 1 = Only Girlfriend,\nSomething else = Both.\nValue 2: Custom animation duration,\nleave it blank for 0.6s"], + ['Hey!', "Plays the \"Hey!\" animation from Bopeebo,\nValue 1: BF = Only Boyfriend, GF = Only Girlfriend,\nSomething else = Both.\nValue 2: Custom animation duration,\nleave it blank for 0.6s"], ['Set GF Speed', "Sets GF head bopping speed,\nValue 1: 1 = Normal speed,\n2 = 1/2 speed, 4 = 1/4 speed etc.\nUsed on Fresh during the beatbox parts.\n\nWarning: Value must be integer!"], ['Blammed Lights', "Value 1: 0 = Turn off, 1 = Blue, 2 = Green,\n3 = Pink, 4 = Red, 5 = Orange, Anything else = Random."], ['Kill Henchmen', "For Mom's songs, don't use this please, i love them :("], ['Add Camera Zoom', "Used on MILF on that one \"hard\" part\nValue 1: Camera zoom add (Default: 0.015)\nValue 2: UI zoom add (Default: 0.03)\nLeave the values blank if you want to use Default."], - ['Trigger BG Ghouls', "Used on Thorns for the \"Hey!\"s"], - ['Play Animation', "Plays an animation on a Character,\nonce the animation is completed,\nthe animation changes to Idle\n\nValue 1: Animation to play.\nValue 2: Character (0 = Dad, 1 = BF, 2 = GF)"], + ['BG Freaks Expression', "Should be used only in \"school\" Stage!"], + ['Trigger BG Ghouls', "Should be used only in \"schoolEvil\" Stage!"], + ['Play Animation', "Plays an animation on a Character,\nonce the animation is completed,\nthe animation changes to Idle\n\nValue 1: Animation to play.\nValue 2: Character (Dad, BF, GF)"], ['Camera Follow Pos', "Value 1: X\nValue 2: Y\n\nThe camera won't change the follow point\nafter using this, for getting it back\nto normal, leave both values blank."], - ['Alt Idle Animation', "Sets a speciied suffix after the idle animation name.\nYou can use this to trigger 'idle-alt' if you set\nValue 2 to -alt\n\nValue 1: Character to set (0 = Dad, 1 = BF, 2 = GF)\nValue 2: New suffix (Leave it blank to disable)"], - ['Screen Shake', "Value 1: Camera shake\nValue 2: HUD shake\n\nEvery value works as the following example: \"1, 0.1\".\nThe first number (1) is the duration.\nThe second number (0.05) is the intensity."], - ['Change Character', "Value 1: Character to change\nValue 2: New character's name\n\nOn Value 1, Boyfriend is 0,\nDad is 1 and Girlfriend is 2"] + ['Alt Idle Animation', "Sets a speciied suffix after the idle animation name.\nYou can use this to trigger 'idle-alt' if you set\nValue 2 to -alt\n\nValue 1: Character to set (Dad, BF or GF)\nValue 2: New suffix (Leave it blank to disable)"], + ['Screen Shake', "Value 1: Camera shake\nValue 2: HUD shake\n\nEvery value works as the following example: \"1, 0.05\".\nThe first number (1) is the duration.\nThe second number (0.05) is the intensity."], + ['Change Character', "Value 1: Character to change (Dad, BF, GF)\nValue 2: New character's name"] ]; var _file:FileReference; + var key_space:FlxButton; + var UI_box:FlxUITabMenu; /** @@ -111,13 +120,12 @@ class ChartingState extends MusicBeatState var gridBG:FlxSprite; var gridMult:Int = 2; - var curZoom:Float = 1; var _song:SwagSong; /* * WILL BE THE CURRENT / LAST PLACED NOTE **/ - var curSelectedNote:Array; + var curSelectedNote:Array = null; var tempBpm:Float = 0; @@ -126,24 +134,49 @@ class ChartingState extends MusicBeatState var leftIcon:HealthIcon; var rightIcon:HealthIcon; - //add buttons - var key_space:FlxButton; - - var _pad:FlxVirtualPad; - var value1InputText:FlxUIInputText; var value2InputText:FlxUIInputText; var currentSongName:String; - var zoomMult:Int = 1; //0 = 0.5 actually lmao + var zoomTxt:FlxText; + var curZoom:Int = 1; + + #if !html5 + var zoomList:Array = [ + 0.5, + 1, + 2, + 4, + 8, + 12, + 16, + 24 + ]; + #else //The grid gets all black when over 1/12 snap + var zoomList:Array = [ + 0.5, + 1, + 2, + 4, + 8, + 12 + ]; + #end private var blockPressWhileTypingOn:Array = []; private var blockPressWhileScrolling:Array = []; + var waveformSprite:FlxSprite; var gridLayer:FlxTypedGroup; + var _pad:FlxVirtualPad; + override function create() { + #if MODS_ALLOWED + Paths.destroyLoadedImages(); + #end + #if desktop // Updating Discord Rich Presence DiscordClient.changePresence("Chart Editor", StringTools.replace(PlayState.SONG.song, '-', ' ')); @@ -157,6 +190,9 @@ class ChartingState extends MusicBeatState gridLayer = new FlxTypedGroup(); add(gridLayer); + waveformSprite = new FlxSprite(GRID_SIZE, 0).makeGraphic(FlxG.width, FlxG.height, 0x00FFFFFF); + add(waveformSprite); + var eventIcon:FlxSprite = new FlxSprite(-GRID_SIZE - 5, -90).loadGraphic(Paths.image('eventArrow')); leftIcon = new HealthIcon('bf'); rightIcon = new HealthIcon('dad'); @@ -197,6 +233,7 @@ class ChartingState extends MusicBeatState player2: 'dad', player3: 'gf', speed: 1, + stage: 'stage', validScore: false }; } @@ -212,9 +249,9 @@ class ChartingState extends MusicBeatState // sections = _song.notes; + currentSongName = Paths.formatToSongPath(_song.song); + loadAudioBuffer(); reloadGridLayer(); - - currentSongName = _song.song.toLowerCase(); loadSong(); Conductor.changeBPM(_song.bpm); Conductor.mapBPMChanges(_song); @@ -237,7 +274,7 @@ class ChartingState extends MusicBeatState {name: "Section", label: 'Section'}, {name: "Note", label: 'Note'}, {name: "Events", label: 'Events'}, - {name: "Charting", label: 'Charting'} + {name: "Charting", label: 'Charting'}, ]; UI_box = new FlxUITabMenu(null, tabs, true); @@ -245,21 +282,29 @@ class ChartingState extends MusicBeatState UI_box.resize(300, 400); UI_box.x = FlxG.width / 2 + GRID_SIZE / 2; UI_box.y = 25; + UI_box.scrollFactor.set(); - var tipText:FlxText = new FlxText(UI_box.x, UI_box.y + UI_box.height + 6, 0, - "W/S or Mouse Wheel - Change Conductor's strum time - \nA or Left/D or Right - Go to the previous/next section - \nHold Control and click on an arrow to select it - \nZ/X - Zoom in/out - \n - \nEnter - Test your chart - \nQ/E - Decrease/Increase Note Sustain Length - \nSpace - Stop/Resume song - \nR - Reset section\n", 16); - tipText.setFormat(Paths.font("vcr.ttf"), 16, FlxColor.WHITE, LEFT/*, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK*/); - //tipText.borderSize = 2; - tipText.scrollFactor.set(); - add(tipText); + var text:String = + "W/S or Mouse Wheel - Change Conductor's strum time + \nA or Left/D or Right - Go to the previous/next section + \nHold Shift to move 4x faster + \nHold Control and click on an arrow to select it + \nZ/X - Zoom in/out + \n + \nEsc - Test your chart inside Chart Editor + \nEnter - Play your chart + \nQ/E - Decrease/Increase Note Sustain Length + \nSpace - Stop/Resume song"; + + var tipTextArray:Array = text.split('\n'); + for (i in 0...tipTextArray.length) { + var tipText:FlxText = new FlxText(UI_box.x, UI_box.y + UI_box.height + 8, 0, tipTextArray[i], 16); + tipText.y += i * 14; + tipText.setFormat(Paths.font("vcr.ttf"), 16, FlxColor.WHITE, LEFT/*, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK*/); + //tipText.borderSize = 2; + tipText.scrollFactor.set(); + add(tipText); + } add(UI_box); addSongUI(); @@ -268,7 +313,8 @@ class ChartingState extends MusicBeatState addEventsUI(); addChartingUI(); updateHeads(); - UI_box.selected_tab = 4; + updateWaveform(); + //UI_box.selected_tab = 4; add(curRenderedSustains); add(curRenderedNotes); @@ -284,8 +330,9 @@ class ChartingState extends MusicBeatState zoomTxt = new FlxText(10, 10, 0, "Zoom: 1x", 16); zoomTxt.scrollFactor.set(); add(zoomTxt); + + updateGrid(); - // add buttons key_space = new FlxButton(60, 60, ""); key_space.loadGraphic(Paths.image("key_space")); //"assets/images/key_space.png" key_space.alpha = 0.75; @@ -304,6 +351,7 @@ class ChartingState extends MusicBeatState var UI_songTitle:FlxUIInputText; var noteSkinInputText:FlxUIInputText; var noteSplashesInputText:FlxUIInputText; + var stageDropDown:FlxUIDropDownMenuCustom; function addSongUI():Void { UI_songTitle = new FlxUIInputText(10, 10, 70, _song.song, 8); @@ -326,8 +374,10 @@ class ChartingState extends MusicBeatState var reloadSong:FlxButton = new FlxButton(saveButton.x + 90, saveButton.y, "Reload Audio", function() { - currentSongName = UI_songTitle.text.toLowerCase(); + currentSongName = Paths.formatToSongPath(UI_songTitle.text); loadSong(); + loadAudioBuffer(); + updateWaveform(); }); var reloadSongJson:FlxButton = new FlxButton(reloadSong.x, saveButton.y + 30, "Reload JSON", function() @@ -343,40 +393,38 @@ class ChartingState extends MusicBeatState var loadEventJson:FlxButton = new FlxButton(loadAutosaveBtn.x, loadAutosaveBtn.y + 30, 'Load Events', function() { - var songName:String = _song.song.toLowerCase(); + var songName:String = Paths.formatToSongPath(_song.song); var file:String = Paths.json(songName + '/events'); - #if sys - if (sys.FileSystem.exists(file)) + #if dontUseManifest + if (#if MODS_ALLOWED FileSystem.exists(Paths.modsJson(songName + '/events')) || #end FileSystem.exists(file)) #else if (OpenFlAssets.exists(file)) #end { - PlayState.SONG = Song.loadFromJson('events', songName); - MusicBeatState.resetState(); + clearEvents(); + var events:SwagSong = Song.loadFromJson('events', songName); + for (sec in 0...events.notes.length) { + for (noteId in 0...events.notes[sec].sectionNotes.length) { + var note:Array = events.notes[sec].sectionNotes[noteId]; + if(note != null && note[1] < 0) { + _song.notes[sec].sectionNotes.push([note[0], note[1], note[2], note[3], note[4]]); + } + } + } + changeSection(curSection); } }); - var saveEvents:FlxButton = new FlxButton(110, loadEventJson.y, 'Save Events', function () + var saveEvents:FlxButton = new FlxButton(110, reloadSongJson.y, 'Save Events', function () { saveEvents(); }); - var clear_events:FlxButton = new FlxButton(loadAutosaveBtn.x, 320, 'Clear events', function() + var clear_events:FlxButton = new FlxButton(320, 310, 'Clear events', function() { - for (sec in 0..._song.notes.length) { - var count:Int = 0; - while(count < _song.notes[sec].sectionNotes.length) { - var note:Array = _song.notes[sec].sectionNotes[count]; - if(note != null && note[1] < 0) { - _song.notes[sec].sectionNotes.remove(note); - } else { - count++; - } - } - } - updateGrid(); + clearEvents(); }); - var clear_notes:FlxButton = new FlxButton(loadAutosaveBtn.x, clear_events.y + 20, 'Clear notes', function() + var clear_notes:FlxButton = new FlxButton(320, clear_events.y + 30, 'Clear notes', function() { for (sec in 0..._song.notes.length) { var count:Int = 0; @@ -400,7 +448,35 @@ class ChartingState extends MusicBeatState stepperSpeed.value = _song.speed; stepperSpeed.name = 'song_speed'; + #if dontUseManifest + var directories:Array = [Paths.mods('characters/'), Paths.mods(Paths.currentModDirectory + '/characters/'), Paths.getPreloadPath('characters/')]; + #else + var directories:Array = [Paths.getPreloadPath('characters/')]; + #end + + var tempMap:Map = new Map(); var characters:Array = CoolUtil.coolTextFile(Paths.txt('characterList')); + for (i in 0...characters.length) { + tempMap.set(characters[i], true); + } + + #if MODS_ALLOWED + for (i in 0...directories.length) { + var directory:String = directories[i]; + if(FileSystem.exists(directory)) { + for (file in FileSystem.readDirectory(directory)) { + var path = haxe.io.Path.join([directory, file]); + if (!FileSystem.isDirectory(path) && file.endsWith('.json')) { + var charToCheck:String = file.substr(0, file.length - 5); + if(!charToCheck.endsWith('-dead') && !tempMap.exists(charToCheck)) { + tempMap.set(charToCheck, true); + characters.push(charToCheck); + } + } + } + } + } + #end var player1DropDown = new FlxUIDropDownMenuCustom(10, stepperSpeed.y + 45, FlxUIDropDownMenuCustom.makeStrIdLabelArray(characters, true), function(character:String) { @@ -426,6 +502,49 @@ class ChartingState extends MusicBeatState player2DropDown.selectedLabel = _song.player2; blockPressWhileScrolling.push(player2DropDown); + #if dontUseManifest + var directories:Array = [Paths.mods('stages/'), Paths.mods(Paths.currentModDirectory + '/stages/'), Paths.getPreloadPath('stages/')]; + #else + var directories:Array = [Paths.getPreloadPath('stages/')]; + #end + + tempMap.clear(); + var stageFile:Array = CoolUtil.coolTextFile(Paths.txt('stageList')); + var stages:Array = []; + for (i in 0...stageFile.length) { //Prevent duplicates + var stageToCheck:String = stageFile[i]; + if(!tempMap.exists(stageToCheck)) { + stages.push(stageToCheck); + } + tempMap.set(stageToCheck, true); + } + #if MODS_ALLOWED + for (i in 0...directories.length) { + var directory:String = directories[i]; + if(FileSystem.exists(directory)) { + for (file in FileSystem.readDirectory(directory)) { + var path = haxe.io.Path.join([directory, file]); + if (!FileSystem.isDirectory(path) && file.endsWith('.json')) { + var stageToCheck:String = file.substr(0, file.length - 5); + if(!tempMap.exists(stageToCheck)) { + tempMap.set(stageToCheck, true); + stages.push(stageToCheck); + } + } + } + } + } + #end + + if(stages.length < 1) stages.push('stage'); + + stageDropDown = new FlxUIDropDownMenuCustom(player1DropDown.x + 140, player1DropDown.y, FlxUIDropDownMenuCustom.makeStrIdLabelArray(stages, true), function(character:String) + { + _song.stage = stages[Std.parseInt(character)]; + }); + stageDropDown.selectedLabel = _song.stage; + blockPressWhileScrolling.push(stageDropDown); + var skin = PlayState.SONG.arrowSkin; if(skin == null) skin = ''; noteSkinInputText = new FlxUIInputText(player2DropDown.x, player2DropDown.y + 50, 150, skin, 8); @@ -464,14 +583,15 @@ class ChartingState extends MusicBeatState tab_group_song.add(new FlxText(player2DropDown.x, player2DropDown.y - 15, 0, 'Opponent:')); tab_group_song.add(new FlxText(player3DropDown.x, player3DropDown.y - 15, 0, 'Girlfriend:')); tab_group_song.add(new FlxText(player1DropDown.x, player1DropDown.y - 15, 0, 'Boyfriend:')); + tab_group_song.add(new FlxText(stageDropDown.x, stageDropDown.y - 15, 0, 'Stage:')); tab_group_song.add(new FlxText(noteSkinInputText.x, noteSkinInputText.y - 15, 0, 'Note Texture:')); tab_group_song.add(new FlxText(noteSplashesInputText.x, noteSplashesInputText.y - 15, 0, 'Note Splashes Texture:')); tab_group_song.add(player2DropDown); tab_group_song.add(player3DropDown); tab_group_song.add(player1DropDown); + tab_group_song.add(stageDropDown); UI_box.addGroup(tab_group_song); - UI_box.scrollFactor.set(); FlxG.camera.follow(camPos); } @@ -483,6 +603,7 @@ class ChartingState extends MusicBeatState var check_altAnim:FlxUICheckBox; var sectionToCopy:Int = 0; + var notesCopied:Array; function addSectionUI():Void { @@ -517,18 +638,27 @@ class ChartingState extends MusicBeatState var copyButton:FlxButton = new FlxButton(10, 150, "Copy Section", function() { + notesCopied = []; sectionToCopy = curSection; + for (i in 0..._song.notes[curSection].sectionNotes.length) + { + var note:Array = _song.notes[curSection].sectionNotes[i]; + notesCopied.push(note); + } }); var pasteButton:FlxButton = new FlxButton(10, 180, "Paste Section", function() { - for (note in _song.notes[sectionToCopy].sectionNotes) + var addToTime:Float = Conductor.stepCrochet * (_song.notes[curSection].lengthInSteps * (curSection - sectionToCopy)); + trace('Time to add: ' + addToTime); + + for (note in notesCopied) { - var copiedNote:Array; + var copiedNote:Array = []; if(note[4] != null) { - copiedNote = [note[0] + Conductor.stepCrochet * (_song.notes[sectionToCopy].lengthInSteps * (curSection - sectionToCopy)), note[1], note[2], note[3], note[4]]; + copiedNote = [note[0] + addToTime, note[1], note[2], note[3], note[4]]; } else { - copiedNote = [note[0] + Conductor.stepCrochet * (_song.notes[sectionToCopy].lengthInSteps * (curSection - sectionToCopy)), note[1], note[2], note[3]]; + copiedNote = [note[0] + addToTime, note[1], note[2], note[3]]; } _song.notes[curSection].sectionNotes.push(copiedNote); } @@ -565,7 +695,10 @@ class ChartingState extends MusicBeatState { var strum = note[0] + Conductor.stepCrochet * (_song.notes[daSec].lengthInSteps * value); - var copiedNote:Array = [strum, note[1], note[2]]; + var copiedNote:Array = [strum, note[1], note[2], note[3]]; + if(note[1] < 0) { + copiedNote = [strum, note[1], note[2], note[3], note[4]]; + } _song.notes[daSec].sectionNotes.push(copiedNote); } updateGrid(); @@ -607,11 +740,45 @@ class ChartingState extends MusicBeatState tab_group_note.add(strumTimeInputText); blockPressWhileTypingOn.push(strumTimeInputText); - noteTypeDropDown = new FlxUIDropDownMenuCustom(10, 105, FlxUIDropDownMenuCustom.makeStrIdLabelArray(noteTypeList, true), function(character:String) + var key:Int = 0; + var displayNameList:Array = []; + while (key < noteTypeList.length) { + displayNameList.push(noteTypeList[key]); + noteTypeMap.set(noteTypeList[key], key); + noteTypeIntMap.set(key, noteTypeList[key]); + key++; + } + + #if LUA_ALLOWED + var directories:Array = [Paths.mods('custom_notetypes/'), Paths.mods(Paths.currentModDirectory + '/custom_notetypes/')]; + for (i in 0...directories.length) { + var directory:String = directories[i]; + if(FileSystem.exists(directory)) { + for (file in FileSystem.readDirectory(directory)) { + var path = haxe.io.Path.join([directory, file]); + if (!FileSystem.isDirectory(path) && file.endsWith('.lua')) { + var fileToCheck:String = file.substr(0, file.length - 4); + if(!noteTypeMap.exists(fileToCheck)) { + displayNameList.push(fileToCheck); + noteTypeMap.set(fileToCheck, key); + noteTypeIntMap.set(key, fileToCheck); + key++; + } + } + } + } + } + #end + + for (i in 1...displayNameList.length) { + displayNameList[i] = i + '. ' + displayNameList[i]; + } + + noteTypeDropDown = new FlxUIDropDownMenuCustom(10, 105, FlxUIDropDownMenuCustom.makeStrIdLabelArray(displayNameList, true), function(character:String) { currentType = Std.parseInt(character); if(curSelectedNote != null && curSelectedNote[1] > -1) { - curSelectedNote[3] = currentType; + curSelectedNote[3] = noteTypeIntMap.get(currentType); updateGrid(); } }); @@ -634,6 +801,28 @@ class ChartingState extends MusicBeatState var tab_group_event = new FlxUI(null, UI_box); tab_group_event.name = 'Events'; + #if LUA_ALLOWED + var eventPushedMap:Map = new Map(); + var directories:Array = [Paths.mods('custom_events/'), Paths.mods(Paths.currentModDirectory + '/custom_events/')]; + for (i in 0...directories.length) { + var directory:String = directories[i]; + if(FileSystem.exists(directory)) { + for (file in FileSystem.readDirectory(directory)) { + var path = haxe.io.Path.join([directory, file]); + if (!FileSystem.isDirectory(path) && file != 'readme.txt' && file.endsWith('.txt')) { + var fileToCheck:String = file.substr(0, file.length - 4); + if(!eventPushedMap.exists(fileToCheck)) { + eventPushedMap.set(fileToCheck, true); + eventStuff.push([fileToCheck, File.getContent(path)]); + } + } + } + } + } + eventPushedMap.clear(); + eventPushedMap = null; + #end + descText = new FlxText(20, 200, 0, eventStuff[0][0]); var leEvents:Array = []; @@ -676,13 +865,34 @@ class ChartingState extends MusicBeatState var metronome:FlxUICheckBox; var metronomeStepper:FlxUINumericStepper; var metronomeOffsetStepper:FlxUINumericStepper; + var disableAutoScrolling:FlxUICheckBox; + #if desktop + var waveformEnabled:FlxUICheckBox; + var waveformUseInstrumental:FlxUICheckBox; + #end var instVolume:FlxUINumericStepper; var voicesVolume:FlxUINumericStepper; function addChartingUI() { var tab_group_chart = new FlxUI(null, UI_box); tab_group_chart.name = 'Charting'; + + #if desktop + waveformEnabled = new FlxUICheckBox(10, 90, null, null, "Visible Waveform", 100); + waveformEnabled.checked = false; + waveformEnabled.callback = function() + { + updateWaveform(); + }; + + waveformUseInstrumental = new FlxUICheckBox(waveformEnabled.x + 120, waveformEnabled.y, null, null, "Waveform for Instrumental", 100); + waveformUseInstrumental.checked = false; + waveformUseInstrumental.callback = function() + { + updateWaveform(); + }; + #end - check_mute_inst = new FlxUICheckBox(10, 240, null, null, "Mute Instrumental (in editor)", 100); + check_mute_inst = new FlxUICheckBox(10, 310, null, null, "Mute Instrumental (in editor)", 100); check_mute_inst.checked = false; check_mute_inst.callback = function() { @@ -694,7 +904,7 @@ class ChartingState extends MusicBeatState FlxG.sound.music.volume = vol; }; - var check_mute_vocals = new FlxUICheckBox(check_mute_inst.x, check_mute_inst.y + 30, null, null, "Mute Vocals (in editor)", 100); + var check_mute_vocals = new FlxUICheckBox(check_mute_inst.x + 120, check_mute_inst.y, null, null, "Mute Vocals (in editor)", 100); check_mute_vocals.checked = false; check_mute_vocals.callback = function() { @@ -710,27 +920,34 @@ class ChartingState extends MusicBeatState playSoundBf = new FlxUICheckBox(check_mute_inst.x, check_mute_vocals.y + 30, null, null, 'Play Sound (Boyfriend notes)', 100); playSoundBf.checked = false; - playSoundDad = new FlxUICheckBox(check_mute_inst.x, playSoundBf.y + 30, null, null, 'Play Sound (Opponent notes)', 100); + playSoundDad = new FlxUICheckBox(check_mute_inst.x + 120, playSoundBf.y, null, null, 'Play Sound (Opponent notes)', 100); playSoundDad.checked = false; - metronome = new FlxUICheckBox(15, 15, null, null, "Metronome Enabled", 100); + metronome = new FlxUICheckBox(10, 15, null, null, "Metronome Enabled", 100); metronomeStepper = new FlxUINumericStepper(15, 55, 5, _song.bpm, 1, 1500, 1); metronomeOffsetStepper = new FlxUINumericStepper(metronomeStepper.x + 100, metronomeStepper.y, 25, 0, 0, 1000, 1); + + disableAutoScrolling = new FlxUICheckBox(metronome.x + 120, metronome.y, null, null, "Disable Autoscroll (Not Recommended)", 120); - instVolume = new FlxUINumericStepper(metronomeStepper.x, metronomeStepper.y + 50, 0.1, 1, 0, 1, 1); + instVolume = new FlxUINumericStepper(metronomeStepper.x, 270, 0.1, 1, 0, 1, 1); instVolume.value = FlxG.sound.music.volume; instVolume.name = 'inst_volume'; voicesVolume = new FlxUINumericStepper(instVolume.x + 100, instVolume.y, 0.1, 1, 0, 1, 1); voicesVolume.value = vocals.volume; voicesVolume.name = 'voices_volume'; - tab_group_chart.add(metronome); tab_group_chart.add(new FlxText(metronomeStepper.x, metronomeStepper.y - 15, 0, 'BPM:')); tab_group_chart.add(new FlxText(metronomeOffsetStepper.x, metronomeOffsetStepper.y - 15, 0, 'Offset (ms):')); tab_group_chart.add(new FlxText(instVolume.x, instVolume.y - 15, 0, 'Inst Volume')); tab_group_chart.add(new FlxText(voicesVolume.x, voicesVolume.y - 15, 0, 'Voices Volume')); + tab_group_chart.add(metronome); + tab_group_chart.add(disableAutoScrolling); tab_group_chart.add(metronomeStepper); tab_group_chart.add(metronomeOffsetStepper); + #if desktop + tab_group_chart.add(waveformEnabled); + tab_group_chart.add(waveformUseInstrumental); + #end tab_group_chart.add(instVolume); tab_group_chart.add(voicesVolume); tab_group_chart.add(check_mute_inst); @@ -748,9 +965,9 @@ class ChartingState extends MusicBeatState // vocals.stop(); } - var file:String = Paths.voices(currentSongName); + var file:Dynamic = Paths.voices(currentSongName); vocals = new FlxSound(); - if (OpenFlAssets.exists(file)) { + if (Std.isOfType(file, Sound) || OpenFlAssets.exists(file)) { vocals.loadEmbedded(file); FlxG.sound.list.add(vocals); } @@ -919,7 +1136,7 @@ class ChartingState extends MusicBeatState var lastConductorPos:Float; var colorSine:Float = 0; override function update(elapsed:Float) - { + { curStep = recalculateSteps(); if(FlxG.sound.music.time < 0) { @@ -934,23 +1151,25 @@ class ChartingState extends MusicBeatState Conductor.songPosition = FlxG.sound.music.time; _song.song = UI_songTitle.text; - strumLine.y = getYfromStrum((Conductor.songPosition - sectionStartTime()) / curZoom % (Conductor.stepCrochet * _song.notes[curSection].lengthInSteps)); + strumLine.y = getYfromStrum((Conductor.songPosition - sectionStartTime()) / zoomList[curZoom] % (Conductor.stepCrochet * _song.notes[curSection].lengthInSteps)); camPos.y = strumLine.y; - if (curBeat % 4 == 0 && curStep >= 16 * (curSection + 1)) - { - trace(curStep); - trace((_song.notes[curSection].lengthInSteps) * (curSection + 1)); - trace('DUMBSHIT'); - - if (_song.notes[curSection + 1] == null) + if(!disableAutoScrolling.checked) { + if (strumLine.y > (gridBG.height / 2)) { - addSection(); - } + trace(curStep); + trace((_song.notes[curSection].lengthInSteps) * (curSection + 1)); + trace('DUMBSHIT'); - changeSection(curSection + 1, false); - } else if(strumLine.y < -10) { - changeSection(curSection - 1, false); + if (_song.notes[curSection + 1] == null) + { + addSection(); + } + + changeSection(curSection + 1, false); + } else if(strumLine.y < -10) { + changeSection(curSection - 1, false); + } } FlxG.watch.addQuick('daBeat', curBeat); @@ -960,7 +1179,7 @@ class ChartingState extends MusicBeatState { if (FlxG.mouse.overlaps(curRenderedNotes)) { - curRenderedNotes.forEach(function(note:Note) + curRenderedNotes.forEachAlive(function(note:Note) { if (FlxG.mouse.overlaps(note)) { @@ -981,7 +1200,7 @@ class ChartingState extends MusicBeatState if (FlxG.mouse.x > gridBG.x && FlxG.mouse.x < gridBG.x + gridBG.width && FlxG.mouse.y > gridBG.y - && FlxG.mouse.y < gridBG.y + (GRID_SIZE * _song.notes[curSection].lengthInSteps) * curZoom) + && FlxG.mouse.y < gridBG.y + (GRID_SIZE * _song.notes[curSection].lengthInSteps) * zoomList[curZoom]) { FlxG.log.add('added note'); addNote(); @@ -992,7 +1211,7 @@ class ChartingState extends MusicBeatState if (FlxG.mouse.x > gridBG.x && FlxG.mouse.x < gridBG.x + gridBG.width && FlxG.mouse.y > gridBG.y - && FlxG.mouse.y < gridBG.y + (GRID_SIZE * _song.notes[curSection].lengthInSteps) * curZoom) + && FlxG.mouse.y < gridBG.y + (GRID_SIZE * _song.notes[curSection].lengthInSteps) * zoomList[curZoom]) { dummyArrow.x = Math.floor(FlxG.mouse.x / GRID_SIZE) * GRID_SIZE; if (FlxG.keys.pressed.SHIFT) @@ -1025,28 +1244,26 @@ class ChartingState extends MusicBeatState if (!blockInput) { + if (FlxG.keys.justPressed.ESCAPE) + { + autosaveSong(); + LoadingState.loadAndSwitchState(new editors.EditorPlayState(sectionStartTime())); + } #if android var androidback = FlxG.android.justReleased.BACK; #else var androidback = false; #end - - if (FlxG.keys.justPressed.ENTER #if mobileC || androidback #end) + if (FlxG.keys.justPressed.ENTER || androidback) { + autosaveSong(); FlxG.mouse.visible = false; PlayState.SONG = _song; FlxG.sound.music.stop(); if(vocals != null) vocals.stop(); - var songName:String = PlayState.SONG.song.toLowerCase(); - for (week in 0...WeekData.songsNames.length) { - var weekSongs:Array = WeekData.songsNames[week]; - for (i in 0...weekSongs.length) { - if(weekSongs[i].toLowerCase() == songName) { - PlayState.storyWeek = week; - } - } - } + //if(_song.stage == null) _song.stage = stageDropDown.selectedLabel; + StageData.loadDirectory(_song); LoadingState.loadAndSwitchState(new PlayState()); } @@ -1061,12 +1278,12 @@ class ChartingState extends MusicBeatState } } - if(FlxG.keys.justPressed.Z && zoomMult > 0) { - --zoomMult; + if(FlxG.keys.justPressed.Z && curZoom > 0) { + --curZoom; updateZoom(); } - if(FlxG.keys.justPressed.X && zoomMult < 4) { - zoomMult++; + if(FlxG.keys.justPressed.X && curZoom < zoomList.length-1) { + curZoom++; updateZoom(); } @@ -1123,56 +1340,52 @@ class ChartingState extends MusicBeatState } } - if (!FlxG.keys.pressed.SHIFT) + if (FlxG.keys.pressed.W || FlxG.keys.pressed.S || _pad.buttonUp.pressed || _pad.buttonDown.pressed) { - if (FlxG.keys.pressed.W || FlxG.keys.pressed.S || _pad.buttonUp.pressed || _pad.buttonDown.pressed) - { - FlxG.sound.music.pause(); - vocals.pause(); + FlxG.sound.music.pause(); - var daTime:Float = 700 * FlxG.elapsed; + var holdingShift:Float = 1; + if (FlxG.keys.pressed.CONTROL) holdingShift = 0.25; + else if (FlxG.keys.pressed.SHIFT) holdingShift = 4; - if (FlxG.keys.pressed.W || _pad.buttonUp.pressed) - { - FlxG.sound.music.time -= daTime; - } - else - FlxG.sound.music.time += daTime; + var daTime:Float = 700 * FlxG.elapsed * holdingShift; + if (FlxG.keys.pressed.W || _pad.buttonUp.pressed) + { + FlxG.sound.music.time -= daTime; + } + else + FlxG.sound.music.time += daTime; + + if(vocals != null) { + vocals.pause(); vocals.time = FlxG.sound.music.time; } } - else - { - if (FlxG.keys.justPressed.W || FlxG.keys.justPressed.S || _pad.buttonUp.pressed || _pad.buttonDown.pressed) - { - FlxG.sound.music.pause(); - vocals.pause(); - - var daTime:Float = Conductor.stepCrochet * 2; - if (FlxG.keys.justPressed.W || _pad.buttonUp.justPressed) - { - FlxG.sound.music.time -= daTime; - } - else - FlxG.sound.music.time += daTime; + var shiftThing:Int = 1; + if (FlxG.keys.pressed.SHIFT) + shiftThing = 4; - vocals.time = FlxG.sound.music.time; + if (FlxG.keys.justPressed.RIGHT || FlxG.keys.justPressed.D || _pad.buttonRight.pressed) + changeSection(curSection + shiftThing); + if (FlxG.keys.justPressed.LEFT || FlxG.keys.justPressed.A || _pad.buttonLeft.pressed) { + if(curSection <= 0) { + changeSection(_song.notes.length-1); + } else { + changeSection(curSection - shiftThing); + } + } + } else if (FlxG.keys.justPressed.ENTER) { + for (i in 0...blockPressWhileTypingOn.length) { + if(blockPressWhileTypingOn[i].hasFocus) { + blockPressWhileTypingOn[i].hasFocus = false; } } } _song.bpm = tempBpm; - var shiftThing:Int = 1; - if (FlxG.keys.pressed.SHIFT) - shiftThing = 4; - if (FlxG.keys.justPressed.RIGHT || FlxG.keys.justPressed.D || _pad.buttonRight.justPressed) - changeSection(curSection + shiftThing); - if (FlxG.keys.justPressed.LEFT || FlxG.keys.justPressed.A || _pad.buttonLeft.justPressed) - changeSection(curSection - shiftThing); - if(FlxG.sound.music.time < 0) { FlxG.sound.music.pause(); FlxG.sound.music.time = 0; @@ -1183,7 +1396,7 @@ class ChartingState extends MusicBeatState changeSection(); } Conductor.songPosition = FlxG.sound.music.time; - strumLine.y = getYfromStrum((Conductor.songPosition - sectionStartTime()) / curZoom % (Conductor.stepCrochet * _song.notes[curSection].lengthInSteps)); + strumLine.y = getYfromStrum((Conductor.songPosition - sectionStartTime()) / zoomList[curZoom] % (Conductor.stepCrochet * _song.notes[curSection].lengthInSteps)); camPos.y = strumLine.y; bpmTxt.text = @@ -1195,7 +1408,6 @@ class ChartingState extends MusicBeatState var playedSound:Array = [false, false, false, false]; //Prevents earrape GF ahegao sounds curRenderedNotes.forEachAlive(function(note:Note) { note.alpha = 1; - #if !html5 //Fixes issues where notes would disappear while a note is selected if(curSelectedNote != null) { var noteDataToCheck:Int = note.noteData; if(noteDataToCheck > -1 && note.mustPress != _song.notes[curSection].mustHitSection) noteDataToCheck += 4; @@ -1204,22 +1416,19 @@ class ChartingState extends MusicBeatState { colorSine += 180 * elapsed; var colorVal:Float = 0.7 + Math.sin((Math.PI * colorSine) / 180) * 0.3; - note.color.lightness = colorVal; - note.alpha = 0.999; //Alpha can't be 100% or the color won't be updated for some reason, guess i will die + note.color = FlxColor.fromRGBFloat(colorVal, colorVal, colorVal, 0.999); //Alpha can't be 100% or the color won't be updated for some reason, guess i will die } } - #end if(note.strumTime <= Conductor.songPosition) { note.alpha = 0.4; if(note.strumTime > lastConductorPos && ((playSoundBf.checked && note.mustPress) || (playSoundDad.checked && !note.mustPress)) && FlxG.sound.music.playing && note.noteData > -1) { var data:Int = note.noteData % 4; if(!playedSound[data]) { - var soundToPlay = 'Charting_'; + var soundToPlay = 'ChartingTick'; if(_song.player1 == 'gf') { //Easter egg - soundToPlay = 'GF_'; + soundToPlay = 'GF_' + Std.string(data + 1); } - soundToPlay += Std.string(data + 1); FlxG.sound.play(Paths.sound(soundToPlay)); playedSound[data] = true; } @@ -1241,19 +1450,60 @@ class ChartingState extends MusicBeatState } function updateZoom() { - curZoom = 0.5; - if(zoomMult > 0) { - curZoom = (1 << (zoomMult - 1)); - } - zoomTxt.text = 'Zoom: ' + curZoom + 'x'; + zoomTxt.text = 'Zoom: ' + zoomList[curZoom] + 'x'; reloadGridLayer(); } + function loadAudioBuffer() { + if(audioBuffers[0] != null) { + audioBuffers[0].dispose(); + } + audioBuffers[0] = null; + #if dontUseManifest + if(FileSystem.exists(Paths.modFolders('songs/' + currentSongName + '/Inst.ogg'))) { + audioBuffers[0] = AudioBuffer.fromFile(Paths.modFolders('songs/' + currentSongName + '/Inst.ogg')); + //trace('Custom vocals found'); + } + else { #end + var leVocals:Dynamic = Paths.inst(currentSongName); + if (!Std.isOfType(leVocals, Sound) && OpenFlAssets.exists(leVocals)) { //Vanilla inst + audioBuffers[0] = AudioBuffer.fromFile('./' + leVocals.substr(6)); + //trace('Inst found'); + } + #if dontUseManifest + } + #end + + if(audioBuffers[1] != null) { + audioBuffers[1].dispose(); + } + audioBuffers[1] = null; + #if dontUseManifest + if(FileSystem.exists(Paths.modFolders('songs/' + currentSongName + '/Voices.ogg'))) { + audioBuffers[1] = AudioBuffer.fromFile(Paths.modFolders('songs/' + currentSongName + '/Voices.ogg')); + //trace('Custom vocals found'); + } else { #end + var leVocals:Dynamic = Paths.voices(currentSongName); + if (!Std.isOfType(leVocals, Sound) && OpenFlAssets.exists(leVocals)) { //Vanilla voices + audioBuffers[1] = AudioBuffer.fromFile('./' + leVocals.substr(6)); + //trace('Voices found, LETS FUCKING GOOOO'); + } + #if dontUseManifest + } + #end + } + function reloadGridLayer() { gridLayer.clear(); - gridBG = FlxGridOverlay.create(GRID_SIZE, GRID_SIZE, GRID_SIZE * 9, Std.int(GRID_SIZE * 32 * curZoom)); + gridBG = FlxGridOverlay.create(GRID_SIZE, GRID_SIZE, GRID_SIZE * 9, Std.int(GRID_SIZE * 32 * zoomList[curZoom])); gridLayer.add(gridBG); + #if desktop + if(waveformEnabled != null) { + updateWaveform(); + } + #end + var gridBlack:FlxSprite = new FlxSprite(0, gridBG.height / 2).makeGraphic(Std.int(GRID_SIZE * 9), Std.int(gridBG.height / 2), FlxColor.BLACK); gridBlack.alpha = 0.4; gridLayer.add(gridBlack); @@ -1266,6 +1516,82 @@ class ChartingState extends MusicBeatState updateGrid(); } + var waveformPrinted:Bool = true; + var audioBuffers:Array = [null, null]; + function updateWaveform() { + #if desktop + if(waveformPrinted) { + waveformSprite.makeGraphic(Std.int(GRID_SIZE * 8), Std.int(gridBG.height), 0x00FFFFFF); + waveformSprite.pixels.fillRect(new Rectangle(0, 0, gridBG.width, gridBG.height), 0x00FFFFFF); + } + waveformPrinted = false; + + var checkForVoices:Int = 1; + if(waveformUseInstrumental.checked) checkForVoices = 0; + + if(!waveformEnabled.checked || audioBuffers[checkForVoices] == null) { + //trace('Epic fail on the waveform lol'); + return; + } + + var sampleMult:Float = audioBuffers[checkForVoices].sampleRate / 44100; + var index:Int = Std.int(sectionStartTime() * 44.0875 * sampleMult); + var drawIndex:Int = 0; + + var steps:Int = _song.notes[curSection].lengthInSteps; + if(Math.isNaN(steps) || steps < 1) steps = 16; + var samplesPerRow:Int = Std.int(((Conductor.stepCrochet * steps * 1.1 * sampleMult) / 16) / zoomList[curZoom]); + if(samplesPerRow < 1) samplesPerRow = 1; + var waveBytes:Bytes = audioBuffers[checkForVoices].data.toBytes(); + + var min:Float = 0; + var max:Float = 0; + while (index < (waveBytes.length - 1)) + { + var byte:Int = waveBytes.getUInt16(index * 4); + + if (byte > 65535 / 2) + byte -= 65535; + + var sample:Float = (byte / 65535); + + if (sample > 0) + { + if (sample > max) + max = sample; + } + else if (sample < 0) + { + if (sample < min) + min = sample; + } + + if ((index % samplesPerRow) == 0) + { + // trace("min: " + min + ", max: " + max); + + /*if (drawIndex > gridBG.height) + { + drawIndex = 0; + }*/ + + var pixelsMin:Float = Math.abs(min * (GRID_SIZE * 8)); + var pixelsMax:Float = max * (GRID_SIZE * 8); + waveformSprite.pixels.fillRect(new Rectangle(Std.int((GRID_SIZE * 4) - pixelsMin), drawIndex, pixelsMin + pixelsMax, 1), FlxColor.BLUE); + drawIndex++; + + min = 0; + max = 0; + + if(drawIndex > gridBG.height) break; + } + + index++; + } + waveformPrinted = true; + #end + } + function changeNoteSustain(value:Float):Void { if (curSelectedNote != null) @@ -1322,6 +1648,7 @@ class ChartingState extends MusicBeatState updateGrid(); updateSectionUI(); + updateWaveform(); } function changeSection(sec:Int = 0, ?updateMusic:Bool = true):Void @@ -1361,6 +1688,8 @@ class ChartingState extends MusicBeatState { changeSection(); } + Conductor.songPosition = FlxG.sound.music.time; + updateWaveform(); } function updateSectionUI():Void @@ -1395,13 +1724,13 @@ class ChartingState extends MusicBeatState function loadHealthIconFromCharacter(char:String) { var characterPath:String = 'characters/' + char + '.json'; - #if MODS_ALLOWED - var path:String = Paths.mods(characterPath); - if (!Utils.existsCheck(path)) { + #if dontUseManifest + var path:String = Paths.modFolders(characterPath); + if (!FileSystem.exists(path)) { path = Paths.getPreloadPath(characterPath); } - if (!Utils.existsCheck(path)) + if (!FileSystem.exists(path)) #else var path:String = Paths.getPreloadPath(characterPath); if (!OpenFlAssets.exists(path)) @@ -1410,7 +1739,7 @@ class ChartingState extends MusicBeatState path = Paths.getPreloadPath('characters/' + Character.DEFAULT_CHARACTER + '.json'); //If a character couldn't be found, change him to BF just to prevent a crash } - #if windows + #if dontUseManifest var rawJson = File.getContent(path); #else var rawJson = OpenFlAssets.getText(path); @@ -1425,8 +1754,13 @@ class ChartingState extends MusicBeatState if (curSelectedNote != null) { if(curSelectedNote[1] > -1) { stepperSusLength.value = curSelectedNote[2]; - if(curSelectedNote[3] != null && curSelectedNote[3] > -1 && curSelectedNote[3] < noteTypeList.length) { - noteTypeDropDown.selectedLabel = noteTypeList[curSelectedNote[3]]; + if(curSelectedNote[3] != null) { + currentType = noteTypeMap.get(curSelectedNote[3]); + if(currentType <= 0) { + noteTypeDropDown.selectedLabel = ''; + } else { + noteTypeDropDown.selectedLabel = currentType + '. ' + curSelectedNote[3]; + } } } else { eventDropDown.selectedLabel = curSelectedNote[2]; @@ -1437,7 +1771,7 @@ class ChartingState extends MusicBeatState value1InputText.text = curSelectedNote[3]; value2InputText.text = curSelectedNote[4]; } - strumTimeInputText.text = curSelectedNote[0]; + strumTimeInputText.text = '' + curSelectedNote[0]; } } @@ -1488,17 +1822,22 @@ class ChartingState extends MusicBeatState curRenderedSustains.add(setupSusNote(note)); } + if(note.y < -150) note.y = -150; + if(note.noteData < 0) { - var daText:AttachedFlxText = new AttachedFlxText(0, 0, 400, 'Event: ' + note.eventName + '\nValue 1: ' + note.eventVal1 + '\nValue 2: ' + note.eventVal2, 16); - daText.setFormat(Paths.font("vcr.ttf"), 16, FlxColor.WHITE, RIGHT, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK); + var daText:AttachedFlxText = new AttachedFlxText(0, 0, 400, 'Event: ' + note.eventName + ' (' + Math.floor(note.strumTime) + ' ms)' + '\nValue 1: ' + note.eventVal1 + '\nValue 2: ' + note.eventVal2, 12); + daText.setFormat(Paths.font("vcr.ttf"), 12, FlxColor.WHITE, RIGHT, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK); daText.xAdd = -410; - daText.yAdd = -5; daText.borderSize = 1; curRenderedNoteType.add(daText); daText.sprTracker = note; } else { - if(note.noteType != 0 && i[3] != null) { - var daText:AttachedFlxText = new AttachedFlxText(0, 0, 100, Std.string(note.noteType), 24); + if(i[3] != null && note.noteType != null && note.noteType.length > 0) { + var typeInt:Null = noteTypeMap.get(i[3]); + var theType:String = '' + typeInt; + if(typeInt == null) theType = '?'; + + var daText:AttachedFlxText = new AttachedFlxText(0, 0, 100, theType, 24); daText.setFormat(Paths.font("vcr.ttf"), 24, FlxColor.WHITE, CENTER, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK); daText.xAdd = -32; daText.yAdd = 6; @@ -1531,12 +1870,19 @@ class ChartingState extends MusicBeatState var daNoteInfo = i[1]; var daStrumTime = i[0]; var daSus:Dynamic = i[2]; - var daType:Dynamic = i[3]; var note:Note = new Note(daStrumTime, daNoteInfo % 4, null, null, true); if(daNoteInfo > -1) { //Common note + if(!Std.isOfType(i[3], String)) //Convert old note type to new note type format + { + i[3] = noteTypeIntMap.get(i[3]); + } + if(i.length > 3 && (i[3] == null || i[3].length < 1)) + { + i.remove(i[3]); + } note.sustainLength = daSus; - note.noteType = daType; + note.noteType = i[3]; } else { //Event note note.loadGraphic(Paths.image('eventArrow')); note.eventName = daSus; @@ -1554,13 +1900,13 @@ class ChartingState extends MusicBeatState } } - note.y = (GRID_SIZE * (isNextSection ? 16 : 0)) * curZoom + Math.floor(getYfromStrum((daStrumTime - sectionStartTime(isNextSection ? 1 : 0)) % (Conductor.stepCrochet * _song.notes[curSection].lengthInSteps), false)); + note.y = (GRID_SIZE * (isNextSection ? 16 : 0)) * zoomList[curZoom] + Math.floor(getYfromStrum((daStrumTime - sectionStartTime(isNextSection ? 1 : 0)) % (Conductor.stepCrochet * _song.notes[curSection].lengthInSteps), false)); return note; } function setupSusNote(note:Note):FlxSprite { - var height:Int = Math.floor(FlxMath.remapToRange(note.sustainLength, 0, Conductor.stepCrochet * 16, 0, (gridBG.height / gridMult)) + (GRID_SIZE * curZoom) - GRID_SIZE / 2); - var minHeight:Int = Std.int((GRID_SIZE * curZoom / 2) + GRID_SIZE / 2); + var height:Int = Math.floor(FlxMath.remapToRange(note.sustainLength, 0, Conductor.stepCrochet * 16, 0, (gridBG.height / gridMult)) + (GRID_SIZE * zoomList[curZoom]) - GRID_SIZE / 2); + var minHeight:Int = Std.int((GRID_SIZE * zoomList[curZoom] / 2) + GRID_SIZE / 2); if(height < minHeight) height = minHeight; if(height < 1) height = 1; //Prevents error of invalid height @@ -1590,7 +1936,7 @@ class ChartingState extends MusicBeatState for (i in _song.notes[curSection].sectionNotes) { - if (i.length > 2 && i[0] == note.strumTime && i[1] == noteDataToCheck) + if (i != curSelectedNote && i.length > 2 && i[0] == note.strumTime && i[1] == noteDataToCheck) { curSelectedNote = i; break; @@ -1639,7 +1985,7 @@ class ChartingState extends MusicBeatState var daType = currentType; if(noteData > -1) { - _song.notes[curSection].sectionNotes.push([noteStrum, noteData, noteSus, daType]); + _song.notes[curSection].sectionNotes.push([noteStrum, noteData, noteSus, noteTypeIntMap.get(daType)]); } else { var event = eventStuff[Std.parseInt(eventDropDown.selectedId)][0]; var text1 = value1InputText.text; @@ -1650,28 +1996,26 @@ class ChartingState extends MusicBeatState if (FlxG.keys.pressed.CONTROL && noteData > -1) { - _song.notes[curSection].sectionNotes.push([noteStrum, (noteData + 4) % 8, noteSus, daType]); + _song.notes[curSection].sectionNotes.push([noteStrum, (noteData + 4) % 8, noteSus, noteTypeIntMap.get(daType)]); } trace(noteData + ', ' + noteStrum + ', ' + curSection); - strumTimeInputText.text = curSelectedNote[0]; + strumTimeInputText.text = '' + curSelectedNote[0]; updateGrid(); updateNoteUI(); - - autosaveSong(); } function getStrumTime(yPos:Float, doZoomCalc:Bool = true):Float { - var leZoom:Float = curZoom; + var leZoom:Float = zoomList[curZoom]; if(!doZoomCalc) leZoom = 1; return FlxMath.remapToRange(yPos, gridBG.y, gridBG.y + (gridBG.height / gridMult) * leZoom, 0, 16 * Conductor.stepCrochet); } function getYfromStrum(strumTime:Float, doZoomCalc:Bool = true):Float { - var leZoom:Float = curZoom; + var leZoom:Float = zoomList[curZoom]; if(!doZoomCalc) leZoom = 1; return FlxMath.remapToRange(strumTime, 0, 16 * Conductor.stepCrochet, gridBG.y, gridBG.y + (gridBG.height / gridMult) * leZoom); } @@ -1732,13 +2076,28 @@ class ChartingState extends MusicBeatState FlxG.save.flush(); } + function clearEvents() { + for (sec in 0..._song.notes.length) { + var count:Int = 0; + while(count < _song.notes[sec].sectionNotes.length) { + var note:Array = _song.notes[sec].sectionNotes[count]; + if(note != null && note[1] < 0) { + _song.notes[sec].sectionNotes.remove(note); + } else { + count++; + } + } + } + updateGrid(); + } + private function saveLevel() { var json = { "song": _song }; - var data:String = Json.stringify(json); + var data:String = Json.stringify(json, "\t"); openfl.system.System.setClipboard(data.trim()); @@ -1748,7 +2107,7 @@ class ChartingState extends MusicBeatState _file.addEventListener(Event.COMPLETE, onSaveComplete); _file.addEventListener(Event.CANCEL, onSaveCancel); _file.addEventListener(IOErrorEvent.IO_ERROR, onSaveError); - _file.save(data.trim(), _song.song.toLowerCase() + ".json"); + _file.save(data.trim(), Paths.formatToSongPath(_song.song) + ".json"); } } @@ -1790,6 +2149,7 @@ class ChartingState extends MusicBeatState player1: _song.player1, player2: _song.player2, player3: _song.player3, + stage: _song.stage, validScore: false }; var json = { @@ -1861,4 +2221,4 @@ class AttachedFlxText extends FlxText alpha = sprTracker.alpha; } } -} +} \ No newline at end of file diff --git a/source/editors/DialogueCharacterEditorState.hx b/source/editors/DialogueCharacterEditorState.hx new file mode 100644 index 000000000..54e53be05 --- /dev/null +++ b/source/editors/DialogueCharacterEditorState.hx @@ -0,0 +1,799 @@ +package editors; + +#if desktop +import Discord.DiscordClient; +#end +import flixel.FlxG; +import flixel.FlxSprite; +import flixel.addons.display.FlxGridOverlay; +import flixel.addons.transition.FlxTransitionableState; +import flixel.group.FlxGroup.FlxTypedGroup; +import flixel.math.FlxMath; +import flixel.text.FlxText; +import flixel.util.FlxColor; +import flixel.system.FlxSound; +import flixel.addons.ui.FlxInputText; +import flixel.addons.ui.FlxUI9SliceSprite; +import flixel.addons.ui.FlxUI; +import flixel.addons.ui.FlxUICheckBox; +import flixel.addons.ui.FlxUIInputText; +import flixel.addons.ui.FlxUINumericStepper; +import flixel.addons.ui.FlxUITabMenu; +import flixel.ui.FlxButton; +import openfl.net.FileReference; +import openfl.events.Event; +import openfl.events.IOErrorEvent; +import flash.net.FileFilter; +import haxe.Json; +import DialogueBoxPsych; +import flixel.FlxCamera; +import flixel.group.FlxSpriteGroup; +import lime.system.Clipboard; +#if sys +import sys.io.File; +#end + +using StringTools; + +class DialogueCharacterEditorState extends MusicBeatState +{ + var box:FlxSprite; + var daText:Alphabet = null; + + private static var TIP_TEXT_MAIN:String = + 'JKLI - Move camera (Hold Shift to move 4x faster) + \nQ/E - Zoom out/in + \nR - Reset Camera + \nH - Toggle Speech Bubble + \nSpace - Reset text'; + + private static var TIP_TEXT_OFFSET:String = + 'JKLI - Move camera (Hold Shift to move 4x faster) + \nQ/E - Zoom out/in + \nR - Reset Camera + \nH - Toggle Ghosts + \nWASD - Move Looping animation offset (Red) + \nArrow Keys - Move Idle/Finished animation offset (Blue) + \nHold Shift to move offsets 10x faster'; + + var tipText:FlxText; + var offsetLoopText:FlxText; + var offsetIdleText:FlxText; + + var camGame:FlxCamera; + var camOther:FlxCamera; + + var mainGroup:FlxSpriteGroup; + var hudGroup:FlxSpriteGroup; + + var key_space:FlxButton; + + var character:DialogueCharacter; + var ghostLoop:DialogueCharacter; + var ghostIdle:DialogueCharacter; + + override function create() { + persistentUpdate = persistentDraw = true; + camGame = new FlxCamera(); + camOther = new FlxCamera(); + camGame.bgColor = FlxColor.fromHSL(0, 0, 0.5); + camOther.bgColor.alpha = 0; + + FlxG.cameras.reset(camGame); + FlxG.cameras.add(camOther); + FlxCamera.defaultCameras = [camOther]; + + mainGroup = new FlxSpriteGroup(); + mainGroup.cameras = [camGame]; + hudGroup = new FlxSpriteGroup(); + hudGroup.cameras = [camGame]; + add(mainGroup); + add(hudGroup); + + character = new DialogueCharacter(); + character.scrollFactor.set(); + mainGroup.add(character); + + ghostLoop = new DialogueCharacter(); + ghostLoop.alpha = 0; + ghostLoop.color = FlxColor.RED; + ghostLoop.isGhost = true; + ghostLoop.jsonFile = character.jsonFile; + ghostLoop.cameras = [camGame]; + add(ghostLoop); + + ghostIdle = new DialogueCharacter(); + ghostIdle.alpha = 0; + ghostIdle.color = FlxColor.BLUE; + ghostIdle.isGhost = true; + ghostIdle.jsonFile = character.jsonFile; + ghostIdle.cameras = [camGame]; + add(ghostIdle); + + box = new FlxSprite(70, 370); + box.frames = Paths.getSparrowAtlas('speech_bubble'); + box.scrollFactor.set(); + box.antialiasing = ClientPrefs.globalAntialiasing; + box.animation.addByPrefix('normal', 'speech bubble normal', 24); + box.animation.addByPrefix('center', 'speech bubble middle', 24); + box.animation.play('normal', true); + box.setGraphicSize(Std.int(box.width * 0.9)); + box.updateHitbox(); + hudGroup.add(box); + + tipText = new FlxText(10, 10, FlxG.width - 20, TIP_TEXT_MAIN, 8); + tipText.setFormat(Paths.font("vcr.ttf"), 16, FlxColor.WHITE, RIGHT, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK); + tipText.cameras = [camOther]; + tipText.scrollFactor.set(); + add(tipText); + + offsetLoopText = new FlxText(10, 10, 0, '', 32); + offsetLoopText.setFormat(Paths.font("vcr.ttf"), 32, FlxColor.WHITE, LEFT, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK); + offsetLoopText.cameras = [camOther]; + offsetLoopText.scrollFactor.set(); + add(offsetLoopText); + offsetLoopText.visible = false; + + offsetIdleText = new FlxText(10, 46, 0, '', 32); + offsetIdleText.setFormat(Paths.font("vcr.ttf"), 32, FlxColor.WHITE, LEFT, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK); + offsetIdleText.cameras = [camOther]; + offsetIdleText.scrollFactor.set(); + add(offsetIdleText); + offsetIdleText.visible = false; + + reloadCharacter(); + updateTextBox(); + reloadText(); + + addEditorBox(); + FlxG.mouse.visible = true; + updateCharTypeBox(); + + key_space = new FlxButton(60, 60, ""); + key_space.loadGraphic(Paths.image("key_space")); //"assets/images/key_space.png" + key_space.alpha = 0.75; + add(key_space); + + super.create(); + } + + var UI_typebox:FlxUITabMenu; + var UI_mainbox:FlxUITabMenu; + function addEditorBox() { + var tabs = [ + {name: 'Character Type', label: 'Character Type'}, + ]; + UI_typebox = new FlxUITabMenu(null, tabs, true); + UI_typebox.resize(120, 180); + UI_typebox.x = 900; + UI_typebox.y = FlxG.height - UI_typebox.height - 50; + UI_typebox.scrollFactor.set(); + UI_typebox.camera = camGame; + addTypeUI(); + add(UI_typebox); + + var tabs = [ + {name: 'Animations', label: 'Animations'}, + {name: 'Character', label: 'Character'}, + ]; + UI_mainbox = new FlxUITabMenu(null, tabs, true); + UI_mainbox.resize(200, 250); + UI_mainbox.x = UI_typebox.x + UI_typebox.width; + UI_mainbox.y = FlxG.height - UI_mainbox.height - 50; + UI_mainbox.scrollFactor.set(); + UI_mainbox.camera = camGame; + addAnimationsUI(); + addCharacterUI(); + add(UI_mainbox); + UI_mainbox.selected_tab_id = 'Character'; + lastTab = UI_mainbox.selected_tab_id; + } + + var leftCheckbox:FlxUICheckBox; + var centerCheckbox:FlxUICheckBox; + var rightCheckbox:FlxUICheckBox; + function addTypeUI() { + var tab_group = new FlxUI(null, UI_typebox); + tab_group.name = "Character Type"; + + leftCheckbox = new FlxUICheckBox(10, 20, null, null, "Left", 100); + leftCheckbox.callback = function() + { + character.jsonFile.dialogue_pos = 'left'; + updateCharTypeBox(); + }; + + centerCheckbox = new FlxUICheckBox(leftCheckbox.x, leftCheckbox.y + 40, null, null, "Center", 100); + centerCheckbox.callback = function() + { + character.jsonFile.dialogue_pos = 'center'; + updateCharTypeBox(); + }; + + rightCheckbox = new FlxUICheckBox(centerCheckbox.x, centerCheckbox.y + 40, null, null, "Right", 100); + rightCheckbox.callback = function() + { + character.jsonFile.dialogue_pos = 'right'; + updateCharTypeBox(); + }; + + tab_group.add(leftCheckbox); + tab_group.add(centerCheckbox); + tab_group.add(rightCheckbox); + UI_typebox.addGroup(tab_group); + } + + var curSelectedAnim:String; + var animationArray:Array = []; + var animationDropDown:FlxUIDropDownMenuCustom; + var animationInputText:FlxUIInputText; + var loopInputText:FlxUIInputText; + var idleInputText:FlxUIInputText; + function addAnimationsUI() { + var tab_group = new FlxUI(null, UI_mainbox); + tab_group.name = "Animations"; + + animationDropDown = new FlxUIDropDownMenuCustom(10, 30, FlxUIDropDownMenuCustom.makeStrIdLabelArray([''], true), function(animation:String) { + var anim:String = animationArray[Std.parseInt(animation)]; + if(character.dialogueAnimations.exists(anim)) { + ghostLoop.playAnim(anim); + ghostIdle.playAnim(anim, true); + + curSelectedAnim = anim; + var animShit:DialogueAnimArray = character.dialogueAnimations.get(curSelectedAnim); + offsetLoopText.text = 'Loop: ' + animShit.loop_offsets; + offsetIdleText.text = 'Idle: ' + animShit.idle_offsets; + + animationInputText.text = animShit.anim; + loopInputText.text = animShit.loop_name; + idleInputText.text = animShit.idle_name; + } + }); + + animationInputText = new FlxUIInputText(15, 85, 80, '', 8); + animationInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; + blockPressWhileTypingOn.push(animationInputText); + loopInputText = new FlxUIInputText(animationInputText.x, animationInputText.y + 35, 150, '', 8); + loopInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; + blockPressWhileTypingOn.push(loopInputText); + idleInputText = new FlxUIInputText(loopInputText.x, loopInputText.y + 40, 150, '', 8); + idleInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; + blockPressWhileTypingOn.push(idleInputText); + + var addUpdateButton:FlxButton = new FlxButton(10, idleInputText.y + 30, "Add/Update", function() { + var theAnim:String = animationInputText.text.trim(); + if(character.dialogueAnimations.exists(theAnim)) //Update + { + for (i in 0...character.jsonFile.animations.length) { + var animArray:DialogueAnimArray = character.jsonFile.animations[i]; + if(animArray.anim.trim() == theAnim) { + animArray.loop_name = loopInputText.text; + animArray.idle_name = idleInputText.text; + break; + } + } + + character.reloadAnimations(); + ghostLoop.reloadAnimations(); + ghostIdle.reloadAnimations(); + if(curSelectedAnim == theAnim) { + ghostLoop.playAnim(theAnim); + ghostIdle.playAnim(theAnim, true); + } + } + else //Add + { + var newAnim:DialogueAnimArray = { + anim: theAnim, + loop_name: loopInputText.text, + loop_offsets: [0, 0], + idle_name: idleInputText.text, + idle_offsets: [0, 0] + } + character.jsonFile.animations.push(newAnim); + + var lastSelected:String = animationDropDown.selectedLabel; + character.reloadAnimations(); + ghostLoop.reloadAnimations(); + ghostIdle.reloadAnimations(); + reloadAnimationsDropDown(); + animationDropDown.selectedLabel = lastSelected; + } + }); + + var removeUpdateButton:FlxButton = new FlxButton(100, addUpdateButton.y, "Remove", function() { + for (i in 0...character.jsonFile.animations.length) { + var animArray:DialogueAnimArray = character.jsonFile.animations[i]; + if(animArray != null && animArray.anim.trim() == animationInputText.text.trim()) { + var lastSelected:String = animationDropDown.selectedLabel; + character.jsonFile.animations.remove(animArray); + character.reloadAnimations(); + ghostLoop.reloadAnimations(); + ghostIdle.reloadAnimations(); + reloadAnimationsDropDown(); + if(character.jsonFile.animations.length > 0 && lastSelected == animArray.anim.trim()) { + var animToPlay:String = character.jsonFile.animations[0].anim; + ghostLoop.playAnim(animToPlay); + ghostIdle.playAnim(animToPlay, true); + } + animationDropDown.selectedLabel = lastSelected; + animationInputText.text = ''; + loopInputText.text = ''; + idleInputText.text = ''; + break; + } + } + }); + + tab_group.add(new FlxText(animationDropDown.x, animationDropDown.y - 18, 0, 'Animations:')); + tab_group.add(new FlxText(animationInputText.x, animationInputText.y - 18, 0, 'Animation name:')); + tab_group.add(new FlxText(loopInputText.x, loopInputText.y - 18, 0, 'Loop name on .XML file:')); + tab_group.add(new FlxText(idleInputText.x, idleInputText.y - 18, 0, 'Idle/Finished name on .XML file:')); + tab_group.add(animationInputText); + tab_group.add(loopInputText); + tab_group.add(idleInputText); + tab_group.add(addUpdateButton); + tab_group.add(removeUpdateButton); + tab_group.add(animationDropDown); + UI_mainbox.addGroup(tab_group); + reloadAnimationsDropDown(); + } + + function reloadAnimationsDropDown() { + animationArray = []; + for (anim in character.jsonFile.animations) { + animationArray.push(anim.anim); + } + + if(animationArray.length < 1) animationArray = ['']; + animationDropDown.setData(FlxUIDropDownMenuCustom.makeStrIdLabelArray(animationArray, true)); + } + + var imageInputText:FlxUIInputText; + var scaleStepper:FlxUINumericStepper; + var xStepper:FlxUINumericStepper; + var yStepper:FlxUINumericStepper; + var blockPressWhileTypingOn:Array = []; + function addCharacterUI() { + var tab_group = new FlxUI(null, UI_mainbox); + tab_group.name = "Character"; + + imageInputText = new FlxUIInputText(10, 30, 80, character.jsonFile.image, 8); + imageInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; + blockPressWhileTypingOn.push(imageInputText); + xStepper = new FlxUINumericStepper(imageInputText.x, imageInputText.y + 50, 10, character.jsonFile.position[0], -2000, 2000, 0); + yStepper = new FlxUINumericStepper(imageInputText.x + 80, xStepper.y, 10, character.jsonFile.position[1], -2000, 2000, 0); + scaleStepper = new FlxUINumericStepper(imageInputText.x, xStepper.y + 50, 0.05, character.jsonFile.scale, 0.1, 10, 2); + + tab_group.add(new FlxText(10, imageInputText.y - 18, 0, 'Image file name:')); + tab_group.add(new FlxText(10, xStepper.y - 18, 0, 'Position Offset:')); + tab_group.add(new FlxText(10, scaleStepper.y - 18, 0, 'Scale:')); + tab_group.add(imageInputText); + tab_group.add(xStepper); + tab_group.add(yStepper); + tab_group.add(scaleStepper); + + var reloadImageButton:FlxButton = new FlxButton(10, scaleStepper.y + 60, "Reload Image", function() { + reloadCharacter(); + }); + + var loadButton:FlxButton = new FlxButton(reloadImageButton.x + 100, reloadImageButton.y, "Load Character", function() { + loadCharacter(); + }); + var saveButton:FlxButton = new FlxButton(loadButton.x, reloadImageButton.y - 30, "Save Character", function() { + saveCharacter(); + }); + tab_group.add(reloadImageButton); + tab_group.add(loadButton); + tab_group.add(saveButton); + UI_mainbox.addGroup(tab_group); + } + + function updateCharTypeBox() { + leftCheckbox.checked = false; + centerCheckbox.checked = false; + rightCheckbox.checked = false; + + switch(character.jsonFile.dialogue_pos) { + case 'left': + leftCheckbox.checked = true; + case 'center': + centerCheckbox.checked = true; + case 'right': + rightCheckbox.checked = true; + } + reloadCharacter(); + updateTextBox(); + } + + private static var DEFAULT_TEXT:String = 'Lorem ipsum dolor sit amet'; + function reloadText() { + if(daText != null) { + daText.killTheTimer(); + daText.kill(); + hudGroup.remove(daText); + daText.destroy(); + } + daText = new Alphabet(0, 0, DEFAULT_TEXT, false, true, 0.05, 0.7); + daText.x = DialogueBoxPsych.DEFAULT_TEXT_X; + daText.y = DialogueBoxPsych.DEFAULT_TEXT_Y; + hudGroup.add(daText); + } + + function reloadCharacter() { + var charsArray:Array = [character, ghostLoop, ghostIdle]; + for (char in charsArray) { + char.frames = Paths.getSparrowAtlas('dialogue/' + character.jsonFile.image); + char.jsonFile = character.jsonFile; + char.reloadAnimations(); + char.setGraphicSize(Std.int(char.width * DialogueCharacter.DEFAULT_SCALE * character.jsonFile.scale)); + char.updateHitbox(); + } + character.x = DialogueBoxPsych.LEFT_CHAR_X; + character.y = DialogueBoxPsych.DEFAULT_CHAR_Y; + + switch(character.jsonFile.dialogue_pos) { + case 'right': + character.x = FlxG.width - character.width + DialogueBoxPsych.RIGHT_CHAR_X; + + case 'center': + character.x = FlxG.width / 2; + character.x -= character.width / 2; + } + character.x += character.jsonFile.position[0] + mainGroup.x; + character.y += character.jsonFile.position[1] + mainGroup.y; + character.playAnim(); //Plays random animation + if(character.jsonFile.animations.length > 0) { + curSelectedAnim = character.jsonFile.animations[0].anim; + var animShit:DialogueAnimArray = character.dialogueAnimations.get(curSelectedAnim); + ghostLoop.playAnim(animShit.anim); + ghostIdle.playAnim(animShit.anim, true); + offsetLoopText.text = 'Loop: ' + animShit.loop_offsets; + offsetIdleText.text = 'Idle: ' + animShit.idle_offsets; + } + + #if desktop + // Updating Discord Rich Presence + DiscordClient.changePresence("Dialogue Character Editor", "Editting: " + character.jsonFile.image); + #end + } + + function updateTextBox() { + box.flipX = false; + var anim:String = 'normal'; + switch(character.jsonFile.dialogue_pos) { + case 'left': + box.flipX = true; + case 'center': + anim = 'center'; + } + box.animation.play(anim, true); + DialogueBoxPsych.updateBoxOffsets(box); + } + + override function getEvent(id:String, sender:Dynamic, data:Dynamic, ?params:Array) { + if(id == FlxUIInputText.CHANGE_EVENT && sender == imageInputText) { + character.jsonFile.image = imageInputText.text; + } else if(id == FlxUINumericStepper.CHANGE_EVENT && (sender is FlxUINumericStepper)) { + if(sender == scaleStepper) { + character.jsonFile.scale = scaleStepper.value; + reloadCharacter(); + } else if(sender == xStepper) { + character.jsonFile.position[0] = xStepper.value; + reloadCharacter(); + } else if(sender == yStepper) { + character.jsonFile.position[1] = yStepper.value; + reloadCharacter(); + } + } + } + + var currentGhosts:Int = 0; + var lastTab:String = 'Character'; + var transitioning:Bool = false; + override function update(elapsed:Float) { + if(transitioning) { + super.update(elapsed); + return; + } + + if(character.animation.curAnim != null) { + if(daText.finishedText) { + if(character.animationIsLoop()) { + character.playAnim(character.animation.curAnim.name, true); + } + } else if(character.animation.curAnim.finished) { + character.animation.curAnim.restart(); + } + } + + var blockInput:Bool = false; + for (inputText in blockPressWhileTypingOn) { + if(inputText.hasFocus) { + FlxG.sound.muteKeys = []; + FlxG.sound.volumeDownKeys = []; + FlxG.sound.volumeUpKeys = []; + blockInput = true; + + if(FlxG.keys.pressed.CONTROL && FlxG.keys.justPressed.V && Clipboard.text != null) { //Copy paste + inputText.text = ClipboardAdd(inputText.text); + inputText.caretIndex = inputText.text.length; + getEvent(FlxUIInputText.CHANGE_EVENT, inputText, null, []); + } + if(FlxG.keys.justPressed.ENTER) inputText.hasFocus = false; + break; + } + } + + if(!blockInput && !animationDropDown.dropPanel.visible) { + FlxG.sound.muteKeys = TitleState.muteKeys; + FlxG.sound.volumeDownKeys = TitleState.volumeDownKeys; + FlxG.sound.volumeUpKeys = TitleState.volumeUpKeys; + if(FlxG.keys.justPressed.SPACE || key_space.justPressed && UI_mainbox.selected_tab_id == 'Character') { + character.playAnim(); + updateTextBox(); + reloadText(); + } + + //lots of Ifs lol get trolled + var offsetAdd:Int = 1; + var speed:Float = 300; + if(FlxG.keys.pressed.SHIFT) { + speed = 1200; + offsetAdd = 10; + } + + var negaMult:Array = [1, 1, -1, -1]; + var controlArray:Array = [FlxG.keys.pressed.J, FlxG.keys.pressed.I, FlxG.keys.pressed.L, FlxG.keys.pressed.K]; + for (i in 0...controlArray.length) { + if(controlArray[i]) { + if(i % 2 == 1) { + mainGroup.y += speed * elapsed * negaMult[i]; + } else { + mainGroup.x += speed * elapsed * negaMult[i]; + } + } + } + + if(UI_mainbox.selected_tab_id == 'Animations' && curSelectedAnim != null && character.dialogueAnimations.exists(curSelectedAnim)) { + var moved:Bool = false; + var animShit:DialogueAnimArray = character.dialogueAnimations.get(curSelectedAnim); + var controlArrayLoop:Array = [FlxG.keys.justPressed.A, FlxG.keys.justPressed.W, FlxG.keys.justPressed.D, FlxG.keys.justPressed.S]; + var controlArrayIdle:Array = [FlxG.keys.justPressed.LEFT, FlxG.keys.justPressed.UP, FlxG.keys.justPressed.RIGHT, FlxG.keys.justPressed.DOWN]; + for (i in 0...controlArrayLoop.length) { + if(controlArrayLoop[i]) { + if(i % 2 == 1) { + animShit.loop_offsets[1] += offsetAdd * negaMult[i]; + } else { + animShit.loop_offsets[0] += offsetAdd * negaMult[i]; + } + moved = true; + } + } + for (i in 0...controlArrayIdle.length) { + if(controlArrayIdle[i]) { + if(i % 2 == 1) { + animShit.idle_offsets[1] += offsetAdd * negaMult[i]; + } else { + animShit.idle_offsets[0] += offsetAdd * negaMult[i]; + } + moved = true; + } + } + + if(moved) { + offsetLoopText.text = 'Loop: ' + animShit.loop_offsets; + offsetIdleText.text = 'Idle: ' + animShit.idle_offsets; + ghostLoop.offset.set(animShit.loop_offsets[0], animShit.loop_offsets[1]); + ghostIdle.offset.set(animShit.idle_offsets[0], animShit.idle_offsets[1]); + } + } + + if (FlxG.keys.pressed.Q && camGame.zoom > 0.1) { + camGame.zoom -= elapsed * camGame.zoom; + if(camGame.zoom < 0.1) camGame.zoom = 0.1; + } + if (FlxG.keys.pressed.E && camGame.zoom < 1) { + camGame.zoom += elapsed * camGame.zoom; + if(camGame.zoom > 1) camGame.zoom = 1; + } + if(FlxG.keys.justPressed.H) { + if(UI_mainbox.selected_tab_id == 'Animations') { + currentGhosts++; + if(currentGhosts > 2) currentGhosts = 0; + + ghostLoop.visible = (currentGhosts != 1); + ghostIdle.visible = (currentGhosts != 2); + ghostLoop.alpha = (currentGhosts == 2 ? 1 : 0.6); + ghostIdle.alpha = (currentGhosts == 1 ? 1 : 0.6); + } else { + hudGroup.visible = !hudGroup.visible; + } + } + if(FlxG.keys.justPressed.R) { + camGame.zoom = 1; + mainGroup.setPosition(0, 0); + hudGroup.visible = true; + } + + if(UI_mainbox.selected_tab_id != lastTab) { + if(UI_mainbox.selected_tab_id == 'Animations') { + hudGroup.alpha = 0; + mainGroup.alpha = 0; + ghostLoop.alpha = 0.6; + ghostIdle.alpha = 0.6; + tipText.text = TIP_TEXT_OFFSET; + offsetLoopText.visible = true; + offsetIdleText.visible = true; + currentGhosts = 0; + + } else { + hudGroup.alpha = 1; + mainGroup.alpha = 1; + ghostLoop.alpha = 0; + ghostIdle.alpha = 0; + tipText.text = TIP_TEXT_MAIN; + offsetLoopText.visible = false; + offsetIdleText.visible = false; + character.playAnim(); + updateTextBox(); + reloadText(); + } + lastTab = UI_mainbox.selected_tab_id; + currentGhosts = 0; + } + + #if android + var androidback = FlxG.android.justReleased.BACK; + #else + var androidback = false; + #end + + if(FlxG.keys.justPressed.ESCAPE || androidback) { + MusicBeatState.switchState(new editors.MasterEditorMenu()); + FlxG.sound.playMusic(Paths.music('freakyMenu'), 1); + transitioning = true; + } + + ghostLoop.setPosition(character.x, character.y); + ghostIdle.setPosition(character.x, character.y); + hudGroup.x = mainGroup.x; + hudGroup.y = mainGroup.y; + } + super.update(elapsed); + } + + var _file:FileReference = null; + function loadCharacter() { + var jsonFilter:FileFilter = new FileFilter('JSON', 'json'); + _file = new FileReference(); + _file.addEventListener(Event.SELECT, onLoadComplete); + _file.addEventListener(Event.CANCEL, onLoadCancel); + _file.addEventListener(IOErrorEvent.IO_ERROR, onLoadError); + _file.browse([jsonFilter]); + } + + function onLoadComplete(_):Void + { + _file.removeEventListener(Event.SELECT, onLoadComplete); + _file.removeEventListener(Event.CANCEL, onLoadCancel); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onLoadError); + + #if dontUseManifest + var fullPath:String = null; + var jsonLoaded = cast Json.parse(Json.stringify(_file)); //Exploit(???) for accessing a private variable + if(jsonLoaded.__path != null) fullPath = jsonLoaded.__path; //I'm either a genious or dangerously dumb + + if(fullPath != null) { + var rawJson:String = File.getContent(fullPath); + if(rawJson != null) { + var loadedChar:DialogueCharacterFile = cast Json.parse(rawJson); + if(loadedChar.dialogue_pos != null) //Make sure it's really a dialogue character + { + var cutName:String = _file.name.substr(0, _file.name.length - 5); + trace("Successfully loaded file: " + cutName); + character.jsonFile = loadedChar; + reloadCharacter(); + reloadAnimationsDropDown(); + updateCharTypeBox(); + updateTextBox(); + reloadText(); + imageInputText.text = character.jsonFile.image; + scaleStepper.value = character.jsonFile.scale; + xStepper.value = character.jsonFile.position[0]; + yStepper.value = character.jsonFile.position[1]; + _file = null; + return; + } + } + } + _file = null; + #else + trace("File couldn't be loaded! You aren't on Desktop, are you?"); + #end + } + + /** + * Called when the save file dialog is cancelled. + */ + function onLoadCancel(_):Void + { + _file.removeEventListener(Event.SELECT, onLoadComplete); + _file.removeEventListener(Event.CANCEL, onLoadCancel); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onLoadError); + _file = null; + trace("Cancelled file loading."); + } + + /** + * Called if there is an error while saving the gameplay recording. + */ + function onLoadError(_):Void + { + _file.removeEventListener(Event.SELECT, onLoadComplete); + _file.removeEventListener(Event.CANCEL, onLoadCancel); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onLoadError); + _file = null; + trace("Problem loading file"); + } + + function saveCharacter() { + var data:String = Json.stringify(character.jsonFile, "\t"); + + openfl.system.System.setClipboard(data.trim()); + + if (data.length > 0) + { + var splittedImage:Array = imageInputText.text.trim().split('_'); + var characterName:String = splittedImage[0].toLowerCase().replace(' ', ''); + + _file = new FileReference(); + _file.addEventListener(Event.COMPLETE, onSaveComplete); + _file.addEventListener(Event.CANCEL, onSaveCancel); + _file.addEventListener(IOErrorEvent.IO_ERROR, onSaveError); + _file.save(data, characterName + ".json"); + } + } + + function onSaveComplete(_):Void + { + _file.removeEventListener(Event.COMPLETE, onSaveComplete); + _file.removeEventListener(Event.CANCEL, onSaveCancel); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onSaveError); + _file = null; + FlxG.log.notice("Successfully saved file."); + } + + /** + * Called when the save file dialog is cancelled. + */ + function onSaveCancel(_):Void + { + _file.removeEventListener(Event.COMPLETE, onSaveComplete); + _file.removeEventListener(Event.CANCEL, onSaveCancel); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onSaveError); + _file = null; + } + + /** + * Called if there is an error while saving the gameplay recording. + */ + function onSaveError(_):Void + { + _file.removeEventListener(Event.COMPLETE, onSaveComplete); + _file.removeEventListener(Event.CANCEL, onSaveCancel); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onSaveError); + _file = null; + FlxG.log.error("Problem saving file"); + } + + function ClipboardAdd(prefix:String = ''):String { + if(prefix.toLowerCase().endsWith('v')) //probably copy paste attempt + { + prefix = prefix.substring(0, prefix.length-1); + } + + var text:String = prefix + Clipboard.text.replace('\n', ''); + return text; + } +} \ No newline at end of file diff --git a/source/editors/DialogueEditorState.hx b/source/editors/DialogueEditorState.hx new file mode 100644 index 000000000..c00950600 --- /dev/null +++ b/source/editors/DialogueEditorState.hx @@ -0,0 +1,557 @@ +package editors; + +#if desktop +import Discord.DiscordClient; +#end +import flixel.FlxG; +import flixel.FlxSprite; +import flixel.addons.display.FlxGridOverlay; +import flixel.addons.transition.FlxTransitionableState; +import flixel.group.FlxGroup.FlxTypedGroup; +import flixel.math.FlxMath; +import flixel.text.FlxText; +import flixel.util.FlxColor; +import flixel.system.FlxSound; +import flixel.addons.ui.FlxInputText; +import flixel.addons.ui.FlxUI9SliceSprite; +import flixel.addons.ui.FlxUI; +import flixel.addons.ui.FlxUICheckBox; +import flixel.addons.ui.FlxUIInputText; +import flixel.addons.ui.FlxUINumericStepper; +import flixel.addons.ui.FlxUITabMenu; +import flixel.ui.FlxButton; +import openfl.net.FileReference; +import openfl.events.Event; +import openfl.events.IOErrorEvent; +import flash.net.FileFilter; +import haxe.Json; +import DialogueBoxPsych; +import lime.system.Clipboard; +#if sys +import sys.io.File; +#end + +using StringTools; + +class DialogueEditorState extends MusicBeatState +{ + var character:DialogueCharacter; + var box:FlxSprite; + var daText:Alphabet; + + var selectedText:FlxText; + var animText:FlxText; + + var defaultLine:DialogueLine; + var dialogueFile:DialogueFile = null; + + override function create() { + persistentUpdate = persistentDraw = true; + FlxG.camera.bgColor = FlxColor.fromHSL(0, 0, 0.5); + + defaultLine = { + portrait: DialogueCharacter.DEFAULT_CHARACTER, + expression: 'talk', + text: DEFAULT_TEXT, + boxState: DEFAULT_BUBBLETYPE, + speed: 0.05 + }; + + dialogueFile = { + dialogue: [ + copyDefaultLine() + ] + }; + + character = new DialogueCharacter(); + character.scrollFactor.set(); + add(character); + + box = new FlxSprite(70, 370); + box.frames = Paths.getSparrowAtlas('speech_bubble'); + box.scrollFactor.set(); + box.antialiasing = ClientPrefs.globalAntialiasing; + box.animation.addByPrefix('normal', 'speech bubble normal', 24); + box.animation.addByPrefix('angry', 'AHH speech bubble', 24); + box.animation.addByPrefix('center', 'speech bubble middle', 24); + box.animation.addByPrefix('center-angry', 'AHH Speech Bubble middle', 24); + box.animation.play('normal', true); + box.setGraphicSize(Std.int(box.width * 0.9)); + box.updateHitbox(); + add(box); + + addEditorBox(); + FlxG.mouse.visible = true; + + var addLineText:FlxText = new FlxText(10, 10, FlxG.width - 20, 'Press O to remove the current dialogue line, Press P to add another line after the current one.', 8); + addLineText.setFormat(Paths.font("vcr.ttf"), 16, FlxColor.WHITE, LEFT, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK); + addLineText.scrollFactor.set(); + add(addLineText); + + selectedText = new FlxText(10, 32, FlxG.width - 20, '', 8); + selectedText.setFormat(Paths.font("vcr.ttf"), 24, FlxColor.WHITE, LEFT, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK); + selectedText.scrollFactor.set(); + add(selectedText); + + animText = new FlxText(10, 62, FlxG.width - 20, '', 8); + animText.setFormat(Paths.font("vcr.ttf"), 24, FlxColor.WHITE, LEFT, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK); + animText.scrollFactor.set(); + add(animText); + changeText(); + super.create(); + } + + var UI_box:FlxUITabMenu; + function addEditorBox() { + var tabs = [ + {name: 'Dialogue Line', label: 'Dialogue Line'}, + ]; + UI_box = new FlxUITabMenu(null, tabs, true); + UI_box.resize(250, 190); + UI_box.x = FlxG.width - UI_box.width - 10; + UI_box.y = 10; + UI_box.scrollFactor.set(); + UI_box.alpha = 0.8; + addDialogueLineUI(); + add(UI_box); + } + + var characterInputText:FlxUIInputText; + var lineInputText:FlxUIInputText; + var angryCheckbox:FlxUICheckBox; + var speedStepper:FlxUINumericStepper; + function addDialogueLineUI() { + var tab_group = new FlxUI(null, UI_box); + tab_group.name = "Dialogue Line"; + + characterInputText = new FlxUIInputText(10, 20, 80, DialogueCharacter.DEFAULT_CHARACTER, 8); + characterInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; + blockPressWhileTypingOn.push(characterInputText); + + speedStepper = new FlxUINumericStepper(10, characterInputText.y + 40, 0.005, 0.05, 0, 0.5, 3); + + angryCheckbox = new FlxUICheckBox(speedStepper.x + 120, speedStepper.y, null, null, "Angry Textbox", 200); + angryCheckbox.callback = function() + { + updateTextBox(); + dialogueFile.dialogue[curSelected].boxState = (angryCheckbox.checked ? 'angry' : 'normal'); + }; + + lineInputText = new FlxUIInputText(10, speedStepper.y + 45, 200, DEFAULT_TEXT, 8); + lineInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; + blockPressWhileTypingOn.push(lineInputText); + + var loadButton:FlxButton = new FlxButton(20, lineInputText.y + 30, "Load Dialogue", function() { + loadDialogue(); + }); + var saveButton:FlxButton = new FlxButton(loadButton.x + 120, loadButton.y, "Save Dialogue", function() { + saveDialogue(); + }); + + tab_group.add(new FlxText(10, speedStepper.y - 18, 0, 'Interval/Speed (ms):')); + tab_group.add(new FlxText(10, characterInputText.y - 18, 0, 'Character:')); + tab_group.add(new FlxText(10, lineInputText.y - 18, 0, 'Text:')); + tab_group.add(characterInputText); + tab_group.add(angryCheckbox); + tab_group.add(speedStepper); + tab_group.add(lineInputText); + tab_group.add(lineInputText); + tab_group.add(loadButton); + tab_group.add(saveButton); + UI_box.addGroup(tab_group); + } + + function copyDefaultLine():DialogueLine { + var copyLine:DialogueLine = { + portrait: defaultLine.portrait, + expression: defaultLine.expression, + text: defaultLine.text, + boxState: defaultLine.boxState, + speed: defaultLine.speed + }; + return copyLine; + } + + function updateTextBox() { + box.flipX = false; + var isAngry:Bool = angryCheckbox.checked; + var anim:String = isAngry ? 'angry' : 'normal'; + + switch(character.jsonFile.dialogue_pos) { + case 'left': + box.flipX = true; + case 'center': + if(isAngry) { + anim = 'center-angry'; + } else { + anim = 'center'; + } + } + box.animation.play(anim, true); + DialogueBoxPsych.updateBoxOffsets(box); + } + + function reloadCharacter() { + character.frames = Paths.getSparrowAtlas('dialogue/' + character.jsonFile.image); + character.jsonFile = character.jsonFile; + character.reloadAnimations(); + character.setGraphicSize(Std.int(character.width * DialogueCharacter.DEFAULT_SCALE * character.jsonFile.scale)); + character.updateHitbox(); + character.x = DialogueBoxPsych.LEFT_CHAR_X; + character.y = DialogueBoxPsych.DEFAULT_CHAR_Y; + + switch(character.jsonFile.dialogue_pos) { + case 'right': + character.x = FlxG.width - character.width + DialogueBoxPsych.RIGHT_CHAR_X; + + case 'center': + character.x = FlxG.width / 2; + character.x -= character.width / 2; + } + character.x += character.jsonFile.position[0]; + character.y += character.jsonFile.position[1]; + character.playAnim(); //Plays random animation + characterAnimSpeed(); + + if(character.animation.curAnim != null) { + animText.text = 'Animation: ' + character.jsonFile.animations[curAnim].anim + ' (' + (curAnim + 1) +' / ' + character.jsonFile.animations.length + ') - Press W or S to scroll'; + } else { + animText.text = 'ERROR! NO ANIMATIONS FOUND'; + } + } + + private static var DEFAULT_TEXT:String = "coolswag"; + private static var DEFAULT_SPEED:Float = 0.05; + private static var DEFAULT_BUBBLETYPE:String = "normal"; + function reloadText(speed:Float = 0.05) { + if(daText != null) { + daText.killTheTimer(); + daText.kill(); + remove(daText); + daText.destroy(); + } + + if(Math.isNaN(speed) || speed < 0.001) speed = 0.0; + + var textToType:String = lineInputText.text; + if(textToType == null || textToType.length < 1) textToType = ' '; + daText = new Alphabet(DialogueBoxPsych.DEFAULT_TEXT_X, DialogueBoxPsych.DEFAULT_TEXT_Y, textToType, false, true, speed, 0.7); + add(daText); + + if(speed > 0) { + if(character.jsonFile.animations.length > curAnim && character.jsonFile.animations[curAnim] != null) { + character.playAnim(character.jsonFile.animations[curAnim].anim); + } + characterAnimSpeed(); + } + + #if desktop + // Updating Discord Rich Presence + var rpcText:String = lineInputText.text; + if(rpcText == null || rpcText.length < 1) rpcText = '(Empty)'; + if(rpcText.length < 3) rpcText += ' '; //Fixes a bug on RPC that triggers an error when the text is too short + DiscordClient.changePresence("Dialogue Editor", rpcText); + #end + } + + override function getEvent(id:String, sender:Dynamic, data:Dynamic, ?params:Array) { + if(id == FlxUIInputText.CHANGE_EVENT && (sender is FlxUIInputText)) { + if(sender == characterInputText) { + character.reloadCharacterJson(characterInputText.text); + reloadCharacter(); + updateTextBox(); + + if(character.jsonFile.animations.length > 0) { + curAnim = 0; + if(character.jsonFile.animations.length > curAnim && character.jsonFile.animations[curAnim] != null) { + character.playAnim(character.jsonFile.animations[curAnim].anim, daText.finishedText); + animText.text = 'Animation: ' + character.jsonFile.animations[curAnim].anim + ' (' + (curAnim + 1) +' / ' + character.jsonFile.animations.length + ') - Press W or S to scroll'; + } else { + animText.text = 'ERROR! NO ANIMATIONS FOUND'; + } + characterAnimSpeed(); + } + dialogueFile.dialogue[curSelected].portrait = characterInputText.text; + } else if(sender == lineInputText) { + reloadText(0); + dialogueFile.dialogue[curSelected].text = lineInputText.text; + } + } else if(id == FlxUINumericStepper.CHANGE_EVENT && (sender == speedStepper)) { + reloadText(speedStepper.value); + dialogueFile.dialogue[curSelected].speed = speedStepper.value; + if(Math.isNaN(dialogueFile.dialogue[curSelected].speed) || dialogueFile.dialogue[curSelected].speed == null || dialogueFile.dialogue[curSelected].speed < 0.001) { + dialogueFile.dialogue[curSelected].speed = 0.0; + } + } + } + + var curSelected:Int = 0; + var curAnim:Int = 0; + var blockPressWhileTypingOn:Array = []; + var transitioning:Bool = false; + override function update(elapsed:Float) { + if(transitioning) { + super.update(elapsed); + return; + } + + if(character.animation.curAnim != null) { + if(daText.finishedText) { + if(character.animationIsLoop() && character.animation.curAnim.finished) { + character.playAnim(character.animation.curAnim.name, true); + } + } else if(character.animation.curAnim.finished) { + character.animation.curAnim.restart(); + } + } + + var blockInput:Bool = false; + for (inputText in blockPressWhileTypingOn) { + if(inputText.hasFocus) { + FlxG.sound.muteKeys = []; + FlxG.sound.volumeDownKeys = []; + FlxG.sound.volumeUpKeys = []; + blockInput = true; + + if(FlxG.keys.pressed.CONTROL && FlxG.keys.justPressed.V && Clipboard.text != null) { //Copy paste + inputText.text = ClipboardAdd(inputText.text); + inputText.caretIndex = inputText.text.length; + getEvent(FlxUIInputText.CHANGE_EVENT, inputText, null, []); + } + if(FlxG.keys.justPressed.ENTER) { + if(inputText == lineInputText) { + inputText.text += '\\n'; + inputText.caretIndex += 2; + } else { + inputText.hasFocus = false; + } + } + break; + } + } + + if(!blockInput) { + FlxG.sound.muteKeys = TitleState.muteKeys; + FlxG.sound.volumeDownKeys = TitleState.volumeDownKeys; + FlxG.sound.volumeUpKeys = TitleState.volumeUpKeys; + if(FlxG.keys.justPressed.SPACE) { + reloadText(speedStepper.value); + } + #if android + var androidback = FlxG.android.justReleased.BACK; + #else + var androidback = false; + #end + + if(FlxG.keys.justPressed.ESCAPE || androidback) { + MusicBeatState.switchState(new editors.MasterEditorMenu()); + FlxG.sound.playMusic(Paths.music('freakyMenu'), 1); + transitioning = true; + } + var negaMult:Array = [1, -1]; + var controlAnim:Array = [FlxG.keys.justPressed.W, FlxG.keys.justPressed.S]; + var controlText:Array = [FlxG.keys.justPressed.D, FlxG.keys.justPressed.A]; + for (i in 0...controlAnim.length) { + if(controlAnim[i] && character.jsonFile.animations.length > 0) { + curAnim += negaMult[i]; + if(curAnim < 0) curAnim = character.jsonFile.animations.length - 1; + else if(curAnim >= character.jsonFile.animations.length) curAnim = 0; + + var animToPlay:String = character.jsonFile.animations[curAnim].anim; + if(character.dialogueAnimations.exists(animToPlay)) { + character.playAnim(animToPlay, daText.finishedText); + dialogueFile.dialogue[curSelected].expression = animToPlay; + } + animText.text = 'Animation: ' + animToPlay + ' (' + (curAnim + 1) +' / ' + character.jsonFile.animations.length + ') - Press W or S to scroll'; + } + if(controlText[i]) { + changeText(negaMult[i]); + } + } + + if(FlxG.keys.justPressed.O) { + dialogueFile.dialogue.remove(dialogueFile.dialogue[curSelected]); + if(dialogueFile.dialogue.length < 1) //You deleted everything, dumbo! + { + dialogueFile.dialogue = [ + copyDefaultLine() + ]; + } + changeText(); + } else if(FlxG.keys.justPressed.P) { + dialogueFile.dialogue.insert(curSelected + 1, copyDefaultLine()); + changeText(1); + } + } + super.update(elapsed); + } + + function changeText(add:Int = 0) { + curSelected += add; + if(curSelected < 0) curSelected = dialogueFile.dialogue.length - 1; + else if(curSelected >= dialogueFile.dialogue.length) curSelected = 0; + + var curDialogue:DialogueLine = dialogueFile.dialogue[curSelected]; + characterInputText.text = curDialogue.portrait; + lineInputText.text = curDialogue.text; + angryCheckbox.checked = (curDialogue.boxState == 'angry'); + speedStepper.value = curDialogue.speed; + + curAnim = 0; + character.reloadCharacterJson(characterInputText.text); + reloadCharacter(); + updateTextBox(); + reloadText(curDialogue.speed); + + var leLength:Int = character.jsonFile.animations.length; + if(leLength > 0) { + for (i in 0...leLength) { + var leAnim:DialogueAnimArray = character.jsonFile.animations[i]; + if(leAnim != null && leAnim.anim == curDialogue.expression) { + curAnim = i; + break; + } + } + character.playAnim(character.jsonFile.animations[curAnim].anim, daText.finishedText); + animText.text = 'Animation: ' + character.jsonFile.animations[curAnim].anim + ' (' + (curAnim + 1) +' / ' + leLength + ') - Press W or S to scroll'; + } else { + animText.text = 'ERROR! NO ANIMATIONS FOUND'; + } + characterAnimSpeed(); + + selectedText.text = 'Line: (' + (curSelected + 1) + ' / ' + dialogueFile.dialogue.length + ') - Press A or D to scroll'; + } + + function characterAnimSpeed() { + if(character.animation.curAnim != null) { + var speed:Float = speedStepper.value; + var rate:Float = 24 - (((speed - 0.05) / 5) * 480); + if(rate < 12) rate = 12; + else if(rate > 48) rate = 48; + character.animation.curAnim.frameRate = rate; + } + } + + function ClipboardAdd(prefix:String = ''):String { + if(prefix.toLowerCase().endsWith('v')) //probably copy paste attempt + { + prefix = prefix.substring(0, prefix.length-1); + } + + var text:String = prefix + Clipboard.text.replace('\n', ''); + return text; + } + + var _file:FileReference = null; + function loadDialogue() { + var jsonFilter:FileFilter = new FileFilter('JSON', 'json'); + _file = new FileReference(); + _file.addEventListener(Event.SELECT, onLoadComplete); + _file.addEventListener(Event.CANCEL, onLoadCancel); + _file.addEventListener(IOErrorEvent.IO_ERROR, onLoadError); + _file.browse([jsonFilter]); + } + + function onLoadComplete(_):Void + { + _file.removeEventListener(Event.SELECT, onLoadComplete); + _file.removeEventListener(Event.CANCEL, onLoadCancel); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onLoadError); + + #if dontUseManifest + var fullPath:String = null; + var jsonLoaded = cast Json.parse(Json.stringify(_file)); //Exploit(???) for accessing a private variable + if(jsonLoaded.__path != null) fullPath = jsonLoaded.__path; //I'm either a genious or dangerously dumb + + if(fullPath != null) { + var rawJson:String = File.getContent(fullPath); + if(rawJson != null) { + var loadedDialog:DialogueFile = cast Json.parse(rawJson); + if(loadedDialog.dialogue != null && loadedDialog.dialogue.length > 0) //Make sure it's really a dialogue file + { + var cutName:String = _file.name.substr(0, _file.name.length - 5); + trace("Successfully loaded file: " + cutName); + dialogueFile = loadedDialog; + changeText(); + _file = null; + return; + } + } + } + _file = null; + #else + trace("File couldn't be loaded! You aren't on Desktop, are you?"); + #end + } + + /** + * Called when the save file dialog is cancelled. + */ + function onLoadCancel(_):Void + { + _file.removeEventListener(Event.SELECT, onLoadComplete); + _file.removeEventListener(Event.CANCEL, onLoadCancel); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onLoadError); + _file = null; + trace("Cancelled file loading."); + } + + /** + * Called if there is an error while saving the gameplay recording. + */ + function onLoadError(_):Void + { + _file.removeEventListener(Event.SELECT, onLoadComplete); + _file.removeEventListener(Event.CANCEL, onLoadCancel); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onLoadError); + _file = null; + trace("Problem loading file"); + } + + function saveDialogue() { + var data:String = Json.stringify(dialogueFile, "\t"); + + openfl.system.System.setClipboard(data.trim()); + + if (data.length > 0) + { + _file = new FileReference(); + _file.addEventListener(Event.COMPLETE, onSaveComplete); + _file.addEventListener(Event.CANCEL, onSaveCancel); + _file.addEventListener(IOErrorEvent.IO_ERROR, onSaveError); + _file.save(data, "dialogue.json"); + } + } + + function onSaveComplete(_):Void + { + _file.removeEventListener(Event.COMPLETE, onSaveComplete); + _file.removeEventListener(Event.CANCEL, onSaveCancel); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onSaveError); + _file = null; + FlxG.log.notice("Successfully saved file."); + } + + /** + * Called when the save file dialog is cancelled. + */ + function onSaveCancel(_):Void + { + _file.removeEventListener(Event.COMPLETE, onSaveComplete); + _file.removeEventListener(Event.CANCEL, onSaveCancel); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onSaveError); + _file = null; + } + + /** + * Called if there is an error while saving the gameplay recording. + */ + function onSaveError(_):Void + { + _file.removeEventListener(Event.COMPLETE, onSaveComplete); + _file.removeEventListener(Event.CANCEL, onSaveCancel); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onSaveError); + _file = null; + FlxG.log.error("Problem saving file"); + } +} \ No newline at end of file diff --git a/source/editors/EditorLua.hx b/source/editors/EditorLua.hx new file mode 100644 index 000000000..dd6539108 --- /dev/null +++ b/source/editors/EditorLua.hx @@ -0,0 +1,267 @@ +package editors; + +#if LUA_ALLOWED +import llua.Lua; +import llua.LuaL; +import llua.State; +import llua.Convert; +#end + +import flixel.FlxG; +import flixel.tweens.FlxTween; +import flixel.tweens.FlxEase; +import flixel.text.FlxText; +import flixel.group.FlxGroup.FlxTypedGroup; +import flixel.math.FlxPoint; +import flixel.system.FlxSound; +import flixel.util.FlxTimer; +import flixel.FlxSprite; +import flixel.FlxCamera; +import flixel.util.FlxColor; +import flixel.FlxBasic; +#if sys +import sys.FileSystem; +import sys.io.File; +#end +import Type.ValueType; +import Controls; +import DialogueBoxPsych; + +using StringTools; + +class EditorLua { + public static var Function_Stop = 1; + public static var Function_Continue = 0; + + #if LUA_ALLOWED + public var lua:State = null; + #end + + var lePlayState:editors.EditorPlayState = null; + + public function new(script:String) { + #if LUA_ALLOWED + lua = LuaL.newstate(); + LuaL.openlibs(lua); + Lua.init_callbacks(lua); + + //trace('Lua version: ' + Lua.version()); + //trace("LuaJIT version: " + Lua.versionJIT()); + + var result:Dynamic = LuaL.dofile(lua, script); + var resultStr:String = Lua.tostring(lua, result); + if(resultStr != null && result != 0) { + lime.app.Application.current.window.alert(resultStr, 'Error on .LUA script!'); + trace('Error on .LUA script! ' + resultStr); + lua = null; + return; + } + trace('Lua file loaded succesfully:' + script); + + var curState:Dynamic = FlxG.state; + lePlayState = curState; + + // Lua variables + set('Function_Stop', Function_Stop); + set('Function_Continue', Function_Continue); + set('inChartEditor', true); + + set('curBpm', Conductor.bpm); + set('bpm', PlayState.SONG.bpm); + set('scrollSpeed', PlayState.SONG.speed); + set('crochet', Conductor.crochet); + set('stepCrochet', Conductor.stepCrochet); + set('songLength', FlxG.sound.music.length); + set('songName', PlayState.SONG.song); + + set('screenWidth', FlxG.width); + set('screenHeight', FlxG.height); + + for (i in 0...4) { + set('defaultPlayerStrumX' + i, 0); + set('defaultPlayerStrumY' + i, 0); + set('defaultOpponentStrumX' + i, 0); + set('defaultOpponentStrumY' + i, 0); + } + + set('downscroll', ClientPrefs.downScroll); + set('middlescroll', ClientPrefs.middleScroll); + + //stuff 4 noobz like you B) + Lua_helper.add_callback(lua, "getProperty", function(variable:String) { + var killMe:Array = variable.split('.'); + if(killMe.length > 1) { + var coverMeInPiss:Dynamic = Reflect.getProperty(lePlayState, killMe[0]); + + for (i in 1...killMe.length-1) { + coverMeInPiss = Reflect.getProperty(coverMeInPiss, killMe[i]); + } + return Reflect.getProperty(coverMeInPiss, killMe[killMe.length-1]); + } + return Reflect.getProperty(lePlayState, variable); + }); + Lua_helper.add_callback(lua, "setProperty", function(variable:String, value:Dynamic) { + var killMe:Array = variable.split('.'); + if(killMe.length > 1) { + var coverMeInPiss:Dynamic = Reflect.getProperty(lePlayState, killMe[0]); + + for (i in 1...killMe.length-1) { + coverMeInPiss = Reflect.getProperty(coverMeInPiss, killMe[i]); + } + return Reflect.setProperty(coverMeInPiss, killMe[killMe.length-1], value); + } + return Reflect.setProperty(lePlayState, variable, value); + }); + Lua_helper.add_callback(lua, "getPropertyFromGroup", function(obj:String, index:Int, variable:Dynamic) { + if(Std.isOfType(Reflect.getProperty(lePlayState, obj), FlxTypedGroup)) { + return Reflect.getProperty(Reflect.getProperty(lePlayState, obj).members[index], variable); + } + + var leArray:Dynamic = Reflect.getProperty(lePlayState, obj)[index]; + if(leArray != null) { + if(Type.typeof(variable) == ValueType.TInt) { + return leArray[variable]; + } + return Reflect.getProperty(leArray, variable); + } + return null; + }); + Lua_helper.add_callback(lua, "setPropertyFromGroup", function(obj:String, index:Int, variable:Dynamic, value:Dynamic) { + if(Std.isOfType(Reflect.getProperty(lePlayState, obj), FlxTypedGroup)) { + return Reflect.setProperty(Reflect.getProperty(lePlayState, obj).members[index], variable, value); + } + + var leArray:Dynamic = Reflect.getProperty(lePlayState, obj)[index]; + if(leArray != null) { + if(Type.typeof(variable) == ValueType.TInt) { + return leArray[variable] = value; + } + return Reflect.setProperty(leArray, variable, value); + } + }); + Lua_helper.add_callback(lua, "removeFromGroup", function(obj:String, index:Int, dontDestroy:Bool = false) { + if(Std.isOfType(Reflect.getProperty(lePlayState, obj), FlxTypedGroup)) { + var sex = Reflect.getProperty(lePlayState, obj).members[index]; + if(!dontDestroy) + sex.kill(); + Reflect.getProperty(lePlayState, obj).remove(sex, true); + if(!dontDestroy) + sex.destroy(); + return; + } + Reflect.getProperty(lePlayState, obj).remove(Reflect.getProperty(lePlayState, obj)[index]); + }); + + Lua_helper.add_callback(lua, "getColorFromHex", function(color:String) { + if(!color.startsWith('0x')) color = '0xff' + color; + return Std.parseInt(color); + }); + + Lua_helper.add_callback(lua, "setGraphicSize", function(obj:String, x:Int, y:Int = 0) { + var poop:FlxSprite = Reflect.getProperty(lePlayState, obj); + if(poop != null) { + poop.setGraphicSize(x, y); + poop.updateHitbox(); + return; + } + }); + Lua_helper.add_callback(lua, "scaleObject", function(obj:String, x:Float, y:Float) { + var poop:FlxSprite = Reflect.getProperty(lePlayState, obj); + if(poop != null) { + poop.scale.set(x, y); + poop.updateHitbox(); + return; + } + }); + Lua_helper.add_callback(lua, "updateHitbox", function(obj:String) { + var poop:FlxSprite = Reflect.getProperty(lePlayState, obj); + if(poop != null) { + poop.updateHitbox(); + return; + } + }); + call('onCreate', []); + #end + } + + public function call(event:String, args:Array):Dynamic { + #if LUA_ALLOWED + if(lua == null) { + return Function_Continue; + } + + Lua.getglobal(lua, event); + + for (arg in args) { + Convert.toLua(lua, arg); + } + + var result:Null = Lua.pcall(lua, args.length, 1, 0); + if(result != null && resultIsAllowed(lua, result)) { + /*var resultStr:String = Lua.tostring(lua, result); + var error:String = Lua.tostring(lua, -1); + Lua.pop(lua, 1);*/ + if(Lua.type(lua, -1) == Lua.LUA_TSTRING) { + var error:String = Lua.tostring(lua, -1); + Lua.pop(lua, 1); + if(error == 'attempt to call a nil value') { //Makes it ignore warnings and not break stuff if you didn't put the functions on your lua file + return Function_Continue; + } + } + + var conv:Dynamic = Convert.fromLua(lua, result); + return conv; + } + #end + return Function_Continue; + } + + #if LUA_ALLOWED + function resultIsAllowed(leLua:State, leResult:Null) { //Makes it ignore warnings + switch(Lua.type(leLua, leResult)) { + case Lua.LUA_TNIL | Lua.LUA_TBOOLEAN | Lua.LUA_TNUMBER | Lua.LUA_TSTRING | Lua.LUA_TTABLE: + return true; + } + return false; + } + #end + + public function set(variable:String, data:Dynamic) { + #if LUA_ALLOWED + if(lua == null) { + return; + } + + Convert.toLua(lua, data); + Lua.setglobal(lua, variable); + #end + } + + #if LUA_ALLOWED + public function getBool(variable:String) { + var result:String = null; + Lua.getglobal(lua, variable); + result = Convert.fromLua(lua, -1); + Lua.pop(lua, 1); + + if(result == null) { + return false; + } + + // YES! FINALLY IT WORKS + //trace('variable: ' + variable + ', ' + result); + return (result == 'true'); + } + #end + + public function stop() { + #if LUA_ALLOWED + if(lua == null) { + return; + } + + Lua.close(lua); + lua = null; + #end + } +} \ No newline at end of file diff --git a/source/editors/EditorPlayState.hx b/source/editors/EditorPlayState.hx new file mode 100644 index 000000000..170e47857 --- /dev/null +++ b/source/editors/EditorPlayState.hx @@ -0,0 +1,878 @@ +package editors; + +import Section.SwagSection; +import Song.SwagSong; +import flixel.group.FlxGroup.FlxTypedGroup; +import flixel.addons.transition.FlxTransitionableState; +import flixel.util.FlxColor; +import flixel.FlxSprite; +import flixel.FlxG; +import flixel.text.FlxText; +import flixel.tweens.FlxEase; +import flixel.tweens.FlxTween; +import flixel.math.FlxMath; +import flixel.math.FlxPoint; +import flixel.math.FlxRect; +import flixel.system.FlxSound; +import flixel.util.FlxSort; +import flixel.util.FlxTimer; +import FunkinLua; + +using StringTools; + +class EditorPlayState extends MusicBeatState +{ + // Yes, this is mostly a copy of PlayState, it's kinda dumb to make a direct copy of it but... ehhh + private var strumLine:FlxSprite; + private var comboGroup:FlxTypedGroup; + public var strumLineNotes:FlxTypedGroup; + public var opponentStrums:FlxTypedGroup; + public var playerStrums:FlxTypedGroup; + public var grpNoteSplashes:FlxTypedGroup; + + public var notes:FlxTypedGroup; + public var unspawnNotes:Array = []; + + var generatedMusic:Bool = false; + var vocals:FlxSound; + + var startOffset:Float = 0; + var startPos:Float = 0; + + public function new(startPos:Float) { + this.startPos = startPos; + Conductor.songPosition = startPos - startOffset; + + startOffset = Conductor.crochet; + timerToStart = startOffset; + super(); + } + + var scoreTxt:FlxText; + var timerToStart:Float = 0; + private var noteTypeMap:Map = new Map(); + override function create() + { + var bg:FlxSprite = new FlxSprite().loadGraphic(Paths.image('menuDesat')); + bg.scrollFactor.set(); + bg.color = FlxColor.fromHSB(FlxG.random.int(0, 359), FlxG.random.float(0, 0.8), FlxG.random.float(0.3, 1)); + add(bg); + + strumLine = new FlxSprite(ClientPrefs.middleScroll ? PlayState.STRUM_X_MIDDLESCROLL : PlayState.STRUM_X, 50).makeGraphic(FlxG.width, 10); + if(ClientPrefs.downScroll) strumLine.y = FlxG.height - 150; + strumLine.scrollFactor.set(); + + comboGroup = new FlxTypedGroup(); + add(comboGroup); + + strumLineNotes = new FlxTypedGroup(); + opponentStrums = new FlxTypedGroup(); + playerStrums = new FlxTypedGroup(); + add(strumLineNotes); + + generateStaticArrows(0); + generateStaticArrows(1); + if(ClientPrefs.middleScroll) { + opponentStrums.forEachAlive(function (note:StrumNote) { + note.visible = false; + }); + } + + grpNoteSplashes = new FlxTypedGroup(); + add(grpNoteSplashes); + + var splash:NoteSplash = new NoteSplash(100, 100, 0); + grpNoteSplashes.add(splash); + splash.alpha = 0.0; + + if (PlayState.SONG.needsVoices) + vocals = new FlxSound().loadEmbedded(Paths.voices(PlayState.SONG.song)); + else + vocals = new FlxSound(); + + generateSong(PlayState.SONG.song); + #if LUA_ALLOWED + for (notetype in noteTypeMap.keys()) { + var luaToLoad:String = Paths.modFolders('custom_notetypes/' + notetype + '.lua'); + if(sys.FileSystem.exists(luaToLoad)) { + var lua:editors.EditorLua = new editors.EditorLua(luaToLoad); + new FlxTimer().start(0.1, function (tmr:FlxTimer) { + lua.stop(); + lua = null; + }); + } + } + #end + noteTypeMap.clear(); + noteTypeMap = null; + + scoreTxt = new FlxText(0, FlxG.height - 50, FlxG.width, "Hits: 0 | Misses: 0", 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); + + var tipText:FlxText = new FlxText(10, FlxG.height - 24, 0, 'Press ESC to Go Back to Chart Editor', 16); + tipText.setFormat(Paths.font("vcr.ttf"), 16, FlxColor.WHITE, LEFT, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK); + tipText.borderSize = 2; + tipText.scrollFactor.set(); + add(tipText); + FlxG.mouse.visible = false; + + //sayGo(); + super.create(); + } + + function sayGo() { + var go:FlxSprite = new FlxSprite().loadGraphic(Paths.image('go')); + go.scrollFactor.set(); + + go.updateHitbox(); + + go.screenCenter(); + go.antialiasing = ClientPrefs.globalAntialiasing; + add(go); + FlxTween.tween(go, {y: go.y += 100, alpha: 0}, Conductor.crochet / 1000, { + ease: FlxEase.cubeInOut, + onComplete: function(twn:FlxTween) + { + go.destroy(); + } + }); + FlxG.sound.play(Paths.sound('introGo'), 0.6); + } + + //var songScore:Int = 0; + var songHits:Int = 0; + var songMisses:Int = 0; + var ghostMisses:Int = 0; + var startingSong:Bool = true; + private function generateSong(dataPath:String):Void + { + FlxG.sound.playMusic(Paths.inst(PlayState.SONG.song), 0, false); + FlxG.sound.music.pause(); + FlxG.sound.music.onComplete = endSong; + vocals.pause(); + vocals.volume = 0; + + var songData = PlayState.SONG; + Conductor.changeBPM(songData.bpm); + + 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 + + for (section in noteData) + { + for (songNotes in section.sectionNotes) + { + if(songNotes[1] > -1) { //Real notes + var daStrumTime:Float = songNotes[0]; + if(daStrumTime >= startPos) { + 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 + 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(PlayState.SONG.speed, 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); + } + } + } + } + daBeats += 1; + } + + unspawnNotes.sort(sortByShit); + generatedMusic = true; + } + + function startSong():Void + { + startingSong = false; + FlxG.sound.music.time = startPos; + FlxG.sound.music.play(); + FlxG.sound.music.volume = 1; + vocals.volume = 1; + vocals.time = startPos; + vocals.play(); + } + + function sortByShit(Obj1:Note, Obj2:Note):Int + { + return FlxSort.byValues(FlxSort.ASCENDING, Obj1.strumTime, Obj2.strumTime); + } + + private function endSong() { + LoadingState.loadAndSwitchState(new editors.ChartingState()); + } + + override function update(elapsed:Float) { + if (FlxG.keys.justPressed.ESCAPE) + { + FlxG.sound.music.pause(); + vocals.pause(); + LoadingState.loadAndSwitchState(new editors.ChartingState()); + } + + if (startingSong) { + timerToStart -= elapsed * 1000; + Conductor.songPosition = startPos - timerToStart; + if(timerToStart < 0) { + startSong(); + } + } else { + Conductor.songPosition += elapsed * 1000; + } + + var roundedSpeed:Float = FlxMath.roundDecimal(PlayState.SONG.speed, 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 / PlayState.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; + if(daNote.mustPress) { + strumX = playerStrums.members[daNote.noteData].x; + strumY = playerStrums.members[daNote.noteData].y; + } else { + strumX = opponentStrums.members[daNote.noteData].x; + strumY = opponentStrums.members[daNote.noteData].y; + } + + strumX += daNote.offsetX; + strumY += daNote.offsetY; + var center:Float = strumY + Note.swagWidth / 2; + + if(daNote.copyX) { + daNote.x = strumX; + } + 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 * ((PlayState.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 (PlayState.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; + + if (!daNote.isSustainNote) + { + daNote.kill(); + notes.remove(daNote, true); + daNote.destroy(); + } + } + + var doKill:Bool = daNote.y < -daNote.height; + if(ClientPrefs.downScroll) doKill = daNote.y > FlxG.height; + + if (doKill) + { + if (daNote.mustPress) + { + if (daNote.tooLate || !daNote.wasGoodHit) + { + //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(); + } + }); + + if(!daNote.ignoreNote) { + songMisses++; + vocals.volume = 0; + } + } + } + + daNote.active = false; + daNote.visible = false; + + daNote.kill(); + notes.remove(daNote, true); + daNote.destroy(); + } + }); + } + + keyShit(); + scoreTxt.text = 'Hits: ' + songHits + ' | Misses: ' + songMisses; + super.update(elapsed); + } + + override function beatHit() + { + super.beatHit(); + + if (generatedMusic) + { + notes.sort(FlxSort.byY, ClientPrefs.downScroll ? FlxSort.ASCENDING : FlxSort.DESCENDING); + } + } + + override function stepHit() + { + super.stepHit(); + if (FlxG.sound.music.time > Conductor.songPosition + 20 || FlxG.sound.music.time < Conductor.songPosition - 20) + { + resyncVocals(); + } + } + + function resyncVocals():Void + { + vocals.pause(); + + FlxG.sound.music.play(); + Conductor.songPosition = FlxG.sound.music.time; + vocals.time = Conductor.songPosition; + vocals.play(); + } + + function keyShit() { + // HOLDING + var up = controls.NOTE_UP; + var right = controls.NOTE_RIGHT; + var down = controls.NOTE_DOWN; + var left = controls.NOTE_LEFT; + + var upP = controls.NOTE_UP_P; + var rightP = controls.NOTE_RIGHT_P; + var downP = controls.NOTE_DOWN_P; + var leftP = controls.NOTE_LEFT_P; + + var upR = controls.NOTE_UP_R; + var rightR = controls.NOTE_RIGHT_R; + var downR = controls.NOTE_DOWN_R; + var leftR = controls.NOTE_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 (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)) { + 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 && controlArray[i]) + noteMiss(i, true); + } + } + } + } + + 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; + } + }); + } + + var combo:Int = 0; + function goodNoteHit(note:Note):Void + { + if (!note.wasGoodHit) + { + switch(note.noteType) { + case 'Hurt Note': //Hurt note + noteMiss(note.noteData); + --songMisses; + if(!note.isSustainNote) { + if(!note.noteSplashDisabled) { + spawnNoteSplashOnNote(note); + } + } + + note.wasGoodHit = true; + vocals.volume = 0; + + if (!note.isSustainNote) + { + note.kill(); + notes.remove(note, true); + note.destroy(); + } + return; + } + + if (!note.isSustainNote) + { + popUpScore(note); + combo += 1; + songHits++; + if(combo > 9999) combo = 9999; + } + + playerStrums.forEach(function(spr:StrumNote) + { + if (Math.abs(note.noteData) == spr.ID) + { + spr.playAnim('confirm', true); + } + }); + + note.wasGoodHit = true; + vocals.volume = 1; + + if (!note.isSustainNote) + { + note.kill(); + notes.remove(note, true); + note.destroy(); + } + } + } + + function noteMiss(direction:Int = 1, ?ghostMiss:Bool = false):Void + { + combo = 0; + + //songScore -= 10; + if(ghostMiss) ghostMisses++; + songMisses++; + + FlxG.sound.play(Paths.soundRandom('missnote', 1, 3), FlxG.random.float(0.1, 0.2)); + vocals.volume = 0; + } + + var COMBO_X:Float = 400; + var COMBO_Y:Float = 340; + private function popUpScore(note:Note = null):Void + { + var noteDiff:Float = Math.abs(note.strumTime - Conductor.songPosition + 8); + + vocals.volume = 1; + + var placement:String = Std.string(combo); + + var coolText:FlxText = new FlxText(0, 0, 0, placement, 32); + coolText.x = COMBO_X; + coolText.y = COMBO_Y; + // + + var rating:FlxSprite = new FlxSprite(); + //var score:Int = 350; + + var daRating:String = "sick"; + + if (noteDiff > Conductor.safeZoneOffset * 0.75) + { + daRating = 'shit'; + //score = 50; + } + else if (noteDiff > Conductor.safeZoneOffset * 0.5) + { + daRating = 'bad'; + //score = 100; + } + else if (noteDiff > Conductor.safeZoneOffset * 0.25) + { + daRating = 'good'; + //score = 200; + } + + if(daRating == 'sick' && !note.noteSplashDisabled) + { + spawnNoteSplashOnNote(note); + } + //songScore += score; + + /* 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); + comboGroup.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 * PlayState.daPixelZoom * 0.7)); + comboSpr.setGraphicSize(Std.int(comboSpr.width * PlayState.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 = coolText.x + (43 * daLoop) - 90; + numScore.y += 80; + + if (!PlayState.isPixelStage) + { + numScore.antialiasing = ClientPrefs.globalAntialiasing; + numScore.setGraphicSize(Std.int(numScore.width * 0.5)); + } + else + { + numScore.setGraphicSize(Std.int(numScore.width * PlayState.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) + comboGroup.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); + // comboGroup.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 generateStaticArrows(player:Int):Void + { + for (i in 0...4) + { + // FlxG.log.add(i); + var babyArrow:StrumNote = new StrumNote(ClientPrefs.middleScroll ? PlayState.STRUM_X_MIDDLESCROLL : PlayState.STRUM_X, strumLine.y, i, player); + babyArrow.alpha = 0; + FlxTween.tween(babyArrow, {alpha: 1}, 0.5, {ease: FlxEase.circOut}); + + if (player == 1) + { + playerStrums.add(babyArrow); + } + else + { + opponentStrums.add(babyArrow); + } + + strumLineNotes.add(babyArrow); + babyArrow.postAddedToGroup(); + } + } + + + // For Opponent's notes glow + 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; + } + } + + + // Note splash shit, duh + 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); + } + } + } + + 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); + } + + override function destroy() { + FlxG.sound.music.stop(); + vocals.stop(); + vocals.destroy(); + super.destroy(); + } +} \ No newline at end of file diff --git a/source/editors/MasterEditorMenu.hx b/source/editors/MasterEditorMenu.hx new file mode 100644 index 000000000..97708e77a --- /dev/null +++ b/source/editors/MasterEditorMenu.hx @@ -0,0 +1,123 @@ +package editors; + +#if desktop +import Discord.DiscordClient; +#end +import flixel.FlxG; +import flixel.FlxSprite; +import flixel.addons.display.FlxGridOverlay; +import flixel.addons.transition.FlxTransitionableState; +import flixel.group.FlxGroup.FlxTypedGroup; +import flixel.math.FlxMath; +import flixel.text.FlxText; +import flixel.util.FlxColor; +import flixel.system.FlxSound; + +using StringTools; + +class MasterEditorMenu extends MusicBeatState +{ + var options:Array = [ + 'Week Editor', + 'Menu Character Editor', + 'Dialogue Editor', + 'Dialogue Portrait Editor', + 'Character Editor' + ]; + private var grpTexts:FlxTypedGroup; + + private var curSelected = 0; + + override function create() + { + FlxG.camera.bgColor = FlxColor.BLACK; + #if desktop + // Updating Discord Rich Presence + DiscordClient.changePresence("Editors Main Menu", null); + #end + + var bg:FlxSprite = new FlxSprite().loadGraphic(Paths.image('menuDesat')); + bg.scrollFactor.set(); + bg.color = 0xFF353535; + add(bg); + + grpTexts = new FlxTypedGroup(); + add(grpTexts); + + for (i in 0...options.length) + { + var leText:Alphabet = new Alphabet(0, (70 * i) + 30, options[i], true, false); + leText.isMenuItem = true; + leText.targetY = i; + grpTexts.add(leText); + } + + changeSelection(); + addVirtualPad(UP_DOWN, A_B); + super.create(); + } + + override function update(elapsed:Float) + { + if (controls.UI_UP_P) + { + changeSelection(-1); + } + if (controls.UI_DOWN_P) + { + changeSelection(1); + } + + if (controls.BACK) + { + MusicBeatState.switchState(new MainMenuState()); + } + + if (controls.ACCEPT) + { + switch(options[curSelected]) { + case 'Character Editor': + LoadingState.loadAndSwitchState(new CharacterEditorState(Character.DEFAULT_CHARACTER, false)); + case 'Week Editor': + MusicBeatState.switchState(new WeekEditorState()); + case 'Menu Character Editor': + MusicBeatState.switchState(new MenuCharacterEditorState()); + case 'Dialogue Portrait Editor': + LoadingState.loadAndSwitchState(new DialogueCharacterEditorState(), false); + case 'Dialogue Editor': + LoadingState.loadAndSwitchState(new DialogueEditorState(), false); + } + FlxG.sound.music.volume = 0; + FreeplayState.destroyFreeplayVocals(); + } + + var bullShit:Int = 0; + for (item in grpTexts.members) + { + item.targetY = bullShit - curSelected; + bullShit++; + + item.alpha = 0.6; + // item.setGraphicSize(Std.int(item.width * 0.8)); + + if (item.targetY == 0) + { + item.alpha = 1; + // item.setGraphicSize(Std.int(item.width)); + } + } + super.update(elapsed); + } + + function changeSelection(change:Int = 0) + { + FlxG.sound.play(Paths.sound('scrollMenu'), 0.4); + + curSelected += change; + + if (curSelected < 0) + curSelected = options.length - 1; + if (curSelected >= options.length) + curSelected = 0; + } +} \ No newline at end of file diff --git a/source/editors/MenuCharacterEditorState.hx b/source/editors/MenuCharacterEditorState.hx new file mode 100644 index 000000000..af523d9e4 --- /dev/null +++ b/source/editors/MenuCharacterEditorState.hx @@ -0,0 +1,452 @@ +package editors; + +#if desktop +import Discord.DiscordClient; +#end +import flixel.FlxG; +import flixel.FlxSprite; +import flixel.addons.display.FlxGridOverlay; +import flixel.addons.transition.FlxTransitionableState; +import flixel.group.FlxGroup.FlxTypedGroup; +import flixel.math.FlxMath; +import flixel.text.FlxText; +import flixel.util.FlxColor; +import flixel.system.FlxSound; +import flixel.addons.ui.FlxInputText; +import flixel.addons.ui.FlxUI9SliceSprite; +import flixel.addons.ui.FlxUI; +import flixel.addons.ui.FlxUICheckBox; +import flixel.addons.ui.FlxUIInputText; +import flixel.addons.ui.FlxUINumericStepper; +import flixel.addons.ui.FlxUITabMenu; +import flixel.ui.FlxButton; +import MenuCharacter; +import openfl.net.FileReference; +import openfl.events.Event; +import openfl.events.IOErrorEvent; +import flash.net.FileFilter; +import haxe.Json; +#if sys +import sys.io.File; +#end + +using StringTools; + +class MenuCharacterEditorState extends MusicBeatState +{ + var grpWeekCharacters:FlxTypedGroup; + var characterFile:MenuCharacterFile = null; + var txtOffsets:FlxText; + var defaultCharacters:Array = ['dad', 'bf', 'gf']; + + override function create() { + characterFile = { + image: 'Menu_Dad', + scale: 1, + position: [0, 0], + idle_anim: 'M Dad Idle', + confirm_anim: 'M Dad Idle' + }; + #if desktop + // Updating Discord Rich Presence + DiscordClient.changePresence("Menu Character Editor", "Editting: " + characterFile.image); + #end + + grpWeekCharacters = new FlxTypedGroup(); + for (char in 0...3) + { + var weekCharacterThing:MenuCharacter = new MenuCharacter((FlxG.width * 0.25) * (1 + char) - 150, defaultCharacters[char]); + weekCharacterThing.y += 70; + weekCharacterThing.alpha = 0.2; + grpWeekCharacters.add(weekCharacterThing); + } + + add(new FlxSprite(0, 56).makeGraphic(FlxG.width, 386, 0xFFF9CF51)); + add(grpWeekCharacters); + + txtOffsets = new FlxText(20, 10, 0, "[0, 0]", 32); + txtOffsets.setFormat("VCR OSD Mono", 32, FlxColor.WHITE, CENTER); + txtOffsets.alpha = 0.7; + add(txtOffsets); + + var tipText:FlxText = new FlxText(0, 540, FlxG.width, + "Arrow Keys - Change Offset (Hold shift for 10x speed) + \nSpace - Play \"Start Press\" animation (Boyfriend Character Type)", 16); + tipText.setFormat(Paths.font("vcr.ttf"), 16, FlxColor.WHITE, CENTER); + tipText.scrollFactor.set(); + add(tipText); + + addEditorBox(); + FlxG.mouse.visible = true; + updateCharTypeBox(); + + super.create(); + } + + var UI_typebox:FlxUITabMenu; + var UI_mainbox:FlxUITabMenu; + var blockPressWhileTypingOn:Array = []; + function addEditorBox() { + var tabs = [ + {name: 'Character Type', label: 'Character Type'}, + ]; + UI_typebox = new FlxUITabMenu(null, tabs, true); + UI_typebox.resize(120, 180); + UI_typebox.x = 100; + UI_typebox.y = FlxG.height - UI_typebox.height - 50; + UI_typebox.scrollFactor.set(); + addTypeUI(); + add(UI_typebox); + + var tabs = [ + {name: 'Character', label: 'Character'}, + ]; + UI_mainbox = new FlxUITabMenu(null, tabs, true); + UI_mainbox.resize(240, 180); + UI_mainbox.x = FlxG.width - UI_mainbox.width - 100; + UI_mainbox.y = FlxG.height - UI_mainbox.height - 50; + UI_mainbox.scrollFactor.set(); + addCharacterUI(); + add(UI_mainbox); + + var loadButton:FlxButton = new FlxButton(0, 480, "Load Character", function() { + loadCharacter(); + }); + loadButton.screenCenter(X); + loadButton.x -= 60; + add(loadButton); + + var saveButton:FlxButton = new FlxButton(0, 480, "Save Character", function() { + saveCharacter(); + }); + saveButton.screenCenter(X); + saveButton.x += 60; + add(saveButton); + } + + var opponentCheckbox:FlxUICheckBox; + var boyfriendCheckbox:FlxUICheckBox; + var girlfriendCheckbox:FlxUICheckBox; + var curTypeSelected:Int = 0; //0 = Dad, 1 = BF, 2 = GF + function addTypeUI() { + var tab_group = new FlxUI(null, UI_typebox); + tab_group.name = "Character Type"; + + opponentCheckbox = new FlxUICheckBox(10, 20, null, null, "Opponent", 100); + opponentCheckbox.callback = function() + { + curTypeSelected = 0; + updateCharTypeBox(); + }; + + boyfriendCheckbox = new FlxUICheckBox(opponentCheckbox.x, opponentCheckbox.y + 40, null, null, "Boyfriend", 100); + boyfriendCheckbox.callback = function() + { + curTypeSelected = 1; + updateCharTypeBox(); + }; + + girlfriendCheckbox = new FlxUICheckBox(boyfriendCheckbox.x, boyfriendCheckbox.y + 40, null, null, "Girlfriend", 100); + girlfriendCheckbox.callback = function() + { + curTypeSelected = 2; + updateCharTypeBox(); + }; + + tab_group.add(opponentCheckbox); + tab_group.add(boyfriendCheckbox); + tab_group.add(girlfriendCheckbox); + UI_typebox.addGroup(tab_group); + } + + var imageInputText:FlxUIInputText; + var idleInputText:FlxUIInputText; + var confirmInputText:FlxUIInputText; + var confirmDescText:FlxText; + var scaleStepper:FlxUINumericStepper; + function addCharacterUI() { + var tab_group = new FlxUI(null, UI_mainbox); + tab_group.name = "Character"; + + imageInputText = new FlxUIInputText(10, 20, 80, characterFile.image, 8); + imageInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; + blockPressWhileTypingOn.push(imageInputText); + idleInputText = new FlxUIInputText(10, imageInputText.y + 35, 100, characterFile.idle_anim, 8); + idleInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; + blockPressWhileTypingOn.push(idleInputText); + confirmInputText = new FlxUIInputText(10, idleInputText.y + 35, 100, characterFile.confirm_anim, 8); + confirmInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; + blockPressWhileTypingOn.push(confirmInputText); + + var reloadImageButton:FlxButton = new FlxButton(10, confirmInputText.y + 30, "Reload Char", function() { + reloadSelectedCharacter(); + }); + + scaleStepper = new FlxUINumericStepper(140, imageInputText.y, 0.05, 1, 0.1, 30, 2); + + confirmDescText = new FlxText(10, confirmInputText.y - 18, 0, 'Start Press animation on the .XML:'); + tab_group.add(new FlxText(10, imageInputText.y - 18, 0, 'Image file name:')); + tab_group.add(new FlxText(10, idleInputText.y - 18, 0, 'Idle animation on the .XML:')); + tab_group.add(new FlxText(scaleStepper.x, scaleStepper.y - 18, 0, 'Scale:')); + tab_group.add(reloadImageButton); + tab_group.add(confirmDescText); + tab_group.add(imageInputText); + tab_group.add(idleInputText); + tab_group.add(confirmInputText); + tab_group.add(scaleStepper); + UI_mainbox.addGroup(tab_group); + } + + function updateCharTypeBox() { + opponentCheckbox.checked = false; + boyfriendCheckbox.checked = false; + girlfriendCheckbox.checked = false; + + switch(curTypeSelected) { + case 0: + opponentCheckbox.checked = true; + case 1: + boyfriendCheckbox.checked = true; + case 2: + girlfriendCheckbox.checked = true; + } + + updateCharacters(); + } + + function updateCharacters() { + for (i in 0...3) { + var char:MenuCharacter = grpWeekCharacters.members[i]; + char.alpha = 0.2; + char.character = ''; + char.changeCharacter(defaultCharacters[i]); + } + reloadSelectedCharacter(); + } + + function reloadSelectedCharacter() { + var char:MenuCharacter = grpWeekCharacters.members[curTypeSelected]; + + char.alpha = 1; + char.frames = Paths.getSparrowAtlas('menucharacters/' + characterFile.image); + char.animation.addByPrefix('idle', characterFile.idle_anim, 24); + if(curTypeSelected == 1) char.animation.addByPrefix('confirm', characterFile.confirm_anim, 24, false); + + char.scale.set(characterFile.scale, characterFile.scale); + char.updateHitbox(); + char.animation.play('idle'); + + confirmDescText.visible = (curTypeSelected == 1); + confirmInputText.visible = (curTypeSelected == 1); + updateOffset(); + + #if desktop + // Updating Discord Rich Presence + DiscordClient.changePresence("Menu Character Editor", "Editting: " + characterFile.image); + #end + } + + override function getEvent(id:String, sender:Dynamic, data:Dynamic, ?params:Array) { + if(id == FlxUIInputText.CHANGE_EVENT && (sender is FlxUIInputText)) { + if(sender == imageInputText) { + characterFile.image = imageInputText.text; + } else if(sender == idleInputText) { + characterFile.idle_anim = idleInputText.text; + } else if(sender == confirmInputText) { + characterFile.confirm_anim = confirmInputText.text; + } + } else if(id == FlxUINumericStepper.CHANGE_EVENT && (sender is FlxUINumericStepper)) { + if (sender == scaleStepper) { + characterFile.scale = scaleStepper.value; + reloadSelectedCharacter(); + } + } + } + + override function update(elapsed:Float) { + var blockInput:Bool = false; + for (inputText in blockPressWhileTypingOn) { + if(inputText.hasFocus) { + FlxG.sound.muteKeys = []; + FlxG.sound.volumeDownKeys = []; + FlxG.sound.volumeUpKeys = []; + blockInput = true; + + if(FlxG.keys.justPressed.ENTER) inputText.hasFocus = false; + break; + } + } + + if(!blockInput) { + FlxG.sound.muteKeys = TitleState.muteKeys; + FlxG.sound.volumeDownKeys = TitleState.volumeDownKeys; + FlxG.sound.volumeUpKeys = TitleState.volumeUpKeys; + #if android + var androidback = FlxG.android.justReleased.BACK; + #else + var androidback = false; + #end + + if (FlxG.keys.justPressed.ESCAPE #if mobileC || androidback #end) { + FlxG.mouse.visible = false; + MusicBeatState.switchState(new editors.MasterEditorMenu()); + FlxG.sound.playMusic(Paths.music('freakyMenu')); + } + + var shiftMult:Int = 1; + if(FlxG.keys.pressed.SHIFT) shiftMult = 10; + + if(FlxG.keys.justPressed.LEFT) { + characterFile.position[0] += shiftMult; + updateOffset(); + } + if(FlxG.keys.justPressed.RIGHT) { + characterFile.position[0] -= shiftMult; + updateOffset(); + } + if(FlxG.keys.justPressed.UP) { + characterFile.position[1] += shiftMult; + updateOffset(); + } + if(FlxG.keys.justPressed.DOWN) { + characterFile.position[1] -= shiftMult; + updateOffset(); + } + + if(FlxG.keys.justPressed.SPACE && curTypeSelected == 1) { + grpWeekCharacters.members[curTypeSelected].animation.play('confirm', true); + } + } + + var char:MenuCharacter = grpWeekCharacters.members[1]; + if(char.animation.curAnim != null && char.animation.curAnim.name == 'confirm' && char.animation.curAnim.finished) { + char.animation.play('idle', true); + } + + super.update(elapsed); + } + + function updateOffset() { + var char:MenuCharacter = grpWeekCharacters.members[curTypeSelected]; + char.offset.set(characterFile.position[0], characterFile.position[1]); + txtOffsets.text = '' + characterFile.position; + } + + var _file:FileReference = null; + function loadCharacter() { + var jsonFilter:FileFilter = new FileFilter('JSON', 'json'); + _file = new FileReference(); + _file.addEventListener(Event.SELECT, onLoadComplete); + _file.addEventListener(Event.CANCEL, onLoadCancel); + _file.addEventListener(IOErrorEvent.IO_ERROR, onLoadError); + _file.browse([jsonFilter]); + } + + function onLoadComplete(_):Void + { + _file.removeEventListener(Event.SELECT, onLoadComplete); + _file.removeEventListener(Event.CANCEL, onLoadCancel); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onLoadError); + + #if dontUseManifest + var fullPath:String = null; + var jsonLoaded = cast Json.parse(Json.stringify(_file)); //Exploit(???) for accessing a private variable + if(jsonLoaded.__path != null) fullPath = jsonLoaded.__path; //I'm either a genious or dangerously dumb + + if(fullPath != null) { + var rawJson:String = File.getContent(fullPath); + if(rawJson != null) { + var loadedChar:MenuCharacterFile = cast Json.parse(rawJson); + if(loadedChar.idle_anim != null && loadedChar.confirm_anim != null) //Make sure it's really a character + { + var cutName:String = _file.name.substr(0, _file.name.length - 5); + trace("Successfully loaded file: " + cutName); + characterFile = loadedChar; + reloadSelectedCharacter(); + imageInputText.text = characterFile.image; + idleInputText.text = characterFile.image; + confirmInputText.text = characterFile.image; + scaleStepper.value = characterFile.scale; + updateOffset(); + _file = null; + return; + } + } + } + _file = null; + #else + trace("File couldn't be loaded! You aren't on Desktop, are you?"); + #end + } + + /** + * Called when the save file dialog is cancelled. + */ + function onLoadCancel(_):Void + { + _file.removeEventListener(Event.SELECT, onLoadComplete); + _file.removeEventListener(Event.CANCEL, onLoadCancel); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onLoadError); + _file = null; + trace("Cancelled file loading."); + } + + /** + * Called if there is an error while saving the gameplay recording. + */ + function onLoadError(_):Void + { + _file.removeEventListener(Event.SELECT, onLoadComplete); + _file.removeEventListener(Event.CANCEL, onLoadCancel); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onLoadError); + _file = null; + trace("Problem loading file"); + } + + function saveCharacter() { + var data:String = Json.stringify(characterFile, "\t"); + if (data.length > 0) + { + var splittedImage:Array = imageInputText.text.trim().split('_'); + var characterName:String = splittedImage[splittedImage.length-1].toLowerCase().replace(' ', ''); + + _file = new FileReference(); + _file.addEventListener(Event.COMPLETE, onSaveComplete); + _file.addEventListener(Event.CANCEL, onSaveCancel); + _file.addEventListener(IOErrorEvent.IO_ERROR, onSaveError); + _file.save(data, characterName + ".json"); + } + } + + function onSaveComplete(_):Void + { + _file.removeEventListener(Event.COMPLETE, onSaveComplete); + _file.removeEventListener(Event.CANCEL, onSaveCancel); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onSaveError); + _file = null; + FlxG.log.notice("Successfully saved file."); + } + + /** + * Called when the save file dialog is cancelled. + */ + function onSaveCancel(_):Void + { + _file.removeEventListener(Event.COMPLETE, onSaveComplete); + _file.removeEventListener(Event.CANCEL, onSaveCancel); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onSaveError); + _file = null; + } + + /** + * Called if there is an error while saving the gameplay recording. + */ + function onSaveError(_):Void + { + _file.removeEventListener(Event.COMPLETE, onSaveComplete); + _file.removeEventListener(Event.CANCEL, onSaveCancel); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onSaveError); + _file = null; + FlxG.log.error("Problem saving file"); + } +} \ No newline at end of file diff --git a/source/editors/WeekEditorState.hx b/source/editors/WeekEditorState.hx new file mode 100644 index 000000000..daf976577 --- /dev/null +++ b/source/editors/WeekEditorState.hx @@ -0,0 +1,822 @@ +package editors; + +#if desktop +import Discord.DiscordClient; +#end +import flixel.FlxG; +import flixel.FlxSprite; +import flixel.addons.display.FlxGridOverlay; +import flixel.addons.transition.FlxTransitionableState; +import flixel.group.FlxGroup.FlxTypedGroup; +import flixel.math.FlxMath; +import flixel.text.FlxText; +import flixel.util.FlxColor; +import flixel.system.FlxSound; +import openfl.utils.Assets; +import flixel.addons.ui.FlxInputText; +import flixel.addons.ui.FlxUI9SliceSprite; +import flixel.addons.ui.FlxUI; +import flixel.addons.ui.FlxUICheckBox; +import flixel.addons.ui.FlxUIInputText; +import flixel.addons.ui.FlxUINumericStepper; +import flixel.addons.ui.FlxUITabMenu; +import flixel.ui.FlxButton; +import openfl.net.FileReference; +import openfl.events.Event; +import openfl.events.IOErrorEvent; +import flash.net.FileFilter; +import lime.system.Clipboard; +import haxe.Json; +#if sys +import sys.io.File; +import sys.FileSystem; +#end +import WeekData; +import ui.FlxVirtualPad; + +using StringTools; + +class WeekEditorState extends MusicBeatState +{ + var _pad:FlxVirtualPad; + + var txtWeekTitle:FlxText; + var bgSprite:FlxSprite; + var lock:FlxSprite; + var txtTracklist:FlxText; + var grpWeekCharacters:FlxTypedGroup; + var weekThing:MenuItem; + var missingFileText:FlxText; + + var weekFile:WeekFile = null; + public function new(weekFile:WeekFile = null) + { + super(); + this.weekFile = WeekData.createWeekFile(); + if(weekFile != null) this.weekFile = weekFile; + else weekFileName = 'week1'; + } + + override function create() { + txtWeekTitle = new FlxText(FlxG.width * 0.7, 10, 0, "", 32); + txtWeekTitle.setFormat("VCR OSD Mono", 32, FlxColor.WHITE, RIGHT); + txtWeekTitle.alpha = 0.7; + + var ui_tex = Paths.getSparrowAtlas('campaign_menu_UI_assets'); + var bgYellow:FlxSprite = new FlxSprite(0, 56).makeGraphic(FlxG.width, 386, 0xFFF9CF51); + bgSprite = new FlxSprite(0, 56); + bgSprite.antialiasing = ClientPrefs.globalAntialiasing; + + weekThing = new MenuItem(0, bgSprite.y + 396, weekFileName); + weekThing.y += weekThing.height + 20; + weekThing.antialiasing = ClientPrefs.globalAntialiasing; + add(weekThing); + + var blackBarThingie:FlxSprite = new FlxSprite().makeGraphic(FlxG.width, 56, FlxColor.BLACK); + add(blackBarThingie); + + grpWeekCharacters = new FlxTypedGroup(); + + lock = new FlxSprite(); + lock.frames = ui_tex; + lock.animation.addByPrefix('lock', 'lock'); + lock.animation.play('lock'); + lock.antialiasing = ClientPrefs.globalAntialiasing; + add(lock); + + missingFileText = new FlxText(0, 0, FlxG.width, ""); + missingFileText.setFormat(Paths.font("vcr.ttf"), 24, FlxColor.WHITE, CENTER, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK); + missingFileText.borderSize = 2; + missingFileText.visible = false; + add(missingFileText); + + var charArray:Array = weekFile.weekCharacters; + for (char in 0...3) + { + var weekCharacterThing:MenuCharacter = new MenuCharacter((FlxG.width * 0.25) * (1 + char) - 150, charArray[char]); + weekCharacterThing.y += 70; + grpWeekCharacters.add(weekCharacterThing); + } + + add(bgYellow); + add(bgSprite); + add(grpWeekCharacters); + + var tracksSprite:FlxSprite = new FlxSprite(FlxG.width * 0.07, bgSprite.y + 435).loadGraphic(Paths.image('Menu_Tracks')); + tracksSprite.antialiasing = ClientPrefs.globalAntialiasing; + add(tracksSprite); + + txtTracklist = new FlxText(FlxG.width * 0.05, tracksSprite.y + 60, 0, "", 32); + txtTracklist.alignment = CENTER; + txtTracklist.font = Paths.font("vcr.ttf"); + txtTracklist.color = 0xFFe55777; + add(txtTracklist); + add(txtWeekTitle); + + addEditorBox(); + reloadAllShit(); + + FlxG.mouse.visible = true; + + _pad = new FlxVirtualPad(FULL, NONE); + _pad.alpha = 0.75; + this.add(_pad); + + super.create(); + } + + var UI_box:FlxUITabMenu; + var blockPressWhileTypingOn:Array = []; + function addEditorBox() { + var tabs = [ + {name: 'Week', label: 'Week'}, + {name: 'Lock', label: 'Lock'}, + ]; + UI_box = new FlxUITabMenu(null, tabs, true); + UI_box.resize(250, 375); + UI_box.x = FlxG.width - UI_box.width; + UI_box.y = FlxG.height - UI_box.height; + UI_box.scrollFactor.set(); + addWeekUI(); + addLockUI(); + + UI_box.selected_tab_id = 'Week'; + add(UI_box); + + /*var loadWeekButton:FlxButton = new FlxButton(0, 650, "Load Week", function() { + loadWeek(); + }); + loadWeekButton.screenCenter(X); + loadWeekButton.x -= 120; + add(loadWeekButton);*/ + + var freeplayButton:FlxButton = new FlxButton(0, 650, "Freeplay", function() { + MusicBeatState.switchState(new WeekEditorFreeplayState(weekFile)); + + }); + freeplayButton.screenCenter(X); + add(freeplayButton); + + var saveWeekButton:FlxButton = new FlxButton(0, 650, "Save Week", function() { + saveWeek(weekFile); + }); + saveWeekButton.screenCenter(X); + saveWeekButton.x += 120; + add(saveWeekButton); + } + + var songsInputText:FlxUIInputText; + var backgroundInputText:FlxUIInputText; + var displayNameInputText:FlxUIInputText; + var weekNameInputText:FlxUIInputText; + var weekFileInputText:FlxUIInputText; + + var opponentInputText:FlxUIInputText; + var boyfriendInputText:FlxUIInputText; + var girlfriendInputText:FlxUIInputText; + + var hideCheckbox:FlxUICheckBox; + + public static var weekFileName:String = 'week1'; + + function addWeekUI() { + var tab_group = new FlxUI(null, UI_box); + tab_group.name = "Week"; + + songsInputText = new FlxUIInputText(10, 30, 200, '', 8); + songsInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; + blockPressWhileTypingOn.push(songsInputText); + + opponentInputText = new FlxUIInputText(10, songsInputText.y + 40, 70, '', 8); + opponentInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; + blockPressWhileTypingOn.push(opponentInputText); + boyfriendInputText = new FlxUIInputText(opponentInputText.x + 75, opponentInputText.y, 70, '', 8); + boyfriendInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; + blockPressWhileTypingOn.push(boyfriendInputText); + girlfriendInputText = new FlxUIInputText(boyfriendInputText.x + 75, opponentInputText.y, 70, '', 8); + girlfriendInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; + blockPressWhileTypingOn.push(girlfriendInputText); + + backgroundInputText = new FlxUIInputText(10, opponentInputText.y + 40, 120, '', 8); + backgroundInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; + blockPressWhileTypingOn.push(backgroundInputText); + + + displayNameInputText = new FlxUIInputText(10, backgroundInputText.y + 60, 200, '', 8); + displayNameInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; + blockPressWhileTypingOn.push(backgroundInputText); + + weekNameInputText = new FlxUIInputText(10, displayNameInputText.y + 60, 150, '', 8); + weekNameInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; + blockPressWhileTypingOn.push(weekNameInputText); + + weekFileInputText = new FlxUIInputText(10, weekNameInputText.y + 40, 100, '', 8); + weekFileInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; + blockPressWhileTypingOn.push(weekFileInputText); + reloadWeekThing(); + + hideCheckbox = new FlxUICheckBox(10, weekFileInputText.y + 40, null, null, "Hide Week from Story Mode?", 100); + hideCheckbox.callback = function() + { + weekFile.hideStoryMode = hideCheckbox.checked; + }; + + tab_group.add(new FlxText(songsInputText.x, songsInputText.y - 18, 0, 'Songs:')); + tab_group.add(new FlxText(opponentInputText.x, opponentInputText.y - 18, 0, 'Characters:')); + tab_group.add(new FlxText(backgroundInputText.x, backgroundInputText.y - 18, 0, 'Background Asset:')); + tab_group.add(new FlxText(displayNameInputText.x, displayNameInputText.y - 18, 0, 'Display Name:')); + tab_group.add(new FlxText(weekNameInputText.x, weekNameInputText.y - 18, 0, 'Week Name (for Reset Score Menu):')); + tab_group.add(new FlxText(weekFileInputText.x, weekFileInputText.y - 18, 0, 'Week File:')); + + tab_group.add(songsInputText); + tab_group.add(opponentInputText); + tab_group.add(boyfriendInputText); + tab_group.add(girlfriendInputText); + tab_group.add(backgroundInputText); + + tab_group.add(displayNameInputText); + tab_group.add(weekNameInputText); + tab_group.add(weekFileInputText); + tab_group.add(hideCheckbox); + UI_box.addGroup(tab_group); + } + + var weekBeforeInputText:FlxUIInputText; + var lockedCheckbox:FlxUICheckBox; + + function addLockUI() { + var tab_group = new FlxUI(null, UI_box); + tab_group.name = "Lock"; + + lockedCheckbox = new FlxUICheckBox(10, 30, null, null, "Week starts Locked", 100); + lockedCheckbox.callback = function() + { + weekFile.startUnlocked = !lockedCheckbox.checked; + lock.visible = lockedCheckbox.checked; + }; + + weekBeforeInputText = new FlxUIInputText(10, lockedCheckbox.y + 55, 100, '', 8); + weekBeforeInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; + blockPressWhileTypingOn.push(weekBeforeInputText); + + tab_group.add(new FlxText(weekBeforeInputText.x, weekBeforeInputText.y - 28, 0, 'Week File name of the Week you have\nto finish for Unlocking:')); + tab_group.add(weekBeforeInputText); + tab_group.add(lockedCheckbox); + UI_box.addGroup(tab_group); + } + + //Used on onCreate and when you load a week + function reloadAllShit() { + var weekString:String = weekFile.songs[0][0]; + for (i in 1...weekFile.songs.length) { + weekString += ', ' + weekFile.songs[i][0]; + } + songsInputText.text = weekString; + backgroundInputText.text = weekFile.weekBackground; + displayNameInputText.text = weekFile.storyName; + weekNameInputText.text = weekFile.weekName; + weekFileInputText.text = weekFileName; + + opponentInputText.text = weekFile.weekCharacters[0]; + boyfriendInputText.text = weekFile.weekCharacters[1]; + girlfriendInputText.text = weekFile.weekCharacters[2]; + + hideCheckbox.checked = weekFile.hideStoryMode; + + weekBeforeInputText.text = weekFile.weekBefore; + lockedCheckbox.checked = !weekFile.startUnlocked; + lock.visible = lockedCheckbox.checked; + + reloadBG(); + reloadWeekThing(); + updateText(); + } + + function updateText() + { + for (i in 0...grpWeekCharacters.length) { + grpWeekCharacters.members[i].changeCharacter(weekFile.weekCharacters[i]); + } + + var stringThing:Array = []; + for (i in 0...weekFile.songs.length) { + stringThing.push(weekFile.songs[i][0]); + } + + txtTracklist.text = ''; + for (i in 0...stringThing.length) + { + txtTracklist.text += stringThing[i] + '\n'; + } + + txtTracklist.text = txtTracklist.text.toUpperCase(); + + txtTracklist.screenCenter(X); + txtTracklist.x -= FlxG.width * 0.35; + + txtWeekTitle.text = weekFile.storyName.toUpperCase(); + txtWeekTitle.x = FlxG.width - (txtWeekTitle.width + 10); + } + + function reloadBG() { + bgSprite.visible = true; + var assetName:String = weekFile.weekBackground; + + var isMissing:Bool = true; + if(assetName != null && assetName.length > 0) { + if( #if dontUseManifest FileSystem.exists(Paths.modsImages('menubackgrounds/menu_' + assetName)) || #end + Assets.exists(Paths.image('menubackgrounds/menu_' + assetName), IMAGE)) { + bgSprite.loadGraphic(Paths.image('menubackgrounds/menu_' + assetName)); + isMissing = false; + } + } + + if(isMissing) { + bgSprite.visible = false; + } + } + + function reloadWeekThing() { + weekThing.visible = true; + missingFileText.visible = false; + var assetName:String = weekFileInputText.text.trim(); + + var isMissing:Bool = true; + if(assetName != null && assetName.length > 0) { + if( #if dontUseManifest FileSystem.exists(Paths.modsImages('storymenu/' + assetName)) || #end + Assets.exists(Paths.image('storymenu/' + assetName), IMAGE)) { + weekThing.loadGraphic(Paths.image('storymenu/' + assetName)); + isMissing = false; + } + } + + if(isMissing) { + weekThing.visible = false; + missingFileText.visible = true; + missingFileText.text = 'MISSING FILE: images/storymenu/' + assetName + '.png'; + } + recalculateStuffPosition(); + + #if desktop + // Updating Discord Rich Presence + DiscordClient.changePresence("Week Editor", "Editting: " + weekFileName); + #end + } + + override function getEvent(id:String, sender:Dynamic, data:Dynamic, ?params:Array) { + if(id == FlxUIInputText.CHANGE_EVENT && (sender is FlxUIInputText)) { + if(sender == weekFileInputText) { + weekFileName = weekFileInputText.text.trim(); + reloadWeekThing(); + } else if(sender == opponentInputText || sender == boyfriendInputText || sender == girlfriendInputText) { + weekFile.weekCharacters[0] = opponentInputText.text.trim(); + weekFile.weekCharacters[1] = boyfriendInputText.text.trim(); + weekFile.weekCharacters[2] = girlfriendInputText.text.trim(); + updateText(); + } else if(sender == backgroundInputText) { + weekFile.weekBackground = backgroundInputText.text.trim(); + reloadBG(); + } else if(sender == displayNameInputText) { + weekFile.storyName = displayNameInputText.text.trim(); + updateText(); + } else if(sender == weekNameInputText) { + weekFile.weekName = weekNameInputText.text.trim(); + } else if(sender == songsInputText) { + var splittedText:Array = songsInputText.text.trim().split(','); + for (i in 0...splittedText.length) { + splittedText[i] = splittedText[i].trim(); + } + + while(splittedText.length < weekFile.songs.length) { + weekFile.songs.pop(); + } + + for (i in 0...splittedText.length) { + if(i >= weekFile.songs.length) { //Add new song + weekFile.songs.push([splittedText[i], 'dad', [146, 113, 253]]); + } else { //Edit song + weekFile.songs[i][0] = splittedText[i]; + if(weekFile.songs[i][1] == null || weekFile.songs[i][1]) { + weekFile.songs[i][1] = 'dad'; + weekFile.songs[i][2] = [146, 113, 253]; + } + } + } + updateText(); + } else if(sender == weekBeforeInputText) { + weekFile.weekBefore = weekBeforeInputText.text.trim(); + } + } + } + + override function update(elapsed:Float) + { + if(loadedWeek != null) { + weekFile = loadedWeek; + loadedWeek = null; + + reloadAllShit(); + } + + var blockInput:Bool = false; + for (inputText in blockPressWhileTypingOn) { + if(inputText.hasFocus) { + FlxG.sound.muteKeys = []; + FlxG.sound.volumeDownKeys = []; + FlxG.sound.volumeUpKeys = []; + blockInput = true; + + if(FlxG.keys.justPressed.ENTER) inputText.hasFocus = false; + break; + } + } + + if(!blockInput) { + FlxG.sound.muteKeys = TitleState.muteKeys; + FlxG.sound.volumeDownKeys = TitleState.volumeDownKeys; + FlxG.sound.volumeUpKeys = TitleState.volumeUpKeys; + #if android + var androidback = FlxG.android.justReleased.BACK; + #else + var androidback = false; + #end + + if (FlxG.keys.justPressed.ENTER || androidback) { + FlxG.mouse.visible = false; + MusicBeatState.switchState(new editors.MasterEditorMenu()); + FlxG.sound.playMusic(Paths.music('freakyMenu')); + } + } + + super.update(elapsed); + + lock.y = weekThing.y; + missingFileText.y = weekThing.y + 36; + } + + function recalculateStuffPosition() { + weekThing.screenCenter(X); + lock.x = weekThing.width + 10 + weekThing.x; + } + + private static var _file:FileReference; + /*public static function loadWeek() { + var jsonFilter:FileFilter = new FileFilter('JSON', 'json'); + _file = new FileReference(); + _file.addEventListener(Event.SELECT, onLoadComplete); + _file.addEventListener(Event.CANCEL, onLoadCancel); + _file.addEventListener(IOErrorEvent.IO_ERROR, onLoadError); + _file.browse([jsonFilter]); + }*/ + + public static var loadedWeek:WeekFile = null; + public static var loadError:Bool = false; + private static function onLoadComplete(_):Void + { + _file.removeEventListener(Event.SELECT, onLoadComplete); + _file.removeEventListener(Event.CANCEL, onLoadCancel); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onLoadError); + + #if dontUseManifest + var fullPath:String = null; + var jsonLoaded = cast Json.parse(Json.stringify(_file)); //Exploit(???) for accessing a private variable + if(jsonLoaded.__path != null) fullPath = jsonLoaded.__path; //I'm either a genious or dangerously dumb + + if(fullPath != null) { + var rawJson:String = File.getContent(fullPath); + if(rawJson != null) { + loadedWeek = cast Json.parse(rawJson); + if(loadedWeek.weekCharacters != null && loadedWeek.weekName != null) //Make sure it's really a week + { + var cutName:String = _file.name.substr(0, _file.name.length - 5); + trace("Successfully loaded file: " + cutName); + loadError = false; + + weekFileName = cutName; + _file = null; + return; + } + } + } + loadError = true; + loadedWeek = null; + _file = null; + #else + trace("File couldn't be loaded! You aren't on Desktop, are you?"); + #end + } + + /** + * Called when the save file dialog is cancelled. + */ + private static function onLoadCancel(_):Void + { + _file.removeEventListener(Event.SELECT, onLoadComplete); + _file.removeEventListener(Event.CANCEL, onLoadCancel); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onLoadError); + _file = null; + trace("Cancelled file loading."); + } + + /** + * Called if there is an error while saving the gameplay recording. + */ + private static function onLoadError(_):Void + { + _file.removeEventListener(Event.SELECT, onLoadComplete); + _file.removeEventListener(Event.CANCEL, onLoadCancel); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onLoadError); + _file = null; + trace("Problem loading file"); + } + + public static function saveWeek(weekFile:WeekFile) { + var data:String = Json.stringify(weekFile, "\t"); + + openfl.system.System.setClipboard(data.trim()); + + if (data.length > 0) + { + _file = new FileReference(); + _file.addEventListener(Event.COMPLETE, onSaveComplete); + _file.addEventListener(Event.CANCEL, onSaveCancel); + _file.addEventListener(IOErrorEvent.IO_ERROR, onSaveError); + _file.save(data, weekFileName + ".json"); + } + } + + private static function onSaveComplete(_):Void + { + _file.removeEventListener(Event.COMPLETE, onSaveComplete); + _file.removeEventListener(Event.CANCEL, onSaveCancel); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onSaveError); + _file = null; + FlxG.log.notice("Successfully saved file."); + } + + /** + * Called when the save file dialog is cancelled. + */ + private static function onSaveCancel(_):Void + { + _file.removeEventListener(Event.COMPLETE, onSaveComplete); + _file.removeEventListener(Event.CANCEL, onSaveCancel); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onSaveError); + _file = null; + } + + /** + * Called if there is an error while saving the gameplay recording. + */ + private static function onSaveError(_):Void + { + _file.removeEventListener(Event.COMPLETE, onSaveComplete); + _file.removeEventListener(Event.CANCEL, onSaveCancel); + _file.removeEventListener(IOErrorEvent.IO_ERROR, onSaveError); + _file = null; + FlxG.log.error("Problem saving file"); + } +} + +class WeekEditorFreeplayState extends MusicBeatState +{ + var weekFile:WeekFile = null; + public function new(weekFile:WeekFile = null) + { + super(); + this.weekFile = WeekData.createWeekFile(); + if(weekFile != null) this.weekFile = weekFile; + } + + var bg:FlxSprite; + private var grpSongs:FlxTypedGroup; + private var iconArray:Array = []; + + var curSelected = 0; + + override function create() { + bg = new FlxSprite().loadGraphic(Paths.image('menuDesat')); + bg.antialiasing = ClientPrefs.globalAntialiasing; + + bg.color = FlxColor.WHITE; + add(bg); + + grpSongs = new FlxTypedGroup(); + add(grpSongs); + + for (i in 0...weekFile.songs.length) + { + var songText:Alphabet = new Alphabet(0, (70 * i) + 30, weekFile.songs[i][0], true, false); + songText.isMenuItem = true; + songText.targetY = i; + grpSongs.add(songText); + + var icon:HealthIcon = new HealthIcon(weekFile.songs[i][1]); + icon.sprTracker = songText; + + // using a FlxGroup is too much fuss! + iconArray.push(icon); + add(icon); + + // songText.x += 40; + // DONT PUT X IN THE FIRST PARAMETER OF new ALPHABET() !! + // songText.screenCenter(X); + } + + addEditorBox(); + changeSelection(); + super.create(); + } + + var UI_box:FlxUITabMenu; + var blockPressWhileTypingOn:Array = []; + function addEditorBox() { + var tabs = [ + {name: 'Freeplay', label: 'Freeplay'}, + ]; + UI_box = new FlxUITabMenu(null, tabs, true); + UI_box.resize(250, 200); + UI_box.x = FlxG.width - UI_box.width - 100; + UI_box.y = FlxG.height - UI_box.height - 60; + UI_box.scrollFactor.set(); + + UI_box.selected_tab_id = 'Week'; + addFreeplayUI(); + add(UI_box); + + var blackBlack:FlxSprite = new FlxSprite(0, 670).makeGraphic(FlxG.width, 50, FlxColor.BLACK); + blackBlack.alpha = 0.6; + add(blackBlack); + + /*var loadWeekButton:FlxButton = new FlxButton(0, 685, "Load Week", function() { + WeekEditorState.loadWeek(); + }); + loadWeekButton.screenCenter(X); + loadWeekButton.x -= 120; + add(loadWeekButton);*/ + + var storyModeButton:FlxButton = new FlxButton(0, 685, "Story Mode", function() { + MusicBeatState.switchState(new WeekEditorState(weekFile)); + + }); + storyModeButton.screenCenter(X); + add(storyModeButton); + + var saveWeekButton:FlxButton = new FlxButton(0, 685, "Save Week", function() { + WeekEditorState.saveWeek(weekFile); + }); + saveWeekButton.screenCenter(X); + saveWeekButton.x += 120; + add(saveWeekButton); + } + + override function getEvent(id:String, sender:Dynamic, data:Dynamic, ?params:Array) { + if(id == FlxUIInputText.CHANGE_EVENT && (sender is FlxUIInputText)) { + weekFile.songs[curSelected][1] = iconInputText.text; + iconArray[curSelected].changeIcon(iconInputText.text); + } else if(id == FlxUINumericStepper.CHANGE_EVENT && (sender is FlxUINumericStepper)) { + if(sender == bgColorStepperR || sender == bgColorStepperG || sender == bgColorStepperB) { + updateBG(); + } + } + } + + var bgColorStepperR:FlxUINumericStepper; + var bgColorStepperG:FlxUINumericStepper; + var bgColorStepperB:FlxUINumericStepper; + var iconInputText:FlxUIInputText; + function addFreeplayUI() { + var tab_group = new FlxUI(null, UI_box); + tab_group.name = "Freeplay"; + + bgColorStepperR = new FlxUINumericStepper(10, 40, 20, 255, 0, 255, 0); + bgColorStepperG = new FlxUINumericStepper(80, 40, 20, 255, 0, 255, 0); + bgColorStepperB = new FlxUINumericStepper(150, 40, 20, 255, 0, 255, 0); + + var copyColor:FlxButton = new FlxButton(10, bgColorStepperR.y + 25, "Copy Color", function() { + Clipboard.text = bg.color.red + ',' + bg.color.green + ',' + bg.color.blue; + }); + var pasteColor:FlxButton = new FlxButton(140, copyColor.y, "Paste Color", function() { + if(Clipboard.text != null) { + var leColor:Array = []; + var splitted:Array = Clipboard.text.trim().split(','); + for (i in 0...splitted.length) { + var toPush:Int = Std.parseInt(splitted[i]); + if(!Math.isNaN(toPush)) { + if(toPush > 255) toPush = 255; + else if(toPush < 0) toPush *= -1; + leColor.push(toPush); + } + } + + if(leColor.length > 2) { + bgColorStepperR.value = leColor[0]; + bgColorStepperG.value = leColor[1]; + bgColorStepperB.value = leColor[2]; + updateBG(); + } + } + }); + + iconInputText = new FlxUIInputText(10, bgColorStepperR.y + 70, 100, '', 8); + iconInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; + + var hideFreeplayCheckbox:FlxUICheckBox = new FlxUICheckBox(10, iconInputText.y + 30, null, null, "Hide Week from Freeplay?", 100); + hideFreeplayCheckbox.checked = weekFile.hideFreeplay; + hideFreeplayCheckbox.callback = function() + { + weekFile.hideFreeplay = hideFreeplayCheckbox.checked; + }; + + tab_group.add(new FlxText(10, bgColorStepperR.y - 18, 0, 'Selected background Color R/G/B:')); + tab_group.add(new FlxText(10, iconInputText.y - 18, 0, 'Selected icon:')); + tab_group.add(bgColorStepperR); + tab_group.add(bgColorStepperG); + tab_group.add(bgColorStepperB); + tab_group.add(copyColor); + tab_group.add(pasteColor); + tab_group.add(iconInputText); + tab_group.add(hideFreeplayCheckbox); + UI_box.addGroup(tab_group); + } + + function updateBG() { + weekFile.songs[curSelected][2][0] = Math.round(bgColorStepperR.value); + weekFile.songs[curSelected][2][1] = Math.round(bgColorStepperG.value); + weekFile.songs[curSelected][2][2] = Math.round(bgColorStepperB.value); + bg.color = FlxColor.fromRGB(weekFile.songs[curSelected][2][0], weekFile.songs[curSelected][2][1], weekFile.songs[curSelected][2][2]); + } + + function changeSelection(change:Int = 0) { + FlxG.sound.play(Paths.sound('scrollMenu'), 0.4); + + curSelected += change; + + if (curSelected < 0) + curSelected = weekFile.songs.length - 1; + if (curSelected >= weekFile.songs.length) + curSelected = 0; + + var bullShit:Int = 0; + for (i in 0...iconArray.length) + { + iconArray[i].alpha = 0.6; + } + + iconArray[curSelected].alpha = 1; + + for (item in grpSongs.members) + { + item.targetY = bullShit - curSelected; + bullShit++; + + item.alpha = 0.6; + // item.setGraphicSize(Std.int(item.width * 0.8)); + + if (item.targetY == 0) + { + item.alpha = 1; + // item.setGraphicSize(Std.int(item.width)); + } + } + trace(weekFile.songs[curSelected]); + iconInputText.text = weekFile.songs[curSelected][1]; + bgColorStepperR.value = Math.round(weekFile.songs[curSelected][2][0]); + bgColorStepperG.value = Math.round(weekFile.songs[curSelected][2][1]); + bgColorStepperB.value = Math.round(weekFile.songs[curSelected][2][2]); + updateBG(); + } + + override function update(elapsed:Float) { + if(WeekEditorState.loadedWeek != null) { + super.update(elapsed); + FlxTransitionableState.skipNextTransIn = true; + FlxTransitionableState.skipNextTransOut = true; + MusicBeatState.switchState(new WeekEditorFreeplayState(WeekEditorState.loadedWeek)); + WeekEditorState.loadedWeek = null; + return; + } + + if(iconInputText.hasFocus) { + FlxG.sound.muteKeys = []; + FlxG.sound.volumeDownKeys = []; + FlxG.sound.volumeUpKeys = []; + if(FlxG.keys.justPressed.ENTER) { + iconInputText.hasFocus = false; + } + } else { + FlxG.sound.muteKeys = TitleState.muteKeys; + FlxG.sound.volumeDownKeys = TitleState.volumeDownKeys; + FlxG.sound.volumeUpKeys = TitleState.volumeUpKeys; + if(FlxG.keys.justPressed.ESCAPE) { + FlxG.mouse.visible = false; + MusicBeatState.switchState(new editors.MasterEditorMenu()); + FlxG.sound.playMusic(Paths.music('freakyMenu')); + } + + if(controls.UI_UP_P) changeSelection(-1); + if(controls.UI_DOWN_P) changeSelection(1); + } + super.update(elapsed); + } +} \ No newline at end of file diff --git a/source/options/AboutState.hx b/source/options/AboutState.hx index 6368cb240..e83cec89b 100644 --- a/source/options/AboutState.hx +++ b/source/options/AboutState.hx @@ -9,7 +9,6 @@ import flixel.math.FlxMath; import flixel.text.FlxText; import flixel.util.FlxColor; import lime.utils.Assets; -import flixel.FlxSubState; using StringTools; @@ -37,7 +36,7 @@ class AboutState extends MusicBeatState logoBl.screenCenter(); logoBl.y = logoBl.y - 100; - text = new FlxText(0, 0, 0, "version psych - 0.3.4", 64); + text = new FlxText(0, 0, 0, "ported by kviks" + "\n" + "", 64); text.setFormat(Paths.font("vcr.ttf"), 32, FlxColor.WHITE, RIGHT); text.screenCenter(); text.y = text.y + 150; @@ -69,4 +68,4 @@ class AboutState extends MusicBeatState } -} +} \ No newline at end of file diff --git a/source/ui/FlxVirtualPad.hx b/source/ui/FlxVirtualPad.hx index d00ac03b6..76a2dc21c 100644 --- a/source/ui/FlxVirtualPad.hx +++ b/source/ui/FlxVirtualPad.hx @@ -105,10 +105,10 @@ class FlxVirtualPad extends FlxSpriteGroup actions.add(add(buttonB = createButton(FlxG.width - 86, FlxG.height - 45, 44, 45, "b"))); actions.add(add(buttonC = createButton(FlxG.width - 44, FlxG.height - 45, 44, 45, "c"))); case A_B_X_Y: - actions.add(add(buttonY = createButton(FlxG.width - 86, FlxG.height - 85, 44, 45, "y"))); - actions.add(add(buttonX = createButton(FlxG.width - 44, FlxG.height - 85, 44, 45, "x"))); - actions.add(add(buttonB = createButton(FlxG.width - 86, FlxG.height - 45, 44, 45, "b"))); - actions.add(add(buttonA = createButton(FlxG.width - 44, FlxG.height - 45, 44, 45, "a"))); + actions.add(add(buttonY = createButton(FlxG.width - 86 * 3, FlxG.height - 85 * 3, 44 * 3, 45 * 3, "y"))); + actions.add(add(buttonX = createButton(FlxG.width - 44 * 3, FlxG.height - 85 * 3, 44 * 3, 45 * 3, "x"))); + actions.add(add(buttonB = createButton(FlxG.width - 86 * 3, FlxG.height - 45 * 3, 44 * 3, 45 * 3, "b"))); + actions.add(add(buttonA = createButton(FlxG.width - 44 * 3, FlxG.height - 45 * 3, 44 * 3, 45 * 3, "a"))); case NONE: // do nothing } }