AquaDX/AquaMai/Utils/SelectionDetail.cs

140 lines
4.8 KiB
C#
Raw Normal View History

using System.Collections.Generic;
using System.Linq;
using AquaMai.Attributes;
2024-09-06 16:41:29 +08:00
using AquaMai.Helpers;
2024-10-01 01:10:16 +08:00
using AquaMai.Resources;
2024-09-06 16:41:29 +08:00
using HarmonyLib;
using MAI2.Util;
using Manager;
using Manager.MaiStudio;
using Manager.UserDatas;
using Monitor;
using Process;
using UnityEngine;
namespace AquaMai.Utils;
2024-09-06 16:41:29 +08:00
[GameVersion(23500)]
2024-09-06 16:41:29 +08:00
public class SelectionDetail
{
2024-09-06 17:34:43 +08:00
private static readonly Window[] window = new Window[2];
private static MusicSelectProcess.MusicSelectData SelectData { get; set; }
private static readonly int[] difficulty = new int[2];
2024-09-06 16:41:29 +08:00
[HarmonyPostfix]
[HarmonyPatch(typeof(MusicSelectMonitor), "UpdateRivalScore")]
public static void ScrollUpdate(MusicSelectProcess ____musicSelect, MusicSelectMonitor __instance)
{
2024-09-06 17:34:43 +08:00
int player;
if (__instance == ____musicSelect.MonitorArray[0])
2024-09-06 16:41:29 +08:00
{
2024-09-06 17:34:43 +08:00
player = 0;
}
else if (__instance == ____musicSelect.MonitorArray[1])
{
player = 1;
}
else
{
return;
2024-09-06 16:41:29 +08:00
}
2024-09-06 17:34:43 +08:00
if (window[player] != null)
{
window[player].Close();
}
var userData = Singleton<UserDataManager>.Instance.GetUserData(player);
if (!userData.IsEntry) return;
2024-09-06 16:41:29 +08:00
if (____musicSelect.IsRandomIndex()) return;
SelectData = ____musicSelect.GetMusic(0);
if (SelectData == null) return;
2024-09-06 17:34:43 +08:00
difficulty[player] = ____musicSelect.GetDifficulty(player);
2024-09-06 16:41:29 +08:00
2024-09-06 17:34:43 +08:00
window[player] = player == 0 ? __instance.gameObject.AddComponent<P1Window>() : __instance.gameObject.AddComponent<P2Window>();
2024-09-06 16:41:29 +08:00
}
2024-09-06 17:34:43 +08:00
private class P1Window : Window
{
protected override int player => 0;
}
private class P2Window : Window
{
protected override int player => 1;
}
private abstract class Window : MonoBehaviour
2024-09-06 16:41:29 +08:00
{
2024-09-06 17:34:43 +08:00
protected abstract int player { get; }
2024-11-16 00:53:22 +08:00
private UserData userData => Singleton<UserDataManager>.Instance.GetUserData(player);
2024-09-06 16:41:29 +08:00
public void OnGUI()
2024-09-06 16:41:29 +08:00
{
var dataToShow = new List<string>();
dataToShow.Add($"ID: {SelectData.MusicData.name.id}");
dataToShow.Add(MusicDirHelper.LookupPath(SelectData.MusicData.name.id).Split('/').Reverse().ToArray()[3]);
if (SelectData.MusicData.genreName is not null) // SelectData.MusicData.genreName.str may not correct
dataToShow.Add(Singleton<DataManager>.Instance.GetMusicGenre(SelectData.MusicData.genreName.id)?.genreName);
if (SelectData.MusicData.AddVersion is not null)
dataToShow.Add(Singleton<DataManager>.Instance.GetMusicVersion(SelectData.MusicData.AddVersion.id)?.genreName);
2024-09-06 17:34:43 +08:00
var notesData = SelectData.MusicData.notesData[difficulty[player]];
dataToShow.Add($"{notesData?.level}.{notesData?.levelDecimal}");
2024-09-06 16:41:29 +08:00
2024-09-06 17:34:43 +08:00
var rate = CalcB50(SelectData.MusicData, difficulty[player]);
2024-09-06 16:41:29 +08:00
if (rate > 0)
{
2024-10-01 01:10:16 +08:00
dataToShow.Add(string.Format(Locale.RatingUpWhenSSSp, rate));
}
2024-11-16 00:53:22 +08:00
var playCount = Shim.GetUserScoreList(userData)[difficulty[player]].FirstOrDefault(it => it.id == SelectData.MusicData.name.id)?.playcount ?? 0;
if (playCount > 0)
{
dataToShow.Add(string.Format(Locale.PlayCount, playCount));
}
2024-10-01 01:10:16 +08:00
var width = GuiSizes.FontSize * 15f;
var x = GuiSizes.PlayerCenter - width / 2f + GuiSizes.PlayerWidth * player;
var y = Screen.height * 0.87f;
var labelStyle = GUI.skin.GetStyle("label");
labelStyle.fontSize = GuiSizes.FontSize;
labelStyle.alignment = TextAnchor.MiddleCenter;
2024-10-01 01:10:16 +08:00
GUI.Box(new Rect(x, y, width, dataToShow.Count * GuiSizes.LabelHeight + 2 * GuiSizes.Margin), "");
for (var i = 0; i < dataToShow.Count; i++)
{
2024-10-01 01:10:16 +08:00
GUI.Label(new Rect(x, y + GuiSizes.Margin + i * GuiSizes.LabelHeight, width, GuiSizes.LabelHeight), dataToShow[i]);
2024-09-06 16:41:29 +08:00
}
}
2024-09-06 17:34:43 +08:00
private uint CalcB50(MusicData musicData, int difficulty)
2024-09-06 16:41:29 +08:00
{
2024-11-16 01:47:07 +08:00
var theory = new UserRate(musicData.name.id, difficulty, 1010000, (uint)musicData.version);
var list = theory.OldFlag ? userData.RatingList.RatingList : userData.RatingList.NewRatingList;
var userLowRate = list.Last();
var userSongRate = list.FirstOrDefault(it => it.MusicId == musicData.name.id && it.Level == difficulty);
2024-09-06 16:41:29 +08:00
2024-11-16 01:47:07 +08:00
if (!userSongRate.Equals(default(UserRate)))
2024-09-06 16:41:29 +08:00
{
2024-11-16 01:47:07 +08:00
return theory.SingleRate - userSongRate.SingleRate;
}
if (theory.SingleRate > userLowRate.SingleRate)
{
return theory.SingleRate - userLowRate.SingleRate;
2024-09-06 16:41:29 +08:00
}
return 0;
}
public void Close()
{
Destroy(this);
}
}
}