using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; using UnityEngine.UI; using Yarn.Unity; public class Tutorial : MonoBehaviour { [Header("Core Systems")] [SerializeField] private NavMeshAgent playerAgent; [SerializeField] private DialogueRunner dialogueRunner; [Header("UI & Interaction")] [SerializeField] private GameObject panelUI; [SerializeField] private GameObject hospitalEntrance; [SerializeField] private GameObject hospitalButton; [SerializeField] private GameObject exclamationMark; [SerializeField] private GameObject[] unlockableWords; [SerializeField] private GameObject plantPanel; [SerializeField] private GameObject UICraftingWindow; [SerializeField] private GameObject arrow1; [SerializeField] private GameObject arrow2; [SerializeField] private GameObject patientLog; [Header("Inventory & Items")] [SerializeField] private Inventory inventory; [SerializeField] private InventoryManager inventoryManager; [SerializeField] private ItemSO plantItemSO; [SerializeField] private ItemSO pillsBlueprint; [SerializeField] private UI_Crafting uiCrafting; private InMemoryVariableStorage yarnVariables; private DialogueStep currentStep; private List<DialogueStep> dialogueSteps; private class DialogueStep { public string NodeName; public string CompletionVariable; public Action PostDialogueAction; public DialogueStep(string nodeName, string completionVar, Action postAction = null) { NodeName = nodeName; CompletionVariable = completionVar; PostDialogueAction = postAction; } } private void Awake() { yarnVariables = dialogueRunner.VariableStorage as InMemoryVariableStorage; dialogueSteps = new List<DialogueStep> { new("ManagerDialogue", "$finishedManagerDialogue"), new("ManagerDialogueAfterAnya", "$finishedAfterAnya", () => { inventory.AddItem(new Item { itemData = pillsBlueprint, amount = 1 }); }), new("ManagerDialogueForPills", "$finishedPillDialogue", () => { plantPanel.SetActive(true); inventoryManager.AddItem(new Item { itemData = plantItemSO, amount = 3 }); }), new("CraftingPills", "$finishedCraftingDialogue", () => { UICraftingWindow.SetActive(true); arrow1.SetActive(true); arrow2.SetActive(true); }), new("AdministratingPills", "$readyToAdministerPills"), new("PatientLog", "$finishedPatientLogDialogue", () => { patientLog.SetActive(true); foreach (var word in unlockableWords) word.SetActive(true); }), }; } private void Start() { panelUI.SetActive(false); hospitalButton.SetActive(false); arrow1.SetActive(false); arrow2.SetActive(false); dialogueRunner.onDialogueComplete.AddListener(OnDialogueComplete); } public void StartingDialogue() { if (yarnVariables == null) yarnVariables = dialogueRunner.VariableStorage as InMemoryVariableStorage; foreach (var step in dialogueSteps) { if (!yarnVariables.TryGetValue(step.CompletionVariable, out bool isDone) || !isDone) { currentStep = step; dialogueRunner.StartDialogue(step.NodeName); return; } } currentStep = null; dialogueRunner.StartDialogue("RepeatOrFallbackDialogue"); } public void StartCraftingDialogue() { StartDialogueByNodeName("CraftingPills"); } private void OnDialogueComplete() { if (dialogueRunner.CurrentNodeName == "AnyaIntro" && yarnVariables != null && yarnVariables.TryGetValue("$popUpScreenTut", out bool hasFinished) && hasFinished) { panelUI.SetActive(true); hospitalButton.SetActive(true); } currentStep?.PostDialogueAction?.Invoke(); currentStep = null; } public void HideButtons() => plantPanel.SetActive(false); public void GoToEntrance() => playerAgent.SetDestination(hospitalEntrance.transform.position); public void DisableButton() { hospitalButton.SetActive(false); panelUI.SetActive(false); } private void OnEnable() => UI_Crafting.OnItemCrafted += OnPlantBlueprintCrafted; private void OnDisable() => UI_Crafting.OnItemCrafted -= OnPlantBlueprintCrafted; private void OnPlantBlueprintCrafted(ItemSO obj) { if (exclamationMark != null) exclamationMark.SetActive(true); arrow1.SetActive(false); arrow2.SetActive(false); StartDialogueByNodeName("AdministratingPills"); } private void StartDialogueByNodeName(string nodeName) { currentStep = dialogueSteps.Find(step => step.NodeName == nodeName); if (currentStep != null) { dialogueRunner.StartDialogue(currentStep.NodeName); } } }