// GameManager.cs - главный скрипт игры, менеджер
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;

// Объявление структур вне классов
public struct Question
{
    public string text;
    public Choice[] choices;
    public int populationType; // 1 - до 100, 2 - до 500, 3 - до 1500, 4 - до 5000, 5 - до 10000

    public Question(string text, Choice[] choices, int populationType)
    {
        this.text = text;
        this.choices = choices;
        this.populationType = populationType;
    }
}

public struct Choice
{
    public string text;
    public int populationChange;
    public int happinessChange;
    public string resultText;

    public Choice(string text, int populationChange, int happinessChange, string resultText)
    {
        this.text = text;
        this.populationChange = populationChange;
        this.happinessChange = happinessChange;
        this.resultText = resultText;
    }
}

public class GameManager : MonoBehaviour
{
    public static GameManager Instance { get; private set; }
    public Question currentQuestion;

    public Text questionText;
    public Text populationText;
    //public Text happinessText;
    public Button button1;
    public Button button2;
    public Button button3;
    public Button button4;
    public GameObject gameOverPanel;

    private bool isChoiceLocked = false;

    public QuestsLogic questsLogic; // Ссылка на скрипт с логикой квестов

    // Панель с инфой о том, на что повлиял выбор
    public Text resultText;
    public GameObject resultPanel;
    public Button understandButton;

    // Переменные для случайных событий
    public GameObject randomEventsPanel;
    public Text randomEventText;
    public Button understandEventButton;
    private int questionsUntilNextEvent;

    public Text proftiInfoText;

    private bool bonusPopulationApplied = false;

    // Скролбар счастья
    public Scrollbar HappinessScrollbar; // Ссылка на Scrollbar для отображения счастья
    public Text happinessText;         // Ссылка на текст внутри Scrollbar

    // Советник
    public Advisor advisor;
    private bool isAdvisorAvailable = false;
    public GameObject advisorAvailabilityMessage; // Ссылка на объект с сообщением о доступности советника

    //Показатели поселения
    public int population = 20;
    private int happiness = 50;

    void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
        }
        else
        {
            Destroy(gameObject);
        }

        // Затем назначаем обработчик события для advisor
        if (advisor != null) // Проверяем, что advisor назначен в инспекторе
        {
            advisor.advisorIcon.GetComponent<Button>().onClick.AddListener(() =>
                advisor.GiveAdvice(currentQuestion));
        }
        else
        {
            Debug.LogError("Ошибка: Advisor не назначен в инспекторе GameManager!");
        }
    }

    void Start()
    {
        questsLogic.Initialize();
        UpdatePopulationText();
        UpdateHappinessText();
        gameOverPanel.SetActive(false);
        resultPanel.SetActive(false);
        randomEventsPanel.SetActive(false);
        questionsUntilNextEvent = Random.Range(2, 4);
        resultPanel.SetActive(false);
        proftiInfoText.gameObject.SetActive(false); // Скрываем текст
        advisor.advisorIcon.GetComponent<Button>().onClick.AddListener(() =>
            advisor.GiveAdvice(currentQuestion));
        UpdateAdvisorAvailability();
        DisplayQuestion();
    }

    // Вызывается из QuestsLogic, когда нужно отобразить вопрос
    public void DisplayQuestion()
    {
        // Проверяем, нужно ли показать случайное событие
        if (questionsUntilNextEvent <= 0)
        {
            ShowRandomEvent();
        }
        else
        {
            // Логика отображения вопроса, если событие не показывается
            currentQuestion = questsLogic.GetCurrentQuestion();

            if (currentQuestion.text != null)
            {
                questionText.text = currentQuestion.text;

                button1.GetComponentInChildren<Text>().text = currentQuestion.choices[0].text;
                button1.onClick.RemoveAllListeners();
                button1.onClick.AddListener(() => MakeChoice(0));

                button2.GetComponentInChildren<Text>().text = currentQuestion.choices[1].text;
                button2.onClick.RemoveAllListeners();
                button2.onClick.AddListener(() => MakeChoice(1));

                button3.GetComponentInChildren<Text>().text = currentQuestion.choices[2].text;
                button3.onClick.RemoveAllListeners();
                button3.onClick.AddListener(() => MakeChoice(2));

                button4.GetComponentInChildren<Text>().text = currentQuestion.choices[3].text;
                button4.onClick.RemoveAllListeners();
                button4.onClick.AddListener(() => MakeChoice(3));
            }
            else
            {
                GameOver("Вы прошли все испытания и привели свое поселение к процветанию!");
            }

            questionsUntilNextEvent--; // Уменьшаем счетчик после показа вопроса
        }
    }



    public AudioSource audioSource;
    public AudioClip fxMinusPeople;
    public AudioClip fxMinusHappy;
    public AudioClip fxPlusHappy;
    public AudioClip fxPlusPeople;
    public AudioClip fxGameOver;

    public void MakeChoice(int index)
    {
        if (isChoiceLocked) return;

        advisor.HideAdvice();

        Choice chosenChoice = questsLogic.MakeChoice(index, currentQuestion);

        population += chosenChoice.populationChange;
        UpdateAdvisorAvailability();
        happiness += chosenChoice.happinessChange;
        resultText.text = chosenChoice.resultText;

        // Форматируем текст с учётом знака изменений:
        string populationChangeText = chosenChoice.populationChange > 0
            ? $"<color=green>+{chosenChoice.populationChange} население</color>"
            : $"<color=red>{chosenChoice.populationChange} население</color>";
        string happinessChangeText = chosenChoice.happinessChange > 0
            ? $"<color=green>+{chosenChoice.happinessChange} счастье</color>"
            : $"<color=red>{chosenChoice.happinessChange} счастье</color>";

        // Отображаем изменения в proftiInfoText:
        proftiInfoText.text = $"{populationChangeText}\n{happinessChangeText}";

        PlayChoiceSound(chosenChoice);

        // --- Начало блока обработки бонуса за счастье ---
        if (happiness >= 100 && !bonusPopulationApplied && chosenChoice.happinessChange != 100)
        {
            population++;
            bonusPopulationApplied = true;
            Debug.Log("Бонус +1 к населению за счастье!");
        }
        else if (happiness < 100)
        {
            bonusPopulationApplied = false;
        }
        // --- Конец блока обработки бонуса за счастье ---

        isChoiceLocked = true; // Блокируем кнопки после выбора
        StartCoroutine(ShowResultAndContinue(2f));
    }

    private void PlayChoiceSound(Choice choice)
    {
        if (choice.populationChange < 0 && Mathf.Abs(choice.populationChange) > Mathf.Abs(choice.happinessChange))
        {
            audioSource.PlayOneShot(fxMinusPeople);
        }
        else if (choice.happinessChange < 0 && Mathf.Abs(choice.happinessChange) > Mathf.Abs(choice.populationChange))
        {
            audioSource.PlayOneShot(fxMinusHappy);
        }
        else if (choice.happinessChange > 0 && choice.happinessChange > choice.populationChange)
        {
            audioSource.PlayOneShot(fxPlusHappy);
        }
        else if (choice.populationChange > 0 && choice.populationChange > choice.happinessChange)
        {
            audioSource.PlayOneShot(fxPlusPeople);
        }
    }

    private void UpdateAdvisorAvailability()
    {
        if (population >= 100)
        {
            isAdvisorAvailable = true;
            advisor.advisorIcon.SetActive(true);

            // Отображаем сообщение о доступности советника
            advisorAvailabilityMessage.SetActive(true);
            StartCoroutine(HideAvailabilityMessage(5f)); // Скрываем сообщение через 5 секунд
        }
    }
    private IEnumerator HideAvailabilityMessage(float delay)
    {
        yield return new WaitForSeconds(delay);
        advisorAvailabilityMessage.SetActive(false);
    }
    private IEnumerator ShowResultAndContinue(float delay)
    {
        // Открываем панель результата
        resultPanel.SetActive(true);
        understandButton.onClick.RemoveAllListeners();
        proftiInfoText.gameObject.SetActive(true);

        // Ждём нажатия кнопки “Понял”
        bool understood = false;
        understandButton.onClick.AddListener(() => understood = true);

        // Пока кнопку не нажали, ждём
        yield return new WaitUntil(() => understood);

        // Скрываем текст вместе с панелью результатов:
        resultPanel.SetActive(false);
        proftiInfoText.gameObject.SetActive(false);

        // Очищаем результат
        resultText.text = "";
        UpdatePopulationText();
        UpdateHappinessText();

        if (happiness <= 0)
        {
            GameOver("Ваше поселение погрузилось в хаос и отчаяние!");
        }
        else if (population <= 1)
        {
            GameOver("Ваше поселение погибло!");
        }
        else
        {
            resultPanel.SetActive(false);
            isChoiceLocked = false;
            DisplayQuestion();
        }
    }

    private void UpdatePopulationText()
    {
        populationText.text = "Население: " + population;
    }

    private void UpdateHappinessText()
    {
        // Ограничиваем счастье до 100
        happiness = Mathf.Clamp(happiness, 0, 100);

        // Обновляем значение Scrollbar (от 0 до 1)
        HappinessScrollbar.value = happiness / 100f;

        // Обновляем текстовое значение
        happinessText.text = "Счастье: " + happiness;
    }

    private void GameOver(string message)
    {
        gameOverPanel.SetActive(true);
        gameOverPanel.transform.Find("Text").GetComponent<Text>().text = message;

        audioSource.PlayOneShot(fxGameOver);
    }

    private void ShowRandomEvent()
    {

        randomEventsPanel.SetActive(true);
        RandomEvent eventData = GetRandomEvent();
        randomEventText.text = eventData.text;

        population += eventData.populationChange;
        happiness += eventData.happinessChange;

        PlayChoiceSound(new Choice("", eventData.populationChange, eventData.happinessChange, ""));

        UpdatePopulationText();
        UpdateHappinessText();

        understandEventButton.onClick.RemoveAllListeners();
        understandEventButton.onClick.AddListener(() =>
        {
            randomEventsPanel.SetActive(false);
            questionsUntilNextEvent = Random.Range(4, 11);
            DisplayQuestion();
        });
    }

    // Структура для хранения данных о случайном событии
    public struct RandomEvent
    {
        public string text;
        public int populationChange;
        public int happinessChange;

        public RandomEvent(string text, int populationChange, int happinessChange)
        {
            this.text = text;
            this.populationChange = populationChange;
            this.happinessChange = happinessChange;
        }
    }

    // Список возможных случайных событий
    private List<RandomEvent> randomEvents = new List<RandomEvent>()
    {
        // Положительные события
        new RandomEvent("В другом поселении случился конфликт! Люди перешли к вам", 10, 0),
        new RandomEvent("Группа торговцев решила обосноваться в вашем поселении", 5, 2),
        new RandomEvent("Праздник урожая! Люди счастливы!", 0, 10),
        new RandomEvent("К вам прибился отряд опытных воинов!", 5, 5),
        new RandomEvent("В лесу обнаружены богатые залежи ягод и грибов!", 0, 15),
        new RandomEvent("Рождаемость в поселении резко увеличилась!", 20, 10),
        new RandomEvent("Странствующий лекарь исцелил больных!", 5, 20),
        new RandomEvent("Ваши охотники добыли огромного зверя!", 0, 10),
        new RandomEvent("Найдено старое хранилище с припасами!", 10, 5),
        new RandomEvent("Соседнее поселение прислало дары в знак дружбы!", 5, 5),

        // Нейтральные события
        new RandomEvent("Стая волков прошла неподалеку от поселения.", 0, -2),
        new RandomEvent("Несколько дней шли проливные дожди.", 0, -1),
        new RandomEvent("В поселении родился ребенок.", 1, 1),
        new RandomEvent("Один из жителей пропал без вести.", -1, -2),
        new RandomEvent("Произошел небольшой пожар, но его быстро потушили.", -2, -3),
        new RandomEvent("В поселении произошла драка между жителями.", 0, -5),
        new RandomEvent("К вам пришел старый мудрец и рассказал интересную историю.", 0, 2),
        new RandomEvent("Несколько жителей заболели простудой.", -2, -2),
        new RandomEvent("Ваши разведчики обнаружили заброшенную хижину.", 0, 1),
        new RandomEvent("Произошло солнечное затмение.", 0, -1),

        // Отрицательные события
        new RandomEvent("Неурожай, спасите людей!", -10, -5),
        new RandomEvent("Эпидемия! Нужно срочно что-то делать!", -15, -10),
        new RandomEvent("На поселение напали бандиты!", -10, -15),
        new RandomEvent("Зима пришла раньше обычного, начались заморозки.", -5, -10),
        new RandomEvent("Запасы воды на исходе, река обмелела.", -5, -5),
        new RandomEvent("В поселении завелись крысы, которые портят запасы еды.", -3, -5),
        new RandomEvent("Произошло землетрясение, есть разрушения.", -10, -20),
        new RandomEvent("Один из жителей сошел с ума и напал на других.", -3, -10),
        new RandomEvent("Группа жителей решила покинуть поселение.", -5, -2),
        new RandomEvent("В поселении объявился предатель, который сотрудничает с бандитами.", -2, -10)
    };

    // Метод для получения случайного события из списка
    private RandomEvent GetRandomEvent()
    {
        int randomIndex = Random.Range(0, randomEvents.Count);
        return randomEvents[randomIndex];
    }
}

Это код для моей квествой игры на Unity. По какой-то причине советник не появляется на экране вместе с сообщением о том, что он доступен (ПОЯВЛЯЕТСЯ ТОЛЬКО СООБЩЕНИЕ, а иконка с ним нет) - после того, как население начинает превышать 100 человек. Изначально иконка с ним в инспекторе Unity выключена. Тщательно проанализируй код, проинспектируй все возможные варианты ошибок, багов и недочётов кода. Найди решение проблемы и ответь мне как это сделать