1
0
Fork 0
mirror of https://github.com/ninjamuffin99/Funkin.git synced 2025-03-22 18:09:33 +00:00

Chart editor changes (support for legacy import)

This commit is contained in:
EliteMasterEric 2023-06-09 15:28:14 -04:00
parent 2200b6a24a
commit 038d258233
9 changed files with 52 additions and 41 deletions

View file

@ -225,7 +225,7 @@ class PauseSubState extends MusicBeatSubState
if (PlayStatePlaylist.isStoryMode) openSubState(new funkin.ui.StickerSubState(null, STORY));
else
openSubState(new funkin.ui.StickerSubState());
openSubState(new funkin.ui.StickerSubState(null, FREEPLAY));
}
}

View file

@ -47,7 +47,7 @@ class Song implements IPlayStateScriptedClass
difficultyIds = [];
difficulties = new Map<String, SongDifficulty>();
_metadata = SongDataParser.parseSongMetadata(songId);
_metadata = SongDataParser.loadSongMetadata(songId);
if (_metadata == null || _metadata.length == 0)
{
throw 'Could not find song data for songId: $songId';

View file

@ -377,7 +377,7 @@ abstract SongNoteData(RawSongNoteData)
function get_stepTime():Float
{
// TODO: Account for changes in BPM.
return this.t / Conductor.stepLengthMs;
return this.t / Conductor.stepCrochet;
}
/**
@ -563,7 +563,7 @@ abstract SongEventData(RawSongEventData)
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;

View file

@ -103,11 +103,28 @@ class SongMigrator
* @param songId The ID of the song (only used for error reporting).
* @return The migrated song metadata, or null if the migration failed.
*/
public static function migrateSongMetadataFromLegacy(jsonData:Dynamic):SongMetadata
public static function migrateSongMetadataFromLegacy(jsonData:Dynamic, difficulty:String = 'normal'):SongMetadata
{
trace('Migrating song metadata from FNF Legacy.');
var songData:FNFLegacy = cast jsonData;
// Some cleanup
if (Std.isOfType(jsonData.song.notes, Array))
{
jsonData.song.notes = haxe.ds.Either.Left(jsonData.song.notes);
}
else
{
jsonData.song.notes = haxe.ds.Either.Right(jsonData.song.notes);
}
if (Std.isOfType(jsonData.song.speed, Float))
{
jsonData.song.speed = haxe.ds.Either.Left(jsonData.song.speed);
}
else
{
jsonData.song.speed = haxe.ds.Either.Right(jsonData.song.speed);
}
var songMetadata:SongMetadata = new SongMetadata('Import', 'Kawai Sprite', 'default');
@ -152,9 +169,20 @@ class SongMigrator
songMetadata.playData.difficulties = [];
if (songData.song != null && songData.song.notes != null)
{
if (songData.song.notes.easy != null) songMetadata.playData.difficulties.push('easy');
if (songData.song.notes.normal != null) songMetadata.playData.difficulties.push('normal');
if (songData.song.notes.hard != null) songMetadata.playData.difficulties.push('hard');
if (Std.isOfType(songData.song.notes, Array))
{
// One difficulty of notes.
songMetadata.playData.difficulties.push(difficulty);
}
else
{
// Multiple difficulties of notes.
var songNoteDataDynamic:haxe.DynamicAccess<Dynamic> = cast songData.song.notes;
for (difficultyKey in songNoteDataDynamic.keys())
{
songMetadata.playData.difficulties.push(difficultyKey);
}
}
}
else
{
@ -186,7 +214,7 @@ class SongMigrator
* @param difficulty The difficulty to migrate.
* @return The migrated song chart data, or null if the migration failed.
*/
public static function migrateSongChartDataFromLegacy(jsonData:Dynamic):SongChartData
public static function migrateSongChartDataFromLegacy(jsonData:Dynamic, difficulty:String = 'normal'):SongChartData
{
trace('Migrating song chart data from FNF Legacy.');
@ -194,27 +222,10 @@ class SongMigrator
var songChartData:SongChartData = new SongChartData(1.0, [], []);
if (songData.song.notes.normal != null)
{
var songEventsEmpty:Bool = songChartData.getEvents() == null || songChartData.getEvents().length == 0;
if (songEventsEmpty) songChartData.setEvents(migrateSongEventDataFromLegacy(songData.song.notes.normal));
songChartData.setNotes(migrateSongNoteDataFromLegacy(songData.song.notes.normal), 'normal');
songChartData.setScrollSpeed(songData.song.speed.normal, 'normal');
}
if (songData.song.notes.easy != null)
{
var songEventsEmpty:Bool = songChartData.getEvents() == null || songChartData.getEvents().length == 0;
if (songEventsEmpty) songChartData.setEvents(migrateSongEventDataFromLegacy(songData.song.notes.easy));
songChartData.setNotes(migrateSongNoteDataFromLegacy(songData.song.notes.easy), 'easy');
songChartData.setScrollSpeed(songData.song.speed.easy, 'easy');
}
if (songData.song.notes.hard != null)
{
var songEventsEmpty:Bool = songChartData.getEvents() == null || songChartData.getEvents().length == 0;
if (songEventsEmpty) songChartData.setEvents(migrateSongEventDataFromLegacy(songData.song.notes.hard));
songChartData.setNotes(migrateSongNoteDataFromLegacy(songData.song.notes.hard), 'hard');
songChartData.setScrollSpeed(songData.song.speed.hard, 'hard');
}
var songEventsEmpty:Bool = songChartData.getEvents() == null || songChartData.getEvents().length == 0;
if (songEventsEmpty) songChartData.setEvents(migrateSongEventDataFromLegacy(songData.song.notes));
songChartData.setNotes(migrateSongNoteDataFromLegacy(songData.song.notes), difficulty);
songChartData.setScrollSpeed(songData.song.speed, difficulty);
return songChartData;
}

View file

@ -82,9 +82,9 @@ class SongSerializer
* Save a SongChartData object as a JSON file to an automatically generated path.
* Works great on HTML5 and desktop.
*/
public static function exportSongChartData(data:SongChartData)
public static function exportSongChartData(data:SongChartData, songId:String)
{
var path = 'chart.json';
var path = '${songId}-chart.json';
exportSongChartDataAs(path, data);
}
@ -92,9 +92,9 @@ class SongSerializer
* Save a SongMetadata object as a JSON file to an automatically generated path.
* Works great on HTML5 and desktop.
*/
public static function exportSongMetadata(data:SongMetadata)
public static function exportSongMetadata(data:SongMetadata, songId:String)
{
var path = 'metadata.json';
var path = '${songId}-metadata.json';
exportSongMetadataAs(path, data);
}

View file

@ -10,10 +10,10 @@ typedef LegacySongData =
var player1:String; // Boyfriend
var player2:String; // Opponent
var speed:LegacyScrollSpeeds;
var speed:Float;
var stageDefault:String;
var bpm:Float;
var notes:LegacyNoteData;
var notes:Array<LegacyNoteSection>;
var song:String; // Song name
};

View file

@ -601,7 +601,7 @@ class ChartEditorDialogHandler
{
trace('Adding vocal upload for character ${charKey}');
var charMetadata:CharacterData = CharacterDataParser.fetchCharacterData(charKey);
var charName:String = charMetadata.name;
var charName:String = charMetadata != null ? charMetadata.name : charKey;
var vocalsEntry:Component = state.buildComponent(CHART_EDITOR_DIALOG_UPLOAD_VOCALS_ENTRY_LAYOUT);

View file

@ -3367,10 +3367,10 @@ class ChartEditorState extends HaxeUIState
audioVocalTrackGroup.clear();
}
// Add player vocals.
if (currentSongCharacterPlayer != null) audioVocalTrackGroup.addPlayerVocals(new FlxSound().loadEmbedded(Assets.getSound(Paths.voices(songId,
if (currentSongCharacterPlayer != null) audioVocalTrackGroup.addPlayerVoice(new FlxSound().loadEmbedded(Assets.getSound(Paths.voices(songId,
'-$currentSongCharacterPlayer'))));
// Add opponent vocals.
if (currentSongCharacterOpponent != null) audioVocalTrackGroup.addOpponentVocals(new FlxSound().loadEmbedded(Assets.getSound(Paths.voices(songId,
if (currentSongCharacterOpponent != null) audioVocalTrackGroup.addOpponentVoice(new FlxSound().loadEmbedded(Assets.getSound(Paths.voices(songId,
'-$currentSongCharacterOpponent'))));
postLoadInstrumental();

View file

@ -374,11 +374,11 @@ class ChartEditorToolboxHandler
var difficultyToolboxLoadChart:Button = toolbox.findComponent('difficultyToolboxLoadChart', Button);
difficultyToolboxSaveMetadata.onClick = function(event:UIEvent) {
SongSerializer.exportSongMetadata(state.currentSongMetadata);
SongSerializer.exportSongMetadata(state.currentSongMetadata, state);
};
difficultyToolboxSaveChart.onClick = function(event:UIEvent) {
SongSerializer.exportSongChartData(state.currentSongChartData);
SongSerializer.exportSongChartData(state.currentSongChartData, state);
};
difficultyToolboxSaveAll.onClick = function(event:UIEvent) {