Files
FNF-i486-Engine/source/CutsceneHandler.hx
Moxie 7f1a90556e was gonna remove this
but nvm, it's fine as it is for legacy reasons
2025-06-18 19:05:55 -04:00

143 lines
3.4 KiB
Haxe

package;
import flixel.FlxBasic;
import flixel.FlxCamera;
import flixel.FlxG;
import flixel.FlxObject;
import flixel.FlxSprite;
import flixel.addons.display.FlxPieDial;
import flixel.graphics.atlas.FlxAtlas;
import flixel.graphics.frames.FlxAtlasFrames;
import flixel.group.FlxGroup.FlxTypedGroup;
import flixel.group.FlxSpriteGroup;
import flixel.sound.FlxSound;
import flixel.tweens.FlxEase;
import flixel.tweens.FlxTween;
import flixel.util.FlxSort;
import flixel.util.FlxTimer;
typedef CutsceneEvent = {
var time:Float;
var func:Void->Void;
}
class CutsceneHandler extends FlxBasic
{
public var timedEvents:Array<CutsceneEvent> = [];
public var skipCallback:Void->Void = null;
public var onStart:Void->Void = null;
public var endTime:Float = 0;
public var objects:Array<FlxSprite> = [];
public var music:String = null;
final _timeToSkip:Float = 1;
var _canSkip:Bool = false;
public var holdingTime:Float = 0;
public var skipSprite:FlxPieDial;
public var finishCallback:Void->Void = null;
public function new(canSkip:Bool = true)
{
super();
timer(0, function()
{
if(music != null)
{
FlxG.sound.playMusic(Paths.music(music), 0, false);
FlxG.sound.music.fadeIn();
}
if(onStart != null) onStart();
});
FlxG.state.add(this);
this._canSkip = canSkip;
if(canSkip)
{
skipSprite = new FlxPieDial(0, 0, 40, FlxColor.WHITE, 40, true, 24);
skipSprite.replaceColor(FlxColor.BLACK, FlxColor.TRANSPARENT);
skipSprite.x = FlxG.width - (skipSprite.width + 80);
skipSprite.y = FlxG.height - (skipSprite.height + 72);
skipSprite.amount = 0;
skipSprite.cameras = [FlxG.cameras.list[FlxG.cameras.list.length - 1]];
FlxG.state.add(skipSprite);
}
}
private var cutsceneTime:Float = 0;
private var firstFrame:Bool = false;
override function update(elapsed)
{
super.update(elapsed);
if(FlxG.state != PlayState.instance || !firstFrame)
{
firstFrame = true;
return;
}
cutsceneTime += elapsed;
while(timedEvents.length > 0 && timedEvents[0].time <= cutsceneTime)
{
timedEvents[0].func();
timedEvents.shift();
}
if(_canSkip && cutsceneTime > 0.1)
{
if(FlxG.keys.anyPressed(ClientPrefs.keyBinds.get('accept')))
holdingTime = Math.max(0, Math.min(_timeToSkip, holdingTime + elapsed));
else if (holdingTime > 0)
holdingTime = Math.max(0, FlxMath.lerp(holdingTime, -0.1, FlxMath.bound(elapsed * 3, 0, 1)));
updateSkipAlpha();
}
if(endTime <= cutsceneTime || holdingTime >= _timeToSkip)
{
if(holdingTime >= _timeToSkip)
{
trace('skipped cutscene');
if(skipCallback != null)
skipCallback();
}
else finishCallback();
for (spr in objects)
{
spr.kill();
PlayState.instance.remove(spr);
spr.destroy();
}
skipSprite = FlxDestroyUtil.destroy(skipSprite);
destroy();
PlayState.instance.remove(this);
}
}
function updateSkipAlpha()
{
if(skipSprite == null) return;
skipSprite.amount = Math.min(1, Math.max(0, (holdingTime / _timeToSkip) * 1.025));
skipSprite.alpha = FlxMath.remapToRange(skipSprite.amount, 0.025, 1, 0, 1);
}
public function push(spr:FlxSprite)
{
objects.push(spr);
}
public function timer(time:Float, func:Void->Void)
{
timedEvents.push({time: time, func: func});
timedEvents.sort(sortByTime);
}
function sortByTime(Obj1:CutsceneEvent, Obj2:CutsceneEvent):Int
{
return FlxSort.byValues(FlxSort.ASCENDING, Obj1.time, Obj2.time);
}
}