mirror of
https://github.com/ninjamuffin99/Funkin.git
synced 2024-11-15 11:22:55 +00:00
Char select subs stuff
This commit is contained in:
parent
17a48bfc2b
commit
395de4ee95
2
assets
2
assets
|
@ -1 +1 @@
|
||||||
Subproject commit 26ab9a1dc8eec563717711b290c21d0e9e56a005
|
Subproject commit ff425d983e3b017b3a7dc241f03ae51f1fae9116
|
|
@ -35,63 +35,58 @@ import openfl.filters.ShaderFilter;
|
||||||
import funkin.util.FramesJSFLParser;
|
import funkin.util.FramesJSFLParser;
|
||||||
import funkin.util.FramesJSFLParser.FramesJSFLInfo;
|
import funkin.util.FramesJSFLParser.FramesJSFLInfo;
|
||||||
import funkin.util.FramesJSFLParser.FramesJSFLFrame;
|
import funkin.util.FramesJSFLParser.FramesJSFLFrame;
|
||||||
|
import funkin.graphics.FunkinSprite;
|
||||||
|
|
||||||
class CharSelectSubState extends MusicBeatSubState
|
class CharSelectSubState extends MusicBeatSubState
|
||||||
{
|
{
|
||||||
var cursor:FlxSprite;
|
var cursor:FlxSprite;
|
||||||
|
|
||||||
var cursorBlue:FlxSprite;
|
var cursorBlue:FlxSprite;
|
||||||
var cursorDarkBlue:FlxSprite;
|
var cursorDarkBlue:FlxSprite;
|
||||||
|
|
||||||
var grpCursors:FlxTypedGroup<FlxSprite>;
|
var grpCursors:FlxTypedGroup<FlxSprite>;
|
||||||
|
|
||||||
var cursorConfirmed:FlxSprite;
|
var cursorConfirmed:FlxSprite;
|
||||||
var cursorDenied:FlxSprite;
|
var cursorDenied:FlxSprite;
|
||||||
|
|
||||||
var cursorX:Int = 0;
|
var cursorX:Int = 0;
|
||||||
var cursorY:Int = 0;
|
var cursorY:Int = 0;
|
||||||
|
|
||||||
var cursorFactor:Float = 110;
|
var cursorFactor:Float = 110;
|
||||||
var cursorOffsetX:Float = -16;
|
var cursorOffsetX:Float = -16;
|
||||||
var cursorOffsetY:Float = -48;
|
var cursorOffsetY:Float = -48;
|
||||||
|
|
||||||
var cursorLocIntended:FlxPoint = new FlxPoint(0, 0);
|
var cursorLocIntended:FlxPoint = new FlxPoint(0, 0);
|
||||||
var lerpAmnt:Float = 0.95;
|
var lerpAmnt:Float = 0.95;
|
||||||
|
|
||||||
var tmrFrames:Int = 60;
|
var tmrFrames:Int = 60;
|
||||||
|
|
||||||
var currentStage:Stage;
|
var currentStage:Stage;
|
||||||
|
|
||||||
var playerChill:CharSelectPlayer;
|
var playerChill:CharSelectPlayer;
|
||||||
var playerChillOut:CharSelectPlayer;
|
var playerChillOut:CharSelectPlayer;
|
||||||
var gfChill:CharSelectGF;
|
var gfChill:CharSelectGF;
|
||||||
var gfChillOut:CharSelectGF;
|
var gfChillOut:CharSelectGF;
|
||||||
|
|
||||||
var barthing:FlxAtlasSprite;
|
var barthing:FlxAtlasSprite;
|
||||||
var dipshitBacking:FlxSprite;
|
var dipshitBacking:FlxSprite;
|
||||||
var chooseDipshit:FlxSprite;
|
var chooseDipshit:FlxSprite;
|
||||||
var dipshitBlur:FlxSprite;
|
var dipshitBlur:FlxSprite;
|
||||||
var transitionGradient:FlxSprite;
|
var transitionGradient:FlxSprite;
|
||||||
|
|
||||||
var curChar(default, set):String = "pico";
|
var curChar(default, set):String = "pico";
|
||||||
var nametag:Nametag;
|
var nametag:Nametag;
|
||||||
var camFollow:FlxObject;
|
var camFollow:FlxObject;
|
||||||
var autoFollow:Bool = false;
|
var autoFollow:Bool = false;
|
||||||
|
|
||||||
var availableChars:Map<Int, String> = new Map<Int, String>();
|
var availableChars:Map<Int, String> = new Map<Int, String>();
|
||||||
var pressedSelect:Bool = false;
|
var pressedSelect:Bool = false;
|
||||||
|
|
||||||
var selectTimer:FlxTimer = new FlxTimer();
|
var selectTimer:FlxTimer = new FlxTimer();
|
||||||
|
|
||||||
var selectSound:FunkinSound;
|
var selectSound:FunkinSound;
|
||||||
var unlockSound:FunkinSound;
|
var unlockSound:FunkinSound;
|
||||||
|
var lockedSound:FunkinSound;
|
||||||
|
var introSound:FunkinSound;
|
||||||
|
var staticSound:FunkinSound;
|
||||||
|
|
||||||
var charSelectCam:FunkinCamera;
|
var charSelectCam:FunkinCamera;
|
||||||
|
|
||||||
var selectedBizz:Array<BitmapFilter> = [
|
var selectedBizz:Array<BitmapFilter> = [
|
||||||
new DropShadowFilter(0, 0, 0xFFFFFF, 1, 2, 2, 21, 1, false, false, false),
|
new DropShadowFilter(0, 0, 0xFFFFFF, 1, 2, 2, 19, 1, false, false, false),
|
||||||
new DropShadowFilter(5, 45, 0x000000, 1, 2, 2, 1, 1, false, false, false)
|
new DropShadowFilter(5, 45, 0x000000, 1, 2, 2, 1, 1, false, false, false)
|
||||||
];
|
];
|
||||||
|
|
||||||
var bopInfo:FramesJSFLInfo;
|
var bopInfo:FramesJSFLInfo;
|
||||||
|
var blackScreen:FunkinSprite;
|
||||||
|
|
||||||
public function new()
|
public function new()
|
||||||
{
|
{
|
||||||
|
@ -125,11 +120,6 @@ class CharSelectSubState extends MusicBeatSubState
|
||||||
|
|
||||||
override public function create():Void
|
override public function create():Void
|
||||||
{
|
{
|
||||||
openSubState(new IntroSubState());
|
|
||||||
subStateClosed.addOnce((_) -> {
|
|
||||||
camera.flash();
|
|
||||||
checkNewChar();
|
|
||||||
});
|
|
||||||
super.create();
|
super.create();
|
||||||
|
|
||||||
bopInfo = FramesJSFLParser.parse(Paths.file("images/charSelect/iconBopInfo/iconBopInfo.txt"));
|
bopInfo = FramesJSFLParser.parse(Paths.file("images/charSelect/iconBopInfo/iconBopInfo.txt"));
|
||||||
|
@ -140,7 +130,7 @@ class CharSelectSubState extends MusicBeatSubState
|
||||||
add(bg);
|
add(bg);
|
||||||
|
|
||||||
var crowd:FlxAtlasSprite = new FlxAtlasSprite(0, 0, Paths.animateAtlas("charSelect/crowd"));
|
var crowd:FlxAtlasSprite = new FlxAtlasSprite(0, 0, Paths.animateAtlas("charSelect/crowd"));
|
||||||
crowd.anim.play("");
|
crowd.anim.play();
|
||||||
crowd.scrollFactor.set(0.3, 0.3);
|
crowd.scrollFactor.set(0.3, 0.3);
|
||||||
add(crowd);
|
add(crowd);
|
||||||
|
|
||||||
|
@ -301,8 +291,25 @@ class CharSelectSubState extends MusicBeatSubState
|
||||||
unlockSound.volume = 0;
|
unlockSound.volume = 0;
|
||||||
unlockSound.play(true);
|
unlockSound.play(true);
|
||||||
|
|
||||||
FlxG.sound.defaultSoundGroup.add(unlockSound);
|
lockedSound = new FunkinSound();
|
||||||
FlxG.sound.list.add(unlockSound);
|
lockedSound.loadEmbedded(Paths.sound('CS_locked'));
|
||||||
|
lockedSound.pitch = 1;
|
||||||
|
|
||||||
|
lockedSound.volume = 1.;
|
||||||
|
|
||||||
|
FlxG.sound.defaultSoundGroup.add(lockedSound);
|
||||||
|
FlxG.sound.list.add(lockedSound);
|
||||||
|
|
||||||
|
staticSound = new FunkinSound();
|
||||||
|
staticSound.loadEmbedded(Paths.sound('static loop'));
|
||||||
|
staticSound.pitch = 1;
|
||||||
|
|
||||||
|
staticSound.looped = true;
|
||||||
|
|
||||||
|
staticSound.volume = 0.6;
|
||||||
|
|
||||||
|
FlxG.sound.defaultSoundGroup.add(staticSound);
|
||||||
|
FlxG.sound.list.add(staticSound);
|
||||||
|
|
||||||
// playing it here to preload it. not doing this makes a super awkward pause at the end of the intro
|
// playing it here to preload it. not doing this makes a super awkward pause at the end of the intro
|
||||||
// TODO: probably make an intro thing for funkinSound itself that preloads the next audio?
|
// TODO: probably make an intro thing for funkinSound itself that preloads the next audio?
|
||||||
|
@ -365,6 +372,34 @@ class CharSelectSubState extends MusicBeatSubState
|
||||||
FlxG.camera.follow(camFollow, LOCKON, 0.01);
|
FlxG.camera.follow(camFollow, LOCKON, 0.01);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
var blackScreen = new FunkinSprite().makeSolidColor(FlxG.width * 2, FlxG.height * 2, 0xFF000000);
|
||||||
|
blackScreen.x = -(FlxG.width * 0.5);
|
||||||
|
blackScreen.y = -(FlxG.height * 0.5);
|
||||||
|
add(blackScreen);
|
||||||
|
|
||||||
|
introSound = new FunkinSound();
|
||||||
|
introSound.loadEmbedded(Paths.sound('CS_Lights'));
|
||||||
|
introSound.pitch = 1;
|
||||||
|
introSound.volume = 0;
|
||||||
|
|
||||||
|
FlxG.sound.defaultSoundGroup.add(introSound);
|
||||||
|
FlxG.sound.list.add(introSound);
|
||||||
|
|
||||||
|
openSubState(new IntroSubState());
|
||||||
|
subStateClosed.addOnce((_) -> {
|
||||||
|
remove(blackScreen);
|
||||||
|
if (!Save.instance.oldChar)
|
||||||
|
{
|
||||||
|
camera.flash();
|
||||||
|
|
||||||
|
introSound.volume = 1;
|
||||||
|
introSound.play(true);
|
||||||
|
}
|
||||||
|
checkNewChar();
|
||||||
|
|
||||||
|
Save.instance.oldChar = true;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function checkNewChar():Void
|
function checkNewChar():Void
|
||||||
|
@ -396,7 +431,6 @@ class CharSelectSubState extends MusicBeatSubState
|
||||||
var grpIcons:FlxSpriteGroup;
|
var grpIcons:FlxSpriteGroup;
|
||||||
var grpXSpread(default, set):Float = 107;
|
var grpXSpread(default, set):Float = 107;
|
||||||
var grpYSpread(default, set):Float = 127;
|
var grpYSpread(default, set):Float = 127;
|
||||||
|
|
||||||
var nonLocks = [];
|
var nonLocks = [];
|
||||||
|
|
||||||
function initLocks():Void
|
function initLocks():Void
|
||||||
|
@ -426,9 +460,9 @@ class CharSelectSubState extends MusicBeatSubState
|
||||||
var temp:Lock = new Lock(0, 0, i);
|
var temp:Lock = new Lock(0, 0, i);
|
||||||
temp.ID = 1;
|
temp.ID = 1;
|
||||||
|
|
||||||
temp.onAnimationComplete.add(function(anim) {
|
// temp.onAnimationComplete.add(function(anim) {
|
||||||
if (anim == "unlock") playerChill.playAnimation("unlock", true);
|
// if (anim == "unlock") playerChill.playAnimation("unlock", true);
|
||||||
});
|
// });
|
||||||
|
|
||||||
grpIcons.add(temp);
|
grpIcons.add(temp);
|
||||||
}
|
}
|
||||||
|
@ -443,7 +477,7 @@ class CharSelectSubState extends MusicBeatSubState
|
||||||
{
|
{
|
||||||
var index = nonLocks[0];
|
var index = nonLocks[0];
|
||||||
|
|
||||||
// pressedSelect = true;
|
pressedSelect = true;
|
||||||
|
|
||||||
var copy = 3;
|
var copy = 3;
|
||||||
|
|
||||||
|
@ -505,7 +539,7 @@ class CharSelectSubState extends MusicBeatSubState
|
||||||
updateIconPositions();
|
updateIconPositions();
|
||||||
playerChillOut.onAnimationComplete.addOnce((_) -> if (_ == "death")
|
playerChillOut.onAnimationComplete.addOnce((_) -> if (_ == "death")
|
||||||
{
|
{
|
||||||
sync = false;
|
// sync = false;
|
||||||
playerChillOut.visible = false;
|
playerChillOut.visible = false;
|
||||||
playerChillOut.switchChar(char);
|
playerChillOut.switchChar(char);
|
||||||
});
|
});
|
||||||
|
@ -515,6 +549,9 @@ class CharSelectSubState extends MusicBeatSubState
|
||||||
{
|
{
|
||||||
pressedSelect = false;
|
pressedSelect = false;
|
||||||
@:bypassAccessor curChar = char;
|
@:bypassAccessor curChar = char;
|
||||||
|
|
||||||
|
staticSound.stop();
|
||||||
|
|
||||||
FunkinSound.playMusic('stayFunky',
|
FunkinSound.playMusic('stayFunky',
|
||||||
{
|
{
|
||||||
startingVolume: 1,
|
startingVolume: 1,
|
||||||
|
@ -561,15 +598,13 @@ class CharSelectSubState extends MusicBeatSubState
|
||||||
}
|
}
|
||||||
|
|
||||||
var sync:Bool = false;
|
var sync:Bool = false;
|
||||||
|
|
||||||
var syncLock:Lock = null;
|
var syncLock:Lock = null;
|
||||||
|
|
||||||
var audioBizz:Float = 0;
|
var audioBizz:Float = 0;
|
||||||
|
|
||||||
function syncAudio(elapsed:Float):Void
|
function syncAudio(elapsed:Float):Void
|
||||||
{
|
{
|
||||||
@:privateAccess
|
@:privateAccess
|
||||||
if (sync && !unlockSound.paused)
|
if (sync && unlockSound.time > 0)
|
||||||
{
|
{
|
||||||
// if (playerChillOut.anim.framerate > 0)
|
// if (playerChillOut.anim.framerate > 0)
|
||||||
// {
|
// {
|
||||||
|
@ -580,14 +615,12 @@ class CharSelectSubState extends MusicBeatSubState
|
||||||
playerChillOut.anim._tick = 0;
|
playerChillOut.anim._tick = 0;
|
||||||
if (syncLock != null) syncLock.anim._tick = 0;
|
if (syncLock != null) syncLock.anim._tick = 0;
|
||||||
|
|
||||||
trace(unlockSound.time);
|
if ((unlockSound.time - audioBizz) >= ((delay) * 100))
|
||||||
|
|
||||||
if ((unlockSound.time - audioBizz) >= (delay * 1000))
|
|
||||||
{
|
{
|
||||||
if (syncLock != null) syncLock.anim._tick = delay;
|
if (syncLock != null) syncLock.anim._tick = delay;
|
||||||
|
|
||||||
playerChillOut.anim._tick = delay;
|
playerChillOut.anim._tick = delay;
|
||||||
audioBizz += delay * 1000;
|
audioBizz += delay * 100;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -734,11 +767,14 @@ class CharSelectSubState extends MusicBeatSubState
|
||||||
cursorY = -1;
|
cursorY = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (availableChars.exists(getCurrentSelected()) && Save.instance.charactersSeen.contains(availableChars[getCurrentSelected()]))
|
if (autoFollow
|
||||||
|
&& availableChars.exists(getCurrentSelected())
|
||||||
|
&& Save.instance.charactersSeen.contains(availableChars[getCurrentSelected()]))
|
||||||
{
|
{
|
||||||
|
gfChill.visible = true;
|
||||||
curChar = availableChars.get(getCurrentSelected());
|
curChar = availableChars.get(getCurrentSelected());
|
||||||
|
|
||||||
if (controls.ACCEPT)
|
if (!pressedSelect && controls.ACCEPT)
|
||||||
{
|
{
|
||||||
cursorConfirmed.visible = true;
|
cursorConfirmed.visible = true;
|
||||||
cursorConfirmed.x = cursor.x - 2;
|
cursorConfirmed.x = cursor.x - 2;
|
||||||
|
@ -752,7 +788,7 @@ class CharSelectSubState extends MusicBeatSubState
|
||||||
FlxTween.tween(FlxG.sound.music, {pitch: 0.1}, 1, {ease: FlxEase.quadInOut});
|
FlxTween.tween(FlxG.sound.music, {pitch: 0.1}, 1, {ease: FlxEase.quadInOut});
|
||||||
FlxTween.tween(FlxG.sound.music, {volume: 0.0}, 1.5, {ease: FlxEase.quadInOut});
|
FlxTween.tween(FlxG.sound.music, {volume: 0.0}, 1.5, {ease: FlxEase.quadInOut});
|
||||||
playerChill.playAnimation("select");
|
playerChill.playAnimation("select");
|
||||||
gfChill.playAnimation("confirm");
|
gfChill.playAnimation("confirm", true, false, true);
|
||||||
pressedSelect = true;
|
pressedSelect = true;
|
||||||
selectTimer.start(1.5, (_) -> {
|
selectTimer.start(1.5, (_) -> {
|
||||||
// pressedSelect = false;
|
// pressedSelect = false;
|
||||||
|
@ -775,29 +811,37 @@ class CharSelectSubState extends MusicBeatSubState
|
||||||
FlxTween.tween(FlxG.sound.music, {pitch: 1.0, volume: 1.0}, 1, {ease: FlxEase.quartInOut});
|
FlxTween.tween(FlxG.sound.music, {pitch: 1.0, volume: 1.0}, 1, {ease: FlxEase.quartInOut});
|
||||||
playerChill.playAnimation("deselect");
|
playerChill.playAnimation("deselect");
|
||||||
gfChill.playAnimation("deselect");
|
gfChill.playAnimation("deselect");
|
||||||
|
pressedSelect = false;
|
||||||
FlxTween.tween(FlxG.sound.music, {pitch: 1.0}, 1,
|
FlxTween.tween(FlxG.sound.music, {pitch: 1.0}, 1,
|
||||||
{
|
{
|
||||||
ease: FlxEase.quartInOut,
|
ease: FlxEase.quartInOut,
|
||||||
onComplete: (_) -> {
|
onComplete: (_) -> {
|
||||||
|
if (playerChill.getCurrentAnimation() == "deselect loop start" || playerChill.getCurrentAnimation() == "deselect")
|
||||||
|
{
|
||||||
playerChill.playAnimation("idle", true, false, true);
|
playerChill.playAnimation("idle", true, false, true);
|
||||||
gfChill.playAnimation("idle", true, false, true);
|
gfChill.playAnimation("idle", true, false, true);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
pressedSelect = false;
|
|
||||||
selectTimer.cancel();
|
selectTimer.cancel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else if (autoFollow)
|
||||||
{
|
{
|
||||||
curChar = "locked";
|
curChar = "locked";
|
||||||
|
|
||||||
|
gfChill.visible = false;
|
||||||
|
|
||||||
if (controls.ACCEPT)
|
if (controls.ACCEPT)
|
||||||
{
|
{
|
||||||
cursorDenied.visible = true;
|
cursorDenied.visible = true;
|
||||||
cursorDenied.x = cursor.x - 2;
|
cursorDenied.x = cursor.x - 2;
|
||||||
cursorDenied.y = cursor.y - 4;
|
cursorDenied.y = cursor.y - 4;
|
||||||
|
|
||||||
playerChill.playAnimation("cannot select", true);
|
playerChill.playAnimation("cannot select Label", true);
|
||||||
|
|
||||||
|
lockedSound.play(true);
|
||||||
|
|
||||||
cursorDenied.animation.play("idle", true);
|
cursorDenied.animation.play("idle", true);
|
||||||
cursorDenied.animation.finishCallback = (_) -> {
|
cursorDenied.animation.finishCallback = (_) -> {
|
||||||
cursorDenied.visible = false;
|
cursorDenied.visible = false;
|
||||||
|
@ -831,13 +875,9 @@ class CharSelectSubState extends MusicBeatSubState
|
||||||
}
|
}
|
||||||
|
|
||||||
var bopTimer:Float = 0;
|
var bopTimer:Float = 0;
|
||||||
|
|
||||||
var delay = 1 / 24;
|
var delay = 1 / 24;
|
||||||
|
|
||||||
var bopFr = 0;
|
var bopFr = 0;
|
||||||
|
|
||||||
var bopPlay:Bool = false;
|
var bopPlay:Bool = false;
|
||||||
|
|
||||||
var bopRefX:Float = 0;
|
var bopRefX:Float = 0;
|
||||||
var bopRefY:Float = 0;
|
var bopRefY:Float = 0;
|
||||||
|
|
||||||
|
@ -957,10 +997,10 @@ class CharSelectSubState extends MusicBeatSubState
|
||||||
memb.filters = selectedBizz;
|
memb.filters = selectedBizz;
|
||||||
memb.scale.set(2.6, 2.6);
|
memb.scale.set(2.6, 2.6);
|
||||||
}
|
}
|
||||||
if (controls.ACCEPT && memb.animation.curAnim.name == "confirm") memb.animation.play("confirm");
|
if (pressedSelect && memb.animation.curAnim.name == "idle") memb.animation.play("confirm");
|
||||||
if (pressedSelect && controls.BACK)
|
if (autoFollow && !pressedSelect && memb.animation.curAnim.name != "idle")
|
||||||
{
|
{
|
||||||
memb.animation.play("confirm", true, true);
|
memb.animation.play("confirm", false, true);
|
||||||
member.animation.finishCallback = (_) -> {
|
member.animation.finishCallback = (_) -> {
|
||||||
member.animation.play("idle");
|
member.animation.play("idle");
|
||||||
member.animation.finishCallback = null;
|
member.animation.finishCallback = null;
|
||||||
|
@ -991,6 +1031,10 @@ class CharSelectSubState extends MusicBeatSubState
|
||||||
|
|
||||||
curChar = value;
|
curChar = value;
|
||||||
|
|
||||||
|
if (value == "locked") staticSound.play();
|
||||||
|
else
|
||||||
|
staticSound.stop();
|
||||||
|
|
||||||
nametag.switchChar(value);
|
nametag.switchChar(value);
|
||||||
playerChill.visible = false;
|
playerChill.visible = false;
|
||||||
playerChillOut.visible = true;
|
playerChillOut.visible = true;
|
||||||
|
|
Loading…
Reference in a new issue