Merge branch 'master' into tasks

This commit is contained in:
Prokube 2021-07-10 07:08:38 -07:00 committed by GitHub
commit 72d800581a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
61 changed files with 1412 additions and 676 deletions

View File

@ -66,3 +66,4 @@ This game was made with love to Newgrounds and its community. Extra love to Tom
- [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/daniel11420) - Setting up appveyor and a lot of other help
- [Smokey](https://twitter.com/Smokey_5_) - telling me that I should do the tricky asset loading

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

@ -37,6 +37,9 @@ install:
- 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.

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

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.

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.

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

@ -15,7 +15,9 @@ 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'],
@ -31,7 +33,8 @@ var weekData:Array<Dynamic> = [
['Senpai', 'Roses', 'Thorns'] ['Senpai', 'Roses', 'Thorns']
]; ];
}
``` ```
--- ---
@ -45,7 +48,9 @@ Example
--- ---
```haxe ```haxe
var weekData:Array<Dynamic> = [ static function weekData():Array<Dynamic>
{
return [
['Tutorial'], ['Tutorial'],
@ -63,7 +68,8 @@ var weekData:Array<Dynamic> = [
['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

@ -1,5 +1,12 @@
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;
@ -25,15 +32,26 @@ class Caching extends MusicBeatState
var toBeDone = 0; var toBeDone = 0;
var done = 0; var done = 0;
var loaded = false;
var text:FlxText; var text:FlxText;
var kadeLogo:FlxSprite; var kadeLogo:FlxSprite;
public static var bitmapData:Map<String,FlxGraphic>;
var images = [];
var music = [];
var charts = [];
override function create() override function create()
{ {
FlxG.mouse.visible = false; FlxG.mouse.visible = false;
FlxG.worldBounds.set(0,0); FlxG.worldBounds.set(0,0);
bitmapData = new Map<String,FlxGraphic>();
text = new FlxText(FlxG.width / 2, FlxG.height / 2 + 300,0,"Loading..."); text = new FlxText(FlxG.width / 2, FlxG.height / 2 + 300,0,"Loading...");
text.size = 34; text.size = 34;
text.alignment = FlxTextAlign.CENTER; text.alignment = FlxTextAlign.CENTER;
@ -48,42 +66,27 @@ class Caching extends MusicBeatState
kadeLogo.alpha = 0; kadeLogo.alpha = 0;
add(kadeLogo); PlayerSettings.init();
add(text);
trace('starting caching..'); #if windows
DiscordClient.initialize();
sys.thread.Thread.create(() -> { Application.current.onExit.add (function (exitCode) {
cache(); DiscordClient.shutdown();
}); });
#end
super.create();
}
var calledDone = false; Highscore.load();
override function update(elapsed) FlxG.save.bind('funkin', 'ninjamuffin99');
KadeEngineData.initSave();
if (FlxG.save.data.cacheImages)
{ {
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 + ")";
}
super.update(elapsed);
}
function cache()
{
var images = [];
var music = [];
trace("caching images..."); trace("caching images...");
for (i in FileSystem.readDirectory(FileSystem.absolutePath("assets/shared/images/characters"))) for (i in FileSystem.readDirectory(FileSystem.absolutePath("assets/shared/images/characters")))
@ -92,6 +95,7 @@ class Caching extends MusicBeatState
continue; continue;
images.push(i); images.push(i);
} }
}
trace("caching music..."); trace("caching music...");
@ -100,15 +104,66 @@ class Caching extends MusicBeatState
music.push(i); music.push(i);
} }
toBeDone = Lambda.count(images) + Lambda.count(music); 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..');
// 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();
});
super.create();
}
var calledDone = false;
override function update(elapsed)
{
super.update(elapsed);
}
function cache()
{
trace("LOADING: " + toBeDone + " OBJECTS."); trace("LOADING: " + toBeDone + " OBJECTS.");
for (i in images) for (i in images)
{ {
var replaced = i.replace(".png",""); var replaced = i.replace(".png","");
FlxG.bitmap.add(Paths.image("characters/" + replaced,"shared")); var data:BitmapData = BitmapData.fromFile("assets/shared/images/characters/" + i);
trace("cached " + replaced); 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++; done++;
} }
@ -120,8 +175,13 @@ class Caching extends MusicBeatState
done++; done++;
} }
trace("Finished caching..."); trace("Finished caching...");
loaded = true;
trace(Assets.cache.hasBitmapData('GF_assets'));
FlxG.switchState(new TitleState()); FlxG.switchState(new TitleState());
} }

View File

@ -32,7 +32,7 @@ class Character extends FlxSprite
{ {
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 +46,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 +65,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 +98,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 +106,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 +119,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 +134,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 +150,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 +162,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 +173,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 +200,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);
@ -289,27 +229,14 @@ class Character extends FlxSprite
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 +249,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 +267,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 +283,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 +297,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, true);
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 +313,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 +329,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 +345,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 +362,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 +375,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 +405,17 @@ class Character extends FlxSprite
} }
} }
public function loadOffsetFile(character:String)
{
var offset:Array<String> = CoolUtil.coolTextFile(Paths.txt('images/characters/' + character + "Offsets"));
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'))

View File

@ -75,7 +75,7 @@ class ChartingState extends MusicBeatState
var gridBG:FlxSprite; var gridBG:FlxSprite;
var _song:SwagSong; public static var _song:SwagSong;
var typingShit:FlxInputText; var typingShit:FlxInputText;
/* /*
@ -129,7 +129,7 @@ class ChartingState extends MusicBeatState
blackBorder.alpha = 0.3; blackBorder.alpha = 0.3;
snapText = new FlxText(60,10,0,"Snap: 1/" + snap + " (Press Control to unsnap the cursor)\nAdd Notes: 1-8 (or click)\n", 14); snapText = new FlxText(60,10,0,"Snap: 1/" + snap + " (Press SHIFT to unsnap the cursor)\nAdd Notes: 1-8 (or click)\nDiff: 0", 14);
snapText.scrollFactor.set(); snapText.scrollFactor.set();
gridBlackLine = new FlxSprite(gridBG.x + gridBG.width / 2).makeGraphic(2, Std.int(gridBG.height), FlxColor.BLACK); gridBlackLine = new FlxSprite(gridBG.x + gridBG.width / 2).makeGraphic(2, Std.int(gridBG.height), FlxColor.BLACK);
@ -309,10 +309,10 @@ class ChartingState extends MusicBeatState
shiftNotes(Std.int(stepperShiftNoteDial.value),Std.int(stepperShiftNoteDialstep.value),Std.int(stepperShiftNoteDialms.value)); shiftNotes(Std.int(stepperShiftNoteDial.value),Std.int(stepperShiftNoteDialstep.value),Std.int(stepperShiftNoteDialms.value));
}); });
var characters:Array<String> = CoolUtil.coolTextFile(Paths.txt('characterList')); var characters:Array<String> = CoolUtil.coolTextFile(Paths.txt('data/characterList'));
var gfVersions:Array<String> = CoolUtil.coolTextFile(Paths.txt('gfVersionList')); var gfVersions:Array<String> = CoolUtil.coolTextFile(Paths.txt('data/gfVersionList'));
var stages:Array<String> = CoolUtil.coolTextFile(Paths.txt('stageList')); var stages:Array<String> = CoolUtil.coolTextFile(Paths.txt('data/stageList'));
var noteStyles:Array<String> = CoolUtil.coolTextFile(Paths.txt('noteStyleList')); var noteStyles:Array<String> = CoolUtil.coolTextFile(Paths.txt('data/noteStyleList'));
var player1DropDown = new FlxUIDropDownMenu(10, 100, FlxUIDropDownMenu.makeStrIdLabelArray(characters, true), function(character:String) var player1DropDown = new FlxUIDropDownMenu(10, 100, FlxUIDropDownMenu.makeStrIdLabelArray(characters, true), function(character:String)
{ {
@ -660,13 +660,15 @@ class ChartingState extends MusicBeatState
} }
var writingNotes:Bool = false; var writingNotes:Bool = false;
var doSnapShit:Bool = true; var doSnapShit:Bool = false;
public var diff:Float = 0;
override function update(elapsed:Float) override function update(elapsed:Float)
{ {
updateHeads(); updateHeads();
snapText.text = "Snap: 1/" + snap + " (" + (doSnapShit ? "Control to disable" : "Snap Disabled, Control to renable") + ")\nAdd Notes: 1-8 (or click)\n"; snapText.text = "Snap: 1/" + snap + " (" + (doSnapShit ? "Shift to disable" : "Snap Disabled, Shift to renable. It's a bit buggy") + ")\nAdd Notes: 1-8 (or click)";
curStep = recalculateSteps(); curStep = recalculateSteps();
@ -679,7 +681,7 @@ class ChartingState extends MusicBeatState
if (snap <= 1) if (snap <= 1)
snap = 1;*/ snap = 1;*/
if (FlxG.keys.justPressed.CONTROL) if (FlxG.keys.justPressed.SHIFT)
doSnapShit = !doSnapShit; doSnapShit = !doSnapShit;
Conductor.songPosition = FlxG.sound.music.time; Conductor.songPosition = FlxG.sound.music.time;
@ -959,17 +961,30 @@ class ChartingState extends MusicBeatState
vocals.pause(); vocals.pause();
claps.splice(0, claps.length); claps.splice(0, claps.length);
var stepMs = curStep * Conductor.stepCrochet; var amount = FlxG.mouse.wheel;
if(amount > 0 && strumLine.y < gridBG.y)
trace(Conductor.stepCrochet / snap); amount = 0;
if (doSnapShit) if (doSnapShit)
FlxG.sound.music.time = stepMs - (FlxG.mouse.wheel * Conductor.stepCrochet / snap); {
else var increase:Int = 0;
FlxG.sound.music.time -= (FlxG.mouse.wheel * Conductor.stepCrochet * 0.4);
trace(stepMs + " + " + Conductor.stepCrochet / snap + " -> " + FlxG.sound.music.time);
if (amount < 0)
increase = 1;
else
increase = -1;
trace(increase + " - " + curStep + " - " + (curStep + increase));
curStep += increase;
var stepMs = curStep * Conductor.stepCrochet;
FlxG.sound.music.time = stepMs;
}
else
FlxG.sound.music.time -= (amount * Conductor.stepCrochet * 0.4);
vocals.time = FlxG.sound.music.time; vocals.time = FlxG.sound.music.time;
} }
@ -1185,7 +1200,7 @@ class ChartingState extends MusicBeatState
function updateGrid():Void function updateGrid():Void
{ {
remove(gridBG); remove(gridBG);
gridBG = FlxGridOverlay.create(GRID_SIZE, GRID_SIZE, GRID_SIZE * 8, GRID_SIZE * _song.notes[curSection].lengthInSteps); gridBG = FlxGridOverlay.create(GRID_SIZE, GRID_SIZE, GRID_SIZE * 8, GRID_SIZE * 16);
add(gridBG); add(gridBG);
remove(gridBlackLine); remove(gridBlackLine);
@ -1240,6 +1255,7 @@ class ChartingState extends MusicBeatState
var daSus = i[2]; var daSus = i[2];
var note:Note = new Note(daStrumTime, daNoteInfo % 4,null,false,true); var note:Note = new Note(daStrumTime, daNoteInfo % 4,null,false,true);
note.rawNoteData = daNoteInfo;
note.sustainLength = daSus; note.sustainLength = daSus;
note.setGraphicSize(GRID_SIZE, GRID_SIZE); note.setGraphicSize(GRID_SIZE, GRID_SIZE);
note.updateHitbox(); note.updateHitbox();
@ -1259,6 +1275,7 @@ class ChartingState extends MusicBeatState
curRenderedSustains.add(sustainVis); curRenderedSustains.add(sustainVis);
} }
} }
} }
private function addSection(lengthInSteps:Int = 16):Void private function addSection(lengthInSteps:Int = 16):Void
@ -1282,7 +1299,7 @@ class ChartingState extends MusicBeatState
for (i in _song.notes[curSection].sectionNotes) for (i in _song.notes[curSection].sectionNotes)
{ {
if (i.strumTime == note.strumTime && i.noteData % 4 == note.noteData) if (i[0] == note.strumTime && i[1] == note.rawNoteData)
{ {
curSelectedNote = _song.notes[curSection].sectionNotes[swagNum]; curSelectedNote = _song.notes[curSection].sectionNotes[swagNum];
} }
@ -1300,7 +1317,7 @@ class ChartingState extends MusicBeatState
lastNote = note; lastNote = note;
for (i in _song.notes[curSection].sectionNotes) for (i in _song.notes[curSection].sectionNotes)
{ {
if (i[0] == note.strumTime && i[1] % 4 == note.noteData) if (i[0] == note.strumTime && i[1] == note.rawNoteData)
{ {
_song.notes[curSection].sectionNotes.remove(i); _song.notes[curSection].sectionNotes.remove(i);
} }
@ -1487,7 +1504,7 @@ class ChartingState extends MusicBeatState
"song": _song "song": _song
}; };
var data:String = Json.stringify(json); var data:String = Json.stringify(json,null," ");
if ((data != null) && (data.length > 0)) if ((data != null) && (data.length > 0))
{ {

View File

@ -28,6 +28,8 @@ class Conductor
public static var safeZoneOffset:Float = Math.floor((safeFrames / 60) * 1000); // is calculated in create(), is safeFrames in milliseconds public static var safeZoneOffset:Float = Math.floor((safeFrames / 60) * 1000); // is calculated in create(), is safeFrames in milliseconds
public static var timeScale:Float = Conductor.safeZoneOffset / 166; public static var timeScale:Float = Conductor.safeZoneOffset / 166;
public static var lengthInSteps:Float = 0;
public static var bpmChangeMap:Array<BPMChangeEvent> = []; public static var bpmChangeMap:Array<BPMChangeEvent> = [];
public function new() public function new()
@ -74,5 +76,9 @@ class Conductor
crochet = ((60 / bpm) * 1000); crochet = ((60 / bpm) * 1000);
stepCrochet = crochet / 4; stepCrochet = crochet / 4;
lengthInSteps = (FlxG.sound.music.length / stepCrochet);
trace("\nLength in in steps: " + lengthInSteps);
} }
} }

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;
} }

366
source/DiffCalc.hx Normal file
View File

@ -0,0 +1,366 @@
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 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
{
var gottaHitNote:Bool = i.mustHitSection;
if (ii[1] > 3)
gottaHitNote = !i.mustHitSection;
if (gottaHitNote)
cleanedNotes.push(new SmallNote(ii[0],Math.floor(Math.abs(ii[1]))));
}
}
var handOne:Array<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;
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;
}
}
}

View File

@ -1,5 +1,6 @@
package; package;
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;
@ -29,6 +30,7 @@ class FreeplayState extends MusicBeatState
var scoreText:FlxText; var scoreText:FlxText;
var comboText:FlxText; var comboText:FlxText;
var diffText:FlxText; var diffText:FlxText;
var diffCalcText: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 +40,48 @@ class FreeplayState extends MusicBeatState
private var iconArray:Array<HealthIcon> = []; private var iconArray:Array<HealthIcon> = [];
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 = "";
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("\n" + diffList);
/* /*
if (FlxG.sound.music != null) if (FlxG.sound.music != null)
{ {
@ -101,7 +135,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 +143,10 @@ 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);
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);
@ -238,14 +276,20 @@ 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;
try
{
hmm = songData.get(songs[curSelected].songName)[curDifficulty];
if (hmm == null)
return;
}
catch(ex)
{
return;
}
trace(songs[curSelected].songName);
var poop:String = Highscore.formatSong(songFormat, curDifficulty); PlayState.SONG = hmm;
trace(poop);
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;
@ -274,7 +318,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();
} }
@ -310,10 +354,22 @@ 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); 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)
{}
var bullShit:Int = 0; var bullShit:Int = 0;
for (i in 0...iconArray.length) for (i in 0...iconArray.length)

View File

@ -6,6 +6,9 @@ class KadeEngineData
{ {
public static function initSave() public static function initSave()
{ {
if (FlxG.save.data.weekUnlocked == null)
FlxG.save.data.weekUnlocked = 7;
if (FlxG.save.data.newInput == null) if (FlxG.save.data.newInput == null)
FlxG.save.data.newInput = true; FlxG.save.data.newInput = true;
@ -94,6 +97,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

@ -320,7 +320,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)
{ {

View File

@ -23,7 +23,7 @@ class Main extends Sprite
var skipSplash:Bool = true; // Whether to skip the flixel splash screen that appears in release mode. var 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.

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

@ -19,6 +19,7 @@ class Note extends FlxSprite
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;
@ -37,6 +38,8 @@ class Note extends FlxSprite
public var rating:String = "shit"; public var rating:String = "shit";
public var dataColor:Array<String> = ['purple', 'blue', 'green', 'red'];
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();
@ -72,26 +75,15 @@ class Note extends FlxSprite
switch (noteTypeCheck) switch (noteTypeCheck)
{ {
case 'pixel': case 'pixel':
loadGraphic(Paths.image('weeb/pixelUI/arrows-pixels','week6'), true, 17, 17); loadGraphic(Paths.image('weeb/pixelUI/arrows-pixels', 'week6'), true, 17, 17);
animation.add('greenScroll', [6]);
animation.add('redScroll', [7]);
animation.add('blueScroll', [5]);
animation.add('purpleScroll', [4]);
if (isSustainNote) if (isSustainNote)
loadGraphic(Paths.image('weeb/pixelUI/arrowEnds', 'week6'), true, 7, 6);
for (i in 0...4)
{ {
loadGraphic(Paths.image('weeb/pixelUI/arrowEnds','week6'), true, 7, 6); animation.add(dataColor[i] + 'Scroll', [i + 4]); // Normal notes
animation.add(dataColor[i] + 'hold', [i]); // Holds
animation.add('purpleholdend', [4]); animation.add(dataColor[i] + 'holdend', [i + 4]); // Tails
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)); setGraphicSize(Std.int(width * PlayState.daPixelZoom));
@ -99,47 +91,27 @@ class Note extends FlxSprite
default: default:
frames = Paths.getSparrowAtlas('NOTE_assets'); frames = Paths.getSparrowAtlas('NOTE_assets');
animation.addByPrefix('greenScroll', 'green instance 1'); for (i in 0...4)
animation.addByPrefix('redScroll', 'red instance 1'); {
animation.addByPrefix('blueScroll', 'blue instance 1'); animation.addByPrefix(dataColor[i] + 'Scroll', dataColor[i] + ' alone'); // Normal notes
animation.addByPrefix('purpleScroll', 'purple instance 1'); animation.addByPrefix(dataColor[i] + 'hold', dataColor[i] + ' hold'); // Hold
animation.addByPrefix(dataColor[i] + 'holdend', dataColor[i] + ' tail'); // Tails
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)); setGraphicSize(Std.int(width * 0.7));
updateHitbox(); updateHitbox();
antialiasing = true; antialiasing = true;
} }
switch (noteData) x += swagWidth * noteData;
{ animation.play(dataColor[noteData] + 'Scroll');
case 0:
x += swagWidth * 0;
animation.play('purpleScroll');
case 1:
x += swagWidth * 1;
animation.play('blueScroll');
case 2:
x += swagWidth * 2;
animation.play('greenScroll');
case 3:
x += swagWidth * 3;
animation.play('redScroll');
}
// trace(prevNote); // trace(prevNote);
// 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;
@ -150,39 +122,18 @@ class Note extends FlxSprite
x += width / 2; x += width / 2;
switch (noteData) animation.play(dataColor[noteData] + 'holdend');
{
case 2:
animation.play('greenholdend');
case 3:
animation.play('redholdend');
case 1:
animation.play('blueholdend');
case 0:
animation.play('purpleholdend');
}
updateHitbox(); updateHitbox();
x -= width / 2; x -= width / 2;
if (PlayState.curStage.startsWith('school')) if (noteTypeCheck == 'pixel')
x += 30; x += 30;
if (prevNote.isSustainNote) if (prevNote.isSustainNote)
{ {
switch (prevNote.noteData) prevNote.animation.play(dataColor[prevNote.noteData] + '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) if(FlxG.save.data.scrollSpeed != 1)
prevNote.scale.y *= Conductor.stepCrochet / 100 * 1.5 * FlxG.save.data.scrollSpeed; prevNote.scale.y *= Conductor.stepCrochet / 100 * 1.5 * FlxG.save.data.scrollSpeed;

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)
@ -698,3 +721,127 @@ 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;
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

@ -42,18 +42,16 @@ class OptionsMenu extends MusicBeatState
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 RainbowFPSOption("Make the FPS Counter Rainbow"), new RainbowFPSOption("Make the FPS Counter Rainbow"),
new AccuracyOption("Display accuracy information."), new AccuracyOption("Display accuracy information."),
new NPSDisplayOption("Shows your current Notes Per Second."), new NPSDisplayOption("Shows your current Notes Per Second."),
new SongPositionOption("Show the songs current position (as a bar)"), new SongPositionOption("Show the songs current position (as a bar)"),
new CpuStrums("CPU's strumline lights up when a note hits it."), new CpuStrums("CPU's strumline lights up when a note hits it."),
#end
]), ]),
new OptionCategory("Misc", [ new OptionCategory("Misc", [
#if desktop
new FPSOption("Toggle the FPS Counter"), new FPSOption("Toggle the FPS Counter"),
#if desktop
new ReplayOption("View replays"), new ReplayOption("View replays"),
#end #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."),
@ -61,7 +59,14 @@ class OptionsMenu extends MusicBeatState
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 in the score screen."),
new Optimization("No backgrounds, no characters, centered notes, no player 2."), new Optimization("No backgrounds, no characters, centered notes, no player 2."),
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("Manage Save Data", [
new ResetScoreOption("Reset your score on all songs and weeks."),
new LockWeeksOption("Reset your storymode progress. (only Tutorial + Week 1 will be unlocked)"),
new ResetSettings("Reset ALL your settings.")
]) ])
]; ];

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;
@ -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,30 @@ 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)
{ {
if (isCharacter)
if (FlxG.save.data.cacheImages)
return FlxAtlasFrames.fromSparrow(imageCached(key), file('images/characters/$key.xml', library));
else
return FlxAtlasFrames.fromSparrow(image('characters/$key'), file('images/characters/$key.xml'));
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) inline static public function imageCached(key:String):FlxGraphic
{ {
var data = Caching.bitmapData.get(key);
trace('finding ${key} - ${data.bitmap}');
return data;
}
inline static public function getPackerAtlas(key:String, ?library:String, ?isCharacter:Bool = false)
{
if (isCharacter)
if (FlxG.save.data.cacheImages)
return FlxAtlasFrames.fromSpriteSheetPacker(imageCached(key), file('images/$key.txt', library));
else
return FlxAtlasFrames.fromSpriteSheetPacker(image('characters/$key'), file('images/characters/$key.txt'));
return FlxAtlasFrames.fromSpriteSheetPacker(image(key, library), file('images/$key.txt', library)); return FlxAtlasFrames.fromSpriteSheetPacker(image(key, library), file('images/$key.txt', library));
} }
} }

View File

@ -240,7 +240,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());
} }
} }

View File

@ -228,6 +228,9 @@ class PlayState extends MusicBeatState
private var executeModchart = false; private var executeModchart = false;
// Animation common suffixes
private var dataSuffix:Array<String> = ['LEFT', 'DOWN', 'UP', 'RIGHT'];
// API stuff // API stuff
public function addObject(object:FlxBasic) { add(object); } public function addObject(object:FlxBasic) { add(object); }
@ -253,6 +256,8 @@ class PlayState extends MusicBeatState
} }
misses = 0; misses = 0;
highestCombo = 0;
repPresses = 0; repPresses = 0;
repReleases = 0; repReleases = 0;
@ -360,11 +365,11 @@ class PlayState extends MusicBeatState
"Only then I will even CONSIDER letting you\ndate my daughter!" "Only then I will even CONSIDER letting you\ndate my daughter!"
]; ];
case 'senpai': case 'senpai':
dialogue = CoolUtil.coolTextFile(Paths.txt('senpai/senpaiDialogue')); dialogue = CoolUtil.coolTextFile(Paths.txt('data/senpai/senpaiDialogue'));
case 'roses': case 'roses':
dialogue = CoolUtil.coolTextFile(Paths.txt('roses/rosesDialogue')); dialogue = CoolUtil.coolTextFile(Paths.txt('data/roses/rosesDialogue'));
case 'thorns': case 'thorns':
dialogue = CoolUtil.coolTextFile(Paths.txt('thorns/thornsDialogue')); dialogue = CoolUtil.coolTextFile(Paths.txt('data/thorns/thornsDialogue'));
} }
//defaults if no stage was found in chart //defaults if no stage was found in chart
@ -830,6 +835,15 @@ class PlayState extends MusicBeatState
dad.y += 360; dad.y += 360;
camPos.set(dad.getGraphicMidpoint().x + 300, dad.getGraphicMidpoint().y); camPos.set(dad.getGraphicMidpoint().x + 300, dad.getGraphicMidpoint().y);
case 'spirit': case 'spirit':
if(FlxG.save.data.distractions){
// trailArea.scrollFactor.set();
var evilTrail = new FlxTrail(dad, null, 4, 24, 0.3, 0.069);
// evilTrail.changeValuesEnabled(false, false, false, false);
// evilTrail.changeGraphic()
add(evilTrail);
// evilTrail.scrollFactor.set(1.1, 1.1);
}
dad.x -= 150; dad.x -= 150;
dad.y += 100; dad.y += 100;
camPos.set(dad.getGraphicMidpoint().x + 300, dad.getGraphicMidpoint().y); camPos.set(dad.getGraphicMidpoint().x + 300, dad.getGraphicMidpoint().y);
@ -862,16 +876,6 @@ class PlayState extends MusicBeatState
gf.x += 180; gf.x += 180;
gf.y += 300; gf.y += 300;
case 'schoolEvil': case 'schoolEvil':
if(FlxG.save.data.distractions){
// trailArea.scrollFactor.set();
var evilTrail = new FlxTrail(dad, null, 4, 24, 0.3, 0.069);
// evilTrail.changeValuesEnabled(false, false, false, false);
// evilTrail.changeGraphic()
add(evilTrail);
// evilTrail.scrollFactor.set(1.1, 1.1);
}
boyfriend.x += 200; boyfriend.x += 200;
boyfriend.y += 220; boyfriend.y += 220;
gf.x += 180; gf.x += 180;
@ -1127,6 +1131,7 @@ class PlayState extends MusicBeatState
rep = new Replay("na"); rep = new Replay("na");
FlxG.stage.addEventListener(KeyboardEvent.KEY_DOWN,handleInput); FlxG.stage.addEventListener(KeyboardEvent.KEY_DOWN,handleInput);
FlxG.stage.addEventListener(KeyboardEvent.KEY_UP,releaseInput);
super.create(); super.create();
} }
@ -1366,6 +1371,41 @@ class PlayState extends MusicBeatState
return null; return null;
} }
var keys = [false,false,false,false];
private function releaseInput(evt:KeyboardEvent):Void // handles releases
{
@:privateAccess
var key = FlxKey.toStringMap.get(Keyboard.__convertKeyCode(evt.keyCode));
var binds:Array<String> = [FlxG.save.data.leftBind,FlxG.save.data.downBind, FlxG.save.data.upBind, FlxG.save.data.rightBind];
var data = -1;
switch(evt.keyCode) // arrow keys
{
case 37:
data = 0;
case 40:
data = 1;
case 38:
data = 2;
case 39:
data = 3;
}
for (i in 0...binds.length) // binds
{
if (binds[i].toLowerCase() == key.toLowerCase())
data = i;
}
if (data == -1)
return;
keys[data] = false;
}
private function handleInput(evt:KeyboardEvent):Void { // this actually handles press inputs private function handleInput(evt:KeyboardEvent):Void { // this actually handles press inputs
if (PlayStateChangeables.botPlay || loadRep || paused) if (PlayStateChangeables.botPlay || loadRep || paused)
@ -1399,15 +1439,16 @@ class PlayState extends MusicBeatState
if (binds[i].toLowerCase() == key.toLowerCase()) if (binds[i].toLowerCase() == key.toLowerCase())
data = i; data = i;
} }
if (evt.keyLocation == KeyLocation.NUM_PAD)
{
trace(String.fromCharCode(evt.charCode) + " " + key);
}
if (data == -1) if (data == -1)
return; return;
if (keys[data])
{
return;
}
keys[data] = true;
var ana = new Ana(Conductor.songPosition, null, false, "miss", data); var ana = new Ana(Conductor.songPosition, null, false, "miss", data);
var dataNotes = []; var dataNotes = [];
@ -1422,14 +1463,43 @@ class PlayState extends MusicBeatState
if (dataNotes.length != 0) if (dataNotes.length != 0)
{ {
var coolNote = dataNotes[0]; var coolNote = dataNotes[0];
if (dataNotes.length > 1) // stacked notes or really close ones
{
for(i in 0...dataNotes.length)
{
if (i == 0) // skip the first note
continue;
var note = dataNotes[i];
if (!note.isSustainNote && (note.strumTime - coolNote.strumTime) < 2)
{
trace('found a stacked/really close note ' + (note.strumTime - coolNote.strumTime));
// just fuckin remove it since it's a stacked note and shouldn't be there
note.kill();
notes.remove(note, true);
note.destroy();
}
}
}
goodNoteHit(coolNote); goodNoteHit(coolNote);
var noteDiff:Float = -(coolNote.strumTime - Conductor.songPosition); var noteDiff:Float = -(coolNote.strumTime - Conductor.songPosition);
ana.hit = true; ana.hit = true;
ana.hitJudge = Ratings.CalculateRating(noteDiff, Math.floor((PlayStateChangeables.safeFrames / 60) * 1000)); ana.hitJudge = Ratings.CalculateRating(noteDiff, Math.floor((PlayStateChangeables.safeFrames / 60) * 1000));
ana.nearestNote = [coolNote.strumTime,coolNote.noteData,coolNote.sustainLength]; ana.nearestNote = [coolNote.strumTime,coolNote.noteData,coolNote.sustainLength];
} }
else if (!FlxG.save.data.ghost)
{
noteMiss(data,null);
ana.hit = false;
ana.hitJudge = "shit";
ana.nearestNote = [];
}
} }
@ -1592,6 +1662,7 @@ class PlayState extends MusicBeatState
swagNote.sustainLength = songNotes[2]; swagNote.sustainLength = songNotes[2];
swagNote.scrollFactor.set(0, 0); swagNote.scrollFactor.set(0, 0);
var susLength:Float = swagNote.sustainLength; var susLength:Float = swagNote.sustainLength;
susLength = susLength / Conductor.stepCrochet; susLength = susLength / Conductor.stepCrochet;
@ -1695,70 +1766,70 @@ class PlayState extends MusicBeatState
case 'normal': case 'normal':
babyArrow.frames = Paths.getSparrowAtlas('NOTE_assets'); babyArrow.frames = Paths.getSparrowAtlas('NOTE_assets');
babyArrow.animation.addByPrefix('green', 'arrow static instance 1'); babyArrow.animation.addByPrefix('green', 'arrowUP');
babyArrow.animation.addByPrefix('blue', 'arrow static instance 2'); babyArrow.animation.addByPrefix('blue', 'arrowDOWN');
babyArrow.animation.addByPrefix('purple', 'arrow static instance 3'); babyArrow.animation.addByPrefix('purple', 'arrowLEFT');
babyArrow.animation.addByPrefix('red', 'arrow static instance 4'); babyArrow.animation.addByPrefix('red', 'arrowRIGHT');
babyArrow.antialiasing = true; babyArrow.antialiasing = true;
babyArrow.setGraphicSize(Std.int(babyArrow.width * 0.7)); babyArrow.setGraphicSize(Std.int(babyArrow.width * 0.7));
switch (Math.abs(i)) switch (Math.abs(i))
{ {
case 0:
babyArrow.x += Note.swagWidth * 0;
babyArrow.animation.addByPrefix('static', 'arrow static instance 1');
babyArrow.animation.addByPrefix('pressed', 'left press instance 1', 24, false);
babyArrow.animation.addByPrefix('confirm', 'left confirm instance 1', 24, false);
case 1:
babyArrow.x += Note.swagWidth * 1;
babyArrow.animation.addByPrefix('static', 'arrow static instance 2');
babyArrow.animation.addByPrefix('pressed', 'down press instance 1', 24, false);
babyArrow.animation.addByPrefix('confirm', 'down confirm instance 1', 24, false);
case 2: case 2:
babyArrow.x += Note.swagWidth * 2; babyArrow.x += Note.swagWidth * 2;
babyArrow.animation.addByPrefix('static', 'arrow static instance 4'); babyArrow.animation.addByPrefix('static', 'arrowUP');
babyArrow.animation.addByPrefix('pressed', 'up press instance 1', 24, false); babyArrow.animation.addByPrefix('pressed', 'up press', 24, false);
babyArrow.animation.addByPrefix('confirm', 'up confirm instance 1', 24, false); babyArrow.animation.addByPrefix('confirm', 'up confirm', 24, false);
case 3: case 3:
babyArrow.x += Note.swagWidth * 3; babyArrow.x += Note.swagWidth * 3;
babyArrow.animation.addByPrefix('static', 'arrow static instance 3'); babyArrow.animation.addByPrefix('static', 'arrowRIGHT');
babyArrow.animation.addByPrefix('pressed', 'right press instance 1', 24, false); babyArrow.animation.addByPrefix('pressed', 'right press', 24, false);
babyArrow.animation.addByPrefix('confirm', 'right confirm instance 1', 24, false); babyArrow.animation.addByPrefix('confirm', 'right confirm', 24, false);
case 1:
babyArrow.x += Note.swagWidth * 1;
babyArrow.animation.addByPrefix('static', 'arrowDOWN');
babyArrow.animation.addByPrefix('pressed', 'down press', 24, false);
babyArrow.animation.addByPrefix('confirm', 'down confirm', 24, false);
case 0:
babyArrow.x += Note.swagWidth * 0;
babyArrow.animation.addByPrefix('static', 'arrowLEFT');
babyArrow.animation.addByPrefix('pressed', 'left press', 24, false);
babyArrow.animation.addByPrefix('confirm', 'left confirm', 24, false);
} }
default: default:
babyArrow.frames = Paths.getSparrowAtlas('NOTE_assets'); babyArrow.frames = Paths.getSparrowAtlas('NOTE_assets');
babyArrow.animation.addByPrefix('green', 'arrow static instance 1'); babyArrow.animation.addByPrefix('green', 'arrowUP');
babyArrow.animation.addByPrefix('blue', 'arrow static instance 2'); babyArrow.animation.addByPrefix('blue', 'arrowDOWN');
babyArrow.animation.addByPrefix('purple', 'arrow static instance 3'); babyArrow.animation.addByPrefix('purple', 'arrowLEFT');
babyArrow.animation.addByPrefix('red', 'arrow static instance 4'); babyArrow.animation.addByPrefix('red', 'arrowRIGHT');
babyArrow.antialiasing = true; babyArrow.antialiasing = true;
babyArrow.setGraphicSize(Std.int(babyArrow.width * 0.7)); babyArrow.setGraphicSize(Std.int(babyArrow.width * 0.7));
switch (Math.abs(i)) switch (Math.abs(i))
{ {
case 0:
babyArrow.x += Note.swagWidth * 0;
babyArrow.animation.addByPrefix('static', 'arrow static instance 1');
babyArrow.animation.addByPrefix('pressed', 'left press instance 1', 24, false);
babyArrow.animation.addByPrefix('confirm', 'left confirm instance 1', 24, false);
case 1:
babyArrow.x += Note.swagWidth * 1;
babyArrow.animation.addByPrefix('static', 'arrow static instance 2');
babyArrow.animation.addByPrefix('pressed', 'down press instance 1', 24, false);
babyArrow.animation.addByPrefix('confirm', 'down confirm instance 1', 24, false);
case 2: case 2:
babyArrow.x += Note.swagWidth * 2; babyArrow.x += Note.swagWidth * 2;
babyArrow.animation.addByPrefix('static', 'arrow static instance 4'); babyArrow.animation.addByPrefix('static', 'arrowUP');
babyArrow.animation.addByPrefix('pressed', 'up press instance 1', 24, false); babyArrow.animation.addByPrefix('pressed', 'up press', 24, false);
babyArrow.animation.addByPrefix('confirm', 'up confirm instance 1', 24, false); babyArrow.animation.addByPrefix('confirm', 'up confirm', 24, false);
case 3: case 3:
babyArrow.x += Note.swagWidth * 3; babyArrow.x += Note.swagWidth * 3;
babyArrow.animation.addByPrefix('static', 'arrow static instance 3'); babyArrow.animation.addByPrefix('static', 'arrowRIGHT');
babyArrow.animation.addByPrefix('pressed', 'right press instance 1', 24, false); babyArrow.animation.addByPrefix('pressed', 'right press', 24, false);
babyArrow.animation.addByPrefix('confirm', 'right confirm instance 1', 24, false); babyArrow.animation.addByPrefix('confirm', 'right confirm', 24, false);
case 1:
babyArrow.x += Note.swagWidth * 1;
babyArrow.animation.addByPrefix('static', 'arrowDOWN');
babyArrow.animation.addByPrefix('pressed', 'down press', 24, false);
babyArrow.animation.addByPrefix('confirm', 'down confirm', 24, false);
case 0:
babyArrow.x += Note.swagWidth * 0;
babyArrow.animation.addByPrefix('static', 'arrowLEFT');
babyArrow.animation.addByPrefix('pressed', 'left press', 24, false);
babyArrow.animation.addByPrefix('confirm', 'left confirm', 24, false);
} }
} }
@ -2039,6 +2110,7 @@ class PlayState extends MusicBeatState
#end #end
FlxG.switchState(new ChartingState()); FlxG.switchState(new ChartingState());
FlxG.stage.removeEventListener(KeyboardEvent.KEY_DOWN,handleInput); FlxG.stage.removeEventListener(KeyboardEvent.KEY_DOWN,handleInput);
FlxG.stage.removeEventListener(KeyboardEvent.KEY_UP,releaseInput);
#if windows #if windows
if (luaModchart != null) if (luaModchart != null)
{ {
@ -2091,6 +2163,7 @@ class PlayState extends MusicBeatState
FlxG.switchState(new AnimationDebug(SONG.player2)); FlxG.switchState(new AnimationDebug(SONG.player2));
FlxG.stage.removeEventListener(KeyboardEvent.KEY_DOWN,handleInput); FlxG.stage.removeEventListener(KeyboardEvent.KEY_DOWN,handleInput);
FlxG.stage.removeEventListener(KeyboardEvent.KEY_UP,releaseInput);
#if windows #if windows
if (luaModchart != null) if (luaModchart != null)
{ {
@ -2104,6 +2177,7 @@ class PlayState extends MusicBeatState
{ {
FlxG.switchState(new AnimationDebug(SONG.player1)); FlxG.switchState(new AnimationDebug(SONG.player1));
FlxG.stage.removeEventListener(KeyboardEvent.KEY_DOWN,handleInput); FlxG.stage.removeEventListener(KeyboardEvent.KEY_DOWN,handleInput);
FlxG.stage.removeEventListener(KeyboardEvent.KEY_UP,releaseInput);
#if windows #if windows
if (luaModchart != null) if (luaModchart != null)
{ {
@ -2275,18 +2349,12 @@ class PlayState extends MusicBeatState
switch (dad.curCharacter) switch (dad.curCharacter)
{ {
case 'mom': case 'mom' | 'mom-car':
camFollow.y = dad.getMidpoint().y; camFollow.y = dad.getMidpoint().y;
case 'senpai': case 'senpai' | 'senpai-angry':
camFollow.y = dad.getMidpoint().y - 430;
camFollow.x = dad.getMidpoint().x - 100;
case 'senpai-angry':
camFollow.y = dad.getMidpoint().y - 430; camFollow.y = dad.getMidpoint().y - 430;
camFollow.x = dad.getMidpoint().x - 100; camFollow.x = dad.getMidpoint().x - 100;
} }
if (dad.curCharacter == 'mom')
vocals.volume = 1;
} }
if (PlayState.SONG.notes[Std.int(curStep / 16)].mustHitSection && camFollow.x != boyfriend.getMidpoint().x - 100) if (PlayState.SONG.notes[Std.int(curStep / 16)].mustHitSection && camFollow.x != boyfriend.getMidpoint().x - 100)
@ -2518,17 +2586,9 @@ class PlayState extends MusicBeatState
altAnim = '-alt'; altAnim = '-alt';
} }
switch (Math.abs(daNote.noteData)) // Accessing the animation name directly to play it
{ var singData:Int = Std.int(Math.abs(daNote.noteData));
case 2: dad.playAnim('sing' + dataSuffix[singData] + altAnim, true);
dad.playAnim('singUP' + altAnim, true);
case 3:
dad.playAnim('singRIGHT' + altAnim, true);
case 1:
dad.playAnim('singDOWN' + altAnim, true);
case 0:
dad.playAnim('singLEFT' + altAnim, true);
}
if (FlxG.save.data.cpuStrums) if (FlxG.save.data.cpuStrums)
{ {
@ -2645,7 +2705,7 @@ class PlayState extends MusicBeatState
}); });
} }
if (!inCutscene) if (!inCutscene && songStarted)
keyShit(); keyShit();
@ -2658,6 +2718,7 @@ class PlayState extends MusicBeatState
function endSong():Void function endSong():Void
{ {
FlxG.stage.removeEventListener(KeyboardEvent.KEY_DOWN,handleInput); FlxG.stage.removeEventListener(KeyboardEvent.KEY_DOWN,handleInput);
FlxG.stage.removeEventListener(KeyboardEvent.KEY_UP,releaseInput);
if (useVideo) if (useVideo)
{ {
GlobalVideo.get().stop(); GlobalVideo.get().stop();
@ -2739,7 +2800,7 @@ class PlayState extends MusicBeatState
else else
{ {
FlxG.sound.playMusic(Paths.music('freakyMenu')); FlxG.sound.playMusic(Paths.music('freakyMenu'));
FlxG.switchState(new MainMenuState()); FlxG.switchState(new StoryMenuState());
} }
#if windows #if windows
@ -2750,17 +2811,13 @@ class PlayState extends MusicBeatState
} }
#end #end
// if ()
StoryMenuState.weekUnlocked[Std.int(Math.min(storyWeek + 1, StoryMenuState.weekUnlocked.length - 1))] = true;
if (SONG.validScore) if (SONG.validScore)
{ {
NGio.unlockMedal(60961); NGio.unlockMedal(60961);
Highscore.saveWeekScore(storyWeek, campaignScore, storyDifficulty); Highscore.saveWeekScore(storyWeek, campaignScore, storyDifficulty);
} }
FlxG.save.data.weekUnlocked = StoryMenuState.weekUnlocked; StoryMenuState.unlockNextWeek(storyWeek);
FlxG.save.flush();
} }
else else
{ {
@ -3147,6 +3204,8 @@ class PlayState extends MusicBeatState
}; };
#end #end
var nonCpp = false;
// Prevent player input if botplay is on // Prevent player input if botplay is on
if(PlayStateChangeables.botPlay) if(PlayStateChangeables.botPlay)
@ -3156,6 +3215,10 @@ class PlayState extends MusicBeatState
releaseArray = [false, false, false, false]; releaseArray = [false, false, false, false];
} }
#if !cpp
nonCpp = true;
#end
var anas:Array<Ana> = [null,null,null,null]; var anas:Array<Ana> = [null,null,null,null];
for (i in 0...pressArray.length) for (i in 0...pressArray.length)
@ -3172,7 +3235,7 @@ class PlayState extends MusicBeatState
}); });
} }
if (KeyBinds.gamepad && !FlxG.keys.justPressed.ANY) if ((KeyBinds.gamepad && !FlxG.keys.justPressed.ANY) || nonCpp)
{ {
// PRESSES, check for note hits // PRESSES, check for note hits
if (pressArray.contains(true) && generatedMusic) if (pressArray.contains(true) && generatedMusic)
@ -3293,7 +3356,7 @@ class PlayState extends MusicBeatState
if (boyfriend.holdTimer > Conductor.stepCrochet * 4 * 0.001 && (!holdArray.contains(true) || PlayStateChangeables.botPlay)) if (boyfriend.holdTimer > Conductor.stepCrochet * 4 * 0.001 && (!holdArray.contains(true) || PlayStateChangeables.botPlay))
{ {
if (boyfriend.animation.curAnim.name.startsWith('sing') && !boyfriend.animation.curAnim.name.endsWith('miss')) if (boyfriend.animation.curAnim.name.startsWith('sing') && !boyfriend.animation.curAnim.name.endsWith('miss') && boyfriend.animation.curAnim.curFrame >= 10)
boyfriend.playAnim('idle'); boyfriend.playAnim('idle');
} }
@ -3462,17 +3525,8 @@ class PlayState extends MusicBeatState
// FlxG.sound.play(Paths.sound('missnote1'), 1, false); // FlxG.sound.play(Paths.sound('missnote1'), 1, false);
// FlxG.log.add('played imss note'); // FlxG.log.add('played imss note');
switch (direction) // Hole switch statement replaced with a single line :)
{ boyfriend.playAnim('sing' + dataSuffix[direction] + 'miss', true);
case 0:
boyfriend.playAnim('singLEFTmiss', true);
case 1:
boyfriend.playAnim('singDOWNmiss', true);
case 2:
boyfriend.playAnim('singUPmiss', true);
case 3:
boyfriend.playAnim('singRIGHTmiss', true);
}
#if windows #if windows
if (luaModchart != null) if (luaModchart != null)
@ -3621,18 +3675,8 @@ class PlayState extends MusicBeatState
else else
totalNotesHit += 1; totalNotesHit += 1;
var singData:Int = Std.int(note.noteData);
switch (note.noteData) boyfriend.playAnim('sing' + dataSuffix[singData], true);
{
case 2:
boyfriend.playAnim('singUP', true);
case 3:
boyfriend.playAnim('singRIGHT', true);
case 1:
boyfriend.playAnim('singDOWN', true);
case 0:
boyfriend.playAnim('singLEFT', true);
}
#if windows #if windows
if (luaModchart != null) if (luaModchart != null)
@ -3876,6 +3920,10 @@ class PlayState extends MusicBeatState
boyfriend.playAnim('idle'); boyfriend.playAnim('idle');
} }
if (!dad.animation.curAnim.name.startsWith("sing"))
{
dad.dance();
}
if (curBeat % 8 == 7 && curSong == 'Bopeebo') if (curBeat % 8 == 7 && curSong == 'Bopeebo')
{ {

View File

@ -57,6 +57,7 @@ class ResultsScreen extends FlxSubState
music = new FlxSound().loadEmbedded(Paths.music('breakfast'), true, true); music = new FlxSound().loadEmbedded(Paths.music('breakfast'), true, true);
music.volume = 0; music.volume = 0;
music.play(false, FlxG.random.int(0, Std.int(music.length / 2))); 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 +75,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\nF1 - 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);

View File

@ -2,7 +2,7 @@ package;
typedef SwagSection = typedef SwagSection =
{ {
var sectionNotes:Array<Dynamic>; 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 +13,7 @@ typedef SwagSection =
class Section class Section
{ {
public var sectionNotes:Array<Dynamic> = []; 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;

View File

@ -24,7 +24,9 @@ class StoryMenuState extends MusicBeatState
{ {
var scoreText:FlxText; var scoreText:FlxText;
var weekData:Array<Dynamic> = [ static function weekData():Array<Dynamic>
{
return [
['Tutorial'], ['Tutorial'],
['Bopeebo', 'Fresh', 'Dad Battle'], ['Bopeebo', 'Fresh', 'Dad Battle'],
['Spookeez', 'South', "Monster"], ['Spookeez', 'South', "Monster"],
@ -33,9 +35,10 @@ class StoryMenuState extends MusicBeatState
['Cocoa', 'Eggnog', 'Winter Horrorland'], ['Cocoa', 'Eggnog', 'Winter Horrorland'],
['Senpai', 'Roses', 'Thorns'] ['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);
@ -110,17 +125,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);
@ -134,6 +149,7 @@ class StoryMenuState extends MusicBeatState
// 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');
@ -195,6 +211,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();
@ -314,7 +343,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 +417,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 +446,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 +462,16 @@ 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();
}
} }

View File

@ -67,16 +67,7 @@ class TitleState extends MusicBeatState
trace("Loaded " + openfl.Assets.getLibrary("default").assetsLoaded + " assets (DEFAULT)"); trace("Loaded " + openfl.Assets.getLibrary("default").assetsLoaded + " assets (DEFAULT)");
} }
PlayerSettings.init();
#if windows
DiscordClient.initialize();
Application.current.onExit.add (function (exitCode) {
DiscordClient.shutdown();
});
#end
curWacky = FlxG.random.getObject(getIntroTextShit()); curWacky = FlxG.random.getObject(getIntroTextShit());
@ -93,38 +84,22 @@ class TitleState extends MusicBeatState
trace('NEWGROUNDS LOL'); trace('NEWGROUNDS LOL');
#end #end
FlxG.save.bind('funkin', 'ninjamuffin99');
KadeEngineData.initSave();
// var file:SMFile = SMFile.loadFile("file.sm"); // var file:SMFile = SMFile.loadFile("file.sm");
// this was testing things // this was testing things
Highscore.load();
if (FlxG.save.data.weekUnlocked != null)
{
// FIX LATER!!!
// WEEK UNLOCK PROGRESSION!!
// StoryMenuState.weekUnlocked = FlxG.save.data.weekUnlocked;
if (StoryMenuState.weekUnlocked.length < 4)
StoryMenuState.weekUnlocked.insert(0, true);
// QUICK PATCH OOPS!
if (!StoryMenuState.weekUnlocked[0])
StoryMenuState.weekUnlocked[0] = true;
}
#if FREEPLAY #if FREEPLAY
FlxG.switchState(new FreeplayState()); FlxG.switchState(new FreeplayState());
#elseif CHARTING #elseif CHARTING
FlxG.switchState(new ChartingState()); FlxG.switchState(new ChartingState());
#else #else
#if !cpp
new FlxTimer().start(1, function(tmr:FlxTimer) new FlxTimer().start(1, function(tmr:FlxTimer)
{ {
startIntro(); startIntro();
}); });
#else
startIntro();
#end
#end #end
} }
@ -135,34 +110,6 @@ class TitleState extends MusicBeatState
function startIntro() function startIntro()
{ {
if (!initialized)
{
var diamond:FlxGraphic = FlxGraphic.fromClass(GraphicTransTileDiamond);
diamond.persist = true;
diamond.destroyOnNoUse = false;
FlxTransitionableState.defaultTransIn = new TransitionData(FADE, FlxColor.BLACK, 1, new FlxPoint(0, -1), {asset: diamond, width: 32, height: 32},
new FlxRect(-200, -200, FlxG.width * 1.4, FlxG.height * 1.4));
FlxTransitionableState.defaultTransOut = new TransitionData(FADE, FlxColor.BLACK, 0.7, new FlxPoint(0, 1),
{asset: diamond, width: 32, height: 32}, new FlxRect(-200, -200, FlxG.width * 1.4, FlxG.height * 1.4));
transIn = FlxTransitionableState.defaultTransIn;
transOut = FlxTransitionableState.defaultTransOut;
// HAD TO MODIFY SOME BACKEND SHIT
// IF THIS PR IS HERE IF ITS ACCEPTED UR GOOD TO GO
// https://github.com/HaxeFlixel/flixel-addons/pull/348
// var music:FlxSound = new FlxSound();
// music.loadStream(Paths.music('freakyMenu'));
// FlxG.sound.list.add(music);
// music.play();
FlxG.sound.playMusic(Paths.music('freakyMenu'), 0);
FlxG.sound.music.fadeIn(4, 0, 0.7);
}
Conductor.changeBPM(102);
persistentUpdate = true; persistentUpdate = true;
var bg:FlxSprite = new FlxSprite().makeGraphic(FlxG.width, FlxG.height, FlxColor.BLACK); var bg:FlxSprite = new FlxSprite().makeGraphic(FlxG.width, FlxG.height, FlxColor.BLACK);
@ -171,25 +118,17 @@ class TitleState extends MusicBeatState
// bg.updateHitbox(); // bg.updateHitbox();
add(bg); add(bg);
logoBl = new FlxSprite(-150, 1500);
if(Main.watermarks) { if(Main.watermarks) {
logoBl = new FlxSprite(-150, -100);
logoBl.frames = Paths.getSparrowAtlas('KadeEngineLogoBumpin'); logoBl.frames = Paths.getSparrowAtlas('KadeEngineLogoBumpin');
logoBl.antialiasing = true;
logoBl.animation.addByPrefix('bump', 'logo bumpin', 24);
logoBl.animation.play('bump');
logoBl.updateHitbox();
// logoBl.screenCenter();
// logoBl.color = FlxColor.BLACK;
} else { } else {
logoBl = new FlxSprite(-150, -100);
logoBl.frames = Paths.getSparrowAtlas('logoBumpin'); logoBl.frames = Paths.getSparrowAtlas('logoBumpin');
}
logoBl.antialiasing = true; logoBl.antialiasing = true;
logoBl.animation.addByPrefix('bump', 'logo bumpin', 24); logoBl.animation.addByPrefix('bump', 'logo bumpin', 24, false);
logoBl.animation.play('bump');
logoBl.updateHitbox(); logoBl.updateHitbox();
// logoBl.screenCenter(); // logoBl.screenCenter();
// logoBl.color = FlxColor.BLACK; // logoBl.color = FlxColor.BLACK;
}
gfDance = new FlxSprite(FlxG.width * 0.4, FlxG.height * 0.07); gfDance = new FlxSprite(FlxG.width * 0.4, FlxG.height * 0.07);
gfDance.frames = Paths.getSparrowAtlas('gfDanceTitle'); gfDance.frames = Paths.getSparrowAtlas('gfDanceTitle');
@ -245,15 +184,40 @@ class TitleState extends MusicBeatState
if (initialized) if (initialized)
skipIntro(); skipIntro();
else else {
var diamond:FlxGraphic = FlxGraphic.fromClass(GraphicTransTileDiamond);
diamond.persist = true;
diamond.destroyOnNoUse = false;
FlxTransitionableState.defaultTransIn = new TransitionData(FADE, FlxColor.BLACK, 1, new FlxPoint(0, -1), {asset: diamond, width: 32, height: 32},
new FlxRect(-200, -200, FlxG.width * 1.4, FlxG.height * 1.4));
FlxTransitionableState.defaultTransOut = new TransitionData(FADE, FlxColor.BLACK, 0.7, new FlxPoint(0, 1),
{asset: diamond, width: 32, height: 32}, new FlxRect(-200, -200, FlxG.width * 1.4, FlxG.height * 1.4));
transIn = FlxTransitionableState.defaultTransIn;
transOut = FlxTransitionableState.defaultTransOut;
// HAD TO MODIFY SOME BACKEND SHIT
// IF THIS PR IS HERE IF ITS ACCEPTED UR GOOD TO GO
// https://github.com/HaxeFlixel/flixel-addons/pull/348
// var music:FlxSound = new FlxSound();
// music.loadStream(Paths.music('freakyMenu'));
// FlxG.sound.list.add(music);
// music.play();
FlxG.sound.playMusic(Paths.music('freakyMenu'), 0);
FlxG.sound.music.fadeIn(4, 0, 0.7);
Conductor.changeBPM(102);
initialized = true; initialized = true;
}
// credGroup.add(credTextShit); // credGroup.add(credTextShit);
} }
function getIntroTextShit():Array<Array<String>> function getIntroTextShit():Array<Array<String>>
{ {
var fullText:String = Assets.getText(Paths.txt('introText')); var fullText:String = Assets.getText(Paths.txt('data/introText'));
var firstArray:Array<String> = fullText.split('\n'); var firstArray:Array<String> = fullText.split('\n');
var swagGoodArray:Array<Array<String>> = []; var swagGoodArray:Array<Array<String>> = [];
@ -388,7 +352,7 @@ class TitleState extends MusicBeatState
{ {
super.beatHit(); super.beatHit();
logoBl.animation.play('bump'); logoBl.animation.play('bump', true);
danceLeft = !danceLeft; danceLeft = !danceLeft;
if (danceLeft) if (danceLeft)
@ -468,6 +432,19 @@ class TitleState extends MusicBeatState
FlxG.camera.flash(FlxColor.WHITE, 4); FlxG.camera.flash(FlxColor.WHITE, 4);
remove(credGroup); remove(credGroup);
FlxTween.tween(logoBl,{y: -100}, 1.4, {ease: FlxEase.expoInOut});
logoBl.angle = -4;
new FlxTimer().start(0.01, function(tmr:FlxTimer)
{
if(logoBl.angle == -4)
FlxTween.angle(logoBl, logoBl.angle, 4, 4, {ease: FlxEase.quartInOut});
if (logoBl.angle == 4)
FlxTween.angle(logoBl, logoBl.angle, -4, 4, {ease: FlxEase.quartInOut});
}, 0);
skippedIntro = true; skippedIntro = true;
} }
} }