From 8685054696c5e4445d4953d7bc53a208d1259aa7 Mon Sep 17 00:00:00 2001 From: EliteMasterEric Date: Sun, 2 Jul 2023 15:34:34 -0400 Subject: [PATCH] Freaky Menu uses metadata.json for BPM data. --- source/funkin/TitleState.hx | 19 +++++++--- source/funkin/play/PlayState.hx | 2 +- source/funkin/play/song/SongData.hx | 47 ++++++++++++++++++++---- source/funkin/ui/story/StoryMenuState.hx | 21 +++++++---- 4 files changed, 66 insertions(+), 23 deletions(-) diff --git a/source/funkin/TitleState.hx b/source/funkin/TitleState.hx index bc6ef571d..e217cbec3 100644 --- a/source/funkin/TitleState.hx +++ b/source/funkin/TitleState.hx @@ -135,12 +135,7 @@ class TitleState extends MusicBeatState function startIntro() { - if (FlxG.sound.music == null || !FlxG.sound.music.playing) - { - FlxG.sound.playMusic(Paths.music('freakyMenu'), 0); - FlxG.sound.music.fadeIn(4, 0, 0.7); - Conductor.forceBPM(Constants.FREAKY_MENU_BPM); - } + playMenuMusic(); persistentUpdate = true; @@ -234,6 +229,18 @@ class TitleState extends MusicBeatState if (FlxG.sound.music != null) FlxG.sound.music.onComplete = function() FlxG.switchState(new VideoState()); } + function playMenuMusic():Void + { + if (FlxG.sound.music == null || !FlxG.sound.music.playing) + { + var freakyMenuMetadata:SongMetadata = SongData.parseMusicMetadata('freakyMenu'); + Conductor.mapTimeChanges(freakyMenuMetadata.timeChanges); + + FlxG.sound.playMusic(Paths.music('freakyMenu/freakyMenu'), 0); + FlxG.sound.music.fadeIn(4, 0, 0.7); + } + } + function getIntroTextShit():Array> { var fullText:String = Assets.getText(Paths.txt('introText')); diff --git a/source/funkin/play/PlayState.hx b/source/funkin/play/PlayState.hx index f39000633..24595e6d6 100644 --- a/source/funkin/play/PlayState.hx +++ b/source/funkin/play/PlayState.hx @@ -887,7 +887,7 @@ class PlayState extends MusicBeatState trace('Song difficulty could not be loaded.'); } - Conductor.forceBPM(currentChart.getStartingBPM()); + // Conductor.forceBPM(currentChart.getStartingBPM()); vocals = currentChart.buildVocals(currentPlayerId); if (vocals.members.length == 0) diff --git a/source/funkin/play/song/SongData.hx b/source/funkin/play/song/SongData.hx index 282734d10..6058df766 100644 --- a/source/funkin/play/song/SongData.hx +++ b/source/funkin/play/song/SongData.hx @@ -20,6 +20,7 @@ class SongDataParser static final DEFAULT_SONG_ID:String = 'UNKNOWN'; static final SONG_DATA_PATH:String = 'songs/'; + static final MUSIC_DATA_PATH:String = 'music/'; static final SONG_DATA_SUFFIX:String = '-metadata.json'; /** @@ -176,6 +177,36 @@ class SongDataParser return rawJson; } + public static function parseMusicMetadata(musicId:String):SongMetadata + { + var rawJson:String = loadMusicMetadataFile(musicId); + var jsonData:Dynamic = null; + try + { + jsonData = Json.parse(rawJson); + } + catch (e) {} + + var musicMetadata:SongMetadata = SongMigrator.migrateSongMetadata(jsonData, musicId); + musicMetadata = SongValidator.validateSongMetadata(musicMetadata, musicId); + + return musicMetadata; + } + + static function loadMusicMetadataFile(musicPath:String, variation:String = ''):String + { + var musicMetadataFilePath:String = (variation != '') ? Paths.json('$MUSIC_DATA_PATH$musicPath/$musicPath-metadata-$variation') : Paths.json('$MUSIC_DATA_PATH$musicPath/$musicPath-metadata'); + + var rawJson:String = Assets.getText(musicMetadataFilePath).trim(); + + while (!rawJson.endsWith("}")) + { + rawJson = rawJson.substr(0, rawJson.length - 1); + } + + return rawJson; + } + public static function parseSongChartData(songId:String, variation:String = ""):SongChartData { var rawJson:String = loadSongChartDataFile(songId, variation); @@ -365,7 +396,7 @@ abstract SongNoteData(RawSongNoteData) public function get_stepTime():Float { // TODO: Account for changes in BPM. - return this.t / Conductor.stepLengthMs; + return this.t / Conductor.stepCrochet; } /** @@ -551,7 +582,7 @@ abstract SongEventData(RawSongEventData) public function get_stepTime():Float { // TODO: Account for changes in BPM. - return this.t / Conductor.stepLengthMs; + return this.t / Conductor.stepCrochet; } public var event(get, set):String; @@ -764,7 +795,7 @@ typedef RawSongTimeChange = * Time in beats (int). The game will calculate further beat values based on this one, * so it can do it in a simple linear fashion. */ - var b:Int; + var b:Null; /** * Quarter notes per minute (float). Cannot be empty in the first element of the list, @@ -794,9 +825,9 @@ typedef RawSongTimeChange = * Add aliases to the minimalized property names of the typedef, * to improve readability. */ -abstract SongTimeChange(RawSongTimeChange) +abstract SongTimeChange(RawSongTimeChange) from RawSongTimeChange { - public function new(timeStamp:Float, beatTime:Int, bpm:Float, timeSignatureNum:Int = 4, timeSignatureDen:Int = 4, beatTuplets:Array) + public function new(timeStamp:Float, beatTime:Null, bpm:Float, timeSignatureNum:Int = 4, timeSignatureDen:Int = 4, beatTuplets:Array) { this = { @@ -821,14 +852,14 @@ abstract SongTimeChange(RawSongTimeChange) return this.t = value; } - public var beatTime(get, set):Int; + public var beatTime(get, set):Null; - public function get_beatTime():Int + public function get_beatTime():Null { return this.b; } - public function set_beatTime(value:Int):Int + public function set_beatTime(value:Null):Null { return this.b = value; } diff --git a/source/funkin/ui/story/StoryMenuState.hx b/source/funkin/ui/story/StoryMenuState.hx index 1dc59f3ec..055db1f71 100644 --- a/source/funkin/ui/story/StoryMenuState.hx +++ b/source/funkin/ui/story/StoryMenuState.hx @@ -115,12 +115,7 @@ class StoryMenuState extends MusicBeatState transIn = FlxTransitionableState.defaultTransIn; transOut = FlxTransitionableState.defaultTransOut; - if (!FlxG.sound.music.playing) - { - FlxG.sound.playMusic(Paths.music('freakyMenu')); - FlxG.sound.music.fadeIn(4, 0, 0.7); - } - Conductor.forceBPM(Constants.FREAKY_MENU_BPM); + playMenuMusic(); if (stickerSubState != null) { @@ -129,8 +124,6 @@ class StoryMenuState extends MusicBeatState openSubState(stickerSubState); stickerSubState.degenStickers(); - - // resetSubState(); } persistentUpdate = persistentDraw = true; @@ -203,6 +196,18 @@ class StoryMenuState extends MusicBeatState #end } + function playMenuMusic():Void + { + if (FlxG.sound.music == null || !FlxG.sound.music.playing) + { + var freakyMenuMetadata:SongMetadata = SongData.parseMusicMetadata('freakyMenu'); + Conductor.mapTimeChanges(freakyMenuMetadata.timeChanges); + + FlxG.sound.playMusic(Paths.music('freakyMenu/freakyMenu'), 0); + FlxG.sound.music.fadeIn(4, 0, 0.7); + } + } + function updateData():Void { currentLevel = LevelRegistry.instance.fetchEntry(currentLevelId);