100 lines
2.3 KiB
C#
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;
|
|
}
|
|
}
|