using UnityEngine; using Unity.GraphToolkit.Editor; using System; 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 DefaultDialogueLineOptionName = "DefaultDialogueLine"; 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(); 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($"{DefaultDialogueLineOptionName}{i + 1}").WithDisplayName($"Default Dialogue Line {i + 1}").Build(); } } else { context.AddInputPort($"{DefaultDialogueLineOptionName}").WithDisplayName("Default Dialogue Line").Build(); } context.AddInputPort($"{LoopThroughDefaultLinesOptionName}").WithDisplayName("Loop Through Default Lines?").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"; // 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 ForbiddenItemLineTypeOptionName = "ForbiddenItemDialogueLineType"; const string ForbiddenItemNoLinesOptionName = "ForbiddenItemNoLines"; const string LoopThroughForbiddenItemLinesOptionName = "LoopThroughForbiddenItemLines"; const string ForbiddenIteDialogueLineOptionName = "ForbiddenItemDialogueLine"; protected override void OnDefineOptions(IOptionDefinitionContext context) { base.OnDefineOptions(context); // Incorrect 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 context.AddOption(ForbiddenItemLineTypeOptionName) .WithDisplayName("Forbidden Item Line Type") .WithDefaultValue(DialogueType.SayOneLine) .Delayed(); context.AddOption(ForbiddenItemNoLinesOptionName) .WithDisplayName("Forbidden of Incorrect Item Lines") .WithDefaultValue(1) .Delayed(); } protected override void OnDefinePorts(IPortDefinitionContext context) { context.AddInputPort(RequiredSlotOptionName).WithDisplayName("Required Slot").Build(); base.OnDefinePorts(context); // Incorrect var incorrectItemLineTypeOption = GetNodeOptionByName(IncorrectItemLineTypeOptionName); incorrectItemLineTypeOption.TryGetValue(out var incorrectItemLineType); var incorrectItemLineCountOption = GetNodeOptionByName(IncorrectItemNoLinesOptionName); incorrectItemLineCountOption.TryGetValue(out var incorrectItemLineCount); if (incorrectItemLineType == DialogueType.SayMultipleLines) { for (var i = 0; i < incorrectItemLineCount; i++) { context.AddInputPort($"{IncorrectIteDialogueLineOptionName}{i + 1}").WithDisplayName($"Incorrect Item Dialogue Line {i + 1}").Build(); } } else { context.AddInputPort($"{IncorrectIteDialogueLineOptionName}").WithDisplayName("Incorrect Item Dialogue Line").Build(); } context.AddInputPort($"{LoopThroughIncorrectItemLinesOptionName}").WithDisplayName("Loop Through Incorrect Item Lines?").Build(); // Forbidden var forbiddenItemLineTypeOption = GetNodeOptionByName(ForbiddenItemLineTypeOptionName); forbiddenItemLineTypeOption.TryGetValue(out var forbiddenItemLineType); var forbiddenItemLineCountOption = GetNodeOptionByName(ForbiddenItemNoLinesOptionName); forbiddenItemLineCountOption.TryGetValue(out var forbiddenItemLineCount); if (forbiddenItemLineType == DialogueType.SayMultipleLines) { for (var i = 0; i < forbiddenItemLineCount; i++) { context.AddInputPort($"{ForbiddenIteDialogueLineOptionName}{i + 1}").WithDisplayName($"Forbidden Item Dialogue Line {i + 1}").Build(); } } else { context.AddInputPort($"{ForbiddenIteDialogueLineOptionName}").WithDisplayName("Forbidden Item Dialogue Line").Build(); } context.AddInputPort($"{LoopThroughForbiddenItemLinesOptionName}").WithDisplayName("Loop Through Forbidden Item Lines?").Build(); } } }