Merge pull request #1394 from KadeDev/master

Master
This commit is contained in:
Kade M 2021-07-21 16:16:41 -07:00 committed by GitHub
commit 76ae12dba6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
107 changed files with 9662 additions and 2683 deletions

1
.vscode/.temp vendored Normal file
View File

@ -0,0 +1 @@
TBA: tasks.json

21
.vscode/tasks.json vendored Normal file
View File

@ -0,0 +1,21 @@
{
"version": "2.0.0",
"tasks": [
{
"type": "lime",
"command": "test",
"group": {
"kind": "build",
"isDefault": true
}
},
{
"type": "lime",
"command": "build",
"group": {
"kind": "build",
"isDefault": true
}
}
]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 560 KiB

After

Width:  |  Height:  |  Size: 443 KiB

View File

@ -57,6 +57,7 @@
<library name="week4" preload="true" /> <library name="week4" preload="true" />
<library name="week5" preload="true" /> <library name="week5" preload="true" />
<library name="week6" preload="true" /> <library name="week6" preload="true" />
<library name="sm" preload="true" />
</section> </section>
<section if="NO_PRELOAD_ALL"> <section if="NO_PRELOAD_ALL">
@ -69,6 +70,7 @@
<library name="week4" preload="false" /> <library name="week4" preload="false" />
<library name="week5" preload="false" /> <library name="week5" preload="false" />
<library name="week6" preload="false" /> <library name="week6" preload="false" />
<library name="sm" preload="false" />
</section> </section>
<assets path="assets/songs" library="songs" exclude="*.ogg" if="web"/> <assets path="assets/songs" library="songs" exclude="*.ogg" if="web"/>
@ -89,7 +91,9 @@
<assets path="assets/week5" library="week5" exclude="*.mp3" unless="web"/> <assets path="assets/week5" library="week5" exclude="*.mp3" unless="web"/>
<assets path="assets/week6" library="week6" exclude="*.ogg" if="web"/> <assets path="assets/week6" library="week6" exclude="*.ogg" if="web"/>
<assets path="assets/week6" library="week6" exclude="*.mp3" unless="web"/> <assets path="assets/week6" library="week6" exclude="*.mp3" unless="web"/>
<assets path="assets/sm" library="sm" exclude="*.ogg" if="web"/>
<assets path="assets/sm" library="sm" exclude="*.mp3" unless="web"/>
<assets path='example_mods' rename='mods' embed='false'/> <assets path='example_mods' rename='mods' embed='false'/>
<assets path='art/readme.txt' rename='do NOT readme.txt' /> <assets path='art/readme.txt' rename='do NOT readme.txt' />
<assets path='LICENSE' rename='LICENSE.txt' /> <assets path='LICENSE' rename='LICENSE.txt' />
@ -160,6 +164,8 @@
<!--Disable the Flixel core debugger. Automatically gets set whenever you compile in release mode!--> <!--Disable the Flixel core debugger. Automatically gets set whenever you compile in release mode!-->
<haxedef name="FLX_NO_DEBUG" unless="debug" /> <haxedef name="FLX_NO_DEBUG" unless="debug" />
<haxedef name="HXCPP_GC_BIG_BLOCKS"/>
<!--Enable this for Nape release builds for a serious peformance improvement--> <!--Enable this for Nape release builds for a serious peformance improvement-->
<haxedef name="NAPE_RELEASE_BUILD" unless="debug" /> <haxedef name="NAPE_RELEASE_BUILD" unless="debug" />

View File

@ -24,17 +24,23 @@ If you're looking for documentation, changelogs, or guides, you can find those o
# Previews ([skip](#features)) # Previews ([skip](#features))
![Tutorial (Hard) on Downscroll](https://user-images.githubusercontent.com/15311104/113989685-fa5aea80-9850-11eb-9180-f5819a774c79.gif) ![Milf (Hard) on Downscroll](https://user-images.githubusercontent.com/15311104/113990845-2c208100-9852-11eb-8e6d-f1c9e8439871.gif) ![Title Screen](art/readme/KadeEngineTitleScreen.png)
![Roses (Hard) on Upscroll](https://user-images.githubusercontent.com/15311104/113993573-e31dfc00-9854-11eb-82ae-1f29dc8a0b04.png) ![Week Select](art/readme/KadeEngineWeekSelect.png)
![Milf (Hard) on Downscroll](https://user-images.githubusercontent.com/15311104/113991654-f4660900-9852-11eb-8c3d-f3927571f19b.png) ![Freeplay](art/readme/KadeEngineFreeplay.png)
![He malding](https://user-images.githubusercontent.com/15311104/113993693-02b52480-9855-11eb-9975-eb8a7a1be8d1.png) ![Options](art/readme/KadeEngineOptions.png)
![Free Play selection screen](https://i.imgur.com/LR0eWIC.png) ![Senpai Gameplay (Hard, Upscroll)](art/readme/KadeEnginePixelGameplay.png)
![Options Menu](https://i.imgur.com/LBXW9C1.png) ![Roses Dialogue](art/readme/KadeEngineDialogue.png)
![Pause Screen](art/readme/KadeEnginePauseScreen.png)
![Results Screen](art/readme/KadeEngineResultsScreen.png)
![Replay Loader](art/readme/KadeEngineReplayLoader.png)
# Features # Features
@ -43,12 +49,15 @@ If you're looking for documentation, changelogs, or guides, you can find those o
- **More information during gameplay** - **More information during gameplay**
- While you're playing, we show you information about how you're doing, such as your accuracy, combo break count, notes per second, and your grade/rating. - While you're playing, we show you information about how you're doing, such as your accuracy, combo break count, notes per second, and your grade/rating.
- **Customizable keybinds** - **Customizable keybinds**
- Instead of being forced to use WASD and the arrow keys, you can customize the keybinds to any keys you want! - Instead of being forced to use WASD and the arrow keys, you can set any keybinds you want!
- **Replays** (in beta) - **Replays** (in beta)
- Have you ever gotten a crazy score but didn't record? The replay system solves that: it automatically saves a "replay" of your gameplay every time you complete a song, which you can play back inside of the game. - Have you ever gotten a crazy score but didn't record? The replay system solves that: it automatically saves a "replay" of your gameplay every time you complete a song, which you can play back inside of the game.
- Replays just store information about what you're doing, they don't actually record the screen -- so they take up way less space on your disk than videos. - Replays just store information about what you're doing, they don't actually record the screen -- so they take up way less space on your disk than videos.
- **Audio offset** - **Audio offset**
- If your headphones are delayed, you can set an offset in the options menu to line the game up with the delay and play with synced audio like intended. - If your speakers or headphones are delayed, you can set an offset in the options menu to line the game up with the delay and play with synced audio like intended!
- **And much, much more!**
- There's so much more in store than just what's listed here! If you can imagine a quality of life feature, it's probably
either already included in Kade Engine or is being worked on!
# Credits # Credits
### Friday Night Funkin' ### Friday Night Funkin'
@ -65,4 +74,6 @@ This game was made with love to Newgrounds and its community. Extra love to Tom
### Shoutouts ### Shoutouts
- [GWebDev](https://github.com/GrowtopiaFli) - Video Code - [GWebDev](https://github.com/GrowtopiaFli) - Video Code
- [Rozebud](https://github.com/ThatRozebudDude) - Ideas (that I stole) - [Rozebud](https://github.com/ThatRozebudDude) - Ideas (that I stole)
- [Puyo](https://github.com/daniel11420) - Setting up appveyor and a lot of other help - [Puyo](https://github.com/puyoxyz) - Setting up appveyor and a lot of other help
- [Smokey](https://github.com/Smokey555) - telling me that I should do the tricky asset loading
- [Poco](https://github.com/poco0317) - math degree (aka most of the fucking math in this project)

View File

@ -9,7 +9,7 @@ install:
- cd /home/appveyor - cd /home/appveyor
- sudo add-apt-repository ppa:haxe/releases -y - sudo add-apt-repository ppa:haxe/releases -y
- sudo apt update - sudo apt update
- sudo apt install neko tar gcc-multilib g++-multilib -y - sudo apt install neko tar gcc-7 g++-7 gcc-7-multilib g++-7-multilib -y
- wget https://github.com/HaxeFoundation/haxe/releases/download/4.1.5/haxe-4.1.5-linux64.tar.gz - wget https://github.com/HaxeFoundation/haxe/releases/download/4.1.5/haxe-4.1.5-linux64.tar.gz
- mkdir $HAXE_INSTALLDIR - mkdir $HAXE_INSTALLDIR
- tar -xf haxe-4.1.5-linux64.tar.gz -C $HAXE_INSTALLDIR - tar -xf haxe-4.1.5-linux64.tar.gz -C $HAXE_INSTALLDIR

View File

@ -36,7 +36,10 @@ install:
- haxelib git extension-webm https://github.com/KadeDev/extension-webm - haxelib git extension-webm https://github.com/KadeDev/extension-webm
- haxelib run lime rebuild extension-webm windows - haxelib run lime rebuild extension-webm windows
- haxelib install linc_luajit - haxelib install linc_luajit
- haxelib install actuate - haxelib install actuate
#- haxelib git extension-webm https://github.com/KadeDev/extension-webm
#- haxelib run lime rebuild extension-webm windows
#why here's dublicate lmao
- haxelib list - haxelib list
# No tests idk lol # No tests idk lol

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 271 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 753 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 942 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 458 KiB

View File

@ -1,4 +1,4 @@
Tutorial:gf:1 Tutorial:gf:0
Bopeebo:dad:1 Bopeebo:dad:1
Fresh:dad:1 Fresh:dad:1
Dad Battle:dad:1 Dad Battle:dad:1

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,7 @@
Tutorial
Daddy Dearest
Spooky Month
PICO
MOMMY MUST MURDER
RED SNOW
Hating Simulator ft. Moawling

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

After

Width:  |  Height:  |  Size: 193 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 127 KiB

After

Width:  |  Height:  |  Size: 696 KiB

View File

@ -1,92 +1,92 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<TextureAtlas imagePath="NOTE_assets.png"> <TextureAtlas imagePath="NOTE_assets.png">
<!-- Created with Adobe Animate version 21.0.0.35450 --> <!-- Created with Adobe Animate version 21.0.0.35450 -->
<!-- http://www.adobe.com/products/animate.html --> <!-- http://www.adobe.com/products/animate.html -->
<SubTexture name="arrow static instance 10000" x="488" y="238" width="155" height="158"/> <SubTexture name="arrowDOWN0000" x="10" y="255" width="157" height="154"/>
<SubTexture name="arrow static instance 20000" x="647" y="238" width="157" height="155"/> <SubTexture name="arrowLEFT0000" x="672" y="416" width="154" height="157"/>
<SubTexture name="arrow static instance 30000" x="808" y="238" width="155" height="157"/> <SubTexture name="arrowRIGHT0000" x="10" y="419" width="154" height="157"/>
<SubTexture name="arrow static instance 40000" x="323" y="240" width="157" height="154"/> <SubTexture name="arrowUP0000" x="177" y="255" width="157" height="154"/>
<SubTexture name="blue hold end instance 10000" x="1062" y="452" width="51" height="64"/> <SubTexture name="blue alone0000" x="506" y="252" width="157" height="154"/>
<SubTexture name="blue hold piece instance 10000" x="1282" y="457" width="51" height="44"/> <SubTexture name="blue hold0000" x="1940" y="306" width="50" height="44"/>
<SubTexture name="blue instance 10000" x="0" y="240" width="158" height="154"/> <SubTexture name="blue tail0000" x="1940" y="10" width="50" height="64"/>
<SubTexture name="down confirm instance 10000" x="0" y="0" width="240" height="236"/> <SubTexture name="down confirm0000" x="10" y="10" width="238" height="235"/>
<SubTexture name="down confirm instance 10001" x="244" y="0" width="240" height="236"/> <SubTexture name="down confirm0001" x="258" y="10" width="238" height="235"/>
<SubTexture name="down confirm instance 10002" x="1206" y="235" width="221" height="218" frameX="-6" frameY="-12" frameWidth="240" frameHeight="236"/> <SubTexture name="down confirm0002" x="1236" y="250" width="220" height="217" frameX="-6" frameY="-12" frameWidth="238" frameHeight="235"/>
<SubTexture name="down confirm instance 10003" x="1206" y="235" width="221" height="218" frameX="-6" frameY="-12" frameWidth="240" frameHeight="236"/> <SubTexture name="down confirm0003" x="1236" y="250" width="220" height="217" frameX="-6" frameY="-12" frameWidth="238" frameHeight="235"/>
<SubTexture name="down press instance 10000" x="805" y="399" width="143" height="139" frameX="-4" frameY="-3" frameWidth="150" frameHeight="146"/> <SubTexture name="down press0000" x="1150" y="477" width="142" height="140" frameX="-4" frameY="-2" frameWidth="149" frameHeight="146"/>
<SubTexture name="down press instance 10001" x="805" y="399" width="143" height="139" frameX="-4" frameY="-3" frameWidth="150" frameHeight="146"/> <SubTexture name="down press0001" x="1150" y="477" width="142" height="140" frameX="-4" frameY="-2" frameWidth="149" frameHeight="146"/>
<SubTexture name="down press instance 10002" x="1898" y="0" width="150" height="146"/> <SubTexture name="down press0002" x="344" y="255" width="149" height="146"/>
<SubTexture name="down press instance 10003" x="1898" y="0" width="150" height="146"/> <SubTexture name="down press0003" x="344" y="255" width="149" height="146"/>
<SubTexture name="green hold end instance 10000" x="1007" y="452" width="51" height="64"/> <SubTexture name="green alone0000" x="673" y="252" width="157" height="154"/>
<SubTexture name="green hold piece instance 10000" x="1227" y="457" width="51" height="44"/> <SubTexture name="green hold0000" x="1940" y="360" width="50" height="44"/>
<SubTexture name="green instance 10000" x="162" y="240" width="157" height="154"/> <SubTexture name="green tail0000" x="1940" y="84" width="50" height="64"/>
<SubTexture name="left confirm instance 10000" x="972" y="0" width="230" height="232"/> <SubTexture name="left confirm0000" x="998" y="10" width="228" height="231"/>
<SubTexture name="left confirm instance 10001" x="1438" y="233" width="220" height="222" frameX="-5" frameY="-5" frameWidth="230" frameHeight="232"/> <SubTexture name="left confirm0001" x="1472" y="248" width="218" height="221" frameX="-5" frameY="-5" frameWidth="228" frameHeight="231"/>
<SubTexture name="left confirm instance 10002" x="1438" y="0" width="227" height="229" frameX="-2" frameY="-1" frameWidth="230" frameHeight="232"/> <SubTexture name="left confirm0002" x="1472" y="10" width="225" height="228" frameX="-2" frameY="-1" frameWidth="228" frameHeight="231"/>
<SubTexture name="left confirm instance 10003" x="1438" y="0" width="227" height="229" frameX="-2" frameY="-1" frameWidth="230" frameHeight="232"/> <SubTexture name="left confirm0003" x="1472" y="10" width="225" height="228" frameX="-2" frameY="-1" frameWidth="228" frameHeight="231"/>
<SubTexture name="left press instance 10000" x="1898" y="449" width="139" height="142" frameX="-4" frameY="-3" frameWidth="146" frameHeight="149"/> <SubTexture name="left press0000" x="1302" y="477" width="140" height="142" frameX="-3" frameY="-3" frameWidth="146" frameHeight="149"/>
<SubTexture name="left press instance 10001" x="1898" y="449" width="139" height="142" frameX="-4" frameY="-3" frameWidth="146" frameHeight="149"/> <SubTexture name="left press0001" x="1302" y="477" width="140" height="142" frameX="-3" frameY="-3" frameWidth="146" frameHeight="149"/>
<SubTexture name="left press instance 10002" x="1898" y="150" width="146" height="149"/> <SubTexture name="left press0002" x="840" y="413" width="146" height="149"/>
<SubTexture name="left press instance 10003" x="1898" y="150" width="146" height="149"/> <SubTexture name="left press0003" x="840" y="413" width="146" height="149"/>
<SubTexture name="left press instance 10004" x="1898" y="150" width="146" height="149"/> <SubTexture name="left press0004" x="840" y="413" width="146" height="149"/>
<SubTexture name="left press instance 10005" x="1898" y="150" width="146" height="149"/> <SubTexture name="left press0005" x="840" y="413" width="146" height="149"/>
<SubTexture name="left press instance 10006" x="1898" y="150" width="146" height="149"/> <SubTexture name="left press0006" x="840" y="413" width="146" height="149"/>
<SubTexture name="left press instance 10007" x="1898" y="150" width="146" height="149"/> <SubTexture name="left press0007" x="840" y="413" width="146" height="149"/>
<SubTexture name="left press instance 10008" x="1898" y="150" width="146" height="149"/> <SubTexture name="left press0008" x="840" y="413" width="146" height="149"/>
<SubTexture name="left press instance 10009" x="1898" y="150" width="146" height="149"/> <SubTexture name="left press0009" x="840" y="413" width="146" height="149"/>
<SubTexture name="left press instance 10010" x="1898" y="150" width="146" height="149"/> <SubTexture name="left press0010" x="840" y="413" width="146" height="149"/>
<SubTexture name="left press instance 10011" x="1898" y="150" width="146" height="149"/> <SubTexture name="left press0011" x="840" y="413" width="146" height="149"/>
<SubTexture name="left press instance 10012" x="1898" y="150" width="146" height="149"/> <SubTexture name="left press0012" x="840" y="413" width="146" height="149"/>
<SubTexture name="left press instance 10013" x="1898" y="150" width="146" height="149"/> <SubTexture name="left press0013" x="840" y="413" width="146" height="149"/>
<SubTexture name="left press instance 10014" x="1898" y="150" width="146" height="149"/> <SubTexture name="left press0014" x="840" y="413" width="146" height="149"/>
<SubTexture name="left press instance 10015" x="1898" y="150" width="146" height="149"/> <SubTexture name="left press0015" x="840" y="413" width="146" height="149"/>
<SubTexture name="left press instance 10016" x="1898" y="150" width="146" height="149"/> <SubTexture name="left press0016" x="840" y="413" width="146" height="149"/>
<SubTexture name="left press instance 10017" x="1898" y="150" width="146" height="149"/> <SubTexture name="left press0017" x="840" y="413" width="146" height="149"/>
<SubTexture name="left press instance 10018" x="1898" y="150" width="146" height="149"/> <SubTexture name="left press0018" x="840" y="413" width="146" height="149"/>
<SubTexture name="left press instance 10019" x="1898" y="150" width="146" height="149"/> <SubTexture name="left press0019" x="840" y="413" width="146" height="149"/>
<SubTexture name="pruple end hold instance 10000" x="1117" y="452" width="51" height="64"/> <SubTexture name="purple alone0000" x="344" y="416" width="154" height="157"/>
<SubTexture name="purple hold piece instance 10000" x="1337" y="457" width="51" height="44"/> <SubTexture name="purple hold0000" x="1940" y="414" width="50" height="44"/>
<SubTexture name="purple instance 10000" x="0" y="398" width="154" height="157"/> <SubTexture name="purple tail0000" x="1940" y="158" width="50" height="64"/>
<SubTexture name="red hold end instance 10000" x="952" y="452" width="51" height="64"/> <SubTexture name="red alone0000" x="508" y="416" width="154" height="157"/>
<SubTexture name="red hold piece instance 10000" x="1172" y="457" width="51" height="44"/> <SubTexture name="red hold0000" x="1940" y="468" width="50" height="44"/>
<SubTexture name="red instance 10000" x="647" y="397" width="154" height="157"/> <SubTexture name="red tail0000" x="1940" y="232" width="50" height="64"/>
<SubTexture name="right confirm instance 10000" x="1669" y="0" width="225" height="228" frameX="-1" frameY="-2" frameWidth="228" frameHeight="231"/> <SubTexture name="right confirm0000" x="1707" y="10" width="223" height="226" frameX="-1" frameY="-3" frameWidth="226" frameHeight="230"/>
<SubTexture name="right confirm instance 10001" x="1669" y="232" width="225" height="228" frameX="-1" frameY="-2" frameWidth="228" frameHeight="231"/> <SubTexture name="right confirm0001" x="1707" y="246" width="223" height="226" frameX="-1" frameY="-3" frameWidth="226" frameHeight="230"/>
<SubTexture name="right confirm instance 10002" x="1206" y="0" width="228" height="231"/> <SubTexture name="right confirm0002" x="1236" y="10" width="226" height="230"/>
<SubTexture name="right confirm instance 10003" x="1206" y="0" width="228" height="231"/> <SubTexture name="right confirm0003" x="1236" y="10" width="226" height="230"/>
<SubTexture name="right press instance 10000" x="469" y="400" width="139" height="142" frameX="-3" frameY="-7" frameWidth="149" frameHeight="152"/> <SubTexture name="right press0000" x="1452" y="479" width="138" height="141" frameX="-3" frameY="-7" frameWidth="148" frameHeight="151"/>
<SubTexture name="right press instance 10001" x="469" y="400" width="139" height="142" frameX="-3" frameY="-7" frameWidth="149" frameHeight="152"/> <SubTexture name="right press0001" x="1452" y="479" width="138" height="141" frameX="-3" frameY="-7" frameWidth="148" frameHeight="151"/>
<SubTexture name="right press instance 10002" x="316" y="398" width="149" height="152"/> <SubTexture name="right press0002" x="840" y="252" width="148" height="151"/>
<SubTexture name="right press instance 10003" x="316" y="398" width="149" height="152"/> <SubTexture name="right press0003" x="840" y="252" width="148" height="151"/>
<SubTexture name="right press instance 10004" x="316" y="398" width="149" height="152"/> <SubTexture name="right press0004" x="840" y="252" width="148" height="151"/>
<SubTexture name="right press instance 10005" x="316" y="398" width="149" height="152"/> <SubTexture name="right press0005" x="840" y="252" width="148" height="151"/>
<SubTexture name="right press instance 10006" x="316" y="398" width="149" height="152"/> <SubTexture name="right press0006" x="840" y="252" width="148" height="151"/>
<SubTexture name="right press instance 10007" x="316" y="398" width="149" height="152"/> <SubTexture name="right press0007" x="840" y="252" width="148" height="151"/>
<SubTexture name="right press instance 10008" x="316" y="398" width="149" height="152"/> <SubTexture name="right press0008" x="840" y="252" width="148" height="151"/>
<SubTexture name="right press instance 10009" x="316" y="398" width="149" height="152"/> <SubTexture name="right press0009" x="840" y="252" width="148" height="151"/>
<SubTexture name="right press instance 10010" x="316" y="398" width="149" height="152"/> <SubTexture name="right press0010" x="840" y="252" width="148" height="151"/>
<SubTexture name="right press instance 10011" x="316" y="398" width="149" height="152"/> <SubTexture name="right press0011" x="840" y="252" width="148" height="151"/>
<SubTexture name="right press instance 10012" x="316" y="398" width="149" height="152"/> <SubTexture name="right press0012" x="840" y="252" width="148" height="151"/>
<SubTexture name="right press instance 10013" x="316" y="398" width="149" height="152"/> <SubTexture name="right press0013" x="840" y="252" width="148" height="151"/>
<SubTexture name="right press instance 10014" x="316" y="398" width="149" height="152"/> <SubTexture name="right press0014" x="840" y="252" width="148" height="151"/>
<SubTexture name="right press instance 10015" x="316" y="398" width="149" height="152"/> <SubTexture name="right press0015" x="840" y="252" width="148" height="151"/>
<SubTexture name="right press instance 10016" x="316" y="398" width="149" height="152"/> <SubTexture name="right press0016" x="840" y="252" width="148" height="151"/>
<SubTexture name="right press instance 10017" x="316" y="398" width="149" height="152"/> <SubTexture name="right press0017" x="840" y="252" width="148" height="151"/>
<SubTexture name="right press instance 10018" x="316" y="398" width="149" height="152"/> <SubTexture name="right press0018" x="840" y="252" width="148" height="151"/>
<SubTexture name="right press instance 10019" x="316" y="398" width="149" height="152"/> <SubTexture name="right press0019" x="840" y="252" width="148" height="151"/>
<SubTexture name="right press instance 10020" x="316" y="398" width="149" height="152"/> <SubTexture name="right press0020" x="840" y="252" width="148" height="151"/>
<SubTexture name="right press instance 10021" x="316" y="398" width="149" height="152"/> <SubTexture name="right press0021" x="840" y="252" width="148" height="151"/>
<SubTexture name="right press instance 10022" x="316" y="398" width="149" height="152"/> <SubTexture name="right press0022" x="840" y="252" width="148" height="151"/>
<SubTexture name="right press instance 10023" x="316" y="398" width="149" height="152"/> <SubTexture name="right press0023" x="840" y="252" width="148" height="151"/>
<SubTexture name="right press instance 10024" x="316" y="398" width="149" height="152"/> <SubTexture name="right press0024" x="840" y="252" width="148" height="151"/>
<SubTexture name="right press instance 10025" x="316" y="398" width="149" height="152"/> <SubTexture name="right press0025" x="840" y="252" width="148" height="151"/>
<SubTexture name="right press instance 10026" x="316" y="398" width="149" height="152"/> <SubTexture name="right press0026" x="840" y="252" width="148" height="151"/>
<SubTexture name="up confirm instance 10000" x="488" y="0" width="238" height="234"/> <SubTexture name="up confirm0000" x="506" y="10" width="236" height="232"/>
<SubTexture name="up confirm instance 10001" x="730" y="0" width="238" height="234"/> <SubTexture name="up confirm0001" x="752" y="10" width="236" height="232"/>
<SubTexture name="up confirm instance 10002" x="972" y="236" width="216" height="212" frameX="-11" frameY="-11" frameWidth="238" frameHeight="234"/> <SubTexture name="up confirm0002" x="998" y="251" width="214" height="211" frameX="-11" frameY="-10" frameWidth="236" frameHeight="232"/>
<SubTexture name="up confirm instance 10003" x="972" y="236" width="216" height="212" frameX="-11" frameY="-11" frameWidth="238" frameHeight="234"/> <SubTexture name="up confirm0003" x="998" y="251" width="214" height="211" frameX="-11" frameY="-10" frameWidth="236" frameHeight="232"/>
<SubTexture name="up press instance 10000" x="1898" y="303" width="144" height="142" frameX="-6" frameY="-4" frameWidth="154" frameHeight="151"/> <SubTexture name="up press0000" x="996" y="472" width="144" height="141" frameX="-5" frameY="-4" frameWidth="153" frameHeight="150"/>
<SubTexture name="up press instance 10001" x="1898" y="303" width="144" height="142" frameX="-6" frameY="-4" frameWidth="154" frameHeight="151"/> <SubTexture name="up press0001" x="996" y="472" width="144" height="141" frameX="-5" frameY="-4" frameWidth="153" frameHeight="150"/>
<SubTexture name="up press instance 10002" x="158" y="398" width="154" height="151"/> <SubTexture name="up press0002" x="174" y="419" width="153" height="150"/>
<SubTexture name="up press instance 10003" x="158" y="398" width="154" height="151"/> <SubTexture name="up press0003" x="174" y="419" width="153" height="150"/>
</TextureAtlas> </TextureAtlas>

View File

@ -0,0 +1,9 @@
idle -5 0
singUP -29 27
singRIGHT -38 -7
singLEFT 12 -6
singDOWN -10 -50
singUPmiss -29 27
singRIGHTmiss -30 21
singLEFTmiss 12 24
singDOWNmiss -11 -19

View File

@ -0,0 +1,10 @@
idle -5 0
singUP -29 27
singRIGHT -38 -7
singLEFT 12 -6
singDOWN -10 -50
singUPmiss -29 27
singRIGHTmiss -30 21
singLEFTmiss 12 24
singDOWNmiss -11 -19
hey 7 4

View File

@ -0,0 +1,3 @@
firstDeath 0 0
deathLoop -30 -12
deathConfirm -30 -12

View File

@ -0,0 +1,9 @@
idle 0 0
singUP 0 0
singRIGHT 0 0
singLEFT 0 0
singDOWN 0 0
singUPmiss 0 0
singRIGHTmiss 0 0
singLEFTmiss 0 0
singDOWNmiss 0 0

View File

@ -0,0 +1,14 @@
idle -5 0
singUP -29 27
singRIGHT -38 -7
singLEFT 12 -6
singDOWN -10 -50
singUPmiss -29 27
singRIGHTmiss -30 21
singLEFTmiss 12 24
singDOWNmiss -11 -19
hey 7 4
firstDeath 37 11
deathLoop 37 5
deathConfirm 37 69
scared -4 0

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<TextureAtlas imagePath="bfPixelsDEAD.png"> <TextureAtlas imagePath="bfPixelsDEAD.png">
<!-- Created with Adobe Animate version 20.0.0.17400 --> <!-- if you read this you're epic. -->
<!-- http://www.adobe.com/products/animate.html --> <!-- manual tweaks done on BF Dies pixel last 2 frames -->
<SubTexture name="BF Dies pixel0000" x="0" y="0" width="90" height="81"/> <SubTexture name="BF Dies pixel0000" x="0" y="0" width="90" height="81"/>
<SubTexture name="BF Dies pixel0001" x="100" y="0" width="90" height="81"/> <SubTexture name="BF Dies pixel0001" x="100" y="0" width="90" height="81"/>
<SubTexture name="BF Dies pixel0002" x="200" y="0" width="90" height="81"/> <SubTexture name="BF Dies pixel0002" x="200" y="0" width="90" height="81"/>
@ -58,8 +58,8 @@
<SubTexture name="BF Dies pixel0053" x="300" y="273" width="90" height="81"/> <SubTexture name="BF Dies pixel0053" x="300" y="273" width="90" height="81"/>
<SubTexture name="BF Dies pixel0054" x="400" y="273" width="90" height="81"/> <SubTexture name="BF Dies pixel0054" x="400" y="273" width="90" height="81"/>
<SubTexture name="BF Dies pixel0055" x="500" y="273" width="90" height="81"/> <SubTexture name="BF Dies pixel0055" x="500" y="273" width="90" height="81"/>
<SubTexture name="BF Dies pixel0056" x="696" y="450" width="77" height="76"/> <SubTexture name="BF Dies pixel0056" x="691" y="448" width="90" height="81"/>
<SubTexture name="BF Dies pixel0057" x="696" y="450" width="77" height="76"/> <SubTexture name="BF Dies pixel0057" x="691" y="448" width="90" height="81"/>
<SubTexture name="RETRY CONFIRM0000" x="600" y="273" width="77" height="76"/> <SubTexture name="RETRY CONFIRM0000" x="600" y="273" width="77" height="76"/>
<SubTexture name="RETRY CONFIRM0001" x="687" y="273" width="77" height="76"/> <SubTexture name="RETRY CONFIRM0001" x="687" y="273" width="77" height="76"/>
<SubTexture name="RETRY CONFIRM0002" x="687" y="273" width="77" height="76"/> <SubTexture name="RETRY CONFIRM0002" x="687" y="273" width="77" height="76"/>

View File

@ -0,0 +1,5 @@
idle 0 0
singUP -6 50
singRIGHT 0 27
singLEFT -10 10
singDOWN 0 -30

View File

@ -0,0 +1,2 @@
danceLeft 0 0
danceRight 0 0

View File

@ -0,0 +1,11 @@
cheer 0 0
sad -2 -21
danceLeft 0 -9
danceRight 0 -9
singUP 0 4
singRIGHT 0 -20
singLEFT 0 -19
singDOWN 0 -20
hairBlow 45 -8
hairFall 0 -9
scared -2 -17

View File

@ -0,0 +1,2 @@
danceLeft 0 0
danceRight 0 0

View File

@ -0,0 +1,11 @@
cheer 0 0
sad -2 -21
danceLeft 0 -9
danceRight 0 -9
singUP 0 4
singRIGHT 0 -20
singLEFT 0 -19
singDOWN 0 -20
hairBlow 45 -8
hairFall 0 -9
scared -2 -17

View File

@ -0,0 +1,5 @@
idle 0 0
singUP 14 71
singRIGHT 10 -60
singLEFT 250 -23
singDOWN 20 -160

View File

@ -0,0 +1,5 @@
idle 0 0
singUP 14 71
singRIGHT 10 -60
singLEFT 250 -23
singDOWN 20 -160

View File

@ -0,0 +1,5 @@
idle 0 0
singUP -20 50
singRIGHT -51 0
singLEFT -30 0
singDOWN -40 -94

View File

@ -0,0 +1,5 @@
idle 0 0
singUP -20 94
singRIGHT -51 30
singLEFT -30 20
singDOWN -50 -80

View File

@ -0,0 +1,9 @@
idle 0 0
singUP -47 24
singRIGHT -1 -23
singLEFT -30 16
singDOWN -31 -29
singUP-alt -47 24
singRIGHT-alt -1 -24
singLEFT-alt -30 15
singDOWN-alt -30 -27

View File

@ -0,0 +1,9 @@
idle 0 0
singUP -29 27
singRIGHT -68 -7
singLEFT 65 9
singDOWN 200 -70
singUPmiss -19 67
singRIGHTmiss -60 41
singLEFTmiss 62 64
singDOWNmiss 210 -28

View File

@ -0,0 +1,5 @@
idle 0 0
singUP 5 37
singRIGHT 0 0
singLEFT 40 0
singDOWN 14 0

View File

@ -0,0 +1,5 @@
idle 0 0
singUP 5 37
singRIGHT 0 0
singLEFT 40 0
singDOWN 14 0

View File

@ -0,0 +1,5 @@
idle -220 -280
singUP -220 -240
singRIGHT -220 -280
singLEFT -200 -280
singDOWN 170 110

View File

@ -0,0 +1,6 @@
danceLeft 0 0
danceRight 0 0
singUP -20 26
singRIGHT -130 -14
singLEFT 130 -10
singDOWN -50 -130

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,5 @@
Put both the .sm and .ogg in the same folder and put the folder in this folder. Launch the game and go into freeplay, it'll load into the song list.
Limitations:
- You can only use songs that have one difficulty, so if a song has more than one. Remove all but the one you want to play. (it doesn't matter if it's challenge or what ever)
- The song must be a .ogg

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -30,26 +30,19 @@
- `haxelib git discord_rpc https://github.com/Aidan63/linc_discord-rpc` - `haxelib git discord_rpc https://github.com/Aidan63/linc_discord-rpc`
- `haxelib install actuate` - `haxelib install actuate`
- `haxelib git extension-webm https://github.com/KadeDev/extension-webm` - `haxelib git extension-webm https://github.com/KadeDev/extension-webm`
- `lime rebuild extension-webm windows` - `lime rebuild extension-webm <ie. windows, macos, linux>`
### Windows-only dependencies (only for building *to* Windows. Building html5 on Windows does not require this) ### Windows-only dependencies (only for building *to* Windows. Building html5 on Windows does not require this)
If you are planning to build for Windows, you also need to install **Visual Studio 2019**. While installing it, *don't click on any of the options to install workloads*. Instead, go to the **individual components** tab and choose the following: If you are planning to build for Windows, you also need to install **Visual Studio 2019**. While installing it, *don't click on any of the options to install workloads*. Instead, go to the **individual components** tab and choose the following:
- MSVC v142 - VS 2019 C++ x64/x86 build tools - MSVC v142 - VS 2019 C++ x64/x86 build tools
- MSVC v141 - VS 2017 C++ x64/x86 build tools
- Windows SDK (10.0.17763.0) - Windows SDK (10.0.17763.0)
- C++ Profiling tools - C++ Profiling tools
- C++ CMake tools for windows - C++ CMake tools for windows
- C++ ATL for v142 build tools (x86 & x64) - C++ ATL for v142 build tools (x86 & x64)
- C++ MFC for v142 build tools (x86 & x64)
- C++/CLI support for v142 build tools (14.21)
- C++ Modules for v142 build tools (x64/x86)
- Clang Compiler for Windows
- Windows 10 SDK (10.0.17134.0)
- Windows 10 SDK (10.0.16299.0)
- MSVC v141 - VS 2017 C++ x64/x86 build tools
- MSVC v140 - VS 2015 C++ build tools (v14.00)
This will install about 22 GB of crap, but is necessary to build for Windows. This will install about 7 GB of crap, but is necessary to build for Windows.
### macOS-only dependencies (these are required for building on macOS at all, including html5.) ### macOS-only dependencies (these are required for building on macOS at all, including html5.)
If you are running macOS, you'll need to install Xcode. You can download it from the macOS App Store or from the [Xcode website](https://developer.apple.com/xcode/). If you are running macOS, you'll need to install Xcode. You can download it from the macOS App Store or from the [Xcode website](https://developer.apple.com/xcode/).

View File

@ -0,0 +1,35 @@
# Latest (master) changelog
Changes marked with 💖 will be listed in the short version of the changelog in `version.downloadMe`.
### Additions
- 💖 Full reworked charter
- Note quantization
- 💖 BPM Changes & Scroll Speed Change Support
- 💖 StepMania File Format support
- Anti-Aliasing option for low end pc's
- 💖 Pre-loading for characters option
- New Logo
- 💖 New Main Menu Remix
- 💖 Difficulty Calculator
- Week Locking
- Character Offset Files
- Many new options
### Changes
- Reworked Health Drain to be harsher
- 💖 Held notes being weird as fuck (completely reworked them)
- Many beat based things actually go to the beat (blue balls, title screen, etc)
- Losing Icon for Father Dearest & Mommy Mearest together
### Bugfixes
- BF Animation ending too early
- Held note end fix (this made me mad)
- Up arrow having a 8 pixels next to it
- Stop crashes with "R"
- Fixed dropped inputs for stacked notes.
- Fixed multiple crashes
- Fixed spirit being weird
- Fixed a lot of desyncs
- Ghost Tapping works now
- Pressing 7 while dying no longer freezes you in time.

View File

@ -15,8 +15,10 @@ Scroll down to Line 26, or Search (Windows/Linux: `Ctrl+F`, Mac: `Cmd+F`) for "w
--- ---
```haxe ```haxe
var weekData:Array<Dynamic> = [ static function weekData():Array<Dynamic>
{
return [
['Tutorial'], ['Tutorial'],
['Bopeebo', 'Fresh', 'Dadbattle'], ['Bopeebo', 'Fresh', 'Dadbattle'],
@ -30,8 +32,9 @@ var weekData:Array<Dynamic> = [
['Cocoa', 'Eggnog', 'Winter-Horrorland'], ['Cocoa', 'Eggnog', 'Winter-Horrorland'],
['Senpai', 'Roses', 'Thorns'] ['Senpai', 'Roses', 'Thorns']
]; ];
}
``` ```
--- ---
@ -45,8 +48,10 @@ Example
--- ---
```haxe ```haxe
var weekData:Array<Dynamic> = [ static function weekData():Array<Dynamic>
{
return [
['Tutorial'], ['Tutorial'],
['Bopeebo', 'Fresh', 'Dadbattle'], ['Bopeebo', 'Fresh', 'Dadbattle'],
@ -58,12 +63,13 @@ var weekData:Array<Dynamic> = [
['Satin-Panties', "High", "Milf"], ['Satin-Panties', "High", "Milf"],
['Cocoa', 'Eggnog', 'Winter-Horrorland'], ['Cocoa', 'Eggnog', 'Winter-Horrorland'],
['Senpai', 'Roses', 'Thorns'], ['Senpai', 'Roses', 'Thorns'],
['Ugh', 'Guns', 'Stress'] ['Ugh', 'Guns', 'Stress']
]; ];
}
``` ```
--- ---
@ -103,32 +109,21 @@ var weekCharacters:Array<Dynamic> = [
### Step 4. Week Names ### Step 4. Week Names
Underneath the song list, there should be another array called `weekNames`. Creating a new line in that array, just enter a string that represents what you want the week to be called. In `assets/preload/data`, there should be a .txt file called `weekNames`. Creating a new line in that file, just enter a string that represents what you want the week to be called.
Example Example
--- ---
--- ---
```haxe ```
var weekNames:Array<String> = [ Tutorial
Daddy Dearest
"How to Funk", Spooky Month
PICO
"Daddy dearest", MOMMY MUST MURDER
RED SNOW
"Spooky Month", Hating Simulator ft. Moawling
TANKMAN
"PICO",
"Mommy Must Murder",
"Red Snow",
"Hating Simulator ft. Moawlings",
"Tankman"
];
``` ```
--- ---
@ -137,23 +132,29 @@ var weekNames:Array<String> = [
### Step 5. Graphics ### Step 5. Graphics
Displaying a week icon for your custom week is as simple as dropping a .png into `assets/images/storymenu`. Rename the file to `week7.png`, `week8.png`, etc. Displaying a week icon for your custom week is as simple as dropping a .png into `assets/preload/images/storymenu`. Rename the file to `week7.png`, `week8.png`, etc.
Example Example
--- ---
--- ---
![frrf](https://user-images.githubusercontent.com/68293280/118160164-cdab6d00-b3d2-11eb-9b29-a940eaf45025.png) ![frrf](https://user-images.githubusercontent.com/68293280/118160164-cdab6d00-b3d2-11eb-9b29-a940eaf45025.png)
![frrf 2](https://user-images.githubusercontent.com/68293280/118160865-b8830e00-b3d3-11eb-8a23-818a1b4cfdb2.png) ![frrf 2](https://user-images.githubusercontent.com/68293280/118160865-b8830e00-b3d3-11eb-8a23-818a1b4cfdb2.png)
![frrf 3](https://user-images.githubusercontent.com/68293280/118161461-7908f180-b3d4-11eb-89fa-e531ae5804d8.png)
=======
![weeks1](https://user-images.githubusercontent.com/55949451/122635123-69bb4900-d0e2-11eb-8bcc-1071cfda4e35.png)
NOTE: You will have to add a new item to `weekUnlocked`, so that the week is playable. NOTE: You will have to add a new item to `weekUnlocked`, so that the week is playable.
Locate to line 39 and add in a new boolean called True so that the week can be playable. Locate to line 39 and add in a new boolean called True so that the week can be playable.
![frrf 3](https://user-images.githubusercontent.com/68293280/118161461-7908f180-b3d4-11eb-89fa-e531ae5804d8.png)
---
![weeks2](https://user-images.githubusercontent.com/55949451/122635129-763fa180-d0e2-11eb-841e-3456e74a50ba.png) \* *for this screenshot I removed tankman from weekCharacters as it would crash because I don't have a tankman character added*
### Conclusion ### Conclusion
If you followed all of the steps correctly, you have successfully created a new week in the Story Mode. If you followed all of the steps correctly, you have successfully created a new week in the Story Mode.

View File

@ -278,8 +278,10 @@ class AlphaCharacter extends FlxSprite
super(x, y); super(x, y);
var tex = Paths.getSparrowAtlas('alphabet'); var tex = Paths.getSparrowAtlas('alphabet');
frames = tex; frames = tex;
if(FlxG.save.data.antialiasing)
antialiasing = true; {
antialiasing = true;
}
} }
public function createBold(letter:String) public function createBold(letter:String)

View File

@ -118,6 +118,9 @@ class AnimationDebug extends FlxState
if (FlxG.keys.justPressed.Q) if (FlxG.keys.justPressed.Q)
FlxG.camera.zoom -= 0.25; FlxG.camera.zoom -= 0.25;
if (FlxG.keys.justPressed.F)
char.flipX = !char.flipX;
if (FlxG.keys.pressed.I || FlxG.keys.pressed.J || FlxG.keys.pressed.K || FlxG.keys.pressed.L) if (FlxG.keys.pressed.I || FlxG.keys.pressed.J || FlxG.keys.pressed.K || FlxG.keys.pressed.L)
{ {
if (FlxG.keys.pressed.I) if (FlxG.keys.pressed.I)

View File

@ -1,5 +1,6 @@
package; package;
import flixel.FlxG;
import flixel.FlxSprite; import flixel.FlxSprite;
import flixel.graphics.frames.FlxAtlasFrames; import flixel.graphics.frames.FlxAtlasFrames;
@ -13,7 +14,10 @@ class BackgroundDancer extends FlxSprite
animation.addByIndices('danceLeft', 'bg dancer sketch PINK', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "", 24, false); animation.addByIndices('danceLeft', 'bg dancer sketch PINK', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "", 24, false);
animation.addByIndices('danceRight', 'bg dancer sketch PINK', [15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29], "", 24, false); animation.addByIndices('danceRight', 'bg dancer sketch PINK', [15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29], "", 24, false);
animation.play('danceLeft'); animation.play('danceLeft');
antialiasing = true; if(FlxG.save.data.antialiasing)
{
antialiasing = true;
}
} }
var danceDir:Bool = false; var danceDir:Bool = false;

View File

@ -1,10 +1,20 @@
#if sys
package; package;
import lime.app.Application;
#if windows
import Discord.DiscordClient;
#end
import openfl.display.BitmapData;
import openfl.utils.Assets;
import flixel.ui.FlxBar;
import haxe.Exception; import haxe.Exception;
import flixel.tweens.FlxEase; import flixel.tweens.FlxEase;
import flixel.tweens.FlxTween; import flixel.tweens.FlxTween;
#if cpp
import sys.FileSystem; import sys.FileSystem;
import sys.io.File; import sys.io.File;
#end
import flixel.FlxG; import flixel.FlxG;
import flixel.FlxSprite; import flixel.FlxSprite;
import flixel.addons.transition.FlxTransitionSprite.GraphicTransTileDiamond; import flixel.addons.transition.FlxTransitionSprite.GraphicTransTileDiamond;
@ -22,107 +32,152 @@ using StringTools;
class Caching extends MusicBeatState class Caching extends MusicBeatState
{ {
var toBeDone = 0; var toBeDone = 0;
var done = 0; var done = 0;
var loaded = false;
var text:FlxText;
var kadeLogo:FlxSprite;
public static var bitmapData:Map<String,FlxGraphic>;
var images = [];
var music = [];
var charts = [];
var text:FlxText;
var kadeLogo:FlxSprite;
override function create() override function create()
{ {
FlxG.mouse.visible = false;
FlxG.worldBounds.set(0,0); FlxG.save.bind('funkin', 'ninjamuffin99');
text = new FlxText(FlxG.width / 2, FlxG.height / 2 + 300,0,"Loading..."); PlayerSettings.init();
text.size = 34;
text.alignment = FlxTextAlign.CENTER;
text.alpha = 0;
kadeLogo = new FlxSprite(FlxG.width / 2, FlxG.height / 2).loadGraphic(Paths.image('KadeEngineLogo')); KadeEngineData.initSave();
kadeLogo.x -= kadeLogo.width / 2;
kadeLogo.y -= kadeLogo.height / 2 + 100;
text.y -= kadeLogo.height / 2 - 125;
text.x -= 170;
kadeLogo.setGraphicSize(Std.int(kadeLogo.width * 0.6));
kadeLogo.alpha = 0; FlxG.mouse.visible = false;
add(kadeLogo); FlxG.worldBounds.set(0,0);
add(text);
trace('starting caching..'); bitmapData = new Map<String,FlxGraphic>();
sys.thread.Thread.create(() -> { text = new FlxText(FlxG.width / 2, FlxG.height / 2 + 300,0,"Loading...");
cache(); text.size = 34;
}); text.alignment = FlxTextAlign.CENTER;
text.alpha = 0;
kadeLogo = new FlxSprite(FlxG.width / 2, FlxG.height / 2).loadGraphic(Paths.image('KadeEngineLogo'));
kadeLogo.x -= kadeLogo.width / 2;
kadeLogo.y -= kadeLogo.height / 2 + 100;
text.y -= kadeLogo.height / 2 - 125;
text.x -= 170;
kadeLogo.setGraphicSize(Std.int(kadeLogo.width * 0.6));
kadeLogo.antialiasing = true;
kadeLogo.alpha = 0;
#if cpp
if (FlxG.save.data.cacheImages)
{
trace("caching images...");
for (i in FileSystem.readDirectory(FileSystem.absolutePath("assets/shared/images/characters")))
{
if (!i.endsWith(".png"))
continue;
images.push(i);
}
}
trace("caching music...");
for (i in FileSystem.readDirectory(FileSystem.absolutePath("assets/songs")))
{
music.push(i);
}
#end
toBeDone = Lambda.count(images) + Lambda.count(music);
var bar = new FlxBar(10,FlxG.height - 50,FlxBarFillDirection.LEFT_TO_RIGHT,FlxG.width,40,null,"done",0,toBeDone);
bar.color = FlxColor.PURPLE;
add(bar);
add(kadeLogo);
add(text);
trace('starting caching..');
#if cpp
// update thread
sys.thread.Thread.create(() -> {
while(!loaded)
{
if (toBeDone != 0 && done != toBeDone)
{
var alpha = HelperFunctions.truncateFloat(done / toBeDone * 100,2) / 100;
kadeLogo.alpha = alpha;
text.alpha = alpha;
text.text = "Loading... (" + done + "/" + toBeDone + ")";
}
}
});
// cache thread
sys.thread.Thread.create(() -> {
cache();
});
#end
super.create();
}
var calledDone = false;
override function update(elapsed)
{
super.update(elapsed);
}
super.create(); function cache()
} {
trace("LOADING: " + toBeDone + " OBJECTS.");
var calledDone = false; for (i in images)
{
var replaced = i.replace(".png","");
var data:BitmapData = BitmapData.fromFile("assets/shared/images/characters/" + i);
trace('id ' + replaced + ' file - assets/shared/images/characters/' + i + ' ${data.width}');
var graph = FlxGraphic.fromBitmapData(data);
graph.persist = true;
graph.destroyOnNoUse = false;
bitmapData.set(replaced,graph);
done++;
}
override function update(elapsed) for (i in music)
{ {
FlxG.sound.cache(Paths.inst(i));
if (toBeDone != 0 && done != toBeDone) FlxG.sound.cache(Paths.voices(i));
{ trace("cached " + i);
var alpha = HelperFunctions.truncateFloat(done / toBeDone * 100,2) / 100; done++;
kadeLogo.alpha = alpha; }
text.alpha = alpha;
text.text = "Loading... (" + done + "/" + toBeDone + ")";
}
super.update(elapsed);
}
function cache() trace("Finished caching...");
{
var images = []; loaded = true;
var music = [];
trace("caching images..."); trace(Assets.cache.hasBitmapData('GF_assets'));
for (i in FileSystem.readDirectory(FileSystem.absolutePath("assets/shared/images/characters"))) FlxG.switchState(new TitleState());
{ }
if (!i.endsWith(".png"))
continue;
images.push(i);
}
trace("caching music..."); }
#end
for (i in FileSystem.readDirectory(FileSystem.absolutePath("assets/songs")))
{
music.push(i);
}
toBeDone = Lambda.count(images) + Lambda.count(music);
trace("LOADING: " + toBeDone + " OBJECTS.");
for (i in images)
{
var replaced = i.replace(".png","");
FlxG.bitmap.add(Paths.image("characters/" + replaced,"shared"));
trace("cached " + replaced);
done++;
}
for (i in music)
{
FlxG.sound.cache(Paths.inst(i));
FlxG.sound.cache(Paths.voices(i));
trace("cached " + i);
done++;
}
trace("Finished caching...");
FlxG.switchState(new TitleState());
}
}

View File

@ -26,13 +26,16 @@ class Character extends FlxSprite
this.isPlayer = isPlayer; this.isPlayer = isPlayer;
var tex:FlxAtlasFrames; var tex:FlxAtlasFrames;
antialiasing = true; if(FlxG.save.data.antialiasing)
{
antialiasing = true;
}
switch (curCharacter) switch (curCharacter)
{ {
case 'gf': case 'gf':
// GIRLFRIEND CODE // GIRLFRIEND CODE
tex = Paths.getSparrowAtlas('characters/GF_assets'); tex = Paths.getSparrowAtlas('GF_assets','shared',true);
frames = tex; frames = tex;
animation.addByPrefix('cheer', 'GF Cheer', 24, false); animation.addByPrefix('cheer', 'GF Cheer', 24, false);
animation.addByPrefix('singLEFT', 'GF left note', 24, false); animation.addByPrefix('singLEFT', 'GF left note', 24, false);
@ -46,24 +49,12 @@ class Character extends FlxSprite
animation.addByIndices('hairFall', "GF Dancing Beat Hair Landing", [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], "", 24, false); animation.addByIndices('hairFall', "GF Dancing Beat Hair Landing", [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], "", 24, false);
animation.addByPrefix('scared', 'GF FEAR', 24); animation.addByPrefix('scared', 'GF FEAR', 24);
addOffset('cheer'); loadOffsetFile(curCharacter);
addOffset('sad', -2, -2);
addOffset('danceLeft', 0, -9);
addOffset('danceRight', 0, -9);
addOffset("singUP", 0, 4);
addOffset("singRIGHT", 0, -20);
addOffset("singLEFT", 0, -19);
addOffset("singDOWN", 0, -20);
addOffset('hairBlow', 45, -8);
addOffset('hairFall', 0, -9);
addOffset('scared', -2, -17);
playAnim('danceRight'); playAnim('danceRight');
case 'gf-christmas': case 'gf-christmas':
tex = Paths.getSparrowAtlas('characters/gfChristmas'); tex = Paths.getSparrowAtlas('gfChristmas','shared',true);
frames = tex; frames = tex;
animation.addByPrefix('cheer', 'GF Cheer', 24, false); animation.addByPrefix('cheer', 'GF Cheer', 24, false);
animation.addByPrefix('singLEFT', 'GF left note', 24, false); animation.addByPrefix('singLEFT', 'GF left note', 24, false);
@ -77,44 +68,30 @@ class Character extends FlxSprite
animation.addByIndices('hairFall', "GF Dancing Beat Hair Landing", [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], "", 24, false); animation.addByIndices('hairFall', "GF Dancing Beat Hair Landing", [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], "", 24, false);
animation.addByPrefix('scared', 'GF FEAR', 24); animation.addByPrefix('scared', 'GF FEAR', 24);
addOffset('cheer'); loadOffsetFile(curCharacter);
addOffset('sad', -2, -2);
addOffset('danceLeft', 0, -9);
addOffset('danceRight', 0, -9);
addOffset("singUP", 0, 4);
addOffset("singRIGHT", 0, -20);
addOffset("singLEFT", 0, -19);
addOffset("singDOWN", 0, -20);
addOffset('hairBlow', 45, -8);
addOffset('hairFall', 0, -9);
addOffset('scared', -2, -17);
playAnim('danceRight'); playAnim('danceRight');
case 'gf-car': case 'gf-car':
tex = Paths.getSparrowAtlas('characters/gfCar'); tex = Paths.getSparrowAtlas('gfCar','shared',true);
frames = tex; frames = tex;
animation.addByIndices('singUP', 'GF Dancing Beat Hair blowing CAR', [0], "", 24, false); animation.addByIndices('singUP', 'GF Dancing Beat Hair blowing CAR', [0], "", 24, false);
animation.addByIndices('danceLeft', 'GF Dancing Beat Hair blowing CAR', [30, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "", 24, false); animation.addByIndices('danceLeft', 'GF Dancing Beat Hair blowing CAR', [30, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "", 24, false);
animation.addByIndices('danceRight', 'GF Dancing Beat Hair blowing CAR', [15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29], "", 24, animation.addByIndices('danceRight', 'GF Dancing Beat Hair blowing CAR', [15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29], "", 24,
false); false);
addOffset('danceLeft', 0); loadOffsetFile(curCharacter);
addOffset('danceRight', 0);
playAnim('danceRight'); playAnim('danceRight');
case 'gf-pixel': case 'gf-pixel':
tex = Paths.getSparrowAtlas('characters/gfPixel'); tex = Paths.getSparrowAtlas('gfPixel','shared',true);
frames = tex; frames = tex;
animation.addByIndices('singUP', 'GF IDLE', [2], "", 24, false); animation.addByIndices('singUP', 'GF IDLE', [2], "", 24, false);
animation.addByIndices('danceLeft', 'GF IDLE', [30, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "", 24, false); animation.addByIndices('danceLeft', 'GF IDLE', [30, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "", 24, false);
animation.addByIndices('danceRight', 'GF IDLE', [15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29], "", 24, false); animation.addByIndices('danceRight', 'GF IDLE', [15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29], "", 24, false);
addOffset('danceLeft', 0); loadOffsetFile(curCharacter);
addOffset('danceRight', 0);
playAnim('danceRight'); playAnim('danceRight');
@ -124,7 +101,7 @@ class Character extends FlxSprite
case 'dad': case 'dad':
// DAD ANIMATION LOADING CODE // DAD ANIMATION LOADING CODE
tex = Paths.getSparrowAtlas('characters/DADDY_DEAREST', 'shared'); tex = Paths.getSparrowAtlas('DADDY_DEAREST','shared',true);
frames = tex; frames = tex;
animation.addByPrefix('idle', 'Dad idle dance', 24); animation.addByPrefix('idle', 'Dad idle dance', 24);
animation.addByPrefix('singUP', 'Dad Sing Note UP', 24); animation.addByPrefix('singUP', 'Dad Sing Note UP', 24);
@ -132,15 +109,11 @@ class Character extends FlxSprite
animation.addByPrefix('singDOWN', 'Dad Sing Note DOWN', 24); animation.addByPrefix('singDOWN', 'Dad Sing Note DOWN', 24);
animation.addByPrefix('singLEFT', 'Dad Sing Note LEFT', 24); animation.addByPrefix('singLEFT', 'Dad Sing Note LEFT', 24);
addOffset('idle'); loadOffsetFile(curCharacter);
addOffset("singUP", -6, 50);
addOffset("singRIGHT", 0, 27);
addOffset("singLEFT", -10, 10);
addOffset("singDOWN", 0, -30);
playAnim('idle'); playAnim('idle');
case 'spooky': case 'spooky':
tex = Paths.getSparrowAtlas('characters/spooky_kids_assets'); tex = Paths.getSparrowAtlas('spooky_kids_assets','shared',true);
frames = tex; frames = tex;
animation.addByPrefix('singUP', 'spooky UP NOTE', 24, false); animation.addByPrefix('singUP', 'spooky UP NOTE', 24, false);
animation.addByPrefix('singDOWN', 'spooky DOWN note', 24, false); animation.addByPrefix('singDOWN', 'spooky DOWN note', 24, false);
@ -149,17 +122,11 @@ class Character extends FlxSprite
animation.addByIndices('danceLeft', 'spooky dance idle', [0, 2, 6], "", 12, false); animation.addByIndices('danceLeft', 'spooky dance idle', [0, 2, 6], "", 12, false);
animation.addByIndices('danceRight', 'spooky dance idle', [8, 10, 12, 14], "", 12, false); animation.addByIndices('danceRight', 'spooky dance idle', [8, 10, 12, 14], "", 12, false);
addOffset('danceLeft'); loadOffsetFile(curCharacter);
addOffset('danceRight');
addOffset("singUP", -20, 26);
addOffset("singRIGHT", -130, -14);
addOffset("singLEFT", 130, -10);
addOffset("singDOWN", -50, -130);
playAnim('danceRight'); playAnim('danceRight');
case 'mom': case 'mom':
tex = Paths.getSparrowAtlas('characters/Mom_Assets'); tex = Paths.getSparrowAtlas('Mom_Assets','shared',true);
frames = tex; frames = tex;
animation.addByPrefix('idle', "Mom Idle", 24, false); animation.addByPrefix('idle', "Mom Idle", 24, false);
@ -170,16 +137,12 @@ class Character extends FlxSprite
// CUZ DAVE IS DUMB! // CUZ DAVE IS DUMB!
animation.addByPrefix('singRIGHT', 'Mom Pose Left', 24, false); animation.addByPrefix('singRIGHT', 'Mom Pose Left', 24, false);
addOffset('idle'); loadOffsetFile(curCharacter);
addOffset("singUP", 14, 71);
addOffset("singRIGHT", 10, -60);
addOffset("singLEFT", 250, -23);
addOffset("singDOWN", 20, -160);
playAnim('idle'); playAnim('idle');
case 'mom-car': case 'mom-car':
tex = Paths.getSparrowAtlas('characters/momCar'); tex = Paths.getSparrowAtlas('momCar','shared',true);
frames = tex; frames = tex;
animation.addByPrefix('idle', "Mom Idle", 24, false); animation.addByPrefix('idle', "Mom Idle", 24, false);
@ -190,15 +153,11 @@ class Character extends FlxSprite
// CUZ DAVE IS DUMB! // CUZ DAVE IS DUMB!
animation.addByPrefix('singRIGHT', 'Mom Pose Left', 24, false); animation.addByPrefix('singRIGHT', 'Mom Pose Left', 24, false);
addOffset('idle'); loadOffsetFile(curCharacter);
addOffset("singUP", 14, 71);
addOffset("singRIGHT", 10, -60);
addOffset("singLEFT", 250, -23);
addOffset("singDOWN", 20, -160);
playAnim('idle'); playAnim('idle');
case 'monster': case 'monster':
tex = Paths.getSparrowAtlas('characters/Monster_Assets'); tex = Paths.getSparrowAtlas('Monster_Assets','shared',true);
frames = tex; frames = tex;
animation.addByPrefix('idle', 'monster idle', 24, false); animation.addByPrefix('idle', 'monster idle', 24, false);
animation.addByPrefix('singUP', 'monster up note', 24, false); animation.addByPrefix('singUP', 'monster up note', 24, false);
@ -206,14 +165,10 @@ class Character extends FlxSprite
animation.addByPrefix('singLEFT', 'Monster left note', 24, false); animation.addByPrefix('singLEFT', 'Monster left note', 24, false);
animation.addByPrefix('singRIGHT', 'Monster Right note', 24, false); animation.addByPrefix('singRIGHT', 'Monster Right note', 24, false);
addOffset('idle'); loadOffsetFile(curCharacter);
addOffset("singUP", -20, 50);
addOffset("singRIGHT", -51);
addOffset("singLEFT", -30);
addOffset("singDOWN", -30, -40);
playAnim('idle'); playAnim('idle');
case 'monster-christmas': case 'monster-christmas':
tex = Paths.getSparrowAtlas('characters/monsterChristmas'); tex = Paths.getSparrowAtlas('monsterChristmas','shared',true);
frames = tex; frames = tex;
animation.addByPrefix('idle', 'monster idle', 24, false); animation.addByPrefix('idle', 'monster idle', 24, false);
animation.addByPrefix('singUP', 'monster up note', 24, false); animation.addByPrefix('singUP', 'monster up note', 24, false);
@ -221,14 +176,10 @@ class Character extends FlxSprite
animation.addByPrefix('singLEFT', 'Monster left note', 24, false); animation.addByPrefix('singLEFT', 'Monster left note', 24, false);
animation.addByPrefix('singRIGHT', 'Monster Right note', 24, false); animation.addByPrefix('singRIGHT', 'Monster Right note', 24, false);
addOffset('idle'); loadOffsetFile(curCharacter);
addOffset("singUP", -20, 50);
addOffset("singRIGHT", -51);
addOffset("singLEFT", -30);
addOffset("singDOWN", -40, -94);
playAnim('idle'); playAnim('idle');
case 'pico': case 'pico':
tex = Paths.getSparrowAtlas('characters/Pico_FNF_assetss'); tex = Paths.getSparrowAtlas('Pico_FNF_assetss','shared',true);
frames = tex; frames = tex;
animation.addByPrefix('idle', "Pico Idle Dance", 24); animation.addByPrefix('idle', "Pico Idle Dance", 24);
animation.addByPrefix('singUP', 'pico Up note0', 24, false); animation.addByPrefix('singUP', 'pico Up note0', 24, false);
@ -252,22 +203,14 @@ class Character extends FlxSprite
animation.addByPrefix('singUPmiss', 'pico Up note miss', 24); animation.addByPrefix('singUPmiss', 'pico Up note miss', 24);
animation.addByPrefix('singDOWNmiss', 'Pico Down Note MISS', 24); animation.addByPrefix('singDOWNmiss', 'Pico Down Note MISS', 24);
addOffset('idle'); loadOffsetFile(curCharacter);
addOffset("singUP", -29, 27);
addOffset("singRIGHT", -68, -7);
addOffset("singLEFT", 65, 9);
addOffset("singDOWN", 200, -70);
addOffset("singUPmiss", -19, 67);
addOffset("singRIGHTmiss", -60, 41);
addOffset("singLEFTmiss", 62, 64);
addOffset("singDOWNmiss", 210, -28);
playAnim('idle'); playAnim('idle');
flipX = true; flipX = true;
case 'bf': case 'bf':
var tex = Paths.getSparrowAtlas('characters/BOYFRIEND', 'shared'); var tex = Paths.getSparrowAtlas('BOYFRIEND','shared',true);
frames = tex; frames = tex;
trace(tex.frames.length); trace(tex.frames.length);
@ -284,32 +227,19 @@ class Character extends FlxSprite
animation.addByPrefix('hey', 'BF HEY', 24, false); animation.addByPrefix('hey', 'BF HEY', 24, false);
animation.addByPrefix('firstDeath', "BF dies", 24, false); animation.addByPrefix('firstDeath', "BF dies", 24, false);
animation.addByPrefix('deathLoop', "BF Dead Loop", 24, true); animation.addByPrefix('deathLoop', "BF Dead Loop", 24, false);
animation.addByPrefix('deathConfirm', "BF Dead confirm", 24, false); animation.addByPrefix('deathConfirm', "BF Dead confirm", 24, false);
animation.addByPrefix('scared', 'BF idle shaking', 24); animation.addByPrefix('scared', 'BF idle shaking', 24);
addOffset('idle', -5); loadOffsetFile(curCharacter);
addOffset("singUP", -29, 27);
addOffset("singRIGHT", -38, -7);
addOffset("singLEFT", 12, -6);
addOffset("singDOWN", -10, -50);
addOffset("singUPmiss", -29, 27);
addOffset("singRIGHTmiss", -30, 21);
addOffset("singLEFTmiss", 12, 24);
addOffset("singDOWNmiss", -11, -19);
addOffset("hey", 7, 4);
addOffset('firstDeath', 37, 11);
addOffset('deathLoop', 37, 5);
addOffset('deathConfirm', 37, 69);
addOffset('scared', -4);
playAnim('idle'); playAnim('idle');
flipX = true; flipX = true;
case 'bf-christmas': case 'bf-christmas':
var tex = Paths.getSparrowAtlas('characters/bfChristmas'); var tex = Paths.getSparrowAtlas('bfChristmas','shared',true);
frames = tex; frames = tex;
animation.addByPrefix('idle', 'BF idle dance', 24, false); animation.addByPrefix('idle', 'BF idle dance', 24, false);
animation.addByPrefix('singUP', 'BF NOTE UP0', 24, false); animation.addByPrefix('singUP', 'BF NOTE UP0', 24, false);
@ -322,22 +252,13 @@ class Character extends FlxSprite
animation.addByPrefix('singDOWNmiss', 'BF NOTE DOWN MISS', 24, false); animation.addByPrefix('singDOWNmiss', 'BF NOTE DOWN MISS', 24, false);
animation.addByPrefix('hey', 'BF HEY', 24, false); animation.addByPrefix('hey', 'BF HEY', 24, false);
addOffset('idle', -5); loadOffsetFile(curCharacter);
addOffset("singUP", -29, 27);
addOffset("singRIGHT", -38, -7);
addOffset("singLEFT", 12, -6);
addOffset("singDOWN", -10, -50);
addOffset("singUPmiss", -29, 27);
addOffset("singRIGHTmiss", -30, 21);
addOffset("singLEFTmiss", 12, 24);
addOffset("singDOWNmiss", -11, -19);
addOffset("hey", 7, 4);
playAnim('idle'); playAnim('idle');
flipX = true; flipX = true;
case 'bf-car': case 'bf-car':
var tex = Paths.getSparrowAtlas('characters/bfCar'); var tex = Paths.getSparrowAtlas('bfCar','shared',true);
frames = tex; frames = tex;
animation.addByPrefix('idle', 'BF idle dance', 24, false); animation.addByPrefix('idle', 'BF idle dance', 24, false);
animation.addByPrefix('singUP', 'BF NOTE UP0', 24, false); animation.addByPrefix('singUP', 'BF NOTE UP0', 24, false);
@ -349,20 +270,12 @@ class Character extends FlxSprite
animation.addByPrefix('singRIGHTmiss', 'BF NOTE RIGHT MISS', 24, false); animation.addByPrefix('singRIGHTmiss', 'BF NOTE RIGHT MISS', 24, false);
animation.addByPrefix('singDOWNmiss', 'BF NOTE DOWN MISS', 24, false); animation.addByPrefix('singDOWNmiss', 'BF NOTE DOWN MISS', 24, false);
addOffset('idle', -5); loadOffsetFile(curCharacter);
addOffset("singUP", -29, 27);
addOffset("singRIGHT", -38, -7);
addOffset("singLEFT", 12, -6);
addOffset("singDOWN", -10, -50);
addOffset("singUPmiss", -29, 27);
addOffset("singRIGHTmiss", -30, 21);
addOffset("singLEFTmiss", 12, 24);
addOffset("singDOWNmiss", -11, -19);
playAnim('idle'); playAnim('idle');
flipX = true; flipX = true;
case 'bf-pixel': case 'bf-pixel':
frames = Paths.getSparrowAtlas('characters/bfPixel'); frames = Paths.getSparrowAtlas('bfPixel','shared',true);
animation.addByPrefix('idle', 'BF IDLE', 24, false); animation.addByPrefix('idle', 'BF IDLE', 24, false);
animation.addByPrefix('singUP', 'BF UP NOTE', 24, false); animation.addByPrefix('singUP', 'BF UP NOTE', 24, false);
animation.addByPrefix('singLEFT', 'BF LEFT NOTE', 24, false); animation.addByPrefix('singLEFT', 'BF LEFT NOTE', 24, false);
@ -373,15 +286,7 @@ class Character extends FlxSprite
animation.addByPrefix('singRIGHTmiss', 'BF RIGHT MISS', 24, false); animation.addByPrefix('singRIGHTmiss', 'BF RIGHT MISS', 24, false);
animation.addByPrefix('singDOWNmiss', 'BF DOWN MISS', 24, false); animation.addByPrefix('singDOWNmiss', 'BF DOWN MISS', 24, false);
addOffset('idle'); loadOffsetFile(curCharacter);
addOffset("singUP");
addOffset("singRIGHT");
addOffset("singLEFT");
addOffset("singDOWN");
addOffset("singUPmiss");
addOffset("singRIGHTmiss");
addOffset("singLEFTmiss");
addOffset("singDOWNmiss");
setGraphicSize(Std.int(width * 6)); setGraphicSize(Std.int(width * 6));
updateHitbox(); updateHitbox();
@ -395,16 +300,14 @@ class Character extends FlxSprite
flipX = true; flipX = true;
case 'bf-pixel-dead': case 'bf-pixel-dead':
frames = Paths.getSparrowAtlas('characters/bfPixelsDEAD'); frames = Paths.getSparrowAtlas('bfPixelsDEAD','shared',true);
animation.addByPrefix('singUP', "BF Dies pixel", 24, false); animation.addByPrefix('singUP', "BF Dies pixel", 24, false);
animation.addByPrefix('firstDeath', "BF Dies pixel", 24, false); animation.addByPrefix('firstDeath', "BF Dies pixel", 24, false);
animation.addByPrefix('deathLoop', "Retry Loop", 24, true); animation.addByPrefix('deathLoop', "Retry Loop", 24, false);
animation.addByPrefix('deathConfirm', "RETRY CONFIRM", 24, false); animation.addByPrefix('deathConfirm', "RETRY CONFIRM", 24, false);
animation.play('firstDeath'); animation.play('firstDeath');
addOffset('firstDeath'); loadOffsetFile(curCharacter);
addOffset('deathLoop', -37);
addOffset('deathConfirm', -37);
playAnim('firstDeath'); playAnim('firstDeath');
// pixel bullshit // pixel bullshit
setGraphicSize(Std.int(width * 6)); setGraphicSize(Std.int(width * 6));
@ -413,18 +316,14 @@ class Character extends FlxSprite
flipX = true; flipX = true;
case 'senpai': case 'senpai':
frames = Paths.getSparrowAtlas('characters/senpai'); frames = Paths.getSparrowAtlas('senpai','shared',true);
animation.addByPrefix('idle', 'Senpai Idle', 24, false); animation.addByPrefix('idle', 'Senpai Idle', 24, false);
animation.addByPrefix('singUP', 'SENPAI UP NOTE', 24, false); animation.addByPrefix('singUP', 'SENPAI UP NOTE', 24, false);
animation.addByPrefix('singLEFT', 'SENPAI LEFT NOTE', 24, false); animation.addByPrefix('singLEFT', 'SENPAI LEFT NOTE', 24, false);
animation.addByPrefix('singRIGHT', 'SENPAI RIGHT NOTE', 24, false); animation.addByPrefix('singRIGHT', 'SENPAI RIGHT NOTE', 24, false);
animation.addByPrefix('singDOWN', 'SENPAI DOWN NOTE', 24, false); animation.addByPrefix('singDOWN', 'SENPAI DOWN NOTE', 24, false);
addOffset('idle'); loadOffsetFile(curCharacter);
addOffset("singUP", 5, 37);
addOffset("singRIGHT");
addOffset("singLEFT", 40);
addOffset("singDOWN", 14);
playAnim('idle'); playAnim('idle');
@ -433,18 +332,14 @@ class Character extends FlxSprite
antialiasing = false; antialiasing = false;
case 'senpai-angry': case 'senpai-angry':
frames = Paths.getSparrowAtlas('characters/senpai'); frames = Paths.getSparrowAtlas('senpai','shared',true);
animation.addByPrefix('idle', 'Angry Senpai Idle', 24, false); animation.addByPrefix('idle', 'Angry Senpai Idle', 24, false);
animation.addByPrefix('singUP', 'Angry Senpai UP NOTE', 24, false); animation.addByPrefix('singUP', 'Angry Senpai UP NOTE', 24, false);
animation.addByPrefix('singLEFT', 'Angry Senpai LEFT NOTE', 24, false); animation.addByPrefix('singLEFT', 'Angry Senpai LEFT NOTE', 24, false);
animation.addByPrefix('singRIGHT', 'Angry Senpai RIGHT NOTE', 24, false); animation.addByPrefix('singRIGHT', 'Angry Senpai RIGHT NOTE', 24, false);
animation.addByPrefix('singDOWN', 'Angry Senpai DOWN NOTE', 24, false); animation.addByPrefix('singDOWN', 'Angry Senpai DOWN NOTE', 24, false);
addOffset('idle'); loadOffsetFile(curCharacter);
addOffset("singUP", 5, 37);
addOffset("singRIGHT");
addOffset("singLEFT", 40);
addOffset("singDOWN", 14);
playAnim('idle'); playAnim('idle');
setGraphicSize(Std.int(width * 6)); setGraphicSize(Std.int(width * 6));
@ -453,18 +348,14 @@ class Character extends FlxSprite
antialiasing = false; antialiasing = false;
case 'spirit': case 'spirit':
frames = Paths.getPackerAtlas('characters/spirit'); frames = Paths.getPackerAtlas('spirit','shared',true);
animation.addByPrefix('idle', "idle spirit_", 24, false); animation.addByPrefix('idle', "idle spirit_", 24, false);
animation.addByPrefix('singUP', "up_", 24, false); animation.addByPrefix('singUP', "up_", 24, false);
animation.addByPrefix('singRIGHT', "right_", 24, false); animation.addByPrefix('singRIGHT', "right_", 24, false);
animation.addByPrefix('singLEFT', "left_", 24, false); animation.addByPrefix('singLEFT', "left_", 24, false);
animation.addByPrefix('singDOWN', "spirit down_", 24, false); animation.addByPrefix('singDOWN', "spirit down_", 24, false);
addOffset('idle', -220, -280); loadOffsetFile(curCharacter);
addOffset('singUP', -220, -240);
addOffset("singRIGHT", -220, -280);
addOffset("singLEFT", -200, -280);
addOffset("singDOWN", 170, 110);
setGraphicSize(Std.int(width * 6)); setGraphicSize(Std.int(width * 6));
updateHitbox(); updateHitbox();
@ -474,7 +365,7 @@ class Character extends FlxSprite
antialiasing = false; antialiasing = false;
case 'parents-christmas': case 'parents-christmas':
frames = Paths.getSparrowAtlas('characters/mom_dad_christmas_assets'); frames = Paths.getSparrowAtlas('mom_dad_christmas_assets','shared',true);
animation.addByPrefix('idle', 'Parent Christmas Idle', 24, false); animation.addByPrefix('idle', 'Parent Christmas Idle', 24, false);
animation.addByPrefix('singUP', 'Parent Up Note Dad', 24, false); animation.addByPrefix('singUP', 'Parent Up Note Dad', 24, false);
animation.addByPrefix('singDOWN', 'Parent Down Note Dad', 24, false); animation.addByPrefix('singDOWN', 'Parent Down Note Dad', 24, false);
@ -487,15 +378,7 @@ class Character extends FlxSprite
animation.addByPrefix('singLEFT-alt', 'Parent Left Note Mom', 24, false); animation.addByPrefix('singLEFT-alt', 'Parent Left Note Mom', 24, false);
animation.addByPrefix('singRIGHT-alt', 'Parent Right Note Mom', 24, false); animation.addByPrefix('singRIGHT-alt', 'Parent Right Note Mom', 24, false);
addOffset('idle'); loadOffsetFile(curCharacter);
addOffset("singUP", -47, 24);
addOffset("singRIGHT", -1, -23);
addOffset("singLEFT", -30, 16);
addOffset("singDOWN", -31, -29);
addOffset("singUP-alt", -47, 24);
addOffset("singRIGHT-alt", -1, -24);
addOffset("singLEFT-alt", -30, 15);
addOffset("singDOWN-alt", -30, -27);
playAnim('idle'); playAnim('idle');
} }
@ -525,6 +408,17 @@ class Character extends FlxSprite
} }
} }
public function loadOffsetFile(character:String)
{
var offset:Array<String> = CoolUtil.coolTextFile(Paths.txt('images/characters/' + character + "Offsets", 'shared'));
for (i in 0...offset.length)
{
var data:Array<String> = offset[i].split(' ');
addOffset(data[0], Std.parseInt(data[1]), Std.parseInt(data[2]));
}
}
override function update(elapsed:Float) override function update(elapsed:Float)
{ {
if (!curCharacter.startsWith('bf')) if (!curCharacter.startsWith('bf'))
@ -561,13 +455,13 @@ class Character extends FlxSprite
/** /**
* FOR GF DANCING SHIT * FOR GF DANCING SHIT
*/ */
public function dance() public function dance(forced:Bool = false)
{ {
if (!debugMode) if (!debugMode)
{ {
switch (curCharacter) switch (curCharacter)
{ {
case 'gf': case 'gf' | 'gf-christmas' | 'gf-car' | 'gf-pixel':
if (!animation.curAnim.name.startsWith('hair')) if (!animation.curAnim.name.startsWith('hair'))
{ {
danced = !danced; danced = !danced;
@ -577,39 +471,6 @@ class Character extends FlxSprite
else else
playAnim('danceLeft'); playAnim('danceLeft');
} }
case 'gf-christmas':
if (!animation.curAnim.name.startsWith('hair'))
{
danced = !danced;
if (danced)
playAnim('danceRight');
else
playAnim('danceLeft');
}
case 'gf-car':
if (!animation.curAnim.name.startsWith('hair'))
{
danced = !danced;
if (danced)
playAnim('danceRight');
else
playAnim('danceLeft');
}
case 'gf-pixel':
if (!animation.curAnim.name.startsWith('hair'))
{
danced = !danced;
if (danced)
playAnim('danceRight');
else
playAnim('danceLeft');
}
case 'spooky': case 'spooky':
danced = !danced; danced = !danced;
@ -618,7 +479,7 @@ class Character extends FlxSprite
else else
playAnim('danceLeft'); playAnim('danceLeft');
default: default:
playAnim('idle'); playAnim('idle', forced);
} }
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -68,7 +68,23 @@ class Conductor
trace("new BPM map BUDDY " + bpmChangeMap); trace("new BPM map BUDDY " + bpmChangeMap);
} }
public static function changeBPM(newBpm:Float) public static function recalculateTimingStruct(SONG:Song)
{
for(i in SONG.eventObjects)
{
/*TimingStruct.addTiming(beat,bpm,endBeat, Std.parseFloat(OFFSET));
if (changeEvents.length != 0)
{
var data = TimingStruct.AllTimings[currentIndex - 1];
data.endBeat = beat;
data.length = (data.endBeat - data.startBeat) / (data.bpm / 60);
TimingStruct.AllTimings[currentIndex].startTime = data.startTime + data.length;
}*/
}
}
public static function changeBPM(newBpm:Float, ?recalcLength = true)
{ {
bpm = newBpm; bpm = newBpm;

View File

@ -594,7 +594,7 @@ class Controls extends FlxActionSet
inline bindKeys(Control.RIGHT, [FlxKey.fromString(FlxG.save.data.rightBind), FlxKey.RIGHT]); inline bindKeys(Control.RIGHT, [FlxKey.fromString(FlxG.save.data.rightBind), FlxKey.RIGHT]);
inline bindKeys(Control.ACCEPT, [Z, SPACE, ENTER]); inline bindKeys(Control.ACCEPT, [Z, SPACE, ENTER]);
inline bindKeys(Control.BACK, [BACKSPACE, ESCAPE]); inline bindKeys(Control.BACK, [BACKSPACE, ESCAPE]);
inline bindKeys(Control.PAUSE, [P, ENTER, ESCAPE]); inline bindKeys(Control.PAUSE, [ENTER, ESCAPE]);
inline bindKeys(Control.RESET, [FlxKey.fromString(FlxG.save.data.killBind)]); inline bindKeys(Control.RESET, [FlxKey.fromString(FlxG.save.data.killBind)]);
} }

View File

@ -155,7 +155,7 @@ class DialogueBox extends FlxSpriteGroup
portraitLeft.visible = false; portraitLeft.visible = false;
if (PlayState.SONG.song.toLowerCase() == 'thorns') if (PlayState.SONG.song.toLowerCase() == 'thorns')
{ {
portraitLeft.color = FlxColor.BLACK; portraitLeft.visible = false;
swagDialogue.color = FlxColor.WHITE; swagDialogue.color = FlxColor.WHITE;
dropText.color = FlxColor.BLACK; dropText.color = FlxColor.BLACK;
} }

372
source/DiffCalc.hx Normal file
View File

@ -0,0 +1,372 @@
import openfl.system.System;
import flixel.math.FlxMath;
import Song.SwagSong;
class SmallNote // basically Note.hx but small as fuck
{
public var strumTime:Float;
public var noteData:Int;
public function new(strum,data)
{
strumTime = strum;
noteData = data;
}
}
class DiffCalc
{
public static var scale = 3 * 1.8;
public static var lastDiffHandOne:Array<Float> = [];
public static var lastDiffHandTwo:Array<Float> = [];
public static function CalculateDiff(song:SwagSong, ?accuracy:Float = .93)
{
trace('calcuilafjwaf');
// cleaned notes
var cleanedNotes:Array<SmallNote> = [];
if (song.notes == null)
return 0.0;
if (song.notes.length == 0)
return 0.0;
// find all of the notes
for(i in song.notes) // sections
{
for (ii in i.sectionNotes) // notes
{
if (ii[1] > 3 && !i.mustHitSection)
cleanedNotes.push(new SmallNote(ii[0],Math.floor(Math.abs(ii[1]))));
else if (ii[1] < 4 && i.mustHitSection)
cleanedNotes.push(new SmallNote(ii[0],Math.floor(Math.abs(ii[1]))));
}
}
trace(cleanedNotes.length + " - playable notes");
var handOne:Array<SmallNote> = [];
var handTwo:Array<SmallNote> = [];
cleanedNotes.sort((a, b) -> Std.int(a.strumTime - b.strumTime));
var firstNoteTime = cleanedNotes[0].strumTime;
// normalize the notes
for(i in cleanedNotes)
{
i.strumTime = (i.strumTime - firstNoteTime) * 2;
}
for (i in cleanedNotes)
{
switch(i.noteData)
{
case 0:
handOne.push(i);
case 1:
handOne.push(i);
case 2:
handTwo.push(i);
case 3:
handTwo.push(i);
}
}
// collect all of the notes in each col
var leftHandCol:Array<Float> = []; // d 0
var leftMHandCol:Array<Float> = []; // f 1
var rightMHandCol:Array<Float> = []; // j 2
var rightHandCol:Array<Float> = []; // k 3
for(i in 0...handOne.length - 1)
{
if (handOne[i].noteData == 0)
leftHandCol.push(handOne[i].strumTime);
else
leftMHandCol.push(handOne[i].strumTime);
}
for(i in 0...handTwo.length - 1)
{
if (handTwo[i].noteData == 3)
rightHandCol.push(handTwo[i].strumTime);
else
rightMHandCol.push(handTwo[i].strumTime);
}
// length in segments of the song
var length = ((cleanedNotes[cleanedNotes.length - 1].strumTime / 1000) / 0.5);
// hackey way of creating a array with a length
var segmentsOne = new haxe.ds.Vector(Math.floor(length));
var segmentsTwo = new haxe.ds.Vector(Math.floor(length));
// set em all to array's (so no null's)
for(i in 0...segmentsOne.length)
segmentsOne[i] = new Array<SmallNote>();
for(i in 0...segmentsTwo.length)
segmentsTwo[i] = new Array<SmallNote>();
// algo loop
for(i in handOne)
{
var index = Std.int((((i.strumTime * 2) / 1000)));
if (index + 1 > length)
continue;
segmentsOne[index].push(i);
}
for(i in handTwo)
{
var index = Std.int((((i.strumTime * 2) / 1000)));
if (index + 1 > length)
continue;
segmentsTwo[index].push(i);
}
// Remove 0 intervals
/*for(i in 0...segmentsOne.length)
{
if (segmentsOne[i].length == 0)
segmentsOne[i] = null;
}
for(i in 0...segmentsTwo.length)
{
if (segmentsTwo[i].length == 0)
segmentsTwo[i] = null;
}*/
// get nps for both hands
var hand_npsOne:Array<Float> = new Array<Float>();
var hand_npsTwo:Array<Float> = new Array<Float>();
for(i in segmentsOne)
{
if (i == null)
continue;
hand_npsOne.push(i.length * scale * 1.6);
}
for(i in segmentsTwo)
{
if (i == null)
continue;
hand_npsTwo.push(i.length * scale * 1.6);
}
// get the diff vector's for all of the hands
var hand_diffOne:Array<Float> = new Array<Float>();
var hand_diffTwo:Array<Float> = new Array<Float>();
for(i in 0...segmentsOne.length)
{
var ve = segmentsOne[i];
if (ve == null)
continue;
var fuckYouOne:Array<SmallNote> = [];
var fuckYouTwo:Array<SmallNote> = [];
for(note in ve)
{
switch(note.noteData)
{
case 0: // fingie 1
fuckYouOne.push(note);
case 1: // fingie 2
fuckYouTwo.push(note);
}
}
var one = fingieCalc(fuckYouOne,leftHandCol);
var two = fingieCalc(fuckYouTwo,leftMHandCol);
var bigFuck = ((((one > two ? one : two) * 8) + (hand_npsOne[i] / scale) * 5) / 13) * scale;
//trace(bigFuck + " - hand one [" + i + "]");
hand_diffOne.push(bigFuck);
}
for(i in 0...segmentsTwo.length)
{
var ve = segmentsTwo[i];
if (ve == null)
continue;
var fuckYouOne:Array<SmallNote> = [];
var fuckYouTwo:Array<SmallNote> = [];
for(note in ve)
{
switch(note.noteData)
{
case 2: // fingie 1
fuckYouOne.push(note);
case 3: // fingie 2
fuckYouTwo.push(note);
}
}
var one = fingieCalc(fuckYouOne,rightMHandCol);
var two = fingieCalc(fuckYouTwo,rightHandCol);
var bigFuck = ((((one > two ? one : two) * 8) + (hand_npsTwo[i] / scale) * 5) / 13) * scale;
hand_diffTwo.push(bigFuck);
// trace(bigFuck + " - hand two [" + i + "]");
}
for (i in 0...4)
{
smoothBrain(hand_npsOne,0);
smoothBrain(hand_npsTwo,0);
smoothBrainTwo(hand_diffOne);
smoothBrainTwo(hand_diffTwo);
}
//trace(hand_diffOne);
//trace(hand_diffTwo);
//trace(hand_npsOne);
//trace(hand_npsTwo);
var point_npsOne:Array<Float> = new Array<Float>();
var point_npsTwo:Array<Float> = new Array<Float>();
for(i in segmentsOne)
{
if (i == null)
continue;
point_npsOne.push(i.length);
}
for(i in segmentsTwo)
{
if (i == null)
continue;
point_npsTwo.push(i.length);
}
var maxPoints:Float = 0;
for(i in point_npsOne)
maxPoints += i;
for(i in point_npsTwo)
maxPoints += i;
if (accuracy > .965)
accuracy = .965;
lastDiffHandOne = hand_diffOne;
lastDiffHandTwo = hand_diffTwo;
return HelperFunctions.truncateFloat(chisel(accuracy,hand_diffOne,hand_diffTwo,point_npsOne,point_npsTwo,maxPoints),2);
}
public static function chisel(scoreGoal:Float,diffOne:Array<Float>,diffTwo:Array<Float>,pointsOne:Array<Float>,pointsTwo:Array<Float>,maxPoints:Float)
{
var lowerBound:Float = 0;
var upperBound:Float = 100;
while(upperBound - lowerBound > 0.01)
{
var average:Float = (upperBound + lowerBound) / 2;
var amtOfPoints:Float = calcuate(average,diffOne,pointsOne) + calcuate(average,diffTwo,pointsTwo);
if (amtOfPoints / maxPoints < scoreGoal)
lowerBound = average;
else
upperBound = average;
}
return upperBound;
}
public static function calcuate(midPoint:Float,diff:Array<Float>,points:Array<Float>)
{
var output:Float = 0;
for (i in 0...diff.length)
{
var res = diff[i];
if (midPoint > res)
output += points[i];
else
output += points[i] * Math.pow(midPoint / res,1.2);
}
return output;
}
public static function findStupid(strumTime:Float, array:Array<Float>)
{
for(i in 0...array.length)
if (array[i] == strumTime)
return i;
return -1;
}
public static function fingieCalc(floats:Array<SmallNote>, columArray:Array<Float>):Float
{
var sum:Float = 0;
if (floats.length == 0)
return 0;
var startIndex = findStupid(floats[0].strumTime,columArray);
if (startIndex == -1)
return 0;
for(i in floats)
{
sum += columArray[startIndex + 1] - columArray[startIndex];
startIndex++;
}
if (sum == 0)
return 0;
return (1375 * (floats.length)) / sum;
}
// based arrayer
// basicily smmoth the shit
public static function smoothBrain(npsVector:Array<Float>, weirdchamp:Float)
{
var floatOne = weirdchamp;
var floatTwo = weirdchamp;
for (i in 0...npsVector.length)
{
var result = npsVector[i];
var chunker = floatOne;
floatOne = floatTwo;
floatTwo = result;
npsVector[i] = (chunker + floatOne + floatTwo) / 3;
}
}
// Smooth the shit but less
public static function smoothBrainTwo(diffVector:Array<Float>)
{
var floatZero:Float = 0;
for(i in 0...diffVector.length)
{
var result = diffVector[i];
var fuck = floatZero;
floatZero = result;
diffVector[i] = (fuck + floatZero) / 2;
}
}
}

506
source/DiffOverview.hx Normal file
View File

@ -0,0 +1,506 @@
package;
import Conductor.BPMChangeEvent;
import flixel.FlxCamera;
import flixel.math.FlxRect;
import Song.SwagSong;
import Section.SwagSection;
import flixel.system.FlxSound;
import flixel.input.gamepad.FlxGamepad;
import flixel.util.FlxAxes;
import flixel.FlxSubState;
import Options.Option;
import flixel.input.FlxInput;
import flixel.input.keyboard.FlxKey;
import flixel.FlxG;
import flixel.FlxObject;
import flixel.FlxSprite;
import flixel.effects.FlxFlicker;
import flixel.graphics.frames.FlxAtlasFrames;
import flixel.group.FlxGroup.FlxTypedGroup;
import flixel.text.FlxText;
import flixel.util.FlxSort;
import flixel.tweens.FlxEase;
import flixel.tweens.FlxTween;
import flixel.util.FlxColor;
import io.newgrounds.NG;
import lime.app.Application;
import lime.utils.Assets;
import flixel.math.FlxMath;
import flixel.text.FlxText;
import flixel.input.FlxKeyManager;
using StringTools;
class DiffOverview extends FlxSubState
{
var blackBox:FlxSprite;
var handOne:Array<Float>;
var handTwo:Array<Float>;
var giantText:FlxText;
var SONG:SwagSong;
var strumLine:FlxSprite;
var camHUD:FlxCamera;
var offset:FlxText;
public static var playerStrums:FlxTypedGroup<FlxSprite> = null;
override function create()
{
Conductor.songPosition = 0;
Conductor.lastSongPos = 0;
camHUD = new FlxCamera();
camHUD.bgColor.alpha = 0;
var camGame = new FlxCamera();
FlxG.cameras.add(camGame);
FlxG.cameras.add(camHUD);
FlxCamera.defaultCameras = [camGame];
playerStrums = new FlxTypedGroup<FlxSprite>();
SONG = FreeplayState.songData.get(FreeplayState.songs[FreeplayState.curSelected].songName)[FreeplayState.curDifficulty];
strumLine = new FlxSprite(0, (FlxG.height / 2) - 295).makeGraphic(FlxG.width, 10);
strumLine.scrollFactor.set();
blackBox = new FlxSprite(0, 0).makeGraphic(FlxG.width, FlxG.height, FlxColor.BLACK);
blackBox.alpha = 0;
add(blackBox);
FreeplayState.openedPreview = true;
handOne = DiffCalc.lastDiffHandOne;
handTwo = DiffCalc.lastDiffHandTwo;
for (i in 0...4)
{
// FlxG.log.add(i);
var babyArrow:FlxSprite = new FlxSprite(0, strumLine.y);
babyArrow.frames = Paths.getSparrowAtlas('NOTE_assets','shared');
babyArrow.animation.addByPrefix('green', 'arrowUP');
babyArrow.animation.addByPrefix('blue', 'arrowDOWN');
babyArrow.animation.addByPrefix('purple', 'arrowLEFT');
babyArrow.animation.addByPrefix('red', 'arrowRIGHT');
if(FlxG.save.data.antialiasing)
{
babyArrow.antialiasing = true;
}
babyArrow.setGraphicSize(Std.int(babyArrow.width * 0.7));
switch (Math.abs(i))
{
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);
case 1:
babyArrow.x += Note.swagWidth * 1;
babyArrow.animation.addByPrefix('static', 'arrowDOWN');
babyArrow.animation.addByPrefix('pressed', 'down press', 24, false);
babyArrow.animation.addByPrefix('confirm', 'down confirm', 24, false);
case 0:
babyArrow.x += Note.swagWidth * 0;
babyArrow.animation.addByPrefix('static', 'arrowLEFT');
babyArrow.animation.addByPrefix('pressed', 'left press', 24, false);
babyArrow.animation.addByPrefix('confirm', 'left confirm', 24, false);
}
babyArrow.updateHitbox();
babyArrow.scrollFactor.set();
babyArrow.y -= 10;
babyArrow.alpha = 1;
babyArrow.ID = i;
playerStrums.add(babyArrow);
babyArrow.animation.play('static');
babyArrow.x += 50;
babyArrow.x += ((FlxG.width / 2));
}
add(playerStrums);
generateSong("assItch");
playerStrums.cameras = [camHUD];
notes.cameras = [camHUD];
blackBox.cameras = [camHUD];
blackBox.x = playerStrums.members[0].x;
blackBox.y = strumLine.y;
camHUD.zoom = 0.6;
camHUD.alpha = 0;
camHUD.height = 5000;
blackBox.height = camHUD.height;
camHUD.x += 280;
blackBox.y -= 100;
blackBox.x -= 100;
offset = new FlxText(10,FlxG.height - 40,0,"Offset: " + HelperFunctions.truncateFloat(FlxG.save.data.offset,0) + " (LEFT/RIGHT to decrease/increase)",16);
offset.setBorderStyle(FlxTextBorderStyle.OUTLINE,FlxColor.BLACK,4,1);
offset.color = FlxColor.WHITE;
offset.scrollFactor.set();
//add(offset);
FlxTween.tween(blackBox, {alpha: 0.5}, 1, {ease: FlxEase.expoInOut});
FlxTween.tween(camHUD, {alpha: 1}, 0.5, {ease: FlxEase.expoInOut});
FlxTween.tween(offset, {alpha: 1}, 0.5, {ease: FlxEase.expoInOut});
trace('pog');
super.create();
}
function endSong()
{
if (stopDoingShit)
return;
}
function resyncVocals():Void
{
vocals.pause();
FlxG.sound.music.play();
Conductor.songPosition = FlxG.sound.music.time;
vocals.time = Conductor.songPosition;
vocals.play();
}
public var stopDoingShit = false;
public var currentStep = 0;
public var oldStep = 0;
private function updateCurStep():Void
{
var lastChange:BPMChangeEvent = {
stepTime: 0,
songTime: 0,
bpm: 0
}
for (i in 0...Conductor.bpmChangeMap.length)
{
if (Conductor.songPosition >= Conductor.bpmChangeMap[i].songTime)
lastChange = Conductor.bpmChangeMap[i];
}
currentStep = lastChange.stepTime + Math.floor((Conductor.songPosition - lastChange.songTime) / Conductor.stepCrochet);
}
function stepHit()
{
if (FlxG.sound.music.time > Conductor.songPosition + 20 || FlxG.sound.music.time < Conductor.songPosition - 20)
{
trace("resync");
resyncVocals();
}
oldStep = currentStep;
}
function offsetChange()
{
for (i in unspawnNotes)
i.strumTime = i.baseStrum + FlxG.save.data.offset;
for (i in notes)
i.strumTime = i.baseStrum + FlxG.save.data.offset;
}
var frames = 0;
override function update(elapsed:Float)
{
super.update(elapsed);
// input
if (frames < 10)
{
frames++;
return;
}
if (stopDoingShit)
return;
updateCurStep();
if (oldStep != currentStep && currentStep > 0)
stepHit();
if (FlxG.keys.pressed.SPACE)
{
stopDoingShit = true;
quit();
}
var gamepad:FlxGamepad = FlxG.gamepads.lastActive;
if (gamepad != null)
if (gamepad.justPressed.X)
{
stopDoingShit = true;
quit();
}
/*if (FlxG.keys.pressed.RIGHT)
{
if (FlxG.keys.pressed.SHIFT)
{
FlxG.save.data.offset++;
offsetChange();
}
}
if (FlxG.keys.pressed.LEFT)
{
if (FlxG.keys.pressed.SHIFT)
{
FlxG.save.data.offset--;
offsetChange();
}
}
if (FlxG.keys.justPressed.RIGHT)
{
FlxG.save.data.offset++;
offsetChange();
}
if (FlxG.keys.justPressed.LEFT)
{
FlxG.save.data.offset--;
offsetChange();
}
offset.text = "Offset: " + HelperFunctions.truncateFloat(FlxG.save.data.offset,0) + " (LEFT/RIGHT to decrease/increase, SHIFT to go faster) - Time: " + HelperFunctions.truncateFloat(Conductor.songPosition / 1000,0) + "s - Step: " + currentStep;
*/
if (vocals != null)
if (vocals.playing)
Conductor.songPosition += FlxG.elapsed * 1000;
if (unspawnNotes[0] != null)
{
if (unspawnNotes[0].strumTime - Conductor.songPosition < 3500)
{
var dunceNote:Note = unspawnNotes[0];
notes.add(dunceNote);
var index:Int = unspawnNotes.indexOf(dunceNote);
unspawnNotes.splice(index, 1);
}
}
notes.forEachAlive(function(daNote:Note)
{
// instead of doing stupid y > FlxG.height
// we be men and actually calculate the time :)
if (daNote.tooLate)
{
daNote.active = false;
daNote.visible = false;
}
else
{
daNote.visible = true;
daNote.active = true;
}
daNote.y = (playerStrums.members[Math.floor(Math.abs(daNote.noteData))].y
- 0.45 * (Conductor.songPosition - daNote.strumTime) * FlxMath.roundDecimal(SONG.speed,
2));
if (daNote.isSustainNote)
{
daNote.y -= daNote.height / 2;
if ((!daNote.mustPress || daNote.wasGoodHit || daNote.prevNote.wasGoodHit && !daNote.canBeHit)
&& daNote.y + daNote.offset.y * daNote.scale.y <= (strumLine.y + Note.swagWidth / 2))
{
// Clip to strumline
var swagRect = new FlxRect(0, 0, daNote.width / daNote.scale.x, daNote.height / daNote.scale.y);
swagRect.y = (playerStrums.members[Math.floor(Math.abs(daNote.noteData))].y + Note.swagWidth / 2 - daNote.y) / daNote.scale.y;
swagRect.height -= swagRect.y;
daNote.clipRect = swagRect;
}
}
daNote.visible = playerStrums.members[Math.floor(Math.abs(daNote.noteData))].visible;
daNote.x = playerStrums.members[Math.floor(Math.abs(daNote.noteData))].x;
if (!daNote.isSustainNote)
daNote.angle = playerStrums.members[Math.floor(Math.abs(daNote.noteData))].angle;
daNote.alpha = playerStrums.members[Math.floor(Math.abs(daNote.noteData))].alpha;
// auto hit
if(daNote.y < strumLine.y)
{
// Force good note hit regardless if it's too late to hit it or not as a fail safe
if(daNote.canBeHit && daNote.mustPress || daNote.tooLate && daNote.mustPress)
{
daNote.wasGoodHit = true;
vocals.volume = 1;
daNote.kill();
notes.remove(daNote, true);
daNote.destroy();
}
}
});
}
function quit()
{
FlxTween.tween(blackBox, {alpha: 0}, 1, {ease: FlxEase.expoInOut});
FlxTween.tween(camHUD, {alpha: 0}, 1, {ease: FlxEase.expoInOut});
FlxTween.tween(offset, {alpha: 0}, 1, {ease: FlxEase.expoInOut});
vocals.fadeOut();
FreeplayState.openedPreview = false;
}
var vocals:FlxSound;
var notes:FlxTypedGroup<Note>;
var unspawnNotes:Array<Note> = [];
public function generateSong(dataPath:String):Void
{
// FlxG.log.add(ChartParser.parse());
var songData = FreeplayState.songData.get(FreeplayState.songs[FreeplayState.curSelected].songName)[FreeplayState.curDifficulty];
Conductor.changeBPM(songData.bpm);
if (SONG.needsVoices)
vocals = new FlxSound().loadEmbedded(Paths.voices(SONG.song));
else
vocals = new FlxSound();
trace('loaded vocals');
FlxG.sound.list.add(vocals);
notes = new FlxTypedGroup<Note>();
add(notes);
var noteData:Array<SwagSection>;
// 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)
{
var coolSection:Int = Std.int(section.lengthInSteps / 4);
for (songNotes in section.sectionNotes)
{
var daStrumTime:Float = songNotes[0] + FlxG.save.data.offset;
if (daStrumTime < 0)
daStrumTime = 0;
var daNoteData:Int = Std.int(songNotes[1] % 4);
var gottaHitNote:Bool = section.mustHitSection;
if (songNotes[1] > 3)
{
gottaHitNote = !section.mustHitSection;
}
var oldNote:Note;
if (unspawnNotes.length > 0)
oldNote = unspawnNotes[Std.int(unspawnNotes.length - 1)];
else
oldNote = null;
var swagNote:Note = new Note(daStrumTime, daNoteData, oldNote,false, true);
if (!gottaHitNote)
continue;
swagNote.baseStrum = Math.round(songNotes[0]);
swagNote.sustainLength = songNotes[2];
swagNote.scrollFactor.set(0, 0);
var susLength:Float = swagNote.sustainLength;
susLength = susLength / Conductor.stepCrochet;
unspawnNotes.push(swagNote);
for (susNote in 0...Math.floor(susLength))
{
oldNote = unspawnNotes[Std.int(unspawnNotes.length - 1)];
var sustainNote:Note = new Note(daStrumTime + (Conductor.stepCrochet * susNote) + Conductor.stepCrochet, daNoteData, oldNote, true, true);
sustainNote.scrollFactor.set();
unspawnNotes.push(sustainNote);
sustainNote.mustPress = gottaHitNote;
if (sustainNote.mustPress)
{
sustainNote.x += FlxG.width / 2; // general offset
}
}
swagNote.mustPress = gottaHitNote;
if (swagNote.mustPress)
{
swagNote.x += FlxG.width / 2; // general offset
}
else
{
}
}
daBeats += 1;
}
// trace(unspawnNotes.length);
// playerCounter += 1;
unspawnNotes.sort(sortByShit);
Conductor.mapBPMChanges(SONG);
Conductor.changeBPM(SONG.bpm);
FlxG.sound.playMusic(Paths.inst(SONG.song), 1, false);
FlxG.sound.music.onComplete = endSong;
vocals.play();
}
function sortByShit(Obj1:Note, Obj2:Note):Int
{
return FlxSort.byValues(FlxSort.ASCENDING, Obj1.strumTime, Obj2.strumTime);
}
}

View File

@ -1,5 +1,13 @@
package; package;
import openfl.utils.Future;
import openfl.media.Sound;
import flixel.system.FlxSound;
#if sys
import smTools.SMFile;
import sys.FileSystem;
import sys.io.File;
#end
import Song.SwagSong;
import flixel.input.gamepad.FlxGamepad; import flixel.input.gamepad.FlxGamepad;
import flash.text.TextField; import flash.text.TextField;
import flixel.FlxG; import flixel.FlxG;
@ -20,15 +28,17 @@ using StringTools;
class FreeplayState extends MusicBeatState class FreeplayState extends MusicBeatState
{ {
var songs:Array<SongMetadata> = []; public static var songs:Array<SongMetadata> = [];
var selector:FlxText; var selector:FlxText;
var curSelected:Int = 0; public static var curSelected:Int = 0;
var curDifficulty:Int = 1; public static var curDifficulty:Int = 1;
var scoreText:FlxText; var scoreText:FlxText;
var comboText:FlxText; var comboText:FlxText;
var diffText:FlxText; var diffText:FlxText;
var diffCalcText:FlxText;
var previewtext:FlxText;
var lerpScore:Int = 0; var lerpScore:Int = 0;
var intendedScore:Int = 0; var intendedScore:Int = 0;
var combo:String = ''; var combo:String = '';
@ -38,16 +48,82 @@ class FreeplayState extends MusicBeatState
private var iconArray:Array<HealthIcon> = []; private var iconArray:Array<HealthIcon> = [];
public static var openedPreview = false;
public static var songData:Map<String,Array<SwagSong>> = [];
public static function loadDiff(diff:Int, format:String, name:String, array:Array<SwagSong>)
{
try
{
array.push(Song.loadFromJson(Highscore.formatSong(format, diff), name));
}
catch(ex)
{
// do nada
}
}
override function create() override function create()
{ {
var initSonglist = CoolUtil.coolTextFile(Paths.txt('freeplaySonglist')); var initSonglist = CoolUtil.coolTextFile(Paths.txt('data/freeplaySonglist'));
//var diffList = "";
songData = [];
songs = [];
for (i in 0...initSonglist.length) for (i in 0...initSonglist.length)
{ {
var data:Array<String> = initSonglist[i].split(':'); var data:Array<String> = initSonglist[i].split(':');
songs.push(new SongMetadata(data[0], Std.parseInt(data[2]), data[1])); var meta = new SongMetadata(data[0], Std.parseInt(data[2]), data[1]);
songs.push(meta);
var format = StringTools.replace(meta.songName, " ", "-");
switch (format) {
case 'Dad-Battle': format = 'Dadbattle';
case 'Philly-Nice': format = 'Philly';
}
var diffs = [];
FreeplayState.loadDiff(0,format,meta.songName,diffs);
FreeplayState.loadDiff(1,format,meta.songName,diffs);
FreeplayState.loadDiff(2,format,meta.songName,diffs);
FreeplayState.songData.set(meta.songName,diffs);
trace('loaded diffs for ' + meta.songName);
} }
trace("tryin to load sm files");
#if sys
for(i in FileSystem.readDirectory("assets/sm/"))
{
trace(i);
if (FileSystem.isDirectory("assets/sm/" + i))
{
trace("Reading SM file dir " + i);
for (file in FileSystem.readDirectory("assets/sm/" + i))
{
if (file.contains(" "))
FileSystem.rename("assets/sm/" + i + "/" + file,"assets/sm/" + i + "/" + file.replace(" ","_"));
if (file.endsWith(".sm"))
{
trace("reading " + file);
var file:SMFile = SMFile.loadFile("assets/sm/" + i + "/" + file.replace(" ","_"));
trace("Converting " + file.header.TITLE);
var data = file.convertToFNF("assets/sm/" + i + "/converted.json");
var meta = new SongMetadata(file.header.TITLE, 0, "sm",file,"assets/sm/" + i);
songs.push(meta);
var song = Song.loadFromJsonRAW(data);
songData.set(file.header.TITLE, [song,song,song]);
}
}
}
}
#end
//trace("\n" + diffList);
/* /*
if (FlxG.sound.music != null) if (FlxG.sound.music != null)
{ {
@ -67,11 +143,17 @@ class FreeplayState extends MusicBeatState
isDebug = true; isDebug = true;
#end #end
persistentUpdate = true;
// LOAD MUSIC // LOAD MUSIC
// LOAD CHARACTERS // LOAD CHARACTERS
var bg:FlxSprite = new FlxSprite().loadGraphic(Paths.image('menuBGBlue')); var bg:FlxSprite = new FlxSprite().loadGraphic(Paths.image('menuBGBlue'));
if(FlxG.save.data.antialiasing)
{
bg.antialiasing = true;
}
add(bg); add(bg);
grpSongs = new FlxTypedGroup<Alphabet>(); grpSongs = new FlxTypedGroup<Alphabet>();
@ -101,7 +183,7 @@ class FreeplayState extends MusicBeatState
scoreText.setFormat(Paths.font("vcr.ttf"), 32, FlxColor.WHITE, RIGHT); scoreText.setFormat(Paths.font("vcr.ttf"), 32, FlxColor.WHITE, RIGHT);
// scoreText.alignment = RIGHT; // scoreText.alignment = RIGHT;
var scoreBG:FlxSprite = new FlxSprite(scoreText.x - 6, 0).makeGraphic(Std.int(FlxG.width * 0.35), 66, 0xFF000000); var scoreBG:FlxSprite = new FlxSprite(scoreText.x - 6, 0).makeGraphic(Std.int(FlxG.width * 0.35), 105, 0xFF000000);
scoreBG.alpha = 0.6; scoreBG.alpha = 0.6;
add(scoreBG); add(scoreBG);
@ -109,6 +191,14 @@ class FreeplayState extends MusicBeatState
diffText.font = scoreText.font; diffText.font = scoreText.font;
add(diffText); add(diffText);
diffCalcText = new FlxText(scoreText.x, scoreText.y + 66, 0, "", 24);
diffCalcText.font = scoreText.font;
add(diffCalcText);
previewtext = new FlxText(scoreText.x, scoreText.y + 94, 0, "" + (KeyBinds.gamepad ? "X" : "SPACE") + " to preview", 24);
previewtext.font = scoreText.font;
//add(previewtext);
comboText = new FlxText(diffText.x + 100, diffText.y, 0, "", 24); comboText = new FlxText(diffText.x + 100, diffText.y, 0, "", 24);
comboText.font = diffText.font; comboText.font = diffText.font;
add(comboText); add(comboText);
@ -167,7 +257,7 @@ class FreeplayState extends MusicBeatState
num++; num++;
} }
} }
override function update(elapsed:Float) override function update(elapsed:Float)
{ {
super.update(elapsed); super.update(elapsed);
@ -185,14 +275,20 @@ class FreeplayState extends MusicBeatState
scoreText.text = "PERSONAL BEST:" + lerpScore; scoreText.text = "PERSONAL BEST:" + lerpScore;
comboText.text = combo + '\n'; comboText.text = combo + '\n';
if (FlxG.sound.music.volume > 0.8)
{
FlxG.sound.music.volume -= 0.5 * FlxG.elapsed;
}
var upP = FlxG.keys.justPressed.UP; var upP = FlxG.keys.justPressed.UP;
var downP = FlxG.keys.justPressed.DOWN; var downP = FlxG.keys.justPressed.DOWN;
var accepted = controls.ACCEPT; var accepted = FlxG.keys.justPressed.ENTER;
var gamepad:FlxGamepad = FlxG.gamepads.lastActive; var gamepad:FlxGamepad = FlxG.gamepads.lastActive;
if (gamepad != null) if (gamepad != null)
{ {
if (gamepad.justPressed.DPAD_UP) if (gamepad.justPressed.DPAD_UP)
{ {
changeSelection(-1); changeSelection(-1);
@ -209,6 +305,9 @@ class FreeplayState extends MusicBeatState
{ {
changeDiff(1); changeDiff(1);
} }
//if (gamepad.justPressed.X && !openedPreview)
//openSubState(new DiffOverview());
} }
if (upP) if (upP)
@ -220,6 +319,9 @@ class FreeplayState extends MusicBeatState
changeSelection(1); changeSelection(1);
} }
//if (FlxG.keys.justPressed.SPACE && !openedPreview)
//openSubState(new DiffOverview());
if (FlxG.keys.justPressed.LEFT) if (FlxG.keys.justPressed.LEFT)
changeDiff(-1); changeDiff(-1);
if (FlxG.keys.justPressed.RIGHT) if (FlxG.keys.justPressed.RIGHT)
@ -238,18 +340,36 @@ class FreeplayState extends MusicBeatState
case 'Dad-Battle': songFormat = 'Dadbattle'; case 'Dad-Battle': songFormat = 'Dadbattle';
case 'Philly-Nice': songFormat = 'Philly'; case 'Philly-Nice': songFormat = 'Philly';
} }
var hmm;
trace(songs[curSelected].songName); try
{
hmm = songData.get(songs[curSelected].songName)[curDifficulty];
if (hmm == null)
return;
}
catch(ex)
{
return;
}
var poop:String = Highscore.formatSong(songFormat, curDifficulty);
trace(poop); PlayState.SONG = hmm;
PlayState.SONG = Song.loadFromJson(poop, songs[curSelected].songName);
PlayState.isStoryMode = false; PlayState.isStoryMode = false;
PlayState.storyDifficulty = curDifficulty; PlayState.storyDifficulty = curDifficulty;
PlayState.storyWeek = songs[curSelected].week; PlayState.storyWeek = songs[curSelected].week;
trace('CUR WEEK' + PlayState.storyWeek); trace('CUR WEEK' + PlayState.storyWeek);
#if sys
if (songs[curSelected].songCharacter == "sm")
{
PlayState.isSM = true;
PlayState.sm = songs[curSelected].sm;
PlayState.pathToSm = songs[curSelected].path;
}
else
PlayState.isSM = false;
#else
PlayState.isSM = false;
#end
LoadingState.loadAndSwitchState(new PlayState()); LoadingState.loadAndSwitchState(new PlayState());
} }
} }
@ -263,6 +383,7 @@ class FreeplayState extends MusicBeatState
if (curDifficulty > 2) if (curDifficulty > 2)
curDifficulty = 0; curDifficulty = 0;
// adjusting the highscore song name to be compatible (changeDiff) // adjusting the highscore song name to be compatible (changeDiff)
var songHighscore = StringTools.replace(songs[curSelected].songName, " ", "-"); var songHighscore = StringTools.replace(songs[curSelected].songName, " ", "-");
switch (songHighscore) { switch (songHighscore) {
@ -274,7 +395,7 @@ class FreeplayState extends MusicBeatState
intendedScore = Highscore.getScore(songHighscore, curDifficulty); intendedScore = Highscore.getScore(songHighscore, curDifficulty);
combo = Highscore.getCombo(songHighscore, curDifficulty); combo = Highscore.getCombo(songHighscore, curDifficulty);
#end #end
diffCalcText.text = 'RATING: ${DiffCalc.CalculateDiff(songData.get(songs[curSelected].songName)[curDifficulty])}';
diffText.text = CoolUtil.difficultyFromInt(curDifficulty).toUpperCase(); diffText.text = CoolUtil.difficultyFromInt(curDifficulty).toUpperCase();
} }
@ -287,6 +408,8 @@ class FreeplayState extends MusicBeatState
// NGio.logEvent('Fresh'); // NGio.logEvent('Fresh');
FlxG.sound.play(Paths.sound('scrollMenu'), 0.4); FlxG.sound.play(Paths.sound('scrollMenu'), 0.4);
curSelected += change; curSelected += change;
if (curSelected < 0) if (curSelected < 0)
@ -310,10 +433,38 @@ class FreeplayState extends MusicBeatState
// lerpScore = 0; // lerpScore = 0;
#end #end
diffCalcText.text = 'RATING: ${DiffCalc.CalculateDiff(songData.get(songs[curSelected].songName)[curDifficulty])}';
#if PRELOAD_ALL #if PRELOAD_ALL
FlxG.sound.playMusic(Paths.inst(songs[curSelected].songName), 0); if (songs[curSelected].songCharacter == "sm")
{
var data = songs[curSelected];
trace("Loading " + data.path + "/" + data.sm.header.MUSIC);
var bytes = File.getBytes(data.path + "/" + data.sm.header.MUSIC);
var sound = new Sound();
sound.loadCompressedDataFromByteArray(bytes.getData(), bytes.length);
FlxG.sound.playMusic(sound);
}
else
FlxG.sound.playMusic(Paths.inst(songs[curSelected].songName), 0);
#end #end
var hmm;
try
{
hmm = songData.get(songs[curSelected].songName)[curDifficulty];
if (hmm != null)
Conductor.changeBPM(hmm.bpm);
}
catch(ex)
{}
if (openedPreview)
{
closeSubState();
openSubState(new DiffOverview());
}
var bullShit:Int = 0; var bullShit:Int = 0;
for (i in 0...iconArray.length) for (i in 0...iconArray.length)
@ -344,12 +495,27 @@ class SongMetadata
{ {
public var songName:String = ""; public var songName:String = "";
public var week:Int = 0; public var week:Int = 0;
#if sys
public var sm:SMFile;
public var path:String;
#end
public var songCharacter:String = ""; public var songCharacter:String = "";
#if sys
public function new(song:String, week:Int, songCharacter:String, ?sm:SMFile = null, ?path:String = "")
{
this.songName = song;
this.week = week;
this.songCharacter = songCharacter;
this.sm = sm;
this.path = path;
}
#else
public function new(song:String, week:Int, songCharacter:String) public function new(song:String, week:Int, songCharacter:String)
{ {
this.songName = song; this.songName = song;
this.week = week; this.week = week;
this.songCharacter = songCharacter; this.songCharacter = songCharacter;
} }
#end
} }

View File

@ -41,7 +41,10 @@ class GameOverState extends FlxTransitionableState
restart.setGraphicSize(Std.int(restart.width * 0.6)); restart.setGraphicSize(Std.int(restart.width * 0.6));
restart.updateHitbox(); restart.updateHitbox();
restart.alpha = 0; restart.alpha = 0;
restart.antialiasing = true; if(FlxG.save.data.antialiasing)
{
restart.antialiasing = true;
}
add(restart); add(restart);
FlxG.sound.music.fadeOut(2, FlxG.sound.music.volume * 0.6); FlxG.sound.music.fadeOut(2, FlxG.sound.music.volume * 0.6);

View File

@ -48,6 +48,8 @@ class GameOverSubstate extends MusicBeatSubstate
bf.playAnim('firstDeath'); bf.playAnim('firstDeath');
} }
var startVibin:Bool = false;
override function update(elapsed:Float) override function update(elapsed:Float)
{ {
super.update(elapsed); super.update(elapsed);
@ -76,6 +78,7 @@ class GameOverSubstate extends MusicBeatSubstate
if (bf.animation.curAnim.name == 'firstDeath' && bf.animation.curAnim.finished) if (bf.animation.curAnim.name == 'firstDeath' && bf.animation.curAnim.finished)
{ {
FlxG.sound.playMusic(Paths.music('gameOver' + stageSuffix)); FlxG.sound.playMusic(Paths.music('gameOver' + stageSuffix));
startVibin = true;
} }
if (FlxG.sound.music.playing) if (FlxG.sound.music.playing)
@ -88,6 +91,10 @@ class GameOverSubstate extends MusicBeatSubstate
{ {
super.beatHit(); super.beatHit();
if (startVibin && !isEnding)
{
bf.playAnim('deathLoop', true);
}
FlxG.log.add('beat'); FlxG.log.add('beat');
} }
@ -97,6 +104,7 @@ class GameOverSubstate extends MusicBeatSubstate
{ {
if (!isEnding) if (!isEnding)
{ {
PlayState.startTime = 0;
isEnding = true; isEnding = true;
bf.playAnim('deathConfirm', true); bf.playAnim('deathConfirm', true);
FlxG.sound.music.stop(); FlxG.sound.music.stop();

View File

@ -33,6 +33,7 @@ class GameplayCustomizeState extends MusicBeatState
var bf:Boyfriend; var bf:Boyfriend;
var dad:Character; var dad:Character;
var gf:Character;
var strumLine:FlxSprite; var strumLine:FlxSprite;
var strumLineNotes:FlxTypedGroup<FlxSprite>; var strumLineNotes:FlxTypedGroup<FlxSprite>;
@ -42,7 +43,7 @@ class GameplayCustomizeState extends MusicBeatState
public override function create() { public override function create() {
#if windows #if windows
// Updating Discord Rich Presence // Updating Discord Rich Presence
DiscordClient.changePresence("Customizing Gameplay", null); DiscordClient.changePresence("Customizing Gameplay Modules", null);
#end #end
sick = new FlxSprite().loadGraphic(Paths.image('sick','shared')); sick = new FlxSprite().loadGraphic(Paths.image('sick','shared'));
@ -51,7 +52,7 @@ class GameplayCustomizeState extends MusicBeatState
curt = new FlxSprite(-500, -300).loadGraphic(Paths.image('stagecurtains','shared')); curt = new FlxSprite(-500, -300).loadGraphic(Paths.image('stagecurtains','shared'));
front = new FlxSprite(-650, 600).loadGraphic(Paths.image('stagefront','shared')); front = new FlxSprite(-650, 600).loadGraphic(Paths.image('stagefront','shared'));
Conductor.changeBPM(102); //Conductor.changeBPM(102);
persistentUpdate = true; persistentUpdate = true;
super.create(); super.create();
@ -74,10 +75,14 @@ class GameplayCustomizeState extends MusicBeatState
bf = new Boyfriend(770, 450, 'bf'); bf = new Boyfriend(770, 450, 'bf');
gf = new Character(400, 130, 'gf');
gf.scrollFactor.set(0.95, 0.95);
var camPos:FlxPoint = new FlxPoint(dad.getGraphicMidpoint().x + 400, dad.getGraphicMidpoint().y); var camPos:FlxPoint = new FlxPoint(dad.getGraphicMidpoint().x + 400, dad.getGraphicMidpoint().y);
camFollow.setPosition(camPos.x, camPos.y); camFollow.setPosition(camPos.x, camPos.y);
add(gf);
add(bf); add(bf);
add(dad); add(dad);
@ -111,7 +116,7 @@ class GameplayCustomizeState extends MusicBeatState
generateStaticArrows(0); generateStaticArrows(0);
generateStaticArrows(1); generateStaticArrows(1);
text = new FlxText(5, FlxG.height + 40, 0, "Drag around gameplay elements, R to reset, Escape to go back.", 12); text = new FlxText(5, FlxG.height + 40, 0, "Click and drag around gameplay elements to customize their positions.\nPress R to reset.\nPress Escape to go back.", 12);
text.scrollFactor.set(); text.scrollFactor.set();
text.setFormat("VCR OSD Mono", 16, FlxColor.WHITE, LEFT, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK); text.setFormat("VCR OSD Mono", 16, FlxColor.WHITE, LEFT, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK);
@ -188,8 +193,9 @@ class GameplayCustomizeState extends MusicBeatState
{ {
super.beatHit(); super.beatHit();
bf.playAnim('idle'); bf.playAnim('idle', true);
dad.dance(); dad.dance(true);
gf.dance();
FlxG.camera.zoom += 0.015; FlxG.camera.zoom += 0.015;
camHUD.zoom += 0.010; camHUD.zoom += 0.010;

View File

@ -22,12 +22,20 @@ class GitarooPause extends MusicBeatState
FlxG.sound.music.stop(); FlxG.sound.music.stop();
var bg:FlxSprite = new FlxSprite().loadGraphic(Paths.image('pauseAlt/pauseBG')); var bg:FlxSprite = new FlxSprite().loadGraphic(Paths.image('pauseAlt/pauseBG'));
if(FlxG.save.data.antialiasing)
{
bg.antialiasing = true;
}
add(bg); add(bg);
var bf:FlxSprite = new FlxSprite(0, 30); var bf:FlxSprite = new FlxSprite(0, 30);
bf.frames = Paths.getSparrowAtlas('pauseAlt/bfLol'); bf.frames = Paths.getSparrowAtlas('pauseAlt/bfLol');
bf.animation.addByPrefix('lol', "funnyThing", 13); bf.animation.addByPrefix('lol', "funnyThing", 13);
bf.animation.play('lol'); bf.animation.play('lol');
if(FlxG.save.data.antialiasing)
{
bf.antialiasing = true;
}
add(bf); add(bf);
bf.screenCenter(X); bf.screenCenter(X);
@ -36,6 +44,10 @@ class GitarooPause extends MusicBeatState
replayButton.animation.addByPrefix('selected', 'bluereplay', 0, false); replayButton.animation.addByPrefix('selected', 'bluereplay', 0, false);
replayButton.animation.appendByPrefix('selected', 'yellowreplay'); replayButton.animation.appendByPrefix('selected', 'yellowreplay');
replayButton.animation.play('selected'); replayButton.animation.play('selected');
if(FlxG.save.data.antialiasing)
{
replayButton.antialiasing = true;
}
add(replayButton); add(replayButton);
cancelButton = new FlxSprite(FlxG.width * 0.58, replayButton.y); cancelButton = new FlxSprite(FlxG.width * 0.58, replayButton.y);
@ -43,6 +55,10 @@ class GitarooPause extends MusicBeatState
cancelButton.animation.addByPrefix('selected', 'bluecancel', 0, false); cancelButton.animation.addByPrefix('selected', 'bluecancel', 0, false);
cancelButton.animation.appendByPrefix('selected', 'cancelyellow'); cancelButton.animation.appendByPrefix('selected', 'cancelyellow');
cancelButton.animation.play('selected'); cancelButton.animation.play('selected');
if(FlxG.save.data.antialiasing)
{
cancelButton.antialiasing = true;
}
add(cancelButton); add(cancelButton);
changeThing(); changeThing();

View File

@ -1,5 +1,6 @@
package; package;
import flixel.FlxG;
import flixel.FlxSprite; import flixel.FlxSprite;
class HealthIcon extends FlxSprite class HealthIcon extends FlxSprite
@ -12,10 +13,17 @@ class HealthIcon extends FlxSprite
public function new(char:String = 'bf', isPlayer:Bool = false) public function new(char:String = 'bf', isPlayer:Bool = false)
{ {
super(); super();
loadGraphic(Paths.image('iconGrid'), true, 150, 150);
antialiasing = true; if(FlxG.save.data.antialiasing)
{
antialiasing = true;
}
if (char == 'sm')
{
loadGraphic(Paths.image("stepmania-icon"));
return;
}
loadGraphic(Paths.image('iconGrid'), true, 150, 150);
animation.add('bf', [0, 1], 0, false, isPlayer); animation.add('bf', [0, 1], 0, false, isPlayer);
animation.add('bf-car', [0, 1], 0, false, isPlayer); animation.add('bf-car', [0, 1], 0, false, isPlayer);
animation.add('bf-christmas', [0, 1], 0, false, isPlayer); animation.add('bf-christmas', [0, 1], 0, false, isPlayer);

View File

@ -12,4 +12,5 @@ class HelperFunctions
public static function GCD(a, b) { public static function GCD(a, b) {
return b == 0 ? FlxMath.absInt(a) : GCD(b, a % b); return b == 0 ? FlxMath.absInt(a) : GCD(b, a % b);
} }
} }

View File

@ -6,12 +6,21 @@ class KadeEngineData
{ {
public static function initSave() public static function initSave()
{ {
if (FlxG.save.data.newInput == null) if (FlxG.save.data.weekUnlocked == null)
FlxG.save.data.weekUnlocked = 7;
if (FlxG.save.data.newInput == null)
FlxG.save.data.newInput = true; FlxG.save.data.newInput = true;
if (FlxG.save.data.downscroll == null) if (FlxG.save.data.downscroll == null)
FlxG.save.data.downscroll = false; FlxG.save.data.downscroll = false;
if (FlxG.save.data.antialiasing == null)
FlxG.save.data.antialiasing = true;
if (FlxG.save.data.missSounds == null)
FlxG.save.data.missSounds = true;
if (FlxG.save.data.dfjk == null) if (FlxG.save.data.dfjk == null)
FlxG.save.data.dfjk = false; FlxG.save.data.dfjk = false;
@ -63,6 +72,9 @@ class KadeEngineData
if (FlxG.save.data.distractions == null) if (FlxG.save.data.distractions == null)
FlxG.save.data.distractions = true; FlxG.save.data.distractions = true;
if (FlxG.save.data.stepMania == null)
FlxG.save.data.stepMania = false;
if (FlxG.save.data.flashing == null) if (FlxG.save.data.flashing == null)
FlxG.save.data.flashing = true; FlxG.save.data.flashing = true;
@ -94,6 +106,9 @@ class KadeEngineData
if (FlxG.save.data.optimize == null) if (FlxG.save.data.optimize == null)
FlxG.save.data.optimize = false; FlxG.save.data.optimize = false;
if (FlxG.save.data.cacheImages == null)
FlxG.save.data.cacheImages = false;
var gamepad:FlxGamepad = FlxG.gamepads.lastActive; var gamepad:FlxGamepad = FlxG.gamepads.lastActive;
KeyBinds.gamepad = gamepad != null; KeyBinds.gamepad = gamepad != null;

View File

@ -119,6 +119,8 @@ class KeyBindMenu extends FlxSubState
if (frames <= 10) if (frames <= 10)
frames++; frames++;
infoText.text = 'Current Mode: ${KeyBinds.gamepad ? 'GAMEPAD' : 'KEYBOARD'}. Press TAB to switch\n(${KeyBinds.gamepad ? 'RIGHT Trigger' : 'Escape'} to save, ${KeyBinds.gamepad ? 'LEFT Trigger' : 'Backspace'} to leave without saving. ${KeyBinds.gamepad ? 'START To change a keybind' : ''})\n${lastKey != "" ? lastKey + " is blacklisted!" : ""}';
switch(state){ switch(state){
case "select": case "select":
@ -137,7 +139,6 @@ class KeyBindMenu extends FlxSubState
if (FlxG.keys.justPressed.TAB) if (FlxG.keys.justPressed.TAB)
{ {
KeyBinds.gamepad = !KeyBinds.gamepad; KeyBinds.gamepad = !KeyBinds.gamepad;
infoText.text = 'Current Mode: ${KeyBinds.gamepad ? 'GAMEPAD' : 'KEYBOARD'}. Press TAB to switch\n(${KeyBinds.gamepad ? 'RIGHT Trigger' : 'Escape'} to save, ${KeyBinds.gamepad ? 'LEFT Trigger' : 'Backspace'} to leave without saving. ${KeyBinds.gamepad ? 'START To change a keybind' : ''})';
textUpdate(); textUpdate();
} }
@ -320,7 +321,7 @@ class KeyBindMenu extends FlxSubState
var shouldReturn:Bool = true; var shouldReturn:Bool = true;
var notAllowed:Array<String> = ["START", "RIGHT_TRIGGER", "LEFT_TRIGGER"]; var notAllowed:Array<String> = ["START"];
for(x in 0...gpKeys.length) for(x in 0...gpKeys.length)
{ {
@ -330,6 +331,7 @@ class KeyBindMenu extends FlxSubState
if (notAllowed.contains(oK)) if (notAllowed.contains(oK))
{ {
gpKeys[x] = null; gpKeys[x] = null;
lastKey = r;
return; return;
} }
} }
@ -340,14 +342,13 @@ class KeyBindMenu extends FlxSubState
} }
else{ else{
gpKeys[curSelected] = tempKey; gpKeys[curSelected] = tempKey;
FlxG.sound.play(Paths.sound('scrollMenu')); lastKey = r;
keyWarning.alpha = 1;
warningTween.cancel();
warningTween = FlxTween.tween(keyWarning, {alpha: 0}, 0.5, {ease: FlxEase.circOut, startDelay: 2});
} }
} }
public var lastKey:String = "";
function addKey(r:String){ function addKey(r:String){
var shouldReturn:Bool = true; var shouldReturn:Bool = true;
@ -366,6 +367,7 @@ class KeyBindMenu extends FlxSubState
if (notAllowed.contains(oK)) if (notAllowed.contains(oK))
{ {
keys[x] = null; keys[x] = null;
lastKey = oK;
return; return;
} }
} }
@ -373,19 +375,19 @@ class KeyBindMenu extends FlxSubState
if (r.contains("NUMPAD")) if (r.contains("NUMPAD"))
{ {
keys[curSelected] = null; keys[curSelected] = null;
lastKey = r;
return; return;
} }
lastKey = "";
if(shouldReturn){ if(shouldReturn){
keys[curSelected] = r; keys[curSelected] = r;
FlxG.sound.play(Paths.sound('scrollMenu')); FlxG.sound.play(Paths.sound('scrollMenu'));
} }
else{ else{
keys[curSelected] = tempKey; keys[curSelected] = tempKey;
FlxG.sound.play(Paths.sound('scrollMenu')); lastKey = r;
keyWarning.alpha = 1;
warningTween.cancel();
warningTween = FlxTween.tween(keyWarning, {alpha: 0}, 0.5, {ease: FlxEase.circOut, startDelay: 2});
} }
} }

View File

@ -1,5 +1,12 @@
package; package;
import haxe.Exception;
import lime.app.Application;
#if sys
import smTools.SMFile;
import sys.FileSystem;
#end
import Controls.KeyboardScheme; import Controls.KeyboardScheme;
import Controls.Control; import Controls.Control;
import flash.text.TextField; import flash.text.TextField;
@ -64,7 +71,10 @@ class LoadReplayState extends MusicBeatState
menuBG.setGraphicSize(Std.int(menuBG.width * 1.1)); menuBG.setGraphicSize(Std.int(menuBG.width * 1.1));
menuBG.updateHitbox(); menuBG.updateHitbox();
menuBG.screenCenter(); menuBG.screenCenter();
menuBG.antialiasing = true; if(FlxG.save.data.antialiasing)
{
menuBG.antialiasing = true;
}
add(menuBG); add(menuBG);
grpControls = new FlxTypedGroup<Alphabet>(); grpControls = new FlxTypedGroup<Alphabet>();
@ -161,9 +171,55 @@ class LoadReplayState extends MusicBeatState
case 'philly-nice': songFormat = 'Philly'; case 'philly-nice': songFormat = 'Philly';
} }
var poop:String = Highscore.formatSong(songFormat, PlayState.rep.replay.songDiff); var poop = "";
#if sys
if (PlayState.rep.replay.sm)
if (!FileSystem.exists(StringTools.replace(PlayState.rep.replay.chartPath,"converted.json","")))
{
Application.current.window.alert("The SM file in this replay does not exist!","SM Replays");
return;
}
#end
PlayState.SONG = Song.loadFromJson(poop, PlayState.rep.replay.songName); PlayState.isSM = PlayState.rep.replay.sm;
#if sys
if (PlayState.isSM)
PlayState.pathToSm = StringTools.replace(PlayState.rep.replay.chartPath,"converted.json","");
#end
#if sys
if (PlayState.isSM)
{
poop = File.getContent(PlayState.rep.replay.chartPath);
try
{
PlayState.sm = SMFile.loadFile(PlayState.pathToSm + "/" + StringTools.replace(PlayState.rep.replay.songName," ", "_") + ".sm");
}
catch(e:Exception)
{
Application.current.window.alert("Make sure that the SM file is called " + PlayState.pathToSm + "/" + StringTools.replace(PlayState.rep.replay.songName," ", "_") + ".sm!\nAs I couldn't read it.","SM Replays");
return;
}
}
else
poop = Highscore.formatSong(songFormat, PlayState.rep.replay.songDiff);
#else
poop = Highscore.formatSong(songFormat, PlayState.rep.replay.songDiff);
#end
try
{
if (PlayState.isSM)
PlayState.SONG = Song.loadFromJsonRAW(poop);
else
PlayState.SONG = Song.loadFromJson(poop, PlayState.rep.replay.songName);
}
catch(e:Exception)
{
Application.current.window.alert("Failed to load the song! Does the JSON exist?","Replays");
return;
}
PlayState.isStoryMode = false; PlayState.isStoryMode = false;
PlayState.storyDifficulty = PlayState.rep.replay.songDiff; PlayState.storyDifficulty = PlayState.rep.replay.songDiff;
PlayState.storyWeek = getWeekNumbFromSong(PlayState.rep.replay.songName); PlayState.storyWeek = getWeekNumbFromSong(PlayState.rep.replay.songName);

View File

@ -38,7 +38,10 @@ class LoadingState extends MusicBeatState
{ {
logo = new FlxSprite(-150, -100); logo = new FlxSprite(-150, -100);
logo.frames = Paths.getSparrowAtlas('logoBumpin'); logo.frames = Paths.getSparrowAtlas('logoBumpin');
logo.antialiasing = true; if(FlxG.save.data.antialiasing)
{
logo.antialiasing = true;
}
logo.animation.addByPrefix('bump', 'logo bumpin', 24); logo.animation.addByPrefix('bump', 'logo bumpin', 24);
logo.animation.play('bump'); logo.animation.play('bump');
logo.updateHitbox(); logo.updateHitbox();
@ -49,7 +52,10 @@ class LoadingState extends MusicBeatState
gfDance.frames = Paths.getSparrowAtlas('gfDanceTitle'); 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('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); gfDance.animation.addByIndices('danceRight', 'gfDance', [15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29], "", 24, false);
gfDance.antialiasing = true; if(FlxG.save.data.antialiasing)
{
gfDance.antialiasing = true;
}
add(gfDance); add(gfDance);
add(logo); add(logo);

View File

@ -1,8 +1,11 @@
package; package;
import lime.app.Application;
#if windows
import Discord.DiscordClient;
#end
import openfl.display.BlendMode; import openfl.display.BlendMode;
import openfl.text.TextFormat; import openfl.text.TextFormat;
import openfl.display.Application;
import flixel.util.FlxColor; import flixel.util.FlxColor;
import flixel.FlxG; import flixel.FlxG;
import flixel.FlxGame; import flixel.FlxGame;
@ -23,7 +26,7 @@ class Main extends Sprite
var skipSplash:Bool = true; // Whether to skip the flixel splash screen that appears in release mode. var skipSplash:Bool = true; // Whether to skip the flixel splash screen that appears in release mode.
var startFullscreen:Bool = false; // Whether to start the game in fullscreen on desktop targets var startFullscreen:Bool = false; // Whether to start the game in fullscreen on desktop targets
public static var watermarks = true; // Whether to put Kade Engine liteartly anywhere public static var watermarks = true; // Whether to put Kade Engine literally anywhere
// You can pretty much ignore everything from here on - your code should go in your states. // You can pretty much ignore everything from here on - your code should go in your states.
@ -82,12 +85,19 @@ class Main extends Sprite
game = new FlxGame(gameWidth, gameHeight, initialState, zoom, framerate, framerate, skipSplash, startFullscreen); game = new FlxGame(gameWidth, gameHeight, initialState, zoom, framerate, framerate, skipSplash, startFullscreen);
#end #end
addChild(game); addChild(game);
#if windows
DiscordClient.initialize();
Application.current.onExit.add (function (exitCode) {
DiscordClient.shutdown();
});
#end
#if !mobile #if !mobile
fpsCounter = new FPS(10, 3, 0xFFFFFF); fpsCounter = new FPS(10, 3, 0xFFFFFF);
addChild(fpsCounter); addChild(fpsCounter);
toggleFPS(FlxG.save.data.fps); toggleFPS(FlxG.save.data.fps);
#end #end
} }

View File

@ -40,7 +40,7 @@ class MainMenuState extends MusicBeatState
public static var nightly:String = ""; public static var nightly:String = "";
public static var kadeEngineVer:String = "1.5.4" + nightly; public static var kadeEngineVer:String = "1.6" + nightly;
public static var gameVer:String = "0.2.7.1"; public static var gameVer:String = "0.2.7.1";
var magenta:FlxSprite; var magenta:FlxSprite;
@ -67,7 +67,10 @@ class MainMenuState extends MusicBeatState
bg.setGraphicSize(Std.int(bg.width * 1.1)); bg.setGraphicSize(Std.int(bg.width * 1.1));
bg.updateHitbox(); bg.updateHitbox();
bg.screenCenter(); bg.screenCenter();
bg.antialiasing = true; if(FlxG.save.data.antialiasing)
{
bg.antialiasing = true;
}
add(bg); add(bg);
camFollow = new FlxObject(0, 0, 1, 1); camFollow = new FlxObject(0, 0, 1, 1);
@ -80,7 +83,10 @@ class MainMenuState extends MusicBeatState
magenta.updateHitbox(); magenta.updateHitbox();
magenta.screenCenter(); magenta.screenCenter();
magenta.visible = false; magenta.visible = false;
magenta.antialiasing = true; if(FlxG.save.data.antialiasing)
{
magenta.antialiasing = true;
}
magenta.color = 0xFFfd719b; magenta.color = 0xFFfd719b;
add(magenta); add(magenta);
// magenta.scrollFactor.set(); // magenta.scrollFactor.set();
@ -101,7 +107,10 @@ class MainMenuState extends MusicBeatState
menuItem.screenCenter(X); menuItem.screenCenter(X);
menuItems.add(menuItem); menuItems.add(menuItem);
menuItem.scrollFactor.set(); menuItem.scrollFactor.set();
menuItem.antialiasing = true; if(FlxG.save.data.antialiasing)
{
menuItem.antialiasing = true;
}
if (firstStart) if (firstStart)
FlxTween.tween(menuItem,{y: 60 + (i * 160)},1 + (i * 0.25) ,{ease: FlxEase.expoInOut, onComplete: function(flxTween:FlxTween) FlxTween.tween(menuItem,{y: 60 + (i * 160)},1 + (i * 0.25) ,{ease: FlxEase.expoInOut, onComplete: function(flxTween:FlxTween)
{ {

View File

@ -1,6 +1,7 @@
package; package;
import flixel.FlxSprite; import flixel.FlxSprite;
import flixel.FlxG;
import flixel.graphics.frames.FlxAtlasFrames; import flixel.graphics.frames.FlxAtlasFrames;
class CharacterSetting class CharacterSetting
@ -33,25 +34,34 @@ class MenuCharacter extends FlxSprite
]; ];
private var flipped:Bool = false; private var flipped:Bool = false;
//questionable variable name lmfao
private var goesLeftNRight:Bool = false;
private var danceLeft:Bool = false;
private var character:String = '';
public function new(x:Int, y:Int, scale:Float, flipped:Bool) public function new(x:Int, y:Int, scale:Float, flipped:Bool)
{ {
super(x, y); super(x, y);
this.flipped = flipped; this.flipped = flipped;
antialiasing = true; if(FlxG.save.data.antialiasing)
{
antialiasing = true;
}
frames = Paths.getSparrowAtlas('campaign_menu_UI_characters'); frames = Paths.getSparrowAtlas('campaign_menu_UI_characters');
animation.addByPrefix('bf', "BF idle dance white", 24); animation.addByPrefix('bf', "BF idle dance white", 24, false);
animation.addByPrefix('bfConfirm', 'BF HEY!!', 24, false); animation.addByPrefix('bfConfirm', 'BF HEY!!', 24, false);
animation.addByPrefix('gf', "GF Dancing Beat WHITE", 24); animation.addByIndices('gf-left', 'GF Dancing Beat WHITE', [30, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "", 24, false);
animation.addByPrefix('dad', "Dad idle dance BLACK LINE", 24); animation.addByIndices('gf-right', 'GF Dancing Beat WHITE', [15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29], "", 24, false);
animation.addByPrefix('spooky', "spooky dance idle BLACK LINES", 24); animation.addByPrefix('dad', "Dad idle dance BLACK LINE", 24, false);
animation.addByPrefix('pico', "Pico Idle Dance", 24); animation.addByIndices('spooky-left', 'spooky dance idle BLACK LINES', [0, 2, 6], "", 12, false);
animation.addByPrefix('mom', "Mom Idle BLACK LINES", 24); animation.addByIndices('spooky-right', 'spooky dance idle BLACK LINES', [8, 10, 12, 14], "", 12, false);
animation.addByPrefix('parents-christmas', "Parent Christmas Idle", 24); animation.addByPrefix('pico', "Pico Idle Dance", 24, false);
animation.addByPrefix('senpai', "SENPAI idle Black Lines", 24); animation.addByPrefix('mom', "Mom Idle BLACK LINES", 24, false);
animation.addByPrefix('parents-christmas', "Parent Christmas Idle", 24, false);
animation.addByPrefix('senpai', "SENPAI idle Black Lines", 24, false);
setGraphicSize(Std.int(width * scale)); setGraphicSize(Std.int(width * scale));
updateHitbox(); updateHitbox();
@ -59,6 +69,8 @@ class MenuCharacter extends FlxSprite
public function setCharacter(character:String):Void public function setCharacter(character:String):Void
{ {
var sameCharacter:Bool = character == this.character;
this.character = character;
if (character == '') if (character == '')
{ {
visible = false; visible = false;
@ -69,11 +81,33 @@ class MenuCharacter extends FlxSprite
visible = true; visible = true;
} }
animation.play(character); if (!sameCharacter) {
bopHead(true);
}
var setting:CharacterSetting = settings[character]; var setting:CharacterSetting = settings[character];
offset.set(setting.x, setting.y); offset.set(setting.x, setting.y);
setGraphicSize(Std.int(width * setting.scale)); setGraphicSize(Std.int(width * setting.scale));
flipX = setting.flipped != flipped; flipX = setting.flipped != flipped;
} }
public function bopHead(LastFrame:Bool = false):Void
{
if (character == 'gf' || character == 'spooky') {
danceLeft = !danceLeft;
if (danceLeft)
animation.play(character + "-left", true);
else
animation.play(character + "-right", true);
} else {
//no spooky nor girlfriend so we do da normal animation
if (animation.name == "bfConfirm")
return;
animation.play(character, true);
}
if (LastFrame) {
animation.finish();
}
}
} }

View File

@ -250,7 +250,7 @@ class ModchartState
PlayState.instance.removeObject(PlayState.boyfriend); PlayState.instance.removeObject(PlayState.boyfriend);
PlayState.boyfriend = new Boyfriend(oldboyfriendx, oldboyfriendy, id); PlayState.boyfriend = new Boyfriend(oldboyfriendx, oldboyfriendy, id);
PlayState.instance.addObject(PlayState.boyfriend); PlayState.instance.addObject(PlayState.boyfriend);
PlayState.instance.iconP2.animation.play(id); PlayState.instance.iconP1.animation.play(id);
} }
function makeAnimatedLuaSprite(spritePath:String,names:Array<String>,prefixes:Array<String>,startAnim:String, id:String) function makeAnimatedLuaSprite(spritePath:String,names:Array<String>,prefixes:Array<String>,startAnim:String, id:String)

View File

@ -3,15 +3,11 @@ package;
#if windows #if windows
import Discord.DiscordClient; import Discord.DiscordClient;
#end #end
import flixel.tweens.FlxTween;
import flixel.util.FlxColor; import flixel.util.FlxColor;
import openfl.Lib; import openfl.Lib;
import Conductor.BPMChangeEvent; import Conductor.BPMChangeEvent;
import flixel.FlxG; import flixel.FlxG;
import flixel.addons.transition.FlxTransitionableState;
import flixel.addons.ui.FlxUIState; import flixel.addons.ui.FlxUIState;
import flixel.math.FlxRect;
import flixel.util.FlxTimer;
class MusicBeatState extends FlxUIState class MusicBeatState extends FlxUIState
{ {
@ -20,6 +16,7 @@ class MusicBeatState extends FlxUIState
private var curStep:Int = 0; private var curStep:Int = 0;
private var curBeat:Int = 0; private var curBeat:Int = 0;
private var curDecimalBeat:Float = 0;
private var controls(get, never):Controls; private var controls(get, never):Controls;
inline function get_controls():Controls inline function get_controls():Controls
@ -27,6 +24,7 @@ class MusicBeatState extends FlxUIState
override function create() override function create()
{ {
TimingStruct.clearTimings();
(cast (Lib.current.getChildAt(0), Main)).setFPSCap(FlxG.save.data.fpsCap); (cast (Lib.current.getChildAt(0), Main)).setFPSCap(FlxG.save.data.fpsCap);
if (transIn != null) if (transIn != null)
@ -51,13 +49,50 @@ class MusicBeatState extends FlxUIState
override function update(elapsed:Float) override function update(elapsed:Float)
{ {
//everyStep(); //everyStep();
var oldStep:Int = curStep; var nextStep:Int = updateCurStep();
updateCurStep(); if (nextStep >= 0)
updateBeat(); {
if (nextStep > curStep)
{
for (i in curStep...nextStep)
{
curStep++;
updateBeat();
stepHit();
}
}
else if (nextStep < curStep)
{
//Song reset?
curStep = nextStep;
updateBeat();
stepHit();
}
}
if (oldStep != curStep && curStep > 0) if (Conductor.songPosition < 0)
stepHit(); curDecimalBeat = 0;
else
{
if (TimingStruct.AllTimings.length > 1)
{
var data = TimingStruct.getTimingAtTimestamp(Conductor.songPosition);
FlxG.watch.addQuick("Current Conductor Timing Seg", data.bpm);
Conductor.crochet = ((60 / data.bpm) * 1000);
var percent = (Conductor.songPosition - (data.startTime * 1000)) / (data.length * 1000);
curDecimalBeat = data.startBeat + (((Conductor.songPosition/1000) - data.startTime) * (data.bpm / 60));
}
else
{
curDecimalBeat = (Conductor.songPosition / 1000) * (Conductor.bpm/60);
Conductor.crochet = ((60 / Conductor.bpm) * 1000);
}
}
if (FlxG.save.data.fpsRain && skippedFrames >= 6) if (FlxG.save.data.fpsRain && skippedFrames >= 6)
{ {
@ -78,13 +113,13 @@ class MusicBeatState extends FlxUIState
private function updateBeat():Void private function updateBeat():Void
{ {
lastBeat = curStep; lastBeat = curBeat;
curBeat = Math.floor(curStep / 4); curBeat = Math.floor(curStep / 4);
} }
public static var currentColor = 0; public static var currentColor = 0;
private function updateCurStep():Void private function updateCurStep():Int
{ {
var lastChange:BPMChangeEvent = { var lastChange:BPMChangeEvent = {
stepTime: 0, stepTime: 0,
@ -97,12 +132,11 @@ class MusicBeatState extends FlxUIState
lastChange = Conductor.bpmChangeMap[i]; lastChange = Conductor.bpmChangeMap[i];
} }
curStep = lastChange.stepTime + Math.floor((Conductor.songPosition - lastChange.songTime) / Conductor.stepCrochet); return lastChange.stepTime + Math.floor((Conductor.songPosition - lastChange.songTime) / Conductor.stepCrochet);
} }
public function stepHit():Void public function stepHit():Void
{ {
if (curStep % 4 == 0) if (curStep % 4 == 0)
beatHit(); beatHit();
} }

View File

@ -24,19 +24,38 @@ class MusicBeatSubstate extends FlxSubState
override function update(elapsed:Float) override function update(elapsed:Float)
{ {
//everyStep(); //everyStep();
var oldStep:Int = curStep; var nextStep = updateCurStep();
updateCurStep();
curBeat = Math.floor(curStep / 4);
if (oldStep != curStep && curStep > 0)
stepHit();
if (nextStep >= 0)
{
if (nextStep > curStep)
{
for (i in curStep...nextStep)
{
curStep++;
updateBeat();
stepHit();
}
}
else if (nextStep < curStep)
{
//Song reset?
curStep = nextStep;
updateBeat();
stepHit();
}
}
super.update(elapsed); super.update(elapsed);
} }
private function updateCurStep():Void private function updateBeat():Void
{
lastBeat = curBeat;
curBeat = Math.floor(curStep / 4);
}
private function updateCurStep():Int
{ {
var lastChange:BPMChangeEvent = { var lastChange:BPMChangeEvent = {
stepTime: 0, stepTime: 0,
@ -49,7 +68,7 @@ class MusicBeatSubstate extends FlxSubState
lastChange = Conductor.bpmChangeMap[i]; lastChange = Conductor.bpmChangeMap[i];
} }
curStep = lastChange.stepTime + Math.floor((Conductor.songPosition - lastChange.songTime) / Conductor.stepCrochet); return lastChange.stepTime + Math.floor((Conductor.songPosition - lastChange.songTime) / Conductor.stepCrochet);
} }
public function stepHit():Void public function stepHit():Void

View File

@ -16,9 +16,13 @@ using StringTools;
class Note extends FlxSprite class Note extends FlxSprite
{ {
public var strumTime:Float = 0; public var strumTime:Float = 0;
public var baseStrum:Float = 0;
public var rStrumTime:Float = 0;
public var mustPress:Bool = false; public var mustPress:Bool = false;
public var noteData:Int = 0; public var noteData:Int = 0;
public var rawNoteData:Int = 0;
public var canBeHit:Bool = false; public var canBeHit:Bool = false;
public var tooLate:Bool = false; public var tooLate:Bool = false;
public var wasGoodHit:Bool = false; public var wasGoodHit:Bool = false;
@ -26,9 +30,15 @@ class Note extends FlxSprite
public var modifiedByLua:Bool = false; public var modifiedByLua:Bool = false;
public var sustainLength:Float = 0; public var sustainLength:Float = 0;
public var isSustainNote:Bool = false; public var isSustainNote:Bool = false;
public var originColor:Int = 0; // The sustain note's original note's color
public var noteSection:Int = 0;
public var noteCharterObject:FlxSprite;
public var noteScore:Float = 1; public var noteScore:Float = 1;
public var noteYOff:Int = 0;
public static var swagWidth:Float = 160 * 0.7; public static var swagWidth:Float = 160 * 0.7;
public static var PURP_NOTE:Int = 0; public static var PURP_NOTE:Int = 0;
public static var GREEN_NOTE:Int = 2; public static var GREEN_NOTE:Int = 2;
@ -37,6 +47,20 @@ class Note extends FlxSprite
public var rating:String = "shit"; public var rating:String = "shit";
public var modAngle:Float = 0; // The angle set by modcharts
public var localAngle:Float = 0; // The angle to be edited inside Note.hx
public var dataColor:Array<String> = ['purple', 'blue', 'green', 'red'];
public var quantityColor:Array<Int> = [RED_NOTE, 2, BLUE_NOTE, 2, PURP_NOTE, 2, BLUE_NOTE, 2];
public var arrowAngles:Array<Int> = [180, 90, 270, 0];
public var isParent:Bool = false;
public var parent:Note = null;
public var spotInLine:Int = 0;
public var sustainActive:Bool = true;
public var children:Array<Note> = [];
public function new(strumTime:Float, noteData:Int, ?prevNote:Note, ?sustainNote:Bool = false, ?inCharter:Bool = false) public function new(strumTime:Float, noteData:Int, ?prevNote:Note, ?sustainNote:Bool = false, ?inCharter:Bool = false)
{ {
super(); super();
@ -50,10 +74,24 @@ class Note extends FlxSprite
x += 50; x += 50;
// MAKE SURE ITS DEFINITELY OFF SCREEN? // MAKE SURE ITS DEFINITELY OFF SCREEN?
y -= 2000; y -= 2000;
if (inCharter) if (inCharter)
{
this.strumTime = strumTime; this.strumTime = strumTime;
else rStrumTime = strumTime;
this.strumTime = Math.round(strumTime); }
else
{
this.strumTime = strumTime;
rStrumTime = strumTime - (FlxG.save.data.offset + PlayState.songOffset);
#if sys
if (PlayState.isSM)
{
rStrumTime = Math.round(rStrumTime + Std.parseFloat(PlayState.sm.header.OFFSET));
}
#end
}
if (this.strumTime < 0 ) if (this.strumTime < 0 )
this.strumTime = 0; this.strumTime = 0;
@ -65,84 +103,98 @@ class Note extends FlxSprite
//defaults if no noteStyle was found in chart //defaults if no noteStyle was found in chart
var noteTypeCheck:String = 'normal'; var noteTypeCheck:String = 'normal';
if (PlayState.SONG.noteStyle == null) { if (inCharter)
switch(PlayState.storyWeek) {case 6: noteTypeCheck = 'pixel';}
} else {noteTypeCheck = PlayState.SONG.noteStyle;}
switch (noteTypeCheck)
{ {
case 'pixel': frames = Paths.getSparrowAtlas('NOTE_assets');
loadGraphic(Paths.image('weeb/pixelUI/arrows-pixels','week6'), true, 17, 17);
animation.add('greenScroll', [6]); for (i in 0...4)
animation.add('redScroll', [7]); {
animation.add('blueScroll', [5]); animation.addByPrefix(dataColor[i] + 'Scroll', dataColor[i] + ' alone'); // Normal notes
animation.add('purpleScroll', [4]); animation.addByPrefix(dataColor[i] + 'hold', dataColor[i] + ' hold'); // Hold
animation.addByPrefix(dataColor[i] + 'holdend', dataColor[i] + ' tail'); // Tails
}
if (isSustainNote) setGraphicSize(Std.int(width * 0.7));
updateHitbox();
if(FlxG.save.data.antialiasing)
{ {
loadGraphic(Paths.image('weeb/pixelUI/arrowEnds','week6'), true, 7, 6); antialiasing = true;
animation.add('purpleholdend', [4]);
animation.add('greenholdend', [6]);
animation.add('redholdend', [7]);
animation.add('blueholdend', [5]);
animation.add('purplehold', [0]);
animation.add('greenhold', [2]);
animation.add('redhold', [3]);
animation.add('bluehold', [1]);
} }
setGraphicSize(Std.int(width * PlayState.daPixelZoom));
updateHitbox();
default:
frames = Paths.getSparrowAtlas('NOTE_assets');
animation.addByPrefix('greenScroll', 'green instance 1');
animation.addByPrefix('redScroll', 'red instance 1');
animation.addByPrefix('blueScroll', 'blue instance 1');
animation.addByPrefix('purpleScroll', 'purple instance 1');
animation.addByPrefix('purpleholdend', 'pruple end hold instance 1');
animation.addByPrefix('greenholdend', 'green hold end instance 1');
animation.addByPrefix('redholdend', 'red hold end instance 1');
animation.addByPrefix('blueholdend', 'blue hold end instance 1');
animation.addByPrefix('purplehold', 'purple hold piece instance 1');
animation.addByPrefix('greenhold', 'green hold piece instance 1');
animation.addByPrefix('redhold', 'red hold piece instance 1');
animation.addByPrefix('bluehold', 'blue hold piece instance 1');
setGraphicSize(Std.int(width * 0.7));
updateHitbox();
antialiasing = true;
} }
else
switch (noteData)
{ {
case 0: if (PlayState.SONG.noteStyle == null) {
x += swagWidth * 0; switch(PlayState.storyWeek) {case 6: noteTypeCheck = 'pixel';}
animation.play('purpleScroll'); } else {noteTypeCheck = PlayState.SONG.noteStyle;}
case 1:
x += swagWidth * 1; switch (noteTypeCheck)
animation.play('blueScroll'); {
case 2: case 'pixel':
x += swagWidth * 2; loadGraphic(Paths.image('weeb/pixelUI/arrows-pixels', 'week6'), true, 17, 17);
animation.play('greenScroll'); if (isSustainNote)
case 3: loadGraphic(Paths.image('weeb/pixelUI/arrowEnds', 'week6'), true, 7, 6);
x += swagWidth * 3;
animation.play('redScroll'); for (i in 0...4)
{
animation.add(dataColor[i] + 'Scroll', [i + 4]); // Normal notes
animation.add(dataColor[i] + 'hold', [i]); // Holds
animation.add(dataColor[i] + 'holdend', [i + 4]); // Tails
}
setGraphicSize(Std.int(width * PlayState.daPixelZoom));
updateHitbox();
default:
frames = Paths.getSparrowAtlas('NOTE_assets');
for (i in 0...4)
{
animation.addByPrefix(dataColor[i] + 'Scroll', dataColor[i] + ' alone'); // Normal notes
animation.addByPrefix(dataColor[i] + 'hold', dataColor[i] + ' hold'); // Hold
animation.addByPrefix(dataColor[i] + 'holdend', dataColor[i] + ' tail'); // Tails
}
setGraphicSize(Std.int(width * 0.7));
updateHitbox();
if(FlxG.save.data.antialiasing)
{
antialiasing = true;
}
}
} }
// trace(prevNote); x += swagWidth * noteData;
animation.play(dataColor[noteData] + 'Scroll');
originColor = noteData; // The note's origin color will be checked by its sustain notes
if (FlxG.save.data.stepMania && !isSustainNote)
{
var strumCheck:Float = rStrumTime;
// I give up on fluctuating bpms. something has to be subtracted from strumCheck to make them look right but idk what.
// I'd use the note's section's start time but neither the note's section nor its start time are accessible by themselves
//strumCheck -= ???
var ind:Int = Std.int(Math.round(strumCheck / (Conductor.stepCrochet / 2)));
var col:Int = 0;
col = quantityColor[ind % 8]; // Set the color depending on the beats
animation.play(dataColor[col] + 'Scroll');
localAngle -= arrowAngles[col];
localAngle += arrowAngles[noteData];
originColor = col;
}
// we make sure its downscroll and its a SUSTAIN NOTE (aka a trail, not a note) // we make sure its downscroll and its a SUSTAIN NOTE (aka a trail, not a note)
// and flip it so it doesn't look weird. // and flip it so it doesn't look weird.
// THIS DOESN'T FUCKING FLIP THE NOTE, CONTRIBUTERS DON'T JUST COMMENT THIS OUT JESUS // THIS DOESN'T FUCKING FLIP THE NOTE, CONTRIBUTERS DON'T JUST COMMENT THIS OUT JESUS
// then what is this lol
if (FlxG.save.data.downscroll && sustainNote) if (FlxG.save.data.downscroll && sustainNote)
flipY = true; flipY = true;
var stepHeight = (0.45 * Conductor.stepCrochet * FlxMath.roundDecimal(PlayStateChangeables.scrollSpeed == 1 ? PlayState.SONG.speed : PlayStateChangeables.scrollSpeed, 2));
if (isSustainNote && prevNote != null) if (isSustainNote && prevNote != null)
{ {
noteScore * 0.2; noteScore * 0.2;
@ -150,46 +202,30 @@ class Note extends FlxSprite
x += width / 2; x += width / 2;
switch (noteData) originColor = prevNote.originColor;
{
case 2:
animation.play('greenholdend');
case 3:
animation.play('redholdend');
case 1:
animation.play('blueholdend');
case 0:
animation.play('purpleholdend');
}
animation.play(dataColor[originColor] + 'holdend'); // This works both for normal colors and quantization colors
updateHitbox(); updateHitbox();
x -= width / 2; x -= width / 2;
if (PlayState.curStage.startsWith('school')) //if (noteTypeCheck == 'pixel')
// x += 30;
if (inCharter)
x += 30; x += 30;
if (prevNote.isSustainNote) if (prevNote.isSustainNote)
{ {
switch (prevNote.noteData) prevNote.animation.play(dataColor[prevNote.originColor] + 'hold');
{
case 0:
prevNote.animation.play('purplehold');
case 1:
prevNote.animation.play('bluehold');
case 2:
prevNote.animation.play('greenhold');
case 3:
prevNote.animation.play('redhold');
}
if(FlxG.save.data.scrollSpeed != 1)
prevNote.scale.y *= Conductor.stepCrochet / 100 * 1.5 * FlxG.save.data.scrollSpeed;
else
prevNote.scale.y *= Conductor.stepCrochet / 100 * 1.5 * PlayState.SONG.speed;
prevNote.updateHitbox(); prevNote.updateHitbox();
prevNote.scale.y *= (stepHeight + 1) / prevNote.height; // + 1 so that there's no odd gaps as the notes scroll
prevNote.updateHitbox();
prevNote.noteYOff = Math.round(-prevNote.offset.y);
// prevNote.setGraphicSize(); // prevNote.setGraphicSize();
noteYOff = Math.round(-offset.y);
} }
} }
} }
@ -197,6 +233,15 @@ class Note extends FlxSprite
override function update(elapsed:Float) override function update(elapsed:Float)
{ {
super.update(elapsed); super.update(elapsed);
angle = modAngle + localAngle;
if (!modifiedByLua)
{
if (!sustainActive)
{
alpha = 0.3;
}
}
if (mustPress) if (mustPress)
{ {

30
source/OFLWaveform.hx Normal file
View File

@ -0,0 +1,30 @@
import lime.media.AudioSource;
import lime.media.AudioBuffer;
import openfl.media.Sound;
import openfl.display.Graphics;
import openfl.display.Sprite;
class OFLWaveform extends Sprite
{
public var musicLength = 0;
public var _x = 0;
public var _y = 0;
public var _sound:String;
function new(x,y,musicLength, data:String)
{
super();
_x = x;
_y = y;
_sound = data;
this.musicLength = musicLength;
}
public function drawWaveform()
{
var gfx:Graphics = graphics;
gfx.clear();
}
}

View File

@ -119,6 +119,29 @@ class CpuStrums extends Option
} }
class GraphicLoading extends Option
{
public function new(desc:String)
{
super();
description = desc;
}
public override function press():Bool
{
FlxG.save.data.cacheImages = !FlxG.save.data.cacheImages;
display = updateDisplay();
return true;
}
private override function updateDisplay():String
{
return FlxG.save.data.cacheImages ? "Preload Characters" : "Do not Preload Characters";
}
}
class DownscrollOption extends Option class DownscrollOption extends Option
{ {
public function new(desc:String) public function new(desc:String)
@ -221,6 +244,26 @@ class DistractionsAndEffectsOption extends Option
} }
} }
class StepManiaOption extends Option
{
public function new(desc:String)
{
super();
description = desc;
}
public override function press():Bool
{
FlxG.save.data.stepMania = !FlxG.save.data.stepMania;
display = updateDisplay();
return true;
}
private override function updateDisplay():String
{
return "Colors by quantization " + (!FlxG.save.data.stepMania ? "off" : "on");
}
}
class ResetButtonOption extends Option class ResetButtonOption extends Option
{ {
public function new(desc:String) public function new(desc:String)
@ -261,6 +304,46 @@ class FlashingLightsOption extends Option
} }
} }
class AntialiasingOption extends Option
{
public function new(desc:String)
{
super();
description = desc;
}
public override function press():Bool
{
FlxG.save.data.antialiasing = !FlxG.save.data.antialiasing;
display = updateDisplay();
return true;
}
private override function updateDisplay():String
{
return "Antialiasing " + (!FlxG.save.data.antialiasing ? "off" : "on");
}
}
class MissSoundsOption extends Option
{
public function new(desc:String)
{
super();
description = desc;
}
public override function press():Bool
{
FlxG.save.data.missSounds = !FlxG.save.data.missSounds;
display = updateDisplay();
return true;
}
private override function updateDisplay():String
{
return "Miss Sounds " + (!FlxG.save.data.missSounds ? "off" : "on");
}
}
class ShowInput extends Option class ShowInput extends Option
{ {
public function new(desc:String) public function new(desc:String)
@ -698,3 +781,128 @@ class CamZoomOption extends Option
return "Camera Zoom " + (!FlxG.save.data.camzoom ? "off" : "on"); return "Camera Zoom " + (!FlxG.save.data.camzoom ? "off" : "on");
} }
} }
class LockWeeksOption extends Option
{
var confirm:Bool = false;
public function new(desc:String)
{
super();
description = desc;
}
public override function press():Bool
{
if(!confirm)
{
confirm = true;
display = updateDisplay();
return true;
}
FlxG.save.data.weekUnlocked = 1;
StoryMenuState.weekUnlocked = [true, true];
trace('Weeks Locked');
display = updateDisplay();
return true;
}
private override function updateDisplay():String
{
return confirm ? "Confirm Story Reset" : "Reset Story Progress";
}
}
class ResetScoreOption extends Option
{
var confirm:Bool = false;
public function new(desc:String)
{
super();
description = desc;
}
public override function press():Bool
{
if(!confirm)
{
confirm = true;
display = updateDisplay();
return true;
}
FlxG.save.data.songScores = null;
for(key in Highscore.songScores.keys())
{
Highscore.songScores[key] = 0;
}
FlxG.save.data.songCombos = null;
for(key in Highscore.songCombos.keys())
{
Highscore.songCombos[key] = '';
}
confirm = false;
trace('Highscores Wiped');
display = updateDisplay();
return true;
}
private override function updateDisplay():String
{
return confirm ? "Confirm Score Reset" : "Reset Score";
}
}
class ResetSettings extends Option
{
var confirm:Bool = false;
public function new(desc:String)
{
super();
description = desc;
}
public override function press():Bool
{
if(!confirm)
{
confirm = true;
display = updateDisplay();
return true;
}
FlxG.save.data.weekUnlocked = null;
FlxG.save.data.newInput = null;
FlxG.save.data.downscroll = null;
FlxG.save.data.dfjk = null;
FlxG.save.data.accuracyDisplay = null;
FlxG.save.data.offset = null;
FlxG.save.data.songPosition = null;
FlxG.save.data.fps = null;
FlxG.save.data.changedHit = null;
FlxG.save.data.fpsRain = null;
FlxG.save.data.fpsCap = null;
FlxG.save.data.scrollSpeed = null;
FlxG.save.data.npsDisplay = null;
FlxG.save.data.frames = null;
FlxG.save.data.accuracyMod = null;
FlxG.save.data.watermark = null;
FlxG.save.data.ghost = null;
FlxG.save.data.distractions = null;
FlxG.save.data.flashing = null;
FlxG.save.data.resetButton = null;
FlxG.save.data.botplay = null;
FlxG.save.data.cpuStrums = null;
FlxG.save.data.strumline = null;
FlxG.save.data.customStrumLine = null;
FlxG.save.data.camzoom = null;
FlxG.save.data.stepMania = null;
KadeEngineData.initSave();
confirm = false;
trace('All settings have been reset');
display = updateDisplay();
return true;
}
private override function updateDisplay():String
{
return confirm ? "Confirm Settings Reset" : "Reset Settings";
}
}

View File

@ -27,41 +27,49 @@ class OptionsMenu extends MusicBeatState
var options:Array<OptionCategory> = [ var options:Array<OptionCategory> = [
new OptionCategory("Gameplay", [ new OptionCategory("Gameplay", [
new DFJKOption(controls), new DFJKOption(controls),
new DownscrollOption("Change the layout of the strumline."), new DownscrollOption("Toggle making the notes scroll down rather than up."),
new GhostTapOption("Ghost Tapping is when you tap a direction and it doesn't give you a miss."), new GhostTapOption("Toggle counting pressing a directional input when no arrow is there as a miss."),
new Judgement("Customize your Hit Timings (LEFT or RIGHT)"), new Judgement("Customize your Hit Timings. (LEFT or RIGHT)"),
#if desktop #if desktop
new FPSCapOption("Cap your FPS"), new FPSCapOption("Change your FPS Cap."),
#end #end
new ScrollSpeedOption("Change your scroll speed (1 = Chart dependent)"), new ScrollSpeedOption("Change your scroll speed. (1 = Chart dependent)"),
new AccuracyDOption("Change how accuracy is calculated. (Accurate = Simple, Complex = Milisecond Based)"), new AccuracyDOption("Change how accuracy is calculated. (Accurate = Simple, Complex = Milisecond Based)"),
new ResetButtonOption("Toggle pressing R to gameover."), new ResetButtonOption("Toggle pressing R to gameover."),
// new OffsetMenu("Get a note offset based off of your inputs!"), // new OffsetMenu("Get a note offset based off of your inputs!"),
new CustomizeGameplay("Drag'n'Drop Gameplay Modules around to your preference") new CustomizeGameplay("Drag and drop gameplay modules to your prefered positions!")
]), ]),
new OptionCategory("Appearance", [ new OptionCategory("Appearance", [
new DistractionsAndEffectsOption("Toggle stage distractions that can hinder your gameplay."), new DistractionsAndEffectsOption("Toggle stage distractions that can hinder your gameplay."),
new CamZoomOption("Toggle the camera zoom in-game."), new CamZoomOption("Toggle the camera zoom in-game."),
#if desktop new StepManiaOption("Sets the colors of the arrows depending on quantization instead of direction."),
new RainbowFPSOption("Make the FPS Counter Rainbow"), new AccuracyOption("Display accuracy information on the info bar."),
new AccuracyOption("Display accuracy information."), new SongPositionOption("Show the song's current position as a scrolling bar."),
new NPSDisplayOption("Shows your current Notes Per Second."), new NPSDisplayOption("Shows your current Notes Per Second on the info bar."),
new SongPositionOption("Show the songs current position (as a bar)"), new RainbowFPSOption("Make the FPS Counter flicker through rainbow colors."),
new CpuStrums("CPU's strumline lights up when a note hits it."), new CpuStrums("Toggle the CPU's strumline lighting up when it hits a note."),
#end
]), ]),
new OptionCategory("Misc", [ new OptionCategory("Misc", [
#if desktop
new FPSOption("Toggle the FPS Counter"), new FPSOption("Toggle the FPS Counter"),
new ReplayOption("View replays"),
#end
new FlashingLightsOption("Toggle flashing lights that can cause epileptic seizures and strain."), new FlashingLightsOption("Toggle flashing lights that can cause epileptic seizures and strain."),
new WatermarkOption("Enable and disable all watermarks from the engine."), new WatermarkOption("Enable and disable all watermarks from the engine."),
new AntialiasingOption("Toggle antialiasing, improving graphics quality at a slight performance penalty."),
new MissSoundsOption("Toggle miss sounds playing when you don't hit a note."),
new ScoreScreen("Show the score screen after the end of a song"), new ScoreScreen("Show the score screen after the end of a song"),
new ShowInput("Display every single input in the score screen."), new ShowInput("Display every single input on the score screen."),
new Optimization("No backgrounds, no characters, centered notes, no player 2."), new Optimization("No characters or backgrounds. Just a usual rhythm game layout."),
new BotPlay("Showcase your charts and mods with autoplay."), new GraphicLoading("On startup, cache every character. Significantly decrease load times. (HIGH MEMORY)"),
new BotPlay("Showcase your charts and mods with autoplay.")
]),
new OptionCategory("Saves and Data", [
#if desktop
new ReplayOption("View saved song replays."),
#end
new ResetScoreOption("Reset your score on all songs and weeks. This is irreversible!"),
new LockWeeksOption("Reset your story mode progress. This is irreversible!"),
new ResetSettings("Reset ALL your settings. This is irreversible!")
]) ])
]; ];
@ -83,7 +91,10 @@ class OptionsMenu extends MusicBeatState
menuBG.setGraphicSize(Std.int(menuBG.width * 1.1)); menuBG.setGraphicSize(Std.int(menuBG.width * 1.1));
menuBG.updateHitbox(); menuBG.updateHitbox();
menuBG.screenCenter(); menuBG.screenCenter();
menuBG.antialiasing = true; if(FlxG.save.data.antialiasing)
{
menuBG.antialiasing = true;
}
add(menuBG); add(menuBG);
grpControls = new FlxTypedGroup<Alphabet>(); grpControls = new FlxTypedGroup<Alphabet>();

View File

@ -32,6 +32,10 @@ class OutdatedSubState extends MusicBeatState
bg.scale.x *= 1.55; bg.scale.x *= 1.55;
bg.scale.y *= 1.55; bg.scale.y *= 1.55;
bg.screenCenter(); bg.screenCenter();
if(FlxG.save.data.antialiasing)
{
bg.antialiasing = true;
}
add(bg); add(bg);
var kadeLogo:FlxSprite = new FlxSprite(FlxG.width, 0).loadGraphic(Paths.image('KadeEngineLogo')); var kadeLogo:FlxSprite = new FlxSprite(FlxG.width, 0).loadGraphic(Paths.image('KadeEngineLogo'));
@ -40,6 +44,10 @@ class OutdatedSubState extends MusicBeatState
kadeLogo.x -= kadeLogo.frameHeight; kadeLogo.x -= kadeLogo.frameHeight;
kadeLogo.y -= 180; kadeLogo.y -= 180;
kadeLogo.alpha = 0.8; kadeLogo.alpha = 0.8;
if(FlxG.save.data.antialiasing)
{
kadeLogo.antialiasing = true;
}
add(kadeLogo); add(kadeLogo);
var txt:FlxText = new FlxText(0, 0, FlxG.width, var txt:FlxText = new FlxText(0, 0, FlxG.width,
@ -51,6 +59,13 @@ class OutdatedSubState extends MusicBeatState
+ "\n& more changes and bugfixes in the full changelog" + "\n& more changes and bugfixes in the full changelog"
+ "\n\nPress Space to view the full changelog and update\nor ESCAPE to ignore this", + "\n\nPress Space to view the full changelog and update\nor ESCAPE to ignore this",
32); 32);
if (MainMenuState.nightly != "")
txt.text =
"You are on\n"
+ MainMenuState.kadeEngineVer
+ "\nWhich is a PRE-RELEASE BUILD!"
+ "\n\nReport all bugs to the author of the pre-release.\nSpace/Escape ignores this.";
txt.setFormat("VCR OSD Mono", 32, FlxColor.fromRGB(200, 200, 200), CENTER); txt.setFormat("VCR OSD Mono", 32, FlxColor.fromRGB(200, 200, 200), CENTER);
txt.borderColor = FlxColor.BLACK; txt.borderColor = FlxColor.BLACK;
@ -84,10 +99,15 @@ class OutdatedSubState extends MusicBeatState
override function update(elapsed:Float) override function update(elapsed:Float)
{ {
if (controls.ACCEPT) if (controls.ACCEPT && MainMenuState.nightly == "")
{ {
fancyOpenURL("https://kadedev.github.io/Kade-Engine/changelogs/changelog-" + needVer); fancyOpenURL("https://kadedev.github.io/Kade-Engine/changelogs/changelog-" + needVer);
} }
else if (controls.ACCEPT)
{
leftState = true;
FlxG.switchState(new MainMenuState());
}
if (controls.BACK) if (controls.BACK)
{ {
leftState = true; leftState = true;

View File

@ -1,5 +1,8 @@
package; package;
import openfl.utils.Assets;
import flixel.graphics.FlxGraphic;
import flixel.system.FlxAssets.FlxGraphicAsset;
import flixel.FlxG; import flixel.FlxG;
import flixel.graphics.frames.FlxAtlasFrames; import flixel.graphics.frames.FlxAtlasFrames;
import openfl.utils.AssetType; import openfl.utils.AssetType;
@ -50,7 +53,7 @@ class Paths
return 'assets/$file'; return 'assets/$file';
} }
inline static public function file(file:String, type:AssetType = TEXT, ?library:String) inline static public function file(file:String, ?library:String, type:AssetType = TEXT)
{ {
return getPath(file, type, library); return getPath(file, type, library);
} }
@ -67,7 +70,7 @@ class Paths
inline static public function txt(key:String, ?library:String) inline static public function txt(key:String, ?library:String)
{ {
return getPath('data/$key.txt', TEXT, library); return getPath('$key.txt', TEXT, library);
} }
inline static public function xml(key:String, ?library:String) inline static public function xml(key:String, ?library:String)
@ -125,13 +128,48 @@ class Paths
return 'assets/fonts/$key'; return 'assets/fonts/$key';
} }
inline static public function getSparrowAtlas(key:String, ?library:String) inline static public function getSparrowAtlas(key:String, ?library:String, ?isCharacter:Bool = false)
{ {
var usecahce = FlxG.save.data.cacheImages;
#if !cpp
usecahce = false;
#end
if (isCharacter)
if (usecahce)
#if cpp
return FlxAtlasFrames.fromSparrow(imageCached(key), file('images/characters/$key.xml', library));
#else
return null;
#end
else
return FlxAtlasFrames.fromSparrow(image('characters/$key', library), file('images/characters/$key.xml', library));
return FlxAtlasFrames.fromSparrow(image(key, library), file('images/$key.xml', library)); return FlxAtlasFrames.fromSparrow(image(key, library), file('images/$key.xml', library));
} }
inline static public function getPackerAtlas(key:String, ?library:String) #if cpp
inline static public function imageCached(key:String):FlxGraphic
{ {
var data = Caching.bitmapData.get(key);
trace('finding ${key} - ${data.bitmap}');
return data;
}
#end
inline static public function getPackerAtlas(key:String, ?library:String, ?isCharacter:Bool = false)
{
var usecahce = FlxG.save.data.cacheImages;
#if !cpp
usecahce = false;
#end
if (isCharacter)
if (usecahce)
#if cpp
return FlxAtlasFrames.fromSpriteSheetPacker(imageCached(key), file('images/$key.txt', library));
#else
return null;
#end
else
return FlxAtlasFrames.fromSpriteSheetPacker(image('characters/$key'), file('images/characters/$key.txt', library));
return FlxAtlasFrames.fromSpriteSheetPacker(image(key, library), file('images/$key.txt', library)); return FlxAtlasFrames.fromSpriteSheetPacker(image(key, library), file('images/$key.txt', library));
} }
} }

View File

@ -133,6 +133,11 @@ class PauseSubState extends MusicBeatSubstate
} }
var songPath = 'assets/data/' + songLowercase + '/'; var songPath = 'assets/data/' + songLowercase + '/';
#if sys
if (PlayState.isSM && !PlayState.isStoryMode)
songPath = PlayState.pathToSm;
#end
if (controls.UP_P || upPcontroller) if (controls.UP_P || upPcontroller)
{ {
changeSelection(-1); changeSelection(-1);
@ -209,6 +214,7 @@ class PauseSubState extends MusicBeatSubstate
case "Resume": case "Resume":
close(); close();
case "Restart Song": case "Restart Song":
PlayState.startTime = 0;
if (PlayState.instance.useVideo) if (PlayState.instance.useVideo)
{ {
GlobalVideo.get().stop(); GlobalVideo.get().stop();
@ -217,6 +223,7 @@ class PauseSubState extends MusicBeatSubstate
} }
FlxG.resetState(); FlxG.resetState();
case "Exit to menu": case "Exit to menu":
PlayState.startTime = 0;
if (PlayState.instance.useVideo) if (PlayState.instance.useVideo)
{ {
GlobalVideo.get().stop(); GlobalVideo.get().stop();
@ -240,7 +247,10 @@ class PauseSubState extends MusicBeatSubstate
if (FlxG.save.data.fpsCap > 290) if (FlxG.save.data.fpsCap > 290)
(cast (Lib.current.getChildAt(0), Main)).setFPSCap(290); (cast (Lib.current.getChildAt(0), Main)).setFPSCap(290);
FlxG.switchState(new MainMenuState()); if (PlayState.isStoryMode)
FlxG.switchState(new StoryMenuState());
else
FlxG.switchState(new FreeplayState());
} }
} }
@ -261,6 +271,8 @@ class PauseSubState extends MusicBeatSubstate
function changeSelection(change:Int = 0):Void function changeSelection(change:Int = 0):Void
{ {
curSelected += change; curSelected += change;
FlxG.sound.play(Paths.sound('scrollMenu'), 0.4);
if (curSelected < 0) if (curSelected < 0)
curSelected = menuItems.length - 1; curSelected = menuItems.length - 1;
@ -284,4 +296,4 @@ class PauseSubState extends MusicBeatSubstate
} }
} }
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -45,8 +45,10 @@ typedef ReplayJSON =
public var songNotes:Array<Dynamic>; public var songNotes:Array<Dynamic>;
public var songJudgements:Array<String>; public var songJudgements:Array<String>;
public var noteSpeed:Float; public var noteSpeed:Float;
public var chartPath:String;
public var isDownscroll:Bool; public var isDownscroll:Bool;
public var sf:Int; public var sf:Int;
public var sm:Bool;
public var ana:Analysis; public var ana:Analysis;
} }
@ -66,6 +68,8 @@ class Replay
isDownscroll: false, isDownscroll: false,
songNotes: [], songNotes: [],
replayGameVer: version, replayGameVer: version,
chartPath: "",
sm: false,
timestamp: Date.now(), timestamp: Date.now(),
sf: Conductor.safeFrames, sf: Conductor.safeFrames,
ana: new Analysis(), ana: new Analysis(),
@ -86,20 +90,28 @@ class Replay
public function SaveReplay(notearray:Array<Dynamic>, judge:Array<String>, ana:Analysis) public function SaveReplay(notearray:Array<Dynamic>, judge:Array<String>, ana:Analysis)
{ {
#if sys
var chartPath = PlayState.isSM ? PlayState.pathToSm + "/converted.json" : "";
#else
var chartPath = "";
#end
var json = { var json = {
"songName": PlayState.SONG.song, "songName": PlayState.SONG.song,
"songDiff": PlayState.storyDifficulty, "songDiff": PlayState.storyDifficulty,
"chartPath": chartPath,
"sm": PlayState.isSM,
"timestamp": Date.now(),
"replayGameVer": version,
"sf": Conductor.safeFrames,
"noteSpeed": (FlxG.save.data.scrollSpeed > 1 ? FlxG.save.data.scrollSpeed : PlayState.SONG.speed), "noteSpeed": (FlxG.save.data.scrollSpeed > 1 ? FlxG.save.data.scrollSpeed : PlayState.SONG.speed),
"isDownscroll": FlxG.save.data.downscroll, "isDownscroll": FlxG.save.data.downscroll,
"songNotes": notearray, "songNotes": notearray,
"songJudgements": judge, "songJudgements": judge,
"timestamp": Date.now(),
"replayGameVer": version,
"sf": Conductor.safeFrames,
"ana": ana "ana": ana
}; };
var data:String = Json.stringify(json); var data:String = Json.stringify(json, null, "");
var time = Date.now().getTime(); var time = Date.now().getTime();

View File

@ -1,5 +1,10 @@
package; package;
import haxe.Exception;
#if sys
import smTools.SMFile;
import sys.FileSystem;
import sys.io.File;
#end
import openfl.geom.Matrix; import openfl.geom.Matrix;
import openfl.display.BitmapData; import openfl.display.BitmapData;
import flixel.system.FlxSound; import flixel.system.FlxSound;
@ -54,9 +59,13 @@ class ResultsScreen extends FlxSubState
background.scrollFactor.set(); background.scrollFactor.set();
add(background); add(background);
music = new FlxSound().loadEmbedded(Paths.music('breakfast'), true, true); if (!PlayState.inResults)
music.volume = 0; {
music.play(false, FlxG.random.int(0, Std.int(music.length / 2))); music = new FlxSound().loadEmbedded(Paths.music('breakfast'), true, true);
music.volume = 0;
music.play(false, FlxG.random.int(0, Std.int(music.length / 2)));
FlxG.sound.list.add(music);
}
background.alpha = 0; background.alpha = 0;
@ -74,7 +83,7 @@ class ResultsScreen extends FlxSubState
text.text = "Week Cleared!"; text.text = "Week Cleared!";
} }
comboText = new FlxText(20,-75,0,'Judgements:\nSicks - ${PlayState.sicks}\nGoods - ${PlayState.goods}\nBads - ${PlayState.bads}\n\nCombo Breaks: ${(PlayState.isStoryMode ? PlayState.campaignMisses : PlayState.misses)}\nHighest Combo: ${PlayState.highestCombo + 1}\n\nScore: ${PlayState.instance.songScore}\nAccuracy: ${HelperFunctions.truncateFloat(PlayState.instance.accuracy,2)}%\n\n${Ratings.GenerateLetterRank(PlayState.instance.accuracy)}\n\nF1 - View replay\nF2 - Replay song comboText = new FlxText(20,-75,0,'Judgements:\nSicks - ${PlayState.sicks}\nGoods - ${PlayState.goods}\nBads - ${PlayState.bads}\n\nCombo Breaks: ${(PlayState.isStoryMode ? PlayState.campaignMisses : PlayState.misses)}\nHighest Combo: ${PlayState.highestCombo + 1}\nScore: ${PlayState.instance.songScore}\nAccuracy: ${HelperFunctions.truncateFloat(PlayState.instance.accuracy,2)}%\n\n${Ratings.GenerateLetterRank(PlayState.instance.accuracy)}\n\n${!PlayState.loadRep ? "F1 - View replay\nF2 - Replay song" : ""}
'); ');
comboText.size = 28; comboText.size = 28;
comboText.setBorderStyle(FlxTextBorderStyle.OUTLINE,FlxColor.BLACK,4,1); comboText.setBorderStyle(FlxTextBorderStyle.OUTLINE,FlxColor.BLACK,4,1);
@ -130,7 +139,8 @@ class ResultsScreen extends FlxSubState
var diff = obj[3]; var diff = obj[3];
var judge = obj2; var judge = obj2;
mean += diff; if (diff != (166 * Math.floor((PlayState.rep.replay.sf / 60) * 1000) / 166))
mean += diff;
if (obj[1] != -1) if (obj[1] != -1)
graph.addToHistory(diff, judge, obj3); graph.addToHistory(diff, judge, obj3);
} }
@ -167,8 +177,8 @@ class ResultsScreen extends FlxSubState
override function update(elapsed:Float) override function update(elapsed:Float)
{ {
if (music.volume < 0.5) if (music != null && music.volume < 0.5)
music.volume += 0.01 * elapsed; music.volume += 0.01 * elapsed;
// keybinds // keybinds
@ -193,18 +203,20 @@ class ResultsScreen extends FlxSubState
if (PlayState.isStoryMode) if (PlayState.isStoryMode)
{ {
FlxG.sound.playMusic(Paths.music('freakyMenu')); FlxG.sound.playMusic(Paths.music('freakyMenu'));
Conductor.changeBPM(102);
FlxG.switchState(new MainMenuState()); FlxG.switchState(new MainMenuState());
} }
else else
FlxG.switchState(new FreeplayState()); FlxG.switchState(new FreeplayState());
} }
if (FlxG.keys.justPressed.F1) if (FlxG.keys.justPressed.F1 && !PlayState.loadRep)
{ {
trace(PlayState.rep.path); trace(PlayState.rep.path);
PlayState.rep = Replay.LoadReplay(PlayState.rep.path); PlayState.rep = Replay.LoadReplay(PlayState.rep.path);
PlayState.loadRep = true; PlayState.loadRep = true;
PlayState.isSM = PlayState.rep.replay.sm;
var songFormat = StringTools.replace(PlayState.rep.replay.songName, " ", "-"); var songFormat = StringTools.replace(PlayState.rep.replay.songName, " ", "-");
switch (songFormat) { switch (songFormat) {
@ -226,18 +238,49 @@ class ResultsScreen extends FlxSubState
Highscore.saveCombo(songHighscore, Ratings.GenerateLetterRank(PlayState.instance.accuracy),PlayState.storyDifficulty); Highscore.saveCombo(songHighscore, Ratings.GenerateLetterRank(PlayState.instance.accuracy),PlayState.storyDifficulty);
#end #end
var poop:String = Highscore.formatSong(songFormat, PlayState.rep.replay.songDiff); #if sys
if (PlayState.rep.replay.sm)
if (!FileSystem.exists(StringTools.replace(PlayState.rep.replay.chartPath,"converted.json","")))
{
Application.current.window.alert("The SM file in this replay does not exist!","SM Replays");
return;
}
#end
var poop = "";
#if sys
if (PlayState.isSM)
{
poop = File.getContent(PlayState.rep.replay.chartPath);
try
{
PlayState.sm = SMFile.loadFile(PlayState.pathToSm + "/" + StringTools.replace(PlayState.rep.replay.songName," ", "_") + ".sm");
}
catch(e:Exception)
{
Application.current.window.alert("Make sure that the SM file is called " + PlayState.pathToSm + "/" + StringTools.replace(PlayState.rep.replay.songName," ", "_") + ".sm!\nAs I couldn't read it.","SM Replays");
return;
}
}
else
poop = Highscore.formatSong(songFormat, PlayState.rep.replay.songDiff);
#else
poop = Highscore.formatSong(PlayState.rep.replay.songName, PlayState.rep.replay.songDiff);
#end
music.fadeOut(0.3); music.fadeOut(0.3);
PlayState.SONG = Song.loadFromJson(poop, PlayState.rep.replay.songName); if (PlayState.isSM)
PlayState.SONG = Song.loadFromJsonRAW(poop);
else
PlayState.SONG = Song.loadFromJson(poop, PlayState.rep.replay.songName);
PlayState.isStoryMode = false; PlayState.isStoryMode = false;
PlayState.storyDifficulty = PlayState.rep.replay.songDiff; PlayState.storyDifficulty = PlayState.rep.replay.songDiff;
PlayState.storyWeek = 0;
LoadingState.loadAndSwitchState(new PlayState()); LoadingState.loadAndSwitchState(new PlayState());
} }
if (FlxG.keys.justPressed.F2 ) if (FlxG.keys.justPressed.F2 && !PlayState.loadRep)
{ {
PlayState.rep = null; PlayState.rep = null;
@ -264,12 +307,12 @@ class ResultsScreen extends FlxSubState
var poop:String = Highscore.formatSong(songFormat, PlayState.storyDifficulty); var poop:String = Highscore.formatSong(songFormat, PlayState.storyDifficulty);
music.fadeOut(0.3); if (music != null)
music.fadeOut(0.3);
PlayState.SONG = Song.loadFromJson(poop, PlayState.SONG.song); PlayState.SONG = Song.loadFromJson(poop, PlayState.SONG.song);
PlayState.isStoryMode = false; PlayState.isStoryMode = false;
PlayState.storyDifficulty = PlayState.storyDifficulty; PlayState.storyDifficulty = PlayState.storyDifficulty;
PlayState.storyWeek = 0;
LoadingState.loadAndSwitchState(new PlayState()); LoadingState.loadAndSwitchState(new PlayState());
} }

View File

@ -2,7 +2,9 @@ package;
typedef SwagSection = typedef SwagSection =
{ {
var sectionNotes:Array<Dynamic>; var startTime:Float;
var endTime:Float;
var sectionNotes:Array<Array<Dynamic>>;
var lengthInSteps:Int; var lengthInSteps:Int;
var typeOfSection:Int; var typeOfSection:Int;
var mustHitSection:Bool; var mustHitSection:Bool;
@ -13,7 +15,9 @@ typedef SwagSection =
class Section class Section
{ {
public var sectionNotes:Array<Dynamic> = []; public var startTime:Float = 0;
public var endTime:Float = 0;
public var sectionNotes:Array<Array<Dynamic>> = [];
public var lengthInSteps:Int = 16; public var lengthInSteps:Int = 16;
public var typeOfSection:Int = 0; public var typeOfSection:Int = 0;

32
source/SectionRender.hx Normal file
View File

@ -0,0 +1,32 @@
import flixel.FlxG;
import flixel.util.FlxColor;
import flixel.group.FlxGroup.FlxTypedGroup;
import Section.SwagSection;
import flixel.addons.display.FlxGridOverlay;
import flixel.FlxSprite;
class SectionRender extends FlxSprite
{
public var section:SwagSection;
public var icon:FlxSprite;
public var lastUpdated:Bool;
public function new(x:Float,y:Float,GRID_SIZE:Int, ?Height:Int = 16)
{
super(x,y);
makeGraphic(GRID_SIZE * 8, GRID_SIZE * Height,FlxColor.BLACK);
var h = GRID_SIZE;
if (Math.floor(h) != h)
h = GRID_SIZE;
FlxGridOverlay.overlay(this,GRID_SIZE, Std.int(h), GRID_SIZE * 8,GRID_SIZE * Height);
}
override function update(elapsed)
{
}
}

View File

@ -7,10 +7,28 @@ import lime.utils.Assets;
using StringTools; using StringTools;
class Event
{
public var name:String;
public var position:Float;
public var value:Dynamic;
public var type:String;
public function new(name:String,pos:Float,value:Dynamic,type:String)
{
this.name = name;
this.position = pos;
this.value = value;
this.type = type;
}
}
typedef SwagSong = typedef SwagSong =
{ {
var chartVersion:String;
var song:String; var song:String;
var notes:Array<SwagSection>; var notes:Array<SwagSection>;
var eventObjects:Array<Event>;
var bpm:Float; var bpm:Float;
var needsVoices:Bool; var needsVoices:Bool;
var speed:Float; var speed:Float;
@ -25,10 +43,12 @@ typedef SwagSong =
class Song class Song
{ {
public var chartVersion:String;
public var song:String; public var song:String;
public var notes:Array<SwagSection>; public var notes:Array<SwagSection>;
public var bpm:Float; public var bpm:Float;
public var needsVoices:Bool = true; public var needsVoices:Bool = true;
public var eventObjects:Array<Event>;
public var speed:Float = 1; public var speed:Float = 1;
public var player1:String = 'bf'; public var player1:String = 'bf';
@ -44,10 +64,19 @@ class Song
this.bpm = bpm; this.bpm = bpm;
} }
public static function loadFromJsonRAW(rawJson:String)
{
while (!rawJson.endsWith("}"))
{
rawJson = rawJson.substr(0, rawJson.length - 1);
// LOL GOING THROUGH THE BULLSHIT TO CLEAN IDK WHATS STRANGE
}
return parseJSONshit(rawJson);
}
public static function loadFromJson(jsonInput:String, ?folder:String):SwagSong public static function loadFromJson(jsonInput:String, ?folder:String):SwagSong
{ {
trace(jsonInput);
// pre lowercasing the folder name // pre lowercasing the folder name
var folderLowercase = StringTools.replace(folder, " ", "-").toLowerCase(); var folderLowercase = StringTools.replace(folder, " ", "-").toLowerCase();
switch (folderLowercase) { switch (folderLowercase) {

View File

@ -24,18 +24,21 @@ class StoryMenuState extends MusicBeatState
{ {
var scoreText:FlxText; var scoreText:FlxText;
var weekData:Array<Dynamic> = [ static function weekData():Array<Dynamic>
['Tutorial'], {
['Bopeebo', 'Fresh', 'Dad Battle'], return [
['Spookeez', 'South', "Monster"], ['Tutorial'],
['Pico', 'Philly Nice', "Blammed"], ['Bopeebo', 'Fresh', 'Dad Battle'],
['Satin Panties', "High", "Milf"], ['Spookeez', 'South', "Monster"],
['Cocoa', 'Eggnog', 'Winter Horrorland'], ['Pico', 'Philly Nice', "Blammed"],
['Senpai', 'Roses', 'Thorns'] ['Satin Panties', "High", "Milf"],
]; ['Cocoa', 'Eggnog', 'Winter Horrorland'],
['Senpai', 'Roses', 'Thorns']
];
}
var curDifficulty:Int = 1; var curDifficulty:Int = 1;
public static var weekUnlocked:Array<Bool> = [true, true, true, true, true, true, true]; public static var weekUnlocked:Array<Bool> = [];
var weekCharacters:Array<Dynamic> = [ var weekCharacters:Array<Dynamic> = [
['', 'bf', 'gf'], ['', 'bf', 'gf'],
@ -47,15 +50,7 @@ class StoryMenuState extends MusicBeatState
['senpai', 'bf', 'gf'] ['senpai', 'bf', 'gf']
]; ];
var weekNames:Array<String> = [ var weekNames:Array<String> = CoolUtil.coolTextFile(Paths.txt('data/weekNames'));
"",
"Daddy Dearest",
"Spooky Month",
"PICO",
"MOMMY MUST MURDER",
"RED SNOW",
"Hating Simulator ft. Moawling"
];
var txtWeekTitle:FlxText; var txtWeekTitle:FlxText;
@ -73,8 +68,28 @@ class StoryMenuState extends MusicBeatState
var leftArrow:FlxSprite; var leftArrow:FlxSprite;
var rightArrow:FlxSprite; var rightArrow:FlxSprite;
function unlockWeeks():Array<Bool>
{
var weeks:Array<Bool> = [];
#if debug
for(i in 0...weekNames.length)
weeks.push(true);
return weeks;
#end
weeks.push(true);
for(i in 0...FlxG.save.data.weekUnlocked)
{
weeks.push(true);
}
return weeks;
}
override function create() override function create()
{ {
weekUnlocked = unlockWeeks();
#if windows #if windows
// Updating Discord Rich Presence // Updating Discord Rich Presence
DiscordClient.changePresence("In the Story Mode Menu", null); DiscordClient.changePresence("In the Story Mode Menu", null);
@ -86,7 +101,10 @@ class StoryMenuState extends MusicBeatState
if (FlxG.sound.music != null) if (FlxG.sound.music != null)
{ {
if (!FlxG.sound.music.playing) if (!FlxG.sound.music.playing)
{
FlxG.sound.playMusic(Paths.music('freakyMenu')); FlxG.sound.playMusic(Paths.music('freakyMenu'));
Conductor.changeBPM(102);
}
} }
persistentUpdate = persistentDraw = true; persistentUpdate = persistentDraw = true;
@ -110,17 +128,17 @@ class StoryMenuState extends MusicBeatState
grpWeekText = new FlxTypedGroup<MenuItem>(); grpWeekText = new FlxTypedGroup<MenuItem>();
add(grpWeekText); add(grpWeekText);
grpLocks = new FlxTypedGroup<FlxSprite>();
add(grpLocks);
var blackBarThingie:FlxSprite = new FlxSprite().makeGraphic(FlxG.width, 56, FlxColor.BLACK); var blackBarThingie:FlxSprite = new FlxSprite().makeGraphic(FlxG.width, 56, FlxColor.BLACK);
add(blackBarThingie); add(blackBarThingie);
grpWeekCharacters = new FlxTypedGroup<MenuCharacter>(); grpWeekCharacters = new FlxTypedGroup<MenuCharacter>();
grpLocks = new FlxTypedGroup<FlxSprite>();
add(grpLocks);
trace("Line 70"); trace("Line 70");
for (i in 0...weekData.length) for (i in 0...weekData().length)
{ {
var weekThing:MenuItem = new MenuItem(0, yellowBG.y + yellowBG.height + 10, i); var weekThing:MenuItem = new MenuItem(0, yellowBG.y + yellowBG.height + 10, i);
weekThing.y += ((weekThing.height + 20) * i); weekThing.y += ((weekThing.height + 20) * i);
@ -128,18 +146,25 @@ class StoryMenuState extends MusicBeatState
grpWeekText.add(weekThing); grpWeekText.add(weekThing);
weekThing.screenCenter(X); weekThing.screenCenter(X);
weekThing.antialiasing = true; if(FlxG.save.data.antialiasing)
{
weekThing.antialiasing = true;
}
// weekThing.updateHitbox(); // weekThing.updateHitbox();
// Needs an offset thingie // Needs an offset thingie
if (!weekUnlocked[i]) if (!weekUnlocked[i])
{ {
trace('locking week ' + i);
var lock:FlxSprite = new FlxSprite(weekThing.width + 10 + weekThing.x); var lock:FlxSprite = new FlxSprite(weekThing.width + 10 + weekThing.x);
lock.frames = ui_tex; lock.frames = ui_tex;
lock.animation.addByPrefix('lock', 'lock'); lock.animation.addByPrefix('lock', 'lock');
lock.animation.play('lock'); lock.animation.play('lock');
lock.ID = i; lock.ID = i;
lock.antialiasing = true; if(FlxG.save.data.antialiasing)
{
lock.antialiasing = true;
}
grpLocks.add(lock); grpLocks.add(lock);
} }
} }
@ -195,6 +220,19 @@ class StoryMenuState extends MusicBeatState
updateText(); updateText();
var bullShit:Int = 0;
for (item in grpWeekText.members)
{
item.targetY = bullShit - curWeek;
if (item.targetY == Std.int(0) && weekUnlocked[curWeek])
item.alpha = 1;
else
item.alpha = 0.6;
bullShit++;
}
trace("Line 165"); trace("Line 165");
super.create(); super.create();
@ -294,6 +332,9 @@ class StoryMenuState extends MusicBeatState
FlxG.switchState(new MainMenuState()); FlxG.switchState(new MainMenuState());
} }
if (FlxG.sound.music != null)
Conductor.songPosition = FlxG.sound.music.time;
super.update(elapsed); super.update(elapsed);
} }
@ -314,7 +355,7 @@ class StoryMenuState extends MusicBeatState
stopspamming = true; stopspamming = true;
} }
PlayState.storyPlaylist = weekData[curWeek]; PlayState.storyPlaylist = weekData()[curWeek];
PlayState.isStoryMode = true; PlayState.isStoryMode = true;
selectedWeek = true; selectedWeek = true;
@ -388,10 +429,10 @@ class StoryMenuState extends MusicBeatState
{ {
curWeek += change; curWeek += change;
if (curWeek >= weekData.length) if (curWeek >= weekData().length)
curWeek = 0; curWeek = 0;
if (curWeek < 0) if (curWeek < 0)
curWeek = weekData.length - 1; curWeek = weekData().length - 1;
var bullShit:Int = 0; var bullShit:Int = 0;
@ -417,7 +458,7 @@ class StoryMenuState extends MusicBeatState
grpWeekCharacters.members[2].setCharacter(weekCharacters[curWeek][2]); grpWeekCharacters.members[2].setCharacter(weekCharacters[curWeek][2]);
txtTracklist.text = "Tracks\n"; txtTracklist.text = "Tracks\n";
var stringThing:Array<String> = weekData[curWeek]; var stringThing:Array<String> = weekData()[curWeek];
for (i in stringThing) for (i in stringThing)
txtTracklist.text += "\n" + i; txtTracklist.text += "\n" + i;
@ -433,4 +474,25 @@ class StoryMenuState extends MusicBeatState
intendedScore = Highscore.getWeekScore(curWeek, curDifficulty); intendedScore = Highscore.getWeekScore(curWeek, curDifficulty);
#end #end
} }
public static function unlockNextWeek(week:Int):Void
{
if(week <= weekData().length - 1 && FlxG.save.data.weekUnlocked == week)
{
weekUnlocked.push(true);
trace('Week ' + week + ' beat (Week ' + (week + 1) + ' unlocked)');
}
FlxG.save.data.weekUnlocked = weekUnlocked.length - 1;
FlxG.save.flush();
}
override function beatHit()
{
super.beatHit();
grpWeekCharacters.members[0].bopHead();
grpWeekCharacters.members[1].bopHead();
grpWeekCharacters.members[2].bopHead();
}
} }

Some files were not shown because too many files have changed in this diff Show More