2026-07-16 21:49:59 +01:00
|
|
|
using UnityEngine;
|
|
|
|
|
using System.Collections.Generic;
|
2026-07-17 15:09:17 +01:00
|
|
|
|
|
|
|
|
[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
|
|
|
|
|
}
|
|
|
|
|
|
2026-07-16 21:49:59 +01:00
|
|
|
public class Quests : MonoBehaviour
|
|
|
|
|
{
|
2026-07-17 15:09:17 +01:00
|
|
|
[SerializeField] private List<Quest> completedQuests = new List<Quest>();
|
|
|
|
|
[SerializeField] private List<Quest> activeQuests = new List<Quest>();
|
|
|
|
|
[SerializeField] private List<Quest> availableQuests = new List<Quest>();
|
|
|
|
|
[SerializeField] private List<Quest> allQuests = new List<Quest>(); // All quests in the game
|
|
|
|
|
|
2026-07-16 21:49:59 +01:00
|
|
|
void Start()
|
|
|
|
|
{
|
2026-07-17 15:09:17 +01:00
|
|
|
RefreshAvailableQuests();
|
2026-07-16 21:49:59 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Update()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
2026-07-17 15:09:17 +01:00
|
|
|
|
|
|
|
|
public void StartQuest(Quest quest)
|
2026-07-16 21:49:59 +01:00
|
|
|
{
|
2026-07-17 15:09:17 +01:00
|
|
|
if (availableQuests.Contains(quest) && !activeQuests.Contains(quest))
|
|
|
|
|
{
|
|
|
|
|
activeQuests.Add(quest);
|
|
|
|
|
availableQuests.Remove(quest);
|
|
|
|
|
Debug.Log($"Quest '{quest.questName}' started.");
|
|
|
|
|
}
|
2026-07-16 21:49:59 +01:00
|
|
|
}
|
2026-07-17 15:09:17 +01:00
|
|
|
|
|
|
|
|
public void StartQuest(string questName)
|
2026-07-16 21:49:59 +01:00
|
|
|
{
|
2026-07-17 15:09:17 +01:00
|
|
|
Quest quest = allQuests.Find(q => q.questName == questName);
|
|
|
|
|
if (quest != null)
|
|
|
|
|
StartQuest(quest);
|
|
|
|
|
else
|
|
|
|
|
Debug.LogWarning($"Quest '{questName}' not found.");
|
2026-07-16 21:49:59 +01:00
|
|
|
}
|
2026-07-17 15:09:17 +01:00
|
|
|
|
|
|
|
|
public void CompleteQuest(Quest quest)
|
2026-07-16 21:49:59 +01:00
|
|
|
{
|
2026-07-17 15:09:17 +01:00
|
|
|
if (activeQuests.Contains(quest))
|
|
|
|
|
{
|
|
|
|
|
activeQuests.Remove(quest);
|
|
|
|
|
completedQuests.Add(quest);
|
|
|
|
|
Debug.Log($"Quest '{quest.questName}' completed.");
|
|
|
|
|
RefreshAvailableQuests(); // Unlock new quests
|
|
|
|
|
}
|
2026-07-16 21:49:59 +01:00
|
|
|
}
|
2026-07-17 15:09:17 +01:00
|
|
|
|
|
|
|
|
public void CompleteQuest(string questName)
|
2026-07-16 21:49:59 +01:00
|
|
|
{
|
2026-07-17 15:09:17 +01:00
|
|
|
Quest quest = allQuests.Find(q => q.questName == questName);
|
|
|
|
|
if (quest != null)
|
|
|
|
|
CompleteQuest(quest);
|
|
|
|
|
else
|
|
|
|
|
Debug.LogWarning($"Quest '{questName}' not found.");
|
2026-07-16 21:49:59 +01:00
|
|
|
}
|
2026-07-17 15:09:17 +01:00
|
|
|
|
|
|
|
|
public void AbandonQuest(Quest quest)
|
2026-07-16 21:49:59 +01:00
|
|
|
{
|
2026-07-17 15:09:17 +01:00
|
|
|
if (activeQuests.Contains(quest))
|
|
|
|
|
{
|
|
|
|
|
activeQuests.Remove(quest);
|
|
|
|
|
Debug.Log($"Quest '{quest.questName}' abandoned.");
|
|
|
|
|
}
|
2026-07-16 21:49:59 +01:00
|
|
|
}
|
2026-07-17 15:09:17 +01:00
|
|
|
|
|
|
|
|
public void AbandonQuest(string questName)
|
2026-07-16 21:49:59 +01:00
|
|
|
{
|
2026-07-17 15:09:17 +01:00
|
|
|
Quest quest = allQuests.Find(q => q.questName == questName);
|
|
|
|
|
if (quest != null)
|
|
|
|
|
AbandonQuest(quest);
|
|
|
|
|
else
|
|
|
|
|
Debug.LogWarning($"Quest '{questName}' not found.");
|
2026-07-16 21:49:59 +01:00
|
|
|
}
|
2026-07-17 15:09:17 +01:00
|
|
|
|
|
|
|
|
public void FailQuest(Quest quest)
|
2026-07-16 21:49:59 +01:00
|
|
|
{
|
2026-07-17 15:09:17 +01:00
|
|
|
if (activeQuests.Contains(quest))
|
|
|
|
|
{
|
|
|
|
|
activeQuests.Remove(quest);
|
|
|
|
|
Debug.Log($"Quest '{quest.questName}' failed.");
|
|
|
|
|
}
|
2026-07-16 21:49:59 +01:00
|
|
|
}
|
2026-07-17 15:09:17 +01:00
|
|
|
|
|
|
|
|
public void FailQuest(string questName)
|
2026-07-16 21:49:59 +01:00
|
|
|
{
|
2026-07-17 15:09:17 +01:00
|
|
|
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)
|
2026-07-16 21:49:59 +01:00
|
|
|
{
|
2026-07-17 15:09:17 +01:00
|
|
|
Quest prereqQuest = allQuests.Find(q => q.questName == prereqName);
|
|
|
|
|
if (prereqQuest == null || !completedQuests.Contains(prereqQuest))
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2026-07-16 21:49:59 +01:00
|
|
|
}
|
2026-07-17 15:09:17 +01:00
|
|
|
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))
|
2026-07-16 21:49:59 +01:00
|
|
|
{
|
2026-07-17 15:09:17 +01:00
|
|
|
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.");
|
2026-07-16 21:49:59 +01:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2026-07-17 15:09:17 +01:00
|
|
|
Debug.Log($"Quest '{quest.questName}' is not available.");
|
2026-07-16 21:49:59 +01:00
|
|
|
}
|
|
|
|
|
}
|
2026-07-17 15:09:17 +01:00
|
|
|
|
|
|
|
|
public void CheckQuestStatus(string questName)
|
2026-07-16 21:49:59 +01:00
|
|
|
{
|
2026-07-17 15:09:17 +01:00
|
|
|
Quest quest = allQuests.Find(q => q.questName == questName);
|
|
|
|
|
if (quest != null)
|
|
|
|
|
CheckQuestStatus(quest);
|
2026-07-16 21:49:59 +01:00
|
|
|
else
|
2026-07-17 15:09:17 +01:00
|
|
|
Debug.LogWarning($"Quest '{questName}' not found.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public List<Quest> GetAvailableQuests()
|
|
|
|
|
{
|
|
|
|
|
return new List<Quest>(availableQuests);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public List<Quest> GetActiveQuests()
|
|
|
|
|
{
|
|
|
|
|
return new List<Quest>(activeQuests);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public List<Quest> GetCompletedQuests()
|
|
|
|
|
{
|
|
|
|
|
return new List<Quest>(completedQuests);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void RefreshAvailableQuests()
|
|
|
|
|
{
|
|
|
|
|
availableQuests.Clear();
|
|
|
|
|
|
|
|
|
|
foreach (var quest in allQuests)
|
2026-07-16 21:49:59 +01:00
|
|
|
{
|
2026-07-17 15:09:17 +01:00
|
|
|
// Skip if already active or completed
|
|
|
|
|
if (activeQuests.Contains(quest) || completedQuests.Contains(quest))
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
// Check if prerequisites are met
|
|
|
|
|
if (ArePrerequisitesMet(quest))
|
2026-07-16 21:49:59 +01:00
|
|
|
{
|
2026-07-17 15:09:17 +01:00
|
|
|
availableQuests.Add(quest);
|
2026-07-16 21:49:59 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|