Merge branch 'master' of github.com:ninjamuffin99/Funkin-secret into nitpix

This commit is contained in:
MtH 2021-03-28 18:10:40 +02:00
commit 333cd2711b
91 changed files with 4764 additions and 1189 deletions

3
.gitignore vendored
View File

@ -1,3 +1,4 @@
export/
.vscode/
APIStuff.hx
APIStuff.hx
.DS_STORE

View File

@ -75,26 +75,26 @@
<library name="week7" preload="false" />
</section>
<assets path="assets/songs" library="songs" exclude="*.ogg" if="web"/>
<assets path="assets/songs" library="songs" exclude="*.mp3" unless="web"/>
<assets path="assets/shared" library="shared" exclude="*.ogg" if="web"/>
<assets path="assets/shared" library="shared" exclude="*.mp3" unless="web"/>
<assets path="assets/tutorial" library="tutorial" exclude="*.ogg" if="web"/>
<assets path="assets/tutorial" library="tutorial" exclude="*.mp3" unless="web"/>
<assets path="assets/week1" library="week1" exclude="*.ogg" if="web"/>
<assets path="assets/week1" library="week1" exclude="*.mp3" unless="web"/>
<assets path="assets/week2" library="week2" exclude="*.ogg" if="web"/>
<assets path="assets/week2" library="week2" exclude="*.mp3" unless="web"/>
<assets path="assets/week3" library="week3" exclude="*.ogg" if="web"/>
<assets path="assets/week3" library="week3" exclude="*.mp3" unless="web"/>
<assets path="assets/week4" library="week4" exclude="*.ogg" if="web"/>
<assets path="assets/week4" library="week4" exclude="*.mp3" unless="web"/>
<assets path="assets/week5" library="week5" exclude="*.ogg" if="web"/>
<assets path="assets/week5" library="week5" exclude="*.mp3" unless="web"/>
<assets path="assets/week6" library="week6" exclude="*.ogg" if="web"/>
<assets path="assets/week6" library="week6" exclude="*.mp3" unless="web"/>
<assets path="assets/week7" library="week7" exclude="*.ogg" if="web"/>
<assets path="assets/week7" library="week7" exclude="*.mp3" unless="web"/>
<assets path="assets/songs" library="songs" exclude="*.fla|*.ogg" if="web"/>
<assets path="assets/songs" library="songs" exclude="*.fla|*.mp3" unless="web"/>
<assets path="assets/shared" library="shared" exclude="*.fla|*.ogg" if="web"/>
<assets path="assets/shared" library="shared" exclude="*.fla|*.mp3" unless="web"/>
<assets path="assets/tutorial" library="tutorial" exclude="*.fla|*.ogg" if="web"/>
<assets path="assets/tutorial" library="tutorial" exclude="*.fla|*.mp3" unless="web"/>
<assets path="assets/week1" library="week1" exclude="*.fla|*.ogg" if="web"/>
<assets path="assets/week1" library="week1" exclude="*.fla|*.mp3" unless="web"/>
<assets path="assets/week2" library="week2" exclude="*.fla|*.ogg" if="web"/>
<assets path="assets/week2" library="week2" exclude="*.fla|*.mp3" unless="web"/>
<assets path="assets/week3" library="week3" exclude="*.fla|*.ogg" if="web"/>
<assets path="assets/week3" library="week3" exclude="*.fla|*.mp3" unless="web"/>
<assets path="assets/week4" library="week4" exclude="*.fla|*.ogg" if="web"/>
<assets path="assets/week4" library="week4" exclude="*.fla|*.mp3" unless="web"/>
<assets path="assets/week5" library="week5" exclude="*.fla|*.ogg" if="web"/>
<assets path="assets/week5" library="week5" exclude="*.fla|*.mp3" unless="web"/>
<assets path="assets/week6" library="week6" exclude="*.fla|*.ogg" if="web"/>
<assets path="assets/week6" library="week6" exclude="*.fla|*.mp3" unless="web"/>
<assets path="assets/week7" library="week7" exclude="*.fla|*.ogg" if="web"/>
<assets path="assets/week7" library="week7" exclude="*.fla|*.mp3" unless="web"/>
<!-- <assets path='example_mods' rename='mods' embed='false'/> -->
@ -122,9 +122,10 @@
<!--In case you want to use the ui package-->
<haxelib name="flixel-ui" />
<haxelib name="newgrounds"/>
<haxelib name="newgrounds" unless="switch"/>
<haxelib name="faxe" if='switch'/>
<haxelib name="polymod"/>
<haxelib name="hxcpp-debug-server" if="desktop debug"/>
<haxelib name="discord_rpc" if="desktop"/>
<!-- <haxelib name="hxcpp-debug-server" if="desktop"/> -->
@ -177,6 +178,21 @@
<!-- <haxedef name="SKIP_TO_PLAYSTATE" if="debug" /> -->
<haxedef name="NG_LOGIN" if="newgrounds" />
<haxedef name="CAN_OPEN_LINKS" unless="switch"/>
<haxedef name="CAN_CHEAT" if="switch debug"/>
<!-- <haxedef name="CLEAR_INPUT_SAVE"/> -->
<section if="newgrounds">
<!-- Enables Ng.core.verbose -->
<!-- <haxedef name="NG_VERBOSE" /> -->
<!-- Enables a NG debug session, so medals don't permently unlock -->
<!-- <haxedef name="NG_DEBUG" /> -->
<!-- pretends that the saved session Id was expired, forcing the reconnect prompt -->
<!-- <haxedef name="NG_FORCE_EXPIRED_SESSION" if="debug" /> -->
</section>
</project>

View File

@ -62,8 +62,9 @@ package;
class APIStuff
{
public static var API:String = "";
public static var EncKey:String = "";
inline public static var API:String = "51348:TtzK0rZ8";
inline public static var EncKey:String = "5NqKsSVSNKHbF9fPgZPqPg==";
inline public static var SESSION:String = null;
}
```

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<TextureAtlas imagePath="options-screen-cs3.png">
<!-- Created with Adobe Animate version 21.0.4.39603 -->
<!-- http://www.adobe.com/products/animate.html -->
<SubTexture name="Check Box Selected Static0000" x="0" y="198" width="120" height="174" frameX="0" frameY="0" frameWidth="140" frameHeight="225"/>
<SubTexture name="Check Box Selected Static0001" x="0" y="198" width="120" height="174" frameX="0" frameY="0" frameWidth="140" frameHeight="225"/>
<SubTexture name="Check Box selecting animation0000" x="371" y="0" width="121" height="82" frameX="-15" frameY="-133" frameWidth="140" frameHeight="225"/>
<SubTexture name="Check Box selecting animation0001" x="371" y="0" width="121" height="82" frameX="-15" frameY="-133" frameWidth="140" frameHeight="225"/>
<SubTexture name="Check Box selecting animation0002" x="132" y="0" width="127" height="180" frameX="-4" frameY="-45" frameWidth="140" frameHeight="225"/>
<SubTexture name="Check Box selecting animation0003" x="0" y="0" width="127" height="193" frameX="0" frameY="0" frameWidth="140" frameHeight="225"/>
<SubTexture name="Check Box selecting animation0004" x="0" y="0" width="127" height="193" frameX="0" frameY="0" frameWidth="140" frameHeight="225"/>
<SubTexture name="Check Box selecting animation0005" x="257" y="185" width="138" height="146" frameX="-2" frameY="-62" frameWidth="140" frameHeight="225"/>
<SubTexture name="Check Box selecting animation0006" x="257" y="185" width="138" height="146" frameX="-2" frameY="-62" frameWidth="140" frameHeight="225"/>
<SubTexture name="Check Box selecting animation0007" x="132" y="185" width="120" height="176" frameX="-12" frameY="-29" frameWidth="140" frameHeight="225"/>
<SubTexture name="Check Box selecting animation0008" x="132" y="185" width="120" height="176" frameX="-12" frameY="-29" frameWidth="140" frameHeight="225"/>
<SubTexture name="Check Box selecting animation0009" x="0" y="198" width="120" height="174" frameX="-12" frameY="-29" frameWidth="140" frameHeight="225"/>
<SubTexture name="Check Box selecting animation0010" x="0" y="198" width="120" height="174" frameX="-12" frameY="-29" frameWidth="140" frameHeight="225"/>
<SubTexture name="Check Box unselected0000" x="264" y="0" width="102" height="103"/>
</TextureAtlas>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
{"song":{"player2":"dad","player1":"bf","speed":1,"needsVoices":true,"sectionLengths":[],"song":"Bopeebo","notes":[{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[0,2,0],[600,3,450],[1050,3,600]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[2400,2,0],[3000,3,450],[3450,3,600]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[4800,1,300],[5400,0,300],[6000,3,300]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[7200,1,300],[7800,0,300],[8400,3,300]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[9600,1,150],[10200,3,0],[10500,0,0],[10800,1,450]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[12000,1,150],[12600,3,0],[12900,0,0],[13200,1,450]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[14400,3,0],[14700,1,0],[15300,0,0],[15600,2,300]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[16800,3,0],[17100,1,0],[17700,0,0],[18000,2,300]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[19200,0,0],[19500,3,0],[19800,1,750]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[21600,0,0],[21900,3,0],[22200,1,750]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[24000,1,0],[24300,3,0],[24600,0,750]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[26700,3,0],[27000,0,750],[26400,1,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[28800,2,0],[29100,3,0],[29400,0,1050]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[31200,2,0],[31500,3,0],[31800,0,1050]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[33600,0,0],[33900,3,0],[34500,2,0],[34800,1,450]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[36000,0,0],[36300,3,0],[36900,2,0],[37200,1,450]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[38400,2,450],[39000,3,300],[39600,0,450]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[40800,2,450],[41400,3,300],[42000,0,450]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[43200,1,0],[43800,2,0],[44400,1,0],[44550,1,0],[44700,1,0],[45000,2,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[45600,1,0],[46200,2,0],[46800,1,0],[46950,1,0],[47100,1,0],[47400,2,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[48000,2,450],[48600,3,300],[49200,0,450]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[50400,2,450],[51000,3,300],[51600,0,450]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[52800,3,1650]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[55200,3,1650]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[57600,2,0],[57900,3,0],[58200,0,1050]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[60000,2,0],[60300,3,0],[60600,0,1050],[62100,6,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[62400,0,0],[62700,3,0],[63300,2,0],[63600,1,450],[64500,6,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[64800,0,0],[65100,3,0],[65700,2,0],[66000,1,450]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[67200,2,0],[67500,3,0],[67800,0,0],[68100,2,0],[68400,1,450]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[69600,2,0],[69900,3,0],[70200,0,0],[70500,2,0],[70800,1,450],[71700,6,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[72000,0,0],[72300,3,0],[72900,2,0],[73200,1,450],[74100,6,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[74400,0,0],[74700,3,0],[75300,2,0],[75600,1,450]]},{"lengthInSteps":16,"bpm":100,"changeBPM":false,"mustHitSection":true,"sectionNotes":[],"typeOfSection":0},{"lengthInSteps":16,"bpm":100,"changeBPM":false,"mustHitSection":true,"sectionNotes":[],"typeOfSection":0,"altAnim":false}],"bpm":100,"sections":0,"validScore":true}}
{"song":{"song":"Bopeebo","bpm":100.0,"needsVoices":true,"player1":"bf","player2":"dad","speed":1.0,"notes":[{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[0.0,2,0.0],[600.0,3,450.0],[1200.0,3,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[2400.0,2,0.0],[3000.0,3,450.0],[3600.0,3,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[4800.0,1,300.0],[5400.0,0,300.0],[6000.0,3,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[7200.0,1,300.0],[7800.0,0,300.0],[8400.0,3,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[9600.0,1,0.0],[10200.0,3,0.0],[10500.0,0,0.0],[10800.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[12000.0,1,0.0],[12600.0,3,0.0],[12900.0,0,0.0],[13200.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[14400.0,3,0.0],[14700.0,1,0.0],[15300.0,0,0.0],[15600.0,2,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[16800.0,3,0.0],[17100.0,1,0.0],[17700.0,0,0.0],[18000.0,2,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[19200.0,0,0.0],[19500.0,3,0.0],[19800.0,1,900.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[21600.0,0,0.0],[21900.0,3,0.0],[22200.0,1,900.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24000.0,1,0.0],[24300.0,3,0.0],[24600.0,0,900.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[26400.0,1,0.0],[26700.0,3,0.0],[27000.0,0,900.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[28800.0,2,0.0],[29100.0,3,0.0],[29400.0,0,1200.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[31200.0,2,0.0],[31500.0,3,0.0],[31800.0,0,1200.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[33600.0,0,0.0],[33900.0,3,0.0],[34500.0,2,0.0],[34800.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[36000.0,0,0.0],[36300.0,3,0.0],[36900.0,2,0.0],[37200.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[38400.0,2,450.0],[39000.0,3,300.0],[39600.0,0,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[40800.0,2,450.0],[41400.0,3,300.0],[42000.0,0,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[43200.0,1,0.0],[43800.0,2,0.0],[44400.0,1,0.0],[44700.0,1,0.0],[45000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[45600.0,1,0.0],[46200.0,2,0.0],[46800.0,1,0.0],[47100.0,1,0.0],[47400.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[48000.0,2,450.0],[48600.0,3,300.0],[49200.0,0,450.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[50400.0,2,450.0],[51000.0,3,300.0],[51600.0,0,450.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[52800.0,3,1800.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[55200.0,3,1800.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[57600.0,2,0.0],[57900.0,3,0.0],[58200.0,0,1200.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[60000.0,2,0.0],[60300.0,3,0.0],[60600.0,0,1200.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[62400.0,0,0.0],[62700.0,3,0.0],[63300.0,2,0.0],[63600.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[64800.0,0,0.0],[65100.0,3,0.0],[65700.0,2,0.0],[66000.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[67200.0,2,0.0],[67500.0,3,0.0],[67800.0,0,0.0],[68100.0,2,0.0],[68400.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[69600.0,2,0.0],[69900.0,3,0.0],[70200.0,0,0.0],[70500.0,2,0.0],[70800.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[72000.0,0,0.0],[72300.0,3,0.0],[72900.0,2,0.0],[73200.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[74400.0,0,0.0],[74700.0,3,0.0],[75300.0,2,0.0],[75600.0,1,600.0]]}]},"generatedBy":"SNIFF ver.6"}

View File

@ -1 +1 @@
{"song":{"player2":"dad","player1":"bf","speed":1.6,"needsVoices":true,"sectionLengths":[],"song":"Bopeebo","notes":[{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[0,2,0],[600,3,450],[1050,3,600]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[2400,2,0],[3000,3,450],[3450,3,600]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[4800,1,300],[5400,0,300],[6000,3,300]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[7200,1,300],[7800,0,300],[8400,3,300]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[9600,1,150],[10200,3,0],[10500,0,0],[10800,1,450]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[12000,1,150],[12600,3,0],[12900,0,0],[13200,1,450]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[14400,3,0],[14700,1,0],[15300,0,0],[15600,2,300]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[16800,3,0],[17100,1,0],[17700,0,0],[18000,2,300]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[19200,0,0],[19500,3,0],[19800,1,750]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[21600,0,0],[21900,3,0],[22200,1,750]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[24000,1,0],[24300,3,0],[24600,0,750]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[26700,3,0],[27000,0,750],[26400,1,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[28800,2,0],[29100,3,0],[29400,0,1050]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[31200,2,0],[31500,3,0],[31800,0,1050]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[33600,0,0],[33900,3,0],[34500,2,0],[34800,1,450]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[36000,0,0],[36300,3,0],[36900,2,0],[37200,1,450]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[38400,2,450],[39000,3,300],[39600,0,450]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[40800,2,450],[41400,3,300],[42000,0,450]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[43200,1,0],[43800,2,0],[44400,1,0],[44550,1,0],[44700,1,0],[45000,2,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[45600,1,0],[46200,2,0],[46800,1,0],[46950,1,0],[47100,1,0],[47400,2,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[48000,2,450],[48600,3,300],[49200,0,450]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[50400,2,450],[51000,3,300],[51600,0,450]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[52800,3,1650]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[55200,3,1650]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[57600,2,0],[57900,3,0],[58200,0,1050]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[60000,2,0],[60300,3,0],[60600,0,1050],[62100,6,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[62400,0,0],[62700,3,0],[63300,2,0],[63600,1,450],[64500,6,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[64800,0,0],[65100,3,0],[65700,2,0],[66000,1,450]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[67200,2,0],[67500,3,0],[67800,0,0],[68100,2,0],[68400,1,450]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[69600,2,0],[69900,3,0],[70200,0,0],[70500,2,0],[70800,1,450],[71700,6,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[72000,0,0],[72300,3,0],[72900,2,0],[73200,1,450],[74100,6,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[74400,0,0],[74700,3,0],[75300,2,0],[75600,1,450]]},{"lengthInSteps":16,"bpm":100,"changeBPM":false,"mustHitSection":true,"sectionNotes":[],"typeOfSection":0},{"lengthInSteps":16,"bpm":100,"changeBPM":false,"mustHitSection":true,"sectionNotes":[],"typeOfSection":0,"altAnim":false}],"bpm":100,"sections":0,"validScore":true}}
{"song":{"song":"Bopeebo","bpm":100.0,"needsVoices":true,"player1":"bf","player2":"dad","speed":1.3,"notes":[{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[0.0,2,0.0],[600.0,3,600.0],[1200.0,3,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[2400.0,2,0.0],[3000.0,3,600.0],[3600.0,3,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[4800.0,1,300.0],[5400.0,0,300.0],[6000.0,3,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[7200.0,1,300.0],[7800.0,0,300.0],[8400.0,3,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[9600.0,1,300.0],[10200.0,3,0.0],[10500.0,0,0.0],[10800.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[12000.0,1,300.0],[12600.0,3,0.0],[12900.0,0,0.0],[13200.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[14400.0,3,0.0],[14700.0,1,0.0],[15300.0,0,0.0],[15600.0,2,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[16800.0,3,0.0],[17100.0,1,0.0],[17700.0,0,0.0],[18000.0,2,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[19200.0,0,0.0],[19500.0,3,0.0],[19800.0,1,900.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[21600.0,0,0.0],[21900.0,3,0.0],[22200.0,1,900.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24000.0,1,0.0],[24300.0,3,0.0],[24600.0,0,900.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[26400.0,1,0.0],[26700.0,3,0.0],[27000.0,0,900.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[28800.0,2,0.0],[29100.0,3,0.0],[29400.0,0,1200.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[31200.0,2,0.0],[31500.0,3,0.0],[31800.0,0,1200.0],[33300.0,6,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[33600.0,0,0.0],[33900.0,3,0.0],[34500.0,2,0.0],[34575.0,0,0.0],[34800.0,1,600.0],[35700.0,6,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[36000.0,0,0.0],[36300.0,3,0.0],[36900.0,2,0.0],[36975.0,0,0.0],[37200.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[38400.0,2,450.0],[39000.0,3,300.0],[39600.0,0,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[40800.0,2,450.0],[41400.0,3,300.0],[42000.0,0,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[43200.0,1,0.0],[43800.0,2,0.0],[44400.0,1,0.0],[44550.0,1,0.0],[44700.0,1,0.0],[45000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[45600.0,1,0.0],[46200.0,2,0.0],[46800.0,1,0.0],[46950.0,1,0.0],[47100.0,1,0.0],[47400.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[48000.0,2,450.0],[48600.0,3,300.0],[49200.0,0,450.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[50400.0,2,450.0],[51000.0,3,300.0],[51600.0,0,450.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[52800.0,3,1800.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[55200.0,3,1800.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[57600.0,2,0.0],[57900.0,3,0.0],[58200.0,0,1200.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[60000.0,2,0.0],[60300.0,3,0.0],[60600.0,0,1200.0],[62100.0,6,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[62400.0,0,0.0],[62700.0,3,0.0],[63300.0,2,0.0],[63375.0,0,0.0],[63600.0,1,600.0],[64500.0,6,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[64800.0,0,0.0],[65100.0,3,0.0],[65700.0,2,0.0],[65775.0,0,0.0],[66000.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[67200.0,2,0.0],[67500.0,3,0.0],[67800.0,0,0.0],[68100.0,2,0.0],[68400.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[69600.0,2,0.0],[69900.0,3,0.0],[70200.0,0,0.0],[70500.0,2,0.0],[70800.0,1,600.0],[71700.0,6,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[72000.0,0,0.0],[72300.0,3,0.0],[72900.0,2,0.0],[72975.0,0,0.0],[73200.0,1,600.0],[74100.0,6,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[74400.0,0,0.0],[74700.0,3,0.0],[75300.0,2,0.0],[75375.0,0,0.0],[75600.0,1,600.0]]}]},"generatedBy":"SNIFF ver.6"}

View File

@ -1 +1 @@
{"song":{"player2":"dad","player1":"bf","speed":1,"needsVoices":true,"sectionLengths":[],"song":"Bopeebo","notes":[{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[0,2,0],[600,3,450],[1050,3,600]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[2400,2,0],[3000,3,450],[3450,3,600]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[4800,1,300],[5400,0,300],[6000,3,300]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[7200,1,300],[7800,0,300],[8400,3,300]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[9600,1,150],[10200,3,0],[10500,0,0],[10800,1,450]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[12000,1,150],[12600,3,0],[12900,0,0],[13200,1,450]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[14400,3,0],[14700,1,0],[15300,0,0],[15600,2,300]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[16800,3,0],[17100,1,0],[17700,0,0],[18000,2,300]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[19200,0,0],[19500,3,0],[19800,1,750]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[21600,0,0],[21900,3,0],[22200,1,750]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[24000,1,0],[24300,3,0],[24600,0,750]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[26700,3,0],[27000,0,750],[26400,1,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[28800,2,0],[29100,3,0],[29400,0,1050]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[31200,2,0],[31500,3,0],[31800,0,1050]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[33600,0,0],[33900,3,0],[34500,2,0],[34800,1,450]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[36000,0,0],[36300,3,0],[36900,2,0],[37200,1,450]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[38400,2,450],[39000,3,300],[39600,0,450]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[40800,2,450],[41400,3,300],[42000,0,450]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[43200,1,0],[43800,2,0],[44400,1,0],[44550,1,0],[44700,1,0],[45000,2,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[45600,1,0],[46200,2,0],[46800,1,0],[46950,1,0],[47100,1,0],[47400,2,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[48000,2,450],[48600,3,300],[49200,0,450]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[50400,2,450],[51000,3,300],[51600,0,450]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[52800,3,1650]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[55200,3,1650]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[57600,2,0],[57900,3,0],[58200,0,1050]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[60000,2,0],[60300,3,0],[60600,0,1050],[62100,6,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[62400,0,0],[62700,3,0],[63300,2,0],[63600,1,450],[64500,6,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[64800,0,0],[65100,3,0],[65700,2,0],[66000,1,450]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[67200,2,0],[67500,3,0],[67800,0,0],[68100,2,0],[68400,1,450]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[69600,2,0],[69900,3,0],[70200,0,0],[70500,2,0],[70800,1,450],[71700,6,0]]},{"mustHitSection":false,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[72000,0,0],[72300,3,0],[72900,2,0],[73200,1,450],[74100,6,0]]},{"mustHitSection":true,"typeOfSection":0,"lengthInSteps":16,"sectionNotes":[[74400,0,0],[74700,3,0],[75300,2,0],[75600,1,450]]},{"lengthInSteps":16,"bpm":100,"changeBPM":false,"mustHitSection":true,"sectionNotes":[],"typeOfSection":0},{"lengthInSteps":16,"bpm":100,"changeBPM":false,"mustHitSection":true,"sectionNotes":[],"typeOfSection":0,"altAnim":false}],"bpm":100,"sections":0,"validScore":true}}
{"song":{"song":"Bopeebo","bpm":100.0,"needsVoices":true,"player1":"bf","player2":"dad","speed":1.0,"notes":[{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[0.0,2,0.0],[600.0,3,600.0],[1200.0,3,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[2400.0,2,0.0],[3000.0,3,600.0],[3600.0,3,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[4800.0,1,300.0],[5400.0,0,300.0],[6000.0,3,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[7200.0,1,300.0],[7800.0,0,300.0],[8400.0,3,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[9600.0,1,300.0],[10200.0,3,0.0],[10500.0,0,0.0],[10800.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[12000.0,1,300.0],[12600.0,3,0.0],[12900.0,0,0.0],[13200.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[14400.0,3,0.0],[14700.0,1,0.0],[15300.0,0,0.0],[15600.0,2,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[16800.0,3,0.0],[17100.0,1,0.0],[17700.0,0,0.0],[18000.0,2,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[19200.0,0,0.0],[19500.0,3,0.0],[19800.0,1,900.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[21600.0,0,0.0],[21900.0,3,0.0],[22200.0,1,900.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[24000.0,1,0.0],[24300.0,3,0.0],[24600.0,0,900.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[26400.0,1,0.0],[26700.0,3,0.0],[27000.0,0,900.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[28800.0,2,0.0],[29100.0,3,0.0],[29400.0,0,1200.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[31200.0,2,0.0],[31500.0,3,0.0],[31800.0,0,1200.0],[33300.0,6,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[33600.0,0,0.0],[33900.0,3,0.0],[34500.0,2,0.0],[34800.0,1,600.0],[35700.0,6,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[36000.0,0,0.0],[36300.0,3,0.0],[36900.0,2,0.0],[37200.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[38400.0,2,450.0],[39000.0,3,300.0],[39600.0,0,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[40800.0,2,450.0],[41400.0,3,300.0],[42000.0,0,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[43200.0,1,0.0],[43800.0,2,0.0],[44400.0,1,0.0],[44550.0,1,0.0],[44700.0,1,0.0],[45000.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[45600.0,1,0.0],[46200.0,2,0.0],[46800.0,1,0.0],[46950.0,1,0.0],[47100.0,1,0.0],[47400.0,2,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[48000.0,2,450.0],[48600.0,3,300.0],[49200.0,0,450.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[50400.0,2,450.0],[51000.0,3,300.0],[51600.0,0,450.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[52800.0,3,1800.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[55200.0,3,1800.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[57600.0,2,0.0],[57900.0,3,0.0],[58200.0,0,1200.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[60000.0,2,0.0],[60300.0,3,0.0],[60600.0,0,1200.0],[62100.0,6,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[62400.0,0,0.0],[62700.0,3,0.0],[63300.0,2,0.0],[63600.0,1,600.0],[64500.0,6,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[64800.0,0,0.0],[65100.0,3,0.0],[65700.0,2,0.0],[66000.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[67200.0,2,0.0],[67500.0,3,0.0],[67800.0,0,0.0],[68100.0,2,0.0],[68400.0,1,600.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[69600.0,2,0.0],[69900.0,3,0.0],[70200.0,0,0.0],[70500.0,2,0.0],[70800.0,1,600.0],[71700.0,6,0.0]]},{"lengthInSteps":16,"mustHitSection":false,"sectionNotes":[[72000.0,0,0.0],[72300.0,3,0.0],[72900.0,2,0.0],[73200.0,1,600.0],[74100.0,6,0.0]]},{"lengthInSteps":16,"mustHitSection":true,"sectionNotes":[[74400.0,0,0.0],[74700.0,3,0.0],[75300.0,2,0.0],[75600.0,1,600.0]]}]},"generatedBy":"SNIFF ver.6"}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -41,4 +41,5 @@ shoutouts to mason--for da homies
bonk--get in the discord call
carpal tunnel--game design
downscroll--i dont know what that is
warning--choking hazard
warning--choking hazard
devin chat--what an honorable man

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<TextureAtlas imagePath="FNF_main_menu_assets-2019.png">
<!-- Created with Adobe Animate version 19.2.1.408 -->
<!-- http://www.adobe.com/products/animate.html -->
<SubTexture name="back0000" x="0" y="0" width="1157" height="645"/>
<SubTexture name="no basic0000" x="1157" y="0" width="210" height="197"/>
<SubTexture name="no white0000" x="1367" y="0" width="210" height="197" frameX="-1" frameY="-14" frameWidth="212" frameHeight="215"/>
<SubTexture name="no white0001" x="1577" y="0" width="212" height="194" frameX="0" frameY="-10" frameWidth="212" frameHeight="215"/>
<SubTexture name="no white0002" x="1789" y="0" width="210" height="215" frameX="0" frameY="0" frameWidth="212" frameHeight="215"/>
<SubTexture name="ok basic0000" x="0" y="645" width="256" height="185"/>
<SubTexture name="ok white0000" x="256" y="645" width="256" height="185" frameX="0" frameY="-11" frameWidth="263" frameHeight="202"/>
<SubTexture name="ok white0001" x="512" y="645" width="230" height="183" frameX="-22" frameY="-11" frameWidth="263" frameHeight="202"/>
<SubTexture name="ok white0002" x="742" y="645" width="245" height="202" frameX="-18" frameY="0" frameWidth="263" frameHeight="202"/>
<SubTexture name="yes basic0000" x="987" y="645" width="303" height="205"/>
<SubTexture name="yes white0000" x="1290" y="645" width="303" height="205" frameX="-13" frameY="-19" frameWidth="340" frameHeight="230"/>
<SubTexture name="yes white0001" x="1593" y="645" width="330" height="230" frameX="-8" frameY="0" frameWidth="340" frameHeight="230"/>
<SubTexture name="yes white0002" x="0" y="875" width="340" height="214" frameX="0" frameY="-12" frameWidth="340" frameHeight="230"/>
</TextureAtlas>

View File

@ -0,0 +1,587 @@
{"frames": {
"donate basic0000":
{
"frame": {"x":0,"y":0,"w":444,"h":117},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":444,"h":117},
"sourceSize": {"w":444,"h":117}
},
"donate basic0001":
{
"frame": {"x":0,"y":0,"w":444,"h":117},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":444,"h":117},
"sourceSize": {"w":444,"h":117}
},
"donate basic0002":
{
"frame": {"x":0,"y":0,"w":444,"h":117},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":444,"h":117},
"sourceSize": {"w":444,"h":117}
},
"donate basic0003":
{
"frame": {"x":444,"y":0,"w":444,"h":117},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":444,"h":117},
"sourceSize": {"w":444,"h":117}
},
"donate basic0004":
{
"frame": {"x":444,"y":0,"w":444,"h":117},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":444,"h":117},
"sourceSize": {"w":444,"h":117}
},
"donate basic0005":
{
"frame": {"x":444,"y":0,"w":444,"h":117},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":444,"h":117},
"sourceSize": {"w":444,"h":117}
},
"donate basic0006":
{
"frame": {"x":888,"y":0,"w":444,"h":117},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":444,"h":117},
"sourceSize": {"w":444,"h":117}
},
"donate basic0007":
{
"frame": {"x":888,"y":0,"w":444,"h":117},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":444,"h":117},
"sourceSize": {"w":444,"h":117}
},
"donate basic0008":
{
"frame": {"x":888,"y":0,"w":444,"h":117},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":444,"h":117},
"sourceSize": {"w":444,"h":117}
},
"donate white0000":
{
"frame": {"x":1332,"y":0,"w":590,"h":157},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":2,"w":590,"h":159},
"sourceSize": {"w":590,"h":159}
},
"donate white0001":
{
"frame": {"x":0,"y":157,"w":587,"h":154},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":5,"w":590,"h":159},
"sourceSize": {"w":590,"h":159}
},
"donate white0002":
{
"frame": {"x":587,"y":157,"w":585,"h":155},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":590,"h":159},
"sourceSize": {"w":590,"h":159}
},
"freeplay basic0000":
{
"frame": {"x":1172,"y":157,"w":484,"h":122},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":484,"h":122},
"sourceSize": {"w":484,"h":122}
},
"freeplay basic0001":
{
"frame": {"x":1172,"y":157,"w":484,"h":122},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":484,"h":122},
"sourceSize": {"w":484,"h":122}
},
"freeplay basic0002":
{
"frame": {"x":1172,"y":157,"w":484,"h":122},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":484,"h":122},
"sourceSize": {"w":484,"h":122}
},
"freeplay basic0003":
{
"frame": {"x":0,"y":312,"w":484,"h":122},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":484,"h":122},
"sourceSize": {"w":484,"h":122}
},
"freeplay basic0004":
{
"frame": {"x":0,"y":312,"w":484,"h":122},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":484,"h":122},
"sourceSize": {"w":484,"h":122}
},
"freeplay basic0005":
{
"frame": {"x":0,"y":312,"w":484,"h":122},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":484,"h":122},
"sourceSize": {"w":484,"h":122}
},
"freeplay basic0006":
{
"frame": {"x":484,"y":312,"w":484,"h":122},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":484,"h":122},
"sourceSize": {"w":484,"h":122}
},
"freeplay basic0007":
{
"frame": {"x":484,"y":312,"w":484,"h":122},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":484,"h":122},
"sourceSize": {"w":484,"h":122}
},
"freeplay basic0008":
{
"frame": {"x":484,"y":312,"w":484,"h":122},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":484,"h":122},
"sourceSize": {"w":484,"h":122}
},
"freeplay white0000":
{
"frame": {"x":968,"y":312,"w":627,"h":169},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":635,"h":174},
"sourceSize": {"w":635,"h":174}
},
"freeplay white0001":
{
"frame": {"x":0,"y":481,"w":632,"h":170},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":1,"w":635,"h":174},
"sourceSize": {"w":635,"h":174}
},
"freeplay white0002":
{
"frame": {"x":632,"y":481,"w":629,"h":173},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":1,"w":635,"h":174},
"sourceSize": {"w":635,"h":174}
},
"login basic0000":
{
"frame": {"x":1261,"y":481,"w":359,"h":109},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":359,"h":109},
"sourceSize": {"w":359,"h":109}
},
"login basic0001":
{
"frame": {"x":1261,"y":481,"w":359,"h":109},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":359,"h":109},
"sourceSize": {"w":359,"h":109}
},
"login basic0002":
{
"frame": {"x":1261,"y":481,"w":359,"h":109},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":359,"h":109},
"sourceSize": {"w":359,"h":109}
},
"login basic0003":
{
"frame": {"x":1620,"y":481,"w":359,"h":109},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":359,"h":109},
"sourceSize": {"w":359,"h":109}
},
"login basic0004":
{
"frame": {"x":1620,"y":481,"w":359,"h":109},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":359,"h":109},
"sourceSize": {"w":359,"h":109}
},
"login basic0005":
{
"frame": {"x":1620,"y":481,"w":359,"h":109},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":359,"h":109},
"sourceSize": {"w":359,"h":109}
},
"login basic0006":
{
"frame": {"x":0,"y":654,"w":358,"h":109},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":359,"h":109},
"sourceSize": {"w":359,"h":109}
},
"login basic0007":
{
"frame": {"x":0,"y":654,"w":358,"h":109},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":359,"h":109},
"sourceSize": {"w":359,"h":109}
},
"login basic0008":
{
"frame": {"x":0,"y":654,"w":358,"h":109},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":359,"h":109},
"sourceSize": {"w":359,"h":109}
},
"login white0000":
{
"frame": {"x":358,"y":654,"w":449,"h":137},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":449,"h":137},
"sourceSize": {"w":449,"h":137}
},
"login white0001":
{
"frame": {"x":807,"y":654,"w":449,"h":137},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":449,"h":137},
"sourceSize": {"w":449,"h":137}
},
"login white0002":
{
"frame": {"x":1256,"y":654,"w":448,"h":137},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":449,"h":137},
"sourceSize": {"w":449,"h":137}
},
"logout basic0000":
{
"frame": {"x":0,"y":791,"w":428,"h":110},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":428,"h":110},
"sourceSize": {"w":428,"h":110}
},
"logout basic0001":
{
"frame": {"x":0,"y":791,"w":428,"h":110},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":428,"h":110},
"sourceSize": {"w":428,"h":110}
},
"logout basic0002":
{
"frame": {"x":0,"y":791,"w":428,"h":110},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":428,"h":110},
"sourceSize": {"w":428,"h":110}
},
"logout basic0003":
{
"frame": {"x":428,"y":791,"w":428,"h":110},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":428,"h":110},
"sourceSize": {"w":428,"h":110}
},
"logout basic0004":
{
"frame": {"x":428,"y":791,"w":428,"h":110},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":428,"h":110},
"sourceSize": {"w":428,"h":110}
},
"logout basic0005":
{
"frame": {"x":428,"y":791,"w":428,"h":110},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":428,"h":110},
"sourceSize": {"w":428,"h":110}
},
"logout basic0006":
{
"frame": {"x":856,"y":791,"w":428,"h":110},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":428,"h":110},
"sourceSize": {"w":428,"h":110}
},
"logout basic0007":
{
"frame": {"x":856,"y":791,"w":428,"h":110},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":428,"h":110},
"sourceSize": {"w":428,"h":110}
},
"logout basic0008":
{
"frame": {"x":856,"y":791,"w":428,"h":110},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":428,"h":110},
"sourceSize": {"w":428,"h":110}
},
"logout white0000":
{
"frame": {"x":1284,"y":791,"w":537,"h":138},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":538,"h":138},
"sourceSize": {"w":538,"h":138}
},
"logout white0001":
{
"frame": {"x":0,"y":929,"w":538,"h":138},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":538,"h":138},
"sourceSize": {"w":538,"h":138}
},
"logout white0002":
{
"frame": {"x":538,"y":929,"w":536,"h":138},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":538,"h":138},
"sourceSize": {"w":538,"h":138}
},
"options basic0000":
{
"frame": {"x":1074,"y":929,"w":487,"h":112},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":487,"h":112},
"sourceSize": {"w":487,"h":112}
},
"options basic0001":
{
"frame": {"x":1074,"y":929,"w":487,"h":112},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":487,"h":112},
"sourceSize": {"w":487,"h":112}
},
"options basic0002":
{
"frame": {"x":1074,"y":929,"w":487,"h":112},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":487,"h":112},
"sourceSize": {"w":487,"h":112}
},
"options basic0003":
{
"frame": {"x":1561,"y":929,"w":487,"h":112},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":487,"h":112},
"sourceSize": {"w":487,"h":112}
},
"options basic0004":
{
"frame": {"x":1561,"y":929,"w":487,"h":112},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":487,"h":112},
"sourceSize": {"w":487,"h":112}
},
"options basic0005":
{
"frame": {"x":1561,"y":929,"w":487,"h":112},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":487,"h":112},
"sourceSize": {"w":487,"h":112}
},
"options basic0006":
{
"frame": {"x":0,"y":1067,"w":487,"h":112},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":487,"h":112},
"sourceSize": {"w":487,"h":112}
},
"options basic0007":
{
"frame": {"x":0,"y":1067,"w":487,"h":112},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":487,"h":112},
"sourceSize": {"w":487,"h":112}
},
"options basic0008":
{
"frame": {"x":0,"y":1067,"w":487,"h":112},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":487,"h":112},
"sourceSize": {"w":487,"h":112}
},
"options white0000":
{
"frame": {"x":487,"y":1067,"w":607,"h":155},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":1,"w":609,"h":163},
"sourceSize": {"w":609,"h":163}
},
"options white0001":
{
"frame": {"x":1094,"y":1067,"w":606,"h":158},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":1,"w":609,"h":163},
"sourceSize": {"w":609,"h":163}
},
"options white0002":
{
"frame": {"x":0,"y":1225,"w":609,"h":163},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":609,"h":163},
"sourceSize": {"w":609,"h":163}
},
"story mode basic0000":
{
"frame": {"x":609,"y":1225,"w":615,"h":122},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":615,"h":122},
"sourceSize": {"w":615,"h":122}
},
"story mode basic0001":
{
"frame": {"x":609,"y":1225,"w":615,"h":122},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":615,"h":122},
"sourceSize": {"w":615,"h":122}
},
"story mode basic0002":
{
"frame": {"x":609,"y":1225,"w":615,"h":122},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":615,"h":122},
"sourceSize": {"w":615,"h":122}
},
"story mode basic0003":
{
"frame": {"x":1224,"y":1225,"w":615,"h":122},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":615,"h":122},
"sourceSize": {"w":615,"h":122}
},
"story mode basic0004":
{
"frame": {"x":1224,"y":1225,"w":615,"h":122},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":615,"h":122},
"sourceSize": {"w":615,"h":122}
},
"story mode basic0005":
{
"frame": {"x":1224,"y":1225,"w":615,"h":122},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":615,"h":122},
"sourceSize": {"w":615,"h":122}
},
"story mode basic0006":
{
"frame": {"x":0,"y":1388,"w":615,"h":122},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":615,"h":122},
"sourceSize": {"w":615,"h":122}
},
"story mode basic0007":
{
"frame": {"x":0,"y":1388,"w":615,"h":122},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":615,"h":122},
"sourceSize": {"w":615,"h":122}
},
"story mode basic0008":
{
"frame": {"x":0,"y":1388,"w":615,"h":122},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":615,"h":122},
"sourceSize": {"w":615,"h":122}
},
"story mode white0000":
{
"frame": {"x":615,"y":1388,"w":796,"h":173},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":3,"w":796,"h":181},
"sourceSize": {"w":796,"h":181}
},
"story mode white0001":
{
"frame": {"x":0,"y":1561,"w":794,"h":174},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":2,"w":796,"h":181},
"sourceSize": {"w":796,"h":181}
},
"story mode white0002":
{
"frame": {"x":794,"y":1561,"w":794,"h":181},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":796,"h":181},
"sourceSize": {"w":796,"h":181}
}},
"meta": {
"app": "Adobe Animate",
"version": "19.2.1.408",
"image": "FNF_main_menu_assets.png",
"format": "RGBA8888",
"size": {"w":2048,"h":2048},
"scale": "1"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 275 KiB

After

Width:  |  Height:  |  Size: 366 KiB

View File

@ -1,53 +1,77 @@
<?xml version="1.0" encoding="utf-8"?>
<TextureAtlas imagePath="FNF_main_menu_assets.png">
<!-- Created with Adobe Animate version 20.0.0.17400 -->
<!-- Created with Adobe Animate version 19.2.1.408 -->
<!-- http://www.adobe.com/products/animate.html -->
<SubTexture name="donate basic0000" x="0" y="0" width="444" height="117"/>
<SubTexture name="donate basic0001" x="0" y="0" width="444" height="117"/>
<SubTexture name="donate basic0002" x="0" y="0" width="444" height="117"/>
<SubTexture name="donate basic0003" x="454" y="0" width="444" height="117"/>
<SubTexture name="donate basic0004" x="454" y="0" width="444" height="117"/>
<SubTexture name="donate basic0005" x="454" y="0" width="444" height="117"/>
<SubTexture name="donate basic0006" x="908" y="0" width="444" height="117"/>
<SubTexture name="donate basic0007" x="908" y="0" width="444" height="117"/>
<SubTexture name="donate basic0008" x="908" y="0" width="444" height="117"/>
<SubTexture name="donate white0000" x="1362" y="0" width="590" height="157" frameX="0" frameY="-2" frameWidth="590" frameHeight="159"/>
<SubTexture name="donate white0001" x="0" y="167" width="587" height="154" frameX="-1" frameY="-5" frameWidth="590" frameHeight="159"/>
<SubTexture name="donate white0002" x="597" y="167" width="585" height="155" frameX="-3" frameY="0" frameWidth="590" frameHeight="159"/>
<SubTexture name="freeplay basic0000" x="1192" y="167" width="484" height="122"/>
<SubTexture name="freeplay basic0001" x="1192" y="167" width="484" height="122"/>
<SubTexture name="freeplay basic0002" x="1192" y="167" width="484" height="122"/>
<SubTexture name="freeplay basic0003" x="0" y="332" width="484" height="122"/>
<SubTexture name="freeplay basic0004" x="0" y="332" width="484" height="122"/>
<SubTexture name="freeplay basic0005" x="0" y="332" width="484" height="122"/>
<SubTexture name="freeplay basic0006" x="494" y="332" width="484" height="122"/>
<SubTexture name="freeplay basic0007" x="494" y="332" width="484" height="122"/>
<SubTexture name="freeplay basic0008" x="494" y="332" width="484" height="122"/>
<SubTexture name="freeplay white0000" x="988" y="332" width="627" height="169" frameX="0" frameY="0" frameWidth="635" frameHeight="174"/>
<SubTexture name="freeplay white0001" x="0" y="511" width="632" height="170" frameX="-3" frameY="-1" frameWidth="635" frameHeight="174"/>
<SubTexture name="freeplay white0002" x="642" y="511" width="629" height="173" frameX="-4" frameY="-1" frameWidth="635" frameHeight="174"/>
<SubTexture name="options basic0000" x="1281" y="511" width="487" height="111"/>
<SubTexture name="options basic0001" x="1281" y="511" width="487" height="111"/>
<SubTexture name="options basic0002" x="1281" y="511" width="487" height="111"/>
<SubTexture name="options basic0003" x="0" y="694" width="487" height="111"/>
<SubTexture name="options basic0004" x="0" y="694" width="487" height="111"/>
<SubTexture name="options basic0005" x="0" y="694" width="487" height="111"/>
<SubTexture name="options basic0006" x="497" y="694" width="487" height="111"/>
<SubTexture name="options basic0007" x="497" y="694" width="487" height="111"/>
<SubTexture name="options basic0008" x="497" y="694" width="487" height="111"/>
<SubTexture name="options white0000" x="994" y="694" width="606" height="155" frameX="-2" frameY="-1" frameWidth="610" frameHeight="163"/>
<SubTexture name="options white0001" x="0" y="859" width="607" height="158" frameX="-3" frameY="-1" frameWidth="610" frameHeight="163"/>
<SubTexture name="options white0002" x="617" y="859" width="610" height="163"/>
<SubTexture name="story mode basic0000" x="1237" y="859" width="615" height="122"/>
<SubTexture name="story mode basic0001" x="1237" y="859" width="615" height="122"/>
<SubTexture name="story mode basic0002" x="1237" y="859" width="615" height="122"/>
<SubTexture name="story mode basic0003" x="0" y="1032" width="615" height="122"/>
<SubTexture name="story mode basic0004" x="0" y="1032" width="615" height="122"/>
<SubTexture name="story mode basic0005" x="0" y="1032" width="615" height="122"/>
<SubTexture name="story mode basic0006" x="625" y="1032" width="615" height="122"/>
<SubTexture name="story mode basic0007" x="625" y="1032" width="615" height="122"/>
<SubTexture name="story mode basic0008" x="625" y="1032" width="615" height="122"/>
<SubTexture name="story mode white0000" x="1250" y="1032" width="796" height="173" frameX="0" frameY="-3" frameWidth="796" frameHeight="181"/>
<SubTexture name="story mode white0001" x="0" y="1215" width="794" height="174" frameX="-2" frameY="-2" frameWidth="796" frameHeight="181"/>
<SubTexture name="story mode white0002" x="804" y="1215" width="794" height="181" frameX="0" frameY="0" frameWidth="796" frameHeight="181"/>
<SubTexture name="donate basic0003" x="444" y="0" width="444" height="117"/>
<SubTexture name="donate basic0004" x="444" y="0" width="444" height="117"/>
<SubTexture name="donate basic0005" x="444" y="0" width="444" height="117"/>
<SubTexture name="donate basic0006" x="888" y="0" width="444" height="117"/>
<SubTexture name="donate basic0007" x="888" y="0" width="444" height="117"/>
<SubTexture name="donate basic0008" x="888" y="0" width="444" height="117"/>
<SubTexture name="donate white0000" x="1332" y="0" width="590" height="157" frameX="0" frameY="-2" frameWidth="590" frameHeight="159"/>
<SubTexture name="donate white0001" x="0" y="157" width="587" height="154" frameX="-1" frameY="-5" frameWidth="590" frameHeight="159"/>
<SubTexture name="donate white0002" x="587" y="157" width="585" height="155" frameX="-3" frameY="0" frameWidth="590" frameHeight="159"/>
<SubTexture name="freeplay basic0000" x="1172" y="157" width="484" height="122"/>
<SubTexture name="freeplay basic0001" x="1172" y="157" width="484" height="122"/>
<SubTexture name="freeplay basic0002" x="1172" y="157" width="484" height="122"/>
<SubTexture name="freeplay basic0003" x="0" y="312" width="484" height="122"/>
<SubTexture name="freeplay basic0004" x="0" y="312" width="484" height="122"/>
<SubTexture name="freeplay basic0005" x="0" y="312" width="484" height="122"/>
<SubTexture name="freeplay basic0006" x="484" y="312" width="484" height="122"/>
<SubTexture name="freeplay basic0007" x="484" y="312" width="484" height="122"/>
<SubTexture name="freeplay basic0008" x="484" y="312" width="484" height="122"/>
<SubTexture name="freeplay white0000" x="968" y="312" width="627" height="169" frameX="0" frameY="0" frameWidth="635" frameHeight="174"/>
<SubTexture name="freeplay white0001" x="0" y="481" width="632" height="170" frameX="-3" frameY="-1" frameWidth="635" frameHeight="174"/>
<SubTexture name="freeplay white0002" x="632" y="481" width="629" height="173" frameX="-4" frameY="-1" frameWidth="635" frameHeight="174"/>
<SubTexture name="login basic0000" x="1261" y="481" width="359" height="109"/>
<SubTexture name="login basic0001" x="1261" y="481" width="359" height="109"/>
<SubTexture name="login basic0002" x="1261" y="481" width="359" height="109"/>
<SubTexture name="login basic0003" x="1620" y="481" width="359" height="109"/>
<SubTexture name="login basic0004" x="1620" y="481" width="359" height="109"/>
<SubTexture name="login basic0005" x="1620" y="481" width="359" height="109"/>
<SubTexture name="login basic0006" x="0" y="654" width="358" height="109" frameX="0" frameY="0" frameWidth="359" frameHeight="109"/>
<SubTexture name="login basic0007" x="0" y="654" width="358" height="109" frameX="0" frameY="0" frameWidth="359" frameHeight="109"/>
<SubTexture name="login basic0008" x="0" y="654" width="358" height="109" frameX="0" frameY="0" frameWidth="359" frameHeight="109"/>
<SubTexture name="login white0000" x="358" y="654" width="449" height="137"/>
<SubTexture name="login white0001" x="807" y="654" width="449" height="137"/>
<SubTexture name="login white0002" x="1256" y="654" width="448" height="137" frameX="0" frameY="0" frameWidth="449" frameHeight="137"/>
<SubTexture name="logout basic0000" x="0" y="791" width="428" height="110"/>
<SubTexture name="logout basic0001" x="0" y="791" width="428" height="110"/>
<SubTexture name="logout basic0002" x="0" y="791" width="428" height="110"/>
<SubTexture name="logout basic0003" x="428" y="791" width="428" height="110"/>
<SubTexture name="logout basic0004" x="428" y="791" width="428" height="110"/>
<SubTexture name="logout basic0005" x="428" y="791" width="428" height="110"/>
<SubTexture name="logout basic0006" x="856" y="791" width="428" height="110"/>
<SubTexture name="logout basic0007" x="856" y="791" width="428" height="110"/>
<SubTexture name="logout basic0008" x="856" y="791" width="428" height="110"/>
<SubTexture name="logout white0000" x="1284" y="791" width="537" height="138" frameX="0" frameY="0" frameWidth="538" frameHeight="138"/>
<SubTexture name="logout white0001" x="0" y="929" width="538" height="138"/>
<SubTexture name="logout white0002" x="538" y="929" width="536" height="138" frameX="-1" frameY="0" frameWidth="538" frameHeight="138"/>
<SubTexture name="options basic0000" x="1074" y="929" width="487" height="112"/>
<SubTexture name="options basic0001" x="1074" y="929" width="487" height="112"/>
<SubTexture name="options basic0002" x="1074" y="929" width="487" height="112"/>
<SubTexture name="options basic0003" x="1561" y="929" width="487" height="112"/>
<SubTexture name="options basic0004" x="1561" y="929" width="487" height="112"/>
<SubTexture name="options basic0005" x="1561" y="929" width="487" height="112"/>
<SubTexture name="options basic0006" x="0" y="1067" width="487" height="112"/>
<SubTexture name="options basic0007" x="0" y="1067" width="487" height="112"/>
<SubTexture name="options basic0008" x="0" y="1067" width="487" height="112"/>
<SubTexture name="options white0000" x="487" y="1067" width="607" height="155" frameX="-1" frameY="-1" frameWidth="609" frameHeight="163"/>
<SubTexture name="options white0001" x="1094" y="1067" width="606" height="158" frameX="-3" frameY="-1" frameWidth="609" frameHeight="163"/>
<SubTexture name="options white0002" x="0" y="1225" width="609" height="163"/>
<SubTexture name="story mode basic0000" x="609" y="1225" width="615" height="122"/>
<SubTexture name="story mode basic0001" x="609" y="1225" width="615" height="122"/>
<SubTexture name="story mode basic0002" x="609" y="1225" width="615" height="122"/>
<SubTexture name="story mode basic0003" x="1224" y="1225" width="615" height="122"/>
<SubTexture name="story mode basic0004" x="1224" y="1225" width="615" height="122"/>
<SubTexture name="story mode basic0005" x="1224" y="1225" width="615" height="122"/>
<SubTexture name="story mode basic0006" x="0" y="1388" width="615" height="122"/>
<SubTexture name="story mode basic0007" x="0" y="1388" width="615" height="122"/>
<SubTexture name="story mode basic0008" x="0" y="1388" width="615" height="122"/>
<SubTexture name="story mode white0000" x="615" y="1388" width="796" height="173" frameX="0" frameY="-3" frameWidth="796" frameHeight="181"/>
<SubTexture name="story mode white0001" x="0" y="1561" width="794" height="174" frameX="-2" frameY="-2" frameWidth="796" frameHeight="181"/>
<SubTexture name="story mode white0002" x="794" y="1561" width="794" height="181" frameX="0" frameY="0" frameWidth="796" frameHeight="181"/>
</TextureAtlas>

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<TextureAtlas imagePath="checkboxThingie.png">
<!-- Created with Adobe Animate version 21.0.4.39603 -->
<!-- http://www.adobe.com/products/animate.html -->
<SubTexture name="Check Box Selected Static0000" x="0" y="198" width="120" height="174" frameX="0" frameY="0" frameWidth="140" frameHeight="225"/>
<SubTexture name="Check Box Selected Static0001" x="0" y="198" width="120" height="174" frameX="0" frameY="0" frameWidth="140" frameHeight="225"/>
<SubTexture name="Check Box selecting animation0000" x="371" y="0" width="121" height="82" frameX="-15" frameY="-133" frameWidth="140" frameHeight="225"/>
<SubTexture name="Check Box selecting animation0001" x="371" y="0" width="121" height="82" frameX="-15" frameY="-133" frameWidth="140" frameHeight="225"/>
<SubTexture name="Check Box selecting animation0002" x="132" y="0" width="127" height="180" frameX="-4" frameY="-45" frameWidth="140" frameHeight="225"/>
<SubTexture name="Check Box selecting animation0003" x="0" y="0" width="127" height="193" frameX="0" frameY="0" frameWidth="140" frameHeight="225"/>
<SubTexture name="Check Box selecting animation0004" x="0" y="0" width="127" height="193" frameX="0" frameY="0" frameWidth="140" frameHeight="225"/>
<SubTexture name="Check Box selecting animation0005" x="257" y="185" width="138" height="146" frameX="-2" frameY="-62" frameWidth="140" frameHeight="225"/>
<SubTexture name="Check Box selecting animation0006" x="257" y="185" width="138" height="146" frameX="-2" frameY="-62" frameWidth="140" frameHeight="225"/>
<SubTexture name="Check Box selecting animation0007" x="132" y="185" width="120" height="176" frameX="-12" frameY="-29" frameWidth="140" frameHeight="225"/>
<SubTexture name="Check Box selecting animation0008" x="132" y="185" width="120" height="176" frameX="-12" frameY="-29" frameWidth="140" frameHeight="225"/>
<SubTexture name="Check Box selecting animation0009" x="0" y="198" width="120" height="174" frameX="-12" frameY="-29" frameWidth="140" frameHeight="225"/>
<SubTexture name="Check Box selecting animation0010" x="0" y="198" width="120" height="174" frameX="-12" frameY="-29" frameWidth="140" frameHeight="225"/>
<SubTexture name="Check Box unselected0000" x="264" y="0" width="102" height="103"/>
</TextureAtlas>

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

View File

@ -0,0 +1,257 @@
<?xml version="1.0" encoding="utf-8"?>
<TextureAtlas imagePath="bold.png">
<!-- Created with Adobe Animate version 19.2.1.408 -->
<!-- http://www.adobe.com/products/animate.html -->
<SubTexture name="#0000" x="2" y="2" width="50" height="56"/>
<SubTexture name="#0001" x="2" y="2" width="50" height="56"/>
<SubTexture name="#0002" x="54" y="2" width="50" height="56"/>
<SubTexture name="#0003" x="54" y="2" width="50" height="56"/>
<SubTexture name="$0000" x="106" y="2" width="52" height="76"/>
<SubTexture name="$0001" x="106" y="2" width="52" height="76"/>
<SubTexture name="$0002" x="160" y="2" width="52" height="76"/>
<SubTexture name="$0003" x="160" y="2" width="52" height="76"/>
<SubTexture name="%0000" x="214" y="2" width="58" height="64"/>
<SubTexture name="%0001" x="214" y="2" width="58" height="64"/>
<SubTexture name="%0002" x="274" y="2" width="58" height="64"/>
<SubTexture name="%0003" x="274" y="2" width="58" height="64"/>
<SubTexture name="&0000" x="334" y="2" width="36" height="58"/>
<SubTexture name="&0001" x="334" y="2" width="36" height="58"/>
<SubTexture name="&0002" x="372" y="2" width="36" height="58"/>
<SubTexture name="&0003" x="372" y="2" width="36" height="58"/>
<SubTexture name="(0000" x="410" y="2" width="38" height="69"/>
<SubTexture name="(0001" x="410" y="2" width="38" height="69"/>
<SubTexture name="(0002" x="450" y="2" width="38" height="69"/>
<SubTexture name="(0003" x="450" y="2" width="38" height="69"/>
<SubTexture name=")0000" x="2" y="80" width="38" height="67"/>
<SubTexture name=")0001" x="2" y="80" width="38" height="67"/>
<SubTexture name=")0002" x="42" y="80" width="38" height="67"/>
<SubTexture name=")0003" x="42" y="80" width="38" height="67"/>
<SubTexture name="*0000" x="82" y="80" width="27" height="31"/>
<SubTexture name="*0001" x="82" y="80" width="27" height="31"/>
<SubTexture name="*0002" x="111" y="80" width="27" height="31"/>
<SubTexture name="*0003" x="111" y="80" width="27" height="31"/>
<SubTexture name="+0000" x="140" y="80" width="42" height="39"/>
<SubTexture name="+0001" x="140" y="80" width="42" height="39"/>
<SubTexture name="+0002" x="184" y="80" width="42" height="39"/>
<SubTexture name="+0003" x="184" y="80" width="42" height="39"/>
<SubTexture name="-angry faic-0000" x="228" y="80" width="54" height="54"/>
<SubTexture name="-angry faic-0001" x="228" y="80" width="54" height="54"/>
<SubTexture name="-angry faic-0002" x="284" y="80" width="54" height="54"/>
<SubTexture name="-angry faic-0003" x="284" y="80" width="54" height="54"/>
<SubTexture name="-apostraphie-0000" x="340" y="80" width="29" height="39"/>
<SubTexture name="-apostraphie-0001" x="340" y="80" width="29" height="39"/>
<SubTexture name="-apostraphie-0002" x="371" y="80" width="29" height="39"/>
<SubTexture name="-apostraphie-0003" x="371" y="80" width="29" height="39"/>
<SubTexture name="-back slash-0000" x="402" y="80" width="43" height="59"/>
<SubTexture name="-back slash-0001" x="402" y="80" width="43" height="59"/>
<SubTexture name="-back slash-0002" x="447" y="80" width="43" height="59"/>
<SubTexture name="-back slash-0003" x="447" y="80" width="43" height="59"/>
<SubTexture name="-comma-0000" x="2" y="149" width="31" height="35"/>
<SubTexture name="-comma-0001" x="2" y="149" width="31" height="35"/>
<SubTexture name="-comma-0002" x="35" y="149" width="31" height="35"/>
<SubTexture name="-comma-0003" x="35" y="149" width="31" height="35"/>
<SubTexture name="-dash-0000" x="68" y="149" width="49" height="25"/>
<SubTexture name="-dash-0001" x="68" y="149" width="49" height="25"/>
<SubTexture name="-dash-0002" x="119" y="149" width="49" height="25"/>
<SubTexture name="-dash-0003" x="119" y="149" width="49" height="25"/>
<SubTexture name="-down arrow-0000" x="170" y="149" width="39" height="44"/>
<SubTexture name="-down arrow-0001" x="170" y="149" width="39" height="44"/>
<SubTexture name="-down arrow-0002" x="211" y="149" width="39" height="44"/>
<SubTexture name="-down arrow-0003" x="211" y="149" width="39" height="44"/>
<SubTexture name="-end quote-0000" x="252" y="149" width="40" height="48"/>
<SubTexture name="-end quote-0001" x="252" y="149" width="40" height="48"/>
<SubTexture name="-end quote-0002" x="294" y="149" width="40" height="48"/>
<SubTexture name="-end quote-0003" x="294" y="149" width="40" height="48"/>
<SubTexture name="-exclamation point-0000" x="336" y="149" width="29" height="76"/>
<SubTexture name="-exclamation point-0001" x="336" y="149" width="29" height="76"/>
<SubTexture name="-exclamation point-0002" x="367" y="149" width="29" height="76"/>
<SubTexture name="-exclamation point-0003" x="367" y="149" width="29" height="76"/>
<SubTexture name="-forward slash-0000" x="398" y="149" width="46" height="58"/>
<SubTexture name="-forward slash-0001" x="398" y="149" width="46" height="58"/>
<SubTexture name="-forward slash-0002" x="446" y="149" width="46" height="58"/>
<SubTexture name="-forward slash-0003" x="446" y="149" width="46" height="58"/>
<SubTexture name="-heart-0000" x="2" y="227" width="43" height="41"/>
<SubTexture name="-heart-0001" x="2" y="227" width="43" height="41"/>
<SubTexture name="-heart-0002" x="47" y="227" width="43" height="41"/>
<SubTexture name="-heart-0003" x="47" y="227" width="43" height="41"/>
<SubTexture name="-left arrow-0000" x="92" y="227" width="41" height="39"/>
<SubTexture name="-left arrow-0001" x="92" y="227" width="41" height="39"/>
<SubTexture name="-left arrow-0002" x="135" y="227" width="41" height="39"/>
<SubTexture name="-left arrow-0003" x="135" y="227" width="41" height="39"/>
<SubTexture name="-multiply x-0000" x="178" y="227" width="34" height="32"/>
<SubTexture name="-multiply x-0001" x="178" y="227" width="34" height="32"/>
<SubTexture name="-multiply x-0002" x="214" y="227" width="34" height="32"/>
<SubTexture name="-multiply x-0003" x="214" y="227" width="34" height="32"/>
<SubTexture name="-period-0000" x="250" y="227" width="26" height="26"/>
<SubTexture name="-period-0001" x="250" y="227" width="26" height="26"/>
<SubTexture name="-period-0002" x="278" y="227" width="26" height="26"/>
<SubTexture name="-period-0003" x="278" y="227" width="26" height="26"/>
<SubTexture name="-question mark-0000" x="306" y="227" width="51" height="77"/>
<SubTexture name="-question mark-0001" x="306" y="227" width="51" height="77"/>
<SubTexture name="-question mark-0002" x="359" y="227" width="51" height="77"/>
<SubTexture name="-question mark-0003" x="359" y="227" width="51" height="77"/>
<SubTexture name="-right arrow-0000" x="412" y="227" width="40" height="36"/>
<SubTexture name="-right arrow-0001" x="412" y="227" width="40" height="36"/>
<SubTexture name="-right arrow-0002" x="454" y="227" width="40" height="36"/>
<SubTexture name="-right arrow-0003" x="454" y="227" width="40" height="36"/>
<SubTexture name="-start quote-0000" x="2" y="306" width="43" height="45"/>
<SubTexture name="-start quote-0001" x="2" y="306" width="43" height="45"/>
<SubTexture name="-start quote-0002" x="47" y="306" width="43" height="45"/>
<SubTexture name="-start quote-0003" x="47" y="306" width="43" height="45"/>
<SubTexture name="-up arrow-0000" x="92" y="306" width="36" height="42"/>
<SubTexture name="-up arrow-0001" x="92" y="306" width="36" height="42"/>
<SubTexture name="-up arrow-0002" x="130" y="306" width="36" height="42"/>
<SubTexture name="-up arrow-0003" x="130" y="306" width="36" height="42"/>
<SubTexture name=":0000" x="168" y="306" width="26" height="52"/>
<SubTexture name=":0001" x="168" y="306" width="26" height="52"/>
<SubTexture name=":0002" x="196" y="306" width="26" height="52"/>
<SubTexture name=":0003" x="196" y="306" width="26" height="52"/>
<SubTexture name=";0000" x="224" y="306" width="27" height="56"/>
<SubTexture name=";0001" x="224" y="306" width="27" height="56"/>
<SubTexture name=";0002" x="253" y="306" width="27" height="56"/>
<SubTexture name=";0003" x="253" y="306" width="27" height="56"/>
<SubTexture name="<0000" x="282" y="306" width="38" height="56"/>
<SubTexture name="<0001" x="282" y="306" width="38" height="56"/>
<SubTexture name="<0002" x="322" y="306" width="38" height="56"/>
<SubTexture name="<0003" x="322" y="306" width="38" height="56"/>
<SubTexture name="=0000" x="362" y="306" width="39" height="29"/>
<SubTexture name="=0001" x="362" y="306" width="39" height="29"/>
<SubTexture name="=0002" x="403" y="306" width="39" height="29"/>
<SubTexture name="=0003" x="403" y="306" width="39" height="29"/>
<SubTexture name=">0000" x="444" y="306" width="38" height="61"/>
<SubTexture name=">0001" x="444" y="306" width="38" height="61"/>
<SubTexture name=">0002" x="2" y="369" width="38" height="61"/>
<SubTexture name=">0003" x="2" y="369" width="38" height="61"/>
<SubTexture name="@0000" x="42" y="369" width="52" height="56"/>
<SubTexture name="@0001" x="42" y="369" width="52" height="56"/>
<SubTexture name="@0002" x="96" y="369" width="52" height="56"/>
<SubTexture name="@0003" x="96" y="369" width="52" height="56"/>
<SubTexture name="A0000" x="92" y="441" width="54" height="67"/>
<SubTexture name="A0001" x="92" y="441" width="54" height="67"/>
<SubTexture name="A0002" x="148" y="441" width="54" height="67"/>
<SubTexture name="A0003" x="148" y="441" width="54" height="67"/>
<SubTexture name="B0000" x="204" y="441" width="46" height="70"/>
<SubTexture name="B0001" x="204" y="441" width="46" height="70"/>
<SubTexture name="B0002" x="252" y="441" width="46" height="70"/>
<SubTexture name="B0003" x="252" y="441" width="46" height="70"/>
<SubTexture name="C0000" x="300" y="441" width="55" height="66"/>
<SubTexture name="C0001" x="300" y="441" width="55" height="66"/>
<SubTexture name="C0002" x="357" y="441" width="55" height="66"/>
<SubTexture name="C0003" x="357" y="441" width="55" height="66"/>
<SubTexture name="D0000" x="414" y="441" width="53" height="67"/>
<SubTexture name="D0001" x="414" y="441" width="53" height="67"/>
<SubTexture name="D0002" x="2" y="513" width="53" height="67"/>
<SubTexture name="D0003" x="2" y="513" width="53" height="67"/>
<SubTexture name="E0000" x="57" y="513" width="43" height="66"/>
<SubTexture name="E0001" x="57" y="513" width="43" height="66"/>
<SubTexture name="E0002" x="102" y="513" width="43" height="66"/>
<SubTexture name="E0003" x="102" y="513" width="43" height="66"/>
<SubTexture name="F0000" x="147" y="513" width="43" height="67"/>
<SubTexture name="F0001" x="147" y="513" width="43" height="67"/>
<SubTexture name="F0002" x="192" y="513" width="43" height="67"/>
<SubTexture name="F0003" x="192" y="513" width="43" height="67"/>
<SubTexture name="G0000" x="237" y="513" width="54" height="70"/>
<SubTexture name="G0001" x="237" y="513" width="54" height="70"/>
<SubTexture name="G0002" x="293" y="513" width="54" height="70"/>
<SubTexture name="G0003" x="293" y="513" width="54" height="70"/>
<SubTexture name="H0000" x="349" y="513" width="45" height="66"/>
<SubTexture name="H0001" x="349" y="513" width="45" height="66"/>
<SubTexture name="H0002" x="396" y="513" width="45" height="66"/>
<SubTexture name="H0003" x="396" y="513" width="45" height="66"/>
<SubTexture name="I0000" x="443" y="513" width="43" height="64"/>
<SubTexture name="I0001" x="443" y="513" width="43" height="64"/>
<SubTexture name="I0002" x="2" y="585" width="43" height="64"/>
<SubTexture name="I0003" x="2" y="585" width="43" height="64"/>
<SubTexture name="J0000" x="47" y="585" width="54" height="70"/>
<SubTexture name="J0001" x="47" y="585" width="54" height="70"/>
<SubTexture name="J0002" x="103" y="585" width="54" height="70"/>
<SubTexture name="J0003" x="103" y="585" width="54" height="70"/>
<SubTexture name="K0000" x="159" y="585" width="44" height="69"/>
<SubTexture name="K0001" x="159" y="585" width="44" height="69"/>
<SubTexture name="K0002" x="205" y="585" width="44" height="69"/>
<SubTexture name="K0003" x="205" y="585" width="44" height="69"/>
<SubTexture name="L0000" x="251" y="585" width="41" height="66"/>
<SubTexture name="L0001" x="251" y="585" width="41" height="66"/>
<SubTexture name="L0002" x="294" y="585" width="41" height="66"/>
<SubTexture name="L0003" x="294" y="585" width="41" height="66"/>
<SubTexture name="M0000" x="337" y="585" width="56" height="63"/>
<SubTexture name="M0001" x="337" y="585" width="56" height="63"/>
<SubTexture name="M0002" x="395" y="585" width="56" height="63"/>
<SubTexture name="M0003" x="395" y="585" width="56" height="63"/>
<SubTexture name="N0000" x="453" y="585" width="45" height="65"/>
<SubTexture name="N0001" x="453" y="585" width="45" height="65"/>
<SubTexture name="N0002" x="2" y="657" width="45" height="65"/>
<SubTexture name="N0003" x="2" y="657" width="45" height="65"/>
<SubTexture name="O0000" x="49" y="657" width="50" height="69"/>
<SubTexture name="O0001" x="49" y="657" width="50" height="69"/>
<SubTexture name="O0002" x="101" y="657" width="50" height="69"/>
<SubTexture name="O0003" x="101" y="657" width="50" height="69"/>
<SubTexture name="P0000" x="153" y="657" width="46" height="70"/>
<SubTexture name="P0001" x="153" y="657" width="46" height="70"/>
<SubTexture name="P0002" x="201" y="657" width="46" height="70"/>
<SubTexture name="P0003" x="201" y="657" width="46" height="70"/>
<SubTexture name="Q0000" x="249" y="657" width="52" height="67"/>
<SubTexture name="Q0001" x="249" y="657" width="52" height="67"/>
<SubTexture name="Q0002" x="303" y="657" width="52" height="67"/>
<SubTexture name="Q0003" x="303" y="657" width="52" height="67"/>
<SubTexture name="R0000" x="357" y="657" width="47" height="66"/>
<SubTexture name="R0001" x="357" y="657" width="47" height="66"/>
<SubTexture name="R0002" x="406" y="657" width="47" height="66"/>
<SubTexture name="R0003" x="406" y="657" width="47" height="66"/>
<SubTexture name="S0000" x="455" y="657" width="49" height="66"/>
<SubTexture name="S0001" x="455" y="657" width="49" height="66"/>
<SubTexture name="S0002" x="2" y="729" width="49" height="66"/>
<SubTexture name="S0003" x="2" y="729" width="49" height="66"/>
<SubTexture name="T0000" x="53" y="729" width="44" height="64"/>
<SubTexture name="T0001" x="53" y="729" width="44" height="64"/>
<SubTexture name="T0002" x="99" y="729" width="44" height="64"/>
<SubTexture name="T0003" x="99" y="729" width="44" height="64"/>
<SubTexture name="U0000" x="145" y="729" width="44" height="59"/>
<SubTexture name="U0001" x="145" y="729" width="44" height="59"/>
<SubTexture name="U0002" x="191" y="729" width="44" height="59"/>
<SubTexture name="U0003" x="191" y="729" width="44" height="59"/>
<SubTexture name="V0000" x="237" y="729" width="54" height="66"/>
<SubTexture name="V0001" x="237" y="729" width="54" height="66"/>
<SubTexture name="V0002" x="293" y="729" width="54" height="66"/>
<SubTexture name="V0003" x="293" y="729" width="54" height="66"/>
<SubTexture name="W0000" x="349" y="729" width="58" height="63"/>
<SubTexture name="W0001" x="349" y="729" width="58" height="63"/>
<SubTexture name="W0002" x="409" y="729" width="58" height="63"/>
<SubTexture name="W0003" x="409" y="729" width="58" height="63"/>
<SubTexture name="X0000" x="2" y="797" width="55" height="67"/>
<SubTexture name="X0001" x="2" y="797" width="55" height="67"/>
<SubTexture name="X0002" x="59" y="797" width="55" height="67"/>
<SubTexture name="X0003" x="59" y="797" width="55" height="67"/>
<SubTexture name="Y0000" x="116" y="797" width="54" height="69"/>
<SubTexture name="Y0001" x="116" y="797" width="54" height="69"/>
<SubTexture name="Y0002" x="172" y="797" width="54" height="69"/>
<SubTexture name="Y0003" x="172" y="797" width="54" height="69"/>
<SubTexture name="Z0000" x="228" y="797" width="52" height="65"/>
<SubTexture name="Z0001" x="228" y="797" width="52" height="65"/>
<SubTexture name="Z0002" x="282" y="797" width="52" height="65"/>
<SubTexture name="Z0003" x="282" y="797" width="52" height="65"/>
<SubTexture name="[0000" x="150" y="369" width="25" height="61"/>
<SubTexture name="[0001" x="150" y="369" width="25" height="61"/>
<SubTexture name="[0002" x="177" y="369" width="25" height="61"/>
<SubTexture name="[0003" x="177" y="369" width="25" height="61"/>
<SubTexture name="]0000" x="204" y="369" width="25" height="63"/>
<SubTexture name="]0001" x="204" y="369" width="25" height="63"/>
<SubTexture name="]0002" x="231" y="369" width="25" height="63"/>
<SubTexture name="]0003" x="231" y="369" width="25" height="63"/>
<SubTexture name="^0000" x="258" y="369" width="32" height="27"/>
<SubTexture name="^0001" x="258" y="369" width="32" height="27"/>
<SubTexture name="^0002" x="292" y="369" width="32" height="27"/>
<SubTexture name="^0003" x="292" y="369" width="32" height="27"/>
<SubTexture name="_0000" x="326" y="369" width="65" height="25"/>
<SubTexture name="_0001" x="326" y="369" width="65" height="25"/>
<SubTexture name="_0002" x="393" y="369" width="65" height="25"/>
<SubTexture name="_0003" x="393" y="369" width="65" height="25"/>
<SubTexture name="|0000" x="460" y="369" width="11" height="70"/>
<SubTexture name="|0001" x="460" y="369" width="11" height="70"/>
<SubTexture name="|0002" x="473" y="369" width="11" height="70"/>
<SubTexture name="|0003" x="473" y="369" width="11" height="70"/>
<SubTexture name="~0000" x="2" y="441" width="43" height="21"/>
<SubTexture name="~0001" x="2" y="441" width="43" height="21"/>
<SubTexture name="~0002" x="47" y="441" width="43" height="21"/>
<SubTexture name="~0003" x="47" y="441" width="43" height="21"/>
</TextureAtlas>

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

View File

@ -0,0 +1,401 @@
<?xml version="1.0" encoding="utf-8"?>
<TextureAtlas imagePath="default.png">
<!-- Created with Adobe Animate version 19.2.1.408 -->
<!-- http://www.adobe.com/products/animate.html -->
<SubTexture name="#0000" x="170" y="508" width="39" height="44"/>
<SubTexture name="#0001" x="170" y="508" width="39" height="44"/>
<SubTexture name="#0002" x="211" y="508" width="39" height="44"/>
<SubTexture name="#0003" x="211" y="508" width="39" height="44"/>
<SubTexture name="$0000" x="252" y="508" width="40" height="64"/>
<SubTexture name="$0001" x="252" y="508" width="40" height="64"/>
<SubTexture name="$0002" x="294" y="508" width="40" height="64"/>
<SubTexture name="$0003" x="294" y="508" width="40" height="64"/>
<SubTexture name="%0000" x="336" y="508" width="46" height="52"/>
<SubTexture name="%0001" x="336" y="508" width="46" height="52"/>
<SubTexture name="%0002" x="384" y="508" width="46" height="52"/>
<SubTexture name="%0003" x="384" y="508" width="46" height="52"/>
<SubTexture name="&0000" x="432" y="508" width="36" height="58"/>
<SubTexture name="&0001" x="432" y="508" width="36" height="58"/>
<SubTexture name="&0002" x="470" y="508" width="36" height="58"/>
<SubTexture name="&0003" x="470" y="508" width="36" height="58"/>
<SubTexture name="(0000" x="2" y="574" width="26" height="57"/>
<SubTexture name="(0001" x="2" y="574" width="26" height="57"/>
<SubTexture name="(0002" x="30" y="574" width="26" height="57"/>
<SubTexture name="(0003" x="30" y="574" width="26" height="57"/>
<SubTexture name=")0000" x="58" y="574" width="26" height="55"/>
<SubTexture name=")0001" x="58" y="574" width="26" height="55"/>
<SubTexture name=")0002" x="86" y="574" width="26" height="55"/>
<SubTexture name=")0003" x="86" y="574" width="26" height="55"/>
<SubTexture name="*0000" x="114" y="574" width="27" height="31"/>
<SubTexture name="*0001" x="114" y="574" width="27" height="31"/>
<SubTexture name="*0002" x="143" y="574" width="27" height="31"/>
<SubTexture name="*0003" x="143" y="574" width="27" height="31"/>
<SubTexture name="+0000" x="172" y="574" width="42" height="39"/>
<SubTexture name="+0001" x="172" y="574" width="42" height="39"/>
<SubTexture name="+0002" x="216" y="574" width="42" height="39"/>
<SubTexture name="+0003" x="216" y="574" width="42" height="39"/>
<SubTexture name="-dash-0000" x="260" y="574" width="37" height="13"/>
<SubTexture name="-dash-0001" x="260" y="574" width="37" height="13"/>
<SubTexture name="-dash-0002" x="299" y="574" width="37" height="13"/>
<SubTexture name="-dash-0003" x="299" y="574" width="37" height="13"/>
<SubTexture name="-angry faic-0000" x="338" y="574" width="54" height="54"/>
<SubTexture name="-angry faic-0001" x="338" y="574" width="54" height="54"/>
<SubTexture name="-angry faic-0002" x="394" y="574" width="54" height="54"/>
<SubTexture name="-angry faic-0003" x="394" y="574" width="54" height="54"/>
<SubTexture name="-apostraphie-0000" x="450" y="574" width="17" height="27"/>
<SubTexture name="-apostraphie-0001" x="450" y="574" width="17" height="27"/>
<SubTexture name="-apostraphie-0002" x="469" y="574" width="17" height="27"/>
<SubTexture name="-apostraphie-0003" x="469" y="574" width="17" height="27"/>
<SubTexture name="-back slash-0000" x="2" y="633" width="43" height="59"/>
<SubTexture name="-back slash-0001" x="2" y="633" width="43" height="59"/>
<SubTexture name="-back slash-0002" x="47" y="633" width="43" height="59"/>
<SubTexture name="-back slash-0003" x="47" y="633" width="43" height="59"/>
<SubTexture name="-comma-0000" x="92" y="633" width="19" height="23"/>
<SubTexture name="-comma-0001" x="92" y="633" width="19" height="23"/>
<SubTexture name="-comma-0002" x="113" y="633" width="19" height="23"/>
<SubTexture name="-comma-0003" x="113" y="633" width="19" height="23"/>
<SubTexture name="-down arrow-0000" x="134" y="633" width="39" height="44"/>
<SubTexture name="-down arrow-0001" x="134" y="633" width="39" height="44"/>
<SubTexture name="-down arrow-0002" x="175" y="633" width="39" height="44"/>
<SubTexture name="-down arrow-0003" x="175" y="633" width="39" height="44"/>
<SubTexture name="-end quote-0000" x="216" y="633" width="28" height="36"/>
<SubTexture name="-end quote-0001" x="216" y="633" width="28" height="36"/>
<SubTexture name="-end quote-0002" x="246" y="633" width="28" height="36"/>
<SubTexture name="-end quote-0003" x="246" y="633" width="28" height="36"/>
<SubTexture name="-exclamation point-0000" x="276" y="633" width="17" height="64"/>
<SubTexture name="-exclamation point-0001" x="276" y="633" width="17" height="64"/>
<SubTexture name="-exclamation point-0002" x="295" y="633" width="17" height="64"/>
<SubTexture name="-exclamation point-0003" x="295" y="633" width="17" height="64"/>
<SubTexture name="-forward slash-0000" x="314" y="633" width="46" height="58"/>
<SubTexture name="-forward slash-0001" x="314" y="633" width="46" height="58"/>
<SubTexture name="-forward slash-0002" x="362" y="633" width="46" height="58"/>
<SubTexture name="-forward slash-0003" x="362" y="633" width="46" height="58"/>
<SubTexture name="-heart-0000" x="410" y="633" width="43" height="41"/>
<SubTexture name="-heart-0001" x="410" y="633" width="43" height="41"/>
<SubTexture name="-heart-0002" x="455" y="633" width="43" height="41"/>
<SubTexture name="-heart-0003" x="455" y="633" width="43" height="41"/>
<SubTexture name="-left arrow-0000" x="2" y="699" width="41" height="39"/>
<SubTexture name="-left arrow-0001" x="2" y="699" width="41" height="39"/>
<SubTexture name="-left arrow-0002" x="45" y="699" width="41" height="39"/>
<SubTexture name="-left arrow-0003" x="45" y="699" width="41" height="39"/>
<SubTexture name="-multiply x-0000" x="88" y="699" width="34" height="32"/>
<SubTexture name="-multiply x-0001" x="88" y="699" width="34" height="32"/>
<SubTexture name="-multiply x-0002" x="124" y="699" width="34" height="32"/>
<SubTexture name="-multiply x-0003" x="124" y="699" width="34" height="32"/>
<SubTexture name="-period-0000" x="160" y="699" width="14" height="14"/>
<SubTexture name="-period-0001" x="160" y="699" width="14" height="14"/>
<SubTexture name="-period-0002" x="176" y="699" width="14" height="14"/>
<SubTexture name="-period-0003" x="176" y="699" width="14" height="14"/>
<SubTexture name="-question mark-0000" x="192" y="699" width="39" height="65"/>
<SubTexture name="-question mark-0001" x="192" y="699" width="39" height="65"/>
<SubTexture name="-question mark-0002" x="233" y="699" width="39" height="65"/>
<SubTexture name="-question mark-0003" x="233" y="699" width="39" height="65"/>
<SubTexture name="-right arrow-0000" x="274" y="699" width="40" height="36"/>
<SubTexture name="-right arrow-0001" x="274" y="699" width="40" height="36"/>
<SubTexture name="-right arrow-0002" x="316" y="699" width="40" height="36"/>
<SubTexture name="-right arrow-0003" x="316" y="699" width="40" height="36"/>
<SubTexture name="-start quote-0000" x="358" y="699" width="31" height="33"/>
<SubTexture name="-start quote-0001" x="358" y="699" width="31" height="33"/>
<SubTexture name="-start quote-0002" x="391" y="699" width="31" height="33"/>
<SubTexture name="-start quote-0003" x="391" y="699" width="31" height="33"/>
<SubTexture name="-up arrow-0000" x="424" y="699" width="36" height="42"/>
<SubTexture name="-up arrow-0001" x="424" y="699" width="36" height="42"/>
<SubTexture name="-up arrow-0002" x="462" y="699" width="36" height="42"/>
<SubTexture name="-up arrow-0003" x="462" y="699" width="36" height="42"/>
<SubTexture name="00000" x="191" y="157" width="35" height="54"/>
<SubTexture name="00001" x="191" y="157" width="35" height="54"/>
<SubTexture name="00002" x="228" y="157" width="35" height="54"/>
<SubTexture name="00003" x="228" y="157" width="35" height="54"/>
<SubTexture name="10000" x="265" y="157" width="23" height="53"/>
<SubTexture name="10001" x="265" y="157" width="23" height="53"/>
<SubTexture name="10002" x="290" y="157" width="23" height="53"/>
<SubTexture name="10003" x="290" y="157" width="23" height="53"/>
<SubTexture name="20000" x="315" y="157" width="37" height="52"/>
<SubTexture name="20001" x="315" y="157" width="37" height="52"/>
<SubTexture name="20002" x="354" y="157" width="37" height="52"/>
<SubTexture name="20003" x="354" y="157" width="37" height="52"/>
<SubTexture name="30000" x="393" y="157" width="34" height="56"/>
<SubTexture name="30001" x="393" y="157" width="34" height="56"/>
<SubTexture name="30002" x="429" y="157" width="34" height="56"/>
<SubTexture name="30003" x="429" y="157" width="34" height="56"/>
<SubTexture name="40000" x="465" y="157" width="35" height="55"/>
<SubTexture name="40001" x="465" y="157" width="35" height="55"/>
<SubTexture name="40002" x="2" y="215" width="35" height="55"/>
<SubTexture name="40003" x="2" y="215" width="35" height="55"/>
<SubTexture name="50000" x="39" y="215" width="41" height="53"/>
<SubTexture name="50001" x="39" y="215" width="41" height="53"/>
<SubTexture name="50002" x="82" y="215" width="41" height="53"/>
<SubTexture name="50003" x="82" y="215" width="41" height="53"/>
<SubTexture name="60000" x="125" y="215" width="39" height="54"/>
<SubTexture name="60001" x="125" y="215" width="39" height="54"/>
<SubTexture name="60002" x="166" y="215" width="39" height="54"/>
<SubTexture name="60003" x="166" y="215" width="39" height="54"/>
<SubTexture name="70000" x="207" y="215" width="40" height="49"/>
<SubTexture name="70001" x="207" y="215" width="40" height="49"/>
<SubTexture name="70002" x="249" y="215" width="40" height="49"/>
<SubTexture name="70003" x="249" y="215" width="40" height="49"/>
<SubTexture name="80000" x="291" y="215" width="34" height="56"/>
<SubTexture name="80001" x="291" y="215" width="34" height="56"/>
<SubTexture name="80002" x="327" y="215" width="34" height="56"/>
<SubTexture name="80003" x="327" y="215" width="34" height="56"/>
<SubTexture name="90000" x="363" y="215" width="34" height="57"/>
<SubTexture name="90001" x="363" y="215" width="34" height="57"/>
<SubTexture name="90002" x="399" y="215" width="34" height="57"/>
<SubTexture name="90003" x="399" y="215" width="34" height="57"/>
<SubTexture name=":0000" x="2" y="766" width="14" height="40"/>
<SubTexture name=":0001" x="2" y="766" width="14" height="40"/>
<SubTexture name=":0002" x="18" y="766" width="14" height="40"/>
<SubTexture name=":0003" x="18" y="766" width="14" height="40"/>
<SubTexture name=";0000" x="34" y="766" width="15" height="44"/>
<SubTexture name=";0001" x="34" y="766" width="15" height="44"/>
<SubTexture name=";0002" x="51" y="766" width="15" height="44"/>
<SubTexture name=";0003" x="51" y="766" width="15" height="44"/>
<SubTexture name="<0000" x="68" y="766" width="38" height="56"/>
<SubTexture name="<0001" x="68" y="766" width="38" height="56"/>
<SubTexture name="<0002" x="108" y="766" width="38" height="56"/>
<SubTexture name="<0003" x="108" y="766" width="38" height="56"/>
<SubTexture name="=0000" x="148" y="766" width="39" height="29"/>
<SubTexture name="=0001" x="148" y="766" width="39" height="29"/>
<SubTexture name="=0002" x="189" y="766" width="39" height="29"/>
<SubTexture name="=0003" x="189" y="766" width="39" height="29"/>
<SubTexture name=">0000" x="230" y="766" width="38" height="61"/>
<SubTexture name=">0001" x="230" y="766" width="38" height="61"/>
<SubTexture name=">0002" x="270" y="766" width="38" height="61"/>
<SubTexture name=">0003" x="270" y="766" width="38" height="61"/>
<SubTexture name="@0000" x="310" y="766" width="52" height="56"/>
<SubTexture name="@0001" x="310" y="766" width="52" height="56"/>
<SubTexture name="@0002" x="364" y="766" width="52" height="56"/>
<SubTexture name="@0003" x="364" y="766" width="52" height="56"/>
<SubTexture name="A0000" x="435" y="215" width="45" height="59"/>
<SubTexture name="A0001" x="435" y="215" width="45" height="59"/>
<SubTexture name="A0002" x="2" y="276" width="45" height="59"/>
<SubTexture name="A0003" x="2" y="276" width="45" height="59"/>
<SubTexture name="B0000" x="49" y="276" width="38" height="59"/>
<SubTexture name="B0001" x="49" y="276" width="38" height="59"/>
<SubTexture name="B0002" x="89" y="276" width="38" height="59"/>
<SubTexture name="B0003" x="89" y="276" width="38" height="59"/>
<SubTexture name="C0000" x="129" y="276" width="45" height="57"/>
<SubTexture name="C0001" x="129" y="276" width="45" height="57"/>
<SubTexture name="C0002" x="176" y="276" width="45" height="57"/>
<SubTexture name="C0003" x="176" y="276" width="45" height="57"/>
<SubTexture name="D0000" x="223" y="276" width="48" height="56"/>
<SubTexture name="D0001" x="223" y="276" width="48" height="56"/>
<SubTexture name="D0002" x="273" y="276" width="48" height="56"/>
<SubTexture name="D0003" x="273" y="276" width="48" height="56"/>
<SubTexture name="E0000" x="323" y="276" width="34" height="53"/>
<SubTexture name="E0001" x="323" y="276" width="34" height="53"/>
<SubTexture name="E0002" x="359" y="276" width="34" height="53"/>
<SubTexture name="E0003" x="359" y="276" width="34" height="53"/>
<SubTexture name="F0000" x="395" y="276" width="36" height="51"/>
<SubTexture name="F0001" x="395" y="276" width="36" height="51"/>
<SubTexture name="F0002" x="433" y="276" width="36" height="51"/>
<SubTexture name="F0003" x="433" y="276" width="36" height="51"/>
<SubTexture name="G0000" x="2" y="337" width="43" height="55"/>
<SubTexture name="G0001" x="2" y="337" width="43" height="55"/>
<SubTexture name="G0002" x="47" y="337" width="43" height="55"/>
<SubTexture name="G0003" x="47" y="337" width="43" height="55"/>
<SubTexture name="H0000" x="92" y="337" width="32" height="53"/>
<SubTexture name="H0001" x="92" y="337" width="32" height="53"/>
<SubTexture name="H0002" x="126" y="337" width="32" height="53"/>
<SubTexture name="H0003" x="126" y="337" width="32" height="53"/>
<SubTexture name="I0000" x="160" y="337" width="36" height="52"/>
<SubTexture name="I0001" x="160" y="337" width="36" height="52"/>
<SubTexture name="I0002" x="198" y="337" width="36" height="52"/>
<SubTexture name="I0003" x="198" y="337" width="36" height="52"/>
<SubTexture name="J0000" x="236" y="337" width="39" height="54"/>
<SubTexture name="J0001" x="236" y="337" width="39" height="54"/>
<SubTexture name="J0002" x="277" y="337" width="39" height="54"/>
<SubTexture name="J0003" x="277" y="337" width="39" height="54"/>
<SubTexture name="K0000" x="318" y="337" width="35" height="52"/>
<SubTexture name="K0001" x="318" y="337" width="35" height="52"/>
<SubTexture name="K0002" x="355" y="337" width="35" height="52"/>
<SubTexture name="K0003" x="355" y="337" width="35" height="52"/>
<SubTexture name="L0000" x="392" y="337" width="34" height="53"/>
<SubTexture name="L0001" x="392" y="337" width="34" height="53"/>
<SubTexture name="L0002" x="428" y="337" width="34" height="53"/>
<SubTexture name="L0003" x="428" y="337" width="34" height="53"/>
<SubTexture name="M0000" x="464" y="337" width="44" height="50"/>
<SubTexture name="M0001" x="464" y="337" width="44" height="50"/>
<SubTexture name="M0002" x="2" y="394" width="44" height="50"/>
<SubTexture name="M0003" x="2" y="394" width="44" height="50"/>
<SubTexture name="N0000" x="48" y="394" width="32" height="50"/>
<SubTexture name="N0001" x="48" y="394" width="32" height="50"/>
<SubTexture name="N0002" x="82" y="394" width="32" height="50"/>
<SubTexture name="N0003" x="82" y="394" width="32" height="50"/>
<SubTexture name="O0000" x="116" y="394" width="40" height="54"/>
<SubTexture name="O0001" x="116" y="394" width="40" height="54"/>
<SubTexture name="O0002" x="158" y="394" width="40" height="54"/>
<SubTexture name="O0003" x="158" y="394" width="40" height="54"/>
<SubTexture name="P0000" x="200" y="394" width="35" height="51"/>
<SubTexture name="P0001" x="200" y="394" width="35" height="51"/>
<SubTexture name="P0002" x="237" y="394" width="35" height="51"/>
<SubTexture name="P0003" x="237" y="394" width="35" height="51"/>
<SubTexture name="Q0000" x="274" y="394" width="41" height="51"/>
<SubTexture name="Q0001" x="274" y="394" width="41" height="51"/>
<SubTexture name="Q0002" x="317" y="394" width="41" height="51"/>
<SubTexture name="Q0003" x="317" y="394" width="41" height="51"/>
<SubTexture name="R0000" x="360" y="394" width="40" height="55"/>
<SubTexture name="R0001" x="360" y="394" width="40" height="55"/>
<SubTexture name="R0002" x="402" y="394" width="40" height="55"/>
<SubTexture name="R0003" x="402" y="394" width="40" height="55"/>
<SubTexture name="S0000" x="444" y="394" width="38" height="55"/>
<SubTexture name="S0001" x="444" y="394" width="38" height="55"/>
<SubTexture name="S0002" x="2" y="451" width="38" height="55"/>
<SubTexture name="S0003" x="2" y="451" width="38" height="55"/>
<SubTexture name="T0000" x="42" y="451" width="42" height="50"/>
<SubTexture name="T0001" x="42" y="451" width="42" height="50"/>
<SubTexture name="T0002" x="86" y="451" width="42" height="50"/>
<SubTexture name="T0003" x="86" y="451" width="42" height="50"/>
<SubTexture name="U0000" x="130" y="451" width="38" height="49"/>
<SubTexture name="U0001" x="130" y="451" width="38" height="49"/>
<SubTexture name="U0002" x="170" y="451" width="38" height="49"/>
<SubTexture name="U0003" x="170" y="451" width="38" height="49"/>
<SubTexture name="V0000" x="210" y="451" width="40" height="48"/>
<SubTexture name="V0001" x="210" y="451" width="40" height="48"/>
<SubTexture name="V0002" x="252" y="451" width="40" height="48"/>
<SubTexture name="V0003" x="252" y="451" width="40" height="48"/>
<SubTexture name="W0000" x="294" y="451" width="46" height="51"/>
<SubTexture name="W0001" x="294" y="451" width="46" height="51"/>
<SubTexture name="W0002" x="342" y="451" width="46" height="51"/>
<SubTexture name="W0003" x="342" y="451" width="46" height="51"/>
<SubTexture name="X0000" x="390" y="451" width="41" height="53"/>
<SubTexture name="X0001" x="390" y="451" width="41" height="53"/>
<SubTexture name="X0002" x="433" y="451" width="41" height="53"/>
<SubTexture name="X0003" x="433" y="451" width="41" height="53"/>
<SubTexture name="Y0000" x="2" y="508" width="42" height="52"/>
<SubTexture name="Y0001" x="2" y="508" width="42" height="52"/>
<SubTexture name="Y0002" x="46" y="508" width="42" height="52"/>
<SubTexture name="Y0003" x="46" y="508" width="42" height="52"/>
<SubTexture name="Z0000" x="90" y="508" width="38" height="47"/>
<SubTexture name="Z0001" x="90" y="508" width="38" height="47"/>
<SubTexture name="Z0002" x="130" y="508" width="38" height="47"/>
<SubTexture name="Z0003" x="130" y="508" width="38" height="47"/>
<SubTexture name="[0000" x="418" y="766" width="25" height="61"/>
<SubTexture name="[0001" x="418" y="766" width="25" height="61"/>
<SubTexture name="[0002" x="445" y="766" width="25" height="61"/>
<SubTexture name="[0003" x="445" y="766" width="25" height="61"/>
<SubTexture name="]0000" x="472" y="766" width="25" height="63"/>
<SubTexture name="]0001" x="472" y="766" width="25" height="63"/>
<SubTexture name="]0002" x="2" y="831" width="25" height="63"/>
<SubTexture name="]0003" x="2" y="831" width="25" height="63"/>
<SubTexture name="^0000" x="29" y="831" width="32" height="27"/>
<SubTexture name="^0001" x="29" y="831" width="32" height="27"/>
<SubTexture name="^0002" x="63" y="831" width="32" height="27"/>
<SubTexture name="^0003" x="63" y="831" width="32" height="27"/>
<SubTexture name="_0000" x="97" y="831" width="53" height="13"/>
<SubTexture name="_0001" x="97" y="831" width="53" height="13"/>
<SubTexture name="_0002" x="152" y="831" width="53" height="13"/>
<SubTexture name="_0003" x="152" y="831" width="53" height="13"/>
<SubTexture name="a0000" x="2" y="2" width="36" height="38"/>
<SubTexture name="a0001" x="2" y="2" width="36" height="38"/>
<SubTexture name="a0002" x="40" y="2" width="36" height="38"/>
<SubTexture name="a0003" x="40" y="2" width="36" height="38"/>
<SubTexture name="b0000" x="78" y="2" width="31" height="50"/>
<SubTexture name="b0001" x="78" y="2" width="31" height="50"/>
<SubTexture name="b0002" x="111" y="2" width="31" height="50"/>
<SubTexture name="b0003" x="111" y="2" width="31" height="50"/>
<SubTexture name="c0000" x="144" y="2" width="33" height="33"/>
<SubTexture name="c0001" x="144" y="2" width="33" height="33"/>
<SubTexture name="c0002" x="179" y="2" width="33" height="33"/>
<SubTexture name="c0003" x="179" y="2" width="33" height="33"/>
<SubTexture name="d0000" x="214" y="2" width="32" height="53"/>
<SubTexture name="d0001" x="214" y="2" width="32" height="53"/>
<SubTexture name="d0002" x="248" y="2" width="32" height="53"/>
<SubTexture name="d0003" x="248" y="2" width="32" height="53"/>
<SubTexture name="e0000" x="282" y="2" width="33" height="37"/>
<SubTexture name="e0001" x="282" y="2" width="33" height="37"/>
<SubTexture name="e0002" x="317" y="2" width="33" height="37"/>
<SubTexture name="e0003" x="317" y="2" width="33" height="37"/>
<SubTexture name="f0000" x="352" y="2" width="27" height="48"/>
<SubTexture name="f0001" x="352" y="2" width="27" height="48"/>
<SubTexture name="f0002" x="381" y="2" width="27" height="48"/>
<SubTexture name="f0003" x="381" y="2" width="27" height="48"/>
<SubTexture name="g0000" x="410" y="2" width="33" height="41"/>
<SubTexture name="g0001" x="410" y="2" width="33" height="41"/>
<SubTexture name="g0002" x="445" y="2" width="33" height="41"/>
<SubTexture name="g0003" x="445" y="2" width="33" height="41"/>
<SubTexture name="h0000" x="480" y="2" width="29" height="48"/>
<SubTexture name="h0001" x="480" y="2" width="29" height="48"/>
<SubTexture name="h0002" x="2" y="57" width="29" height="48"/>
<SubTexture name="h0003" x="2" y="57" width="29" height="48"/>
<SubTexture name="i0000" x="33" y="57" width="13" height="42"/>
<SubTexture name="i0001" x="33" y="57" width="13" height="42"/>
<SubTexture name="i0002" x="48" y="57" width="13" height="42"/>
<SubTexture name="i0003" x="48" y="57" width="13" height="42"/>
<SubTexture name="j0000" x="63" y="57" width="28" height="48"/>
<SubTexture name="j0001" x="63" y="57" width="28" height="48"/>
<SubTexture name="j0002" x="93" y="57" width="28" height="48"/>
<SubTexture name="j0003" x="93" y="57" width="28" height="48"/>
<SubTexture name="k0000" x="123" y="57" width="35" height="48"/>
<SubTexture name="k0001" x="123" y="57" width="35" height="48"/>
<SubTexture name="k0002" x="160" y="57" width="35" height="48"/>
<SubTexture name="k0003" x="160" y="57" width="35" height="48"/>
<SubTexture name="l0000" x="197" y="57" width="10" height="48"/>
<SubTexture name="l0001" x="197" y="57" width="10" height="48"/>
<SubTexture name="l0002" x="209" y="57" width="10" height="48"/>
<SubTexture name="l0003" x="209" y="57" width="10" height="48"/>
<SubTexture name="m0000" x="221" y="57" width="41" height="27"/>
<SubTexture name="m0001" x="221" y="57" width="41" height="27"/>
<SubTexture name="m0002" x="264" y="57" width="41" height="27"/>
<SubTexture name="m0003" x="264" y="57" width="41" height="27"/>
<SubTexture name="n0000" x="307" y="57" width="27" height="30"/>
<SubTexture name="n0001" x="307" y="57" width="27" height="30"/>
<SubTexture name="n0002" x="336" y="57" width="27" height="30"/>
<SubTexture name="n0003" x="336" y="57" width="27" height="30"/>
<SubTexture name="o0000" x="365" y="57" width="30" height="32"/>
<SubTexture name="o0001" x="365" y="57" width="30" height="32"/>
<SubTexture name="o0002" x="397" y="57" width="30" height="32"/>
<SubTexture name="o0003" x="397" y="57" width="30" height="32"/>
<SubTexture name="p0000" x="429" y="57" width="28" height="43"/>
<SubTexture name="p0001" x="429" y="57" width="28" height="43"/>
<SubTexture name="p0002" x="459" y="57" width="28" height="43"/>
<SubTexture name="p0003" x="459" y="57" width="28" height="43"/>
<SubTexture name="q0000" x="2" y="107" width="36" height="43"/>
<SubTexture name="q0001" x="2" y="107" width="36" height="43"/>
<SubTexture name="q0002" x="40" y="107" width="36" height="43"/>
<SubTexture name="q0003" x="40" y="107" width="36" height="43"/>
<SubTexture name="r0000" x="78" y="107" width="24" height="29"/>
<SubTexture name="r0001" x="78" y="107" width="24" height="29"/>
<SubTexture name="r0002" x="104" y="107" width="24" height="29"/>
<SubTexture name="r0003" x="104" y="107" width="24" height="29"/>
<SubTexture name="s0000" x="130" y="107" width="27" height="35"/>
<SubTexture name="s0001" x="130" y="107" width="27" height="35"/>
<SubTexture name="s0002" x="159" y="107" width="27" height="35"/>
<SubTexture name="s0003" x="159" y="107" width="27" height="35"/>
<SubTexture name="t0000" x="188" y="107" width="28" height="48"/>
<SubTexture name="t0001" x="188" y="107" width="28" height="48"/>
<SubTexture name="t0002" x="218" y="107" width="28" height="48"/>
<SubTexture name="t0003" x="218" y="107" width="28" height="48"/>
<SubTexture name="u0000" x="248" y="107" width="31" height="33"/>
<SubTexture name="u0001" x="248" y="107" width="31" height="33"/>
<SubTexture name="u0002" x="281" y="107" width="31" height="33"/>
<SubTexture name="u0003" x="281" y="107" width="31" height="33"/>
<SubTexture name="v0000" x="314" y="107" width="32" height="31"/>
<SubTexture name="v0001" x="314" y="107" width="32" height="31"/>
<SubTexture name="v0002" x="348" y="107" width="32" height="31"/>
<SubTexture name="v0003" x="348" y="107" width="32" height="31"/>
<SubTexture name="w0000" x="382" y="107" width="42" height="31"/>
<SubTexture name="w0001" x="382" y="107" width="42" height="31"/>
<SubTexture name="w0002" x="426" y="107" width="42" height="31"/>
<SubTexture name="w0003" x="426" y="107" width="42" height="31"/>
<SubTexture name="x0000" x="470" y="107" width="33" height="33"/>
<SubTexture name="x0001" x="470" y="107" width="33" height="33"/>
<SubTexture name="x0002" x="2" y="157" width="33" height="33"/>
<SubTexture name="x0003" x="2" y="157" width="33" height="33"/>
<SubTexture name="y0000" x="37" y="157" width="35" height="42"/>
<SubTexture name="y0001" x="37" y="157" width="35" height="42"/>
<SubTexture name="y0002" x="74" y="157" width="35" height="42"/>
<SubTexture name="y0003" x="74" y="157" width="35" height="42"/>
<SubTexture name="z0000" x="111" y="157" width="38" height="31"/>
<SubTexture name="z0001" x="111" y="157" width="38" height="31"/>
<SubTexture name="z0002" x="151" y="157" width="38" height="31"/>
<SubTexture name="z0003" x="151" y="157" width="38" height="31"/>
<SubTexture name="|0000" x="207" y="831" width="11" height="70"/>
<SubTexture name="|0001" x="207" y="831" width="11" height="70"/>
<SubTexture name="|0002" x="220" y="831" width="11" height="70"/>
<SubTexture name="|0003" x="220" y="831" width="11" height="70"/>
<SubTexture name="~0000" x="233" y="831" width="43" height="21"/>
<SubTexture name="~0001" x="233" y="831" width="43" height="21"/>
<SubTexture name="~0002" x="278" y="831" width="43" height="21"/>
<SubTexture name="~0003" x="278" y="831" width="43" height="21"/>
</TextureAtlas>

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 365 KiB

View File

@ -0,0 +1,77 @@
<?xml version="1.0" encoding="utf-8"?>
<TextureAtlas imagePath="main_menu.png">
<!-- Created with Adobe Animate version 19.2.1.408 -->
<!-- http://www.adobe.com/products/animate.html -->
<SubTexture name="donate idle0000" x="2" y="2" width="444" height="117"/>
<SubTexture name="donate idle0001" x="2" y="2" width="444" height="117"/>
<SubTexture name="donate idle0002" x="2" y="2" width="444" height="117"/>
<SubTexture name="donate idle0003" x="448" y="2" width="444" height="117"/>
<SubTexture name="donate idle0004" x="448" y="2" width="444" height="117"/>
<SubTexture name="donate idle0005" x="448" y="2" width="444" height="117"/>
<SubTexture name="donate idle0006" x="894" y="2" width="444" height="117"/>
<SubTexture name="donate idle0007" x="894" y="2" width="444" height="117"/>
<SubTexture name="donate idle0008" x="894" y="2" width="444" height="117"/>
<SubTexture name="donate selected0000" x="1340" y="2" width="590" height="157" frameX="0" frameY="-2" frameWidth="590" frameHeight="159"/>
<SubTexture name="donate selected0001" x="2" y="161" width="587" height="154" frameX="-1" frameY="-5" frameWidth="590" frameHeight="159"/>
<SubTexture name="donate selected0002" x="591" y="161" width="585" height="155" frameX="-3" frameY="0" frameWidth="590" frameHeight="159"/>
<SubTexture name="freeplay idle0000" x="1178" y="161" width="484" height="122"/>
<SubTexture name="freeplay idle0001" x="1178" y="161" width="484" height="122"/>
<SubTexture name="freeplay idle0002" x="1178" y="161" width="484" height="122"/>
<SubTexture name="freeplay idle0003" x="2" y="318" width="484" height="122"/>
<SubTexture name="freeplay idle0004" x="2" y="318" width="484" height="122"/>
<SubTexture name="freeplay idle0005" x="2" y="318" width="484" height="122"/>
<SubTexture name="freeplay idle0006" x="488" y="318" width="484" height="122"/>
<SubTexture name="freeplay idle0007" x="488" y="318" width="484" height="122"/>
<SubTexture name="freeplay idle0008" x="488" y="318" width="484" height="122"/>
<SubTexture name="freeplay selected0000" x="974" y="318" width="627" height="169" frameX="0" frameY="0" frameWidth="635" frameHeight="174"/>
<SubTexture name="freeplay selected0001" x="2" y="489" width="632" height="170" frameX="-3" frameY="-1" frameWidth="635" frameHeight="174"/>
<SubTexture name="freeplay selected0002" x="636" y="489" width="629" height="173" frameX="-4" frameY="-1" frameWidth="635" frameHeight="174"/>
<SubTexture name="login idle0000" x="1267" y="489" width="359" height="109"/>
<SubTexture name="login idle0001" x="1267" y="489" width="359" height="109"/>
<SubTexture name="login idle0002" x="1267" y="489" width="359" height="109"/>
<SubTexture name="login idle0003" x="1628" y="489" width="359" height="109"/>
<SubTexture name="login idle0004" x="1628" y="489" width="359" height="109"/>
<SubTexture name="login idle0005" x="1628" y="489" width="359" height="109"/>
<SubTexture name="login idle0006" x="2" y="664" width="358" height="109" frameX="0" frameY="0" frameWidth="359" frameHeight="109"/>
<SubTexture name="login idle0007" x="2" y="664" width="358" height="109" frameX="0" frameY="0" frameWidth="359" frameHeight="109"/>
<SubTexture name="login idle0008" x="2" y="664" width="358" height="109" frameX="0" frameY="0" frameWidth="359" frameHeight="109"/>
<SubTexture name="login selected0000" x="362" y="664" width="449" height="137"/>
<SubTexture name="login selected0001" x="813" y="664" width="449" height="137"/>
<SubTexture name="login selected0002" x="1264" y="664" width="448" height="137" frameX="0" frameY="0" frameWidth="449" frameHeight="137"/>
<SubTexture name="logout idle0000" x="2" y="803" width="428" height="110"/>
<SubTexture name="logout idle0001" x="2" y="803" width="428" height="110"/>
<SubTexture name="logout idle0002" x="2" y="803" width="428" height="110"/>
<SubTexture name="logout idle0003" x="432" y="803" width="428" height="110"/>
<SubTexture name="logout idle0004" x="432" y="803" width="428" height="110"/>
<SubTexture name="logout idle0005" x="432" y="803" width="428" height="110"/>
<SubTexture name="logout idle0006" x="862" y="803" width="428" height="110"/>
<SubTexture name="logout idle0007" x="862" y="803" width="428" height="110"/>
<SubTexture name="logout idle0008" x="862" y="803" width="428" height="110"/>
<SubTexture name="logout selected0000" x="1292" y="803" width="537" height="138" frameX="0" frameY="0" frameWidth="538" frameHeight="138"/>
<SubTexture name="logout selected0001" x="2" y="943" width="538" height="138"/>
<SubTexture name="logout selected0002" x="542" y="943" width="536" height="138" frameX="-1" frameY="0" frameWidth="538" frameHeight="138"/>
<SubTexture name="options idle0000" x="1080" y="943" width="487" height="112"/>
<SubTexture name="options idle0001" x="1080" y="943" width="487" height="112"/>
<SubTexture name="options idle0002" x="1080" y="943" width="487" height="112"/>
<SubTexture name="options idle0003" x="2" y="1083" width="487" height="112"/>
<SubTexture name="options idle0004" x="2" y="1083" width="487" height="112"/>
<SubTexture name="options idle0005" x="2" y="1083" width="487" height="112"/>
<SubTexture name="options idle0006" x="491" y="1083" width="487" height="112"/>
<SubTexture name="options idle0007" x="491" y="1083" width="487" height="112"/>
<SubTexture name="options idle0008" x="491" y="1083" width="487" height="112"/>
<SubTexture name="options selected0000" x="980" y="1083" width="607" height="155" frameX="-1" frameY="-1" frameWidth="609" frameHeight="163"/>
<SubTexture name="options selected0001" x="2" y="1240" width="606" height="158" frameX="-3" frameY="-1" frameWidth="609" frameHeight="163"/>
<SubTexture name="options selected0002" x="610" y="1240" width="609" height="163"/>
<SubTexture name="story mode idle0000" x="1221" y="1240" width="615" height="122"/>
<SubTexture name="story mode idle0001" x="1221" y="1240" width="615" height="122"/>
<SubTexture name="story mode idle0002" x="1221" y="1240" width="615" height="122"/>
<SubTexture name="story mode idle0003" x="2" y="1405" width="615" height="122"/>
<SubTexture name="story mode idle0004" x="2" y="1405" width="615" height="122"/>
<SubTexture name="story mode idle0005" x="2" y="1405" width="615" height="122"/>
<SubTexture name="story mode idle0006" x="619" y="1405" width="615" height="122"/>
<SubTexture name="story mode idle0007" x="619" y="1405" width="615" height="122"/>
<SubTexture name="story mode idle0008" x="619" y="1405" width="615" height="122"/>
<SubTexture name="story mode selected0000" x="1236" y="1405" width="796" height="173" frameX="0" frameY="-3" frameWidth="796" frameHeight="181"/>
<SubTexture name="story mode selected0001" x="2" y="1580" width="794" height="174" frameX="-2" frameY="-2" frameWidth="796" frameHeight="181"/>
<SubTexture name="story mode selected0002" x="798" y="1580" width="794" height="181" frameX="0" frameY="0" frameWidth="796" frameHeight="181"/>
</TextureAtlas>

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<TextureAtlas imagePath="prompt-ng_login.png">
<!-- Created with Adobe Animate version 19.2.1.408 -->
<!-- http://www.adobe.com/products/animate.html -->
<SubTexture name="back0000" x="2" y="2" width="1157" height="645"/>
<SubTexture name="no idle0000" x="1161" y="2" width="210" height="197"/>
<SubTexture name="no selected0000" x="1373" y="2" width="210" height="197" frameX="-1" frameY="-14" frameWidth="212" frameHeight="215"/>
<SubTexture name="no selected0001" x="1585" y="2" width="212" height="194" frameX="0" frameY="-10" frameWidth="212" frameHeight="215"/>
<SubTexture name="no selected0002" x="1799" y="2" width="210" height="215" frameX="0" frameY="0" frameWidth="212" frameHeight="215"/>
<SubTexture name="ok idle0000" x="2" y="649" width="231" height="167"/>
<SubTexture name="ok selected0000" x="235" y="649" width="231" height="167" frameX="0" frameY="-9" frameWidth="238" frameHeight="181"/>
<SubTexture name="ok selected0001" x="468" y="649" width="206" height="165" frameX="-21" frameY="-9" frameWidth="238" frameHeight="181"/>
<SubTexture name="ok selected0002" x="676" y="649" width="220" height="181" frameX="-18" frameY="0" frameWidth="238" frameHeight="181"/>
<SubTexture name="yes idle0000" x="898" y="649" width="303" height="205"/>
<SubTexture name="yes selected0000" x="1203" y="649" width="303" height="205" frameX="-13" frameY="-19" frameWidth="340" frameHeight="230"/>
<SubTexture name="yes selected0001" x="1508" y="649" width="330" height="230" frameX="-8" frameY="0" frameWidth="340" frameHeight="230"/>
<SubTexture name="yes selected0002" x="2" y="881" width="340" height="214" frameX="0" frameY="-12" frameWidth="340" frameHeight="230"/>
</TextureAtlas>

Binary file not shown.

After

Width:  |  Height:  |  Size: 740 KiB

View File

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<TextureAtlas imagePath="noteSplashes.png">
<!-- Created with Adobe Animate version 21.0.0.35450 -->
<!-- http://www.adobe.com/products/animate.html -->
<SubTexture name="note impact 1 blue0000" x="1850" y="262" width="189" height="270" frameX="-32" frameY="-12" frameWidth="260" frameHeight="298"/>
<SubTexture name="note impact 1 blue0001" x="1540" y="556" width="213" height="265" frameX="-27" frameY="-22" frameWidth="260" frameHeight="298"/>
<SubTexture name="note impact 1 blue0002" x="1056" y="0" width="252" height="291" frameX="-4" frameY="-6" frameWidth="260" frameHeight="298"/>
<SubTexture name="note impact 1 blue0003" x="0" y="0" width="260" height="298"/>
<SubTexture name="note impact 1 green0000" x="663" y="806" width="189" height="270" frameX="-32" frameY="-12" frameWidth="260" frameHeight="298"/>
<SubTexture name="note impact 1 green0001" x="1757" y="556" width="213" height="265" frameX="-27" frameY="-22" frameWidth="260" frameHeight="298"/>
<SubTexture name="note impact 1 green0002" x="1312" y="0" width="252" height="291" frameX="-4" frameY="-6" frameWidth="260" frameHeight="298"/>
<SubTexture name="note impact 1 green0003" x="264" y="0" width="260" height="298"/>
<SubTexture name="note impact 1 purple0000" x="1121" y="818" width="189" height="270" frameX="-32" frameY="-12" frameWidth="260" frameHeight="298"/>
<SubTexture name="note impact 1 purple0001" x="0" y="563" width="213" height="265" frameX="-27" frameY="-22" frameWidth="260" frameHeight="298"/>
<SubTexture name="note impact 1 purple0002" x="1568" y="0" width="252" height="291" frameX="-4" frameY="-6" frameWidth="260" frameHeight="298"/>
<SubTexture name="note impact 1 purple0003" x="528" y="0" width="260" height="298"/>
<SubTexture name="note impact 1 red0000" x="1314" y="818" width="189" height="270" frameX="-32" frameY="-12" frameWidth="260" frameHeight="298"/>
<SubTexture name="note impact 1 red0001" x="217" y="563" width="213" height="265" frameX="-27" frameY="-22" frameWidth="260" frameHeight="298"/>
<SubTexture name="note impact 1 red0002" x="1056" y="295" width="252" height="291" frameX="-4" frameY="-6" frameWidth="260" frameHeight="298"/>
<SubTexture name="note impact 1 red0003" x="792" y="0" width="260" height="298"/>
<SubTexture name="note impact 2 blue0000" x="1121" y="590" width="169" height="201" frameX="-45" frameY="-41" frameWidth="274" frameHeight="267"/>
<SubTexture name="note impact 2 blue0001" x="434" y="564" width="225" height="238" frameX="-20" frameY="-19" frameWidth="274" frameHeight="267"/>
<SubTexture name="note impact 2 blue0002" x="1312" y="295" width="265" height="257" frameX="0" frameY="-10" frameWidth="274" frameHeight="267"/>
<SubTexture name="note impact 2 blue0003" x="1824" y="0" width="224" height="258" frameX="-50" frameY="0" frameWidth="274" frameHeight="267"/>
<SubTexture name="note impact 2 green0000" x="1507" y="825" width="169" height="201" frameX="-45" frameY="-41" frameWidth="274" frameHeight="267"/>
<SubTexture name="note impact 2 green0001" x="663" y="564" width="225" height="238" frameX="-20" frameY="-19" frameWidth="274" frameHeight="267"/>
<SubTexture name="note impact 2 green0002" x="1581" y="295" width="265" height="257" frameX="0" frameY="-10" frameWidth="274" frameHeight="267"/>
<SubTexture name="note impact 2 green0003" x="538" y="302" width="224" height="258" frameX="-50" frameY="0" frameWidth="274" frameHeight="267"/>
<SubTexture name="note impact 2 purple0000" x="1680" y="825" width="169" height="201" frameX="-45" frameY="-41" frameWidth="274" frameHeight="267"/>
<SubTexture name="note impact 2 purple0001" x="892" y="590" width="225" height="238" frameX="-20" frameY="-19" frameWidth="274" frameHeight="267"/>
<SubTexture name="note impact 2 purple0002" x="0" y="302" width="265" height="257" frameX="0" frameY="-10" frameWidth="274" frameHeight="267"/>
<SubTexture name="note impact 2 purple0003" x="766" y="302" width="224" height="258" frameX="-50" frameY="0" frameWidth="274" frameHeight="267"/>
<SubTexture name="note impact 2 red0000" x="1853" y="825" width="169" height="201" frameX="-45" frameY="-41" frameWidth="274" frameHeight="267"/>
<SubTexture name="note impact 2 red0001" x="434" y="806" width="225" height="238" frameX="-20" frameY="-19" frameWidth="274" frameHeight="267"/>
<SubTexture name="note impact 2 red0002" x="269" y="302" width="265" height="257" frameX="0" frameY="-10" frameWidth="274" frameHeight="267"/>
<SubTexture name="note impact 2 red0003" x="1312" y="556" width="224" height="258" frameX="-50" frameY="0" frameWidth="274" frameHeight="267"/>
</TextureAtlas>

View File

@ -1,16 +1,15 @@
{
"lineEnds": {
"leftCurly": "both",
"rightCurly": "both",
"emptyCurly": "break",
"objectLiteralCurly": {
"leftCurly": "after"
}
},
"sameLine": {
"ifElse": "next",
"doWhile": "next",
"tryBody": "next",
"tryCatch": "next"
}
}
{
"lineEnds": {
"leftCurly": "both",
"rightCurly": "both",
"objectLiteralCurly": {
"leftCurly": "after"
}
},
"sameLine": {
"ifElse": "next",
"doWhile": "next",
"tryBody": "next",
"tryCatch": "next"
}
}

View File

@ -40,7 +40,7 @@ class Alphabet extends FlxSpriteGroup
var isBold:Bool = false;
public function new(x:Float, y:Float, text:String = "", ?bold:Bool = false, typed:Bool = false)
public function new(x:Float = 0.0, y:Float = 0.0, text:String = "", ?bold:Bool = false, typed:Bool = false)
{
super(x, y);

View File

@ -11,57 +11,6 @@ import flixel.input.gamepad.FlxGamepadButton;
import flixel.input.gamepad.FlxGamepadInputID;
import flixel.input.keyboard.FlxKey;
#if (haxe >= "4.0.0")
enum abstract Action(String) to String from String
{
var UP = "up";
var LEFT = "left";
var RIGHT = "right";
var DOWN = "down";
var UP_P = "up-press";
var LEFT_P = "left-press";
var RIGHT_P = "right-press";
var DOWN_P = "down-press";
var UP_R = "up-release";
var LEFT_R = "left-release";
var RIGHT_R = "right-release";
var DOWN_R = "down-release";
var ACCEPT = "accept";
var BACK = "back";
var PAUSE = "pause";
var RESET = "reset";
var CHEAT = "cheat";
}
#else
@:enum
abstract Action(String) to String from String
{
var UP = "up";
var LEFT = "left";
var RIGHT = "right";
var DOWN = "down";
var UP_P = "up-press";
var LEFT_P = "left-press";
var RIGHT_P = "right-press";
var DOWN_P = "down-press";
var UP_R = "up-release";
var LEFT_R = "left-release";
var RIGHT_R = "right-release";
var DOWN_R = "down-release";
var ACCEPT = "accept";
var BACK = "back";
var PAUSE = "pause";
var RESET = "reset";
var CHEAT = "cheat";
}
#end
enum Device
{
Keys;
Gamepad(id:Int);
}
/**
* Since, in many cases multiple actions should use similar keys, we don't want the
* rebinding UI to list every action. ActionBinders are what the user percieves as
@ -69,15 +18,64 @@ enum Device
*/
enum Control
{
UP;
LEFT;
RIGHT;
DOWN;
// List notes in order from left to right on gameplay screen.
NOTE_LEFT;
NOTE_DOWN;
NOTE_UP;
NOTE_RIGHT;
UI_UP;
UI_LEFT;
UI_RIGHT;
UI_DOWN;
RESET;
ACCEPT;
BACK;
PAUSE;
#if CAN_CHEAT
CHEAT;
#end
}
@:enum
abstract Action(String) to String from String
{
var UI_UP = "ui_up";
var UI_LEFT = "ui_left";
var UI_RIGHT = "ui_right";
var UI_DOWN = "ui_down";
var UI_UP_P = "ui_up-press";
var UI_LEFT_P = "ui_left-press";
var UI_RIGHT_P = "ui_right-press";
var UI_DOWN_P = "ui_down-press";
var UI_UP_R = "ui_up-release";
var UI_LEFT_R = "ui_left-release";
var UI_RIGHT_R = "ui_right-release";
var UI_DOWN_R = "ui_down-release";
var NOTE_UP = "note_up";
var NOTE_LEFT = "note_left";
var NOTE_RIGHT = "note_right";
var NOTE_DOWN = "note_down";
var NOTE_UP_P = "note_up-press";
var NOTE_LEFT_P = "note_left-press";
var NOTE_RIGHT_P = "note_right-press";
var NOTE_DOWN_P = "note_down-press";
var NOTE_UP_R = "note_up-release";
var NOTE_LEFT_R = "note_left-release";
var NOTE_RIGHT_R = "note_right-release";
var NOTE_DOWN_R = "note_down-release";
var ACCEPT = "accept";
var BACK = "back";
var PAUSE = "pause";
var RESET = "reset";
#if CAN_CHEAT
var CHEAT = "cheat";
#end
}
enum Device
{
Keys;
Gamepad(id:Int);
}
enum KeyboardScheme
@ -94,177 +92,125 @@ enum KeyboardScheme
*/
class Controls extends FlxActionSet
{
var _up = new FlxActionDigital(Action.UP);
var _left = new FlxActionDigital(Action.LEFT);
var _right = new FlxActionDigital(Action.RIGHT);
var _down = new FlxActionDigital(Action.DOWN);
var _upP = new FlxActionDigital(Action.UP_P);
var _leftP = new FlxActionDigital(Action.LEFT_P);
var _rightP = new FlxActionDigital(Action.RIGHT_P);
var _downP = new FlxActionDigital(Action.DOWN_P);
var _upR = new FlxActionDigital(Action.UP_R);
var _leftR = new FlxActionDigital(Action.LEFT_R);
var _rightR = new FlxActionDigital(Action.RIGHT_R);
var _downR = new FlxActionDigital(Action.DOWN_R);
var _ui_up = new FlxActionDigital(Action.UI_UP);
var _ui_left = new FlxActionDigital(Action.UI_LEFT);
var _ui_right = new FlxActionDigital(Action.UI_RIGHT);
var _ui_down = new FlxActionDigital(Action.UI_DOWN);
var _ui_upP = new FlxActionDigital(Action.UI_UP_P);
var _ui_leftP = new FlxActionDigital(Action.UI_LEFT_P);
var _ui_rightP = new FlxActionDigital(Action.UI_RIGHT_P);
var _ui_downP = new FlxActionDigital(Action.UI_DOWN_P);
var _ui_upR = new FlxActionDigital(Action.UI_UP_R);
var _ui_leftR = new FlxActionDigital(Action.UI_LEFT_R);
var _ui_rightR = new FlxActionDigital(Action.UI_RIGHT_R);
var _ui_downR = new FlxActionDigital(Action.UI_DOWN_R);
var _note_up = new FlxActionDigital(Action.NOTE_UP);
var _note_left = new FlxActionDigital(Action.NOTE_LEFT);
var _note_right = new FlxActionDigital(Action.NOTE_RIGHT);
var _note_down = new FlxActionDigital(Action.NOTE_DOWN);
var _note_upP = new FlxActionDigital(Action.NOTE_UP_P);
var _note_leftP = new FlxActionDigital(Action.NOTE_LEFT_P);
var _note_rightP = new FlxActionDigital(Action.NOTE_RIGHT_P);
var _note_downP = new FlxActionDigital(Action.NOTE_DOWN_P);
var _note_upR = new FlxActionDigital(Action.NOTE_UP_R);
var _note_leftR = new FlxActionDigital(Action.NOTE_LEFT_R);
var _note_rightR = new FlxActionDigital(Action.NOTE_RIGHT_R);
var _note_downR = new FlxActionDigital(Action.NOTE_DOWN_R);
var _accept = new FlxActionDigital(Action.ACCEPT);
var _back = new FlxActionDigital(Action.BACK);
var _pause = new FlxActionDigital(Action.PAUSE);
var _reset = new FlxActionDigital(Action.RESET);
#if CAN_CHEAT
var _cheat = new FlxActionDigital(Action.CHEAT);
#if (haxe >= "4.0.0")
var byName:Map<String, FlxActionDigital> = [];
#else
var byName:Map<String, FlxActionDigital> = new Map<String, FlxActionDigital>();
#end
var byName:Map<String, FlxActionDigital> = new Map<String, FlxActionDigital>();
public var gamepadsAdded:Array<Int> = [];
public var keyboardScheme = KeyboardScheme.None;
public var UP(get, never):Bool;
public var UI_UP (get, never):Bool; inline function get_UI_UP () return _ui_up .check();
public var UI_LEFT (get, never):Bool; inline function get_UI_LEFT () return _ui_left .check();
public var UI_RIGHT(get, never):Bool; inline function get_UI_RIGHT() return _ui_right.check();
public var UI_DOWN (get, never):Bool; inline function get_UI_DOWN () return _ui_down .check();
inline function get_UP()
return _up.check();
public var UI_UP_P (get, never):Bool; inline function get_UI_UP_P () return _ui_upP .check();
public var UI_LEFT_P (get, never):Bool; inline function get_UI_LEFT_P () return _ui_leftP .check();
public var UI_RIGHT_P(get, never):Bool; inline function get_UI_RIGHT_P() return _ui_rightP.check();
public var UI_DOWN_P (get, never):Bool; inline function get_UI_DOWN_P () return _ui_downP .check();
public var LEFT(get, never):Bool;
public var UI_UP_R (get, never):Bool; inline function get_UI_UP_R () return _ui_upR .check();
public var UI_LEFT_R (get, never):Bool; inline function get_UI_LEFT_R () return _ui_leftR .check();
public var UI_RIGHT_R(get, never):Bool; inline function get_UI_RIGHT_R() return _ui_rightR.check();
public var UI_DOWN_R (get, never):Bool; inline function get_UI_DOWN_R () return _ui_downR .check();
public var NOTE_UP (get, never):Bool; inline function get_NOTE_UP () return _note_up .check();
public var NOTE_LEFT (get, never):Bool; inline function get_NOTE_LEFT () return _note_left .check();
public var NOTE_RIGHT(get, never):Bool; inline function get_NOTE_RIGHT() return _note_right.check();
public var NOTE_DOWN (get, never):Bool; inline function get_NOTE_DOWN () return _note_down .check();
inline function get_LEFT()
return _left.check();
public var NOTE_UP_P (get, never):Bool; inline function get_NOTE_UP_P () return _note_upP .check();
public var NOTE_LEFT_P (get, never):Bool; inline function get_NOTE_LEFT_P () return _note_leftP .check();
public var NOTE_RIGHT_P(get, never):Bool; inline function get_NOTE_RIGHT_P() return _note_rightP.check();
public var NOTE_DOWN_P (get, never):Bool; inline function get_NOTE_DOWN_P () return _note_downP .check();
public var RIGHT(get, never):Bool;
public var NOTE_UP_R (get, never):Bool; inline function get_NOTE_UP_R () return _note_upR .check();
public var NOTE_LEFT_R (get, never):Bool; inline function get_NOTE_LEFT_R () return _note_leftR .check();
public var NOTE_RIGHT_R(get, never):Bool; inline function get_NOTE_RIGHT_R() return _note_rightR.check();
public var NOTE_DOWN_R (get, never):Bool; inline function get_NOTE_DOWN_R () return _note_downR .check();
inline function get_RIGHT()
return _right.check();
public var DOWN(get, never):Bool;
inline function get_DOWN()
return _down.check();
public var UP_P(get, never):Bool;
inline function get_UP_P()
return _upP.check();
public var LEFT_P(get, never):Bool;
inline function get_LEFT_P()
return _leftP.check();
public var RIGHT_P(get, never):Bool;
inline function get_RIGHT_P()
return _rightP.check();
public var DOWN_P(get, never):Bool;
inline function get_DOWN_P()
return _downP.check();
public var UP_R(get, never):Bool;
inline function get_UP_R()
return _upR.check();
public var LEFT_R(get, never):Bool;
inline function get_LEFT_R()
return _leftR.check();
public var RIGHT_R(get, never):Bool;
inline function get_RIGHT_R()
return _rightR.check();
public var DOWN_R(get, never):Bool;
inline function get_DOWN_R()
return _downR.check();
public var ACCEPT(get, never):Bool;
inline function get_ACCEPT()
return _accept.check();
public var BACK(get, never):Bool;
inline function get_BACK()
return _back.check();
public var PAUSE(get, never):Bool;
inline function get_PAUSE()
return _pause.check();
public var RESET(get, never):Bool;
inline function get_RESET()
return _reset.check();
public var CHEAT(get, never):Bool;
inline function get_CHEAT()
return _cheat.check();
#if (haxe >= "4.0.0")
public function new(name, scheme = None)
{
super(name);
add(_up);
add(_left);
add(_right);
add(_down);
add(_upP);
add(_leftP);
add(_rightP);
add(_downP);
add(_upR);
add(_leftR);
add(_rightR);
add(_downR);
add(_accept);
add(_back);
add(_pause);
add(_reset);
add(_cheat);
for (action in digitalActions)
byName[action.name] = action;
setKeyboardScheme(scheme, false);
}
#else
public var ACCEPT(get, never):Bool; inline function get_ACCEPT() return _accept.check();
public var BACK (get, never):Bool; inline function get_BACK () return _back .check();
public var PAUSE (get, never):Bool; inline function get_PAUSE () return _pause .check();
public var RESET (get, never):Bool; inline function get_RESET () return _reset .check();
#if CAN_CHEAT
public var CHEAT (get, never):Bool; inline function get_CHEAT () return _cheat.check ();
#end
public function new(name, scheme:KeyboardScheme = null)
{
super(name);
add(_up);
add(_left);
add(_right);
add(_down);
add(_upP);
add(_leftP);
add(_rightP);
add(_downP);
add(_upR);
add(_leftR);
add(_rightR);
add(_downR);
add(_ui_up);
add(_ui_left);
add(_ui_right);
add(_ui_down);
add(_ui_upP);
add(_ui_leftP);
add(_ui_rightP);
add(_ui_downP);
add(_ui_upR);
add(_ui_leftR);
add(_ui_rightR);
add(_ui_downR);
add(_note_up);
add(_note_left);
add(_note_right);
add(_note_down);
add(_note_upP);
add(_note_leftP);
add(_note_rightP);
add(_note_downP);
add(_note_upR);
add(_note_leftR);
add(_note_rightR);
add(_note_downR);
add(_accept);
add(_back);
add(_pause);
add(_reset);
#if CAN_CHEAT
add(_cheat);
#end
for (action in digitalActions)
byName[action.name] = action;
if (scheme == null)
scheme = None;
setKeyboardScheme(scheme, false);
}
#end
override function update()
{
@ -301,15 +247,21 @@ class Controls extends FlxActionSet
{
return switch (control)
{
case UP: _up;
case DOWN: _down;
case LEFT: _left;
case RIGHT: _right;
case UI_UP: _ui_up;
case UI_DOWN: _ui_down;
case UI_LEFT: _ui_left;
case UI_RIGHT: _ui_right;
case NOTE_UP: _note_up;
case NOTE_DOWN: _note_down;
case NOTE_LEFT: _note_left;
case NOTE_RIGHT: _note_right;
case ACCEPT: _accept;
case BACK: _back;
case PAUSE: _pause;
case RESET: _reset;
#if CAN_CHEAT
case CHEAT: _cheat;
#end
}
}
@ -329,22 +281,38 @@ class Controls extends FlxActionSet
{
switch (control)
{
case UP:
func(_up, PRESSED);
func(_upP, JUST_PRESSED);
func(_upR, JUST_RELEASED);
case LEFT:
func(_left, PRESSED);
func(_leftP, JUST_PRESSED);
func(_leftR, JUST_RELEASED);
case RIGHT:
func(_right, PRESSED);
func(_rightP, JUST_PRESSED);
func(_rightR, JUST_RELEASED);
case DOWN:
func(_down, PRESSED);
func(_downP, JUST_PRESSED);
func(_downR, JUST_RELEASED);
case UI_UP:
func(_ui_up, PRESSED);
func(_ui_upP, JUST_PRESSED);
func(_ui_upR, JUST_RELEASED);
case UI_LEFT:
func(_ui_left, PRESSED);
func(_ui_leftP, JUST_PRESSED);
func(_ui_leftR, JUST_RELEASED);
case UI_RIGHT:
func(_ui_right, PRESSED);
func(_ui_rightP, JUST_PRESSED);
func(_ui_rightR, JUST_RELEASED);
case UI_DOWN:
func(_ui_down, PRESSED);
func(_ui_downP, JUST_PRESSED);
func(_ui_downR, JUST_RELEASED);
case NOTE_UP:
func(_note_up, PRESSED);
func(_note_upP, JUST_PRESSED);
func(_note_upR, JUST_RELEASED);
case NOTE_LEFT:
func(_note_left, PRESSED);
func(_note_leftP, JUST_PRESSED);
func(_note_leftR, JUST_RELEASED);
case NOTE_RIGHT:
func(_note_right, PRESSED);
func(_note_rightP, JUST_PRESSED);
func(_note_rightR, JUST_RELEASED);
case NOTE_DOWN:
func(_note_down, PRESSED);
func(_note_downP, JUST_PRESSED);
func(_note_downR, JUST_RELEASED);
case ACCEPT:
func(_accept, JUST_PRESSED);
case BACK:
@ -353,12 +321,14 @@ class Controls extends FlxActionSet
func(_pause, JUST_PRESSED);
case RESET:
func(_reset, JUST_PRESSED);
#if CAN_CHEAT
case CHEAT:
func(_cheat, JUST_PRESSED);
#end
}
}
public function replaceBinding(control:Control, device:Device, ?toAdd:Int, ?toRemove:Int)
public function replaceBinding(control:Control, device:Device, toAdd:Int, toRemove:Int)
{
if (toAdd == toRemove)
return;
@ -366,31 +336,41 @@ class Controls extends FlxActionSet
switch (device)
{
case Keys:
if (toRemove != null)
unbindKeys(control, [toRemove]);
if (toAdd != null)
bindKeys(control, [toAdd]);
forEachBound(control, function(action, _) replaceKey(action, toAdd, toRemove));
case Gamepad(id):
if (toRemove != null)
unbindButtons(control, id, [toRemove]);
if (toAdd != null)
bindButtons(control, id, [toAdd]);
forEachBound(control, function(action, _) replaceButton(action, id, toAdd, toRemove));
}
}
function replaceKey(action:FlxActionDigital, toAdd:Int, toRemove:Int)
{
for (i in 0...action.inputs.length)
{
var input = action.inputs[i];
if (input.device == KEYBOARD && input.inputID == toRemove)
{
@:privateAccess
action.inputs[i].inputID = toAdd;
}
}
}
function replaceButton(action:FlxActionDigital, deviceID:Int, toAdd:Int, toRemove:Int)
{
for (i in 0...action.inputs.length)
{
var input = action.inputs[i];
if (isGamepad(input, deviceID) && input.inputID == toRemove)
{
@:privateAccess
action.inputs[i].inputID = toAdd;
}
}
}
public function copyFrom(controls:Controls, ?device:Device)
{
#if (haxe >= "4.0.0")
for (name => action in controls.byName)
{
for (input in action.inputs)
{
if (device == null || isDevice(input, device))
byName[name].add(cast input);
}
}
#else
for (name in controls.byName.keys())
{
var action = controls.byName[name];
@ -400,21 +380,14 @@ class Controls extends FlxActionSet
byName[name].add(cast input);
}
}
#end
switch (device)
{
case null:
// add all
#if (haxe >= "4.0.0")
for (gamepad in controls.gamepadsAdded)
if (!gamepadsAdded.contains(gamepad))
gamepadsAdded.push(gamepad);
#else
for (gamepad in controls.gamepadsAdded)
if (gamepadsAdded.indexOf(gamepad) == -1)
gamepadsAdded.push(gamepad);
#end
mergeKeyboardScheme(controls.keyboardScheme);
@ -450,11 +423,7 @@ class Controls extends FlxActionSet
*/
public function bindKeys(control:Control, keys:Array<FlxKey>)
{
#if (haxe >= "4.0.0")
inline forEachBound(control, (action, state) -> addKeys(action, keys, state));
#else
forEachBound(control, function(action, state) addKeys(action, keys, state));
#end
}
/**
@ -463,11 +432,7 @@ class Controls extends FlxActionSet
*/
public function unbindKeys(control:Control, keys:Array<FlxKey>)
{
#if (haxe >= "4.0.0")
inline forEachBound(control, (action, _) -> removeKeys(action, keys));
#else
forEachBound(control, function(action, _) removeKeys(action, keys));
#end
}
inline static function addKeys(action:FlxActionDigital, keys:Array<FlxKey>, state:FlxInputState)
@ -494,65 +459,43 @@ class Controls extends FlxActionSet
keyboardScheme = scheme;
#if (haxe >= "4.0.0")
switch (scheme)
{
case Solo:
inline bindKeys(Control.UP, [W, FlxKey.UP]);
inline bindKeys(Control.DOWN, [S, FlxKey.DOWN]);
inline bindKeys(Control.LEFT, [A, FlxKey.LEFT]);
inline bindKeys(Control.RIGHT, [D, FlxKey.RIGHT]);
inline bindKeys(Control.ACCEPT, [Z, SPACE, ENTER]);
inline bindKeys(Control.BACK, [BACKSPACE, ESCAPE]);
inline bindKeys(Control.PAUSE, [P, ENTER, ESCAPE]);
inline bindKeys(Control.RESET, [R]);
case Duo(true):
inline bindKeys(Control.UP, [W]);
inline bindKeys(Control.DOWN, [S]);
inline bindKeys(Control.LEFT, [A]);
inline bindKeys(Control.RIGHT, [D]);
inline bindKeys(Control.ACCEPT, [G, Z]);
inline bindKeys(Control.BACK, [H, X]);
inline bindKeys(Control.PAUSE, [ONE]);
inline bindKeys(Control.RESET, [R]);
case Duo(false):
inline bindKeys(Control.UP, [FlxKey.UP]);
inline bindKeys(Control.DOWN, [FlxKey.DOWN]);
inline bindKeys(Control.LEFT, [FlxKey.LEFT]);
inline bindKeys(Control.RIGHT, [FlxKey.RIGHT]);
inline bindKeys(Control.ACCEPT, [O]);
inline bindKeys(Control.BACK, [P]);
inline bindKeys(Control.PAUSE, [ENTER]);
inline bindKeys(Control.RESET, [BACKSPACE]);
case None: // nothing
case Custom: // nothing
}
#else
switch (scheme)
{
case Solo:
bindKeys(Control.UP, [W, FlxKey.UP]);
bindKeys(Control.DOWN, [S, FlxKey.DOWN]);
bindKeys(Control.LEFT, [A, FlxKey.LEFT]);
bindKeys(Control.RIGHT, [D, FlxKey.RIGHT]);
bindKeys(Control.UI_UP, [W, FlxKey.UP]);
bindKeys(Control.UI_DOWN, [S, FlxKey.DOWN]);
bindKeys(Control.UI_LEFT, [A, FlxKey.LEFT]);
bindKeys(Control.UI_RIGHT, [D, FlxKey.RIGHT]);
bindKeys(Control.NOTE_UP, [W, FlxKey.UP]);
bindKeys(Control.NOTE_DOWN, [S, FlxKey.DOWN]);
bindKeys(Control.NOTE_LEFT, [A, FlxKey.LEFT]);
bindKeys(Control.NOTE_RIGHT, [D, FlxKey.RIGHT]);
bindKeys(Control.ACCEPT, [Z, SPACE, ENTER]);
bindKeys(Control.BACK, [BACKSPACE, ESCAPE]);
bindKeys(Control.BACK, [X, BACKSPACE, ESCAPE]);
bindKeys(Control.PAUSE, [P, ENTER, ESCAPE]);
bindKeys(Control.RESET, [R]);
case Duo(true):
bindKeys(Control.UP, [W]);
bindKeys(Control.DOWN, [S]);
bindKeys(Control.LEFT, [A]);
bindKeys(Control.RIGHT, [D]);
bindKeys(Control.UI_UP, [W]);
bindKeys(Control.UI_DOWN, [S]);
bindKeys(Control.UI_LEFT, [A]);
bindKeys(Control.UI_RIGHT, [D]);
bindKeys(Control.NOTE_UP, [W]);
bindKeys(Control.NOTE_DOWN, [S]);
bindKeys(Control.NOTE_LEFT, [A]);
bindKeys(Control.NOTE_RIGHT, [D]);
bindKeys(Control.ACCEPT, [G, Z]);
bindKeys(Control.BACK, [H, X]);
bindKeys(Control.PAUSE, [ONE]);
bindKeys(Control.RESET, [R]);
case Duo(false):
bindKeys(Control.UP, [FlxKey.UP]);
bindKeys(Control.DOWN, [FlxKey.DOWN]);
bindKeys(Control.LEFT, [FlxKey.LEFT]);
bindKeys(Control.RIGHT, [FlxKey.RIGHT]);
bindKeys(Control.UI_UP, [FlxKey.UP]);
bindKeys(Control.UI_DOWN, [FlxKey.DOWN]);
bindKeys(Control.UI_LEFT, [FlxKey.LEFT]);
bindKeys(Control.UI_RIGHT, [FlxKey.RIGHT]);
bindKeys(Control.NOTE_UP, [FlxKey.UP]);
bindKeys(Control.NOTE_DOWN, [FlxKey.DOWN]);
bindKeys(Control.NOTE_LEFT, [FlxKey.LEFT]);
bindKeys(Control.NOTE_RIGHT, [FlxKey.RIGHT]);
bindKeys(Control.ACCEPT, [O]);
bindKeys(Control.BACK, [P]);
bindKeys(Control.PAUSE, [ENTER]);
@ -560,7 +503,6 @@ class Controls extends FlxActionSet
case None: // nothing
case Custom: // nothing
}
#end
}
function removeKeyboard()
@ -577,30 +519,19 @@ class Controls extends FlxActionSet
}
}
public function addGamepad(id:Int, ?buttonMap:Map<Control, Array<FlxGamepadInputID>>):Void
public function addGamepadWithSaveData(id:Int, ?padData:Dynamic):Void
{
gamepadsAdded.push(id);
#if (haxe >= "4.0.0")
for (control => buttons in buttonMap)
inline bindButtons(control, id, buttons);
#else
for (control in buttonMap.keys())
bindButtons(control, id, buttonMap[control]);
#end
fromSaveData(padData, Gamepad(id));
}
inline function addGamepadLiteral(id:Int, ?buttonMap:Map<Control, Array<FlxGamepadInputID>>):Void
{
gamepadsAdded.push(id);
#if (haxe >= "4.0.0")
for (control => buttons in buttonMap)
inline bindButtons(control, id, buttons);
#else
for (control in buttonMap.keys())
bindButtons(control, id, buttonMap[control]);
#end
}
public function removeGamepad(deviceID:Int = FlxInputDeviceID.ALL):Void
@ -611,7 +542,7 @@ class Controls extends FlxActionSet
while (i-- > 0)
{
var input = action.inputs[i];
if (input.device == GAMEPAD && (deviceID == FlxInputDeviceID.ALL || input.deviceID == deviceID))
if (isGamepad(input, deviceID))
action.remove(input);
}
}
@ -621,32 +552,25 @@ class Controls extends FlxActionSet
public function addDefaultGamepad(id):Void
{
#if !switch
addGamepadLiteral(id, [
Control.ACCEPT => [A],
Control.BACK => [B],
Control.UP => [DPAD_UP, LEFT_STICK_DIGITAL_UP],
Control.DOWN => [DPAD_DOWN, LEFT_STICK_DIGITAL_DOWN],
Control.LEFT => [DPAD_LEFT, LEFT_STICK_DIGITAL_LEFT],
Control.RIGHT => [DPAD_RIGHT, LEFT_STICK_DIGITAL_RIGHT],
Control.ACCEPT => [#if switch B #else A #end],
Control.BACK => [#if switch A #else B #end, FlxGamepadInputID.BACK],
Control.UI_UP => [DPAD_UP, LEFT_STICK_DIGITAL_UP],
Control.UI_DOWN => [DPAD_DOWN, LEFT_STICK_DIGITAL_DOWN],
Control.UI_LEFT => [DPAD_LEFT, LEFT_STICK_DIGITAL_LEFT],
Control.UI_RIGHT => [DPAD_RIGHT, LEFT_STICK_DIGITAL_RIGHT],
// don't swap A/B or X/Y for switch on these. A is always the bottom face button
Control.NOTE_UP => [DPAD_UP, Y, LEFT_STICK_DIGITAL_UP, RIGHT_STICK_DIGITAL_UP],
Control.NOTE_DOWN => [DPAD_DOWN, A, LEFT_STICK_DIGITAL_DOWN, RIGHT_STICK_DIGITAL_DOWN],
Control.NOTE_LEFT => [DPAD_LEFT, X, LEFT_STICK_DIGITAL_LEFT, RIGHT_STICK_DIGITAL_LEFT],
Control.NOTE_RIGHT => [DPAD_RIGHT, B, LEFT_STICK_DIGITAL_RIGHT, RIGHT_STICK_DIGITAL_RIGHT],
Control.PAUSE => [START],
Control.RESET => [Y]
#if CAN_CHEAT
,Control.CHEAT => [X]
#end
]);
#else
addGamepadLiteral(id, [
//Swap A and B for switch
Control.ACCEPT => [B],
Control.BACK => [A],
Control.UP => [DPAD_UP, LEFT_STICK_DIGITAL_UP, RIGHT_STICK_DIGITAL_UP],
Control.DOWN => [DPAD_DOWN, LEFT_STICK_DIGITAL_DOWN, RIGHT_STICK_DIGITAL_DOWN],
Control.LEFT => [DPAD_LEFT, LEFT_STICK_DIGITAL_LEFT, RIGHT_STICK_DIGITAL_LEFT],
Control.RIGHT => [DPAD_RIGHT, LEFT_STICK_DIGITAL_RIGHT, RIGHT_STICK_DIGITAL_RIGHT],
Control.PAUSE => [START],
//Swap Y and X for switch
Control.RESET => [Y],
Control.CHEAT => [X]
]);
#end
}
/**
@ -655,11 +579,7 @@ class Controls extends FlxActionSet
*/
public function bindButtons(control:Control, id, buttons)
{
#if (haxe >= "4.0.0")
inline forEachBound(control, (action, state) -> addButtons(action, buttons, state, id));
#else
forEachBound(control, function(action, state) addButtons(action, buttons, state, id));
#end
}
/**
@ -668,11 +588,7 @@ class Controls extends FlxActionSet
*/
public function unbindButtons(control:Control, gamepadID:Int, buttons)
{
#if (haxe >= "4.0.0")
inline forEachBound(control, (action, _) -> removeButtons(action, gamepadID, buttons));
#else
forEachBound(control, function(action, _) removeButtons(action, gamepadID, buttons));
#end
}
inline static function addButtons(action:FlxActionDigital, buttons:Array<FlxGamepadInputID>, state, id)
@ -708,7 +624,7 @@ class Controls extends FlxActionSet
case Gamepad(id):
for (input in getActionFromControl(control).inputs)
{
if (input.deviceID == id)
if (isGamepad(input, id))
list.push(input.inputID);
}
}
@ -726,6 +642,37 @@ class Controls extends FlxActionSet
}
}
public function fromSaveData(data:Dynamic, device:Device)
{
for (control in Control.createAll())
{
var inputs:Array<Int> = Reflect.field(data, control.getName());
if (inputs != null)
{
switch(device)
{
case Keys: bindKeys(control, inputs.copy());
case Gamepad(id): bindButtons(control, id, inputs.copy());
}
}
}
}
public function createSaveData(device:Device):Dynamic
{
var isEmpty = true;
var data = {};
for (control in Control.createAll())
{
var inputs = getInputsFor(control, device);
isEmpty = isEmpty && inputs.length == 0;
Reflect.setField(data, control.getName(), inputs);
}
return isEmpty ? null : data;
}
static function isDevice(input:FlxActionInput, device:Device)
{
return switch device
@ -740,3 +687,6 @@ class Controls extends FlxActionSet
return input.device == GAMEPAD && (deviceID == FlxInputDeviceID.ALL || input.deviceID == deviceID);
}
}
typedef SaveInputLists = {?keys:Array<Int>, ?pad:Array<Int>};

View File

@ -201,8 +201,8 @@ class FreeplayState extends MusicBeatState
scoreText.text = "PERSONAL BEST:" + lerpScore;
var upP = controls.UP_P;
var downP = controls.DOWN_P;
var upP = controls.UI_UP_P;
var downP = controls.UI_DOWN_P;
var accepted = controls.ACCEPT;
if (upP)
@ -214,9 +214,9 @@ class FreeplayState extends MusicBeatState
changeSelection(1);
}
if (controls.LEFT_P)
if (controls.UI_LEFT_P)
changeDiff(-1);
if (controls.RIGHT_P)
if (controls.UI_RIGHT_P)
changeDiff(1);
if (controls.BACK)
@ -246,9 +246,7 @@ class FreeplayState extends MusicBeatState
if (curDifficulty > 2)
curDifficulty = 0;
#if !switch
intendedScore = Highscore.getScore(songs[curSelected].songName, curDifficulty);
#end
PlayState.storyDifficulty = curDifficulty;
@ -259,9 +257,7 @@ class FreeplayState extends MusicBeatState
function changeSelection(change:Int = 0)
{
#if !switch
NGio.logEvent('Fresh');
#end
// NGio.logEvent('Fresh');
FlxG.sound.play(Paths.sound('scrollMenu'), 0.4);
@ -275,10 +271,8 @@ class FreeplayState extends MusicBeatState
// selector.y = (70 * curSelected) + 30;
#if !switch
intendedScore = Highscore.getScore(songs[curSelected].songName, curDifficulty);
// lerpScore = 0;
#end
#if PRELOAD_ALL
FlxG.sound.playMusic(Paths.inst(songs[curSelected].songName), 0);

View File

@ -52,7 +52,7 @@ class GitarooPause extends MusicBeatState
override function update(elapsed:Float)
{
if (controls.LEFT_P || controls.RIGHT_P)
if (controls.UI_LEFT_P || controls.UI_RIGHT_P)
changeThing();
if (controls.ACCEPT)

View File

@ -13,51 +13,55 @@ class Highscore
public static function saveScore(song:String, score:Int = 0, ?diff:Int = 0):Void
{
var daSong:String = formatSong(song, diff);
var formattedSong:String = formatSong(song, diff);
#if !switch
#if newgrounds
NGio.postScore(score, song);
#end
if (songScores.exists(daSong))
if (songScores.exists(formattedSong))
{
if (songScores.get(daSong) < score)
setScore(daSong, score);
if (songScores.get(formattedSong) < score)
setScore(formattedSong, score);
}
else
setScore(daSong, score);
setScore(formattedSong, score);
}
public static function saveWeekScore(week:Int = 1, score:Int = 0, ?diff:Int = 0):Void
{
#if !switch
#if newgrounds
NGio.postScore(score, "Week " + week);
#end
var formattedSong:String = formatSong('week' + week, diff);
var daWeek:String = formatSong('week' + week, diff);
if (songScores.exists(daWeek))
if (songScores.exists(formattedSong))
{
if (songScores.get(daWeek) < score)
setScore(daWeek, score);
if (songScores.get(formattedSong) < score)
setScore(formattedSong, score);
}
else
setScore(daWeek, score);
setScore(formattedSong, score);
}
/**
* YOU SHOULD FORMAT SONG WITH formatSong() BEFORE TOSSING IN SONG VARIABLE
*/
static function setScore(song:String, score:Int):Void
static function setScore(formattedSong:String, score:Int):Void
{
/** GeoKureli
* References to Highscore were wrapped in `#if !switch` blocks. I wasn't sure if this
* is because switch doesn't use NGio, or because switch has a different saving method.
* I moved the compiler flag here, rather than using it everywhere else.
*/
#if !switch
// Reminder that I don't need to format this song, it should come formatted!
songScores.set(song, score);
songScores.set(formattedSong, score);
FlxG.save.data.songScores = songScores;
FlxG.save.flush();
#end
}
public static function formatSong(song:String, diff:Int):String

220
source/InputFormatter.hx Normal file
View File

@ -0,0 +1,220 @@
package ;
import Controls;
import flixel.FlxG;
import flixel.input.gamepad.FlxGamepad;
import flixel.input.gamepad.FlxGamepadInputID;
import flixel.input.keyboard.FlxKey;
using flixel.util.FlxStringUtil;
class InputFormatter
{
static public function format(id:Int, device:Device):String
{
return switch (device)
{
case Keys: getKeyName(id);
case Gamepad(gamepadID): getButtonName(id, FlxG.gamepads.getByID(gamepadID));
}
}
static public function getKeyName(id:Int):String
{
return switch(id)
{
case ZERO : "0";
case ONE : "1";
case TWO : "2";
case THREE : "3";
case FOUR : "4";
case FIVE : "5";
case SIX : "6";
case SEVEN : "7";
case EIGHT : "8";
case NINE : "9";
case PAGEUP : "PgUp";
case PAGEDOWN : "PgDown";
// case HOME : "Hm";
// case END : "End";
// case INSERT : "Ins";
// case ESCAPE : "Esc";
// case MINUS : "-";
// case PLUS : "+";
// case DELETE : "Del";
case BACKSPACE : "BckSpc";
case LBRACKET : "[";
case RBRACKET : "]";
case BACKSLASH : "\\";
case CAPSLOCK : "Caps";
case SEMICOLON : ";";
case QUOTE : "'";
// case ENTER : "Ent";
// case SHIFT : "Shf";
case COMMA : ",";
case PERIOD : ".";
case SLASH : "/";
case GRAVEACCENT : "`";
case CONTROL : "Ctrl";
case ALT : "Alt";
// case SPACE : "Spc";
// case UP : "Up";
// case DOWN : "Dn";
// case LEFT : "Lf";
// case RIGHT : "Rt";
// case TAB : "Tab";
case PRINTSCREEN : "PrtScrn";
case NUMPADZERO : "#0";
case NUMPADONE : "#1";
case NUMPADTWO : "#2";
case NUMPADTHREE : "#3";
case NUMPADFOUR : "#4";
case NUMPADFIVE : "#5";
case NUMPADSIX : "#6";
case NUMPADSEVEN : "#7";
case NUMPADEIGHT : "#8";
case NUMPADNINE : "#9";
case NUMPADMINUS : "#-";
case NUMPADPLUS : "#+";
case NUMPADPERIOD : "#.";
case NUMPADMULTIPLY: "#*";
default: titleCase(FlxKey.toStringMap[id]);
}
}
static var dirReg = ~/^(l|r).?-(left|right|down|up)$/;
inline static public function getButtonName(id:Int, gamepad:FlxGamepad):String
{
return switch(gamepad.getInputLabel(id))
{
// case null | "": shortenButtonName(FlxGamepadInputID.toStringMap[id]);
case label: shortenButtonName(label);
}
}
static function shortenButtonName(name:String)
{
return switch (name == null ? "" : name.toLowerCase())
{
case "": "[?]";
// case "square" : "[]";
// case "circle" : "()";
// case "triangle": "/\\";
// case "plus" : "+";
// case "minus" : "-";
// case "home" : "Hm";
// case "guide" : "Gd";
// case "back" : "Bk";
// case "select" : "Bk";
// case "start" : "St";
// case "left" : "Lf";
// case "right" : "Rt";
// case "down" : "Dn";
// case "up" : "Up";
case dir if (dirReg.match(dir)):
dirReg.matched(1).toUpperCase() + " " + titleCase(dirReg.matched(2));
case label: titleCase(label);
}
}
inline static function titleCaseTrim(str:String, length = 8)
{
return str.charAt(0).toUpperCase() + str.substr(1, length - 1).toLowerCase();
}
inline static function titleCase(str:String)
{
return str.charAt(0).toUpperCase() + str.substr(1).toLowerCase();
}
inline static public function parsePadName(name:String):ControllerName
{
return ControllerName.parseName(name);
}
inline static public function getPadName(gamepad:FlxGamepad):ControllerName
{
return ControllerName.getName(gamepad);
}
inline static public function getPadNameById(id:Int):ControllerName
{
return ControllerName.getNameById(id);
}
}
@:forward
@:enum abstract ControllerName(String) from String to String
{
var OUYA = "Ouya" ;
var PS4 = "PS4" ;
var LOGI = "Logi" ;
var XBOX = "XBox" ;
var XINPUT = "XInput" ;
var WII = "Wii" ;
var PRO_CON = "Pro_Con" ;
var JOYCONS = "Joycons" ;
var JOYCON_L = "Joycon_L";
var JOYCON_R = "Joycon_R";
var MFI = "MFI" ;
var PAD = "Pad" ;
static public function getAssetByDevice(device:Device):String
{
return switch (device)
{
case Keys: getAsset(null);
case Gamepad(id): getAsset(FlxG.gamepads.getByID(id));
}
}
static public function getAsset(gamepad:FlxGamepad):String
{
if (gamepad == null)
return 'assets/images/ui/devices/Keys.png';
final name = parseName(gamepad.name);
var path = 'assets/images/ui/devices/$name.png';
if (openfl.utils.Assets.exists(path))
return path;
return 'assets/images/ui/devices/Pad.png';
}
inline static public function getNameById(id:Int):ControllerName return getName(FlxG.gamepads.getByID(id));
inline static public function getName(gamepad:FlxGamepad):ControllerName return parseName(gamepad.name);
static public function parseName(name:String):ControllerName
{
name = name.toLowerCase().remove("-").remove("_");
return
if (name.contains("ouya"))
OUYA;
else if (name.contains("wireless controller") || name.contains("ps4"))
PS4;
else if (name.contains("logitech"))
LOGI;
else if (name.contains("xbox"))
XBOX
else if (name.contains("xinput"))
XINPUT;
else if (name.contains("nintendo rvlcnt01tr") || name.contains("nintendo rvlcnt01"))
WII;
else if (name.contains("mayflash wiimote pc adapter"))
WII;
else if (name.contains("pro controller"))
PRO_CON;
else if (name.contains("joycon l+r"))
JOYCONS;
else if (name.contains("joycon (l)"))
JOYCON_L;
else if (name.contains("joycon (r)"))
JOYCON_R;
else if (name.contains("mfi"))
MFI;
else
PAD;
}
}

View File

@ -75,7 +75,7 @@ class LoadingState extends MusicBeatState
if (!Assets.cache.hasSound(path))
{
var library = Assets.getLibrary("songs");
final symbolPath = path.split(":").pop();
var symbolPath = path.split(":").pop();
// @:privateAccess
// library.types.set(symbolPath, SOUND);
// @:privateAccess

View File

@ -1,11 +1,10 @@
package;
#if desktop
import Discord.DiscordClient;
#end
import NGio;
import flixel.FlxG;
import flixel.FlxObject;
import flixel.FlxSprite;
import flixel.FlxState;
import flixel.addons.transition.FlxTransitionableState;
import flixel.effects.FlxFlicker;
import flixel.graphics.frames.FlxAtlasFrames;
@ -13,23 +12,29 @@ import flixel.group.FlxGroup.FlxTypedGroup;
import flixel.text.FlxText;
import flixel.tweens.FlxEase;
import flixel.tweens.FlxTween;
import flixel.ui.FlxButton;
import flixel.util.FlxColor;
import io.newgrounds.NG;
import flixel.util.FlxTimer;
import lime.app.Application;
import ui.AtlasMenuList;
import ui.MenuList;
import ui.OptionsState;
import ui.PreferencesMenu;
import ui.Prompt;
using StringTools;
#if desktop
import Discord.DiscordClient;
#end
#if newgrounds
import io.newgrounds.NG;
import ui.NgPrompt;
#end
class MainMenuState extends MusicBeatState
{
var curSelected:Int = 0;
var menuItems:FlxTypedGroup<FlxSprite>;
#if !switch
var optionShit:Array<String> = ['story mode', 'freeplay', 'donate', 'options'];
#else
var optionShit:Array<String> = ['story mode', 'freeplay'];
#end
var menuItems:MainMenuList;
var magenta:FlxSprite;
var camFollow:FlxObject;
@ -51,10 +56,10 @@ class MainMenuState extends MusicBeatState
persistentUpdate = persistentDraw = true;
var bg:FlxSprite = new FlxSprite(-80).loadGraphic(Paths.image('menuBG'));
var bg:FlxSprite = new FlxSprite(Paths.image('menuBG'));
bg.scrollFactor.x = 0;
bg.scrollFactor.y = 0.17;
bg.setGraphicSize(Std.int(bg.width * 1.1));
bg.setGraphicSize(Std.int(bg.width * 1.2));
bg.updateHitbox();
bg.screenCenter();
bg.antialiasing = true;
@ -63,38 +68,56 @@ class MainMenuState extends MusicBeatState
camFollow = new FlxObject(0, 0, 1, 1);
add(camFollow);
magenta = new FlxSprite(-80).loadGraphic(Paths.image('menuDesat'));
magenta.scrollFactor.x = 0;
magenta.scrollFactor.y = 0.17;
magenta.setGraphicSize(Std.int(magenta.width * 1.1));
magenta = new FlxSprite(Paths.image('menuDesat'));
magenta.scrollFactor.x = bg.scrollFactor.x;
magenta.scrollFactor.y = bg.scrollFactor.y;
magenta.setGraphicSize(Std.int(bg.width));
magenta.updateHitbox();
magenta.screenCenter();
magenta.x = bg.x;
magenta.y = bg.y;
magenta.visible = false;
magenta.antialiasing = true;
magenta.color = 0xFFfd719b;
add(magenta);
if (PreferencesMenu.preferences.get('flashing-menu'))
add(magenta);
// magenta.scrollFactor.set();
menuItems = new FlxTypedGroup<FlxSprite>();
menuItems = new MainMenuList();
add(menuItems);
var tex = Paths.getSparrowAtlas('FNF_main_menu_assets');
for (i in 0...optionShit.length)
menuItems.onChange.add(onMenuItemChange);
menuItems.onAcceptPress.add(function(_)
{
var menuItem:FlxSprite = new FlxSprite(0, 60 + (i * 160));
menuItem.frames = tex;
menuItem.animation.addByPrefix('idle', optionShit[i] + " basic", 24);
menuItem.animation.addByPrefix('selected', optionShit[i] + " white", 24);
menuItem.animation.play('idle');
menuItem.ID = i;
menuItem.screenCenter(X);
menuItems.add(menuItem);
menuItem.scrollFactor.set();
menuItem.antialiasing = true;
FlxFlicker.flicker(magenta, 1.1, 0.15, false, true);
});
menuItems.enabled = false; // disable for intro
menuItems.createItem('story mode', function() startExitState(new StoryMenuState()));
menuItems.createItem('freeplay', function() startExitState(new FreeplayState()));
// addMenuItem('options', function () startExitState(new OptionMenu()));
#if CAN_OPEN_LINKS
var hasPopupBlocker = #if web true #else false #end;
menuItems.createItem('donate', selectDonate, hasPopupBlocker);
#end
menuItems.createItem('options', function() startExitState(new OptionsState()));
// #if newgrounds
// if (NGio.isLoggedIn)
// menuItems.createItem("logout", selectLogout);
// else
// menuItems.createItem("login", selectLogin);
// #end
// center vertically
var spacing = 160;
var top = (FlxG.height - (spacing * (menuItems.length - 1))) / 2;
for (i in 0...menuItems.length)
{
var menuItem = menuItems.members[i];
menuItem.x = FlxG.width / 2;
menuItem.y = top + spacing * i;
}
FlxG.camera.follow(camFollow, null, 0.06);
// FlxG.camera.setScrollBounds(bg.x, bg.x + bg.width, bg.y, bg.y + bg.height * 1.2);
var versionShit:FlxText = new FlxText(5, FlxG.height - 18, 0, "v" + Application.current.meta.get('version'), 12);
versionShit.scrollFactor.set();
@ -103,12 +126,113 @@ class MainMenuState extends MusicBeatState
// NG.core.calls.event.logEvent('swag').send();
changeItem();
super.create();
}
var selectedSomethin:Bool = false;
override function finishTransIn()
{
super.finishTransIn();
menuItems.enabled = true;
// #if newgrounds
// if (NGio.savedSessionFailed)
// showSavedSessionFailed();
// #end
}
function onMenuItemChange(selected:MenuItem)
{
camFollow.setPosition(selected.getGraphicMidpoint().x, selected.getGraphicMidpoint().y);
}
#if CAN_OPEN_LINKS
function selectDonate()
{
#if linux
Sys.command('/usr/bin/xdg-open', ["https://ninja-muffin24.itch.io/funkin", "&"]);
#else
FlxG.openURL('https://ninja-muffin24.itch.io/funkin');
#end
}
#end
#if newgrounds
function selectLogin()
{
openNgPrompt(NgPrompt.showLogin());
}
function selectLogout()
{
openNgPrompt(NgPrompt.showLogout());
}
function showSavedSessionFailed()
{
openNgPrompt(NgPrompt.showSavedSessionFailed());
}
/**
* Calls openPrompt and redraws the login/logout button
* @param prompt
* @param onClose
*/
public function openNgPrompt(prompt:Prompt, ?onClose:Void->Void)
{
var onPromptClose = checkLoginStatus;
if (onClose != null)
{
onPromptClose = function()
{
checkLoginStatus();
onClose();
}
}
openPrompt(prompt, onPromptClose);
}
function checkLoginStatus()
{
var prevLoggedIn = menuItems.has("logout");
if (prevLoggedIn && !NGio.isLoggedIn)
menuItems.resetItem("login", "logout", selectLogout);
else if (!prevLoggedIn && NGio.isLoggedIn)
menuItems.resetItem("logout", "login", selectLogin);
}
#end
public function openPrompt(prompt:Prompt, onClose:Void->Void)
{
menuItems.enabled = false;
prompt.closeCallback = function()
{
menuItems.enabled = true;
if (onClose != null)
onClose();
}
openSubState(prompt);
}
function startExitState(state:FlxState)
{
var duration = 0.4;
menuItems.forEach(function(item)
{
if (menuItems.selectedIndex != item.ID)
{
FlxTween.tween(item, {alpha: 0}, duration, {ease: FlxEase.quadOut});
}
else
{
item.visible = false;
}
});
new FlxTimer().start(duration, function(_) FlxG.switchState(state));
}
override function update(elapsed:Float)
{
@ -117,124 +241,52 @@ class MainMenuState extends MusicBeatState
FlxG.sound.music.volume += 0.5 * FlxG.elapsed;
}
if (!selectedSomethin)
{
if (controls.UP_P)
{
FlxG.sound.play(Paths.sound('scrollMenu'));
changeItem(-1);
}
if (controls.DOWN_P)
{
FlxG.sound.play(Paths.sound('scrollMenu'));
changeItem(1);
}
if (controls.BACK)
{
FlxG.switchState(new TitleState());
}
if (controls.ACCEPT)
{
if (optionShit[curSelected] == 'donate')
{
#if linux
Sys.command('/usr/bin/xdg-open', ["https://ninja-muffin24.itch.io/funkin", "&"]);
#else
FlxG.openURL('https://ninja-muffin24.itch.io/funkin');
#end
}
else
{
selectedSomethin = true;
FlxG.sound.play(Paths.sound('confirmMenu'));
FlxFlicker.flicker(magenta, 1.1, 0.15, false);
menuItems.forEach(function(spr:FlxSprite)
{
if (curSelected != spr.ID)
{
FlxTween.tween(spr, {alpha: 0}, 0.4, {
ease: FlxEase.quadOut,
onComplete: function(twn:FlxTween)
{
spr.kill();
}
});
}
else
{
FlxFlicker.flicker(spr, 1, 0.06, false, false, function(flick:FlxFlicker)
{
var daChoice:String = optionShit[curSelected];
switch (daChoice)
{
case 'story mode':
FlxG.switchState(new StoryMenuState());
trace("Story Menu Selected");
case 'freeplay':
FlxG.switchState(new FreeplayState());
trace("Freeplay Menu Selected");
case 'options':
FlxTransitionableState.skipNextTransIn = true;
FlxTransitionableState.skipNextTransOut = true;
FlxG.switchState(new OptionsMenu());
}
});
}
});
}
}
}
if (menuItems.enabled && controls.BACK)
FlxG.switchState(new TitleState());
super.update(elapsed);
menuItems.forEach(function(spr:FlxSprite)
{
spr.screenCenter(X);
});
}
function changeItem(huh:Int = 0)
{
curSelected += huh;
if (curSelected >= menuItems.length)
curSelected = 0;
if (curSelected < 0)
curSelected = menuItems.length - 1;
menuItems.forEach(function(spr:FlxSprite)
{
spr.animation.play('idle');
if (spr.ID == curSelected)
{
camFollow.setPosition(spr.getGraphicMidpoint().x, spr.getGraphicMidpoint().y);
spr.animation.play('selected');
}
spr.updateHitbox();
if(spr.animation.curAnim.name == 'selected')
{
switch(optionShit[curSelected])
{
case 'story mode':
spr.offset.y += 26;
case 'freeplay':
spr.offset.y += 28;
case 'donate':
spr.offset.y += 21;
case 'options':
spr.offset.y += 26;
}
}
});
}
}
private class MainMenuList extends MenuTypedList<MainMenuItem>
{
public var atlas:FlxAtlasFrames;
public function new()
{
atlas = Paths.getSparrowAtlas('main_menu');
super(Vertical);
}
public function createItem(x = 0.0, y = 0.0, name:String, callback, fireInstantly = false)
{
var item = new MainMenuItem(x, y, name, atlas, callback);
item.fireInstantly = fireInstantly;
item.ID = length;
return addItem(name, item);
}
override function destroy()
{
super.destroy();
atlas = null;
}
}
private class MainMenuItem extends AtlasMenuItem
{
public function new(x = 0.0, y = 0.0, name, atlas, callback)
{
super(x, y, name, atlas, callback);
scrollFactor.set();
}
override function changeAnim(anim:String)
{
super.changeAnim(anim);
// position by center
centerOrigin();
offset.copyFrom(origin);
}
}

View File

@ -1,10 +1,13 @@
package;
#if newgrounds
import flixel.FlxG;
import flixel.util.FlxSignal;
import flixel.util.FlxTimer;
import io.newgrounds.NG;
import io.newgrounds.NGLite;
import io.newgrounds.components.ScoreBoardComponent.Period;
import io.newgrounds.objects.Error;
import io.newgrounds.objects.Medal;
import io.newgrounds.objects.Score;
import io.newgrounds.objects.ScoreBoard;
@ -15,14 +18,24 @@ import lime.app.Application;
import openfl.display.Stage;
using StringTools;
#end
/**
* MADE BY GEOKURELI THE LEGENED GOD HERO MVP
*/
class NGio
{
public static var isLoggedIn:Bool = false;
#if newgrounds
/**
* True, if the saved sessionId was used in the initial login, and failed to connect.
* Used in MainMenuState to show a popup to establish a new connection
*/
public static var savedSessionFailed(default, null):Bool = false;
public static var scoreboardsLoaded:Bool = false;
public static var isLoggedIn(get, never):Bool;
inline static function get_isLoggedIn()
{
return NG.core != null && NG.core.loggedIn;
}
public static var scoreboardArray:Array<Score> = [];
@ -30,45 +43,67 @@ class NGio
public static var ngScoresLoaded(default, null):FlxSignal = new FlxSignal();
public static var GAME_VER:String = "";
public static var GAME_VER_NUMS:String = '';
public static var gotOnlineVer:Bool = false;
public static function noLogin(api:String)
static public function checkVersion(callback:String->Void)
{
trace('INIT NOLOGIN');
trace('checking NG.io version');
GAME_VER = "v" + Application.current.meta.get('version');
if (api.length != 0)
{
NG.create(api);
new FlxTimer().start(2, function(tmr:FlxTimer)
NG.core.calls.app.getCurrentVersion(GAME_VER)
.addDataHandler(function(response)
{
var call = NG.core.calls.app.getCurrentVersion(GAME_VER).addDataHandler(function(response:Response<GetCurrentVersionResult>)
{
GAME_VER = response.result.data.currentVersion;
GAME_VER_NUMS = GAME_VER.split(" ")[0].trim();
trace('CURRENT NG VERSION: ' + GAME_VER);
trace('CURRENT NG VERSION: ' + GAME_VER_NUMS);
gotOnlineVer = true;
});
call.send();
});
}
GAME_VER = response.result.data.currentVersion;
trace('CURRENT NG VERSION: ' + GAME_VER);
callback(GAME_VER);
})
.send();
}
public function new(api:String, encKey:String, ?sessionId:String)
static public function init()
{
var api = APIStuff.API;
if (api == null || api.length == 0)
{
trace("Missing Newgrounds API key, aborting connection");
return;
}
trace("connecting to newgrounds");
NG.createAndCheckSession(api, sessionId);
NG.core.verbose = true;
#if NG_FORCE_EXPIRED_SESSION
var sessionId:String = "fake_session_id";
function onSessionFail(error:Error)
{
trace("Forcing an expired saved session. "
+ "To disable, comment out NG_FORCE_EXPIRED_SESSION in Project.xml");
savedSessionFailed = true;
}
#else
var sessionId:String = NGLite.getSessionId();
if (sessionId != null)
trace("found web session id");
#if (debug)
if (sessionId == null && APIStuff.SESSION != null)
{
trace("using debug session id");
sessionId = APIStuff.SESSION;
}
#end
var onSessionFail:Error->Void = null;
if (sessionId == null && FlxG.save.data.sessionId != null)
{
trace("using stored session id");
sessionId = FlxG.save.data.sessionId;
onSessionFail = function (error) savedSessionFailed = true;
}
#end
NG.create(api, sessionId, #if NG_DEBUG true #else false #end, onSessionFail);
#if NG_VERBOSE NG.core.verbose = true; #end
// Set the encryption cipher/format to RC4/Base64. AES128 and Hex are not implemented yet
NG.core.initEncryption(encKey); // Found in you NG project view
trace(NG.core.attemptingLogin);
NG.core.initEncryption(APIStuff.EncKey); // Found in you NG project view
if (NG.core.attemptingLogin)
{
@ -78,21 +113,58 @@ class NGio
trace("attempting login");
NG.core.onLogin.add(onNGLogin);
}
else
//GK: taking out auto login, adding a login button to the main menu
// else
// {
// /* They are NOT playing on newgrounds.com, no session id was found. We must start one manually, if we want to.
// * Note: This will cause a new browser window to pop up where they can log in to newgrounds
// */
// NG.core.requestLogin(onNGLogin);
// }
}
/**
* Attempts to log in to newgrounds by requesting a new session ID, only call if no session ID was found automatically
* @param popupLauncher The function to call to open the login url, must be inside
* a user input event or the popup blocker will block it.
* @param onComplete A callback with the result of the connection.
*/
static public function login(?popupLauncher:(Void->Void)->Void, onComplete:ConnectionResult->Void)
{
trace("Logging in manually");
var onPending:Void->Void = null;
if (popupLauncher != null)
{
/* They are NOT playing on newgrounds.com, no session id was found. We must start one manually, if we want to.
* Note: This will cause a new browser window to pop up where they can log in to newgrounds
*/
NG.core.requestLogin(onNGLogin);
onPending = function () popupLauncher(NG.core.openPassportUrl);
}
var onSuccess:Void->Void = onNGLogin;
var onFail:Error->Void = null;
var onCancel:Void->Void = null;
if (onComplete != null)
{
onSuccess = function ()
{
onNGLogin();
onComplete(Success);
}
onFail = function (e) onComplete(Fail(e.message));
onCancel = function() onComplete(Cancelled);
}
NG.core.requestLogin(onSuccess, onPending, onFail, onCancel);
}
inline static public function cancelLogin():Void
{
NG.core.cancelLoginRequest();
}
function onNGLogin():Void
static function onNGLogin():Void
{
trace('logged in! user:${NG.core.user.name}');
isLoggedIn = true;
FlxG.save.data.sessionId = NG.core.sessionId;
// FlxG.save.flush();
FlxG.save.flush();
// Load medals then call onNGMedalFetch()
NG.core.requestMedals(onNGMedalFetch);
@ -101,9 +173,17 @@ class NGio
ngDataLoaded.dispatch();
}
static public function logout()
{
NG.core.logOut();
FlxG.save.data.sessionId = null;
FlxG.save.flush();
}
// --- MEDALS
function onNGMedalFetch():Void
static function onNGMedalFetch():Void
{
/*
// Reading medal info
@ -121,7 +201,7 @@ class NGio
}
// --- SCOREBOARDS
function onNGBoardsFetch():Void
static function onNGBoardsFetch():Void
{
/*
// Reading medal info
@ -145,25 +225,7 @@ class NGio
// more info on scores --- http://www.newgrounds.io/help/components/#scoreboard-getscores
}
inline static public function postScore(score:Int = 0, song:String)
{
if (isLoggedIn)
{
for (id in NG.core.scoreBoards.keys())
{
var board = NG.core.scoreBoards.get(id);
if (song == board.name)
{
board.postScore(score, "Uhh meow?");
}
// trace('loaded scoreboard id:$id, name:${board.name}');
}
}
}
function onNGScoresFetch():Void
static function onNGScoresFetch():Void
{
scoreboardsLoaded = true;
@ -181,20 +243,61 @@ class NGio
// NGio.scoreboardArray = NG.core.scoreBoards.get(8004).scores;
}
#end
inline static public function logEvent(event:String)
static public function logEvent(event:String)
{
#if newgrounds
NG.core.calls.event.logEvent(event).send();
trace('should have logged: ' + event);
#else
#if debug trace('event:$event - not logged, missing NG.io lib'); #end
#end
}
inline static public function unlockMedal(id:Int)
static public function unlockMedal(id:Int)
{
#if newgrounds
if (isLoggedIn)
{
var medal = NG.core.medals.get(id);
if (!medal.unlocked)
medal.sendUnlock();
}
#else
#if debug trace('medal:$id - not unlocked, missing NG.io lib'); #end
#end
}
static public function postScore(score:Int = 0, song:String)
{
#if newgrounds
if (isLoggedIn)
{
for (id in NG.core.scoreBoards.keys())
{
var board = NG.core.scoreBoards.get(id);
if (song == board.name)
{
board.postScore(score, "Uhh meow?");
}
// trace('loaded scoreboard id:$id, name:${board.name}');
}
}
#else
#if debug trace('Song:$song, Score:$score - not posted, missing NG.io lib'); #end
#end
}
}
enum ConnectionResult
{
/** Log in successful */
Success;
/** Could not login */
Fail(msg:String);
/** User cancelled the login */
Cancelled;
}

40
source/NoteSplash.hx Normal file
View File

@ -0,0 +1,40 @@
package;
import flixel.FlxG;
import flixel.FlxSprite;
import haxe.io.Path;
class NoteSplash extends FlxSprite
{
public function new(x:Float, y:Float, noteData:Int = 0):Void
{
super(x, y);
frames = Paths.getSparrowAtlas('noteSplashes');
animation.addByPrefix('note1-0', 'note impact 1 blue', 24, false);
animation.addByPrefix('note2-0', 'note impact 1 green', 24, false);
animation.addByPrefix('note0-0', 'note impact 1 purple', 24, false);
animation.addByPrefix('note3-0', 'note impact 1 red', 24, false);
animation.addByPrefix('note1-1', 'note impact 2 blue', 24, false);
animation.addByPrefix('note2-1', 'note impact 2 green', 24, false);
animation.addByPrefix('note0-1', 'note impact 2 purple', 24, false);
animation.addByPrefix('note3-1', 'note impact 2 red', 24, false);
animation.play('note' + noteData + '-' + FlxG.random.int(0, 1));
animation.curAnim.frameRate += FlxG.random.int(-2, 2);
updateHitbox();
offset.set(width * 0.3, height * 0.3);
alpha = 0.75;
}
override function update(elapsed:Float)
{
if (animation.curAnim.finished)
kill();
super.update(elapsed);
}
}

View File

@ -1,134 +0,0 @@
package;
import Controls.Control;
import flash.text.TextField;
import flixel.FlxG;
import flixel.FlxSprite;
import flixel.addons.display.FlxGridOverlay;
import flixel.group.FlxGroup.FlxTypedGroup;
import flixel.input.keyboard.FlxKey;
import flixel.math.FlxMath;
import flixel.text.FlxText;
import flixel.util.FlxColor;
import lime.utils.Assets;
class OptionsMenu extends MusicBeatState
{
var selector:FlxText;
var curSelected:Int = 0;
var controlsStrings:Array<String> = [];
private var grpControls:FlxTypedGroup<Alphabet>;
override function create()
{
var menuBG:FlxSprite = new FlxSprite().loadGraphic(Paths.image('menuDesat'));
controlsStrings = CoolUtil.coolTextFile(Paths.txt('controls'));
menuBG.color = 0xFFea71fd;
menuBG.setGraphicSize(Std.int(menuBG.width * 1.1));
menuBG.updateHitbox();
menuBG.screenCenter();
menuBG.antialiasing = true;
add(menuBG);
/*
grpControls = new FlxTypedGroup<Alphabet>();
add(grpControls);
for (i in 0...controlsStrings.length)
{
if (controlsStrings[i].indexOf('set') != -1)
{
var controlLabel:Alphabet = new Alphabet(0, (70 * i) + 30, controlsStrings[i].substring(3) + ': ' + controlsStrings[i + 1], true, false);
controlLabel.isMenuItem = true;
controlLabel.targetY = i;
grpControls.add(controlLabel);
}
// DONT PUT X IN THE FIRST PARAMETER OF new ALPHABET() !!
}
*/
super.create();
openSubState(new OptionsSubState());
}
override function update(elapsed:Float)
{
super.update(elapsed);
/*
if (controls.ACCEPT)
{
changeBinding();
}
if (isSettingControl)
waitingInput();
else
{
if (controls.BACK)
FlxG.switchState(new MainMenuState());
if (controls.UP_P)
changeSelection(-1);
if (controls.DOWN_P)
changeSelection(1);
}
*/
}
function waitingInput():Void
{
if (FlxG.keys.getIsDown().length > 0)
{
PlayerSettings.player1.controls.replaceBinding(Control.LEFT, Keys, FlxG.keys.getIsDown()[0].ID, null);
}
// PlayerSettings.player1.controls.replaceBinding(Control)
}
var isSettingControl:Bool = false;
function changeBinding():Void
{
if (!isSettingControl)
{
isSettingControl = true;
}
}
function changeSelection(change:Int = 0)
{
#if !switch
NGio.logEvent('Fresh');
#end
FlxG.sound.play(Paths.sound('scrollMenu'), 0.4);
curSelected += change;
if (curSelected < 0)
curSelected = grpControls.length - 1;
if (curSelected >= grpControls.length)
curSelected = 0;
// selector.y = (70 * curSelected) + 30;
var bullShit:Int = 0;
for (item in grpControls.members)
{
item.targetY = bullShit - curSelected;
bullShit++;
item.alpha = 0.6;
// item.setGraphicSize(Std.int(item.width * 0.8));
if (item.targetY == 0)
{
item.alpha = 1;
// item.setGraphicSize(Std.int(item.width));
}
}
}
}

View File

@ -1,87 +0,0 @@
package;
import flixel.FlxG;
import flixel.FlxSprite;
import flixel.group.FlxGroup.FlxTypedGroup;
import flixel.text.FlxText;
import flixel.util.FlxColor;
class OptionsSubState extends MusicBeatSubstate
{
var textMenuItems:Array<String> = ['Master Volume', 'Sound Volume', 'Controls', 'Colors', 'Back'];
var selector:FlxSprite;
var curSelected:Int = 0;
var grpOptionsTexts:FlxTypedGroup<FlxText>;
// public static var isDownscroll:Bool = false;
public function new()
{
super();
#if desktop
textMenuItems.push('Mods');
#end
grpOptionsTexts = new FlxTypedGroup<FlxText>();
add(grpOptionsTexts);
selector = new FlxSprite().makeGraphic(5, 5, FlxColor.RED);
add(selector);
for (i in 0...textMenuItems.length)
{
var optionText:FlxText = new FlxText(20, 20 + (i * 50), 0, textMenuItems[i], 32);
optionText.ID = i;
grpOptionsTexts.add(optionText);
}
}
override function update(elapsed:Float)
{
super.update(elapsed);
if (controls.UP_P)
curSelected -= 1;
if (controls.DOWN_P)
curSelected += 1;
if (curSelected < 0)
curSelected = textMenuItems.length - 1;
if (curSelected >= textMenuItems.length)
curSelected = 0;
grpOptionsTexts.forEach(function(txt:FlxText)
{
txt.color = FlxColor.WHITE;
if (txt.ID == curSelected)
txt.color = FlxColor.YELLOW;
});
if (controls.BACK)
FlxG.switchState(new MainMenuState());
if (controls.ACCEPT)
{
switch (textMenuItems[curSelected])
{
case "Colors":
FlxG.state.closeSubState();
FlxG.state.openSubState(new ColorpickSubstate());
case "Controls":
FlxG.state.closeSubState();
FlxG.state.openSubState(new ControlsSubState());
case "Mods":
FlxG.state.closeSubState();
FlxG.state.openSubState(new ModdingSubstate());
case "Back":
FlxG.switchState(new MainMenuState());
}
}
}
}

View File

@ -97,7 +97,7 @@ class PauseSubState extends MusicBeatSubstate
regenMenu();
cameras = [FlxG.cameras.list[FlxG.cameras.list.length - 1]];
// cameras = [FlxG.cameras.list[FlxG.cameras.list.length - 1]];
}
private function regenMenu():Void
@ -126,8 +126,8 @@ class PauseSubState extends MusicBeatSubstate
super.update(elapsed);
var upP = controls.UP_P;
var downP = controls.DOWN_P;
var upP = controls.UI_UP_P;
var downP = controls.UI_DOWN_P;
var accepted = controls.ACCEPT;
if (upP)

View File

@ -39,6 +39,7 @@ import openfl.display.BlendMode;
import openfl.display.StageQuality;
import openfl.filters.ShaderFilter;
import shaderslmfao.ColorSwap;
import ui.PreferencesMenu;
using StringTools;
@ -153,9 +154,7 @@ class PlayState extends MusicBeatState
camHUD.bgColor.alpha = 0;
FlxG.cameras.reset(camGame);
FlxG.cameras.add(camHUD);
FlxCamera.defaultCameras = [camGame];
FlxG.cameras.add(camHUD, false);
persistentUpdate = true;
persistentDraw = true;
@ -1164,9 +1163,7 @@ class PlayState extends MusicBeatState
{
swagNote.x += FlxG.width / 2; // general offset
}
else
{
}
else {}
}
daBeats += 1;
}
@ -1388,6 +1385,9 @@ class PlayState extends MusicBeatState
override public function update(elapsed:Float)
{
// makes the lerp non-dependant on the framerate
FlxG.camera.followLerp = 0.04 * (elapsed / (1 / 60));
#if !debug
perfectMode = false;
#end
@ -1461,7 +1461,13 @@ class PlayState extends MusicBeatState
FlxG.switchState(new GitarooPause());
}
else
openSubState(new PauseSubState(boyfriend.getScreenPosition().x, boyfriend.getScreenPosition().y));
{
var boyfriendPos = boyfriend.getScreenPosition();
var pauseSubState = new PauseSubState(boyfriendPos.x, boyfriendPos.y);
openSubState(pauseSubState);
pauseSubState.camera = camHUD;
boyfriendPos.put();
}
#if desktop
DiscordClient.changePresence(detailsPausedText, SONG.song + " (" + storyDifficultyText + ")", iconRPC);
@ -1480,8 +1486,8 @@ class PlayState extends MusicBeatState
// FlxG.watch.addQuick('VOL', vocals.amplitudeLeft);
// FlxG.watch.addQuick('VOLRight', vocals.amplitudeRight);
iconP1.setGraphicSize(Std.int(FlxMath.lerp(150, iconP1.width, 0.50)));
iconP2.setGraphicSize(Std.int(FlxMath.lerp(150, iconP2.width, 0.50)));
iconP1.setGraphicSize(Std.int(FlxMath.lerp(150, iconP1.width, 0.85)));
iconP2.setGraphicSize(Std.int(FlxMath.lerp(150, iconP2.width, 0.85)));
iconP1.updateHitbox();
iconP2.updateHitbox();
@ -1514,60 +1520,9 @@ class PlayState extends MusicBeatState
if (generatedMusic && PlayState.SONG.notes[Std.int(curStep / 16)] != null)
{
if (curBeat % 4 == 0)
{
// trace(PlayState.SONG.notes[Std.int(curStep / 16)].mustHitSection);
}
cameraRightSide = PlayState.SONG.notes[Std.int(curStep / 16)].mustHitSection;
if (camFollow.x != dad.getMidpoint().x + 150 && !PlayState.SONG.notes[Std.int(curStep / 16)].mustHitSection)
{
camFollow.setPosition(dad.getMidpoint().x + 150, dad.getMidpoint().y - 100);
// camFollow.setPosition(lucky.getMidpoint().x - 120, lucky.getMidpoint().y + 210);
switch (dad.curCharacter)
{
case 'mom':
camFollow.y = dad.getMidpoint().y;
case 'senpai':
camFollow.y = dad.getMidpoint().y - 430;
camFollow.x = dad.getMidpoint().x - 100;
case 'senpai-angry':
camFollow.y = dad.getMidpoint().y - 430;
camFollow.x = dad.getMidpoint().x - 100;
}
if (dad.curCharacter == 'mom')
vocals.volume = 1;
if (SONG.song.toLowerCase() == 'tutorial')
{
tweenCamIn();
}
}
if (PlayState.SONG.notes[Std.int(curStep / 16)].mustHitSection && camFollow.x != boyfriend.getMidpoint().x - 100)
{
camFollow.setPosition(boyfriend.getMidpoint().x - 100, boyfriend.getMidpoint().y - 100);
switch (curStage)
{
case 'limo':
camFollow.x = boyfriend.getMidpoint().x - 300;
case 'mall':
camFollow.y = boyfriend.getMidpoint().y - 200;
case 'school':
camFollow.x = boyfriend.getMidpoint().x - 200;
camFollow.y = boyfriend.getMidpoint().y - 200;
case 'schoolEvil':
camFollow.x = boyfriend.getMidpoint().x - 200;
camFollow.y = boyfriend.getMidpoint().y - 200;
}
if (SONG.song.toLowerCase() == 'tutorial')
{
FlxTween.tween(FlxG.camera, {zoom: 1}, (Conductor.stepCrochet * 4 / 1000), {ease: FlxEase.elasticInOut});
}
}
cameraMovement();
}
if (camZooming)
@ -1617,12 +1572,13 @@ class PlayState extends MusicBeatState
trace("RESET = True");
}
// CHEAT = brandon's a pussy
#if CAN_CHEAT // brandon's a pussy
if (controls.CHEAT)
{
health += 1;
trace("User is cheating!");
}
#end
if (health <= 0 && !practiceMode)
{
@ -1761,9 +1717,7 @@ class PlayState extends MusicBeatState
vocals.volume = 0;
if (SONG.validScore)
{
#if !switch
Highscore.saveScore(SONG.song, songScore, storyDifficulty);
#end
}
if (isStoryMode)
@ -1836,7 +1790,7 @@ class PlayState extends MusicBeatState
var endingSong:Bool = false;
private function popUpScore(strumtime:Float):Void
private function popUpScore(strumtime:Float, daNote:Note):Void
{
var noteDiff:Float = Math.abs(strumtime - Conductor.songPosition);
// boyfriend.playAnim('hey');
@ -1854,20 +1808,33 @@ class PlayState extends MusicBeatState
var daRating:String = "sick";
var isSick:Bool = true;
if (noteDiff > Conductor.safeZoneOffset * 0.9)
{
daRating = 'shit';
score = 50;
isSick = false; // shitty copypaste on this literally just because im lazy and tired lol!
}
else if (noteDiff > Conductor.safeZoneOffset * 0.75)
{
daRating = 'bad';
score = 100;
isSick = false;
}
else if (noteDiff > Conductor.safeZoneOffset * 0.2)
{
daRating = 'good';
score = 200;
isSick = false;
}
if (isSick)
{
var noteSplash:NoteSplash = new NoteSplash(daNote.x, daNote.y, daNote.noteData);
add(noteSplash);
noteSplash.cameras = [camHUD];
}
songScore += score;
@ -1990,23 +1957,78 @@ class PlayState extends MusicBeatState
curSection += 1;
}
var cameraRightSide:Bool = false;
function cameraMovement()
{
if (camFollow.x != dad.getMidpoint().x + 150 && !cameraRightSide)
{
camFollow.setPosition(dad.getMidpoint().x + 150, dad.getMidpoint().y - 100);
// camFollow.setPosition(lucky.getMidpoint().x - 120, lucky.getMidpoint().y + 210);
switch (dad.curCharacter)
{
case 'mom':
camFollow.y = dad.getMidpoint().y;
case 'senpai':
camFollow.y = dad.getMidpoint().y - 430;
camFollow.x = dad.getMidpoint().x - 100;
case 'senpai-angry':
camFollow.y = dad.getMidpoint().y - 430;
camFollow.x = dad.getMidpoint().x - 100;
}
if (dad.curCharacter == 'mom')
vocals.volume = 1;
if (SONG.song.toLowerCase() == 'tutorial')
{
tweenCamIn();
}
}
if (cameraRightSide && camFollow.x != boyfriend.getMidpoint().x - 100)
{
camFollow.setPosition(boyfriend.getMidpoint().x - 100, boyfriend.getMidpoint().y - 100);
switch (curStage)
{
case 'limo':
camFollow.x = boyfriend.getMidpoint().x - 300;
case 'mall':
camFollow.y = boyfriend.getMidpoint().y - 200;
case 'school':
camFollow.x = boyfriend.getMidpoint().x - 200;
camFollow.y = boyfriend.getMidpoint().y - 200;
case 'schoolEvil':
camFollow.x = boyfriend.getMidpoint().x - 200;
camFollow.y = boyfriend.getMidpoint().y - 200;
}
if (SONG.song.toLowerCase() == 'tutorial')
{
FlxTween.tween(FlxG.camera, {zoom: 1}, (Conductor.stepCrochet * 4 / 1000), {ease: FlxEase.elasticInOut});
}
}
}
private function keyShit():Void
{
// HOLDING
var up = controls.UP;
var right = controls.RIGHT;
var down = controls.DOWN;
var left = controls.LEFT;
var up = controls.NOTE_UP;
var right = controls.NOTE_RIGHT;
var down = controls.NOTE_DOWN;
var left = controls.NOTE_LEFT;
var upP = controls.UP_P;
var rightP = controls.RIGHT_P;
var downP = controls.DOWN_P;
var leftP = controls.LEFT_P;
var upP = controls.NOTE_UP_P;
var rightP = controls.NOTE_RIGHT_P;
var downP = controls.NOTE_DOWN_P;
var leftP = controls.NOTE_LEFT_P;
var upR = controls.UP_R;
var rightR = controls.RIGHT_R;
var downR = controls.DOWN_R;
var leftR = controls.LEFT_R;
var upR = controls.NOTE_UP_R;
var rightR = controls.NOTE_RIGHT_R;
var downR = controls.NOTE_DOWN_R;
var leftR = controls.NOTE_LEFT_R;
var controlArray:Array<Bool> = [leftP, downP, upP, rightP];
@ -2116,7 +2138,7 @@ class PlayState extends MusicBeatState
}
}
if ((up || right || down || left) && !boyfriend.stunned && generatedMusic)
if ((up || right || down || left) && /*!boyfriend.stunned && */ generatedMusic)
{
notes.forEachAlive(function(daNote:Note)
{
@ -2230,10 +2252,10 @@ class PlayState extends MusicBeatState
{
// just double pasting this shit cuz fuk u
// REDO THIS SYSTEM!
var upP = controls.UP_P;
var rightP = controls.RIGHT_P;
var downP = controls.DOWN_P;
var leftP = controls.LEFT_P;
var upP = controls.NOTE_UP_P;
var rightP = controls.NOTE_RIGHT_P;
var downP = controls.NOTE_DOWN_P;
var leftP = controls.NOTE_LEFT_P;
if (leftP)
noteMiss(0);
@ -2261,7 +2283,7 @@ class PlayState extends MusicBeatState
{
if (!note.isSustainNote)
{
popUpScore(note.strumTime);
popUpScore(note.strumTime, note);
combo += 1;
}
@ -2429,16 +2451,20 @@ class PlayState extends MusicBeatState
wiggleShit.update(Conductor.crochet);
// HARDCODING FOR MILF ZOOMS!
if (curSong.toLowerCase() == 'milf' && curBeat >= 168 && curBeat < 200 && camZooming && FlxG.camera.zoom < 1.35)
{
FlxG.camera.zoom += 0.015;
camHUD.zoom += 0.03;
}
if (camZooming && FlxG.camera.zoom < 1.35 && curBeat % 4 == 0)
if (PreferencesMenu.getPref('camera-zoom'))
{
FlxG.camera.zoom += 0.015;
camHUD.zoom += 0.03;
if (curSong.toLowerCase() == 'milf' && curBeat >= 168 && curBeat < 200 && camZooming && FlxG.camera.zoom < 1.35)
{
FlxG.camera.zoom += 0.015;
camHUD.zoom += 0.03;
}
if (camZooming && FlxG.camera.zoom < 1.35 && curBeat % 4 == 0)
{
FlxG.camera.zoom += 0.015;
camHUD.zoom += 0.03;
}
}
iconP1.setGraphicSize(Std.int(iconP1.width + 30));

View File

@ -1,8 +1,11 @@
package;
import Controls;
import flixel.FlxCamera;
import flixel.FlxG;
import flixel.input.actions.FlxActionInput;
import flixel.input.gamepad.FlxGamepad;
import flixel.util.FlxSignal;
// import ui.DeviceManager;
@ -14,143 +17,233 @@ class PlayerSettings
static public var player1(default, null):PlayerSettings;
static public var player2(default, null):PlayerSettings;
#if (haxe >= "4.0.0")
static public final onAvatarAdd = new FlxTypedSignal<PlayerSettings->Void>();
static public final onAvatarRemove = new FlxTypedSignal<PlayerSettings->Void>();
#else
static public var onAvatarAdd = new FlxTypedSignal<PlayerSettings->Void>();
static public var onAvatarRemove = new FlxTypedSignal<PlayerSettings->Void>();
#end
static public var onAvatarAdd(default, null) = new FlxTypedSignal<PlayerSettings->Void>();
static public var onAvatarRemove(default, null) = new FlxTypedSignal<PlayerSettings->Void>();
public var id(default, null):Int;
#if (haxe >= "4.0.0")
public final controls:Controls;
#else
public var controls:Controls;
#end
public var controls(default, null):Controls;
// public var avatar:Player;
// public var camera(get, never):PlayCamera;
function new(id, scheme)
function new(id)
{
this.id = id;
this.controls = new Controls('player$id', scheme);
this.controls = new Controls('player$id', None);
#if CLEAR_INPUT_SAVE
FlxG.save.data.controls = null;
FlxG.save.flush();
#end
var useDefault = true;
var controlData = FlxG.save.data.controls;
if (controlData != null)
{
var keyData:Dynamic = null;
if (id == 0 && controlData.p1 != null && controlData.p1.keys != null)
keyData = controlData.p1.keys;
else if (id == 1 && controlData.p2 != null && controlData.p2.keys != null)
keyData = controlData.p2.keys;
if (keyData != null)
{
useDefault = false;
trace("loaded key data: " + haxe.Json.stringify(keyData));
controls.fromSaveData(keyData, Keys);
}
}
if (useDefault)
controls.setKeyboardScheme(Solo);
}
function addGamepad(gamepad:FlxGamepad)
{
var useDefault = true;
var controlData = FlxG.save.data.controls;
if (controlData != null)
{
var padData:Dynamic = null;
if (id == 0 && controlData.p1 != null && controlData.p1.pad != null)
padData = controlData.p1.pad;
else if (id == 1 && controlData.p2 != null && controlData.p2.pad != null)
padData = controlData.p2.pad;
if (padData != null)
{
useDefault = false;
trace("loaded pad data: " + haxe.Json.stringify(padData));
controls.addGamepadWithSaveData(gamepad.id, padData);
}
}
if (useDefault)
controls.addDefaultGamepad(gamepad.id);
}
public function saveControls()
{
if (FlxG.save.data.controls == null)
FlxG.save.data.controls = {};
var playerData:{ ?keys:Dynamic, ?pad:Dynamic }
if (id == 0)
{
if (FlxG.save.data.controls.p1 == null)
FlxG.save.data.controls.p1 = {};
playerData = FlxG.save.data.controls.p1;
}
else
{
if (FlxG.save.data.controls.p2 == null)
FlxG.save.data.controls.p2 = {};
playerData = FlxG.save.data.controls.p2;
}
var keyData = controls.createSaveData(Keys);
if (keyData != null)
{
playerData.keys = keyData;
trace("saving key data: " + haxe.Json.stringify(keyData));
}
if (controls.gamepadsAdded.length > 0)
{
var padData = controls.createSaveData(Gamepad(controls.gamepadsAdded[0]));
if (padData != null)
{
trace("saving pad data: " + haxe.Json.stringify(padData));
playerData.pad = padData;
}
}
FlxG.save.flush();
}
static public function init():Void
{
if (player1 == null)
{
player1 = new PlayerSettings(0);
++numPlayers;
}
FlxG.gamepads.deviceConnected.add(onGamepadAdded);
var numGamepads = FlxG.gamepads.numActiveGamepads;
for (i in 0...numGamepads)
{
var gamepad = FlxG.gamepads.getByID(i);
if (gamepad != null)
onGamepadAdded(gamepad);
}
// player1.controls.addDefaultGamepad(0);
// }
// if (numGamepads > 1)
// {
// if (player2 == null)
// {
// player2 = new PlayerSettings(1, None);
// ++numPlayers;
// }
// var gamepad = FlxG.gamepads.getByID(1);
// if (gamepad == null)
// throw 'Unexpected null gamepad. id:0';
// player2.controls.addDefaultGamepad(1);
// }
// DeviceManager.init();
}
static function onGamepadAdded(gamepad:FlxGamepad)
{
player1.addGamepad(gamepad);
}
/*
public function setKeyboardScheme(scheme)
{
controls.setKeyboardScheme(scheme);
}
/*
static public function addAvatar(avatar:Player):PlayerSettings
{
var settings:PlayerSettings;
if (player1 == null)
{
player1 = new PlayerSettings(0, Solo);
++numPlayers;
}
if (player1.avatar == null)
settings = player1;
else
{
if (player2 == null)
{
if (player1.controls.keyboardScheme.match(Duo(true)))
player2 = new PlayerSettings(1, Duo(false));
else
player2 = new PlayerSettings(1, None);
++numPlayers;
}
if (player2.avatar == null)
settings = player2;
else
throw throw 'Invalid number of players: ${numPlayers + 1}';
}
++numAvatars;
settings.avatar = avatar;
avatar.settings = settings;
splitCameras();
onAvatarAdd.dispatch(settings);
return settings;
}
static public function removeAvatar(avatar:Player):Void
{
var settings:PlayerSettings;
if (player1 != null && player1.avatar == avatar)
settings = player1;
else if (player2 != null && player2.avatar == avatar)
{
settings = player2;
if (player1.controls.keyboardScheme.match(Duo(_)))
player1.setKeyboardScheme(Solo);
}
else
throw "Cannot remove avatar that is not for a player";
settings.avatar = null;
while (settings.controls.gamepadsAdded.length > 0)
{
final id = settings.controls.gamepadsAdded.shift();
settings.controls.removeGamepad(id);
DeviceManager.releaseGamepad(FlxG.gamepads.getByID(id));
}
--numAvatars;
splitCameras();
onAvatarRemove.dispatch(avatar.settings);
}
*/
static public function init():Void
static public function addAvatar(avatar:Player):PlayerSettings
{
var settings:PlayerSettings;
if (player1 == null)
{
player1 = new PlayerSettings(0, Solo);
++numPlayers;
}
var numGamepads = FlxG.gamepads.numActiveGamepads;
if (numGamepads > 0)
{
var gamepad = FlxG.gamepads.getByID(0);
if (gamepad == null)
throw 'Unexpected null gamepad. id:0';
player1.controls.addDefaultGamepad(0);
}
if (numGamepads > 1)
if (player1.avatar == null)
settings = player1;
else
{
if (player2 == null)
{
player2 = new PlayerSettings(1, None);
if (player1.controls.keyboardScheme.match(Duo(true)))
player2 = new PlayerSettings(1, Duo(false));
else
player2 = new PlayerSettings(1, None);
++numPlayers;
}
var gamepad = FlxG.gamepads.getByID(1);
if (gamepad == null)
throw 'Unexpected null gamepad. id:0';
if (player2.avatar == null)
settings = player2;
else
throw throw 'Invalid number of players: ${numPlayers + 1}';
}
++numAvatars;
settings.avatar = avatar;
avatar.settings = settings;
player2.controls.addDefaultGamepad(1);
splitCameras();
onAvatarAdd.dispatch(settings);
return settings;
}
static public function removeAvatar(avatar:Player):Void
{
var settings:PlayerSettings;
if (player1 != null && player1.avatar == avatar)
settings = player1;
else if (player2 != null && player2.avatar == avatar)
{
settings = player2;
if (player1.controls.keyboardScheme.match(Duo(_)))
player1.setKeyboardScheme(Solo);
}
else
throw "Cannot remove avatar that is not for a player";
settings.avatar = null;
while (settings.controls.gamepadsAdded.length > 0)
{
final id = settings.controls.gamepadsAdded.shift();
settings.controls.removeGamepad(id);
DeviceManager.releaseGamepad(FlxG.gamepads.getByID(id));
}
// DeviceManager.init();
--numAvatars;
splitCameras();
onAvatarRemove.dispatch(avatar.settings);
}
*/
static public function reset()
{
player1 = null;

View File

@ -245,29 +245,29 @@ class StoryMenuState extends MusicBeatState
{
if (!selectedWeek)
{
if (controls.UP_P)
if (controls.UI_UP_P)
{
changeWeek(-1);
}
if (controls.DOWN_P)
if (controls.UI_DOWN_P)
{
changeWeek(1);
}
if (controls.RIGHT)
if (controls.UI_RIGHT)
rightArrow.animation.play('press')
else
rightArrow.animation.play('idle');
if (controls.LEFT)
if (controls.UI_LEFT)
leftArrow.animation.play('press');
else
leftArrow.animation.play('idle');
if (controls.RIGHT_P)
if (controls.UI_RIGHT_P)
changeDifficulty(1);
if (controls.LEFT_P)
if (controls.UI_LEFT_P)
changeDifficulty(-1);
}
@ -360,10 +360,6 @@ class StoryMenuState extends MusicBeatState
sprDifficulty.y = leftArrow.y - 15;
intendedScore = Highscore.getWeekScore(curWeek, curDifficulty);
#if !switch
intendedScore = Highscore.getWeekScore(curWeek, curDifficulty);
#end
FlxTween.tween(sprDifficulty, {y: leftArrow.y + 15, alpha: 1}, 0.07);
}
@ -439,8 +435,6 @@ class StoryMenuState extends MusicBeatState
txtTracklist.screenCenter(X);
txtTracklist.x -= FlxG.width * 0.35;
#if !switch
intendedScore = Highscore.getWeekScore(curWeek, curDifficulty);
#end
}
}

View File

@ -14,10 +14,10 @@ import flixel.tweens.FlxEase;
import flixel.tweens.FlxTween;
import flixel.util.FlxColor;
import flixel.util.FlxTimer;
import io.newgrounds.NG;
import lime.app.Application;
import openfl.Assets;
import shaderslmfao.ColorSwap;
import ui.PreferencesMenu;
using StringTools;
@ -54,25 +54,22 @@ class TitleState extends MusicBeatState
FlxG.sound.muteKeys = [ZERO];
PlayerSettings.init();
curWacky = FlxG.random.getObject(getIntroTextShit());
// DEBUG BULLSHIT
super.create();
NGio.noLogin(APIStuff.API);
#if ng
var ng:NGio = new NGio(APIStuff.API, APIStuff.EncKey);
trace('NEWGROUNDS LOL');
#end
PreferencesMenu.initPrefs();
FlxG.save.bind('funkin', 'ninjamuffin99');
PlayerSettings.init();
Highscore.load();
#if newgrounds
NGio.init();
#end
if (FlxG.save.data.weekUnlocked != null)
{
// FIX LATER!!!
@ -289,13 +286,11 @@ class TitleState extends MusicBeatState
if (pressedEnter && !transitioning && skippedIntro)
{
#if !switch
NGio.unlockMedal(60960);
// If it's Friday according to da clock
if (Date.now().getDay() == 5)
NGio.unlockMedal(61034);
#end
titleText.animation.play('press');
@ -305,26 +300,30 @@ class TitleState extends MusicBeatState
transitioning = true;
// FlxG.sound.music.stop();
new FlxTimer().start(2, function(tmr:FlxTimer)
#if newgrounds
if (!OutdatedSubState.leftState)
{
// Check if version is outdated
var version:String = "v" + Application.current.meta.get('version');
if (version.trim() != NGio.GAME_VER_NUMS.trim() && !OutdatedSubState.leftState)
NGio.checkVersion(function(version)
{
FlxG.switchState(new OutdatedSubState());
trace('OLD VERSION!');
trace('old ver');
trace(version.trim());
trace('cur ver');
trace(NGio.GAME_VER_NUMS.trim());
}
else
{
FlxG.switchState(new MainMenuState());
}
});
// Check if version is outdated
var localVersion:String = "v" + Application.current.meta.get('version');
var onlineVersion = version.split(" ")[0].trim();
if (version.trim() != onlineVersion)
{
trace('OLD VERSION!');
FlxG.switchState(new OutdatedSubState());
}
else
{
FlxG.switchState(new MainMenuState());
}
});
}
#else
FlxG.switchState(new MainMenuState());
#end
// FlxG.sound.play(Paths.music('titleShoot'), 0.7);
}
@ -333,12 +332,15 @@ class TitleState extends MusicBeatState
skipIntro();
}
if (controls.LEFT)
if (FlxG.keys.justPressed.SPACE)
swagShader.hasOutline = !swagShader.hasOutline;
if (controls.UI_LEFT)
{
swagShader.update(-elapsed * 0.1);
}
if (controls.RIGHT)
if (controls.UI_RIGHT)
{
swagShader.update(elapsed * 0.1);
}

View File

@ -9,6 +9,9 @@ class ColorSwap
public var colorToReplace(default, set):FlxColor;
public var newColor(default, set):FlxColor;
public var daTime(default, set):Float;
public var hasOutline(default, set):Bool = false;
public var hueShit:Float = 0;
public function new():Void
@ -16,6 +19,7 @@ class ColorSwap
shader = new ColorSwapShader();
shader.uTime.value = [0];
shader.money.value = [0];
shader.awesomeOutline.value = [hasOutline];
}
public function update(elapsed:Float):Void
@ -32,6 +36,12 @@ class ColorSwap
return color;
}
function set_hasOutline(lol:Bool):Bool
{
shader.awesomeOutline.value = [lol];
return lol;
}
function set_daTime(daTime:Float):Float
{
return daTime;
@ -52,6 +62,12 @@ class ColorSwapShader extends FlxShader
uniform float uTime;
uniform float money;
uniform bool awesomeOutline;
const float offset = 1.0 / 128.0;
vec3 normalizeColor(vec3 color)
{
@ -93,8 +109,46 @@ class ColorSwapShader extends FlxShader
// money += swagColor[0];
color = vec4(hsv2rgb(vec3(swagColor[0], swagColor[1], swagColor[2])), swagColor[3]);
if (awesomeOutline)
{
// Outline bullshit?
vec2 size = vec2(3, 3);
if (color.a <= 0.5) {
float w = size.x / openfl_TextureSize.x;
float h = size.y / openfl_TextureSize.y;
if (flixel_texture2D(bitmap, vec2(openfl_TextureCoordv.x + w, openfl_TextureCoordv.y)).a != 0.
|| flixel_texture2D(bitmap, vec2(openfl_TextureCoordv.x - w, openfl_TextureCoordv.y)).a != 0.
|| flixel_texture2D(bitmap, vec2(openfl_TextureCoordv.x, openfl_TextureCoordv.y + h)).a != 0.
|| flixel_texture2D(bitmap, vec2(openfl_TextureCoordv.x, openfl_TextureCoordv.y - h)).a != 0.)
color = vec4(1.0, 1.0, 1.0, 1.0);
}
}
gl_FragColor = color;
/*
if (color.a > 0.5)
gl_FragColor = color;
else
{
float a = flixel_texture2D(bitmap, vec2(openfl_TextureCoordv + offset, openfl_TextureCoordv.y)).a +
flixel_texture2D(bitmap, vec2(openfl_TextureCoordv, openfl_TextureCoordv.y - offset)).a +
flixel_texture2D(bitmap, vec2(openfl_TextureCoordv - offset, openfl_TextureCoordv.y)).a +
flixel_texture2D(bitmap, vec2(openfl_TextureCoordv, openfl_TextureCoordv.y + offset)).a;
if (color.a < 1.0 && a > 0.0)
gl_FragColor = vec4(0.0, 0.0, 0.0, 0.8);
else
gl_FragColor = color;
} */
}
')

View File

@ -0,0 +1,81 @@
package ui;
import ui.MenuList;
import flixel.graphics.frames.FlxAtlasFrames;
typedef AtlasAsset = flixel.util.typeLimit.OneOfTwo<String, FlxAtlasFrames>;
class AtlasMenuList extends MenuTypedList<AtlasMenuItem>
{
public var atlas:FlxAtlasFrames;
public function new (atlas, navControls:NavControls = Vertical, ?wrapMode)
{
super(navControls, wrapMode);
if (Std.is(atlas, String))
this.atlas = Paths.getSparrowAtlas(cast atlas);
else
this.atlas = cast atlas;
}
public function createItem(x = 0.0, y = 0.0, name, callback, fireInstantly = false)
{
var item = new AtlasMenuItem(x, y, name, atlas, callback);
item.fireInstantly = fireInstantly;
return addItem(name, item);
}
override function destroy()
{
super.destroy();
atlas = null;
}
}
class AtlasMenuItem extends MenuItem
{
var atlas:FlxAtlasFrames;
public function new (x = 0.0, y = 0.0, name:String, atlas:FlxAtlasFrames, callback)
{
this.atlas = atlas;
super(x, y, name, callback);
}
override function setData(name:String, ?callback:Void->Void)
{
frames = atlas;
animation.addByPrefix('idle', '$name idle', 24);
animation.addByPrefix('selected', '$name selected', 24);
super.setData(name, callback);
}
function changeAnim(animName:String)
{
animation.play(animName);
updateHitbox();
}
override function idle()
{
changeAnim('idle');
}
override function select()
{
changeAnim('selected');
}
override function get_selected()
{
return animation.curAnim != null && animation.curAnim.name == "selected";
}
override function destroy()
{
super.destroy();
atlas = null;
}
}

262
source/ui/AtlasText.hx Normal file
View File

@ -0,0 +1,262 @@
package ui;
import flixel.FlxSprite;
import flixel.group.FlxSpriteGroup;
import flixel.graphics.frames.FlxAtlasFrames;
import flixel.util.FlxStringUtil;
@:forward
abstract BoldText(AtlasText) from AtlasText to AtlasText
{
inline public function new (x = 0.0, y = 0.0, text:String)
{
this = new AtlasText(x, y, text, Bold);
}
}
/**
* Alphabet.hx has a ton of bugs and does a bunch of stuff I don't need, fuck that class
*/
class AtlasText extends FlxTypedSpriteGroup<AtlasChar>
{
static var fonts = new Map<AtlasFont, AtlasFontData>();
static var casesAllowed = new Map<AtlasFont, Case>();
public var text(default, set):String = "";
var font:AtlasFontData;
public var atlas(get, never):FlxAtlasFrames;
inline function get_atlas() return font.atlas;
public var caseAllowed(get, never):Case;
inline function get_caseAllowed() return font.caseAllowed;
public var maxHeight(get, never):Float;
inline function get_maxHeight() return font.maxHeight;
public function new (x = 0.0, y = 0.0, text:String, fontName:AtlasFont = Default)
{
if (!fonts.exists(fontName))
fonts[fontName] = new AtlasFontData(fontName);
font = fonts[fontName];
super(x, y);
this.text = text;
}
function set_text(value:String)
{
if (value == null)
value = "";
var caseValue = restrictCase(value);
var caseText = restrictCase(this.text);
this.text = value;
if (caseText == caseValue)
return value; // cancel redraw
if (caseValue.indexOf(caseText) == 0)
{
// new text is just old text with additions at the end, append the difference
appendTextCased(caseValue.substr(caseText.length));
return this.text;
}
value = caseValue;
group.kill();
if (value == "")
return this.text;
appendTextCased(caseValue);
return this.text;
}
/**
* Adds new characters, without needing to redraw the previous characters
* @param text The text to add.
* @throws String if `text` is null.
*/
public function appendText(text:String)
{
if (text == null)
throw "cannot append null";
if (text == "")
return;
this.text = this.text + text;
}
/**
* Converts all characters to fit the font's `allowedCase`.
* @param text
*/
function restrictCase(text:String)
{
return switch(caseAllowed)
{
case Both: text;
case Upper: text.toUpperCase();
case Lower: text.toLowerCase();
}
}
/**
* Adds new text on top of the existing text. Helper for other methods; DOESN'T CHANGE `this.text`.
* @param text The text to add, assumed to match the font's `caseAllowed`.
*/
function appendTextCased(text:String)
{
var charCount = group.countLiving();
var xPos:Float = 0;
var yPos:Float = 0;
// `countLiving` returns -1 if group is empty
if (charCount == -1)
charCount = 0;
else if (charCount > 0)
{
var lastChar = group.members[charCount - 1];
xPos = lastChar.x + lastChar.width - x;
yPos = lastChar.y + lastChar.height - maxHeight - y;
}
var splitValues = text.split("");
for (i in 0...splitValues.length)
{
switch(splitValues[i])
{
case " ":
{
xPos += 40;
}
case "\n":
{
xPos = 0;
yPos += maxHeight;
}
case char:
{
var charSprite:AtlasChar;
if (group.members.length <= charCount)
charSprite = new AtlasChar(atlas, char);
else
{
charSprite = group.members[charCount];
charSprite.revive();
charSprite.char = char;
charSprite.alpha = 1;//gets multiplied when added
}
charSprite.x = xPos;
charSprite.y = yPos + maxHeight - charSprite.height;
add(charSprite);
xPos += charSprite.width;
charCount++;
}
}
}
}
override function toString()
{
return "InputItem, " + FlxStringUtil.getDebugString(
[ LabelValuePair.weak("x", x)
, LabelValuePair.weak("y", y)
, LabelValuePair.weak("text", text)
]
);
}
}
class AtlasChar extends FlxSprite
{
public var char(default, set):String;
public function new(x = 0.0, y = 0.0, atlas:FlxAtlasFrames, char:String)
{
super(x, y);
frames = atlas;
this.char = char;
antialiasing = true;
}
function set_char(value:String)
{
if (this.char != value)
{
var prefix = getAnimPrefix(value);
animation.addByPrefix("anim", prefix, 24);
animation.play("anim");
updateHitbox();
}
return this.char = value;
}
function getAnimPrefix(char:String)
{
return switch (char)
{
case '-': '-dash-';
case '.': '-period-';
case ",": '-comma-';
case "'": '-apostraphie-';
case "?": '-question mark-';
case "!": '-exclamation point-';
case "\\": '-back slash-';
case "/": '-forward slash-';
case "*": '-multiply x-';
case "": '-start quote-';
case "": '-end quote-';
default: char;
}
}
}
private class AtlasFontData
{
static public var upperChar = ~/^[A-Z]\d+$/;
static public var lowerChar = ~/^[a-z]\d+$/;
public var atlas:FlxAtlasFrames;
public var maxHeight:Float = 0.0;
public var caseAllowed:Case = Both;
public function new (name:AtlasFont)
{
atlas = Paths.getSparrowAtlas("fonts/" + name.getName().toLowerCase());
atlas.parent.destroyOnNoUse = false;
atlas.parent.persist = true;
var containsUpper = false;
var containsLower = false;
for (frame in atlas.frames)
{
maxHeight = Math.max(maxHeight, frame.frame.height);
if (!containsUpper)
containsUpper = upperChar.match(frame.name);
if (!containsLower)
containsLower = lowerChar.match(frame.name);
}
if (containsUpper != containsLower)
caseAllowed = containsUpper ? Upper : Lower;
}
}
enum Case
{
Both;
Upper;
Lower;
}
enum AtlasFont
{
Default;
Bold;
}

View File

@ -1,10 +1,12 @@
package;
package ui;
import flixel.FlxG;
import flixel.addons.effects.chainable.FlxEffectSprite;
import flixel.addons.effects.chainable.FlxOutlineEffect;
import flixel.group.FlxGroup.FlxTypedGroup;
import shaderslmfao.ColorSwap;
import flixel.util.FlxColor;
class ColorpickSubstate extends MusicBeatSubstate
class ColorsMenu extends ui.OptionsState.Page
{
var curSelected:Int = 0;
@ -24,21 +26,27 @@ class ColorpickSubstate extends MusicBeatSubstate
note.x = (100 * i) + i;
note.screenCenter(Y);
var _effectSpr:FlxEffectSprite = new FlxEffectSprite(note, [new FlxOutlineEffect(FlxOutlineMode.FAST, FlxColor.WHITE, 4, 1)]);
add(_effectSpr);
_effectSpr.y = 0;
_effectSpr.x = i * 130;
_effectSpr.antialiasing = true;
_effectSpr.scale.x = _effectSpr.scale.y = 0.7;
// _effectSpr.setGraphicSize();
_effectSpr.height = note.height;
_effectSpr.width = note.width;
// _effectSpr.updateHitbox();
grpNotes.add(note);
}
}
override function update(elapsed:Float)
{
if (controls.BACK)
{
FlxG.state.closeSubState();
FlxG.state.openSubState(new OptionsSubState());
}
if (controls.RIGHT_P)
if (controls.UI_RIGHT_P)
curSelected += 1;
if (controls.LEFT_P)
if (controls.UI_LEFT_P)
curSelected -= 1;
if (curSelected < 0)
@ -46,13 +54,13 @@ class ColorpickSubstate extends MusicBeatSubstate
if (curSelected >= grpNotes.members.length)
curSelected = 0;
if (controls.UP)
if (controls.UI_UP)
{
grpNotes.members[curSelected].colorSwap.update(elapsed * 0.3);
Note.arrowColors[curSelected] += elapsed * 0.3;
}
if (controls.DOWN)
if (controls.UI_DOWN)
{
grpNotes.members[curSelected].colorSwap.update(-elapsed * 0.3);
Note.arrowColors[curSelected] += -elapsed * 0.3;

356
source/ui/ControlsMenu.hx Normal file
View File

@ -0,0 +1,356 @@
package ui;
import flixel.input.actions.FlxActionInput;
import flixel.input.gamepad.FlxGamepadInputID;
import flixel.FlxG;
import flixel.FlxCamera;
import flixel.FlxObject;
import flixel.FlxSprite;
import flixel.group.FlxGroup;
import flixel.input.keyboard.FlxKey;
import Controls;
import ui.AtlasText;
import ui.MenuList;
import ui.TextMenuList;
class ControlsMenu extends ui.OptionsState.Page
{
inline static public var COLUMNS = 2;
static var controlList = Control.createAll();
/*
* Defines groups of controls that cannot share inputs, like left and right. Say, if ACCEPT is Z, Back is X,
* if the player sets Back to Z it also set ACCEPT to X. This prevents the player from setting the controls in
* a way the prevents them from changing more controls or exiting the menu.
*/
static var controlGroups:Array<Array<Control>> =
[ [ NOTE_UP, NOTE_DOWN, NOTE_LEFT, NOTE_RIGHT ]
, [ UI_UP, UI_DOWN, UI_LEFT, UI_RIGHT, ACCEPT, BACK ]
];
var itemGroups:Array<Array<InputItem>> = [for (i in 0...controlGroups.length) []];
var controlGrid:MenuTypedList<InputItem>;
var deviceList:TextMenuList;
var menuCamera:FlxCamera;
var prompt:Prompt;
var camFollow:FlxObject;
var labels:FlxTypedGroup<AtlasText>;
var currentDevice:Device = Keys;
var deviceListSelected = false;
public function new()
{
super();
menuCamera = new FlxCamera();
FlxG.cameras.add(menuCamera, false);
menuCamera.bgColor = 0x0;
camera = menuCamera;
labels = new FlxTypedGroup<AtlasText>();
var headers = new FlxTypedGroup<AtlasText>();
controlGrid = new MenuTypedList(Columns(COLUMNS), Vertical);
add(labels);
add(headers);
add(controlGrid);
if (FlxG.gamepads.numActiveGamepads > 0)
{
var devicesBg = new FlxSprite();
devicesBg.makeGraphic(FlxG.width, 100, 0xFFfafd6d);
add(devicesBg);
deviceList = new TextMenuList(Horizontal, None);
add(deviceList);
deviceListSelected = true;
var item;
item = deviceList.createItem("Keyboard", Bold, selectDevice.bind(Keys));
item.x = FlxG.width / 2 - item.width - 30;
item.y = (devicesBg.height - item.height) / 2;
item = deviceList.createItem("Gamepad", Bold, selectDevice.bind(Gamepad(FlxG.gamepads.firstActive.id)));
item.x = FlxG.width / 2 + 30;
item.y = (devicesBg.height - item.height) / 2;
}
// FlxG.debugger.drawDebug = true;
var y = deviceList == null ? 30 : 120;
var spacer = 70;
var currentHeader:String = null;
// list order is determined by enum order
for (i in 0...controlList.length)
{
var control = controlList[i];
var name = control.getName();
if (currentHeader != "UI_" && name.indexOf("UI_") == 0)
{
currentHeader = "UI_";
headers.add(new BoldText(0, y, "UI")).screenCenter(X);
y += spacer;
}
else if (currentHeader != "NOTE_" && name.indexOf("NOTE_") == 0)
{
currentHeader = "NOTE_";
headers.add(new BoldText(0, y, "NOTES")).screenCenter(X);
y += spacer;
}
if (currentHeader != null && name.indexOf(currentHeader) == 0)
name = name.substr(currentHeader.length);
var label = labels.add(new BoldText(150, y, name));
label.alpha = 0.6;
for (i in 0...COLUMNS)
createItem(label.x + 400 + i * 300, y, control, i);
y += spacer;
}
camFollow = new FlxObject(FlxG.width / 2, 0, 70, 70);
if (deviceList != null)
{
camFollow.y = deviceList.selectedItem.y;
controlGrid.selectedItem.idle();
controlGrid.enabled = false;
}
else
camFollow.y = controlGrid.selectedItem.y;
menuCamera.follow(camFollow, null, 0.06);
var margin = 100;
menuCamera.deadzone.set(0, margin, menuCamera.width, menuCamera.height - margin * 2);
menuCamera.minScrollY = 0;
controlGrid.onChange.add(function (selected)
{
camFollow.y = selected.y;
labels.forEach((label)->label.alpha = 0.6);
labels.members[Std.int(controlGrid.selectedIndex / COLUMNS)].alpha = 1.0;
});
prompt = new Prompt("\nPress any key to rebind\n\n\n\n Escape to cancel", None);
prompt.create();
prompt.createBgFromMargin(100, 0xFFfafd6d);
prompt.back.scrollFactor.set(0, 0);
prompt.exists = false;
add(prompt);
}
function createItem(x = 0.0, y = 0.0, control:Control, index:Int)
{
var item = new InputItem(x, y, currentDevice, control, index, onSelect);
for (i in 0...controlGroups.length)
{
if (controlGroups[i].contains(control))
itemGroups[i].push(item);
}
return controlGrid.addItem(item.name, item);
}
function onSelect():Void
{
controlGrid.enabled = false;
canExit = false;
prompt.exists = true;
}
function goToDeviceList()
{
controlGrid.selectedItem.idle();
labels.members[Std.int(controlGrid.selectedIndex / COLUMNS)].alpha = 0.6;
controlGrid.enabled = false;
deviceList.enabled = true;
canExit = true;
camFollow.y = deviceList.selectedItem.y;
deviceListSelected = true;
}
function selectDevice(device:Device)
{
currentDevice = device;
for (item in controlGrid.members)
item.updateDevice(currentDevice);
var inputName = device == Keys ? "key" : "button";
var cancel = device == Keys ? "Escape" : "Back";
//todo: alignment
if (device == Keys)
prompt.setText('\nPress any key to rebind\n\n\n\n $cancel to cancel');
else
prompt.setText('\nPress any button\n to rebind\n\n\n $cancel to cancel');
controlGrid.selectedItem.select();
labels.members[Std.int(controlGrid.selectedIndex / COLUMNS)].alpha = 1.0;
controlGrid.enabled = true;
deviceList.enabled = false;
deviceListSelected = false;
canExit = false;
}
override function update(elapsed:Float)
{
super.update(elapsed);
var controls = PlayerSettings.player1.controls;
if (controlGrid.enabled && deviceList != null && deviceListSelected == false && controls.BACK)
goToDeviceList();
if (prompt.exists)
{
switch (currentDevice)
{
case Keys:
{
// check released otherwise bugs can happen when you change the BACK key
var key = FlxG.keys.firstJustReleased();
if (key != NONE)
{
if (key != ESCAPE)
onInputSelect(key);
closePrompt();
}
}
case Gamepad(id):
{
var button = FlxG.gamepads.getByID(id).firstJustReleasedID();
if (button != NONE)
{
if (button != BACK)
onInputSelect(button);
closePrompt();
}
}
}
}
}
function onInputSelect(input:Int)
{
var item = controlGrid.selectedItem;
// check if that key is already set for this
var column0 = Math.floor(controlGrid.selectedIndex / 2) * 2;
for (i in 0...COLUMNS)
{
if (controlGrid.members[column0 + i].input == input)
return;
}
// Check if items in the same group already have the new input
for (group in itemGroups)
{
if (group.contains(item))
{
for (otherItem in group)
{
if (otherItem != item && otherItem.input == input)
{
// replace that input with this items old input.
PlayerSettings.player1.controls.replaceBinding(otherItem.control, currentDevice, item.input, otherItem.input);
// Don't use resetItem() since items share names/labels
otherItem.input = item.input;
otherItem.label.text = item.label.text;
}
}
}
}
PlayerSettings.player1.controls.replaceBinding(item.control, currentDevice, input, item.input);
// Don't use resetItem() since items share names/labels
item.input = input;
item.label.text = item.getLabel(input);
PlayerSettings.player1.saveControls();
}
function closePrompt()
{
prompt.exists = false;
controlGrid.enabled = true;
if (deviceList == null)
canExit = true;
}
override function destroy()
{
super.destroy();
itemGroups = null;
if (FlxG.cameras.list.contains(menuCamera))
FlxG.cameras.remove(menuCamera);
}
override function set_enabled(value:Bool)
{
if (value == false)
{
controlGrid.enabled = false;
if (deviceList != null)
deviceList.enabled = false;
}
else
{
controlGrid.enabled = !deviceListSelected;
if (deviceList != null)
deviceList.enabled = deviceListSelected;
}
return super.set_enabled(value);
}
}
class InputItem extends TextMenuItem
{
public var device(default, null):Device = Keys;
public var control:Control;
public var input:Int = -1;
public var index:Int = -1;
public function new (x = 0.0, y = 0.0, device, control, index, ?callback)
{
this.device = device;
this.control = control;
this.index = index;
this.input = getInput();
super(x, y, getLabel(input), Default, callback);
}
public function updateDevice(device:Device)
{
if (this.device != device)
{
this.device = device;
input = getInput();
label.text = getLabel(input);
}
}
function getInput()
{
var list = PlayerSettings.player1.controls.getInputsFor(control, device);
if (list.length > index)
{
if (list[index] != FlxKey.ESCAPE || list[index] != FlxGamepadInputID.BACK)
return list[index];
if (list.length > ControlsMenu.COLUMNS)
// Escape isn't mappable, show a third option, instead.
return list[ControlsMenu.COLUMNS];
}
return -1;
}
public function getLabel(input:Int)
{
return input == -1 ? "---" : InputFormatter.format(input, device);
}
}

366
source/ui/MenuList.hx Normal file
View File

@ -0,0 +1,366 @@
package ui;
import flixel.math.FlxPoint;
import flixel.FlxG;
import flixel.FlxSprite;
import flixel.effects.FlxFlicker;
import flixel.group.FlxGroup;
import flixel.util.FlxSignal;
class MenuTypedList<T:MenuItem> extends FlxTypedGroup<T>
{
public var selectedIndex(default, null) = 0;
public var selectedItem(get, never):T;
/** Called when a new item is highlighted */
public var onChange(default, null) = new FlxTypedSignal<T->Void>();
/** Called when an item is accepted */
public var onAcceptPress(default, null) = new FlxTypedSignal<T->Void>();
/** The navigation control scheme to use */
public var navControls:NavControls;
/** Set to false to disable nav control */
public var enabled:Bool = true;
/** */
public var wrapMode:WrapMode = Both;
var byName = new Map<String, T>();
/** Set to true, internally to disable controls, without affecting vars like `enabled` */
var busy:Bool = false;
public function new (navControls:NavControls = Vertical, ?wrapMode:WrapMode)
{
this.navControls = navControls;
if (wrapMode != null)
this.wrapMode = wrapMode;
else
this.wrapMode = switch (navControls)
{
case Horizontal: Horizontal;
case Vertical: Vertical;
default: Both;
}
super();
}
public function addItem(name:String, item:T):T
{
if (length == selectedIndex)
item.select();
byName[name] = item;
return add(item);
}
public function resetItem(oldName:String, newName:String, ?callback:Void->Void):T
{
if (!byName.exists(oldName))
throw "No item named:" + oldName;
var item = byName[oldName];
byName.remove(oldName);
byName[newName] = item;
item.setItem(newName, callback);
return item;
}
override function update(elapsed:Float)
{
super.update(elapsed);
if (enabled && !busy)
updateControls();
}
inline function updateControls()
{
var controls = PlayerSettings.player1.controls;
var wrapX = wrapMode.match(Horizontal | Both);
var wrapY = wrapMode.match(Vertical | Both);
var newIndex = switch(navControls)
{
case Vertical : navList(controls.UI_UP_P , controls.UI_DOWN_P, wrapY);
case Horizontal : navList(controls.UI_LEFT_P, controls.UI_RIGHT_P, wrapX);
case Both : navList(controls.UI_LEFT_P || controls.UI_UP_P, controls.UI_RIGHT_P || controls.UI_DOWN_P, !wrapMode.match(None));
case Columns(num): navGrid(num, controls.UI_LEFT_P, controls.UI_RIGHT_P, wrapX, controls.UI_UP_P , controls.UI_DOWN_P , wrapY);
case Rows (num): navGrid(num, controls.UI_UP_P , controls.UI_DOWN_P , wrapY, controls.UI_LEFT_P, controls.UI_RIGHT_P, wrapX);
}
if (newIndex != selectedIndex)
{
FlxG.sound.play(Paths.sound('scrollMenu'));
selectItem(newIndex);
}
//Todo: bypass popup blocker on firefox
if (controls.ACCEPT)
accept();
}
function navAxis(index:Int, size:Int, prev:Bool, next:Bool, allowWrap:Bool):Int
{
if (prev == next)
return index;
if (prev)
{
if (index > 0)
index--;
else if (allowWrap)
index = size - 1;
}
else
{
if (index < size - 1)
index++;
else if (allowWrap)
index = 0;
}
return index;
}
/**
* Controls navigation on a linear list of items such as Vertical.
* @param prev
* @param next
* @param allowWrap
*/
inline function navList(prev:Bool, next:Bool, allowWrap:Bool)
{
return navAxis(selectedIndex, length, prev, next, allowWrap);
}
/**
* Controls navigation on a grid
* @param latSize The size of the fixed axis of the grid, or the "lateral axis"
* @param latPrev Whether the 'prev' key is pressed along the fixed-lengthed axis. eg: "left" in Column mode
* @param latNext Whether the 'next' key is pressed along the fixed-lengthed axis. eg: "right" in Column mode
* @param prev Whether the 'prev' key is pressed along the variable-lengthed axis. eg: "up" in Column mode
* @param next Whether the 'next' key is pressed along the variable-lengthed axis. eg: "down" in Column mode
* @param allowWrap unused
*/
function navGrid(latSize:Int, latPrev:Bool, latNext:Bool, latAllowWrap:Bool, prev:Bool, next:Bool, allowWrap:Bool):Int
{
// The grid lenth along the variable-length axis
var size = Math.ceil(length / latSize);
// The selected position along the variable-length axis
var index = Math.floor(selectedIndex / latSize);
// The selected position along the fixed axis
var latIndex = selectedIndex % latSize;
latIndex = navAxis(latIndex, latSize, latPrev, latNext, latAllowWrap);
index = navAxis(index, size, prev, next, allowWrap);
return Std.int(Math.min(length - 1, index * latSize + latIndex));
}
public function accept()
{
var selected = members[selectedIndex];
onAcceptPress.dispatch(selected);
if (selected.fireInstantly)
selected.callback();
else
{
busy = true;
FlxG.sound.play(Paths.sound('confirmMenu'));
FlxFlicker.flicker(selected, 1, 0.06, true, false, function(_)
{
busy = false;
selected.callback();
});
}
}
public function selectItem(index:Int)
{
members[selectedIndex].idle();
selectedIndex = index;
var selected = members[selectedIndex];
selected.select();
onChange.dispatch(selected);
}
public function has(name:String)
{
return byName.exists(name);
}
public function getItem(name:String)
{
return byName[name];
}
override function destroy()
{
super.destroy();
byName.clear();
onChange.removeAll();
onAcceptPress.removeAll();
}
inline function get_selectedItem():T
{
return members[selectedIndex];
}
}
class MenuItem extends FlxSprite
{
public var callback:Void->Void;
public var name:String;
/**
* Set to true for things like opening URLs otherwise, it may it get blocked.
*/
public var fireInstantly = false;
public var selected(get, never):Bool;
function get_selected() return alpha == 1.0;
public function new (x = 0.0, y = 0.0, name:String, callback)
{
super(x, y);
antialiasing = true;
setData(name, callback);
idle();
}
function setData(name:String, ?callback:Void->Void)
{
this.name = name;
if (callback != null)
this.callback = callback;
}
/**
* Calls setData and resets/redraws the state of the item
* @param name the label.
* @param callback Unchanged if null.
*/
public function setItem(name:String, ?callback:Void->Void)
{
setData(name, callback);
if (selected)
select();
else
idle();
}
public function idle()
{
alpha = 0.6;
}
public function select()
{
alpha = 1.0;
}
}
class MenuTypedItem<T:FlxSprite> extends MenuItem
{
public var label(default, set):T;
public function new (x = 0.0, y = 0.0, label:T, name:String, callback)
{
super(x, y, name, callback);
// set label after super otherwise setters fuck up
this.label = label;
}
/**
* Use this when you only want to show the label
*/
function setEmptyBackground()
{
var oldWidth = width;
var oldHeight = height;
makeGraphic(1, 1, 0x0);
width = oldWidth;
height = oldHeight;
}
function set_label(value:T)
{
if (value != null)
{
value.x = x;
value.y = y;
value.alpha = alpha;
}
return this.label = value;
}
override function update(elapsed:Float)
{
super.update(elapsed);
if (label != null)
label.update(elapsed);
}
override function draw()
{
super.draw();
if (label != null)
{
label.cameras = cameras;
label.scrollFactor.copyFrom(scrollFactor);
label.draw();
}
}
override function set_alpha(value:Float):Float
{
super.set_alpha(value);
if (label != null)
label.alpha = alpha;
return alpha;
}
override function set_x(value:Float):Float
{
super.set_x(value);
if (label != null)
label.x = x;
return x;
}
override function set_y(Value:Float):Float
{
super.set_y(Value);
if (label != null)
label.y = y;
return y;
}
}
enum NavControls
{
Horizontal;
Vertical;
Both;
Columns(num:Int);
Rows(num:Int);
}
enum WrapMode
{
Horizontal;
Vertical;
Both;
None;
}

View File

@ -1,16 +1,15 @@
package;
package ui;
import Controls.Control;
import flixel.FlxG;
import flixel.group.FlxGroup.FlxTypedGroup;
import flixel.text.FlxText;
import flixel.util.FlxColor;
#if cpp
import polymod.Polymod;
#if desktop
import sys.FileSystem;
#end
class ModdingSubstate extends MusicBeatSubstate
class ModMenu extends ui.OptionsState.Page
{
var grpMods:FlxTypedGroup<ModMenuItem>;
var enabledMods:Array<String> = [];
@ -35,9 +34,9 @@ class ModdingSubstate extends MusicBeatSubstate
selections();
if (controls.UP_P)
if (controls.UI_UP_P)
selections(-1);
if (controls.DOWN_P)
if (controls.UI_DOWN_P)
selections(1);
if (FlxG.keys.justPressed.SPACE)

107
source/ui/NgPrompt.hx Normal file
View File

@ -0,0 +1,107 @@
package ui;
import NGio;
import ui.Prompt;
class NgPrompt extends Prompt
{
public function new (text:String, style:ButtonStyle = Yes_No)
{
super(text, style);
}
static public function showLogin()
{
return showLoginPrompt(true);
}
static public function showSavedSessionFailed()
{
return showLoginPrompt(false);
}
static function showLoginPrompt(fromUi:Bool)
{
var prompt = new NgPrompt("Talking to server...", None);
prompt.openCallback = NGio.login.bind
(
function popupLauncher(openPassportUrl)
{
var choiceMsg = fromUi
? #if web "Log in to Newgrounds?" #else null #end // User-input needed to allow popups
: "Your session has expired.\n Please login again.";
if (choiceMsg != null)
{
prompt.setText(choiceMsg);
prompt.setButtons(Yes_No);
#if web
prompt.buttons.getItem("yes").fireInstantly = true;
#end
prompt.onYes = function()
{
prompt.setText("Connecting..." #if web + "\n(check your popup blocker)" #end);
prompt.setButtons(None);
openPassportUrl();
};
prompt.onNo = function()
{
prompt.close();
prompt = null;
NGio.cancelLogin();
};
}
else
{
prompt.setText("Connecting...");
openPassportUrl();
}
},
function onLoginComplete(result:ConnectionResult)
{
switch (result)
{
case Success:
{
prompt.setText("Login Successful");
prompt.setButtons(Ok);
prompt.onYes = prompt.close;
}
case Fail(msg):
{
trace("Login Error:" + msg);
prompt.setText("Login failed");
prompt.setButtons(Ok);
prompt.onYes = prompt.close;
}
case Cancelled:
{
if (prompt != null)
{
prompt.setText("Login cancelled by user");
prompt.setButtons(Ok);
prompt.onYes = prompt.close;
}
else
trace("Login cancelled via prompt");
}
}
}
);
return prompt;
}
static public function showLogout()
{
var user = io.newgrounds.NG.core.user.name;
var prompt = new NgPrompt('Log out of $user?', Yes_No);
prompt.onYes = function()
{
NGio.logout();
prompt.close();
};
prompt.onNo = prompt.close;
return prompt;
}
}

283
source/ui/OptionsState.hx Normal file
View File

@ -0,0 +1,283 @@
package ui;
import flixel.FlxG;
import flixel.FlxSprite;
import flixel.FlxSubState;
import flixel.addons.transition.FlxTransitionableState;
import flixel.group.FlxGroup;
import flixel.util.FlxSignal;
// typedef OptionsState = OptionsMenu_old;
// class OptionsState_new extends MusicBeatState
class OptionsState extends MusicBeatState
{
var pages = new Map<PageName, Page>();
var currentName:PageName = Options;
var currentPage(get, never):Page;
inline function get_currentPage()
return pages[currentName];
override function create()
{
var menuBG = new FlxSprite().loadGraphic(Paths.image('menuDesat'));
menuBG.color = 0xFFea71fd;
menuBG.setGraphicSize(Std.int(menuBG.width * 1.1));
menuBG.updateHitbox();
menuBG.screenCenter();
menuBG.scrollFactor.set(0, 0);
add(menuBG);
var options = addPage(Options, new OptionsMenu(false));
var preferences = addPage(Preferences, new PreferencesMenu());
var controls = addPage(Controls, new ControlsMenu());
var colors = addPage(Colors, new ColorsMenu());
#if cpp
var mods = addPage(Mods, new ModMenu());
#end
if (options.hasMultipleOptions())
{
options.onExit.add(exitToMainMenu);
controls.onExit.add(switchPage.bind(Options));
colors.onExit.add(switchPage.bind(Options));
preferences.onExit.add(switchPage.bind(Options));
#if cpp
mods.onExit.add(switchPage.bind(Options));
#end
}
else
{
// No need to show Options page
controls.onExit.add(exitToMainMenu);
setPage(Controls);
}
// disable for intro transition
currentPage.enabled = false;
super.create();
}
function addPage<T:Page>(name:PageName, page:T)
{
page.onSwitch.add(switchPage);
pages[name] = page;
add(page);
page.exists = currentName == name;
return page;
}
function setPage(name:PageName)
{
if (pages.exists(currentName))
currentPage.exists = false;
currentName = name;
if (pages.exists(currentName))
currentPage.exists = true;
}
override function finishTransIn()
{
super.finishTransIn();
currentPage.enabled = true;
}
function switchPage(name:PageName)
{
// Todo animate?
setPage(name);
}
function exitToMainMenu()
{
currentPage.enabled = false;
// Todo animate?
FlxG.switchState(new MainMenuState());
}
}
class Page extends FlxGroup
{
public var onSwitch(default, null) = new FlxTypedSignal<PageName->Void>();
public var onExit(default, null) = new FlxSignal();
public var enabled(default, set) = true;
public var canExit = true;
var controls(get, never):Controls;
inline function get_controls()
return PlayerSettings.player1.controls;
var subState:FlxSubState;
inline function switchPage(name:PageName)
{
onSwitch.dispatch(name);
}
inline function exit()
{
onExit.dispatch();
}
override function update(elapsed:Float)
{
super.update(elapsed);
if (enabled)
updateEnabled(elapsed);
}
function updateEnabled(elapsed:Float)
{
if (canExit && controls.BACK)
exit();
}
function set_enabled(value:Bool)
{
return this.enabled = value;
}
function openPrompt(prompt:Prompt, onClose:Void->Void)
{
enabled = false;
prompt.closeCallback = function()
{
enabled = true;
if (onClose != null)
onClose();
}
FlxG.state.openSubState(prompt);
}
override function destroy()
{
super.destroy();
onSwitch.removeAll();
}
}
class OptionsMenu extends Page
{
var items:TextMenuList;
public function new(showDonate:Bool)
{
super();
add(items = new TextMenuList());
createItem('preferences', function() switchPage(Preferences));
createItem("controls", function() switchPage(Controls));
createItem('colors', function() switchPage(Colors));
#if cpp
createItem('mods', function() switchPage(Mods));
#end
#if CAN_OPEN_LINKS
if (showDonate)
{
var hasPopupBlocker = #if web true #else false #end;
createItem('donate', selectDonate, hasPopupBlocker);
}
#end
#if newgrounds
if (NGio.isLoggedIn)
createItem("logout", selectLogout);
else
createItem("login", selectLogin);
#end
createItem("exit", exit);
}
function createItem(name:String, callback:Void->Void, fireInstantly = false)
{
var item = items.createItem(0, 100 + items.length * 100, name, Bold, callback);
item.fireInstantly = fireInstantly;
item.screenCenter(X);
return item;
}
override function set_enabled(value:Bool)
{
items.enabled = value;
return super.set_enabled(value);
}
/**
* True if this page has multiple options, ecluding the exit option.
* If false, there's no reason to ever show this page.
*/
public function hasMultipleOptions():Bool
{
return items.length > 2;
}
#if CAN_OPEN_LINKS
function selectDonate()
{
#if linux
Sys.command('/usr/bin/xdg-open', ["https://ninja-muffin24.itch.io/funkin", "&"]);
#else
FlxG.openURL('https://ninja-muffin24.itch.io/funkin');
#end
}
#end
#if newgrounds
function selectLogin()
{
openNgPrompt(NgPrompt.showLogin());
}
function selectLogout()
{
openNgPrompt(NgPrompt.showLogout());
}
/**
* Calls openPrompt and redraws the login/logout button
* @param prompt
* @param onClose
*/
public function openNgPrompt(prompt:Prompt, ?onClose:Void->Void)
{
var onPromptClose = checkLoginStatus;
if (onClose != null)
{
onPromptClose = function()
{
checkLoginStatus();
onClose();
}
}
openPrompt(prompt, onPromptClose);
}
function checkLoginStatus()
{
var prevLoggedIn = items.has("logout");
if (prevLoggedIn && !NGio.isLoggedIn)
items.resetItem("login", "logout", selectLogout);
else if (!prevLoggedIn && NGio.isLoggedIn)
items.resetItem("logout", "login", selectLogin);
}
#end
}
enum PageName
{
Options;
Controls;
Colors;
Mods;
Preferences;
}

View File

@ -0,0 +1,150 @@
package ui;
import flixel.FlxG;
import flixel.FlxSprite;
import flixel.group.FlxGroup;
import flixel.util.FlxColor;
import ui.AtlasText.AtlasFont;
import ui.TextMenuList.TextMenuItem;
class PreferencesMenu extends ui.OptionsState.Page
{
public static var preferences:Map<String, Dynamic> = new Map();
var items:TextMenuList;
var checkboxes:Array<CheckboxThingie> = [];
public function new()
{
super();
add(items = new TextMenuList());
createPrefItem('naughtyness', 'censor-naughty', false);
createPrefItem('downscroll', 'downscroll', false);
createPrefItem('flashing menu', 'flashing-menu', true);
createPrefItem('Camera Zooming on Beat', 'camera-zoom', true);
}
public static function getPref(pref:String):Dynamic
{
return preferences.get(pref);
}
public static function initPrefs():Void
{
preferenceCheck('censor-naughty', false);
preferenceCheck('downscroll', false);
preferenceCheck('flashing-menu', true);
preferenceCheck('camera-zoom', true);
}
private function createPrefItem(prefName:String, prefString:String, prefValue:Dynamic):Void
{
items.createItem(100, 100 * items.length, prefName, AtlasFont.Bold, function()
{
preferenceCheck(prefString, prefValue);
switch (Type.typeof(prefValue).getName())
{
case 'TBool':
prefToggle(prefString);
default:
trace('swag');
}
});
switch (Type.typeof(prefValue).getName())
{
case 'TBool':
createCheckbox(prefString);
default:
trace('swag');
}
trace(Type.typeof(prefValue).getName());
}
function createCheckbox(prefString:String)
{
var checkbox:CheckboxThingie = new CheckboxThingie(0, 100 * (items.length - 1), preferences.get(prefString));
checkboxes.push(checkbox);
add(checkbox);
}
/**
* Assumes that the preference has already been checked/set?
*/
private function prefToggle(prefName:String)
{
var daSwap:Bool = preferences.get(prefName);
daSwap = !daSwap;
preferences.set(prefName, daSwap);
checkboxes[items.selectedIndex].daValue = daSwap;
trace('toggled? ' + preferences.get(prefName));
}
override function update(elapsed:Float)
{
super.update(elapsed);
}
private static function preferenceCheck(prefString:String, prefValue:Dynamic):Void
{
if (preferences.get(prefString) == null)
{
preferences.set(prefString, prefValue);
trace('set preference!');
}
else
{
trace('found preference: ' + preferences.get(prefString));
}
}
}
class CheckboxThingie extends FlxSprite
{
public var daValue(default, set):Bool;
public function new(x:Float, y:Float, daValue:Bool = false)
{
super(x, y);
frames = Paths.getSparrowAtlas('checkboxThingie');
animation.addByPrefix('static', 'Check Box unselected', 24, false);
animation.addByPrefix('checked', 'Check Box selecting animation', 24, false);
antialiasing = true;
setGraphicSize(Std.int(width * 0.7));
updateHitbox();
this.daValue = daValue;
}
override function update(elapsed:Float)
{
super.update(elapsed);
switch (animation.curAnim.name)
{
case 'static':
offset.set();
case 'checked':
offset.set(17, 70);
}
}
function set_daValue(value:Bool):Bool
{
if (value)
animation.play('checked', true);
else
animation.play('static');
return value;
}
}

121
source/ui/Prompt.hx Normal file
View File

@ -0,0 +1,121 @@
package ui;
import ui.AtlasText;
import ui.MenuList;
import flixel.FlxG;
import flixel.FlxSprite;
import flixel.graphics.frames.FlxAtlasFrames;
import flixel.text.FlxText;
import flixel.util.FlxColor;
class Prompt extends flixel.FlxSubState
{
inline static var MARGIN = 100;
public var onYes:Void->Void;
public var onNo:Void->Void;
public var buttons:TextMenuList;
public var field:AtlasText;
public var back:FlxSprite;
var style:ButtonStyle;
public function new (text:String, style:ButtonStyle = Ok)
{
this.style = style;
super(0x80000000);
buttons = new TextMenuList(Horizontal);
field = new BoldText(text);
field.scrollFactor.set(0, 0);
}
override function create()
{
super.create();
field.y = MARGIN;
field.screenCenter(X);
add(field);
createButtons();
add(buttons);
}
public function createBg(width:Int, height:Int, color = 0xFF808080)
{
back = new FlxSprite();
back.makeGraphic(width, height, color, false, "prompt-bg");
back.screenCenter(XY);
add(back);
members.unshift(members.pop());// bring to front
}
public function createBgFromMargin(margin = MARGIN, color = 0xFF808080)
{
createBg(Std.int(FlxG.width - margin * 2), Std.int(FlxG.height - margin * 2), color);
}
public function setButtons(style:ButtonStyle)
{
if (this.style != style)
{
this.style = style;
createButtons();
}
}
function createButtons()
{
// destroy previous buttons
while(buttons.members.length > 0)
{
buttons.remove(buttons.members[0], true).destroy();
}
switch(style)
{
case Yes_No : createButtonsHelper("yes", "no");
case Ok : createButtonsHelper("ok");
case Custom(yes, no): createButtonsHelper(yes, no);
case None : buttons.exists = false;
};
}
function createButtonsHelper(yes:String, ?no:String)
{
buttons.exists = true;
// pass anonymous functions rather than the current callbacks, in case they change later
var yesButton = buttons.createItem(yes, function() onYes());
yesButton.screenCenter(X);
yesButton.y = FlxG.height - yesButton.height - MARGIN;
yesButton.scrollFactor.set(0, 0);
if (no != null)
{
// place right
yesButton.x = FlxG.width - yesButton.width - MARGIN;
var noButton = buttons.createItem(no, function() onNo());
noButton.x = MARGIN;
noButton.y = FlxG.height - noButton.height - MARGIN;
noButton.scrollFactor.set(0, 0);
}
}
public function setText(text:String)
{
field.text = text;
field.screenCenter(X);
}
}
enum ButtonStyle
{
Ok;
Yes_No;
Custom(yes:String, no:Null<String>);//Todo: more than 2
None;
}

56
source/ui/TextMenuList.hx Normal file
View File

@ -0,0 +1,56 @@
package ui;
import ui.AtlasText;
import ui.MenuList;
class TextMenuList extends MenuTypedList<TextMenuItem>
{
public function new(navControls:NavControls = Vertical, ?wrapMode)
{
super(navControls, wrapMode);
}
public function createItem(x = 0.0, y = 0.0, name:String, font:AtlasFont = Bold, callback, fireInstantly = false)
{
var item = new TextMenuItem(x, y, name, font, callback);
item.fireInstantly = fireInstantly;
return addItem(name, item);
}
}
class TextMenuItem extends TextTypedMenuItem<AtlasText>
{
public function new(x = 0.0, y = 0.0, name:String, font:AtlasFont = Bold, callback)
{
super(x, y, new AtlasText(0, 0, name, font), name, callback);
setEmptyBackground();
}
}
class TextTypedMenuItem<T:AtlasText> extends MenuTypedItem<T>
{
public function new(x = 0.0, y = 0.0, label:T, name:String, callback)
{
super(x, y, label, name, callback);
}
override function setItem(name:String, ?callback:Void->Void)
{
if (label != null)
{
label.text = name;
label.alpha = alpha;
width = label.width;
height = label.height;
}
super.setItem(name, callback);
}
override function set_label(value:T):T
{
super.set_label(value);
setItem(name, callback);
return value;
}
}