MIF_E31230101/Assets/Script Manager/RPG_Revisi/LevelActivityManager.cs

448 lines
14 KiB
C#

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<ActivityData> daftarAktivitas = new List<ActivityData>();
[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<ActivityData>
{
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<ActivityData> 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<ActivityData> 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);
}
}