using Components; using Core; using DG.Tweening; using PermanentSystems; using Systems; using TMPro; using UnityEngine; using UnityEngine.UI; using Application = Core.Application; namespace Panels { public class HUDPanel : PanelBase { [SerializeField] private Button pauseBtn; [SerializeField] private float fillSpeed = .8f; [SerializeField] private Slider powerSlider; [SerializeField] private Image lightFillHandle; [SerializeField] private TextMeshProUGUI distanceText; [SerializeField] private ScoreLabel orbCounter; [SerializeField] private ScoreMegaLabel megaLabel; [SerializeField] private RectTransform[] heartContainers; [SerializeField] private Image[] lifeBars; [SerializeField] private string[] sentences; [SerializeField] private RectTransform powerFillHolder; public Vector2 PowerIconPosition => powerFillHolder.position; // public Vector2 CurrentHeartPosition => heartContainers[_currentHealthLevel + 1].position; private int _currentHealthLevel = 2; private Tween _fillTween; private Tween _rotationTween; private GameManager _manager; private GameManager GameManager { get { if (_manager == null) _manager = Application.GetSystem(); return _manager; } } private PauseScreenPanel _pausePanel; private PauseScreenPanel PausePanel { get { if (_pausePanel == null) _pausePanel = Application.GetPanel(); return _pausePanel; } } protected override void ReleaseReferences() { base.ReleaseReferences(); pauseBtn = null; _manager = null; _pausePanel = null; } public override void Initialize() { // _originalColor = healthBar.color; // _colorFadeSpeed = animationSpeed / 2.5f; pauseBtn.onClick.AddListener(PauseGame); } private void PauseGame() { GameManager.PauseGame(); AudioSystem.PlaySoundEffect(AudioList.ButtonClickB); PausePanel.OpenPanel(); } public void LoseHealth() { if (_currentHealthLevel < 0) return; lifeBars[_currentHealthLevel].DOFillAmount(0f, .5f); heartContainers[_currentHealthLevel].DOShakeScale(.5f, .6f); _currentHealthLevel--; } public void GainHealth() { if (_currentHealthLevel >= 2) return; _currentHealthLevel++; lifeBars[_currentHealthLevel].DOFillAmount(1f, .5f); // heartContainers[_currentHealthLevel].DOShakeScale(.5f); } public void UpdateDistance(int inDistance) { distanceText.text = inDistance.ToString(); // distanceText.text = inDistance switch // { // < 10 => $"0000{inDistance}", // < 100 => $"000{inDistance}", // < 1000 => $"00{inDistance}", // < 10000 => $"0{inDistance}", // _ => inDistance.ToString() // }; } public void UpdateRedOrbProgress(float inProgress) { _fillTween?.Complete(); _fillTween = powerSlider.DOValue(inProgress, fillSpeed); } public void DepleteRedOrbs(float inDuration) { _fillTween?.Complete(); _fillTween = powerSlider.DOValue(0f, inDuration) .OnStart(AnimateHandle) .OnComplete(StopHandle); return; void AnimateHandle() { lightFillHandle.DOFade(.75f, .45f); _rotationTween = lightFillHandle.rectTransform.DOLocalRotate(Vector3.forward * 360, 3f, RotateMode.FastBeyond360) .SetEase(Ease.Linear) .SetLoops(-1) .SetRelative(); } void StopHandle() { lightFillHandle.DOFade(0f, .2f) .OnComplete(() => { _rotationTween?.Kill(); }); } } public void UpdateBlueOrbCount(int inCount) { if (inCount % 15 == 0) { orbCounter.HideCounter(); var rndSentence = Random.Range(0, sentences.Length); megaLabel.ShowLabel(sentences[rndSentence], orbCounter.UnHideCounter); return; } orbCounter.ShowCounter(inCount); } } }