HeavenStudioPlus/Assets/Scripts/UI/Overlays/GoForAPerfect.cs
minenice55 afc665ed61 Integration of Jukebox Library (#451) (#457)
* add Jukebox library

todo:
- saving / loading of new format
- inferrence of unknown data like past versions
- move the temporary float casts to proper use of double
- make sound related functions take double for timing
- inform people that the Jukebox sound player was renamed to SoundByte lol

* make sound, input scheduling, and super curve use double precision

* successfully load charts

* editor works again

v1 riqs can be saved and loaded

* first tempo and volume markers are unmovable

fix loading of charts' easing values

* use gsync / freesync

* update Jukebox refs to SoundByte

* game events use double part 1

Air Rally - Glee Club converted

* don't load song if chart load fails

* finish conversion of all minigames

* remove editor waveform toggle

* timeline now respects added song offset length

clear cache files on app close
prepped notes for dsp sync

* update timeline length when offset changed

* update to latest Jukebox

* make error panel object in global game manager

* improve conductor music scheduling

* added error message box

fix first game events sometimes not playing
2023-06-10 19:17:06 +00:00

124 lines
No EOL
3.1 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using HeavenStudio.Util;
namespace HeavenStudio.Common
{
public class GoForAPerfect : MonoBehaviour
{
public static GoForAPerfect instance { get; set; }
[SerializeField] Animator texAnim;
[SerializeField] Animator pAnim;
private bool active = false;
private bool hiddenActive = false;
public bool perfect;
Conductor cond;
double lastReportedBeat = 0f;
double currentBeat = 0f;
long currentBlink = 0;
private void Awake()
{
instance = this;
}
private void Start()
{
perfect = true;
cond = Conductor.instance;
}
private void Update() {
gameObject.SetActive(hiddenActive);
if (!active) return;
if (!OverlaysManager.OverlaysEnabled) return;
if (cond == null || !cond.isPlaying) return;
if (cond.ReportBeat(ref lastReportedBeat))
{
currentBeat = lastReportedBeat;
if (currentBlink != 0)
{
currentBlink++;
if (currentBlink % 2 == 0)
{
texAnim.Play("GoForAPerfect_Blink", -1, 0);
}
else
{
texAnim.Play("GoForAPerfect_Blink2", -1, 0);
}
}
else
{
currentBlink++;
}
}
else if (cond.songPositionInBeats < lastReportedBeat)
{
lastReportedBeat = Mathf.Round(cond.songPositionInBeats);
}
}
public void Hit()
{
if (!active) return;
if (!OverlaysManager.OverlaysEnabled) return;
pAnim.Play("PerfectIcon_Hit", 0, 0);
}
public void Miss()
{
perfect = false;
if (!active) return;
SetInactive();
if (!OverlaysManager.OverlaysEnabled)
{
hiddenActive = false;
return;
}
texAnim.Play("GoForAPerfect_Miss");
pAnim.Play("PerfectIcon_Miss", -1, 0);
SoundByte.PlayOneShot("perfectMiss");
if (GameProfiler.instance != null)
GameProfiler.instance.perfect = false;
}
public void Enable(double startBeat)
{
SetActive();
gameObject.SetActive(true);
pAnim.gameObject.SetActive(true);
texAnim.gameObject.SetActive(true);
texAnim.Play("GoForAPerfect_Idle");
currentBlink = 0;
}
public void Disable()
{
SetInactive();
gameObject.SetActive(false);
}
public void SetActive()
{
hiddenActive = true;
active = true;
}
public void SetInactive()
{
active = false;
}
}
}