Merge branch 'main' into new-editors

This commit is contained in:
Ne_Eo
2024-11-15 18:50:48 +01:00
165 changed files with 2887 additions and 1558 deletions
+6 -1
View File
@@ -7,4 +7,9 @@ pages/** linguist-vendored
# Include HScript files as Haxe
*.hxs linguist-language=Haxe
*.hsc linguist-language=Haxe
*.hscript linguist-language=Haxe
*.hscript linguist-language=Haxe
# Include Shader files as GLSL
*.frag linguist-language=GLSL
*.vert linguist-language=GLSL
*.glsl linguist-language=GLSL
+2 -2
View File
@@ -12,8 +12,8 @@ Also, the command `.\cne test` uses the source assets folder instead of the expo
## Codename Engine
Codename Engine is a new Friday Night Funkin' Engine aimed at simplifying modding, along with extensiblity and ease of use.<br>
Make sure to read the wiki and join the Discord server linked there!<br>
#### It includes many new features, as seen [here](FEATURES.md)<br>
### Before making issues or need help with something, check our website [HERE](https://fnf-cne-devs.github.io/) (it contains a wiki of how to mod with EXAMPLES, an api, lists of mods made with Codename Engine and more)!!!
#### The Engine includes many new features, as seen [here](FEATURES.md)<br>
#### Wanna see the new features added in the most recent update? Click [here](PATCHNOTES.md)<br>
## How to download
+5 -5
View File
@@ -10,9 +10,9 @@
<anim name="singRIGHTmiss" anim="BF NOTE RIGHT MISS" fps="24" loop="false" x="-30" y="21"/>
<anim name="singDOWNmiss" anim="BF NOTE DOWN MISS" fps="24" loop="false" x="-11" y="-19"/>
<!-- funny loop -->
<anim name="idle-loop" anim="BF idle dance" fps="24" loop="true" x="-5" y="0" indices="10,11,12,13"/>
<anim name="singUP-loop" anim="BF NOTE UP0" fps="24" loop="true" x="-29" y="27" indices="11,12,13,14"/>
<anim name="singLEFT-loop" anim="BF NOTE LEFT0" fps="24" loop="true" x="12" y="-6" indices="12,13,14,15"/>
<anim name="singRIGHT-loop" anim="BF NOTE RIGHT0" fps="24" loop="true" x="-38" y="-7" indices="58,59,60,61"/>
<anim name="singDOWN-loop" anim="BF NOTE DOWN0" fps="24" loop="true" x="-10" y="-50" indices="26,27,28,29"/>
<anim name="idle-loop" anim="BF idle dance" fps="24" loop="true" x="-5" y="0" indices="10..13"/>
<anim name="singUP-loop" anim="BF NOTE UP0" fps="24" loop="true" x="-29" y="27" indices="11..14"/>
<anim name="singLEFT-loop" anim="BF NOTE LEFT0" fps="24" loop="true" x="12" y="-6" indices="12..15"/>
<anim name="singRIGHT-loop" anim="BF NOTE RIGHT0" fps="24" loop="true" x="-38" y="-7" indices="58..61"/>
<anim name="singDOWN-loop" anim="BF NOTE DOWN0" fps="24" loop="true" x="-10" y="-50" indices="26..29"/>
</character>
+10 -10
View File
@@ -1,13 +1,13 @@
<!DOCTYPE codename-engine-character>
<character isPlayer="true" flipX="true" x="0" y="350" icon="bf" camy="55" color="#31B0D1">
<anim name="idle" anim="BF idle dance" fps="24" loop="false" x="-5" y="0"/>
<anim name="singUP" anim="BF NOTE UP0" fps="24" loop="false" x="-29" y="27"/>
<anim name="singLEFT" anim="BF NOTE LEFT0" fps="24" loop="false" x="12" y="-6"/>
<anim name="singRIGHT" anim="BF NOTE RIGHT0" fps="24" loop="false" x="-38" y="-7"/>
<anim name="singDOWN" anim="BF NOTE DOWN0" fps="24" loop="false" x="-10" y="-50"/>
<anim name="singUPmiss" anim="BF NOTE UP MISS" fps="24" loop="false" x="-29" y="27"/>
<anim name="singLEFTmiss" anim="BF NOTE LEFT MISS" fps="24" loop="false" x="12" y="24"/>
<anim name="singRIGHTmiss" anim="BF NOTE RIGHT MISS" fps="24" loop="false" x="-30" y="21"/>
<anim name="singDOWNmiss" anim="BF NOTE DOWN MISS" fps="24" loop="false" x="-11" y="-19"/>
<anim name="hey" anim="BF HEY" fps="24" loop="false" x="7" y="4"/>
<anim name="idle" anim="BF idle dance" x="-5" y="0" fps="24" loop="false"/>
<anim name="singUP" anim="BF NOTE UP0" x="-39" y="27" fps="24" loop="false"/>
<anim name="singLEFT" anim="BF NOTE LEFT0" x="6" y="-7" fps="24" loop="false"/>
<anim name="singRIGHT" anim="BF NOTE RIGHT0" x="-48" y="-6" fps="24" loop="false"/>
<anim name="singDOWN" anim="BF NOTE DOWN0" x="-17" y="-50" fps="24" loop="false"/>
<anim name="singUPmiss" anim="BF NOTE UP MISS" x="-35" y="27" fps="24" loop="false"/>
<anim name="singLEFTmiss" anim="BF NOTE LEFT MISS" x="6" y="19" fps="24" loop="false"/>
<anim name="singRIGHTmiss" anim="BF NOTE RIGHT MISS" x="-44" y="22" fps="24" loop="false"/>
<anim name="singDOWNmiss" anim="BF NOTE DOWN MISS" x="-16" y="-19" fps="24" loop="false"/>
<anim name="hey" anim="BF HEY" x="-3" y="6" fps="24" loop="false"/>
</character>
+11 -11
View File
@@ -1,13 +1,13 @@
<!DOCTYPE codename-engine-character>
<character isPlayer="true" flipX="true" x="0" y="350" icon="bf" gameOverChar="bf-holding-gf-dead" color="#31B0D1">
<anim name="idle" anim="BF idle dance" fps="24" loop="false"/>
<anim name="singUP" anim="BF NOTE UP0" fps="24" loop="false" x="-29" y="10"/>
<anim name="singLEFT" anim="BF NOTE LEFT0" fps="24" loop="false" x="12" y="7"/>
<anim name="singRIGHT" anim="BF NOTE RIGHT0" fps="24" loop="false" x="-41" y="23"/>
<anim name="singDOWN" anim="BF NOTE DOWN0" fps="24" loop="false" x="-10" y="-10"/>
<anim name="singUPmiss" anim="BF NOTE UP MISS" fps="24" loop="false" x="-29" y="10"/>
<anim name="singLEFTmiss" anim="BF NOTE LEFT MISS" fps="24" loop="false" x="12" y="7"/>
<anim name="singRIGHTmiss" anim="BF NOTE RIGHT MISS" fps="24" loop="false" x="-41" y="23"/>
<anim name="singDOWNmiss" anim="BF NOTE DOWN MISS" fps="24" loop="false" x="-10" y="-10"/>
<anim name="bfCatch" anim="BF catches GF" fps="24" loop="false" x="6" y="88"/>
<character y="350" sprite="bf-holding-gf" flipX="true" isPlayer="true" icon="bf" color="#31B0D1" gameOverChar="bf-holding-gf-dead">
<anim name="idle" anim="BF idle dance" x="0" y="0" fps="24" loop="false"/>
<anim name="singUP" anim="BF NOTE UP0" x="-42" y="9" fps="24" loop="false"/>
<anim name="singLEFT" anim="BF NOTE LEFT0" x="11" y="2" fps="24" loop="false"/>
<anim name="singRIGHT" anim="BF NOTE RIGHT0" x="-46" y="21" fps="24" loop="false"/>
<anim name="singDOWN" anim="BF NOTE DOWN0" x="-16" y="-14" fps="24" loop="false"/>
<anim name="singUPmiss" anim="BF NOTE UP MISS" x="-39" y="8" fps="24" loop="false"/>
<anim name="singLEFTmiss" anim="BF NOTE LEFT MISS" x="10" y="3" fps="24" loop="false"/>
<anim name="singRIGHTmiss" anim="BF NOTE RIGHT MISS" x="-41" y="37" fps="24" loop="false"/>
<anim name="singDOWNmiss" anim="BF NOTE DOWN MISS" x="-15" y="-11" fps="24" loop="false"/>
<anim name="bfCatch" anim="BF catches GF" x="6" y="90" fps="24" loop="false"/>
</character>
+11 -14
View File
@@ -1,15 +1,12 @@
<!DOCTYPE codename-engine-character>
<character isPlayer="true" flipX="true" x="200" y="570" antialiasing="false" scale="6" gameOverChar="bf-pixel-dead" color="#7BD6F6">
<anim name="idle" anim="BF IDLE" fps="24" loop="false" x="0" y="0" />
<!-- Offsets are actually multiplied by scale -->
<anim name="singLEFT" anim="BF LEFT NOTE" fps="24" loop="false" x="0" y="0" />
<anim name="singDOWN" anim="BF DOWN NOTE" fps="24" loop="false" x="0" y="0" />
<anim name="singUP" anim="BF UP NOTE" fps="24" loop="false" x="0" y="0" />
<anim name="singRIGHT" anim="BF RIGHT NOTE" fps="24" loop="false" x="0" y="0" />
<anim name="singUPmiss" anim="BF UP MISS" fps="24" loop="false" x="0" y="0"/>
<anim name="singLEFTmiss" anim="BF LEFT MISS" fps="24" loop="false" x="0" y="0"/>
<anim name="singRIGHTmiss" anim="BF RIGHT MISS" fps="24" loop="false" x="0" y="0"/>
<anim name="singDOWNmiss" anim="BF DOWN MISS" fps="24" loop="false" x="0" y="0"/>
</character>
<character x="200" y="570" sprite="bf-pixel" scale="6" antialiasing="false" flipX="true" isPlayer="true" icon="bf-pixel" color="#7BD6F6" gameOverChar="bf-pixel-dead">
<anim name="idle" anim="BF IDLE" x="0" y="0" fps="24" loop="false"/>
<anim name="singLEFT" anim="BF LEFT NOTE" x="-1" y="0" fps="24" loop="false"/>
<anim name="singDOWN" anim="BF DOWN NOTE" x="0" y="0" fps="24" loop="false"/>
<anim name="singUP" anim="BF UP NOTE" x="0" y="0" fps="24" loop="false"/>
<anim name="singRIGHT" anim="BF RIGHT NOTE" x="0" y="0" fps="24" loop="false"/>
<anim name="singUPmiss" anim="BF UP MISS" x="0" y="0" fps="24" loop="false"/>
<anim name="singLEFTmiss" anim="BF LEFT MISS" x="-1" y="0" fps="24" loop="false"/>
<anim name="singRIGHTmiss" anim="BF RIGHT MISS" x="0" y="0" fps="24" loop="false"/>
<anim name="singDOWNmiss" anim="BF DOWN MISS" x="0" y="0" fps="24" loop="false"/>
</character>
+16 -16
View File
@@ -1,18 +1,18 @@
<!DOCTYPE codename-engine-character>
<character isPlayer="true" flipX="true" x="0" y="350" color="#31B0D1">
<anim name="idle" anim="BF idle dance" fps="24" loop="false" x="-5" y="0"/>
<anim name="singUP" anim="BF NOTE UP0" fps="24" loop="false" x="-29" y="27"/>
<anim name="singLEFT" anim="BF NOTE LEFT0" fps="24" loop="false" x="12" y="-6"/>
<anim name="singRIGHT" anim="BF NOTE RIGHT0" fps="24" loop="false" x="-38" y="-7"/>
<anim name="singDOWN" anim="BF NOTE DOWN0" fps="24" loop="false" x="-10" y="-50"/>
<anim name="singUPmiss" anim="BF NOTE UP MISS" fps="24" loop="false" x="-29" y="27"/>
<anim name="singLEFTmiss" anim="BF NOTE LEFT MISS" fps="24" loop="false" x="12" y="24"/>
<anim name="singRIGHTmiss" anim="BF NOTE RIGHT MISS" fps="24" loop="false" x="-30" y="21"/>
<anim name="singDOWNmiss" anim="BF NOTE DOWN MISS" fps="24" loop="false" x="-11" y="-19"/>
<anim name="hey" anim="BF HEY" fps="24" loop="false" x="7" y="4"/>
<anim name="scared" anim="BF idle shaking" fps="24" loop="true" x="-4" y="0"/>
<anim name="hit" anim="BF hit" fps="24" loop="false" x="13" y="19"/>
<anim name="pre-attack" anim="bf pre attack" fps="24" loop="false" x="-47" y="-36"/>
<anim name="attack" anim="boyfriend attack" fps="24" loop="false" x="289" y="270"/>
<anim name="dodge" anim="boyfriend dodge" fps="24" loop="false" x="-7" y="-15"/>
<character y="350" sprite="bf" flipX="true" isPlayer="true" icon="bf" color="#31B0D1">
<anim name="idle" anim="BF idle dance" x="-5" y="0" fps="24" loop="false"/>
<anim name="singUP" anim="BF NOTE UP0" x="-39" y="27" fps="24" loop="false"/>
<anim name="singLEFT" anim="BF NOTE LEFT0" x="6" y="-7" fps="24" loop="false"/>
<anim name="singRIGHT" anim="BF NOTE RIGHT0" x="-48" y="-6" fps="24" loop="false"/>
<anim name="singDOWN" anim="BF NOTE DOWN0" x="-17" y="-50" fps="24" loop="false"/>
<anim name="singUPmiss" anim="BF NOTE UP MISS" x="-35" y="27" fps="24" loop="false"/>
<anim name="singLEFTmiss" anim="BF NOTE LEFT MISS" x="6" y="19" fps="24" loop="false"/>
<anim name="singRIGHTmiss" anim="BF NOTE RIGHT MISS" x="-44" y="22" fps="24" loop="false"/>
<anim name="singDOWNmiss" anim="BF NOTE DOWN MISS" x="-16" y="-19" fps="24" loop="false"/>
<anim name="hey" anim="BF HEY" x="-3" y="6" fps="24" loop="false"/>
<anim name="scared" anim="BF idle shaking" x="-6" y="1" fps="24" loop="true"/>
<anim name="hit" anim="BF hit" x="13" y="19" fps="24" loop="false"/>
<anim name="pre-attack" anim="bf pre attack" x="-47" y="-36" fps="24" loop="false"/>
<anim name="attack" anim="boyfriend attack" x="289" y="270" fps="24" loop="false"/>
<anim name="dodge" anim="boyfriend dodge" x="-8" y="-13" fps="24" loop="false"/>
</character>
+11 -12
View File
@@ -1,13 +1,12 @@
<!DOCTYPE codename-engine-character>
<character isPlayer="false" flipX="false" holdTime="6.1" color="#AF66CE">
<anim name="idle" anim="Dad idle dance" fps="24" loop="false" x="0" y="0"/>
<anim name="singUP" anim="Dad Sing note UP" fps="24" loop="false" x="-6" y="50"/>
<anim name="singLEFT" anim="dad sing note right" fps="24" loop="false" x="-10" y="10"/>
<anim name="singRIGHT" anim="Dad Sing Note LEFT" fps="24" loop="false" x="0" y="27"/>
<anim name="singDOWN" anim="Dad Sing Note DOWN" fps="24" loop="false" x="0" y="-30"/>
<!-- funny loop -->
<anim name="idle-loop" anim="Dad idle dance" fps="24" loop="true" x="0" y="0" indices="10,11,12,12"/>
<anim name="singUP-loop" anim="Dad Sing note UP" fps="24" loop="true" x="-6" y="50" indices="56,57,58,59"/>
<anim name="singLEFT-loop" anim="dad sing note right" fps="24" loop="true" x="-10" y="10" indices="12,13,14,15"/>
<anim name="singRIGHT-loop" anim="Dad Sing Note LEFT" fps="24" loop="true" x="0" y="27" indices="15,16,17,18"/>
</character>
<character sprite="dad" icon="dad" color="#AF66CE" holdTime="6.1">
<anim name="idle" anim="Dad idle dance" x="0" y="0" fps="24" loop="false" indices="2..12,0,1"/>
<anim name="singUP" anim="Dad Sing note UP" x="-10" y="50" fps="24" loop="false"/>
<anim name="singLEFT" anim="dad sing note right" x="-10" y="10" fps="24" loop="false"/>
<anim name="singRIGHT" anim="Dad Sing Note LEFT" x="-4" y="26" fps="24" loop="false"/>
<anim name="singDOWN" anim="Dad Sing Note DOWN" x="2" y="-31" fps="24" loop="false"/>
<anim name="idle-loop" anim="Dad idle dance" x="0" y="0" fps="24" loop="true" indices="10..12,12"/>
<anim name="singUP-loop" anim="Dad Sing note UP" x="-10" y="50" fps="24" loop="true" indices="56..59"/>
<anim name="singLEFT-loop" anim="dad sing note right" x="-10" y="10" fps="24" loop="true" indices="12..15"/>
<anim name="singRIGHT-loop" anim="Dad Sing Note LEFT" x="-4" y="26" fps="24" loop="true" indices="15..18"/>
</character>
+2 -2
View File
@@ -1,5 +1,5 @@
<!DOCTYPE codename-engine-character>
<character isPlayer="false" flipX="false" x="75" y="335" icon="gf" color="#A5004D">
<anim name="danceLeft" anim="GF Dancing Beat Hair blowing CAR" fps="24" loop="false" x="0" y="0" indices="30,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14" />
<anim name="danceRight" anim="GF Dancing Beat Hair blowing CAR" fps="24" loop="false" x="0" y="0" indices="15,16,17,18,19,20,21,22,23,24,25,26,27,28,29" />
<anim name="danceLeft" anim="GF Dancing Beat Hair blowing CAR" fps="24" loop="false" x="0" y="0" indices="0..15" />
<anim name="danceRight" anim="GF Dancing Beat Hair blowing CAR" fps="24" loop="false" x="0" y="0" indices="16..30" />
</character>
+13 -13
View File
@@ -1,14 +1,14 @@
<!DOCTYPE codename-engine-character>
<character x="115" icon="gf" y="325" flipX="false" isPlayer="false" antialiasing="true" color="#A5004D">
<anim x="0" loop="true" y="-9" fps="24" anim="GF FEAR" name="scared"/>
<anim x="0" loop="false" y="-9" fps="24" anim="GF Down Note" name="singDOWN"/>
<anim x="0" loop="false" y="-9" fps="24" anim="GF Dancing Beat" indices="15,16,17,18,19,20,21,22,23,24,25,26,27,28,29" name="danceRight"/>
<anim x="0" loop="false" y="-9" fps="24" anim="GF Up Note" name="singUP"/>
<anim x="0" loop="false" y="-9" fps="24" anim="GF Dancing Beat" indices="30,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14" name="danceLeft"/>
<anim x="0" loop="false" y="-9" fps="24" anim="GF Dancing Beat Hair blowing" indices="0,1,2,3" name="hairBlow"/>
<anim x="0" loop="false" y="-9" fps="24" anim="GF Right Note" name="singRIGHT"/>
<anim x="0" loop="false" y="-9" fps="24" anim="GF Dancing Beat Hair Landing" indices="0,1,2,3,4,5,6,7,8,9,10,11" name="hairFall"/>
<anim x="0" loop="false" y="-9" fps="24" anim="GF Cheer" name="cheer"/>
<anim x="0" loop="false" y="-9" fps="24" anim="GF left note" name="singLEFT"/>
<anim x="-51" loop="true" y="306" fps="24" anim="gf sad" indices="0,1,2,3,4,5,6,7,8,9,10,11,12" name="sad"/>
</character>
<character x="115" y="325" sprite="gf-christmas" icon="gf" color="#A5004D">
<anim name="danceLeft" anim="GF Dancing Beat" x="0" y="-9" fps="24" loop="false" indices="0..14"/>
<anim name="danceRight" anim="GF Dancing Beat" x="0" y="-9" fps="24" loop="false" indices="15..30"/>
<anim name="singUP" anim="GF Up Note" x="0" y="-9" fps="24" loop="false"/>
<anim name="singDOWN" anim="GF Down Note" x="0" y="-9" fps="24" loop="false"/>
<anim name="singLEFT" anim="GF left note" x="0" y="-9" fps="24" loop="false"/>
<anim name="singRIGHT" anim="GF Right Note" x="0" y="-9" fps="24" loop="false"/>
<anim name="scared" anim="GF FEAR" x="0" y="-9" fps="24" loop="true"/>
<anim name="hairBlow" anim="GF Dancing Beat Hair blowing" x="0" y="-9" fps="24" loop="false" indices="0..3"/>
<anim name="hairFall" anim="GF Dancing Beat Hair Landing" x="0" y="-9" fps="24" loop="false" indices="0..11"/>
<anim name="cheer" anim="GF Cheer" x="0" y="-9" fps="24" loop="false"/>
<anim name="sad" anim="gf sad" x="-51" y="306" fps="24" loop="true" indices="0..12"/>
</character>
+4 -4
View File
@@ -1,5 +1,5 @@
<!DOCTYPE codename-engine-character>
<character isPlayer="false" flipX="false" x="180" y="300" antialiasing="false" scale="6" camx="180" camy="300" color="#C70660">
<anim name="danceLeft" anim="GF IDLE" fps="24" loop="false" indices="30,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14" x="0" y="0" />
<anim name="danceRight" anim="GF IDLE" fps="24" loop="false" indices="15,16,17,18,19,20,21,22,23,24,25,26,27,28,29" x="0" y="0" />
</character>
<character x="180" y="300" sprite="gf-pixel" scale="6" antialiasing="false" camx="180" camy="300" icon="gf-pixel" color="#C70660">
<anim name="danceLeft" anim="GF IDLE" x="0" y="0" fps="24" loop="false" indices="0..14"/>
<anim name="danceRight" anim="GF IDLE" x="0" y="0" fps="24" loop="false" indices="15..30"/>
</character>
+5 -5
View File
@@ -1,7 +1,7 @@
<!DOCTYPE codename-engine-character>
<character icon="gf" flipX="false" isPlayer="false" antialiasing="true" color="#A5004D">
<anim x="0" loop="false" y="0" fps="24" anim="GF Dancing at Gunpoint" indices="30,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14" name="danceLeft"/>
<anim x="0" loop="true" y="0" fps="24" anim="GF Dancing at Gunpoint" name="dance-cutscene"/>
<anim x="-315" loop="true" y="6" fps="24" anim="GF Crying at Gunpoint" indices="0,1,2,3,4,5,6,7,8,9,10,11,12" name="sad"/>
<anim x="0" loop="false" y="0" fps="24" anim="GF Dancing at Gunpoint" indices="15,16,17,18,19,20,21,22,23,24,25,26,27,28,29" name="danceRight"/>
<character sprite="gf-tankmen" icon="gf" color="#A5004D">
<anim name="danceLeft" anim="GF Dancing at Gunpoint" x="0" y="0" fps="24" loop="false" indices="0..14"/>
<anim name="danceRight" anim="GF Dancing at Gunpoint" x="0" y="0" fps="24" loop="false" indices="15..30"/>
<anim name="dance-cutscene" anim="GF Dancing at Gunpoint" x="0" y="0" fps="24" loop="true"/>
<anim name="sad" anim="GF Crying at Gunpoint" x="-315" y="6" fps="24" loop="true" indices="0..12"/>
</character>
+13 -13
View File
@@ -1,14 +1,14 @@
<!DOCTYPE codename-engine-character>
<character isPlayer="false" flipX="false" x="100" y="275" color="#A5004D">
<anim name="cheer" anim="GF Cheer" fps="24" loop="false" />
<anim name="singUP" anim="GF Up Note" fps="24" loop="false" x="0" y="0" />
<anim name="singLEFT" anim="GF left note" fps="24" loop="false" x="0" y="0" />
<anim name="singRIGHT" anim="GF Right Note" fps="24" loop="false" x="0" y="0" />
<anim name="singDOWN" anim="GF Down Note" fps="24" loop="false" x="0" y="0" />
<anim name="danceLeft" anim="GF Dancing Beat" fps="24" loop="false" x="0" y="0" indices="30,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14" />
<anim name="danceRight" anim="GF Dancing Beat" fps="24" loop="false" x="0" y="0" indices="15,16,17,18,19,20,21,22,23,24,25,26,27,28,29" />
<anim name="hairBlow" anim="GF Dancing Beat Hair blowing" fps="24" loop="true" x="0" y="0" indices="0,1,2,3" />
<anim name="hairFall" anim="GF Dancing Beat Hair Landing" fps="24" loop="false" x="0" y="0" indices="0,1,2,3,4,5,6,7,8,9,10,11" />
<anim name="scared" anim="GF FEAR" fps="24" loop="true" x="0" y="0" />
<anim name="sad" anim="gf sad" fps="24" loop="true" x="0" y="0" indices="0,1,2,3,4,5,6,7,8,9,10,11,12" />
</character>
<character x="100" y="275" sprite="gf" icon="gf" color="#A5004D">
<anim name="cheer" anim="GF Cheer" x="0" y="0" fps="24" loop="false"/>
<anim name="singUP" anim="GF Up Note" x="0" y="0" fps="24" loop="false"/>
<anim name="singLEFT" anim="GF left note" x="0" y="0" fps="24" loop="false"/>
<anim name="singRIGHT" anim="GF Right Note" x="0" y="0" fps="24" loop="false"/>
<anim name="singDOWN" anim="GF Down Note" x="0" y="0" fps="24" loop="false"/>
<anim name="danceLeft" anim="GF Dancing Beat" x="0" y="0" fps="24" loop="false" indices="0..14"/>
<anim name="danceRight" anim="GF Dancing Beat" x="0" y="0" fps="24" loop="false" indices="15..30"/>
<anim name="hairBlow" anim="GF Dancing Beat Hair blowing" x="0" y="0" fps="24" loop="true" indices="0,1,2,3"/>
<anim name="hairFall" anim="GF Dancing Beat Hair Landing" x="0" y="0" fps="24" loop="false" indices="0..11"/>
<anim name="scared" anim="GF FEAR" x="0" y="0" fps="24" loop="true"/>
<anim name="sad" anim="gf sad" x="0" y="0" fps="24" loop="true" indices="0..12"/>
</character>
+12 -15
View File
@@ -1,16 +1,13 @@
<!DOCTYPE codename-engine-character>
<character isPlayer="false" flipX="false" icon="mom" color="#D8558E">
<anim name="idle" anim="Mom Idle" fps="24" loop="false" />
<anim name="singUP" anim="Mom Up Pose" fps="24" loop="false" x="14" y="71"/>
<anim name="singDOWN" anim="MOM DOWN POSE" fps="24" loop="false" x="20" y="-160"/>
<anim name="singLEFT" anim="Mom Left Pose" fps="24" loop="false" x="250" y="-23"/>
<!-- ANIMATION IS CALLED MOM LEFT POSE BUT ITS FOR THE RIGHT -->
<!-- CUZ DAVE IS DUMB! -->
<anim name="singRIGHT" anim="Mom Pose Left" fps="24" loop="false" x="10" y="-60"/>
<!-- funny loop -->
<anim name="idle-loop" anim="Mom Idle" fps="24" loop="true" indices="10,11,12,13"/>
<anim name="singUP-loop" anim="Mom Up Pose" fps="24" loop="true" x="14" y="71" indices="11,12,13,14"/>
<anim name="singDOWN-loop" anim="MOM DOWN POSE" fps="24" loop="true" x="20" y="-160" indices="11,12,13,14"/>
<anim name="singLEFT-loop" anim="Mom Left Pose" fps="24" loop="true" x="250" y="-23" indices="6,7,8,9"/>
<anim name="singRIGHT-loop" anim="Mom Pose Left" fps="24" loop="true" x="10" y="-60" indices="6,7,8,9"/>
</character>
<character sprite="mom-car" icon="mom" color="#D8558E">
<anim name="idle" anim="Mom Idle" x="0" y="0" fps="24" loop="false"/>
<anim name="singUP" anim="Mom Up Pose" x="-1" y="81" fps="24" loop="false"/>
<anim name="singDOWN" anim="MOM DOWN POSE" x="-12" y="-160" fps="24" loop="false"/>
<anim name="singLEFT" anim="Mom Left Pose" x="250" y="-23" fps="24" loop="false"/>
<anim name="singRIGHT" anim="Mom Pose Left" x="-15" y="-55" fps="24" loop="false"/>
<anim name="idle-loop" anim="Mom Idle" x="0" y="0" fps="24" loop="true" indices="10..13"/>
<anim name="singUP-loop" anim="Mom Up Pose" x="-1" y="81" fps="24" loop="true" indices="11..14"/>
<anim name="singDOWN-loop" anim="MOM DOWN POSE" x="-12" y="-160" fps="24" loop="true" indices="11..14"/>
<anim name="singLEFT-loop" anim="Mom Left Pose" x="250" y="-23" fps="24" loop="true" indices="6..9"/>
<anim name="singRIGHT-loop" anim="Mom Pose Left" x="-15" y="-55" fps="24" loop="true" indices="6..9"/>
</character>
+13 -15
View File
@@ -1,16 +1,14 @@
<!DOCTYPE codename-engine-character>
<character isPlayer="false" flipX="false" color="#D8558E">
<anim name="idle" anim="Mom Idle" fps="24" loop="false" />
<anim name="singUP" anim="Mom Up Pose" fps="24" loop="false" x="14" y="71"/>
<anim name="singDOWN" anim="MOM DOWN POSE" fps="24" loop="false" x="20" y="-160"/>
<anim name="singLEFT" anim="Mom Left Pose" fps="24" loop="false" x="250" y="-23"/>
<!-- ANIMATION IS CALLED MOM LEFT POSE BUT ITS FOR THE RIGHT -->
<!-- CUZ DAVE IS DUMB! -->
<anim name="singRIGHT" anim="Mom Pose Left" fps="24" loop="false" x="10" y="-60"/>
<!-- funny loop -->
<anim name="idle-loop" anim="Mom Idle" fps="24" loop="true" indices="10,11,12,13"/>
<anim name="singUP-loop" anim="Mom Up Pose" fps="24" loop="true" x="14" y="71" indices="11,12,13,14"/>
<anim name="singDOWN-loop" anim="MOM DOWN POSE" fps="24" loop="true" x="20" y="-160" indices="9,10,11,12"/>
<anim name="singLEFT-loop" anim="Mom Left Pose" fps="24" loop="true" x="250" y="-23" indices="6,7,8,9"/>
<anim name="singRIGHT-loop" anim="Mom Pose Left" fps="24" loop="true" x="10" y="-60" indices="6,7,8,9"/>
</character>
<character sprite="mom" icon="mom" color="#D8558E">
<anim name="idle" anim="Mom Idle" x="0" y="0" fps="24" loop="false"/>
<anim name="singUP" anim="Mom Up Pose" x="13" y="67" fps="24" loop="false"/>
<anim name="singDOWN" anim="MOM DOWN POSE" x="8" y="-173" fps="24" loop="false"/>
<anim name="singLEFT" anim="Mom Left Pose" x="282" y="-28" fps="24" loop="false"/>
<anim name="singRIGHT" anim="Mom Pose Left" x="-20" y="-60" fps="24" loop="false"/>
<anim name="idle-loop" anim="Mom Idle" x="0" y="0" fps="24" loop="true" indices="10..13"/>
<anim name="singUP-loop" anim="Mom Up Pose" x="13" y="67" fps="24" loop="true" indices="11..14"/>
<anim name="singDOWN-loop" anim="MOM DOWN POSE" x="8" y="-173" fps="24" loop="true" indices="11..14"/>
<anim name="singLEFT-loop" anim="Mom Left Pose" x="282" y="-28" fps="24" loop="true" indices="6..9"/>
<anim name="singRIGHT-loop" anim="Mom Pose Left" x="-20" y="-60" fps="24" loop="true" indices="6..9"/>
</character>
+7 -7
View File
@@ -1,8 +1,8 @@
<!DOCTYPE codename-engine-character>
<character isPlayer="false" flipX="false" x="0" y="130" icon="monster" color="#F3FF6E">
<anim name="idle" anim="monster idle" fps="24" loop="false" x="0" y="0"/>
<anim name="singUP" anim="monster up note" fps="24" loop="false" x="-20" y="50"/>
<anim name="singRIGHT" anim="Monster left note" fps="24" loop="false" x="-30" y="0"/>
<anim name="singLEFT" anim="Monster Right note" fps="24" loop="false" x="-51" y="0"/>
<anim name="singDOWN" anim="monster down" fps="24" loop="false" x="-40" y="-94"/>
</character>
<character y="130" sprite="monster-christmas" icon="monster" color="#F3FF6E">
<anim name="idle" anim="monster idle" x="0" y="0" fps="24" loop="false"/>
<anim name="singUP" anim="monster up note" x="-26" y="57" fps="24" loop="false"/>
<anim name="singRIGHT" anim="Monster left note" x="-34" y="10" fps="24" loop="false"/>
<anim name="singLEFT" anim="Monster Right note" x="-41" y="5" fps="24" loop="false"/>
<anim name="singDOWN" anim="monster down" x="-50" y="-92" fps="24" loop="false"/>
</character>
+7 -7
View File
@@ -1,8 +1,8 @@
<!DOCTYPE codename-engine-character>
<character isPlayer="false" flipX="false" x="0" y="100" color="#F3FF6E">
<anim name="idle" anim="monster idle" fps="24" loop="false" />
<anim name="singUP" anim="monster up note" fps="24" loop="false" x="-20" y="94"/>
<anim name="singRIGHT" anim="Monster left note" fps="24" loop="false" x="-30" y="20"/>
<anim name="singLEFT" anim="Monster Right note" fps="24" loop="false" x="-51" y="30"/>
<anim name="singDOWN" anim="monster down" fps="24" loop="false" x="-50" y="-80"/>
</character>
<character y="100" sprite="monster" icon="monster" color="#F3FF6E">
<anim name="idle" anim="monster idle" x="0" y="0" fps="24" loop="false"/>
<anim name="singUP" anim="monster up note" x="-26" y="92" fps="24" loop="false"/>
<anim name="singRIGHT" anim="Monster left note" x="-34" y="10" fps="24" loop="false"/>
<anim name="singLEFT" anim="Monster Right note" x="-41" y="10" fps="24" loop="false"/>
<anim name="singDOWN" anim="monster down" x="-50" y="-87" fps="24" loop="false"/>
</character>
+24 -11
View File
@@ -1,12 +1,25 @@
<!DOCTYPE codename-engine-character>
<character isPlayer="false" flipX="false" x="-500" y="0" color="#C45EAE">
<anim name="idle" anim="Parent Christmas Idle" fps="24" loop="false"/>
<anim name="singUP" anim="Parent Up Note Dad" fps="24" loop="false" x="-47" y="24"/>
<anim name="singDOWN" anim="Parent Down Note Dad" fps="24" loop="false" x="-31" y="-29"/>
<anim name="singLEFT" anim="Parent Left Note Dad" fps="24" loop="false" x="-30" y="16"/>
<anim name="singRIGHT" anim="Parent Right Note Dad" fps="24" loop="false" x="-1" y="-23"/>
<anim name="singUP-alt" anim="Parent Up Note Mom" fps="24" loop="false" x="-47" y="24"/>
<anim name="singDOWN-alt" anim="Parent Down Note Mom" fps="24" loop="false" x="-30" y="-27"/>
<anim name="singLEFT-alt" anim="Parent Left Note Mom" fps="24" loop="false" x="-30" y="15"/>
<anim name="singRIGHT-alt" anim="Parent Right Note Mom" fps="24" loop="false" x="-1" y="-24"/>
</character>
<character x="-500" sprite="parents-christmas" icon="parents-christmas" color="#C45EAE">
<!--Dad Animations-->
<anim name="idle" anim="Parent Christmas Idle" x="0" y="0" fps="24" loop="false"/>
<anim name="singUP" anim="Parent Up Note Dad" x="-47" y="25" fps="24" loop="false"/>
<anim name="singDOWN" anim="Parent Down Note Dad" x="-33" y="-25" fps="24" loop="false"/>
<anim name="singLEFT" anim="Parent Left Note Dad" x="-28" y="20" fps="24" loop="false"/>
<anim name="singRIGHT" anim="Parent Right Note Dad" x="0" y="-20" fps="24" loop="false"/>
<!--Dad Loop Animations-->
<anim name="idle-loop" anim="Parent Christmas Idle" x="0" y="0" fps="24" loop="true" indices="11,11..13"/>
<anim name="singUP-loop" anim="Parent Up Note Dad" x="-47" y="25" fps="24" loop="true" indices="10..13"/>
<anim name="singDOWN-loop" anim="Parent Down Note Dad" x="-33" y="-25" fps="24" loop="true" indices="11..14"/>
<anim name="singLEFT-loop" anim="Parent Left Note Dad" x="-28" y="20" fps="24" loop="true" indices="12..15"/>
<anim name="singRIGHT-loop" anim="Parent Right Note Dad" x="0" y="-20" fps="24" loop="true" indices="12..15"/>
<!--Mom Animations-->
<anim name="singUP-alt" anim="Parent Up Note Mom" x="-47" y="28" fps="24" loop="false"/>
<anim name="singDOWN-alt" anim="Parent Down Note Mom" x="-33" y="-25" fps="24" loop="false"/>
<anim name="singLEFT-alt" anim="Parent Left Note Mom" x="-28" y="19" fps="24" loop="false"/>
<anim name="singRIGHT-alt" anim="Parent Right Note Mom" x="0" y="-19" fps="24" loop="false"/>
<!--Mom Loop Animations-->
<anim name="singUP-alt-loop" anim="Parent Up Note Mom" x="-47" y="28" fps="24" loop="true" indices="10..13"/>
<anim name="singDOWN-alt-loop" anim="Parent Down Note Mom" x="-33" y="-25" fps="24" loop="true" indices="11..14"/>
<anim name="singLEFT-alt-loop" anim="Parent Left Note Mom" x="-28" y="19" fps="24" loop="true" indices="11..14"/>
<anim name="singRIGHT-alt-loop" anim="Parent Right Note Mom" x="0" y="-19" fps="24" loop="true" indices="11..14"/>
</character>
+10 -15
View File
@@ -1,16 +1,11 @@
<!DOCTYPE codename-engine-character>
<character isPlayer="false" flipX="false" icon="pico" x="115" y="-85" camx="195" camy="360" color="#B7D855">
<!-- Left Animations -->
<anim name="shoot1" anim="Pico shoot 1" fps="24" loop="false" indices="0,1,2,3" />
<anim name="idle1" anim="Pico shoot 1" fps="24" loop="false" indices="4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24" />
<anim name="shoot2" anim="Pico shoot 2" fps="24" loop="false" indices="0,1,2,3" />
<anim name="idle2" anim="Pico shoot 2" fps="24" loop="false" indices="4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24" />
<!-- Right Animations-->
<anim name="shoot3" anim="Pico shoot 3" fps="24" loop="false" indices="0,1,2,3" />
<anim name="idle3" anim="Pico shoot 3" fps="24" loop="false" indices="4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24" />
<anim name="shoot4" anim="Pico shoot 4" fps="24" loop="false" indices="0,1,2,3" />
<anim name="idle4" anim="Pico shoot 4" fps="24" loop="false" indices="4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24" />
</character>
<character x="115" y="-85" sprite="pico-speakers" camx="195" camy="360" icon="pico" color="#B7D855">
<anim name="idle1" anim="Pico shoot 1" x="0" y="0" fps="24" loop="false" indices="4..24"/>
<anim name="idle2" anim="Pico shoot 2" x="0" y="0" fps="24" loop="false" indices="4..24"/>
<anim name="idle3" anim="Pico shoot 3" x="0" y="0" fps="24" loop="false" indices="4..24"/>
<anim name="idle4" anim="Pico shoot 4" x="0" y="0" fps="24" loop="false" indices="4..24"/>
<anim name="shoot1" anim="Pico shoot 1" x="0" y="0" fps="24" loop="false" indices="0..3"/>
<anim name="shoot2" anim="Pico shoot 2" x="0" y="0" fps="24" loop="false" indices="0..3"/>
<anim name="shoot3" anim="Pico shoot 3" x="0" y="0" fps="24" loop="false" indices="0..3"/>
<anim name="shoot4" anim="Pico shoot 4" x="0" y="0" fps="24" loop="false" indices="0..3"/>
</character>
+11 -15
View File
@@ -1,16 +1,12 @@
<!DOCTYPE codename-engine-character>
<character isPlayer="false" flipX="true" x="100" y="300" camx="-100" color="#B7D855">
<anim name="idle" anim="Pico Idle Dance" fps="24" loop="false"/>
<!-- Sing Animations -->
<anim name="singLEFT" anim="Pico Note Right0" fps="24" loop="false" x="65" y="9" />
<anim name="singDOWN" anim="Pico Down Note0" fps="24" loop="false" x="200" y="-70" />
<anim name="singUP" anim="pico Up note0" fps="24" loop="false" x="-29" y="27" />
<anim name="singRIGHT" anim="Pico NOTE LEFT0" fps="24" loop="false" x="-68" y="-7" />
<!-- Miss Animations -->
<anim name="singLEFTmiss" anim="Pico Note Right Miss" fps="24" loop="false" x="62" y="64" />
<anim name="singDOWNmiss" anim="Pico Down Note MISS" fps="24" loop="false" x="210" y="-28" />
<anim name="singUPmiss" anim="pico Up note miss" fps="24" loop="false" x="-19" y="67" />
<anim name="singRIGHTmiss" anim="Pico NOTE LEFT miss" fps="24" loop="false" x="-60" y="41" />
</character>
<character x="100" y="300" sprite="pico" flipX="true" camx="-100" icon="pico" color="#B7D855">
<anim name="idle" anim="Pico Idle Dance" x="0" y="0" fps="24" loop="false"/>
<anim name="singLEFT" anim="Pico Note Right0" x="56" y="1" fps="24" loop="false"/>
<anim name="singDOWN" anim="Pico Down Note0" x="193" y="-82" fps="24" loop="false"/>
<anim name="singUP" anim="pico Up note0" x="-31" y="30" fps="24" loop="false"/>
<anim name="singRIGHT" anim="Pico NOTE LEFT0" x="-83" y="-11" fps="24" loop="false"/>
<anim name="singLEFTmiss" anim="Pico Note Right Miss" x="57" y="47" fps="24" loop="false"/>
<anim name="singDOWNmiss" anim="Pico Down Note MISS" x="193" y="-40" fps="24" loop="false"/>
<anim name="singUPmiss" anim="pico Up note miss" x="-19" y="67" fps="24" loop="false"/>
<anim name="singRIGHTmiss" anim="Pico NOTE LEFT miss" x="-77" y="25" fps="24" loop="false"/>
</character>
+6 -6
View File
@@ -1,8 +1,8 @@
<!DOCTYPE codename-engine-character>
<character x="150" icon="senpai" camx="100" y="360" scale="6" camy="87" isPlayer="false" antialiasing="false" sprite="senpai" color="#FFAA6F">
<anim x="0" loop="false" y="0" fps="24" anim="Angry Senpai Idle" name="idle"/>
<anim x="4" loop="false" y="1" fps="24" anim="Angry Senpai LEFT NOTE" name="singLEFT"/>
<anim x="2" loop="false" y="0" fps="24" anim="Angry Senpai DOWN NOTE" name="singDOWN"/>
<anim x="1" loop="false" y="6" fps="24" anim="Angry Senpai UP NOTE" name="singUP"/>
<anim x="0" loop="false" y="0" fps="24" anim="Angry Senpai RIGHT NOTE" name="singRIGHT"/>
<character x="150" y="360" sprite="senpai" scale="6" antialiasing="false" camx="100" camy="87" icon="senpai" color="#FFAA6F">
<anim name="idle" anim="Angry Senpai Idle" x="0" y="0" fps="24" loop="false"/>
<anim name="singLEFT" anim="Angry Senpai LEFT NOTE" x="3" y="0" fps="24" loop="false"/>
<anim name="singDOWN" anim="Angry Senpai DOWN NOTE" x="-1" y="0" fps="24" loop="false"/>
<anim name="singUP" anim="Angry Senpai UP NOTE" x="0" y="6" fps="24" loop="false"/>
<anim name="singRIGHT" anim="Angry Senpai RIGHT NOTE" x="-1" y="0" fps="24" loop="false"/>
</character>
+8 -9
View File
@@ -1,10 +1,9 @@
<!DOCTYPE codename-engine-character>
<character isPlayer="false" flipX="false" x="150" y="360" antialiasing="false" scale="6" camx="100" camy="87" color="#FFAA6F">
<anim name="idle" anim="Senpai Idle" fps="12" loop="false" x="0" y="0" />
<!-- Offsets are actually multiplied by scale -->
<anim name="singLEFT" anim="SENPAI LEFT NOTE" fps="12" loop="false" x="7" y="0" />
<anim name="singDOWN" anim="SENPAI DOWN NOTE" fps="12" loop="false" x="2" y="0" />
<anim name="singUP" anim="SENPAI UP NOTE" fps="12" loop="false" x="1" y="6" />
<anim name="singRIGHT" anim="SENPAI RIGHT NOTE" fps="12" loop="false" x="0" y="0" />
</character>
<character x="150" y="360" sprite="senpai" scale="6" antialiasing="false" camx="100" camy="87" icon="senpai" color="#FFAA6F" interval="2">
<anim name="danceLeft" anim="Senpai Idle instance" x="0" y="0" fps="24" loop="false" indices="0..15"/>
<anim name="danceRight" anim="Senpai Idle instance" x="0" y="0" fps="24" loop="false" indices="16..31"/>
<anim name="singLEFT" anim="SENPAI LEFT NOTE" x="4" y="0" fps="24" loop="false"/>
<anim name="singDOWN" anim="SENPAI DOWN NOTE" x="0" y="0" fps="24" loop="false"/>
<anim name="singUP" anim="SENPAI UP NOTE" x="0" y="6" fps="24" loop="false"/>
<anim name="singRIGHT" anim="SENPAI RIGHT NOTE" x="0" y="0" fps="24" loop="false"/>
</character>
+7 -9
View File
@@ -1,10 +1,8 @@
<!DOCTYPE codename-engine-character>
<character isPlayer="false" flipX="false" x="70" y="380" antialiasing="false" scale="6" camx="100" color="#FF3C6E">
<anim name="idle" anim="idle spirit_" fps="24" loop="false" x="0" y="0" />
<!-- Offsets are actually multiplied by scale -->
<anim name="singLEFT" anim="left_" fps="24" loop="false" x="3" y="0" />
<anim name="singDOWN" anim="spirit down_" fps="24" loop="false" x="65" y="65" />
<anim name="singUP" anim="up_" fps="24" loop="false" x="0" y="7" />
<anim name="singRIGHT" anim="right_" fps="24" loop="false" x="0" y="0" />
</character>
<character x="70" y="380" sprite="spirit" scale="6" antialiasing="false" camx="100" icon="spirit" color="#FF3C6E">
<anim name="idle" anim="idle spirit_" x="0" y="1" fps="24" loop="false"/>
<anim name="singLEFT" anim="left_" x="4" y="-1" fps="24" loop="false"/>
<anim name="singDOWN" anim="spirit down_" x="66" y="64" fps="24" loop="false"/>
<anim name="singUP" anim="up_" x="-1" y="8" fps="24" loop="false"/>
<anim name="singRIGHT" anim="right_" x="-2" y="0" fps="24" loop="false"/>
</character>
+8 -8
View File
@@ -1,9 +1,9 @@
<!DOCTYPE codename-engine-character>
<character isPlayer="false" flipX="false" x="0" y="200" color="#C5995A">
<anim name="danceLeft" anim="spooky dance idle" fps="12" loop="false" x="0" y="0" indices="0,2,6"/>
<anim name="danceRight" anim="spooky dance idle" fps="12" loop="false" x="0" y="0" indices="8,10,12,14"/>
<anim name="singUP" anim="spooky UP NOTE" fps="24" loop="false" x="-20" y="26"/>
<anim name="singLEFT" anim="note sing left" fps="24" loop="false" x="130" y="-10"/>
<anim name="singRIGHT" anim="spooky sing right" fps="24" loop="false" x="-130" y="-14"/>
<anim name="singDOWN" anim="spooky DOWN note" fps="24" loop="false" x="-50" y="-130"/>
</character>
<character y="200" sprite="spooky" icon="spooky" color="#C5995A">
<anim name="danceLeft" anim="spooky dance idle" x="0" y="0" fps="24" loop="false" indices="0..6"/>
<anim name="danceRight" anim="spooky dance idle" x="0" y="0" fps="24" loop="false" indices="8..14"/>
<anim name="singUP" anim="spooky UP NOTE" x="-20" y="26" fps="24" loop="false"/>
<anim name="singLEFT" anim="note sing left" x="119" y="-11" fps="24" loop="false"/>
<anim name="singRIGHT" anim="spooky sing right" x="-150" y="-11" fps="24" loop="false"/>
<anim name="singDOWN" anim="spooky DOWN note" x="-77" y="-136" fps="24" loop="false"/>
</character>
+8 -8
View File
@@ -1,10 +1,10 @@
<!DOCTYPE codename-engine-character>
<character x="0" icon="tankman" y="180" flipX="true" isPlayer="true" sprite="tankman" color="#FFFFFF">
<anim x="0" loop="false" y="0" fps="24" anim="Tankman Idle Dance instance 100" name="idle"/>
<anim x="-1" loop="false" y="-7" fps="24" anim="Tankman Right Note instance 1000" name="singRIGHT"/>
<anim x="98" loop="false" y="-90" fps="24" anim="Tankman DOWN note instance 1000" name="singDOWN"/>
<anim x="24" loop="false" y="56" fps="24" anim="Tankman UP note instance 1000" name="singUP"/>
<anim x="100" loop="false" y="-14" fps="24" anim="Tankman Note Left instance 1000" name="singLEFT"/>
<anim x="98" loop="false" y="17" fps="24" anim="PRETTY GOOD tankman instance 100" name="good!"/>
<anim x="-16" loop="false" y="-9" fps="30" anim="TANKMAN UGH instance 100" name="singUP-alt"/>
<character y="180" sprite="tankman" flipX="true" isPlayer="true" icon="tankman" color="#FFFFFF">
<anim name="idle" anim="Tankman Idle Dance instance 100" x="0" y="0" fps="24" loop="false"/>
<anim name="singRIGHT" anim="Tankman Right Note instance 1000" x="-24" y="-13" fps="24" loop="false"/>
<anim name="singDOWN" anim="Tankman DOWN note instance 1000" x="75" y="-105" fps="24" loop="false"/>
<anim name="singUP" anim="Tankman UP note instance 1000" x="27" y="53" fps="24" loop="false"/>
<anim name="singLEFT" anim="Tankman Note Left instance 1000" x="92" y="-28" fps="24" loop="false"/>
<anim name="good!" anim="PRETTY GOOD tankman instance 100" x="100" y="17" fps="24" loop="false"/>
<anim name="singUP-alt" anim="TANKMAN UGH instance 100" x="-13" y="-9" fps="30" loop="false"/>
</character>
-7
View File
@@ -1,7 +0,0 @@
<!DOCTYPE codename-mod-credits>
<!-- TEMPLATE FOR CUSTOM CREDITS!!! -->
<menu name="Mod Credits" desc="Modify mod credits here">
<!-- \/ You can also set the portrait shader as false as you can see below in the github one -->
<credit name="Credit Example" desc="Click me to know more about me!" icon="credit icon example" size="130" url="https://youtu.be/fugtxz1znVw"/>
<github user="NexIsDumb" customName="Nex is Dumb" desc="The bitch who made these credits menus" size="100" portrait="false" color="#808080"/>
</menu>
-15
View File
@@ -1,15 +0,0 @@
<!DOCTYPE codename-mod-options>
<!-- TEMPLATE FOR CUSTOM OPTIONS!!! -->
<menu name="Mod Options" desc="Modify mod options here">
<checkbox id="checkboxExample" name="Checkbox example" />
<number id="numberExample" name="Number example" min="0" max="10" change="1"/>
<choice id="choiceExample" name="Choice Example">
<value name="Disabled" value="disabled"/>
<value name="This only" value="thisOnly"/>
<value name="All" value="all"/>
</choice>
<menu name="Submenu Example" desc="Submenu test">
<checkbox id="levelOfIdk2" name="Level of idk" />
</menu>
</menu>
+1 -1
View File
@@ -12,7 +12,7 @@ public var enablePauseMenu = true;
public var isSpooky = false;
var oldStageQuality = FlxG.game.stage.quality;
static var daPixelZoom = 6;
public var daPixelZoom = PlayState.daPixelZoom;
/**
* UI
+1 -1
View File
@@ -17,7 +17,7 @@ function create(event) {
// cancel default pause menu!!
event.cancel();
event.music = isThorns ? "pixel/LunchboxScary" : "pixel/Lunchbox";
event.music = isThorns ? "pixel/LunchboxScary" : "pixel/breakfast";
cameras = [];
+1 -1
View File
@@ -7,7 +7,7 @@
<anim name="danceRight" anim="gfDance" indices="15,16,17,18,19,20,21,22,23,24,25,26,27,28,29" />
</sprite>
<titleEnter sprite="titleEnter" x="-150" y="-100" />
<!-- <titleEnter sprite="titleEnter" x="100" y="576" /> --> <!-- FlxG.height * 0.8 -->
</sprites>
<intro length="16">
+3 -3
View File
@@ -1,5 +1,5 @@
<!DOCTYPE codename-engine-week-character>
<char scale="0.9" x="80">
<anim name="idle" anim="BF idle dance white" fps="24" loop="true" />
<anim name="confirm" anim="BF HEY!!" fps="24" loop="false"/>
<char scale="0.8" x="20" y="-20">
<anim name="idle" anim="BF idle dance white" fps="24" loop="false" forced="true"/>
<anim name="confirm" anim="BF HEY!!" fps="24" loop="false" type="none" y="4"/>
</char>
+1 -1
View File
@@ -1,2 +1,2 @@
<!DOCTYPE codename-engine-week-character>
<char scale="0.5" x="50" />
<char scale="0.49" x="50"/>
+1 -1
View File
@@ -1,2 +1,2 @@
<!DOCTYPE codename-engine-week-character>
<char scale="0.5" />
<char scale="0.5" x="-30" y="-10" beatInterval="2"/>
+1 -1
View File
@@ -1,2 +1,2 @@
<!DOCTYPE codename-engine-week-character>
<char scale="0.5" x="50" y="10"/>
<char scale="0.45" x="30" y="10"/>
@@ -1,2 +1,2 @@
<!DOCTYPE codename-engine-week-character>
<char scale="0.4" x="150" y="-20" />
<char scale="0.45" x="140" y="-10" />
@@ -0,0 +1,6 @@
<!DOCTYPE codename-engine-week-character>
<!-- Mainly just used in the official FNF Basegame port, but since we already have Pico Player in base CNE, who knows... (Yes I'm talking to y'all modders) -->
<char x="20" y="-10" sprite="menus/storymenu/characters/pico">
<anim name="idle" anim="idle" fps="24" loop="false" forced="true"/>
<anim name="confirm" anim="confirm" fps="24" loop="false" x="28" y="2" type="none"/>
</char>
+3 -1
View File
@@ -1,2 +1,4 @@
<!DOCTYPE codename-engine-week-character>
<char scale="0.7" x="100" y="-30" flip="true"/>
<char scale="0.65" x="70" y="-60" flipX="true">
<anim name="idle" anim="idle" fps="24" loop="false" forced="true"/>
</char>
+1 -1
View File
@@ -1,2 +1,2 @@
<!DOCTYPE codename-engine-week-character>
<char scale="0.7" x="125" />
<char scale="0.5" x="80" y="-50"/>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 105 KiB

+164 -159
View File
@@ -1,159 +1,164 @@
<?xml version="1.0" encoding="utf-8"?>
<TextureAtlas imagePath="senpai.png">
<!-- Created with Adobe Animate version 20.0.0.17400 -->
<!-- http://www.adobe.com/products/animate.html -->
<SubTexture name="Angry Senpai DOWN NOTE instance 10000" x="0" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai DOWN NOTE instance 10001" x="0" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai DOWN NOTE instance 10002" x="135" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai DOWN NOTE instance 10003" x="135" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai DOWN NOTE instance 10004" x="135" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai DOWN NOTE instance 10005" x="135" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai DOWN NOTE instance 10006" x="135" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai DOWN NOTE instance 10007" x="135" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai DOWN NOTE instance 10008" x="135" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai DOWN NOTE instance 10009" x="135" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai DOWN NOTE instance 10010" x="135" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai DOWN NOTE instance 10011" x="135" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai DOWN NOTE instance 10012" x="135" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai DOWN NOTE instance 10013" x="135" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai Idle instance 10000" x="270" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai Idle instance 10001" x="270" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai Idle instance 10002" x="405" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai Idle instance 10003" x="405" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai Idle instance 10004" x="540" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai Idle instance 10005" x="540" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai Idle instance 10006" x="675" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai Idle instance 10007" x="675" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai Idle instance 10008" x="810" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai Idle instance 10009" x="810" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai Idle instance 10010" x="810" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai Idle instance 10011" x="810" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai Idle instance 10012" x="810" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai Idle instance 10013" x="810" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai LEFT NOTE instance 10000" x="945" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai LEFT NOTE instance 10001" x="945" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai LEFT NOTE instance 10002" x="1080" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai LEFT NOTE instance 10003" x="1080" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai LEFT NOTE instance 10004" x="1080" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai LEFT NOTE instance 10005" x="1080" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai LEFT NOTE instance 10006" x="1080" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai LEFT NOTE instance 10007" x="1080" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai LEFT NOTE instance 10008" x="1080" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai LEFT NOTE instance 10009" x="1080" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai LEFT NOTE instance 10010" x="1080" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai LEFT NOTE instance 10011" x="1080" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai LEFT NOTE instance 10012" x="1080" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai LEFT NOTE instance 10013" x="1080" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai RIGHT NOTE instance 10000" x="1215" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai RIGHT NOTE instance 10001" x="1215" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai RIGHT NOTE instance 10002" x="1350" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai RIGHT NOTE instance 10003" x="1350" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai RIGHT NOTE instance 10004" x="1350" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai RIGHT NOTE instance 10005" x="1350" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai RIGHT NOTE instance 10006" x="1350" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai RIGHT NOTE instance 10007" x="1350" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai RIGHT NOTE instance 10008" x="1350" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai RIGHT NOTE instance 10009" x="1350" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai RIGHT NOTE instance 10010" x="1350" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai RIGHT NOTE instance 10011" x="1350" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai RIGHT NOTE instance 10012" x="1350" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai RIGHT NOTE instance 10013" x="1350" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai UP NOTE instance 10000" x="1485" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai UP NOTE instance 10001" x="1485" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai UP NOTE instance 10002" x="1620" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai UP NOTE instance 10003" x="1620" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai UP NOTE instance 10004" x="1620" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai UP NOTE instance 10005" x="1620" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai UP NOTE instance 10006" x="1620" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai UP NOTE instance 10007" x="1620" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai UP NOTE instance 10008" x="1620" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai UP NOTE instance 10009" x="1620" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai UP NOTE instance 10010" x="1620" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai UP NOTE instance 10011" x="1620" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai UP NOTE instance 10012" x="1620" y="0" width="125" height="164"/>
<SubTexture name="Angry Senpai UP NOTE instance 10013" x="1620" y="0" width="125" height="164"/>
<SubTexture name="SENPAI DOWN NOTE instance 10000" x="1755" y="0" width="125" height="163"/>
<SubTexture name="SENPAI DOWN NOTE instance 10001" x="1755" y="0" width="125" height="163"/>
<SubTexture name="SENPAI DOWN NOTE instance 10002" x="1890" y="0" width="125" height="163"/>
<SubTexture name="SENPAI DOWN NOTE instance 10003" x="1890" y="0" width="125" height="163"/>
<SubTexture name="SENPAI DOWN NOTE instance 10004" x="1890" y="0" width="125" height="163"/>
<SubTexture name="SENPAI DOWN NOTE instance 10005" x="1890" y="0" width="125" height="163"/>
<SubTexture name="SENPAI DOWN NOTE instance 10006" x="1890" y="0" width="125" height="163"/>
<SubTexture name="SENPAI DOWN NOTE instance 10007" x="1890" y="0" width="125" height="163"/>
<SubTexture name="SENPAI DOWN NOTE instance 10008" x="1890" y="0" width="125" height="163"/>
<SubTexture name="SENPAI DOWN NOTE instance 10009" x="1890" y="0" width="125" height="163"/>
<SubTexture name="SENPAI DOWN NOTE instance 10010" x="1890" y="0" width="125" height="163"/>
<SubTexture name="SENPAI DOWN NOTE instance 10011" x="1890" y="0" width="125" height="163"/>
<SubTexture name="SENPAI DOWN NOTE instance 10012" x="1890" y="0" width="125" height="163"/>
<SubTexture name="SENPAI DOWN NOTE instance 10013" x="1890" y="0" width="125" height="163"/>
<SubTexture name="SENPAI LEFT NOTE instance 10000" x="0" y="174" width="125" height="163"/>
<SubTexture name="SENPAI LEFT NOTE instance 10001" x="0" y="174" width="125" height="163"/>
<SubTexture name="SENPAI LEFT NOTE instance 10002" x="135" y="174" width="125" height="163"/>
<SubTexture name="SENPAI LEFT NOTE instance 10003" x="135" y="174" width="125" height="163"/>
<SubTexture name="SENPAI LEFT NOTE instance 10004" x="135" y="174" width="125" height="163"/>
<SubTexture name="SENPAI LEFT NOTE instance 10005" x="135" y="174" width="125" height="163"/>
<SubTexture name="SENPAI LEFT NOTE instance 10006" x="135" y="174" width="125" height="163"/>
<SubTexture name="SENPAI LEFT NOTE instance 10007" x="135" y="174" width="125" height="163"/>
<SubTexture name="SENPAI LEFT NOTE instance 10008" x="135" y="174" width="125" height="163"/>
<SubTexture name="SENPAI LEFT NOTE instance 10009" x="135" y="174" width="125" height="163"/>
<SubTexture name="SENPAI LEFT NOTE instance 10010" x="135" y="174" width="125" height="163"/>
<SubTexture name="SENPAI LEFT NOTE instance 10011" x="135" y="174" width="125" height="163"/>
<SubTexture name="SENPAI LEFT NOTE instance 10012" x="135" y="174" width="125" height="163"/>
<SubTexture name="SENPAI LEFT NOTE instance 10013" x="135" y="174" width="125" height="163"/>
<SubTexture name="SENPAI RIGHT NOTE instance 10000" x="270" y="174" width="125" height="163"/>
<SubTexture name="SENPAI RIGHT NOTE instance 10001" x="270" y="174" width="125" height="163"/>
<SubTexture name="SENPAI RIGHT NOTE instance 10002" x="405" y="174" width="125" height="163"/>
<SubTexture name="SENPAI RIGHT NOTE instance 10003" x="405" y="174" width="125" height="163"/>
<SubTexture name="SENPAI RIGHT NOTE instance 10004" x="405" y="174" width="125" height="163"/>
<SubTexture name="SENPAI RIGHT NOTE instance 10005" x="405" y="174" width="125" height="163"/>
<SubTexture name="SENPAI RIGHT NOTE instance 10006" x="405" y="174" width="125" height="163"/>
<SubTexture name="SENPAI RIGHT NOTE instance 10007" x="405" y="174" width="125" height="163"/>
<SubTexture name="SENPAI RIGHT NOTE instance 10008" x="405" y="174" width="125" height="163"/>
<SubTexture name="SENPAI RIGHT NOTE instance 10009" x="405" y="174" width="125" height="163"/>
<SubTexture name="SENPAI RIGHT NOTE instance 10010" x="405" y="174" width="125" height="163"/>
<SubTexture name="SENPAI RIGHT NOTE instance 10011" x="405" y="174" width="125" height="163"/>
<SubTexture name="SENPAI RIGHT NOTE instance 10012" x="405" y="174" width="125" height="163"/>
<SubTexture name="SENPAI RIGHT NOTE instance 10013" x="405" y="174" width="125" height="163"/>
<SubTexture name="SENPAI UP NOTE instance 10000" x="540" y="174" width="125" height="163"/>
<SubTexture name="SENPAI UP NOTE instance 10001" x="540" y="174" width="125" height="163"/>
<SubTexture name="SENPAI UP NOTE instance 10002" x="675" y="174" width="125" height="163"/>
<SubTexture name="SENPAI UP NOTE instance 10003" x="675" y="174" width="125" height="163"/>
<SubTexture name="SENPAI UP NOTE instance 10004" x="675" y="174" width="125" height="163"/>
<SubTexture name="SENPAI UP NOTE instance 10005" x="675" y="174" width="125" height="163"/>
<SubTexture name="SENPAI UP NOTE instance 10006" x="675" y="174" width="125" height="163"/>
<SubTexture name="SENPAI UP NOTE instance 10007" x="675" y="174" width="125" height="163"/>
<SubTexture name="SENPAI UP NOTE instance 10008" x="675" y="174" width="125" height="163"/>
<SubTexture name="SENPAI UP NOTE instance 10009" x="675" y="174" width="125" height="163"/>
<SubTexture name="SENPAI UP NOTE instance 10010" x="675" y="174" width="125" height="163"/>
<SubTexture name="SENPAI UP NOTE instance 10011" x="675" y="174" width="125" height="163"/>
<SubTexture name="SENPAI UP NOTE instance 10012" x="675" y="174" width="125" height="163"/>
<SubTexture name="SENPAI UP NOTE instance 10013" x="675" y="174" width="125" height="163"/>
<SubTexture name="Senpai Idle instance 10000" x="810" y="174" width="124" height="163"/>
<SubTexture name="Senpai Idle instance 10001" x="810" y="174" width="124" height="163"/>
<SubTexture name="Senpai Idle instance 10002" x="944" y="174" width="124" height="163"/>
<SubTexture name="Senpai Idle instance 10003" x="944" y="174" width="124" height="163"/>
<SubTexture name="Senpai Idle instance 10004" x="1078" y="174" width="124" height="163"/>
<SubTexture name="Senpai Idle instance 10005" x="1078" y="174" width="124" height="163"/>
<SubTexture name="Senpai Idle instance 10006" x="1212" y="174" width="124" height="163"/>
<SubTexture name="Senpai Idle instance 10007" x="1212" y="174" width="124" height="163"/>
<SubTexture name="Senpai Idle instance 10008" x="1346" y="174" width="124" height="163"/>
<SubTexture name="Senpai Idle instance 10009" x="1346" y="174" width="124" height="163"/>
<SubTexture name="Senpai Idle instance 10010" x="1480" y="174" width="124" height="163"/>
<SubTexture name="Senpai Idle instance 10011" x="1480" y="174" width="124" height="163"/>
<SubTexture name="Senpai Idle instance 10012" x="1614" y="174" width="124" height="163"/>
<SubTexture name="Senpai Idle instance 10013" x="1748" y="174" width="124" height="163"/>
<SubTexture name="Senpai Idle instance 10014" x="1882" y="174" width="124" height="163"/>
<SubTexture name="Senpai Idle instance 10015" x="0" y="347" width="124" height="163"/>
<SubTexture name="Senpai Idle instance 10016" x="134" y="347" width="124" height="163"/>
<SubTexture name="Senpai Idle instance 10017" x="268" y="347" width="124" height="163"/>
<SubTexture name="Senpai Idle instance 10018" x="402" y="347" width="124" height="163"/>
<SubTexture name="Senpai Idle instance 10019" x="536" y="347" width="124" height="163"/>
<SubTexture name="Senpai Idle instance 10020" x="670" y="347" width="124" height="163"/>
<SubTexture name="Senpai Idle instance 10021" x="804" y="347" width="124" height="163"/>
<SubTexture name="Senpai Idle instance 10022" x="938" y="347" width="124" height="163"/>
<SubTexture name="Senpai Idle instance 10023" x="1480" y="174" width="124" height="163"/>
<SubTexture name="Senpai Idle instance 10024" x="1480" y="174" width="124" height="163"/>
<SubTexture name="Senpai Idle instance 10025" x="1614" y="174" width="124" height="163"/>
<SubTexture name="Senpai Idle instance 10026" x="1072" y="347" width="124" height="163"/>
<SubTexture name="Senpai Idle instance 10027" x="1206" y="347" width="124" height="163"/>
</TextureAtlas>
<?xml version="1.0" encoding="UTF-8"?>
<!--
Created with Funkin Packer v0.1.3 DEV https://neeeoo.github.io/funkin-packer/
-->
<TextureAtlas imagePath="senpai-test.png" width="547" height="611" spritePadding="4" borderPadding="4">
<SubTexture name="Angry Senpai DOWN NOTE instance 0000" x="411" y="478" width="59" height="107" frameX="-28" frameY="-39" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai DOWN NOTE instance 0001" x="411" y="478" width="59" height="107" frameX="-28" frameY="-39" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai DOWN NOTE instance 0002" x="283" y="479" width="58" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai DOWN NOTE instance 0003" x="283" y="479" width="58" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai DOWN NOTE instance 0004" x="283" y="479" width="58" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai DOWN NOTE instance 0005" x="283" y="479" width="58" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai DOWN NOTE instance 0006" x="283" y="479" width="58" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai DOWN NOTE instance 0007" x="283" y="479" width="58" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai DOWN NOTE instance 0008" x="283" y="479" width="58" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai DOWN NOTE instance 0009" x="283" y="479" width="58" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai DOWN NOTE instance 0010" x="283" y="479" width="58" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai DOWN NOTE instance 0011" x="283" y="479" width="58" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai DOWN NOTE instance 0012" x="283" y="479" width="58" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai DOWN NOTE instance 0013" x="283" y="479" width="58" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai Idle instance 0000" x="417" y="356" width="66" height="112" frameX="-28" frameY="-34" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai Idle instance 0001" x="417" y="356" width="66" height="112" frameX="-28" frameY="-34" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai Idle instance 0002" x="478" y="239" width="63" height="112" frameX="-29" frameY="-34" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai Idle instance 0003" x="478" y="239" width="63" height="112" frameX="-29" frameY="-34" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai Idle instance 0004" x="409" y="122" width="63" height="113" frameX="-29" frameY="-33" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai Idle instance 0005" x="409" y="122" width="63" height="113" frameX="-29" frameY="-33" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai Idle instance 0006" x="134" y="4" width="67" height="116" frameX="-29" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai Idle instance 0007" x="134" y="4" width="67" height="116" frameX="-29" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai Idle instance 0008" x="146" y="244" width="67" height="115" frameX="-29" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai Idle instance 0009" x="146" y="244" width="67" height="115" frameX="-29" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai Idle instance 0010" x="146" y="244" width="67" height="115" frameX="-29" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai Idle instance 0011" x="146" y="244" width="67" height="115" frameX="-29" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai Idle instance 0012" x="146" y="244" width="67" height="115" frameX="-29" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai Idle instance 0013" x="146" y="244" width="67" height="115" frameX="-29" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai LEFT NOTE instance 0000" x="205" y="4" width="55" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai LEFT NOTE instance 0001" x="205" y="4" width="55" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai LEFT NOTE instance 0002" x="213" y="123" width="57" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai LEFT NOTE instance 0003" x="213" y="123" width="57" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai LEFT NOTE instance 0004" x="213" y="123" width="57" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai LEFT NOTE instance 0005" x="213" y="123" width="57" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai LEFT NOTE instance 0006" x="213" y="123" width="57" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai LEFT NOTE instance 0007" x="213" y="123" width="57" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai LEFT NOTE instance 0008" x="213" y="123" width="57" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai LEFT NOTE instance 0009" x="213" y="123" width="57" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai LEFT NOTE instance 0010" x="213" y="123" width="57" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai LEFT NOTE instance 0011" x="213" y="123" width="57" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai LEFT NOTE instance 0012" x="213" y="123" width="57" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai LEFT NOTE instance 0013" x="213" y="123" width="57" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai RIGHT NOTE instance 0000" x="146" y="363" width="62" height="114" frameX="-32" frameY="-32" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai RIGHT NOTE instance 0001" x="146" y="363" width="62" height="114" frameX="-32" frameY="-32" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai RIGHT NOTE instance 0002" x="345" y="123" width="60" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai RIGHT NOTE instance 0003" x="345" y="123" width="60" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai RIGHT NOTE instance 0004" x="345" y="123" width="60" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai RIGHT NOTE instance 0005" x="345" y="123" width="60" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai RIGHT NOTE instance 0006" x="345" y="123" width="60" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai RIGHT NOTE instance 0007" x="345" y="123" width="60" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai RIGHT NOTE instance 0008" x="345" y="123" width="60" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai RIGHT NOTE instance 0009" x="345" y="123" width="60" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai RIGHT NOTE instance 0010" x="345" y="123" width="60" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai RIGHT NOTE instance 0011" x="345" y="123" width="60" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai RIGHT NOTE instance 0012" x="345" y="123" width="60" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai RIGHT NOTE instance 0013" x="345" y="123" width="60" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai UP NOTE instance 0000" x="4" y="4" width="60" height="122" frameX="-28" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai UP NOTE instance 0001" x="4" y="4" width="60" height="122" frameX="-28" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai UP NOTE instance 0002" x="68" y="4" width="62" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai UP NOTE instance 0003" x="68" y="4" width="62" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai UP NOTE instance 0004" x="68" y="4" width="62" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai UP NOTE instance 0005" x="68" y="4" width="62" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai UP NOTE instance 0006" x="68" y="4" width="62" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai UP NOTE instance 0007" x="68" y="4" width="62" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai UP NOTE instance 0008" x="68" y="4" width="62" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai UP NOTE instance 0009" x="68" y="4" width="62" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai UP NOTE instance 0010" x="68" y="4" width="62" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai UP NOTE instance 0011" x="68" y="4" width="62" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai UP NOTE instance 0012" x="68" y="4" width="62" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="Angry Senpai UP NOTE instance 0013" x="68" y="4" width="62" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI DOWN NOTE instance 0000" x="474" y="472" width="63" height="107" frameX="-28" frameY="-39" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI DOWN NOTE instance 0001" x="474" y="472" width="63" height="107" frameX="-28" frameY="-39" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI DOWN NOTE instance 0002" x="345" y="479" width="62" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI DOWN NOTE instance 0003" x="345" y="479" width="62" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI DOWN NOTE instance 0004" x="345" y="479" width="62" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI DOWN NOTE instance 0005" x="345" y="479" width="62" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI DOWN NOTE instance 0006" x="345" y="479" width="62" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI DOWN NOTE instance 0007" x="345" y="479" width="62" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI DOWN NOTE instance 0008" x="345" y="479" width="62" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI DOWN NOTE instance 0009" x="345" y="479" width="62" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI DOWN NOTE instance 0010" x="345" y="479" width="62" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI DOWN NOTE instance 0011" x="345" y="479" width="62" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI DOWN NOTE instance 0012" x="345" y="479" width="62" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI DOWN NOTE instance 0013" x="345" y="479" width="62" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI LEFT NOTE instance 0000" x="264" y="4" width="59" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI LEFT NOTE instance 0001" x="264" y="4" width="59" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI LEFT NOTE instance 0002" x="217" y="242" width="61" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI LEFT NOTE instance 0003" x="217" y="242" width="61" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI LEFT NOTE instance 0004" x="217" y="242" width="61" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI LEFT NOTE instance 0005" x="217" y="242" width="61" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI LEFT NOTE instance 0006" x="217" y="242" width="61" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI LEFT NOTE instance 0007" x="217" y="242" width="61" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI LEFT NOTE instance 0008" x="217" y="242" width="61" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI LEFT NOTE instance 0009" x="217" y="242" width="61" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI LEFT NOTE instance 0010" x="217" y="242" width="61" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI LEFT NOTE instance 0011" x="217" y="242" width="61" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI LEFT NOTE instance 0012" x="217" y="242" width="61" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI LEFT NOTE instance 0013" x="217" y="242" width="61" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI RIGHT NOTE instance 0000" x="212" y="363" width="65" height="114" frameX="-32" frameY="-32" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI RIGHT NOTE instance 0001" x="212" y="363" width="65" height="114" frameX="-32" frameY="-32" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI RIGHT NOTE instance 0002" x="281" y="361" width="63" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI RIGHT NOTE instance 0003" x="281" y="361" width="63" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI RIGHT NOTE instance 0004" x="281" y="361" width="63" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI RIGHT NOTE instance 0005" x="281" y="361" width="63" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI RIGHT NOTE instance 0006" x="281" y="361" width="63" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI RIGHT NOTE instance 0007" x="281" y="361" width="63" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI RIGHT NOTE instance 0008" x="281" y="361" width="63" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI RIGHT NOTE instance 0009" x="281" y="361" width="63" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI RIGHT NOTE instance 0010" x="281" y="361" width="63" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI RIGHT NOTE instance 0011" x="281" y="361" width="63" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI RIGHT NOTE instance 0012" x="281" y="361" width="63" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI RIGHT NOTE instance 0013" x="281" y="361" width="63" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI UP NOTE instance 0000" x="4" y="130" width="64" height="122" frameX="-28" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI UP NOTE instance 0001" x="4" y="130" width="64" height="122" frameX="-28" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI UP NOTE instance 0002" x="72" y="130" width="66" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI UP NOTE instance 0003" x="72" y="130" width="66" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI UP NOTE instance 0004" x="72" y="130" width="66" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI UP NOTE instance 0005" x="72" y="130" width="66" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI UP NOTE instance 0006" x="72" y="130" width="66" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI UP NOTE instance 0007" x="72" y="130" width="66" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI UP NOTE instance 0008" x="72" y="130" width="66" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI UP NOTE instance 0009" x="72" y="130" width="66" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI UP NOTE instance 0010" x="72" y="130" width="66" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI UP NOTE instance 0011" x="72" y="130" width="66" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI UP NOTE instance 0012" x="72" y="130" width="66" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="SENPAI UP NOTE instance 0013" x="72" y="130" width="66" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0000" x="4" y="495" width="66" height="112" frameX="-27" frameY="-34" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0001" x="4" y="495" width="66" height="112" frameX="-27" frameY="-34" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0002" x="409" y="239" width="65" height="113" frameX="-28" frameY="-33" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0003" x="409" y="239" width="65" height="113" frameX="-28" frameY="-33" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0004" x="409" y="4" width="65" height="114" frameX="-28" frameY="-32" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0005" x="409" y="4" width="65" height="114" frameX="-28" frameY="-32" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0006" x="142" y="124" width="67" height="116" frameX="-28" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0007" x="142" y="124" width="67" height="116" frameX="-28" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0008" x="274" y="123" width="67" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0009" x="274" y="123" width="67" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0010" x="327" y="4" width="67" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0011" x="327" y="4" width="67" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0012" x="282" y="242" width="67" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0013" x="282" y="242" width="67" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0014" x="4" y="376" width="67" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0015" x="4" y="376" width="67" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0016" x="74" y="495" width="66" height="112" frameX="-27" frameY="-34" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0017" x="74" y="495" width="66" height="112" frameX="-27" frameY="-34" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0018" x="144" y="495" width="66" height="112" frameX="-27" frameY="-34" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0019" x="478" y="4" width="65" height="112" frameX="-28" frameY="-34" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0020" x="214" y="481" width="65" height="112" frameX="-28" frameY="-34" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0021" x="348" y="361" width="65" height="113" frameX="-28" frameY="-33" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0022" x="476" y="122" width="65" height="113" frameX="-28" frameY="-33" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0023" x="4" y="256" width="67" height="116" frameX="-28" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0024" x="75" y="256" width="67" height="116" frameX="-28" frameY="-30" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0025" x="75" y="376" width="67" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0026" x="327" y="4" width="67" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0027" x="327" y="4" width="67" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0028" x="282" y="242" width="67" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0029" x="282" y="242" width="67" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0030" x="4" y="376" width="67" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
<SubTexture name="Senpai Idle instance 0031" x="4" y="376" width="67" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
</TextureAtlas>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

After

Width:  |  Height:  |  Size: 111 KiB

@@ -1,19 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<TextureAtlas imagePath="pico.png">
<!-- Created with Adobe Animate version 21.0.1.37179 -->
<!-- http://www.adobe.com/products/animate.html -->
<SubTexture name="Pico Idle Dance0000" x="2" y="2" width="435" height="461" pivotX="0" pivotY="0" frameX="-18" frameY="-13" frameWidth="453" frameHeight="475"/>
<SubTexture name="Pico Idle Dance0001" x="2" y="2" width="435" height="461" frameX="-18" frameY="-13" frameWidth="453" frameHeight="475"/>
<SubTexture name="Pico Idle Dance0002" x="439" y="2" width="442" height="468" frameX="-11" frameY="-6" frameWidth="453" frameHeight="475"/>
<SubTexture name="Pico Idle Dance0003" x="439" y="2" width="442" height="468" frameX="-11" frameY="-6" frameWidth="453" frameHeight="475"/>
<SubTexture name="Pico Idle Dance0004" x="883" y="2" width="448" height="469" frameX="-1" frameY="-6" frameWidth="453" frameHeight="475"/>
<SubTexture name="Pico Idle Dance0005" x="1333" y="2" width="444" height="469" frameX="-1" frameY="-6" frameWidth="453" frameHeight="475"/>
<SubTexture name="Pico Idle Dance0006" x="2" y="473" width="444" height="474" frameX="-1" frameY="-1" frameWidth="453" frameHeight="475"/>
<SubTexture name="Pico Idle Dance0007" x="448" y="473" width="442" height="474" frameX="-1" frameY="-1" frameWidth="453" frameHeight="475"/>
<SubTexture name="Pico Idle Dance0008" x="892" y="473" width="443" height="475" frameX="0" frameY="0" frameWidth="453" frameHeight="475"/>
<SubTexture name="Pico Idle Dance0009" x="892" y="473" width="443" height="475" frameX="0" frameY="0" frameWidth="453" frameHeight="475"/>
<SubTexture name="Pico Idle Dance0010" x="892" y="473" width="443" height="475" frameX="0" frameY="0" frameWidth="453" frameHeight="475"/>
<SubTexture name="Pico Idle Dance0011" x="892" y="473" width="443" height="475" frameX="0" frameY="0" frameWidth="453" frameHeight="475"/>
<SubTexture name="Pico Idle Dance0012" x="892" y="473" width="443" height="475" frameX="0" frameY="0" frameWidth="453" frameHeight="475"/>
<SubTexture name="Pico Idle Dance0013" x="892" y="473" width="443" height="475" frameX="0" frameY="0" frameWidth="453" frameHeight="475"/>
<?xml version="1.0" encoding="UTF-8"?>
<!--
Created with Free texture packer v0.6.7 http://free-tex-packer.com
-->
<TextureAtlas imagePath="pico-player.png" width="1961" height="741">
<SubTexture name="confirm0001" x="1158" y="366" width="395" height="367" frameX="-1" frameY="-0" frameWidth="396" frameHeight="368" />
<SubTexture name="confirm0002" x="1158" y="366" width="395" height="367" frameX="-1" frameY="-0" frameWidth="396" frameHeight="368" />
<SubTexture name="confirm0003" x="766" y="366" width="376" height="365" frameX="-0" frameY="-3" frameWidth="396" frameHeight="368" />
<SubTexture name="confirm0004" x="766" y="366" width="376" height="365" frameX="-0" frameY="-3" frameWidth="396" frameHeight="368" />
<SubTexture name="confirm0005" x="1569" y="366" width="384" height="367" frameX="-0" frameY="-1" frameWidth="396" frameHeight="368" />
<SubTexture name="confirm0006" x="1569" y="366" width="384" height="367" frameX="-0" frameY="-1" frameWidth="396" frameHeight="368" />
<SubTexture name="confirm0007" x="1569" y="366" width="384" height="367" frameX="-0" frameY="-1" frameWidth="396" frameHeight="368" />
<SubTexture name="confirm0008" x="1569" y="366" width="384" height="367" frameX="-0" frameY="-1" frameWidth="396" frameHeight="368" />
<SubTexture name="confirm0009" x="1569" y="366" width="384" height="367" frameX="-0" frameY="-1" frameWidth="396" frameHeight="368" />
<SubTexture name="confirm0010" x="1569" y="366" width="384" height="367" frameX="-0" frameY="-1" frameWidth="396" frameHeight="368" />
<SubTexture name="confirm0011" x="1569" y="366" width="384" height="367" frameX="-0" frameY="-1" frameWidth="396" frameHeight="368" />
<SubTexture name="confirm0012" x="1569" y="366" width="384" height="367" frameX="-0" frameY="-1" frameWidth="396" frameHeight="368" />
<SubTexture name="confirm0013" x="1569" y="366" width="384" height="367" frameX="-0" frameY="-1" frameWidth="396" frameHeight="368" />
<SubTexture name="confirm0014" x="1569" y="366" width="384" height="367" frameX="-0" frameY="-1" frameWidth="396" frameHeight="368" />
<SubTexture name="confirm0015" x="1569" y="366" width="384" height="367" frameX="-0" frameY="-1" frameWidth="396" frameHeight="368" />
<SubTexture name="confirm0016" x="1569" y="366" width="384" height="367" frameX="-0" frameY="-1" frameWidth="396" frameHeight="368" />
<SubTexture name="confirm0017" x="1569" y="366" width="384" height="367" frameX="-0" frameY="-1" frameWidth="396" frameHeight="368" />
<SubTexture name="confirm0018" x="1569" y="366" width="384" height="367" frameX="-0" frameY="-1" frameWidth="396" frameHeight="368" />
<SubTexture name="confirm0019" x="1569" y="366" width="384" height="367" frameX="-0" frameY="-1" frameWidth="396" frameHeight="368" />
<SubTexture name="confirm0020" x="1569" y="366" width="384" height="367" frameX="-0" frameY="-1" frameWidth="396" frameHeight="368" />
<SubTexture name="confirm0021" x="1569" y="366" width="384" height="367" frameX="-0" frameY="-1" frameWidth="396" frameHeight="368" />
<SubTexture name="confirm0022" x="1569" y="366" width="384" height="367" frameX="-0" frameY="-1" frameWidth="396" frameHeight="368" />
<SubTexture name="confirm0023" x="1569" y="366" width="384" height="367" frameX="-0" frameY="-1" frameWidth="396" frameHeight="368" />
<SubTexture name="confirm0024" x="1569" y="366" width="384" height="367" frameX="-0" frameY="-1" frameWidth="396" frameHeight="368" />
<SubTexture name="confirm0025" x="1569" y="366" width="384" height="367" frameX="-0" frameY="-1" frameWidth="396" frameHeight="368" />
<SubTexture name="confirm0026" x="1569" y="366" width="384" height="367" frameX="-0" frameY="-1" frameWidth="396" frameHeight="368" />
<SubTexture name="idle0001" x="8" y="8" width="355" height="335" rotated="true" frameX="-14" frameY="-10" frameWidth="349" frameHeight="366" />
<SubTexture name="idle0002" x="8" y="8" width="355" height="335" rotated="true" frameX="-14" frameY="-10" frameWidth="349" frameHeight="366" />
<SubTexture name="idle0003" x="379" y="8" width="361" height="341" rotated="true" frameX="-8" frameY="-5" frameWidth="349" frameHeight="366" />
<SubTexture name="idle0004" x="379" y="8" width="361" height="341" rotated="true" frameX="-8" frameY="-5" frameWidth="349" frameHeight="366" />
<SubTexture name="idle0005" x="389" y="366" width="361" height="345" rotated="true" frameX="-1" frameY="-5" frameWidth="349" frameHeight="366" />
<SubTexture name="idle0006" x="756" y="8" width="361" height="342" rotated="true" frameX="-1" frameY="-5" frameWidth="349" frameHeight="366" />
<SubTexture name="idle0007" x="8" y="365" width="365" height="343" rotated="true" frameX="-0" frameY="-1" frameWidth="349" frameHeight="366" />
<SubTexture name="idle0008" x="1133" y="8" width="365" height="342" rotated="true" frameX="-0" frameY="-1" frameWidth="349" frameHeight="366" />
<SubTexture name="idle0009" x="1514" y="8" width="366" height="342" rotated="true" frameX="-0" frameY="-0" frameWidth="349" frameHeight="366" />
<SubTexture name="idle0010" x="1514" y="8" width="366" height="342" rotated="true" frameX="-0" frameY="-0" frameWidth="349" frameHeight="366" />
<SubTexture name="idle0011" x="1514" y="8" width="366" height="342" rotated="true" frameX="-0" frameY="-0" frameWidth="349" frameHeight="366" />
<SubTexture name="idle0012" x="1514" y="8" width="366" height="342" rotated="true" frameX="-0" frameY="-0" frameWidth="349" frameHeight="366" />
<SubTexture name="idle0013" x="1514" y="8" width="366" height="342" rotated="true" frameX="-0" frameY="-0" frameWidth="349" frameHeight="366" />
<SubTexture name="idle0014" x="1514" y="8" width="366" height="342" rotated="true" frameX="-0" frameY="-0" frameWidth="349" frameHeight="366" />
</TextureAtlas>
Binary file not shown.
Binary file not shown.
-3
View File
@@ -1,3 +0,0 @@
THOSE SHADERS ARE USED INTERNALLY BY THE ENGINE
MODIFY THEM AT YOUR OWN RISK!! IF IT CRASHES IT AINT MY FAULT
+7 -9
View File
@@ -3,19 +3,17 @@
// Used for editors
int steps = 16;
int stepsInside = 2;
float strength = 0.0075;
const int steps = 16;
const int stepsInside = 2;
const float strength = 0.0075;
vec4 getColor(vec2 pos) {
vec2 ps = (pos);
ps = clamp(ps, vec2(0.0), 1.0 - (1.0 / openfl_TextureSize.xy));
return flixel_texture2D(bitmap, (ps));
pos = clamp(pos, vec2(0.0), vec2(1.0));//1.0 - (1.0 / openfl_TextureSize.xy));
return flixel_texture2D(bitmap, pos);
}
void main() {
// vec2 camPos = getCamPos(openfl_TextureCoordv);
vec2 camPos = openfl_TextureCoordv;
if (camPos.x < 0.0 || camPos.x > 1.0 || camPos.y < 0.0 || camPos.y > 1.0)
return;
vec4 color = getColor(camPos);
float fsteps = float(steps);
+15 -39
View File
@@ -2,53 +2,29 @@
// Used for editors (faster)
//#define iResolution _camSize
#define getTexture textureCam
#define iResolution openfl_TextureSize
//#define getTexture flixel_texture2D
float uBlur = 0.015;
float uBrightness = 0.6;
const float uBlur = 0.015;
const float uBrightness = 0.6;
vec4 getColor(vec2 pos) {
vec2 ps = (pos);
ps = clamp(ps, vec2(0.0), vec2(1.0));//1.0 - (1.0 / iResolution.xy));
return flixel_texture2D(bitmap, (ps));
pos = clamp(pos, vec2(0.0), vec2(1.0));//1.0 - (1.0 / openfl_TextureSize.xy));
return flixel_texture2D(bitmap, pos);
}
/*vec2 fixvec2(float x, float y) { // makes an uv the same across sizes
vec2 val = vec2(x, y);
val.xy *= vec2(1280.0, 720.0);
val.xy /= iResolution.xy;
return val;
}
vec2 fixvec2(vec2 uv) { // makes an uv the same across sizes
vec2 val = uv;
val.xy *= vec2(1280.0, 720.0);
val.xy /= iResolution.xy;
return val;
}*/
uniform sampler2D noiseTexture;
uniform vec2 noiseTextureSize;
vec2 random(vec2 p) {
p = vec2(dot(p,vec2(127.1,311.7)),dot(p,vec2(269.5,183.3)));
return fract(sin(p)*4375.5);
p *= openfl_TextureSize;
return texture2D(noiseTexture, p / noiseTextureSize).rg - vec2(0.5);
}
void main() {
vec2 camPos = (openfl_TextureCoordv);
//vec2 camPos = openfl_TextureCoordv;
if (camPos.x < 0.0 || camPos.x > 1.0 || camPos.y < 0.0 || camPos.y > 1.0)
return;
vec2 camPos = openfl_TextureCoordv;
vec2 blur = vec2(uBlur) * vec2(1.0, openfl_TextureSize.x / openfl_TextureSize.y);
//vec4 color = getColor(camPos);
vec2 blur = vec2(uBlur) * vec2(1.0, iResolution.x / iResolution.y);
vec4 a = getColor(camPos+(random(camPos)*blur - blur / 2.0)) * uBrightness;
a += getColor(camPos+(random(camPos+0.1)*blur - blur / 2.0)) * uBrightness;
//a += getColor(camPos+(random(camPos+0.2)*blur - blur / 2.0)) * uBrightness;
//a += getColor(camPos+(random(camPos+0.3)*blur - blur / 2.0)) * uBrightness;
gl_FragColor = a / 2.0;
vec4 a = getColor(camPos+random(camPos)*blur);
a += getColor(camPos+random(camPos+0.1)*blur);
//a += getColor(camPos+random(camPos+0.2)*blur);
//a += getColor(camPos+random(camPos+0.3)*blur);
gl_FragColor = (a / 2.0) * uBrightness;
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 769 KiB

+23 -11
View File
@@ -1,7 +1,9 @@
import funkin.system.FunkinSprite;
var tankman:FunkinSprite;
var tankTalk1, distorto:FlxSound;
var tankTalk, distorto:FlxSound;
var timers:Array<FlxTimer> = [];
var destroyDistorto:Bool = true;
function create() {
FlxTween.tween(FlxG.camera, {zoom: 1}, 0.7, {ease: FlxEase.quadInOut});
@@ -28,29 +30,39 @@ function create() {
tankman.playAnim('tank');
tankTalk.play();
new FlxTimer().start(4.1, function(ugly:FlxTimer)
timer(4.1, function()
{
FlxTween.tween(FlxG.camera, {zoom: game.defaultCamZoom * 1.4}, 0.4, {ease: FlxEase.quadOut});
FlxTween.tween(FlxG.camera, {zoom: game.defaultCamZoom * 1.3}, 0.7, {ease: FlxEase.quadInOut, startDelay: 0.45});
game.gf.playAnim('sad', false, "DANCE");
});
new FlxTimer().start(11, function(tmr:FlxTimer)
{
game.remove(tankman);
tankman.destroy();
game.camHUD.visible = true;
game.dad.visible = true;
timer(11, function() {
destroyDistorto = false;
distorto.fadeOut((Conductor.crochet / 1000) * 5, 0);
FlxTween.tween(FlxG.camera, {zoom: game.defaultCamZoom}, 0.7, {ease: FlxEase.quadInOut, startDelay: 0});
close();
});
}
function timer(duration:Float, callBack:Void->Void) {
timers.push(new FlxTimer().start(duration, function(timer) {
timers.remove(timer);
callBack();
}));
}
function focusOn(char) {
var camPos = char.getCameraPosition();
game.camFollow.setPosition(camPos.x, camPos.y);
camPos.put();
}
function destroy() {
game.remove(tankman);
game.camHUD.visible = true;
game.dad.visible = true;
for(timer in timers) timer.cancel();
for(thing in [tankman, tankTalk]) thing.destroy();
if(destroyDistorto) distorto.destroy();
FlxTween.tween(FlxG.camera, {zoom: game.defaultCamZoom}, 0.7, {ease: FlxEase.quadInOut, startDelay: 0});
}
+10 -7
View File
@@ -27,11 +27,6 @@ function create() {
stressCutscene.play();
stressCutscene.onComplete = function() {
for(spr in [gf, tankman, pico]) {
spr.destroy();
game.remove(spr);
}
game.camHUD.visible = game.dad.visible = game.gf.visible = true;
close();
};
@@ -59,8 +54,6 @@ function create() {
}
function update(elapsed) {
if (FlxG.keys.justPressed.F5)
FlxG.resetState();
switch(step) {
case 0:
lipSync(tankman, 0, 16750);
@@ -133,4 +126,14 @@ function focusOn(char, snap:Bool = false) {
game.camFollow.setPosition(camPos.x, camPos.y);
if(snap) FlxG.camera.snapToTarget();
camPos.put();
}
function destroy() {
game.boyfriend.animation.finishCallback = null;
game.camHUD.visible = game.boyfriend.visible = game.dad.visible = game.gf.visible = true;
for(thing in [bf, gf, tankman, pico, stressCutscene]) {
if(thing == null) continue;
if(thing != stressCutscene) game.remove(thing);
thing.destroy();
}
}
+5
View File
@@ -0,0 +1,5 @@
function next(event)
if (!event.playFirst) trace("-");
function postNext(event)
trace(curLine.char + " says: " + curLine.text);
+27 -14
View File
@@ -2,6 +2,8 @@ import funkin.system.FunkinSprite;
var tankman:FunkinSprite;
var tankTalk1, tankTalk2, bfBeep, distorto:FlxSound;
var timers:Array<FlxTimer> = [];
var destroyDistorto:Bool = true;
function create() {
FlxTween.tween(FlxG.camera, {zoom: 1}, 0.7, {ease: FlxEase.quadInOut});
@@ -33,35 +35,46 @@ function create() {
tankman.playAnim('1');
tankTalk1.play();
new FlxTimer().start(3, function(tmr:FlxTimer) {
timer(3, function() {
focusOn(game.boyfriend);
new FlxTimer().start(1.5, function(t) {
timer(1.5, function() {
game.boyfriend.playAnim("singUP");
bfBeep.play();
new FlxTimer().start(1.5, function(t) {
timer(1.5, function() {
focusOn(game.dad);
tankTalk2.play();
tankman.playAnim('2');
new FlxTimer().start(6.1, function(t) {
game.remove(tankman);
tankman.destroy();
game.camHUD.visible = true;
game.dad.visible = true;
timer(6.1, function() {
destroyDistorto = false;
distorto.fadeOut((Conductor.crochet / 1000) * 5, 0);
close();
}, 1);
}, 1);
}, 1);
}, 1);
});
});
});
});
}
function timer(duration:Float, callBack:Void->Void) {
timers.push(new FlxTimer().start(duration, function(timer) {
timers.remove(timer);
callBack();
}));
}
function focusOn(char) {
var camPos = char.getCameraPosition();
game.camFollow.setPosition(camPos.x, camPos.y);
camPos.put();
}
function destroy() {
game.remove(tankman);
game.camHUD.visible = true;
game.dad.visible = true;
for(timer in timers) timer.cancel();
for(thing in [tankTalk1, tankTalk2, bfBeep, tankman]) thing.destroy();
if(destroyDistorto) distorto.destroy();
}
+43 -4
View File
@@ -18,11 +18,32 @@ class Setup {
FileSystem.deleteDirectory(path);
}
public static function addMissingFolders(path:String):String {
#if sys
var folders:Array<String> = path.split("/");
var currentPath:String = "";
for (folder in folders) {
currentPath += folder + "/";
if (!FileSystem.exists(currentPath))
FileSystem.createDirectory(currentPath);
}
#end
return path;
}
public static function main(args:Array<String>) {
var args = ArgParser.parse(args, ["s" => "silent-progress", "S" => "silent-progress", "silent" => "silent-progress"]);
var args = ArgParser.parse(args, [
"s" => "silent-progress",
"S" => "silent-progress",
"silent" => "silent-progress",
"f" => "fast",
"F" => "fast"
]);
var CHECK_VSTUDIO = !args.existsOption("no-vscheck");
var REINSTALL_ALL = args.existsOption("reinstall");
var SILENT = args.existsOption("silent-progress");
var FAST = args.existsOption("fast");
// TODO: add only install missing libs
// to prevent messing with currently installed libs
@@ -138,6 +159,11 @@ class Setup {
var commandSuffix = " --always";
if (SILENT) commandSuffix += " --quiet";
function command(cmd:String) {
Sys.println(cmd); // TODO: ansi color
Sys.command(cmd);
}
for(event in events) {
switch(event.type) {
case INSTALL:
@@ -148,10 +174,23 @@ class Setup {
switch(lib.type) {
case "lib":
prettyPrint((lib.global == "true" ? "Globally installing" : "Locally installing") + ' "${lib.name}"...');
Sys.command('haxelib$commandPrefix install ${lib.name} ${lib.version != null ? " " + lib.version : " "}');
command('haxelib$commandPrefix install ${lib.name} ${lib.version != null ? " " + lib.version : " "}');
case "git":
prettyPrint((lib.global == "true" ? "Globally installing" : "Locally installing") + ' "${lib.name}" from git url "${lib.url}"');
Sys.command('haxelib$commandPrefix git ${lib.name} ${lib.url}${lib.ref != null ? ' ${lib.ref}' : ''}');
if(FAST) {
var oldcwd = Sys.getCwd();
var newCwd = oldcwd + "/.haxelib/" + lib.name + "/";
var newCwdGit = newCwd + "git/";
addMissingFolders(newCwdGit);
Sys.setCwd(newCwd);
File.saveContent(".current", "git");
if(FileSystem.exists(newCwdGit)) recursiveDelete(newCwdGit);
command('git clone ${lib.url} ${lib.name} --depth 1${lib.ref != null ? " --branch " + lib.ref : ""} --progress');
FileSystem.rename(newCwd + lib.name, newCwdGit);
Sys.setCwd(oldcwd);
} else {
command('haxelib$commandPrefix git ${lib.name} ${lib.url}${lib.ref != null ? ' ${lib.ref}' : ''}');
}
default:
prettyPrint('Cannot resolve library of type "${lib.type}"');
}
@@ -192,7 +231,7 @@ class Setup {
for(line in cmd.lines) {
final line = StringTools.replace(line, "$PLATFORM", platform);
//Sys.println(line);
Sys.command(line);
command(line);
}
Sys.setCwd(oldCwd);
case PRINT:
+2
View File
@@ -20,6 +20,8 @@
<!-- Documentation and other features -->
<git name="away3d" url="https://github.com/FNF-CNE-Devs/away3d" />
<git name="funkin.vis" url="https://github.com/FNF-CNE-Devs/funkVis" />
<git name="grig.audio" url="https://gitlab.com/haxe-grig/grig.audio.git" ref="57f5d47f2533fd0c3dcd025a86cb86c0dfa0b6d2" />
<!-- <lib name="dox" /> -->
<lib name="markdown" />
+7 -5
View File
@@ -118,9 +118,6 @@
<!-- Comment this out to disable multithreading !-->
<haxedef name="ALLOW_MULTITHREADING" unless="web || flash" />
<!-- Comment this out to disable titlescreen.xml !-->
<haxedef name="TITLESCREEN_XML" />
<!-- Comment this out to disable mods folder !-->
<haxedef name="MOD_SUPPORT" unless="web"/>
@@ -134,11 +131,14 @@
<haxedef name="USE_ADAPTED_ASSETS" unless="web" />
<!-- Comment this out to disable support for custom ndlls. !-->
<haxedef name="NDLLS_SUPPORTED" unless="web || iphonesim" />
<haxedef name="NDLLS_SUPPORTED" unless="web || iphonesim || hl" />
<!-- Comment this out to disable support for Away3D Flixel Intergration (reduces compile times)-->
<!-- Comment this out to disable support for Away3D Flixel Intergration (reduces compile times) !-->
<define name="THREE_D_SUPPORT" />
<!-- Comment this out to disable support for Funkin Audio Visualizer (reduces compile times) !-->
<define name="AUDIO_VIS_SUPPORT" />
<!-- Comment this out to disable video cutscene support, in case of compilation errors. !-->
<section if="cpp">
<define name="VIDEO_CUTSCENES" if="desktop || android" />
@@ -173,6 +173,8 @@
<haxelib name="hxvlc" if="VIDEO_CUTSCENES" />
<haxelib name="away3d" if="THREE_D_SUPPORT" />
<haxelib name="funkin.vis" if="AUDIO_VIS_SUPPORT" />
<haxelib name="grig.audio" if="AUDIO_VIS_SUPPORT" />
<haxelib name="format" />
<haxelib name="flxanimate" />
+4
View File
@@ -230,6 +230,8 @@ class StringTools {
return (cast s).startsWith(start);
#elseif lua
return untyped __lua__("{0}:sub(1, #{1}) == {1}", s, start);
#elseif cpp
return untyped s.__StartsWith(start);
#else
return (s.length >= start.length && s.indexOf(start, 0) == 0);
#end
@@ -255,6 +257,8 @@ class StringTools {
return (cast s).endsWith(end);
#elseif lua
return end == "" || untyped __lua__("{0}:sub(-#{1}) == {1}", s, end);
#elseif cpp
return untyped s.__EndsWith(end);
#else
var elen = end.length;
var slen = s.length;
+11 -2
View File
@@ -8,7 +8,7 @@ import flixel.math.FlxRect;
import flixel.system.FlxAssets.FlxGraphicAsset;
import flixel.util.typeLimit.OneOfTwo;
import flxanimate.animate.FlxAnim.FlxSymbolAnimation;
import funkin.backend.scripting.events.PlayAnimContext;
import funkin.backend.scripting.events.sprite.PlayAnimContext;
import funkin.backend.system.interfaces.IBeatReceiver;
import funkin.backend.system.interfaces.IOffsetCompatible;
import funkin.backend.utils.XMLUtil.AnimData;
@@ -56,6 +56,8 @@ class FunkinSprite extends FlxSkewedSprite implements IBeatReceiver implements I
public var animEnabled:Bool = true;
public var zoomFactorEnabled:Bool = true;
public var globalCurFrame(get, set):Int;
/**
* ODD interval -> asynced; EVEN interval -> synced
*/
@@ -142,7 +144,7 @@ class FunkinSprite extends FlxSkewedSprite implements IBeatReceiver implements I
public function beatHit(curBeat:Int)
{
if(!animEnabled) return;
if (beatAnims.length > 0 && (curBeat + beatOffset) % beatInterval == 0)
if (lastAnimContext != LOCK && beatAnims.length > 0 && (curBeat + beatOffset) % beatInterval == 0)
{
if(skipNegativeBeats && curBeat < 0) return;
// TODO: find a solution without countedBeat
@@ -392,4 +394,11 @@ class FunkinSprite extends FlxSkewedSprite implements IBeatReceiver implements I
return beatInterval = v;
}
@:noCompletion private inline function get_globalCurFrame() {
return animateAtlas != null ? (animateAtlas.anim.curFrame) : (animation.curAnim != null ? animation.curAnim.curFrame : 0);
}
@:noCompletion private inline function set_globalCurFrame(val:Int) {
return animateAtlas != null ? (animateAtlas.anim.curFrame = val) : (animation.curAnim != null ? animation.curAnim.curFrame = val : val);
}
}
+30 -6
View File
@@ -164,10 +164,36 @@ class MusicBeatState extends FlxState implements IBeatReceiver
persistentUpdate = true;
call("postCreate");
if (!skipTransIn)
openSubState(new MusicBeatTransition(null));
startTransition(null);
skipTransIn = false;
skipTransOut = false;
}
public function startTransition(?newState:FlxState, skipSubStates:Bool = false):Bool {
if (!skipSubStates) {
var curCheckingSub:FlxSubState = subState;
var found:FlxSubState = null; // always gets the last one - Nex
while (curCheckingSub != null) {
if (curCheckingSub is MusicBeatTransition) {
found = null; // avoiding infinite loops - Nex
break;
}
if (curCheckingSub is MusicBeatSubstate && cast(curCheckingSub, MusicBeatSubstate).canOpenCustomTransition) found = curCheckingSub;
curCheckingSub = curCheckingSub.subState;
}
if (found != null) {
found.openSubState(new MusicBeatTransition(newState));
return true; // "Started from a substate?"
}
}
openSubState(new MusicBeatTransition(newState));
return false;
}
public function call(name:String, ?args:Array<Dynamic>, ?defaultVal:Dynamic):Dynamic {
// calls the function on the assigned script
if(stateScripts != null)
@@ -232,7 +258,7 @@ class MusicBeatState extends FlxState implements IBeatReceiver
public override function openSubState(subState:FlxSubState) {
var e = event("onOpenSubState", EventManager.get(StateEvent).recycle(subState));
if (!e.cancelled)
super.openSubState(subState);
super.openSubState(e.substate is FlxSubState ? cast e.substate : subState);
}
public override function onResize(w:Int, h:Int) {
@@ -260,11 +286,9 @@ class MusicBeatState extends FlxState implements IBeatReceiver
if (e.cancelled)
return false;
if (skipTransOut)
if (skipTransOut || (subState is MusicBeatTransition && cast(subState, MusicBeatTransition).newState != null))
return true;
if (subState is MusicBeatTransition && cast(subState, MusicBeatTransition).newState != null)
return true;
openSubState(new MusicBeatTransition(nextState));
startTransition(e.substate);
persistentUpdate = false;
return false;
}
+9 -10
View File
@@ -16,6 +16,10 @@ class MusicBeatSubstate extends FlxSubState implements IBeatReceiver
private var lastBeat:Float = 0;
private var lastStep:Float = 0;
/**
* Whether this specifc substate can open custom transitions
*/
public var canOpenCustomTransition:Bool = false;
/**
* Current step
*/
@@ -221,7 +225,7 @@ class MusicBeatSubstate extends FlxSubState implements IBeatReceiver
public override function openSubState(subState:FlxSubState) {
var e = event("onOpenSubState", EventManager.get(StateEvent).recycle(subState));
if (!e.cancelled)
super.openSubState(subState);
super.openSubState(e.substate is FlxSubState ? cast e.substate : subState);
}
public override function onResize(w:Int, h:Int) {
@@ -239,7 +243,7 @@ class MusicBeatSubstate extends FlxSubState implements IBeatReceiver
var e = event("onStateSwitch", EventManager.get(StateEvent).recycle(nextState));
if (e.cancelled)
return false;
return super.switchTo(nextState);
return super.switchTo(e.substate);
}
public override function onFocus() {
@@ -254,19 +258,14 @@ class MusicBeatSubstate extends FlxSubState implements IBeatReceiver
public var parent:FlxState;
public function onSubstateOpen() {
}
public function onSubstateOpen() {}
public override function resetSubState() {
super.resetSubState();
if (subState != null && subState is MusicBeatSubstate) {
var subState:MusicBeatSubstate = cast subState;
subState.parent = this;
super.resetSubState();
if (subState != null)
cast(subState, MusicBeatSubstate).onSubstateOpen();
return;
subState.onSubstateOpen();
}
super.resetSubState();
}
}
+43 -46
View File
@@ -13,12 +13,6 @@ using StringTools;
class Paths
{
/**
* Preferred sound extension for the game's audio files.
* Currently is set to `mp3` for web targets, and `ogg` for other targets.
*/
inline public static final SOUND_EXT = #if web "mp3" #else "ogg" #end;
public static var assetsTree:AssetsLibraryList;
public static var tempFramesCache:Map<String, FlxFramesCollection> = [];
@@ -32,8 +26,8 @@ class Paths
public static inline function getPath(file:String, ?library:String)
return library != null ? '$library:assets/$library/$file' : 'assets/$file';
public static inline function video(key:String, ?ext:String = "mp4")
return getPath('videos/$key.$ext');
public static inline function video(key:String, ?ext:String)
return getPath('videos/$key.${ext != null ? ext : Flags.VIDEO_EXT}');
public static inline function ndll(key:String)
return getPath('ndlls/$key.ndll');
@@ -65,31 +59,33 @@ class Paths
inline static public function ps1(key:String, ?library:String)
return getPath('data/$key.ps1', library);
static public function sound(key:String, ?library:String)
return getPath('sounds/$key.$SOUND_EXT', library);
static public function sound(key:String, ?library:String, ?ext:String)
return getPath('sounds/$key.${ext != null ? ext : Flags.SOUND_EXT}', library);
inline static public function soundRandom(key:String, min:Int, max:Int, ?library:String)
return sound(key + FlxG.random.int(min, max), library);
inline static public function music(key:String, ?library:String)
return getPath('music/$key.$SOUND_EXT', library);
inline static public function music(key:String, ?library:String, ?ext:String)
return getPath('music/$key.${ext != null ? ext : Flags.SOUND_EXT}', library);
inline static public function voices(song:String, difficulty:String = "normal", ?prefix:String = "")
{
inline static public function voices(song:String, ?difficulty:String, ?prefix:String = "", ?ext:String) {
if (difficulty == null) difficulty = Flags.DEFAULT_DIFFICULTY;
if (ext == null) ext = Flags.SOUND_EXT;
song = song.toLowerCase();
var diff = getPath('songs/${song}/song/Voices$prefix-${difficulty.toLowerCase()}.$SOUND_EXT', null);
return OpenFlAssets.exists(diff) ? diff : getPath('songs/${song}/song/Voices$prefix.$SOUND_EXT', null);
var diff = getPath('songs/$song/song/Voices$prefix-${difficulty.toLowerCase()}.${ext}', null);
return OpenFlAssets.exists(diff) ? diff : getPath('songs/$song/song/Voices$prefix.${ext}', null);
}
inline static public function inst(song:String, difficulty:String = "normal", ?prefix:String = "")
{
inline static public function inst(song:String, ?difficulty:String, ?prefix:String = "", ?ext:String) {
if (difficulty == null) difficulty = Flags.DEFAULT_DIFFICULTY;
if (ext == null) ext = Flags.SOUND_EXT;
song = song.toLowerCase();
var diff = getPath('songs/${song}/song/Inst$prefix-${difficulty.toLowerCase()}.$SOUND_EXT', null);
return OpenFlAssets.exists(diff) ? diff : getPath('songs/${song}/song/Inst$prefix.$SOUND_EXT', null);
var diff = getPath('songs/$song/song/Inst$prefix-${difficulty.toLowerCase()}.${ext}', null);
return OpenFlAssets.exists(diff) ? diff : getPath('songs/$song/song/Inst$prefix.${ext}', null);
}
static public function image(key:String, ?library:String, checkForAtlas:Bool = false, ?ext:String = "png")
{
static public function image(key:String, ?library:String, checkForAtlas:Bool = false, ?ext:String) {
if (ext == null) ext = Flags.IMAGE_EXT;
if (checkForAtlas) {
var atlasPath = getPath('images/$key/spritemap.$ext', library);
var multiplePath = getPath('images/$key/1.$ext', library);
@@ -113,9 +109,9 @@ class Paths
return scriptPath;
}
static public function chart(song:String, ?difficulty:String = "normal"):String
static public function chart(song:String, ?difficulty:String):String
{
difficulty = difficulty.toLowerCase();
difficulty = (difficulty != null ? difficulty : Flags.DEFAULT_DIFFICULTY).toLowerCase();
song = song.toLowerCase();
return getPath('songs/$song/charts/$difficulty.json', null);
@@ -160,33 +156,33 @@ class Paths
return getPath('models/$key.awd');
}
inline static public function getSparrowAtlas(key:String, ?library:String)
return FlxAtlasFrames.fromSparrow(image(key, library), file('images/$key.xml', library));
inline static public function getSparrowAtlas(key:String, ?library:String, ?ext:String)
return FlxAtlasFrames.fromSparrow(image(key, library, ext), file('images/$key.xml', library));
inline static public function getSparrowAtlasAlt(key:String)
return FlxAtlasFrames.fromSparrow('$key.png', '$key.xml');
inline static public function getSparrowAtlasAlt(key:String, ?ext:String)
return FlxAtlasFrames.fromSparrow('$key.${ext != null ? ext : Flags.IMAGE_EXT}', '$key.xml');
inline static public function getPackerAtlas(key:String, ?library:String)
return FlxAtlasFrames.fromSpriteSheetPacker(image(key, library), file('images/$key.txt', library));
inline static public function getPackerAtlas(key:String, ?library:String, ?ext:String)
return FlxAtlasFrames.fromSpriteSheetPacker(image(key, library, ext), file('images/$key.txt', library));
inline static public function getPackerAtlasAlt(key:String)
return FlxAtlasFrames.fromSpriteSheetPacker('$key.png', '$key.txt');
inline static public function getPackerAtlasAlt(key:String, ?ext:String)
return FlxAtlasFrames.fromSpriteSheetPacker('$key.${ext != null ? ext : Flags.IMAGE_EXT}', '$key.txt');
inline static public function getAsepriteAtlas(key:String, ?library:String)
return FlxAtlasFrames.fromAseprite(image(key, library), file('images/$key.json', library));
inline static public function getAsepriteAtlas(key:String, ?library:String, ?ext:String)
return FlxAtlasFrames.fromAseprite(image(key, library, ext), file('images/$key.json', library));
inline static public function getAsepriteAtlasAlt(key:String)
return FlxAtlasFrames.fromAseprite('$key.png', '$key.json');
inline static public function getAsepriteAtlasAlt(key:String, ?ext:String)
return FlxAtlasFrames.fromAseprite('$key.${ext != null ? ext : Flags.IMAGE_EXT}', '$key.json');
inline static public function getAssetsRoot():String
return ModsFolder.currentModFolder != null ? '${ModsFolder.modsPath}${ModsFolder.currentModFolder}' : './assets';
return ModsFolder.currentModFolder != null ? '${ModsFolder.modsPath}${ModsFolder.currentModFolder}' : #if (sys && TEST_BUILD) './${Main.pathBack}assets/' #else './assets' #end;
/**
* Gets frames at specified path.
* @param key Path to the frames
* @param library (Additional) library to load the frames from.
*/
public static function getFrames(key:String, assetsPath:Bool = false, ?library:String) {
public static function getFrames(key:String, assetsPath:Bool = false, ?library:String, ?ext:String = null) {
if (tempFramesCache.exists(key)) {
var frames = tempFramesCache[key];
if (frames != null && frames.parent != null && frames.parent.bitmap != null && frames.parent.bitmap.readable)
@@ -194,7 +190,7 @@ class Paths
else
tempFramesCache.remove(key);
}
return tempFramesCache[key] = loadFrames(assetsPath ? key : Paths.image(key, library, true));
return tempFramesCache[key] = loadFrames(assetsPath ? key : Paths.image(key, library, true, ext), false, null, false, ext);
}
@@ -206,10 +202,11 @@ class Paths
* @param SkipAtlasCheck Whenever the atlas check should be skipped.
* @return FlxFramesCollection Frames
*/
static function loadFrames(path:String, Unique:Bool = false, Key:String = null, SkipAtlasCheck:Bool = false):FlxFramesCollection {
static function loadFrames(path:String, Unique:Bool = false, Key:String = null, SkipAtlasCheck:Bool = false, ?Ext:String = null):FlxFramesCollection {
var noExt = Path.withoutExtension(path);
var ext = Ext != null ? Ext : Flags.IMAGE_EXT;
if (Assets.exists('$noExt/1.png')) {
if (Assets.exists('$noExt/1.${ext}')) {
// MULTIPLE SPRITESHEETS!!
var graphic = FlxG.bitmap.add("flixel/images/logo/default.png", false, '$noExt/mult');
@@ -220,18 +217,18 @@ class Paths
trace("no frames yet for multiple atlases!!");
var cur = 1;
var finalFrames = new MultiFramesCollection(graphic);
while(Assets.exists('$noExt/$cur.png')) {
var spr = loadFrames('$noExt/$cur.png');
while(Assets.exists('$noExt/$cur.${ext}')) {
var spr = loadFrames('$noExt/$cur.${ext}');
finalFrames.addFrames(spr);
cur++;
}
return finalFrames;
} else if (Assets.exists('$noExt.xml')) {
return Paths.getSparrowAtlasAlt(noExt);
return Paths.getSparrowAtlasAlt(noExt, ext);
} else if (Assets.exists('$noExt.txt')) {
return Paths.getPackerAtlasAlt(noExt);
return Paths.getPackerAtlasAlt(noExt, ext);
} else if (Assets.exists('$noExt.json')) {
return Paths.getAsepriteAtlasAlt(noExt);
return Paths.getAsepriteAtlasAlt(noExt, ext);
}
var graph:FlxGraphic = FlxG.bitmap.add(path, Unique, Key);
@@ -0,0 +1,176 @@
package funkin.backend.chart;
import funkin.backend.chart.ChartData.ChartMetaData;
// These new structures are kinda a mess to port, i love and hate them at the same time; why the hell are every difficulty in the same file??? - Nex
class BaseGameParser {
public static function parseChart(data:Dynamic, metaData:Dynamic, result:ChartData) {
// TO DO
}
public static function parseMeta(data:Dynamic, result:ChartMetaData) {
var data:SwagMetadata = data;
result.name = data.songName;
result.artist = data.artist;
result.customValues = {};
result.customValues.timeChanges = data.timeChanges;
var firstTimeChng:SwagTimeChange = data.timeChanges[0];
result.bpm = firstTimeChng.bpm;
result.beatsPerMeasure = firstTimeChng.b != null ? firstTimeChng.b : Flags.DEFAULT_BEATS_PER_MEASURE;
result.difficulties = data.playData.difficulties.concat(data.playData.songVariations);
Reflect.deleteField(data.playData, "difficulties");
for (field in Reflect.fields(data.playData))
Reflect.setProperty(result.customValues, field, Reflect.getProperty(data.playData, field));
}
public static function encodeMeta(meta:ChartMetaData, ?chart:ChartData):SwagMetadata {
var addVars:Dynamic = meta.customValues;
var defStage:String = addVars.stage != null ? addVars.stage : Flags.DEFAULT_STAGE;
var defChars:SwagCharactersList = addVars.characters != null ? addVars.characters : {player: Flags.DEFAULT_CHARACTER, girlfriend: Flags.DEFAULT_GIRLFRIEND, opponent: Flags.DEFAULT_OPPONENT};
var defTimeCh:Array<SwagTimeChange>;
if (addVars.timeChanges != null && addVars.timeChanges.length > 0) {
defTimeCh = addVars.timeChanges;
defTimeCh[0].bpm = meta.bpm;
}
else defTimeCh = [{bpm: meta.bpm, t: -1}];
if (chart != null) {
defStage = chart.stage;
var done:Array<Bool> = [false, false, false];
for (strumLine in chart.strumLines) switch (strumLine.type) {
case OPPONENT:
if (!done[0]) {
done[0] = true;
defChars.opponent = strumLine.characters.getDefault([defChars.opponent])[0];
}
case PLAYER:
if (!done[1]) {
done[1] = true;
defChars.player = strumLine.characters.getDefault([defChars.player])[0];
}
case ADDITIONAL:
if (!done[3]) {
done[3] = true;
defChars.girlfriend = strumLine.characters.getDefault([defChars.girlfriend])[0];
}
}
}
var result:SwagMetadata = {
songName: meta.name,
timeFormat: MILLISECONDS,
artist: meta.artist,
timeChanges: defTimeCh,
looped: false,
generatedBy: 'Basegame Chart Importer (Codename Engine)',
version: Flags.BASEGAME_SONG_METADATA_VERSION,
playData: {
stage: defStage,
characters: defChars,
songVariations: addVars.songVariations != null ? [for (i in 0...addVars.songVariations.length) {meta.difficulties.remove(addVars.songVariations[i]); addVars.songVariations[i];}] : [],
difficulties: meta.difficulties,
noteStyle: addVars.noteStyle != null ? addVars.noteStyle : Flags.BASEGAME_DEFAULT_NOTE_STYLE,
album: addVars.album != null ? addVars.album : Flags.BASEGAME_DEFAULT_ALBUM_ID,
previewStart: addVars.previewStart != null ? addVars.previewStart : Flags.BASEGAME_DEFAULT_PREVIEW_START,
previewEnd: addVars.previewEnd != null ? addVars.previewEnd : Flags.BASEGAME_DEFAULT_PREVIEW_END
},
};
return result;
return null;
}
public static function encodeChart(chart:ChartData):NewSwagSong {
// TO DO
return null;
}
}
// METADATA STRUCTURES
typedef SwagMetadata =
{
var timeFormat:SwagTimeFormat;
var artist:String;
var songName:String;
var playData:SwagPlayData;
var timeChanges:Array<SwagTimeChange>;
var generatedBy:String;
var looped:Bool;
var version:String;
var ?divisions:Int;
var ?offsets:SwagSongOffsets;
}
enum abstract SwagTimeFormat(String) from String to String
{
var TICKS = 'ticks';
var FLOAT = 'float';
var MILLISECONDS = 'ms';
}
typedef SwagTimeChange =
{
var ?d:Int; // Time Signature Den
var ?n:Int; // Time Signature Num
var t:Int; // Time Stamp
var ?b:Int; // Beat Time
var ?bt:Array<Int>; // Beat Tuplets
var bpm:Float;
}
typedef SwagPlayData =
{
var album:String;
var previewStart:Float;
var previewEnd:Float;
var stage:String;
var characters:SwagCharactersList;
var songVariations:Array<String>;
var difficulties:Array<String>;
var noteStyle:String;
}
typedef SwagCharactersList =
{
var player:String;
var girlfriend:String;
var opponent:String;
}
typedef SwagSongOffsets =
{
var ?instrumental:Float;
var ?altInstrumentals:Dynamic;
var ?vocals:Dynamic;
}
// CHART STRUCTURE
typedef NewSwagSong =
{
var version:String;
var scrollSpeed:Dynamic; // Map<String, Float>
var events:Array<SwagEvent>;
var notes:Dynamic; // Map<String, Array<SwagNote>>
var generatedBy:String;
}
typedef SwagEvent =
{
var t:Float; // Time
var e:String; // Event Kind
var v:Dynamic; // Value (Map<String, Dynamic>)
}
typedef SwagNote =
{
var t:Float; // Time
var d:Int; // Data
var l:Float; // Length
var k:String; // Kind
}
+20 -20
View File
@@ -12,11 +12,6 @@ import sys.FileSystem;
using StringTools;
final class Chart {
/**
* Default background colors for songs without bg color
*/
public inline static var defaultColor:FlxColor = 0xFF9271FD;
public static final version:String = "1.6.0";
public static function loadEventsJson(songName:String) {
@@ -32,7 +27,9 @@ final class Chart {
return data;
}
public static function loadChartMeta(songName:String, difficulty:String = "normal", fromMods:Bool = true) {
public static function loadChartMeta(songName:String, ?difficulty:String, fromMods:Bool = true) {
if (difficulty == null) difficulty = Flags.DEFAULT_DIFFICULTY;
var metaPath = Paths.file('songs/${songName.toLowerCase()}/meta.json');
var metaDiffPath = Paths.file('songs/${songName.toLowerCase()}/meta-${difficulty.toLowerCase()}.json');
@@ -52,19 +49,19 @@ final class Chart {
if (data == null)
data = {
name: songName,
bpm: 100
name: songName
};
data.setFieldDefault("name", songName);
data.setFieldDefault("beatsPerMeasure", 4);
data.setFieldDefault("stepsPerBeat", 4);
data.setFieldDefault("bpm", Flags.DEFAULT_BPM);
data.setFieldDefault("beatsPerMeasure", Flags.DEFAULT_BEATS_PER_MEASURE);
data.setFieldDefault("stepsPerBeat", Flags.DEFAULT_STEPS_PER_BEAT);
data.setFieldDefault("needsVoices", true);
data.setFieldDefault("icon", "face");
data.setFieldDefault("icon", Flags.DEFAULT_HEALTH_ICON);
data.setFieldDefault("difficulties", []);
data.setFieldDefault("coopAllowed", false);
data.setFieldDefault("opponentModeAllowed", false);
data.setFieldDefault("coopAllowed", Flags.DEFAULT_COOP_ALLOWED);
data.setFieldDefault("opponentModeAllowed", Flags.DEFAULT_OPPONENT_MODE_ALLOWED);
data.setFieldDefault("displayName", data.name);
data.setFieldDefault("parsedColor", data.color.getColorFromDynamic().getDefault(defaultColor));
data.setFieldDefault("parsedColor", data.color.getColorFromDynamic().getDefault(Flags.DEFAULT_COLOR));
if (data.difficulties.length <= 0) {
data.difficulties = [for(f in Paths.getFolderContent('songs/${songName.toLowerCase()}/charts/', false, fromMods ? MODS : SOURCE)) if (Path.extension(f = f.toUpperCase()) == "JSON") Path.withoutExtension(f)];
@@ -88,7 +85,9 @@ final class Chart {
return data;
}
public static function parse(songName:String, difficulty:String = "normal"):ChartData {
public static function parse(songName:String, ?difficulty:String):ChartData {
if (difficulty == null) difficulty = Flags.DEFAULT_DIFFICULTY;
var chartPath = Paths.chart(songName, difficulty);
var base:ChartData = {
strumLines: [],
@@ -97,8 +96,8 @@ final class Chart {
meta: {
name: null
},
scrollSpeed: 2,
stage: "stage",
scrollSpeed: Flags.DEFAULT_SCROLL_SPEED,
stage: Flags.DEFAULT_STAGE,
codenameChart: true,
fromMods: Paths.assetsTree.existsSpecific(chartPath, "TEXT", MODS)
};
@@ -202,7 +201,8 @@ final class Chart {
* @param saveSettings
* @return Filtered chart used for saving.
*/
public static function save(songFolderPath:String, chart:ChartData, difficulty:String = "normal", ?saveSettings:ChartSaveSettings):ChartData {
public static function save(songFolderPath:String, chart:ChartData, ?difficulty:String, ?saveSettings:ChartSaveSettings):ChartData {
if (difficulty == null) difficulty = Flags.DEFAULT_DIFFICULTY;
if (saveSettings == null) saveSettings = {};
if (saveSettings.saveMetaInChart == null) saveSettings.saveMetaInChart = true;
@@ -220,11 +220,11 @@ final class Chart {
var chartPath = '${songFolderPath}/$saveFolder/${difficulty.trim()}.json';
var metaPath = '${songFolderPath}/meta.json';
CoolUtil.safeSaveFile(chartPath, Json.stringify(filteredChart, null, saveSettings.prettyPrint == true ? "\t" : null));
CoolUtil.safeSaveFile(chartPath, Json.stringify(filteredChart, null, saveSettings.prettyPrint == true ? Flags.JSON_PRETTY_PRINT : null));
// idk how null reacts to it so better be sure
if (saveSettings.overrideExistingMeta == true || !FileSystem.exists(metaPath))
CoolUtil.safeSaveFile(metaPath, Json.stringify(meta, null, saveSettings.prettyPrint == true ? "\t" : null));
CoolUtil.safeSaveFile(metaPath, Json.stringify(meta, null, saveSettings.prettyPrint == true ? Flags.JSON_PRETTY_PRINT : null));
#end
return filteredChart;
}
+2 -1
View File
@@ -20,7 +20,7 @@ typedef ChartMetaData = {
public var ?bpm:Float;
public var ?displayName:String;
public var ?beatsPerMeasure:Float;
public var ?stepsPerBeat:Float;
public var ?stepsPerBeat:Int;
public var ?icon:String;
public var ?color:Dynamic;
public var ?difficulties:Array<String>;
@@ -28,6 +28,7 @@ typedef ChartMetaData = {
public var ?opponentModeAllowed:Bool;
public var ?customValues:Dynamic;
public var ?needsVoices:Bool;
public var ?artist:String;
// NOT TO BE EXPORTED
public var ?parsedColor:FlxColor;
@@ -45,7 +45,7 @@ class FNFLegacyParser {
var camFocusedBF:Bool = false;
var altAnims:Bool = false;
var beatsPerMeasure:Float = data.beatsPerMeasure.getDefault(4);
var beatsPerMeasure:Float = data.beatsPerMeasure.getDefault(Flags.DEFAULT_BEATS_PER_MEASURE);
var curBPM:Float = data.bpm;
var curTime:Float = 0;
var curCrochet:Float = ((60 / curBPM) * 1000);
@@ -132,10 +132,10 @@ class FNFLegacyParser {
if ((swagSection.mustHitSection && strumLine.type == OPPONENT) ||
(!swagSection.mustHitSection && strumLine.type == PLAYER))
sectionNote[1] += 4;
swagSection.sectionNotes.push(sectionNote);
swagSection.sectionNotes.push(sectionNote);
}
}
return {song: base};
}
@@ -156,9 +156,9 @@ class FNFLegacyParser {
for (strumLine in chart.strumLines)
switch (strumLine.type) {
case OPPONENT:
if (base.player2 == null) base.player2 = strumLine.characters.getDefault(["dad"])[0];
if (base.player2 == null) base.player2 = strumLine.characters.getDefault([Flags.DEFAULT_OPPONENT])[0];
case PLAYER:
if (base.player1 == null) base.player1 = strumLine.characters.getDefault(["bf"])[0];
if (base.player1 == null) base.player1 = strumLine.characters.getDefault([Flags.DEFAULT_CHARACTER])[0];
case ADDITIONAL: // do nothing
}
@@ -221,7 +221,7 @@ typedef SwagSong =
// ADDITIONAL STUFF THAT MAY NOT BE PRESENT IN CHART
var ?maxHealth:Float;
var ?beatsPerMeasure:Float;
var ?stepsPerBeat:Float;
var ?stepsPerBeat:Int;
}
typedef SwagSection =
+3 -3
View File
@@ -32,7 +32,7 @@ class PsychParser {
for (note in strumLine.notes) {
var section:Int = Math.floor(Conductor.getStepForTime(note.time) / Conductor.getMeasureLength());
var swagSection:SwagSection = base.notes[section];
if (section >= 0 && section < base.notes.length) {
var sectionNote:Array<Dynamic> = [
note.time, // TIME
@@ -47,7 +47,7 @@ class PsychParser {
swagSection.sectionNotes.push(sectionNote);
}
}
var groupedEvents:Array<Array<ChartEvent>> = [];
var __last:Array<ChartEvent> = null;
var __lastTime:Float = Math.NaN;
@@ -106,7 +106,7 @@ class PsychParser {
for (psychEvent in psychEvents)
for (i in 1...3) // Turn both vals into strings
if (!(psychEvent[i] is String))
if (!(psychEvent[i] is String))
psychEvent[i] = Std.string(psychEvent[i]);
base.events.push([events[0].time, psychEvents]);
+97 -52
View File
@@ -19,89 +19,134 @@ class Script extends FlxBasic implements IFlxDestroyable {
public static function getDefaultVariables(?script:Script):Map<String, Dynamic> {
return [
// Haxe related stuff
"Std" => Std,
"Math" => Math,
"Reflect" => Reflect,
"StringTools" => StringTools,
"Json" => haxe.Json,
"Std" => Std,
"Math" => Math,
"Reflect" => Reflect,
"StringTools" => StringTools,
"Json" => haxe.Json,
// OpenFL & Lime related stuff
"Assets" => openfl.utils.Assets,
"Application" => lime.app.Application,
"Application" => lime.app.Application,
"Main" => funkin.backend.system.Main,
"window" => lime.app.Application.current.window,
// Flixel related stuff
"FlxG" => flixel.FlxG,
"FlxSprite" => flixel.FlxSprite,
"FlxBasic" => flixel.FlxBasic,
"FlxCamera" => flixel.FlxCamera,
"state" => flixel.FlxG.state,
"FlxEase" => flixel.tweens.FlxEase,
"FlxTween" => flixel.tweens.FlxTween,
"FlxSound" => flixel.sound.FlxSound,
"FlxAssets" => flixel.system.FlxAssets,
"FlxMath" => flixel.math.FlxMath,
"FlxGroup" => flixel.group.FlxGroup,
"FlxTypedGroup" => flixel.group.FlxGroup.FlxTypedGroup,
"state" => flixel.FlxG.state,
"FlxG" => flixel.FlxG,
"FlxSprite" => flixel.FlxSprite,
"FlxBasic" => flixel.FlxBasic,
"FlxCamera" => flixel.FlxCamera,
"FlxEase" => flixel.tweens.FlxEase,
"FlxTween" => flixel.tweens.FlxTween,
"FlxSound" => flixel.sound.FlxSound,
"FlxAssets" => flixel.system.FlxAssets,
"FlxMath" => flixel.math.FlxMath,
"FlxGroup" => flixel.group.FlxGroup,
"FlxTypedGroup" => flixel.group.FlxGroup.FlxTypedGroup,
"FlxSpriteGroup" => flixel.group.FlxSpriteGroup,
"FlxTypeText" => flixel.addons.text.FlxTypeText,
"FlxText" => flixel.text.FlxText,
"FlxTimer" => flixel.util.FlxTimer,
"FlxPoint" => CoolUtil.getMacroAbstractClass("flixel.math.FlxPoint"),
"FlxAxes" => CoolUtil.getMacroAbstractClass("flixel.util.FlxAxes"),
"FlxColor" => CoolUtil.getMacroAbstractClass("flixel.util.FlxColor"),
"FlxTypeText" => flixel.addons.text.FlxTypeText,
"FlxText" => flixel.text.FlxText,
"FlxTimer" => flixel.util.FlxTimer,
"FlxPoint" => CoolUtil.getMacroAbstractClass("flixel.math.FlxPoint"),
"FlxAxes" => CoolUtil.getMacroAbstractClass("flixel.util.FlxAxes"),
"FlxColor" => CoolUtil.getMacroAbstractClass("flixel.util.FlxColor"),
// Engine related stuff
"engine" => {
commit: funkin.backend.system.macros.GitCommitMacro.commitNumber,
hash: funkin.backend.system.macros.GitCommitMacro.commitHash,
commit: Flags.COMMIT_NUMBER,
hash: Flags.COMMIT_HASH,
build: 2675, // 2675 being the last build num before it was removed
name: "Codename Engine"
},
"ModState" => funkin.backend.scripting.ModState,
"ModSubState" => funkin.backend.scripting.ModSubState,
"PlayState" => funkin.game.PlayState,
"GameOverSubstate" => funkin.game.GameOverSubstate,
"ModState" => funkin.backend.scripting.ModState,
"ModSubState" => funkin.backend.scripting.ModSubState,
"PlayState" => funkin.game.PlayState,
"GameOverSubstate" => funkin.game.GameOverSubstate,
"HealthIcon" => funkin.game.HealthIcon,
"HudCamera" => funkin.game.HudCamera,
"Note" => funkin.game.Note,
"Strum" => funkin.game.Strum,
"StrumLine" => funkin.game.StrumLine,
"Character" => funkin.game.Character,
"Boyfriend" => funkin.game.Character, // for compatibility
"PauseSubstate" => funkin.menus.PauseSubState,
"FreeplayState" => funkin.menus.FreeplayState,
"MainMenuState" => funkin.menus.MainMenuState,
"PauseSubState" => funkin.menus.PauseSubState,
"HudCamera" => funkin.game.HudCamera,
"Note" => funkin.game.Note,
"Strum" => funkin.game.Strum,
"StrumLine" => funkin.game.StrumLine,
"Character" => funkin.game.Character,
"Boyfriend" => funkin.game.Character, // for compatibility
"PauseSubstate" => funkin.menus.PauseSubState,
"FreeplayState" => funkin.menus.FreeplayState,
"MainMenuState" => funkin.menus.MainMenuState,
"PauseSubState" => funkin.menus.PauseSubState,
"StoryMenuState" => funkin.menus.StoryMenuState,
"TitleState" => funkin.menus.TitleState,
"Options" => funkin.options.Options,
"Paths" => funkin.backend.assets.Paths,
"Conductor" => funkin.backend.system.Conductor,
"FunkinShader" => funkin.backend.shaders.FunkinShader,
"CustomShader" => funkin.backend.shaders.CustomShader,
"Options" => funkin.options.Options,
"Paths" => funkin.backend.assets.Paths,
"Conductor" => funkin.backend.system.Conductor,
"FunkinShader" => funkin.backend.shaders.FunkinShader,
"CustomShader" => funkin.backend.shaders.CustomShader,
"FunkinText" => funkin.backend.FunkinText,
"FlxAnimate" => funkin.backend.FlxAnimate,
"FunkinSprite" => funkin.backend.FunkinSprite,
"Alphabet" => funkin.menus.ui.Alphabet,
"Alphabet" => funkin.menus.ui.Alphabet,
"CoolUtil" => funkin.backend.utils.CoolUtil,
"IniUtil" => funkin.backend.utils.IniUtil,
"XMLUtil" => funkin.backend.utils.XMLUtil,
#if sys "ZipUtil" => funkin.backend.utils.ZipUtil, #end
"MarkdownUtil" => funkin.backend.utils.MarkdownUtil,
"CoolUtil" => funkin.backend.utils.CoolUtil,
"IniUtil" => funkin.backend.utils.IniUtil,
"XMLUtil" => funkin.backend.utils.XMLUtil,
#if sys "ZipUtil" => funkin.backend.utils.ZipUtil, #end
"MarkdownUtil" => funkin.backend.utils.MarkdownUtil,
"EngineUtil" => funkin.backend.utils.EngineUtil,
"MemoryUtil" => funkin.backend.utils.MemoryUtil,
"BitmapUtil" => funkin.backend.utils.BitmapUtil,
];
}
/**
* Used internally to keep backwards compatibility with old scripts.
* This gets set on `hscript.Interp.importRedirects`,
* if you wanna modify it, please edit `hscript.Interp.importRedirects` directly.
**/
public static function getDefaultImportRedirects():Map<String, String> {
var redirects:Map<String, String> = [
"funkin.savedata.FunkinSave" => "funkin.backend.utils.FunkinSave"
];
final events = "funkin.backend.scripting.events.";
redirects[events + "CharacterNodeEvent"] = events + "character.CharacterNodeEvent";
redirects[events + "CharacterXMLEvent"] = events + "character.CharacterXMLEvent";
redirects[events + "DanceEvent"] = events + "character.DanceEvent";
redirects[events + "DirectionAnimEvent"] = events + "character.DirectionAnimEvent";
redirects[events + "DiscordPresenceUpdateEvent"] = events + "discord.DiscordPresenceUpdateEvent";
redirects[events + "GameOverCreationEvent"] = events + "gameover.GameOverCreationEvent";
redirects[events + "CamMoveEvent"] = events + "gameplay.CamMoveEvent";
redirects[events + "CountdownEvent"] = events + "gameplay.CountdownEvent";
redirects[events + "EventGameEvent"] = events + "gameplay.EventGameEvent";
redirects[events + "GameOverEvent"] = events + "gameplay.GameOverEvent";
redirects[events + "RatingUpdateEvent"] = events + "gameplay.RatingUpdateEvent";
redirects[events + "HealthIconChangeEvent"] = events + "healthicon.HealthIconChangeEvent";
redirects[events + "FreeplayAlphaUpdateEvent"] = events + "menu.freeplay.FreeplayAlphaUpdateEvent";
redirects[events + "FreeplaySongSelectEvent"] = events + "menu.freeplay.FreeplaySongSelectEvent";
redirects[events + "MenuChangeEvent"] = events + "menu.MenuChangeEvent";
redirects[events + "PauseCreationEvent"] = events + "menu.pause.PauseCreationEvent";
redirects[events + "WeekSelectEvent"] = events + "menu.storymenu.WeekSelectEvent";
redirects[events + "InputSystemEvent"] = events + "note.InputSystemEvent";
redirects[events + "NoteCreationEvent"] = events + "note.NoteCreationEvent";
redirects[events + "NoteHitEvent"] = events + "note.NoteHitEvent";
redirects[events + "NoteMissEvent"] = events + "note.NoteMissEvent";
redirects[events + "NoteUpdateEvent"] = events + "note.NoteUpdateEvent";
redirects[events + "SimpleNoteEvent"] = events + "note.SimpleNoteEvent";
redirects[events + "StrumCreationEvent"] = events + "note.StrumCreationEvent";
redirects[events + "SplashShowEvent"] = events + "splash.SplashShowEvent";
redirects[events + "PlayAnimContext"] = events + "sprite.PlayAnimContext";
redirects[events + "PlayAnimEvent"] = events + "sprite.PlayAnimEvent";
redirects[events + "StageNodeEvent"] = events + "stage.StageNodeEvent";
redirects[events + "StageXMLEvent"] = events + "stage.StageXMLEvent";
return redirects;
}
public static function getDefaultPreprocessors():Map<String, Dynamic> {
var defines = funkin.backend.system.macros.DefinesMacro.defines;
defines.set("CODENAME_ENGINE", true);
defines.set("CODENAME_VER", Application.current.meta.get('version'));
defines.set("CODENAME_BUILD", 2675); // 2675 being the last build num before it was removed
defines.set("CODENAME_COMMIT", funkin.backend.system.macros.GitCommitMacro.commitNumber);
defines.set("CODENAME_COMMIT", Flags.COMMIT_NUMBER);
return defines;
}
/**
@@ -5,9 +5,4 @@ final class AmountEvent extends CancellableEvent {
* Amount
*/
public var amount:Null<Int>;
/**
* Shows whether or not psych users complained about this class
*/
public var psychUsersComplained:Bool = true;
}
@@ -1,4 +1,5 @@
package funkin.backend.scripting.events;
final class DrawEvent extends CancellableEvent {
// temp empty for now - Nex
}
@@ -0,0 +1,7 @@
## NOTE
Keep in mind that a certain criteria was used to place events in their corresponding folders which is simply what the events themselves are mostly related to.
For example:
- `GameOverEvent` inside of the `gameplay` folder instead of the `gameover` folder since it gets called in the `PlayState` class (that owns the `gameplay` folder) instead of the `GameOverSubstate` class itself;
- `NoteHitEvent` gets indeed called by the `PlayState` class but it's also used in the `StrumLine` (For those who didn't really know, Strumlines are the Input Notes) class and since the event's name itself starts with the word `Note` it was more accurate to place it in the `note` folder instead of the `gameplay` folder that `PlayState` owns.
@@ -4,7 +4,7 @@ import flixel.FlxState;
final class StateEvent extends CancellableEvent {
/**
* Substate that is about to be opened/closed
* Substate or State that is about to be opened/closed
*/
public var substate:FlxState;
public var substate:FlxState; // WHY is it named substate :sob: - Nex
}
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.character;
import funkin.game.Character;
import haxe.xml.Access;
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.character;
import funkin.game.Character;
import haxe.xml.Access;
@@ -7,7 +7,7 @@ final class CharacterXMLEvent extends CancellableEvent {
/**
* The character instance
*/
public var character:Character;
public var character:Character;
/**
* The xml
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.character;
final class DanceEvent extends CancellableEvent {
public var danced:Bool;
@@ -1,4 +1,6 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.character;
import funkin.backend.scripting.events.sprite.PlayAnimContext;
final class DirectionAnimEvent extends CancellableEvent {
/**
@@ -0,0 +1,14 @@
package funkin.backend.scripting.events.dialogue;
/**
* CANCEL this event to prevent continuing with the next dialogue.
*
* **NOTE**: To access the current, past or next lines, use `curLine`, `lastLine` or also `dialogueLines` in the `DialogueCutscene` class (they're globals and can be accessed at any time as long as the Dialogue Cutscene is active)!
*/
final class DialogueNextLineEvent extends CancellableEvent
{
/**
* If the dialogue has just been opened.
*/
public var playFirst:Bool = false;
}
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.discord;
final class DiscordPresenceUpdateEvent extends CancellableEvent {
/**
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.gameover;
/**
* CANCEL this event to prevent default behaviour!
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.gameplay;
import flixel.math.FlxPoint;
import funkin.game.StrumLine;
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.gameplay;
import flixel.sound.FlxSound;
import flixel.tweens.FlxTween;
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.gameplay;
import funkin.backend.chart.ChartData;
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.gameplay;
import funkin.game.Character;
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.gameplay;
final class RatingUpdateEvent extends CancellableEvent {
/**
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.healthicon;
final class HealthIconChangeEvent extends CancellableEvent {
/**
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.menu;
final class MenuChangeEvent extends CancellableEvent {
/**
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.menu.freeplay;
final class FreeplayAlphaUpdateEvent extends CancellableEvent {
/**
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.menu.freeplay;
final class FreeplaySongSelectEvent extends CancellableEvent {
/**
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.menu.pause;
/**
* CANCEL this event to prevent default behaviour!
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.menu.storymenu;
import funkin.menus.StoryMenuState.WeekData;
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.note;
import funkin.game.StrumLine;
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.note;
import funkin.game.Note;
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.note;
import funkin.game.Character;
import funkin.game.Note;
@@ -24,9 +24,19 @@ final class NoteHitEvent extends CancellableEvent {
*/
public var countScore:Bool = true;
/**
* Whenever ratings should be shown or not.
* Whenever ratings (Rating sprite, Digits sprites and Combo sprite) should be shown or not.
*
* NOTE: Whether it's `true` use `displayRating` and `displayCombo` (plus `minDigitDisplay` in the PlayState class) to change what's going to pop up!
*/
public var showRating:Null<Bool> = null;
/**
* Whenever the Rating sprites should be shown or not.
*/
public var displayRating:Bool;
/**
* Whenever the Combo sprite should be shown or not (like old Week 7 patches).
*/
public var displayCombo:Bool;
/**
* Note that has been pressed
*/
@@ -123,6 +133,13 @@ final class NoteHitEvent extends CancellableEvent {
@:dox(hide)
public function cancelDeletion() {preventDeletion();}
/**
* Forces the note to be deleted.
**/
public function forceDeletion() {
deleteNote = true;
}
/**
* Prevents the vocals volume from being set to 1 after pressing the note.
*/
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.note;
import funkin.game.Character;
import funkin.game.Note;
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.note;
import funkin.game.Note;
import funkin.game.Strum;
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.note;
import funkin.game.Note;
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.note;
import funkin.game.Strum;
@@ -0,0 +1,8 @@
package funkin.backend.scripting.events.shader;
final class ShaderProcessEvent extends CancellableEvent
{
public var source:String;
public var storageType:String;
}
@@ -0,0 +1,6 @@
package funkin.backend.scripting.events.soundtray;
final class SoundTrayShowEvent extends CancellableEvent
{
public var up:Bool;
}
@@ -0,0 +1,12 @@
package funkin.backend.scripting.events.soundtray;
final class SoundTrayTextEvent extends CancellableEvent
{
public var checkIfNull:Bool;
public var reloadDefaultTextFormat:Bool;
public var displayTxt:String;
public var y:Float;
}

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