Working dialogue images mixed with text

This commit is contained in:
Michal Pikulski
2025-10-08 11:27:27 +02:00
parent 1a05f89226
commit 5ad3ae8815
9 changed files with 485 additions and 363 deletions

View File

@@ -111,24 +111,42 @@ namespace Editor.Dialogue
var lineCountOption = node.GetNodeOptionByName("NoLines");
lineCountOption.TryGetValue<int>(out var lineCount);
// Process dialogue lines based on line type
// Process dialogue content
if (lineType == DialogueType.SayMultipleLines)
{
for (var i = 0; i < lineCount; i++)
{
var lineValue = GetPortValue<string>(node.GetInputPortByName($"DefaultDialogueLine{i + 1}"));
if (!string.IsNullOrEmpty(lineValue))
var contentPort = node.GetInputPortByName($"DefaultDialogueContent{i + 1}");
var contentValue = GetPortValue<DialogueContent>(contentPort);
if (contentValue != null)
{
runtimeNode.dialogueLines.Add(lineValue);
// Add to dialogueContent list
runtimeNode.dialogueContent.Add(contentValue);
// Also add to legacy dialogueLines list for backward compatibility
if (contentValue.ContentType == DialogueContentType.Text && !string.IsNullOrEmpty(contentValue.Text))
{
runtimeNode.dialogueLines.Add(contentValue.Text);
}
}
}
}
else
{
var lineValue = GetPortValue<string>(node.GetInputPortByName("DefaultDialogueLine"));
if (!string.IsNullOrEmpty(lineValue))
var contentPort = node.GetInputPortByName("DefaultDialogueContent");
var contentValue = GetPortValue<DialogueContent>(contentPort);
if (contentValue != null)
{
runtimeNode.dialogueLines.Add(lineValue);
// Add to dialogueContent list
runtimeNode.dialogueContent.Add(contentValue);
// Also add to legacy dialogueLines list for backward compatibility
if (contentValue.ContentType == DialogueContentType.Text && !string.IsNullOrEmpty(contentValue.Text))
{
runtimeNode.dialogueLines.Add(contentValue.Text);
}
}
}
@@ -169,60 +187,98 @@ namespace Editor.Dialogue
runtimeNode.slotItemID = slot.itemId;
}
// Process incorrect item lines
// Get line type and count options for incorrect items
var incorrectItemLineTypeOption = node.GetNodeOptionByName("IncorrectItemDialogueLineType");
incorrectItemLineTypeOption.TryGetValue<DialogueType>(out var incorrectItemLineType);
var incorrectItemLineCountOption = node.GetNodeOptionByName("IncorrectItemNoLines");
incorrectItemLineCountOption.TryGetValue<int>(out var incorrectItemLineCount);
// Process incorrect item content
if (incorrectItemLineType == DialogueType.SayMultipleLines)
{
for (var i = 0; i < incorrectItemLineCount; i++)
{
var lineValue = GetPortValue<string>(node.GetInputPortByName($"IncorrectItemDialogueLine{i + 1}"));
if (!string.IsNullOrEmpty(lineValue))
var contentPort = node.GetInputPortByName($"IncorrectItemDialogueContent{i + 1}");
var contentValue = GetPortValue<DialogueContent>(contentPort);
if (contentValue != null)
{
runtimeNode.incorrectItemLines.Add(lineValue);
// Add to incorrectItemContent list
runtimeNode.incorrectItemContent.Add(contentValue);
// Also add to legacy incorrectItemLines list for backward compatibility
if (contentValue.ContentType == DialogueContentType.Text && !string.IsNullOrEmpty(contentValue.Text))
{
runtimeNode.incorrectItemLines.Add(contentValue.Text);
}
}
}
}
else
{
var lineValue = GetPortValue<string>(node.GetInputPortByName("IncorrectItemDialogueLine"));
if (!string.IsNullOrEmpty(lineValue))
var contentPort = node.GetInputPortByName("IncorrectItemDialogueContent");
var contentValue = GetPortValue<DialogueContent>(contentPort);
if (contentValue != null)
{
runtimeNode.incorrectItemLines.Add(lineValue);
// Add to incorrectItemContent list
runtimeNode.incorrectItemContent.Add(contentValue);
// Also add to legacy incorrectItemLines list for backward compatibility
if (contentValue.ContentType == DialogueContentType.Text && !string.IsNullOrEmpty(contentValue.Text))
{
runtimeNode.incorrectItemLines.Add(contentValue.Text);
}
}
}
runtimeNode.loopThroughIncorrectLines =
GetPortValue<bool>(node.GetInputPortByName("LoopThroughIncorrectItemLines"));
// Process forbidden item lines
// Get line type and count options for forbidden items
var forbiddenItemLineTypeOption = node.GetNodeOptionByName("ForbiddenItemDialogueLineType");
forbiddenItemLineTypeOption.TryGetValue<DialogueType>(out var forbiddenItemLineType);
var forbiddenItemLineCountOption = node.GetNodeOptionByName("ForbiddenItemNoLines");
forbiddenItemLineCountOption.TryGetValue<int>(out var forbiddenItemLineCount);
// Process forbidden item content
if (forbiddenItemLineType == DialogueType.SayMultipleLines)
{
for (var i = 0; i < forbiddenItemLineCount; i++)
{
var lineValue = GetPortValue<string>(node.GetInputPortByName($"ForbiddenItemDialogueLine{i + 1}"));
if (!string.IsNullOrEmpty(lineValue))
var contentPort = node.GetInputPortByName($"ForbiddenItemDialogueContent{i + 1}");
var contentValue = GetPortValue<DialogueContent>(contentPort);
if (contentValue != null)
{
runtimeNode.forbiddenItemLines.Add(lineValue);
// Add to forbiddenItemContent list
runtimeNode.forbiddenItemContent.Add(contentValue);
// Also add to legacy forbiddenItemLines list for backward compatibility
if (contentValue.ContentType == DialogueContentType.Text && !string.IsNullOrEmpty(contentValue.Text))
{
runtimeNode.forbiddenItemLines.Add(contentValue.Text);
}
}
}
}
else
{
var lineValue = GetPortValue<string>(node.GetInputPortByName("ForbiddenItemDialogueLine"));
if (!string.IsNullOrEmpty(lineValue))
var contentPort = node.GetInputPortByName("ForbiddenItemDialogueContent");
var contentValue = GetPortValue<DialogueContent>(contentPort);
if (contentValue != null)
{
runtimeNode.forbiddenItemLines.Add(lineValue);
// Add to forbiddenItemContent list
runtimeNode.forbiddenItemContent.Add(contentValue);
// Also add to legacy forbiddenItemLines list for backward compatibility
if (contentValue.ContentType == DialogueContentType.Text && !string.IsNullOrEmpty(contentValue.Text))
{
runtimeNode.forbiddenItemLines.Add(contentValue.Text);
}
}
}
@@ -259,4 +315,4 @@ namespace Editor.Dialogue
return fallbackValue;
}
}
}
}

View File

@@ -1,6 +1,7 @@
using UnityEngine;
using Unity.GraphToolkit.Editor;
using System;
using Dialogue;
namespace Editor.Dialogue
{
@@ -37,8 +38,7 @@ namespace Editor.Dialogue
const string LineTypeOptionName = "DialogueLineType";
const string NoLinesOptionName = "NoLines";
const string LoopThroughDefaultLinesOptionName = "LoopThroughDefaultLines";
const string DefaultDialogueLineOptionName = "DefaultDialogueLine";
const string DefaultDialogueContentOptionName = "DefaultDialogueContent";
protected override void OnDefineOptions(IOptionDefinitionContext context)
{
@@ -47,7 +47,6 @@ namespace Editor.Dialogue
.WithDefaultValue(DialogueType.SayOneLine)
.Delayed();
context.AddOption<int>(NoLinesOptionName)
.WithDisplayName("Number of Default Lines")
.WithDefaultValue(1)
@@ -59,6 +58,7 @@ namespace Editor.Dialogue
context.AddInputPort("in").Build();
context.AddOutputPort("out").Build();
// Get line type and count options
var lineTypeOption = GetNodeOptionByName(LineTypeOptionName);
lineTypeOption.TryGetValue<DialogueType>(out var lineType);
var lineCountOption = GetNodeOptionByName(NoLinesOptionName);
@@ -68,15 +68,21 @@ namespace Editor.Dialogue
{
for (var i = 0; i < lineCount; i++)
{
context.AddInputPort<string>($"{DefaultDialogueLineOptionName}{i + 1}").WithDisplayName($"Default Dialogue Line {i + 1}").Build();
context.AddInputPort<DialogueContent>($"{DefaultDialogueContentOptionName}{i + 1}")
.WithDisplayName($"Dialogue Content {i + 1}")
.Build();
}
}
else
{
context.AddInputPort<string>($"{DefaultDialogueLineOptionName}").WithDisplayName("Default Dialogue Line").Build();
context.AddInputPort<DialogueContent>($"{DefaultDialogueContentOptionName}")
.WithDisplayName("Dialogue Content")
.Build();
}
context.AddInputPort<bool>($"{LoopThroughDefaultLinesOptionName}").WithDisplayName("Loop Through Default Lines?").Build();
context.AddInputPort<bool>($"{LoopThroughDefaultLinesOptionName}")
.WithDisplayName("Loop Through Content?")
.Build();
}
}
@@ -110,38 +116,39 @@ namespace Editor.Dialogue
public class WaitOnSlot : DialogueNode
{
const string RequiredSlotOptionName = "RequiredSlot";
// Incorrect item - i.e. not the correct one but also not forbidden
const string IncorrectItemLineTypeOptionName = "IncorrectItemDialogueLineType";
const string IncorrectItemNoLinesOptionName = "IncorrectItemNoLines";
const string LoopThroughIncorrectItemLinesOptionName = "LoopThroughIncorrectItemLines";
const string IncorrectIteDialogueLineOptionName = "IncorrectItemDialogueLine";
// Explicitely forbidden item
const string IncorrectItemDialogueContentOptionName = "IncorrectItemDialogueContent";
const string ForbiddenItemLineTypeOptionName = "ForbiddenItemDialogueLineType";
const string ForbiddenItemNoLinesOptionName = "ForbiddenItemNoLines";
const string LoopThroughForbiddenItemLinesOptionName = "LoopThroughForbiddenItemLines";
const string ForbiddenIteDialogueLineOptionName = "ForbiddenItemDialogueLine";
const string ForbiddenItemDialogueContentOptionName = "ForbiddenItemDialogueContent";
protected override void OnDefineOptions(IOptionDefinitionContext context)
{
base.OnDefineOptions(context);
// Incorrect
// Incorrect item options
context.AddOption<DialogueType>(IncorrectItemLineTypeOptionName)
.WithDisplayName("Incorrect Item Line Type")
.WithDefaultValue(DialogueType.SayOneLine)
.Delayed();
context.AddOption<int>(IncorrectItemNoLinesOptionName)
.WithDisplayName("Number of Incorrect Item Lines")
.WithDefaultValue(1)
.Delayed();
// Forbidden
// Forbidden item options
context.AddOption<DialogueType>(ForbiddenItemLineTypeOptionName)
.WithDisplayName("Forbidden Item Line Type")
.WithDefaultValue(DialogueType.SayOneLine)
.Delayed();
context.AddOption<int>(ForbiddenItemNoLinesOptionName)
.WithDisplayName("Forbidden of Incorrect Item Lines")
.WithDisplayName("Number of Forbidden Item Lines")
.WithDefaultValue(1)
.Delayed();
}
@@ -152,45 +159,59 @@ namespace Editor.Dialogue
base.OnDefinePorts(context);
// Incorrect
// Process Incorrect Item content
var incorrectItemLineTypeOption = GetNodeOptionByName(IncorrectItemLineTypeOptionName);
incorrectItemLineTypeOption.TryGetValue<DialogueType>(out var incorrectItemLineType);
var incorrectItemLineCountOption = GetNodeOptionByName(IncorrectItemNoLinesOptionName);
incorrectItemLineCountOption.TryGetValue<int>(out var incorrectItemLineCount);
// Add DialogueContent ports for incorrect item content
if (incorrectItemLineType == DialogueType.SayMultipleLines)
{
for (var i = 0; i < incorrectItemLineCount; i++)
{
context.AddInputPort<string>($"{IncorrectIteDialogueLineOptionName}{i + 1}").WithDisplayName($"Incorrect Item Dialogue Line {i + 1}").Build();
context.AddInputPort<DialogueContent>($"{IncorrectItemDialogueContentOptionName}{i + 1}")
.WithDisplayName($"Incorrect Item Content {i + 1}")
.Build();
}
}
else
{
context.AddInputPort<string>($"{IncorrectIteDialogueLineOptionName}").WithDisplayName("Incorrect Item Dialogue Line").Build();
context.AddInputPort<DialogueContent>($"{IncorrectItemDialogueContentOptionName}")
.WithDisplayName("Incorrect Item Content")
.Build();
}
context.AddInputPort<bool>($"{LoopThroughIncorrectItemLinesOptionName}").WithDisplayName("Loop Through Incorrect Item Lines?").Build();
context.AddInputPort<bool>($"{LoopThroughIncorrectItemLinesOptionName}")
.WithDisplayName("Loop Through Incorrect Content?")
.Build();
// Forbidden
// Process Forbidden Item content
var forbiddenItemLineTypeOption = GetNodeOptionByName(ForbiddenItemLineTypeOptionName);
forbiddenItemLineTypeOption.TryGetValue<DialogueType>(out var forbiddenItemLineType);
var forbiddenItemLineCountOption = GetNodeOptionByName(ForbiddenItemNoLinesOptionName);
forbiddenItemLineCountOption.TryGetValue<int>(out var forbiddenItemLineCount);
// Add DialogueContent ports for forbidden item content
if (forbiddenItemLineType == DialogueType.SayMultipleLines)
{
for (var i = 0; i < forbiddenItemLineCount; i++)
{
context.AddInputPort<string>($"{ForbiddenIteDialogueLineOptionName}{i + 1}").WithDisplayName($"Forbidden Item Dialogue Line {i + 1}").Build();
context.AddInputPort<DialogueContent>($"{ForbiddenItemDialogueContentOptionName}{i + 1}")
.WithDisplayName($"Forbidden Item Content {i + 1}")
.Build();
}
}
else
{
context.AddInputPort<string>($"{ForbiddenIteDialogueLineOptionName}").WithDisplayName("Forbidden Item Dialogue Line").Build();
context.AddInputPort<DialogueContent>($"{ForbiddenItemDialogueContentOptionName}")
.WithDisplayName("Forbidden Item Content")
.Build();
}
context.AddInputPort<bool>($"{LoopThroughForbiddenItemLinesOptionName}").WithDisplayName("Loop Through Forbidden Item Lines?").Build();
context.AddInputPort<bool>($"{LoopThroughForbiddenItemLinesOptionName}")
.WithDisplayName("Loop Through Forbidden Content?")
.Build();
}
}