This commit is contained in:
Vira 2025-07-15 20:22:37 +07:00
commit 381209a405
4 changed files with 118 additions and 51 deletions

View File

@ -9,7 +9,7 @@ public class AuntMenu : Menu<AuntMenu>
{ {
[SerializeField] private GameObject loadingScreen; [SerializeField] private GameObject loadingScreen;
[Header("Register")] [Header("Register")]
[SerializeField] private TMP_InputField usernameFieldRegister; [SerializeField] private TMP_InputField usernameFieldRegister;
[SerializeField] private TMP_InputField nameFieldRegister; [SerializeField] private TMP_InputField nameFieldRegister;
[SerializeField] private TMP_InputField paswordFieldRegister; [SerializeField] private TMP_InputField paswordFieldRegister;
@ -26,7 +26,7 @@ public class AuntMenu : Menu<AuntMenu>
[SerializeField] private GameObject RegisterObj; [SerializeField] private GameObject RegisterObj;
[SerializeField] private GameObject InvalidAge; [SerializeField] private GameObject InvalidAge;
[Header("Login")] [Header("Login")]
[SerializeField] private TMP_InputField usernameFieldLogin; [SerializeField] private TMP_InputField usernameFieldLogin;
[SerializeField] private TMP_InputField paswordFieldLogin; [SerializeField] private TMP_InputField paswordFieldLogin;
private string usernameLogin; private string usernameLogin;
@ -99,20 +99,26 @@ public class AuntMenu : Menu<AuntMenu>
paswordRegister = paswordFieldRegister.text; paswordRegister = paswordFieldRegister.text;
EmailRegister = EmailFieldRegister.text; EmailRegister = EmailFieldRegister.text;
int day = dateAgeRegister.value + 1; int day = dateAgeRegister.value + 1;
int month = monthAgeRegister.value + 1; int month = monthAgeRegister.value + 1;
int year = int.Parse(yearAgeRegister.options[yearAgeRegister.value].text); int year = int.Parse(yearAgeRegister.options[yearAgeRegister.value].text);
DateTime birthDate = new DateTime(year, month, day); // Validasi tanggal + hitung umur
calculatedAge = CalculateAge(birthDate); if (!TryGetValidAge(year, month, day, out calculatedAge))
// {
// if (calculatedAge < 6 || calculatedAge > 12) Debug.LogWarning("Tanggal tidak valid!");
// { InvalidAge.SetActive(true);
// Debug.LogWarning("Age must be between 6 and 12 years!"); ResetRegisterFields();
// Debug.Log(calculatedAge); return;
// InvalidAge.SetActive(true); }
// return;
// } if (calculatedAge < 6 || calculatedAge > 9)
{
Debug.LogWarning("Usia harus antara 6 sampai 9 tahun!");
InvalidAge.SetActive(true);
ResetRegisterFields();
return;
}
await AuthenticationManager.SignUpUsernamePassword(usernameRegister, paswordRegister, EmailRegister, calculatedAge.ToString()); await AuthenticationManager.SignUpUsernamePassword(usernameRegister, paswordRegister, EmailRegister, calculatedAge.ToString());
@ -125,6 +131,21 @@ public class AuntMenu : Menu<AuntMenu>
await Cloudsave.SaveData(dataToSave, "DataPlayer"); await Cloudsave.SaveData(dataToSave, "DataPlayer");
} }
private bool TryGetValidAge(int year, int month, int day, out int age)
{
try
{
DateTime birthDate = new DateTime(year, month, day);
age = CalculateAge(birthDate);
return true;
}
catch (ArgumentOutOfRangeException)
{
age = 0;
return false;
}
}
private int CalculateAge(DateTime birthDate) private int CalculateAge(DateTime birthDate)
{ {
DateTime today = DateTime.Today; DateTime today = DateTime.Today;
@ -132,4 +153,15 @@ public class AuntMenu : Menu<AuntMenu>
if (birthDate.Date > today.AddYears(-age)) age--; if (birthDate.Date > today.AddYears(-age)) age--;
return age; return age;
} }
}
private void ResetRegisterFields()
{
usernameFieldRegister.text = "";
nameFieldRegister.text = "";
paswordFieldRegister.text = "";
EmailFieldRegister.text = "";
dateAgeRegister.value = 0;
monthAgeRegister.value = 0;
yearAgeRegister.value = 0;
}
}

View File

@ -11,8 +11,8 @@ public class PostTestMenu : Menu<PostTestMenu>
[SerializeField] TextMeshProUGUI questionText; [SerializeField] TextMeshProUGUI questionText;
[SerializeField] List<QuestionSO> questions = new List<QuestionSO>(); [SerializeField] List<QuestionSO> questions = new List<QuestionSO>();
[SerializeField] GameObject[] answerButtons; [SerializeField] GameObject[] answerButtons;
[Header("Answers")] [Header("Answers")]
[SerializeField] private Sprite normalButttonSprite; [SerializeField] private Sprite normalButttonSprite;
[SerializeField] private Sprite trueAnswerSprite; [SerializeField] private Sprite trueAnswerSprite;
[SerializeField] private Sprite falseAnswerSprite; [SerializeField] private Sprite falseAnswerSprite;
@ -33,12 +33,12 @@ public class PostTestMenu : Menu<PostTestMenu>
bool isComplete = false; bool isComplete = false;
SaveData saveData; SaveData saveData;
int correctAnswers = 0; int correctAnswers = 0;
int totalQuestions = 10; int totalQuestions = 10;
private int indexEnable = 0; private int indexEnable = 0;
private async void OnEnable() private async void OnEnable()
{ {
indexEnable++; indexEnable++;
@ -86,7 +86,7 @@ public class PostTestMenu : Menu<PostTestMenu>
await EndGame(); await EndGame();
return; return;
} }
Image buttonImage; Image buttonImage;
int index = Random.Range(0, questions.Count); int index = Random.Range(0, questions.Count);
@ -109,10 +109,10 @@ public class PostTestMenu : Menu<PostTestMenu>
timer = timeToComplete; timer = timeToComplete;
isAnswering = true; isAnswering = true;
hasAnsweredEarly = false; hasAnsweredEarly = false;
audioController.Instance.StopDubbing(); audioController.Instance.StopDubbing();
audioController.Instance.PlayDubbing(currentQuestion.dubbingName); audioController.Instance.PlayDubbing(currentQuestion.dubbingName);
} }
public void OnAnswerSelected(int index) public void OnAnswerSelected(int index)
@ -132,7 +132,7 @@ public class PostTestMenu : Menu<PostTestMenu>
if (index == correctAnswerIndex) if (index == correctAnswerIndex)
{ {
correctAnswers ++; correctAnswers++;
Debug.Log("Jawab Benar"); Debug.Log("Jawab Benar");
selectedImage.sprite = trueAnswerSprite; selectedImage.sprite = trueAnswerSprite;
questionText.text = "Jawaban Benar!"; questionText.text = "Jawaban Benar!";
@ -146,7 +146,7 @@ public class PostTestMenu : Menu<PostTestMenu>
saveData.postTestStatistik = (int)(((float)correctAnswers / totalQuestions) * 100f); saveData.postTestStatistik = (int)(((float)correctAnswers / totalQuestions) * 100f);
} }
void ShowCorrectAnswer() void ShowCorrectAnswer()
{ {
isAnswering = false; isAnswering = false;
@ -168,10 +168,22 @@ public class PostTestMenu : Menu<PostTestMenu>
private async Task EndGame() private async Task EndGame()
{ {
isComplete = true; isComplete = true;
int finalScore = (int)(((float)correctAnswers / totalQuestions) * 100f); int finalScore = (int)(((float)correctAnswers / totalQuestions) * 100f);
saveData.postTestStatistik = finalScore; saveData.postTestStatistik = finalScore;
await Cloudsave.SaveData(saveData, "DataPlayer"); await Cloudsave.SaveData(saveData, "DataPlayer");
MainMenu.Open(); MainMenu.Open();
SelectLevel.Open(); SelectLevel.Open();
} }
private void OnDisable()
{
audioController.Instance.StopDubbing();
}
public override void OnBackPressed()
{
base.OnBackPressed();
audioController.Instance.StopDubbing();
}
} }

View File

@ -14,8 +14,8 @@ public class PreTestMenu : Menu<PreTestMenu>
[Header("UI")] [Header("UI")]
[SerializeField] TextMeshProUGUI timerText; [SerializeField] TextMeshProUGUI timerText;
[Header("Answers")] [Header("Answers")]
[SerializeField] private Sprite normalButttonSprite; [SerializeField] private Sprite normalButttonSprite;
[SerializeField] private Sprite trueAnswerSprite; [SerializeField] private Sprite trueAnswerSprite;
[SerializeField] private Sprite falseAnswerSprite; [SerializeField] private Sprite falseAnswerSprite;
@ -31,10 +31,10 @@ public class PreTestMenu : Menu<PreTestMenu>
QuestionSO currentQuestion; QuestionSO currentQuestion;
bool isComplete = false; bool isComplete = false;
SaveData saveData; SaveData saveData;
int correctAnswers = 0; int correctAnswers = 0;
int totalQuestions = 10; int totalQuestions = 10;
private int indexEnable = 0; private int indexEnable = 0;
@ -51,15 +51,15 @@ public class PreTestMenu : Menu<PreTestMenu>
private async Task LoadAndRefresh() private async Task LoadAndRefresh()
{ {
saveData = await Cloudsave.LoadData<SaveData>("DataPlayer"); saveData = await Cloudsave.LoadData<SaveData>("DataPlayer");
saveData.isPreTestComplete = true; saveData.isPreTestComplete = true;
} }
void Update() void Update()
{ {
if (isComplete) return; if (isComplete) return;
if(indexEnable == 0) return; if (indexEnable == 0) return;
if (isComplete) return; if (isComplete) return;
timer -= Time.deltaTime; timer -= Time.deltaTime;
@ -113,7 +113,7 @@ public class PreTestMenu : Menu<PreTestMenu>
timer = timeToComplete; timer = timeToComplete;
isAnswering = true; isAnswering = true;
hasAnsweredEarly = false; hasAnsweredEarly = false;
audioController.Instance.StopDubbing(); audioController.Instance.StopDubbing();
audioController.Instance.PlayDubbing(currentQuestion.dubbingName); audioController.Instance.PlayDubbing(currentQuestion.dubbingName);
} }
@ -169,10 +169,21 @@ public class PreTestMenu : Menu<PreTestMenu>
private async Task EndGame() private async Task EndGame()
{ {
isComplete = true; isComplete = true;
int finalScore = (int)(((float)correctAnswers / totalQuestions) * 100f); int finalScore = (int)(((float)correctAnswers / totalQuestions) * 100f);
saveData.preTestStatistik = finalScore; saveData.preTestStatistik = finalScore;
await Cloudsave.SaveData(saveData, "DataPlayer"); await Cloudsave.SaveData(saveData, "DataPlayer");
MainMenu.Open(); MainMenu.Open();
SelectLevel.Open(); SelectLevel.Open();
} }
}
private void OnDisable()
{
audioController.Instance.StopDubbing();
}
public override void OnBackPressed()
{
base.OnBackPressed();
audioController.Instance.StopDubbing();
}
}

View File

@ -9,7 +9,7 @@ public class QuizPopUp : Menu<QuizPopUp>
[SerializeField] TextMeshProUGUI questionText; [SerializeField] TextMeshProUGUI questionText;
[SerializeField] QuestionSO currentQuestion; [SerializeField] QuestionSO currentQuestion;
[Header("Answers")] [Header("Answers")]
[SerializeField] private Sprite normalButttonSprite; [SerializeField] private Sprite normalButttonSprite;
[SerializeField] private Sprite trueAnswerSprite; [SerializeField] private Sprite trueAnswerSprite;
[SerializeField] private Sprite falseAnswerSprite; [SerializeField] private Sprite falseAnswerSprite;
@ -26,7 +26,7 @@ public class QuizPopUp : Menu<QuizPopUp>
public bool isComplete = false; public bool isComplete = false;
bool isGameOver = false; bool isGameOver = false;
//======================== //========================
[SerializeField] float timeToCompleteQuestion = 30f; [SerializeField] float timeToCompleteQuestion = 30f;
[SerializeField] float timeToShowCorrectAnswer = 10f; [SerializeField] float timeToShowCorrectAnswer = 10f;
@ -46,7 +46,7 @@ public class QuizPopUp : Menu<QuizPopUp>
correctAnswerIndex = currentQuestion.answerIndex; correctAnswerIndex = currentQuestion.answerIndex;
timerValue = timeToCompleteQuestion; timerValue = timeToCompleteQuestion;
isAnsweringQuestion = true; isAnsweringQuestion = true;
fillFraction = 1f; fillFraction = 1f;
loadNextQuestion = false; loadNextQuestion = false;
hasAnsweredEarly = false; hasAnsweredEarly = false;
@ -57,7 +57,7 @@ public class QuizPopUp : Menu<QuizPopUp>
PlayDubbingQuestion(); PlayDubbingQuestion();
audioController.Instance.bgmSource.volume = .1f; audioController.Instance.bgmSource.volume = .1f;
} }
private void OnDisable() private void OnDisable()
{ {
isAnsweringQuestion = false; isAnsweringQuestion = false;
@ -75,18 +75,22 @@ public class QuizPopUp : Menu<QuizPopUp>
button.interactable = true; button.interactable = true;
Image buttonImage = answerButtons[i].GetComponent<Image>(); Image buttonImage = answerButtons[i].GetComponent<Image>();
buttonImage.color = Color.white; buttonImage.color = Color.white;
} }
if (timerImage != null) if (timerImage != null)
{ {
timerImage.fillAmount = 1f; timerImage.fillAmount = 1f;
} }
audioController.Instance.bgmSource.volume = 1f;
if (audioController.Instance != null)
{
audioController.Instance.StopDubbing();
audioController.Instance.bgmSource.volume = 1f;
}
} }
void Update() void Update()
{ {
if (gameManager == null) if (gameManager == null)
@ -95,13 +99,13 @@ public class QuizPopUp : Menu<QuizPopUp>
} }
StateLoadQuestion(); StateLoadQuestion();
UpdateTimer(); UpdateTimer();
if(isComplete) if (isComplete)
{ {
Debug.Log("Game Over"); Debug.Log("Game Over");
isComplete = false; isComplete = false;
} }
} }
public void CancelTimer() public void CancelTimer()
{ {
timerValue = 0; timerValue = 0;
@ -223,11 +227,11 @@ public class QuizPopUp : Menu<QuizPopUp>
buttonImage.sprite = normalButttonSprite; buttonImage.sprite = normalButttonSprite;
TextMeshProUGUI buttonText = answerButtons[i].GetComponentInChildren<TextMeshProUGUI>(); TextMeshProUGUI buttonText = answerButtons[i].GetComponentInChildren<TextMeshProUGUI>();
buttonText.text = currentQuestion.answers[i]; buttonText.text = currentQuestion.answers[i];
} }
} }
private async void DelayAfterAnswerTrue() private async void DelayAfterAnswerTrue()
{ {
SaveData saveData = await Cloudsave.LoadData<SaveData>("DataPlayer"); SaveData saveData = await Cloudsave.LoadData<SaveData>("DataPlayer");
@ -271,7 +275,7 @@ public class QuizPopUp : Menu<QuizPopUp>
GameMenu.Open(); GameMenu.Open();
} }
IEnumerator DelayAfterAnswerFalse() IEnumerator DelayAfterAnswerFalse()
{ {
yield return new WaitForSeconds(1f); yield return new WaitForSeconds(1f);
@ -293,5 +297,13 @@ public class QuizPopUp : Menu<QuizPopUp>
{ {
audioController.Instance.StopDubbing(); audioController.Instance.StopDubbing();
audioController.Instance.PlayDubbing(currentQuestion.dubbingName); audioController.Instance.PlayDubbing(currentQuestion.dubbingName);
} }
public override void OnBackPressed()
{
base.OnBackPressed();
audioController.Instance.StopDubbing();
} }
}