From 8893d0b12d2b92b47135c11a5f0e72511a0f6a79 Mon Sep 17 00:00:00 2001
From: ALLMarvelous <53633401+ALLMarvelous@users.noreply.github.com>
Date: Tue, 6 May 2025 17:52:25 -0500
Subject: [PATCH 1/4] Allow AnyCPU again
---
CustomAlbums.csproj | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CustomAlbums.csproj b/CustomAlbums.csproj
index 36b7eb8..d7f825e 100644
--- a/CustomAlbums.csproj
+++ b/CustomAlbums.csproj
@@ -5,7 +5,7 @@
disable
false
true
- x64
+ AnyCPU;x64
true
From 4b5f106a83a77c3882007954d1b5e591779ddc31 Mon Sep 17 00:00:00 2001
From: ALLMarvelous <53633401+ALLMarvelous@users.noreply.github.com>
Date: Tue, 6 May 2025 17:52:58 -0500
Subject: [PATCH 2/4] Regress modifying DataHelper.highest, manually inject
custom data into required areas
---
Managers/SaveManager.cs | 11 ---
Patches/DataInjectPatch.cs | 104 ----------------------------
Patches/DifficultyGradeIconPatch.cs | 42 -----------
Patches/DifficultyGradePatch.cs | 69 ++++++++++++++++++
Patches/ReportCardPatch.cs | 77 ++++++++++++++++++++
5 files changed, 146 insertions(+), 157 deletions(-)
delete mode 100644 Patches/DataInjectPatch.cs
delete mode 100644 Patches/DifficultyGradeIconPatch.cs
create mode 100644 Patches/DifficultyGradePatch.cs
create mode 100644 Patches/ReportCardPatch.cs
diff --git a/Managers/SaveManager.cs b/Managers/SaveManager.cs
index 145ac78..7d53de0 100644
--- a/Managers/SaveManager.cs
+++ b/Managers/SaveManager.cs
@@ -3,7 +3,6 @@
using CustomAlbums.Data;
using CustomAlbums.Utilities;
using System.IO.Compression;
-using CustomAlbums.Patches;
namespace CustomAlbums.Managers
{
@@ -217,16 +216,6 @@ internal static void SaveScore(string uid, int musicDifficulty, int score, float
if (musicDifficulty is 2 && AlbumManager.LoadedAlbums[albumName].HasDifficulty(3) && newScore.Evaluate >= 4)
SaveData.UnlockedMasters.Add(albumName);
- // Update the IData for the played chart
- var dataIndex = DataInjectPatch.DataList.GetIndexByUid(album.Uid, musicDifficulty);
- if (dataIndex != -1)
- {
- DataInjectPatch.DataList.RemoveAt(dataIndex);
- }
-
- var newIData = DataInjectPatch.CreateIData(album, musicDifficulty, newScore);
- DataInjectPatch.DataList.Add(newIData);
-
// If there were no misses then add the chart/difficulty to the FullCombo list
if (miss != 0) return;
diff --git a/Patches/DataInjectPatch.cs b/Patches/DataInjectPatch.cs
deleted file mode 100644
index e78cf3c..0000000
--- a/Patches/DataInjectPatch.cs
+++ /dev/null
@@ -1,104 +0,0 @@
-using CustomAlbums.Data;
-using CustomAlbums.Managers;
-using HarmonyLib;
-using Il2CppAssets.Scripts.Database;
-using Il2CppAssets.Scripts.PeroTools.Nice.Interface;
-using Il2CppAssets.Scripts.PeroTools.Nice.Variables;
-using IDataList = Il2CppSystem.Collections.Generic.List;
-
-namespace CustomAlbums.Patches
-{
- ///
- /// This patch modifies the highest property of DataHelper to include custom charts.
- ///
- [HarmonyPatch(typeof(DataHelper), nameof(DataHelper.highest), MethodType.Getter)]
- internal class DataInjectPatch
- {
- internal static readonly IDataList DataList = new();
-
- // ReSharper disable once InconsistentNaming
- private static void Postfix(ref IDataList __result)
- {
- var highest = DataHelper.s_DataManager["Achievement"]["highest"].GetResult();
- if (highest == null) return;
-
- if (DataList.Count > 0)
- {
- var combined1 = new IDataList();
- foreach (var item in highest)
- combined1.Add(item);
- foreach (var item in DataList)
- combined1.Add(item);
-
- __result = combined1;
- return;
- }
-
- var customsHighest = SaveManager.SaveData.Highest;
-
- foreach (var (albumName, albumDic) in customsHighest)
- {
- foreach (var (difficulty, save) in albumDic)
- {
- if (!AlbumManager.LoadedAlbums.TryGetValue(albumName, out var album))
- continue;
-
- var data = CreateIData(album, difficulty, save);
- DataList.Add(data);
- }
- }
-
- // combine the two lists highest and data
- var combined = new IDataList();
- foreach (var item in highest)
- {
- combined.Add(item);
- }
- foreach (var item in DataList)
- {
- combined.Add(item);
- }
-
- // set the result to the combined list
- __result = combined;
- }
-
- ///
- /// Creates a Muse Dash-compatible IData object from a CustomChartSave object.
- ///
- /// The album of the data to be created.
- /// The difficulty of the chart.
- /// The CustomChartSave object containing the save data.
- ///
- internal static IData CreateIData(Album album, int difficulty, ChartSave save)
- {
- var data = new Il2CppAssets.Scripts.PeroTools.Nice.Datas.Data();
-
- data.fields.Add("uid", CreateIVariable($"{album.Uid}_{difficulty}"));
- data.fields.Add("evaluate", CreateIVariable(save.Evaluate));
- data.fields.Add("score", CreateIVariable(save.Score));
- data.fields.Add("combo", CreateIVariable(save.Combo));
- data.fields.Add("accuracy", CreateIVariable(save.Accuracy));
- data.fields.Add("accuracyStr", CreateIVariable(save.AccuracyStr));
- data.fields.Add("clear", CreateIVariable(save.Clear));
- data.fields.Add("passed", CreateIVariable(save.Passed));
-
- return data.Cast();
- }
-
- ///
- /// Creates a Muse Dash-compatible IVariable object from an Il2CppSystem.Object.
- ///
- /// The object (Il2Cpp) to be converted to IVariable.
- ///
- internal static IVariable CreateIVariable(Il2CppSystem.Object obj)
- {
- var constance = new Constance
- {
- result = obj
- };
-
- return constance.Cast();
- }
- }
-}
diff --git a/Patches/DifficultyGradeIconPatch.cs b/Patches/DifficultyGradeIconPatch.cs
deleted file mode 100644
index eca89e3..0000000
--- a/Patches/DifficultyGradeIconPatch.cs
+++ /dev/null
@@ -1,42 +0,0 @@
-using CustomAlbums.Utilities;
-using HarmonyLib;
-using Il2Cpp;
-using Il2CppAssets.Scripts.Database;
-using Il2CppAssets.Scripts.PeroTools.Commons;
-using Il2CppAssets.Scripts.UI.Panels;
-
-namespace CustomAlbums.Patches
-{
- internal class DifficultyGradeIconPatch
- {
- ///
- /// Fixes vanilla bug where the difficulty grade icon on hidden charts does not update properly when triggerDiff is not 3.
- ///
- [HarmonyPatch(typeof(PnlStage), nameof(PnlStage.RefreshDiffUI))]
- internal class DiffUIFix
- {
- private static void Postfix(MusicInfo musicInfo, PnlStage __instance)
- {
- var uid = musicInfo?.uid;
- var specialSongInstance = Singleton.instance;
-
- if (string.IsNullOrEmpty(uid) || !specialSongInstance.IsInvokeHideBms(uid)) return;
- if (!specialSongInstance.m_HideBmsInfos.TryGetValue(uid, out var info)) return;
-
- // Get the hidden difficulty evaluate
- var hiddenEval = DataHelper.highest.GetIDataByUid(uid, 4).ToChartSave().Evaluate;
-
- // The game handles case 3 already, don't need to reinvent the wheel here
- switch (info.triggerDiff)
- {
- case 1:
- __instance.m_Diff1Item.ChangeSchemeByEvalue(hiddenEval, __instance.globalData);
- break;
- case 2:
- __instance.m_Diff2Item.ChangeSchemeByEvalue(hiddenEval, __instance.globalData);
- break;
- }
- }
- }
- }
-}
diff --git a/Patches/DifficultyGradePatch.cs b/Patches/DifficultyGradePatch.cs
new file mode 100644
index 0000000..c8b7d20
--- /dev/null
+++ b/Patches/DifficultyGradePatch.cs
@@ -0,0 +1,69 @@
+using CustomAlbums.Managers;
+using CustomAlbums.Utilities;
+using HarmonyLib;
+using Il2Cpp;
+using Il2CppAssets.Scripts.Database;
+using Il2CppAssets.Scripts.PeroTools.Commons;
+using Il2CppAssets.Scripts.UI.Panels;
+
+namespace CustomAlbums.Patches
+{
+
+ [HarmonyPatch(typeof(PnlStage), nameof(PnlStage.RefreshDiffUI))]
+ internal class DifficultyGradePatch
+ {
+ private static int GetEvaluate(Dictionary highest, int diff) => highest.GetValueOrDefault(diff)?.Evaluate ?? -1;
+
+ ///
+ /// Enables the S logos on the difficulties for custom charts.
+ ///
+ // ReSharper disable once InconsistentNaming
+ private static void Postfix(MusicInfo musicInfo, PnlStage __instance)
+ {
+ var uid = musicInfo?.uid;
+ var specialSongInstance = Singleton.instance;
+
+ if (string.IsNullOrEmpty(uid)) return;
+
+ // For custom charts, we need to set the S logos for each difficulty
+ if (uid.StartsWith($"{AlbumManager.Uid}-"))
+ {
+ // Gets the highest data from save data
+ var customHighest = SaveManager.SaveData.GetChartSaveDataFromUid(uid).Highest;
+
+ // Get the Evaluate value from each, set diff3 to diff4 if hidden is invoked
+ var diff1 = GetEvaluate(customHighest, 1);
+ var diff2 = GetEvaluate(customHighest, 2);
+ var diff3 = Singleton.instance.IsInvokeHideBms(uid)
+ ? GetEvaluate(customHighest, 4)
+ : GetEvaluate(customHighest, 3);
+
+ // Set the S logos for each difficulty
+ __instance.m_Diff1Item.ChangeSchemeByEvalue(diff1, __instance.globalData);
+ __instance.m_Diff2Item.ChangeSchemeByEvalue(diff2, __instance.globalData);
+ __instance.m_Diff3Item.ChangeSchemeByEvalue(diff3, __instance.globalData);
+ }
+
+ // For vanilla and custom charts, this fixes the hidden difficulty icon for non-master charts
+ if (!specialSongInstance.IsInvokeHideBms(uid)) return;
+ if (!specialSongInstance.m_HideBmsInfos.TryGetValue(uid, out var info)) return;
+
+ // Get the difficulty evaluates
+ var hiddenEval = DataHelper.highest.GetIDataByUid(uid, 4).ToChartSave().Evaluate;
+ var masterEval = DataHelper.highest.GetIDataByUid(uid, 3).ToChartSave().Evaluate;
+
+ // The game handles case 3 already, don't need to reinvent the wheel here
+ switch (info.triggerDiff)
+ {
+ case 1:
+ __instance.m_Diff3Item.ChangeSchemeByEvalue(masterEval, __instance.globalData);
+ __instance.m_Diff1Item.ChangeSchemeByEvalue(hiddenEval, __instance.globalData);
+ break;
+ case 2:
+ __instance.m_Diff3Item.ChangeSchemeByEvalue(masterEval, __instance.globalData);
+ __instance.m_Diff2Item.ChangeSchemeByEvalue(hiddenEval, __instance.globalData);
+ break;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Patches/ReportCardPatch.cs b/Patches/ReportCardPatch.cs
new file mode 100644
index 0000000..797139b
--- /dev/null
+++ b/Patches/ReportCardPatch.cs
@@ -0,0 +1,77 @@
+using System.Globalization;
+using System.Reflection;
+using CustomAlbums.Managers;
+using HarmonyLib;
+using Il2Cpp;
+using Il2CppAssets.Scripts.Database;
+using Il2CppAssets.Scripts.GameCore.Managers;
+using Il2CppAssets.Scripts.PeroTools.Commons;
+using Il2CppAssets.Scripts.UI.Panels;
+
+namespace CustomAlbums.Patches
+{
+ [HarmonyPatch(typeof(PnlReportCard), nameof(PnlReportCard.RefreshBestRecord))]
+ internal static class ReportCardPatch
+ {
+ // ReSharper disable once InconsistentNaming
+ private static bool Prefix(PnlReportCard __instance)
+ {
+ var musicInfo = GlobalDataBase.s_DbMusicTag.CurMusicInfo();
+ if (musicInfo.albumIndex != 999) return true;
+
+ var mapDifficulty = GlobalDataBase.s_DbBattleStage.m_MapDifficulty;
+ var curMusicBestRankOrder = Singleton.instance.GetCurMusicBestRankOrder();
+
+ var album = AlbumManager.GetByUid(musicInfo.uid);
+ if (album == null) return false;
+
+ var save = SaveManager.SaveData.Highest[album.AlbumName][mapDifficulty];
+ if (save == null) return false;
+
+ __instance.RefreshRecord(musicInfo, mapDifficulty, save.Score, save.Combo, save.AccuracyStr, save.Evaluate, save.Clear.ToString(CultureInfo.InvariantCulture), curMusicBestRankOrder);
+ return false;
+ }
+ }
+
+ [HarmonyPatch]
+ internal static class TogglePatch
+ {
+ private static IEnumerable TargetMethods()
+ {
+ return new[] { nameof(PnlPreparation.OnDiffTglChanged), nameof(PnlPreparation.OnEnable) }
+ .Select(methodName => typeof(PnlPreparation).GetMethod(methodName))
+ .ToArray();
+ }
+ // ReSharper disable once InconsistentNaming
+ private static void Postfix(PnlPreparation __instance)
+ {
+ var musicInfo = GlobalDataBase.s_DbMusicTag.CurMusicInfo();
+ if (musicInfo.albumIndex != 999) return;
+
+ var mapDifficulty = GlobalDataBase.s_DbBattleStage.m_MapDifficulty;
+ var gameObject = __instance.btnDownloadReport.gameObject;
+
+ var album = AlbumManager.GetByUid(musicInfo.uid);
+ if (album == null)
+ {
+ gameObject.SetActive(false);
+ return;
+ }
+
+ if (!SaveManager.SaveData.Highest.TryGetValue(album.AlbumName, out var chart))
+ {
+ gameObject.SetActive(false);
+ return;
+ }
+
+ if (!chart.ContainsKey(mapDifficulty))
+ {
+ gameObject.SetActive(false);
+ return;
+ }
+
+ gameObject.SetActive(true);
+ }
+ }
+}
+
From 95ae2feb49327d4cf5dbeccea6cf7fa96cdab1a2 Mon Sep 17 00:00:00 2001
From: ALLMarvelous <53633401+ALLMarvelous@users.noreply.github.com>
Date: Tue, 6 May 2025 17:53:40 -0500
Subject: [PATCH 3/4] Rename patch
---
.../{DifficultyGradePatch.cs => DifficultyGradeIconPatch.cs} | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
rename Patches/{DifficultyGradePatch.cs => DifficultyGradeIconPatch.cs} (98%)
diff --git a/Patches/DifficultyGradePatch.cs b/Patches/DifficultyGradeIconPatch.cs
similarity index 98%
rename from Patches/DifficultyGradePatch.cs
rename to Patches/DifficultyGradeIconPatch.cs
index c8b7d20..e619284 100644
--- a/Patches/DifficultyGradePatch.cs
+++ b/Patches/DifficultyGradeIconPatch.cs
@@ -10,7 +10,7 @@ namespace CustomAlbums.Patches
{
[HarmonyPatch(typeof(PnlStage), nameof(PnlStage.RefreshDiffUI))]
- internal class DifficultyGradePatch
+ internal class DifficultyGradeIconPatch
{
private static int GetEvaluate(Dictionary highest, int diff) => highest.GetValueOrDefault(diff)?.Evaluate ?? -1;
From 9257dd4c5453cf91b15d24bd3027b5b1cebf060c Mon Sep 17 00:00:00 2001
From: ALLMarvelous <53633401+ALLMarvelous@users.noreply.github.com>
Date: Tue, 6 May 2025 17:54:08 -0500
Subject: [PATCH 4/4] Bump version for release
---
Main.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Main.cs b/Main.cs
index 66d9346..4c995ba 100644
--- a/Main.cs
+++ b/Main.cs
@@ -12,7 +12,7 @@ public class Main : MelonMod
public const string MelonName = "CustomAlbums";
public const string MelonAuthor = "Two Fellas";
- public const string MelonVersion = "4.1.8";
+ public const string MelonVersion = "4.1.9";
public override void OnInitializeMelon()
{