From 7d7db50c19779bc5c92753e459f58f4a19f8ba0c Mon Sep 17 00:00:00 2001 From: Ralty <78720179+Raltyro@users.noreply.github.com> Date: Sat, 9 Aug 2025 15:54:03 +0700 Subject: [PATCH] Fix Variation Editor Crash --- source/funkin/backend/chart/Chart.hx | 34 +++++++++++-------- .../editors/charter/CharterSelection.hx | 3 +- .../editors/charter/SongCreationScreen.hx | 5 +-- .../charter/VariationCreationScreen.hx | 2 +- source/funkin/menus/FreeplayState.hx | 10 +++--- 5 files changed, 32 insertions(+), 22 deletions(-) diff --git a/source/funkin/backend/chart/Chart.hx b/source/funkin/backend/chart/Chart.hx index bf2fb50f..a02bb121 100644 --- a/source/funkin/backend/chart/Chart.hx +++ b/source/funkin/backend/chart/Chart.hx @@ -83,6 +83,24 @@ class Chart { return data; } + inline public static function defaultChartMetaFields(data:ChartMetaData):ChartMetaData { + data.setFieldDefault("displayName", data.name); + + data.setFieldDefault("bpm", Flags.DEFAULT_BPM); + data.setFieldDefault("beatsPerMeasure", Flags.DEFAULT_BEATS_PER_MEASURE); + data.setFieldDefault("stepsPerBeat", Flags.DEFAULT_STEPS_PER_BEAT); + data.setFieldDefault("icon", Flags.DEFAULT_HEALTH_ICON); + data.setFieldDefault("coopAllowed", Flags.DEFAULT_COOP_ALLOWED); + data.setFieldDefault("opponentModeAllowed", Flags.DEFAULT_OPPONENT_MODE_ALLOWED); + data.setFieldDefault("instSuffix", ""); + data.setFieldDefault("vocalsSuffix", ""); + data.setFieldDefault("needsVoices", true); + data.setFieldDefault("difficulties", []); + data.setFieldDefault("variants", []); + + return data; + } + public static function loadChartMeta(songName:String, ?variant:String, fromMods:Bool = true, includeMetaVariations = true):ChartMetaData { var defaultPath = Paths.file('songs/$songName/meta.json'), isVariant = false; var data:ChartMetaData = null, paths = (variant == null || variant == '') ? [defaultPath] : [Paths.file('songs/$songName/meta-$variant.json'), defaultPath]; @@ -109,19 +127,7 @@ class Chart { if (isVariant) data.variant = variant; else data.variant = null; - data.setFieldDefault("displayName", data.name); - - data.setFieldDefault("bpm", Flags.DEFAULT_BPM); - data.setFieldDefault("beatsPerMeasure", Flags.DEFAULT_BEATS_PER_MEASURE); - data.setFieldDefault("stepsPerBeat", Flags.DEFAULT_STEPS_PER_BEAT); - data.setFieldDefault("icon", Flags.DEFAULT_HEALTH_ICON); - data.setFieldDefault("coopAllowed", Flags.DEFAULT_COOP_ALLOWED); - data.setFieldDefault("opponentModeAllowed", Flags.DEFAULT_OPPONENT_MODE_ALLOWED); - data.setFieldDefault("instSuffix", ""); - data.setFieldDefault("vocalsSuffix", ""); - data.setFieldDefault("needsVoices", true); - data.setFieldDefault("difficulties", []); - data.setFieldDefault("variants", []); + defaultChartMetaFields(data); if (data.difficulties.length <= 0) { var path = 'songs/$songName/charts/'; @@ -283,7 +289,6 @@ class Chart { var eventsPath = '$songPath/events.json', events = filterEventsForSaving(chart.events, false, true); if (events.length != 0) CoolUtil.safeSaveFile(eventsPath, Json.stringify({events: events}, null, prettyPrint)); - else if (FileSystem.exists(eventsPath)) FileSystem.deleteFile(eventsPath); } #end @@ -332,6 +337,7 @@ class Chart { public static inline function filterMetaForSaving(meta:ChartMetaData):ChartMetaData { var data:Dynamic = Reflect.copy(meta); if (data.color != null) data.color = FlxColor.fromInt(data.color).toWebString(); // dont even ask me - Nex + Reflect.deleteField(data, "name"); Reflect.deleteField(data, 'parsedColor'); Reflect.deleteField(data, 'metas'); Reflect.deleteField(data, "variant"); diff --git a/source/funkin/editors/charter/CharterSelection.hx b/source/funkin/editors/charter/CharterSelection.hx index 2b259d94..eca9c8f9 100644 --- a/source/funkin/editors/charter/CharterSelection.hx +++ b/source/funkin/editors/charter/CharterSelection.hx @@ -41,7 +41,7 @@ class CharterSelectionScreen extends EditorTreeMenuScreen { for (d in s.difficulties) if (d != '') screen.add(makeChartOption(d, isVariant ? s.variant : null, s.name)); screen.add(new Separator()); - for (v in s.variants) if (s.metas.get(v) != null) screen.add(makeVariationOption(s.metas.get(v))); + if (s.variants != null) for (v in s.variants) if (s.metas.get(v) != null) screen.add(makeVariationOption(s.metas.get(v))); #if sys screen.insert(0, new NewOption(getID('newDifficulty'), getID('newDifficultyDesc'), () -> { @@ -113,6 +113,7 @@ class CharterSelectionScreen extends EditorTreeMenuScreen { // Add to List if (variant != null && curSong != null) { + if (curSong.variants == null) curSong.variants.push(variant); curSong.variants.push(variant); curSong.metas.set(variant, creation.meta); diff --git a/source/funkin/editors/charter/SongCreationScreen.hx b/source/funkin/editors/charter/SongCreationScreen.hx index c6e9a8f3..cc41ea92 100644 --- a/source/funkin/editors/charter/SongCreationScreen.hx +++ b/source/funkin/editors/charter/SongCreationScreen.hx @@ -357,7 +357,8 @@ class SongCreationScreen extends UISubstateWindow { } // for variations - function formatMeta(meta:ChartMetaData):ChartMetaData return meta; + function formatMeta(meta:ChartMetaData):ChartMetaData + return funkin.backend.chart.Chart.defaultChartMetaFields(meta); function getChartSavePath(meta:ChartMetaData, diff:String):String return 'charts/${meta.variant != null && meta.variant != "" ? meta.variant + "/" : ""}$diff.json'; @@ -432,7 +433,7 @@ class SongCreationScreen extends UISubstateWindow { color: colorWheel.curColor, opponentModeAllowed: opponentModeCheckbox.checked, coopAllowed: coopAllowedCheckbox.checked, - difficulties: [for (diff in difficultiesTextBox.label.text.split(",")) diff.trim()], + difficulties: [for (diff in difficultiesTextBox.label.text.split(",")) diff.trim()] }); if (onSave != null) onSave({ diff --git a/source/funkin/editors/charter/VariationCreationScreen.hx b/source/funkin/editors/charter/VariationCreationScreen.hx index 132bda75..30238cf9 100644 --- a/source/funkin/editors/charter/VariationCreationScreen.hx +++ b/source/funkin/editors/charter/VariationCreationScreen.hx @@ -39,6 +39,6 @@ class VariationCreationScreen extends SongCreationScreen { meta.variant = meta.name; meta.vocalsSuffix = meta.instSuffix = '-${meta.variant}'; meta.name = parentMeta.name; - return meta; + return super.formatMeta(meta); } } \ No newline at end of file diff --git a/source/funkin/menus/FreeplayState.hx b/source/funkin/menus/FreeplayState.hx index 837efe6e..224f2422 100644 --- a/source/funkin/menus/FreeplayState.hx +++ b/source/funkin/menus/FreeplayState.hx @@ -505,10 +505,12 @@ class FreeplayState extends MusicBeatState curDifficulties = songs[curSelected].difficulties.copy(); for (i in 0...curDifficulties.length) curDiffMetaKeys.push(null); - var meta:ChartMetaData; - for (variant in songs[curSelected].variants) if ((meta = songs[curSelected].metas.get(variant)) != null) { - curDifficulties = curDifficulties.concat(meta.difficulties); - for (i in 0...meta.difficulties.length) curDiffMetaKeys.push(variant); + if (songs[curSelected].variants != null) { + var meta:ChartMetaData; + for (variant in songs[curSelected].variants) if ((meta = songs[curSelected].metas.get(variant)) != null) { + curDifficulties = curDifficulties.concat(meta.difficulties); + for (i in 0...meta.difficulties.length) curDiffMetaKeys.push(variant); + } } }