private void OnEnable()
    {
        UpdateActions();
        Redraw();

        var scenario = GameObject.FindGameObjectWithTag("TutorialHandler")?.GetComponent <Scenario>();

        // тутор для добавления пакета семян
        if (QSReader.Create("TutorialState").Exists("Tutorial_BuyItem_Played"))
        {
            scenario?.Tutorial_AddItem();
        }

        // тутор для выбора пакета семян для замены
        else if (QSReader.Create("TutorialState").Exists("Tutorial_HarvestPlace_Played"))
        {
            scenario?.Tutorial_ChooseItemToReplace();
        }

        // тутор для инвентаря
        else if (QSReader.Create("TutorialState").Exists("Tutorial_BeginningChoice_Played"))
        {
            scenario?.Tutorial_Inventory();
        }
    }
Beispiel #2
0
    public void Load()
    {
        var reader = QSReader.Create("Market");

        PriceMultipliers = LoadPriceMultipliers(reader);
        _lastRefreshDate = reader.Exists("LastDate") ? reader.Read <DateTime>("LastDate") : DateTime.Today;
    }
    public void Clicked()
    {
        InventoryFrame.GetComponent <InventoryDrawer>().GrowPlace = SelectButton;
        InventoryFrame.GetComponent <InventoryDrawer>().SetPurpose(PurposeOfDrawing.AddToLab);
        InventoryFrame.gameObject.SetActive(true);
        if (SceneManager.GetActiveScene().buildIndex != 4 &&
            SecondButton.GetComponent <LabButton>().NowSelected != null)
        {
            InventoryFrame.Redraw(filter_RussianName: SecondButton.GetComponent <LabButton>().NowSelected.NameInRussian);
        }

        var scenario = GameObject.FindGameObjectWithTag("TutorialHandler")?.GetComponent <Scenario>();

        // тутор для выбора семечка 2
        if (QSReader.Create("TutorialState").Exists("Tutorial_HybridPanelSecond_Played"))
        {
            scenario?.Tutorial_ChooseItemToCrossSecond();
        }

        // тутор для выбора семечка 1
        if (QSReader.Create("TutorialState").Exists("Tutorial_HybridPanel_Played"))
        {
            scenario?.Tutorial_ChooseItemToCrossFirst();
        }
    }
    /// <summary>
    /// Меняет сцену
    /// </summary>
    /// <param name="sceneNum">Номер следующей сцены</param>
    public void ChangeScene(int sceneNum)
    {
        try
        {
            // проверка на первый заход в игру
            if (!QSReader.Create("GameState").Exists("GameInitialised") &&
                RewatchBeginningBtn != null)
            {
                ClearGameData.ClearAll();
                InitializeBeginning();
            }
            else
            {
                if (sceneNum == 0)
                {
                    GameObject obj = GameObject.Find("player");
                    Destroy(obj);
                }

                SceneManager.LoadScene(sceneNum);
            }
        }
        catch (Exception ex)
        {
            debugtext.GetComponent <Text>().text = ex.Message;
        }
    }
Beispiel #5
0
    /// <summary>
    /// Садит семечко на грядку.
    /// </summary>
    /// <param name="seed">Семечко.</param>
    public void PlantIt(Seed seed)
    {
        if (_inventory.Energy <= 0)
        {
            _inventory.GetComponent <NotificationCenter>()
            ?.Show("Недостаточно энергии!");
            return;
        }

        _inventory.ConsumeEnergy(1);
        isOccupied               = true;
        timerNeeded              = true;
        timerBGImage.enabled     = true;
        infoContainerOpenedTimes = 0;
        growingSeed              = seed;
        time = seed.GrowTime;

        SetSeedSpeed(seed);
        SavePlanting(seed);

        var scenario = GameObject.FindGameObjectWithTag("TutorialHandler")?.GetComponent <Scenario>();

        // тутор для роста семечка
        if (QSReader.Create("TutorialState").Exists("Tutorial_StatPanel_Played"))
        {
            scenario.Tutorial_WaitForGrowing();
        }
    }
    private void Load()
    {
        var reader = QSReader.Create("Quantum");

        cooldownEnd = reader.Exists("CooldownEnd") ?
                      reader.Read <DateTime>("CooldownEnd") :
                      DateTime.Now;
    }
    /// <summary>
    /// Загружает сохранённое время окончания кулдауна
    /// </summary>
    private void LoadCooldownTime()
    {
        var reader = QSReader.Create("Tasks");

        cooldownEnd = reader.Exists("CooldownEnd")
            ? reader.Read <DateTime>("CooldownEnd")
            : DateTime.Now;
    }
    public void Tutorial_Beginning()
    {
        switch (SceneManager.GetActiveScene().buildIndex)
        {
        case 1:
            // тутор для третьего захода в меню выбора
            if (QSReader.Create("TutorialState").Exists("Tutorial_LabEnding_Played"))
            {
                ExecuteTutorialPart("ChoiceThird", lastPart: true, narratorPhrases: new[]
                {
                    "С этого момента вы можете исследовать всё сами! Приятной игры! P. S. Обязательно загляните в К.В.А.Н.Т. При скрещивании разных растений получаются очень смешные названия :)"
                });
            }

            // тутор для повторного захода в меню выбора
            if (QSReader.Create("TutorialState").Exists("Tutorial_FieldEnding_Played"))
            {
                ExecuteTutorialPart("ChoiceSecond", activeButtonName: "SideMenuButton",
                                    firstCharacterPhrases: new[] { "Почти пришли! Отсюда до магазина совсем не далеко!" });
            }

            ExecuteTutorialPart("BeginningChoice", activeButtonName: "SceneButtonField",
                                firstCharacterPhrases: new[]
            {
                "Хороший денёк, однако выдался! Помнится, вчера я хотел посадить семена, да вот забыл... Ну ничего, сделаю это сейчас!"
            },
                                narratorPhrases: new[] { "Нажмите на кнопку \"Грядка\"." },
                                award: new Award(AwardType.Seed, seedName: "Potato"));

            break;

        case 2:
            ExecuteTutorialPart("BeginningField", activeButtonName: "FarmSpot",
                                narratorPhrases: new[]
                                { "Это поле. Здесь можно посадить семена, которые есть на складе. Нажмите на грядку." });
            break;

        case 3:
            ExecuteTutorialPart("BeginningLab", activeButtonName: "Pot",
                                narratorPhrases: new[]
            {
                "Это лаборатория. Здесь можно скрестить семена, которые есть на складе. Скрещивать можно только семена одного вида!"
            });
            break;

        case 4:
            ExecuteTutorialPart("BeginningQuantum",
                                narratorPhrases: new[]
            {
                "Это К.В.А.Н.Т. Здесь можно скрестить семена, которые есть на складе. Скрещивать можно что угодно, но один раз в день!"
            });
            break;
        }
    }
Beispiel #9
0
    /// <summary>
    /// Деактивирует панель с превью заданий
    /// </summary>
    private void OnEnable()
    {
        UpdateChosenSeeds();

        var scenario = GameObject.FindGameObjectWithTag("TutorialHandler")?.GetComponent <Scenario>();

        // тутор для окна сбора урожая
        if (QSReader.Create("TutorialState").Exists("Tutorial_WaitForGrowing_Played"))
        {
            scenario.Tutorial_HarvestPlace();
        }
    }
Beispiel #10
0
    public void Tutorial_ReplaceOrAddItem()
    {
        // деактивирует кнопку выхода из инвентаря
        if (!QSReader.Create("TutorialState").Exists("Tutorial_ReplaceOrAddItem_Played", "TutorialSkipped"))
        {
            GameObject.FindGameObjectWithTag("ExitInventory")?.SetActive(false);
        }

        ExecuteTutorialPart("ReplaceOrAddItem",
                            narratorPhrases: new[]
                            { "Теперь сами выберите, что сделать с пакетом семян: заменить существующий или добавить новый." });
    }
    /// <summary>
    /// Выключает кнопки просмотра начальных роликов
    /// </summary>
    public void DisableRewatchButtons()
    {
        if (QSReader.Create("GameState").Exists("GameInitialised") || RewatchButtons == null)
        {
            return;
        }

        foreach (var btn in RewatchButtons)
        {
            btn.SetActive(false);
        }
    }
    public void Load()
    {
        var reader = QSReader.Create("Shop");

        if (reader.Exists("UnlockedSeeds"))
        {
            unlockedSeeds = reader.Read <List <string> >("UnlockedSeeds");
        }
        else
        {
            unlockedSeeds = new List <string> {
                "Potato", "Tomato", "Cucumber", "Pea", "Carrot", "Debug"
            }
        };
    }
    public void SideMenuTutorial()
    {
        var scenario = GetComponent <Scenario>();

        // тутор для захода на склад
        if (QSReader.Create("TutorialState").Exists("Tutorial_ShopExit_Played"))
        {
            scenario?.Tutorial_SideMenuInventory();
        }

        // тутор для боковой панели
        else if (QSReader.Create("TutorialState").Exists("Tutorial_FieldEnding_Played"))
        {
            scenario?.Tutorial_SideMenu();
        }
    }
    /// <summary>
    /// Выходит с начальной сцены, либо деактивирует текущий объект (использовать на последнем слайде)
    /// </summary>
    public void ChangeStartSceneOrDisable()
    {
        const string key = "GameInitialised";

        if (!QSReader.Create("GameState").Exists(key))
        {
            var writer = QuickSaveWriter.Create("GameState");
            writer.Write(key, true);
            writer.Commit();

            SceneManager.LoadScene(1);
        }
        else
        {
            gameObject.SetActive(false);
        }
    }
Beispiel #15
0
    public void Load()
    {
        var reader = QSReader.Create("ExhibitionData");

        if (reader.TryRead("Seeds", out List <string> exhSeeds))
        {
            for (var i = 0; i < exhSeeds.Count; i++)
            {
                if (exhSeeds[i] == "")
                {
                    continue;
                }
                var seed = ScriptableObject.CreateInstance <Seed>();
                seed.SetValues(exhSeeds[i]);
                exhButtons[i].GetComponent <ExhibitionButton>().SetSeed(seed);
            }
        }
    }
Beispiel #16
0
    /// <summary>
    /// Увеличивает счётчик указанного семечка на 1
    /// </summary>
    /// <param name="key">Название категории сохранения</param>
    /// <param name="seedName">Имя семечка</param>
    private static void UpdateSeedInformation(string key, string seedName)
    {
        var seedsInfo = new Dictionary <string, int>();
        var reader    = QSReader.Create("Statistics");
        var writer    = QuickSaveWriter.Create("Statistics");

        if (reader.Exists(key))
        {
            seedsInfo = reader.Read <Dictionary <string, int> >(key);
        }

        if (!seedsInfo.ContainsKey(seedName))
        {
            seedsInfo[seedName] = 0;
        }
        seedsInfo[seedName]++;

        writer.Write(key, seedsInfo);
        writer.Commit();
    }
Beispiel #17
0
    public static Dictionary <string, float> LoadPriceMultipliers(QuickSaveReader reader = null)
    {
        reader ??= QSReader.Create("Market");
        var priceMultipliers = new Dictionary <string, float>();

        if (reader.Exists("Multipliers"))
        {
            priceMultipliers = reader.Read <Dictionary <string, float> >("Multipliers");
        }
        else
        {
            foreach (var seedName in SeedTypesInInventory)
            {
                if (!priceMultipliers.ContainsKey(seedName))
                {
                    priceMultipliers[seedName] = 1.0f;
                }
            }
        }
        return(priceMultipliers);
    }
Beispiel #18
0
    private void OnEnable()
    {
        var scenario = GameObject.FindGameObjectWithTag("TutorialHandler")?.GetComponent <Scenario>();

        // тутор для скрещивания семян 2
        if (QSReader.Create("TutorialState").Exists("Tutorial_ChooseItemToCrossSecond_Played"))
        {
            scenario?.Tutorial_ApplyItemToCrossSecond();
        }

        // тутор для скрещивания семян 1
        else if (QSReader.Create("TutorialState").Exists("Tutorial_ChooseItemToCrossFirst_Played"))
        {
            scenario?.Tutorial_ApplyItemToCrossFirst();
        }

        // тутор для продажи пакета семян
        else if (QSReader.Create("TutorialState").Exists("Tutorial_ChooseItemToSell_Played"))
        {
            scenario?.Tutorial_SellItem();
        }

        // тутор для покупки пакета семян
        else if (QSReader.Create("TutorialState").Exists("Tutorial_Shop_Played"))
        {
            scenario?.Tutorial_BuyItem();
        }

        // тутор для замены пакета семян
        else if (QSReader.Create("TutorialState").Exists("Tutorial_ChooseItemToReplace_Played"))
        {
            scenario?.Tutorial_ReplaceItem();
        }

        // тутор для панели статистики
        else if (QSReader.Create("TutorialState").Exists("Tutorial_ChooseItemToPlant_Played"))
        {
            scenario?.Tutorial_StatPanel();
        }
    }
    public void Load()
    {
        var reader = QSReader.Create("PlayerInventoryData");

        Money      = reader.Exists("money") ? reader.Read <int>("money") : 100;
        Reputation = reader.Exists("reputation") ? reader.Read <int>("reputation") : 0;
        // Hачинается с 1 т.к. формула неадекватно реагирует на 0
        Level = reader.Exists("reputationLevel") ? reader.Read <int>("reputationLevel") : 1;

        MaxItemsAmount = 10;
        Elements       = new List <Seed>();
        reader         = QSReader.Create("PlayerInventoryItems");
        if (reader.Exists("amount"))
        {
            var i = reader.Read <int>("amount");
            for (var j = 0; j < i; j++)
            {
                var parameters = reader.Read <string>(j.ToString());
                var newSeed    = ScriptableObject.CreateInstance <Seed>();
                newSeed.SetValues(parameters);
                Elements.Add(newSeed);
            }
        }

        EnergyRegenDelay = 20; // time it take to regen (in seconds)
        reader           = QSReader.Create("EnergyData");
        Energy           = reader.Exists("Energy") ? reader.Read <int>("Energy") : 1;
        EnergyMax        = reader.Exists("EnergyMax") ? reader.Read <int>("EnergyMax") : 10;
        energyBuffer     = reader.Exists("EnergyBuffer")
            ? reader.Read <float>("EnergyBuffer")
            : EnergyRegenDelay;
        var lastDate       = reader.Exists("LastDate") ? reader.Read <DateTime>("LastDate") : DateTime.Now;
        var secondsElapsed = (float)(DateTime.Now - lastDate).TotalSeconds;
        var regenerated    = (int)secondsElapsed / EnergyRegenDelay;

        RegenEnergy(regenerated);
        energyBuffer -= secondsElapsed % EnergyRegenDelay;
    }
    /// <summary>
    /// Отрисовывыет существующие задачи
    /// </summary>
    /// <param name="isPreview">Указать true, если необходимо отрисовать только предпросмотр задач</param>
    /// <param name="placeForRender">Место для отрисовки предпросмотра</param>
    /// <param name="seedName">Название семечка, к которому относится предпросмотр</param>
    /// <param name="itemsCount">Количество плодов, которые могут быть добавлены в задачу</param>
    private void RenderCurrentTasks(
        bool isPreview            = false,
        GameObject placeForRender = null,
        string seedName           = null,
        int itemsCount            = 0)
    {
        var reader        = QSReader.Create("Tasks");
        var renderedTasks = new List <GameObject>();
        var allKeys       = reader.GetAllKeys();

        ClearGameData.ClearChildren(isPreview ? placeForRender : gameObject);

        foreach (var key in allKeys)
        {
            var success = reader.TryRead <TaskDetails>(key, out var details);
            if (!success ||
                details.AmountToComplete <= 0 ||
                details.TaskCategory == null ||
                isPreview && (details.TaskCategory != "Grow" ||
                              details.Key != seedName ||
                              details.IsCompleted))
            {
                continue;
            }

            var newTask = Instantiate(isPreview ? previewPrefab : taskPrefab,
                                      isPreview ? placeForRender.transform : transform);
            renderedTasks.Add(newTask);

            var taskComp = newTask.GetComponent <Task>();
            taskComp.Load(details);
            taskComp.AmountToAdd = itemsCount;
            if (isPreview)
            {
                taskComp.UpdatePreview();
            }
            else
            {
                taskComp.UpdateView();
            }
        }

        renderedTasks.Sort((taskObj1, taskObj2) =>
        {
            var taskDetails1 = taskObj1.GetComponent <Task>().Details;
            var taskDetails2 = taskObj2.GetComponent <Task>().Details;
            return((taskDetails1.AmountToComplete - taskDetails1.ProgressAmount) -
                   (taskDetails2.AmountToComplete - taskDetails2.ProgressAmount));
        }
                           );

        for (var i = 0; i < renderedTasks.Count; i++)
        {
            renderedTasks[i].transform.SetSiblingIndex(i);
        }

        if (!isPreview)
        {
            return;
        }

        QuestsPreviewPanel
        .transform
        .Find("EmptyListText")
        .gameObject
        .SetActive(renderedTasks.Count == 0);
    }
    /// <summary>
    /// Отрисовывает инвентарь
    /// </summary>
    /// <param name="filter_RussianName">Показывает только предметы с этим русским названием</param>
    public void Redraw(string filter_RussianName = null)
    {
        for (var i = 0; i < alreadyDrawn.Count; i++)
        {
            Destroy(alreadyDrawn[i]);
        }

        alreadyDrawn.Clear();

        for (var i = 0; i < targetInventory.Elements.Count; i++)
        {
            var seed = targetInventory.Elements[i];

            // фильтрует семена по русскому названию
            if (filter_RussianName != null &&
                seed.NameInRussian != filter_RussianName)
            {
                continue;
            }

            /*
             * var itemGameObj = new GameObject(i.ToString(), typeof(Button));
             * itemGameObj.AddComponent<Image>().sprite = item.PacketSprite;
             *
             * var plantIcon = new GameObject("Plant" + i);
             * plantIcon.AddComponent<Image>().sprite = item.PlantSprite;
             * plantIcon.transform.position = new Vector2(0, -35);
             * plantIcon.transform.localScale = new Vector3(1.3f, 1.3f, 1.3f);
             * plantIcon.transform.SetParent(itemGameObj.transform);
             *
             * itemGameObj.transform.localScale = new Vector2(0.01f, 0.01f);
             * itemGameObj.GetComponent<Button>().onClick.AddListener(ClickedOnItem);
             * itemGameObj.GetComponent<Button>().targetGraphic = itemGameObj.GetComponent<Image>();
             * itemGameObj.transform.SetParent(Place);
             */
            var itemIcon = Instantiate(ItemIcon, scrollViewContent);
            itemIcon.name = i.ToString();
            var itemIconDrawer = itemIcon.GetComponent <ItemIconDrawer>();
            itemIconDrawer.SetSeed(seed);
            itemIconDrawer.Button.onClick.AddListener(ClickedOnItem);
            itemIcon.tag = seed.NameInRussian switch
            {
                "Обучающий картофель" => "TutorialPotato",
                "Обучающий помидор" => "TutorialTomato",
                _ => "Seed"
            };
            alreadyDrawn.Add(itemIcon);
        }

        if (changeItem && targetInventory.Elements.Count < targetInventory.MaxItemsAmount)
        {
            var itemIcon = Instantiate(ItemIcon, scrollViewContent);
            itemIcon.name = targetInventory.Elements.Count.ToString();
            var itemIconDrawer = itemIcon.GetComponent <ItemIconDrawer>();
            itemIconDrawer.SetPlus();
            itemIconDrawer.Button.onClick.AddListener(ClickedOnItem);
            itemIcon.tag = "InventoryPlusBtn";
            alreadyDrawn.Add(itemIcon);

            itemIconDrawer.Button.onClick.AddListener(() =>
            {
                var scenario = GameObject.FindGameObjectWithTag("TutorialHandler")?.GetComponent <Scenario>();

                // тутор для выхода из лаборатории
                if (QSReader.Create("TutorialState").Exists("Tutorial_ReplaceOrAddItem_Played"))
                {
                    scenario?.Tutorial_LabEnding();
                }

                // тутор для выхода из магазина
                else if (QSReader.Create("TutorialState").Exists("Tutorial_AddItem_Played"))
                {
                    scenario?.Tutorial_ShopExit();
                }
            });
        }

        FreeSpaceCounter.text = $"{targetInventory.Elements.Count}/{targetInventory.MaxItemsAmount}";
    }
Beispiel #22
0
    /// <summary>
    /// Подсвечивает нужную кнопку
    /// </summary>
    private void HighlightNextButton(string activeButtonName = null, string activeButtonTag = null)
    {
        // создаёт блокер и дублирует нужную кнопку
        if (BlockerPrefab != null)
        {
            DialogPanel.LastAction = () =>
            {
                GameObject fakeBtn      = null;
                GameObject activeButton = null;

                if (activeButtonName != null)
                {
                    activeButton = GameObject.Find(activeButtonName);
                }
                else if (activeButtonTag != null)
                {
                    activeButton = GameObject.FindGameObjectWithTag(activeButtonTag);
                }
                if (activeButton == null)
                {
                    return;
                }

                if (activeButton.name == "SceneButtonField" &&
                    !QSReader.Create("TutorialState").Exists("Tutorial_BeginningField_Played", "TutorialSkipped"))
                {
                    ChangeSeedName("Potato", "Обучающий картофель");
                }

                if (activeButton.name == "InventoryLabel" &&
                    !QSReader.Create("TutorialState").Exists("Tutorial_ChooseItemToSell_Played", "TutorialSkipped"))
                {
                    ChangeSeedName("Tomato", "Обучающий помидор");
                }

                var canvas = GameObject.FindGameObjectWithTag("Canvas");
                Instantiate(BlockerPrefab, canvas.transform, false);
                fakeBtn = Instantiate(activeButton, activeButton.transform.parent);
                fakeBtn.transform.SetSiblingIndex(activeButton.transform.GetSiblingIndex());
                fakeBtn.name = $"FakeButton_{activeButton.name}";
                fakeButtons.Add(activeButton, fakeBtn);

                activeButton.transform.SetParent(canvas.transform, true);
                activeButton.transform.SetAsLastSibling();
                activeButton.GetComponent <Button>()
                .onClick.AddListener(() =>
                {
                    var currentButton = EventSystem.current.currentSelectedGameObject;
                    if (currentButton == null)
                    {
                        return;
                    }

                    // удаляет блокер и фейковую кнопку
                    GameObject placeholder = null;
                    if (fakeButtons.ContainsKey(currentButton))
                    {
                        placeholder = fakeButtons[currentButton];
                    }
                    var blocker = GameObject.FindGameObjectWithTag("Blocker");

                    if (placeholder != null)
                    {
                        fakeButtons.Remove(currentButton);
                        currentButton.transform.SetParent(placeholder.transform.parent, true);
                        currentButton.transform.SetSiblingIndex(placeholder.transform.GetSiblingIndex());
                    }

                    Destroy(placeholder);
                    Destroy(blocker);
                });
            };
        }
        else
        {
            Debug.Log("Префаб блокера для туториала не указан!");
        }
    }
Beispiel #23
0
    /// <summary>
    /// Проигрывает часть туториала
    /// </summary>
    /// <param name="keyPart">Название, по которому идёт сохранение</param>
    /// <param name="activeButtonName">Название кнопки, которую следует сделать активной после окончания части вступления</param>
    /// <param name="activeButtonTag">Тег кнопки, которую следует сделать активной после окончания части вступления</param>
    /// <param name="firstCharacterPhrases">Фразы, которые говорит первый персонаж</param>
    /// <param name="narratorPhrases">Фразы, которые говорит рассказчик</param>
    /// <param name="award">Награда после слов первого персонажа</param>
    private void ExecuteTutorialPart(string keyPart, string activeButtonName = null, string activeButtonTag = null,
                                     bool lastPart = false,
                                     string[] firstCharacterPhrases = null, string[] secondCharacterPhrases = null, string[] narratorPhrases = null,
                                     Award award = null)
    {
        var key = $"Tutorial_{keyPart}_Played";

        if (QSReader.Create("TutorialState").Exists(key, "TutorialSkipped"))
        {
            return;
        }

        SaveTutorialData(key);

        DialogPanel.CreateDialogPanel(FirstCharacterSprite, SecondCharacterSprite, NarratorSprite);

        if (secondCharacterPhrases != null)
        {
            for (var i = 0; i < secondCharacterPhrases.Length; i++)
            {
                try
                {
                    DialogPanel.AddPhrase(NowTalking.First, firstCharacterPhrases[i]);
                    DialogPanel.AddPhrase(NowTalking.Second, secondCharacterPhrases[i]);
                }
                catch
                {
                    Debug.Log(
                        "Количество фраз у первого и второго персонажей не совпадает. Некоторые из них были пропущены.");
                }
            }
        }
        else if (firstCharacterPhrases != null)
        {
            foreach (var ph in firstCharacterPhrases)
            {
                DialogPanel.AddPhrase(NowTalking.First, ph);
            }
        }

        if (narratorPhrases != null)
        {
            foreach (var ph in narratorPhrases)
            {
                DialogPanel.AddPhrase(NowTalking.Narrator, ph);
            }
        }

        // добавляет награду после слов первого персонажа
        if (award != null)
        {
            DialogPanel.AddAward(firstCharacterPhrases == null ? 0 : firstCharacterPhrases.Length, award);
        }

        if (lastPart == false)
        {
            HighlightNextButton(activeButtonName: activeButtonName, activeButtonTag: activeButtonTag);
        }
        else
        {
            DialogPanel.LastAction = () =>
                                     GameObject.FindGameObjectWithTag("TutorialHandler")
                                     ?.GetComponent <TutorialHandler>()
                                     ?.ClearGameAfterTutorial();
        }

        DialogPanel.SkipTutorialBtnActive = true;
        DialogPanel.StartDialog();
    }
    /// <summary>
    /// Вызывает панель подтверждения
    /// </summary>
    /// <param семечко="item"></param>
    private void PrepareConfirmation(GameObject item)
    {
        if (!int.TryParse(item.name, out var index))
        {
            return;
        }

        if (Purpose == PurposeOfDrawing.Change && index == targetInventory.Elements.Count) // get rekt part 1
        {
            targetInventory.Elements.Add(changingSeed);
            Redraw();

            changeItem = false;
            gameObject.SetActive(false);
            targetInventory.Save();
            SuccessfulAddition?.Invoke();
            return;
        }

        var statPanelDrawer = Instantiate(StatPanel, GameObject.Find("Inventory").transform)
                              .GetComponentInChildren <StatPanelDrawer>();

        statPanelDrawer.DisplayStats(targetInventory.Elements[index]);

        var text        = statPanelDrawer.ProceedButton.GetComponentInChildren <Text>();
        var yesButton   = statPanelDrawer.ProceedButton.GetComponent <Button>();
        var logicScript = statPanelDrawer.ProceedButton.GetComponent <ConfirmationPanelLogic>();

        logicScript.targetInventory = targetInventory;
        logicScript.inventoryDrawer = this;

        switch (Purpose)
        {
        case PurposeOfDrawing.Sell:     // через кнопку инвентаря в боковом меню
            text.text = "Продать";
            yesButton.onClick.AddListener(logicScript.Sell);
            break;

        case PurposeOfDrawing.Change:     // вызывается из кода инвентаря
            text.text = "Заменить";
            yesButton.onClick.AddListener(() =>
            {
                logicScript.ChangeItem(changingSeed);
                changeItem = false;
                gameObject.SetActive(false);
                targetInventory.Save();
                SuccessfulAddition?.Invoke();
            });
            break;

        case PurposeOfDrawing.Plant:     // через код на грядке
            text.text = "Посадить";
            yesButton.onClick.AddListener(logicScript.Plant);
            break;

        case PurposeOfDrawing.AddToLab:     // через код на кнопке лаборатории
            text.text = "Выбрать";
            yesButton.onClick.AddListener(logicScript.Select);
            break;

        case PurposeOfDrawing.AddToExhibition:     // через код на кнопке выставки
            text.text = "Отправить";
            yesButton.onClick.AddListener(logicScript.SendToExhibition);
            break;
        }

        yesButton.onClick.AddListener(() =>
        {
            var scenario = GameObject.FindGameObjectWithTag("TutorialHandler")?.GetComponent <Scenario>();

            // тутор для выхода из лаборатории
            if (QSReader.Create("TutorialState").Exists("Tutorial_ReplaceOrAddItem_Played"))
            {
                scenario?.Tutorial_LabEnding();
            }

            // тутор для окончания скрещивания
            else if (QSReader.Create("TutorialState").Exists("Tutorial_ApplyItemToCrossSecond_Played"))
            {
                scenario?.Tutorial_ApplyCrossing();
            }

            // тутор для активации кнопки скрещивания 2
            else if (QSReader.Create("TutorialState").Exists("Tutorial_ApplyItemToCrossFirst_Played"))
            {
                scenario?.Tutorial_HybridPanelSecond();
            }

            // тутор для захода на биржу
            else if (QSReader.Create("TutorialState").Exists("Tutorial_SellItem_Played"))
            {
                scenario?.Tutorial_GoToMarket();
            }

            // тутор для продажи урожая
            else if (QSReader.Create("TutorialState").Exists("Tutorial_ReplaceItem_Played"))
            {
                scenario?.Tutorial_HarvestPlaceSellAll();
            }
        });
        logicScript.ItemObject = item;

        //if (int.TryParse(item.name, out var index) && targetInventory.Elements.Count > index)
        //    logicScript.DefineItem(targetInventory.Elements[index]);

        //panelObj.SetActive(true);
    }