Files
Click-PointRPG/Assets/Scripts/Quest.cs

100 lines
2.3 KiB
C#

using UnityEngine;
using System;
/// <summary>
/// Quest state enumeration
/// </summary>
public enum QuestState
{
NotStarted,
Active,
Completed,
Failed
}
/// <summary>
/// Defines a quest with objectives and state tracking
/// </summary>
[Serializable]
public class Quest
{
[Header("Quest Info")]
public string questId;
public string questName;
[TextArea(3, 10)]
public string description;
[Header("Quest Details")]
public int experienceReward = 100;
public int goldReward = 50;
[Tooltip("Items awarded upon completion (optional)")]
public string[] itemRewards;
[Header("Quest Progress")]
public QuestState state = QuestState.NotStarted;
public int currentProgress = 0;
public int requiredProgress = 1; // How many steps/kills/items needed
[Header("Quest Flow")]
[Tooltip("Quest that must be completed before this one unlocks")]
public string prerequisiteQuestId;
[Tooltip("NPC who gives this quest")]
public string questGiverId;
[Tooltip("NPC who completes/turns in this quest (leave empty to use quest giver)")]
public string questCompleterId;
/// <summary>
/// Check if quest can be started
/// </summary>
public bool CanStart()
{
return state == QuestState.NotStarted;
}
/// <summary>
/// Check if quest is active
/// </summary>
public bool IsActive()
{
return state == QuestState.Active;
}
/// <summary>
/// Check if quest objectives are met
/// </summary>
public bool IsComplete()
{
return IsActive() && currentProgress >= requiredProgress;
}
/// <summary>
/// Advance quest progress by amount
/// </summary>
public void AddProgress(int amount = 1)
{
if (IsActive())
{
currentProgress += amount;
currentProgress = Mathf.Min(currentProgress, requiredProgress);
}
}
/// <summary>
/// Get progress as percentage
/// </summary>
public float GetProgressPercent()
{
if (requiredProgress <= 0) return 0f;
return Mathf.Clamp01((float)currentProgress / requiredProgress);
}
/// <summary>
/// Reset quest progress
/// </summary>
public void Reset()
{
state = QuestState.NotStarted;
currentProgress = 0;
}
}