122 lines
3.0 KiB
C#
122 lines
3.0 KiB
C#
|
using RoR2.Audio;
|
||
|
using UnityEngine;
|
||
|
using UnityEngine.UI;
|
||
|
|
||
|
namespace RoR2.UI;
|
||
|
|
||
|
public class InfiniteTowerTimeCounter : MonoBehaviour
|
||
|
{
|
||
|
[Tooltip("The root we're toggling")]
|
||
|
[SerializeField]
|
||
|
private GameObject rootObject;
|
||
|
|
||
|
[Tooltip("The timer we're setting")]
|
||
|
[SerializeField]
|
||
|
private TimerText timerText;
|
||
|
|
||
|
[SerializeField]
|
||
|
private Animator animator;
|
||
|
|
||
|
[SerializeField]
|
||
|
private Image barImage;
|
||
|
|
||
|
[Tooltip("The sound we loop while the timer is active")]
|
||
|
[SerializeField]
|
||
|
private LoopSoundDef timerLoop;
|
||
|
|
||
|
[Tooltip("The sound we play on each second above criticalSecondsThreshold")]
|
||
|
[SerializeField]
|
||
|
private string onSecondRegularSound;
|
||
|
|
||
|
[Tooltip("The sound we play on each second below criticalSecondsThreshold")]
|
||
|
[SerializeField]
|
||
|
private string onSecondCriticalSound;
|
||
|
|
||
|
[Tooltip("Below this number of seconds remaining, we are 'critical'")]
|
||
|
[SerializeField]
|
||
|
private float criticalSecondsThreshold;
|
||
|
|
||
|
private InfiniteTowerWaveController waveController;
|
||
|
|
||
|
private bool wasTimerActive;
|
||
|
|
||
|
private LoopSoundManager.SoundLoopPtr loopPtr;
|
||
|
|
||
|
private void OnEnable()
|
||
|
{
|
||
|
InfiniteTowerRun infiniteTowerRun = Run.instance as InfiniteTowerRun;
|
||
|
if ((bool)infiniteTowerRun)
|
||
|
{
|
||
|
waveController = infiniteTowerRun.waveController;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void OnDisable()
|
||
|
{
|
||
|
LoopSoundManager.StopSoundLoopLocal(loopPtr);
|
||
|
}
|
||
|
|
||
|
private void Update()
|
||
|
{
|
||
|
if ((bool)waveController)
|
||
|
{
|
||
|
bool flag = waveController.secondsRemaining <= 0f;
|
||
|
bool flag2 = waveController.isTimerActive;
|
||
|
InfiniteTowerRun infiniteTowerRun = Run.instance as InfiniteTowerRun;
|
||
|
if ((bool)infiniteTowerRun && infiniteTowerRun.IsStageTransitionWave())
|
||
|
{
|
||
|
flag2 = false;
|
||
|
}
|
||
|
if (flag && loopPtr.isValid)
|
||
|
{
|
||
|
LoopSoundManager.StopSoundLoopLocal(loopPtr);
|
||
|
}
|
||
|
rootObject.SetActive(flag2 && !flag);
|
||
|
if ((bool)animator && !wasTimerActive && flag2)
|
||
|
{
|
||
|
int layerIndex = animator.GetLayerIndex("Base");
|
||
|
animator.Play("Idle", layerIndex);
|
||
|
animator.Update(0f);
|
||
|
animator.Play("Finish", layerIndex);
|
||
|
}
|
||
|
wasTimerActive = flag2;
|
||
|
if (flag2)
|
||
|
{
|
||
|
if ((bool)timerText)
|
||
|
{
|
||
|
if ((bool)timerLoop && !loopPtr.isValid && waveController.secondsRemaining > 0f)
|
||
|
{
|
||
|
loopPtr = LoopSoundManager.PlaySoundLoopLocal(base.gameObject, timerLoop);
|
||
|
}
|
||
|
int num = Mathf.FloorToInt((float)timerText.seconds);
|
||
|
int num2 = Mathf.FloorToInt(waveController.secondsRemaining);
|
||
|
if (num != num2)
|
||
|
{
|
||
|
if (waveController.secondsRemaining < criticalSecondsThreshold)
|
||
|
{
|
||
|
Util.PlaySound(onSecondRegularSound, RoR2Application.instance.gameObject);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Util.PlaySound(onSecondCriticalSound, RoR2Application.instance.gameObject);
|
||
|
}
|
||
|
}
|
||
|
timerText.seconds = waveController.secondsRemaining;
|
||
|
}
|
||
|
if ((bool)barImage)
|
||
|
{
|
||
|
barImage.fillAmount = waveController.secondsRemaining / (float)waveController.secondsAfterWave;
|
||
|
}
|
||
|
}
|
||
|
else if (loopPtr.isValid)
|
||
|
{
|
||
|
LoopSoundManager.StopSoundLoopLocal(loopPtr);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
rootObject.SetActive(value: false);
|
||
|
}
|
||
|
}
|
||
|
}
|