Files

82 lines
2.2 KiB
C#
Raw Permalink Normal View History

2025-07-07 04:40:40 +02:00
using Godot;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Babushka.scripts.CSharp.Common.Quest;
using QuestPair = KeyValuePair<QuestResource, QuestStatus>;
public partial class QuestManager : Node
{
2025-07-07 04:41:03 +02:00
public static QuestManager? Instance { get; private set; }
[Signal]
2025-08-14 21:54:18 +02:00
public delegate void QuestBecomesAvailableEventHandler(QuestResource questResource);
2025-07-07 04:41:03 +02:00
[Signal]
public delegate void QuestsChangedEventHandler();
2025-07-07 04:40:40 +02:00
2025-07-23 20:48:56 +02:00
[Signal]
public delegate void DialogicActiveQuestEventHandler(string value);
2025-07-07 04:40:40 +02:00
public override void _EnterTree()
{
Instance = this;
}
private Godot.Collections.Dictionary<QuestResource, QuestStatus> _questStatus = new();
2025-07-23 20:48:56 +02:00
2025-08-14 21:54:18 +02:00
private QuestResource? _activeQuest;
2025-07-07 04:40:40 +02:00
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;
2025-07-07 04:41:03 +02:00
EmitSignalQuestsChanged();
2025-08-14 21:54:18 +02:00
EmitSignalDialogicActiveQuest(_activeQuest?.id ?? "none");
2025-07-07 04:41:03 +02:00
2025-08-14 21:54:18 +02:00
if (newStatus == QuestStatus.Status.Available)
2025-07-07 04:41:03 +02:00
{
2025-08-14 21:54:18 +02:00
EmitSignalQuestBecomesAvailable(questResource);
2025-07-07 04:41:03 +02:00
}
2025-07-07 04:40:40 +02:00
}
public IEnumerable<QuestPair> GetVisibleQuests()
{
return _questStatus.Where(qs => qs.Value.status != QuestStatus.Status.Hidden);
}
2025-08-14 21:54:18 +02:00
public IEnumerable<QuestPair> GetAvailableQuests()
2025-07-07 04:40:40 +02:00
{
2025-08-14 21:54:18 +02:00
return _questStatus.Where(qs => qs.Value.status == QuestStatus.Status.Available);
2025-07-07 04:40:40 +02:00
}
2025-07-07 04:41:03 +02:00
public QuestStatus GetQuestStatus(QuestResource questResource)
{
if (_questStatus.TryGetValue(questResource, out var status))
return status;
2025-07-23 20:48:56 +02:00
2025-07-07 04:41:03 +02:00
status = new QuestStatus();
_questStatus.Add(questResource, status);
return status;
}
2025-08-14 21:54:18 +02:00
public QuestResource? GetActiveQuest()
2025-07-07 04:41:03 +02:00
{
2025-08-14 21:54:18 +02:00
return _activeQuest;
2025-07-07 04:41:03 +02:00
}
2025-08-14 21:54:18 +02:00
public void SetActiveQuest(QuestResource? questResource)
2025-07-07 04:41:03 +02:00
{
2025-08-14 21:54:18 +02:00
_activeQuest = questResource;
2025-07-07 04:41:03 +02:00
EmitSignalQuestsChanged();
2025-08-14 21:54:18 +02:00
EmitSignalDialogicActiveQuest(_activeQuest?.id ?? "none");
2025-07-23 20:48:56 +02:00
}
2025-07-07 04:40:40 +02:00
}