Merge remote-tracking branch 'upstream/main'

This commit is contained in:
lunarcleint
2024-02-04 00:58:19 -07:00
94 changed files with 1323 additions and 394 deletions
+4 -7
View File
@@ -5,7 +5,6 @@
Known issues in the alpha:
- Some options are missing
- Week 6 still have no dialogue
- Week 7 have no running tankman
Build instructions are below. Press TAB on the main menu to switch mods.
@@ -13,7 +12,7 @@ Also, `lime test windows` uses the source assets folder instead of the export on
## Codename Engine
Codename Engine is a new Friday Night Funkin' Engine aimed for easier modding, along with extensiblity and ease of use.
Codename Engine is a new Friday Night Funkin' Engine aimed at simplifying modding, along with extensiblity and ease of use.
### It includes many new features, as seen [here](FEATURES.md)
@@ -54,12 +53,10 @@ Latest builds for the engine can be found in the [Actions](https://github.com/Yo
<img src="https://github.com/YoshiCrafter29/CodenameEngine/blob/main/art/github/windows-installation-details.png?raw=true" />
</p>
6. Once the installation is done, close Visual Studio Installer.
7. Download and install [`git-scm`](https://git-scm.com/download/win).
6. Once you finish downloading those components, download and install [`git-scm`](https://git-scm.com/download/win).
- Leave all installation options as default.
8. Open the Codename Engine source folder, click on the address bar and type `cmd` to open a command prompt window.
9. On the command prompt, run `update.bat`, and wait for the libraries to install.
10. Once the libraries are installed, run `haxelib run lime test windows` to compile and launch the game (may take a long time)
7. Run `update.bat` using cmd or double-clicking it, and wait for the libraries to install.
8. Once the libraries are installed, run `haxelib run lime test windows` to compile and launch the game (may take a long time)
- ℹ You can run `haxelib run lime setup` to make the lime command global, allowing you to execute `lime test windows` directly.
</details>
<details>
Binary file not shown.

After

Width:  |  Height:  |  Size: 250 KiB

+1 -1
View File
@@ -1,5 +1,5 @@
<!DOCTYPE codename-engine-character>
<character isPlayer="true" flipX="true" x="0" y="350" icon="bf">
<character isPlayer="true" flipX="true" x="0" y="350" icon="bf" camy="55">
<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"/>
+1 -1
View File
@@ -9,5 +9,5 @@
<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="0" y="0"/>
<anim name="bfCatch" anim="BF catches GF" fps="24" loop="false" x="6" y="88"/>
</character>
+1 -1
View File
@@ -1,5 +1,5 @@
<!DOCTYPE codename-engine-character>
<character isPlayer="true" flipX="true" x="200" y="570" antialiasing="false" scale="6" camx="-200" camy="-20" gameOverChar="bf-pixel-dead">
<character isPlayer="true" flipX="true" x="200" y="570" antialiasing="false" scale="6" gameOverChar="bf-pixel-dead">
<anim name="idle" anim="BF IDLE" fps="24" loop="false" x="0" y="0" />
<!-- Offsets are actually multiplied by scale -->
+1 -1
View File
@@ -1,5 +1,5 @@
<!DOCTYPE codename-engine-character>
<character isPlayer="false" flipX="false" icon="pico" x="-50" y="-120" camx="195" camy="365">
<character isPlayer="false" flipX="false" icon="pico" x="115" y="-85" camx="195" camy="360">
<!-- 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" />
+7 -9
View File
@@ -1,10 +1,8 @@
<!DOCTYPE codename-engine-character>
<character sprite="senpai" isPlayer="false" flipX="false" x="150" y="360" antialiasing="false" scale="6" icon="senpai" camx="100">
<anim name="idle" anim="Angry Senpai Idle" fps="24" loop="false" x="0" y="0" />
<!-- Offsets are actually multiplied by scale -->
<anim name="singLEFT" anim="Angry Senpai LEFT NOTE" fps="24" loop="false" x="7" y="0" />
<anim name="singDOWN" anim="Angry Senpai DOWN NOTE" fps="24" loop="false" x="2" y="0" />
<anim name="singUP" anim="Angry Senpai UP NOTE" fps="24" loop="false" x="1" y="6" />
<anim name="singRIGHT" anim="Angry Senpai RIGHT NOTE" fps="24" loop="false" x="0" y="0" />
</character>
<character x="150" icon="senpai" camx="100" y="360" isGF="false" scale="6" camy="87" isPlayer="false" antialiasing="false" sprite="senpai">
<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>
+1 -1
View File
@@ -1,5 +1,5 @@
<!DOCTYPE codename-engine-character>
<character isPlayer="false" flipX="false" x="150" y="360" antialiasing="false" scale="6" camx="100">
<character isPlayer="false" flipX="false" x="150" y="360" antialiasing="false" scale="6" camx="100" camy="87">
<anim name="idle" anim="Senpai Idle" fps="12" loop="false" x="0" y="0" />
<!-- Offsets are actually multiplied by scale -->
+16
View File
@@ -0,0 +1,16 @@
import flixel.addons.effects.FlxTrail;
var self = this;
var trail:FlxTrail;
function postCreate() {
trail = new FlxTrail(self, null, 4, 24, 0.3, 0.069);
}
var toAdd:Bool = true; // Using this just to make sure
function update(elpased) {
if(toAdd) {
toAdd = false;
PlayState.instance.insert(PlayState.instance.members.indexOf(self), trail);
disableScript();
}
}
+2
View File
@@ -1,5 +1,7 @@
<!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"/>
</menu>
+5 -5
View File
@@ -7,23 +7,23 @@
<!-- ONLY FOR INSTANCES WITH LOW MEMORY MODE DISABLED -->
<high-memory>
<!-- DANCERS !-->
<sprite name="dancer1" x="130" y="80" sprite="limoDancer" scroll="0.4" zoomfactor="0.55">
<sprite name="dancer1" x="130" y="80" sprite="limoDancer" scroll="0.4" zoomfactor="0.55" type="onbeat">
<anim name="danceLeft" anim="bg dancer sketch PINK" loop="false" indices="0,1,2,3,4,5,6,7,8,9,10,11,12,13,14" />
<anim name="danceRight" anim="bg dancer sketch PINK" loop="false" indices="15,16,17,18,19,20,21,22,23,24,25,26,27,28,29" />
</sprite>
<sprite name="dancer2" x="500" y="80" sprite="limoDancer" scroll="0.4" zoomfactor="0.55">
<sprite name="dancer2" x="500" y="80" sprite="limoDancer" scroll="0.4" zoomfactor="0.55" type="onbeat">
<anim name="danceLeft" anim="bg dancer sketch PINK" loop="false" indices="0,1,2,3,4,5,6,7,8,9,10,11,12,13,14" />
<anim name="danceRight" anim="bg dancer sketch PINK" loop="false" indices="15,16,17,18,19,20,21,22,23,24,25,26,27,28,29" />
</sprite>
<sprite name="dancer3" x="870" y="80" sprite="limoDancer" scroll="0.4" zoomfactor="0.55">
<sprite name="dancer3" x="870" y="80" sprite="limoDancer" scroll="0.4" zoomfactor="0.55" type="onbeat">
<anim name="danceLeft" anim="bg dancer sketch PINK" loop="false" indices="0,1,2,3,4,5,6,7,8,9,10,11,12,13,14" />
<anim name="danceRight" anim="bg dancer sketch PINK" loop="false" indices="15,16,17,18,19,20,21,22,23,24,25,26,27,28,29" />
</sprite>
<sprite name="dancer4" x="1240" y="80" sprite="limoDancer" scroll="0.4" zoomfactor="0.55">
<sprite name="dancer4" x="1240" y="80" sprite="limoDancer" scroll="0.4" zoomfactor="0.55" type="onbeat">
<anim name="danceLeft" anim="bg dancer sketch PINK" loop="false" indices="0,1,2,3,4,5,6,7,8,9,10,11,12,13,14" />
<anim name="danceRight" anim="bg dancer sketch PINK" loop="false" indices="15,16,17,18,19,20,21,22,23,24,25,26,27,28,29" />
</sprite>
<sprite name="dancer5" x="1610" y="80" sprite="limoDancer" scroll="0.4" zoomfactor="0.55">
<sprite name="dancer5" x="1610" y="80" sprite="limoDancer" scroll="0.4" zoomfactor="0.55" type="onbeat">
<anim name="danceLeft" anim="bg dancer sketch PINK" loop="false" indices="0,1,2,3,4,5,6,7,8,9,10,11,12,13,14" />
<anim name="danceRight" anim="bg dancer sketch PINK" loop="false" indices="15,16,17,18,19,20,21,22,23,24,25,26,27,28,29" />
</sprite>
+24
View File
@@ -0,0 +1,24 @@
var idk:CustomShader = null;
function create() {
if(!Options.gameplayShaders) {
disableScript();
return;
}
idk = new CustomShader('coloredVignette');
idk.color = [1, 0, 0];
camGame.addShader(idk);
}
var adder:Int = 0;
function postUpdate(elapsed:Float) { // Doing it like this so at least the red bump doesnt look too much instant
var toAdd:Int = lerp(adder, 0, elapsed);
idk.amount = camGame.zoom * camHUD.zoom + toAdd;
idk.strength = (camGame.zoom - camHUD.zoom + toAdd) * 5;
if(adder > 0) adder -= 0.0001 * camZoomingStrength;
}
function beatHit() {
if(Options.camZoomOnBeat && camZooming && FlxG.camera.zoom < maxCamZoom && curBeat % camZoomingInterval == 0)
adder = 0.05 * camZoomingStrength;
}
+4 -3
View File
@@ -3,17 +3,18 @@
<sprite name="bg" x="-1000" y="-500" sprite="bgWalls" scroll="0.2"/>
<high-memory>
<sprite name="upperBoppers" x="-240" y="-90" sprite="upperBop" scroll="0.2" />
<sprite name="upperBoppers" x="-240" y="-90" sprite="upperBop" scroll="0.2" type="onbeat"/>
</high-memory>
<sprite name="bgEscalator" x="-1100" y="-600" sprite="bgEscalator" scroll="0.3" scale="0.9" updateHitbox="true"/>
<sprite name="tree" x="370" y="-250" sprite="christmasTree" scroll="0.4"/>
<sprite name="bottomBoppers" x="-300" y="140" sprite="bottomBop" scroll="0.9"/>
<sprite name="bottomBoppers" x="-300" y="140" sprite="bottomBop" scroll="0.9" type="onbeat" />
<sprite name="fgSnow" x="-600" y="700" sprite="fgSnow"/>
<high-memory>
<sprite name="santa" x="-840" y="150" sprite="santa"/>
<sprite name="santa" x="-840" y="150" sprite="santa" type="onbeat"/>
</high-memory>
<girlfriend />
<dad />
<boyfriend x="870" camyoffset="-200"/>
+1
View File
@@ -19,6 +19,7 @@ var trainCooldown:Int = 0;
function create() {
// defaultCamZoom = 0.5;
phillyTrain.moves = true; // Def value false in funkinsprite
light.color = colors[curColor];
trainSound = FlxG.sound.load(Paths.sound("train_passes"));
}
+5
View File
@@ -1,4 +1,9 @@
function create() {
importScript("data/scripts/pixel");
isSpooky = true;
// Make transition work between school types
if(PlayState.smoothTransitionData?.stage == "school") PlayState.smoothTransitionData.stage = curStage;
disableScript();
}
+6 -4
View File
@@ -1,5 +1,5 @@
<!DOCTYPE codename-engine-stage>
<stage zoom="1" folder="stages/school/" >
<stage zoom="1" folder="stages/school/">
<sprite name="bgSky" x="-12" y="0" sprite="weebSky"
antialiasing="false" scale="6" scroll="0.1" updateHitbox="true"/>
@@ -11,10 +11,12 @@
<sprite name="fgTrees" x="-30" y="130" sprite="weebTreesBack"
antialiasing="false" scale="4.8" scroll="0.9" updateHitbox="true" type="loop"/>
antialiasing="false" scale="4.797" scroll="0.9" updateHitbox="true" type="loop"/>
<sprite name="bgTrees" x="-1180" y="-1600" sprite="weebTrees"
antialiasing="false" scale="8.4" scroll="0.85" updateHitbox="true" type="loop"/>
<sprite name="bgTrees" x="-590" y="-800" sprite="weebTrees" antialiasing="false" scale="5.102" scroll="0.85" updateHitbox="true" type="loop">
<!-- Frame 19 isnt used in og -->
<anim name="trees" anim="trees" indices="0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19" fps="12" loop="true"/>
</sprite>
<high-memory>
<sprite name="treeLeaves" x="-200" y="-40" sprite="petals"
+7
View File
@@ -6,4 +6,11 @@ function update(elapsed:Float) {
tankRolling.angle = tankAngle - 90 + 15;
tankRolling.x = 400 + (1500 * Math.cos(Math.PI / 180 * (1 * tankAngle + 180)));
tankRolling.y = 1300 + (1100 * Math.sin(Math.PI / 180 * (1 * tankAngle + 180)));
}
function onPostCountdown(event) {
if(!playCutscenes || event.sprite == null) return;
var lastIndex:Int = members.indexOf(event.sprite);
remove(event.sprite);
insert(lastIndex + 4, event.sprite);
}
+7 -7
View File
@@ -15,7 +15,7 @@
<high-memory>
<sprite name="smokeLeft" x="-200" y="-100" sprite="smokeLeft" scroll="0.4" zoomfactor="0.6"/>
<sprite name="smokeRight" x="1100" y="-100" sprite="smokeRight" scroll="0.4" zoomfactor="0.6"/>
<sprite name="tankWatchtower" x="100" y="50" sprite="tankWatchtower" scroll="0.5" onBeat="true" zoomfactor="0.7"/>
<sprite name="tankWatchtower" x="100" y="50" sprite="tankWatchtower" scroll="0.5" type="onbeat" beatInterval="2" zoomfactor="0.7"/>
</high-memory>
<sprite name="tankRolling" x="300" y="300" sprite="tankRolling" scroll="0.5" zoomfactor="0.8" type="loop"/>
<sprite name="tankGround" x="-420" y="-150" sprite="tankGround" scale="1.15" updateHitbox="true" zoomfactor="1.0"/>
@@ -28,11 +28,11 @@
<!-- FOREGROUND TANKMANS -->
<high-memory>
<sprite name="tank0" x="-500" y="650" sprite="tank0" scrollx="1.7" scrolly="1.5" onBeat="true" zoomfactor="1.25"/>
<sprite name="tank1" x="-300" y="750" sprite="tank1" scrollx="2" scrolly="0.2" onBeat="true" zoomfactor="1.25"/>
<sprite name="tank2" x="450" y="940" sprite="tank2" scroll="1.5" onBeat="true" zoomfactor="1.25"/>
<sprite name="tank4" x="1300" y="900" sprite="tank4" scroll="1.5" onBeat="true" zoomfactor="1.25"/>
<sprite name="tank5" x="1620" y="700" sprite="tank5" scroll="1.5" onBeat="true" zoomfactor="1.25"/>
<sprite name="tank3" x="1300" y="1200" sprite="tank3" scrollx="3.5" scrolly="2.5" onBeat="true" zoomfactor="1.25"/>
<sprite name="tank0" x="-500" y="650" sprite="tank0" scrollx="1.7" scrolly="1.5" type="onbeat" beatInterval="2" zoomfactor="1.25"/>
<sprite name="tank1" x="-300" y="750" sprite="tank1" scrollx="2" scrolly="0.2" type="onbeat" beatInterval="2" zoomfactor="1.25"/>
<sprite name="tank2" x="450" y="940" sprite="tank2" scroll="1.5" type="onbeat" beatInterval="2" zoomfactor="1.25"/>
<sprite name="tank4" x="1300" y="900" sprite="tank4" scroll="1.5" type="onbeat" beatInterval="2" zoomfactor="1.25"/>
<sprite name="tank5" x="1620" y="700" sprite="tank5" scroll="1.5" type="onbeat" beatInterval="2" zoomfactor="1.25"/>
<sprite name="tank3" x="1300" y="1200" sprite="tank3" scrollx="3.5" scrolly="2.5" type="onbeat" beatInterval="2" zoomfactor="1.25"/>
</high-memory>
</stage>
+1 -1
View File
@@ -2,5 +2,5 @@
<week name="RED SNOW" chars="parents-christmas,bf,gf" sprite="week5">
<song>Cocoa</song>
<song>Eggnog</song>
<song>Winter Horrorland</song>
<song hide="true">Winter Horrorland</song>
</week>
Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

@@ -0,0 +1,131 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Created with Funkin Packer v0.1.3 https://neeeoo.github.io/funkin-packer/
-->
<TextureAtlas imagePath="senpaiCrazy.png" width="294" height="443">
<SubTexture name="Senpai Pre Explosion instance 10000" x="157" y="110" width="67" height="115" frameX="-48" frameY="-32" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10001" x="120" y="228" width="69" height="112" frameX="-48" frameY="-36" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10002" x="120" y="228" width="69" height="112" frameX="-48" frameY="-36" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10003" x="227" y="108" width="62" height="120" frameX="-50" frameY="-27" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10004" x="227" y="108" width="62" height="120" frameX="-50" frameY="-27" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10005" x="227" y="108" width="62" height="120" frameX="-50" frameY="-27" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10006" x="58" y="216" width="59" height="122" frameX="-51" frameY="-24" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10007" x="58" y="216" width="59" height="122" frameX="-51" frameY="-24" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10008" x="1" y="216" width="54" height="125" frameX="-52" frameY="-24" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10009" x="192" y="231" width="50" height="97" frameX="-53" frameY="-51" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10010" x="192" y="231" width="50" height="97" frameX="-53" frameY="-51" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10011" x="1" y="344" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10012" x="1" y="344" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10013" x="1" y="344" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10014" x="1" y="344" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10015" x="1" y="344" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10016" x="1" y="344" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10017" x="245" y="231" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10018" x="245" y="231" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10019" x="1" y="344" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10020" x="1" y="344" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10021" x="1" y="344" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10022" x="1" y="344" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10023" x="1" y="344" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10024" x="1" y="344" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10025" x="192" y="331" width="48" height="97" frameX="-55" frameY="-52" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10026" x="192" y="331" width="48" height="97" frameX="-55" frameY="-52" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10027" x="1" y="344" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10028" x="1" y="344" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10029" x="1" y="344" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10030" x="1" y="344" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10031" x="245" y="231" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10032" x="1" y="344" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10033" x="1" y="344" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10034" x="1" y="344" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10035" x="192" y="331" width="48" height="97" frameX="-55" frameY="-52" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10036" x="1" y="344" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10037" x="1" y="344" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10038" x="1" y="344" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10039" x="1" y="344" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10040" x="192" y="331" width="48" height="97" frameX="-55" frameY="-52" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10041" x="192" y="331" width="48" height="97" frameX="-55" frameY="-52" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10042" x="192" y="331" width="48" height="97" frameX="-55" frameY="-52" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10043" x="192" y="331" width="48" height="97" frameX="-55" frameY="-52" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10044" x="245" y="231" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10045" x="192" y="331" width="48" height="97" frameX="-55" frameY="-52" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10046" x="1" y="344" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10047" x="1" y="344" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10048" x="245" y="231" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10049" x="192" y="331" width="48" height="97" frameX="-55" frameY="-52" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10050" x="192" y="331" width="48" height="97" frameX="-55" frameY="-52" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10051" x="245" y="231" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10052" x="192" y="331" width="48" height="97" frameX="-55" frameY="-52" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10053" x="1" y="344" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10054" x="245" y="231" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10055" x="192" y="331" width="48" height="97" frameX="-55" frameY="-52" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10056" x="1" y="344" width="48" height="98" frameX="-54" frameY="-50" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10057" x="58" y="341" width="58" height="100" frameX="-43" frameY="-52" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10058" x="1" y="110" width="153" height="103" frameX="-6" frameY="-49" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10059" x="1" y="1" width="172" height="106" frameX="-6" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10060" x="176" y="1" width="113" height="104" frameX="-8" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10061" x="1" y="110" width="153" height="103" frameX="-6" frameY="-49" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10062" x="1" y="1" width="172" height="106" frameX="-6" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10063" x="176" y="1" width="113" height="104" frameX="-8" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10064" x="1" y="110" width="153" height="103" frameX="-6" frameY="-49" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10065" x="1" y="1" width="172" height="106" frameX="-6" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10066" x="176" y="1" width="113" height="104" frameX="-8" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10067" x="1" y="110" width="153" height="103" frameX="-6" frameY="-49" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10068" x="1" y="1" width="172" height="106" frameX="-6" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10069" x="176" y="1" width="113" height="104" frameX="-8" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10070" x="1" y="110" width="153" height="103" frameX="-6" frameY="-49" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10071" x="1" y="1" width="172" height="106" frameX="-6" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10072" x="176" y="1" width="113" height="104" frameX="-8" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10073" x="1" y="110" width="153" height="103" frameX="-6" frameY="-49" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10074" x="1" y="1" width="172" height="106" frameX="-6" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10075" x="176" y="1" width="113" height="104" frameX="-8" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10076" x="1" y="110" width="153" height="103" frameX="-6" frameY="-49" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10077" x="1" y="1" width="172" height="106" frameX="-6" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10078" x="176" y="1" width="113" height="104" frameX="-8" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10079" x="1" y="110" width="153" height="103" frameX="-6" frameY="-49" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10080" x="1" y="1" width="172" height="106" frameX="-6" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10081" x="176" y="1" width="113" height="104" frameX="-8" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10082" x="1" y="110" width="153" height="103" frameX="-6" frameY="-49" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10083" x="1" y="1" width="172" height="106" frameX="-6" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10084" x="176" y="1" width="113" height="104" frameX="-8" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10085" x="1" y="110" width="153" height="103" frameX="-6" frameY="-49" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10086" x="1" y="1" width="172" height="106" frameX="-6" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10087" x="176" y="1" width="113" height="104" frameX="-8" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10088" x="1" y="110" width="153" height="103" frameX="-6" frameY="-49" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10089" x="1" y="1" width="172" height="106" frameX="-6" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10090" x="176" y="1" width="113" height="104" frameX="-8" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10091" x="1" y="110" width="153" height="103" frameX="-6" frameY="-49" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10092" x="1" y="1" width="172" height="106" frameX="-6" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10093" x="176" y="1" width="113" height="104" frameX="-8" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10094" x="1" y="110" width="153" height="103" frameX="-6" frameY="-49" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10095" x="1" y="1" width="172" height="106" frameX="-6" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10096" x="176" y="1" width="113" height="104" frameX="-8" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10097" x="1" y="110" width="153" height="103" frameX="-6" frameY="-49" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10098" x="1" y="1" width="172" height="106" frameX="-6" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10099" x="176" y="1" width="113" height="104" frameX="-8" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10100" x="1" y="110" width="153" height="103" frameX="-6" frameY="-49" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10101" x="1" y="1" width="172" height="106" frameX="-6" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10102" x="176" y="1" width="113" height="104" frameX="-8" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10103" x="1" y="110" width="153" height="103" frameX="-6" frameY="-49" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10104" x="1" y="1" width="172" height="106" frameX="-6" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10105" x="176" y="1" width="113" height="104" frameX="-8" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10106" x="1" y="110" width="153" height="103" frameX="-6" frameY="-49" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10107" x="1" y="1" width="172" height="106" frameX="-6" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10108" x="176" y="1" width="113" height="104" frameX="-8" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10109" x="1" y="110" width="153" height="103" frameX="-6" frameY="-49" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10110" x="1" y="1" width="172" height="106" frameX="-6" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10111" x="176" y="1" width="113" height="104" frameX="-8" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10112" x="1" y="110" width="153" height="103" frameX="-6" frameY="-49" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10113" x="1" y="1" width="172" height="106" frameX="-6" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10114" x="176" y="1" width="113" height="104" frameX="-8" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10115" x="1" y="110" width="153" height="103" frameX="-6" frameY="-49" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10116" x="1" y="1" width="172" height="106" frameX="-6" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10117" x="176" y="1" width="113" height="104" frameX="-8" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10118" x="1" y="110" width="153" height="103" frameX="-6" frameY="-49" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10119" x="1" y="1" width="172" height="106" frameX="-6" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10120" x="176" y="1" width="113" height="104" frameX="-8" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10121" x="1" y="110" width="153" height="103" frameX="-6" frameY="-49" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10122" x="1" y="1" width="172" height="106" frameX="-6" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10123" x="176" y="1" width="113" height="104" frameX="-8" frameY="-48" frameWidth="252" frameHeight="168"/>
<SubTexture name="Senpai Pre Explosion instance 10124" x="1" y="110" width="153" height="103" frameX="-6" frameY="-49" frameWidth="252" frameHeight="168"/>
</TextureAtlas>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 KiB

After

Width:  |  Height:  |  Size: 305 KiB

@@ -1,45 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<TextureAtlas imagePath="animatedEvilSchool.png">
<!-- Created with Adobe Animate version 20.0.0.17400 -->
<!-- http://www.adobe.com/products/animate.html -->
<SubTexture name="background 2 instance 10000" x="0" y="0" width="513" height="512"/>
<SubTexture name="background 2 instance 10001" x="523" y="0" width="513" height="512"/>
<SubTexture name="background 2 instance 10002" x="1046" y="0" width="513" height="512"/>
<SubTexture name="background 2 instance 10003" x="1569" y="0" width="513" height="512"/>
<SubTexture name="background 2 instance 10004" x="2092" y="0" width="513" height="512"/>
<SubTexture name="background 2 instance 10005" x="2615" y="0" width="513" height="512"/>
<SubTexture name="background 2 instance 10006" x="3138" y="0" width="513" height="512"/>
<SubTexture name="background 2 instance 10007" x="0" y="522" width="513" height="512"/>
<SubTexture name="background 2 instance 10008" x="523" y="522" width="513" height="512"/>
<SubTexture name="background 2 instance 10009" x="1046" y="522" width="513" height="512"/>
<SubTexture name="background 2 instance 10010" x="1569" y="522" width="513" height="512"/>
<SubTexture name="background 2 instance 10011" x="2092" y="522" width="513" height="512"/>
<SubTexture name="background 2 instance 10012" x="2615" y="522" width="513" height="512"/>
<SubTexture name="background 2 instance 10013" x="3138" y="522" width="513" height="512"/>
<SubTexture name="background 2 instance 10014" x="0" y="1044" width="513" height="512"/>
<SubTexture name="background 2 instance 10015" x="523" y="1044" width="513" height="512"/>
<SubTexture name="background 2 instance 10016" x="1046" y="1044" width="513" height="512"/>
<SubTexture name="background 2 instance 10017" x="1569" y="1044" width="513" height="512"/>
<SubTexture name="background 2 instance 10018" x="2092" y="1044" width="513" height="512"/>
<SubTexture name="background 2 instance 10019" x="2615" y="1044" width="513" height="512"/>
<SubTexture name="background 2 instance 10020" x="3138" y="1044" width="513" height="512"/>
<SubTexture name="background 2 instance 10021" x="0" y="1566" width="513" height="512"/>
<SubTexture name="background 2 instance 10022" x="523" y="1566" width="513" height="512"/>
<SubTexture name="background 2 instance 10023" x="1046" y="1566" width="513" height="512"/>
<SubTexture name="background 2 instance 10024" x="1569" y="1566" width="513" height="512"/>
<SubTexture name="background 2 instance 10025" x="2092" y="1566" width="513" height="512"/>
<SubTexture name="background 2 instance 10026" x="2615" y="1566" width="513" height="512"/>
<SubTexture name="background 2 instance 10027" x="3138" y="1566" width="513" height="512"/>
<SubTexture name="background 2 instance 10028" x="0" y="2088" width="513" height="512"/>
<SubTexture name="background 2 instance 10029" x="523" y="2088" width="513" height="512"/>
<SubTexture name="background 2 instance 10030" x="1046" y="2088" width="513" height="512"/>
<SubTexture name="background 2 instance 10031" x="1569" y="2088" width="513" height="512"/>
<SubTexture name="background 2 instance 10032" x="2092" y="2088" width="513" height="512"/>
<SubTexture name="background 2 instance 10033" x="2615" y="2088" width="513" height="512"/>
<SubTexture name="background 2 instance 10034" x="3138" y="2088" width="513" height="512"/>
<SubTexture name="background 2 instance 10035" x="0" y="2610" width="513" height="512"/>
<SubTexture name="background 2 instance 10036" x="523" y="2610" width="513" height="512"/>
<SubTexture name="background 2 instance 10037" x="1046" y="2610" width="513" height="512"/>
<SubTexture name="background 2 instance 10038" x="1569" y="2610" width="513" height="512"/>
<SubTexture name="background 2 instance 10039" x="2092" y="2610" width="513" height="512"/>
</TextureAtlas>
<?xml version="1.0" encoding="UTF-8"?>
<!--
Created with Funkin Packer v0.1.3 https://neeeoo.github.io/funkin-packer/
-->
<TextureAtlas imagePath="animatedEvilSchool.png" width="1579" height="1319">
<SubTexture name="background 2 instance 10000" x="1" y="1" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10001" x="1" y="166" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10002" x="317" y="1" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10003" x="317" y="166" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10004" x="1" y="331" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10005" x="317" y="331" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10006" x="1" y="496" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10007" x="317" y="496" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10008" x="633" y="1" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10009" x="633" y="166" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10010" x="633" y="331" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10011" x="633" y="496" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10012" x="1" y="661" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10013" x="317" y="661" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10014" x="633" y="661" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10015" x="1" y="826" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10016" x="317" y="826" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10017" x="633" y="826" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10018" x="949" y="1" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10019" x="949" y="166" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10020" x="949" y="331" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10021" x="949" y="496" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10022" x="949" y="661" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10023" x="949" y="826" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10024" x="1" y="991" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10025" x="317" y="991" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10026" x="633" y="991" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10027" x="949" y="991" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10028" x="1" y="1156" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10029" x="317" y="1156" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10030" x="633" y="1156" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10031" x="949" y="1156" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10032" x="1265" y="1" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10033" x="1265" y="166" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10034" x="1265" y="331" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10035" x="1265" y="496" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10036" x="1265" y="661" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10037" x="1265" y="826" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10038" x="1265" y="991" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
<SubTexture name="background 2 instance 10039" x="1265" y="1156" width="313" height="162" frameX="-100" frameY="-174" frameWidth="513" frameHeight="512"/>
</TextureAtlas>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 92 KiB

+66 -65
View File
@@ -1,65 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<TextureAtlas imagePath="bgFreaks.png">
<!-- Created with Adobe Animate version 20.0.0.17400 -->
<!-- http://www.adobe.com/products/animate.html -->
<SubTexture name="BG fangirls dissuaded0000" x="0" y="0" width="451" height="96"/>
<SubTexture name="BG fangirls dissuaded0001" x="0" y="0" width="451" height="96"/>
<SubTexture name="BG fangirls dissuaded0002" x="461" y="0" width="451" height="96"/>
<SubTexture name="BG fangirls dissuaded0003" x="461" y="0" width="451" height="96"/>
<SubTexture name="BG fangirls dissuaded0004" x="461" y="0" width="451" height="96"/>
<SubTexture name="BG fangirls dissuaded0005" x="461" y="0" width="451" height="96"/>
<SubTexture name="BG fangirls dissuaded0006" x="0" y="106" width="451" height="96"/>
<SubTexture name="BG fangirls dissuaded0007" x="0" y="106" width="451" height="96"/>
<SubTexture name="BG fangirls dissuaded0008" x="0" y="106" width="451" height="96"/>
<SubTexture name="BG fangirls dissuaded0009" x="0" y="106" width="451" height="96"/>
<SubTexture name="BG fangirls dissuaded0010" x="0" y="106" width="451" height="96"/>
<SubTexture name="BG fangirls dissuaded0011" x="0" y="106" width="451" height="96"/>
<SubTexture name="BG fangirls dissuaded0012" x="0" y="106" width="451" height="96"/>
<SubTexture name="BG fangirls dissuaded0013" x="0" y="106" width="451" height="96"/>
<SubTexture name="BG fangirls dissuaded0014" x="461" y="106" width="451" height="96"/>
<SubTexture name="BG fangirls dissuaded0015" x="461" y="106" width="451" height="96"/>
<SubTexture name="BG fangirls dissuaded0016" x="0" y="212" width="451" height="96"/>
<SubTexture name="BG fangirls dissuaded0017" x="0" y="212" width="451" height="96"/>
<SubTexture name="BG fangirls dissuaded0018" x="461" y="212" width="451" height="96"/>
<SubTexture name="BG fangirls dissuaded0019" x="461" y="212" width="451" height="96"/>
<SubTexture name="BG fangirls dissuaded0020" x="0" y="318" width="451" height="96"/>
<SubTexture name="BG fangirls dissuaded0021" x="0" y="318" width="451" height="96"/>
<SubTexture name="BG fangirls dissuaded0022" x="461" y="318" width="451" height="96"/>
<SubTexture name="BG fangirls dissuaded0023" x="461" y="318" width="451" height="96"/>
<SubTexture name="BG fangirls dissuaded0024" x="461" y="318" width="451" height="96"/>
<SubTexture name="BG fangirls dissuaded0025" x="461" y="318" width="451" height="96"/>
<SubTexture name="BG fangirls dissuaded0026" x="461" y="318" width="451" height="96"/>
<SubTexture name="BG fangirls dissuaded0027" x="461" y="318" width="451" height="96"/>
<SubTexture name="BG fangirls dissuaded0028" x="461" y="318" width="451" height="96"/>
<SubTexture name="BG fangirls dissuaded0029" x="461" y="318" width="451" height="96"/>
<SubTexture name="BG girls group0000" x="0" y="424" width="450" height="96"/>
<SubTexture name="BG girls group0001" x="0" y="424" width="450" height="96"/>
<SubTexture name="BG girls group0002" x="460" y="424" width="450" height="96"/>
<SubTexture name="BG girls group0003" x="460" y="424" width="450" height="96"/>
<SubTexture name="BG girls group0004" x="460" y="424" width="450" height="96"/>
<SubTexture name="BG girls group0005" x="460" y="424" width="450" height="96"/>
<SubTexture name="BG girls group0006" x="0" y="530" width="450" height="96"/>
<SubTexture name="BG girls group0007" x="0" y="530" width="450" height="96"/>
<SubTexture name="BG girls group0008" x="0" y="530" width="450" height="96"/>
<SubTexture name="BG girls group0009" x="0" y="530" width="450" height="96"/>
<SubTexture name="BG girls group0010" x="0" y="530" width="450" height="96"/>
<SubTexture name="BG girls group0011" x="0" y="530" width="450" height="96"/>
<SubTexture name="BG girls group0012" x="0" y="530" width="450" height="96"/>
<SubTexture name="BG girls group0013" x="0" y="530" width="450" height="96"/>
<SubTexture name="BG girls group0014" x="460" y="530" width="450" height="96"/>
<SubTexture name="BG girls group0015" x="460" y="530" width="450" height="96"/>
<SubTexture name="BG girls group0016" x="0" y="636" width="450" height="96"/>
<SubTexture name="BG girls group0017" x="0" y="636" width="450" height="96"/>
<SubTexture name="BG girls group0018" x="0" y="530" width="450" height="96"/>
<SubTexture name="BG girls group0019" x="0" y="530" width="450" height="96"/>
<SubTexture name="BG girls group0020" x="460" y="636" width="450" height="96"/>
<SubTexture name="BG girls group0021" x="460" y="636" width="450" height="96"/>
<SubTexture name="BG girls group0022" x="460" y="424" width="450" height="96"/>
<SubTexture name="BG girls group0023" x="460" y="424" width="450" height="96"/>
<SubTexture name="BG girls group0024" x="460" y="424" width="450" height="96"/>
<SubTexture name="BG girls group0025" x="460" y="424" width="450" height="96"/>
<SubTexture name="BG girls group0026" x="460" y="424" width="450" height="96"/>
<SubTexture name="BG girls group0027" x="460" y="424" width="450" height="96"/>
<SubTexture name="BG girls group0028" x="460" y="424" width="450" height="96"/>
<SubTexture name="BG girls group0029" x="460" y="424" width="450" height="96"/>
</TextureAtlas>
<?xml version="1.0" encoding="UTF-8"?>
<!--
Created with Funkin Packer v0.1.3 https://neeeoo.github.io/funkin-packer/
-->
<TextureAtlas imagePath="bgFreaks.png" width="873" height="590">
<SubTexture name="BG fangirls dissuaded0000" x="1" y="1" width="435" height="82" frameX="-8" frameY="-9" frameWidth="451" frameHeight="96"/>
<SubTexture name="BG fangirls dissuaded0001" x="1" y="1" width="435" height="82" frameX="-8" frameY="-9" frameWidth="451" frameHeight="96"/>
<SubTexture name="BG fangirls dissuaded0002" x="1" y="341" width="434" height="81" frameX="-8" frameY="-10" frameWidth="451" frameHeight="96"/>
<SubTexture name="BG fangirls dissuaded0003" x="1" y="341" width="434" height="81" frameX="-8" frameY="-10" frameWidth="451" frameHeight="96"/>
<SubTexture name="BG fangirls dissuaded0004" x="1" y="341" width="434" height="81" frameX="-8" frameY="-10" frameWidth="451" frameHeight="96"/>
<SubTexture name="BG fangirls dissuaded0005" x="1" y="341" width="434" height="81" frameX="-8" frameY="-10" frameWidth="451" frameHeight="96"/>
<SubTexture name="BG fangirls dissuaded0006" x="1" y="425" width="434" height="81" frameX="-8" frameY="-10" frameWidth="451" frameHeight="96"/>
<SubTexture name="BG fangirls dissuaded0007" x="1" y="425" width="434" height="81" frameX="-8" frameY="-10" frameWidth="451" frameHeight="96"/>
<SubTexture name="BG fangirls dissuaded0008" x="1" y="425" width="434" height="81" frameX="-8" frameY="-10" frameWidth="451" frameHeight="96"/>
<SubTexture name="BG fangirls dissuaded0009" x="1" y="425" width="434" height="81" frameX="-8" frameY="-10" frameWidth="451" frameHeight="96"/>
<SubTexture name="BG fangirls dissuaded0010" x="1" y="425" width="434" height="81" frameX="-8" frameY="-10" frameWidth="451" frameHeight="96"/>
<SubTexture name="BG fangirls dissuaded0011" x="1" y="425" width="434" height="81" frameX="-8" frameY="-10" frameWidth="451" frameHeight="96"/>
<SubTexture name="BG fangirls dissuaded0012" x="1" y="425" width="434" height="81" frameX="-8" frameY="-10" frameWidth="451" frameHeight="96"/>
<SubTexture name="BG fangirls dissuaded0013" x="1" y="425" width="434" height="81" frameX="-8" frameY="-10" frameWidth="451" frameHeight="96"/>
<SubTexture name="BG fangirls dissuaded0014" x="1" y="86" width="434" height="82" frameX="-8" frameY="-9" frameWidth="451" frameHeight="96"/>
<SubTexture name="BG fangirls dissuaded0015" x="1" y="86" width="434" height="82" frameX="-8" frameY="-9" frameWidth="451" frameHeight="96"/>
<SubTexture name="BG fangirls dissuaded0016" x="437" y="256" width="434" height="81" frameX="-7" frameY="-10" frameWidth="451" frameHeight="96"/>
<SubTexture name="BG fangirls dissuaded0017" x="437" y="256" width="434" height="81" frameX="-7" frameY="-10" frameWidth="451" frameHeight="96"/>
<SubTexture name="BG fangirls dissuaded0018" x="438" y="340" width="434" height="81" frameX="-8" frameY="-10" frameWidth="451" frameHeight="96"/>
<SubTexture name="BG fangirls dissuaded0019" x="438" y="340" width="434" height="81" frameX="-8" frameY="-10" frameWidth="451" frameHeight="96"/>
<SubTexture name="BG fangirls dissuaded0020" x="1" y="509" width="434" height="79" frameX="-8" frameY="-12" frameWidth="451" frameHeight="96"/>
<SubTexture name="BG fangirls dissuaded0021" x="1" y="509" width="434" height="79" frameX="-8" frameY="-12" frameWidth="451" frameHeight="96"/>
<SubTexture name="BG fangirls dissuaded0022" x="438" y="424" width="434" height="81" frameX="-8" frameY="-10" frameWidth="451" frameHeight="96"/>
<SubTexture name="BG fangirls dissuaded0023" x="438" y="424" width="434" height="81" frameX="-8" frameY="-10" frameWidth="451" frameHeight="96"/>
<SubTexture name="BG fangirls dissuaded0024" x="438" y="424" width="434" height="81" frameX="-8" frameY="-10" frameWidth="451" frameHeight="96"/>
<SubTexture name="BG fangirls dissuaded0025" x="438" y="424" width="434" height="81" frameX="-8" frameY="-10" frameWidth="451" frameHeight="96"/>
<SubTexture name="BG fangirls dissuaded0026" x="438" y="424" width="434" height="81" frameX="-8" frameY="-10" frameWidth="451" frameHeight="96"/>
<SubTexture name="BG fangirls dissuaded0027" x="438" y="424" width="434" height="81" frameX="-8" frameY="-10" frameWidth="451" frameHeight="96"/>
<SubTexture name="BG fangirls dissuaded0028" x="438" y="424" width="434" height="81" frameX="-8" frameY="-10" frameWidth="451" frameHeight="96"/>
<SubTexture name="BG fangirls dissuaded0029" x="438" y="424" width="434" height="81" frameX="-8" frameY="-10" frameWidth="451" frameHeight="96"/>
<SubTexture name="BG girls group0000" x="1" y="171" width="434" height="82" frameX="-9" frameY="-10" frameWidth="450" frameHeight="96"/>
<SubTexture name="BG girls group0001" x="1" y="171" width="434" height="82" frameX="-9" frameY="-10" frameWidth="450" frameHeight="96"/>
<SubTexture name="BG girls group0002" x="438" y="86" width="433" height="81" frameX="-9" frameY="-11" frameWidth="450" frameHeight="96"/>
<SubTexture name="BG girls group0003" x="438" y="86" width="433" height="81" frameX="-9" frameY="-11" frameWidth="450" frameHeight="96"/>
<SubTexture name="BG girls group0004" x="438" y="86" width="433" height="81" frameX="-9" frameY="-11" frameWidth="450" frameHeight="96"/>
<SubTexture name="BG girls group0005" x="438" y="86" width="433" height="81" frameX="-9" frameY="-11" frameWidth="450" frameHeight="96"/>
<SubTexture name="BG girls group0006" x="439" y="1" width="433" height="81" frameX="-9" frameY="-11" frameWidth="450" frameHeight="96"/>
<SubTexture name="BG girls group0007" x="439" y="1" width="433" height="81" frameX="-9" frameY="-11" frameWidth="450" frameHeight="96"/>
<SubTexture name="BG girls group0008" x="439" y="1" width="433" height="81" frameX="-9" frameY="-11" frameWidth="450" frameHeight="96"/>
<SubTexture name="BG girls group0009" x="439" y="1" width="433" height="81" frameX="-9" frameY="-11" frameWidth="450" frameHeight="96"/>
<SubTexture name="BG girls group0010" x="439" y="1" width="433" height="81" frameX="-9" frameY="-11" frameWidth="450" frameHeight="96"/>
<SubTexture name="BG girls group0011" x="439" y="1" width="433" height="81" frameX="-9" frameY="-11" frameWidth="450" frameHeight="96"/>
<SubTexture name="BG girls group0012" x="439" y="1" width="433" height="81" frameX="-9" frameY="-11" frameWidth="450" frameHeight="96"/>
<SubTexture name="BG girls group0013" x="439" y="1" width="433" height="81" frameX="-9" frameY="-11" frameWidth="450" frameHeight="96"/>
<SubTexture name="BG girls group0014" x="438" y="170" width="433" height="81" frameX="-8" frameY="-11" frameWidth="450" frameHeight="96"/>
<SubTexture name="BG girls group0015" x="438" y="170" width="433" height="81" frameX="-8" frameY="-11" frameWidth="450" frameHeight="96"/>
<SubTexture name="BG girls group0016" x="1" y="256" width="433" height="82" frameX="-9" frameY="-10" frameWidth="450" frameHeight="96"/>
<SubTexture name="BG girls group0017" x="1" y="256" width="433" height="82" frameX="-9" frameY="-10" frameWidth="450" frameHeight="96"/>
<SubTexture name="BG girls group0018" x="439" y="1" width="433" height="81" frameX="-9" frameY="-11" frameWidth="450" frameHeight="96"/>
<SubTexture name="BG girls group0019" x="439" y="1" width="433" height="81" frameX="-9" frameY="-11" frameWidth="450" frameHeight="96"/>
<SubTexture name="BG girls group0020" x="438" y="508" width="433" height="81" frameX="-9" frameY="-11" frameWidth="450" frameHeight="96"/>
<SubTexture name="BG girls group0021" x="438" y="508" width="433" height="81" frameX="-9" frameY="-11" frameWidth="450" frameHeight="96"/>
<SubTexture name="BG girls group0022" x="438" y="86" width="433" height="81" frameX="-9" frameY="-11" frameWidth="450" frameHeight="96"/>
<SubTexture name="BG girls group0023" x="438" y="86" width="433" height="81" frameX="-9" frameY="-11" frameWidth="450" frameHeight="96"/>
<SubTexture name="BG girls group0024" x="438" y="86" width="433" height="81" frameX="-9" frameY="-11" frameWidth="450" frameHeight="96"/>
<SubTexture name="BG girls group0025" x="438" y="86" width="433" height="81" frameX="-9" frameY="-11" frameWidth="450" frameHeight="96"/>
<SubTexture name="BG girls group0026" x="438" y="86" width="433" height="81" frameX="-9" frameY="-11" frameWidth="450" frameHeight="96"/>
<SubTexture name="BG girls group0027" x="438" y="86" width="433" height="81" frameX="-9" frameY="-11" frameWidth="450" frameHeight="96"/>
<SubTexture name="BG girls group0028" x="438" y="86" width="433" height="81" frameX="-9" frameY="-11" frameWidth="450" frameHeight="96"/>
<SubTexture name="BG girls group0029" x="438" y="86" width="433" height="81" frameX="-9" frameY="-11" frameWidth="450" frameHeight="96"/>
</TextureAtlas>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 19 KiB

+62 -61
View File
@@ -1,61 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<TextureAtlas imagePath="petals.png">
<!-- Created with Adobe Animate version 20.0.0.17400 -->
<!-- http://www.adobe.com/products/animate.html -->
<SubTexture name="PETALS ALL0000" x="0" y="0" width="311" height="161"/>
<SubTexture name="PETALS ALL0001" x="0" y="0" width="311" height="161"/>
<SubTexture name="PETALS ALL0002" x="313" y="0" width="311" height="161"/>
<SubTexture name="PETALS ALL0003" x="313" y="0" width="311" height="161"/>
<SubTexture name="PETALS ALL0004" x="626" y="0" width="311" height="161"/>
<SubTexture name="PETALS ALL0005" x="939" y="0" width="311" height="161"/>
<SubTexture name="PETALS ALL0006" x="1252" y="0" width="311" height="161"/>
<SubTexture name="PETALS ALL0007" x="1252" y="0" width="311" height="161"/>
<SubTexture name="PETALS ALL0008" x="1565" y="0" width="311" height="161"/>
<SubTexture name="PETALS ALL0009" x="0" y="163" width="311" height="161"/>
<SubTexture name="PETALS ALL0010" x="313" y="163" width="311" height="161"/>
<SubTexture name="PETALS ALL0011" x="626" y="163" width="311" height="161"/>
<SubTexture name="PETALS ALL0012" x="939" y="163" width="311" height="161"/>
<SubTexture name="PETALS ALL0013" x="1252" y="163" width="311" height="161"/>
<SubTexture name="PETALS ALL0014" x="1252" y="163" width="311" height="161"/>
<SubTexture name="PETALS ALL0015" x="1565" y="163" width="311" height="161"/>
<SubTexture name="PETALS ALL0016" x="0" y="326" width="311" height="161"/>
<SubTexture name="PETALS ALL0017" x="313" y="326" width="311" height="161"/>
<SubTexture name="PETALS ALL0018" x="313" y="326" width="311" height="161"/>
<SubTexture name="PETALS ALL0019" x="626" y="326" width="311" height="161"/>
<SubTexture name="PETALS ALL0020" x="939" y="326" width="311" height="161"/>
<SubTexture name="PETALS ALL0021" x="1252" y="326" width="311" height="161"/>
<SubTexture name="PETALS ALL0022" x="1252" y="326" width="311" height="161"/>
<SubTexture name="PETALS ALL0023" x="1565" y="326" width="311" height="161"/>
<SubTexture name="PETALS ALL0024" x="0" y="489" width="311" height="161"/>
<SubTexture name="PETALS ALL0025" x="313" y="489" width="311" height="161"/>
<SubTexture name="PETALS ALL0026" x="626" y="489" width="311" height="161"/>
<SubTexture name="PETALS ALL0027" x="939" y="489" width="311" height="161"/>
<SubTexture name="PETALS ALL0028" x="1252" y="489" width="311" height="161"/>
<SubTexture name="PETALS ALL0029" x="1565" y="489" width="311" height="161"/>
<SubTexture name="PETALS ALL0030" x="0" y="652" width="311" height="161"/>
<SubTexture name="PETALS ALL0031" x="313" y="652" width="311" height="161"/>
<SubTexture name="PETALS ALL0032" x="626" y="652" width="311" height="161"/>
<SubTexture name="PETALS ALL0033" x="939" y="652" width="311" height="161"/>
<SubTexture name="PETALS ALL0034" x="1252" y="652" width="311" height="161"/>
<SubTexture name="PETALS ALL0035" x="1252" y="652" width="311" height="161"/>
<SubTexture name="PETALS ALL0036" x="1565" y="652" width="311" height="161"/>
<SubTexture name="PETALS ALL0037" x="0" y="815" width="311" height="161"/>
<SubTexture name="PETALS ALL0038" x="313" y="815" width="311" height="161"/>
<SubTexture name="PETALS ALL0039" x="313" y="815" width="311" height="161"/>
<SubTexture name="PETALS ALL0040" x="626" y="815" width="311" height="161"/>
<SubTexture name="PETALS ALL0041" x="939" y="815" width="311" height="161"/>
<SubTexture name="PETALS ALL0042" x="939" y="815" width="311" height="161"/>
<SubTexture name="PETALS ALL0043" x="1252" y="815" width="311" height="161"/>
<SubTexture name="PETALS ALL0044" x="1565" y="815" width="311" height="161"/>
<SubTexture name="PETALS ALL0045" x="0" y="978" width="311" height="161"/>
<SubTexture name="PETALS ALL0046" x="313" y="978" width="311" height="161"/>
<SubTexture name="PETALS ALL0047" x="626" y="978" width="311" height="161"/>
<SubTexture name="PETALS ALL0048" x="939" y="978" width="311" height="161"/>
<SubTexture name="PETALS ALL0049" x="1252" y="978" width="311" height="161"/>
<SubTexture name="PETALS ALL0050" x="1565" y="978" width="311" height="161"/>
<SubTexture name="PETALS ALL0051" x="0" y="1141" width="311" height="161"/>
<SubTexture name="PETALS ALL0052" x="313" y="1141" width="311" height="161"/>
<SubTexture name="PETALS ALL0053" x="313" y="1141" width="311" height="161"/>
<SubTexture name="PETALS ALL0054" x="626" y="1141" width="311" height="161"/>
<SubTexture name="PETALS ALL0055" x="0" y="0" width="311" height="161"/>
</TextureAtlas>
<?xml version="1.0" encoding="UTF-8"?>
<!--
Created with Funkin Packer v0.1.3 https://neeeoo.github.io/funkin-packer/
-->
<TextureAtlas imagePath="petals.png" width="921" height="821">
<SubTexture name="PETALS ALL0000" x="405" y="522" width="125" height="50" frameX="-107" frameY="-13" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0001" x="405" y="522" width="125" height="50" frameX="-107" frameY="-13" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0002" x="400" y="684" width="123" height="56" frameX="-109" frameY="-13" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0003" x="400" y="684" width="123" height="56" frameX="-109" frameY="-13" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0004" x="248" y="749" width="118" height="56" frameX="-109" frameY="-13" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0005" x="523" y="749" width="118" height="56" frameX="-109" frameY="-13" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0006" x="1" y="757" width="121" height="63" frameX="-106" frameY="-13" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0007" x="1" y="757" width="121" height="63" frameX="-106" frameY="-13" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0008" x="644" y="749" width="113" height="63" frameX="-106" frameY="-13" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0009" x="807" y="1" width="113" height="58" frameX="-106" frameY="-18" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0010" x="125" y="757" width="120" height="63" frameX="-99" frameY="-18" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0011" x="400" y="743" width="120" height="63" frameX="-99" frameY="-18" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0012" x="807" y="62" width="111" height="63" frameX="-99" frameY="-18" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0013" x="526" y="684" width="123" height="62" frameX="-87" frameY="-25" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0014" x="526" y="684" width="123" height="62" frameX="-87" frameY="-25" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0015" x="652" y="637" width="123" height="62" frameX="-87" frameY="-25" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0016" x="1" y="684" width="130" height="70" frameX="-71" frameY="-25" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0017" x="134" y="684" width="130" height="62" frameX="-71" frameY="-33" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0018" x="134" y="684" width="130" height="62" frameX="-71" frameY="-33" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0019" x="267" y="684" width="130" height="62" frameX="-71" frameY="-33" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0020" x="622" y="225" width="149" height="98" frameX="-67" frameY="-5" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0021" x="612" y="326" width="149" height="98" frameX="-67" frameY="-5" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0022" x="612" y="326" width="149" height="98" frameX="-67" frameY="-5" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0023" x="612" y="427" width="149" height="98" frameX="-67" frameY="-5" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0024" x="553" y="528" width="139" height="106" frameX="-64" frameY="-5" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0025" x="1" y="575" width="181" height="106" frameX="-22" frameY="-5" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0026" x="185" y="575" width="181" height="106" frameX="-22" frameY="-5" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0027" x="369" y="575" width="181" height="106" frameX="-22" frameY="-5" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0028" x="623" y="1" width="181" height="109" frameX="-22" frameY="-8" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0029" x="623" y="113" width="180" height="109" frameX="-18" frameY="-8" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0030" x="414" y="320" width="195" height="109" frameX="-18" frameY="-8" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0031" x="405" y="432" width="195" height="87" frameX="-18" frameY="-8" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0032" x="414" y="239" width="199" height="78" frameX="-18" frameY="-17" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0033" x="1" y="207" width="205" height="91" frameX="-12" frameY="-17" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0034" x="210" y="1" width="205" height="89" frameX="-12" frameY="-19" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0035" x="210" y="1" width="205" height="89" frameX="-12" frameY="-19" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0036" x="207" y="343" width="199" height="85" frameX="-12" frameY="-23" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0037" x="1" y="1" width="206" height="100" frameX="-5" frameY="-23" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0038" x="1" y="104" width="206" height="100" frameX="-5" frameY="-23" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0039" x="1" y="104" width="206" height="100" frameX="-5" frameY="-23" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0040" x="418" y="131" width="201" height="105" frameX="-5" frameY="-18" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0041" x="210" y="93" width="205" height="117" frameX="-1" frameY="-18" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0042" x="210" y="93" width="205" height="117" frameX="-1" frameY="-18" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0043" x="209" y="213" width="202" height="127" frameX="-1" frameY="-8" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0044" x="418" y="1" width="202" height="127" frameX="-1" frameY="-8" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0045" x="1" y="301" width="203" height="133" frameX="-0" frameY="-8" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0046" x="1" y="437" width="199" height="135" frameX="-0" frameY="-6" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0047" x="203" y="437" width="199" height="135" frameX="-0" frameY="-6" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0048" x="760" y="702" width="104" height="108" frameX="-95" frameY="-6" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0049" x="806" y="128" width="104" height="89" frameX="-95" frameY="-25" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0050" x="764" y="428" width="97" height="89" frameX="-95" frameY="-25" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0051" x="788" y="326" width="97" height="99" frameX="-95" frameY="-15" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0052" x="695" y="528" width="90" height="103" frameX="-102" frameY="-15" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0053" x="695" y="528" width="90" height="103" frameX="-102" frameY="-15" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0054" x="806" y="220" width="79" height="103" frameX="-102" frameY="-15" frameWidth="311" frameHeight="161"/>
<SubTexture name="PETALS ALL0055" x="405" y="522" width="125" height="50" frameX="-107" frameY="-13" frameWidth="311" frameHeight="161"/>
</TextureAtlas>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 61 KiB

-20
View File
@@ -1,20 +0,0 @@
trees_0 = 0 0 512 512
trees_1 = 513 0 512 512
trees_2 = 1539 1026 512 512
trees_3 = 2052 513 512 512
trees_4 = 2565 0 512 512
trees_5 = 3078 0 512 512
trees_6 = 2565 513 512 512
trees_7 = 2052 1026 512 512
trees_8 = 2565 1026 512 512
trees_9 = 3078 513 512 512
trees_10 = 1026 0 512 512
trees_11 = 0 513 512 512
trees_12 = 513 513 512 512
trees_13 = 0 1026 512 512
trees_14 = 513 1026 512 512
trees_15 = 1026 513 512 512
trees_16 = 1026 1026 512 512
trees_17 = 1539 0 512 512
trees_18 = 1539 513 512 512
trees_19 = 2052 0 512 512
+26
View File
@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Created with Funkin Packer v0.1.3 https://neeeoo.github.io/funkin-packer/
-->
<TextureAtlas imagePath="weebTrees.png" width="630" height="679">
<SubTexture name="trees0000" x="1" y="86" width="312" height="82" frameX="-101" frameY="-176" frameWidth="512" frameHeight="512"/>
<SubTexture name="trees0001" x="1" y="171" width="312" height="82" frameX="-101" frameY="-176" frameWidth="512" frameHeight="512"/>
<SubTexture name="trees0002" x="1" y="256" width="312" height="82" frameX="-101" frameY="-176" frameWidth="512" frameHeight="512"/>
<SubTexture name="trees0003" x="1" y="1" width="313" height="82" frameX="-100" frameY="-176" frameWidth="512" frameHeight="512"/>
<SubTexture name="trees0004" x="317" y="1" width="312" height="82" frameX="-100" frameY="-176" frameWidth="512" frameHeight="512"/>
<SubTexture name="trees0005" x="316" y="86" width="312" height="82" frameX="-100" frameY="-176" frameWidth="512" frameHeight="512"/>
<SubTexture name="trees0006" x="316" y="171" width="312" height="82" frameX="-100" frameY="-176" frameWidth="512" frameHeight="512"/>
<SubTexture name="trees0007" x="316" y="256" width="312" height="82" frameX="-100" frameY="-176" frameWidth="512" frameHeight="512"/>
<SubTexture name="trees0008" x="1" y="341" width="312" height="82" frameX="-100" frameY="-176" frameWidth="512" frameHeight="512"/>
<SubTexture name="trees0009" x="316" y="341" width="312" height="82" frameX="-100" frameY="-176" frameWidth="512" frameHeight="512"/>
<SubTexture name="trees0010" x="1" y="426" width="312" height="82" frameX="-100" frameY="-176" frameWidth="512" frameHeight="512"/>
<SubTexture name="trees0011" x="1" y="596" width="311" height="82" frameX="-100" frameY="-176" frameWidth="512" frameHeight="512"/>
<SubTexture name="trees0012" x="1" y="596" width="311" height="82" frameX="-100" frameY="-176" frameWidth="512" frameHeight="512"/>
<SubTexture name="trees0013" x="1" y="596" width="311" height="82" frameX="-100" frameY="-176" frameWidth="512" frameHeight="512"/>
<SubTexture name="trees0014" x="1" y="596" width="311" height="82" frameX="-100" frameY="-176" frameWidth="512" frameHeight="512"/>
<SubTexture name="trees0015" x="1" y="596" width="311" height="82" frameX="-100" frameY="-176" frameWidth="512" frameHeight="512"/>
<SubTexture name="trees0016" x="315" y="596" width="311" height="82" frameX="-100" frameY="-176" frameWidth="512" frameHeight="512"/>
<SubTexture name="trees0017" x="316" y="426" width="312" height="82" frameX="-100" frameY="-176" frameWidth="512" frameHeight="512"/>
<SubTexture name="trees0018" x="1" y="511" width="312" height="82" frameX="-100" frameY="-176" frameWidth="512" frameHeight="512"/>
<SubTexture name="trees0019" x="316" y="511" width="312" height="82" frameX="-100" frameY="-176" frameWidth="512" frameHeight="512"/>
</TextureAtlas>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1015 KiB

After

Width:  |  Height:  |  Size: 481 KiB

+9 -9
View File
@@ -14,14 +14,14 @@
<SubTexture name="John Shot 10009" x="3519" y="2571" width="521" height="466" frameX="-125" frameY="-156" frameWidth="1044" frameHeight="622"/>
<SubTexture name="John Shot 10010" x="3519" y="2571" width="521" height="466" frameX="-125" frameY="-156" frameWidth="1044" frameHeight="622"/>
<SubTexture name="John Shot 10011" x="2626" y="2720" width="459" height="490" frameX="-187" frameY="-132" frameWidth="1044" frameHeight="622"/>
<SubTexture name="John Shot 10012" x="0" y="0" width="0" height="0" frameX="-49" frameY="-265" frameWidth="1044" frameHeight="622"/>
<SubTexture name="John Shot 10012" x="0" y="0" width="1" height="1" frameX="-49" frameY="-265" frameWidth="1044" frameHeight="622"/>
<SubTexture name="John Shot 10013" x="2626" y="2720" width="459" height="490" frameX="-187" frameY="-132" frameWidth="1044" frameHeight="622"/>
<SubTexture name="John Shot 10014" x="0" y="0" width="0" height="0" frameX="-49" frameY="-265" frameWidth="1044" frameHeight="622"/>
<SubTexture name="John Shot 10014" x="0" y="0" width="1" height="1" frameX="-49" frameY="-265" frameWidth="1044" frameHeight="622"/>
<SubTexture name="John Shot 10015" x="2626" y="2720" width="459" height="490" frameX="-187" frameY="-132" frameWidth="1044" frameHeight="622"/>
<SubTexture name="John Shot 10016" x="0" y="0" width="0" height="0" frameX="-49" frameY="-265" frameWidth="1044" frameHeight="622"/>
<SubTexture name="John Shot 10016" x="0" y="0" width="1" height="1" frameX="-49" frameY="-265" frameWidth="1044" frameHeight="622"/>
<SubTexture name="John Shot 10017" x="2626" y="2720" width="459" height="490" frameX="-187" frameY="-132" frameWidth="1044" frameHeight="622"/>
<SubTexture name="John Shot 10018" x="0" y="0" width="0" height="0" frameX="-49" frameY="-265" frameWidth="1044" frameHeight="622"/>
<SubTexture name="John Shot 10019" x="0" y="0" width="0" height="0" frameX="-49" frameY="-265" frameWidth="1044" frameHeight="622"/>
<SubTexture name="John Shot 10018" x="0" y="0" width="1" height="1" frameX="-49" frameY="-265" frameWidth="1044" frameHeight="622"/>
<SubTexture name="John Shot 10019" x="0" y="0" width="1" height="1" frameX="-49" frameY="-265" frameWidth="1044" frameHeight="622"/>
<SubTexture name="John Shot 20000" x="0" y="2664" width="597" height="429" frameX="-243" frameY="-212" frameWidth="1221" frameHeight="828"/>
<SubTexture name="John Shot 20001" x="0" y="1518" width="885" height="626" frameX="-215" frameY="-48" frameWidth="1221" frameHeight="828"/>
<SubTexture name="John Shot 20002" x="889" y="1556" width="915" height="592" frameX="-185" frameY="-82" frameWidth="1221" frameHeight="828"/>
@@ -34,13 +34,13 @@
<SubTexture name="John Shot 20009" x="754" y="2152" width="768" height="491" frameX="-13" frameY="-179" frameWidth="1221" frameHeight="828"/>
<SubTexture name="John Shot 20010" x="754" y="2152" width="768" height="491" frameX="-13" frameY="-179" frameWidth="1221" frameHeight="828"/>
<SubTexture name="John Shot 20011" x="754" y="2647" width="781" height="461" frameX="0" frameY="-209" frameWidth="1221" frameHeight="828"/>
<SubTexture name="John Shot 20012" x="0" y="0" width="0" height="0" frameX="-123" frameY="-327" frameWidth="1221" frameHeight="828"/>
<SubTexture name="John Shot 20012" x="0" y="0" width="1" height="1" frameX="-123" frameY="-327" frameWidth="1221" frameHeight="828"/>
<SubTexture name="John Shot 20013" x="754" y="2647" width="781" height="461" frameX="0" frameY="-209" frameWidth="1221" frameHeight="828"/>
<SubTexture name="John Shot 20014" x="0" y="0" width="0" height="0" frameX="-123" frameY="-327" frameWidth="1221" frameHeight="828"/>
<SubTexture name="John Shot 20014" x="0" y="0" width="1" height="1" frameX="-123" frameY="-327" frameWidth="1221" frameHeight="828"/>
<SubTexture name="John Shot 20015" x="754" y="2647" width="781" height="461" frameX="0" frameY="-209" frameWidth="1221" frameHeight="828"/>
<SubTexture name="John Shot 20016" x="0" y="0" width="0" height="0" frameX="-123" frameY="-327" frameWidth="1221" frameHeight="828"/>
<SubTexture name="John Shot 20016" x="0" y="0" width="1" height="1" frameX="-123" frameY="-327" frameWidth="1221" frameHeight="828"/>
<SubTexture name="John Shot 20017" x="754" y="2647" width="781" height="461" frameX="0" frameY="-209" frameWidth="1221" frameHeight="828"/>
<SubTexture name="John Shot 20018" x="0" y="0" width="0" height="0" frameX="-123" frameY="-327" frameWidth="1221" frameHeight="828"/>
<SubTexture name="John Shot 20018" x="0" y="0" width="1" height="1" frameX="-123" frameY="-327" frameWidth="1221" frameHeight="828"/>
<SubTexture name="tankman running0000" x="2045" y="2744" width="503" height="412" frameX="0" frameY="-10" frameWidth="505" frameHeight="478"/>
<SubTexture name="tankman running0001" x="2045" y="2744" width="503" height="412" frameX="0" frameY="-10" frameWidth="505" frameHeight="478"/>
<SubTexture name="tankman running0002" x="2045" y="2744" width="503" height="412" frameX="0" frameY="-10" frameWidth="505" frameHeight="478"/>
+17
View File
@@ -0,0 +1,17 @@
#pragma header
uniform vec2 redOff;
uniform vec2 greenOff;
uniform vec2 blueOff;
void main()
{
vec2 uv = getCamPos(openfl_TextureCoordv);
vec4 col;
col.r = textureCam(bitmap, uv + redOff).r;
col.g = textureCam(bitmap, uv + greenOff).g;
col.b = textureCam(bitmap, uv + blueOff).b;
col.a = texture2D(bitmap, openfl_TextureCoordv).a;
gl_FragColor = col;
}
+15
View File
@@ -0,0 +1,15 @@
#pragma header
uniform vec3 color;
uniform float amount;
uniform float strength;
void main() {
vec2 uv = getCamPos(openfl_TextureCoordv);
vec3 col = pow(textureCam(bitmap, uv).rgb, vec3(1.0 / strength));
float vignette = mix(1.0, 1.0 - amount, distance(uv, vec2(0.5)));
col = pow(mix(col * color, col, vignette), vec3(strength));
gl_FragColor = vec4(col, 1.0);
}
-8
View File
@@ -53,12 +53,4 @@ function focusOn(char) {
var camPos = char.getCameraPosition();
game.camFollow.setPosition(camPos.x, camPos.y);
camPos.put();
}
function update(elapsed:Float) {
lipSync(tankTalk);
}
function lipSync(sound:FlxSound) {
tankman.animateAtlas.anim.curFrame = Std.int(tankman.animateAtlas.anim.length / (sound.length-1) * sound.time);
}
+71
View File
@@ -0,0 +1,71 @@
static var roses_shouldPlayOnThorns = false;
var self = this;
__script__.setParent(PlayState.instance);
function create() {
var red:FlxSprite;
red = new FlxSprite().makeSolid(FlxG.width + 100, FlxG.height + 100, 0xFFff1b31);
red.screenCenter();
red.scrollFactor.set();
red.alpha = 0;
add(red);
// reorder dad
remove(dad);
insert(PlayState.instance.members.indexOf(red) + 1, dad);
playDadUpdate = true;
dad.animation.finishCallback = (name:String) -> {
if(name == "idle") {
dad.animation.finishCallback = null;
playDadUpdate = false;
new FlxTimer().start(0.3, function(swagTimer:FlxTimer) {
red.alpha += 0.15;
camHUD.alpha -= 0.15;
var c = FlxMath.lerp(255, 0, red.alpha);
dad.color = FlxColor.fromRGB(c, c, c, 255);
if(red.alpha < 1) swagTimer.reset();
else {
if (Options.gameplayShaders) {
aberration = new CustomShader('chromaticAberration');
camGame.addShader(aberration);
change = true;
}
FlxG.camera.followLerp = 0;
FlxTween.tween(camGame.scroll, {x: -366, y: 192}, 3, {
ease: FlxEase.cubeInOut,
onComplete: (_) -> {
roses_shouldPlayOnThorns = true;
self.close();
}
});
}
});
}
}
if(dad.animation.curAnim.name != "idle")
dad.playAnim("idle", true);
else if(dad.animation.curAnim.finished)
dad.animation.finishCallback("idle");
}
var playDadUpdate = false;
function postUpdate(elapsed) {
if(playDadUpdate)
dad.update(elapsed);
}
var change:Bool = false;
var aberration:CustomShader = null;
function update(elapsed:Float) {
if(change && intens < (Options.week6PixelPerfect ? 0.005 : 0.005)) setGeneralIntensity(intens + 0.00001);
}
var intens:Float = 0;
function setGeneralIntensity(val:Float) {
intens = val;
aberration.redOff = [intens, 0];
aberration.blueOff = [-intens, 0];
}
+37 -10
View File
@@ -3,7 +3,7 @@ import funkin.system.FunkinSprite;
import funkin.options.Options;
var tankman, pico:FunkinSprite;
var gf:Character;
var bf, gf:Character;
var stressCutscene:FlxSound;
var step:Int = 0;
@@ -13,10 +13,15 @@ function create() {
game.persistentUpdate = true;
game.gf.visible = false;
gf = new Character(game.gf.x, game.gf.y, "gf-tankmen");
gf = new Character(game.gf.x + game.gf.globalOffset.x - 115, game.gf.y + game.gf.globalOffset.y + 85, "gf-tankmen");
gf.scrollFactor.set(0.95, 0.95);
gf.playAnim("dance-cutscene");
game.insert(game.members.indexOf(game.gf), gf);
game.insert(game.members.indexOf(game.gf) + 1, gf);
game.boyfriend.visible = false;
bf = new Character(game.boyfriend.x + game.boyfriend.globalOffset.x, game.boyfriend.y + game.boyfriend.globalOffset.y - 350, "boyfriend", true);
bf.scrollFactor.set(0.95, 0.95);
game.insert(game.members.indexOf(game.boyfriend) + 1, bf);
stressCutscene = FlxG.sound.load(Paths.sound(Options.naughtyness ? 'cutscenes/tank/stress' : 'cutscenes/tank/stress-censor'));
@@ -46,14 +51,13 @@ function create() {
pico.scrollFactor.set(0.95, 0.95);
pico.playAnim("idle");
pico.visible = false;
game.insert(game.members.indexOf(game.gf), pico);
game.insert(game.members.indexOf(game.dad), tankman);
game.insert(game.members.indexOf(game.gf) + 1, pico);
game.insert(game.members.indexOf(game.dad) + 1, tankman);
game.dad.visible = false;
focusOn(game.dad);
}
function update(elapsed) {
if (FlxG.keys.justPressed.F5)
FlxG.resetState();
@@ -78,6 +82,14 @@ function update(elapsed) {
FlxG.camera.zoom = 0.8;
step = 2;
pico.playAnim('saves', true);
game.remove(bf);
bf.destroy();
game.boyfriend.visible = true;
game.boyfriend.playAnim('bfCatch');
game.boyfriend.animation.finishCallback = function(anim:String) {
game.boyfriend.dance();
game.boyfriend.animation.finishCallback = null;
};
}
case 2:
if (stressCutscene.time > 19600) {
@@ -93,8 +105,22 @@ function update(elapsed) {
}
case 4:
lipSync(tankman, 19500, stressCutscene.length);
if (pico.isAnimFinished() && pico.getAnimName() == "saves")
pico.playAnim("idle");
pico.animation.finishCallback = pico.playAnim("idle");
if(stressCutscene.time > 31500) {
focusOn(game.boyfriend, true);
FlxG.camera.zoom = game.defaultCamZoom * 1.4;
FlxTween.tween(FlxG.camera, {zoom: FlxG.camera.zoom + 0.1}, 0.5, {ease: FlxEase.elasticOut});
game.boyfriend.playAnim('singUPmiss');
game.boyfriend.animation.finishCallback = function(anim:String)
{
FlxG.camera.zoom /= 1.4;
focusOn(game.dad, true);
game.boyfriend.dance();
game.boyfriend.animation.finishCallback = null;
};
step = 5;
}
}
}
@@ -102,8 +128,9 @@ function lipSync(char:FunkinSprite, begin:Float, end:Float) {
char.animateAtlas.anim.curFrame = Std.int(FlxMath.remapToRange(stressCutscene.time, begin, end, 0, char.animateAtlas.anim.length-1));
}
function focusOn(char) {
function focusOn(char, snap:Bool = false) {
var camPos = char.getCameraPosition();
game.camFollow.setPosition(camPos.x, camPos.y);
if(snap) FlxG.camera.snapToTarget();
camPos.put();
}
+157
View File
@@ -0,0 +1,157 @@
import flixel.FlxSprite;
var tankmanRun:Array<TankmenBG> = [];
var grpTankmanRun:FlxTypedGroup<FlxSprite> = [];
var spawnTimes = []; // [[time, direction]]
var tankmanPool = [];
function recycleTankman() {
if(tankmanPool.length == 0) {
var a = new TankmenBG();
a.self = a;
a.fuckingnewfuckingnew();
return a;
} else {
return tankmanPool.shift(); // can be pop but it causes it to be less random
}
}
function getTankman(data:Array<Float>) {
var tankman:TankmenBG = recycleTankman();
tankman.strumTime = data[0];
tankman.resetShit(500, 200 + FlxG.random.int(50, 100), data[1] < 2);
return tankman;
}
function postCreate() {
grpTankmanRun = new FlxTypedGroup();
insert(members.indexOf(gf) - 1, grpTankmanRun);
if(inCutscene) grpTankmanRun.visible = false;
/*var tempTankman:TankmenBG = recycleTankman();
tempTankman.strumTime = 10;
tempTankman.resetShit(20, 600, true);
tankmanRun.push(tempTankman);
grpTankmanRun.add(tempTankman.sprite);*/
graphicCache.cache(Paths.image('stages/tank/tankmanKilled1'));
for (note in strumLines.members[2].notes.members) {
if (FlxG.random.bool(16)) {
spawnTimes.push([note.strumTime, note.noteData]);
}
}
//spawnTimes.reverse(); // no need to reverse it since the notes are already reversed
}
function onStartCountdown() {
if(PlayState.instance.seenCutscene) grpTankmanRun.visible = true;
}
function spawnTankmen() {
var time = Conductor.songPosition;
//trace(spawnTimes);
while(spawnTimes.length > 0 && spawnTimes[spawnTimes.length-1][0] - 1500 < time) {
var tankmen = getTankman(spawnTimes.pop());
//trace("Spawning Tankman", tankmen.sprite.offset, tankmen.goingRight);
tankmanRun.push(tankmen);
grpTankmanRun.add(tankmen.sprite);
}
}
function update(elapsed) {
spawnTankmen();
var length = tankmanRun.length;
for(i in 0...length) {
var reverseIndex = length - i - 1;
var tankmen = tankmanRun[reverseIndex];
tankmen.update(elapsed);
}
}
class TankmenBG
{
var strumTime = 0;
var goingRight = false;
var tankSpeed = 0.7;
var endingOffset = null;
var sprite = null;
var self = null;
var killed = false;
var fuckingnewfuckingnew = function()
{
this.sprite = new FlxSprite();
var sprite = this.sprite;
sprite.frames = Paths.getSparrowAtlas('stages/tank/tankmanKilled1');
sprite.antialiasing = true;
sprite.animation.addByPrefix('run', 'tankman running', 24, true);
sprite.animation.play('run');
sprite.updateHitbox();
sprite.setGraphicSize(Std.int(sprite.width * 0.8));
sprite.updateHitbox();
}
var resetShit = function(x, y, isGoingRight)
{
var sprite = this.sprite;
sprite.revive();
sprite.setPosition(x, y);
sprite.offset.set(0, 0);
goingRight = isGoingRight;
endingOffset = FlxG.random.float(50, 200);
tankSpeed = FlxG.random.float(0.6, 1);
sprite.animation.remove("shot");
sprite.animation.addByPrefix('shot', 'John Shot ' + FlxG.random.int(1, 2), 24, false);
sprite.animation.play("run");
sprite.animation.curAnim.curFrame = FlxG.random.int(0, sprite.animation.curAnim.numFrames - 1);
killed = false;
sprite.flipX = goingRight;
}
var update = function(elapsed)
{
var sprite = this.sprite;
sprite.visible = !(sprite.x >= FlxG.width * 1.5 || sprite.x <= FlxG.width * -0.5);
if (sprite.animation.curAnim.name == 'run')
{
var endDirection:Float = (FlxG.width * 0.74) + endingOffset;
if (goingRight) {
endDirection = (FlxG.width * 0.02) - endingOffset;
sprite.x = (endDirection + (Conductor.songPosition - strumTime) * tankSpeed);
}
else sprite.x = (endDirection - (Conductor.songPosition - strumTime) * tankSpeed);
}
if (Conductor.songPosition > strumTime)
{
sprite.animation.play('shot');
sprite.animation.finishCallback = function(_) {
killed = true;
grpTankmanRun.remove(sprite, true);
sprite.kill();
tankmanPool.push(self);
tankmanRun.remove(self);
}
if (goingRight)
{
sprite.offset.y = 200;
sprite.offset.x = 300;
}
}
}
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+89
View File
@@ -0,0 +1,89 @@
import flixel.addons.util.FlxSimplex;
static var roses_shouldPlayOnThorns = false;
var self = this;
__script__.setParent(PlayState.instance);
var scream:FlxSound;
var senpaiEvil:FlxSprite;
var dfx = 0;
var dfy = 0;
function create() {
// Cutscene stuff
if(!roses_shouldPlayOnThorns) {
disableScript();
self.close();
return;
}
roses_shouldPlayOnThorns = false;
camHUD.visible = false;
var red:FlxSprite = new FlxSprite().makeSolid(FlxG.width + 100, FlxG.height + 100, 0xFFff1b31);
red.screenCenter();
red.scrollFactor.set();
add(red);
senpaiEvil = new FlxSprite();
senpaiEvil.frames = Paths.getSparrowAtlas('game/cutscenes/weeb/senpaiCrazy');
senpaiEvil.animation.addByPrefix('idle', 'Senpai Pre Explosion', 24, false);
senpaiEvil.animation.play('idle');
senpaiEvil.setGraphicSize(Std.int(senpaiEvil.width * daPixelZoom));
senpaiEvil.scrollFactor.set();
senpaiEvil.updateHitbox();
senpaiEvil.screenCenter();
senpaiEvil.x += daPixelZoom * 51;
dfx = senpaiEvil.x;
dfy = senpaiEvil.y;
add(senpaiEvil);
var white:FlxSprite = new FlxSprite().makeSolid(FlxG.width + 100, FlxG.height + 100, FlxColor.WHITE);
white.screenCenter();
white.scrollFactor.set();
white.alpha = 0;
add(white);
new FlxTimer().start(3.2, function(deadTime:FlxTimer)
{
FlxG.camera.fade(FlxColor.WHITE, 1.6, false, function() {
remove(senpaiEvil, true);
senpaiEvil.destroy();
remove(red, true);
red.destroy();
white.alpha = 1;
});
});
scream = FlxG.sound.play(Paths.sound('cutscenes/weeb/Senpai_Dies'), 1, false, null, true, function()
{
new FlxTimer().start(0.2, function(swagTimer:FlxTimer) {
white.alpha -= 0.15;
if(white.alpha > 0) swagTimer.reset();
else {
remove(white, true);
white.destroy();
camHUD.visible = true;
self.close();
}
});
FlxG.camera.fade(FlxColor.WHITE, 0.0001, true);
});
}
var sVal = 0;
var seed = FlxG.random.float(-4000, 4000);
var sShkv = 50; // shake range
var sSpeed = 240;
function update(elapsed:Float) {
if(scream?.time > 2350) {
sVal += sSpeed * elapsed;
var vx = sShkv * FlxSimplex.simplexOctaves(sVal, seed, 0.07, 0.25, 4);
var vy = sShkv * FlxSimplex.simplexOctaves(sVal + 500, seed, 0.07, 0.25, 4);
senpaiEvil.setPosition(dfx + vx, dfy + vy);
}
}
+37
View File
@@ -0,0 +1,37 @@
var aberration:CustomShader = null;
function create() {
if(!Options.gameplayShaders) return;
aberration = new CustomShader('chromaticAberration');
setGeneralIntensity(Options.week6PixelPerfect ? 0.0005 : 0.005);
camGame.addShader(aberration);
}
var intens:Float = 0;
function setGeneralIntensity(val:Float) {
intens = val;
aberration.redOff = [intens, 0];
aberration.blueOff = [-intens, 0];
}
var canBump:Bool = false;
function aberrationCoolThing() {
canBump = !canBump;
if(!canBump) {
if(Options.gameplayShaders) setGeneralIntensity(Options.week6PixelPerfect ? 0.0005 : 0.005); // Just to make sure if anything goes wrong
maxCamZoom = 1.35;
} else maxCamZoom = 0;
}
function update(elapsed:Float) {
if(Options.gameplayShaders && canBump && intens > (Options.week6PixelPerfect ? 0.0005 : 0.005)) setGeneralIntensity(intens - (Options.week6PixelPerfect ? 0.0001 : 0.001));
}
function beatHit(curBeat:Float) {
if(canBump && curBeat % 2 != 0) {
if(Options.gameplayShaders) setGeneralIntensity(Options.week6PixelPerfect ? 0.005 : 0.05);
if(Options.camZoomOnBeat) {
FlxG.camera.zoom += 0.015 * camZoomingStrength;
camHUD.zoom += 0.03 * camZoomingStrength;
}
}
}
-9
View File
@@ -64,13 +64,4 @@ function focusOn(char) {
var camPos = char.getCameraPosition();
game.camFollow.setPosition(camPos.x, camPos.y);
camPos.put();
}
function update(elapsed:Float) {
if (tankTalk1.playing) lipSync(tankTalk1);
if (tankTalk2.playing) lipSync(tankTalk2);
}
function lipSync(sound:FlxSound) {
tankman.animateAtlas.anim.curFrame = Std.int(tankman.animateAtlas.anim.length / (sound.length-1) * sound.time);
}
@@ -0,0 +1,17 @@
var self = this;
__script__.setParent(PlayState.instance);
function create() {
FlxG.sound.play(Paths.sound('Lights_Turn_On'));
camFollow.setPosition(500, -2050);
FlxG.camera.focusOn(camFollow.getPosition());
FlxG.camera.zoom = 1.5;
FlxTween.tween(FlxG.camera, {zoom: defaultCamZoom}, 2.5, {
ease: FlxEase.quadInOut, startDelay: 0.8,
onComplete: function(twn:FlxTween)
{
self.close();
}
});
}
@@ -0,0 +1,12 @@
function beatHit(curBeat:Int) {
switch(curBeat) {
case 120:
camZoomingInterval = 2;
case 153:
camZoomingInterval = 4;
case 216:
camZoomingInterval = 2;
case 230:
camZoomingInterval = 4;
}
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+13 -5
View File
@@ -1,5 +1,6 @@
package funkin.backend;
import funkin.backend.utils.XMLUtil.BeatAnim;
import funkin.backend.utils.XMLUtil.AnimData;
import funkin.backend.utils.XMLUtil.IXMLEvents;
import flixel.system.FlxAssets.FlxGraphicAsset;
@@ -34,13 +35,17 @@ abstract XMLAnimType(Int)
class FunkinSprite extends FlxSkewedSprite implements IBeatReceiver implements IOffsetCompatible implements IXMLEvents
{
public var spriteAnimType:XMLAnimType = NONE;
public var beatAnims:Array<String> = [];
public var beatAnims:Array<BeatAnim> = [];
public var name:String;
public var zoomFactor:Float = 1;
public var initialZoom:Float = 1;
public var debugMode:Bool = false;
public var animDatas:Map<String, AnimData> = [];
public var beatInterval:Int = 1;
public var beatOffset:Int = 0;
public var skipNegativeBeats:Bool = false;
public var animateAtlas:FlxAnimate;
@:noCompletion public var atlasPlayingAnim:String;
@:noCompletion public var atlasPath:String;
@@ -108,13 +113,16 @@ class FunkinSprite extends FlxSkewedSprite implements IBeatReceiver implements I
moves = true;
}
private var countedBeat = 0;
public function beatHit(curBeat:Int)
{
if (beatAnims.length > 0)
if (beatAnims.length > 0 && (curBeat + beatOffset) % beatInterval == 0)
{
var anim = beatAnims[FlxMath.wrap(curBeat, 0, beatAnims.length - 1)];
if (anim != null && anim != "null" && anim != "none")
playAnim(anim);
if(skipNegativeBeats && curBeat < 0) return;
// TODO: find a solution without countedBeat
var anim = beatAnims[FlxMath.wrap(countedBeat++, 0, beatAnims.length - 1)];
if (anim.name != null && anim.name != "null" && anim.name != "none")
playAnim(anim.name, anim.forced);
}
}
+10 -1
View File
@@ -60,6 +60,15 @@ class BaseGameParser {
});
}
if (section.altAnim == null) section.altAnim = false;
if (altAnims != (altAnims = section.altAnim)) {
result.events.push({
time: curTime,
name: "Alt Animation Toggle",
params: [0, altAnims]
});
}
if (section.sectionNotes != null) for(note in section.sectionNotes) {
if (note[1] < 0) continue;
@@ -129,6 +138,6 @@ typedef SwagSection =
var mustHitSection:Bool;
var bpm:Float;
var changeBPM:Bool;
var altAnim:Bool;
var altAnim:Null<Bool>;
@:optional var camTarget:Null<Float>;
}
+80 -6
View File
@@ -9,8 +9,8 @@ import haxe.Http;
class GitHub {
/**
* Gets all the releases from a specific GitHub repository using the GitHub API.
* @param user
* @param repository
* @param user The user/group that owns the repository
* @param repository The repository name
* @return Releases
*/
public static function getReleases(user:String, repository:String, ?onError:Exception->Void):Array<GitHubRelease> {
@@ -29,6 +29,12 @@ class GitHub {
return [];
}
/**
* Gets the contributors list from a specific GitHub repository using the GitHub API.
* @param user The user/group that owns the repository
* @param repository The repository name
* @return Contributors List
*/
public static function getContributors(user:String, repository:String, ?onError:Exception->Void):Array<GitHubContributor> {
try {
var url = 'https://api.github.com/repos/${user}/${repository}/contributors';
@@ -45,6 +51,27 @@ class GitHub {
return [];
}
/**
* Gets a specific GitHub user/group using the GitHub API.
* @param user The user/group to get
* @return User/Group
*/
public static function getUser(user:String, ?onError:Exception->Void):GitHubUser {
try {
var url = 'https://api.github.com/users/$user';
var data = Json.parse(__requestOnGitHubServers(url));
if (Reflect.hasField(data, "documentation_url"))
throw __parseGitHubException(data);
return data;
} catch(e) {
if (onError != null)
onError(e);
}
return null;
}
/**
* Filters all releases gotten by `getReleases`
* @param releases Releases
@@ -58,29 +85,52 @@ class GitHub {
public static function __requestOnGitHubServers(url:String) {
var h = new Http(url);
h.setHeader("User-Agent", "request");
var r = null;
h.onStatus = function(s) {
if(isRedirect(s))
r = __requestOnGitHubServers(h.responseHeaders.get("Location"));
};
h.onData = function(d) {
r = d;
if(r == null) r = d;
}
h.onError = function(e) {
throw e;
}
h.request(false);
return r;
}
public static function __requestBytesOnGitHubServers(url:String) {
var h = new Http(url);
h.setHeader("User-Agent", "request");
var r = null;
h.onStatus = function(s) {
if(isRedirect(s))
r = __requestBytesOnGitHubServers(h.responseHeaders.get("Location"));
};
h.onBytes = function(d) {
r = d;
if(r == null) r = d;
}
h.onError = function(e) {
throw e;
}
h.request(false);
return r;
}
private static function isRedirect(status:Int):Bool {
switch (status) {
// 301: Moved Permanently, 302: Found (Moved Temporarily), 307: Temporary Redirect, 308: Permanent Redirect - Nex_isDumb
case 301 | 302 | 307 | 308 :
trace("Redirected with status code: " + status);
return true;
}
return false;
}
private static function __parseGitHubException(obj:Dynamic):GitHubException {
var msg:String = "(No message)";
var url:String = "(No API url)";
@@ -99,18 +149,33 @@ import haxe.Exception;
class GitHub {
/**
* Gets all the releases from a specific GitHub repository using the GitHub API.
* @param user
* @param repository
* @param user The user/group that owns the repository
* @param repository The repository name
* @return Releases
*/
public static function getReleases(user:String, repository:String, ?onError:Exception->Void):Array<GitHubRelease> {
return [];
}
/**
* Gets the contributors list from a specific GitHub repository using the GitHub API.
* @param user The user/group that owns the repository
* @param repository The repository name
* @return Contributors List
*/
public static function getContributors(user:String, repository:String, ?onError:Exception->Void):Array<GitHubContributor> {
return [];
}
/**
* Gets a specific GitHub user/group using the GitHub API.
* @param user The user/group to get
* @return User/Group
*/
public static function getUser(user:String, ?onError:Exception->Void):GitHubUser {
return null;
}
/**
* Filters all releases gotten by `getReleases`
* @param releases Releases
@@ -130,5 +195,14 @@ class GitHub {
private static function __parseGitHubException(obj:Dynamic):GitHubException {
return null;
}
private static function isRedirect(status:Int):Bool {
switch (status) {
// 301: Moved Permanently, 302: Found (Moved Temporarily), 307: Temporary Redirect, 308: Permanent Redirect - Nex_isDumb
case 301 | 302 | 307 | 308 :
trace("Redirected with status code: " + status);
return true;
}
return false;
}
}
#end
@@ -20,7 +20,7 @@ class ScriptsMacro {
"flixel.addons.plugin", "flixel.addons.text", "flixel.addons.tile", "flixel.addons.transition",
"flixel.addons.util",
// OTHER LIBRARIES & STUFF
"away3d", "flx3d",
#if THREE_D_SUPPORT "away3d", "flx3d", #end
#if VIDEO_CUTSCENES "hxvlc.flixel", "hxvlc.openfl", #end
// BASE HAXE
"DateTools", "EReg", "Lambda", "StringBuf", "haxe.crypto", "haxe.display", "haxe.exceptions", "haxe.extern", "scripting"
+20 -1
View File
@@ -28,6 +28,16 @@ class CoolUtil
public static function getLastExceptionStack():String {
return CallStack.toString(CallStack.exceptionStack());
}
/*
* Returns `v` if not null
* @param v The value
* @return A bool value
*/
public static inline function isNotNull(v:Null<Dynamic>):Bool {
return v != null && !isNaN(v);
}
/*
* Returns `v` if not null, `defaultValue` otherwise.
* @param v The value
@@ -135,7 +145,7 @@ class CoolUtil
/**
* Returns a string representation of a size, following this format: `1.02 GB`, `134.00 MB`
* @param size Size to convert ot string
* @param size Size to convert to string
* @return String Result string representation
*/
public static function getSizeString(size:Float):String {
@@ -149,6 +159,15 @@ class CoolUtil
return '${Std.int(rSize) + "." + addZeros(Std.string(Std.int((rSize % 1) * 100)), 2)}${labels[label]}';
}
/**
* Replaces in a string any kind of IP with `[Your IP]` making the string safer to trace.
* @param msg String to check and edit
* @return String Result without any kind of IP
*/
public static inline function removeIP(msg:String):String {
return ~/\d+.\d+.\d+.\d+/.replace(msg, "[Your IP]"); // For now its just IPs but who knows in the future.. - Nex_isDumb
}
/**
* Alternative linear interpolation function for each frame use, without worrying about framerate changes.
* @param v1 Begin value
+79 -30
View File
@@ -21,7 +21,7 @@ class XMLUtil {
*/
public static function applyXMLProperty(object:Dynamic, property:Access):ErrorCode {
if (!property.has.name || !property.has.type || !property.has.value) {
Logs.trace('Failed to apply XML property: XML Element misses name, type, or value attributes.', WARNING);
Logs.trace('Failed to apply XML property: XML Element is missing name, type, or value attributes.', WARNING);
return MISSING_PROPERTY;
}
@@ -72,54 +72,86 @@ class XMLUtil {
spr.loadSprite(Paths.image('$parentFolder${node.getAtt("sprite")}', null, true));
if (spr.frames != null && spr.frames.frames != null) {
spr.animation.add("idle", [for(i in 0...spr.frames.frames.length) i], 24, true);
spr.animation.play("idle");
spr.spriteAnimType = defaultAnimType;
if (node.has.type) {
spr.spriteAnimType = XMLAnimType.fromString(node.att.type, spr.spriteAnimType);
}
spr.spriteAnimType = defaultAnimType;
if (node.has.type)
spr.spriteAnimType = XMLAnimType.fromString(node.att.type, spr.spriteAnimType);
var x:Null<Float> = node.has.x ? Std.parseFloat(node.att.x) : null;
var y:Null<Float> = node.has.y ? Std.parseFloat(node.att.y) : null;
if (x != null) spr.x = x;
if (y != null) spr.y = y;
if(node.has.x) {
var x:Null<Float> = Std.parseFloat(node.att.x);
if (x.isNotNull()) spr.x = x;
}
if(node.has.y) {
var y:Null<Float> = Std.parseFloat(node.att.y);
if (y.isNotNull()) spr.y = y;
}
if (node.has.scroll) {
var scroll:Null<Float> = Std.parseFloat(node.att.scroll);
if (scroll != null) spr.scrollFactor.set(scroll, scroll);
if (scroll.isNotNull()) spr.scrollFactor.set(scroll, scroll);
} else {
if (node.has.scrollx) {
var scroll:Null<Float> = Std.parseFloat(node.att.scrollx);
if (scroll != null) spr.scrollFactor.x = scroll;
if (scroll.isNotNull()) spr.scrollFactor.x = scroll;
}
if (node.has.scrolly) {
var scroll:Null<Float> = Std.parseFloat(node.att.scrolly);
if (scroll != null) spr.scrollFactor.y = scroll;
if (scroll.isNotNull()) spr.scrollFactor.y = scroll;
}
}
if (node.has.skewx) {
var skew:Null<Float> = Std.parseFloat(node.att.skewx);
if (skew != null) spr.skew.x = skew;
if (skew.isNotNull()) spr.skew.x = skew;
}
if (node.has.skewy) {
var skew:Null<Float> = Std.parseFloat(node.att.skewy);
if (skew != null) spr.skew.y = skew;
if (skew.isNotNull()) spr.skew.y = skew;
}
if (node.has.antialiasing) spr.antialiasing = node.att.antialiasing == "true";
if (node.has.scale) {
var scale:Null<Float> = Std.parseFloat(node.att.scale);
if (scale != null) spr.scale.set(scale, scale);
if (scale.isNotNull()) spr.scale.set(scale, scale);
}
if (node.has.scalex) {
var scale:Null<Float> = Std.parseFloat(node.att.scalex);
if (scale.isNotNull()) spr.scale.x = scale;
}
if (node.has.scaley) {
var scale:Null<Float> = Std.parseFloat(node.att.scaley);
if (scale.isNotNull()) spr.scale.y = scale;
}
if (node.has.updateHitbox && node.att.updateHitbox == "true") spr.updateHitbox();
spr.zoomFactor = Std.parseFloat(node.getAtt("zoomfactor")).getDefault(spr.zoomFactor);
if(node.has.zoomfactor)
spr.zoomFactor = Std.parseFloat(node.getAtt("zoomfactor")).getDefault(spr.zoomFactor);
if (node.has.alpha)
spr.alpha = Std.parseFloat(node.getAtt("alpha")).getDefault(spr.alpha);
for(anim in node.nodes.anim)
addXMLAnimation(spr, anim);
if (node.has.playOnCountdown)
spr.skipNegativeBeats = node.att.playOnCountdown == "true";
if (node.has.beatInterval)
spr.beatInterval = Std.parseInt(node.att.beatInterval);
if (node.has.beatOffset)
spr.beatOffset = Std.parseInt(node.att.beatOffset);
if(node.hasNode.anim) {
for(anim in node.nodes.anim)
addXMLAnimation(spr, anim);
} else {
if (spr.frames != null && spr.frames.frames != null) {
addAnimToSprite(spr, {
name: "idle",
anim: null,
fps: 24,
loop: spr.spriteAnimType == LOOP,
animType: spr.spriteAnimType,
x: 0,
y: 0,
indices: [for(i in 0...spr.frames.frames.length) i],
forced: (node.has.forced && node.att.forced == "true") || (!node.has.forced && spr.spriteAnimType == BEAT)
});
}
}
return spr;
}
@@ -133,16 +165,18 @@ class XMLUtil {
animType: animType,
x: 0,
y: 0,
indices: []
indices: [],
forced: false,
};
if (anim.has.name) animData.name = anim.att.name;
if (anim.has.type) animData.animType = XMLAnimType.fromString(anim.att.type, animData.animType);
if (anim.has.anim) animData.anim = anim.att.anim;
if (anim.has.fps) animData.fps = Std.parseFloat(anim.att.fps);
if (anim.has.x) animData.x = Std.parseFloat(anim.att.x);
if (anim.has.y) animData.y = Std.parseFloat(anim.att.y);
if (anim.has.fps) animData.fps = Std.parseFloat(anim.att.fps).getDefault(animData.fps);
if (anim.has.x) animData.x = Std.parseFloat(anim.att.x).getDefault(animData.x);
if (anim.has.y) animData.y = Std.parseFloat(anim.att.y).getDefault(animData.y);
if (anim.has.loop) animData.loop = anim.att.loop == "true";
if (anim.has.forced) animData.forced = anim.att.forced == "true";
if (anim.has.indices) {
var indicesSplit = anim.att.indices.split(",");
for(indice in indicesSplit) {
@@ -161,24 +195,30 @@ class XMLUtil {
*/
public static function addXMLAnimation(sprite:FlxSprite, anim:Access, loop:Bool = false):ErrorCode {
var animType:XMLAnimType = NONE;
if (sprite is FunkinSprite)
if (sprite is FunkinSprite) {
animType = cast(sprite, FunkinSprite).spriteAnimType;
}
return addAnimToSprite(sprite, extractAnimFromXML(anim, animType, loop));
}
public static function addAnimToSprite(sprite:FlxSprite, animData:AnimData):ErrorCode {
if (animData.name != null && animData.anim != null) {
if (animData.name != null) {
if (animData.fps <= 0 #if web || animData.fps == null #end) animData.fps = 24;
if (sprite is FunkinSprite && cast(sprite, FunkinSprite).animateAtlas != null) {
var animateAnim = cast(sprite, FunkinSprite).animateAtlas.anim;
if(animData.anim == null)
return MISSING_PROPERTY;
if (animData.indices.length > 0)
animateAnim.addBySymbolIndices(animData.name, animData.anim, animData.indices, animData.fps, animData.loop);
else
animateAnim.addBySymbol(animData.name, animData.anim, animData.fps, animData.loop);
} else {
if (animData.indices.length > 0)
if (animData.anim == null && animData.indices.length > 0)
sprite.animation.add(animData.name, animData.indices, animData.fps, animData.loop);
else if (animData.indices.length > 0)
sprite.animation.addByIndices(animData.name, animData.anim, animData.indices, "", animData.fps, animData.loop);
else
sprite.animation.addByPrefix(animData.name, animData.anim, animData.fps, animData.loop);
@@ -191,9 +231,12 @@ class XMLUtil {
var xmlSpr = cast(sprite, FunkinSprite);
switch(animData.animType) {
case BEAT:
xmlSpr.beatAnims.push(animData.name);
xmlSpr.beatAnims.push({
name: animData.name,
forced: animData.forced.getDefault(false)
});
case LOOP:
xmlSpr.animation.play(animData.name);
xmlSpr.animation.play(animData.name, animData.forced.getDefault(false));
default:
// nothing
}
@@ -219,6 +262,12 @@ typedef AnimData = {
var y:Float;
var indices:Array<Int>;
var animType:XMLAnimType;
var ?forced:Bool;
}
typedef BeatAnim = {
var name:String;
var forced:Bool;
}
interface IXMLEvents {
+1
View File
@@ -110,6 +110,7 @@ class GameOverSubstate extends MusicBeatSubstate
if (controls.BACK)
{
PlayState.resetSongInfos();
if (FlxG.sound.music != null)
FlxG.sound.music.stop();
FlxG.sound.music = null;
+51 -26
View File
@@ -89,6 +89,10 @@ class PlayState extends MusicBeatState
*/
public var strumLines:FlxTypedGroup<StrumLine> = new FlxTypedGroup<StrumLine>();
/**
* Death counter on current week (or song if from freeplay).
*/
public static var deathCounter:Int = 0;
/**
* Game Over Song. (assets/music/gameOver.ogg)
*/
@@ -365,11 +369,14 @@ class PlayState extends MusicBeatState
* Whenever the game is currently in a cutscene or not.
*/
public var inCutscene:Bool = false;
/**
* Whenever the game should play the cutscenes. Defaults to whenever the game is currently in Story Mode or not.
*/
public var playCutscenes:Bool = isStoryMode;
/**
* Whenever the game has already played a specific cutscene for the current song. Check `startCutscene` for more details.
*/
public static var seenCutscene:Bool = false;
/**
* Cutscene script path.
*/
@@ -447,6 +454,7 @@ class PlayState extends MusicBeatState
public var hitWindow:Float = Options.hitWindow; // is calculated in create(), is safeFrames in milliseconds
@:noCompletion @:dox(hide) private var _startCountdownCalled:Bool = false;
@:noCompletion @:dox(hide) private var _endSongCalled:Bool = false;
@:dox(hide)
var __vocalOffsetViolation:Float = 0;
@@ -746,11 +754,15 @@ class PlayState extends MusicBeatState
}
@:dox(hide) public override function createPost() {
startCutscene("", cutscene);
startCutscene("", cutscene, null, true);
super.createPost();
updateDiscordPresence();
// Make icons appear in the correct spot during cutscenes
healthBar.update(0);
updateIconPositions();
__updateNote_event = EventManager.get(NoteUpdateEvent);
scripts.call("postCreate");
@@ -768,10 +780,15 @@ class PlayState extends MusicBeatState
* @param prefix Custom prefix. Using `midsong-` will require you to for example rename your video cutscene to `songs/song/midsong-cutscene.mp4` instead of `songs/song/cutscene.mp4`
* @param cutsceneScriptPath Optional: Custom script path.
* @param callback Callback called after the cutscene ended. If equals to `null`, `startCountdown` will be called.
* @param checkSeen Bool that by default is false, if true and `seenCutscene` is also true, it won't play the cutscene but directly call `callback` (PS: `seenCutscene` becomes true if the cutscene gets played and `checkSeen` was true)
*/
public function startCutscene(prefix:String = "", ?cutsceneScriptPath:String, ?callback:Void->Void) {
if (callback == null)
callback = startCountdown;
public function startCutscene(prefix:String = "", ?cutsceneScriptPath:String, ?callback:Void->Void, checkSeen:Bool = false) {
if (callback == null) callback = startCountdown;
if (checkSeen && seenCutscene) {
callback();
return;
}
if (cutsceneScriptPath == null)
cutsceneScriptPath = Paths.script('songs/${SONG.meta.name.toLowerCase()}/${prefix}cutscene');
@@ -781,28 +798,25 @@ class PlayState extends MusicBeatState
var videoCutsceneAlt = Paths.file('songs/${PlayState.SONG.meta.name.toLowerCase()}/${prefix}cutscene.mp4');
var dialogue = Paths.file('songs/${PlayState.SONG.meta.name.toLowerCase()}/${prefix}dialogue.xml');
persistentUpdate = true;
var toCall:Void->Void = function() {
if(checkSeen) seenCutscene = true;
callback();
}
if (cutsceneScriptPath != null && Assets.exists(cutsceneScriptPath)) {
openSubState(new ScriptedCutscene(cutsceneScriptPath, function() {
callback();
}));
openSubState(new ScriptedCutscene(cutsceneScriptPath, toCall));
} else if (Assets.exists(dialogue)) {
MusicBeatState.skipTransIn = true;
openSubState(new DialogueCutscene(dialogue, function() {
callback();
}));
openSubState(new DialogueCutscene(dialogue, toCall));
} else if (Assets.exists(videoCutsceneAlt)) {
MusicBeatState.skipTransIn = true;
persistentUpdate = false;
openSubState(new VideoCutscene(videoCutsceneAlt, function() {
callback();
}));
openSubState(new VideoCutscene(videoCutsceneAlt, toCall));
persistentDraw = false;
} else if (Assets.exists(videoCutscene)) {
MusicBeatState.skipTransIn = true;
persistentUpdate = false;
openSubState(new VideoCutscene(videoCutscene, function() {
callback();
}));
openSubState(new VideoCutscene(videoCutscene, toCall));
persistentDraw = false;
} else
callback();
@@ -857,6 +871,7 @@ class PlayState extends MusicBeatState
sprite.scale.set(event.scale, event.scale);
sprite.updateHitbox();
sprite.screenCenter();
sprite.antialiasing = event.antialiasing;
add(sprite);
tween = FlxTween.tween(sprite, {y: sprite.y + 100, alpha: 0}, Conductor.crochet / 1000, {
ease: FlxEase.cubeInOut,
@@ -931,6 +946,11 @@ class PlayState extends MusicBeatState
Note.__customNoteTypeExists = [];
}
public static function resetSongInfos() {
deathCounter = 0;
seenCutscene = false;
}
@:dox(hide) private function generateSong(?songData:ChartData):Void
{
if (songData == null) songData = SONG;
@@ -1100,6 +1120,18 @@ class PlayState extends MusicBeatState
updateDiscordPresence();
}
function updateIconPositions() {
var iconOffset:Int = 26;
iconP1.x = healthBar.x + (healthBar.width * (FlxMath.remapToRange(healthBar.percent, 0, 100, 1, 0)) - iconOffset);
iconP2.x = healthBar.x + (healthBar.width * (FlxMath.remapToRange(healthBar.percent, 0, 100, 1, 0))) - (iconP2.width - iconOffset);
health = FlxMath.bound(health, 0, maxHealth);
iconP1.health = healthBar.percent / 100;
iconP2.health = 1 - (healthBar.percent / 100);
}
@:dox(hide)
override public function update(elapsed:Float)
{
@@ -1145,15 +1177,7 @@ class PlayState extends MusicBeatState
iconP1.updateHitbox();
iconP2.updateHitbox();
var iconOffset:Int = 26;
iconP1.x = healthBar.x + (healthBar.width * (FlxMath.remapToRange(healthBar.percent, 0, 100, 1, 0)) - iconOffset);
iconP2.x = healthBar.x + (healthBar.width * (FlxMath.remapToRange(healthBar.percent, 0, 100, 1, 0))) - (iconP2.width - iconOffset);
health = FlxMath.bound(health, 0, maxHealth);
iconP1.health = healthBar.percent / 100;
iconP2.health = 1 - (healthBar.percent / 100);
updateIconPositions();
if (startingSong)
{
@@ -1359,6 +1383,7 @@ class PlayState extends MusicBeatState
}
startCutscene("end-", endCutscene, nextSong);
resetSongInfos();
}
private static inline function getSongChanges():Array<HighscoreChange> {
+3 -3
View File
@@ -78,7 +78,7 @@ class Stage extends FlxBasic implements IBeatReceiver {
case "sprite" | "spr" | "sparrow":
if (!node.has.sprite || !node.has.name) continue;
var spr = XMLUtil.createSpriteFromXML(node, spritesParentFolder, BEAT);
var spr = XMLUtil.createSpriteFromXML(node, spritesParentFolder, LOOP);
if (!node.has.zoomfactor && PlayState.instance != null)
spr.initialZoom = PlayState.instance.defaultCamZoom;
@@ -90,8 +90,8 @@ class Stage extends FlxBasic implements IBeatReceiver {
if ( !node.has.name || !node.has.width || !node.has.height) continue;
var spr = new FlxSprite(
(node.has.x) ? Std.parseFloat(node.att.x) : 0,
(node.has.y) ? Std.parseFloat(node.att.y) : 0
(node.has.x) ? Std.parseFloat(node.att.x).getDefault(0) : 0,
(node.has.y) ? Std.parseFloat(node.att.y).getDefault(0) : 0
);
(node.name == "solid" ? spr.makeSolid : spr.makeGraphic)(
+3 -1
View File
@@ -305,7 +305,9 @@ class StrumLine extends FlxTypedGroup<Strum> {
if(data.scrollSpeed != null)
babyArrow.scrollSpeed = data.scrollSpeed;
var event = PlayState.instance.scripts.event("onStrumCreation", EventManager.get(StrumCreationEvent).recycle(babyArrow, PlayState.instance.strumLines.members.indexOf(this), i, animPrefix));
var event = EventManager.get(StrumCreationEvent).recycle(babyArrow, PlayState.instance.strumLines.members.indexOf(this), i, animPrefix);
event.__doAnimation = !MusicBeatState.skipTransIn;
event = PlayState.instance.scripts.event("onStrumCreation", event);
if (!event.cancelled) {
babyArrow.frames = Paths.getFrames(event.sprite);
@@ -23,7 +23,7 @@ class ScriptedCutscene extends Cutscene {
public override function create() {
super.create();
trace("fuck");
trace("fuck you");
script.call("create");
if (Std.isOfType(script, DummyScript)) {
Logs.trace('Could not find script for scripted cutscene at ${scriptPath}', ERROR, RED);
+1
View File
@@ -61,6 +61,7 @@ class GitarooPause extends MusicBeatState
}
else
{
PlayState.resetSongInfos();
FlxG.switchState(new MainMenuState());
}
}
+6 -3
View File
@@ -72,15 +72,17 @@ class PauseSubState extends MusicBeatSubstate
add(bg);
var levelInfo:FlxText = new FlxText(20, 15, 0, PlayState.SONG.meta.displayName, 32);
var levelDifficulty:FlxText = new FlxText(20, 15 + 32, 0, PlayState.difficulty.toUpperCase(), 32);
var multiplayerText:FlxText = new FlxText(20, 15 + 32 + 32, 0, PlayState.opponentMode ? 'OPPONENT MODE' : (PlayState.coopMode ? 'CO-OP MODE' : ''), 32);
var levelDifficulty:FlxText = new FlxText(20, 15, 0, PlayState.difficulty.toUpperCase(), 32);
var deathCounter:FlxText = new FlxText(20, 15, 0, "Blue balled: " + PlayState.deathCounter, 32);
var multiplayerText:FlxText = new FlxText(20, 15, 0, PlayState.opponentMode ? 'OPPONENT MODE' : (PlayState.coopMode ? 'CO-OP MODE' : ''), 32);
for(k=>label in [levelInfo, levelDifficulty, multiplayerText]) {
for(k=>label in [levelInfo, levelDifficulty, deathCounter, multiplayerText]) {
label.scrollFactor.set();
label.setFormat(Paths.font('vcr.ttf'), 32);
label.updateHitbox();
label.alpha = 0;
label.x = FlxG.width - (label.width + 20);
label.y = 15 + (32 * k);
FlxTween.tween(label, {alpha: 1, y: label.y + 5}, 0.4, {ease: FlxEase.quartInOut, startDelay: 0.3 * (k+1)});
add(label);
}
@@ -156,6 +158,7 @@ class PauseSubState extends MusicBeatSubstate
case "Exit to charter":
FlxG.switchState(new funkin.editors.charter.Charter(PlayState.SONG.meta.name, PlayState.difficulty, false));
case "Exit to menu":
PlayState.resetSongInfos();
CoolUtil.playMenuSong();
FlxG.switchState(PlayState.isStoryMode ? new StoryMenuState() : new FreeplayState());
}
+1
View File
@@ -75,6 +75,7 @@ class StoryMenuState extends MusicBeatState {
arrow.animation.addByPrefix('idle', 'arrow $dir');
arrow.animation.addByPrefix('press', 'arrow push $dir', 24, false);
arrow.animation.play('idle');
arrow.antialiasing = true;
add(arrow);
}
rightArrow.x -= rightArrow.width;
+10 -11
View File
@@ -1,11 +1,13 @@
package funkin.menus.credits;
import funkin.backend.system.github.GitHub;
import funkin.options.type.PortraitOption;
import funkin.options.type.GithubIconOption;
using StringTools;
class CreditsCodename extends funkin.options.OptionsScreen {
public var error:Bool = false;
public override function new()
{
super("Codename Engine", "All the contributors of the engine! - Press RESET to update the list (One reset per 2 minutes).");
@@ -21,17 +23,16 @@ class CreditsCodename extends funkin.options.OptionsScreen {
super.update(elapsed);
}
var error:Bool = false;
public function checkUpdate():Bool {
var curTime:Float = Date.now().getTime();
if(Options.lastUpdated != null && curTime < Options.lastUpdated + 120000) return false; // Fuck you Github rate limits - Nex_isDumb
if(Options.lastUpdated != null && curTime < Options.lastUpdated + 120000) return false; // Fuck you Github rate limits
Options.lastUpdated = curTime;
error = false;
//Main.execAsync(function() {
var idk = GitHub.getContributors("FNF-CNE-Devs", "CodenameEngine", function(e) {
error = true;
var errMsg:String = ~/\d+.\d+.\d+.\d+/.replace(e.message, "[Your IP]"); // Removing sensitive stuff - Nex_isDumb
var errMsg:String = ~/\d+.\d+.\d+.\d+/.replace(e.message, "[Your IP]"); // Removing sensitive stuff
errMsg = 'Error while trying to download contributors list:\n$errMsg';
Logs.traceColored([Logs.logText(errMsg.replace('\n', ' '), RED)], ERROR);
@@ -39,7 +40,7 @@ class CreditsCodename extends funkin.options.OptionsScreen {
});
//});
if(error) return false;
Options.contributors = idk;
trace('List Updated!');
return true;
@@ -49,7 +50,7 @@ class CreditsCodename extends funkin.options.OptionsScreen {
//if (curSelected > Options.contributors.length - 1) changeSelection(-(curSelected - (Options.contributors.length - 1)));
if (curSelected > Options.contributors.length - 1) curSelected = Options.contributors.length - 1;
changeSelection(0, true);
while (members.length > 0) {
members[0].destroy();
remove(members[0], true);
@@ -58,12 +59,10 @@ class CreditsCodename extends funkin.options.OptionsScreen {
var totalContributions = 0;
for(c in Options.contributors) totalContributions += c.contributions;
for(c in Options.contributors) {
var opt:PortraitOption = new PortraitOption(
c.login,
'Total Contributions: ${c.contributions} / ${totalContributions} (${FlxMath.roundDecimal(c.contributions / totalContributions * 100, 2)}%) - Select to open GitHub account',
function() CoolUtil.openURL(c.html_url)
var opt:GithubIconOption = new GithubIconOption(
c,
'Total Contributions: ${c.contributions} / ${totalContributions} (${FlxMath.roundDecimal(c.contributions / totalContributions * 100, 2)}%) - Select to open GitHub account'
);
if(!error) opt.loadFromGithub(c);
add(opt);
}
}
+38 -16
View File
@@ -1,5 +1,6 @@
package funkin.menus.credits;
import funkin.backend.system.github.GitHub;
import funkin.options.OptionsScreen;
import funkin.options.type.*;
import funkin.options.TreeMenu;
@@ -27,7 +28,7 @@ class CreditsMain extends TreeMenu {
} catch(e) {
Logs.trace('Error while parsing credits.xml: ${Std.string(e)}', ERROR);
}
if (access != null)
for(c in parseCreditsFromXML(access, source))
selectables.push(c);
@@ -51,24 +52,45 @@ class CreditsMain extends TreeMenu {
var credsMenus:Array<OptionType> = [];
for(node in xml.elements) {
if (!node.has.name) {
Logs.trace("A credit node requires a name attribute.", WARNING);
continue;
}
var name = node.getAtt("name");
var desc = node.getAtt("desc").getDefault("No Description");
switch(node.name) {
case "credit":
credsMenus.push(new PortraitOption(name, desc, function() if(node.has.url) CoolUtil.openURL(node.att.url),
node.has.icon && Paths.assetsTree.existsSpecific(Paths.image('credits/${node.att.icon}'), "IMAGE", source) ?
FlxG.bitmap.add(Paths.image('credits/${node.att.icon}')) : null, node.has.size ? Std.parseInt(node.att.size) : 96
));
if (node.name == "github") {
if (!node.has.user) {
Logs.trace("A github node requires a user attribute.", WARNING);
continue;
}
case "menu":
credsMenus.push(new TextOption(name + " >", desc, function() {
optionsTree.add(new OptionsScreen(name, desc, parseCreditsFromXML(node, source)));
}));
var username = node.getAtt("user");
var user = { // Kind of forcing - Nex_isDumb
login: username,
html_url: 'https://github.com/$username',
avatar_url: 'https://github.com/$username.png'
};
credsMenus.push(new GithubIconOption(user, desc, null,
node.has.customName ? node.att.customName : null, node.has.size ? Std.parseInt(node.att.size) : 96,
node.has.portrait ? node.att.portrait.toLowerCase() == "false" ? false : true : true
));
} else {
if (!node.has.name) {
Logs.trace("A credit node requires a name attribute.", WARNING);
continue;
}
var name = node.getAtt("name");
switch(node.name) {
case "credit":
credsMenus.push(new PortraitOption(name, desc, function() if(node.has.url) CoolUtil.openURL(node.att.url),
node.has.icon && Paths.assetsTree.existsSpecific(Paths.image('credits/${node.att.icon}'), "IMAGE", source) ?
FlxG.bitmap.add(Paths.image('credits/${node.att.icon}')) : null, node.has.size ? Std.parseInt(node.att.size) : 96,
node.has.portrait ? node.att.portrait.toLowerCase() == "false" ? false : true : true
));
case "menu":
credsMenus.push(new TextOption(name + " >", desc, function() {
optionsTree.add(new OptionsScreen(name, desc, parseCreditsFromXML(node, source)));
}));
}
}
}
+4 -1
View File
@@ -27,6 +27,7 @@ class Options
public static var antialiasing:Bool = true;
public static var volume:Float = 1;
public static var week6PixelPerfect:Bool = true;
public static var gameplayShaders:Bool = true;
public static var colorHealthBar:Bool = true;
public static var lowMemoryMode:Bool = false;
public static var betaUpdates:Bool = false;
@@ -54,7 +55,9 @@ class Options
public static var contributors:Array<funkin.backend.system.github.GitHubContributor> = [];
public static var lastUpdated:Null<Float>;
// CHARTER
/**
* CHARTER
*/
public static var charterMetronomeEnabled:Bool = false;
public static var charterShowSections:Bool = true;
public static var charterShowBeats:Bool = true;
@@ -23,6 +23,10 @@ class AppearanceOptions extends OptionsScreen {
"Pixel Perfect Effect",
"If checked, Week 6 will have a pixel perfect effect to it enabled, aligning every pixel on the screen.",
"week6PixelPerfect"));
add(new Checkbox(
"Gameplay Shaders",
"If unchecked, gameplay shaders (visual effects like Thorns's Chromatic Aberration) wont be loaded; this may be helpful on weak devices.",
"gameplayShaders"));
add(new Checkbox(
"Flashing Menu",
"If unchecked, will disable menu flashing when you select an option in the Main Menu, and other flashes will be slower.",
@@ -0,0 +1,103 @@
package funkin.options.type;
import openfl.display.BitmapData;
import flixel.graphics.FlxGraphic;
import funkin.backend.shaders.CustomShader;
import funkin.backend.system.github.GitHub;
import flixel.util.FlxColor;
class GithubIconOption extends TextOption
{
public var user(default, null):Dynamic; // Can possibly be GitHubUser or GitHubContributor - Nex_isDumb
public var icon:GithubUserIcon = null;
public var usePortrait(default, set) = true;
public function set_usePortrait(value:Bool)
{
if (icon == null) return usePortrait = false;
icon.shader = (value ? new CustomShader('engine/circleProfilePicture') : null);
return usePortrait = value;
}
public function new(user:Dynamic, desc:String, ?callback:Void->Void, ?customName:String, size:Int = 96, usePortrait:Bool = true) {
super(customName == null ? user.login : customName, desc, callback == null ? function() CoolUtil.openURL(user.html_url) : callback);
this.user = user;
this.icon = new GithubUserIcon(user, size);
this.usePortrait = usePortrait;
add(icon);
}
}
class GithubUserIcon extends FlxSprite
{
private var loading:Bool = false;
private var user:Dynamic;
private var size:Int;
public override function new(user:Dynamic, size:Int = 96) {
this.user = user;
this.size = size;
super();
makeGraphic(size, size, FlxColor.TRANSPARENT);
antialiasing = true;
}
final mutex = new sys.thread.Mutex();
override function drawComplex(camera:FlxCamera):Void { // Making the image downlaod only if the player actually sees it on the screeeeen - Nex_isDumb
if(!loading) {
loading = true;
Main.execAsync(function() {
var key:String = 'GITHUB-USER:${user.login}';
var bmap:Dynamic = FlxG.bitmap.get(key);
if(bmap == null) {
trace('Downloading avatar: ${user.login}');
var unfLink:Bool = StringTools.endsWith(user.avatar_url, '.png');
var planB:Bool = true;
var bytes = null;
if(unfLink) {
try bytes = GitHub.__requestBytesOnGitHubServers('${user.avatar_url}?size=$size')
catch(e) Logs.traceColored([Logs.logText('Failed to download github pfp for ${user.login}: ${CoolUtil.removeIP(e.message)} - (Retrying using the api..)', RED)], ERROR);
if(bytes != null) {
bmap = BitmapData.fromBytes(bytes);
planB = false;
}
}
if(planB) {
if(unfLink) user = GitHub.getUser(user.login, function(e) Logs.traceColored([Logs.logText('Failed to download github user info for ${user.login}: ${CoolUtil.removeIP(e.message)}', RED)], ERROR)); // Api part - Nex_isDumb
try bytes = GitHub.__requestBytesOnGitHubServers('${user.avatar_url}&size=$size')
catch(e) Logs.traceColored([Logs.logText('Failed to download github pfp for ${user.login}: ${CoolUtil.removeIP(e.message)}', RED)], ERROR);
if(bytes != null) bmap = BitmapData.fromBytes(bytes);
}
if(bmap != null) try {
mutex.acquire(); // Avoiding critical section - Nex_isDumb
var leGraphic:FlxGraphic = FlxG.bitmap.add(bmap, false, key);
leGraphic.persist = true;
updateDaFunni(leGraphic);
bmap = null;
mutex.release();
} catch(e) {
Logs.traceColored([Logs.logText('Failed to update the pfp for ${user.login}: ${e.message}', RED)], ERROR);
}
} else {
mutex.acquire();
updateDaFunni(bmap);
mutex.release();
}
});
}
super.drawComplex(camera);
}
public inline function updateDaFunni(graphic:FlxGraphic) {
loadGraphic(graphic);
this.setUnstretchedGraphicSize(size, size, false);
updateHitbox();
x += 90 - width;
}
}
+1 -2
View File
@@ -24,5 +24,4 @@ class OptionType extends FlxSpriteGroup {
super.update(elapsed);
alpha = (selected ? 1 : 0.6);
}
}
}
+4 -15
View File
@@ -1,24 +1,21 @@
package funkin.options.type;
import openfl.display.BitmapData;
import flixel.graphics.FlxGraphic;
import funkin.backend.shaders.CustomShader;
import funkin.backend.system.github.GitHubContributor;
import funkin.backend.system.github.GitHub;
class PortraitOption extends TextOption {
public var portrait:FlxSprite = null;
public function new(name:String, desc:String, callback:Void->Void, ?graphic:FlxGraphic, size:Int = 96) {
public function new(name:String, desc:String, callback:Void->Void, ?graphic:FlxGraphic, size:Int = 96, usePortrait:Bool = true) {
super(name, desc, callback);
if (graphic != null) addPortrait(graphic, size);
if (graphic != null) addPortrait(graphic, size, usePortrait);
}
public function addPortrait(graphic:FlxGraphic, size:Int = 96) {
public function addPortrait(graphic:FlxGraphic, size:Int = 96, usePortrait:Bool = true) {
if (portrait == null) {
portrait = new FlxSprite();
portrait.antialiasing = true;
portrait.shader = new CustomShader('engine/circleProfilePicture');
if(usePortrait) portrait.shader = new CustomShader('engine/circleProfilePicture');
add(portrait);
}
portrait.loadGraphic(graphic);
@@ -26,12 +23,4 @@ class PortraitOption extends TextOption {
portrait.updateHitbox();
portrait.setPosition(90 - portrait.width, 0);
}
public function loadFromGithub(user:GitHubContributor, size:Int = 96) {
//Main.execAsync(function() {
var bytes = GitHub.__requestBytesOnGitHubServers('${user.avatar_url}&size=$size');
var bmap = BitmapData.fromBytes(bytes);
addPortrait(FlxG.bitmap.add(bmap, false, 'GITHUB-USER:${user.login}'), size);
//});
}
}