mirror of
https://github.com/ninjamuffin99/Funkin.git
synced 2025-11-22 13:13:47 +00:00
Chart editor changes (support for legacy import)
This commit is contained in:
parent
2200b6a24a
commit
038d258233
|
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
var songEventsEmpty:Bool = songChartData.getEvents() == null || songChartData.getEvents().length == 0;
|
||||||
if (songEventsEmpty) songChartData.setEvents(migrateSongEventDataFromLegacy(songData.song.notes.normal));
|
if (songEventsEmpty) songChartData.setEvents(migrateSongEventDataFromLegacy(songData.song.notes));
|
||||||
songChartData.setNotes(migrateSongNoteDataFromLegacy(songData.song.notes.normal), 'normal');
|
songChartData.setNotes(migrateSongNoteDataFromLegacy(songData.song.notes), difficulty);
|
||||||
songChartData.setScrollSpeed(songData.song.speed.normal, 'normal');
|
songChartData.setScrollSpeed(songData.song.speed, difficulty);
|
||||||
}
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue