using UnityEngine;
public static class DifficultyManager
{
private const string ChanceKey = "BotChance"; // текущий шанс (храним как string)
private const string MaxChanceKey = "BotMaxChance"; // ключ для максимума (тоже string)
private const int DefaultMaxChance = 1000; // дефолтный максимум
// Подпишемся на событие TextInput.OnTextChanged при первой загрузке класса
static DifficultyManager()
{
// Защита: TextInput может отсутствовать в рантайме (например при сборке без UI) — используем try/catch
try
{
TextInput.OnTextChanged += OnTextInputChanged;
}
catch { }
}
// Обработчик события: если текущий Chance > Max — подгоняем
private static void OnTextInputChanged()
{
int current = GetChance();
int max = GetMaxChance();
if (current > max)
{
PlayerPrefs.SetString(ChanceKey, max.ToString());
PlayerPrefs.Save();
Debug.Log($"DifficultyManager: adjusted Chance from {current} to Max {max} due to TextInput change.");
}
}
// Получаем MaxChance — читаем как строку, парсим в int, защищаемся от некорректных значений
public static int GetMaxChance()
{
string stored = PlayerPrefs.GetString(MaxChanceKey, DefaultMaxChance.ToString());
if (int.TryParse(stored, out int max))
{
if (max < 0) max = DefaultMaxChance;
return max;
}
// Некорректное значение — восстановим дефолт и вернём его
PlayerPrefs.SetString(MaxChanceKey, DefaultMaxChance.ToString());
PlayerPrefs.Save();
return DefaultMaxChance;
}
///
/// Получаем текущее значение шанса победы.
/// Читаем строку, парсим в int; поддерживаем миграцию со старых форматов (int/строка).
/// Ограничиваем сверху GetMaxChance().
///
public static int GetChance()
{
int max = GetMaxChance();
// Сначала попытаемся прочитать как строку
string storedStr = PlayerPrefs.GetString(ChanceKey, "");
if (!string.IsNullOrEmpty(storedStr))
{
if (int.TryParse(storedStr, out int parsed))
{
parsed = Mathf.Clamp(parsed, 0, max);
// Сохраняем как строку (на случай, если формат был неконсистентен)
PlayerPrefs.SetString(ChanceKey, parsed.ToString());
PlayerPrefs.Save();
return parsed;
}
// Если строка не парсится, попытаемся считать int на всякий случай (миграция из предыдущих версий)
}
// Попытка прочитать как int (на случай, если ранее использовали GetInt)
int storedInt = PlayerPrefs.GetInt(ChanceKey, max);
storedInt = Mathf.Clamp(storedInt, 0, max);
// Сохраним как строку для единообразия
PlayerPrefs.SetString(ChanceKey, storedInt.ToString());
PlayerPrefs.Save();
return storedInt;
}
///
/// Уменьшаем шанс (после события)
///
public static void DecreaseChance()
{
int current = GetChance();
if (current > 0)
{
current--;
PlayerPrefs.SetString(ChanceKey, current.ToString());
PlayerPrefs.Save();
}
}
///
/// Сбрасываем шанс до текущего MaxChance
///
public static void ResetChance()
{
int max = GetMaxChance();
PlayerPrefs.SetString(ChanceKey, max.ToString());
PlayerPrefs.Save();
}
///
/// Принудительно синхронизирует текущий шанс с максимальным: BotChance := BotMaxChance
/// Используется, когда нужно обновить значение извне сразу.
///
public static void SyncChanceToMax()
{
int max = GetMaxChance();
PlayerPrefs.SetString(ChanceKey, max.ToString());
PlayerPrefs.Save();
Debug.Log($"DifficultyManager: Synced BotChance to BotMaxChance = {max}");
}
}