using UnityEngine; using System.Collections.Generic; [System.Serializable] public class Quest { public string questName; public string questDescription; public int requiredLevel; public int rewardGold; public int rewardExperience; public int requiredQuantity; public string[] prerequisiteNames; // Store quest names instead of direct references } public class Quests : MonoBehaviour { [SerializeField] private List completedQuests = new List(); [SerializeField] private List activeQuests = new List(); [SerializeField] private List availableQuests = new List(); [SerializeField] private List allQuests = new List(); // All quests in the game void Start() { RefreshAvailableQuests(); } void Update() { } public void StartQuest(Quest quest) { if (availableQuests.Contains(quest) && !activeQuests.Contains(quest)) { activeQuests.Add(quest); availableQuests.Remove(quest); Debug.Log($"Quest '{quest.questName}' started."); } } public void StartQuest(string questName) { Quest quest = allQuests.Find(q => q.questName == questName); if (quest != null) StartQuest(quest); else Debug.LogWarning($"Quest '{questName}' not found."); } public void CompleteQuest(Quest quest) { if (activeQuests.Contains(quest)) { activeQuests.Remove(quest); completedQuests.Add(quest); Debug.Log($"Quest '{quest.questName}' completed."); RefreshAvailableQuests(); // Unlock new quests } } public void CompleteQuest(string questName) { Quest quest = allQuests.Find(q => q.questName == questName); if (quest != null) CompleteQuest(quest); else Debug.LogWarning($"Quest '{questName}' not found."); } public void AbandonQuest(Quest quest) { if (activeQuests.Contains(quest)) { activeQuests.Remove(quest); Debug.Log($"Quest '{quest.questName}' abandoned."); } } public void AbandonQuest(string questName) { Quest quest = allQuests.Find(q => q.questName == questName); if (quest != null) AbandonQuest(quest); else Debug.LogWarning($"Quest '{questName}' not found."); } public void FailQuest(Quest quest) { if (activeQuests.Contains(quest)) { activeQuests.Remove(quest); Debug.Log($"Quest '{quest.questName}' failed."); } } public void FailQuest(string questName) { Quest quest = allQuests.Find(q => q.questName == questName); if (quest != null) FailQuest(quest); else Debug.LogWarning($"Quest '{questName}' not found."); } public string[] GetPrerequisites(Quest quest) { return quest.prerequisiteNames; } private bool ArePrerequisitesMet(Quest quest) { if (quest.prerequisiteNames == null || quest.prerequisiteNames.Length == 0) return true; foreach (var prereqName in quest.prerequisiteNames) { Quest prereqQuest = allQuests.Find(q => q.questName == prereqName); if (prereqQuest == null || !completedQuests.Contains(prereqQuest)) { return false; } } return true; } public void GetQuestDetails(Quest quest) { Debug.Log($"Quest Name: {quest.questName}"); Debug.Log($"Description: {quest.questDescription}"); Debug.Log($"Required Level: {quest.requiredLevel}"); Debug.Log($"Reward Gold: {quest.rewardGold}"); Debug.Log($"Reward Experience: {quest.rewardExperience}"); Debug.Log($"Required Quantity: {quest.requiredQuantity}"); } public void GetQuestDetails(string questName) { Quest quest = allQuests.Find(q => q.questName == questName); if (quest != null) GetQuestDetails(quest); else Debug.LogWarning($"Quest '{questName}' not found."); } public void CheckQuestStatus(Quest quest) { if (activeQuests.Contains(quest)) { Debug.Log($"Quest '{quest.questName}' is currently active."); } else if (completedQuests.Contains(quest)) { Debug.Log($"Quest '{quest.questName}' has been completed."); } else if (availableQuests.Contains(quest)) { Debug.Log($"Quest '{quest.questName}' is available."); } else { Debug.Log($"Quest '{quest.questName}' is not available."); } } public void CheckQuestStatus(string questName) { Quest quest = allQuests.Find(q => q.questName == questName); if (quest != null) CheckQuestStatus(quest); else Debug.LogWarning($"Quest '{questName}' not found."); } public List GetAvailableQuests() { return new List(availableQuests); } public List GetActiveQuests() { return new List(activeQuests); } public List GetCompletedQuests() { return new List(completedQuests); } private void RefreshAvailableQuests() { availableQuests.Clear(); foreach (var quest in allQuests) { // Skip if already active or completed if (activeQuests.Contains(quest) || completedQuests.Contains(quest)) continue; // Check if prerequisites are met if (ArePrerequisitesMet(quest)) { availableQuests.Add(quest); } } } }