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 quests { get; private set; } = new(); public static event Action OnQuestCreated; public static event Action OnQuestCompleted; public static event Action 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; } } }