using System.Collections.Generic; using System.Linq; using TMPro; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; public class LevelActivityManager : MonoBehaviour { public enum ActivityCategory { SopanSantun, TanggungJawab, Disiplin, Peduli } [System.Serializable] public class ActivityData { public string id; public string namaAktivitas; public ActivityCategory kategori; public int penaltyJikaTerlewat = 10; public bool wajib = true; [HideInInspector] public bool selesai = false; [HideInInspector] public bool terlewat = false; } [Header("Data Level")] public string namaLevel = "Rumah"; public string sceneBerikutnya = "Level2_HalamanRumah"; public List daftarAktivitas = new List(); [Header("Poin Karakter")] public int sopanSantun = 100; public int tanggungJawab = 100; public int disiplin = 100; public int peduli = 100; [Header("UI Utama")] public TMP_Text txtTrackerMisi; public Button btnLihatMisi; public Button btnAmbil; public Button btnInteraksi; [Header("Panel Misi")] public GameObject panelMisi; public TMP_Text txtJudulMisi; public TMP_Text txtDaftarMisi; public Button btnTutupMisi; [Header("Panel Konfirmasi Keluar")] public GameObject panelKonfirmasiKeluar; public TMP_Text txtJudulKonfirmasi; public TMP_Text txtIsiKonfirmasi; public Button btnKembaliMenyelesaikan; public Button btnTetapKeluar; [Header("Panel Rekap Level")] public GameObject panelRekapLevel; public TMP_Text txtJudulRekap; public TMP_Text txtIsiRekap; public Button btnUlangiLevel; public Button btnLanjutLevel; [Header("Pesan Kecil Opsional")] public TMP_Text txtPesanKecil; private ActivityTrigger aktivitasTerdekat; //private bool sedangDiPintuKeluar = false; private void Awake() { JikaDaftarKosongIsiDefaultRumah(); } private void Start() { MatikanPanelAwal(); PasangListenerButton(); UpdateUI(); } private void JikaDaftarKosongIsiDefaultRumah() { if (daftarAktivitas != null && daftarAktivitas.Count > 0) return; daftarAktivitas = new List { new ActivityData { id = "mandi", namaAktivitas = "Mandi", kategori = ActivityCategory.Disiplin, penaltyJikaTerlewat = 10 }, new ActivityData { id = "gantibaju", namaAktivitas = "Ganti baju", kategori = ActivityCategory.Disiplin, penaltyJikaTerlewat = 10 }, new ActivityData { id = "sarapan", namaAktivitas = "Sarapan", kategori = ActivityCategory.TanggungJawab, penaltyJikaTerlewat = 10 }, new ActivityData { id = "rapikankamar", namaAktivitas = "Rapikan kamar", kategori = ActivityCategory.TanggungJawab, penaltyJikaTerlewat = 10 }, new ActivityData { id = "sepatu", namaAktivitas = "Ambil sepatu", kategori = ActivityCategory.TanggungJawab, penaltyJikaTerlewat = 10 }, new ActivityData { id = "pamitibu", namaAktivitas = "Pamit kepada Ibu", kategori = ActivityCategory.SopanSantun, penaltyJikaTerlewat = 20 } }; } private void MatikanPanelAwal() { if (panelMisi != null) panelMisi.SetActive(false); if (panelKonfirmasiKeluar != null) panelKonfirmasiKeluar.SetActive(false); if (panelRekapLevel != null) panelRekapLevel.SetActive(false); if (btnAmbil != null) btnAmbil.gameObject.SetActive(false); if (btnInteraksi != null) btnInteraksi.gameObject.SetActive(false); if (txtPesanKecil != null) txtPesanKecil.text = ""; } private void PasangListenerButton() { if (btnLihatMisi != null) { btnLihatMisi.onClick.RemoveAllListeners(); btnLihatMisi.onClick.AddListener(TampilkanPanelMisi); } if (btnTutupMisi != null) { btnTutupMisi.onClick.RemoveAllListeners(); btnTutupMisi.onClick.AddListener(TutupPanelMisi); } if (btnAmbil != null) { btnAmbil.onClick.RemoveAllListeners(); btnAmbil.onClick.AddListener(SelesaikanAktivitasTerdekat); } if (btnInteraksi != null) { btnInteraksi.onClick.RemoveAllListeners(); btnInteraksi.onClick.AddListener(SelesaikanAktivitasTerdekat); } if (btnKembaliMenyelesaikan != null) { btnKembaliMenyelesaikan.onClick.RemoveAllListeners(); //btnKembaliMenyelesaikan.onClick.AddListener(KembaliMenyelesaikanAktivitas); } if (btnTetapKeluar != null) { btnTetapKeluar.onClick.RemoveAllListeners(); btnTetapKeluar.onClick.AddListener(TetapKeluarDenganCatatan); } if (btnUlangiLevel != null) { btnUlangiLevel.onClick.RemoveAllListeners(); btnUlangiLevel.onClick.AddListener(UlangiLevel); } if (btnLanjutLevel != null) { btnLanjutLevel.onClick.RemoveAllListeners(); btnLanjutLevel.onClick.AddListener(LanjutLevel); } } public void SetAktivitasTerdekat(ActivityTrigger trigger) { aktivitasTerdekat = trigger; if (trigger == null) { if (btnAmbil != null) btnAmbil.gameObject.SetActive(false); if (btnInteraksi != null) btnInteraksi.gameObject.SetActive(false); return; } ActivityData data = CariAktivitas(trigger.activityId); if (data == null || data.selesai) { if (btnAmbil != null) btnAmbil.gameObject.SetActive(false); if (btnInteraksi != null) btnInteraksi.gameObject.SetActive(false); return; } if (trigger.jenisInteraksi == ActivityTrigger.JenisInteraksi.AmbilAktivitas) { if (btnAmbil != null) btnAmbil.gameObject.SetActive(true); if (btnInteraksi != null) btnInteraksi.gameObject.SetActive(false); } else { if (btnAmbil != null) btnAmbil.gameObject.SetActive(false); if (btnInteraksi != null) btnInteraksi.gameObject.SetActive(true); } } private void SelesaikanAktivitasTerdekat() { if (aktivitasTerdekat == null) return; SelesaikanAktivitas(aktivitasTerdekat.activityId, aktivitasTerdekat.pesanBerhasil); if (btnAmbil != null) btnAmbil.gameObject.SetActive(false); if (btnInteraksi != null) btnInteraksi.gameObject.SetActive(false); } public void SelesaikanAktivitas(string id, string pesanBerhasil = "") { ActivityData data = CariAktivitas(id); if (data == null) return; if (data.selesai) return; data.selesai = true; data.terlewat = false; string pesan = string.IsNullOrEmpty(pesanBerhasil) ? "Bagus! Aktivitas " + data.namaAktivitas + " selesai." : pesanBerhasil; TampilkanPesan(pesan); UpdateUI(); } //public void CobaKeluarLevel() //{ // sedangDiPintuKeluar = true; // List belumSelesai = daftarAktivitas // .Where(x => x.wajib && !x.selesai) // .ToList(); // if (belumSelesai.Count == 0) // { // TampilkanRekapLevel(false); // return; // } // if (panelKonfirmasiKeluar != null) panelKonfirmasiKeluar.SetActive(true); // if (txtJudulKonfirmasi != null) // txtJudulKonfirmasi.text = "Yakin ingin keluar rumah?"; // if (txtIsiKonfirmasi != null) // { // string isi = "Masih ada aktivitas yang belum dilakukan:\n"; // foreach (ActivityData a in belumSelesai) // { // isi += "- Belum " + a.namaAktivitas + "\n"; // } // isi += "\nJika tetap keluar, aktivitas ini akan tercatat di profil dan poin akan berkurang."; // txtIsiKonfirmasi.text = isi; // } //} //private void KembaliMenyelesaikanAktivitas() //{ // sedangDiPintuKeluar = false; // if (panelKonfirmasiKeluar != null) panelKonfirmasiKeluar.SetActive(false); //} private void TetapKeluarDenganCatatan() { List belumSelesai = daftarAktivitas .Where(x => x.wajib && !x.selesai) .ToList(); foreach (ActivityData a in belumSelesai) { a.terlewat = true; KurangiPoin(a.kategori, a.penaltyJikaTerlewat); } if (panelKonfirmasiKeluar != null) panelKonfirmasiKeluar.SetActive(false); UpdateUI(); TampilkanRekapLevel(true); } public void TerkenaObstacle(ActivityCategory kategori, int penalty, string pesan) { KurangiPoin(kategori, penalty); TampilkanPesan(pesan + "\n-" + penalty + " poin " + NamaKategori(kategori)); UpdateUI(); } private void KurangiPoin(ActivityCategory kategori, int jumlah) { switch (kategori) { case ActivityCategory.SopanSantun: sopanSantun = Mathf.Max(0, sopanSantun - jumlah); break; case ActivityCategory.TanggungJawab: tanggungJawab = Mathf.Max(0, tanggungJawab - jumlah); break; case ActivityCategory.Disiplin: disiplin = Mathf.Max(0, disiplin - jumlah); break; case ActivityCategory.Peduli: peduli = Mathf.Max(0, peduli - jumlah); break; } } private void TampilkanPanelMisi() { if (panelMisi != null) panelMisi.SetActive(true); UpdateUI(); } private void TutupPanelMisi() { if (panelMisi != null) panelMisi.SetActive(false); } private void UpdateUI() { int selesai = daftarAktivitas.Count(x => x.selesai); int total = daftarAktivitas.Count; if (txtTrackerMisi != null) { txtTrackerMisi.text = "Aktivitas: " + selesai + "/" + total + "\nPoin Sopan: " + sopanSantun; } if (txtJudulMisi != null) txtJudulMisi.text = "Aktivitas Level " + namaLevel; if (txtDaftarMisi != null) { string daftar = ""; foreach (ActivityData a in daftarAktivitas) { string tanda = a.selesai ? "☑" : "☐"; daftar += tanda + " " + a.namaAktivitas + "\n"; } txtDaftarMisi.text = daftar; } } private void TampilkanRekapLevel(bool adaYangTerlewat) { if (panelRekapLevel != null) panelRekapLevel.SetActive(true); if (txtJudulRekap != null) txtJudulRekap.text = "Rekap Level " + namaLevel; string selesaiText = ""; string terlewatText = ""; foreach (ActivityData a in daftarAktivitas) { if (a.selesai) selesaiText += "☑ " + a.namaAktivitas + "\n"; else terlewatText += "☒ " + a.namaAktivitas + "\n"; } string predikat = HitungPredikat(); if (txtIsiRekap != null) { txtIsiRekap.text = "Aktivitas selesai:\n" + (selesaiText == "" ? "-" : selesaiText) + "\nAktivitas terlewat:\n" + (terlewatText == "" ? "-" : terlewatText) + "\nPoin Karakter:" + "\nSopan Santun: " + sopanSantun + "\nTanggung Jawab: " + tanggungJawab + "\nDisiplin: " + disiplin + "\nPeduli: " + peduli + "\n\nPredikat Level: " + predikat; } SimpanDataLevel(); } private string HitungPredikat() { int rataRata = Mathf.RoundToInt((sopanSantun + tanggungJawab + disiplin + peduli) / 4f); if (rataRata >= 90) return "Anak Sangat Baik"; if (rataRata >= 80) return "Anak Sopan"; if (rataRata >= 70) return "Cukup Baik"; if (rataRata >= 60) return "Perlu Lebih Teliti"; return "Ayo Belajar Lagi"; } private void SimpanDataLevel() { string prefix = "Level_" + namaLevel + "_"; PlayerPrefs.SetInt(prefix + "SopanSantun", sopanSantun); PlayerPrefs.SetInt(prefix + "TanggungJawab", tanggungJawab); PlayerPrefs.SetInt(prefix + "Disiplin", disiplin); PlayerPrefs.SetInt(prefix + "Peduli", peduli); PlayerPrefs.SetString(prefix + "AktivitasSelesai", string.Join(", ", daftarAktivitas.Where(x => x.selesai).Select(x => x.namaAktivitas))); PlayerPrefs.SetString(prefix + "AktivitasTerlewat", string.Join(", ", daftarAktivitas.Where(x => !x.selesai).Select(x => x.namaAktivitas))); PlayerPrefs.Save(); } private void UlangiLevel() { SceneManager.LoadScene(SceneManager.GetActiveScene().name); } private void LanjutLevel() { if (string.IsNullOrEmpty(sceneBerikutnya)) { Debug.Log("Scene berikutnya belum diisi."); return; } SceneManager.LoadScene(sceneBerikutnya); } private ActivityData CariAktivitas(string id) { return daftarAktivitas.FirstOrDefault(x => x.id == id); } private string NamaKategori(ActivityCategory kategori) { switch (kategori) { case ActivityCategory.SopanSantun: return "Sopan Santun"; case ActivityCategory.TanggungJawab: return "Tanggung Jawab"; case ActivityCategory.Disiplin: return "Disiplin"; case ActivityCategory.Peduli: return "Peduli"; default: return "Karakter"; } } private void TampilkanPesan(string pesan) { if (txtPesanKecil != null) { txtPesanKecil.text = pesan; } Debug.Log(pesan); } }