Files
ichni_Official/Assets/Scripts/Manager/NoteJudgeManager.cs

343 lines
12 KiB
C#
Raw Normal View History

2025-06-03 02:42:28 -04:00
using System.Collections;
using System.Collections.Generic;
2025-07-21 05:42:20 -04:00
using System.Linq;
2025-06-03 02:42:28 -04:00
using Ichni.RhythmGame;
using Sirenix.OdinInspector;
using UnityEngine;
namespace Ichni
{
2025-08-11 14:04:06 -04:00
public partial class NoteJudgeManager : SerializedMonoBehaviour
2025-06-03 02:42:28 -04:00
{
public List<Tap> checkingTapList;
public List<Stay> checkingStayList;
public List<Hold> checkingHoldList;
public List<Flick> checkingFlickList;
public List<InputUnitTap> inputUnitTapList;
2025-07-21 05:42:20 -04:00
public List<InputUnitTouch> inputUnitTouchList;
public List<InputUnitSwipe> inputUnitSwipeList;
2025-06-03 02:42:28 -04:00
private void Start()
{
2025-07-21 05:42:20 -04:00
checkingTapList = new List<Tap>();
checkingStayList = new List<Stay>();
checkingHoldList = new List<Hold>();
checkingFlickList = new List<Flick>();
inputUnitTapList = new List<InputUnitTap>();
inputUnitTouchList = new List<InputUnitTouch>();
inputUnitSwipeList = new List<InputUnitSwipe>();
2025-06-03 02:42:28 -04:00
}
public void Update()
{
2025-07-08 14:28:40 -04:00
if (!GameManager.instance.audioManager.isPlaying)
2025-06-03 02:42:28 -04:00
{
return;
}
2025-09-06 21:58:48 -04:00
List<InputUnitSwipe> tapSwipeList = inputUnitSwipeList.Where(x => x.isFirst).ToList();
List<InputUnitSwipe> holdSwipeList = inputUnitSwipeList.Where(x => !x.isFirst).ToList();
2026-01-21 00:31:23 -05:00
foreach (InputUnitSwipe tapSwipe in tapSwipeList)
{
List<Flick> availableFlicks = new List<Flick>();
foreach (Flick flick in checkingFlickList)
{
if (flick.CheckJudgeAvailability(tapSwipe))
{
availableFlicks.Add(flick);
}
}
List<Flick> minFlicks = GetAllMinNotes(availableFlicks);
if (minFlicks.Count == 1)
{
minFlicks[0].ExecuteStartJudge();
}
else if (minFlicks.Count > 1)
{
GetNearestNote(minFlicks, tapSwipe.inputPosition).ExecuteTapJudge();
}
}
foreach (InputUnitSwipe inputUnitSwipe in holdSwipeList)
{
List<Flick> availableFlicks = new List<Flick>();
foreach (Flick flick in checkingFlickList)
{
if (flick.CheckJudgeAvailability(inputUnitSwipe))
{
availableFlicks.Add(flick);
}
}
if (availableFlicks.Count > 0)
{
availableFlicks.Sort();
Flick closestFlick = availableFlicks[0];
closestFlick.ExecuteStartJudge();
}
}
2025-07-21 05:42:20 -04:00
foreach (InputUnitTap inputUnitTap in inputUnitTapList)
2025-06-03 02:42:28 -04:00
{
List<Tap> availableTaps = new List<Tap>();
foreach (Tap tap in checkingTapList)
{
if (tap.CheckJudgeAvailability(inputUnitTap))
{
availableTaps.Add(tap);
}
}
2026-01-21 00:31:23 -05:00
2025-07-21 05:42:20 -04:00
List<Hold> availableHolds = new List<Hold>();
foreach (Hold hold in checkingHoldList)
{
if (hold.CheckJudgeAvailability(inputUnitTap))
{
availableHolds.Add(hold);
}
}
2026-01-21 00:31:23 -05:00
2025-07-21 05:42:20 -04:00
bool haveTap = availableTaps.Count > 0;
2025-08-11 14:04:06 -04:00
bool haveHold = availableHolds.Count > 0;
2026-01-21 00:31:23 -05:00
Flick closestFlick = null;
InputUnitSwipe assumedSwipe = new InputUnitSwipe(inputUnitTap.fingerId, inputUnitTap.inputPosition, true, true, Vector2.zero);
foreach (Flick flick in checkingFlickList)
{
if (flick.CheckJudgeAvailability(assumedSwipe))
{
if (closestFlick == null || flick.exactJudgeTime < closestFlick.exactJudgeTime)
{
closestFlick = flick;
}
}
}
2025-07-21 05:42:20 -04:00
if (haveHold && haveTap)
{
2025-09-06 21:58:48 -04:00
List<Hold> minHolds = GetAllMinNotes(availableHolds);
List<Tap> minTaps = GetAllMinNotes(availableTaps);
2025-08-11 14:04:06 -04:00
Hold closestHold = minHolds[0];
Tap closestTap = minTaps[0];
2026-01-21 00:31:23 -05:00
bool holdBlockedByFlick = false;
bool tapBlockedByFlick = false;
if (closestFlick != null)
{
if (closestFlick.exactJudgeTime < closestHold.exactJudgeTime)
{
holdBlockedByFlick = true;
}
if (closestFlick.exactJudgeTime < closestTap.exactJudgeTime)
{
tapBlockedByFlick = true;
}
}
if (!holdBlockedByFlick && closestHold.exactJudgeTime < closestTap.exactJudgeTime)
2025-07-21 05:42:20 -04:00
{
2025-08-11 14:04:06 -04:00
if (minHolds.Count == 1)
{
minHolds[0].ExecuteStartJudge();
}
else
{
2025-09-06 21:58:48 -04:00
GetNearestNote(minHolds, inputUnitTap.inputPosition).ExecuteStartJudge();
2025-08-11 14:04:06 -04:00
}
2025-07-21 05:42:20 -04:00
}
2026-01-21 00:31:23 -05:00
else if (!tapBlockedByFlick)
2025-07-21 05:42:20 -04:00
{
2025-08-11 14:04:06 -04:00
if (minTaps.Count == 1)
{
minTaps[0].ExecuteStartJudge();
}
else
{
2025-09-06 21:58:48 -04:00
GetNearestNote(minTaps, inputUnitTap.inputPosition).ExecuteStartJudge();
2025-08-11 14:04:06 -04:00
}
2025-07-21 05:42:20 -04:00
}
}
else if (haveHold)
{
2025-09-06 21:58:48 -04:00
List<Hold> minHolds = GetAllMinNotes(availableHolds);
2026-01-21 00:31:23 -05:00
bool holdBlockedByFlick = closestFlick != null && closestFlick.exactJudgeTime < minHolds[0].exactJudgeTime;
if (!holdBlockedByFlick)
2025-08-11 14:04:06 -04:00
{
2026-01-21 00:31:23 -05:00
if (minHolds.Count == 1)
{
minHolds[0].ExecuteStartJudge();
}
else
{
GetNearestNote(minHolds, inputUnitTap.inputPosition).ExecuteStartJudge();
}
2025-08-11 14:04:06 -04:00
}
2025-07-21 05:42:20 -04:00
}
else if (haveTap)
2025-06-03 02:42:28 -04:00
{
2025-09-06 21:58:48 -04:00
List<Tap> minTaps = GetAllMinNotes(availableTaps);
2026-01-21 00:31:23 -05:00
bool tapBlockedByFlick = closestFlick != null && closestFlick.exactJudgeTime < minTaps[0].exactJudgeTime;
if (!tapBlockedByFlick)
2025-08-11 14:04:06 -04:00
{
2026-01-21 00:31:23 -05:00
if (minTaps.Count == 1)
{
minTaps[0].ExecuteStartJudge();
}
else
{
GetNearestNote(minTaps, inputUnitTap.inputPosition).ExecuteStartJudge();
}
2025-06-03 02:42:28 -04:00
}
}
2025-07-21 05:42:20 -04:00
}
foreach (InputUnitTouch inputUnitTouch in inputUnitTouchList)
{
2025-06-03 02:42:28 -04:00
List<Stay> availableStays = new List<Stay>();
foreach (Stay stay in checkingStayList)
{
2025-07-21 05:42:20 -04:00
if (stay.CheckJudgeAvailability(inputUnitTouch))
2025-06-03 02:42:28 -04:00
{
availableStays.Add(stay);
}
}
2025-07-21 05:42:20 -04:00
List<Hold> availableHolds = new List<Hold>();
foreach (Hold hold in checkingHoldList)
{
if (hold.CheckJudgeAvailability(inputUnitTouch))
{
availableHolds.Add(hold);
}
}
2025-06-03 02:42:28 -04:00
foreach (Stay stay in availableStays)
{
stay.ExecuteStartJudge();
}
2025-07-21 05:42:20 -04:00
foreach (Hold hold in availableHolds)
{
hold.ExecuteProcessJudge();
}
2025-06-03 02:42:28 -04:00
}
2025-07-21 05:42:20 -04:00
inputUnitTapList.Clear();
inputUnitTouchList.Clear();
inputUnitSwipeList.Clear();
2025-06-03 02:42:28 -04:00
}
2025-07-21 05:42:20 -04:00
public void SetNewInputUnitTap(int fingerId, Vector2 inputPosition)
2025-06-03 02:42:28 -04:00
{
2025-07-21 05:42:20 -04:00
InputUnitTap inputUnitTap = new InputUnitTap(fingerId, inputPosition);
if(!inputUnitTapList.Exists(x => x.fingerId == fingerId))
2025-06-03 02:42:28 -04:00
{
2025-07-21 05:42:20 -04:00
inputUnitTapList.Add(inputUnitTap);
2025-06-03 02:42:28 -04:00
}
}
2025-07-21 05:42:20 -04:00
public void SetNewInputUnitTouch(int fingerId, Vector2 inputPosition)
2025-06-03 02:42:28 -04:00
{
2025-07-21 05:42:20 -04:00
InputUnitTouch inputUnitTouch = new InputUnitTouch(fingerId, inputPosition);
if(!inputUnitTouchList.Exists(x => x.fingerId == fingerId))
{
inputUnitTouchList.Add(inputUnitTouch);
}
2025-06-03 02:42:28 -04:00
}
2025-09-05 10:14:45 -04:00
public void SetNewInputUnitSwipe(int fingerId, Vector2 inputPosition, bool isGeneric, bool isFirst, Vector2 delta)
2025-06-03 02:42:28 -04:00
{
2025-09-05 10:14:45 -04:00
InputUnitSwipe inputUnitSwipe = new InputUnitSwipe(fingerId, inputPosition, isGeneric, isFirst, delta);
2025-07-21 05:42:20 -04:00
if(!inputUnitSwipeList.Exists(x => x.fingerId == fingerId))
{
inputUnitSwipeList.Add(inputUnitSwipe);
}
2025-08-11 14:04:06 -04:00
}
}
public partial class NoteJudgeManager
{
2025-09-06 21:58:48 -04:00
private List<T> GetAllMinNotes<T>(List<T> availableFlicks) where T : NoteBase
2025-08-11 14:04:06 -04:00
{
2025-09-06 21:58:48 -04:00
List<T> minFlicks = new List<T>();
2025-08-11 14:04:06 -04:00
float minTime = float.MaxValue;
2025-09-06 21:58:48 -04:00
foreach (T flick in availableFlicks)
2025-08-11 14:04:06 -04:00
{
2025-09-06 21:58:48 -04:00
if (flick.exactJudgeTime < minTime)
2025-08-11 14:04:06 -04:00
{
2025-09-06 21:58:48 -04:00
minTime = flick.exactJudgeTime;
minFlicks.Clear();
minFlicks.Add(flick);
2025-08-11 14:04:06 -04:00
}
2025-09-06 21:58:48 -04:00
else if (Mathf.Approximately(flick.exactJudgeTime, minTime))
2025-08-11 14:04:06 -04:00
{
2025-09-06 21:58:48 -04:00
minFlicks.Add(flick);
2025-08-11 14:04:06 -04:00
}
}
2025-09-06 21:58:48 -04:00
return minFlicks;
2025-08-11 14:04:06 -04:00
}
2025-09-06 21:58:48 -04:00
private T GetNearestNote<T>(List<T> notes, Vector2 inputPosition) where T : NoteBase
2025-08-11 14:04:06 -04:00
{
float minDistance = float.MaxValue;
2025-09-06 21:58:48 -04:00
T closestNote = null;
foreach (T note in notes)
2025-08-11 14:04:06 -04:00
{
float distance = Vector2.Distance(inputPosition, note.noteScreenPosition);
if (distance < minDistance)
{
minDistance = distance;
closestNote = note;
}
}
return closestNote;
2025-06-03 02:42:28 -04:00
}
}
public class InputUnit
{
public int fingerId;
public Vector2 inputPosition;
}
public class InputUnitTap : InputUnit
{
public InputUnitTap(int fingerId, Vector2 inputPosition)
{
this.fingerId = fingerId;
this.inputPosition = inputPosition;
}
}
2025-07-21 05:42:20 -04:00
public class InputUnitTouch : InputUnit
2025-06-03 02:42:28 -04:00
{
2025-07-21 05:42:20 -04:00
public InputUnitTouch(int fingerId, Vector2 inputPosition)
2025-06-03 02:42:28 -04:00
{
this.fingerId = fingerId;
this.inputPosition = inputPosition;
}
}
2025-07-21 05:42:20 -04:00
public class InputUnitSwipe : InputUnit
2025-06-03 02:42:28 -04:00
{
2025-07-21 05:42:20 -04:00
public Vector2 swipeDirection;
2025-07-26 04:20:25 -04:00
public bool isGeneric;
2025-09-05 10:14:45 -04:00
public bool isFirst;
public InputUnitSwipe(int fingerId, Vector2 inputPosition, bool isGeneric, bool isFirst, Vector2 swipeDirection)
2025-06-03 02:42:28 -04:00
{
this.fingerId = fingerId;
this.inputPosition = inputPosition;
2025-07-26 04:20:25 -04:00
this.isGeneric = isGeneric;
2025-09-05 10:14:45 -04:00
this.isFirst = isFirst;
2025-07-21 05:42:20 -04:00
this.swipeDirection = swipeDirection.normalized;
2025-06-03 02:42:28 -04:00
}
}
}