From 4ed94c285d7515cffa610aa960e18c6b131be522 Mon Sep 17 00:00:00 2001 From: Frakist <90983918+Frakist@users.noreply.github.com> Date: Thu, 1 Feb 2024 20:38:42 +0200 Subject: [PATCH] wip gameover scripts by neo --- .../scripting/events/GameOverCreationEvent.hx | 22 ++++ source/funkin/game/GameOverSubstate.hx | 120 ++++++++++++++---- source/funkin/game/PlayState.hx | 1 + 3 files changed, 115 insertions(+), 28 deletions(-) create mode 100644 source/funkin/backend/scripting/events/GameOverCreationEvent.hx diff --git a/source/funkin/backend/scripting/events/GameOverCreationEvent.hx b/source/funkin/backend/scripting/events/GameOverCreationEvent.hx new file mode 100644 index 00000000..c314d501 --- /dev/null +++ b/source/funkin/backend/scripting/events/GameOverCreationEvent.hx @@ -0,0 +1,22 @@ +package funkin.backend.scripting.events; + +/** + * CANCEL this event to prevent default behaviour! + */ +final class GameOverCreationEvent extends CancellableEvent +{ + // TODO: documentation + public var x:Float; + + public var y:Float; + + public var character:String; + + public var player:Bool; + + public var gameOverSong:String; + + public var lossSFX:String; + + public var retrySFX:String; +} diff --git a/source/funkin/game/GameOverSubstate.hx b/source/funkin/game/GameOverSubstate.hx index 603e2b69..8c51046e 100644 --- a/source/funkin/game/GameOverSubstate.hx +++ b/source/funkin/game/GameOverSubstate.hx @@ -1,5 +1,8 @@ package funkin.game; +import funkin.backend.scripting.events.GameOverCreationEvent; +import funkin.backend.scripting.events.CancellableEvent; +import funkin.backend.scripting.Script; import flixel.addons.transition.FlxTransitionableState; import flixel.sound.FlxSound; import flixel.FlxSubState; @@ -13,19 +16,30 @@ import funkin.backend.system.Conductor; class GameOverSubstate extends MusicBeatSubstate { var character:Character; + public var characterName:String; public var gameOverSong:String; public var lossSFXName:String; public var retrySFX:String; public var player:Bool; + var camFollow:FlxObject; + public static var script:String = ""; + + public var gameoverScript:Script; + public var game:PlayState = PlayState.instance; // shortcut + + private var __cancelDefault:Bool = false; + var x:Float = 0; var y:Float = 0; public var lossSFX:FlxSound; - public function new(x:Float, y:Float, character:String = "bf-dead", player:Bool = true, gameOverSong:String = "gameOver", lossSFX:String = "gameOverSFX", retrySFX:String = "gameOverEnd") { + public function new(x:Float, y:Float, character:String = "bf-dead", player:Bool = true, gameOverSong:String = "gameOver", lossSFX:String = "gameOverSFX", + retrySFX:String = "gameOverEnd") + { super(); this.x = x; this.y = y; @@ -39,9 +53,28 @@ class GameOverSubstate extends MusicBeatSubstate public override function create() { super.create(); + if (FlxG.sound.music != null) FlxG.sound.music.stop(); + gameoverScript = Script.create(Paths.script(script)); + gameoverScript.setParent(this); + gameoverScript.load(); + + var event = EventManager.get(GameOverCreationEvent).recycle(x, y, characterName, player, gameOverSong, lossSFXName, retrySFX); + gameoverScript.call('create', [event]); + + x = event.x; + y = event.y; + characterName = event.character; + player = event.player; + gameOverSong = event.gameOverSong; + lossSFXName = event.lossSFX; + retrySFX = event.retrySFX; + + if (__cancelDefault = event.cancelled) + return; + character = new Character(x, y, characterName, player); character.danceOnBeat = false; character.playAnim('firstDeath'); @@ -56,12 +89,19 @@ class GameOverSubstate extends MusicBeatSubstate Conductor.changeBPM(100); DiscordUtil.changePresence('Game Over', PlayState.SONG.meta.displayName + " (" + PlayState.difficulty + ")"); + + gameoverScript.call("postCreate"); } override function update(elapsed:Float) { super.update(elapsed); + gameoverScript.call("update", [elapsed]); + + if (__cancelDefault) + return; + if (controls.ACCEPT) { endBullshit(); @@ -79,7 +119,10 @@ class GameOverSubstate extends MusicBeatSubstate FlxG.switchState(new FreeplayState()); } - if (!isEnding && ((!lossSFX.playing) || (character.getAnimName() == "firstDeath" && character.isAnimFinished())) && (FlxG.sound.music == null || !FlxG.sound.music.playing)) { + if (!isEnding + && ((!lossSFX.playing) || (character.getAnimName() == "firstDeath" && character.isAnimFinished())) + && (FlxG.sound.music == null || !FlxG.sound.music.playing)) + { CoolUtil.playMusic(Paths.music(gameOverSong), false, 1, true, 100); beatHit(0); } @@ -88,6 +131,12 @@ class GameOverSubstate extends MusicBeatSubstate override function beatHit(curBeat:Int) { super.beatHit(curBeat); + + gameoverScript.call("onBeatHit", [curBeat]); + + if (__cancelDefault) + return; + if (FlxG.sound.music != null && FlxG.sound.music.playing) character.playAnim("deathLoop", true, DANCE); } @@ -96,33 +145,48 @@ class GameOverSubstate extends MusicBeatSubstate function endBullshit():Void { - if (!isEnding) + if (isEnding) + return; + isEnding = true; + + var event = new CancellableEvent(); + gameoverScript.call('onEnd', [event]); + + if (event.cancelled) + return; + + character.playAnim('deathConfirm', true); + if (FlxG.sound.music != null) + FlxG.sound.music.stop(); + FlxG.sound.music = null; + + var sound = FlxG.sound.play(Paths.sound(retrySFX)); + + var secsLength:Float = sound.length / 1000; + var waitTime = 0.7; + var fadeOutTime = secsLength - 0.7; + + if (fadeOutTime < 0.5) { - isEnding = true; - character.playAnim('deathConfirm', true); - if (FlxG.sound.music != null) - FlxG.sound.music.stop(); - FlxG.sound.music = null; - - var sound = FlxG.sound.play(Paths.sound(retrySFX)); - - var secsLength:Float = sound.length / 1000; - var waitTime = 0.7; - var fadeOutTime = secsLength - 0.7; - - if (fadeOutTime < 0.5) { - fadeOutTime = secsLength; - waitTime = 0; - } - - new FlxTimer().start(waitTime, function(tmr:FlxTimer) - { - FlxG.camera.fade(FlxColor.BLACK, fadeOutTime, false, function() - { - MusicBeatState.skipTransOut = true; - FlxG.switchState(new PlayState()); - }); - }); + fadeOutTime = secsLength; + waitTime = 0; } + + new FlxTimer().start(waitTime, function(tmr:FlxTimer) + { + FlxG.camera.fade(FlxColor.BLACK, fadeOutTime, false, function() + { + MusicBeatState.skipTransOut = true; + FlxG.switchState(new PlayState()); + }); + }); + } + + override function destroy() + { + gameoverScript.call("onDestroy"); + gameoverScript.destroy(); + + super.destroy(); } } diff --git a/source/funkin/game/PlayState.hx b/source/funkin/game/PlayState.hx index a21606dc..05634f53 100644 --- a/source/funkin/game/PlayState.hx +++ b/source/funkin/game/PlayState.hx @@ -514,6 +514,7 @@ class PlayState extends MusicBeatState if (FlxG.sound.music != null) FlxG.sound.music.stop(); PauseSubState.script = ""; + GameOverSubstate.script = ""; (scripts = new ScriptPack("PlayState")).setParent(this); camGame = camera;