Files
fracturepoint/Assets/Scripts/LevelScripts/Dialogue.cs
2026-01-19 10:41:03 -07:00

92 lines
2.5 KiB
C#

using Godot;
using System;
using System.Collections.Generic;
// Instantiate this scene and send all data to SetupDailogue()
// arg contains the speaker and the sentance for example "Sign|This is a test."
public partial class Dialogue : Node2D
{
string SpeakerName = null;
string SpeakerImage = null;
string Sentance = null;
Queue<string> Data = new Queue<string>();
float ScrollTimer = 0.05f; // Sec
float ScrollTimerReset = 0.05f;
public override void _Process(double delta)
{
if (Input.IsActionJustPressed("interact")) // Advance dialogue
{
AdvanceDialogue();
}
// Scroll text
ScrollTimer -= (float)delta;
if (Sentance != null && ScrollTimer <= 0)
{
ScrollTimer = ScrollTimerReset;
GetNode<RichTextLabel>("Dialogue").VisibleCharacters += 1;
}
}
public void SetupDialogue(string[] arg)
{
GetNode<RichTextLabel>("Dialogue").VisibleCharacters = 0;
// Set up data
foreach (string value in arg)
{
Data.Enqueue(value);
}
// Set up visuals & first dialogue option
if (Data.Count > 0)
{
// Get data
string[] OperatingData = Data.Dequeue().Split("|");
SpeakerName = OperatingData[0];
SpeakerImage = OperatingData[1];
Sentance = OperatingData[2];
//Display data
GetNode<Sprite2D>("Icon").Texture = (Godot.Texture2D)GD.Load($"res://Assets/Sprites/DialogueIcons/{SpeakerImage}.png");
GetNode<RichTextLabel>("SpeakerName").Text = SpeakerName;
GetNode<RichTextLabel>("Dialogue").Text = Sentance;
}
else // If there is nothing left delete the scene
{
QueueFree();
}
}
public void AdvanceDialogue()
{
// Determine wether to skip to the end or display the next sentance
if (GetNode<RichTextLabel>("Dialogue").GetTotalCharacterCount() > GetNode<RichTextLabel>("Dialogue").VisibleCharacters)
{
GetNode<RichTextLabel>("Dialogue").VisibleCharacters = GetNode<RichTextLabel>("Dialogue").GetTotalCharacterCount();
}
else
{
if (Data.Count > 0)
{
GetNode<RichTextLabel>("Dialogue").VisibleCharacters = 0;
// Get data
string[] OperatingData = Data.Dequeue().Split("|");
SpeakerName = OperatingData[0];
SpeakerImage = OperatingData[1];
Sentance = OperatingData[2];
//Display data
GetNode<Sprite2D>("Icon").Texture = (Godot.Texture2D)GD.Load($"res://Assets/Sprites/DialogueIcons/{SpeakerImage}.png");
GetNode<RichTextLabel>("SpeakerName").Text = SpeakerName;
GetNode<RichTextLabel>("Dialogue").Text = Sentance;
}
else // If there is nothing left delete the scene
{
QueueFree();
}
}
}
}