using System; using System.Collections; using System.Collections.Generic; using System.Data.SqlTypes; using System.Threading.Tasks; using TMPro; using UnityEditor; using UnityEngine; public enum GameState { Idle, ShowingSequance, PlayerTurn, GameOver, MinigameWon } public class ButtonsMinigame : MonoBehaviour, ITask { public Light[] lights; public int round = 1; public float glowDuration = 0.4f; public float gapBetween = 0.15f; public float delayBeforeSequence = 0.8f; public int winRound = 5; public TMP_Text statusText; public GameObject startButton; private int playerStep = 0; private GameState state = GameState.Idle; private List sequence = new List(); public string TaskID { get; set; } public TaskType TaskType { get; set; } public string TaskName { get; set; } public (double, double) TaskLocation { get; set; } public bool IsCompleted { get; private set; } private System.Action _onComplete; private Action _onExit; void GenerateSequence() { sequence.Clear(); for (int i = 0; i < round; i++) { int randomButton = UnityEngine.Random.Range(0,5); sequence.Add(randomButton); } } IEnumerator PlaySequence() { SetState(GameState.ShowingSequance); yield return new WaitForSeconds(delayBeforeSequence); for (int i = 0; i < sequence.Count; i++) { int buttonIndex = sequence[i]; lights[buttonIndex].gameObject.SetActive(true); yield return new WaitForSeconds (glowDuration); lights[buttonIndex].gameObject.SetActive(false); yield return new WaitForSeconds (gapBetween); } playerStep = 0; SetState(GameState.PlayerTurn); } void Start() { SetState(GameState.Idle); } public void StartGame() { round = 1; playerStep = 0; GenerateSequence(); StartCoroutine(PlaySequence()); } void SetState(GameState newState) { state = newState; switch (newState) { case GameState.Idle: statusText.text = "Get Ready!"; break; case GameState.ShowingSequance: statusText.text = "Watch the sequence"; break; case GameState.PlayerTurn: statusText.text = "Your turn!"; break; case GameState.GameOver: statusText.text = "Gameover"; break; case GameState.MinigameWon: statusText.text = "Task Completed"; break; } startButton.SetActive(state == GameState.Idle || state == GameState.GameOver); } public void OnButtonClicked(int buttonIndex) { if (state != GameState.PlayerTurn) return; if (buttonIndex == sequence[playerStep]) { playerStep++; if (playerStep >= sequence.Count) { if (round >= winRound) { SetState(GameState.MinigameWon); Complete(); } else { round++; GenerateSequence(); StartCoroutine(PlaySequence()); } } } else { SetState(GameState.GameOver); Debug.Log("GameOver"); } } public void Initialize(System.Action onCompleted) { _onComplete = onCompleted; } public void ExitTask(System.Action onExit) { onExit.Invoke(this); } public void Complete() { _onComplete?.Invoke(this); } }