Files
BookRPG/Assets/Scripts/Quests.cs

209 lines
5.8 KiB
C#
Raw Permalink Normal View History

2026-07-16 21:49:59 +01:00
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
}
2026-07-16 21:49:59 +01:00
public class Quests : MonoBehaviour
{
[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()
{
RefreshAvailableQuests();
2026-07-16 21:49:59 +01:00
}
void Update()
{
}
public void StartQuest(Quest quest)
2026-07-16 21:49:59 +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
}
public void StartQuest(string questName)
2026-07-16 21:49:59 +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
}
public void CompleteQuest(Quest quest)
2026-07-16 21:49:59 +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
}
public void CompleteQuest(string questName)
2026-07-16 21:49:59 +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
}
public void AbandonQuest(Quest quest)
2026-07-16 21:49:59 +01:00
{
if (activeQuests.Contains(quest))
{
activeQuests.Remove(quest);
Debug.Log($"Quest '{quest.questName}' abandoned.");
}
2026-07-16 21:49:59 +01:00
}
public void AbandonQuest(string questName)
2026-07-16 21:49:59 +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
}
public void FailQuest(Quest quest)
2026-07-16 21:49:59 +01:00
{
if (activeQuests.Contains(quest))
{
activeQuests.Remove(quest);
Debug.Log($"Quest '{quest.questName}' failed.");
}
2026-07-16 21:49:59 +01:00
}
public void FailQuest(string questName)
2026-07-16 21:49:59 +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
{
Quest prereqQuest = allQuests.Find(q => q.questName == prereqName);
if (prereqQuest == null || !completedQuests.Contains(prereqQuest))
{
return false;
}
2026-07-16 21:49:59 +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
{
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
{
Debug.Log($"Quest '{quest.questName}' is not available.");
2026-07-16 21:49:59 +01:00
}
}
public void CheckQuestStatus(string questName)
2026-07-16 21:49:59 +01:00
{
Quest quest = allQuests.Find(q => q.questName == questName);
if (quest != null)
CheckQuestStatus(quest);
2026-07-16 21:49:59 +01:00
else
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
{
// 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
{
availableQuests.Add(quest);
2026-07-16 21:49:59 +01:00
}
}
}
}