1
0
Fork 0
mirror of https://github.com/ninjamuffin99/Funkin.git synced 2025-11-22 05:03:42 +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)); if (PlayStatePlaylist.isStoryMode) openSubState(new funkin.ui.StickerSubState(null, STORY));
else else
openSubState(new funkin.ui.StickerSubState()); openSubState(new funkin.ui.StickerSubState(null, FREEPLAY));
} }
} }

View file

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

View file

@ -377,7 +377,7 @@ abstract SongNoteData(RawSongNoteData)
function get_stepTime():Float 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;
} }
/** /**
@ -563,7 +563,7 @@ abstract SongEventData(RawSongEventData)
function get_stepTime():Float 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;

View file

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

View file

@ -82,9 +82,9 @@ class SongSerializer
* Save a SongChartData object as a JSON file to an automatically generated path. * Save a SongChartData object as a JSON file to an automatically generated path.
* Works great on HTML5 and desktop. * 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); exportSongChartDataAs(path, data);
} }
@ -92,9 +92,9 @@ class SongSerializer
* Save a SongMetadata object as a JSON file to an automatically generated path. * Save a SongMetadata object as a JSON file to an automatically generated path.
* Works great on HTML5 and desktop. * 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); exportSongMetadataAs(path, data);
} }

View file

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

View file

@ -601,7 +601,7 @@ class ChartEditorDialogHandler
{ {
trace('Adding vocal upload for character ${charKey}'); trace('Adding vocal upload for character ${charKey}');
var charMetadata:CharacterData = CharacterDataParser.fetchCharacterData(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); var vocalsEntry:Component = state.buildComponent(CHART_EDITOR_DIALOG_UPLOAD_VOCALS_ENTRY_LAYOUT);

View file

@ -3367,10 +3367,10 @@ class ChartEditorState extends HaxeUIState
audioVocalTrackGroup.clear(); audioVocalTrackGroup.clear();
} }
// Add player vocals. // 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')))); '-$currentSongCharacterPlayer'))));
// Add opponent vocals. // 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')))); '-$currentSongCharacterOpponent'))));
postLoadInstrumental(); postLoadInstrumental();

View file

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