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}"); } }