bye april fools😭
man that was buggy af
@@ -1,5 +1,4 @@
|
||||
story mode
|
||||
visual novel
|
||||
freeplay
|
||||
options
|
||||
donate
|
||||
|
Before Width: | Height: | Size: 109 KiB |
@@ -1,17 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<TextureAtlas imagePath="visual novel.png">
|
||||
<!-- Created with Adobe Animate version 21.0.1.37179 -->
|
||||
<!-- http://www.adobe.com/products/animate.html -->
|
||||
<SubTexture name="visual novel basic0000" x="0" y="0" width="738" height="140"/>
|
||||
<SubTexture name="visual novel basic0001" x="0" y="0" width="738" height="140"/>
|
||||
<SubTexture name="visual novel basic0002" x="0" y="0" width="738" height="140"/>
|
||||
<SubTexture name="visual novel basic0003" x="738" y="0" width="738" height="140"/>
|
||||
<SubTexture name="visual novel basic0004" x="738" y="0" width="738" height="140"/>
|
||||
<SubTexture name="visual novel basic0005" x="738" y="0" width="738" height="140"/>
|
||||
<SubTexture name="visual novel basic0006" x="0" y="140" width="738" height="140"/>
|
||||
<SubTexture name="visual novel basic0007" x="0" y="140" width="738" height="140"/>
|
||||
<SubTexture name="visual novel basic0008" x="0" y="140" width="738" height="140"/>
|
||||
<SubTexture name="visual novel white0000" x="738" y="140" width="791" height="198" frameX="0" frameY="-7" frameWidth="795" frameHeight="211"/>
|
||||
<SubTexture name="visual novel white0001" x="0" y="338" width="780" height="211" frameX="-5" frameY="0" frameWidth="795" frameHeight="211"/>
|
||||
<SubTexture name="visual novel white0002" x="780" y="338" width="793" height="196" frameX="-2" frameY="-11" frameWidth="795" frameHeight="211"/>
|
||||
</TextureAtlas>
|
||||
|
Before Width: | Height: | Size: 1.7 MiB After Width: | Height: | Size: 845 KiB |
@@ -1,60 +1,61 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
Created with Funkin Packer v0.1.3 https://neeeoo.github.io/funkin-packer/
|
||||
Created with Funkin Packer v0.0.4 https://neeeoo.github.io/funkin-packer/ and edited by Nex_isDumb
|
||||
-->
|
||||
<TextureAtlas imagePath="titleEnter.png" width="1139" height="3815">
|
||||
<SubTexture name="ENTER PRESSED0000" x="1" y="3655" width="1137" height="79" frameX="-160" frameY="-0" frameWidth="1477" frameHeight="79"/>
|
||||
<SubTexture name="ENTER PRESSED0001" x="1" y="3735" width="1137" height="79" frameX="-160" frameY="-0" frameWidth="1477" frameHeight="79"/>
|
||||
<SubTexture name="ENTER PRESSED0002" x="1" y="3655" width="1137" height="79" frameX="-160" frameY="-0" frameWidth="1477" frameHeight="79"/>
|
||||
<SubTexture name="ENTER PRESSED0003" x="1" y="3735" width="1137" height="79" frameX="-160" frameY="-0" frameWidth="1477" frameHeight="79"/>
|
||||
<SubTexture name="ENTER PRESSED0004" x="1" y="3655" width="1137" height="79" frameX="-160" frameY="-0" frameWidth="1477" frameHeight="79"/>
|
||||
<SubTexture name="ENTER PRESSED0005" x="1" y="3735" width="1137" height="79" frameX="-160" frameY="-0" frameWidth="1477" frameHeight="79"/>
|
||||
<SubTexture name="ENTER PRESSED0006" x="1" y="3735" width="1137" height="79" frameX="-160" frameY="-0" frameWidth="1477" frameHeight="79"/>
|
||||
<SubTexture name="ENTER PRESSED0007" x="1" y="3655" width="1137" height="79" frameX="-160" frameY="-0" frameWidth="1477" frameHeight="79"/>
|
||||
<SubTexture name="ENTER PRESSED0008" x="1" y="3735" width="1137" height="79" frameX="-160" frameY="-0" frameWidth="1477" frameHeight="79"/>
|
||||
<SubTexture name="Press Enter to Begin0000" x="1" y="1" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0001" x="1" y="88" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0002" x="1" y="175" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0003" x="1" y="262" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0004" x="1" y="349" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0005" x="1" y="436" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0006" x="1" y="523" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0007" x="1" y="610" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0008" x="1" y="697" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0009" x="1" y="784" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0010" x="1" y="871" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0011" x="1" y="958" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0012" x="1" y="1045" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0013" x="1" y="1132" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0014" x="1" y="1219" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0015" x="1" y="1306" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0016" x="1" y="1393" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0017" x="1" y="1480" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0018" x="1" y="1567" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0019" x="1" y="1654" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0020" x="1" y="1741" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0021" x="1" y="1828" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0022" x="1" y="1915" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0023" x="1" y="1915" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0024" x="1" y="2002" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0025" x="1" y="1741" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0026" x="1" y="2089" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0027" x="1" y="2176" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0028" x="1" y="2263" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0029" x="1" y="2350" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0030" x="1" y="2437" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0031" x="1" y="2524" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0032" x="1" y="2611" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0033" x="1" y="2698" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0034" x="1" y="2785" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0035" x="1" y="2872" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0036" x="1" y="2959" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0037" x="1" y="3046" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0038" x="1" y="3133" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0039" x="1" y="3220" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0040" x="1" y="3307" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0041" x="1" y="3394" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0042" x="1" y="3481" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0043" x="1" y="3568" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<SubTexture name="Press Enter to Begin0044" x="1" y="1" width="1137" height="86" frameX="-168" frameY="-3" frameWidth="1495" frameHeight="96"/>
|
||||
<TextureAtlas imagePath="titleEnter.png" width="1012" height="2300">
|
||||
<SubTexture name="ENTER PRESSED0000" x="3" y="3" width="1006" height="86" frameX="-25" frameY="-6" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="ENTER PRESSED0001" x="3" y="95" width="1006" height="86" frameX="-25" frameY="-6" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="ENTER PRESSED0002" x="3" y="3" width="1006" height="86" frameX="-25" frameY="-6" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="ENTER PRESSED0003" x="3" y="95" width="1006" height="86" frameX="-25" frameY="-6" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="ENTER PRESSED0004" x="3" y="3" width="1006" height="86" frameX="-25" frameY="-6" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="ENTER PRESSED0005" x="3" y="95" width="1006" height="86" frameX="-25" frameY="-6" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="ENTER PRESSED0006" x="3" y="95" width="1006" height="86" frameX="-25" frameY="-6" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="ENTER PRESSED0007" x="3" y="3" width="1006" height="86" frameX="-25" frameY="-6" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="ENTER PRESSED0008" x="3" y="95" width="1006" height="86" frameX="-25" frameY="-6" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0000" x="3" y="187" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0001" x="3" y="279" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0002" x="3" y="371" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0003" x="3" y="463" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0004" x="3" y="555" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0005" x="3" y="647" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0006" x="3" y="739" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0007" x="3" y="831" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0008" x="3" y="923" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0009" x="3" y="1015" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0010" x="3" y="1107" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0011" x="3" y="1199" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0012" x="3" y="1291" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0013" x="3" y="1383" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0014" x="3" y="1475" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0015" x="3" y="1567" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0016" x="3" y="1659" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0017" x="3" y="1751" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0018" x="3" y="1843" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0019" x="3" y="1935" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0020" x="3" y="2027" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0021" x="3" y="2119" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0022" x="3" y="2211" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0045" x="3" y="187" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0044" x="3" y="279" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0043" x="3" y="371" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0042" x="3" y="463" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0041" x="3" y="555" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0040" x="3" y="647" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0039" x="3" y="739" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0038" x="3" y="831" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0037" x="3" y="923" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0036" x="3" y="1015" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0035" x="3" y="1107" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0034" x="3" y="1199" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0033" x="3" y="1291" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0032" x="3" y="1383" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0031" x="3" y="1475" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0030" x="3" y="1567" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0029" x="3" y="1659" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0028" x="3" y="1751" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0027" x="3" y="1843" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0026" x="3" y="1935" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0025" x="3" y="2027" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0024" x="3" y="2119" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
<SubTexture name="Press Enter to Begin0023" x="3" y="2211" width="1006" height="86" frameX="-25" frameY="-7" frameWidth="1075" frameHeight="100"/>
|
||||
</TextureAtlas>
|
||||
|
Before Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 5.1 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 28 KiB |
@@ -1,556 +0,0 @@
|
||||
<vn>
|
||||
<!-- Characters -->
|
||||
|
||||
<character id="pessy">
|
||||
<name>Pessy</name>
|
||||
<image>pessy</image>
|
||||
<scale>1</scale>
|
||||
<color>653BA9</color>
|
||||
<side>left</side>
|
||||
</character>
|
||||
|
||||
<character id="cody">
|
||||
<name>Cody</name>
|
||||
<image>cody</image>
|
||||
<scale>1</scale>
|
||||
<color>A36BCC</color>
|
||||
<side>right</side>
|
||||
</character>
|
||||
|
||||
<character id="gaysex">
|
||||
<name>Pessy & Cody</name>
|
||||
<image>kiss</image>
|
||||
<scale>1</scale>
|
||||
<color>7c4cb6</color>
|
||||
<side>center</side>
|
||||
<offset>0,50</offset>
|
||||
</character>
|
||||
|
||||
<!-- Dialogue -->
|
||||
<entry id="start" bg="school">
|
||||
The day starts of as usual, with Cody and Pessy meeting each other whilst on the way to school
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
Hey Cody! How are you doing?
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
Hey Pessy, I'm doing well!
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
Did you sleep well Cody?
|
||||
<choice id="sleepyes">Yes i did</choice>
|
||||
<choice id="sleepno">No i didn't</choice>
|
||||
</entry>
|
||||
|
||||
<entry id="sleepyes" character="cody" bg="school">
|
||||
I slept well, I dreamt about all the possibilities of what Friday Night Funkin' could include in their next update!
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
I imagine what the lemon demon songs for the erect difficulty would sound like!
|
||||
</entry>
|
||||
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
Oh yeah!! I bet it's gonna sound really creepy but also good!
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school" next="talk-current-mods">
|
||||
I bet. The voice actor for him is really good at it!
|
||||
</entry>
|
||||
|
||||
<entry id="sleepno" character="cody" bg="school">
|
||||
I had a horrible nightmare, I dreamt of Friday Night Funkin' getting canceled.
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
It was due to the developers being exposed of spending all the kickstarter money on crack. A team member who is against this posted a google doc of the situation on twitter.
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
Oh man that must have been a really bad nightmare. At least they are now showing teasers online like that erect sampler they showed the other day!
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school" next="talk-current-mods">
|
||||
Yeah, I'm really glad that they are now finally doing that after almost 3 years of nothing. The FNF mods were really making this community alive.
|
||||
</entry>
|
||||
|
||||
|
||||
talk about current mods, where each engine talking about each others engines mods and how cool they are
|
||||
|
||||
<entry id="talk-current-mods" character="cody" bg="school">
|
||||
Have you heard about the mod…
|
||||
|
||||
<choice id="talkimpostor">Talk about: Impostor V4</choice>
|
||||
<choice id="talkhotline">Talk about: Hotline 024</choice>
|
||||
<choice id="talkmario">Talk about: Mario's Madness</choice>
|
||||
<choice id="talk17">Talk about: 17 Bucks</choice>
|
||||
</entry>
|
||||
|
||||
<entry id="talkimpostor" character="cody" bg="school">
|
||||
Vs Impostor?
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
Yea i heard about that! I find it very sus! Ha.
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
But actually it's a really good mod. I like how Maroon's parasite form looks! It really fits for his song.
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
Yeah me too!! My favorite part from Vs Impostor is Finale. That song is so good I love it to death!!!
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
I don't blame you! That's the best song from the mod tbh.
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
Have you heard about Sunday's Desolation?
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
Oh yeah I did! That's such a good mod. It's really high quality for a fanmade mod about Wednesday's Infidelity!
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
Yeah, it even has one of your developers for your engine on the team. That's really awesome!!
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school" next="fnfstuff">
|
||||
I think that's really cool actually. I like that this mod is all about Oswald from the original mod. Really cool that the team is making a whole mod about him!
|
||||
</entry>
|
||||
|
||||
—-
|
||||
|
||||
<entry id="talkhotline" character="cody" bg="school">
|
||||
Hotline 024?
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
Yea i heard about that! I really like Nikku's character design, and how she can mimic other voices!
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
Yeah!! There's even a whole tricky-themed song in the mod, and even Nikku is mimicking Tricky's voice at certain parts!!
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
Kinda sucks that the original tricky mod was made on Kade Engine, Kevin is just really too much of a hardcoding guy and he is really unoptimized. I don't like talking to him that much.
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
I do see him hanging out with the other engines. But lately his popularity has kinda stopped.
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
Yeah… I do admit he's the reason why people started modding FNF though, he's the one that started FNF modding!
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
I agree… He actually makes me feel nostalgic of the early era of FNF modding…
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
Have you seen Cyber Sensation recently?
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
I did actually! Unfortunate that it got canceled though…
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school" next="fnfstuff">
|
||||
Yeah… the creator had to leave the community. Got exhausted from the game.
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
I don't blame her. FNF does get really tiring after a good while.
|
||||
</entry>
|
||||
|
||||
—---
|
||||
|
||||
<entry id="talkmario" character="cody" bg="school">
|
||||
Mario's Madness?
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
Yeah! That's one of the trending mods right now! I like how All-Stars play out. It's such a sad but awesome ending!
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
I agree!! Some people are mad about it, but to be honest BF wins too much. He had to lose at some point.
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
True. Sometimes all good things must come to an end.
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
heyy mmv2 reference!! That's from the dialogue when mario sees bf again before All-Stars happens lol!!
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
omg LMAO cody you're so funny!!!
|
||||
</entry>
|
||||
|
||||
<entry bg="school">
|
||||
They laughed for a solid 5 minutes.
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
haha….. Anyways, did you hear about Gorefield getting a big update?
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
Yeah I did!! V2 is such a huge improvement from V1 it's insane.
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
Yeah!! I like how Cataclysm goes… It's pretty similar to All-Stars
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
It's a really awesome song to be honest!! Such an awesome ending to the mod. I like that there are flashbacks of the previous songs played and that they are being controlled by Godfield.
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
Again, it's like how All-Stars play out! Like how Ultra M is controlling the past enemies the player faced against at Act 4.
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school" next="fnfstuff">
|
||||
I really like that mods do that.
|
||||
</entry>
|
||||
|
||||
—---
|
||||
|
||||
|
||||
<entry id="talk17" character="cody" bg="school">
|
||||
17 Bucks?
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
Yeah I have! The charm of it is actually so amazing.
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
I agree, my favorite song from the mod is Kevinteenbucks.
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
Cool! Mine is Fitin'. The song loops forever but to be honest that's really funny to me!
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
I think that's funny too! That's actually my first time seeing a mod do that when I first played it.
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
Yeah, it's pretty awesome! Pretty cool how people in this community can code such cool things.
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
Have you heard about YTP Invasion?
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
Yeah!! It's not out yet, but it's going to really soon!
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
Yup.. I think it's gonna drop this month actually!
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
Whaaat, really??
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
Yes, they announced that sometime ago on their twitter account! They released a trailer about it and everyone got super hyped about it!!
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
Woahhh… cool!! What is it all about?
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
Well basically, it's a mod about iconic Youtube Poop (YTP for short) characters rap battling against boyfriend.
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school" next="fnfstuff">
|
||||
Sounds cool! I think that's gonna be a really awesome mod everyone will love.
|
||||
</entry>
|
||||
|
||||
—---
|
||||
|
||||
|
||||
talk about some stuff that's been happening with the base game
|
||||
|
||||
<entry id="fnfstuff" character="cody" bg="school">
|
||||
Did you see that new FNF blog that recently got released? It shows the new chart editor that's with the base game!
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
I saw!!! It looked really cool. I saw it looked inspired by your editor.
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
I know! It feels inspired by yours too!
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
Yeah! I rembeber adding waveforms way back! Also they added your note selection and dragging!
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
That just makes me really happy. Even though I'm not that much of a popular engine, the FNF developers still might have taken some inpriation from me. Which is awesome considering they defenitely took some from you!
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
That shows they take advice from FNF modders and FNF engine developers! They care about the community.
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
That may be true because they also updated their erect songs after dropping the erect sampler!
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
They did? Wow! That's actually really awesome. What songs did they change?
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
So far we only know Fresh and Pico. They dropped the updated versions on their Tiktok account.
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
Oh cool! I didn't really like how BF sounded in Pico. His vocals were kinda just all over the place.
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
Yeah they actually changed that! His vocals became less intense and are actually more calm now.
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school" next="personaltalk">
|
||||
That's awesome. I really can't wait for the update!
|
||||
</entry>
|
||||
|
||||
—-
|
||||
|
||||
small personal talk
|
||||
|
||||
<entry id="personaltalk" bg="school">
|
||||
The both of them start thinking about their personal things. Both of them think they should share it to the other.
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
I recently transitioned from alpha to beta state the other day.
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
Oh really? That's great news! Good job on making progress on your engine!
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
Thank you! I'm actually excited to release this engine at some point.
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
I also heard that you started working on the final version of psych. That's pretty cool!
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
I heard it's gonna have a stage editor! I'm really excited to see that!
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
Yea and I'm also working on adding Language support, and a new chart editor.
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
Oh awesome!! That's cool that you're finishing your engine. I can't wait for it to drop!
|
||||
</entry>
|
||||
|
||||
<entry bg="school" next="crush">
|
||||
They both went silent for a moment.
|
||||
</entry>
|
||||
|
||||
—--
|
||||
|
||||
talking about crushes
|
||||
|
||||
<entry id="crush" character="pessy" bg="school">
|
||||
I have a crush on this engine where you can softcode literally anything…
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
R…really? Who is this engine you're talking about…?
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
…Y-...you…
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
…W-what? Oh my god… I think I'm blushing…!!
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
…yeah…
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
…well…
|
||||
|
||||
<option id="crushaccepted">Tell Pessy your feelings for her</option>
|
||||
<option id="friendzone">I don't feel the same way</option>
|
||||
</entry>
|
||||
|
||||
<entry id="crushaccepted" character="cody" bg="school">
|
||||
I have a crush on an engine that is user-friendly and has lua scripting…
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
…Cody…
|
||||
</entry>
|
||||
|
||||
<entry bg="school">
|
||||
Pessy leans to Cody for a kiss.
|
||||
|
||||
<choice id="kiss">Kiss Pessy</choice>
|
||||
<choice id="no-kiss">Reject the kiss</choice>
|
||||
</entry>
|
||||
|
||||
<entry id="kiss" bg="school">
|
||||
Cody leans to Pessy to kiss her.
|
||||
</entry>
|
||||
|
||||
<entry character="gaysex" bg="school">
|
||||
*muwha* *sloppy kisses*
|
||||
</entry>
|
||||
|
||||
<entry character="gaysex" bg="school">
|
||||
*drools* *muwah muah*
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
…that… was something.
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
Cody… I love you.
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
…I… love you too…
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
…
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school" next="ending">
|
||||
…
|
||||
</entry>
|
||||
|
||||
<entry bg="school" next="ending">
|
||||
Pessy looks at her clock. It seems they are running late for class!
|
||||
</entry>
|
||||
|
||||
|
||||
<entry id="no-kiss" bg="school">
|
||||
Cody backs up.
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
Hey wait… I don't really wanna start this relationship yet.
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
Oh… well that's alright. Do you wanna have a date sometime later then?
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school" next="ending">
|
||||
Sure. I think we gotta develop our feelings for each other first before we take it to the next level.
|
||||
</entry>
|
||||
|
||||
<entry bg="school" next="ending">
|
||||
Pessy looks at her clock. It seems they are running late for class!
|
||||
</entry>
|
||||
|
||||
|
||||
<entry id="friendzone" character="cody" bg="school">
|
||||
…Pessy… I really don't want to hurt your feelings, but I don't feel the same way for you…
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
Oh… well… I'm sorry for being weird there…
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
It's ok Pessy… I think it's best if we just stay as friends.
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
Alrighty… I'm ok with that.
|
||||
</entry>
|
||||
|
||||
<entry bg="school" next="ending">
|
||||
Pessy looks at her clock. It seems they are running late for class!
|
||||
</entry>
|
||||
|
||||
—
|
||||
|
||||
ending
|
||||
|
||||
<entry id="ending" character="pessy" bg="school">
|
||||
We should probably get to class now!
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
It was really fun talking to you.
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
Same here.
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school">
|
||||
Well I will see you sometime later, ok?
|
||||
</entry>
|
||||
|
||||
<entry character="pessy" bg="school">
|
||||
Alrighty… Bye Cody!!
|
||||
</entry>
|
||||
|
||||
<entry character="cody" bg="school" next="credits">
|
||||
Bye Pessy!
|
||||
</entry>
|
||||
|
||||
Credits:
|
||||
|
||||
<entry id="credits" bg="school">
|
||||
Credits:
|
||||
Coding: Ne_Eo
|
||||
Music & Sfx: Bromaster819
|
||||
Writing: Syrup, Bromaster819, Ne_Eo, SlightlyCreative, swordcube
|
||||
Art: Mkv8
|
||||
</entry>
|
||||
|
||||
<entry bg="school">
|
||||
Time spent writing this novel: 3h 19m
|
||||
Time since idea: 3h 57m
|
||||
</entry>
|
||||
|
||||
<entry bg="school">
|
||||
Replay?
|
||||
|
||||
<choice id="start">Yes</choice>
|
||||
<choice id="exit">Exit</choice>
|
||||
</entry>
|
||||
|
||||
|
||||
</vn>
|
||||
@@ -2,11 +2,6 @@
|
||||
|
||||
// Used in charter by waveforms
|
||||
|
||||
#define HEIGHT 0.05 // Height of the Bar
|
||||
#define BACKLIGHT 0.6 // Backlight
|
||||
#define BRIGHTNESS 0.33 // overall Brightness
|
||||
#define GLOW 1.25 // Glow intensity of the Bar
|
||||
|
||||
const vec3 gradient1 = vec3(114.0/255.0, 81.0/255.0, 135.0/255.0);
|
||||
const vec3 gradient2 = vec3(144.0/255.0, 80.0/255.0, 186.0/255.0);
|
||||
|
||||
@@ -23,8 +18,6 @@ uniform ivec2 waveformSize;
|
||||
|
||||
uniform bool lowDetail;
|
||||
|
||||
uniform float time;
|
||||
|
||||
float getAmplitude(vec2 pixel) {
|
||||
float pixelID = floor((pixel.y+pixelOffset)/3.0);
|
||||
|
||||
@@ -59,7 +52,26 @@ void outlineWaveform(vec2 pixel, vec2 offset) {
|
||||
float ampwidth = (1.0-amplitude) * textureRes.x;
|
||||
|
||||
if (!inWaveForm(pixel, ampwidth))
|
||||
gl_FragColor = vec4(vec3(0.), 1.);
|
||||
gl_FragColor -= outlinecolor*mix(0.5, 0.8, amplitude);
|
||||
}
|
||||
|
||||
void highDetailWaveform(vec2 pixel, float amplitude, float ampwidth) {
|
||||
vec3 gradientColor = mix(gradient1, gradient2, openfl_TextureCoordv.x);
|
||||
gradientColor *= pixel.y+pixelOffset>playerPosition ? 0.7 : 1.0;
|
||||
gradientColor = mix(gradientColor, gradientColor * vec3(1.8), map(getHightlight(amplitude), 0.0, 1.0, 0.5, 1.0));
|
||||
|
||||
float ampwidthHighlight = getAmpWidth(amplitude/3.0);
|
||||
if (inWaveForm(pixel, ampwidthHighlight))
|
||||
gradientColor = mix(gradientColor, gradientColor * vec3(1.8), map(getHightlight(ampwidthHighlight), 0.0, 1.0, 0.5, 1.0));
|
||||
|
||||
gl_FragColor = vec4(vec3(gradientColor * mix(0.5, 0.8, amplitude))*openfl_Alphav, openfl_Alphav);
|
||||
|
||||
outlineWaveform(pixel, vec2(0.0, -1.0));
|
||||
outlineWaveform(pixel, vec2(0.0, 1.0));
|
||||
}
|
||||
|
||||
void lowDetailWaveform(vec2 pixel, float amplitude, float ampwidth) {
|
||||
gl_FragColor = vec4(lowdetailcol * (pixel.y+pixelOffset>playerPosition ? 0.7 : 1.0), 1.0);
|
||||
}
|
||||
|
||||
void main()
|
||||
@@ -68,21 +80,9 @@ void main()
|
||||
float amplitude = getAmplitude(pixel);
|
||||
float ampwidth = getAmpWidth(amplitude);
|
||||
|
||||
gl_FragColor = vec4(vec3(0.0), .1);
|
||||
gl_FragColor = vec4(0.0);
|
||||
if (!inWaveForm(pixel, ampwidth)) return;
|
||||
|
||||
vec2 uv = openfl_TextureCoordv.xy - 0.5;
|
||||
|
||||
float c = BACKLIGHT;
|
||||
float a = abs(uv.x);
|
||||
float s = 1.0 - smoothstep(0.0, ampwidth/textureRes.x, a);
|
||||
c *= 1.33 - smoothstep(0.0, 0.5, a);
|
||||
c*=c*c;
|
||||
c += s*.5;
|
||||
|
||||
if (inWaveForm(pixel, ampwidth))
|
||||
c += s;
|
||||
|
||||
gl_FragColor = vec4((cos(6.283 * (uv.y + time + vec3(0.0,.33,0.66)))*map(getHightlight(amplitude), 0.0, 1.0, 0.5, 1.0)) + GLOW, 1.0) * c * BRIGHTNESS;
|
||||
gl_FragColor.xyz *= map(getHightlight(amplitude), 0.0, 1.0, 0.5, 1.0);
|
||||
gl_FragColor.xyz *= pixel.y+pixelOffset>playerPosition ? 0.6 : 1.0;
|
||||
if (lowDetail) lowDetailWaveform(pixel, amplitude, ampwidth);
|
||||
else highDetailWaveform(pixel, amplitude, ampwidth);
|
||||
}
|
||||
@@ -1,413 +0,0 @@
|
||||
package flixel.text;
|
||||
|
||||
import flixel.math.FlxRandom;
|
||||
import haxe.Int64;
|
||||
|
||||
using StringTools;
|
||||
|
||||
class Uwuifier {
|
||||
public static var faces = [
|
||||
";;w;;",
|
||||
"OwO",
|
||||
"UwU",
|
||||
">w<",
|
||||
"^w^",
|
||||
"^-^",
|
||||
":3",
|
||||
"x3",
|
||||
":3c",
|
||||
];
|
||||
public static var exclamations = ["!?", "?!!", "?!?1", "!!11", "?!?!"];
|
||||
public static var actions = [
|
||||
"*blushes*",
|
||||
"*whispers to self*",
|
||||
"*cries*",
|
||||
"*screams*",
|
||||
"*sweats*",
|
||||
"*runs away*",
|
||||
"*screeches*",
|
||||
"*walks away*",
|
||||
"*looks at you*",
|
||||
"*huggles tightly*",
|
||||
"*boops your nose*",
|
||||
];
|
||||
public static var uwuMap:Array<Dynamic> = [
|
||||
[~/(?:r|l)/g, "w"],
|
||||
[~/(?:R|L)/g, "W"],
|
||||
[~/n([aeiou])/g, "ny$1"],
|
||||
[~/N([aeiou])/g, "Ny$1"],
|
||||
[~/N([AEIOU])/g, "NY$1"],
|
||||
[~/ove/g, "uv"],
|
||||
];
|
||||
|
||||
private static var _spacesModifier = { faces: 0.05, actions: 0.075, stutters: 0.1 };
|
||||
private static var _wordsModifier:Float = 1;
|
||||
private static var _exclamationsModifier:Float = 1;
|
||||
|
||||
public static function uwuifyWords(sentence: String): String {
|
||||
var words = sentence.split(" ");
|
||||
|
||||
var uwuifiedSentence = words.map((word) -> {
|
||||
//if (isAt(word)) return word;
|
||||
if (word == "@") return word;
|
||||
//if (isUri(word)) return word;
|
||||
|
||||
var seed = new Seed(word);
|
||||
|
||||
for (aa in uwuMap) {
|
||||
var oldWord = aa[0];
|
||||
var newWord = aa[1];
|
||||
|
||||
// Generate a random value for every map so words will be partly uwuified instead of not at all
|
||||
if (seed.random() > _wordsModifier) continue;
|
||||
|
||||
//trace(oldWord, newWord, word);
|
||||
word = oldWord.replace(word, newWord);
|
||||
//trace(oldWord, newWord, word);
|
||||
}
|
||||
|
||||
return word;
|
||||
}).join(" ");
|
||||
|
||||
return uwuifiedSentence;
|
||||
}
|
||||
|
||||
public static function uwuifySpaces(sentence: String): String {
|
||||
var words = sentence.split(" ");
|
||||
|
||||
var faceThreshold = _spacesModifier.faces;
|
||||
var actionThreshold = _spacesModifier.actions + faceThreshold;
|
||||
var stutterThreshold = _spacesModifier.stutters + actionThreshold;
|
||||
|
||||
var index = 0;
|
||||
var uwuifiedSentence = words.map((word) -> {
|
||||
var seed = new Seed(word);
|
||||
var random = seed.random();
|
||||
|
||||
var firstCharacter = word.charAt(0);
|
||||
|
||||
function checkCapital() {
|
||||
// Check if we should remove the first capital letter
|
||||
if (firstCharacter != firstCharacter.toUpperCase()) return;
|
||||
// if word has higher than 50% upper case
|
||||
if (getCapitalPercentage(word) > 0.5) return;
|
||||
|
||||
// If it's the first word
|
||||
if (index == 0) {
|
||||
// Remove the first capital letter
|
||||
word = firstCharacter.toLowerCase() + word.substr(1);
|
||||
} else {
|
||||
var previousWord = words[index - 1];
|
||||
var previousWordLastChar = previousWord.charAt(previousWord.length - 1);
|
||||
var prevWordEndsWithPunctuation = (~/[.!?\\-]/).match(
|
||||
previousWordLastChar
|
||||
);
|
||||
|
||||
if (!prevWordEndsWithPunctuation) return;
|
||||
word = firstCharacter.toLowerCase() + word.substr(1);
|
||||
}
|
||||
}
|
||||
|
||||
if (random <= faceThreshold && faces.length > 0) {
|
||||
// Add random face before the word
|
||||
var a = seed.randomInt(0, faces.length - 1);
|
||||
//trace(a, faces.length, faces);
|
||||
word += " " + faces[a];
|
||||
checkCapital();
|
||||
} else if (random <= actionThreshold && actions.length > 0) {
|
||||
// Add random action before the word
|
||||
var a = seed.randomInt(0, actions.length - 1);
|
||||
//trace(a, actions.length, actions);
|
||||
word += " " + actions[a];
|
||||
checkCapital();
|
||||
} else if (random <= stutterThreshold/* && !isUri(word)*/) {
|
||||
// Add stutter with a length between 0 and 2
|
||||
var stutter = seed.randomInt(0, 2);
|
||||
index++;
|
||||
return [for (i in 0...stutter) (firstCharacter + "-")].join("") + word;
|
||||
//return (firstCharacter + "-").repeat(stutter) + word;
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
return word;
|
||||
}).join(" ");
|
||||
|
||||
return uwuifiedSentence;
|
||||
}
|
||||
|
||||
public static function uwuifyExclamations(sentence: String): String {
|
||||
var words = sentence.split(" ");
|
||||
var pattern = ~/[?!]+$/;
|
||||
|
||||
var uwuifiedSentence = words.map((word) -> {
|
||||
var seed = new Seed(word);
|
||||
|
||||
// If there are no exclamations return
|
||||
if (
|
||||
!pattern.match(word) || seed.random() > _exclamationsModifier
|
||||
) {
|
||||
return word;
|
||||
}
|
||||
|
||||
word = pattern.replace(word, "");//.replace(pattern, "");
|
||||
word += exclamations[seed.randomInt(0, exclamations.length - 1)];
|
||||
|
||||
return word;
|
||||
}).join(" ");
|
||||
|
||||
return uwuifiedSentence;
|
||||
}
|
||||
|
||||
public static var disableUWU:Bool = false;
|
||||
|
||||
public static function uwuifySentence(sentence: String): String {
|
||||
if(sentence.trim().length == 0 || disableUWU) return sentence;
|
||||
|
||||
var uwuifiedString = sentence;
|
||||
|
||||
uwuifiedString = uwuifyWords(uwuifiedString);
|
||||
//uwuifiedString = uwuifyExclamations(uwuifiedString);
|
||||
uwuifiedString = uwuifySpaces(uwuifiedString);
|
||||
|
||||
//trace(uwuifiedString);
|
||||
|
||||
return uwuifiedString;
|
||||
}
|
||||
|
||||
static function isLetter(char: String) {
|
||||
//return ~/^\p{L}/u.match(char);
|
||||
return ~/^[a-zA-Z]/i.match(char);
|
||||
}
|
||||
static function isUpperCase(char: String) {
|
||||
return char == char.toUpperCase();
|
||||
}
|
||||
|
||||
static function getCapitalPercentage(str: String): Float {
|
||||
var totalLetters = 0;
|
||||
var upperLetters = 0;
|
||||
|
||||
for (currentLetter in str.split("")) {
|
||||
if (!isLetter(currentLetter)) continue;
|
||||
|
||||
if (isUpperCase(currentLetter)) {
|
||||
upperLetters++;
|
||||
}
|
||||
|
||||
totalLetters++;
|
||||
}
|
||||
|
||||
return upperLetters / totalLetters;
|
||||
}
|
||||
}
|
||||
|
||||
class Crc32 {
|
||||
var crc:Int;
|
||||
|
||||
public inline function new() {
|
||||
crc = 0xFFFFFFFF;
|
||||
}
|
||||
|
||||
public inline function update(b:String, pos, len) {
|
||||
//var b = b.getData();
|
||||
for (i in pos...pos + len) {
|
||||
var tmp = (crc ^ b.charCodeAt(i)) & 0xFF;
|
||||
for (j in 0...8)
|
||||
tmp = (tmp >>> 1) ^ (-(tmp & 1) & 0xEDB88320);
|
||||
crc = (crc >>> 8) ^ tmp;
|
||||
}
|
||||
}
|
||||
|
||||
public inline function get() {
|
||||
return crc ^ 0xFFFFFFFF;
|
||||
}
|
||||
public inline function getSinged() {
|
||||
return crc ^ 0xFFFFFFFF;
|
||||
}
|
||||
|
||||
/**
|
||||
Calculates the CRC32 of the given data bytes
|
||||
**/
|
||||
public static function make(data:String):Int {
|
||||
var c = new Crc32();
|
||||
c.update(data, 0, data.length);
|
||||
var a = c.getSinged();
|
||||
if(a < 0) {
|
||||
a = -a;
|
||||
}
|
||||
return a;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class Seed {
|
||||
private var seeder: FlxRandom;
|
||||
|
||||
public function new(seed: String) {
|
||||
this.seeder = new FlxRandom();
|
||||
seeder.initialSeed = Crc32.make(seed);
|
||||
//trace(seeder.initialSeed, seed, Crc32.make(seed));
|
||||
}
|
||||
|
||||
public function random(min:Float = 0, max:Float = 1): Float {
|
||||
// Make sure the minimum and maximum values are correct
|
||||
if (min > max) {
|
||||
throw ("The minimum value must be below the maximum value");
|
||||
}
|
||||
if (min == max) {
|
||||
throw ("The minimum value cannot equal the maximum value");
|
||||
}
|
||||
|
||||
return this.denormalize(seeder.float(0, 1), min, max);
|
||||
}
|
||||
|
||||
public function randomInt(min:Float = 0, max:Float = 1): Int {
|
||||
return Math.round(this.random(min, max));
|
||||
}
|
||||
|
||||
private function denormalize(value: Float, min: Float, max: Float): Float {
|
||||
return value * (max - min) + min;
|
||||
}
|
||||
|
||||
/* private function imul(a:Int, b:Int) {
|
||||
return a * (b & 65535) + (a * (b >>> 16) << 16 | 0) | 0;
|
||||
}
|
||||
private function imul64(a:Int64, b:Int64) {
|
||||
return Int64.mul(a, b);//a * (b & 65535) + (a * (b >>> 16) << 16 | 0) | 0;
|
||||
}
|
||||
|
||||
// https://github.com/bryc/code/blob/master/jshash/PRNGs.md
|
||||
private function xmur3(str: String): Void -> Int64 {
|
||||
var h = Int64.make(0, 1779033703) ^ Int64.make(0, str.length);
|
||||
|
||||
//for (let i = 0; i < str.length; i++) {
|
||||
var aa = Int64.parseString("3432918353");
|
||||
for(i in 0...str.length) {
|
||||
h = imul64(h ^ Int64.make(0, str.charCodeAt(i)), aa);
|
||||
h = h << 13 | h >>> 19;
|
||||
}
|
||||
|
||||
var bb = Int64.parseString("2246822507");
|
||||
var cc = Int64.parseString("3266489909");
|
||||
|
||||
return () -> {
|
||||
h = imul64(h ^ h >>> 16, bb);
|
||||
h = imul64(h ^ h >>> 13, cc);
|
||||
return (h ^= h >>> 16) >>> 0;
|
||||
};
|
||||
}
|
||||
|
||||
static function toint32(a:Int64):Int64 {
|
||||
return a & 0xFFFFFFFF;//Int64.make(0, Int64.toInt(a & 0xFFFFFFFF));
|
||||
}
|
||||
|
||||
// https://github.com/bryc/code/blob/master/jshash/PRNGs.md
|
||||
private function sfc32(): Int {
|
||||
var a = this.seeder();
|
||||
var b = this.seeder();
|
||||
var c = this.seeder();
|
||||
var d = this.seeder();
|
||||
|
||||
a = toint32(a);
|
||||
b = toint32(b);
|
||||
c = toint32(c);
|
||||
d = toint32(d);
|
||||
// a >>>= 0;
|
||||
// b >>>= 0;
|
||||
// c >>>= 0;
|
||||
// d >>>= 0;
|
||||
var t = (a + b) | 0;
|
||||
a = b ^ (toint32(b >> 9));
|
||||
b = (c + (c << 3)) | 0;
|
||||
c = (c << 21) | (toint32(c >> 11));
|
||||
d = (d + 1) | 0;
|
||||
t = (t + d) | 0;
|
||||
c = (c + t) | 0;
|
||||
return Int64.toInt(toint32(toint32(t) / Int64.parseString("4294967296")));
|
||||
}*/
|
||||
}
|
||||
|
||||
/*class Seed {
|
||||
private var seeder: Void -> Int64;
|
||||
|
||||
public function new(seed: String) {
|
||||
this.seeder = this.xmur3(seed);
|
||||
}
|
||||
|
||||
public function random(min = 0, max = 1): Float {
|
||||
// Make sure the minimum and maximum values are correct
|
||||
if (min > max) {
|
||||
throw ("The minimum value must be below the maximum value");
|
||||
}
|
||||
if (min == max) {
|
||||
throw ("The minimum value cannot equal the maximum value");
|
||||
}
|
||||
|
||||
return this.denormalize(this.sfc32(), min, max);
|
||||
}
|
||||
|
||||
public function randomInt(min = 0, max = 1): Int {
|
||||
return Math.round(this.random(min, max));
|
||||
}
|
||||
|
||||
private function denormalize(value: Float, min: Float, max: Float): Float {
|
||||
return value * (max - min) + min;
|
||||
}
|
||||
|
||||
private function imul(a:Int, b:Int) {
|
||||
return a * (b & 65535) + (a * (b >>> 16) << 16 | 0) | 0;
|
||||
}
|
||||
private function imul64(a:Int64, b:Int64) {
|
||||
return Int64.mul(a, b);//a * (b & 65535) + (a * (b >>> 16) << 16 | 0) | 0;
|
||||
}
|
||||
|
||||
// https://github.com/bryc/code/blob/master/jshash/PRNGs.md
|
||||
private function xmur3(str: String): Void -> Int64 {
|
||||
var h = Int64.make(0, 1779033703) ^ Int64.make(0, str.length);
|
||||
|
||||
//for (let i = 0; i < str.length; i++) {
|
||||
var aa = Int64.parseString("3432918353");
|
||||
for(i in 0...str.length) {
|
||||
h = imul64(h ^ Int64.make(0, str.charCodeAt(i)), aa);
|
||||
h = h << 13 | h >>> 19;
|
||||
}
|
||||
|
||||
var bb = Int64.parseString("2246822507");
|
||||
var cc = Int64.parseString("3266489909");
|
||||
|
||||
return () -> {
|
||||
h = imul64(h ^ h >>> 16, bb);
|
||||
h = imul64(h ^ h >>> 13, cc);
|
||||
return (h ^= h >>> 16) >>> 0;
|
||||
};
|
||||
}
|
||||
|
||||
static function toint32(a:Int64):Int64 {
|
||||
return a & 0xFFFFFFFF;//Int64.make(0, Int64.toInt(a & 0xFFFFFFFF));
|
||||
}
|
||||
|
||||
// https://github.com/bryc/code/blob/master/jshash/PRNGs.md
|
||||
private function sfc32(): Int {
|
||||
var a = this.seeder();
|
||||
var b = this.seeder();
|
||||
var c = this.seeder();
|
||||
var d = this.seeder();
|
||||
|
||||
a = toint32(a);
|
||||
b = toint32(b);
|
||||
c = toint32(c);
|
||||
d = toint32(d);
|
||||
// a >>>= 0;
|
||||
// b >>>= 0;
|
||||
// c >>>= 0;
|
||||
// d >>>= 0;
|
||||
var t = (a + b) | 0;
|
||||
a = b ^ (toint32(b >> 9));
|
||||
b = (c + (c << 3)) | 0;
|
||||
c = (c << 21) | (toint32(c >> 11));
|
||||
d = (d + 1) | 0;
|
||||
t = (t + d) | 0;
|
||||
c = (c + t) | 0;
|
||||
return Int64.toInt(toint32(toint32(t) / Int64.parseString("4294967296")));
|
||||
}
|
||||
}*/
|
||||
@@ -66,9 +66,6 @@ class MainState extends FlxState {
|
||||
betaWarningShown = true;
|
||||
}
|
||||
|
||||
WindowUtils.resetTitle();
|
||||
WindowUtils.updateTitle();
|
||||
|
||||
#if sys
|
||||
sys.FileSystem.createDirectory('./.temp/');
|
||||
#if windows new funkin.backend.utils.native.HiddenProcess("attrib +h .temp"); #end
|
||||
|
||||
@@ -11,6 +11,6 @@ class CodenameBuildField extends TextField {
|
||||
defaultTextFormat = Framerate.textFormat;
|
||||
autoSize = LEFT;
|
||||
multiline = wordWrap = false;
|
||||
text = flixel.text.Uwuifier.uwuifySentence('Codename Engine ${Main.releaseCycle}\nCommit ${GitCommitMacro.commitNumber} (${GitCommitMacro.commitHash})');
|
||||
text = 'Codename Engine ${Main.releaseCycle}\nCommit ${GitCommitMacro.commitNumber} (${GitCommitMacro.commitHash})';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package funkin.backend.utils;
|
||||
|
||||
import flixel.text.Uwuifier;
|
||||
import openfl.Lib;
|
||||
|
||||
class WindowUtils {
|
||||
@@ -53,7 +52,7 @@ class WindowUtils {
|
||||
}
|
||||
|
||||
public static inline function updateTitle()
|
||||
Lib.application.window.title = Uwuifier.uwuifySentence('$prefix$winTitle$suffix');
|
||||
Lib.application.window.title = '$prefix$winTitle$suffix';
|
||||
|
||||
// backwards compat
|
||||
@:noCompletion public static var endfix(get, set):String;
|
||||
|
||||
@@ -720,14 +720,6 @@ class Charter extends UIState {
|
||||
}
|
||||
}
|
||||
|
||||
public function updateAprilFools(elapsed:Float) {
|
||||
if (FlxG.random.bool(.05))
|
||||
openfl.Lib.application.window.warpMouse(
|
||||
FlxG.random.int(0, openfl.Lib.application.window.width),
|
||||
FlxG.random.int(0, openfl.Lib.application.window.height)
|
||||
);
|
||||
}
|
||||
|
||||
var deletedNotes:Selection = new Selection();
|
||||
public function updateNoteLogic(elapsed:Float) {
|
||||
updateSelectionLogic();
|
||||
@@ -1148,15 +1140,9 @@ class Charter extends UIState {
|
||||
|
||||
var __crochet:Float;
|
||||
var __firstFrame:Bool = true;
|
||||
var __timer:Float = 0;
|
||||
public override function update(elapsed:Float) {
|
||||
__timer += elapsed;
|
||||
for (shader in waveformHandler.waveShaders)
|
||||
shader.data.time.value = [__timer];
|
||||
|
||||
updateNoteLogic(elapsed);
|
||||
updateAutoSaving(elapsed);
|
||||
updateAprilFools(elapsed);
|
||||
|
||||
if (FlxG.sound.music.playing || __firstFrame) {
|
||||
gridBackdrops.conductorSprY = curStepFloat * 40;
|
||||
|
||||
@@ -557,7 +557,7 @@ class PlayState extends MusicBeatState
|
||||
// CHARACTER INITIALIZATION
|
||||
#if REGION
|
||||
comboGroup = new RotatingSpriteGroup(FlxG.width * 0.55, (FlxG.height * 0.5) - 60);
|
||||
comboGroup.maxSize = 200;
|
||||
comboGroup.maxSize = 25;
|
||||
#end
|
||||
|
||||
// CAMERA FOLLOW, SCRIPTS & STAGE INITIALIZATION
|
||||
@@ -1704,7 +1704,7 @@ class PlayState extends MusicBeatState
|
||||
var pre:String = evt != null ? evt.ratingPrefix : "";
|
||||
var suf:String = evt != null ? evt.ratingSuffix : "";
|
||||
|
||||
var separatedScore:String = [for (i in 0...FlxG.random.int(1, 22)) FlxG.random.int(1,9)].join("");
|
||||
var separatedScore:String = Std.string(combo).addZeros(3);
|
||||
|
||||
if (combo == 0 || combo >= 10) {
|
||||
if (combo >= 10) {
|
||||
|
||||
@@ -60,17 +60,11 @@ class MainMenuState extends MusicBeatState
|
||||
|
||||
for (i=>option in optionShit)
|
||||
{
|
||||
var menuItem:FlxSprite = new FlxSprite(0, 60 + (i * 130));
|
||||
var menuItem:FlxSprite = new FlxSprite(0, 60 + (i * 160));
|
||||
menuItem.frames = Paths.getFrames('menus/mainmenu/${option}');
|
||||
menuItem.animation.addByPrefix('idle', option + " basic", 24);
|
||||
menuItem.animation.addByPrefix('selected', option + " white", 24);
|
||||
menuItem.animation.play('idle');
|
||||
menuItem.scale.set(0.8, 0.8);
|
||||
if (option == "visual novel") {
|
||||
menuItem.scale.set(0.7, 0.7);
|
||||
menuItem.y += 8;
|
||||
}
|
||||
menuItem.updateHitbox();
|
||||
menuItem.ID = i;
|
||||
menuItem.screenCenter(X);
|
||||
menuItems.add(menuItem);
|
||||
@@ -167,7 +161,6 @@ class MainMenuState extends MusicBeatState
|
||||
switch (daChoice)
|
||||
{
|
||||
case 'story mode': FlxG.switchState(new StoryMenuState());
|
||||
case 'visual novel': FlxG.switchState(new VisualNovel());
|
||||
case 'freeplay': FlxG.switchState(new FreeplayState());
|
||||
case 'donate': FlxG.switchState(new CreditsMain());
|
||||
case 'options': FlxG.switchState(new OptionsMenu());
|
||||
@@ -198,9 +191,6 @@ class MainMenuState extends MusicBeatState
|
||||
|
||||
spr.updateHitbox();
|
||||
spr.centerOffsets();
|
||||
|
||||
if (spr.ID == optionShit.indexOf("visual novel") && spr.ID == curSelected)
|
||||
spr.offset.y += 26; // this sprite really weird -lunar
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -69,7 +69,6 @@ class TitleState extends MusicBeatState
|
||||
titleText.animation.addByPrefix('press', "ENTER PRESSED", 24);
|
||||
titleText.antialiasing = true;
|
||||
titleText.animation.play('idle');
|
||||
titleText.screenCenter(X);
|
||||
titleText.updateHitbox();
|
||||
}
|
||||
add(titleText);
|
||||
|
||||
@@ -1,507 +0,0 @@
|
||||
package funkin.menus;
|
||||
|
||||
import flixel.addons.text.FlxTypeText;
|
||||
import flixel.util.FlxColor;
|
||||
import flixel.text.FlxText;
|
||||
import flixel.FlxG;
|
||||
import flixel.tweens.FlxTween;
|
||||
import flixel.group.FlxSpriteGroup;
|
||||
import flixel.group.FlxGroup.FlxTypedGroup;
|
||||
import flixel.FlxSprite;
|
||||
import flixel.util.FlxStringUtil;
|
||||
import haxe.Exception;
|
||||
import haxe.xml.Access;
|
||||
import flixel.math.FlxRect;
|
||||
|
||||
using StringTools;
|
||||
|
||||
class VisualNovel extends MusicBeatState {
|
||||
public static var allowInput = true;
|
||||
|
||||
var entries:Array<Entry> = [];
|
||||
var characterMap:Map<String, CharInfo> = [];
|
||||
var redirectMap:Map<String, Int> = [];
|
||||
|
||||
var currentEntryId:Int = 0;
|
||||
var currentEntry(get, never):Entry;
|
||||
function get_currentEntry() {
|
||||
return entries[currentEntryId];
|
||||
}
|
||||
|
||||
function next() @:privateAccess {
|
||||
if (text._typing) {
|
||||
text.skip();
|
||||
return;
|
||||
}
|
||||
|
||||
if(currentEntry.next != null) {
|
||||
currentEntryId = redirectMap[currentEntry.next];
|
||||
} else {
|
||||
currentEntryId++;
|
||||
if(currentEntryId == entries.length)
|
||||
currentEntryId = 0;
|
||||
}
|
||||
|
||||
showEntry();
|
||||
}
|
||||
|
||||
var totalChoices = 0;
|
||||
|
||||
override function create() {
|
||||
super.create();
|
||||
|
||||
allowInput = true;
|
||||
|
||||
FlxG.sound.playMusic("assets/images/vn/senpaimusic.ogg", 0);
|
||||
FlxG.sound.music.fadeIn(1, 0, 0.8);
|
||||
|
||||
flixel.text.Uwuifier.disableUWU = true;
|
||||
|
||||
var plainXML = Assets.getText("assets/images/vn/vn.xml");
|
||||
|
||||
var vxml = Xml.parse(plainXML).firstElement();
|
||||
if (vxml == null)
|
||||
throw new Exception("Missing \"vn\" node in XML.");
|
||||
var xml = new Access(vxml);
|
||||
|
||||
var backgrounds = [];
|
||||
var characters = [];
|
||||
|
||||
for(char in xml.elements) {
|
||||
if(char.name == "character") {
|
||||
var c = new CharInfo();
|
||||
c.id = char.att.id;
|
||||
|
||||
c.name = char.node.name.innerData;
|
||||
c.color = FlxColor.fromString("#" + char.node.color.innerData);
|
||||
c.image = char.node.image.innerData;
|
||||
c.scale = Std.parseFloat(char.node.scale.innerData);
|
||||
c.side = char.hasNode.side ? char.node.side.innerData : "left";
|
||||
if(char.hasNode.offset) {
|
||||
var aa = char.node.offset.innerData.split(",");
|
||||
c.offsetX = Std.parseFloat(aa[0]);
|
||||
c.offsetY = Std.parseFloat(aa[1]);
|
||||
}
|
||||
|
||||
characters.push(c);
|
||||
characterMap.set(c.id, c);
|
||||
}
|
||||
}
|
||||
|
||||
var i = 0;
|
||||
for(entry in xml.elements) {
|
||||
if(entry.name != "entry") continue;
|
||||
|
||||
//trace(entry);
|
||||
|
||||
var e = new Entry();
|
||||
e.bg = entry.has.bg ? entry.att.bg : null;
|
||||
e.character = entry.has.character ? entry.att.character : null;
|
||||
e.id = entry.has.id ? entry.att.id : null;
|
||||
e.next = entry.has.next ? entry.att.next : null;
|
||||
|
||||
if(e.id != null) {
|
||||
redirectMap[e.id] = i;
|
||||
}
|
||||
|
||||
if(e.bg != null && !backgrounds.contains(e.bg)) {
|
||||
backgrounds.push(e.bg);
|
||||
}
|
||||
if(e.character != null && !characterMap.exists(e.character)) {
|
||||
throw "Missing Character XML Code " + e.character;
|
||||
}
|
||||
|
||||
var _entry:Xml = cast entry;
|
||||
|
||||
e.text = _entry.firstChild().nodeValue.trim().replace("\r\n", "\n");
|
||||
|
||||
var choices = [];
|
||||
|
||||
for(choice in entry.nodes.choice) {
|
||||
var c = new Choice();
|
||||
c.text = choice.innerData.trim();
|
||||
c.redirect = choice.has.id ? choice.att.id : null;
|
||||
|
||||
choices.push(c);
|
||||
}
|
||||
|
||||
if(choices.length > totalChoices)
|
||||
totalChoices = choices.length;
|
||||
|
||||
e.choices = choices;
|
||||
|
||||
entries.push(e);
|
||||
i++;
|
||||
}
|
||||
|
||||
/*trace("");
|
||||
trace("");
|
||||
trace("");
|
||||
|
||||
for(entry in entries) {
|
||||
trace(entry);
|
||||
}*/
|
||||
|
||||
grpBackgrounds = new FlxTypedGroup<FlxSprite>();
|
||||
for(bg in backgrounds) {
|
||||
var b = new FlxSprite(Paths.image("vn/bgs/" + bg));
|
||||
b.alpha = 0.00001;
|
||||
b.setGraphicSize(FlxG.width);
|
||||
b.antialiasing = true;
|
||||
b.screenCenter();
|
||||
b.active = false;
|
||||
grpBackgrounds.add(b);
|
||||
|
||||
bgMap.set(bg, b);
|
||||
}
|
||||
add(grpBackgrounds);
|
||||
|
||||
var COCK = 230;
|
||||
|
||||
grpPortraits = new FlxTypedGroup<FlxSprite>();
|
||||
for(char in characters) {
|
||||
var b = new FlxSprite(Paths.image("vn/portraits/" + char.image));
|
||||
b.alpha = 0.00001;
|
||||
b.y = FlxG.height - b.height;
|
||||
if(char.side == "right") {
|
||||
b.x = FlxG.width - b.width;
|
||||
b.x -= 100;
|
||||
b.origin.set(b.frameWidth, b.frameHeight);
|
||||
} else if(char.side == "center") {
|
||||
b.screenCenter(X);
|
||||
} else {
|
||||
b.x = 0;
|
||||
b.x += 100;
|
||||
b.origin.set(0, b.frameHeight);
|
||||
}
|
||||
b.y -= COCK;
|
||||
b.x += char.offsetX;
|
||||
b.y += char.offsetY;
|
||||
b.scale.set(char.scale, char.scale);
|
||||
b.antialiasing = true;
|
||||
grpPortraits.add(b);
|
||||
|
||||
chMap.set(char.id, b);
|
||||
}
|
||||
add(grpPortraits);
|
||||
|
||||
var fade = new FlxSprite(Paths.image("vn/box"));
|
||||
fade.setGraphicSize(FlxG.width, fade.frameHeight);
|
||||
fade.updateHitbox();
|
||||
fade.screenCenter();
|
||||
fade.antialiasing = true;
|
||||
fade.y = FlxG.height - fade.height;
|
||||
//fade.origin.set(fade.origin.x, fade.frameHeight);
|
||||
//fade.scale.y *= 0.4;
|
||||
add(fade);
|
||||
|
||||
fade.y -= COCK;
|
||||
|
||||
var box = new FlxSprite().makeSolid(FlxG.width, COCK, FlxColor.BLACK);
|
||||
box.y = FlxG.height - box.height;
|
||||
add(box);
|
||||
|
||||
grpChoices = new FlxTypedGroup<ChoiceButton>();
|
||||
for(i in 0...totalChoices) {
|
||||
var b = new ChoiceButton();
|
||||
//b.alpha = 0.00001;
|
||||
b.exists = false;
|
||||
//b.y = FlxG.height - b.height;
|
||||
b.redirectID = 0;
|
||||
b.onSelected = () -> {
|
||||
if(b.redirectID == -99) {
|
||||
exit();
|
||||
} else {
|
||||
currentEntryId = b.redirectID;
|
||||
showEntry();
|
||||
}
|
||||
}
|
||||
grpChoices.add(b);
|
||||
}
|
||||
add(grpChoices);
|
||||
|
||||
name = new FlxText(30, 500 - 60, FlxG.width - 40, "", 32);
|
||||
name.font = Paths.font("fnf.ttf");
|
||||
name.bold = true;
|
||||
name.antialiasing = true;
|
||||
add(name);
|
||||
|
||||
text = new FlxTypeText(30, 500, FlxG.width - 40, "", 32);
|
||||
text.font = Paths.font("fnf.ttf");
|
||||
text.bold = true;
|
||||
text.antialiasing = true;
|
||||
text.sounds = [FlxG.sound.load("assets/images/vn/sound_13.wav", 0.6)];
|
||||
add(text);
|
||||
|
||||
showEntry();
|
||||
}
|
||||
|
||||
var chMap:Map<String, FlxSprite> = [];
|
||||
var bgMap:Map<String, FlxSprite> = [];
|
||||
var grpBackgrounds:FlxTypedGroup<FlxSprite>;
|
||||
var grpPortraits:FlxTypedGroup<FlxSprite>;
|
||||
var grpChoices:FlxTypedGroup<ChoiceButton>;
|
||||
var text:FlxTypeText;
|
||||
var name:FlxText;
|
||||
|
||||
function showEntry(instant:Bool = false) {
|
||||
var entry = currentEntry;
|
||||
|
||||
// bg
|
||||
for(bg=>spr in bgMap) {
|
||||
FlxTween.cancelTweensOf(spr);
|
||||
FlxTween.tween(spr, {alpha: 0.00001}, 0.3);
|
||||
}
|
||||
|
||||
if(entry.bg != null) {
|
||||
var bg = bgMap[entry.bg];
|
||||
FlxTween.cancelTweensOf(bg);
|
||||
FlxTween.tween(bg, {alpha: 1}, 0.3);
|
||||
}
|
||||
|
||||
// character
|
||||
for(ch=>spr in chMap) {
|
||||
FlxTween.cancelTweensOf(spr);
|
||||
FlxTween.tween(spr, {alpha: 0.00001}, 0.3);
|
||||
}
|
||||
|
||||
if(entry.character != null) {
|
||||
var ch = chMap[entry.character];
|
||||
FlxTween.cancelTweensOf(ch);
|
||||
FlxTween.tween(ch, {alpha: 1}, 0.3);
|
||||
}
|
||||
|
||||
grpChoices.forEach(spr -> {
|
||||
spr.exists = false;
|
||||
});
|
||||
|
||||
//var offset = totalChoices - entry.choices.length;
|
||||
|
||||
var i = 0;
|
||||
for(choice in entry.choices) {
|
||||
var spr = grpChoices.members[i];
|
||||
|
||||
spr.exists = true;
|
||||
spr.text.text = choice.text;
|
||||
spr.redirectID = choice.redirect != null ? redirectMap[choice.redirect] : currentEntryId + 1;
|
||||
if(choice.redirect == "exit")
|
||||
spr.redirectID = -99;
|
||||
spr.y = 100 + 80 * (i/* + offset*/);
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
//trace(characterMap);
|
||||
//trace(entry.character);
|
||||
|
||||
if(entry.character != null) {
|
||||
var charInfo = characterMap.get(entry.character);
|
||||
|
||||
name.text = charInfo.name;
|
||||
name.color = charInfo.color;
|
||||
name.exists = true;
|
||||
} else {
|
||||
name.exists = false;
|
||||
}
|
||||
|
||||
//text.text = entry.text;
|
||||
|
||||
text.resetText(entry.text);
|
||||
text.start(0.04, true);
|
||||
dialogueEnded = false;
|
||||
|
||||
|
||||
grpChoices.forEach(spr -> {
|
||||
spr.active = spr.visible = false;
|
||||
});
|
||||
|
||||
text.completeCallback = function() {
|
||||
dialogueEnded = true;
|
||||
|
||||
grpChoices.forEach(spr -> {
|
||||
spr.active = spr.visible = true;
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
var dialogueEnded:Bool = false;
|
||||
|
||||
function exit() {
|
||||
flixel.text.Uwuifier.disableUWU = false;
|
||||
FlxG.switchState(new MainMenuState());
|
||||
FlxG.sound.music.stop();
|
||||
CoolUtil.playMenuSong();
|
||||
//FlxG.sound.music.fadeOut(1, 0, function(_) {
|
||||
// FlxG.sound.music.stop();
|
||||
//});
|
||||
}
|
||||
|
||||
override function update(elapsed:Float) {
|
||||
super.update(elapsed);
|
||||
|
||||
FlxG.mouse.visible = true;
|
||||
|
||||
if(allowInput) {
|
||||
if((FlxG.mouse.justPressed || controls.ACCEPT) && currentEntry.choices.length == 0) {
|
||||
next();
|
||||
}
|
||||
}
|
||||
|
||||
if(controls.BACK) {
|
||||
exit();
|
||||
}
|
||||
|
||||
allowInput = true;
|
||||
}
|
||||
}
|
||||
|
||||
class CharInfo {
|
||||
public var id:String = "";
|
||||
public var name:String = "";
|
||||
public var image:String = "";
|
||||
public var color:FlxColor;
|
||||
public var scale:Float = 1;
|
||||
public var side:String = "";
|
||||
public var offsetX:Float = 0;
|
||||
public var offsetY:Float = 0;
|
||||
|
||||
public function new() {
|
||||
|
||||
}
|
||||
|
||||
public function toString() {
|
||||
return FlxStringUtil.getDebugString([
|
||||
LabelValuePair.weak("id", id),
|
||||
LabelValuePair.weak("name", name),
|
||||
LabelValuePair.weak("image", image),
|
||||
LabelValuePair.weak("color", color),
|
||||
LabelValuePair.weak("scale", scale),
|
||||
LabelValuePair.weak("side", side),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
class Entry {
|
||||
public var id:Null<String> = "";
|
||||
public var character:String = "";
|
||||
public var bg:Null<String> = "";
|
||||
public var next:String = "";
|
||||
|
||||
public var text:String = "";
|
||||
|
||||
public var choices:Array<Choice> = [];
|
||||
|
||||
public function new() {
|
||||
|
||||
}
|
||||
|
||||
public function toString() {
|
||||
return FlxStringUtil.getDebugString([
|
||||
LabelValuePair.weak("id", id),
|
||||
LabelValuePair.weak("character", character),
|
||||
LabelValuePair.weak("bg", bg),
|
||||
LabelValuePair.weak("next", next),
|
||||
LabelValuePair.weak("choices", choices),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
class Choice {
|
||||
public var text:String = "";
|
||||
public var redirect:Null<String> = "";
|
||||
|
||||
public function new() {
|
||||
|
||||
}
|
||||
|
||||
public function toString() {
|
||||
return text + " => " + redirect;
|
||||
}
|
||||
}
|
||||
|
||||
class ChoiceButton extends FlxSpriteGroup {
|
||||
public var idle:FlxSprite;
|
||||
public var sele:FlxSprite;
|
||||
public var text:FlxText;
|
||||
|
||||
public var onSelected:Void->Void = null;
|
||||
public var redirectID:Int = 0;
|
||||
|
||||
public function new(X:Float = 0, Y:Float = 0) {
|
||||
super(X, Y);
|
||||
|
||||
idle = new FlxSprite(Paths.image("vn/options"));
|
||||
sele = new FlxSprite(Paths.image("vn/options_selected"));
|
||||
|
||||
idle.antialiasing = true;
|
||||
sele.antialiasing = true;
|
||||
|
||||
idle.scale.set(0.666, 0.666);
|
||||
sele.scale.set(0.666, 0.666);
|
||||
|
||||
idle.updateHitbox();
|
||||
sele.updateHitbox();
|
||||
|
||||
sele.alpha = 0.00001;
|
||||
|
||||
moves = false;
|
||||
|
||||
text = new FlxText(0, 0, FlxG.width, "PLACEHOLDER", 32);
|
||||
text.y = Math.abs(text.height / 2 - idle.height / 2);
|
||||
text.font = Paths.font("fnf.ttf");
|
||||
text.bold = true;
|
||||
text.antialiasing = true;
|
||||
text.alignment = CENTER;
|
||||
|
||||
add(idle);
|
||||
add(sele);
|
||||
|
||||
add(text);
|
||||
}
|
||||
|
||||
public var selected(default, set):Bool = false;
|
||||
function set_selected(v:Bool) {
|
||||
idle.alpha = !v ? 1 : 0.00001;
|
||||
sele.alpha = v ? 1 : 0.00001;
|
||||
return selected = v;
|
||||
}
|
||||
|
||||
override function update(elapsed:Float) {
|
||||
if(!exists) return;
|
||||
if(!VisualNovel.allowInput) return;
|
||||
|
||||
super.update(elapsed);
|
||||
|
||||
if(FlxG.mouse.justMoved) {
|
||||
if(checkOverlap(idle, 30, 5)) {
|
||||
selected = true;
|
||||
} else {
|
||||
selected = false;
|
||||
}
|
||||
}
|
||||
|
||||
if(FlxG.mouse.justPressed) {
|
||||
if(checkOverlap(idle, 30, 5)) {
|
||||
VisualNovel.allowInput = false;
|
||||
if(onSelected != null)
|
||||
onSelected();
|
||||
}
|
||||
}
|
||||
|
||||
text.screenCenter(X);
|
||||
idle.screenCenter(X);
|
||||
sele.screenCenter(X);
|
||||
}
|
||||
|
||||
function checkOverlap(group:FlxSprite, widthExtend:Float = 0, heightExtend:Float = 0) {
|
||||
var mouse = FlxG.mouse.getPosition();
|
||||
|
||||
var rect = FlxRect.weak(group.x - widthExtend/2, group.y - heightExtend/2, group.width + widthExtend, group.height + heightExtend);
|
||||
var val = mouse.inRect(rect);
|
||||
|
||||
rect.putWeak();
|
||||
mouse.put();
|
||||
|
||||
return val;
|
||||
}
|
||||
}
|
||||
@@ -150,7 +150,7 @@ class Alphabet extends FlxSpriteGroup
|
||||
|
||||
function doSplitWords():Void
|
||||
{
|
||||
splitWords = flixel.text.Uwuifier.uwuifySentence(_finalText).split("");
|
||||
splitWords = _finalText.split("");
|
||||
}
|
||||
|
||||
//public var personTalking:String = 'gf';
|
||||
|
||||