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 QuestBecomesAvailableEventHandler(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? _activeQuest; 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(_activeQuest?.id ?? "none"); if (newStatus == QuestStatus.Status.Available) { EmitSignalQuestBecomesAvailable(questResource); } } public IEnumerable GetVisibleQuests() { return _questStatus.Where(qs => qs.Value.status != QuestStatus.Status.Hidden); } public IEnumerable GetAvailableQuests() { return _questStatus.Where(qs => qs.Value.status == QuestStatus.Status.Available); } 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? GetActiveQuest() { return _activeQuest; } public void SetActiveQuest(QuestResource? questResource) { _activeQuest = questResource; EmitSignalQuestsChanged(); EmitSignalDialogicActiveQuest(_activeQuest?.id ?? "none"); } }