From 4f46a8e4d06207f2c12ade56cc54aeaa7136e84e Mon Sep 17 00:00:00 2001 From: AppleHair <95587502+AppleHair@users.noreply.github.com> Date: Tue, 16 Jul 2024 21:17:53 +0300 Subject: [PATCH 1/3] [BUGFIX] Prevented infinite recursion on freeplay when a song doesn't have the `normal` difficulty Any attempt to create a song without the `normal` difficulty will result in a silent crash when opening freeplay. After some debugging, I discovered that the issue is caused by infinite recursion, which gets triggered at the start of `FreeplaySongData`'s `updateValues`. --- source/funkin/ui/freeplay/FreeplayState.hx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/source/funkin/ui/freeplay/FreeplayState.hx b/source/funkin/ui/freeplay/FreeplayState.hx index 690e3b910..a416dbf19 100644 --- a/source/funkin/ui/freeplay/FreeplayState.hx +++ b/source/funkin/ui/freeplay/FreeplayState.hx @@ -2150,8 +2150,11 @@ class FreeplaySongData function updateValues(variations:Array):Void { - this.songDifficulties = song.listSuffixedDifficulties(variations, false, false); - if (!this.songDifficulties.contains(currentDifficulty)) currentDifficulty = Constants.DEFAULT_DIFFICULTY; + this.songDifficulties = song.listDifficulties(null, variations, false, false); + if (!this.songDifficulties.contains(currentDifficulty) && currentDifficulty != Constants.DEFAULT_DIFFICULTY) + { + currentDifficulty = Constants.DEFAULT_DIFFICULTY; + } var songDifficulty:SongDifficulty = song.getDifficulty(currentDifficulty, null, variations); if (songDifficulty == null) return; From c8322c479ced92c8bd737ecf5d64b666958925f3 Mon Sep 17 00:00:00 2001 From: AppleHair <95587502+AppleHair@users.noreply.github.com> Date: Tue, 16 Jul 2024 22:36:11 +0300 Subject: [PATCH 2/3] Added a comment --- source/funkin/ui/freeplay/FreeplayState.hx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/funkin/ui/freeplay/FreeplayState.hx b/source/funkin/ui/freeplay/FreeplayState.hx index a416dbf19..47f55f686 100644 --- a/source/funkin/ui/freeplay/FreeplayState.hx +++ b/source/funkin/ui/freeplay/FreeplayState.hx @@ -2154,6 +2154,9 @@ class FreeplaySongData if (!this.songDifficulties.contains(currentDifficulty) && currentDifficulty != Constants.DEFAULT_DIFFICULTY) { currentDifficulty = Constants.DEFAULT_DIFFICULTY; + // This method gets called again by the setter-method, + // so there's no need to continue. + return; } var songDifficulty:SongDifficulty = song.getDifficulty(currentDifficulty, null, variations); From cb02ea7da5c662c6befac025510c412a329d939f Mon Sep 17 00:00:00 2001 From: AppleHair <95587502+AppleHair@users.noreply.github.com> Date: Wed, 17 Jul 2024 10:20:48 +0300 Subject: [PATCH 3/3] Updated to extend #2712 --- source/funkin/ui/freeplay/FreeplayState.hx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/funkin/ui/freeplay/FreeplayState.hx b/source/funkin/ui/freeplay/FreeplayState.hx index 47f55f686..dedf284ee 100644 --- a/source/funkin/ui/freeplay/FreeplayState.hx +++ b/source/funkin/ui/freeplay/FreeplayState.hx @@ -2151,11 +2151,11 @@ class FreeplaySongData function updateValues(variations:Array):Void { this.songDifficulties = song.listDifficulties(null, variations, false, false); - if (!this.songDifficulties.contains(currentDifficulty) && currentDifficulty != Constants.DEFAULT_DIFFICULTY) + if (!this.songDifficulties.contains(currentDifficulty)) { currentDifficulty = Constants.DEFAULT_DIFFICULTY; - // This method gets called again by the setter-method, - // so there's no need to continue. + // This method gets called again by the setter-method + // or the difficulty didn't change, so there's no need to continue. return; }