// SettlementDiplomacy.cs - Логика поиска поселений и дипломатии
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.SceneManagement;

public class SettlementDiplomacy : MonoBehaviour
{
    public Button diplomacyButton; // Кнопка "Дипломатия" x
    public GameObject findSettlementPanel; // Панель поиска поселений x
    public Text findSettlementText; // Текст на панели поиска x
    public Image progressBar; // Индикатор прогресса поиска x
    public GameObject diplomacyPanel; // Панель дипломатии с найденным поселением x
    public Text settlementNameText; // Текст с названием поселения x
    public Text settlementPopulationText; // Текст с количеством жителей поселения x
    public Text settlementRelationText; // Текст с отношением к поселению x
    public Text settlementDescriptionText; // Текст с описанием поселения x
    public Button tradeButton; // Кнопка "Обмен опытом"
    public Button improveRelationButton; // Кнопка "Улучшить отношения"
    public Button conquerButton; // Кнопка "Захватить"
    public Button ignoreButton; // Кнопка "Обойти стороной"
    public GameObject gameOverPanel; // Панель Game Over
    public Text gameOverText; // Текст на панели Game Over
    public Button mainMenuButton; // Кнопка "Главное меню"

    public GameObject settlementsListPanel; // Панель списка поселений
    public Transform settlementsListContent; // Контент списка поселений (место для элементов списка)
    public GameObject settlementListItemPrefab; // Префаб элемента списка поселений
    public Button closeListButton; // Закрываем список поселений

    public GameManager gameManager; // Ссылка на GameManager

    private List<Settlement> settlements = new List<Settlement>(); // Список найденных поселений
    private List<Settlement> activeTrades = new List<Settlement>(); //
    private Settlement currentSettlement; // Текущее выбранное поселение

    private bool isCurrentSettlementSet = false;


    // Изменяем struct на class
    [System.Serializable]
    public class Settlement
    {
        public string name;
        public int population;
        public SettlementRelation relation;
        public string description;
        public SettlementStatus status;
    }

    // Перечисление для отношения к поселению
    public enum SettlementRelation
    {
        Hostile,
        Neutral,
        Friendly
    }

    // Перечисление для статуса отношений с поселением
    public enum SettlementStatus
    {
        None,
        Trade,
        War
    }

    void Start()
    {
        diplomacyButton.onClick.AddListener(StartFindSettlement);
        diplomacyPanel.SetActive(false);
        gameOverPanel.SetActive(false);

        // Проверяем, назначена ли кнопка в инспекторе
        if (mainMenuButton != null)
        {
            // Добавляем обработчик события OnClick
            mainMenuButton.onClick.AddListener(GoToMainMenu);
        }
        else
        {
            Debug.LogError("Ошибка: кнопка 'mainMenuButton' не назначена в инспекторе!");
        }

        // Назначаем обработчики кнопок один раз при старте
        tradeButton.onClick.AddListener(OnTradeButtonClicked);
        improveRelationButton.onClick.AddListener(OnImproveRelationButtonClicked);
        conquerButton.onClick.AddListener(OnConquerButtonClicked);
        ignoreButton.onClick.AddListener(IgnoreSettlement);
        closeListButton.onClick.AddListener(CloseList);

        currentSettlement = new Settlement(); // Инициализируем структуру
    }

    // Начало поиска поселения
    private void StartFindSettlement()
    {
        findSettlementPanel.SetActive(true);
        findSettlementText.text = "Поиск поселений...";
        progressBar.fillAmount = 0f;
        StartCoroutine(FindSettlement());
    }

    // Корутина для имитации поиска поселения
    private IEnumerator FindSettlement()
    {
        float timer = 0f;
        while (timer < 5f)
        {
            timer += Time.deltaTime;
            progressBar.fillAmount = timer / 5f;
            yield return null;
        }

        // После завершения поиска - рандомный результат
        if (Random.value < 0.5f)
        {
            findSettlementText.text = "Поиск успешен!";
            Settlement newSettlement = GenerateSettlement(); // Генерируем случайное поселение
            settlements.Add(newSettlement);
            OpenDiplomacyPanel(newSettlement); // Открываем панель дипломатии
        }
        else
        {
            findSettlementText.text = "Отряд поисковиков погиб! -6 человек и -3 счастья населения";
            gameManager.population -= 6;
            gameManager.happiness -= 3;
            gameManager.UpdatePopulationText();
            gameManager.UpdateHappinessText();
        }

        yield return new WaitForSeconds(2f); // Пауза для просмотра результата
        findSettlementPanel.SetActive(false); // Скрываем панель поиска
    }

    // Генерация случайного поселения
    private Settlement GenerateSettlement()
    {
        Settlement settlement = new Settlement();

        // Список имён для поселений
        string[] settlementNames = {
            "Союз Выживших", "Братство Воды", "Стальной Кулак",
            "Новое Начало", "Оазис Надежды", "Стражи Свободы",
            "Дети Атома", "Хранители Знаний", "Потомки Солнца",
            "Лига Справедливости", "Анклав" // Добавьте больше имён по желанию!
        };

        // Список описаний для поселений
        string[] settlementDescriptions = {
            "Мирное поселение тороговцев и ремесленников.",
            "Группа воинов, защищающих слабые поселения.",
            "Поселение обосновалось вокруг старого военного бункера.",
            // ... добавьте больше описаний!
        };

        settlement.name = settlementNames[Random.Range(0, settlementNames.Length)];
        settlement.population = Random.Range(100, 1000);
        settlement.relation = (SettlementRelation)Random.Range(0, 3);
        settlement.description = settlementDescriptions[Random.Range(0, settlementDescriptions.Length)];
        settlement.status = SettlementStatus.None;

        return settlement;
    }

    // Открытие панели дипломатии
    private void OpenDiplomacyPanel(Settlement settlement)
    {
        currentSettlement = settlement; // Сохраняем текущее поселение
        isCurrentSettlementSet = true; // Устанавливаем флаг в true

        diplomacyPanel.SetActive(true);
        settlementNameText.text = settlement.name;
        settlementPopulationText.text = "Население: " + settlement.population;
        settlementRelationText.text = "Отношение: " + settlement.relation;
        settlementDescriptionText.text = settlement.description;

        // Обновляем доступность кнопки "Обмен опытом"
        tradeButton.interactable = settlement.relation == SettlementRelation.Friendly;
        tradeButton.interactable = settlement.relation == SettlementRelation.Friendly && !activeTrades.Contains(settlement);

        // Обновляем доступность кнопки "Улучшить отношения"
        improveRelationButton.interactable = settlement.relation != SettlementRelation.Friendly;

        // Ищем компонент Text на кнопке или её потомках
        Text tradeButtonText = tradeButton.GetComponentInChildren<Text>();

        // Проверяем, найден ли компонент Text
        if (tradeButtonText != null)
        {
            tradeButtonText.color = settlement.relation == SettlementRelation.Friendly ? Color.white : Color.gray;
        }
        else
        {
            Debug.LogError("Компонент Text не найден на кнопке 'tradeButton' или её потомках!");
        }

        UpdateConquerButtonInteractable();
    }

    // Обработчики кнопок
    private void OnTradeButtonClicked()
    {
        if (isCurrentSettlementSet && currentSettlement.relation == SettlementRelation.Friendly)
        {
            activeTrades.Add(currentSettlement);
            StartCoroutine(TradeExperience(currentSettlement));

            // Обновляем статус поселения в списке settlements
            UpdateSettlementStatus(currentSettlement.name, SettlementStatus.Trade);

            OpenSettlementsListPanel();
            diplomacyPanel.SetActive(false);
            isCurrentSettlementSet = false;
        }
    }

    private void OnImproveRelationButtonClicked()
    {
        if (isCurrentSettlementSet)
        {
            ImproveRelation(currentSettlement);

            // Обновляем статус поселения в списке settlements
            UpdateSettlementStatus(currentSettlement.name, SettlementStatus.None);

            OpenSettlementsListPanel();
            diplomacyPanel.SetActive(false);
            isCurrentSettlementSet = false;
        }
    }

    private void OnConquerButtonClicked()
    {
        Debug.Log("Кнопка 'Захватить' нажата");

        if (isCurrentSettlementSet && currentSettlement.relation == SettlementRelation.Hostile)
        {
            Debug.Log("Поселение выбрано и враждебно");

            // Проверяем, достаточно ли у игрока населения для войны
            if (gameManager.population >= currentSettlement.population) // Если у игрока больше населения
            {
                if (currentSettlement.status == SettlementStatus.None) // Проверка на отсутствие активной войны
                {
                    // Обновляем статус поселения в списке settlements
                    UpdateSettlementStatus(currentSettlement.name, SettlementStatus.War);

                    StartConquest(currentSettlement);

                    StartCoroutine(ConquerSettlement(currentSettlement));
                    OpenSettlementsListPanel();
                    diplomacyPanel.SetActive(false);
                    isCurrentSettlementSet = false;
                }
                else
                {
                    Debug.Log($"Война с {currentSettlement.name} уже идет!");
                }
            }
            else
            {
                // Вывод сообщения о том, что у игрока недостаточно населения
                Debug.Log($"У вас недостаточно населения для войны с {currentSettlement.name}!");
            }
        }
    }

    private void UpdateConquerButtonInteractable()
    {
        if (isCurrentSettlementSet) // Проверка, есть ли выбранное поселение
        {
            // Кнопка "Захватить" активна, если у игрока больше населения
            conquerButton.interactable = gameManager.population >= currentSettlement.population;
        }
        else
        {
            conquerButton.interactable = false; // Кнопка неактивна, если поселение не выбрано
        }
    }


    // Обмен опытом
    private void StartTrade(Settlement settlement)
    {
        // Проверяем, что отношения с поселением дружественные
        if (settlement.relation == SettlementRelation.Friendly)
        {
            // Запускаем корутину для обмена опытом
            StartCoroutine(TradeExperience(settlement));
            OpenSettlementsListPanel();
        }

    }

    private IEnumerator TradeExperience(Settlement settlement)
    {
        // Проверка условий для обмена
        if (settlement.relation != SettlementRelation.Friendly || !activeTrades.Contains(settlement))
        {
            Debug.Log("Невозможно обмениватсья опытом с поселением, без дружеских отношений.");
            yield break; // Прекращаем корутину
        }

        activeTrades.Add(settlement);

        while (true)
        {
            gameManager.population += 5;
            gameManager.happiness += 10;
            gameManager.UpdatePopulationText();
            gameManager.UpdateHappinessText();

            // Добавить звук или анимацию для обмена

            yield return new WaitForSeconds(30);

            // Удаляем поселение из списка активных обменов:
            activeTrades.Remove(settlement);
        }
    }

    // Улучшение отношений
    private void ImproveRelation(Settlement settlement)
    {
        if (settlement.relation == SettlementRelation.Hostile)
        {
            // Попытка установить нейтральные отношения
            settlement.relation = SettlementRelation.Neutral;
            settlementRelationText.text = "Отношение: " + SettlementRelation.Neutral;

            // Вывод сообщения о том, что отношения стали нейтральными
            Debug.Log($"Отношения с {settlement.name} стали нейтральными.");

            // Добавьте визуальный эффект или звук для изменения отношений
        }
        else if (settlement.relation == SettlementRelation.Neutral)
        {
            // Попытка установить дружеские отношения
            // 50/50 шанс успеха
            if (Random.value < 0.5f)
            {
                settlement.relation = SettlementRelation.Friendly;
                settlementRelationText.text = "Отношение: " + SettlementRelation.Friendly;

                // Вывод сообщения о том, что отношения стали дружескими
                Debug.Log($"Отношения с {settlement.name} стали дружескими.");

                // Добавьте визуальный эффект или звук для изменения отношений
            }
            else
            {
                // Отношения остаются нейтральными
                settlementRelationText.text = "Отношение: " + SettlementRelation.Neutral;

                // Вывод сообщения о том, что отношения не изменились
                Debug.Log($"Попытка улучшить отношения с {settlement.name} провалилась.");

                // Добавьте визуальный эффект или звук для провала попытки
            }
        }
        else if (settlement.relation == SettlementRelation.Friendly)
        {
            // Вывод сообщения о том, что отношения уже дружеские
            Debug.Log($"Отношения с {settlement.name} уже дружеские.");
        }
    }

    // Начало захвата
    private void StartConquest(Settlement settlement)
    {
        // Проверяем, что отношения с поселением враждебные
        if (settlement.relation == SettlementRelation.Hostile)
        {
            settlement.status = SettlementStatus.War;
            StartCoroutine(ConquerSettlement(settlement));
        }
    }

    // Корутина для захвата поселения
    private IEnumerator ConquerSettlement(Settlement settlement)
    {
        // Сохраняем начальное население
        int initialPopulation = settlement.population;
        int playerInitialPopulation = gameManager.population;
        float timer = 0f;
        while (timer < 60f) // 1 минута войны
        {
            timer += Time.deltaTime;

            // Потери населения в зависимости от времени
            int playerLoss = Random.Range(50, 150);
            int enemyLoss = Random.Range(100, 500);

            gameManager.population -= playerLoss;
            settlement.population -= enemyLoss;
            gameManager.UpdatePopulationText();

            // Добавить визуальные эффекты и звуки для войны 

            if (settlement.population <= 0)
            {
                // Победа! 70% населения вражеского поселения
                settlement.status = SettlementStatus.None;
                settlement.population = Mathf.Max(1, (int)(initialPopulation * 0.7f));
                gameManager.population += settlement.population;
                settlementRelationText.text = "Отношение: " + SettlementRelation.Friendly;
                settlementDescriptionText.text = "Поселение захвачено!";
                settlement.relation = SettlementRelation.Friendly;
                settlement.description = "Поселение присоединилось к вам!";
                settlement.status = SettlementStatus.None;
                break;
            }

            if (gameManager.population <= 0)
            {
                // Game Over - вы проиграли войну
                gameManager.population = 0;
                GameOver("Вы проиграли войну!");
                yield break; // Прекращаем корутину
            }

            // Если у игрока меньше населения - проигрыш войны
            if (gameManager.population < playerInitialPopulation)
            {
                settlement.status = SettlementStatus.None;
                GameOver("Вы проиграли войну!");
                break;
            }

            yield return new WaitForSeconds(30);
        }
    }

    // Игнорирование поселения
    private void IgnoreSettlement()
    {
        diplomacyPanel.SetActive(false);
        isCurrentSettlementSet = false;
    }

    // Открытие панели списка поселений
    public void OpenSettlementsListPanel()
    {
        settlementsListPanel.SetActive(true);

        // Очистка предыдущего списка
        foreach (Transform child in settlementsListContent.transform)
        {
            Destroy(child.gameObject);
        }

        // Заполнение списка найденными поселениями
        foreach (Settlement settlement in settlements) // Используем settlements напрямую
        {
            GameObject listItem = Instantiate(settlementListItemPrefab, settlementsListContent);
            listItem.GetComponentInChildren<Text>().text = $"{settlement.name} ({settlement.relation}, {settlement.status})";

            // Добавляем обработчик нажатия на элемент списка
            listItem.GetComponent<Button>().onClick.AddListener(() =>
            {
                OpenDiplomacyPanel(settlement);
                settlementsListPanel.SetActive(false);
            });
        }
    }

    public void CloseList()
    {
        settlementsListPanel.SetActive(false);
    }

    // Game Over
    private void GameOver(string message)
    {
        gameOverPanel.SetActive(true);
        gameOverText.text = message;
        diplomacyButton.interactable = false;
    }

    // Функция для обновления статуса поселения в списке settlements
    private void UpdateSettlementStatus(string settlementName, SettlementStatus newStatus)
    {
        // Создаем копию списка settlements
        List<Settlement> settlementsCopy = new List<Settlement>(settlements);

        // Находим индекс поселения в списке settlementsCopy
        int index = settlementsCopy.FindIndex(s => s.name == settlementName);

        // Если поселение найдено, обновляем его статус в settlementsCopy
        if (index != -1)
        {
            settlementsCopy[index].status = newStatus;
        }

        // Заменяем исходный список settlements на измененную копию
        settlements = settlementsCopy;
    }

    public void GoToMainMenu()
    {
        SceneManager.LoadScene("SampleScene");
    }
}

Это код скрипта моей квестовой игры на движке Unity. Найди в нём баги, ошибки  и нелогичные моменты