Files
GeoSusGame/Assets/Scripts/ButtonsMinigame.cs
2026-06-04 21:20:28 +02:00

155 lines
3.8 KiB
C#

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<int> sequence = new List<int>();
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<ITask> _onComplete;
private Action<ITask> _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<ITask> onCompleted)
{
_onComplete = onCompleted;
}
public void ExitTask(System.Action<ITask> onExit)
{
onExit.Invoke(this);
}
public void Complete()
{
_onComplete?.Invoke(this);
}
}