1
0
Fork 0
mirror of https://github.com/ninjamuffin99/Funkin.git synced 2025-12-02 01:00:21 +00:00

Merge branch 'master' of github.com:ninjamuffin99/Funkin-secret into testtrack

This commit is contained in:
MtH 2021-04-03 01:42:23 +02:00
commit bbe773d68c
18 changed files with 395 additions and 347 deletions

View file

@ -126,7 +126,7 @@
<haxelib name="faxe" if='switch'/> <haxelib name="faxe" if='switch'/>
<haxelib name="polymod"/> <haxelib name="polymod"/>
<haxelib name="hxcpp-debug-server" if="desktop debug"/> <haxelib name="hxcpp-debug-server" if="desktop debug"/>
<haxelib name="discord_rpc" if="cpp"/> <!-- foesn't work with neko --> <!--<haxelib name="discord_rpc" if="cpp"/> --> <!-- foesn't work with neko -->
<!-- <haxelib name="hxcpp-debug-server" if="desktop"/> --> <!-- <haxelib name="hxcpp-debug-server" if="desktop"/> -->
<!-- <haxelib name="markdown" /> --> <!-- <haxelib name="markdown" /> -->

View file

@ -9,7 +9,7 @@ class BGSprite extends FlxSprite
*/ */
public var idleAnim:String; public var idleAnim:String;
public function new(image:String, x:Float = 0, y:Float = 0, parX:Float = 1, parY:Float = 1, ?daAnimations:Array<String>) public function new(image:String, x:Float = 0, y:Float = 0, parX:Float = 1, parY:Float = 1, ?daAnimations:Array<String>, ?loopingAnim:Bool = false)
{ {
super(x, y); super(x, y);
@ -18,7 +18,7 @@ class BGSprite extends FlxSprite
frames = Paths.getSparrowAtlas(image); frames = Paths.getSparrowAtlas(image);
for (anims in daAnimations) for (anims in daAnimations)
{ {
animation.addByPrefix(anims, anims, 24, false); animation.addByPrefix(anims, anims, 24, loopingAnim);
animation.play(anims); animation.play(anims);
if (idleAnim == null) if (idleAnim == null)

View file

@ -5,6 +5,7 @@ import flixel.FlxG;
import flixel.FlxSprite; import flixel.FlxSprite;
import flixel.animation.FlxBaseAnimation; import flixel.animation.FlxBaseAnimation;
import flixel.graphics.frames.FlxAtlasFrames; import flixel.graphics.frames.FlxAtlasFrames;
import flixel.util.FlxSort;
import haxe.io.Path; import haxe.io.Path;
using StringTools; using StringTools;
@ -55,7 +56,7 @@ class Character extends FlxSprite
playAnim('danceRight'); playAnim('danceRight');
case 'gf-christmas': case 'gf-christmas':
tex = Paths.getSparrowAtlas('christmas/gfChristmas'); tex = Paths.getSparrowAtlas('characters/gfChristmas');
frames = tex; frames = tex;
quickAnimAdd('cheer', 'GF Cheer'); quickAnimAdd('cheer', 'GF Cheer');
quickAnimAdd('singLEFT', 'GF left note'); quickAnimAdd('singLEFT', 'GF left note');
@ -69,19 +70,7 @@ class Character extends FlxSprite
animation.addByIndices('hairFall', "GF Dancing Beat Hair Landing", [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], "", 24, false); animation.addByIndices('hairFall', "GF Dancing Beat Hair Landing", [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], "", 24, false);
animation.addByPrefix('scared', 'GF FEAR', 24, true); animation.addByPrefix('scared', 'GF FEAR', 24, true);
addOffset('cheer'); loadOffsetFile(curCharacter);
addOffset('sad', -2, -21);
addOffset('danceLeft', 0, -9);
addOffset('danceRight', 0, -9);
addOffset("singUP", 0, 4);
addOffset("singRIGHT", 0, -20);
addOffset("singLEFT", 0, -19);
addOffset("singDOWN", 0, -20);
addOffset('hairBlow', 45, -8);
addOffset('hairFall', 0, -9);
addOffset('scared', -2, -17);
playAnim('danceRight'); playAnim('danceRight');
@ -106,7 +95,7 @@ class Character extends FlxSprite
flipX = true; flipX = true;
case 'gf-car': case 'gf-car':
tex = Paths.getSparrowAtlas('gfCar'); tex = Paths.getSparrowAtlas('characters/gfCar');
frames = tex; frames = tex;
animation.addByIndices('singUP', 'GF Dancing Beat Hair blowing CAR', [0], "", 24, false); animation.addByIndices('singUP', 'GF Dancing Beat Hair blowing CAR', [0], "", 24, false);
animation.addByIndices('danceLeft', 'GF Dancing Beat Hair blowing CAR', [30, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "", 24, false); animation.addByIndices('danceLeft', 'GF Dancing Beat Hair blowing CAR', [30, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "", 24, false);
@ -114,21 +103,18 @@ class Character extends FlxSprite
false); false);
animation.addByIndices('idleHair', 'GF Dancing Beat Hair blowing CAR', [10, 11, 12, 25, 26, 27], "", 24, true); animation.addByIndices('idleHair', 'GF Dancing Beat Hair blowing CAR', [10, 11, 12, 25, 26, 27], "", 24, true);
addOffset('danceLeft', 0); loadOffsetFile(curCharacter);
addOffset('danceRight', 0);
addOffset('idleHair', 0);
playAnim('danceRight'); playAnim('danceRight');
case 'gf-pixel': case 'gf-pixel':
tex = Paths.getSparrowAtlas('weeb/gfPixel'); tex = Paths.getSparrowAtlas('characters/gfPixel');
frames = tex; frames = tex;
animation.addByIndices('singUP', 'GF IDLE', [2], "", 24, false); animation.addByIndices('singUP', 'GF IDLE', [2], "", 24, false);
animation.addByIndices('danceLeft', 'GF IDLE', [30, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "", 24, false); animation.addByIndices('danceLeft', 'GF IDLE', [30, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "", 24, false);
animation.addByIndices('danceRight', 'GF IDLE', [15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29], "", 24, false); animation.addByIndices('danceRight', 'GF IDLE', [15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29], "", 24, false);
addOffset('danceLeft', 0); loadOffsetFile(curCharacter);
addOffset('danceRight', 0);
playAnim('danceRight'); playAnim('danceRight');
@ -138,7 +124,7 @@ class Character extends FlxSprite
case 'dad': case 'dad':
// DAD ANIMATION LOADING CODE // DAD ANIMATION LOADING CODE
tex = Paths.getSparrowAtlas('DADDY_DEAREST'); tex = Paths.getSparrowAtlas('characters/DADDY_DEAREST');
frames = tex; frames = tex;
quickAnimAdd('idle', 'Dad idle dance'); quickAnimAdd('idle', 'Dad idle dance');
quickAnimAdd('singUP', 'Dad Sing Note UP'); quickAnimAdd('singUP', 'Dad Sing Note UP');
@ -146,15 +132,11 @@ class Character extends FlxSprite
quickAnimAdd('singDOWN', 'Dad Sing Note DOWN'); quickAnimAdd('singDOWN', 'Dad Sing Note DOWN');
quickAnimAdd('singLEFT', 'Dad Sing Note LEFT'); quickAnimAdd('singLEFT', 'Dad Sing Note LEFT');
addOffset('idle'); loadOffsetFile(curCharacter);
addOffset("singUP", -6, 50);
addOffset("singRIGHT", 0, 27);
addOffset("singLEFT", -10, 10);
addOffset("singDOWN", 0, -30);
playAnim('idle'); playAnim('idle');
case 'spooky': case 'spooky':
tex = Paths.getSparrowAtlas('spooky_kids_assets'); tex = Paths.getSparrowAtlas('characters/spooky_kids_assets');
frames = tex; frames = tex;
quickAnimAdd('singUP', 'spooky UP NOTE'); quickAnimAdd('singUP', 'spooky UP NOTE');
quickAnimAdd('singDOWN', 'spooky DOWN note'); quickAnimAdd('singDOWN', 'spooky DOWN note');
@ -163,17 +145,11 @@ class Character extends FlxSprite
animation.addByIndices('danceLeft', 'spooky dance idle', [0, 2, 6], "", 12, false); animation.addByIndices('danceLeft', 'spooky dance idle', [0, 2, 6], "", 12, false);
animation.addByIndices('danceRight', 'spooky dance idle', [8, 10, 12, 14], "", 12, false); animation.addByIndices('danceRight', 'spooky dance idle', [8, 10, 12, 14], "", 12, false);
addOffset('danceLeft'); loadOffsetFile(curCharacter);
addOffset('danceRight');
addOffset("singUP", -20, 26);
addOffset("singRIGHT", -130, -14);
addOffset("singLEFT", 130, -10);
addOffset("singDOWN", -50, -130);
playAnim('danceRight'); playAnim('danceRight');
case 'mom': case 'mom':
tex = Paths.getSparrowAtlas('Mom_Assets'); tex = Paths.getSparrowAtlas('characters/Mom_Assets');
frames = tex; frames = tex;
quickAnimAdd('idle', "Mom Idle"); quickAnimAdd('idle', "Mom Idle");
@ -184,16 +160,12 @@ class Character extends FlxSprite
// CUZ DAVE IS DUMB! // CUZ DAVE IS DUMB!
quickAnimAdd('singRIGHT', 'Mom Pose Left'); quickAnimAdd('singRIGHT', 'Mom Pose Left');
addOffset('idle'); loadOffsetFile(curCharacter);
addOffset("singUP", 14, 71);
addOffset("singRIGHT", 10, -60);
addOffset("singLEFT", 250, -23);
addOffset("singDOWN", 20, -160);
playAnim('idle'); playAnim('idle');
case 'mom-car': case 'mom-car':
tex = Paths.getSparrowAtlas('momCar'); tex = Paths.getSparrowAtlas('characters/momCar');
frames = tex; frames = tex;
quickAnimAdd('idle', "Mom Idle"); quickAnimAdd('idle', "Mom Idle");
@ -205,16 +177,11 @@ class Character extends FlxSprite
quickAnimAdd('singRIGHT', 'Mom Pose Left'); quickAnimAdd('singRIGHT', 'Mom Pose Left');
animation.addByIndices('idleHair', "Mom Idle", [10, 11, 12, 13], "", 24, true); animation.addByIndices('idleHair', "Mom Idle", [10, 11, 12, 13], "", 24, true);
addOffset('idle'); loadOffsetFile(curCharacter);
addOffset("singUP", 14, 71);
addOffset("singRIGHT", 10, -60);
addOffset("singLEFT", 250, -23);
addOffset("singDOWN", 20, -160);
addOffset('idleHair');
playAnim('idle'); playAnim('idle');
case 'monster': case 'monster':
tex = Paths.getSparrowAtlas('Monster_Assets'); tex = Paths.getSparrowAtlas('characters/Monster_Assets');
frames = tex; frames = tex;
quickAnimAdd('idle', 'monster idle'); quickAnimAdd('idle', 'monster idle');
quickAnimAdd('singUP', 'monster up note'); quickAnimAdd('singUP', 'monster up note');
@ -222,14 +189,11 @@ class Character extends FlxSprite
quickAnimAdd('singLEFT', 'Monster left note'); quickAnimAdd('singLEFT', 'Monster left note');
quickAnimAdd('singRIGHT', 'Monster Right note'); quickAnimAdd('singRIGHT', 'Monster Right note');
addOffset('idle'); loadOffsetFile(curCharacter);
addOffset("singUP", -20, 94);
addOffset("singRIGHT", -51, 30);
addOffset("singLEFT", -30, 20);
addOffset("singDOWN", -50, -80);
playAnim('idle'); playAnim('idle');
case 'monster-christmas': case 'monster-christmas':
tex = Paths.getSparrowAtlas('christmas/monsterChristmas'); tex = Paths.getSparrowAtlas('characters/monsterChristmas');
frames = tex; frames = tex;
quickAnimAdd('idle', 'monster idle'); quickAnimAdd('idle', 'monster idle');
quickAnimAdd('singUP', 'monster up note'); quickAnimAdd('singUP', 'monster up note');
@ -237,14 +201,11 @@ class Character extends FlxSprite
quickAnimAdd('singLEFT', 'Monster left note'); quickAnimAdd('singLEFT', 'Monster left note');
quickAnimAdd('singRIGHT', 'Monster Right note'); quickAnimAdd('singRIGHT', 'Monster Right note');
addOffset('idle'); loadOffsetFile(curCharacter);
addOffset("singUP", -20, 50);
addOffset("singRIGHT", -51);
addOffset("singLEFT", -30);
addOffset("singDOWN", -40, -94);
playAnim('idle'); playAnim('idle');
case 'pico': case 'pico':
tex = Paths.getSparrowAtlas('Pico_FNF_assetss'); tex = Paths.getSparrowAtlas('characters/Pico_FNF_assetss');
frames = tex; frames = tex;
quickAnimAdd('idle', "Pico Idle Dance"); quickAnimAdd('idle', "Pico Idle Dance");
quickAnimAdd('singUP', 'pico Up note0'); quickAnimAdd('singUP', 'pico Up note0');
@ -268,15 +229,7 @@ class Character extends FlxSprite
quickAnimAdd('singUPmiss', 'pico Up note miss'); quickAnimAdd('singUPmiss', 'pico Up note miss');
quickAnimAdd('singDOWNmiss', 'Pico Down Note MISS'); quickAnimAdd('singDOWNmiss', 'Pico Down Note MISS');
addOffset('idle'); loadOffsetFile(curCharacter);
addOffset("singUP", -29, 27);
addOffset("singRIGHT", -68, -7);
addOffset("singLEFT", 65, 9);
addOffset("singDOWN", 200, -70);
addOffset("singUPmiss", -19, 67);
addOffset("singRIGHTmiss", -60, 41);
addOffset("singLEFTmiss", 62, 64);
addOffset("singDOWNmiss", 210, -28);
playAnim('idle'); playAnim('idle');
@ -325,7 +278,7 @@ class Character extends FlxSprite
loadOffsetFile(curCharacter); loadOffsetFile(curCharacter);
case 'bf-christmas': case 'bf-christmas':
var tex = Paths.getSparrowAtlas('christmas/bfChristmas'); var tex = Paths.getSparrowAtlas('characters/bfChristmas');
frames = tex; frames = tex;
quickAnimAdd('idle', 'BF idle dance'); quickAnimAdd('idle', 'BF idle dance');
quickAnimAdd('singUP', 'BF NOTE UP0'); quickAnimAdd('singUP', 'BF NOTE UP0');
@ -338,22 +291,13 @@ class Character extends FlxSprite
quickAnimAdd('singDOWNmiss', 'BF NOTE DOWN MISS'); quickAnimAdd('singDOWNmiss', 'BF NOTE DOWN MISS');
quickAnimAdd('hey', 'BF HEY'); quickAnimAdd('hey', 'BF HEY');
addOffset('idle', -5); loadOffsetFile(curCharacter);
addOffset("singUP", -29, 27);
addOffset("singRIGHT", -38, -7);
addOffset("singLEFT", 12, -6);
addOffset("singDOWN", -10, -50);
addOffset("singUPmiss", -29, 27);
addOffset("singRIGHTmiss", -30, 21);
addOffset("singLEFTmiss", 12, 24);
addOffset("singDOWNmiss", -11, -19);
addOffset("hey", 7, 4);
playAnim('idle'); playAnim('idle');
flipX = true; flipX = true;
case 'bf-car': case 'bf-car':
var tex = Paths.getSparrowAtlas('bfCar'); var tex = Paths.getSparrowAtlas('characters/bfCar');
frames = tex; frames = tex;
quickAnimAdd('idle', 'BF idle dance'); quickAnimAdd('idle', 'BF idle dance');
quickAnimAdd('singUP', 'BF NOTE UP0'); quickAnimAdd('singUP', 'BF NOTE UP0');
@ -366,21 +310,13 @@ class Character extends FlxSprite
quickAnimAdd('singDOWNmiss', 'BF NOTE DOWN MISS'); quickAnimAdd('singDOWNmiss', 'BF NOTE DOWN MISS');
animation.addByIndices('idleHair', 'BF idle dance', [10, 11, 12, 13], "", 24, true); animation.addByIndices('idleHair', 'BF idle dance', [10, 11, 12, 13], "", 24, true);
addOffset('idle', -5); loadOffsetFile(curCharacter);
addOffset("singUP", -29, 27);
addOffset("singRIGHT", -38, -7);
addOffset("singLEFT", 12, -6);
addOffset("singDOWN", -10, -50);
addOffset("singUPmiss", -29, 27);
addOffset("singRIGHTmiss", -30, 21);
addOffset("singLEFTmiss", 12, 24);
addOffset("singDOWNmiss", -11, -19);
addOffset('idleHair', -5);
playAnim('idle'); playAnim('idle');
flipX = true; flipX = true;
case 'bf-pixel': case 'bf-pixel':
frames = Paths.getSparrowAtlas('weeb/bfPixel'); frames = Paths.getSparrowAtlas('characters/bfPixel');
quickAnimAdd('idle', 'BF IDLE'); quickAnimAdd('idle', 'BF IDLE');
quickAnimAdd('singUP', 'BF UP NOTE'); quickAnimAdd('singUP', 'BF UP NOTE');
quickAnimAdd('singLEFT', 'BF LEFT NOTE'); quickAnimAdd('singLEFT', 'BF LEFT NOTE');
@ -391,15 +327,7 @@ class Character extends FlxSprite
quickAnimAdd('singRIGHTmiss', 'BF RIGHT MISS'); quickAnimAdd('singRIGHTmiss', 'BF RIGHT MISS');
quickAnimAdd('singDOWNmiss', 'BF DOWN MISS'); quickAnimAdd('singDOWNmiss', 'BF DOWN MISS');
addOffset('idle'); loadOffsetFile(curCharacter);
addOffset("singUP");
addOffset("singRIGHT");
addOffset("singLEFT");
addOffset("singDOWN");
addOffset("singUPmiss");
addOffset("singRIGHTmiss");
addOffset("singLEFTmiss");
addOffset("singDOWNmiss");
setGraphicSize(Std.int(width * 6)); setGraphicSize(Std.int(width * 6));
updateHitbox(); updateHitbox();
@ -413,16 +341,15 @@ class Character extends FlxSprite
flipX = true; flipX = true;
case 'bf-pixel-dead': case 'bf-pixel-dead':
frames = Paths.getSparrowAtlas('weeb/bfPixelsDEAD'); frames = Paths.getSparrowAtlas('characters/bfPixelsDEAD');
quickAnimAdd('singUP', "BF Dies pixel"); quickAnimAdd('singUP', "BF Dies pixel");
quickAnimAdd('firstDeath', "BF Dies pixel"); quickAnimAdd('firstDeath', "BF Dies pixel");
animation.addByPrefix('deathLoop', "Retry Loop", 24, true); animation.addByPrefix('deathLoop', "Retry Loop", 24, true);
quickAnimAdd('deathConfirm', "RETRY CONFIRM"); quickAnimAdd('deathConfirm', "RETRY CONFIRM");
animation.play('firstDeath'); animation.play('firstDeath');
addOffset('firstDeath'); loadOffsetFile(curCharacter);
addOffset('deathLoop', -30, -12);
addOffset('deathConfirm', -30, -12);
playAnim('firstDeath'); playAnim('firstDeath');
// pixel bullshit // pixel bullshit
setGraphicSize(Std.int(width * 6)); setGraphicSize(Std.int(width * 6));
@ -431,7 +358,7 @@ class Character extends FlxSprite
flipX = true; flipX = true;
case 'senpai': case 'senpai':
frames = Paths.getSparrowAtlas('weeb/senpai'); frames = Paths.getSparrowAtlas('characters/senpai');
quickAnimAdd('idle', 'Senpai Idle'); quickAnimAdd('idle', 'Senpai Idle');
// at framerate 16.8 animation plays over 2 beats at 144bpm, // at framerate 16.8 animation plays over 2 beats at 144bpm,
// but if the game lags or the bpm is > 144 (mods etc.) // but if the game lags or the bpm is > 144 (mods etc.)
@ -443,11 +370,7 @@ class Character extends FlxSprite
quickAnimAdd('singRIGHT', 'SENPAI RIGHT NOTE'); quickAnimAdd('singRIGHT', 'SENPAI RIGHT NOTE');
quickAnimAdd('singDOWN', 'SENPAI DOWN NOTE'); quickAnimAdd('singDOWN', 'SENPAI DOWN NOTE');
addOffset('idle'); loadOffsetFile(curCharacter);
addOffset("singUP", 5, 37);
addOffset("singRIGHT");
addOffset("singLEFT", 40);
addOffset("singDOWN", 14);
playAnim('idle'); playAnim('idle');
@ -456,18 +379,15 @@ class Character extends FlxSprite
antialiasing = false; antialiasing = false;
case 'senpai-angry': case 'senpai-angry':
frames = Paths.getSparrowAtlas('weeb/senpai'); frames = Paths.getSparrowAtlas('characters/senpai');
quickAnimAdd('idle', 'Angry Senpai Idle'); quickAnimAdd('idle', 'Angry Senpai Idle');
quickAnimAdd('singUP', 'Angry Senpai UP NOTE'); quickAnimAdd('singUP', 'Angry Senpai UP NOTE');
quickAnimAdd('singLEFT', 'Angry Senpai LEFT NOTE'); quickAnimAdd('singLEFT', 'Angry Senpai LEFT NOTE');
quickAnimAdd('singRIGHT', 'Angry Senpai RIGHT NOTE'); quickAnimAdd('singRIGHT', 'Angry Senpai RIGHT NOTE');
quickAnimAdd('singDOWN', 'Angry Senpai DOWN NOTE'); quickAnimAdd('singDOWN', 'Angry Senpai DOWN NOTE');
addOffset('idle'); loadOffsetFile(curCharacter);
addOffset("singUP", 5, 37);
addOffset("singRIGHT");
addOffset("singLEFT", 40);
addOffset("singDOWN", 14);
playAnim('idle'); playAnim('idle');
setGraphicSize(Std.int(width * 6)); setGraphicSize(Std.int(width * 6));
@ -476,18 +396,14 @@ class Character extends FlxSprite
antialiasing = false; antialiasing = false;
case 'spirit': case 'spirit':
frames = Paths.getPackerAtlas('weeb/spirit'); frames = Paths.getPackerAtlas('characters/spirit');
quickAnimAdd('idle', "idle spirit_"); quickAnimAdd('idle', "idle spirit_");
quickAnimAdd('singUP', "up_"); quickAnimAdd('singUP', "up_");
quickAnimAdd('singRIGHT', "right_"); quickAnimAdd('singRIGHT', "right_");
quickAnimAdd('singLEFT', "left_"); quickAnimAdd('singLEFT', "left_");
quickAnimAdd('singDOWN', "spirit down_"); quickAnimAdd('singDOWN', "spirit down_");
addOffset('idle', -220, -280); loadOffsetFile(curCharacter);
addOffset('singUP', -220, -240);
addOffset("singRIGHT", -220, -280);
addOffset("singLEFT", -200, -280);
addOffset("singDOWN", 170, 110);
setGraphicSize(Std.int(width * 6)); setGraphicSize(Std.int(width * 6));
updateHitbox(); updateHitbox();
@ -497,7 +413,7 @@ class Character extends FlxSprite
antialiasing = false; antialiasing = false;
case 'parents-christmas': case 'parents-christmas':
frames = Paths.getSparrowAtlas('christmas/mom_dad_christmas_assets'); frames = Paths.getSparrowAtlas('characters/mom_dad_christmas_assets');
quickAnimAdd('idle', 'Parent Christmas Idle'); quickAnimAdd('idle', 'Parent Christmas Idle');
quickAnimAdd('singUP', 'Parent Up Note Dad'); quickAnimAdd('singUP', 'Parent Up Note Dad');
quickAnimAdd('singDOWN', 'Parent Down Note Dad'); quickAnimAdd('singDOWN', 'Parent Down Note Dad');
@ -510,15 +426,7 @@ class Character extends FlxSprite
quickAnimAdd('singLEFT-alt', 'Parent Left Note Mom'); quickAnimAdd('singLEFT-alt', 'Parent Left Note Mom');
quickAnimAdd('singRIGHT-alt', 'Parent Right Note Mom'); quickAnimAdd('singRIGHT-alt', 'Parent Right Note Mom');
addOffset('idle'); loadOffsetFile(curCharacter);
addOffset("singUP", -47, 24);
addOffset("singRIGHT", -1, -23);
addOffset("singLEFT", -30, 16);
addOffset("singDOWN", -31, -29);
addOffset("singUP-alt", -47, 24);
addOffset("singRIGHT-alt", -1, -24);
addOffset("singLEFT-alt", -30, 15);
addOffset("singDOWN-alt", -30, -27);
playAnim('idle'); playAnim('idle');
case 'tankman': case 'tankman':
@ -594,7 +502,15 @@ class Character extends FlxSprite
} }
} }
TankmenBG.animationNotes = animationNotes;
trace(animationNotes); trace(animationNotes);
animationNotes.sort(sortAnims);
}
function sortAnims(val1:Array<Dynamic>, val2:Array<Dynamic>):Int
{
return FlxSort.byValues(FlxSort.ASCENDING, val1[0], val2[0]);
} }
function quickAnimAdd(name:String, prefix:String) function quickAnimAdd(name:String, prefix:String)
@ -664,6 +580,11 @@ class Character extends FlxSprite
animationNotes.shift(); animationNotes.shift();
} }
} }
if (animation.curAnim.finished)
{
playAnim(animation.curAnim.name, false, false, animation.curAnim.numFrames - 3);
}
} }
super.update(elapsed); super.update(elapsed);

View file

@ -1,5 +1,13 @@
package; package;
import flixel.FlxG;
import flixel.graphics.FlxGraphic;
import flixel.graphics.frames.FlxAtlasFrames;
import flixel.math.FlxPoint;
import flixel.math.FlxRect;
import flixel.system.FlxAssets.FlxGraphicAsset;
import haxe.Json;
import lime.math.Rectangle;
import lime.utils.Assets; import lime.utils.Assets;
using StringTools; using StringTools;
@ -34,4 +42,63 @@ class CoolUtil
} }
return dumbArray; return dumbArray;
} }
public static function fromAnimate(Source:FlxGraphicAsset, Description:String):FlxAtlasFrames
{
var graphic:FlxGraphic = FlxG.bitmap.add(Source);
if (graphic == null)
return null;
var frames:FlxAtlasFrames = FlxAtlasFrames.findFrame(graphic);
if (frames != null)
return frames;
if (graphic == null || Description == null)
return null;
frames = new FlxAtlasFrames(graphic);
var data:AnimateObject;
var json:String = Description;
trace(json);
if (Assets.exists(json))
json = Assets.getText(json);
data = cast Json.parse(json).ATLAS;
for (sprite in data.SPRITES)
{
// probably nicer way to do this? Oh well
var swagSprite:AnimateSprite = sprite.SPRITE;
var rect = FlxRect.get(swagSprite.x, swagSprite.y, swagSprite.w, swagSprite.h);
var size = new Rectangle(0, 0, rect.width, rect.height);
var offset = FlxPoint.get(-size.left, -size.top);
var sourceSize = FlxPoint.get(size.width, size.height);
frames.addAtlasFrame(rect, sourceSize, offset, swagSprite.name);
}
return frames;
}
}
typedef AnimateObject =
{
SPRITES:Array<Dynamic>
}
typedef AnimateSprite =
{
var name:String;
var x:Int;
var y:Int;
var w:Int;
var h:Int;
var rotated:Bool;
} }

View file

@ -150,6 +150,7 @@ class DialogueBox extends FlxSpriteGroup
var dialogueOpened:Bool = false; var dialogueOpened:Bool = false;
var dialogueStarted:Bool = false; var dialogueStarted:Bool = false;
var dialogueEnded:Bool = false;
override function update(elapsed:Float) override function update(elapsed:Float)
{ {
@ -180,7 +181,7 @@ class DialogueBox extends FlxSpriteGroup
dialogueStarted = true; dialogueStarted = true;
} }
if (FlxG.keys.justPressed.ANY && dialogueStarted == true) if (FlxG.keys.justPressed.ANY && dialogueEnded)
{ {
remove(dialogue); remove(dialogue);
@ -219,6 +220,8 @@ class DialogueBox extends FlxSpriteGroup
startDialogue(); startDialogue();
} }
} }
else if (FlxG.keys.justPressed.ANY && dialogueStarted)
swagDialogue.skip();
super.update(elapsed); super.update(elapsed);
} }
@ -239,8 +242,10 @@ class DialogueBox extends FlxSpriteGroup
{ {
trace("dialogue finish"); trace("dialogue finish");
handSelect.visible = true; handSelect.visible = true;
dialogueEnded = true;
}; };
handSelect.visible = false; handSelect.visible = false;
dialogueEnded = false;
switch (curCharacter) switch (curCharacter)
{ {

View file

@ -1,12 +1,16 @@
package; package;
import Sys.sleep; import Sys.sleep;
import discord_rpc.DiscordRpc;
using StringTools; using StringTools;
#if discord_rpc
import discord_rpc.DiscordRpc;
#end
class DiscordClient class DiscordClient
{ {
#if discord_rpc
public function new() public function new()
{ {
trace("Discord Client starting..."); trace("Discord Client starting...");
@ -79,4 +83,5 @@ class DiscordClient
// trace('Discord RPC Updated. Arguments: $details, $state, $smallImageKey, $hasStartTimestamp, $endTimestamp'); // trace('Discord RPC Updated. Arguments: $details, $state, $smallImageKey, $hasStartTimestamp, $endTimestamp');
} }
#end
} }

View file

@ -64,6 +64,8 @@ class Main extends Sprite
var netStream:NetStream; var netStream:NetStream;
private var overlay:Sprite; private var overlay:Sprite;
public static var fpsCounter:FPS;
private function setupGame():Void private function setupGame():Void
{ {
var stageWidth:Int = Lib.current.stage.stageWidth; var stageWidth:Int = Lib.current.stage.stageWidth;
@ -85,7 +87,8 @@ class Main extends Sprite
addChild(new FlxGame(gameWidth, gameHeight, initialState, zoom, framerate, framerate, skipSplash, startFullscreen)); addChild(new FlxGame(gameWidth, gameHeight, initialState, zoom, framerate, framerate, skipSplash, startFullscreen));
#if !mobile #if !mobile
addChild(new FPS(10, 3, 0xFFFFFF)); fpsCounter = new FPS(10, 3, 0xFFFFFF);
addChild(fpsCounter);
#end #end
/* /*
video = new Video(); video = new Video();

View file

@ -218,6 +218,7 @@ class MainMenuState extends MusicBeatState
function startExitState(state:FlxState) function startExitState(state:FlxState)
{ {
menuItems.enabled = false; // disable for exit
var duration = 0.4; var duration = 0.4;
menuItems.forEach(function(item) menuItems.forEach(function(item)
{ {
@ -241,7 +242,10 @@ class MainMenuState extends MusicBeatState
FlxG.sound.music.volume += 0.5 * FlxG.elapsed; FlxG.sound.music.volume += 0.5 * FlxG.elapsed;
} }
if (menuItems.enabled && controls.BACK) if (_exiting)
menuItems.enabled = false;
if (controls.BACK && menuItems.enabled && !menuItems.busy)
FlxG.switchState(new TitleState()); FlxG.switchState(new TitleState());
super.update(elapsed); super.update(elapsed);

View file

@ -2,6 +2,7 @@ package;
import Conductor.BPMChangeEvent; import Conductor.BPMChangeEvent;
import flixel.FlxG; import flixel.FlxG;
import flixel.FlxGame;
import flixel.addons.transition.FlxTransitionableState; import flixel.addons.transition.FlxTransitionableState;
import flixel.addons.ui.FlxUIState; import flixel.addons.ui.FlxUIState;
import flixel.math.FlxRect; import flixel.math.FlxRect;

View file

@ -7,6 +7,7 @@ import flixel.math.FlxMath;
import flixel.util.FlxColor; import flixel.util.FlxColor;
import flixel.util.FlxTimer; import flixel.util.FlxTimer;
import shaderslmfao.ColorSwap; import shaderslmfao.ColorSwap;
import ui.PreferencesMenu;
using StringTools; using StringTools;
@ -144,6 +145,9 @@ class Note extends FlxSprite
noteScore * 0.2; noteScore * 0.2;
alpha = 0.6; alpha = 0.6;
if (PreferencesMenu.getPref('downscroll'))
angle = 180;
x += width / 2; x += width / 2;
switch (noteData) switch (noteData)

View file

@ -169,7 +169,10 @@ class PauseSubState extends MusicBeatSubstate
FlxG.resetState(); FlxG.resetState();
case "Exit to menu": case "Exit to menu":
PlayState.deathCounter = 0; PlayState.deathCounter = 0;
FlxG.switchState(new MainMenuState()); if (PlayState.isStoryMode)
FlxG.switchState(new StoryMenuState());
else
FlxG.switchState(new FreeplayState());
} }
} }

View file

@ -35,6 +35,7 @@ import flixel.util.FlxStringUtil;
import flixel.util.FlxTimer; import flixel.util.FlxTimer;
import haxe.Json; import haxe.Json;
import lime.utils.Assets; import lime.utils.Assets;
import openfl.Lib;
import openfl.display.BlendMode; import openfl.display.BlendMode;
import openfl.display.StageQuality; import openfl.display.StageQuality;
import openfl.filters.ShaderFilter; import openfl.filters.ShaderFilter;
@ -148,6 +149,9 @@ class PlayState extends MusicBeatState
if (FlxG.sound.music != null) if (FlxG.sound.music != null)
FlxG.sound.music.stop(); FlxG.sound.music.stop();
FlxG.sound.cache(Paths.inst(PlayState.SONG.song));
FlxG.sound.cache(Paths.voices(PlayState.SONG.song));
// var gameCam:FlxCamera = FlxG.camera; // var gameCam:FlxCamera = FlxG.camera;
camGame = new FlxCamera(); camGame = new FlxCamera();
camHUD = new FlxCamera(); camHUD = new FlxCamera();
@ -156,6 +160,11 @@ class PlayState extends MusicBeatState
FlxG.cameras.reset(camGame); FlxG.cameras.reset(camGame);
FlxG.cameras.add(camHUD, false); FlxG.cameras.add(camHUD, false);
// fake notesplash cache type deal so that it loads in the graphic?
var noteSplash:NoteSplash = new NoteSplash(100, 100, 0);
add(noteSplash);
noteSplash.alpha = 0.1;
persistentUpdate = true; persistentUpdate = true;
persistentDraw = true; persistentDraw = true;
@ -194,7 +203,9 @@ class PlayState extends MusicBeatState
dialogue = CoolUtil.coolTextFile(Paths.txt('thorns/thornsDialogue')); dialogue = CoolUtil.coolTextFile(Paths.txt('thorns/thornsDialogue'));
} }
#if discord_rpc
initDiscord(); initDiscord();
#end
switch (SONG.song.toLowerCase()) switch (SONG.song.toLowerCase())
{ {
@ -492,50 +503,64 @@ class PlayState extends MusicBeatState
*/ */
case 'guns' | 'stress' | 'ugh': case 'guns' | 'stress' | 'ugh':
// defaultCamZoom = 0.95; defaultCamZoom = 0.90;
curStage = 'tank'; curStage = 'tank';
var bg:BGSprite = new BGSprite('tankSky', 0, -200, 0, 0); var bg:BGSprite = new BGSprite('tankSky', -400, -400, 0, 0);
add(bg); add(bg);
var tankSky:BGSprite = new BGSprite('tankClouds', 0, 10, 0.1, 0.1); var tankSky:BGSprite = new BGSprite('tankClouds', FlxG.random.int(-700, -100), FlxG.random.int(-20, 20), 0.1, 0.1);
tankSky.active = true;
tankSky.velocity.x = FlxG.random.float(5, 15);
add(tankSky); add(tankSky);
var tankMountains:BGSprite = new BGSprite('tankMountains', -100, 150, 0.2, 0.2); var tankMountains:BGSprite = new BGSprite('tankMountains', -200, 90, 0.2, 0.2);
tankMountains.setGraphicSize(Std.int(tankMountains.width * 1.1));
tankMountains.updateHitbox();
add(tankMountains); add(tankMountains);
var tankBuildings:BGSprite = new BGSprite('tankBuildings', -200, 370, 0.25, 0.25); var tankBuildings:BGSprite = new BGSprite('tankBuildings', -200, 200, 0.25, 0.25);
add(tankBuildings); add(tankBuildings);
var tankRuins:BGSprite = new BGSprite('tankRuins', -200, 170, 0.35, 0.35); var tankRuins:BGSprite = new BGSprite('tankRuins', -200, 0, 0.35, 0.35);
add(tankRuins); add(tankRuins);
var tankWatchtower:BGSprite = new BGSprite('tankWatchtower', 300, 50, 0.5, 0.5); var smokeLeft:BGSprite = new BGSprite('smokeLeft', -200, -100, 0.4, 0.4, ['SmokeBlurLeft'], true);
add(smokeLeft);
var smokeRight:BGSprite = new BGSprite('smokeRight', 1100, -100, 0.4, 0.4, ['SmokeRight'], true);
add(smokeRight);
var tankWatchtower:BGSprite = new BGSprite('tankWatchtower', 100, 50, 0.5, 0.5);
add(tankWatchtower); add(tankWatchtower);
var tankGround:BGSprite = new BGSprite('tankGround', -200, -20); var tankGround:BGSprite = new BGSprite('tankGround', -420, -150);
tankGround.setGraphicSize(Std.int(tankGround.width * 1.15));
tankGround.updateHitbox();
add(tankGround); add(tankGround);
tankmanRun = new FlxTypedGroup<TankmenBG>(); tankmanRun = new FlxTypedGroup<TankmenBG>();
add(tankmanRun); add(tankmanRun);
var fgTank0:BGSprite = new BGSprite('tank0', -290, 400, 1.7, 1.5, ['fg']); // smokeLeft.screenCenter();
var fgTank0:BGSprite = new BGSprite('tank0', -500, 650, 1.7, 1.5, ['fg']);
foregroundSprites.add(fgTank0); foregroundSprites.add(fgTank0);
var fgTank1:BGSprite = new BGSprite('tank1', -100, 680, 2, 0.2, ['fg']); var fgTank1:BGSprite = new BGSprite('tank1', -300, 700, 2, 0.2, ['fg']);
foregroundSprites.add(fgTank1); foregroundSprites.add(fgTank1);
// just called 'foreground' just cuz small inconsistency no bbiggei // just called 'foreground' just cuz small inconsistency no bbiggei
var fgTank2:BGSprite = new BGSprite('tank2', 450, 840, 1.5, 1.5, ['foreground']); var fgTank2:BGSprite = new BGSprite('tank2', 450, 940, 1.5, 1.5, ['foreground']);
foregroundSprites.add(fgTank2); foregroundSprites.add(fgTank2);
var fgTank4:BGSprite = new BGSprite('tank4', 1000, 880, 1.5, 1.5, ['fg']); var fgTank4:BGSprite = new BGSprite('tank4', 1200, 1080, 1.5, 1.5, ['fg']);
foregroundSprites.add(fgTank4); foregroundSprites.add(fgTank4);
var fgTank5:BGSprite = new BGSprite('tank5', 1400, 600, 1.5, 1.5, ['fg']); var fgTank5:BGSprite = new BGSprite('tank5', 1800, 900, 1.5, 1.5, ['fg']);
foregroundSprites.add(fgTank5); foregroundSprites.add(fgTank5);
var fgTank3:BGSprite = new BGSprite('tank3', 1300, 1130, 3.5, 2.5, ['fg']); var fgTank3:BGSprite = new BGSprite('tank3', 1300, 1430, 3.5, 2.5, ['fg']);
foregroundSprites.add(fgTank3); foregroundSprites.add(fgTank3);
default: default:
@ -591,6 +616,16 @@ class PlayState extends MusicBeatState
case 'pico-speaker': case 'pico-speaker':
gf.x -= 50; gf.x -= 50;
gf.y -= 200; gf.y -= 200;
for (i in 0...TankmenBG.animationNotes.length)
{
if (FlxG.random.bool(50))
{
var tankman:TankmenBG = new TankmenBG(500, 200 + FlxG.random.int(0, 150), TankmenBG.animationNotes[i][1] < 2);
tankman.strumTime = TankmenBG.animationNotes[i][0];
tankmanRun.add(tankman);
}
}
} }
dad = new Character(100, 100, SONG.player2); dad = new Character(100, 100, SONG.player2);
@ -642,7 +677,7 @@ class PlayState extends MusicBeatState
switch (SONG.player1) switch (SONG.player1)
{ {
case "bf-holding-gf": case "bf-holding-gf":
boyfriend.y -= 140; // boyfriend.y -= 140;
} }
// REPOSITIONING PER STAGE // REPOSITIONING PER STAGE
@ -679,6 +714,19 @@ class PlayState extends MusicBeatState
boyfriend.y += 220; boyfriend.y += 220;
gf.x += 180; gf.x += 180;
gf.y += 300; gf.y += 300;
case "tank":
gf.y += 10;
gf.x -= 30;
boyfriend.x += 40;
boyfriend.y += 0;
dad.y += 60;
dad.x -= 80;
if (gfVersion != 'pico-speaker')
{
gf.x -= 80;
gf.y -= 75;
}
} }
add(gf); add(gf);
@ -701,6 +749,12 @@ class PlayState extends MusicBeatState
Conductor.songPosition = -5000; Conductor.songPosition = -5000;
strumLine = new FlxSprite(0, 50).makeGraphic(FlxG.width, 10); strumLine = new FlxSprite(0, 50).makeGraphic(FlxG.width, 10);
if (PreferencesMenu.getPref('downscroll'))
{
strumLine.y = FlxG.height - 150; // 150 just random ass number lol
}
strumLine.scrollFactor.set(); strumLine.scrollFactor.set();
strumLineNotes = new FlxTypedGroup<FlxSprite>(); strumLineNotes = new FlxTypedGroup<FlxSprite>();
@ -740,6 +794,9 @@ class PlayState extends MusicBeatState
healthBarBG.scrollFactor.set(); healthBarBG.scrollFactor.set();
add(healthBarBG); add(healthBarBG);
if (PreferencesMenu.getPref('downscroll'))
healthBarBG.y = FlxG.height * 0.1;
healthBar = new FlxBar(healthBarBG.x + 4, healthBarBG.y + 4, RIGHT_TO_LEFT, Std.int(healthBarBG.width - 8), Std.int(healthBarBG.height - 8), this, healthBar = new FlxBar(healthBarBG.x + 4, healthBarBG.y + 4, RIGHT_TO_LEFT, Std.int(healthBarBG.width - 8), Std.int(healthBarBG.height - 8), this,
'health', 0, 2); 'health', 0, 2);
healthBar.scrollFactor.set(); healthBar.scrollFactor.set();
@ -748,7 +805,7 @@ class PlayState extends MusicBeatState
add(healthBar); add(healthBar);
scoreTxt = new FlxText(healthBarBG.x + healthBarBG.width - 190, healthBarBG.y + 30, 0, "", 20); scoreTxt = new FlxText(healthBarBG.x + healthBarBG.width - 190, healthBarBG.y + 30, 0, "", 20);
scoreTxt.setFormat(Paths.font("vcr.ttf"), 16, FlxColor.WHITE, RIGHT); scoreTxt.setFormat(Paths.font("vcr.ttf"), 16, FlxColor.WHITE, RIGHT, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK);
scoreTxt.scrollFactor.set(); scoreTxt.scrollFactor.set();
add(scoreTxt); add(scoreTxt);
@ -941,7 +998,7 @@ class PlayState extends MusicBeatState
}); });
} }
var startTimer:FlxTimer; var startTimer:FlxTimer = new FlxTimer();
var perfectMode:Bool = false; var perfectMode:Bool = false;
function startCountdown():Void function startCountdown():Void
@ -958,7 +1015,7 @@ class PlayState extends MusicBeatState
var swagCounter:Int = 0; var swagCounter:Int = 0;
startTimer = new FlxTimer().start(Conductor.crochet / 1000, function(tmr:FlxTimer) startTimer.start(Conductor.crochet / 1000, function(tmr:FlxTimer)
{ {
// this just based on beatHit stuff but compact // this just based on beatHit stuff but compact
if (swagCounter % gfSpeed == 0) if (swagCounter % gfSpeed == 0)
@ -1176,11 +1233,23 @@ class PlayState extends MusicBeatState
generatedMusic = true; generatedMusic = true;
} }
// Now you are probably wondering why I made 2 of these very similar functions
// sortByShit(), and sortNotes(). sortNotes is meant to be used by both sortByShit(), and the notes FlxGroup
// sortByShit() is meant to be used only by the unspawnNotes array.
// and the array sorting function doesnt need that order variable thingie
// this is good enough for now lololol HERE IS COMMENT FOR THIS SORTA DUMB DECISION LOL
function sortByShit(Obj1:Note, Obj2:Note):Int function sortByShit(Obj1:Note, Obj2:Note):Int
{ {
return FlxSort.byValues(FlxSort.ASCENDING, Obj1.strumTime, Obj2.strumTime); return sortNotes(FlxSort.ASCENDING, Obj1, Obj2);
} }
function sortNotes(order:Int = FlxSort.ASCENDING, Obj1:Note, Obj2:Note)
{
return FlxSort.byValues(order, Obj1.strumTime, Obj2.strumTime);
}
// ^ These two sorts also look cute together ^
private function generateStaticArrows(player:Int):Void private function generateStaticArrows(player:Int):Void
{ {
for (i in 0...4) for (i in 0...4)
@ -1563,6 +1632,8 @@ class PlayState extends MusicBeatState
} }
// better streaming of shit // better streaming of shit
if (!inCutscene && !_exiting)
{
// RESET = Quick Game Over Screen // RESET = Quick Game Over Screen
if (controls.RESET) if (controls.RESET)
{ {
@ -1600,17 +1671,15 @@ class PlayState extends MusicBeatState
DiscordClient.changePresence("Game Over - " + detailsText, SONG.song + " (" + storyDifficultyText + ")", iconRPC); DiscordClient.changePresence("Game Over - " + detailsText, SONG.song + " (" + storyDifficultyText + ")", iconRPC);
#end #end
} }
}
if (unspawnNotes[0] != null) while (unspawnNotes[0] != null && unspawnNotes[0].strumTime - Conductor.songPosition < 1800 / SONG.speed)
{
if (unspawnNotes[0].strumTime - Conductor.songPosition < 1500)
{ {
var dunceNote:Note = unspawnNotes[0]; var dunceNote:Note = unspawnNotes[0];
notes.add(dunceNote); notes.add(dunceNote);
var index:Int = unspawnNotes.indexOf(dunceNote); var index:Int = unspawnNotes.indexOf(dunceNote);
unspawnNotes.splice(index, 1); unspawnNotes.shift();
}
} }
if (generatedMusic) if (generatedMusic)
@ -1628,19 +1697,46 @@ class PlayState extends MusicBeatState
daNote.active = true; daNote.active = true;
} }
var strumLineMid = strumLine.y + Note.swagWidth / 2;
if (PreferencesMenu.getPref('downscroll'))
{
daNote.y = (strumLine.y + (Conductor.songPosition - daNote.strumTime) * (0.45 * FlxMath.roundDecimal(SONG.speed, 2)));
if (daNote.isSustainNote)
{
if (daNote.animation.curAnim.name.endsWith("end") && daNote.prevNote != null)
daNote.y += daNote.prevNote.height;
else
daNote.y += daNote.height / daNote.scale.y;
if ((!daNote.mustPress || (daNote.wasGoodHit || (daNote.prevNote.wasGoodHit && !daNote.canBeHit)))
&& daNote.y - daNote.offset.y * daNote.scale.y + daNote.height >= strumLineMid)
{
// div by scale because cliprect is affected by scale i THINK
var swagRect:FlxRect = new FlxRect(0, 0, daNote.width / daNote.scale.x, daNote.height / daNote.scale.y);
swagRect.height = (strumLineMid - daNote.y) / daNote.scale.y;
swagRect.y = daNote.height / daNote.scale.y - swagRect.height;
daNote.clipRect = swagRect;
}
}
}
else
{
daNote.y = (strumLine.y - (Conductor.songPosition - daNote.strumTime) * (0.45 * FlxMath.roundDecimal(SONG.speed, 2))); daNote.y = (strumLine.y - (Conductor.songPosition - daNote.strumTime) * (0.45 * FlxMath.roundDecimal(SONG.speed, 2)));
// i am so fucking sorry for this if condition
if (daNote.isSustainNote if (daNote.isSustainNote
&& daNote.y + daNote.offset.y <= strumLine.y + Note.swagWidth / 2 && (!daNote.mustPress || (daNote.wasGoodHit || (daNote.prevNote.wasGoodHit && !daNote.canBeHit)))
&& (!daNote.mustPress || (daNote.wasGoodHit || (daNote.prevNote.wasGoodHit && !daNote.canBeHit)))) && daNote.y + daNote.offset.y * daNote.scale.y <= strumLineMid)
{ {
var swagRect = new FlxRect(0, strumLine.y + Note.swagWidth / 2 - daNote.y, daNote.width * 2, daNote.height * 2); var swagRect:FlxRect = new FlxRect(0, 0, daNote.width / daNote.scale.x, daNote.height / daNote.scale.y);
swagRect.y /= daNote.scale.y;
swagRect.height -= swagRect.y;
swagRect.y = (strumLineMid - daNote.y) / daNote.scale.y;
swagRect.height -= swagRect.y;
daNote.clipRect = swagRect; daNote.clipRect = swagRect;
} }
}
if (!daNote.mustPress && daNote.wasGoodHit) if (!daNote.mustPress && daNote.wasGoodHit)
{ {
@ -1680,7 +1776,12 @@ class PlayState extends MusicBeatState
// WIP interpolation shit? Need to fix the pause issue // WIP interpolation shit? Need to fix the pause issue
// daNote.y = (strumLine.y - (songTime - daNote.strumTime) * (0.45 * PlayState.SONG.speed)); // daNote.y = (strumLine.y - (songTime - daNote.strumTime) * (0.45 * PlayState.SONG.speed));
if (daNote.y < -daNote.height) var noteMiss:Bool = daNote.y < -daNote.height;
if (PreferencesMenu.getPref('downscroll'))
noteMiss = daNote.y > FlxG.height;
if (noteMiss)
{ {
if (daNote.tooLate || !daNote.wasGoodHit) if (daNote.tooLate || !daNote.wasGoodHit)
{ {
@ -2014,8 +2115,18 @@ class PlayState extends MusicBeatState
{ {
// control arrays, order L D R U // control arrays, order L D R U
var holdArray:Array<Bool> = [controls.NOTE_LEFT, controls.NOTE_DOWN, controls.NOTE_UP, controls.NOTE_RIGHT]; var holdArray:Array<Bool> = [controls.NOTE_LEFT, controls.NOTE_DOWN, controls.NOTE_UP, controls.NOTE_RIGHT];
var pressArray:Array<Bool> = [controls.NOTE_LEFT_P, controls.NOTE_DOWN_P, controls.NOTE_UP_P, controls.NOTE_RIGHT_P]; var pressArray:Array<Bool> = [
var releaseArray:Array<Bool> = [controls.NOTE_LEFT_R, controls.NOTE_DOWN_R, controls.NOTE_UP_R, controls.NOTE_RIGHT_R]; controls.NOTE_LEFT_P,
controls.NOTE_DOWN_P,
controls.NOTE_UP_P,
controls.NOTE_RIGHT_P
];
var releaseArray:Array<Bool> = [
controls.NOTE_LEFT_R,
controls.NOTE_DOWN_R,
controls.NOTE_UP_R,
controls.NOTE_RIGHT_R
];
// HOLDS, check for sustain notes // HOLDS, check for sustain notes
if (holdArray.contains(true) && /*!boyfriend.stunned && */ generatedMusic) if (holdArray.contains(true) && /*!boyfriend.stunned && */ generatedMusic)
@ -2318,7 +2429,8 @@ class PlayState extends MusicBeatState
override function stepHit() override function stepHit()
{ {
super.stepHit(); super.stepHit();
if (Math.abs(FlxG.sound.music.time - Conductor.songPosition) > 20 || (SONG.needsVoices && Math.abs(vocals.time - Conductor.songPosition) > 20)) if (Math.abs(FlxG.sound.music.time - Conductor.songPosition) > 20
|| (SONG.needsVoices && Math.abs(vocals.time - Conductor.songPosition) > 20))
{ {
resyncVocals(); resyncVocals();
} }
@ -2338,7 +2450,7 @@ class PlayState extends MusicBeatState
if (generatedMusic) if (generatedMusic)
{ {
notes.sort(FlxSort.byY, FlxSort.DESCENDING); notes.sort(sortNotes, FlxSort.DESCENDING);
} }
if (SONG.notes[Math.floor(curStep / 16)] != null) if (SONG.notes[Math.floor(curStep / 16)] != null)
@ -2452,17 +2564,6 @@ class PlayState extends MusicBeatState
} }
} }
switch (curSong.toLowerCase())
{
case 'stress':
if (FlxG.random.bool())
{
var tank:TankmenBG = new TankmenBG(500, 200);
tank.strumTime = Conductor.songPosition + (Conductor.crochet * 4);
tankmanRun.add(tank);
}
}
if (isHalloween && FlxG.random.bool(10) && curBeat > lightningStrikeBeat + lightningOffset) if (isHalloween && FlxG.random.bool(10) && curBeat > lightningStrikeBeat + lightningOffset)
{ {
lightningStrikeShit(); lightningStrikeShit();

View file

@ -6,13 +6,15 @@ import haxe.display.Display.Package;
class TankmenBG extends FlxSprite class TankmenBG extends FlxSprite
{ {
public static var animationNotes:Array<Dynamic> = [];
public var strumTime:Float = 0; public var strumTime:Float = 0;
public var goingRight:Bool = false; public var goingRight:Bool = false;
public var tankSpeed:Float = 0.7; public var tankSpeed:Float = 0.7;
public var endingOffset:Float; public var endingOffset:Float;
public function new(x:Float, y:Float) public function new(x:Float, y:Float, isGoingRight:Bool)
{ {
super(x, y); super(x, y);
@ -24,13 +26,12 @@ class TankmenBG extends FlxSprite
animation.addByPrefix('shot', 'John', 24, false); animation.addByPrefix('shot', 'John', 24, false);
animation.play('run'); animation.play('run');
animation.curAnim.curFrame = FlxG.random.int(0, animation.curAnim.numFrames - 1);
y += FlxG.random.int(-40, 100); goingRight = isGoingRight;
endingOffset = FlxG.random.float(50, 200);
goingRight = FlxG.random.bool(); tankSpeed = FlxG.random.float(0.6, 1);
endingOffset = FlxG.random.float(0, 120);
tankSpeed = FlxG.random.float(0.65, 0.8);
if (goingRight) if (goingRight)
flipX = true; flipX = true;

View file

@ -1,6 +1,5 @@
package; package;
import animate.AnimationAtlas;
import flixel.FlxG; import flixel.FlxG;
import flixel.FlxSprite; import flixel.FlxSprite;
import flixel.addons.transition.FlxTransitionSprite.GraphicTransTileDiamond; import flixel.addons.transition.FlxTransitionSprite.GraphicTransTileDiamond;
@ -53,8 +52,6 @@ class TitleState extends MusicBeatState
polymod.Polymod.init({modRoot: "mods", dirs: ['introMod'], framework: OPENFL}); polymod.Polymod.init({modRoot: "mods", dirs: ['introMod'], framework: OPENFL});
#end #end
AnimationAtlas.fromAnimate(Paths.image('money'), Paths.file('images/money.json'));
swagShader = new ColorSwap(); swagShader = new ColorSwap();
FlxG.sound.muteKeys = [ZERO]; FlxG.sound.muteKeys = [ZERO];
@ -65,9 +62,8 @@ class TitleState extends MusicBeatState
super.create(); super.create();
PreferencesMenu.initPrefs();
FlxG.save.bind('funkin', 'ninjamuffin99'); FlxG.save.bind('funkin', 'ninjamuffin99');
PreferencesMenu.initPrefs();
PlayerSettings.init(); PlayerSettings.init();
Highscore.load(); Highscore.load();
@ -198,6 +194,10 @@ class TitleState extends MusicBeatState
blackScreen = new FlxSprite().makeGraphic(FlxG.width, FlxG.height, FlxColor.BLACK); blackScreen = new FlxSprite().makeGraphic(FlxG.width, FlxG.height, FlxColor.BLACK);
credGroup.add(blackScreen); credGroup.add(blackScreen);
// var atlasBullShit:FlxSprite = new FlxSprite();
// atlasBullShit.frames = CoolUtil.fromAnimate(Paths.image('money'), Paths.file('images/money.json'));
// credGroup.add(atlasBullShit);
credTextShit = new Alphabet(0, 0, "ninjamuffin99\nPhantomArcade\nkawaisprite\nevilsk8er", true); credTextShit = new Alphabet(0, 0, "ninjamuffin99\nPhantomArcade\nkawaisprite\nevilsk8er", true);
credTextShit.screenCenter(); credTextShit.screenCenter();

View file

@ -1,11 +0,0 @@
package animate;
import flixel.group.FlxGroup;
class Aniamtion extends FlxGroup
{
public function new(symbolName:String, atlas:AnimationAtlas):Void
{
super();
}
}

View file

@ -1,78 +0,0 @@
package animate;
import flixel.FlxG;
import flixel.addons.ui.FlxUIColorSwatchSelecter.SwatchGraphic;
import flixel.graphics.FlxGraphic;
import flixel.graphics.frames.FlxAtlasFrames;
import flixel.math.FlxPoint;
import flixel.math.FlxRect;
import flixel.system.FlxAssets.FlxGraphicAsset;
import haxe.Json;
import openfl.Assets;
import openfl.geom.Rectangle;
class AnimationAtlas
{
public function new(data:Dynamic, atlas:FlxAtlasFrames):Void {}
public static function fromAnimate(Source:FlxGraphicAsset, Description:String):FlxAtlasFrames
{
var graphic:FlxGraphic = FlxG.bitmap.add(Source);
if (graphic == null)
return null;
var frames:FlxAtlasFrames = FlxAtlasFrames.findFrame(graphic);
if (frames != null)
return frames;
if (graphic == null || Description == null)
return null;
frames = new FlxAtlasFrames(graphic);
var data:AnimateObject;
var json:String = Description;
trace(json);
if (Assets.exists(json))
json = Assets.getText(json);
trace(json);
data = cast Json.parse(json).ATLAS;
for (sprite in data.SPRITES)
{
// probably nicer way to do this? Oh well
var swagSprite:AnimateSprite = sprite.SPRITE;
var rect = FlxRect.get(swagSprite.x, swagSprite.y, swagSprite.w, swagSprite.h);
var size = new Rectangle(0, 0, rect.width, rect.height);
var offset = FlxPoint.get(-size.left, -size.top);
var sourceSize = FlxPoint.get(size.width, size.height);
frames.addAtlasFrame(rect, sourceSize, offset, swagSprite.name);
}
return frames;
}
}
typedef AnimateObject =
{
SPRITES:Array<Dynamic>
}
typedef AnimateSprite =
{
var name:String;
var x:Int;
var y:Int;
var w:Int;
var h:Int;
var rotated:Bool;
}

View file

@ -24,7 +24,8 @@ class MenuTypedList<T:MenuItem> extends FlxTypedGroup<T>
var byName = new Map<String, T>(); var byName = new Map<String, T>();
/** Set to true, internally to disable controls, without affecting vars like `enabled` */ /** Set to true, internally to disable controls, without affecting vars like `enabled` */
var busy:Bool = false; public var busy(default, null):Bool = false;
// bit awkward because BACK is also a menu control and this doesn't affect that
public function new (navControls:NavControls = Vertical, ?wrapMode:WrapMode) public function new (navControls:NavControls = Vertical, ?wrapMode:WrapMode)
{ {

View file

@ -24,6 +24,7 @@ class PreferencesMenu extends ui.OptionsState.Page
createPrefItem('downscroll', 'downscroll', false); createPrefItem('downscroll', 'downscroll', false);
createPrefItem('flashing menu', 'flashing-menu', true); createPrefItem('flashing menu', 'flashing-menu', true);
createPrefItem('Camera Zooming on Beat', 'camera-zoom', true); createPrefItem('Camera Zooming on Beat', 'camera-zoom', true);
createPrefItem('FPS Counter', 'fps-counter', true);
} }
public static function getPref(pref:String):Dynamic public static function getPref(pref:String):Dynamic
@ -37,11 +38,15 @@ class PreferencesMenu extends ui.OptionsState.Page
preferenceCheck('downscroll', false); preferenceCheck('downscroll', false);
preferenceCheck('flashing-menu', true); preferenceCheck('flashing-menu', true);
preferenceCheck('camera-zoom', true); preferenceCheck('camera-zoom', true);
preferenceCheck('fps-counter', true);
if (!getPref('fps-counter'))
FlxG.stage.removeChild(Main.fpsCounter);
} }
private function createPrefItem(prefName:String, prefString:String, prefValue:Dynamic):Void private function createPrefItem(prefName:String, prefString:String, prefValue:Dynamic):Void
{ {
items.createItem(100, 100 * items.length, prefName, AtlasFont.Bold, function() items.createItem(120, (120 * items.length) + 30, prefName, AtlasFont.Bold, function()
{ {
preferenceCheck(prefString, prefValue); preferenceCheck(prefString, prefValue);
@ -69,7 +74,7 @@ class PreferencesMenu extends ui.OptionsState.Page
function createCheckbox(prefString:String) function createCheckbox(prefString:String)
{ {
var checkbox:CheckboxThingie = new CheckboxThingie(0, 100 * (items.length - 1), preferences.get(prefString)); var checkbox:CheckboxThingie = new CheckboxThingie(0, 120 * (items.length - 1), preferences.get(prefString));
checkboxes.push(checkbox); checkboxes.push(checkbox);
add(checkbox); add(checkbox);
} }
@ -84,11 +89,27 @@ class PreferencesMenu extends ui.OptionsState.Page
preferences.set(prefName, daSwap); preferences.set(prefName, daSwap);
checkboxes[items.selectedIndex].daValue = daSwap; checkboxes[items.selectedIndex].daValue = daSwap;
trace('toggled? ' + preferences.get(prefName)); trace('toggled? ' + preferences.get(prefName));
if (prefName == 'fps-counter')
{
if (getPref('fps-counter'))
FlxG.stage.addChild(Main.fpsCounter);
else
FlxG.stage.removeChild(Main.fpsCounter);
}
} }
override function update(elapsed:Float) override function update(elapsed:Float)
{ {
super.update(elapsed); super.update(elapsed);
items.forEach(function(daItem:TextMenuItem)
{
if (items.selectedItem == daItem)
daItem.x = 150;
else
daItem.x = 120;
});
} }
private static function preferenceCheck(prefString:String, prefValue:Dynamic):Void private static function preferenceCheck(prefString:String, prefValue:Dynamic):Void