Merge branch 'main' into translations-system

This commit is contained in:
Ne_Eo
2024-11-15 18:13:04 +01:00
143 changed files with 2602 additions and 1314 deletions
+5
View File
@@ -8,3 +8,8 @@ pages/** linguist-vendored
*.hxs linguist-language=Haxe
*.hsc linguist-language=Haxe
*.hscript linguist-language=Haxe
# Include Shader files as GLSL
*.frag linguist-language=GLSL
*.vert linguist-language=GLSL
*.glsl linguist-language=GLSL
+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>
+10 -13
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 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>
+10 -11
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 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" isGF="true" 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>
+12 -12
View File
@@ -1,14 +1,14 @@
<!DOCTYPE codename-engine-character>
<character x="115" icon="gf" y="325" isGF="true" 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 x="115" y="325" sprite="gf-christmas" icon="gf" color="#A5004D" isGF="true">
<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>
+3 -3
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 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" isGF="true" 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" isGF="true">
<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>
+12 -12
View File
@@ -1,14 +1,14 @@
<!DOCTYPE codename-engine-character>
<character isPlayer="false" flipX="false" isGF="true" 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 x="100" y="275" sprite="gf" icon="gf" color="#A5004D" isGF="true">
<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>
+11 -14
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 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>
+12 -14
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 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>
+6 -6
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 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>
+6 -6
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 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>
+23 -10
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 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>
+9 -14
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 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>
+10 -14
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 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" isGF="false" 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" isGF="false">
<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>
+7 -8
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 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>
+6 -8
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 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>
+7 -7
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 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" isGF="false" 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" isGF="false">
<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>
+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 = [];
+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

+163 -158
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"/>
<?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
+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);
@@ -134,3 +127,13 @@ function focusOn(char, snap:Bool = false) {
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,31 +35,33 @@ 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) {
@@ -65,3 +69,12 @@ function focusOn(char) {
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();
}
+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" />
+6 -1
View File
@@ -136,9 +136,12 @@
<!-- Comment this out to disable support for custom ndlls. !-->
<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" />
@@ -175,6 +178,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" />
+2 -2
View File
@@ -219,7 +219,7 @@ class StringTools {
If `start` is the empty String `""`, the result is true.
**/
public static #if (java || python || (js && js_es >= 6) || cpp) inline #end function startsWith(s:String, start:String):Bool {
public static #if (java || python || (js && js_es >= 6)) inline #end function startsWith(s:String, start:String):Bool {
#if java
return (cast s : java.NativeString).startsWith(start);
#elseif hl
@@ -244,7 +244,7 @@ class StringTools {
If `end` is the empty String `""`, the result is true.
**/
public static #if (java || python || (js && js_es >= 6) || cpp) inline #end function endsWith(s:String, end:String):Bool {
public static #if (java || python || (js && js_es >= 6)) inline #end function endsWith(s:String, end:String):Bool {
#if java
return (cast s : java.NativeString).endsWith(end);
#elseif hl
+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;
@@ -46,6 +46,8 @@ class FunkinSprite extends FlxSkewedSprite implements IBeatReceiver implements I
public var debugMode:Bool = false;
public var animDatas:Map<String, AnimData> = [];
public var globalCurFrame(get, set):Int;
/**
* ODD interval -> asynced; EVEN interval -> synced
*/
@@ -130,7 +132,7 @@ class FunkinSprite extends FlxSkewedSprite implements IBeatReceiver implements I
private var countedBeat = 0;
public function beatHit(curBeat:Int)
{
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
@@ -391,4 +393,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
@@ -162,10 +162,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)
@@ -228,7 +254,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) {
@@ -256,11 +282,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
*/
@@ -217,7 +221,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) {
@@ -235,7 +239,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() {
@@ -250,19 +254,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();
}
}
+45 -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.
*/
public static inline 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,30 +59,33 @@ class Paths
public static inline function ps1(key:String, ?library:String)
return getPath('data/$key.ps1', library);
public static 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);
public static inline function soundRandom(key:String, min:Int, max:Int, ?library:String)
return sound(key + FlxG.random.int(min, max), library);
public static inline 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);
}
public static 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,8 +110,9 @@ class Paths
return scriptPath;
}
public static function chart(song:String, ?difficulty:String = "normal"):String {
difficulty = difficulty.toLowerCase();
static public function chart(song:String, ?difficulty:String):String
{
difficulty = (difficulty != null ? difficulty : Flags.DEFAULT_DIFFICULTY).toLowerCase();
song = song.toLowerCase();
return getPath('songs/$song/charts/$difficulty.json', null);
@@ -156,33 +154,33 @@ class Paths
return getPath('models/$key.awd');
}
public static inline 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));
public static inline 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');
public static inline 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));
public static inline 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');
public static inline 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));
public static inline 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');
public static inline function getAssetsRoot():String
return ModsFolder.currentModFolder != null ? '${ModsFolder.modsPath}${ModsFolder.currentModFolder}' : './assets';
inline static public function getAssetsRoot():String
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)
@@ -190,7 +188,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);
}
@@ -202,10 +200,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');
@@ -216,18 +215,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;
class Chart {
/**
* Default background colors for songs without bg color
*/
public inline static var defaultColor:FlxColor = 0xFF9271FD;
public static function loadEventsJson(songName:String) {
var path = Paths.file('songs/${songName.toLowerCase()}/events.json');
var data:Array<ChartEvent> = null;
@@ -30,7 +25,9 @@ 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');
@@ -50,19 +47,19 @@ 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)];
@@ -86,7 +83,9 @@ 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: [],
@@ -95,8 +94,8 @@ 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)
};
@@ -192,7 +191,8 @@ 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;
@@ -210,11 +210,11 @@ 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
@@ -19,7 +19,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>;
@@ -27,6 +27,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);
@@ -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 =
+97 -52
View File
@@ -19,78 +19,78 @@ 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,
@@ -101,12 +101,57 @@ class Script extends FlxBasic implements IFlxDestroyable {
#end
];
}
/**
* 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;
}
/**
@@ -4,10 +4,5 @@ final class AmountEvent extends CancellableEvent {
/**
* Amount
*/
public var amount:Int;
/**
* Shows whether or not psych users complained about this class
*/
public var psychUsersComplained:Bool = true;
public var amount:Null<Int>;
}
@@ -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
*/
@@ -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;
}
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.splash;
import funkin.game.SplashGroup;
import funkin.game.Strum;
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.sprite;
/**
Contains all contexts possible for `PlayAnimEvent`.
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.sprite;
final class PlayAnimEvent extends CancellableEvent {
/**
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.stage;
import funkin.game.Stage;
import haxe.xml.Access;
@@ -1,4 +1,4 @@
package funkin.backend.scripting.events;
package funkin.backend.scripting.events.stage;
import funkin.game.Stage;
import haxe.xml.Access;
@@ -25,6 +25,10 @@ class CustomShader extends FunkinShader {
var fragCode = Assets.exists(fragShaderPath) ? Assets.getText(fragShaderPath) : null;
var vertCode = Assets.exists(vertShaderPath) ? Assets.getText(vertShaderPath) : null;
fileName = name;
fragFileName = fragShaderPath;
vertFileName = vertShaderPath;
path = fragShaderPath+vertShaderPath;
if (fragCode == null && vertCode == null)
+366 -202
View File
@@ -1,15 +1,17 @@
package funkin.backend.shaders;
import flixel.system.FlxAssets.FlxShader;
import flixel.util.FlxSignal.FlxTypedSignal;
import haxe.Exception;
import hscript.IHScriptCustomBehaviour;
import flixel.system.FlxAssets.FlxShader;
import lime.utils.Float32Array;
import openfl.display.ShaderParameterType;
import openfl.display.ShaderParameter;
import openfl.display.BitmapData;
import openfl.display.ShaderInput;
import openfl.display.ShaderParameter;
import openfl.display.ShaderParameterType;
import openfl.display3D._internal.GLProgram;
import openfl.display3D._internal.GLShader;
import openfl.utils._internal.Log;
using StringTools;
@:access(openfl.display3D.Context3D)
@@ -18,8 +20,20 @@ using StringTools;
@:access(openfl.display.ShaderParameter)
class FunkinShader extends FlxShader implements IHScriptCustomBehaviour {
private static var __instanceFields = Type.getInstanceFields(FunkinShader);
private static var FRAGMENT_SHADER = 0;
private static var VERTEX_SHADER = 1;
public var onGLUpdate:FlxTypedSignal<Void->Void> = new FlxTypedSignal<Void->Void>();
public var onProcessGLData:FlxTypedSignal<(String, String)->Void> = new FlxTypedSignal<(String, String)->Void>();
public var glslVer:String = "120";
public var fileName:String = "FunkinShader";
public var fragFileName:String = "FunkinShader";
public var vertFileName:String = "FunkinShader";
public var shaderPrefix:String = "";
public var fragmentPrefix:String = "";
public var vertexPrefix:String = "";
/**
* Creates a new shader from the specified fragment and vertex source.
@@ -38,11 +52,171 @@ class FunkinShader extends FlxShader implements IHScriptCustomBehaviour {
super();
}
static var IMPORT_REGEX = ~/#import\s+<(.*)>/;
private function processImports(value:String, type:Int):String
{
while(IMPORT_REGEX.match(value))
{
var importPath = IMPORT_REGEX.matched(1);
var importSource = Assets.getText("assets/shaders/" + importPath);
if(importSource == null) {
var fileName = type == FRAGMENT_SHADER ? fragFileName : vertFileName;
Logs.traceColored([
Logs.logText('[Shader] ', RED),
Logs.logText('Failed to import shader ${importPath} in ${fileName}', RED),
]);
} else {
value = value.replace(IMPORT_REGEX.matched(0), importSource);
}
}
return value;
}
static var ERROR_POS_REGEX = ~/(\d+):(\d+): (.*)/g;
static var ERROR_REGEX = ~/ERROR: (\d+):(\d+): (.*)/g;
static var ERROR_REGEX_2 = ~/(\d+)\((\d+)\) : error ([^:]+): (.*)/g;
@:noCompletion private override function __createGLShader(source:String, type:Int):GLShader
{
var gl = __context.gl;
var shader = gl.createShader(type);
gl.shaderSource(shader, source);
gl.compileShader(shader);
var shaderInfoLog = gl.getShaderInfoLog(shader);
var hasInfoLog = shaderInfoLog != null && StringTools.trim(shaderInfoLog) != "";
var compileStatus = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
if (hasInfoLog || compileStatus == 0)
{
var isVertexShader = type == gl.VERTEX_SHADER;
var messageBuf = new StringBuf();
messageBuf.add((compileStatus == 0) ? "Error" : "Info");
if(isVertexShader) {
messageBuf.add(" compiling vertex shader");
if(vertFileName != null && vertFileName.length > 0) {
messageBuf.add(" (" + vertFileName + ")");
}
} else {
messageBuf.add(" compiling fragment shader");
if(fragFileName != null && fragFileName.length > 0) {
messageBuf.add(" (" + fragFileName + ")");
}
}
messageBuf.add("\n");
var errorPositions = [];
var regex = null;
var tmp = shaderInfoLog;
if(shaderInfoLog.contains(" : error ")) {
regex = ERROR_REGEX_2;
while(regex.match(tmp)) {
errorPositions.push(new ShaderErrorPosition(regex.matched(2), regex.matched(1), regex.matched(4)));
tmp = regex.matchedRight();
}
} else if(shaderInfoLog.contains("ERROR: ")) {
regex = ERROR_REGEX;
while(regex.match(tmp)) {
errorPositions.push(new ShaderErrorPosition(regex.matched(2), regex.matched(1), regex.matched(3)));
tmp = regex.matchedRight();
}
} else {
regex = ERROR_POS_REGEX;
while(regex.match(tmp)) {
errorPositions.push(new ShaderErrorPosition(regex.matched(2), regex.matched(1), regex.matched(3)));
tmp = regex.matchedRight();
}
}
var splitSource = source.split("\n");
for(error in errorPositions) {
messageBuf.add("ERROR: Line: " + error.line);
if(error.column > 0) {
messageBuf.add(", Column: " + error.column);
}
messageBuf.add(", " + error.message);
if(error.line < splitSource.length) {
messageBuf.add("\nLine: ");
messageBuf.add(splitSource[error.line-1].trim());
}
messageBuf.add("\n\n");
}
var hasErrorPosition = errorPositions.length > 0;
if(hasErrorPosition) {
messageBuf.add("Raw shader info log:\n");
}
messageBuf.add(shaderInfoLog);
messageBuf.add("\n");
messageBuf.add(source);
var message = messageBuf.toString();
if (compileStatus == 0) Log.error(message);
else if (hasInfoLog) Log.debug(message);
}
return shader;
}
@:noCompletion private override function __createGLProgram(vertexSource:String, fragmentSource:String):GLProgram
{
var program:GLProgram = null;
try
{
var gl = __context.gl;
var vertexShader = __createGLShader(vertexSource, gl.VERTEX_SHADER);
var fragmentShader = __createGLShader(fragmentSource, gl.FRAGMENT_SHADER);
program = gl.createProgram();
// Fix support for drivers that don't draw if attribute 0 is disabled
for (param in __paramFloat)
{
if (param.name.indexOf("Position") > -1 && StringTools.startsWith(param.name, "openfl_"))
{
gl.bindAttribLocation(program, 0, param.name);
break;
}
}
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
if (gl.getProgramParameter(program, gl.LINK_STATUS) == 0)
{
var messageBuf = new StringBuf();
messageBuf.add("Unable to initialize the shader program");
messageBuf.add("\n");
messageBuf.add(gl.getProgramInfoLog(program));
var message = messageBuf.toString();
Log.error(message);
}
}
catch (error:Dynamic)
{
Logs.traceColored([
Logs.logText('[Shader] ', BLUE),
Logs.logText('Failed to compile shader ${fileName}: ', RED),
Logs.logText(Std.string(error))
], TRACE);
}
return program;
return program;
}
var glRawFragmentSource:String;
var glRawVertexSource:String;
@:noCompletion override private function set_glFragmentSource(value:String):String
{
if(value == null)
value = ShaderTemplates.defaultFragmentSource;
glRawFragmentSource = value;
value = value.replace("#pragma header", ShaderTemplates.fragHeader).replace("#pragma body", ShaderTemplates.fragBody);
value = processImports(value, FRAGMENT_SHADER);
if (value != __glFragmentSource)
{
__glSourceDirty = true;
@@ -55,7 +229,9 @@ class FunkinShader extends FlxShader implements IHScriptCustomBehaviour {
{
if(value == null)
value = ShaderTemplates.defaultVertexSource;
glRawVertexSource = value;
value = value.replace("#pragma header", ShaderTemplates.vertHeader).replace("#pragma body", ShaderTemplates.vertBody);
value = processImports(value, VERTEX_SHADER);
if (value != __glVertexSource)
{
__glSourceDirty = true;
@@ -64,6 +240,11 @@ class FunkinShader extends FlxShader implements IHScriptCustomBehaviour {
return __glVertexSource = value;
}
override function __updateGL():Void {
onGLUpdate.dispatch();
super.__updateGL();
}
@:noCompletion private override function __initGL():Void
{
if (__glSourceDirty || __paramBool == null)
@@ -83,23 +264,28 @@ class FunkinShader extends FlxShader implements IHScriptCustomBehaviour {
if (__context != null && program == null)
{
var prefix = '#version ${glslVer}\n';
var prefixBuf = new StringBuf();
prefixBuf.add('#version ${glslVer}\n');
prefixBuf.add(shaderPrefix);
var gl = __context.gl;
prefix += "#ifdef GL_ES
"
+ (precisionHint == FULL ? "#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float;
#else
precision mediump float;
#endif" : "precision lowp float;")
+ "
#endif
";
prefixBuf.add("#ifdef GL_ES\n");
if (precisionHint == FULL) {
prefixBuf.add("#ifdef GL_FRAGMENT_PRECISION_HIGH\n");
prefixBuf.add("precision highp float;\n");
prefixBuf.add("#else\n");
prefixBuf.add("precision mediump float;\n");
prefixBuf.add("#endif\n");
} else {
prefixBuf.add("precision lowp float;\n");
}
prefixBuf.add("#endif\n");
var vertex = prefix + glVertexSource;
var fragment = prefix + glFragmentSource;
var prefix = prefixBuf.toString();
var vertex = prefix + vertexPrefix + glVertexSource;
var fragment = prefix + fragmentPrefix + glFragmentSource;
var id = vertex + fragment;
@@ -110,9 +296,7 @@ class FunkinShader extends FlxShader implements IHScriptCustomBehaviour {
else
{
program = __context.createProgram(GLSL);
program.__glProgram = __createGLProgram(vertex, fragment);
__context.__programs.set(id, program);
}
@@ -120,56 +304,35 @@ class FunkinShader extends FlxShader implements IHScriptCustomBehaviour {
{
glProgram = program.__glProgram;
for (input in __inputBitmapData)
{
for (input in __inputBitmapData) {
if (input.__isUniform)
{
if (input.__isUniform) {
input.index = gl.getUniformLocation(glProgram, input.name);
}
else
{
} else {
input.index = gl.getAttribLocation(glProgram, input.name);
}
}
for (parameter in __paramBool)
{
if (parameter.__isUniform)
{
for (parameter in __paramBool) {
if (parameter.__isUniform) {
parameter.index = gl.getUniformLocation(glProgram, parameter.name);
}
else
{
} else {
parameter.index = gl.getAttribLocation(glProgram, parameter.name);
}
}
for (parameter in __paramFloat)
{
if (parameter.__isUniform)
{
for (parameter in __paramFloat) {
if (parameter.__isUniform) {
parameter.index = gl.getUniformLocation(glProgram, parameter.name);
}
else
{
} else {
parameter.index = gl.getAttribLocation(glProgram, parameter.name);
}
}
for (parameter in __paramInt)
{
if (parameter.__isUniform)
{
for (parameter in __paramInt) {
if (parameter.__isUniform) {
parameter.index = gl.getUniformLocation(glProgram, parameter.name);
}
else
{
} else {
parameter.index = gl.getAttribLocation(glProgram, parameter.name);
}
}
@@ -178,8 +341,12 @@ class FunkinShader extends FlxShader implements IHScriptCustomBehaviour {
}
}
var __cancelNextProcessGLData:Bool = false;
@:noCompletion private override function __processGLData(source:String, storageType:String):Void
{
onProcessGLData.dispatch(source, storageType);
if (__cancelNextProcessGLData != (__cancelNextProcessGLData = false))
return;
var lastMatch = 0, position, regex, name, type;
if (storageType == "uniform")
@@ -202,160 +369,146 @@ class FunkinShader extends FlxShader implements IHScriptCustomBehaviour {
}
var isUniform = (storageType == "uniform");
if (StringTools.startsWith(type, "sampler"))
{
var input = new ShaderInput<BitmapData>();
input.name = name;
@:privateAccess
input.__isUniform = isUniform;
__inputBitmapData.push(input);
switch (name)
{
case "openfl_Texture":
__texture = input;
case "bitmap":
__bitmap = input;
default:
}
Reflect.setField(__data, name, input);
try{Reflect.setField(this, name, input);} catch(e) {}
}
else if (!Reflect.hasField(__data, name) || Reflect.field(__data, name) == null)
{
var parameterType:ShaderParameterType = switch (type)
{
case "bool": BOOL;
case "double", "float": FLOAT;
case "int", "uint": INT;
case "bvec2": BOOL2;
case "bvec3": BOOL3;
case "bvec4": BOOL4;
case "ivec2", "uvec2": INT2;
case "ivec3", "uvec3": INT3;
case "ivec4", "uvec4": INT4;
case "vec2", "dvec2": FLOAT2;
case "vec3", "dvec3": FLOAT3;
case "vec4", "dvec4": FLOAT4;
case "mat2", "mat2x2": MATRIX2X2;
case "mat2x3": MATRIX2X3;
case "mat2x4": MATRIX2X4;
case "mat3x2": MATRIX3X2;
case "mat3", "mat3x3": MATRIX3X3;
case "mat3x4": MATRIX3X4;
case "mat4x2": MATRIX4X2;
case "mat4x3": MATRIX4X3;
case "mat4", "mat4x4": MATRIX4X4;
default: null;
}
var length = switch (parameterType)
{
case BOOL2, INT2, FLOAT2: 2;
case BOOL3, INT3, FLOAT3: 3;
case BOOL4, INT4, FLOAT4, MATRIX2X2: 4;
case MATRIX3X3: 9;
case MATRIX4X4: 16;
default: 1;
}
var arrayLength = switch (parameterType)
{
case MATRIX2X2: 2;
case MATRIX3X3: 3;
case MATRIX4X4: 4;
default: 1;
}
switch (parameterType)
{
case BOOL, BOOL2, BOOL3, BOOL4:
var parameter = new ShaderParameter<Bool>();
parameter.name = name;
@:privateAccess
parameter.type = parameterType;
@:privateAccess
parameter.__arrayLength = arrayLength;
@:privateAccess
parameter.__isBool = true;
@:privateAccess
parameter.__isUniform = isUniform;
@:privateAccess
parameter.__length = length;
__paramBool.push(parameter);
if (name == "openfl_HasColorTransform")
{
__hasColorTransform = parameter;
}
Reflect.setField(__data, name, parameter);
try{Reflect.setField(this, name, parameter);} catch(e) {}
case INT, INT2, INT3, INT4:
var parameter = new ShaderParameter<Int>();
parameter.name = name;
@:privateAccess
parameter.type = parameterType;
@:privateAccess
parameter.__arrayLength = arrayLength;
@:privateAccess
parameter.__isInt = true;
@:privateAccess
parameter.__isUniform = isUniform;
@:privateAccess
parameter.__length = length;
@:privateAccess
__paramInt.push(parameter);
Reflect.setField(__data, name, parameter);
try{Reflect.setField(this, name, parameter);} catch(e) {}
default:
var parameter = new ShaderParameter<Float>();
parameter.name = name;
@:privateAccess
parameter.type = parameterType;
@:privateAccess
parameter.__arrayLength = arrayLength;
#if lime
@:privateAccess
if (arrayLength > 0) parameter.__uniformMatrix = new Float32Array(arrayLength * arrayLength);
#end
@:privateAccess
parameter.__isFloat = true;
@:privateAccess
parameter.__isUniform = isUniform;
@:privateAccess
parameter.__length = length;
__paramFloat.push(parameter);
if (StringTools.startsWith(name, "openfl_"))
{
switch (name)
{
case "openfl_Alpha": __alpha = parameter;
case "openfl_ColorMultiplier": __colorMultiplier = parameter;
case "openfl_ColorOffset": __colorOffset = parameter;
case "openfl_Matrix": __matrix = parameter;
case "openfl_Position": __position = parameter;
case "openfl_TextureCoord": __textureCoord = parameter;
case "openfl_TextureSize": __textureSize = parameter;
default:
}
}
Reflect.setField(__data, name, parameter);
try{Reflect.setField(this, name, parameter);} catch(e) {}
}
}
registerParameter(name, type, isUniform);
position = regex.matchedPos();
lastMatch = position.pos + position.len;
}
}
function registerParameter(name:String, type:String, isUniform:Bool):Void
{
if (StringTools.startsWith(type, "sampler"))
{
var input = new ShaderInput<BitmapData>();
input.name = name;
input.__isUniform = isUniform;
__inputBitmapData.push(input);
switch (name)
{
case "openfl_Texture":
__texture = input;
case "bitmap":
__bitmap = input;
default:
}
Reflect.setField(__data, name, input);
try{Reflect.setField(this, name, input);} catch(e) {}
}
else if (!Reflect.hasField(__data, name) || Reflect.field(__data, name) == null)
{
var parameterType:ShaderParameterType = switch (type)
{
case "bool": BOOL;
case "double", "float": FLOAT;
case "int", "uint": INT;
case "bvec2": BOOL2;
case "bvec3": BOOL3;
case "bvec4": BOOL4;
case "ivec2", "uvec2": INT2;
case "ivec3", "uvec3": INT3;
case "ivec4", "uvec4": INT4;
case "vec2", "dvec2": FLOAT2;
case "vec3", "dvec3": FLOAT3;
case "vec4", "dvec4": FLOAT4;
case "mat2", "mat2x2": MATRIX2X2;
case "mat2x3": MATRIX2X3;
case "mat2x4": MATRIX2X4;
case "mat3x2": MATRIX3X2;
case "mat3", "mat3x3": MATRIX3X3;
case "mat3x4": MATRIX3X4;
case "mat4x2": MATRIX4X2;
case "mat4x3": MATRIX4X3;
case "mat4", "mat4x4": MATRIX4X4;
default: null;
}
var length = switch (parameterType)
{
case BOOL2, INT2, FLOAT2: 2;
case BOOL3, INT3, FLOAT3: 3;
case BOOL4, INT4, FLOAT4, MATRIX2X2: 4;
case MATRIX3X3: 9;
case MATRIX4X4: 16;
default: 1;
}
var arrayLength = switch (parameterType)
{
case MATRIX2X2: 2;
case MATRIX3X3: 3;
case MATRIX4X4: 4;
default: 1;
}
switch (parameterType)
{
case BOOL, BOOL2, BOOL3, BOOL4:
var parameter = new ShaderParameter<Bool>();
parameter.name = name;
parameter.type = parameterType;
parameter.__arrayLength = arrayLength;
parameter.__isBool = true;
parameter.__isUniform = isUniform;
parameter.__length = length;
__paramBool.push(parameter);
if (name == "openfl_HasColorTransform")
{
__hasColorTransform = parameter;
}
Reflect.setField(__data, name, parameter);
try{Reflect.setField(this, name, parameter);} catch(e) {}
case INT, INT2, INT3, INT4:
var parameter = new ShaderParameter<Int>();
parameter.name = name;
parameter.type = parameterType;
parameter.__arrayLength = arrayLength;
parameter.__isInt = true;
parameter.__isUniform = isUniform;
parameter.__length = length;
__paramInt.push(parameter);
Reflect.setField(__data, name, parameter);
try{Reflect.setField(this, name, parameter);} catch(e) {}
default:
var parameter = new ShaderParameter<Float>();
parameter.name = name;
parameter.type = parameterType;
parameter.__arrayLength = arrayLength;
#if lime
if (arrayLength > 0) parameter.__uniformMatrix = new Float32Array(arrayLength * arrayLength);
#end
parameter.__isFloat = true;
parameter.__isUniform = isUniform;
parameter.__length = length;
__paramFloat.push(parameter);
if (StringTools.startsWith(name, "openfl_"))
{
switch (name)
{
case "openfl_Alpha": __alpha = parameter;
case "openfl_ColorMultiplier": __colorMultiplier = parameter;
case "openfl_ColorOffset": __colorOffset = parameter;
case "openfl_Matrix": __matrix = parameter;
case "openfl_Position": __position = parameter;
case "openfl_TextureCoord": __textureCoord = parameter;
case "openfl_TextureSize": __textureSize = parameter;
default:
}
}
Reflect.setField(__data, name, parameter);
try{Reflect.setField(this, name, parameter);} catch(e) {}
}
}
}
public function hget(name:String):Dynamic {
if (__instanceFields.contains(name) || __instanceFields.contains('get_${name}'))
return Reflect.getProperty(this, name);
@@ -394,7 +547,6 @@ class FunkinShader extends FlxShader implements IHScriptCustomBehaviour {
var cl:String = Type.getClassName(Type.getClass(field));
// cant do "field is ShaderInput" for some reason
if (cl.startsWith("openfl.display.ShaderParameter")) {
@:privateAccess
if (field.__length <= 1) {
if ((val is Array))
return field.value = val;
@@ -547,3 +699,15 @@ class ShaderTypeException extends Exception {
super('ShaderTypeException - Tried to set the shader uniform "${name}" as a ${Type.getClassName(has)}, but the shader uniform is a ${Std.string(want)}.');
}
}
class ShaderErrorPosition {
public var column:Int;
public var line:Int;
public var message:String;
public function new(line:String, column:String, message:String) {
this.line = Std.parseInt(line);
this.column = Std.parseInt(column);
this.message = message;
}
}
@@ -0,0 +1,111 @@
package funkin.backend.shaders;
import hscript.IHScriptCustomBehaviour;
import funkin.backend.scripting.events.shader.ShaderProcessEvent;
import funkin.backend.scripting.ScriptPack;
import funkin.backend.scripting.Script;
@:structInit
class FieldInfo {
public var get:Void->Dynamic;
public var set:Dynamic->Dynamic;
}
@:access(funkin.backend.shaders.FunkinShader)
class ScriptableShader extends FlxBasic implements IHScriptCustomBehaviour {
private static var __instanceFields = Type.getInstanceFields(ScriptableShader);
public var shader:FunkinShader;
public var script:Script;
var fields:Map<String, FieldInfo> = [];
public function new(shader:FunkinShader, ?scriptName:String, ?parentScriptPack:ScriptPack) {
super();
if(parentScriptPack == null && PlayState.instance != null)
parentScriptPack = PlayState.instance.scripts;
if(scriptName == null)
if((shader is CustomShader)) scriptName = cast(shader, CustomShader).fileName;
else throw "Missing name for shader script, please provide a scriptName, or use CustomShader";
script = Script.create(Paths.script('shaders/$scriptName'));
script.setParent(shader);
script.set("shader", shader);
script.set("registerParameter", shader.registerParameter);
script.set("registerField", (name:String, get: Void->Dynamic, set: Dynamic->Dynamic) -> {
registerField(name, get, set);
});
script.set("registerShaderField", (name:String, shaderField:String) -> {
var get = () -> shader.hget(shaderField);
var set = (value:Dynamic) -> {
var val = shader.hset(shaderField, value);
script.set(name, val);
return val;
};
registerField(name, get, set);
var gg = script.get(name);
if(gg != null) {
shader.hset(shaderField, gg);
}
});
if(parentScriptPack != null)
script.setPublicMap(parentScriptPack.publicVariables);
script.load();
script.call("create");
shader.onGLUpdate.add(updateGL);
shader.onProcessGLData.add(processGLData);
}
function registerField(name:String, get: Void->Dynamic, set: Dynamic->Dynamic) {
fields.set(name, {
get: get,
set: set
});
script.set("get_"+name, get);
script.set("set_"+name, set);
}
public override function update(elapsed:Float) script.call("update", [elapsed]);
public override function draw() script.call("draw", []);
public function updateGL() script.call("updateGL", []);
public function processGLData(source:String, storageType:String) {
var event = EventManager.get(ShaderProcessEvent).recycle(source, storageType);
script.call("processGLData", [event]);
if(event.cancelled)
shader.__cancelNextProcessGLData = true;
script.call("processGLDataPost", [event]);
}
public override function destroy() {
shader.onGLUpdate.remove(updateGL);
shader.onProcessGLData.remove(processGLData);
if(script != null) {
script.call("destroy");
script.destroy();
}
fields = null;
super.destroy();
}
public function hget(name:String):Dynamic {
if(fields.exists(name))
return fields.get(name).get();
if (__instanceFields.contains(name) || __instanceFields.contains('get_${name}'))
return Reflect.getProperty(this, name);
return shader.hget(name);
}
public function hset(name:String, val:Dynamic):Dynamic {
if (fields.exists(name)) {
return fields.get(name).set(val);
}
if (__instanceFields.contains(name) || __instanceFields.contains('set_${name}')) {
Reflect.setProperty(this, name, val);
return val;
}
return shader.hset(name, val);
}
}
+2 -2
View File
@@ -45,7 +45,7 @@ class Conductor
/**
* Number of steps per beat (bottom number in time signature). Defaults to 4.
*/
public static var stepsPerBeat:Float = 4;
public static var stepsPerBeat:Int = 4;
/**
@@ -262,7 +262,7 @@ class Conductor
}
}
public static function changeBPM(newBpm:Float, beatsPerMeasure:Float = 4, stepsPerBeat:Float = 4)
public static function changeBPM(newBpm:Float, beatsPerMeasure:Float = 4, stepsPerBeat:Int = 4)
{
bpm = newBpm;
+122
View File
@@ -2,7 +2,10 @@ package funkin.backend.system;
import lime.utils.AssetLibrary;
import lime.utils.AssetType;
import flixel.util.FlxColor;
import lime.app.Application;
import funkin.backend.system.macros.GitCommitMacro;
import funkin.backend.assets.IModsAssetLibrary;
import funkin.backend.assets.ScriptedAssetLibrary;
@@ -11,6 +14,43 @@ import funkin.backend.assets.ScriptedAssetLibrary;
*/
@:build(funkin.backend.system.macros.FlagMacro.build())
class Flags {
// -- Codename's Default Flags --
public static var COMMIT_NUMBER:Int = GitCommitMacro.commitNumber;
public static var COMMIT_HASH:String = GitCommitMacro.commitHash;
public static var COMMIT_MESSAGE:String = 'Commit $COMMIT_NUMBER ($COMMIT_HASH)';
@:lazy public static var VERSION_MESSAGE:String = 'Codename Engine v${Application.current.meta.get('version')}';
public static var REPO_NAME:String = "CodenameEngine";
public static var REPO_OWNER:String = "FNF-CNE-Devs";
public static var REPO_URL:String = 'https://github.com/$REPO_OWNER/$REPO_NAME';
// make this empty once you guys are done with the project.
// good luck /gen <3 @crowplexus
public static var RELEASE_CYCLE:String = "Beta";
/**
* Preferred sound extension for the game's audio files.
* Currently is set to `mp3` for web targets, and `ogg` for other targets.
*/
public static var SOUND_EXT:String = #if web "mp3" #else "ogg" #end; // we also support wav
public static var VIDEO_EXT:String = "mp4";
public static var IMAGE_EXT:String = "png"; // we also support jpg
public static var DEFAULT_DISCORD_LOGO_KEY:String = "icon";
public static var DEFAULT_DISCORD_CLIENT_ID:String = "1027994136193810442";
public static var DEFAULT_DISCORD_LOGO_TEXT:String = "Codename Engine";
@:also(funkin.game.Character.FALLBACK_CHARACTER)
public static var DEFAULT_CHARACTER:String = "bf";
public static var DEFAULT_GIRLFRIEND:String = "gf";
public static var DEFAULT_OPPONENT:String = "dad";
@:also(funkin.game.PlayState.difficulty)
public static var DEFAULT_DIFFICULTY:String = "normal";
public static var DEFAULT_STAGE:String = "stage";
public static var DEFAULT_SCROLL_SPEED:Float = 2.0;
public static var DEFAULT_HEALTH_ICON:String = "face";
public static var SONGS_LIST_MOD_MODE:Allow<"prepend", "override", "append"> = "override";
public static var WEEKS_LIST_MOD_MODE:Allow<"prepend", "override", "append"> = "override";
@@ -29,7 +69,89 @@ class Flags {
public static var WHITELISTED_LANGUAGES:Array<String> = [];
// Internal stuff
public static var DEFAULT_BPM:Float = 100.0;
public static var DEFAULT_BEATS_PER_MEASURE:Float = 4;
public static var DEFAULT_STEPS_PER_BEAT:Int = 4;
public static var SUPPORTED_CHART_RUNTIME_FORMATS:Array<String> = ["Legacy", "Psych Engine"];
public static var SUPPORTED_CHART_FORMATS:Array<String> = ["BaseGame"];
public static var BASEGAME_SONG_METADATA_VERSION:String = "2.2.2";
public static var BASEGAME_SONG_CHART_DATA_VERSION:String = "2.0.0";
public static var BASEGAME_DEFAULT_NOTE_STYLE:String = 'funkin';
public static var BASEGAME_DEFAULT_ALBUM_ID:String = 'volume1';
public static var BASEGAME_DEFAULT_PREVIEW_START:Float = 0;
public static var BASEGAME_DEFAULT_PREVIEW_END:Float = 15000;
/**
* Default background colors for songs without bg color
*/
public static var DEFAULT_COLOR:FlxColor = 0xFF9271FD;
public static var DEFAULT_COOP_ALLOWED:Bool = false;
public static var DEFAULT_OPPONENT_MODE_ALLOWED:Bool = false;
@:also(funkin.game.PlayState.coopMode)
public static var DEFAULT_COOP_MODE:Bool = false; // used in playstate if it doesnt find it
@:also(funkin.game.PlayState.opponentMode)
public static var DEFAULT_OPPONENT_MODE:Bool = false;
public static var DEFAULT_NOTE_MS_LIMIT:Float = 1500;
public static var DEFAULT_NOTE_SCALE:Float = 0.7;
@:also(funkin.game.Character.FALLBACK_DEAD_CHARACTER)
public static var DEFAULT_GAMEOVER_CHARACTER:String = "bf-dead";
public static var DEFAULT_GAMEOVER_SONG:String = "gameOver";
public static var DEFAULT_GAMEOVER_LOSS_SFX:String = "gameOverSFX";
public static var DEFAULT_GAMEOVER_RETRY_SFX:String = "gameOverEnd";
public static var DEFAULT_CAM_ZOOM_INTERVAL:Int = 4;
public static var DEFAULT_CAM_ZOOM_STRENGTH:Int = 1;
public static var DEFAULT_CAM_ZOOM:Float = 1.05; // what zoom level it defaults to
public static var DEFAULT_HUD_ZOOM:Float = 1.0;
public static var MAX_CAMERA_ZOOM:Float = 1.35;
public static var DEFAULT_PAUSE_ITEMS:Array<String> = ['Resume', 'Restart Song', 'Change Controls', 'Change Options', 'Exit to menu', "Exit to charter"];
public static var DEFAULT_CUTSCENE_PAUSE_ITEMS:Array<String> = ['Resume Cutscene', 'Skip Cutscene', 'Restart Cutscene', 'Exit to menu'];
public static var DEFAULT_GITAROO:Bool = true;
public static var GITAROO_CHANCE:Float = 0.1;
public static var DEFAULT_CAN_ACCESS_DEBUG_MENUS:Bool = true;
public static var DEFAULT_MUTE_VOCALS_ON_MISS:Bool = true;
public static var DEFAULT_MAX_HEALTH:Float = 2.0;
public static var DEFAULT_HEALTH:Null<Float> = null;//DEFAULT_MAX_HEALTH / 2.0;
public static var BOP_ICON_SCALE:Float = 1.2;
public static var ICON_OFFSET:Float = 26;
public static var ICON_LERP:Float = 0.33;
public static var CAM_BOP_STRENGTH:Float = 0.015;
public static var HUD_BOP_STRENGTH:Float = 0.03;
public static var DEFAULT_CAM_ZOOM_LERP:Float = 0.05;
public static var DEFAULT_HUD_ZOOM_LERP:Float = 0.05;
public static var MAX_SPLASHES:Int = 8;
public static var STUNNED_TIME:Float = 5 / 60;
@:also(funkin.game.PlayState.daPixelZoom)
public static var PIXEL_ART_SCALE:Float = 6.0;
public static var DEFAULT_COMBO_GROUP_MAX_SIZE:Int = 25;
public static var DEFAULT_STRUM_AMOUNT:Int = 4;
public static var DEFAULT_CAMERA_FOLLOW_SPEED:Float = 0.04;
public static var VOCAL_OFFSET_VIOLATION_THRESHOLD:Float = 25;
// Usage: Codename Credits
public static var MAIN_DEVS_COLOR:FlxColor = 0xFF9C35D5;
public static var MIN_CONTRIBUTIONS_COLOR:FlxColor = 0xFFB4A7DA;
public static var UNDO_PREFIX:String = "* ";
public static var JSON_PRETTY_PRINT:String = "\t";
// -- End of Codename's Default Flags --
/**
* Flags that Codename couldn't recognize as it's own defaults (they can only be `string`!).
*/
@:bypass public static var customFlags:Map<String, String> = [];
public static function load() {
+17 -11
View File
@@ -29,10 +29,6 @@ import android.os.Build;
class Main extends Sprite
{
// make this empty once you guys are done with the project.
// good luck /gen <3 @crowplexus
public static final releaseCycle:String = "Beta";
public static var instance:Main;
public static var modToLoad:String = null;
@@ -128,6 +124,9 @@ class Main extends Sprite
ShaderResizeFix.init();
Logs.init();
Paths.init();
hscript.Interp.importRedirects = funkin.backend.scripting.Script.getDefaultImportRedirects();
#if GLOBAL_SCRIPT
funkin.backend.scripting.GlobalScript.init();
#end
@@ -149,7 +148,7 @@ class Main extends Sprite
Assets.registerLibrary('default', lib);
funkin.options.PlayerSettings.init();
funkin.savedata.FunkinSave.init();
funkin.backend.utils.FunkinSave.init();
Options.load();
FlxG.fixedTimestep = false;
@@ -172,15 +171,22 @@ class Main extends Sprite
initTransition();
}
public static function refreshAssets() {
public static function refreshAssets() @:privateAccess {
WindowUtils.resetTitle();
FlxSoundTray.volumeChangeSFX = Paths.sound('menu/volume');
FlxSoundTray.volumeUpChangeSFX = null;
FlxSoundTray.volumeDownChangeSFX = null;
var game = FlxG.game;
var daSndTray = Type.createInstance(game._customSoundTray = funkin.menus.ui.FunkinSoundTray, []);
var index:Int = game.numChildren - 1;
if (FlxG.game.soundTray != null)
FlxG.game.soundTray.text.setTextFormat(new TextFormat(Paths.font("vcr.ttf")));
if(game.soundTray != null)
{
var newIndex:Int = game.getChildIndex(game.soundTray);
if(newIndex != -1) index = newIndex;
game.removeChild(game.soundTray);
game.soundTray.__cleanup();
}
game.addChildAt(game.soundTray = daSndTray, index);
}
public static function initTransition() {

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