using MU3.Data; using MU3.DataStudio; using MU3.User; using MU3.Util; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; namespace MU3.Mod; public static class CustomRating { private static patch_UserOption.eRating eRating => (patch_UserOption.eRating)Singleton.instance.userOption.customSet.Rating; public static int GetNaive() { int res = 0; foreach(Rating best in calcNaive().Take(45)) { res += best.rate100; } return res / 45; } public static int GetReachable() { FieldInfo piOld = typeof(UserRating).GetField("_bestOldList", BindingFlags.Instance | BindingFlags.NonPublic); FieldInfo piNew = typeof(UserRating).GetField("_bestNewList", BindingFlags.Instance | BindingFlags.NonPublic); var ur = Singleton.instance.userRating; int res = 0; int top = 0; foreach(Rating src in ((RatingList)piOld.GetValue(ur))) { res += src.rate100; if(src.level100 == 0 || src.musicTbl.isLunatic || src.musicTbl.isBonusTrack) { continue; } top = Math.Max(top, src.rate100); } foreach(Rating src in ((RatingList)piNew.GetValue(ur))) { res += src.rate100; if(src.level100 == 0 || src.musicTbl.isLunatic || src.musicTbl.isBonusTrack) { continue; } top = Math.Max(top, src.rate100); } res += top * 10; return res / 55; } public static int GetRecent() { FieldInfo piHot = typeof(UserRating).GetField("_hotList", BindingFlags.Instance | BindingFlags.NonPublic); var ur = Singleton.instance.userRating; int res = 0; foreach(Rating src in ((RatingList)piHot.GetValue(ur))) { res += src.rate100; } return res / 10; } public static bool IsEnabled() { return eRating >= patch_UserOption.eRating.Naive; } public static int Get() { return eRating switch { patch_UserOption.eRating.Naive => GetNaive(), patch_UserOption.eRating.Reachable => GetReachable(), patch_UserOption.eRating.Recent => GetRecent(), _ => 0, }; } public static byte GetSuffix() { return eRating switch { patch_UserOption.eRating.Naive => MU3CounterBase.FigurePlus, patch_UserOption.eRating.Reachable => MU3CounterBase.FigureMinus, patch_UserOption.eRating.Recent => MU3CounterBase.FigureComma, _ => 0, }; } // Adapted from MU3.User.UserRating.calcBest() private static RatingList calcNaive() { RatingList ratingList = []; var usMgr = Singleton.instance; var musicDict = usMgr.userMusic; foreach(KeyValuePair item in musicDict) { var musicData = SingletonStateMachine .instance.getMusicData(item.Key); if(musicData == null || item.Key == 1 || musicData.isBonusTrack) { continue; } for(int i = 0; i < 5; i++) { var fumenDifficulty = (FumenDifficulty)i; var userFumen = usMgr.getUserFumen(item.Key, fumenDifficulty, create: false); if(userFumen == null) { continue; } Rating rating = new(musicData.id, fumenDifficulty, userFumen.TechScoreMax); if(rating.level100 == 0) { continue; } ratingList.Add(rating); } } ratingList.Sort(); return ratingList; } }