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(); } }
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; } }
/// <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; } }
/// <summary> /// Деактивирует панель с превью заданий /// </summary> private void OnEnable() { UpdateChosenSeeds(); var scenario = GameObject.FindGameObjectWithTag("TutorialHandler")?.GetComponent <Scenario>(); // тутор для окна сбора урожая if (QSReader.Create("TutorialState").Exists("Tutorial_WaitForGrowing_Played")) { scenario.Tutorial_HarvestPlace(); } }
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); } }
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); } } }
/// <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(); }
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); }
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}"; }
/// <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("Префаб блокера для туториала не указан!"); } }
/// <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); }