From be4fd74d4030e89e650f348d5581d9604814c5ce Mon Sep 17 00:00:00 2001 From: EliteMasterEric Date: Mon, 25 Sep 2023 23:24:18 -0400 Subject: [PATCH] Resolve metadata loading issues. --- source/funkin/data/song/SongData.hx | 22 +++--- source/funkin/data/song/SongRegistry.hx | 93 ++++++++++++++++--------- source/funkin/play/song/Song.hx | 29 ++++---- 3 files changed, 88 insertions(+), 56 deletions(-) diff --git a/source/funkin/data/song/SongData.hx b/source/funkin/data/song/SongData.hx index 5eb221094..d557bd39c 100644 --- a/source/funkin/data/song/SongData.hx +++ b/source/funkin/data/song/SongData.hx @@ -47,7 +47,7 @@ class SongMetadata @:jignored public var variation:String; - public function new(songName:String, artist:String, variation:String = 'default') + public function new(songName:String, artist:String, ?variation:String) { this.version = SongRegistry.SONG_METADATA_VERSION; this.songName = songName; @@ -64,7 +64,7 @@ class SongMetadata this.playData.noteSkin = 'funkin'; this.generatedBy = SongRegistry.DEFAULT_GENERATEDBY; // Variation ID. - this.variation = variation; + this.variation = (variation == null) ? Constants.DEFAULT_VARIATION : variation; } /** @@ -90,12 +90,13 @@ class SongMetadata * Serialize this SongMetadata into a JSON string. * @return The JSON string. */ - public function serialize(?pretty:Bool = true):String + public function serialize(pretty:Bool = true):String { var writer = new json2object.JsonWriter(); - var output = this.clone(); - output.variation = null; // Not sure how to make a field optional on the reader and ignored on the writer. - return writer.write(output, pretty ? ' ' : null); + // I believe @:jignored should be iggnored by the writer? + // var output = this.clone(); + // output.variation = null; // Not sure how to make a field optional on the reader and ignored on the writer. + return writer.write(this, pretty ? ' ' : null); } /** @@ -230,7 +231,7 @@ class SongMusicData * Defaults to `default` or `''`. Populated later. */ @:jignored - public var variation:String = 'default'; + public var variation:String = Constants.DEFAULT_VARIATION; public function new(songName:String, artist:String, variation:String = 'default') { @@ -243,7 +244,7 @@ class SongMusicData this.looped = false; this.generatedBy = SongRegistry.DEFAULT_GENERATEDBY; // Variation ID. - this.variation = variation; + this.variation = variation == null ? Constants.DEFAULT_VARIATION : variation; } public function clone(?newVariation:String = null):SongMusicData @@ -374,6 +375,9 @@ class SongChartData @:default(funkin.data.song.SongRegistry.DEFAULT_GENERATEDBY) public var generatedBy:String; + @:jignored + public var variation:String; + public function new(scrollSpeed:Map, events:Array, notes:Map>) { this.version = SongRegistry.SONG_CHART_DATA_VERSION; @@ -418,7 +422,7 @@ class SongChartData /** * Convert this SongChartData into a JSON string. */ - public function serialize(?pretty:Bool = true):String + public function serialize(pretty:Bool = true):String { var writer = new json2object.JsonWriter(); return writer.write(this, pretty ? ' ' : null); diff --git a/source/funkin/data/song/SongRegistry.hx b/source/funkin/data/song/SongRegistry.hx index 1a7c41d33..cf2da14f7 100644 --- a/source/funkin/data/song/SongRegistry.hx +++ b/source/funkin/data/song/SongRegistry.hx @@ -120,10 +120,9 @@ class SongRegistry extends BaseRegistry return parseEntryMetadataRaw(contents); } - public function parseEntryMetadata(id:String, variation:String = ""):Null + public function parseEntryMetadata(id:String, ?variation:String):Null { - // JsonParser does not take type parameters, - // otherwise this function would be in BaseRegistry. + variation = variation == null ? Constants.DEFAULT_VARIATION : variation; var parser = new json2object.JsonParser(); switch (loadEntryMetadataFile(id, variation)) @@ -139,11 +138,13 @@ class SongRegistry extends BaseRegistry printErrors(parser.errors, id); return null; } - return parser.value; + return cleanMetadata(parser.value, variation); } - public function parseEntryMetadataRaw(contents:String, ?fileName:String = 'raw'):Null + public function parseEntryMetadataRaw(contents:String, ?fileName:String = 'raw', ?variation:String):Null { + variation = variation == null ? Constants.DEFAULT_VARIATION : variation; + var parser = new json2object.JsonParser(); parser.fromJson(contents, fileName); @@ -152,23 +153,25 @@ class SongRegistry extends BaseRegistry printErrors(parser.errors, fileName); return null; } - return parser.value; + return cleanMetadata(parser.value, variation); } - public function parseEntryMetadataWithMigration(id:String, variation:String = '', version:thx.semver.Version):Null + public function parseEntryMetadataWithMigration(id:String, ?variation:String, version:thx.semver.Version):Null { + variation = variation == null ? Constants.DEFAULT_VARIATION : variation; + // If a version rule is not specified, do not check against it. if (SONG_METADATA_VERSION_RULE == null || VersionUtil.validateVersion(version, SONG_METADATA_VERSION_RULE)) { - return parseEntryMetadata(id); + return parseEntryMetadata(id, variation); } else if (VersionUtil.validateVersion(version, "2.0.x")) { - return parseEntryMetadata_v2_0_0(id); + return parseEntryMetadata_v2_0_0(id, variation); } else { - throw '[${registryId}] Metadata entry ${id}:${variation == '' ? 'default' : variation} does not support migration to version ${SONG_METADATA_VERSION_RULE}.'; + throw '[${registryId}] Metadata entry ${id}:${variation} does not support migration to version ${SONG_METADATA_VERSION_RULE}.'; } } @@ -191,8 +194,8 @@ class SongRegistry extends BaseRegistry function parseEntryMetadata_v2_0_0(id:String, variation:String = ""):Null { - // JsonParser does not take type parameters, - // otherwise this function would be in BaseRegistry. + variation = variation == null ? Constants.DEFAULT_VARIATION : variation; + var parser = new json2object.JsonParser(); switch (loadEntryMetadataFile(id)) { @@ -222,10 +225,9 @@ class SongRegistry extends BaseRegistry return parser.value.migrate(); } - public function parseMusicData(id:String, variation:String = ""):Null + public function parseMusicData(id:String, ?variation:String):Null { - // JsonParser does not take type parameters, - // otherwise this function would be in BaseRegistry. + variation = variation == null ? Constants.DEFAULT_VARIATION : variation; var parser = new json2object.JsonParser(); switch (loadMusicDataFile(id, variation)) @@ -257,8 +259,10 @@ class SongRegistry extends BaseRegistry return parser.value; } - public function parseMusicDataWithMigration(id:String, variation:String = '', version:thx.semver.Version):Null + public function parseMusicDataWithMigration(id:String, ?variation:String, version:thx.semver.Version):Null { + variation = variation == null ? Constants.DEFAULT_VARIATION : variation; + // If a version rule is not specified, do not check against it. if (SONG_MUSIC_DATA_VERSION_RULE == null || VersionUtil.validateVersion(version, SONG_MUSIC_DATA_VERSION_RULE)) { @@ -266,7 +270,7 @@ class SongRegistry extends BaseRegistry } else { - throw '[${registryId}] Chart entry ${id}:${variation == '' ? 'default' : variation} does not support migration to version ${SONG_CHART_DATA_VERSION_RULE}.'; + throw '[${registryId}] Chart entry ${id}:${variation} does not support migration to version ${SONG_CHART_DATA_VERSION_RULE}.'; } } @@ -283,10 +287,10 @@ class SongRegistry extends BaseRegistry } } - public function parseEntryChartData(id:String, variation:String = ''):Null + public function parseEntryChartData(id:String, ?variation:String):Null { - // JsonParser does not take type parameters, - // otherwise this function would be in BaseRegistry. + variation = variation == null ? Constants.DEFAULT_VARIATION : variation; + var parser = new json2object.JsonParser(); switch (loadEntryChartFile(id, variation)) @@ -302,11 +306,13 @@ class SongRegistry extends BaseRegistry printErrors(parser.errors, id); return null; } - return parser.value; + return cleanChartData(parser.value, variation); } - public function parseEntryChartDataRaw(contents:String, ?fileName:String = 'raw'):Null + public function parseEntryChartDataRaw(contents:String, ?fileName:String = 'raw', ?variation:String):Null { + variation = variation == null ? Constants.DEFAULT_VARIATION : variation; + var parser = new json2object.JsonParser(); parser.fromJson(contents, fileName); @@ -315,11 +321,13 @@ class SongRegistry extends BaseRegistry printErrors(parser.errors, fileName); return null; } - return parser.value; + return cleanChartData(parser.value, variation); } - public function parseEntryChartDataWithMigration(id:String, variation:String = '', version:thx.semver.Version):Null + public function parseEntryChartDataWithMigration(id:String, ?variation:String, version:thx.semver.Version):Null { + variation = variation == null ? Constants.DEFAULT_VARIATION : variation; + // If a version rule is not specified, do not check against it. if (SONG_CHART_DATA_VERSION_RULE == null || VersionUtil.validateVersion(version, SONG_CHART_DATA_VERSION_RULE)) { @@ -327,7 +335,7 @@ class SongRegistry extends BaseRegistry } else { - throw '[${registryId}] Chart entry ${id}:${variation == '' ? 'default' : variation} does not support migration to version ${SONG_CHART_DATA_VERSION_RULE}.'; + throw '[${registryId}] Chart entry ${id}:${variation} does not support migration to version ${SONG_CHART_DATA_VERSION_RULE}.'; } } @@ -354,9 +362,10 @@ class SongRegistry extends BaseRegistry return ScriptedSong.listScriptClasses(); } - function loadEntryMetadataFile(id:String, variation:String = ''):Null + function loadEntryMetadataFile(id:String, ?variation:String):Null { - var entryFilePath:String = Paths.json('$dataFilePath/$id/$id${variation == '' ? '' : '-$variation'}-metadata'); + variation = variation == null ? Constants.DEFAULT_VARIATION : variation; + var entryFilePath:String = Paths.json('$dataFilePath/$id/$id-metadata${variation == Constants.DEFAULT_VARIATION ? '' : '-$variation'}'); if (!openfl.Assets.exists(entryFilePath)) return null; var rawJson:Null = openfl.Assets.getText(entryFilePath); if (rawJson == null) return null; @@ -364,9 +373,10 @@ class SongRegistry extends BaseRegistry return {fileName: entryFilePath, contents: rawJson}; } - function loadMusicDataFile(id:String, variation:String = ''):Null + function loadMusicDataFile(id:String, ?variation:String):Null { - var entryFilePath:String = Paths.file('music/$id/$id${variation == '' ? '' : '-$variation'}-metadata.json'); + variation = variation == null ? Constants.DEFAULT_VARIATION : variation; + var entryFilePath:String = Paths.file('music/$id/$id-metadata${variation == Constants.DEFAULT_VARIATION ? '' : '-$variation'}.json'); if (!openfl.Assets.exists(entryFilePath)) return null; var rawJson:String = openfl.Assets.getText(entryFilePath); if (rawJson == null) return null; @@ -374,9 +384,10 @@ class SongRegistry extends BaseRegistry return {fileName: entryFilePath, contents: rawJson}; } - function loadEntryChartFile(id:String, variation:String = ''):Null + function loadEntryChartFile(id:String, ?variation:String):Null { - var entryFilePath:String = Paths.json('$dataFilePath/$id/$id${variation == '' ? '' : '-$variation'}-chart'); + variation = variation == null ? Constants.DEFAULT_VARIATION : variation; + var entryFilePath:String = Paths.json('$dataFilePath/$id/$id-chart${variation == Constants.DEFAULT_VARIATION ? '' : '-$variation'}'); if (!openfl.Assets.exists(entryFilePath)) return null; var rawJson:String = openfl.Assets.getText(entryFilePath); if (rawJson == null) return null; @@ -384,20 +395,36 @@ class SongRegistry extends BaseRegistry return {fileName: entryFilePath, contents: rawJson}; } - public function fetchEntryMetadataVersion(id:String, variation:String = ''):Null + public function fetchEntryMetadataVersion(id:String, ?variation:String):Null { + variation = variation == null ? Constants.DEFAULT_VARIATION : variation; var entryStr:Null = loadEntryMetadataFile(id, variation)?.contents; var entryVersion:thx.semver.Version = VersionUtil.getVersionFromJSON(entryStr); return entryVersion; } - public function fetchEntryChartVersion(id:String, variation:String = ''):Null + public function fetchEntryChartVersion(id:String, ?variation:String):Null { + variation = variation == null ? Constants.DEFAULT_VARIATION : variation; var entryStr:Null = loadEntryChartFile(id, variation)?.contents; var entryVersion:thx.semver.Version = VersionUtil.getVersionFromJSON(entryStr); return entryVersion; } + function cleanMetadata(metadata:SongMetadata, variation:String):SongMetadata + { + metadata.variation = variation; + + return metadata; + } + + function cleanChartData(chartData:SongChartData, variation:String):SongChartData + { + chartData.variation = variation; + + return chartData; + } + /** * A list of all the story weeks from the base game, in order. * TODO: Should this be hardcoded? diff --git a/source/funkin/play/song/Song.hx b/source/funkin/play/song/Song.hx index 6d645961d..d11c7744b 100644 --- a/source/funkin/play/song/Song.hx +++ b/source/funkin/play/song/Song.hx @@ -92,6 +92,15 @@ class Song implements IPlayStateScriptedClass implements IRegistryEntry chartData in charts) result.applyChartData(chartData, variation); @@ -144,10 +145,10 @@ class Song implements IPlayStateScriptedClass implements IRegistryEntry = SongRegistry.instance.fetchEntryMetadataVersion(id); if (version == null) return null; - return SongRegistry.instance.parseEntryMetadataWithMigration(id, '', version); + return SongRegistry.instance.parseEntryMetadataWithMigration(id, Constants.DEFAULT_VARIATION, version); } function fetchVariationMetadata(id:String):Array