Merge branch 'main' into pr/397
This commit is contained in:
@@ -12,8 +12,8 @@ Also, the command `.\cne test` uses the source assets folder instead of the expo
|
||||
## Codename Engine
|
||||
|
||||
Codename Engine is a new Friday Night Funkin' Engine aimed at simplifying modding, along with extensiblity and ease of use.<br>
|
||||
Make sure to read the wiki and join the Discord server linked there!<br>
|
||||
#### It includes many new features, as seen [here](FEATURES.md)<br>
|
||||
### Before making issues or need help with something, check our website [HERE](https://fnf-cne-devs.github.io/) (it contains a wiki of how to mod with EXAMPLES, an api, lists of mods made with Codename Engine and more)!!!
|
||||
#### The Engine includes many new features, as seen [here](FEATURES.md)<br>
|
||||
#### Wanna see the new features added in the most recent update? Click [here](PATCHNOTES.md)<br>
|
||||
|
||||
## How to download
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -1,15 +1,12 @@
|
||||
<!DOCTYPE codename-engine-character>
|
||||
<character isPlayer="true" flipX="true" x="200" y="570" antialiasing="false" scale="6" gameOverChar="bf-pixel-dead" color="#7BD6F6">
|
||||
<anim name="idle" anim="BF IDLE" fps="24" loop="false" x="0" y="0" />
|
||||
|
||||
<!-- Offsets are actually multiplied by scale -->
|
||||
<anim name="singLEFT" anim="BF LEFT NOTE" fps="24" loop="false" x="0" y="0" />
|
||||
<anim name="singDOWN" anim="BF DOWN NOTE" fps="24" loop="false" x="0" y="0" />
|
||||
<anim name="singUP" anim="BF UP NOTE" fps="24" loop="false" x="0" y="0" />
|
||||
<anim name="singRIGHT" anim="BF RIGHT NOTE" fps="24" loop="false" x="0" y="0" />
|
||||
|
||||
<anim name="singUPmiss" anim="BF UP MISS" fps="24" loop="false" x="0" y="0"/>
|
||||
<anim name="singLEFTmiss" anim="BF LEFT MISS" fps="24" loop="false" x="0" y="0"/>
|
||||
<anim name="singRIGHTmiss" anim="BF RIGHT MISS" fps="24" loop="false" x="0" y="0"/>
|
||||
<anim name="singDOWNmiss" anim="BF DOWN MISS" fps="24" loop="false" x="0" y="0"/>
|
||||
</character>
|
||||
<character x="200" y="570" sprite="bf-pixel" scale="6" antialiasing="false" flipX="true" isPlayer="true" icon="bf-pixel" color="#7BD6F6" gameOverChar="bf-pixel-dead">
|
||||
<anim name="idle" anim="BF IDLE" x="0" y="0" fps="24" loop="false"/>
|
||||
<anim name="singLEFT" anim="BF LEFT NOTE" x="-1" y="0" fps="24" loop="false"/>
|
||||
<anim name="singDOWN" anim="BF DOWN NOTE" x="0" y="0" fps="24" loop="false"/>
|
||||
<anim name="singUP" anim="BF UP NOTE" x="0" y="0" fps="24" loop="false"/>
|
||||
<anim name="singRIGHT" anim="BF RIGHT NOTE" x="0" y="0" fps="24" loop="false"/>
|
||||
<anim name="singUPmiss" anim="BF UP MISS" x="0" y="0" fps="24" loop="false"/>
|
||||
<anim name="singLEFTmiss" anim="BF LEFT MISS" x="-1" y="0" fps="24" loop="false"/>
|
||||
<anim name="singRIGHTmiss" anim="BF RIGHT MISS" x="0" y="0" fps="24" loop="false"/>
|
||||
<anim name="singDOWNmiss" anim="BF DOWN MISS" x="0" y="0" fps="24" loop="false"/>
|
||||
</character>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
<!DOCTYPE codename-engine-character>
|
||||
<character isPlayer="false" flipX="false" holdTime="6.1" color="#AF66CE">
|
||||
<anim name="idle" anim="Dad idle dance" fps="24" loop="false" x="0" y="0"/>
|
||||
<anim name="singUP" anim="Dad Sing note UP" fps="24" loop="false" x="-6" y="50"/>
|
||||
<anim name="singLEFT" anim="dad sing note right" fps="24" loop="false" x="-10" y="10"/>
|
||||
<anim name="singRIGHT" anim="Dad Sing Note LEFT" fps="24" loop="false" x="0" y="27"/>
|
||||
<anim name="singDOWN" anim="Dad Sing Note DOWN" fps="24" loop="false" x="0" y="-30"/>
|
||||
<!-- funny loop -->
|
||||
<anim name="idle-loop" anim="Dad idle dance" fps="24" loop="true" x="0" y="0" indices="10,11,12,12"/>
|
||||
<anim name="singUP-loop" anim="Dad Sing note UP" fps="24" loop="true" x="-6" y="50" indices="56,57,58,59"/>
|
||||
<anim name="singLEFT-loop" anim="dad sing note right" fps="24" loop="true" x="-10" y="10" indices="12,13,14,15"/>
|
||||
<anim name="singRIGHT-loop" anim="Dad Sing Note LEFT" fps="24" loop="true" x="0" y="27" indices="15,16,17,18"/>
|
||||
</character>
|
||||
<character sprite="dad" icon="dad" color="#AF66CE" holdTime="6.1">
|
||||
<anim name="idle" anim="Dad idle dance" x="0" y="0" fps="24" loop="false" indices="2..12,0,1"/>
|
||||
<anim name="singUP" anim="Dad Sing note UP" x="-10" y="50" fps="24" loop="false"/>
|
||||
<anim name="singLEFT" anim="dad sing note right" x="-10" y="10" fps="24" loop="false"/>
|
||||
<anim name="singRIGHT" anim="Dad Sing Note LEFT" x="-4" y="26" fps="24" loop="false"/>
|
||||
<anim name="singDOWN" anim="Dad Sing Note DOWN" x="2" y="-31" fps="24" loop="false"/>
|
||||
<anim name="idle-loop" anim="Dad idle dance" x="0" y="0" fps="24" loop="true" indices="10..12,12"/>
|
||||
<anim name="singUP-loop" anim="Dad Sing note UP" x="-10" y="50" fps="24" loop="true" indices="56..59"/>
|
||||
<anim name="singLEFT-loop" anim="dad sing note right" x="-10" y="10" fps="24" loop="true" indices="12..15"/>
|
||||
<anim name="singRIGHT-loop" anim="Dad Sing Note LEFT" x="-4" y="26" fps="24" loop="true" indices="15..18"/>
|
||||
</character>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
<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>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!DOCTYPE codename-engine-character>
|
||||
<character isPlayer="false" flipX="false" x="180" y="300" antialiasing="false" scale="6" camx="180" camy="300" color="#C70660">
|
||||
<anim name="danceLeft" anim="GF IDLE" fps="24" loop="false" indices="30,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14" x="0" y="0" />
|
||||
<anim name="danceRight" anim="GF IDLE" fps="24" loop="false" indices="15,16,17,18,19,20,21,22,23,24,25,26,27,28,29" x="0" y="0" />
|
||||
</character>
|
||||
<character x="180" y="300" sprite="gf-pixel" scale="6" antialiasing="false" camx="180" camy="300" icon="gf-pixel" color="#C70660">
|
||||
<anim name="danceLeft" anim="GF IDLE" x="0" y="0" fps="24" loop="false" indices="0..14"/>
|
||||
<anim name="danceRight" anim="GF IDLE" x="0" y="0" fps="24" loop="false" indices="15..30"/>
|
||||
</character>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
<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>
|
||||
|
||||
@@ -1,16 +1,13 @@
|
||||
<!DOCTYPE codename-engine-character>
|
||||
<character isPlayer="false" flipX="false" icon="mom" color="#D8558E">
|
||||
<anim name="idle" anim="Mom Idle" fps="24" loop="false" />
|
||||
<anim name="singUP" anim="Mom Up Pose" fps="24" loop="false" x="14" y="71"/>
|
||||
<anim name="singDOWN" anim="MOM DOWN POSE" fps="24" loop="false" x="20" y="-160"/>
|
||||
<anim name="singLEFT" anim="Mom Left Pose" fps="24" loop="false" x="250" y="-23"/>
|
||||
<!-- ANIMATION IS CALLED MOM LEFT POSE BUT ITS FOR THE RIGHT -->
|
||||
<!-- CUZ DAVE IS DUMB! -->
|
||||
<anim name="singRIGHT" anim="Mom Pose Left" fps="24" loop="false" x="10" y="-60"/>
|
||||
<!-- funny loop -->
|
||||
<anim name="idle-loop" anim="Mom Idle" fps="24" loop="true" indices="10,11,12,13"/>
|
||||
<anim name="singUP-loop" anim="Mom Up Pose" fps="24" loop="true" x="14" y="71" indices="11,12,13,14"/>
|
||||
<anim name="singDOWN-loop" anim="MOM DOWN POSE" fps="24" loop="true" x="20" y="-160" indices="11,12,13,14"/>
|
||||
<anim name="singLEFT-loop" anim="Mom Left Pose" fps="24" loop="true" x="250" y="-23" indices="6,7,8,9"/>
|
||||
<anim name="singRIGHT-loop" anim="Mom Pose Left" fps="24" loop="true" x="10" y="-60" indices="6,7,8,9"/>
|
||||
</character>
|
||||
<character sprite="mom-car" icon="mom" color="#D8558E">
|
||||
<anim name="idle" anim="Mom Idle" x="0" y="0" fps="24" loop="false"/>
|
||||
<anim name="singUP" anim="Mom Up Pose" x="-1" y="81" fps="24" loop="false"/>
|
||||
<anim name="singDOWN" anim="MOM DOWN POSE" x="-12" y="-160" fps="24" loop="false"/>
|
||||
<anim name="singLEFT" anim="Mom Left Pose" x="250" y="-23" fps="24" loop="false"/>
|
||||
<anim name="singRIGHT" anim="Mom Pose Left" x="-15" y="-55" fps="24" loop="false"/>
|
||||
<anim name="idle-loop" anim="Mom Idle" x="0" y="0" fps="24" loop="true" indices="10..13"/>
|
||||
<anim name="singUP-loop" anim="Mom Up Pose" x="-1" y="81" fps="24" loop="true" indices="11..14"/>
|
||||
<anim name="singDOWN-loop" anim="MOM DOWN POSE" x="-12" y="-160" fps="24" loop="true" indices="11..14"/>
|
||||
<anim name="singLEFT-loop" anim="Mom Left Pose" x="250" y="-23" fps="24" loop="true" indices="6..9"/>
|
||||
<anim name="singRIGHT-loop" anim="Mom Pose Left" x="-15" y="-55" fps="24" loop="true" indices="6..9"/>
|
||||
</character>
|
||||
|
||||
@@ -1,16 +1,14 @@
|
||||
<!DOCTYPE codename-engine-character>
|
||||
<character isPlayer="false" flipX="false" color="#D8558E">
|
||||
<anim name="idle" anim="Mom Idle" fps="24" loop="false" />
|
||||
<anim name="singUP" anim="Mom Up Pose" fps="24" loop="false" x="14" y="71"/>
|
||||
<anim name="singDOWN" anim="MOM DOWN POSE" fps="24" loop="false" x="20" y="-160"/>
|
||||
<anim name="singLEFT" anim="Mom Left Pose" fps="24" loop="false" x="250" y="-23"/>
|
||||
<!-- ANIMATION IS CALLED MOM LEFT POSE BUT ITS FOR THE RIGHT -->
|
||||
<!-- CUZ DAVE IS DUMB! -->
|
||||
<anim name="singRIGHT" anim="Mom Pose Left" fps="24" loop="false" x="10" y="-60"/>
|
||||
<!-- funny loop -->
|
||||
<anim name="idle-loop" anim="Mom Idle" fps="24" loop="true" indices="10,11,12,13"/>
|
||||
<anim name="singUP-loop" anim="Mom Up Pose" fps="24" loop="true" x="14" y="71" indices="11,12,13,14"/>
|
||||
<anim name="singDOWN-loop" anim="MOM DOWN POSE" fps="24" loop="true" x="20" y="-160" indices="9,10,11,12"/>
|
||||
<anim name="singLEFT-loop" anim="Mom Left Pose" fps="24" loop="true" x="250" y="-23" indices="6,7,8,9"/>
|
||||
<anim name="singRIGHT-loop" anim="Mom Pose Left" fps="24" loop="true" x="10" y="-60" indices="6,7,8,9"/>
|
||||
</character>
|
||||
<character sprite="mom" icon="mom" color="#D8558E">
|
||||
<anim name="idle" anim="Mom Idle" x="0" y="0" fps="24" loop="false"/>
|
||||
<anim name="singUP" anim="Mom Up Pose" x="13" y="67" fps="24" loop="false"/>
|
||||
<anim name="singDOWN" anim="MOM DOWN POSE" x="8" y="-173" fps="24" loop="false"/>
|
||||
<anim name="singLEFT" anim="Mom Left Pose" x="282" y="-28" fps="24" loop="false"/>
|
||||
<anim name="singRIGHT" anim="Mom Pose Left" x="-20" y="-60" fps="24" loop="false"/>
|
||||
<anim name="idle-loop" anim="Mom Idle" x="0" y="0" fps="24" loop="true" indices="10..13"/>
|
||||
<anim name="singUP-loop" anim="Mom Up Pose" x="13" y="67" fps="24" loop="true" indices="11..14"/>
|
||||
<anim name="singDOWN-loop" anim="MOM DOWN POSE" x="8" y="-173" fps="24" loop="true" indices="11..14"/>
|
||||
<anim name="singLEFT-loop" anim="Mom Left Pose" x="282" y="-28" fps="24" loop="true" indices="6..9"/>
|
||||
<anim name="singRIGHT-loop" anim="Mom Pose Left" x="-20" y="-60" fps="24" loop="true" indices="6..9"/>
|
||||
</character>
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<!DOCTYPE codename-engine-character>
|
||||
<character isPlayer="false" flipX="false" x="0" y="130" icon="monster" color="#F3FF6E">
|
||||
<anim name="idle" anim="monster idle" fps="24" loop="false" x="0" y="0"/>
|
||||
<anim name="singUP" anim="monster up note" fps="24" loop="false" x="-20" y="50"/>
|
||||
<anim name="singRIGHT" anim="Monster left note" fps="24" loop="false" x="-30" y="0"/>
|
||||
<anim name="singLEFT" anim="Monster Right note" fps="24" loop="false" x="-51" y="0"/>
|
||||
<anim name="singDOWN" anim="monster down" fps="24" loop="false" x="-40" y="-94"/>
|
||||
</character>
|
||||
<character y="130" sprite="monster-christmas" icon="monster" color="#F3FF6E">
|
||||
<anim name="idle" anim="monster idle" x="0" y="0" fps="24" loop="false"/>
|
||||
<anim name="singUP" anim="monster up note" x="-26" y="57" fps="24" loop="false"/>
|
||||
<anim name="singRIGHT" anim="Monster left note" x="-34" y="10" fps="24" loop="false"/>
|
||||
<anim name="singLEFT" anim="Monster Right note" x="-41" y="5" fps="24" loop="false"/>
|
||||
<anim name="singDOWN" anim="monster down" x="-50" y="-92" fps="24" loop="false"/>
|
||||
</character>
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<!DOCTYPE codename-engine-character>
|
||||
<character isPlayer="false" flipX="false" x="0" y="100" color="#F3FF6E">
|
||||
<anim name="idle" anim="monster idle" fps="24" loop="false" />
|
||||
<anim name="singUP" anim="monster up note" fps="24" loop="false" x="-20" y="94"/>
|
||||
<anim name="singRIGHT" anim="Monster left note" fps="24" loop="false" x="-30" y="20"/>
|
||||
<anim name="singLEFT" anim="Monster Right note" fps="24" loop="false" x="-51" y="30"/>
|
||||
<anim name="singDOWN" anim="monster down" fps="24" loop="false" x="-50" y="-80"/>
|
||||
</character>
|
||||
<character y="100" sprite="monster" icon="monster" color="#F3FF6E">
|
||||
<anim name="idle" anim="monster idle" x="0" y="0" fps="24" loop="false"/>
|
||||
<anim name="singUP" anim="monster up note" x="-26" y="92" fps="24" loop="false"/>
|
||||
<anim name="singRIGHT" anim="Monster left note" x="-34" y="10" fps="24" loop="false"/>
|
||||
<anim name="singLEFT" anim="Monster Right note" x="-41" y="10" fps="24" loop="false"/>
|
||||
<anim name="singDOWN" anim="monster down" x="-50" y="-87" fps="24" loop="false"/>
|
||||
</character>
|
||||
|
||||
@@ -1,12 +1,25 @@
|
||||
<!DOCTYPE codename-engine-character>
|
||||
<character isPlayer="false" flipX="false" x="-500" y="0" color="#C45EAE">
|
||||
<anim name="idle" anim="Parent Christmas Idle" fps="24" loop="false"/>
|
||||
<anim name="singUP" anim="Parent Up Note Dad" fps="24" loop="false" x="-47" y="24"/>
|
||||
<anim name="singDOWN" anim="Parent Down Note Dad" fps="24" loop="false" x="-31" y="-29"/>
|
||||
<anim name="singLEFT" anim="Parent Left Note Dad" fps="24" loop="false" x="-30" y="16"/>
|
||||
<anim name="singRIGHT" anim="Parent Right Note Dad" fps="24" loop="false" x="-1" y="-23"/>
|
||||
<anim name="singUP-alt" anim="Parent Up Note Mom" fps="24" loop="false" x="-47" y="24"/>
|
||||
<anim name="singDOWN-alt" anim="Parent Down Note Mom" fps="24" loop="false" x="-30" y="-27"/>
|
||||
<anim name="singLEFT-alt" anim="Parent Left Note Mom" fps="24" loop="false" x="-30" y="15"/>
|
||||
<anim name="singRIGHT-alt" anim="Parent Right Note Mom" fps="24" loop="false" x="-1" y="-24"/>
|
||||
</character>
|
||||
<character x="-500" sprite="parents-christmas" icon="parents-christmas" color="#C45EAE">
|
||||
<!--Dad Animations-->
|
||||
<anim name="idle" anim="Parent Christmas Idle" x="0" y="0" fps="24" loop="false"/>
|
||||
<anim name="singUP" anim="Parent Up Note Dad" x="-47" y="25" fps="24" loop="false"/>
|
||||
<anim name="singDOWN" anim="Parent Down Note Dad" x="-33" y="-25" fps="24" loop="false"/>
|
||||
<anim name="singLEFT" anim="Parent Left Note Dad" x="-28" y="20" fps="24" loop="false"/>
|
||||
<anim name="singRIGHT" anim="Parent Right Note Dad" x="0" y="-20" fps="24" loop="false"/>
|
||||
<!--Dad Loop Animations-->
|
||||
<anim name="idle-loop" anim="Parent Christmas Idle" x="0" y="0" fps="24" loop="true" indices="11,11..13"/>
|
||||
<anim name="singUP-loop" anim="Parent Up Note Dad" x="-47" y="25" fps="24" loop="true" indices="10..13"/>
|
||||
<anim name="singDOWN-loop" anim="Parent Down Note Dad" x="-33" y="-25" fps="24" loop="true" indices="11..14"/>
|
||||
<anim name="singLEFT-loop" anim="Parent Left Note Dad" x="-28" y="20" fps="24" loop="true" indices="12..15"/>
|
||||
<anim name="singRIGHT-loop" anim="Parent Right Note Dad" x="0" y="-20" fps="24" loop="true" indices="12..15"/>
|
||||
<!--Mom Animations-->
|
||||
<anim name="singUP-alt" anim="Parent Up Note Mom" x="-47" y="28" fps="24" loop="false"/>
|
||||
<anim name="singDOWN-alt" anim="Parent Down Note Mom" x="-33" y="-25" fps="24" loop="false"/>
|
||||
<anim name="singLEFT-alt" anim="Parent Left Note Mom" x="-28" y="19" fps="24" loop="false"/>
|
||||
<anim name="singRIGHT-alt" anim="Parent Right Note Mom" x="0" y="-19" fps="24" loop="false"/>
|
||||
<!--Mom Loop Animations-->
|
||||
<anim name="singUP-alt-loop" anim="Parent Up Note Mom" x="-47" y="28" fps="24" loop="true" indices="10..13"/>
|
||||
<anim name="singDOWN-alt-loop" anim="Parent Down Note Mom" x="-33" y="-25" fps="24" loop="true" indices="11..14"/>
|
||||
<anim name="singLEFT-alt-loop" anim="Parent Left Note Mom" x="-28" y="19" fps="24" loop="true" indices="11..14"/>
|
||||
<anim name="singRIGHT-alt-loop" anim="Parent Right Note Mom" x="0" y="-19" fps="24" loop="true" indices="11..14"/>
|
||||
</character>
|
||||
|
||||
@@ -1,16 +1,11 @@
|
||||
<!DOCTYPE codename-engine-character>
|
||||
<character isPlayer="false" flipX="false" icon="pico" x="115" y="-85" camx="195" camy="360" color="#B7D855">
|
||||
<!-- Left Animations -->
|
||||
<anim name="shoot1" anim="Pico shoot 1" fps="24" loop="false" indices="0,1,2,3" />
|
||||
<anim name="idle1" anim="Pico shoot 1" fps="24" loop="false" indices="4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24" />
|
||||
|
||||
<anim name="shoot2" anim="Pico shoot 2" fps="24" loop="false" indices="0,1,2,3" />
|
||||
<anim name="idle2" anim="Pico shoot 2" fps="24" loop="false" indices="4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24" />
|
||||
|
||||
<!-- Right Animations-->
|
||||
<anim name="shoot3" anim="Pico shoot 3" fps="24" loop="false" indices="0,1,2,3" />
|
||||
<anim name="idle3" anim="Pico shoot 3" fps="24" loop="false" indices="4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24" />
|
||||
|
||||
<anim name="shoot4" anim="Pico shoot 4" fps="24" loop="false" indices="0,1,2,3" />
|
||||
<anim name="idle4" anim="Pico shoot 4" fps="24" loop="false" indices="4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24" />
|
||||
</character>
|
||||
<character x="115" y="-85" sprite="pico-speakers" camx="195" camy="360" icon="pico" color="#B7D855">
|
||||
<anim name="idle1" anim="Pico shoot 1" x="0" y="0" fps="24" loop="false" indices="4..24"/>
|
||||
<anim name="idle2" anim="Pico shoot 2" x="0" y="0" fps="24" loop="false" indices="4..24"/>
|
||||
<anim name="idle3" anim="Pico shoot 3" x="0" y="0" fps="24" loop="false" indices="4..24"/>
|
||||
<anim name="idle4" anim="Pico shoot 4" x="0" y="0" fps="24" loop="false" indices="4..24"/>
|
||||
<anim name="shoot1" anim="Pico shoot 1" x="0" y="0" fps="24" loop="false" indices="0..3"/>
|
||||
<anim name="shoot2" anim="Pico shoot 2" x="0" y="0" fps="24" loop="false" indices="0..3"/>
|
||||
<anim name="shoot3" anim="Pico shoot 3" x="0" y="0" fps="24" loop="false" indices="0..3"/>
|
||||
<anim name="shoot4" anim="Pico shoot 4" x="0" y="0" fps="24" loop="false" indices="0..3"/>
|
||||
</character>
|
||||
|
||||
@@ -1,16 +1,12 @@
|
||||
<!DOCTYPE codename-engine-character>
|
||||
<character isPlayer="false" flipX="true" x="100" y="300" camx="-100" color="#B7D855">
|
||||
<anim name="idle" anim="Pico Idle Dance" fps="24" loop="false"/>
|
||||
|
||||
<!-- Sing Animations -->
|
||||
<anim name="singLEFT" anim="Pico Note Right0" fps="24" loop="false" x="65" y="9" />
|
||||
<anim name="singDOWN" anim="Pico Down Note0" fps="24" loop="false" x="200" y="-70" />
|
||||
<anim name="singUP" anim="pico Up note0" fps="24" loop="false" x="-29" y="27" />
|
||||
<anim name="singRIGHT" anim="Pico NOTE LEFT0" fps="24" loop="false" x="-68" y="-7" />
|
||||
|
||||
<!-- Miss Animations -->
|
||||
<anim name="singLEFTmiss" anim="Pico Note Right Miss" fps="24" loop="false" x="62" y="64" />
|
||||
<anim name="singDOWNmiss" anim="Pico Down Note MISS" fps="24" loop="false" x="210" y="-28" />
|
||||
<anim name="singUPmiss" anim="pico Up note miss" fps="24" loop="false" x="-19" y="67" />
|
||||
<anim name="singRIGHTmiss" anim="Pico NOTE LEFT miss" fps="24" loop="false" x="-60" y="41" />
|
||||
</character>
|
||||
<character x="100" y="300" sprite="pico" flipX="true" camx="-100" icon="pico" color="#B7D855">
|
||||
<anim name="idle" anim="Pico Idle Dance" x="0" y="0" fps="24" loop="false"/>
|
||||
<anim name="singLEFT" anim="Pico Note Right0" x="56" y="1" fps="24" loop="false"/>
|
||||
<anim name="singDOWN" anim="Pico Down Note0" x="193" y="-82" fps="24" loop="false"/>
|
||||
<anim name="singUP" anim="pico Up note0" x="-31" y="30" fps="24" loop="false"/>
|
||||
<anim name="singRIGHT" anim="Pico NOTE LEFT0" x="-83" y="-11" fps="24" loop="false"/>
|
||||
<anim name="singLEFTmiss" anim="Pico Note Right Miss" x="57" y="47" fps="24" loop="false"/>
|
||||
<anim name="singDOWNmiss" anim="Pico Down Note MISS" x="193" y="-40" fps="24" loop="false"/>
|
||||
<anim name="singUPmiss" anim="pico Up note miss" x="-19" y="67" fps="24" loop="false"/>
|
||||
<anim name="singRIGHTmiss" anim="Pico NOTE LEFT miss" x="-77" y="25" fps="24" loop="false"/>
|
||||
</character>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
<!DOCTYPE codename-engine-character>
|
||||
<character isPlayer="false" flipX="false" x="150" y="360" antialiasing="false" scale="6" camx="100" camy="87" color="#FFAA6F">
|
||||
<anim name="idle" anim="Senpai Idle" fps="12" loop="false" x="0" y="0" />
|
||||
|
||||
<!-- Offsets are actually multiplied by scale -->
|
||||
<anim name="singLEFT" anim="SENPAI LEFT NOTE" fps="12" loop="false" x="7" y="0" />
|
||||
<anim name="singDOWN" anim="SENPAI DOWN NOTE" fps="12" loop="false" x="2" y="0" />
|
||||
<anim name="singUP" anim="SENPAI UP NOTE" fps="12" loop="false" x="1" y="6" />
|
||||
<anim name="singRIGHT" anim="SENPAI RIGHT NOTE" fps="12" loop="false" x="0" y="0" />
|
||||
</character>
|
||||
<character x="150" y="360" sprite="senpai" scale="6" antialiasing="false" camx="100" camy="87" icon="senpai" color="#FFAA6F" interval="2">
|
||||
<anim name="danceLeft" anim="Senpai Idle instance" x="0" y="0" fps="24" loop="false" indices="0..15"/>
|
||||
<anim name="danceRight" anim="Senpai Idle instance" x="0" y="0" fps="24" loop="false" indices="16..31"/>
|
||||
<anim name="singLEFT" anim="SENPAI LEFT NOTE" x="4" y="0" fps="24" loop="false"/>
|
||||
<anim name="singDOWN" anim="SENPAI DOWN NOTE" x="0" y="0" fps="24" loop="false"/>
|
||||
<anim name="singUP" anim="SENPAI UP NOTE" x="0" y="6" fps="24" loop="false"/>
|
||||
<anim name="singRIGHT" anim="SENPAI RIGHT NOTE" x="0" y="0" fps="24" loop="false"/>
|
||||
</character>
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
<!DOCTYPE codename-engine-character>
|
||||
<character isPlayer="false" flipX="false" x="70" y="380" antialiasing="false" scale="6" camx="100" color="#FF3C6E">
|
||||
<anim name="idle" anim="idle spirit_" fps="24" loop="false" x="0" y="0" />
|
||||
|
||||
<!-- Offsets are actually multiplied by scale -->
|
||||
<anim name="singLEFT" anim="left_" fps="24" loop="false" x="3" y="0" />
|
||||
<anim name="singDOWN" anim="spirit down_" fps="24" loop="false" x="65" y="65" />
|
||||
<anim name="singUP" anim="up_" fps="24" loop="false" x="0" y="7" />
|
||||
<anim name="singRIGHT" anim="right_" fps="24" loop="false" x="0" y="0" />
|
||||
</character>
|
||||
<character x="70" y="380" sprite="spirit" scale="6" antialiasing="false" camx="100" icon="spirit" color="#FF3C6E">
|
||||
<anim name="idle" anim="idle spirit_" x="0" y="1" fps="24" loop="false"/>
|
||||
<anim name="singLEFT" anim="left_" x="4" y="-1" fps="24" loop="false"/>
|
||||
<anim name="singDOWN" anim="spirit down_" x="66" y="64" fps="24" loop="false"/>
|
||||
<anim name="singUP" anim="up_" x="-1" y="8" fps="24" loop="false"/>
|
||||
<anim name="singRIGHT" anim="right_" x="-2" y="0" fps="24" loop="false"/>
|
||||
</character>
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
<!DOCTYPE codename-engine-character>
|
||||
<character isPlayer="false" flipX="false" x="0" y="200" color="#C5995A">
|
||||
<anim name="danceLeft" anim="spooky dance idle" fps="12" loop="false" x="0" y="0" indices="0,2,6"/>
|
||||
<anim name="danceRight" anim="spooky dance idle" fps="12" loop="false" x="0" y="0" indices="8,10,12,14"/>
|
||||
<anim name="singUP" anim="spooky UP NOTE" fps="24" loop="false" x="-20" y="26"/>
|
||||
<anim name="singLEFT" anim="note sing left" fps="24" loop="false" x="130" y="-10"/>
|
||||
<anim name="singRIGHT" anim="spooky sing right" fps="24" loop="false" x="-130" y="-14"/>
|
||||
<anim name="singDOWN" anim="spooky DOWN note" fps="24" loop="false" x="-50" y="-130"/>
|
||||
</character>
|
||||
<character y="200" sprite="spooky" icon="spooky" color="#C5995A">
|
||||
<anim name="danceLeft" anim="spooky dance idle" x="0" y="0" fps="24" loop="false" indices="0..6"/>
|
||||
<anim name="danceRight" anim="spooky dance idle" x="0" y="0" fps="24" loop="false" indices="8..14"/>
|
||||
<anim name="singUP" anim="spooky UP NOTE" x="-20" y="26" fps="24" loop="false"/>
|
||||
<anim name="singLEFT" anim="note sing left" x="119" y="-11" fps="24" loop="false"/>
|
||||
<anim name="singRIGHT" anim="spooky sing right" x="-150" y="-11" fps="24" loop="false"/>
|
||||
<anim name="singDOWN" anim="spooky DOWN note" x="-77" y="-136" fps="24" loop="false"/>
|
||||
</character>
|
||||
|
||||
@@ -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,7 +0,0 @@
|
||||
<!DOCTYPE codename-mod-credits>
|
||||
<!-- TEMPLATE FOR CUSTOM CREDITS!!! -->
|
||||
<menu name="Mod Credits" desc="Modify mod credits here">
|
||||
<!-- \/ You can also set the portrait shader as false as you can see below in the github one -->
|
||||
<credit name="Credit Example" desc="Click me to know more about me!" icon="credit icon example" size="130" url="https://youtu.be/fugtxz1znVw"/>
|
||||
<github user="NexIsDumb" customName="Nex is Dumb" desc="The bitch who made these credits menus" size="100" portrait="false" color="#808080"/>
|
||||
</menu>
|
||||
@@ -1,15 +0,0 @@
|
||||
<!DOCTYPE codename-mod-options>
|
||||
<!-- TEMPLATE FOR CUSTOM OPTIONS!!! -->
|
||||
<menu name="Mod Options" desc="Modify mod options here">
|
||||
<checkbox id="checkboxExample" name="Checkbox example" />
|
||||
<number id="numberExample" name="Number example" min="0" max="10" change="1"/>
|
||||
<choice id="choiceExample" name="Choice Example">
|
||||
<value name="Disabled" value="disabled"/>
|
||||
<value name="This only" value="thisOnly"/>
|
||||
<value name="All" value="all"/>
|
||||
</choice>
|
||||
|
||||
<menu name="Submenu Example" desc="Submenu test">
|
||||
<checkbox id="levelOfIdk2" name="Level of idk" />
|
||||
</menu>
|
||||
</menu>
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 105 KiB |
+164
-159
@@ -1,159 +1,164 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<TextureAtlas imagePath="senpai.png">
|
||||
<!-- Created with Adobe Animate version 20.0.0.17400 -->
|
||||
<!-- http://www.adobe.com/products/animate.html -->
|
||||
<SubTexture name="Angry Senpai DOWN NOTE instance 10000" x="0" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai DOWN NOTE instance 10001" x="0" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai DOWN NOTE instance 10002" x="135" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai DOWN NOTE instance 10003" x="135" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai DOWN NOTE instance 10004" x="135" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai DOWN NOTE instance 10005" x="135" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai DOWN NOTE instance 10006" x="135" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai DOWN NOTE instance 10007" x="135" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai DOWN NOTE instance 10008" x="135" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai DOWN NOTE instance 10009" x="135" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai DOWN NOTE instance 10010" x="135" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai DOWN NOTE instance 10011" x="135" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai DOWN NOTE instance 10012" x="135" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai DOWN NOTE instance 10013" x="135" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai Idle instance 10000" x="270" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai Idle instance 10001" x="270" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai Idle instance 10002" x="405" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai Idle instance 10003" x="405" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai Idle instance 10004" x="540" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai Idle instance 10005" x="540" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai Idle instance 10006" x="675" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai Idle instance 10007" x="675" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai Idle instance 10008" x="810" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai Idle instance 10009" x="810" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai Idle instance 10010" x="810" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai Idle instance 10011" x="810" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai Idle instance 10012" x="810" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai Idle instance 10013" x="810" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai LEFT NOTE instance 10000" x="945" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai LEFT NOTE instance 10001" x="945" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai LEFT NOTE instance 10002" x="1080" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai LEFT NOTE instance 10003" x="1080" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai LEFT NOTE instance 10004" x="1080" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai LEFT NOTE instance 10005" x="1080" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai LEFT NOTE instance 10006" x="1080" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai LEFT NOTE instance 10007" x="1080" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai LEFT NOTE instance 10008" x="1080" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai LEFT NOTE instance 10009" x="1080" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai LEFT NOTE instance 10010" x="1080" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai LEFT NOTE instance 10011" x="1080" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai LEFT NOTE instance 10012" x="1080" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai LEFT NOTE instance 10013" x="1080" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai RIGHT NOTE instance 10000" x="1215" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai RIGHT NOTE instance 10001" x="1215" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai RIGHT NOTE instance 10002" x="1350" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai RIGHT NOTE instance 10003" x="1350" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai RIGHT NOTE instance 10004" x="1350" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai RIGHT NOTE instance 10005" x="1350" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai RIGHT NOTE instance 10006" x="1350" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai RIGHT NOTE instance 10007" x="1350" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai RIGHT NOTE instance 10008" x="1350" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai RIGHT NOTE instance 10009" x="1350" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai RIGHT NOTE instance 10010" x="1350" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai RIGHT NOTE instance 10011" x="1350" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai RIGHT NOTE instance 10012" x="1350" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai RIGHT NOTE instance 10013" x="1350" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai UP NOTE instance 10000" x="1485" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai UP NOTE instance 10001" x="1485" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai UP NOTE instance 10002" x="1620" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai UP NOTE instance 10003" x="1620" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai UP NOTE instance 10004" x="1620" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai UP NOTE instance 10005" x="1620" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai UP NOTE instance 10006" x="1620" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai UP NOTE instance 10007" x="1620" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai UP NOTE instance 10008" x="1620" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai UP NOTE instance 10009" x="1620" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai UP NOTE instance 10010" x="1620" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai UP NOTE instance 10011" x="1620" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai UP NOTE instance 10012" x="1620" y="0" width="125" height="164"/>
|
||||
<SubTexture name="Angry Senpai UP NOTE instance 10013" x="1620" y="0" width="125" height="164"/>
|
||||
<SubTexture name="SENPAI DOWN NOTE instance 10000" x="1755" y="0" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI DOWN NOTE instance 10001" x="1755" y="0" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI DOWN NOTE instance 10002" x="1890" y="0" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI DOWN NOTE instance 10003" x="1890" y="0" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI DOWN NOTE instance 10004" x="1890" y="0" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI DOWN NOTE instance 10005" x="1890" y="0" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI DOWN NOTE instance 10006" x="1890" y="0" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI DOWN NOTE instance 10007" x="1890" y="0" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI DOWN NOTE instance 10008" x="1890" y="0" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI DOWN NOTE instance 10009" x="1890" y="0" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI DOWN NOTE instance 10010" x="1890" y="0" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI DOWN NOTE instance 10011" x="1890" y="0" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI DOWN NOTE instance 10012" x="1890" y="0" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI DOWN NOTE instance 10013" x="1890" y="0" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI LEFT NOTE instance 10000" x="0" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI LEFT NOTE instance 10001" x="0" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI LEFT NOTE instance 10002" x="135" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI LEFT NOTE instance 10003" x="135" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI LEFT NOTE instance 10004" x="135" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI LEFT NOTE instance 10005" x="135" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI LEFT NOTE instance 10006" x="135" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI LEFT NOTE instance 10007" x="135" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI LEFT NOTE instance 10008" x="135" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI LEFT NOTE instance 10009" x="135" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI LEFT NOTE instance 10010" x="135" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI LEFT NOTE instance 10011" x="135" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI LEFT NOTE instance 10012" x="135" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI LEFT NOTE instance 10013" x="135" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI RIGHT NOTE instance 10000" x="270" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI RIGHT NOTE instance 10001" x="270" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI RIGHT NOTE instance 10002" x="405" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI RIGHT NOTE instance 10003" x="405" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI RIGHT NOTE instance 10004" x="405" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI RIGHT NOTE instance 10005" x="405" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI RIGHT NOTE instance 10006" x="405" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI RIGHT NOTE instance 10007" x="405" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI RIGHT NOTE instance 10008" x="405" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI RIGHT NOTE instance 10009" x="405" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI RIGHT NOTE instance 10010" x="405" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI RIGHT NOTE instance 10011" x="405" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI RIGHT NOTE instance 10012" x="405" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI RIGHT NOTE instance 10013" x="405" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI UP NOTE instance 10000" x="540" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI UP NOTE instance 10001" x="540" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI UP NOTE instance 10002" x="675" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI UP NOTE instance 10003" x="675" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI UP NOTE instance 10004" x="675" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI UP NOTE instance 10005" x="675" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI UP NOTE instance 10006" x="675" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI UP NOTE instance 10007" x="675" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI UP NOTE instance 10008" x="675" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI UP NOTE instance 10009" x="675" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI UP NOTE instance 10010" x="675" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI UP NOTE instance 10011" x="675" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI UP NOTE instance 10012" x="675" y="174" width="125" height="163"/>
|
||||
<SubTexture name="SENPAI UP NOTE instance 10013" x="675" y="174" width="125" height="163"/>
|
||||
<SubTexture name="Senpai Idle instance 10000" x="810" y="174" width="124" height="163"/>
|
||||
<SubTexture name="Senpai Idle instance 10001" x="810" y="174" width="124" height="163"/>
|
||||
<SubTexture name="Senpai Idle instance 10002" x="944" y="174" width="124" height="163"/>
|
||||
<SubTexture name="Senpai Idle instance 10003" x="944" y="174" width="124" height="163"/>
|
||||
<SubTexture name="Senpai Idle instance 10004" x="1078" y="174" width="124" height="163"/>
|
||||
<SubTexture name="Senpai Idle instance 10005" x="1078" y="174" width="124" height="163"/>
|
||||
<SubTexture name="Senpai Idle instance 10006" x="1212" y="174" width="124" height="163"/>
|
||||
<SubTexture name="Senpai Idle instance 10007" x="1212" y="174" width="124" height="163"/>
|
||||
<SubTexture name="Senpai Idle instance 10008" x="1346" y="174" width="124" height="163"/>
|
||||
<SubTexture name="Senpai Idle instance 10009" x="1346" y="174" width="124" height="163"/>
|
||||
<SubTexture name="Senpai Idle instance 10010" x="1480" y="174" width="124" height="163"/>
|
||||
<SubTexture name="Senpai Idle instance 10011" x="1480" y="174" width="124" height="163"/>
|
||||
<SubTexture name="Senpai Idle instance 10012" x="1614" y="174" width="124" height="163"/>
|
||||
<SubTexture name="Senpai Idle instance 10013" x="1748" y="174" width="124" height="163"/>
|
||||
<SubTexture name="Senpai Idle instance 10014" x="1882" y="174" width="124" height="163"/>
|
||||
<SubTexture name="Senpai Idle instance 10015" x="0" y="347" width="124" height="163"/>
|
||||
<SubTexture name="Senpai Idle instance 10016" x="134" y="347" width="124" height="163"/>
|
||||
<SubTexture name="Senpai Idle instance 10017" x="268" y="347" width="124" height="163"/>
|
||||
<SubTexture name="Senpai Idle instance 10018" x="402" y="347" width="124" height="163"/>
|
||||
<SubTexture name="Senpai Idle instance 10019" x="536" y="347" width="124" height="163"/>
|
||||
<SubTexture name="Senpai Idle instance 10020" x="670" y="347" width="124" height="163"/>
|
||||
<SubTexture name="Senpai Idle instance 10021" x="804" y="347" width="124" height="163"/>
|
||||
<SubTexture name="Senpai Idle instance 10022" x="938" y="347" width="124" height="163"/>
|
||||
<SubTexture name="Senpai Idle instance 10023" x="1480" y="174" width="124" height="163"/>
|
||||
<SubTexture name="Senpai Idle instance 10024" x="1480" y="174" width="124" height="163"/>
|
||||
<SubTexture name="Senpai Idle instance 10025" x="1614" y="174" width="124" height="163"/>
|
||||
<SubTexture name="Senpai Idle instance 10026" x="1072" y="347" width="124" height="163"/>
|
||||
<SubTexture name="Senpai Idle instance 10027" x="1206" y="347" width="124" height="163"/>
|
||||
</TextureAtlas>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
Created with Funkin Packer v0.1.3 DEV https://neeeoo.github.io/funkin-packer/
|
||||
-->
|
||||
<TextureAtlas imagePath="senpai-test.png" width="547" height="611" spritePadding="4" borderPadding="4">
|
||||
<SubTexture name="Angry Senpai DOWN NOTE instance 0000" x="411" y="478" width="59" height="107" frameX="-28" frameY="-39" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai DOWN NOTE instance 0001" x="411" y="478" width="59" height="107" frameX="-28" frameY="-39" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai DOWN NOTE instance 0002" x="283" y="479" width="58" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai DOWN NOTE instance 0003" x="283" y="479" width="58" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai DOWN NOTE instance 0004" x="283" y="479" width="58" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai DOWN NOTE instance 0005" x="283" y="479" width="58" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai DOWN NOTE instance 0006" x="283" y="479" width="58" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai DOWN NOTE instance 0007" x="283" y="479" width="58" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai DOWN NOTE instance 0008" x="283" y="479" width="58" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai DOWN NOTE instance 0009" x="283" y="479" width="58" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai DOWN NOTE instance 0010" x="283" y="479" width="58" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai DOWN NOTE instance 0011" x="283" y="479" width="58" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai DOWN NOTE instance 0012" x="283" y="479" width="58" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai DOWN NOTE instance 0013" x="283" y="479" width="58" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai Idle instance 0000" x="417" y="356" width="66" height="112" frameX="-28" frameY="-34" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai Idle instance 0001" x="417" y="356" width="66" height="112" frameX="-28" frameY="-34" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai Idle instance 0002" x="478" y="239" width="63" height="112" frameX="-29" frameY="-34" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai Idle instance 0003" x="478" y="239" width="63" height="112" frameX="-29" frameY="-34" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai Idle instance 0004" x="409" y="122" width="63" height="113" frameX="-29" frameY="-33" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai Idle instance 0005" x="409" y="122" width="63" height="113" frameX="-29" frameY="-33" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai Idle instance 0006" x="134" y="4" width="67" height="116" frameX="-29" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai Idle instance 0007" x="134" y="4" width="67" height="116" frameX="-29" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai Idle instance 0008" x="146" y="244" width="67" height="115" frameX="-29" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai Idle instance 0009" x="146" y="244" width="67" height="115" frameX="-29" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai Idle instance 0010" x="146" y="244" width="67" height="115" frameX="-29" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai Idle instance 0011" x="146" y="244" width="67" height="115" frameX="-29" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai Idle instance 0012" x="146" y="244" width="67" height="115" frameX="-29" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai Idle instance 0013" x="146" y="244" width="67" height="115" frameX="-29" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai LEFT NOTE instance 0000" x="205" y="4" width="55" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai LEFT NOTE instance 0001" x="205" y="4" width="55" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai LEFT NOTE instance 0002" x="213" y="123" width="57" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai LEFT NOTE instance 0003" x="213" y="123" width="57" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai LEFT NOTE instance 0004" x="213" y="123" width="57" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai LEFT NOTE instance 0005" x="213" y="123" width="57" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai LEFT NOTE instance 0006" x="213" y="123" width="57" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai LEFT NOTE instance 0007" x="213" y="123" width="57" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai LEFT NOTE instance 0008" x="213" y="123" width="57" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai LEFT NOTE instance 0009" x="213" y="123" width="57" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai LEFT NOTE instance 0010" x="213" y="123" width="57" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai LEFT NOTE instance 0011" x="213" y="123" width="57" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai LEFT NOTE instance 0012" x="213" y="123" width="57" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai LEFT NOTE instance 0013" x="213" y="123" width="57" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai RIGHT NOTE instance 0000" x="146" y="363" width="62" height="114" frameX="-32" frameY="-32" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai RIGHT NOTE instance 0001" x="146" y="363" width="62" height="114" frameX="-32" frameY="-32" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai RIGHT NOTE instance 0002" x="345" y="123" width="60" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai RIGHT NOTE instance 0003" x="345" y="123" width="60" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai RIGHT NOTE instance 0004" x="345" y="123" width="60" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai RIGHT NOTE instance 0005" x="345" y="123" width="60" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai RIGHT NOTE instance 0006" x="345" y="123" width="60" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai RIGHT NOTE instance 0007" x="345" y="123" width="60" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai RIGHT NOTE instance 0008" x="345" y="123" width="60" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai RIGHT NOTE instance 0009" x="345" y="123" width="60" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai RIGHT NOTE instance 0010" x="345" y="123" width="60" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai RIGHT NOTE instance 0011" x="345" y="123" width="60" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai RIGHT NOTE instance 0012" x="345" y="123" width="60" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai RIGHT NOTE instance 0013" x="345" y="123" width="60" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai UP NOTE instance 0000" x="4" y="4" width="60" height="122" frameX="-28" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai UP NOTE instance 0001" x="4" y="4" width="60" height="122" frameX="-28" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai UP NOTE instance 0002" x="68" y="4" width="62" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai UP NOTE instance 0003" x="68" y="4" width="62" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai UP NOTE instance 0004" x="68" y="4" width="62" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai UP NOTE instance 0005" x="68" y="4" width="62" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai UP NOTE instance 0006" x="68" y="4" width="62" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai UP NOTE instance 0007" x="68" y="4" width="62" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai UP NOTE instance 0008" x="68" y="4" width="62" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai UP NOTE instance 0009" x="68" y="4" width="62" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai UP NOTE instance 0010" x="68" y="4" width="62" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai UP NOTE instance 0011" x="68" y="4" width="62" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai UP NOTE instance 0012" x="68" y="4" width="62" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Angry Senpai UP NOTE instance 0013" x="68" y="4" width="62" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI DOWN NOTE instance 0000" x="474" y="472" width="63" height="107" frameX="-28" frameY="-39" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI DOWN NOTE instance 0001" x="474" y="472" width="63" height="107" frameX="-28" frameY="-39" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI DOWN NOTE instance 0002" x="345" y="479" width="62" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI DOWN NOTE instance 0003" x="345" y="479" width="62" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI DOWN NOTE instance 0004" x="345" y="479" width="62" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI DOWN NOTE instance 0005" x="345" y="479" width="62" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI DOWN NOTE instance 0006" x="345" y="479" width="62" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI DOWN NOTE instance 0007" x="345" y="479" width="62" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI DOWN NOTE instance 0008" x="345" y="479" width="62" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI DOWN NOTE instance 0009" x="345" y="479" width="62" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI DOWN NOTE instance 0010" x="345" y="479" width="62" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI DOWN NOTE instance 0011" x="345" y="479" width="62" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI DOWN NOTE instance 0012" x="345" y="479" width="62" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI DOWN NOTE instance 0013" x="345" y="479" width="62" height="108" frameX="-29" frameY="-38" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI LEFT NOTE instance 0000" x="264" y="4" width="59" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI LEFT NOTE instance 0001" x="264" y="4" width="59" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI LEFT NOTE instance 0002" x="217" y="242" width="61" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI LEFT NOTE instance 0003" x="217" y="242" width="61" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI LEFT NOTE instance 0004" x="217" y="242" width="61" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI LEFT NOTE instance 0005" x="217" y="242" width="61" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI LEFT NOTE instance 0006" x="217" y="242" width="61" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI LEFT NOTE instance 0007" x="217" y="242" width="61" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI LEFT NOTE instance 0008" x="217" y="242" width="61" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI LEFT NOTE instance 0009" x="217" y="242" width="61" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI LEFT NOTE instance 0010" x="217" y="242" width="61" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI LEFT NOTE instance 0011" x="217" y="242" width="61" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI LEFT NOTE instance 0012" x="217" y="242" width="61" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI LEFT NOTE instance 0013" x="217" y="242" width="61" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI RIGHT NOTE instance 0000" x="212" y="363" width="65" height="114" frameX="-32" frameY="-32" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI RIGHT NOTE instance 0001" x="212" y="363" width="65" height="114" frameX="-32" frameY="-32" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI RIGHT NOTE instance 0002" x="281" y="361" width="63" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI RIGHT NOTE instance 0003" x="281" y="361" width="63" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI RIGHT NOTE instance 0004" x="281" y="361" width="63" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI RIGHT NOTE instance 0005" x="281" y="361" width="63" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI RIGHT NOTE instance 0006" x="281" y="361" width="63" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI RIGHT NOTE instance 0007" x="281" y="361" width="63" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI RIGHT NOTE instance 0008" x="281" y="361" width="63" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI RIGHT NOTE instance 0009" x="281" y="361" width="63" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI RIGHT NOTE instance 0010" x="281" y="361" width="63" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI RIGHT NOTE instance 0011" x="281" y="361" width="63" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI RIGHT NOTE instance 0012" x="281" y="361" width="63" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI RIGHT NOTE instance 0013" x="281" y="361" width="63" height="114" frameX="-31" frameY="-32" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI UP NOTE instance 0000" x="4" y="130" width="64" height="122" frameX="-28" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI UP NOTE instance 0001" x="4" y="130" width="64" height="122" frameX="-28" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI UP NOTE instance 0002" x="72" y="130" width="66" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI UP NOTE instance 0003" x="72" y="130" width="66" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI UP NOTE instance 0004" x="72" y="130" width="66" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI UP NOTE instance 0005" x="72" y="130" width="66" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI UP NOTE instance 0006" x="72" y="130" width="66" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI UP NOTE instance 0007" x="72" y="130" width="66" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI UP NOTE instance 0008" x="72" y="130" width="66" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI UP NOTE instance 0009" x="72" y="130" width="66" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI UP NOTE instance 0010" x="72" y="130" width="66" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI UP NOTE instance 0011" x="72" y="130" width="66" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI UP NOTE instance 0012" x="72" y="130" width="66" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="SENPAI UP NOTE instance 0013" x="72" y="130" width="66" height="122" frameX="-27" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0000" x="4" y="495" width="66" height="112" frameX="-27" frameY="-34" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0001" x="4" y="495" width="66" height="112" frameX="-27" frameY="-34" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0002" x="409" y="239" width="65" height="113" frameX="-28" frameY="-33" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0003" x="409" y="239" width="65" height="113" frameX="-28" frameY="-33" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0004" x="409" y="4" width="65" height="114" frameX="-28" frameY="-32" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0005" x="409" y="4" width="65" height="114" frameX="-28" frameY="-32" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0006" x="142" y="124" width="67" height="116" frameX="-28" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0007" x="142" y="124" width="67" height="116" frameX="-28" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0008" x="274" y="123" width="67" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0009" x="274" y="123" width="67" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0010" x="327" y="4" width="67" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0011" x="327" y="4" width="67" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0012" x="282" y="242" width="67" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0013" x="282" y="242" width="67" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0014" x="4" y="376" width="67" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0015" x="4" y="376" width="67" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0016" x="74" y="495" width="66" height="112" frameX="-27" frameY="-34" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0017" x="74" y="495" width="66" height="112" frameX="-27" frameY="-34" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0018" x="144" y="495" width="66" height="112" frameX="-27" frameY="-34" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0019" x="478" y="4" width="65" height="112" frameX="-28" frameY="-34" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0020" x="214" y="481" width="65" height="112" frameX="-28" frameY="-34" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0021" x="348" y="361" width="65" height="113" frameX="-28" frameY="-33" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0022" x="476" y="122" width="65" height="113" frameX="-28" frameY="-33" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0023" x="4" y="256" width="67" height="116" frameX="-28" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0024" x="75" y="256" width="67" height="116" frameX="-28" frameY="-30" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0025" x="75" y="376" width="67" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0026" x="327" y="4" width="67" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0027" x="327" y="4" width="67" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0028" x="282" y="242" width="67" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0029" x="282" y="242" width="67" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0030" x="4" y="376" width="67" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
<SubTexture name="Senpai Idle instance 0031" x="4" y="376" width="67" height="115" frameX="-28" frameY="-31" frameWidth="124" frameHeight="163"/>
|
||||
</TextureAtlas>
|
||||
@@ -13,32 +13,16 @@ float uBrightness = 0.6;
|
||||
|
||||
vec4 getColor(vec2 pos) {
|
||||
vec2 ps = (pos);
|
||||
if (ps.x < 0.0) ps.x = 0.0;
|
||||
//else if (ps.x > 1.0 - (1.0 / iResolution.x)) ps.x = 1.0 - (1.0 / iResolution.x);
|
||||
else if (ps.x > 1.0) return vec4(0.0);
|
||||
if (ps.y < 0.0) ps.y = 0.0;
|
||||
//else if (ps.y > 1.0 - (1.0 / iResolution.y)) return ps.y = 1.0 - (1.0 / iResolution.y);
|
||||
else if (ps.y > 1.0) return vec4(0.0);
|
||||
ps = clamp(ps, vec2(0.0), vec2(1.0));//1.0 - (1.0 / iResolution.xy));
|
||||
return flixel_texture2D(bitmap, (ps));
|
||||
}
|
||||
|
||||
|
||||
vec2 fixvec2(float x, float y) { // makes an uv the same across sizes
|
||||
vec2 val = vec2(x, y);
|
||||
val.xy *= vec2(1280.0, 720.0);
|
||||
val.xy /= iResolution.xy;
|
||||
return val;
|
||||
}
|
||||
vec2 fixvec2(vec2 uv) { // makes an uv the same across sizes
|
||||
vec2 val = uv;
|
||||
val.xy *= vec2(1280.0, 720.0);
|
||||
val.xy /= iResolution.xy;
|
||||
return val;
|
||||
}
|
||||
uniform sampler2D noiseTexture;
|
||||
uniform vec2 noiseTextureSize;
|
||||
|
||||
vec2 random(vec2 p) {
|
||||
p = vec2(dot(p,vec2(127.1,311.7)),dot(p,vec2(269.5,183.3)));
|
||||
return fract(sin(p)*4375.5);
|
||||
p *= openfl_TextureSize;
|
||||
return texture2D(noiseTexture, p/noiseTextureSize).rg;
|
||||
}
|
||||
|
||||
void main() {
|
||||
@@ -47,13 +31,11 @@ void main() {
|
||||
if (camPos.x < 0.0 || camPos.x > 1.0 || camPos.y < 0.0 || camPos.y > 1.0)
|
||||
return;
|
||||
|
||||
//vec4 color = getColor(camPos);
|
||||
|
||||
vec2 blur = vec2(uBlur) * vec2(1.0, iResolution.x / iResolution.y);
|
||||
|
||||
vec4 a = getColor(camPos+(random(camPos)*blur - blur / 2.0)) * uBrightness;
|
||||
a += getColor(camPos+(random(camPos+0.1)*blur - blur / 2.0)) * uBrightness;
|
||||
a += getColor(camPos+(random(camPos+0.2)*blur - blur / 2.0)) * uBrightness;
|
||||
//a += getColor(camPos+(random(camPos+0.2)*blur - blur / 2.0)) * uBrightness;
|
||||
//a += getColor(camPos+(random(camPos+0.3)*blur - blur / 2.0)) * uBrightness;
|
||||
gl_FragColor = a / 3.0;
|
||||
gl_FragColor = a / 2.0;
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 48 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 192 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 769 KiB |
@@ -0,0 +1,5 @@
|
||||
function next(event)
|
||||
if (!event.playFirst) trace("-");
|
||||
|
||||
function postNext(event)
|
||||
trace(curLine.char + " says: " + curLine.text);
|
||||
+1
-1
@@ -134,7 +134,7 @@
|
||||
<haxedef name="USE_ADAPTED_ASSETS" unless="web" />
|
||||
|
||||
<!-- Comment this out to disable support for custom ndlls. !-->
|
||||
<haxedef name="NDLLS_SUPPORTED" unless="web || iphonesim" />
|
||||
<haxedef name="NDLLS_SUPPORTED" unless="web || iphonesim || hl" />
|
||||
|
||||
<!-- Comment this out to disable support for Away3D Flixel Intergration (reduces compile times)-->
|
||||
<define name="THREE_D_SUPPORT" />
|
||||
|
||||
@@ -182,7 +182,7 @@ class Paths
|
||||
return FlxAtlasFrames.fromAseprite('$key.png', '$key.json');
|
||||
|
||||
inline static public function getAssetsRoot():String
|
||||
return ModsFolder.currentModFolder != null ? '${ModsFolder.modsPath}${ModsFolder.currentModFolder}' : './assets';
|
||||
return ModsFolder.currentModFolder != null ? '${ModsFolder.modsPath}${ModsFolder.currentModFolder}' : #if (sys && TEST_BUILD) './${Main.pathBack}assets/' #else './assets' #end;
|
||||
|
||||
/**
|
||||
* Gets frames at specified path.
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
package funkin.backend.scripting.events;
|
||||
|
||||
import funkin.game.Character;
|
||||
import haxe.xml.Access;
|
||||
|
||||
final class CharacterNodeEvent extends CancellableEvent {
|
||||
/**
|
||||
* The character instance
|
||||
*/
|
||||
public var character:Character;
|
||||
|
||||
/**
|
||||
* The node which is currently being parsed
|
||||
*/
|
||||
public var node:Access;
|
||||
|
||||
/**
|
||||
* The name of the node, quicker access than e.node.name
|
||||
*/
|
||||
public var name:String;
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package funkin.backend.scripting.events;
|
||||
|
||||
import funkin.game.Character;
|
||||
import haxe.xml.Access;
|
||||
|
||||
final class CharacterXMLEvent extends CancellableEvent {
|
||||
/**
|
||||
* The character instance
|
||||
*/
|
||||
public var character:Character;
|
||||
|
||||
/**
|
||||
* The xml
|
||||
*/
|
||||
public var xml:Access;
|
||||
}
|
||||
@@ -24,9 +24,19 @@ final class NoteHitEvent extends CancellableEvent {
|
||||
*/
|
||||
public var countScore:Bool = true;
|
||||
/**
|
||||
* Whenever ratings should be shown or not.
|
||||
* Whenever ratings (Rating sprite, Digits sprites and Combo sprite) should be shown or not.
|
||||
*
|
||||
* NOTE: Whether it's `true` use `displayRating` and `displayCombo` (plus `minDigitDisplay` in the PlayState class) to change what's going to pop up!
|
||||
*/
|
||||
public var showRating:Null<Bool> = null;
|
||||
/**
|
||||
* Whenever the Rating sprites should be shown or not.
|
||||
*/
|
||||
public var displayRating:Bool;
|
||||
/**
|
||||
* Whenever the Combo sprite should be shown or not (like old Week 7 patches).
|
||||
*/
|
||||
public var displayCombo:Bool;
|
||||
/**
|
||||
* Note that has been pressed
|
||||
*/
|
||||
@@ -123,6 +133,13 @@ final class NoteHitEvent extends CancellableEvent {
|
||||
@:dox(hide)
|
||||
public function cancelDeletion() {preventDeletion();}
|
||||
|
||||
/**
|
||||
* Forces the note to be deleted.
|
||||
**/
|
||||
public function forceDeletion() {
|
||||
deleteNote = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prevents the vocals volume from being set to 1 after pressing the note.
|
||||
*/
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -27,6 +27,9 @@ class CustomShader extends FunkinShader {
|
||||
var fragCode = Assets.exists(fragShaderPath) ? Assets.getText(fragShaderPath) : null;
|
||||
var vertCode = Assets.exists(vertShaderPath) ? Assets.getText(vertShaderPath) : null;
|
||||
|
||||
fragFileName = fragShaderPath;
|
||||
vertFileName = vertShaderPath;
|
||||
|
||||
path = fragShaderPath+vertShaderPath;
|
||||
|
||||
if (fragCode == null && vertCode == null)
|
||||
|
||||
@@ -6,6 +6,9 @@ import flixel.graphics.tile.FlxGraphicsShader;
|
||||
import openfl.display3D.Program3D;
|
||||
import flixel.system.FlxAssets.FlxShader;
|
||||
|
||||
import openfl.display3D._internal.GLProgram;
|
||||
import openfl.display3D._internal.GLShader;
|
||||
import openfl.utils._internal.Log;
|
||||
import openfl.display.BitmapData;
|
||||
import openfl.display.ShaderParameter;
|
||||
import openfl.display.ShaderParameterType;
|
||||
@@ -26,6 +29,8 @@ class FunkinShader extends FlxShader implements IHScriptCustomBehaviour {
|
||||
private static var __instanceFields = Type.getInstanceFields(FunkinShader);
|
||||
|
||||
public var glslVer:String = "120";
|
||||
public var fragFileName:String;
|
||||
public var vertFileName:String;
|
||||
|
||||
/**
|
||||
* Creates a new shader from the specified fragment and vertex source.
|
||||
@@ -44,10 +49,135 @@ class FunkinShader extends FlxShader implements IHScriptCustomBehaviour {
|
||||
super();
|
||||
}
|
||||
|
||||
var ERROR_POS_REGEX = ~/(\d+):(\d+): (.*)/g;
|
||||
var ERROR_REGEX = ~/ERROR: (\d+):(\d+): (.*)/g;
|
||||
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 gl = __context.gl;
|
||||
|
||||
var vertexShader = __createGLShader(vertexSource, gl.VERTEX_SHADER);
|
||||
var fragmentShader = __createGLShader(fragmentSource, gl.FRAGMENT_SHADER);
|
||||
|
||||
var 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);
|
||||
}
|
||||
|
||||
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);
|
||||
if (value != __glFragmentSource)
|
||||
{
|
||||
@@ -61,6 +191,7 @@ 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);
|
||||
if (value != __glVertexSource)
|
||||
{
|
||||
@@ -89,20 +220,24 @@ 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');
|
||||
|
||||
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 prefix = prefixBuf.toString();
|
||||
|
||||
var vertex = prefix + glVertexSource;
|
||||
var fragment = prefix + glFragmentSource;
|
||||
@@ -116,9 +251,7 @@ class FunkinShader extends FlxShader implements IHScriptCustomBehaviour {
|
||||
else
|
||||
{
|
||||
program = __context.createProgram(GLSL);
|
||||
|
||||
program.__glProgram = __createGLProgram(vertex, fragment);
|
||||
|
||||
__context.__programs.set(id, program);
|
||||
}
|
||||
|
||||
@@ -126,56 +259,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);
|
||||
}
|
||||
}
|
||||
@@ -213,7 +325,6 @@ class FunkinShader extends FlxShader implements IHScriptCustomBehaviour {
|
||||
{
|
||||
var input = new ShaderInput<BitmapData>();
|
||||
input.name = name;
|
||||
@:privateAccess
|
||||
input.__isUniform = isUniform;
|
||||
__inputBitmapData.push(input);
|
||||
|
||||
@@ -280,15 +391,10 @@ class FunkinShader extends FlxShader implements IHScriptCustomBehaviour {
|
||||
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);
|
||||
|
||||
@@ -303,17 +409,11 @@ class FunkinShader extends FlxShader implements IHScriptCustomBehaviour {
|
||||
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) {}
|
||||
@@ -321,19 +421,13 @@ class FunkinShader extends FlxShader implements IHScriptCustomBehaviour {
|
||||
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);
|
||||
|
||||
@@ -399,20 +493,16 @@ class FunkinShader extends FlxShader implements IHScriptCustomBehaviour {
|
||||
var cl = Type.getClassName(Type.getClass(field));
|
||||
// cant do "field is ShaderInput" for some reason
|
||||
if (cl.startsWith("openfl.display.ShaderParameter")) {
|
||||
@:privateAccess
|
||||
if (field.__length <= 1) {
|
||||
// that means we wait for a single number, instead of an array
|
||||
@:privateAccess
|
||||
if (field.__isInt && !(val is Int)) {
|
||||
throw new ShaderTypeException(name, Type.getClass(val), 'Int');
|
||||
return null;
|
||||
} else
|
||||
@:privateAccess
|
||||
if (field.__isBool && !(val is Bool)) {
|
||||
throw new ShaderTypeException(name, Type.getClass(val), 'Bool');
|
||||
return null;
|
||||
} else
|
||||
@:privateAccess
|
||||
if (field.__isFloat && !(val is Float)) {
|
||||
throw new ShaderTypeException(name, Type.getClass(val), 'Float');
|
||||
return null;
|
||||
@@ -452,41 +542,33 @@ uniform sampler2D bitmap;
|
||||
uniform bool hasTransform;
|
||||
uniform bool hasColorTransform;
|
||||
|
||||
vec4 flixel_texture2D(sampler2D bitmap, vec2 coord)
|
||||
{
|
||||
vec4 color = texture2D(bitmap, coord);
|
||||
if (!hasTransform)
|
||||
{
|
||||
vec4 applyFlixelEffects(vec4 color) {
|
||||
if(!hasTransform) {
|
||||
return color;
|
||||
}
|
||||
|
||||
if (color.a == 0.0)
|
||||
{
|
||||
if(color.a == 0.0) {
|
||||
return vec4(0.0, 0.0, 0.0, 0.0);
|
||||
}
|
||||
|
||||
if (!hasColorTransform)
|
||||
{
|
||||
if(!hasColorTransform) {
|
||||
return color * openfl_Alphav;
|
||||
}
|
||||
|
||||
color = vec4(color.rgb / color.a, color.a);
|
||||
color.rgb = color.rgb / color.a;
|
||||
color = clamp(openfl_ColorOffsetv + (color * openfl_ColorMultiplierv), 0.0, 1.0);
|
||||
|
||||
mat4 colorMultiplier = mat4(0);
|
||||
colorMultiplier[0][0] = openfl_ColorMultiplierv.x;
|
||||
colorMultiplier[1][1] = openfl_ColorMultiplierv.y;
|
||||
colorMultiplier[2][2] = openfl_ColorMultiplierv.z;
|
||||
colorMultiplier[3][3] = openfl_ColorMultiplierv.w;
|
||||
|
||||
color = clamp(openfl_ColorOffsetv + (color * colorMultiplier), 0.0, 1.0);
|
||||
|
||||
if (color.a > 0.0)
|
||||
{
|
||||
if(color.a > 0.0) {
|
||||
return vec4(color.rgb * color.a * openfl_Alphav, color.a * openfl_Alphav);
|
||||
}
|
||||
return vec4(0.0, 0.0, 0.0, 0.0);
|
||||
}
|
||||
|
||||
vec4 flixel_texture2D(sampler2D bitmap, vec2 coord) {
|
||||
vec4 color = texture2D(bitmap, coord);
|
||||
return applyFlixelEffects(color);
|
||||
}
|
||||
|
||||
uniform vec4 _camSize;
|
||||
|
||||
float map(float value, float min1, float max1, float min2, float max2) {
|
||||
@@ -505,39 +587,7 @@ vec4 textureCam(sampler2D bitmap, vec2 pos) {
|
||||
return flixel_texture2D(bitmap, camToOg(pos));
|
||||
}";
|
||||
|
||||
public static final fragBody:String = "vec4 color = texture2D (bitmap, openfl_TextureCoordv);
|
||||
|
||||
if (color.a == 0.0) {
|
||||
|
||||
gl_FragColor = vec4 (0.0, 0.0, 0.0, 0.0);
|
||||
|
||||
} else if (openfl_HasColorTransform) {
|
||||
|
||||
color = vec4 (color.rgb / color.a, color.a);
|
||||
|
||||
mat4 colorMultiplier = mat4 (0);
|
||||
colorMultiplier[0][0] = openfl_ColorMultiplierv.x;
|
||||
colorMultiplier[1][1] = openfl_ColorMultiplierv.y;
|
||||
colorMultiplier[2][2] = openfl_ColorMultiplierv.z;
|
||||
colorMultiplier[3][3] = 1.0; // openfl_ColorMultiplierv.w;
|
||||
|
||||
color = clamp (openfl_ColorOffsetv + (color * colorMultiplier), 0.0, 1.0);
|
||||
|
||||
if (color.a > 0.0) {
|
||||
|
||||
gl_FragColor = vec4 (color.rgb * color.a * openfl_Alphav, color.a * openfl_Alphav);
|
||||
|
||||
} else {
|
||||
|
||||
gl_FragColor = vec4 (0.0, 0.0, 0.0, 0.0);
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
gl_FragColor = color * openfl_Alphav;
|
||||
|
||||
}";
|
||||
public static final fragBody:String = "gl_FragColor = flixel_texture2D(bitmap, openfl_TextureCoordv);";
|
||||
public static final vertHeader:String = "attribute float openfl_Alpha;
|
||||
attribute vec4 openfl_ColorMultiplier;
|
||||
attribute vec4 openfl_ColorOffset;
|
||||
@@ -551,16 +601,26 @@ varying vec2 openfl_TextureCoordv;
|
||||
|
||||
uniform mat4 openfl_Matrix;
|
||||
uniform bool openfl_HasColorTransform;
|
||||
uniform vec2 openfl_TextureSize;";
|
||||
uniform vec2 openfl_TextureSize;
|
||||
|
||||
attribute float alpha;
|
||||
attribute vec4 colorMultiplier;
|
||||
attribute vec4 colorOffset;
|
||||
uniform bool hasColorTransform;";
|
||||
|
||||
public static final vertBody:String = "openfl_Alphav = openfl_Alpha;
|
||||
openfl_TextureCoordv = openfl_TextureCoord;
|
||||
|
||||
if (openfl_HasColorTransform) {
|
||||
|
||||
if(openfl_HasColorTransform) {
|
||||
openfl_ColorMultiplierv = openfl_ColorMultiplier;
|
||||
openfl_ColorOffsetv = openfl_ColorOffset / 255.0;
|
||||
}
|
||||
|
||||
openfl_Alphav = openfl_Alpha * alpha;
|
||||
|
||||
if(hasColorTransform) {
|
||||
openfl_ColorOffsetv = colorOffset / 255.0;
|
||||
openfl_ColorMultiplierv = colorMultiplier;
|
||||
}
|
||||
|
||||
gl_Position = openfl_Matrix * openfl_Position;";
|
||||
@@ -568,31 +628,14 @@ gl_Position = openfl_Matrix * openfl_Position;";
|
||||
|
||||
public static final defaultVertexSource:String = "#pragma header
|
||||
|
||||
attribute float alpha;
|
||||
attribute vec4 colorMultiplier;
|
||||
attribute vec4 colorOffset;
|
||||
uniform bool hasColorTransform;
|
||||
|
||||
void main(void)
|
||||
{
|
||||
void main(void) {
|
||||
#pragma body
|
||||
|
||||
openfl_Alphav = openfl_Alpha * alpha;
|
||||
|
||||
if (hasColorTransform)
|
||||
{
|
||||
openfl_ColorOffsetv = colorOffset / 255.0;
|
||||
openfl_ColorMultiplierv = colorMultiplier;
|
||||
}
|
||||
}";
|
||||
|
||||
|
||||
// TODO: camera stuff
|
||||
public static final defaultFragmentSource:String = "#pragma header
|
||||
|
||||
void main(void)
|
||||
{
|
||||
gl_FragColor = flixel_texture2D(bitmap, openfl_TextureCoordv);
|
||||
void main(void) {
|
||||
#pragma body
|
||||
}";
|
||||
}
|
||||
|
||||
@@ -607,4 +650,16 @@ class ShaderTypeException extends Exception {
|
||||
this.name = name;
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -11,8 +11,7 @@ class Logs {
|
||||
|
||||
public static var nativeTrace = Log.trace;
|
||||
public static function init() {
|
||||
|
||||
Log.trace = function(v : Dynamic, ?infos : Null<haxe.PosInfos>) {
|
||||
Log.trace = function(v:Dynamic, ?infos:Null<haxe.PosInfos>) {
|
||||
var data = [
|
||||
logText('${infos.fileName}:${infos.lineNumber}: ', CYAN),
|
||||
logText(Std.string(v))
|
||||
@@ -28,22 +27,48 @@ class Logs {
|
||||
__showInConsole(prepareColoredTrace(data, TRACE));
|
||||
};
|
||||
|
||||
LogFrontEnd.onLogs = function(Data, Style, FireOnce) {
|
||||
LogFrontEnd.onLogs = function(data, style, fireOnce) {
|
||||
var prefix = "[FLIXEL]";
|
||||
var color:ConsoleColor = LIGHTGRAY;
|
||||
var level:Level = INFO;
|
||||
if (Style == LogStyle.CONSOLE) {prefix = "> "; color = WHITE; level = INFO; } else
|
||||
if (Style == LogStyle.ERROR) {prefix = "[FLIXEL]"; color = RED; level = ERROR; } else
|
||||
if (Style == LogStyle.NORMAL) {prefix = "[FLIXEL]"; color = WHITE; level = INFO; } else
|
||||
if (Style == LogStyle.NOTICE) {prefix = "[FLIXEL]"; color = GREEN; level = VERBOSE;} else
|
||||
if (Style == LogStyle.WARNING) {prefix = "[FLIXEL]"; color = YELLOW; level = WARNING;}
|
||||
if (style == LogStyle.CONSOLE) // cant place a switch here as these arent inline values - Nex
|
||||
{
|
||||
prefix = "> ";
|
||||
color = WHITE;
|
||||
level = INFO;
|
||||
}
|
||||
else if (style == LogStyle.ERROR)
|
||||
{
|
||||
prefix = "[FLIXEL]";
|
||||
color = RED;
|
||||
level = ERROR;
|
||||
}
|
||||
else if (style == LogStyle.NORMAL)
|
||||
{
|
||||
prefix = "[FLIXEL]";
|
||||
color = WHITE;
|
||||
level = INFO;
|
||||
}
|
||||
else if (style == LogStyle.NOTICE)
|
||||
{
|
||||
prefix = "[FLIXEL]";
|
||||
color = GREEN;
|
||||
level = VERBOSE;
|
||||
}
|
||||
else if (style == LogStyle.WARNING)
|
||||
{
|
||||
prefix = "[FLIXEL]";
|
||||
color = YELLOW;
|
||||
level = WARNING;
|
||||
}
|
||||
|
||||
var d:Dynamic = Data;
|
||||
var d:Dynamic = data;
|
||||
if (!(d is Array))
|
||||
d = [d];
|
||||
var a:Array<Dynamic> = d;
|
||||
var strs = [for(e in a) Std.string(e)];
|
||||
for(e in strs) {
|
||||
for(e in strs)
|
||||
{
|
||||
Logs.trace('$prefix $e', level, color);
|
||||
}
|
||||
};
|
||||
@@ -55,12 +80,18 @@ class Logs {
|
||||
logText('[ '),
|
||||
logText('${Std.string(time.getHours()).addZeros(2)}:${Std.string(time.getMinutes()).addZeros(2)}:${Std.string(time.getSeconds()).addZeros(2)}', DARKMAGENTA),
|
||||
logText(' |'),
|
||||
switch(level) {
|
||||
case WARNING: logText(' WARNING ', DARKYELLOW);
|
||||
case ERROR: logText(' ERROR ', DARKRED);
|
||||
case TRACE: logText(' TRACE ', GRAY);
|
||||
case VERBOSE: logText(' VERBOSE ', DARKMAGENTA);
|
||||
default: logText(' INFORMATION ', CYAN);
|
||||
switch (level)
|
||||
{
|
||||
case WARNING:
|
||||
logText(' WARNING ', DARKYELLOW);
|
||||
case ERROR:
|
||||
logText(' ERROR ', DARKRED);
|
||||
case TRACE:
|
||||
logText(' TRACE ', GRAY);
|
||||
case VERBOSE:
|
||||
logText(' VERBOSE ', DARKMAGENTA);
|
||||
default:
|
||||
logText(' INFORMATION ', CYAN);
|
||||
},
|
||||
logText('] ')
|
||||
];
|
||||
@@ -77,7 +108,7 @@ class Logs {
|
||||
}
|
||||
|
||||
public static function __showInConsole(text:Array<LogText>) {
|
||||
#if sys
|
||||
#if (sys && !mobile)
|
||||
while(__showing) {
|
||||
Sys.sleep(0.05);
|
||||
}
|
||||
@@ -89,20 +120,30 @@ class Logs {
|
||||
NativeAPI.setConsoleColors();
|
||||
Sys.print("\r\n");
|
||||
__showing = false;
|
||||
#elseif mobile
|
||||
while(__showing) {
|
||||
Sys.sleep(0.05);
|
||||
}
|
||||
__showing = true;
|
||||
@:privateAccess
|
||||
Sys.print([for(t in text) t.text].join(""));
|
||||
__showing = false;
|
||||
#else
|
||||
@:privateAccess
|
||||
nativeTrace([for(t in text) t.text].join(""));
|
||||
#end
|
||||
}
|
||||
|
||||
public static function traceColored(text:Array<LogText>, level:Level = INFO) {
|
||||
public static function traceColored(text:Array<LogText>, level:Level = INFO)
|
||||
__showInConsole(prepareColoredTrace(text, level));
|
||||
}
|
||||
|
||||
public static function trace(text:String, level:Level = INFO, color:ConsoleColor = LIGHTGRAY) {
|
||||
traceColored([{
|
||||
text: text,
|
||||
color: color
|
||||
}], level);
|
||||
traceColored([
|
||||
{
|
||||
text: text,
|
||||
color: color
|
||||
}
|
||||
], level);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -113,7 +154,8 @@ enum abstract Level(Int) {
|
||||
var TRACE = 3;
|
||||
var VERBOSE = 4;
|
||||
}
|
||||
|
||||
typedef LogText = {
|
||||
var text:String;
|
||||
var color:ConsoleColor;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -166,6 +166,8 @@ class Main extends Sprite
|
||||
}
|
||||
|
||||
public static function refreshAssets() {
|
||||
WindowUtils.resetTitle();
|
||||
|
||||
FlxSoundTray.volumeChangeSFX = Paths.sound('menu/volume');
|
||||
FlxSoundTray.volumeUpChangeSFX = null;
|
||||
FlxSoundTray.volumeDownChangeSFX = null;
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package funkin.backend.system.framerate;
|
||||
|
||||
import funkin.backend.scripting.ModState;
|
||||
|
||||
class FlixelInfo extends FramerateCategory {
|
||||
public function new() {
|
||||
super("Flixel Info");
|
||||
@@ -14,7 +16,12 @@ class FlixelInfo extends FramerateCategory {
|
||||
for(_ in FlxG.bitmap._cache.keys())
|
||||
c++;
|
||||
|
||||
_text = 'State: ${Type.getClassName(Type.getClass(FlxG.state))}';
|
||||
if((FlxG.state is ModState)) {
|
||||
var state:ModState = cast FlxG.state;
|
||||
_text = "Mod State: " + state.scriptName;
|
||||
} else {
|
||||
_text = 'State: ${Type.getClassName(Type.getClass(FlxG.state))}';
|
||||
}
|
||||
_text += '\nObject Count: ${FlxG.state.members.length}';
|
||||
_text += '\nCamera Count: ${FlxG.cameras.list.length}';
|
||||
_text += '\nBitmaps Count: ${c}';
|
||||
@@ -22,9 +29,9 @@ class FlixelInfo extends FramerateCategory {
|
||||
_text += '\nFlxG.game Childs Count: ${FlxG.game.numChildren}';
|
||||
// _text += '\nCached objects count: ${cachedObjects}';
|
||||
#if FLX_POINT_POOL
|
||||
var points = flixel.math.FlxPoint.FlxBasePoint.pool;
|
||||
//var points = flixel.math.FlxPoint.FlxBasePoint.pool;
|
||||
//_text += '\nPoint Count: ${points._count} | +${points.made} | -${points.gotten} | ${points.balance} | >${points.putted}';
|
||||
_text += '\nPoint Count: ${points._count}';
|
||||
//_text += '\nPoint Count: ${points._count}';
|
||||
#end
|
||||
}
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@ package funkin.backend.system.github;
|
||||
|
||||
#if GITHUB_API
|
||||
import haxe.Json;
|
||||
import haxe.Exception;
|
||||
#end
|
||||
import haxe.Exception;
|
||||
|
||||
// TODO: Document further and perhaps make this a Haxelib.
|
||||
class GitHub {
|
||||
|
||||
@@ -42,26 +42,12 @@ class HashLinkFixer {
|
||||
var cl = clRef.get();
|
||||
|
||||
if (cl.isAbstract || cl.isExtern || cl.isInterface) return fields;
|
||||
if (!cl.name.endsWith("_Impl_") && !cl.name.endsWith("_HSX") && !cl.name.endsWith("_HSC") && !cl.name.endsWith("_HLFHelper")) {
|
||||
var metas = cl.meta.get();
|
||||
|
||||
if (!cl.name.endsWith("_Impl_") && !cl.name.endsWith("_HSX") && !cl.name.endsWith("_HSC")) {
|
||||
if(cl.params.length > 0)
|
||||
return fields;
|
||||
|
||||
if(cl.module == "EReg") return fields; // private typedef in same class
|
||||
if(cl.module == "hl.Format") return fields; // enum in same class
|
||||
|
||||
var definedFields = [];
|
||||
|
||||
var helperClass = macro class {
|
||||
|
||||
};
|
||||
|
||||
helperClass.pos = cl.pos;
|
||||
|
||||
var module = cl.module + "_HLFHelper";
|
||||
var hcClassName = cl.name + "_HLFHelper";
|
||||
|
||||
for(f in fields.copy()) {
|
||||
if (f == null)
|
||||
continue;
|
||||
@@ -70,10 +56,12 @@ class HashLinkFixer {
|
||||
|
||||
if(definedFields.contains(f.name)) continue; // no duplicate fields
|
||||
|
||||
var hlNativeMeta = null;
|
||||
var hasHlNative = false;
|
||||
for(m in f.meta)
|
||||
if (m.name == ":hlNative") {
|
||||
hasHlNative = true;
|
||||
hlNativeMeta = m;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -92,16 +80,39 @@ class HashLinkFixer {
|
||||
var overrideExpr:Expr;
|
||||
var returns:Bool = !fun.ret.match(TPath({name: "Void"}));
|
||||
|
||||
var printer = new haxe.macro.Printer();
|
||||
if(cl.module == "hl.Gc" && fun.ret == null) returns = false; // fix since they dont explicitly set :Void
|
||||
if(cl.module == "hl.Format" && fun.ret == null) returns = false; // fix since they dont explicitly set :Void
|
||||
|
||||
var name = 'hlf_${f.name}';
|
||||
|
||||
var arguments = fun.args == null ? [] : [for(a in fun.args) macro $i{a.name}];
|
||||
|
||||
var funcExpr:Expr = returns ? {
|
||||
//macro return $i{name}($a{arguments});
|
||||
macro return @:privateAccess $i{hcClassName}.$name($a{arguments});
|
||||
} : {
|
||||
macro @:privateAccess $i{hcClassName}.$name($a{arguments});
|
||||
};
|
||||
var funcExpr:Expr = macro @:privateAccess $i{name}($a{arguments});
|
||||
if(returns) funcExpr = macro return $funcExpr;
|
||||
|
||||
var cleanMeta = f.meta.copy().filter(function(m) return m.name != ":hlNative");
|
||||
var hasBareMeta = hlNativeMeta.params.length == 0;
|
||||
|
||||
var meta = f.meta.copy();
|
||||
switch hlNativeMeta {
|
||||
case {params: []}:
|
||||
meta = [{name: ":hlNative", params: [macro "std", macro $v{f.name}], pos: Context.currentPos()}].concat(cleanMeta);
|
||||
case {params: [_.expr => EConst(CString(name))]}:
|
||||
meta = [{name: ":hlNative", params: [macro "std", macro $v{name}], pos: Context.currentPos()}].concat(cleanMeta);
|
||||
case {params: [_.expr => EConst(CFloat(version))]}:
|
||||
var curVersion = Context.definedValue("hl_ver");
|
||||
if(curVersion == null) curVersion = "";
|
||||
if(version > curVersion) {
|
||||
meta = cleanMeta;
|
||||
if(f.meta.filter((m) -> m.name == ":noExpr").length > 0)
|
||||
Context.error("Missing function body", f.pos);
|
||||
funcExpr = fun.expr; // restore to default behaviour
|
||||
} else {
|
||||
meta = [{name: ":hlNative", params: [macro "std", macro $v{f.name}], pos: Context.currentPos()}].concat(cleanMeta);
|
||||
}
|
||||
default:
|
||||
}
|
||||
|
||||
var fiel:Field = {
|
||||
name: name,
|
||||
@@ -109,50 +120,32 @@ class HashLinkFixer {
|
||||
kind: FFun({
|
||||
ret: fun.ret,
|
||||
params: fun.params.copy(),
|
||||
expr: fun.expr,
|
||||
expr: funcExpr,
|
||||
args: fun.args.copy()
|
||||
}),
|
||||
access: f.access.copy(),
|
||||
meta: f.meta.copy()
|
||||
access: f.access.copy().filter(function(a) return a != APublic && a != APrivate).concat([APrivate]),
|
||||
meta: meta
|
||||
};
|
||||
helperClass.fields.push(fiel);
|
||||
fields.push(fiel);
|
||||
definedFields.push(f.name);
|
||||
|
||||
// Remove meta from original function
|
||||
for(m in f.meta.copy())
|
||||
if (m.name == ":hlNative") {
|
||||
f.meta.remove(m);
|
||||
}
|
||||
|
||||
fun.expr = funcExpr;
|
||||
default:
|
||||
}
|
||||
}
|
||||
|
||||
helperClass.pack = cl.pack.copy();
|
||||
helperClass.pos = cl.pos;
|
||||
helperClass.name = hcClassName;
|
||||
|
||||
if(definedFields.length > 0) {
|
||||
/*if(definedFields.length > 0) {
|
||||
trace(cl.module);
|
||||
|
||||
/*for(m in metas.copy()) {
|
||||
trace(" " + m.name);
|
||||
if(m.name == ":coreApi") {
|
||||
metas.remove(m);
|
||||
}
|
||||
}*/
|
||||
|
||||
var imports = Context.getLocalImports().copy();
|
||||
Context.defineModule(module, [helperClass], imports);
|
||||
|
||||
Context.getLocalImports().push({
|
||||
path: [for(m in module.split(".")) {
|
||||
name: m,
|
||||
pos: Context.currentPos()
|
||||
}],
|
||||
mode: INormal
|
||||
});
|
||||
}
|
||||
var printer = new haxe.macro.Printer();
|
||||
for(field in fields) if(field.name.startsWith("hlf_"))
|
||||
Sys.println(printer.printField(field));
|
||||
}*/
|
||||
}
|
||||
|
||||
return fields;
|
||||
|
||||
@@ -62,6 +62,7 @@ class AudioSwitchFix {
|
||||
}
|
||||
}
|
||||
|
||||
@:dox(hide)
|
||||
typedef PlayingSound = {
|
||||
var sound:FlxSound;
|
||||
var time:Float;
|
||||
|
||||
@@ -101,7 +101,7 @@ class AsyncUpdater {
|
||||
progress.files = files.length;
|
||||
progress.step = DOWNLOADING_ASSETS;
|
||||
trace('starting assets download');
|
||||
doFile([for(e in files) e], [for(e in fileNames) e], function() {
|
||||
doFile(files.copy(), fileNames.copy(), function() {
|
||||
progress.curFile = -1;
|
||||
progress.curFileName = null;
|
||||
progress.files = 1;
|
||||
|
||||
@@ -706,7 +706,10 @@ class CoolUtil
|
||||
*/
|
||||
@:noUsing public static inline function openURL(url:String) {
|
||||
#if linux
|
||||
Sys.command('/usr/bin/xdg-open', [url]);
|
||||
// generally `xdg-open` should work in every distro
|
||||
var cmd = Sys.command("xdg-open", [url]);
|
||||
// run old command JUST IN CASE it fails, which it shouldn't
|
||||
if (cmd != 0) cmd = Sys.command("/usr/bin/xdg-open", [url]);
|
||||
#else
|
||||
FlxG.openURL(url);
|
||||
#end
|
||||
|
||||
@@ -165,6 +165,7 @@ class DiscordUtil
|
||||
#end
|
||||
}
|
||||
|
||||
#if cpp
|
||||
@:noCompletion public static function fixString(str:String)
|
||||
{
|
||||
return new cpp.ConstCharStar(cast(str, String));
|
||||
@@ -174,6 +175,7 @@ class DiscordUtil
|
||||
{
|
||||
return cast(str, String);
|
||||
}
|
||||
#end
|
||||
|
||||
public static function changePresenceAdvanced(data:DPresence)
|
||||
{
|
||||
@@ -469,7 +471,7 @@ typedef DPresence =
|
||||
var ?matchSecret:String; /* max 128 bytes */
|
||||
var ?joinSecret:String; /* max 128 bytes */
|
||||
var ?spectateSecret:String; /* max 128 bytes */
|
||||
var ?instance:OneOfTwo<Int, cpp.Int8>;
|
||||
var ?instance:#if cpp OneOfTwo<Int, cpp.Int8> #else Int #end;
|
||||
var ?button1Label:String; /* max 32 bytes */
|
||||
var ?button1Url:String; /* max 512 bytes */
|
||||
var ?button2Label:String; /* max 32 bytes */
|
||||
|
||||
@@ -130,14 +130,16 @@ class MemoryUtil {
|
||||
reg.match(process.stdout.readAll().toString());
|
||||
if (process.exitCode() == 0) return reg.matched(1);
|
||||
#elseif linux
|
||||
var process = new HiddenProcess("sudo", ["dmidecode", "--type", "17"]);
|
||||
/*var process = new HiddenProcess("sudo", ["dmidecode", "--type", "17"]);
|
||||
if (process.exitCode() != 0) return "Unknown";
|
||||
var lines = process.stdout.readAll().toString().split("\n");
|
||||
for (line in lines) {
|
||||
if (line.indexOf("Type:") == 0) {
|
||||
return line.substring("Type:".length).trim();
|
||||
}
|
||||
}
|
||||
}*/
|
||||
// TODO: sort of unsafe? also requires users to use `sudo`
|
||||
// when launching the engine through the CLI, REIMPLEMENT LATER.
|
||||
#end
|
||||
return "Unknown";
|
||||
}
|
||||
|
||||
@@ -6,6 +6,9 @@ import funkin.backend.system.ErrorCode;
|
||||
import funkin.backend.FunkinSprite.XMLAnimType;
|
||||
import flixel.util.FlxColor;
|
||||
import haxe.xml.Access;
|
||||
import funkin.backend.scripting.Script;
|
||||
import funkin.backend.scripting.DummyScript;
|
||||
import funkin.backend.scripting.ScriptPack;
|
||||
import flixel.util.typeLimit.OneOfTwo;
|
||||
import funkin.backend.system.interfaces.IOffsetCompatible;
|
||||
|
||||
@@ -326,6 +329,51 @@ class XMLUtil {
|
||||
}
|
||||
}
|
||||
|
||||
class XMLImportedScriptInfo {
|
||||
public var path:String;
|
||||
public var shortLived:Bool = false;
|
||||
public var loadBefore:Bool = true;
|
||||
public var importStageSprites:Bool = false; // maybe will change later?? - Nex
|
||||
public var parentScriptPack:ScriptPack = null;
|
||||
|
||||
public function new(path:String, parentScriptPack:ScriptPack) {
|
||||
this.parentScriptPack = parentScriptPack;
|
||||
this.path = path;
|
||||
}
|
||||
|
||||
public function getScript():Script
|
||||
return parentScriptPack == null ? null : parentScriptPack.getByPath(path);
|
||||
|
||||
public static function prepareInfos(node:Access, parentScriptPack:ScriptPack, ?onScriptPreLoad:XMLImportedScriptInfo->Void):XMLImportedScriptInfo {
|
||||
if (!node.has.script || parentScriptPack == null) return null;
|
||||
|
||||
var folder = node.getAtt("folder").getDefault("data/scripts/");
|
||||
if (!folder.endsWith("/")) folder += "/";
|
||||
|
||||
var path = Paths.script(folder + node.getAtt("script"));
|
||||
var daScript = Script.create(path);
|
||||
if (daScript is DummyScript) {
|
||||
Logs.trace('Script Extension at ${path} does not exist.', ERROR);
|
||||
return null;
|
||||
}
|
||||
|
||||
var infos = new XMLImportedScriptInfo(daScript.path, parentScriptPack);
|
||||
infos.shortLived = node.getAtt("isShortLived") == "true" || node.getAtt("shortLived") == "true";
|
||||
infos.importStageSprites = node.getAtt("importStageSprites") == "true";
|
||||
@:privateAccess infos.loadBefore = shouldLoadBefore(node);
|
||||
|
||||
if (onScriptPreLoad != null) onScriptPreLoad(infos);
|
||||
parentScriptPack.add(daScript);
|
||||
daScript.set("scriptInfo", infos);
|
||||
daScript.load();
|
||||
|
||||
return infos;
|
||||
}
|
||||
|
||||
@:dox(hide) public static inline function shouldLoadBefore(node:Access):Bool
|
||||
return node.getAtt("loadBefore") != "false";
|
||||
}
|
||||
|
||||
typedef AnimData = {
|
||||
var name:String;
|
||||
var anim:String;
|
||||
|
||||
@@ -1657,7 +1657,7 @@ class Charter extends UIState {
|
||||
changeNoteSustain(-1);
|
||||
|
||||
function _note_selectall(_) {
|
||||
selection = [for (note in notesGroup.members) note];
|
||||
selection = cast notesGroup.members.copy();
|
||||
}
|
||||
|
||||
function _note_selectmeasure(_) {
|
||||
|
||||
@@ -253,7 +253,7 @@ class CharterBackdropDummy extends UISprite {
|
||||
|
||||
public override function draw() {
|
||||
@:privateAccess
|
||||
__lastDrawCameras = [for(c in cameras) c];
|
||||
__lastDrawCameras = cameras.copy();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ package funkin.editors.charter;
|
||||
|
||||
import flixel.group.FlxSpriteGroup;
|
||||
import flixel.math.FlxPoint;
|
||||
import flixel.system.FlxAssets.FlxGraphicAsset;
|
||||
import funkin.backend.chart.ChartData.ChartEvent;
|
||||
import funkin.backend.scripting.DummyScript;
|
||||
import funkin.backend.scripting.Script;
|
||||
@@ -106,18 +107,35 @@ class CharterEvent extends UISliceSprite implements ICharterSelectable {
|
||||
private static function generateDefaultIcon(name:String) {
|
||||
var isBase64:Bool = false;
|
||||
var path:String = Paths.image('editors/charter/event-icons/$name');
|
||||
var defaultPath = Paths.image('editors/charter/event-icons/Unknown');
|
||||
if(!Assets.exists(path)) {
|
||||
path = Paths.image('editors/charter/event-icons/Unknown');
|
||||
path = defaultPath;
|
||||
|
||||
var packData = getPackData(name);
|
||||
if(packData != null && packData[3] != null) {
|
||||
isBase64 = true;
|
||||
path = packData[3];
|
||||
if(packData != null) {
|
||||
var packImg = packData[3];
|
||||
if(packImg != null && packImg.length > 0) {
|
||||
isBase64 = !packImg.startsWith("assets/");
|
||||
path = packImg;
|
||||
}
|
||||
}
|
||||
}
|
||||
path = path.trim();
|
||||
|
||||
var spr = new FlxSprite().loadGraphic(isBase64 ? BitmapData.fromBase64(path.trim(), 'UTF8') : path);
|
||||
return spr;
|
||||
var graphic:FlxGraphicAsset = try {
|
||||
isBase64 ? openfl.display.BitmapData.fromBase64(path, 'UTF8') : path;
|
||||
} catch(e:Dynamic) {
|
||||
Logs.trace('Failed to load event icon: ${e.toString()}', ERROR);
|
||||
isBase64 = false;
|
||||
defaultPath;
|
||||
}
|
||||
|
||||
if(!isBase64) {
|
||||
if (!Assets.exists(graphic))
|
||||
graphic = defaultPath;
|
||||
}
|
||||
|
||||
return new FlxSprite().loadGraphic(graphic);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -69,7 +69,7 @@ class UISprite extends FlxSprite {
|
||||
|
||||
public function drawSuper() {
|
||||
super.draw();
|
||||
__lastDrawCameras = [for(c in cameras) c];
|
||||
__lastDrawCameras = cameras.copy();
|
||||
}
|
||||
|
||||
public function drawMembers() {
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package funkin.editors.ui;
|
||||
|
||||
import openfl.display.ShaderParameter;
|
||||
import openfl.display.ShaderInput;
|
||||
import openfl.filters.ShaderFilter;
|
||||
import flixel.tweens.FlxTween;
|
||||
import funkin.backend.shaders.CustomShader;
|
||||
@@ -7,7 +9,17 @@ import funkin.backend.shaders.CustomShader;
|
||||
// TODO: make UIWarningSubstate extend this
|
||||
class UISubstateWindow extends MusicBeatSubstate {
|
||||
var camShaders:Array<FlxCamera> = [];
|
||||
var blurShader:CustomShader = new CustomShader(Options.intensiveBlur ? "engine/editorBlur" : "engine/editorBlurFast");
|
||||
var blurShader:CustomShader = {
|
||||
var _ = new CustomShader(Options.intensiveBlur ? "engine/editorBlur" : "engine/editorBlurFast");
|
||||
if(!Options.intensiveBlur) {
|
||||
var noiseTexture:ShaderInput<openfl.display.BitmapData> = _.data.noiseTexture;
|
||||
noiseTexture.input = Assets.getBitmapData("assets/shaders/noise256.png");
|
||||
noiseTexture.wrap = REPEAT;
|
||||
var noiseTextureSize:ShaderParameter<Float> = _.data.noiseTextureSize;
|
||||
noiseTextureSize.value = [noiseTexture.input.width, noiseTexture.input.height];
|
||||
}
|
||||
_;
|
||||
};
|
||||
|
||||
var titleSpr:UIText;
|
||||
var messageSpr:UIText;
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package funkin.editors.ui;
|
||||
|
||||
import openfl.display.ShaderParameter;
|
||||
import openfl.display.ShaderInput;
|
||||
import openfl.filters.ShaderFilter;
|
||||
import flixel.tweens.FlxTween;
|
||||
import flixel.tweens.FlxEase;
|
||||
@@ -7,7 +9,17 @@ import funkin.backend.shaders.CustomShader;
|
||||
|
||||
class UIWarningSubstate extends MusicBeatSubstate {
|
||||
var camShaders:Array<FlxCamera> = [];
|
||||
var blurShader:CustomShader = new CustomShader(Options.intensiveBlur ? "engine/editorBlur" : "engine/editorBlurFast");
|
||||
var blurShader:CustomShader = {
|
||||
var _ = new CustomShader(Options.intensiveBlur ? "engine/editorBlur" : "engine/editorBlurFast");
|
||||
if(!Options.intensiveBlur) {
|
||||
var noiseTexture:ShaderInput<openfl.display.BitmapData> = _.data.noiseTexture;
|
||||
noiseTexture.input = Assets.getBitmapData("assets/shaders/noise256.png");
|
||||
noiseTexture.wrap = REPEAT;
|
||||
var noiseTextureSize:ShaderParameter<Float> = _.data.noiseTextureSize;
|
||||
noiseTextureSize.value = [noiseTexture.input.width, noiseTexture.input.height];
|
||||
}
|
||||
_;
|
||||
};
|
||||
|
||||
var title:String;
|
||||
var message:String;
|
||||
|
||||
@@ -8,6 +8,9 @@ import flixel.util.FlxColor;
|
||||
import funkin.backend.FunkinSprite;
|
||||
import funkin.backend.scripting.DummyScript;
|
||||
import funkin.backend.scripting.Script;
|
||||
import funkin.backend.scripting.ScriptPack;
|
||||
import funkin.backend.scripting.events.CharacterNodeEvent;
|
||||
import funkin.backend.scripting.events.CharacterXMLEvent;
|
||||
import funkin.backend.scripting.events.DanceEvent;
|
||||
import funkin.backend.scripting.events.DirectionAnimEvent;
|
||||
import funkin.backend.scripting.events.PlayAnimEvent;
|
||||
@@ -44,8 +47,13 @@ class Character extends FunkinSprite implements IBeatReceiver implements IOffset
|
||||
public var cameraOffset:FlxPoint = FlxPoint.get(0, 0);
|
||||
public var globalOffset:FlxPoint = FlxPoint.get(0, 0);
|
||||
|
||||
public var script:Script;
|
||||
public var xml:Access;
|
||||
public var scripts:ScriptPack;
|
||||
public var xmlImportedScripts:Array<XMLImportedScriptInfo> = [];
|
||||
public var script(default, set):Script;
|
||||
|
||||
public function prepareInfos(node:Access)
|
||||
return XMLImportedScriptInfo.prepareInfos(node, scripts, (infos) -> xmlImportedScripts.push(infos));
|
||||
|
||||
public var idleSuffix:String = "";
|
||||
public var stunned(default, set):Bool = false;
|
||||
@@ -71,16 +79,15 @@ class Character extends FunkinSprite implements IBeatReceiver implements IOffset
|
||||
script = Script.create(Paths.script(Path.withoutExtension(Paths.xml('characters/$curCharacter')), null, true));
|
||||
else
|
||||
script = new DummyScript(curCharacter);
|
||||
script.setParent(this);
|
||||
script.load();
|
||||
|
||||
buildCharacter(xml);
|
||||
script.call("create");
|
||||
scripts.call("create");
|
||||
|
||||
if (script == null)
|
||||
script = new DummyScript(curCharacter);
|
||||
|
||||
script.call("postCreate");
|
||||
scripts.call("postCreate");
|
||||
}
|
||||
|
||||
@:noCompletion var __swappedLeftRightAnims:Bool = false;
|
||||
@@ -92,9 +99,9 @@ class Character extends FunkinSprite implements IBeatReceiver implements IOffset
|
||||
__autoInterval = autoInterval;
|
||||
|
||||
// character is flipped
|
||||
if (isPlayer != playerOffsets && switchAnims)
|
||||
if (isPlayer != playerOffsets && switchAnims)
|
||||
swapLeftRightAnimations();
|
||||
|
||||
|
||||
frameOffset.set(getAnimOffset(getAnimName()).x, getAnimOffset(getAnimName()).y);
|
||||
if (isPlayer) flipX = !flipX;
|
||||
__baseFlipped = flipX;
|
||||
@@ -115,7 +122,7 @@ class Character extends FunkinSprite implements IBeatReceiver implements IOffset
|
||||
|
||||
override function update(elapsed:Float) {
|
||||
super.update(elapsed);
|
||||
script.call("update", [elapsed]);
|
||||
scripts.call("update", [elapsed]);
|
||||
if (stunned) {
|
||||
__stunnedTime += elapsed;
|
||||
if (__stunnedTime > 5 / 60)
|
||||
@@ -134,7 +141,7 @@ class Character extends FunkinSprite implements IBeatReceiver implements IOffset
|
||||
if(debugMode) return;
|
||||
|
||||
var event = EventManager.get(DanceEvent).recycle(danced);
|
||||
script.call("onDance", [event]);
|
||||
scripts.call("onDance", [event]);
|
||||
if (event.cancelled) return;
|
||||
|
||||
if (isDanceLeftDanceRight)
|
||||
@@ -164,14 +171,14 @@ class Character extends FunkinSprite implements IBeatReceiver implements IOffset
|
||||
*/
|
||||
public var danceOnBeat:Bool = true;
|
||||
public override function beatHit(curBeat:Int) {
|
||||
script.call("beatHit", [curBeat]);
|
||||
scripts.call("beatHit", [curBeat]);
|
||||
|
||||
if (danceOnBeat && (curBeat + beatOffset) % beatInterval == 0 && !__lockAnimThisFrame)
|
||||
tryDance();
|
||||
}
|
||||
|
||||
public override function stepHit(curStep:Int)
|
||||
script.call("stepHit", [curStep]);
|
||||
scripts.call("stepHit", [curStep]);
|
||||
|
||||
@:noCompletion var __reverseDrawProcedure:Bool = false;
|
||||
public override function getScreenBounds(?newRect:FlxRect, ?camera:FlxCamera):FlxRect {
|
||||
@@ -209,14 +216,14 @@ class Character extends FunkinSprite implements IBeatReceiver implements IOffset
|
||||
public var singAnims = ["singLEFT", "singDOWN", "singUP", "singRIGHT"];
|
||||
public function playSingAnim(direction:Int, suffix:String = "", Context:PlayAnimContext = SING, ?Force:Null<Bool> = null, Reversed:Bool = false, Frame:Int = 0) {
|
||||
var event = EventManager.get(DirectionAnimEvent).recycle(singAnims[direction % singAnims.length] + suffix, direction, suffix, Context, Reversed, Frame, Force);
|
||||
script.call("onPlaySingAnim", [event]);
|
||||
scripts.call("onPlaySingAnim", [event]);
|
||||
if (!event.cancelled)
|
||||
playAnim(event.animName, event.force, event.context, event.reversed, event.frame);
|
||||
}
|
||||
|
||||
public override function playAnim(AnimName:String, ?Force:Bool, Context:PlayAnimContext = NONE, Reversed:Bool = false, Frame:Int = 0) {
|
||||
var event = EventManager.get(PlayAnimEvent).recycle(AnimName, Force, Reversed, Frame, Context);
|
||||
script.call("onPlayAnim", [event]);
|
||||
scripts.call("onPlayAnim", [event]);
|
||||
if (event.cancelled) return;
|
||||
|
||||
super.playAnim(event.animName, event.force, event.context, event.reverse, event.startingFrame);
|
||||
@@ -231,15 +238,15 @@ class Character extends FunkinSprite implements IBeatReceiver implements IOffset
|
||||
var event = EventManager.get(PointEvent).recycle(
|
||||
midpoint.x + (isPlayer ? -100 : 150) + globalOffset.x + cameraOffset.x,
|
||||
midpoint.y - 100 + globalOffset.y + cameraOffset.y);
|
||||
script.call("onGetCamPos", [event]);
|
||||
scripts.call("onGetCamPos", [event]);
|
||||
|
||||
midpoint.put();
|
||||
return new FlxPoint(event.x, event.y);
|
||||
}
|
||||
|
||||
public override function destroy() {
|
||||
script.call('destroy');
|
||||
script.destroy();
|
||||
scripts.call('destroy');
|
||||
scripts.destroy();
|
||||
super.destroy();
|
||||
|
||||
cameraOffset.put();
|
||||
@@ -281,9 +288,18 @@ class Character extends FunkinSprite implements IBeatReceiver implements IOffset
|
||||
}
|
||||
|
||||
public inline function buildCharacter(xml:Access) {
|
||||
this.xml = xml; // Modders wassup :D
|
||||
for(node in xml.elements)
|
||||
switch(node.name) {
|
||||
case "use-extension" | "extension" | "ext":
|
||||
if (!XMLImportedScriptInfo.shouldLoadBefore(node)) continue;
|
||||
prepareInfos(node);
|
||||
}
|
||||
|
||||
xml = scripts.event("onCharacterXMLParsed", EventManager.get(CharacterXMLEvent).recycle(this, xml)).xml;
|
||||
|
||||
sprite = curCharacter;
|
||||
spriteAnimType = BEAT;
|
||||
this.xml = xml; // Modders wassup :D
|
||||
|
||||
if (xml.x.exists("isPlayer")) playerOffsets = (xml.x.get("isPlayer") == "true");
|
||||
if (xml.x.exists("x")) globalOffset.x = Std.parseFloat(xml.x.get("x"));
|
||||
@@ -307,9 +323,19 @@ class Character extends FunkinSprite implements IBeatReceiver implements IOffset
|
||||
if (hasInterval) beatInterval = Std.parseInt(xml.x.get("interval"));
|
||||
|
||||
loadSprite(Paths.image('characters/$sprite'));
|
||||
for(node in xml.elements) {
|
||||
switch(node.name) {
|
||||
case "anim":
|
||||
XMLUtil.addXMLAnimation(this, node);
|
||||
case "use-extension" | "extension" | "ext":
|
||||
if (XMLImportedScriptInfo.shouldLoadBefore(node)) continue;
|
||||
prepareInfos(node);
|
||||
default:
|
||||
// nothing
|
||||
}
|
||||
|
||||
for (anim in xml.nodes.anim)
|
||||
XMLUtil.addXMLAnimation(this, anim);
|
||||
scripts.event("onCharacterNodeParsed", EventManager.get(CharacterNodeEvent).recycle(this, node, node.name));
|
||||
}
|
||||
|
||||
for (attribute in xml.x.attributes())
|
||||
if (!characterProperties.contains(attribute))
|
||||
@@ -317,11 +343,19 @@ class Character extends FunkinSprite implements IBeatReceiver implements IOffset
|
||||
|
||||
fixChar(__switchAnims, !hasInterval);
|
||||
dance();
|
||||
|
||||
for (info in xmlImportedScripts) if (info.shortLived) {
|
||||
var script = info.getScript();
|
||||
if (script == null) continue;
|
||||
|
||||
scripts.remove(script);
|
||||
script.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
public static var characterProperties:Array<String> = [
|
||||
"x", "y", "sprite", "scale", "antialiasing",
|
||||
"flipX", "camx", "camy", "isPlayer", "icon",
|
||||
"x", "y", "sprite", "scale", "antialiasing",
|
||||
"flipX", "camx", "camy", "isPlayer", "icon",
|
||||
"color", "gameOverChar", "holdTime"
|
||||
];
|
||||
public static var characterAnimProperties:Array<String> = [
|
||||
@@ -331,7 +365,7 @@ class Character extends FunkinSprite implements IBeatReceiver implements IOffset
|
||||
public inline function buildXML(?animsOrder:Array<String>):Xml {
|
||||
var xml:Xml = Xml.createElement("character");
|
||||
xml.attributeOrder = characterProperties.copy();
|
||||
|
||||
|
||||
if (globalOffset.x != 0) xml.set("x", Std.string(FlxMath.roundDecimal(globalOffset.x, 2)));
|
||||
if (globalOffset.y != 0) xml.set("y", Std.string(FlxMath.roundDecimal(globalOffset.y, 2)));
|
||||
|
||||
@@ -400,6 +434,7 @@ class Character extends FunkinSprite implements IBeatReceiver implements IOffset
|
||||
return stunned = b;
|
||||
}
|
||||
|
||||
// ---- Backwards compat ----
|
||||
// Interval at which the character will dance (higher number = slower dance)
|
||||
@:noCompletion public var danceInterval(get, set):Int;
|
||||
@:noCompletion private function set_danceInterval(v:Int)
|
||||
@@ -407,6 +442,22 @@ class Character extends FunkinSprite implements IBeatReceiver implements IOffset
|
||||
@:noCompletion private function get_danceInterval()
|
||||
return beatInterval;
|
||||
|
||||
private function set_script(script:Script):Script {
|
||||
if (scripts == null) (scripts = new ScriptPack("Character")).setParent(this);
|
||||
|
||||
var lastIndex = scripts.scripts.indexOf(this.script);
|
||||
if(lastIndex >= 0) {
|
||||
if(script == null) // last != null && new == null
|
||||
scripts.scripts.splice(lastIndex, 1);
|
||||
else // last != null && new != null
|
||||
scripts.scripts[lastIndex] = script;
|
||||
} else if(script != null) // last == null
|
||||
scripts.insert(0, script);
|
||||
|
||||
return this.script = script;
|
||||
}
|
||||
// ---- end of Backwards compat ----
|
||||
|
||||
|
||||
public static var FALLBACK_CHARACTER:String = "bf";
|
||||
public static var FALLBACK_DEAD_CHARACTER:String = "bf-dead";
|
||||
@@ -436,7 +487,7 @@ class Character extends FunkinSprite implements IBeatReceiver implements IOffset
|
||||
Logs.trace('Error while loading character ${character}: ${e}', ERROR);
|
||||
|
||||
character = FALLBACK_CHARACTER;
|
||||
if (char != null)
|
||||
if (char != null)
|
||||
char.curCharacter = character;
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -85,12 +85,11 @@ class HealthIcon extends FlxSprite
|
||||
if (animation.curAnim != null) {
|
||||
var i:Int = -1;
|
||||
var oldKey:Int = -1;
|
||||
for(k=>icon in healthSteps) {
|
||||
if (k > oldKey && k < health * 100) {
|
||||
oldKey = k;
|
||||
i = icon;
|
||||
}
|
||||
for (k=>icon in healthSteps) if (k > oldKey && k <= health * 100) {
|
||||
oldKey = k;
|
||||
i = icon;
|
||||
}
|
||||
|
||||
if (i >= 0) animation.curAnim.curFrame = i;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -98,6 +98,9 @@ class Note extends FlxSprite
|
||||
return __customNoteTypeExists[path];
|
||||
return __customNoteTypeExists[path] = Assets.exists(path);
|
||||
}
|
||||
|
||||
static var DEFAULT_FIELDS:Array<String> = ["time", "id", "type", "sLen"];
|
||||
|
||||
public function new(strumLine:StrumLine, noteData:ChartNote, sustain:Bool = false, sustainLength:Float = 0, sustainOffset:Float = 0, ?prev:Note)
|
||||
{
|
||||
super();
|
||||
@@ -115,7 +118,7 @@ class Note extends FlxSprite
|
||||
this.sustainLength = sustainLength;
|
||||
this.strumLine = strumLine;
|
||||
for(field in Reflect.fields(noteData)) {
|
||||
if(!["time", "id", "type", "sLen"].contains(field)) {
|
||||
if(!DEFAULT_FIELDS.contains(field)) {
|
||||
this.extra.set(field, Reflect.field(noteData, field));
|
||||
}
|
||||
}
|
||||
@@ -290,7 +293,7 @@ class Note extends FlxSprite
|
||||
setClipRect(swagRect);
|
||||
}
|
||||
|
||||
public function setClipRect(rect:FlxRect) {
|
||||
public inline function setClipRect(rect:FlxRect) {
|
||||
this.clipRect = rect;
|
||||
}
|
||||
|
||||
|
||||
@@ -455,6 +455,22 @@ class PlayState extends MusicBeatState
|
||||
* Group containing all of the combo sprites.
|
||||
*/
|
||||
public var comboGroup:RotatingSpriteGroup;
|
||||
/**
|
||||
* Whenever the Rating sprites should be shown or not.
|
||||
*
|
||||
* NOTE: This is just a default value for the final value, the final value can be changed through notes hit events.
|
||||
*/
|
||||
public var defaultDisplayRating:Bool = true;
|
||||
/**
|
||||
* Whenever the Combo sprite should be shown or not (like old Week 7 patches).
|
||||
*
|
||||
* NOTE: This is just a default value for the final value, the final value can be changed through notes hit events.
|
||||
*/
|
||||
public var defaultDisplayCombo:Bool = false;
|
||||
/**
|
||||
* Minimum Combo Count to display the combo digits. Anything less than 0 means it won't be shown.
|
||||
*/
|
||||
public var minDigitDisplay:Int = 10;
|
||||
/**
|
||||
* Array containing all of the note types names.
|
||||
*/
|
||||
@@ -1646,9 +1662,11 @@ class PlayState extends MusicBeatState
|
||||
|
||||
var event:NoteHitEvent;
|
||||
if (strumLine != null && !strumLine.cpu)
|
||||
event = scripts.event("onPlayerHit", EventManager.get(NoteHitEvent).recycle(false, !note.isSustainNote, !note.isSustainNote, note, strumLine.characters, true, note.noteType, note.animSuffix.getDefault(note.strumID < strumLine.members.length ? strumLine.members[note.strumID].animSuffix : strumLine.animSuffix), "game/score/", "", note.strumID, score, note.isSustainNote ? null : accuracy, 0.023, daRating, Options.splashesEnabled && !note.isSustainNote && daRating == "sick"));
|
||||
event = EventManager.get(NoteHitEvent).recycle(false, !note.isSustainNote, !note.isSustainNote, null, defaultDisplayRating, defaultDisplayCombo, note, strumLine.characters, true, note.noteType, note.animSuffix.getDefault(note.strumID < strumLine.members.length ? strumLine.members[note.strumID].animSuffix : strumLine.animSuffix), "game/score/", "", note.strumID, score, note.isSustainNote ? null : accuracy, 0.023, daRating, Options.splashesEnabled && !note.isSustainNote && daRating == "sick");
|
||||
else
|
||||
event = scripts.event("onDadHit", EventManager.get(NoteHitEvent).recycle(false, false, false, note, strumLine.characters, false, note.noteType, note.animSuffix.getDefault(note.strumID < strumLine.members.length ? strumLine.members[note.strumID].animSuffix : strumLine.animSuffix), "game/score/", "", note.strumID, 0, null, 0, daRating, false));
|
||||
event = EventManager.get(NoteHitEvent).recycle(false, false, false, null, defaultDisplayRating, defaultDisplayCombo, note, strumLine.characters, false, note.noteType, note.animSuffix.getDefault(note.strumID < strumLine.members.length ? strumLine.members[note.strumID].animSuffix : strumLine.animSuffix), "game/score/", "", note.strumID, 0, null, 0, daRating, false);
|
||||
event.deleteNote = !note.isSustainNote; // work around, to allow sustain notes to be deleted
|
||||
event = scripts.event(strumLine != null && !strumLine.cpu ? "onPlayerHit" : "onDadHit", event);
|
||||
strumLine.onHit.dispatch(event);
|
||||
scripts.event("onNoteHit", event);
|
||||
|
||||
@@ -1665,7 +1683,8 @@ class PlayState extends MusicBeatState
|
||||
if (event.showRating || (event.showRating == null && event.player))
|
||||
{
|
||||
displayCombo(event);
|
||||
displayRating(event.rating, event);
|
||||
if (event.displayRating)
|
||||
displayRating(event.rating, event);
|
||||
ratingNum += 1;
|
||||
}
|
||||
}
|
||||
@@ -1695,7 +1714,7 @@ class PlayState extends MusicBeatState
|
||||
}
|
||||
}
|
||||
|
||||
if (event.deleteNote && !note.isSustainNote) strumLine.deleteNote(note);
|
||||
if (event.deleteNote) strumLine.deleteNote(note);
|
||||
}
|
||||
|
||||
public function displayRating(myRating:String, ?evt:NoteHitEvent = null):Void {
|
||||
@@ -1723,13 +1742,11 @@ class PlayState extends MusicBeatState
|
||||
}
|
||||
|
||||
public function displayCombo(?evt:NoteHitEvent = null):Void {
|
||||
var pre:String = evt != null ? evt.ratingPrefix : "";
|
||||
var suf:String = evt != null ? evt.ratingSuffix : "";
|
||||
if (minDigitDisplay >= 0 && (combo == 0 || combo >= minDigitDisplay)) {
|
||||
var pre:String = evt != null ? evt.ratingPrefix : "";
|
||||
var suf:String = evt != null ? evt.ratingSuffix : "";
|
||||
|
||||
var separatedScore:String = Std.string(combo).addZeros(3);
|
||||
|
||||
if (combo == 0 || combo >= 10) {
|
||||
if (combo >= 10) {
|
||||
if (evt.displayCombo) {
|
||||
var comboSpr:FlxSprite = comboGroup.recycleLoop(FlxSprite).loadAnimatedGraphic(Paths.image('${pre}combo${suf}'));
|
||||
comboSpr.resetSprite(comboGroup.x, comboGroup.y);
|
||||
comboSpr.acceleration.y = 600;
|
||||
@@ -1751,6 +1768,7 @@ class PlayState extends MusicBeatState
|
||||
});
|
||||
}
|
||||
|
||||
var separatedScore:String = Std.string(combo).addZeros(3);
|
||||
for (i in 0...separatedScore.length)
|
||||
{
|
||||
var numScore:FlxSprite = comboGroup.recycleLoop(FlxSprite).loadAnimatedGraphic(Paths.image('${pre}num${separatedScore.charAt(i)}${suf}'));
|
||||
|
||||
@@ -5,6 +5,7 @@ import funkin.backend.scripting.events.StageNodeEvent;
|
||||
import flixel.math.FlxPoint;
|
||||
import flixel.FlxState;
|
||||
import haxe.xml.Access;
|
||||
import funkin.backend.utils.XMLUtil.XMLImportedScriptInfo;
|
||||
import funkin.backend.system.interfaces.IBeatReceiver;
|
||||
import funkin.backend.scripting.DummyScript;
|
||||
import funkin.backend.scripting.Script;
|
||||
@@ -30,6 +31,9 @@ class Stage extends FlxBasic implements IBeatReceiver {
|
||||
public function setStagesSprites(script:Script)
|
||||
for (k=>e in stageSprites) script.set(k, e);
|
||||
|
||||
public function prepareInfos(node:Access)
|
||||
return XMLImportedScriptInfo.prepareInfos(node, PlayState.instance.scripts, (infos) -> xmlImportedScripts.push(infos));
|
||||
|
||||
public function new(stage:String, ?state:FlxState) {
|
||||
super();
|
||||
|
||||
@@ -136,7 +140,7 @@ class Stage extends FlxBasic implements IBeatReceiver {
|
||||
PlayState.instance.add(PlayState.instance.comboGroup);
|
||||
PlayState.instance.comboGroup;
|
||||
case "use-extension" | "extension" | "ext":
|
||||
if (__shouldLoadBefore(node) || XMLImportedScriptInfo.prepareInfos(node, this) == null) continue;
|
||||
if (XMLImportedScriptInfo.shouldLoadBefore(node) || prepareInfos(node) == null) continue;
|
||||
null;
|
||||
default: null;
|
||||
}
|
||||
@@ -201,13 +205,10 @@ class Stage extends FlxBasic implements IBeatReceiver {
|
||||
|
||||
@:dox(hide) private function __pushNcheckNode(array:Array<Access>, node:Access) {
|
||||
array.push(node);
|
||||
if ((node.name == "use-extension" || node.name == "extension" || node.name == "ext") && __shouldLoadBefore(node))
|
||||
XMLImportedScriptInfo.prepareInfos(node, this);
|
||||
if ((node.name == "use-extension" || node.name == "extension" || node.name == "ext") && XMLImportedScriptInfo.shouldLoadBefore(node))
|
||||
prepareInfos(node);
|
||||
}
|
||||
|
||||
@:dox(hide) private static inline function __shouldLoadBefore(node:Access):Bool
|
||||
return node.getAtt("loadBefore") != "false";
|
||||
|
||||
public function addCharPos(name:String, node:Access, ?nonXMLInfo:StageCharPosInfo):StageCharPos {
|
||||
var charPos = new StageCharPos();
|
||||
charPos.visible = charPos.active = false;
|
||||
@@ -317,45 +318,4 @@ typedef StageCharPosInfo = {
|
||||
var y:Float;
|
||||
var flip:Bool;
|
||||
var scroll:Float;
|
||||
}
|
||||
|
||||
class XMLImportedScriptInfo {
|
||||
public var path:String;
|
||||
public var shortLived:Bool = false;
|
||||
public var loadBefore:Bool = true;
|
||||
public var importStageSprites:Bool = false;
|
||||
|
||||
public function new(path:String)
|
||||
this.path = path;
|
||||
|
||||
public function getScript():Script
|
||||
return PlayState.instance == null ? null : PlayState.instance.scripts.getByPath(path);
|
||||
|
||||
public static function prepareInfos(node:Access, ?stage:Stage):XMLImportedScriptInfo {
|
||||
if (!node.has.script || PlayState.instance == null) return null;
|
||||
|
||||
var folder = node.getAtt("folder").getDefault("data/scripts/");
|
||||
if (!folder.endsWith("/")) folder += "/";
|
||||
|
||||
var path = Paths.script(folder + node.getAtt("script"));
|
||||
var daScript = Script.create(path);
|
||||
if (daScript is DummyScript) {
|
||||
var msg = 'Script Extension at ${path} does not exist';
|
||||
if (stage != null) msg += ' through stage "${stage.stageName}"';
|
||||
Logs.trace(msg + ".", ERROR);
|
||||
return null;
|
||||
}
|
||||
|
||||
var infos = new XMLImportedScriptInfo(daScript.path);
|
||||
infos.shortLived = node.getAtt("isShortLived") == "true";
|
||||
infos.importStageSprites = node.getAtt("importStageSprites") == "true";
|
||||
@:privateAccess infos.loadBefore = Stage.__shouldLoadBefore(node);
|
||||
|
||||
if (stage != null) stage.xmlImportedScripts.push(infos);
|
||||
PlayState.instance.scripts.add(daScript);
|
||||
daScript.set("scriptInfo", infos);
|
||||
daScript.load();
|
||||
|
||||
return infos;
|
||||
}
|
||||
}
|
||||
@@ -74,7 +74,7 @@ class Strum extends FlxSprite {
|
||||
}
|
||||
|
||||
public override function draw() {
|
||||
lastDrawCameras = [for(c in cameras) c];
|
||||
lastDrawCameras = cameras.copy();
|
||||
super.draw();
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ package funkin.game.cutscenes;
|
||||
import funkin.backend.utils.FunkinParentDisabler;
|
||||
import funkin.backend.scripting.events.dialogue.*;
|
||||
import funkin.backend.scripting.events.CancellableEvent;
|
||||
import funkin.backend.scripting.events.DynamicEvent;
|
||||
import funkin.backend.scripting.events.dialogue.DialogueNextLineEvent;
|
||||
import funkin.backend.scripting.Script;
|
||||
import flixel.sound.FlxSound;
|
||||
import funkin.game.cutscenes.dialogue.*;
|
||||
@@ -89,7 +89,7 @@ class DialogueCutscene extends Cutscene {
|
||||
musicVolume: node.has.musicVolume ? (volume = Std.parseFloat(node.att.speed).getDefault(0.8)) : null,
|
||||
changeMusic: node.has.changeMusic ? FlxG.sound.load(Paths.music(node.att.changeMusic), volume, true) : null,
|
||||
playSound: node.has.playSound ? FlxG.sound.load(Paths.sound(node.att.playSound)) : null,
|
||||
nextSound: node.has.nextSound ? FlxG.sound.load(Paths.music(node.att.nextSound)) : null,
|
||||
nextSound: node.has.nextSound ? FlxG.sound.load(Paths.sound(node.att.nextSound)) : null,
|
||||
textSound: null
|
||||
};
|
||||
|
||||
@@ -138,8 +138,8 @@ class DialogueCutscene extends Cutscene {
|
||||
public var canProceed:Bool = true;
|
||||
|
||||
public function next(playFirst:Bool = false) {
|
||||
var event = EventManager.get(DynamicEvent).recycle(playFirst);
|
||||
dialogueScript.call("next", [playFirst]);
|
||||
var event = EventManager.get(DialogueNextLineEvent).recycle(playFirst);
|
||||
dialogueScript.call("next", [event]);
|
||||
if(event.cancelled || !canProceed) return;
|
||||
|
||||
if ((curLine = dialogueLines.shift()) == null) {
|
||||
@@ -154,7 +154,7 @@ class DialogueCutscene extends Cutscene {
|
||||
}
|
||||
|
||||
if (curLine.callback != null)
|
||||
dialogueScript.call(curLine.callback, [playFirst]);
|
||||
dialogueScript.call(curLine.callback, [event.playFirst]);
|
||||
|
||||
for (k=>c in charMap)
|
||||
if (k != curLine.char)
|
||||
@@ -167,8 +167,8 @@ class DialogueCutscene extends Cutscene {
|
||||
dialogueBox.popupChar(char, force);
|
||||
}
|
||||
|
||||
var finalSuffix:String = playFirst && dialogueBox.hasAnimation(curLine.bubble + "-firstOpen") ? "-firstOpen" : dialogueBox.hasAnimation(curLine.bubble + "-open") ? "-open" : "";
|
||||
dialogueBox.playBubbleAnim(curLine.bubble, finalSuffix, curLine.text, curLine.format, curLine.speed, curLine.nextSound, curLine.textSound != null ? [curLine.textSound] : null, finalSuffix == "-firstOpen" || finalSuffix == "-open", !playFirst);
|
||||
var finalSuffix:String = event.playFirst && dialogueBox.hasAnimation(curLine.bubble + "-firstOpen") ? "-firstOpen" : dialogueBox.hasAnimation(curLine.bubble + "-open") ? "-open" : "";
|
||||
dialogueBox.playBubbleAnim(curLine.bubble, finalSuffix, curLine.text, curLine.format, curLine.speed, curLine.nextSound, curLine.textSound != null ? [curLine.textSound] : null, finalSuffix == "-firstOpen" || finalSuffix == "-open", !event.playFirst);
|
||||
|
||||
if(curLine.playSound != null) curLine.playSound.play();
|
||||
if(curLine.changeMusic != null) {
|
||||
@@ -178,7 +178,7 @@ class DialogueCutscene extends Cutscene {
|
||||
curMusic.fadeIn(1, 0, curMusic.volume);
|
||||
} else if(curLine.musicVolume != null && curMusic != null) curMusic.volume = curLine.musicVolume;
|
||||
|
||||
dialogueScript.call("postNext", [playFirst]);
|
||||
dialogueScript.call("postNext", [event]);
|
||||
}
|
||||
|
||||
public override function close() {
|
||||
@@ -215,4 +215,4 @@ typedef DialogueLine = {
|
||||
var nextSound:FlxSound;
|
||||
var textSound:FlxSound;
|
||||
var changeDefAnim:String;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -162,7 +162,7 @@ class MainMenuState extends MusicBeatState
|
||||
|
||||
var event = event("onSelectItem", EventManager.get(NameEvent).recycle(daChoice));
|
||||
if (event.cancelled) return;
|
||||
switch (daChoice)
|
||||
switch (event.name)
|
||||
{
|
||||
case 'story mode': FlxG.switchState(new StoryMenuState());
|
||||
case 'freeplay': FlxG.switchState(new FreeplayState());
|
||||
|
||||
@@ -14,6 +14,7 @@ import funkin.options.keybinds.KeybindsOptions;
|
||||
import funkin.menus.StoryMenuState;
|
||||
import funkin.backend.system.Conductor;
|
||||
import funkin.backend.utils.FunkinParentDisabler;
|
||||
import funkin.options.TreeMenu;
|
||||
|
||||
class PauseSubState extends MusicBeatSubstate
|
||||
{
|
||||
@@ -153,6 +154,7 @@ class PauseSubState extends MusicBeatSubstate
|
||||
persistentDraw = false;
|
||||
openSubState(new KeybindsOptions());
|
||||
case "Change Options":
|
||||
TreeMenu.lastState = PlayState;
|
||||
FlxG.switchState(new OptionsMenu());
|
||||
case "Exit to charter":
|
||||
FlxG.switchState(new funkin.editors.charter.Charter(PlayState.SONG.meta.name, PlayState.difficulty, false));
|
||||
@@ -205,4 +207,4 @@ class PauseSubState extends MusicBeatSubstate
|
||||
item.alpha = 0.6;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -114,6 +114,12 @@ class StoryMenuState extends MusicBeatState {
|
||||
}
|
||||
}
|
||||
|
||||
// default difficulty should be the middle difficulty in the array
|
||||
// to be consistent with base game and whatnot, you know the drill
|
||||
curDifficulty = Math.floor(weeks[0].difficulties.length * 0.5);
|
||||
// debug stuff lol
|
||||
Logs.trace('Middle Difficulty for Week 1 is ${weeks[0].difficulties[curDifficulty]} (ID: $curDifficulty)');
|
||||
|
||||
changeWeek(0, true);
|
||||
|
||||
DiscordUtil.call("onMenuLoaded", ["Story Menu"]);
|
||||
@@ -163,6 +169,7 @@ class StoryMenuState extends MusicBeatState {
|
||||
if (!force) CoolUtil.playMenuSFX();
|
||||
for(k=>e in weekSprites.members) {
|
||||
e.targetY = k - curWeek;
|
||||
e.alpha = k == curWeek ? 1.0 : 0.6;
|
||||
}
|
||||
tracklist.text = 'TRACKS\n\n${[for(e in weeks[curWeek].songs) if (!e.hide) e.name.toUpperCase()].join('\n')}';
|
||||
weekTitle.text = weeks[curWeek].name.getDefault("");
|
||||
@@ -333,13 +340,13 @@ class StoryMenuState extends MusicBeatState {
|
||||
if (char.animation.exists("confirm"))
|
||||
char.animation.play("confirm");
|
||||
|
||||
PlayState.loadWeek(weeks[curWeek], weeks[curWeek].difficulties[curDifficulty]);
|
||||
PlayState.loadWeek(event.week, event.difficulty);
|
||||
|
||||
new FlxTimer().start(1, function(tmr:FlxTimer)
|
||||
{
|
||||
FlxG.switchState(new PlayState());
|
||||
});
|
||||
weekSprites.members[curWeek].startFlashing();
|
||||
weekSprites.members[event.weekID].startFlashing();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -304,7 +304,10 @@ class System
|
||||
#elseif mac
|
||||
Sys.command("/usr/bin/open", [path]);
|
||||
#elseif linux
|
||||
Sys.command("/usr/bin/xdg-open", [path, "&"]);
|
||||
// generally `xdg-open` should work in every distro
|
||||
var cmd = Sys.command("xdg-open", [path, "&"]);
|
||||
// run old command JUST IN CASE it fails, which it shouldn't
|
||||
if (cmd != 0) cmd = Sys.command("/usr/bin/xdg-open", [path, "&"]);
|
||||
#elseif (js && html5)
|
||||
Browser.window.open(path, "_blank");
|
||||
#elseif flash
|
||||
|
||||
@@ -0,0 +1,89 @@
|
||||
package openfl.display;
|
||||
|
||||
import openfl.utils.ByteArray;
|
||||
|
||||
#if !openfl_debug
|
||||
@:fileXml('tags="haxe,release"')
|
||||
@:noDebug
|
||||
#end
|
||||
class GraphicsShader extends Shader
|
||||
{
|
||||
@:glVertexHeader("attribute float openfl_Alpha;
|
||||
attribute vec4 openfl_ColorMultiplier;
|
||||
attribute vec4 openfl_ColorOffset;
|
||||
attribute vec4 openfl_Position;
|
||||
attribute vec2 openfl_TextureCoord;
|
||||
|
||||
varying float openfl_Alphav;
|
||||
varying vec4 openfl_ColorMultiplierv;
|
||||
varying vec4 openfl_ColorOffsetv;
|
||||
varying vec2 openfl_TextureCoordv;
|
||||
|
||||
uniform mat4 openfl_Matrix;
|
||||
uniform bool openfl_HasColorTransform;
|
||||
uniform vec2 openfl_TextureSize;")
|
||||
@:glVertexBody("openfl_Alphav = openfl_Alpha;
|
||||
openfl_TextureCoordv = openfl_TextureCoord;
|
||||
|
||||
if (openfl_HasColorTransform) {
|
||||
openfl_ColorMultiplierv = openfl_ColorMultiplier;
|
||||
openfl_ColorOffsetv = openfl_ColorOffset / 255.0;
|
||||
}
|
||||
|
||||
gl_Position = openfl_Matrix * openfl_Position;")
|
||||
@:glVertexSource("#pragma header
|
||||
|
||||
void main(void) {
|
||||
#pragma body
|
||||
}")
|
||||
@:glFragmentHeader("varying float openfl_Alphav;
|
||||
varying vec4 openfl_ColorMultiplierv;
|
||||
varying vec4 openfl_ColorOffsetv;
|
||||
varying vec2 openfl_TextureCoordv;
|
||||
|
||||
uniform bool openfl_HasColorTransform;
|
||||
uniform vec2 openfl_TextureSize;
|
||||
uniform sampler2D bitmap;")
|
||||
@:glFragmentBody("vec4 color = texture2D (bitmap, openfl_TextureCoordv);
|
||||
|
||||
if (color.a == 0.0) {
|
||||
gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
|
||||
} else if (openfl_HasColorTransform) {
|
||||
color = vec4(color.rgb / color.a, color.a);
|
||||
|
||||
mat4 colorMultiplier = mat4(0);
|
||||
colorMultiplier[0][0] = openfl_ColorMultiplierv.x;
|
||||
colorMultiplier[1][1] = openfl_ColorMultiplierv.y;
|
||||
colorMultiplier[2][2] = openfl_ColorMultiplierv.z;
|
||||
colorMultiplier[3][3] = 1.0; // openfl_ColorMultiplierv.w;
|
||||
|
||||
color = clamp(openfl_ColorOffsetv + (color * colorMultiplier), 0.0, 1.0);
|
||||
|
||||
if (color.a > 0.0) {
|
||||
gl_FragColor = vec4(color.rgb * color.a * openfl_Alphav, color.a * openfl_Alphav);
|
||||
} else {
|
||||
gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
|
||||
}
|
||||
} else {
|
||||
gl_FragColor = color * openfl_Alphav;
|
||||
}")
|
||||
#if emscripten
|
||||
@:glFragmentSource("#pragma header
|
||||
|
||||
void main(void) {
|
||||
#pragma body
|
||||
|
||||
gl_FragColor = gl_FragColor.bgra;
|
||||
}")
|
||||
#else
|
||||
@:glFragmentSource("#pragma header
|
||||
|
||||
void main(void) {
|
||||
#pragma body
|
||||
}")
|
||||
#end
|
||||
public function new(code:ByteArray = null)
|
||||
{
|
||||
super(code);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user