1
0
Fork 0
mirror of https://github.com/ninjamuffin99/Funkin.git synced 2024-09-11 20:57:20 +00:00

Freaky Menu uses metadata.json for BPM data.

This commit is contained in:
EliteMasterEric 2023-07-02 15:34:34 -04:00
parent 66f56dbf2c
commit 8685054696
4 changed files with 66 additions and 23 deletions

View file

@ -135,12 +135,7 @@ class TitleState extends MusicBeatState
function startIntro() function startIntro()
{ {
if (FlxG.sound.music == null || !FlxG.sound.music.playing) playMenuMusic();
{
FlxG.sound.playMusic(Paths.music('freakyMenu'), 0);
FlxG.sound.music.fadeIn(4, 0, 0.7);
Conductor.forceBPM(Constants.FREAKY_MENU_BPM);
}
persistentUpdate = true; persistentUpdate = true;
@ -234,6 +229,18 @@ class TitleState extends MusicBeatState
if (FlxG.sound.music != null) FlxG.sound.music.onComplete = function() FlxG.switchState(new VideoState()); 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<Array<String>> function getIntroTextShit():Array<Array<String>>
{ {
var fullText:String = Assets.getText(Paths.txt('introText')); var fullText:String = Assets.getText(Paths.txt('introText'));

View file

@ -887,7 +887,7 @@ class PlayState extends MusicBeatState
trace('Song difficulty could not be loaded.'); trace('Song difficulty could not be loaded.');
} }
Conductor.forceBPM(currentChart.getStartingBPM()); // Conductor.forceBPM(currentChart.getStartingBPM());
vocals = currentChart.buildVocals(currentPlayerId); vocals = currentChart.buildVocals(currentPlayerId);
if (vocals.members.length == 0) if (vocals.members.length == 0)

View file

@ -20,6 +20,7 @@ class SongDataParser
static final DEFAULT_SONG_ID:String = 'UNKNOWN'; static final DEFAULT_SONG_ID:String = 'UNKNOWN';
static final SONG_DATA_PATH:String = 'songs/'; static final SONG_DATA_PATH:String = 'songs/';
static final MUSIC_DATA_PATH:String = 'music/';
static final SONG_DATA_SUFFIX:String = '-metadata.json'; static final SONG_DATA_SUFFIX:String = '-metadata.json';
/** /**
@ -176,6 +177,36 @@ class SongDataParser
return rawJson; 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 public static function parseSongChartData(songId:String, variation:String = ""):SongChartData
{ {
var rawJson:String = loadSongChartDataFile(songId, variation); var rawJson:String = loadSongChartDataFile(songId, variation);
@ -365,7 +396,7 @@ abstract SongNoteData(RawSongNoteData)
public function get_stepTime():Float public function get_stepTime():Float
{ {
// TODO: Account for changes in BPM. // 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 public function get_stepTime():Float
{ {
// TODO: Account for changes in BPM. // TODO: Account for changes in BPM.
return this.t / Conductor.stepLengthMs; return this.t / Conductor.stepCrochet;
} }
public var event(get, set):String; 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, * 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. * so it can do it in a simple linear fashion.
*/ */
var b:Int; var b:Null<Float>;
/** /**
* Quarter notes per minute (float). Cannot be empty in the first element of the list, * 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, * Add aliases to the minimalized property names of the typedef,
* to improve readability. * 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<Int>) public function new(timeStamp:Float, beatTime:Null<Float>, bpm:Float, timeSignatureNum:Int = 4, timeSignatureDen:Int = 4, beatTuplets:Array<Int>)
{ {
this = this =
{ {
@ -821,14 +852,14 @@ abstract SongTimeChange(RawSongTimeChange)
return this.t = value; return this.t = value;
} }
public var beatTime(get, set):Int; public var beatTime(get, set):Null<Float>;
public function get_beatTime():Int public function get_beatTime():Null<Float>
{ {
return this.b; return this.b;
} }
public function set_beatTime(value:Int):Int public function set_beatTime(value:Null<Float>):Null<Float>
{ {
return this.b = value; return this.b = value;
} }

View file

@ -115,12 +115,7 @@ class StoryMenuState extends MusicBeatState
transIn = FlxTransitionableState.defaultTransIn; transIn = FlxTransitionableState.defaultTransIn;
transOut = FlxTransitionableState.defaultTransOut; transOut = FlxTransitionableState.defaultTransOut;
if (!FlxG.sound.music.playing) playMenuMusic();
{
FlxG.sound.playMusic(Paths.music('freakyMenu'));
FlxG.sound.music.fadeIn(4, 0, 0.7);
}
Conductor.forceBPM(Constants.FREAKY_MENU_BPM);
if (stickerSubState != null) if (stickerSubState != null)
{ {
@ -129,8 +124,6 @@ class StoryMenuState extends MusicBeatState
openSubState(stickerSubState); openSubState(stickerSubState);
stickerSubState.degenStickers(); stickerSubState.degenStickers();
// resetSubState();
} }
persistentUpdate = persistentDraw = true; persistentUpdate = persistentDraw = true;
@ -203,6 +196,18 @@ class StoryMenuState extends MusicBeatState
#end #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 function updateData():Void
{ {
currentLevel = LevelRegistry.instance.fetchEntry(currentLevelId); currentLevel = LevelRegistry.instance.fetchEntry(currentLevelId);