448 lines
14 KiB
C#
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);
|
|
}
|
|
} |