You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.5 KiB
93 lines
2.5 KiB
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
|
|
{
|
|
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);
|
|
|
|
[Export(PropertyHint.ArrayType)]
|
|
public QuestResource[] questsAccessibleFromDialogic;
|
|
|
|
public override void _EnterTree()
|
|
{
|
|
Instance = this;
|
|
}
|
|
|
|
private Godot.Collections.Dictionary<QuestResource, QuestStatus> _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<QuestPair> GetVisibleQuests()
|
|
{
|
|
return _questStatus.Where(qs => qs.Value.status != QuestStatus.Status.Hidden);
|
|
}
|
|
|
|
public IEnumerable<QuestPair> 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");
|
|
}
|
|
|
|
// functions to call from Dialogic
|
|
public void DlSetQuestActiveAndFollow(string questId)
|
|
{
|
|
var resource = questsAccessibleFromDialogic.First(qr => qr.id == questId);
|
|
ChangeQuestStatus(resource, QuestStatus.Status.Active);
|
|
SetFollowQuest(resource);
|
|
}
|
|
}
|