Made basic quest setup

This commit is contained in:
cblech
2025-07-07 04:40:40 +02:00
parent ba512508f8
commit 01daddee3b
28 changed files with 392 additions and 0 deletions
@@ -0,0 +1,11 @@
using Godot;
using System;
using Babushka.scripts.CSharp.Common.Util;
public partial class QuestDescriptionUi : RichTextLabel
{
public void UpdateText(QuestLog questLog)
{
Text = questLog.currentDetailQuest?.description ?? "";
}
}
@@ -0,0 +1 @@
uid://b8mywolvj2yq7
@@ -0,0 +1,33 @@
#nullable enable
using System;
using Babushka.scripts.CSharp.Common.Util;
using Godot;
namespace Babushka.scripts.CSharp.Common.Quest;
public partial class QuestListItemUi : Control
{
private Button TitleButton => GetNode<Button>("TitleButton");
private QuestResource? _questResource;
public void UpdateButton(QuestResource questResource)
{
_questResource = questResource;
ShowName(questResource.title);
TitleButton.Pressed += ClickedTitleButton;
}
private void ShowName(string questResourceTitle)
{
TitleButton.Text = questResourceTitle;
}
public void ClickedTitleButton()
{
var questLog = this.FindParentByType<QuestLog>();
if (_questResource == null)
{
throw new ArgumentNullException(nameof(_questResource), "QuestResource is null");
}
questLog.currentDetailQuest = _questResource;
}
}
@@ -0,0 +1 @@
uid://dwhee40ksubke
@@ -0,0 +1,42 @@
using Godot;
using System;
using Babushka.scripts.CSharp.Common.Quest;
public partial class QuestListUi : VBoxContainer
{
[Export]
private PackedScene _questListItemPrefab;
public override void _EnterTree()
{
UpdateList();
}
public override void _Ready()
{
UpdateList();
}
public void UpdateList()
{
// delete children
foreach (Node child in GetChildren())
{
RemoveChild(child);
child.QueueFree();
}
// recreate children
var activeQuests = QuestManager.Instance.GetActiveQuests();
foreach (var questPair in activeQuests)
{
var questResource = questPair.Key;
var questStatus = questPair.Value;
var questListItem = _questListItemPrefab.Instantiate<QuestListItemUi>();
questListItem.UpdateButton(questResource);
AddChild(questListItem);
}
}
}
@@ -0,0 +1 @@
uid://c7ilqe2fmjyvx
+21
View File
@@ -0,0 +1,21 @@
#nullable enable
using Godot;
using System;
using Babushka.scripts.CSharp.Common.Quest;
public partial class QuestLog : Control
{
[Signal]
public delegate void DetailQuestChangedEventHandler(QuestLog questLog);
public QuestResource? currentDetailQuest
{
get => _currentDetailQuestBacking;
set
{
_currentDetailQuestBacking = value;
EmitSignalDetailQuestChanged(this);
}
}
private QuestResource? _currentDetailQuestBacking;
}
@@ -0,0 +1 @@
uid://o1qpo0wdqlw3
@@ -0,0 +1,41 @@
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; }
public override void _EnterTree()
{
Instance = this;
}
private Godot.Collections.Dictionary<QuestResource, QuestStatus> _questStatus = new();
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;
}
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);
}
}
@@ -0,0 +1 @@
uid://dl2uhq12p3qks
@@ -0,0 +1,13 @@
using Godot;
namespace Babushka.scripts.CSharp.Common.Quest;
[GlobalClass]
public partial class QuestResource : Resource
{
[Export]
public string id = "";
[Export]
public string title = "";
[Export(PropertyHint.MultilineText)]
public string description = "";
}
@@ -0,0 +1 @@
uid://vji5lp4qc8pp
@@ -0,0 +1,16 @@
using Godot;
namespace Babushka.scripts.CSharp.Common.Quest;
public partial class QuestStatus : GodotObject
{
public enum Status
{
Hidden,
Active,
Done,
Canceled,
}
public Status status = Status.Hidden;
}
@@ -0,0 +1 @@
uid://bpqgcchuubfiy
@@ -0,0 +1,20 @@
using Godot;
using System;
using System.Collections.Generic;
using Babushka.scripts.CSharp.Common.Quest;
using Godot.Collections;
public partial class QuestTestingScript : Node
{
[Export(PropertyHint.ArrayType)]
private Array<QuestResource> _questsToActivate;
public override void _EnterTree()
{
foreach (var questResource in _questsToActivate)
{
QuestManager.Instance.ChangeQuestStatus(questResource, QuestStatus.Status.Active);
}
}
}
@@ -0,0 +1 @@
uid://cg0oqug38c81n
@@ -0,0 +1,17 @@
using Godot;
using System;
using Babushka.scripts.CSharp.Common.Quest;
public partial class QuestTrigger : Node
{
[Export]
public QuestResource questResource;
[Export]
public QuestStatus.Status toStatus;
public void Trigger()
{
QuestManager.Instance.ChangeQuestStatus(questResource, toStatus);
}
}
@@ -0,0 +1 @@
uid://cldtt4atgymm5
@@ -0,0 +1,26 @@
using System;
using Godot;
namespace Babushka.scripts.CSharp.Common.Util;
public static class NodeExtension
{
/// <summary>
/// Searches for a parent node of the specified type.
/// </summary>
/// <typeparam name="T">The type of the parent node to search for. The search is successful, when <code>searchedNode is T</code></typeparam>
/// <param name="self">The node from which to start the search.</param>
/// <returns>The parent node of type T if found, otherwise throws an exception.</returns>
public static T FindParentByType<T>(this Node self)
{
var parent = self.GetParent();
while (parent != null)
{
if (parent is T tParent)
{
return tParent;
}
parent = parent.GetParent();
}
throw new Exception($"Parent of type {typeof(T)} not found for node {self.Name}");
}
}
@@ -0,0 +1 @@
uid://bwisbh2f2ci6l