Raihan_TugasAkhir/Assets/Script/GameManager Hewan.cs

433 lines
14 KiB
C#

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class GameManagerHewan : MonoBehaviour
{
public static GameManagerHewan instance;
[Header("PANEL LEVEL HEWAN")]
public GameObject Panel_TebakSuara;
public GameObject Panel_Puzzle;
public GameObject Panel_TebakHabitat;
public GameObject Panel_Kemenangan;
public GameObject Panel_PilihLevel;
public GameObject Panel_PilihLevel2;
[Header("UI & TOMBOL")]
public GameObject TombolNextGlobal;
public Text teksWaktu;
public GameObject wadahNyawa;
public GameObject[] iconHati;
[Header("POP UP")]
public GameObject popUpBenar;
public GameObject popUpSalah;
public GameObject popupLanjut;
[Header("AUDIO UTAMA")]
public AudioSource audioSource;
public AudioClip klipBenar;
public AudioClip klipSalah;
public AudioClip klipKalimatBenar;
public AudioClip klipNyawaBerkurang;
[Header("PENGATURAN VOLUME SUARA")]
[Range(0f, 1f)] public float volumeSuaraUtama = 1f;
[Range(0f, 1f)] public float volumeBenarSalah = 0.4f;
[Header("DAFTAR SEMUA LEVEL")]
public GameObject[] semuaLevelHewan;
private int indexLevelSaatIni = 0;
[Header("FITUR PAUSE")]
public GameObject panelPause;
public GameObject ikonTombolPause;
[Header("EFEK VISUAL")]
public UnityEngine.UI.Image layarMerah;
// --- VARIABEL PRIVATE ---
private int sisaNyawa;
private float timer;
private bool waktuBerjalan = false;
private int potonganTerkumpul = 0;
private int tahapSaatIni = 1;
private bool bisaKlikNext = true;
private bool bolehKlikJawaban = false;
// 🔥 VARIABEL BARU: Untuk melacak suara dari tombol dan mengeremnya!
private AudioSource audioTombolAktif;
private void Awake() { instance = this; }
private void Start()
{
sisaNyawa = iconHati.Length;
bisaKlikNext = true;
waktuBerjalan = false;
if (teksWaktu != null) teksWaktu.gameObject.SetActive(false);
if (wadahNyawa != null) wadahNyawa.SetActive(false);
for (int i = 0; i < iconHati.Length; i++) { if (iconHati[i] != null) iconHati[i].SetActive(false); }
if (popUpBenar != null) popUpBenar.SetActive(false);
if (popUpSalah != null) popUpSalah.SetActive(false);
if (popupLanjut != null) popupLanjut.SetActive(false);
if (TombolNextGlobal != null) TombolNextGlobal.SetActive(false);
if (Panel_PilihLevel != null) Panel_PilihLevel.SetActive(true);
if (ikonTombolPause != null) ikonTombolPause.SetActive(false);
if (audioSource != null) audioSource.volume = volumeSuaraUtama;
}
private void Update()
{
if (waktuBerjalan)
{
if (timer > 0)
{
timer -= Time.deltaTime;
if (teksWaktu != null) teksWaktu.text = "Waktu : " + Mathf.CeilToInt(timer).ToString();
if (timer <= 0)
{
timer = 0;
if (teksWaktu != null) teksWaktu.text = "Waktu : 0";
waktuBerjalan = false;
NyawaBerkurang();
}
}
}
}
public void NyawaBerkurang()
{
sisaNyawa--;
UpdateNyawa();
if (audioSource != null && klipNyawaBerkurang != null)
audioSource.PlayOneShot(klipNyawaBerkurang, volumeBenarSalah);
if (layarMerah != null) StartCoroutine(ProsesKedipMerah());
if (sisaNyawa <= 0)
{
sisaNyawa = 0;
waktuBerjalan = false;
StartCoroutine(JedaSebelumReset());
}
else
{
ResetWaktu();
}
}
private void ResetWaktu()
{
timer = 20f;
waktuBerjalan = true;
potonganTerkumpul = 0;
if (teksWaktu != null) teksWaktu.gameObject.SetActive(true);
if (wadahNyawa != null) wadahNyawa.SetActive(true);
if (TombolNextGlobal != null) TombolNextGlobal.SetActive(false);
bolehKlikJawaban = false;
UpdateNyawa();
StartCoroutine(TungguSuaraSoalSelesai());
}
public void UpdateNyawa()
{
for (int i = 0; i < iconHati.Length; i++)
{
if (iconHati[i] != null) iconHati[i].SetActive(i < sisaNyawa);
}
}
// ========================================================
// 🔥 FUNGSI JAWABAN BENAR DENGAN SATPAM INTERNAL
// ========================================================
public void JawabanBenar(AudioSource tombolBenar = null)
{
// 🛑 SATPAM: Tolak mentah-mentah jika dipencet sebelum suara petunjuk selesai!
if (tahapSaatIni == 1 && !bolehKlikJawaban) return;
// Simpan AudioSource tombol ke variabel global agar nanti bisa di-rem saat klik Next
audioTombolAktif = tombolBenar;
waktuBerjalan = false;
if (TombolNextGlobal != null) TombolNextGlobal.SetActive(true);
if (popUpBenar != null) popUpBenar.SetActive(true);
if (audioSource != null) audioSource.Stop();
if (Panel_TebakSuara != null && Panel_TebakSuara.activeInHierarchy)
{
AudioSource suaraSoal = Panel_TebakSuara.GetComponent<AudioSource>();
if (suaraSoal != null) suaraSoal.Stop();
}
StartCoroutine(AntrianSuaraBenar(tombolBenar));
}
System.Collections.IEnumerator AntrianSuaraBenar(AudioSource suaraDariTombol)
{
if (audioSource != null && klipBenar != null)
{
audioSource.PlayOneShot(klipBenar, volumeBenarSalah);
yield return new WaitForSeconds(klipBenar.length);
}
if (audioSource != null && klipKalimatBenar != null)
{
audioSource.PlayOneShot(klipKalimatBenar, volumeSuaraUtama);
yield return new WaitForSeconds(klipKalimatBenar.length);
}
if (suaraDariTombol != null && tahapSaatIni == 1)
{
suaraDariTombol.loop = false;
suaraDariTombol.volume = volumeSuaraUtama;
suaraDariTombol.Play();
}
}
System.Collections.IEnumerator TungguSuaraSoalSelesai()
{
yield return new WaitForSeconds(0.1f);
if (Panel_TebakSuara != null && Panel_TebakSuara.activeInHierarchy)
{
AudioSource suaraSoal = Panel_TebakSuara.GetComponent<AudioSource>();
if (suaraSoal != null && suaraSoal.clip != null)
{
yield return new WaitForSeconds(suaraSoal.clip.length);
}
}
// KUNCI DIBUKA!
bolehKlikJawaban = true;
}
public bool CekApakahBolehKlik()
{
if (tahapSaatIni == 1) return bolehKlikJawaban;
else return true;
}
public void SatuPotonganBenar()
{
potonganTerkumpul++;
if (potonganTerkumpul >= 4)
{
JawabanBenar(null);
}
}
// ========================================================
// 🔥 FUNGSI JAWABAN SALAH DENGAN SATPAM INTERNAL
// ========================================================
public void JawabanSalah()
{
// 🛑 SATPAM: Tolak mentah-mentah jika dipencet sebelum suara petunjuk selesai!
if (tahapSaatIni == 1 && !bolehKlikJawaban) return;
if (popUpSalah != null)
{
popUpSalah.SetActive(true);
Invoke("SembunyikanPopUpSalah", 1.2f);
}
if (audioSource != null && klipSalah != null)
{
audioSource.Stop();
audioSource.PlayOneShot(klipSalah, volumeBenarSalah);
}
if (layarMerah != null) StartCoroutine(ProsesKedipMerah());
}
void SembunyikanPopUp() { if (popUpBenar != null) popUpBenar.SetActive(false); }
void SembunyikanPopUpSalah() { if (popUpSalah != null) popUpSalah.SetActive(false); }
public void KlikTombolNextGlobal()
{
if (!bisaKlikNext) return;
// ========================================================
// 🔥 REM DARURAT TOTAL: Matikan SEMUA suara saat pindah panel
// ========================================================
StopAllCoroutines();
if (audioSource != null) audioSource.Stop(); // Matikan suara GameManager
if (audioTombolAktif != null) audioTombolAktif.Stop(); // Matikan suara dari tombol (Biar gak bocor ke puzzle!)
if (Panel_TebakSuara != null)
{
AudioSource suaraSoal = Panel_TebakSuara.GetComponent<AudioSource>();
if (suaraSoal != null) suaraSoal.Stop();
}
if (TombolNextGlobal != null) TombolNextGlobal.SetActive(false);
if (popUpBenar != null) popUpBenar.SetActive(false);
if (tahapSaatIni == 1)
{
tahapSaatIni = 2;
Panel_TebakSuara.SetActive(false);
Panel_Puzzle.SetActive(true);
ResetWaktu();
}
else if (tahapSaatIni == 2)
{
tahapSaatIni = 3;
Panel_Puzzle.SetActive(false);
Panel_TebakHabitat.SetActive(true);
ResetWaktu();
}
else if (tahapSaatIni == 3)
{
waktuBerjalan = false;
if (Panel_TebakHabitat != null) Panel_TebakHabitat.SetActive(false);
if (Panel_Kemenangan != null) Panel_Kemenangan.SetActive(true);
if (wadahNyawa != null) wadahNyawa.SetActive(false);
if (teksWaktu != null) teksWaktu.gameObject.SetActive(false);
for (int i = 0; i < iconHati.Length; i++) { if (iconHati[i] != null) iconHati[i].SetActive(false); }
}
StartCoroutine(JedaKlik());
}
System.Collections.IEnumerator JedaKlik()
{
bisaKlikNext = false;
yield return new WaitForSeconds(1.0f);
bisaKlikNext = true;
}
public void KlikTombolLevel(GameObject levelTujuan)
{
for (int i = 0; i < semuaLevelHewan.Length; i++)
{
if (semuaLevelHewan[i] == levelTujuan)
{
indexLevelSaatIni = i;
break;
}
}
if (Panel_PilihLevel != null) Panel_PilihLevel.SetActive(false);
if (Panel_PilihLevel2 != null) Panel_PilihLevel2.SetActive(false);
if (ikonTombolPause != null) ikonTombolPause.SetActive(true);
levelTujuan.SetActive(true);
Transform cariSuara = levelTujuan.transform.Find("Panel_TebakSuara");
Transform cariPuzzle = levelTujuan.transform.Find("Panel_Puzzle");
Transform cariHabitat = levelTujuan.transform.Find("Panel_TebakHabitat");
Transform cariMenang = levelTujuan.transform.Find("Panel_Kemenangan");
if (cariSuara != null && cariPuzzle != null && cariHabitat != null && cariMenang != null)
{
Panel_TebakSuara = cariSuara.gameObject;
Panel_Puzzle = cariPuzzle.gameObject;
Panel_TebakHabitat = cariHabitat.gameObject;
Panel_Kemenangan = cariMenang.gameObject;
tahapSaatIni = 1;
Panel_TebakSuara.SetActive(true);
Panel_Puzzle.SetActive(false);
Panel_TebakHabitat.SetActive(false);
Panel_Kemenangan.SetActive(false);
ResetWaktu();
}
}
public void KlikLanjutLevelBerikutnya()
{
if (popupLanjut != null) popupLanjut.SetActive(false);
if (popUpBenar != null) popUpBenar.SetActive(false);
if (popUpSalah != null) popUpSalah.SetActive(false);
if (indexLevelSaatIni < semuaLevelHewan.Length && semuaLevelHewan[indexLevelSaatIni] != null)
{
semuaLevelHewan[indexLevelSaatIni].SetActive(false);
}
indexLevelSaatIni++;
if (indexLevelSaatIni < semuaLevelHewan.Length && semuaLevelHewan[indexLevelSaatIni] != null)
{
KlikTombolLevel(semuaLevelHewan[indexLevelSaatIni]);
}
else
{
Debug.Log("Level Habis! Kembali ke Home.");
KlikKeHome();
}
}
public void KlikKeHome()
{
waktuBerjalan = false;
if (popUpBenar != null) popUpBenar.SetActive(false);
if (popUpSalah != null) popUpSalah.SetActive(false);
if (popupLanjut != null) popupLanjut.SetActive(false);
if (semuaLevelHewan.Length > 0 && indexLevelSaatIni < semuaLevelHewan.Length && semuaLevelHewan[indexLevelSaatIni] != null)
{
semuaLevelHewan[indexLevelSaatIni].SetActive(false);
}
if (teksWaktu != null) teksWaktu.gameObject.SetActive(false);
if (wadahNyawa != null) wadahNyawa.SetActive(false);
for (int i = 0; i < iconHati.Length; i++) { if (iconHati[i] != null) iconHati[i].SetActive(false); }
if (Panel_PilihLevel != null) Panel_PilihLevel.SetActive(true);
if (ikonTombolPause != null) ikonTombolPause.SetActive(false);
}
public void KembaliKeMainMenu() { SceneManager.LoadScene("Main_Menu"); }
public void TombolPauseDitekan()
{
if (panelPause != null) panelPause.SetActive(true);
Time.timeScale = 0f;
}
public void TombolLanjutDitekan()
{
if (panelPause != null) panelPause.SetActive(false);
Time.timeScale = 1f;
}
public void TombolHomeDitekan()
{
Time.timeScale = 1f;
SceneManager.LoadScene("Main_Menu");
}
System.Collections.IEnumerator ProcessKedipMerah() { yield return null; }
System.Collections.IEnumerator ProsesKedipMerah()
{
layarMerah.color = new Color(1f, 0f, 0f, 0.4f);
yield return new WaitForSeconds(0.05f);
float alpha = 0.4f;
while (alpha > 0f)
{
alpha -= Time.deltaTime * 1.5f;
layarMerah.color = new Color(1f, 0f, 0f, alpha);
yield return null;
}
layarMerah.color = new Color(1f, 0f, 0f, 0f);
}
System.Collections.IEnumerator JedaSebelumReset()
{
yield return new WaitForSecondsRealtime(1.2f);
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}
}