using UnityEngine; using Unity.GraphToolkit.Editor; using System; using Dialogue; namespace Editor.Dialogue { [Serializable] public class StartNode : Node { protected override void OnDefinePorts(IPortDefinitionContext context) { context.AddOutputPort("out").Build(); context.AddInputPort("SpeakerName").Build(); } } [Serializable] public class EndNode : Node { protected override void OnDefinePorts(IPortDefinitionContext context) { context.AddInputPort("in").Build(); } } [Serializable] public enum DialogueType { SayOneLine, SayMultipleLines } [Serializable] public class DialogueNode : Node { const string LineTypeOptionName = "DialogueLineType"; const string NoLinesOptionName = "NoLines"; const string LoopThroughDefaultLinesOptionName = "LoopThroughDefaultLines"; const string DefaultDialogueContentOptionName = "DefaultDialogueContent"; protected override void OnDefineOptions(IOptionDefinitionContext context) { context.AddOption(LineTypeOptionName) .WithDisplayName("Default Line Type") .WithDefaultValue(DialogueType.SayOneLine) .Delayed(); context.AddOption(NoLinesOptionName) .WithDisplayName("Number of Default Lines") .WithDefaultValue(1) .Delayed(); } protected override void OnDefinePorts(IPortDefinitionContext context) { context.AddInputPort("in").Build(); context.AddOutputPort("out").Build(); // Get line type and count options var lineTypeOption = GetNodeOptionByName(LineTypeOptionName); lineTypeOption.TryGetValue(out var lineType); var lineCountOption = GetNodeOptionByName(NoLinesOptionName); lineCountOption.TryGetValue(out var lineCount); if (lineType == DialogueType.SayMultipleLines) { for (var i = 0; i < lineCount; i++) { context.AddInputPort($"{DefaultDialogueContentOptionName}{i + 1}") .WithDisplayName($"Dialogue Content {i + 1}") .Build(); } } else { context.AddInputPort($"{DefaultDialogueContentOptionName}") .WithDisplayName("Dialogue Content") .Build(); } context.AddInputPort($"{LoopThroughDefaultLinesOptionName}") .WithDisplayName("Loop Through Content?") .Build(); } } [Serializable] public class WaitOnPuzzleStep : DialogueNode { const string RequiredPuzzleStep = "RequiredPuzzleStep"; protected override void OnDefinePorts(IPortDefinitionContext context) { context.AddInputPort(RequiredPuzzleStep).WithDisplayName("Required Puzzle Step").Build(); base.OnDefinePorts(context); } } [Serializable] public class WaitOnPickup : DialogueNode { const string RequiredPickupsOptionName = "RequiredPickup"; protected override void OnDefinePorts(IPortDefinitionContext context) { context.AddInputPort(RequiredPickupsOptionName).WithDisplayName("Required Pickup").Build(); base.OnDefinePorts(context); } } [Serializable] public class WaitOnSlot : DialogueNode { const string RequiredSlotOptionName = "RequiredSlot"; const string IncorrectItemLineTypeOptionName = "IncorrectItemDialogueLineType"; const string IncorrectItemNoLinesOptionName = "IncorrectItemNoLines"; const string LoopThroughIncorrectItemLinesOptionName = "LoopThroughIncorrectItemLines"; const string IncorrectItemDialogueContentOptionName = "IncorrectItemDialogueContent"; const string ForbiddenItemLineTypeOptionName = "ForbiddenItemDialogueLineType"; const string ForbiddenItemNoLinesOptionName = "ForbiddenItemNoLines"; const string LoopThroughForbiddenItemLinesOptionName = "LoopThroughForbiddenItemLines"; const string ForbiddenItemDialogueContentOptionName = "ForbiddenItemDialogueContent"; protected override void OnDefineOptions(IOptionDefinitionContext context) { base.OnDefineOptions(context); // Incorrect item options context.AddOption(IncorrectItemLineTypeOptionName) .WithDisplayName("Incorrect Item Line Type") .WithDefaultValue(DialogueType.SayOneLine) .Delayed(); context.AddOption(IncorrectItemNoLinesOptionName) .WithDisplayName("Number of Incorrect Item Lines") .WithDefaultValue(1) .Delayed(); // Forbidden item options context.AddOption(ForbiddenItemLineTypeOptionName) .WithDisplayName("Forbidden Item Line Type") .WithDefaultValue(DialogueType.SayOneLine) .Delayed(); context.AddOption(ForbiddenItemNoLinesOptionName) .WithDisplayName("Number of Forbidden Item Lines") .WithDefaultValue(1) .Delayed(); } protected override void OnDefinePorts(IPortDefinitionContext context) { context.AddInputPort(RequiredSlotOptionName).WithDisplayName("Required Slot").Build(); base.OnDefinePorts(context); // Process Incorrect Item content var incorrectItemLineTypeOption = GetNodeOptionByName(IncorrectItemLineTypeOptionName); incorrectItemLineTypeOption.TryGetValue(out var incorrectItemLineType); var incorrectItemLineCountOption = GetNodeOptionByName(IncorrectItemNoLinesOptionName); incorrectItemLineCountOption.TryGetValue(out var incorrectItemLineCount); // Add DialogueContent ports for incorrect item content if (incorrectItemLineType == DialogueType.SayMultipleLines) { for (var i = 0; i < incorrectItemLineCount; i++) { context.AddInputPort($"{IncorrectItemDialogueContentOptionName}{i + 1}") .WithDisplayName($"Incorrect Item Content {i + 1}") .Build(); } } else { context.AddInputPort($"{IncorrectItemDialogueContentOptionName}") .WithDisplayName("Incorrect Item Content") .Build(); } context.AddInputPort($"{LoopThroughIncorrectItemLinesOptionName}") .WithDisplayName("Loop Through Incorrect Content?") .Build(); // Process Forbidden Item content var forbiddenItemLineTypeOption = GetNodeOptionByName(ForbiddenItemLineTypeOptionName); forbiddenItemLineTypeOption.TryGetValue(out var forbiddenItemLineType); var forbiddenItemLineCountOption = GetNodeOptionByName(ForbiddenItemNoLinesOptionName); forbiddenItemLineCountOption.TryGetValue(out var forbiddenItemLineCount); // Add DialogueContent ports for forbidden item content if (forbiddenItemLineType == DialogueType.SayMultipleLines) { for (var i = 0; i < forbiddenItemLineCount; i++) { context.AddInputPort($"{ForbiddenItemDialogueContentOptionName}{i + 1}") .WithDisplayName($"Forbidden Item Content {i + 1}") .Build(); } } else { context.AddInputPort($"{ForbiddenItemDialogueContentOptionName}") .WithDisplayName("Forbidden Item Content") .Build(); } context.AddInputPort($"{LoopThroughForbiddenItemLinesOptionName}") .WithDisplayName("Loop Through Forbidden Content?") .Build(); } } [Serializable] public class WaitOnCombination : DialogueNode { const string RequiredResultItemOptionName = "RequiredResultItem"; protected override void OnDefinePorts(IPortDefinitionContext context) { context.AddInputPort(RequiredResultItemOptionName).WithDisplayName("Required Result Item").Build(); base.OnDefinePorts(context); } } }