From b5f399623659bbb0342ff10169d0229359e07e99 Mon Sep 17 00:00:00 2001 From: EliteMasterEric Date: Fri, 27 Sep 2024 12:21:17 -0400 Subject: [PATCH] Properly sort difficulties/variations. Validate variation IDs (alphanumeric only) --- source/funkin/play/song/Song.hx | 53 +++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 15 deletions(-) diff --git a/source/funkin/play/song/Song.hx b/source/funkin/play/song/Song.hx index 9023b872e..a6449bc10 100644 --- a/source/funkin/play/song/Song.hx +++ b/source/funkin/play/song/Song.hx @@ -156,6 +156,11 @@ class Song implements IPlayStateScriptedClass implements IRegistryEntry = fetchVariationMetadata(id, vari); if (variMeta != null) { @@ -407,7 +412,6 @@ class Song implements IPlayStateScriptedClass implements IRegistryEntry { - if (char == null) return variations; + if (char == null) + { + var result = variations; + result.sort(SortUtil.defaultsThenAlphabetically.bind(Constants.DEFAULT_VARIATION_LIST)); + return result; + } var result = []; trace('Evaluating variations for ${this.id} ${char.id}: ${this.variations}'); @@ -445,6 +454,8 @@ class Song implements IPlayStateScriptedClass implements IRegistryEntry = difficulties.keys() - .array() - .map(function(diffId:String):Null { - var difficulty:Null = difficulties.get(diffId); - if (difficulty == null) return null; - if (variationIds.length > 0 && !variationIds.contains(difficulty.variation)) return null; - return difficulty.difficulty; - }) + var diffFiltered:Array = variationIds.map(function(variationId:String):Array { + var metadata = _metadata.get(variationId); + return metadata?.playData?.difficulties ?? []; + }) + .flatten() .filterNull() .distinct(); @@ -489,11 +493,15 @@ class Song implements IPlayStateScriptedClass implements IRegistryEntry, ?showLocked:Bool, ?showHidden:Bool):Array { var result = []; @@ -509,6 +517,8 @@ class Song implements IPlayStateScriptedClass implements IRegistryEntry = SongRegistry.instance.parseEntryMetadataWithMigration(id, vari, version); return meta; } + + static final VARIATION_REGEX = ~/^[a-z][a-z0-9]+$/; + + /** + * Validate that the variation ID is valid. + * Auto-accept if it's one of the base game default variations. + * Reject if the ID starts with a number, or contains invalid characters. + */ + static function validateVariationId(variation:String):Bool { + if (Constants.DEFAULT_VARIATION_LIST.contains(variation)) return true; + + return VARIATION_REGEX.match(variation); + } } class SongDifficulty