BITKit/Src/Unity/Scripts/SubSystems/Quest/QuestSystem.cs

73 lines
2.2 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
namespace BITKit.SubSystems.Quest
{
public class QuestSystem
{
public enum State
{
None,
InProcess,
Complete,
Canceled,
}
[Serializable]
public class Info
{
public static implicit operator Guid(Info self)
{
return self.id;
}
public static implicit operator string(Info self)
{
return self.Name;
}
internal Info(string name, string description)
{
id = Guid.NewGuid();
Name = name;
Description = description;
}
public readonly Guid id;
public State State { get; internal set; }
public string Name { get; internal set; }
public string Description { get; internal set; }
}
public static Dictionary<Guid, Info> quests { get; private set; } = new();
public static event Action<Info> OnQuestCreated;
public static event Action<Info> OnQuestCompleted;
public static event Action<Info> OnQuestCanceled;
public static Info Create(string name = "New Quest", string description = "Quest in progress")
{
Info info = new(name, description);
info.State = State.InProcess;
quests.Add(info, info);
OnQuestCreated?.Invoke(info);
return info;
}
public static void Complete(Info quest)
{
quest.State = State.Complete;
OnQuestCompleted?.Invoke(quest);
}
public static void Cancel(Info quest)
{
if (quests.ContainsKey(quest.id))
{
quests.Remove(quest.id);
quest.State = State.Canceled;
OnQuestCanceled?.Invoke(quest);
}
}
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
private static void Reload()
{
quests.Clear();
OnQuestCreated = null;
OnQuestCompleted = null;
}
}
}