Ekosistem_Game/Assets/Script/GameManager.cs

371 lines
12 KiB
C#

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEngine.SceneManagement;
using TMPro;
public class GameManager : MonoBehaviour
{
[Header("--- PANEL NAVIGASI & POP UP ---")]
public GameObject panelPilihLevel;
public GameObject panelGameSortir;
public GameObject panelPopUpBenar;
public static bool mauUlangSortir = false;
// --- BARU: SATPAM SUARA BIAR GAK NGOMONG TERUS TIAP RONDE ---
public static bool sudahPernahSapaSortir = false;
[Header("--- KOLEKSI SUARA SORTIR ---")]
public AudioSource speakerGame;
public AudioClip kasetNarator;
public AudioClip kasetBenarMasuk;
public AudioClip kasetSalahMasuk;
public AudioClip kasetPopUpHebat;
public AudioClip kasetPanelHasil;
public AudioClip kasetKalahWaktu;
public AudioClip kasetKlik;
[Header("--- PENGATURAN WAKTU & TIMER ---")]
public float waktuSisa = 120f;
private float waktuAwal;
private bool gameSelesai = false;
public Image barWaktu;
public RectTransform ikonJam;
private float posisiAwalJamY;
private float tinggiBarWaktu;
// --- BARU: KONTROL WAKTU ---
private bool waktuBolehJalan = false;
[Header("--- PENGATURAN SKOR KIRI ---")]
public Image barSkor;
public Image[] bintangSkorProgress;
public TextMeshProUGUI teksSkor;
private int skorKeseluruhan = 0;
private int totalSemuaHewanGame = 0;
[Header("--- DAFTAR RONDE ---")]
public GameObject[] daftarRonde;
private int rondeSekarang = 0;
private int hewanMasukRondeIni = 0;
private int targetHewanRondeIni = 0;
[Header("--- PANEL HASIL AKHIR & ANIMASI ---")]
public GameObject panelHasil;
public RectTransform kontenPanelHasil;
public TextMeshProUGUI teksSkorAkhir;
public Image[] slotBintangPanel;
[Header("--- FITUR ANTI-KLIK ---")]
public CanvasGroup groupKlikGame; // TARIK PANEL_GAMESORTIR KE SINI
void Start()
{
// 1. BERSIHKAN TOTAL SEMUA SUARA SAAT SCENE BARU MULAI
StopAllCoroutines();
if (speakerGame != null) speakerGame.Stop();
waktuAwal = waktuSisa;
waktuBolehJalan = false; // Awalnya waktu dihentikan dulu
if(panelHasil != null) panelHasil.SetActive(false);
if(panelPopUpBenar != null) panelPopUpBenar.SetActive(false);
foreach (Image bintang in slotBintangPanel) { if(bintang != null) bintang.color = Color.gray; }
if (ikonJam != null && barWaktu != null)
{
posisiAwalJamY = ikonJam.anchoredPosition.y;
tinggiBarWaktu = barWaktu.GetComponent<RectTransform>().rect.height;
}
if (barSkor != null) barSkor.fillAmount = 0;
if (teksSkor != null) teksSkor.text = "0";
foreach (Image bintang in bintangSkorProgress) { if(bintang != null) bintang.color = Color.gray; }
HitungTotalSemuaHewan();
MulaiRonde(0);
// 2. CEK APAKAH LAGI MODE ULANGI
if (mauUlangSortir)
{
if (panelPilihLevel != null) panelPilihLevel.SetActive(false);
if (panelGameSortir != null) panelGameSortir.SetActive(true);
mauUlangSortir = false;
// Trigger suara narator lewat fungsi pemicu tunggal
MulaiSuaraNaratorSatuPintu();
}
}
// --- FUNGSI SATU PINTU UNTUK SUARA NARATOR ---
public void MulaiSuaraNaratorSatuPintu()
{
// Pastikan tidak ada suara lain yang jalan sebelum narator mulai
StopAllCoroutines();
if (speakerGame != null)
{
speakerGame.Stop();
StartCoroutine(LogikaTungguNarator());
}
}
IEnumerator LogikaTungguNarator()
{
// 1. Kunci klik (user gak bisa narik hewan atau klik tombol game)
if (groupKlikGame != null) groupKlikGame.blocksRaycasts = false;
waktuBolehJalan = false;
yield return new WaitForSeconds(0.2f);
if (!sudahPernahSapaSortir)
{
if (kasetNarator != null)
{
speakerGame.PlayOneShot(kasetNarator);
// Tunggu sampai narator selesai bicara
yield return new WaitForSeconds(kasetNarator.length);
sudahPernahSapaSortir = true;
}
}
// 2. Buka kunci klik dan jalankan waktu
if (groupKlikGame != null) groupKlikGame.blocksRaycasts = true;
waktuBolehJalan = true;
}
public void MasukGameDanNgomong()
{
// =========================================================
// JURUS MUTLAK ANTI-NABRAK: TEMBAK LANGSUNG DARI KODE!
// =========================================================
ManagerSuaraBermain satpamMenu = FindObjectOfType<ManagerSuaraBermain>();
if (satpamMenu != null)
{
satpamMenu.HentikanPaksaSuara(); // Paksa diam detik ini juga!
}
if (panelPilihLevel != null) panelPilihLevel.SetActive(false);
if (panelGameSortir != null) panelGameSortir.SetActive(true);
MulaiSuaraNaratorSatuPintu();
}
void HitungTotalSemuaHewan()
{
totalSemuaHewanGame = 0;
foreach (GameObject ronde in daftarRonde)
{
if (ronde != null)
{
DragHewan[] semuaHewan = ronde.GetComponentsInChildren<DragHewan>(true);
foreach (DragHewan h in semuaHewan)
{
if (h.asalEkosistem != JenisEkosistem.Pengecoh) totalSemuaHewanGame++;
}
}
}
}
void Update()
{
if (gameSelesai) return;
if (panelGameSortir != null && !panelGameSortir.activeSelf) return;
// --- BARU: JIKA NARATOR BICARA / DIKUNCI, JANGAN JALAN WAKTUNYA ---
if (!waktuBolehJalan) return;
if (waktuSisa > 0)
{
waktuSisa -= Time.deltaTime;
float rasioWaktu = waktuSisa / waktuAwal;
if (barWaktu != null)
{
barWaktu.fillAmount = rasioWaktu;
if (waktuSisa <= 10f) barWaktu.color = Color.red;
else barWaktu.color = Color.white;
}
if (ikonJam != null)
{
float targetY = posisiAwalJamY - (tinggiBarWaktu * (1f - rasioWaktu));
ikonJam.anchoredPosition = Vector2.Lerp(ikonJam.anchoredPosition, new Vector2(ikonJam.anchoredPosition.x, targetY), Time.deltaTime * 5f);
}
}
else
{
waktuSisa = 0;
if (barWaktu != null) barWaktu.fillAmount = 0;
AkhiriGame(true);
}
}
public void JawabanSalah()
{
if (gameSelesai) return;
if (speakerGame != null && kasetSalahMasuk != null) speakerGame.PlayOneShot(kasetSalahMasuk);
}
public void TambahSkor(AudioClip suaraEkosistem = null)
{
if (gameSelesai) return;
if (speakerGame != null && kasetBenarMasuk != null) speakerGame.PlayOneShot(kasetBenarMasuk);
if (speakerGame != null && suaraEkosistem != null)
{
StartCoroutine(JedaNarasiEkosistem(suaraEkosistem));
}
hewanMasukRondeIni++;
skorKeseluruhan++;
float persentaseSkor = totalSemuaHewanGame > 0 ? (float)skorKeseluruhan / totalSemuaHewanGame : 0f;
int skorTampil = Mathf.RoundToInt(persentaseSkor * 100f);
if (teksSkor != null) teksSkor.text = skorTampil.ToString();
if (barSkor != null) barSkor.fillAmount = persentaseSkor;
if (bintangSkorProgress.Length >= 3)
{
if (persentaseSkor >= 0.33f && bintangSkorProgress[0] != null) bintangSkorProgress[0].color = Color.white;
if (persentaseSkor >= 0.66f && bintangSkorProgress[1] != null) bintangSkorProgress[1].color = Color.white;
if (persentaseSkor >= 1.00f && bintangSkorProgress[2] != null) bintangSkorProgress[2].color = Color.white;
}
if (hewanMasukRondeIni >= targetHewanRondeIni)
{
DragHewan[] semuaHewanSisaDiLayar = FindObjectsOfType<DragHewan>();
foreach (DragHewan hewan in semuaHewanSisaDiLayar) hewan.gameObject.SetActive(false);
if(daftarRonde[rondeSekarang] != null) daftarRonde[rondeSekarang].SetActive(false);
StartCoroutine(TampilPopUpLanjutRonde());
}
}
IEnumerator JedaNarasiEkosistem(AudioClip clip)
{
yield return new WaitForSeconds(0.4f);
speakerGame.PlayOneShot(clip);
}
IEnumerator TampilPopUpLanjutRonde()
{
if (panelPopUpBenar != null) panelPopUpBenar.SetActive(true);
if (speakerGame != null && kasetPopUpHebat != null) speakerGame.PlayOneShot(kasetPopUpHebat);
yield return new WaitForSeconds(1.5f);
if (panelPopUpBenar != null) panelPopUpBenar.SetActive(false);
rondeSekarang++;
LanjutRondeBerikutnya();
}
void MulaiRonde(int index)
{
if (index < daftarRonde.Length)
{
if (daftarRonde[index] != null) daftarRonde[index].SetActive(true);
hewanMasukRondeIni = 0;
targetHewanRondeIni = 0;
DragHewan[] semuaHewan = daftarRonde[index].GetComponentsInChildren<DragHewan>();
foreach (DragHewan h in semuaHewan)
{
if (h.asalEkosistem != JenisEkosistem.Pengecoh) targetHewanRondeIni++;
}
}
else { AkhiriGame(false); }
}
void LanjutRondeBerikutnya() { MulaiRonde(rondeSekarang); }
void AkhiriGame(bool waktuHabis)
{
if (gameSelesai) return;
gameSelesai = true;
float persentaseSkor = totalSemuaHewanGame > 0 ? (float)skorKeseluruhan / totalSemuaHewanGame : 0f;
int skorTampil = Mathf.RoundToInt(persentaseSkor * 100f);
if(teksSkorAkhir != null) teksSkorAkhir.text = skorTampil.ToString();
int bintangDapat = 0;
if (!waktuHabis)
{
if (persentaseSkor >= 1.00f) bintangDapat = 3;
else if (persentaseSkor >= 0.66f) bintangDapat = 2;
else if (persentaseSkor >= 0.33f) bintangDapat = 1;
}
StartCoroutine(AnimasiPanelDanBintang(bintangDapat, waktuHabis));
}
IEnumerator AnimasiPanelDanBintang(int jumlahBintang, bool waktuHabis)
{
if (kontenPanelHasil != null)
{
kontenPanelHasil.localScale = Vector3.zero;
panelHasil.SetActive(true);
float t = 0;
while (t < 1f)
{
t += Time.deltaTime * 4f;
float curve = Mathf.Sin(t * Mathf.PI * 0.7f) * 1.15f;
kontenPanelHasil.localScale = new Vector3(curve, curve, curve);
yield return null;
}
kontenPanelHasil.localScale = Vector3.one;
}
else { panelHasil.SetActive(true); }
if (waktuHabis) {
if (speakerGame != null && kasetKalahWaktu != null) speakerGame.PlayOneShot(kasetKalahWaktu);
} else {
if (speakerGame != null && kasetPanelHasil != null) speakerGame.PlayOneShot(kasetPanelHasil);
}
yield return new WaitForSeconds(0.3f);
for (int i = 0; i < jumlahBintang; i++)
{
if (i < slotBintangPanel.Length && slotBintangPanel[i] != null)
{
if (speakerGame != null && kasetBenarMasuk != null) speakerGame.PlayOneShot(kasetBenarMasuk);
slotBintangPanel[i].color = Color.white;
float bT = 0;
Vector3 startScale = Vector3.one * 2f;
while(bT < 1f){
bT += Time.deltaTime * 5f;
slotBintangPanel[i].rectTransform.localScale = Vector3.Lerp(startScale, Vector3.one, bT);
yield return null;
}
yield return new WaitForSeconds(0.4f);
}
}
}
public void TombolUlangi() {
sudahPernahSapaSortir = false;
mauUlangSortir = true;
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}
public void TombolKeluar() {
sudahPernahSapaSortir = false;
mauUlangSortir = false;
if (speakerGame != null && kasetKlik != null) speakerGame.PlayOneShot(kasetKlik);
// Bersihkan sebelum pindah
StopAllCoroutines();
if (speakerGame != null) speakerGame.Stop();
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}
}