using Godot; using System; using System.Collections.Generic; using System.Linq; namespace Babushka.scripts.CSharp.Common.Quest; using QuestPair = KeyValuePair; public partial class QuestManager : Node { public static QuestManager? Instance { get; private set; } [Signal] public delegate void QuestBecomesActiveEventHandler(QuestResource questResource); [Signal] public delegate void QuestsChangedEventHandler(); [Signal] public delegate void DialogicActiveQuestEventHandler(string value); public override void _EnterTree() { Instance = this; } private Godot.Collections.Dictionary _questStatus = new(); private QuestResource? _followQuest; public void ChangeQuestStatus(QuestResource questResource, QuestStatus.Status newStatus) { if (!_questStatus.TryGetValue(questResource, out var value)) { value = new QuestStatus(); _questStatus.Add(questResource, value); } value.status = newStatus; EmitSignalQuestsChanged(); EmitSignalDialogicActiveQuest(_followQuest?.id ?? "none"); if (newStatus == QuestStatus.Status.Active) { EmitSignalQuestBecomesActive(questResource); } } public IEnumerable GetVisibleQuests() { return _questStatus.Where(qs => qs.Value.status != QuestStatus.Status.Hidden); } public IEnumerable GetActiveQuests() { return _questStatus.Where(qs => qs.Value.status == QuestStatus.Status.Active); } public QuestStatus GetQuestStatus(QuestResource questResource) { if (_questStatus.TryGetValue(questResource, out var status)) return status; status = new QuestStatus(); _questStatus.Add(questResource, status); return status; } public QuestResource? GetFollowQuest() { return _followQuest; } public void SetFollowQuest(QuestResource? questResource) { _followQuest = questResource; EmitSignalQuestsChanged(); EmitSignalDialogicActiveQuest(_followQuest?.id ?? "none"); } }