MIF_E31222569/Assets/ToothyV/Scripts/UI/PostTestMenu.cs

161 lines
4.1 KiB
C#

using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class PostTestMenu : Menu<PostTestMenu>
{
[Header("Questions")]
[SerializeField] TextMeshProUGUI questionText;
[SerializeField] List<QuestionSO> questions = new List<QuestionSO>();
[SerializeField] GameObject[] answerButtons;
[Header("Answers")]
[SerializeField] private Sprite normalButttonSprite;
[SerializeField] private Sprite trueAnswerSprite;
[SerializeField] private Sprite falseAnswerSprite;
[Header("UI")]
[SerializeField] TextMeshProUGUI timerText;
[Header("Settings")]
[SerializeField] float timeToComplete = 30f;
[SerializeField] float timeToShowAnswer = 10f;
float timer;
bool isAnswering = true;
bool hasAnsweredEarly = false;
int correctAnswerIndex;
QuestionSO currentQuestion;
bool isComplete = false;
SaveData saveData;
int correctAnswers = 0;
int totalQuestions = 9;
private async void OnEnable()
{
LoadRandomQuestion();
await LoadAndRefresh();
}
private async Task LoadAndRefresh()
{
saveData = await Cloudsave.LoadData<SaveData>("DataPlayer");
}
void Update()
{
if (isComplete) return;
timer -= Time.deltaTime;
int minutes = Mathf.FloorToInt(timer / 60);
int seconds = Mathf.FloorToInt(timer % 60);
timerText.text = string.Format("{0:00}:{1:00}", minutes, seconds);
if (isAnswering && timer <= 0f)
{
ShowCorrectAnswer();
}
else if (!isAnswering && timer <= 0f)
{
LoadNextQuestion();
}
}
async void LoadRandomQuestion()
{
if (questions.Count == 0)
{
await EndGame();
return;
}
Image buttonImage;
int index = Random.Range(0, questions.Count);
currentQuestion = questions[index];
questions.RemoveAt(index);
questionText.text = currentQuestion.question;
for (int i = 0; i < answerButtons.Length; i++)
{
TextMeshProUGUI buttonText = answerButtons[i].GetComponentInChildren<TextMeshProUGUI>();
buttonImage = answerButtons[i].GetComponent<Image>();
buttonImage.sprite = normalButttonSprite;
buttonText.text = currentQuestion.GetAnswer(i);
answerButtons[i].GetComponent<Image>().color = Color.white;
answerButtons[i].GetComponent<Button>().interactable = true;
}
correctAnswerIndex = currentQuestion.answerIndex;
timer = timeToComplete;
isAnswering = true;
hasAnsweredEarly = false;
}
public void OnAnswerSelected(int index)
{
if (!isAnswering) return;
hasAnsweredEarly = true;
isAnswering = false;
timer = timeToShowAnswer;
foreach (GameObject btn in answerButtons)
{
btn.GetComponent<Button>().interactable = false;
}
Image selectedImage = answerButtons[index].GetComponent<Image>();
if (index == correctAnswerIndex)
{
correctAnswers++;
selectedImage.sprite = trueAnswerSprite;
questionText.text = "Jawaban Benar!";
}
else
{
selectedImage.sprite = falseAnswerSprite;
questionText.text = "Jawaban Salah";
}
saveData.postTestStatistik = (int)(((float)correctAnswers / totalQuestions) * 100f);
}
void ShowCorrectAnswer()
{
isAnswering = false;
timer = timeToShowAnswer;
foreach (GameObject btn in answerButtons)
{
btn.GetComponent<Button>().interactable = false;
}
questionText.text = "Waktu habis";
}
void LoadNextQuestion()
{
LoadRandomQuestion();
}
private async Task EndGame()
{
isComplete = true;
int finalScore = (int)(((float)correctAnswers / totalQuestions) * 100f);
saveData.postTestStatistik = finalScore;
await Cloudsave.SaveData(saveData, "DataPlayer");
MainMenu.Open();
}
}