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

73 lines
2.2 KiB
C#
Raw Normal View History

2023-06-05 19:57:17 +08:00
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
namespace BITKit.SubSystems.Quest
{
2023-06-29 14:57:11 +08:00
public class QuestSystem
2023-06-05 19:57:17 +08:00
{
public enum State
{
None,
InProcess,
Complete,
Canceled,
}
2024-03-31 23:31:00 +08:00
[Serializable]
2023-06-05 19:57:17 +08:00
public class Info
{
public static implicit operator Guid(Info self)
{
return self.id;
}
public static implicit operator string(Info self)
{
2024-03-31 23:31:00 +08:00
return self.Name;
2023-06-05 19:57:17 +08:00
}
internal Info(string name, string description)
{
id = Guid.NewGuid();
2024-03-31 23:31:00 +08:00
Name = name;
Description = description;
2023-06-05 19:57:17 +08:00
}
public readonly Guid id;
2024-03-31 23:31:00 +08:00
public State State { get; internal set; }
public string Name { get; internal set; }
public string Description { get; internal set; }
2023-06-05 19:57:17 +08:00
}
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);
2024-03-31 23:31:00 +08:00
info.State = State.InProcess;
2023-06-05 19:57:17 +08:00
quests.Add(info, info);
OnQuestCreated?.Invoke(info);
return info;
}
public static void Complete(Info quest)
{
2024-03-31 23:31:00 +08:00
quest.State = State.Complete;
2023-06-05 19:57:17 +08:00
OnQuestCompleted?.Invoke(quest);
}
public static void Cancel(Info quest)
{
if (quests.ContainsKey(quest.id))
{
quests.Remove(quest.id);
2024-03-31 23:31:00 +08:00
quest.State = State.Canceled;
2023-06-05 19:57:17 +08:00
OnQuestCanceled?.Invoke(quest);
}
}
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
2024-03-31 23:31:00 +08:00
private static void Reload()
2023-06-05 19:57:17 +08:00
{
quests.Clear();
OnQuestCreated = null;
OnQuestCompleted = null;
}
}
}