MIF_E31221357/Assets/Scripts/GameSession.cs

230 lines
6.2 KiB
C#

using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.SceneManagement;
public class GameSession : MonoBehaviour
{
public static GameSession Instance;
private Dictionary<string, int> levelScores = new Dictionary<string, int>();
private Dictionary<string, int> totalScorePerMateri = new Dictionary<string, int>();
public int CurrentScore { get; private set; }
private string currentLevelName;
private string currentMateri;
public bool IsLevelCompleted { get; private set; } = false;
public Dictionary<string, int> TotalScorePerMateri => totalScorePerMateri;
private void Awake()
{
if (Instance == null)
{
Instance = this;
DontDestroyOnLoad(gameObject);
LoadScores();
LoadTotalScorePerMateri();
}
else
{
Destroy(gameObject);
}
}
public void StartLevel(string levelName)
{
//currentLevelName = levelName;
currentLevelName = string.IsNullOrEmpty(levelName) ? SceneManager.GetActiveScene().name : levelName;
currentMateri = GetMateriFromLevelName(currentLevelName);
CurrentScore = 0;
IsLevelCompleted = false;
}
public void AddScore(int value)
{
CurrentScore += value;
}
public void SaveLevelScore()
{
if (!string.IsNullOrEmpty(currentLevelName))
{
if (levelScores.ContainsKey(currentLevelName))
{
if (CurrentScore > levelScores[currentLevelName])
{
levelScores[currentLevelName] = CurrentScore;
PlayerPrefs.SetInt("skor" + currentLevelName, CurrentScore);
}
}
else
{
levelScores[currentLevelName] = CurrentScore;
PlayerPrefs.SetInt("skor" + currentLevelName, CurrentScore);
}
if (LevelControl.Instance != null && LevelControl.Instance.IsLastLevelOfMateri(currentLevelName))
{
RecalculateTotalScoreForMateri(currentMateri); // hitung ulang dari semua level dalam materi
SaveTotalScorePerMateri();
}
PlayerPrefs.Save();
//levelScores[currentLevelName] = CurrentScore;
}
}
public void RecalculateTotalScoreForMateri(string materiName)
{
int total = 0;
if (LevelControl.Instance != null)
{
List<string> levels = LevelControl.Instance.GetLevelsInMateri(materiName);
foreach (string level in levels)
{
total += GetScoreForLevel(level);
}
totalScorePerMateri[materiName] = total;
}
}
public void AddScoreToMateri(string materiName, int scoreToAdd)
{
if (totalScorePerMateri.ContainsKey(materiName))
{
totalScorePerMateri[materiName] += scoreToAdd;
}
else
{
totalScorePerMateri[materiName] = scoreToAdd;
}
}
public string GetMateriFromLevelName(string levelName)
{
if (LevelControl.Instance != null)
return LevelControl.Instance.GetMateriByLevel(levelName);
return "MateriTidakDikenal";
}
public int GetTotalScore()
{
int total = 0;
foreach (var score in levelScores.Values)
{
total += score;
}
return total;
}
public int GetScoreForLevel(string levelName)
{
if (levelScores.ContainsKey(levelName))
{
return levelScores[levelName];
}
return 0;
}
public int GetTotalScoreByMateri(string materiName)
{
int total = 0;
foreach (var entry in levelScores)
{
string levelName = entry.Key;
int score = entry.Value;
string materi = GetMateriFromLevelName(levelName);
if (materi == materiName)
{
total += score;
}
}
return total;
}
private void LoadScores()
{
levelScores.Clear();
int sceneCount = SceneManager.sceneCountInBuildSettings;
for (int i = 0; i < sceneCount; i++)
{
string path = SceneUtility.GetScenePathByBuildIndex(i);
string sceneName = System.IO.Path.GetFileNameWithoutExtension(path);
int score = PlayerPrefs.GetInt("skor" + sceneName, 0);
if (score > 0)
{
levelScores[sceneName] = score;
}
}
}
public void ResetAllScores()
{
levelScores.Clear();
CurrentScore = 0;
int sceneCount = SceneManager.sceneCountInBuildSettings;
for (int i = 0; i < sceneCount; i++)
{
string path = SceneUtility.GetScenePathByBuildIndex(i);
string sceneName = System.IO.Path.GetFileNameWithoutExtension(path);
PlayerPrefs.DeleteKey("skor" + sceneName);
}
foreach (string key in new List<string>(totalScorePerMateri.Keys))
{
PlayerPrefs.DeleteKey("MateriScore" + key);
}
PlayerPrefs.Save();
}
public int GetHighScore(string levelName)
{
return PlayerPrefs.GetInt("skor" + levelName, 0);
}
public void MarkLevelComplete()
{
IsLevelCompleted = true;
}
public void SaveTotalScorePerMateri()
{
foreach (var entry in totalScorePerMateri)
{
PlayerPrefs.SetInt("MateriScore" + entry.Key, entry.Value);
}
}
public void LoadTotalScorePerMateri()
{
totalScorePerMateri.Clear();
int sceneCount = SceneManager.sceneCountInBuildSettings;
for (int i = 0; i < sceneCount; i++)
{
string path = SceneUtility.GetScenePathByBuildIndex(i);
string sceneName = System.IO.Path.GetFileNameWithoutExtension(path);
string materiName = GetMateriFromLevelName(sceneName);
int score = PlayerPrefs.GetInt("MateriScore" + materiName, 0);
if (score > 0)
{
totalScorePerMateri[materiName] = score;
}
}
}
}