TRORB/Assets/Scripts/Managers/GameManager.cs
2023-03-02 01:21:53 +01:00

102 lines
2.4 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using GometGames.Tools;
using MyBox;
using SimpleTools.AudioManager;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Serialization;
using Random = UnityEngine.Random;
[System.Serializable]
public enum OrbTypes {
None = 0,
Blue = 1,
Red = 2,
Purple = 3,
InvertedControls = 4,
HighGravity = 5,
LowGravity = 6,
DarkRoom = 7,
Freeze = 8
};
public class GameManager : MonoBehaviour {
[SerializeField] GenericDictionary<OrbTypes, UnityEvent> orbStartEffects;
[SerializeField] GenericDictionary<OrbTypes, UnityEvent> orbEndEffects;
[SerializeField] OrbTypes currentType = OrbTypes.None;
OrbTypes _lastType = OrbTypes.None;
public static GameManager instance;
[Header("Clock")]
[SerializeField] int time = 180;
public float CurrentTime { private set; get; }
[SerializeField] int doorTime = 30;
[SerializeField] RectTransform clockPivot;
bool _doorOpened, _dead;
[SerializeField] UnityEvent doorOpenEvent;
[SerializeField] UnityEvent timeEndEvent;
// Start is called before the first frame update
void Awake() {
instance = this;
}
void Start() {
AudioManager.instance.FadeIn("Viento", 1f);
}
void Update() {
if (_stopped) return;
CurrentTime += Time.deltaTime;
float ratio = CurrentTime / time;
clockPivot.rotation = Quaternion.Euler(0f, 0f, ratio * 360f - 180f);
if (CurrentTime >= time - doorTime) {
if (!_doorOpened) {
_doorOpened = true;
AudioManager.instance.Play("Puerta");
AudioManager.instance.FadeOut("Puerta", 1f);
doorOpenEvent.Invoke();
}
if (CurrentTime >= time && !_dead) {
_dead = true;
timeEndEvent.Invoke();
}
}
}
[SerializeField] CanvasGroup group;
[SerializeField] CanvasController controller;
bool _stopped;
public void DisableManager() {
group.DOFade(0, 1f);
controller.AbortCoroutine();
group.interactable = false;
_stopped = true;
}
public OrbTypes SelectRandomEffect() {
OrbTypes selected;
do {
selected = (OrbTypes)Random.Range(1, 9);
} while (selected == currentType || selected == _lastType);
ChangeEventCall(selected);
return selected;
}
void ChangeEventCall(OrbTypes type) {
if(currentType != OrbTypes.None) orbEndEffects[currentType].Invoke();
_lastType = currentType;
currentType = type;
if(type != OrbTypes.None) orbStartEffects[currentType].Invoke();
}
}