From e5e177f226c863f0ff21864dd6e2efaa6395d436 Mon Sep 17 00:00:00 2001 From: akanyan Date: Sat, 28 Dec 2024 01:17:27 +0000 Subject: [PATCH] feat(MPO): implement TYPE-D --- .../MU3.Mod/CustomRating.cs | 146 ++++++++++-------- .../MU3.User/patch_UserOption.cs | 3 +- .../MU3/patch_OptionMiniSummaryController.cs | 3 + .../MU3/patch_OptionSelecterController.cs | 6 +- .../MU3/patch_UIResultBattlePoint.cs | 13 +- 5 files changed, 100 insertions(+), 71 deletions(-) diff --git a/Extras/MoreProfileOptions/MU3.Mod/CustomRating.cs b/Extras/MoreProfileOptions/MU3.Mod/CustomRating.cs index b2dff71..d483f12 100644 --- a/Extras/MoreProfileOptions/MU3.Mod/CustomRating.cs +++ b/Extras/MoreProfileOptions/MU3.Mod/CustomRating.cs @@ -10,6 +10,89 @@ 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() { + switch(eRating) { + case patch_UserOption.eRating.Naive: + return GetNaive(); + case patch_UserOption.eRating.Reachable: + return GetReachable(); + case patch_UserOption.eRating.Recent: + return GetRecent(); + default: + return 0; + } + } + + public static byte GetSuffix() { + switch(eRating) { + case patch_UserOption.eRating.Naive: + return MU3CounterBase.FigurePlus; + case patch_UserOption.eRating.Reachable: + return MU3CounterBase.FigureMinus; + case patch_UserOption.eRating.Recent: + return MU3CounterBase.FigureComma; + default: + return 0; + } + } + // Adapted from MU3.User.UserRating.calcBest() private static RatingList calcNaive() { RatingList ratingList = []; @@ -41,67 +124,4 @@ public static class CustomRating { ratingList.Sort(); return ratingList; } - 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 best in ((RatingList)piOld.GetValue(ur))) { - res += best.rate100; - if(best.musicID < 7000) { - top = Math.Max(top, best.rate100); - } - } - foreach(Rating best in ((RatingList)piNew.GetValue(ur))) { - res += best.rate100; - if(best.musicID < 7000) { - top = Math.Max(top, best.rate100); - } - } - - res += top * 10; - - return res / 55; - } - - private static bool isNaiveEnabled() { - return Singleton.instance.userOption.customSet.Rating == (UserOption.eRating)patch_UserOption.eRating.Naive; - } - private static bool isReachableEnabled() { - return Singleton.instance.userOption.customSet.Rating == (UserOption.eRating)patch_UserOption.eRating.Reachable; - } - public static bool IsEnabled() { - return isNaiveEnabled() || isReachableEnabled(); - } - - public static int Get() { - if(isNaiveEnabled()) { - return GetNaive(); - } else if(isReachableEnabled()) { - return GetReachable(); - } else { - return 0; - } - } - - public static byte GetSuffix() { - if(isNaiveEnabled()) { - return MU3CounterBase.FigurePlus; - } else if(isReachableEnabled()) { - return MU3CounterBase.FigureMinus; - } else { - return 0; - } - } } \ No newline at end of file diff --git a/Extras/MoreProfileOptions/MU3.User/patch_UserOption.cs b/Extras/MoreProfileOptions/MU3.User/patch_UserOption.cs index a0c8539..bbeaf95 100644 --- a/Extras/MoreProfileOptions/MU3.User/patch_UserOption.cs +++ b/Extras/MoreProfileOptions/MU3.User/patch_UserOption.cs @@ -10,7 +10,8 @@ class patch_UserOption: UserOption { ON = 1, Naive = 2, Reachable = 3, - MAX = 3 + Recent = 4, + MAX = 4 } [MonoModEnumReplace] diff --git a/Extras/MoreProfileOptions/MU3/patch_OptionMiniSummaryController.cs b/Extras/MoreProfileOptions/MU3/patch_OptionMiniSummaryController.cs index b554243..ffa8098 100644 --- a/Extras/MoreProfileOptions/MU3/patch_OptionMiniSummaryController.cs +++ b/Extras/MoreProfileOptions/MU3/patch_OptionMiniSummaryController.cs @@ -23,6 +23,9 @@ class patch_OptionMiniSummaryController: OptionMiniSummaryController { case 3: comp.text = "TYPE-C"; break; + case 4: + comp.text = "TYPE-D"; + break; } } else if(id == UserOption.OptionName.Abort) { switch(value) { diff --git a/Extras/MoreProfileOptions/MU3/patch_OptionSelecterController.cs b/Extras/MoreProfileOptions/MU3/patch_OptionSelecterController.cs index ddbbe19..8858578 100644 --- a/Extras/MoreProfileOptions/MU3/patch_OptionSelecterController.cs +++ b/Extras/MoreProfileOptions/MU3/patch_OptionSelecterController.cs @@ -16,7 +16,7 @@ class patch_OptionSelecterController: OptionSelecterController { private extern void orig_setupCpFuncArray(); private void setupCpFuncArray() { orig_setupCpFuncArray(); - cpFuncArray[33].max = 3; + cpFuncArray[33].max = 4; cpFuncArray[4].max = 7; } @@ -34,13 +34,13 @@ class patch_OptionSelecterController: OptionSelecterController { rct.sizeDelta = new Vector2(158, 70); var tex = ((Sprite[])spritesFi.GetValue(changer))[0].texture; - spritesFi.SetValue(changer, new Sprite[4]); + spritesFi.SetValue(changer, new Sprite[5]); changer.setSprite(0, Sprite.Create(tex, new Rect(1552, 366, 160, 65), new Vector2(80, 0))); changer.setSprite(1, Sprite.Create(tex, new Rect(1221, 1488, 160, 70), new Vector2(80, 35))); changer.setSprite(2, Sprite.Create(tex, new Rect(1223, 1410, 160, 70), new Vector2(80, 35))); changer.setSprite(3, Sprite.Create(tex, new Rect(1508, 1346, 160, 70), new Vector2(80, 35))); - //changer.setSprite(4, Sprite.Create(tex, new Rect(1389, 1424, 160, 70), new Vector2(8, 35))); + changer.setSprite(4, Sprite.Create(tex, new Rect(1389, 1424, 160, 70), new Vector2(8, 35))); //changer.setSprite(5, Sprite.Create(tex, new Rect(941, 1502, 160, 70), new Vector2(8, 35))); //changer.setSprite(6, Sprite.Create(tex, new Rect(797, 1604, 160, 70), new Vector2(8, 35))); diff --git a/Extras/MoreProfileOptions/MU3/patch_UIResultBattlePoint.cs b/Extras/MoreProfileOptions/MU3/patch_UIResultBattlePoint.cs index a0efbe6..45d5211 100644 --- a/Extras/MoreProfileOptions/MU3/patch_UIResultBattlePoint.cs +++ b/Extras/MoreProfileOptions/MU3/patch_UIResultBattlePoint.cs @@ -28,9 +28,8 @@ class patch_UIResultBattlePoint: UIResultBattlePoint { int prevRating = ((patch_SessionResult)playInfo.sessionResult).prevCustomRating; int rating1 = CustomRating.Get(); - if((bool)hideScore_) { - hideScore_.SetActive(false); - } + hideScore_?.SetActive(false); + counterScore_.isDispSuffix = true; counterScore_.Counter = (double)UserUtil.toRatingFloat(rating1); int ratingPatternNo = UserUtil.toRatingPatternNo(rating1); counterScore_.SpriteIndex = ratingPatternNo; @@ -42,10 +41,16 @@ class patch_UIResultBattlePoint: UIResultBattlePoint { animator_.SetInteger(Sys.Const.AnimatorID_State, 2); } else if(0 < rating2) { disable(counterScoreMinus_); - if((bool)counterScorePlus_) { + if(counterScorePlus_ != null) { counterScorePlus_.Counter = rating2 * 0.01f + 1E-05f; } animator_.SetInteger(Sys.Const.AnimatorID_State, 0); + } else { + disable(counterScorePlus_); + if(counterScoreMinus_ != null) { + counterScoreMinus_.Counter = rating2 * 0.01f + 1E-05f; + } + animator_.SetInteger(MU3.Sys.Const.AnimatorID_State, 1); } animator_.SetTrigger(Sys.Const.AnimatorID_In); }