Rework source gen
authorLiza Carvelli <liza@carvel.li>
Sat, 17 Aug 2024 18:59:42 +0000 (20:59 +0200)
committerLiza Carvelli <liza@carvel.li>
Sat, 17 Aug 2024 19:01:46 +0000 (21:01 +0200)
20 files changed:
QuestPathGenerator/RoslynElements/AethernetShortcutExtensions.cs [new file with mode: 0644]
QuestPathGenerator/RoslynElements/ChatMessageExtensions.cs [new file with mode: 0644]
QuestPathGenerator/RoslynElements/ComplexCombatDataExtensions.cs [new file with mode: 0644]
QuestPathGenerator/RoslynElements/DialogueChoiceExtensions.cs [new file with mode: 0644]
QuestPathGenerator/RoslynElements/ExcelRefExtensions.cs [new file with mode: 0644]
QuestPathGenerator/RoslynElements/GatheredItemExtensions.cs [new file with mode: 0644]
QuestPathGenerator/RoslynElements/GatheringLocationExtensions.cs [new file with mode: 0644]
QuestPathGenerator/RoslynElements/GatheringNodeExtensions.cs [new file with mode: 0644]
QuestPathGenerator/RoslynElements/GatheringNodeGroupExtensions.cs [new file with mode: 0644]
QuestPathGenerator/RoslynElements/JumpDestinationExtensions.cs [new file with mode: 0644]
QuestPathGenerator/RoslynElements/LeveIdExtensions.cs [new file with mode: 0644]
QuestPathGenerator/RoslynElements/QuestIdExtensions.cs [new file with mode: 0644]
QuestPathGenerator/RoslynElements/QuestStepExtensions.cs [new file with mode: 0644]
QuestPathGenerator/RoslynElements/QuestWorkValueExtensions.cs [new file with mode: 0644]
QuestPathGenerator/RoslynElements/SatisfactionSupplyIdExtensions.cs [new file with mode: 0644]
QuestPathGenerator/RoslynElements/SkipConditionsExtensions.cs [new file with mode: 0644]
QuestPathGenerator/RoslynElements/Vector3Extensions.cs [new file with mode: 0644]
QuestPathGenerator/RoslynShortcuts.cs
QuestPaths/quest-v1.json
Questionable.Model/Questing/SkipAetheryteCondition.cs

diff --git a/QuestPathGenerator/RoslynElements/AethernetShortcutExtensions.cs b/QuestPathGenerator/RoslynElements/AethernetShortcutExtensions.cs
new file mode 100644 (file)
index 0000000..c2db7c7
--- /dev/null
@@ -0,0 +1,29 @@
+using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
+using Questionable.Model.Common;
+using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
+using static Questionable.QuestPathGenerator.RoslynShortcuts;
+
+namespace Questionable.QuestPathGenerator.RoslynElements;
+
+internal static class AethernetShortcutExtensions
+{
+    public static ExpressionSyntax ToExpressionSyntax(this AethernetShortcut aethernetShortcut)
+    {
+        return ObjectCreationExpression(
+                IdentifierName(nameof(AethernetShortcut)))
+            .WithInitializer(
+                InitializerExpression(
+                    SyntaxKind.ObjectInitializerExpression,
+                    SeparatedList<ExpressionSyntax>(
+                        SyntaxNodeList(
+                            Assignment<EAetheryteLocation?>(nameof(AethernetShortcut.From),
+                                    aethernetShortcut.From,
+                                    null)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment<EAetheryteLocation?>(nameof(AethernetShortcut.To),
+                                    aethernetShortcut.To,
+                                    null)
+                                .AsSyntaxNodeOrToken()))));
+    }
+}
diff --git a/QuestPathGenerator/RoslynElements/ChatMessageExtensions.cs b/QuestPathGenerator/RoslynElements/ChatMessageExtensions.cs
new file mode 100644 (file)
index 0000000..29e0cb6
--- /dev/null
@@ -0,0 +1,28 @@
+using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
+using Questionable.Model.Questing;
+using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
+using static Questionable.QuestPathGenerator.RoslynShortcuts;
+
+namespace Questionable.QuestPathGenerator.RoslynElements;
+
+internal static class ChatMessageExtensions
+{
+    public static ExpressionSyntax ToExpressionSyntax(this ChatMessage chatMessage)
+    {
+        ChatMessage emptyMessage = new();
+        return ObjectCreationExpression(
+                IdentifierName(nameof(ChatMessage)))
+            .WithInitializer(
+                InitializerExpression(
+                    SyntaxKind.ObjectInitializerExpression,
+                    SeparatedList<ExpressionSyntax>(
+                        SyntaxNodeList(
+                            Assignment(nameof(ChatMessage.ExcelSheet), chatMessage.ExcelSheet,
+                                    emptyMessage.ExcelSheet)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(ChatMessage.Key), chatMessage.Key,
+                                    emptyMessage.Key)
+                                .AsSyntaxNodeOrToken()))));
+    }
+}
diff --git a/QuestPathGenerator/RoslynElements/ComplexCombatDataExtensions.cs b/QuestPathGenerator/RoslynElements/ComplexCombatDataExtensions.cs
new file mode 100644 (file)
index 0000000..f683890
--- /dev/null
@@ -0,0 +1,42 @@
+using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
+using Questionable.Model.Questing;
+using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
+using static Questionable.QuestPathGenerator.RoslynShortcuts;
+
+namespace Questionable.QuestPathGenerator.RoslynElements;
+
+internal static class ComplexCombatDataExtensions
+{
+    public static ExpressionSyntax ToExpressionSyntax(this ComplexCombatData complexCombatData)
+    {
+        var emptyData = new ComplexCombatData();
+        return ObjectCreationExpression(
+                IdentifierName(nameof(ComplexCombatData)))
+            .WithInitializer(
+                InitializerExpression(
+                    SyntaxKind.ObjectInitializerExpression,
+                    SeparatedList<ExpressionSyntax>(
+                        SyntaxNodeList(
+                            Assignment(nameof(ComplexCombatData.DataId), complexCombatData.DataId,
+                                    emptyData.DataId)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(ComplexCombatData.MinimumKillCount),
+                                    complexCombatData.MinimumKillCount, emptyData.MinimumKillCount)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(ComplexCombatData.RewardItemId),
+                                    complexCombatData.RewardItemId,
+                                    emptyData.RewardItemId)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(ComplexCombatData.RewardItemCount),
+                                    complexCombatData.RewardItemCount,
+                                    emptyData.RewardItemCount)
+                                .AsSyntaxNodeOrToken(),
+                            AssignmentList(nameof(ComplexCombatData.CompletionQuestVariablesFlags),
+                                complexCombatData.CompletionQuestVariablesFlags),
+                            Assignment(nameof(ComplexCombatData.IgnoreQuestMarker),
+                                    complexCombatData.IgnoreQuestMarker,
+                                    emptyData.IgnoreQuestMarker)
+                                .AsSyntaxNodeOrToken()))));
+    }
+}
diff --git a/QuestPathGenerator/RoslynElements/DialogueChoiceExtensions.cs b/QuestPathGenerator/RoslynElements/DialogueChoiceExtensions.cs
new file mode 100644 (file)
index 0000000..18de00c
--- /dev/null
@@ -0,0 +1,43 @@
+using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
+using Questionable.Model.Questing;
+using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
+using static Questionable.QuestPathGenerator.RoslynShortcuts;
+
+namespace Questionable.QuestPathGenerator.RoslynElements;
+
+internal static class DialogueChoiceExtensions
+{
+    public static ExpressionSyntax ToExpressionSyntax(this DialogueChoice dialogueChoice)
+    {
+        DialogueChoice emptyChoice = new();
+        return ObjectCreationExpression(
+                IdentifierName(nameof(DialogueChoice)))
+            .WithInitializer(
+                InitializerExpression(
+                    SyntaxKind.ObjectInitializerExpression,
+                    SeparatedList<ExpressionSyntax>(
+                        SyntaxNodeList(
+                            Assignment<EDialogChoiceType?>(nameof(DialogueChoice.Type), dialogueChoice.Type,
+                                    null)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(DialogueChoice.ExcelSheet), dialogueChoice.ExcelSheet,
+                                    emptyChoice.ExcelSheet)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(DialogueChoice.Prompt), dialogueChoice.Prompt,
+                                    emptyChoice.Prompt)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(DialogueChoice.Yes), dialogueChoice.Yes, emptyChoice.Yes)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(DialogueChoice.Answer), dialogueChoice.Answer,
+                                    emptyChoice.Answer)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(DialogueChoice.AnswerIsRegularExpression),
+                                    dialogueChoice.AnswerIsRegularExpression,
+                                    emptyChoice.AnswerIsRegularExpression)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(DialogueChoice.DataId), dialogueChoice.DataId,
+                                    emptyChoice.DataId)
+                                .AsSyntaxNodeOrToken()))));
+    }
+}
diff --git a/QuestPathGenerator/RoslynElements/ExcelRefExtensions.cs b/QuestPathGenerator/RoslynElements/ExcelRefExtensions.cs
new file mode 100644 (file)
index 0000000..2b111b2
--- /dev/null
@@ -0,0 +1,30 @@
+using System;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
+using Questionable.Model.Questing;
+using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
+using static Questionable.QuestPathGenerator.RoslynShortcuts;
+
+namespace Questionable.QuestPathGenerator.RoslynElements;
+
+internal static class ExcelRefExtensions
+{
+    public static ExpressionSyntax ToExpressionSyntax(this ExcelRef excelRef)
+    {
+        if (excelRef.Type == ExcelRef.EType.Key)
+            return ObjectCreationExpression(
+                    IdentifierName(nameof(ExcelRef)))
+                .WithArgumentList(
+                    ArgumentList(
+                        SingletonSeparatedList(
+                            Argument(LiteralValue(excelRef.AsKey())))));
+        else if (excelRef.Type == ExcelRef.EType.RowId)
+            return ObjectCreationExpression(
+                    IdentifierName(nameof(ExcelRef)))
+                .WithArgumentList(
+                    ArgumentList(
+                        SingletonSeparatedList(
+                            Argument(LiteralValue(excelRef.AsRowId())))));
+        else
+            throw new Exception($"Unsupported ExcelRef type {excelRef.Type}");
+    }
+}
diff --git a/QuestPathGenerator/RoslynElements/GatheredItemExtensions.cs b/QuestPathGenerator/RoslynElements/GatheredItemExtensions.cs
new file mode 100644 (file)
index 0000000..179c7a6
--- /dev/null
@@ -0,0 +1,38 @@
+using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
+using Questionable.Model.Questing;
+using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
+using static Questionable.QuestPathGenerator.RoslynShortcuts;
+
+namespace Questionable.QuestPathGenerator.RoslynElements;
+
+internal static class GatheredItemExtensions
+{
+    public static ExpressionSyntax ToExpressionSyntax(this GatheredItem gatheredItem)
+    {
+        var emptyItem = new GatheredItem();
+        return ObjectCreationExpression(
+                IdentifierName(nameof(GatheredItem)))
+            .WithInitializer(
+                InitializerExpression(
+                    SyntaxKind.ObjectInitializerExpression,
+                    SeparatedList<ExpressionSyntax>(
+                        SyntaxNodeList(
+                            Assignment(nameof(GatheredItem.ItemId), gatheredItem.ItemId, emptyItem.ItemId)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(GatheredItem.AlternativeItemId),
+                                    gatheredItem.AlternativeItemId,
+                                    emptyItem.AlternativeItemId)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(GatheredItem.ItemCount), gatheredItem.ItemCount,
+                                    emptyItem.ItemCount)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(GatheredItem.Collectability), gatheredItem.Collectability,
+                                    emptyItem.Collectability)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(GatheredItem.QuestAcceptedAsClass),
+                                    gatheredItem.QuestAcceptedAsClass,
+                                    emptyItem.QuestAcceptedAsClass)
+                                .AsSyntaxNodeOrToken()))));
+    }
+}
diff --git a/QuestPathGenerator/RoslynElements/GatheringLocationExtensions.cs b/QuestPathGenerator/RoslynElements/GatheringLocationExtensions.cs
new file mode 100644 (file)
index 0000000..7d02a0e
--- /dev/null
@@ -0,0 +1,34 @@
+using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
+using Questionable.Model.Gathering;
+using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
+using static Questionable.QuestPathGenerator.RoslynShortcuts;
+
+namespace Questionable.QuestPathGenerator.RoslynElements;
+
+internal static class GatheringLocationExtensions
+{
+    public static ExpressionSyntax ToExpressionSyntax(this GatheringLocation location)
+    {
+        var emptyLocation = new GatheringLocation();
+        return ObjectCreationExpression(
+                IdentifierName(nameof(GatheringLocation)))
+            .WithInitializer(
+                InitializerExpression(
+                    SyntaxKind.ObjectInitializerExpression,
+                    SeparatedList<ExpressionSyntax>(
+                        SyntaxNodeList(
+                            Assignment(nameof(GatheringLocation.Position), location.Position,
+                                emptyLocation.Position).AsSyntaxNodeOrToken(),
+                            Assignment(nameof(GatheringLocation.MinimumAngle), location.MinimumAngle,
+                                emptyLocation.MinimumAngle).AsSyntaxNodeOrToken(),
+                            Assignment(nameof(GatheringLocation.MaximumAngle), location.MaximumAngle,
+                                emptyLocation.MaximumAngle).AsSyntaxNodeOrToken(),
+                            Assignment(nameof(GatheringLocation.MinimumDistance),
+                                    location.MinimumDistance, emptyLocation.MinimumDistance)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(GatheringLocation.MaximumDistance),
+                                    location.MaximumDistance, emptyLocation.MaximumDistance)
+                                .AsSyntaxNodeOrToken()))));
+    }
+}
diff --git a/QuestPathGenerator/RoslynElements/GatheringNodeExtensions.cs b/QuestPathGenerator/RoslynElements/GatheringNodeExtensions.cs
new file mode 100644 (file)
index 0000000..ed4608e
--- /dev/null
@@ -0,0 +1,29 @@
+using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
+using Questionable.Model.Gathering;
+using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
+using static Questionable.QuestPathGenerator.RoslynShortcuts;
+
+namespace Questionable.QuestPathGenerator.RoslynElements;
+
+internal static class GatheringNodeExtensions
+{
+    public static ExpressionSyntax ToExpressionSyntax(this GatheringNode gatheringNode)
+    {
+        var emptyLocation = new GatheringNode();
+        return ObjectCreationExpression(
+                IdentifierName(nameof(GatheringNode)))
+            .WithInitializer(
+                InitializerExpression(
+                    SyntaxKind.ObjectInitializerExpression,
+                    SeparatedList<ExpressionSyntax>(
+                        SyntaxNodeList(
+                            Assignment(nameof(GatheringNode.DataId), gatheringNode.DataId,
+                                    emptyLocation.DataId)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(GatheringNode.Fly), gatheringNode.Fly, emptyLocation.Fly)
+                                .AsSyntaxNodeOrToken(),
+                            AssignmentList(nameof(GatheringNode.Locations), gatheringNode.Locations)
+                                .AsSyntaxNodeOrToken()))));
+    }
+}
diff --git a/QuestPathGenerator/RoslynElements/GatheringNodeGroupExtensions.cs b/QuestPathGenerator/RoslynElements/GatheringNodeGroupExtensions.cs
new file mode 100644 (file)
index 0000000..f3177a6
--- /dev/null
@@ -0,0 +1,23 @@
+using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
+using Questionable.Model.Gathering;
+using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
+using static Questionable.QuestPathGenerator.RoslynShortcuts;
+
+namespace Questionable.QuestPathGenerator.RoslynElements;
+
+internal static class GatheringNodeGroupExtensions
+{
+    public static ExpressionSyntax ToExpressionSyntax(this GatheringNodeGroup nodeGroup)
+    {
+        return ObjectCreationExpression(
+                IdentifierName(nameof(GatheringNodeGroup)))
+            .WithInitializer(
+                InitializerExpression(
+                    SyntaxKind.ObjectInitializerExpression,
+                    SeparatedList<ExpressionSyntax>(
+                        SyntaxNodeList(
+                            AssignmentList(nameof(GatheringNodeGroup.Nodes), nodeGroup.Nodes)
+                                .AsSyntaxNodeOrToken()))));
+    }
+}
diff --git a/QuestPathGenerator/RoslynElements/JumpDestinationExtensions.cs b/QuestPathGenerator/RoslynElements/JumpDestinationExtensions.cs
new file mode 100644 (file)
index 0000000..2a55d05
--- /dev/null
@@ -0,0 +1,33 @@
+using System.Numerics;
+using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
+using Questionable.Model.Questing;
+using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
+using static Questionable.QuestPathGenerator.RoslynShortcuts;
+
+namespace Questionable.QuestPathGenerator.RoslynElements;
+
+internal static class JumpDestinationExtensions
+{
+    public static ExpressionSyntax ToExpressionSyntax(this JumpDestination jumpDestination)
+    {
+        return ObjectCreationExpression(
+                IdentifierName(nameof(JumpDestination)))
+            .WithInitializer(
+                InitializerExpression(
+                    SyntaxKind.ObjectInitializerExpression,
+                    SeparatedList<ExpressionSyntax>(
+                        SyntaxNodeList(
+                            Assignment<Vector3?>(nameof(JumpDestination.Position), jumpDestination.Position,
+                                    null)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(JumpDestination.StopDistance), jumpDestination.StopDistance,
+                                    null)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(JumpDestination.DelaySeconds), jumpDestination.DelaySeconds,
+                                    null)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(JumpDestination.Type), jumpDestination.Type, default)
+                                .AsSyntaxNodeOrToken()))));
+    }
+}
diff --git a/QuestPathGenerator/RoslynElements/LeveIdExtensions.cs b/QuestPathGenerator/RoslynElements/LeveIdExtensions.cs
new file mode 100644 (file)
index 0000000..3bfd555
--- /dev/null
@@ -0,0 +1,19 @@
+using Microsoft.CodeAnalysis.CSharp.Syntax;
+using Questionable.Model.Questing;
+using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
+using static Questionable.QuestPathGenerator.RoslynShortcuts;
+
+namespace Questionable.QuestPathGenerator.RoslynElements;
+
+internal static class LeveIdExtensions
+{
+    public static ExpressionSyntax ToExpressionSyntax(this LeveId leveId)
+    {
+        return ObjectCreationExpression(
+                IdentifierName(nameof(LeveId)))
+            .WithArgumentList(
+                ArgumentList(
+                    SingletonSeparatedList(
+                        Argument(LiteralValue(leveId.Value)))));
+    }
+}
diff --git a/QuestPathGenerator/RoslynElements/QuestIdExtensions.cs b/QuestPathGenerator/RoslynElements/QuestIdExtensions.cs
new file mode 100644 (file)
index 0000000..fc9870e
--- /dev/null
@@ -0,0 +1,19 @@
+using Microsoft.CodeAnalysis.CSharp.Syntax;
+using Questionable.Model.Questing;
+using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
+using static Questionable.QuestPathGenerator.RoslynShortcuts;
+
+namespace Questionable.QuestPathGenerator.RoslynElements;
+
+internal static class QuestIdExtensions
+{
+    public static ExpressionSyntax ToExpressionSyntax(this QuestId questId)
+    {
+        return ObjectCreationExpression(
+                IdentifierName(nameof(QuestId)))
+            .WithArgumentList(
+                ArgumentList(
+                    SingletonSeparatedList(
+                        Argument(LiteralValue(questId.Value)))));
+    }
+}
diff --git a/QuestPathGenerator/RoslynElements/QuestStepExtensions.cs b/QuestPathGenerator/RoslynElements/QuestStepExtensions.cs
new file mode 100644 (file)
index 0000000..0e4e9dd
--- /dev/null
@@ -0,0 +1,135 @@
+using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
+using Questionable.Model.Questing;
+using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
+using static Questionable.QuestPathGenerator.RoslynShortcuts;
+
+namespace Questionable.QuestPathGenerator.RoslynElements;
+
+internal static class QuestStepExtensions
+{
+    public static ExpressionSyntax ToExpressionSyntax(this QuestStep step)
+    {
+        var emptyStep = new QuestStep();
+        return ObjectCreationExpression(
+                IdentifierName(nameof(QuestStep)))
+            .WithArgumentList(
+                ArgumentList(
+                    SeparatedList<ArgumentSyntax>(
+                        new SyntaxNodeOrToken[]
+                        {
+                            Argument(LiteralValue(step.InteractionType)),
+                            Token(SyntaxKind.CommaToken),
+                            Argument(LiteralValue(step.DataId)),
+                            Token(SyntaxKind.CommaToken),
+                            Argument(LiteralValue(step.Position)),
+                            Token(SyntaxKind.CommaToken),
+                            Argument(LiteralValue(step.TerritoryId))
+                        })))
+            .WithInitializer(
+                InitializerExpression(
+                    SyntaxKind.ObjectInitializerExpression,
+                    SeparatedList<ExpressionSyntax>(
+                        SyntaxNodeList(
+                            Assignment(nameof(QuestStep.StopDistance), step.StopDistance,
+                                    emptyStep.StopDistance)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(QuestStep.NpcWaitDistance), step.NpcWaitDistance,
+                                    emptyStep.NpcWaitDistance)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(QuestStep.TargetTerritoryId), step.TargetTerritoryId,
+                                    emptyStep.TargetTerritoryId)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(QuestStep.DelaySecondsAtStart), step.DelaySecondsAtStart,
+                                    emptyStep.DelaySecondsAtStart)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(QuestStep.Disabled), step.Disabled, emptyStep.Disabled)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(QuestStep.DisableNavmesh), step.DisableNavmesh,
+                                    emptyStep.DisableNavmesh)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(QuestStep.Mount), step.Mount, emptyStep.Mount)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(QuestStep.Fly), step.Fly, emptyStep.Fly)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(QuestStep.Land), step.Land, emptyStep.Land)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(QuestStep.Sprint), step.Sprint, emptyStep.Sprint)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(QuestStep.IgnoreDistanceToObject),
+                                    step.IgnoreDistanceToObject, emptyStep.IgnoreDistanceToObject)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(QuestStep.Comment), step.Comment, emptyStep.Comment)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(QuestStep.Aetheryte), step.Aetheryte, emptyStep.Aetheryte)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(QuestStep.AethernetShard), step.AethernetShard,
+                                    emptyStep.AethernetShard)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(QuestStep.AetheryteShortcut), step.AetheryteShortcut,
+                                    emptyStep.AetheryteShortcut)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(QuestStep.AethernetShortcut), step.AethernetShortcut,
+                                    emptyStep.AethernetShortcut)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(QuestStep.AetherCurrentId), step.AetherCurrentId,
+                                    emptyStep.AetherCurrentId)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(QuestStep.ItemId), step.ItemId, emptyStep.ItemId)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(QuestStep.GroundTarget), step.GroundTarget,
+                                    emptyStep.GroundTarget)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(QuestStep.ItemCount), step.ItemCount, emptyStep.ItemCount)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(QuestStep.Emote), step.Emote, emptyStep.Emote)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(QuestStep.ChatMessage), step.ChatMessage,
+                                    emptyStep.ChatMessage)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(QuestStep.Action), step.Action, emptyStep.Action)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(QuestStep.EnemySpawnType), step.EnemySpawnType,
+                                    emptyStep.EnemySpawnType)
+                                .AsSyntaxNodeOrToken(),
+                            AssignmentList(nameof(QuestStep.KillEnemyDataIds), step.KillEnemyDataIds)
+                                .AsSyntaxNodeOrToken(),
+                            AssignmentList(nameof(QuestStep.ComplexCombatData), step.ComplexCombatData)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(QuestStep.CombatDelaySecondsAtStart),
+                                    step.CombatDelaySecondsAtStart,
+                                    emptyStep.CombatDelaySecondsAtStart)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(QuestStep.JumpDestination), step.JumpDestination,
+                                    emptyStep.JumpDestination)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(QuestStep.ContentFinderConditionId),
+                                    step.ContentFinderConditionId, emptyStep.ContentFinderConditionId)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(QuestStep.SkipConditions), step.SkipConditions,
+                                    emptyStep.SkipConditions)
+                                .AsSyntaxNodeOrToken(),
+                            AssignmentList(nameof(QuestStep.RequiredQuestVariables),
+                                    step.RequiredQuestVariables)
+                                .AsSyntaxNodeOrToken(),
+                            AssignmentList(nameof(QuestStep.RequiredGatheredItems),
+                                step.RequiredGatheredItems),
+                            AssignmentList(nameof(QuestStep.CompletionQuestVariablesFlags),
+                                    step.CompletionQuestVariablesFlags)
+                                .AsSyntaxNodeOrToken(),
+                            AssignmentList(nameof(QuestStep.DialogueChoices), step.DialogueChoices)
+                                .AsSyntaxNodeOrToken(),
+                            AssignmentList(nameof(QuestStep.PointMenuChoices), step.PointMenuChoices)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(QuestStep.PickUpQuestId), step.PickUpQuestId,
+                                    emptyStep.PickUpQuestId)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(QuestStep.TurnInQuestId), step.TurnInQuestId,
+                                    emptyStep.TurnInQuestId)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(QuestStep.NextQuestId), step.NextQuestId,
+                                    emptyStep.NextQuestId)
+                                .AsSyntaxNodeOrToken()))));
+    }
+}
diff --git a/QuestPathGenerator/RoslynElements/QuestWorkValueExtensions.cs b/QuestPathGenerator/RoslynElements/QuestWorkValueExtensions.cs
new file mode 100644 (file)
index 0000000..e9fb67a
--- /dev/null
@@ -0,0 +1,38 @@
+using System.Collections.Generic;
+using System.Linq;
+using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
+using Questionable.Model.Questing;
+using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
+using static Questionable.QuestPathGenerator.RoslynShortcuts;
+
+namespace Questionable.QuestPathGenerator.RoslynElements;
+
+internal static class QuestWorkValueExtensions
+{
+    public static ExpressionSyntax ToExpressionSyntax(this QuestWorkValue qwv)
+    {
+        return ObjectCreationExpression(
+                IdentifierName(nameof(QuestWorkValue)))
+            .WithArgumentList(
+                ArgumentList(
+                    SeparatedList<ArgumentSyntax>(
+                        new SyntaxNodeOrToken[]
+                        {
+                            Argument(LiteralValue(qwv.High)),
+                            Token(SyntaxKind.CommaToken),
+                            Argument(LiteralValue(qwv.Low)),
+                            Token(SyntaxKind.CommaToken),
+                            Argument(LiteralValue(qwv.Mode))
+                        })));
+    }
+
+    public static ExpressionSyntax ToExpressionSyntax(this List<QuestWorkValue> list)
+    {
+        return CollectionExpression(
+            SeparatedList<CollectionElementSyntax>(
+                SyntaxNodeList(list.Select(x => ExpressionElement(
+                    LiteralValue(x)).AsSyntaxNodeOrToken()).ToArray())));
+    }
+}
diff --git a/QuestPathGenerator/RoslynElements/SatisfactionSupplyIdExtensions.cs b/QuestPathGenerator/RoslynElements/SatisfactionSupplyIdExtensions.cs
new file mode 100644 (file)
index 0000000..91c468d
--- /dev/null
@@ -0,0 +1,19 @@
+using Microsoft.CodeAnalysis.CSharp.Syntax;
+using Questionable.Model.Questing;
+using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
+using static Questionable.QuestPathGenerator.RoslynShortcuts;
+
+namespace Questionable.QuestPathGenerator.RoslynElements;
+
+internal static class SatisfactionSupplyIdExtensions
+{
+    public static ExpressionSyntax ToExpressionSyntax(this SatisfactionSupplyNpcId satisfactionSupplyNpcId)
+    {
+        return ObjectCreationExpression(
+                IdentifierName(nameof(SatisfactionSupplyNpcId)))
+            .WithArgumentList(
+                ArgumentList(
+                    SingletonSeparatedList(
+                        Argument(LiteralValue(satisfactionSupplyNpcId.Value)))));
+    }
+}
diff --git a/QuestPathGenerator/RoslynElements/SkipConditionsExtensions.cs b/QuestPathGenerator/RoslynElements/SkipConditionsExtensions.cs
new file mode 100644 (file)
index 0000000..b53e02d
--- /dev/null
@@ -0,0 +1,143 @@
+using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
+using Questionable.Model.Questing;
+using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
+using static Questionable.QuestPathGenerator.RoslynShortcuts;
+
+namespace Questionable.QuestPathGenerator.RoslynElements;
+
+internal static class SkipConditionsExtensions
+{
+    public static ExpressionSyntax ToExpressionSyntax(this SkipConditions skipConditions)
+    {
+        var emptySkip = new SkipConditions();
+        return ObjectCreationExpression(
+                IdentifierName(nameof(SkipConditions)))
+            .WithInitializer(
+                InitializerExpression(
+                    SyntaxKind.ObjectInitializerExpression,
+                    SeparatedList<ExpressionSyntax>(
+                        SyntaxNodeList(
+                            Assignment(nameof(SkipConditions.StepIf), skipConditions.StepIf,
+                                    emptySkip.StepIf)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(SkipConditions.AetheryteShortcutIf),
+                                    skipConditions.AetheryteShortcutIf, emptySkip.AetheryteShortcutIf)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(skipConditions.AethernetShortcutIf),
+                                    skipConditions.AethernetShortcutIf, emptySkip.AethernetShortcutIf)
+                                .AsSyntaxNodeOrToken()))));
+    }
+
+    public static ExpressionSyntax ToExpressionSyntax(this SkipStepConditions skipStepConditions)
+    {
+        var emptyStep = new SkipStepConditions();
+        return ObjectCreationExpression(
+                IdentifierName(nameof(SkipStepConditions)))
+            .WithInitializer(
+                InitializerExpression(
+                    SyntaxKind.ObjectInitializerExpression,
+                    SeparatedList<ExpressionSyntax>(
+                        SyntaxNodeList(
+                            Assignment(nameof(SkipStepConditions.Never), skipStepConditions.Never,
+                                    emptyStep.Never)
+                                .AsSyntaxNodeOrToken(),
+                            AssignmentList(nameof(SkipStepConditions.CompletionQuestVariablesFlags),
+                                    skipStepConditions.CompletionQuestVariablesFlags)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(SkipStepConditions.Flying), skipStepConditions.Flying,
+                                    emptyStep.Flying)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(SkipStepConditions.Chocobo), skipStepConditions.Chocobo,
+                                    emptyStep.Chocobo)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(SkipStepConditions.NotTargetable),
+                                    skipStepConditions.NotTargetable, emptyStep.NotTargetable)
+                                .AsSyntaxNodeOrToken(),
+                            AssignmentList(nameof(SkipStepConditions.InTerritory),
+                                skipStepConditions.InTerritory).AsSyntaxNodeOrToken(),
+                            AssignmentList(nameof(SkipStepConditions.NotInTerritory),
+                                skipStepConditions.NotInTerritory).AsSyntaxNodeOrToken(),
+                            Assignment(nameof(SkipStepConditions.Item), skipStepConditions.Item,
+                                    emptyStep.Item)
+                                .AsSyntaxNodeOrToken(),
+                            AssignmentList(nameof(SkipStepConditions.QuestsAccepted),
+                                skipStepConditions.QuestsAccepted).AsSyntaxNodeOrToken(),
+                            AssignmentList(nameof(SkipStepConditions.QuestsCompleted),
+                                skipStepConditions.QuestsCompleted).AsSyntaxNodeOrToken(),
+                            Assignment(nameof(SkipStepConditions.AetheryteLocked),
+                                    skipStepConditions.AetheryteLocked, emptyStep.AetheryteLocked)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(SkipStepConditions.AetheryteUnlocked),
+                                    skipStepConditions.AetheryteUnlocked, emptyStep.AetheryteUnlocked)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(SkipStepConditions.NearPosition),
+                                    skipStepConditions.NearPosition, emptyStep.NearPosition)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(SkipStepConditions.ExtraCondition),
+                                    skipStepConditions.ExtraCondition, emptyStep.ExtraCondition)
+                                .AsSyntaxNodeOrToken()))));
+    }
+
+    public static ExpressionSyntax ToExpressionSyntax(this SkipItemConditions skipItemCondition)
+    {
+        var emptyItem = new SkipItemConditions();
+        return ObjectCreationExpression(
+                IdentifierName(nameof(SkipItemConditions)))
+            .WithInitializer(
+                InitializerExpression(
+                    SyntaxKind.ObjectInitializerExpression,
+                    SeparatedList<ExpressionSyntax>(
+                        SyntaxNodeList(
+                            Assignment(nameof(SkipItemConditions.NotInInventory),
+                                skipItemCondition.NotInInventory,
+                                emptyItem.NotInInventory)))));
+    }
+
+    public static ExpressionSyntax ToExpressionSyntax(this NearPositionCondition nearPositionCondition)
+    {
+        var emptyCondition = new NearPositionCondition();
+        return ObjectCreationExpression(
+                IdentifierName(nameof(NearPositionCondition)))
+            .WithInitializer(
+                InitializerExpression(
+                    SyntaxKind.ObjectInitializerExpression,
+                    SeparatedList<ExpressionSyntax>(
+                        SyntaxNodeList(
+                            Assignment(nameof(NearPositionCondition.Position),
+                                    nearPositionCondition.Position, emptyCondition.Position)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(NearPositionCondition.MaximumDistance),
+                                    nearPositionCondition.MaximumDistance, emptyCondition.MaximumDistance)
+                                .AsSyntaxNodeOrToken()))));
+    }
+
+    public static ExpressionSyntax ToExpressionSyntax(this SkipAetheryteCondition skipAetheryteCondition)
+    {
+        var emptyAetheryte = new SkipAetheryteCondition();
+        return ObjectCreationExpression(
+                IdentifierName(nameof(SkipAetheryteCondition)))
+            .WithInitializer(
+                InitializerExpression(
+                    SyntaxKind.ObjectInitializerExpression,
+                    SeparatedList<ExpressionSyntax>(
+                        SyntaxNodeList(
+                            Assignment(nameof(SkipAetheryteCondition.Never), skipAetheryteCondition.Never,
+                                emptyAetheryte.Never),
+                            Assignment(nameof(SkipAetheryteCondition.InSameTerritory),
+                                skipAetheryteCondition.InSameTerritory, emptyAetheryte.InSameTerritory),
+                            AssignmentList(nameof(SkipAetheryteCondition.InTerritory),
+                                skipAetheryteCondition.InTerritory),
+                            Assignment(nameof(SkipAetheryteCondition.AetheryteLocked),
+                                    skipAetheryteCondition.AetheryteLocked, emptyAetheryte.AetheryteLocked)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(SkipAetheryteCondition.AetheryteUnlocked),
+                                    skipAetheryteCondition.AetheryteUnlocked,
+                                    emptyAetheryte.AetheryteUnlocked)
+                                .AsSyntaxNodeOrToken(),
+                            Assignment(nameof(SkipAetheryteCondition.RequiredQuestVariablesNotMet),
+                                    skipAetheryteCondition.RequiredQuestVariablesNotMet,
+                                    emptyAetheryte.RequiredQuestVariablesNotMet)
+                                .AsSyntaxNodeOrToken()))));
+    }
+}
diff --git a/QuestPathGenerator/RoslynElements/Vector3Extensions.cs b/QuestPathGenerator/RoslynElements/Vector3Extensions.cs
new file mode 100644 (file)
index 0000000..dda60af
--- /dev/null
@@ -0,0 +1,28 @@
+using System.Numerics;
+using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
+using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
+using static Questionable.QuestPathGenerator.RoslynShortcuts;
+
+namespace Questionable.QuestPathGenerator.RoslynElements;
+
+internal static class Vector3Extensions
+{
+    public static ExpressionSyntax ToExpressionSyntax(this Vector3 vector)
+    {
+        return ObjectCreationExpression(
+                IdentifierName(nameof(Vector3)))
+            .WithArgumentList(
+                ArgumentList(
+                    SeparatedList<ArgumentSyntax>(
+                        new SyntaxNodeOrToken[]
+                        {
+                            Argument(LiteralValue(vector.X)),
+                            Token(SyntaxKind.CommaToken),
+                            Argument(LiteralValue(vector.Y)),
+                            Token(SyntaxKind.CommaToken),
+                            Argument(LiteralValue(vector.Z))
+                        })));
+    }
+}
index 3d251f28738f272023b0e2f24c4214ecba9a84a9..cc146a0b14c07134c2dd8285b90501379a54e21d 100644 (file)
@@ -8,6 +8,7 @@ using Microsoft.CodeAnalysis.CSharp.Syntax;
 using Questionable.Model.Common;
 using Questionable.Model.Gathering;
 using Questionable.Model.Questing;
+using Questionable.QuestPathGenerator.RoslynElements;
 using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
 
 namespace Questionable.QuestPathGenerator;
@@ -35,559 +36,48 @@ public static class RoslynShortcuts
     {
         try
         {
-            if (value is string s)
-                return LiteralExpression(SyntaxKind.StringLiteralExpression, Literal(s));
-            else if (value is bool b)
-                return LiteralExpression(b ? SyntaxKind.TrueLiteralExpression : SyntaxKind.FalseLiteralExpression);
-            else if (value is short i16)
-                return LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(i16));
-            else if (value is int i32)
-                return LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(i32));
-            else if (value is byte u8)
-                return LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(u8));
-            else if (value is ushort u16)
-                return LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(u16));
-            else if (value is uint u32)
-                return LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(u32));
-            else if (value is float f)
-                return LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(f));
-            else if (value != null && value.GetType().IsEnum)
-                return MemberAccessExpression(
-                    SyntaxKind.SimpleMemberAccessExpression,
-                    IdentifierName(value.GetType().Name),
-                    IdentifierName(value.GetType().GetEnumName(value)!));
-            else if (value is QuestStep step)
-            {
-                var emptyStep = new QuestStep();
-                return ObjectCreationExpression(
-                        IdentifierName(nameof(QuestStep)))
-                    .WithArgumentList(
-                        ArgumentList(
-                            SeparatedList<ArgumentSyntax>(
-                                new SyntaxNodeOrToken[]
-                                {
-                                    Argument(LiteralValue(step.InteractionType)),
-                                    Token(SyntaxKind.CommaToken),
-                                    Argument(LiteralValue(step.DataId)),
-                                    Token(SyntaxKind.CommaToken),
-                                    Argument(LiteralValue(step.Position)),
-                                    Token(SyntaxKind.CommaToken),
-                                    Argument(LiteralValue(step.TerritoryId))
-                                })))
-                    .WithInitializer(
-                        InitializerExpression(
-                            SyntaxKind.ObjectInitializerExpression,
-                            SeparatedList<ExpressionSyntax>(
-                                SyntaxNodeList(
-                                    Assignment(nameof(QuestStep.StopDistance), step.StopDistance,
-                                            emptyStep.StopDistance)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(QuestStep.NpcWaitDistance), step.NpcWaitDistance,
-                                            emptyStep.NpcWaitDistance)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(QuestStep.TargetTerritoryId), step.TargetTerritoryId,
-                                            emptyStep.TargetTerritoryId)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(QuestStep.DelaySecondsAtStart), step.DelaySecondsAtStart,
-                                            emptyStep.DelaySecondsAtStart)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(QuestStep.Disabled), step.Disabled, emptyStep.Disabled)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(QuestStep.DisableNavmesh), step.DisableNavmesh,
-                                            emptyStep.DisableNavmesh)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(QuestStep.Mount), step.Mount, emptyStep.Mount)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(QuestStep.Fly), step.Fly, emptyStep.Fly)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(QuestStep.Land), step.Land, emptyStep.Land)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(QuestStep.Sprint), step.Sprint, emptyStep.Sprint)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(QuestStep.IgnoreDistanceToObject),
-                                            step.IgnoreDistanceToObject, emptyStep.IgnoreDistanceToObject)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(QuestStep.Comment), step.Comment, emptyStep.Comment)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(QuestStep.Aetheryte), step.Aetheryte, emptyStep.Aetheryte)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(QuestStep.AethernetShard), step.AethernetShard,
-                                            emptyStep.AethernetShard)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(QuestStep.AetheryteShortcut), step.AetheryteShortcut,
-                                            emptyStep.AetheryteShortcut)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(QuestStep.AethernetShortcut), step.AethernetShortcut,
-                                            emptyStep.AethernetShortcut)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(QuestStep.AetherCurrentId), step.AetherCurrentId,
-                                            emptyStep.AetherCurrentId)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(QuestStep.ItemId), step.ItemId, emptyStep.ItemId)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(QuestStep.GroundTarget), step.GroundTarget,
-                                            emptyStep.GroundTarget)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(QuestStep.ItemCount), step.ItemCount, emptyStep.ItemCount)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(QuestStep.Emote), step.Emote, emptyStep.Emote)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(QuestStep.ChatMessage), step.ChatMessage,
-                                            emptyStep.ChatMessage)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(QuestStep.Action), step.Action, emptyStep.Action)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(QuestStep.EnemySpawnType), step.EnemySpawnType,
-                                            emptyStep.EnemySpawnType)
-                                        .AsSyntaxNodeOrToken(),
-                                    AssignmentList(nameof(QuestStep.KillEnemyDataIds), step.KillEnemyDataIds)
-                                        .AsSyntaxNodeOrToken(),
-                                    AssignmentList(nameof(QuestStep.ComplexCombatData), step.ComplexCombatData)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(QuestStep.CombatDelaySecondsAtStart),
-                                            step.CombatDelaySecondsAtStart,
-                                            emptyStep.CombatDelaySecondsAtStart)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(QuestStep.JumpDestination), step.JumpDestination,
-                                            emptyStep.JumpDestination)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(QuestStep.ContentFinderConditionId),
-                                            step.ContentFinderConditionId, emptyStep.ContentFinderConditionId)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(QuestStep.SkipConditions), step.SkipConditions,
-                                            emptyStep.SkipConditions)
-                                        .AsSyntaxNodeOrToken(),
-                                    AssignmentList(nameof(QuestStep.RequiredQuestVariables),
-                                            step.RequiredQuestVariables)
-                                        .AsSyntaxNodeOrToken(),
-                                    AssignmentList(nameof(QuestStep.RequiredGatheredItems),
-                                        step.RequiredGatheredItems),
-                                    AssignmentList(nameof(QuestStep.CompletionQuestVariablesFlags),
-                                            step.CompletionQuestVariablesFlags)
-                                        .AsSyntaxNodeOrToken(),
-                                    AssignmentList(nameof(QuestStep.DialogueChoices), step.DialogueChoices)
-                                        .AsSyntaxNodeOrToken(),
-                                    AssignmentList(nameof(QuestStep.PointMenuChoices), step.PointMenuChoices)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(QuestStep.PickUpQuestId), step.PickUpQuestId,
-                                            emptyStep.PickUpQuestId)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(QuestStep.TurnInQuestId), step.TurnInQuestId,
-                                            emptyStep.TurnInQuestId)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(QuestStep.NextQuestId), step.NextQuestId,
-                                            emptyStep.NextQuestId)
-                                        .AsSyntaxNodeOrToken()))));
-            }
-            else if (value is QuestId questId)
-            {
-                return ObjectCreationExpression(
-                        IdentifierName(nameof(QuestId)))
-                    .WithArgumentList(
-                        ArgumentList(
-                            SingletonSeparatedList(
-                                Argument(LiteralValue(questId.Value)))));
-            }
-            else if (value is LeveId leveId)
-            {
-                return ObjectCreationExpression(
-                        IdentifierName(nameof(LeveId)))
-                    .WithArgumentList(
-                        ArgumentList(
-                            SingletonSeparatedList(
-                                Argument(LiteralValue(leveId.Value)))));
-            }
-            else if (value is SatisfactionSupplyNpcId satisfactionSupplyNpcId)
-            {
-                return ObjectCreationExpression(
-                        IdentifierName(nameof(SatisfactionSupplyNpcId)))
-                    .WithArgumentList(
-                        ArgumentList(
-                            SingletonSeparatedList(
-                                Argument(LiteralValue(satisfactionSupplyNpcId.Value)))));
-            }
-            else if (value is Vector3 vector)
-            {
-                return ObjectCreationExpression(
-                        IdentifierName(nameof(Vector3)))
-                    .WithArgumentList(
-                        ArgumentList(
-                            SeparatedList<ArgumentSyntax>(
-                                new SyntaxNodeOrToken[]
-                                {
-                                    Argument(LiteralValue(vector.X)),
-                                    Token(SyntaxKind.CommaToken),
-                                    Argument(LiteralValue(vector.Y)),
-                                    Token(SyntaxKind.CommaToken),
-                                    Argument(LiteralValue(vector.Z))
-                                })));
-            }
-            else if (value is AethernetShortcut aethernetShortcut)
-            {
-                return ObjectCreationExpression(
-                        IdentifierName(nameof(AethernetShortcut)))
-                    .WithInitializer(
-                        InitializerExpression(
-                            SyntaxKind.ObjectInitializerExpression,
-                            SeparatedList<ExpressionSyntax>(
-                                SyntaxNodeList(
-                                    Assignment<EAetheryteLocation?>(nameof(AethernetShortcut.From),
-                                            aethernetShortcut.From,
-                                            null)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment<EAetheryteLocation?>(nameof(AethernetShortcut.To), aethernetShortcut.To,
-                                            null)
-                                        .AsSyntaxNodeOrToken()))));
-            }
-            else if (value is ChatMessage chatMessage)
-            {
-                ChatMessage emptyMessage = new();
-                return ObjectCreationExpression(
-                        IdentifierName(nameof(ChatMessage)))
-                    .WithInitializer(
-                        InitializerExpression(
-                            SyntaxKind.ObjectInitializerExpression,
-                            SeparatedList<ExpressionSyntax>(
-                                SyntaxNodeList(
-                                    Assignment(nameof(ChatMessage.ExcelSheet), chatMessage.ExcelSheet,
-                                            emptyMessage.ExcelSheet)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(ChatMessage.Key), chatMessage.Key,
-                                            emptyMessage.Key)
-                                        .AsSyntaxNodeOrToken()))));
-            }
-            else if (value is DialogueChoice dialogueChoice)
-            {
-                DialogueChoice emptyChoice = new();
-                return ObjectCreationExpression(
-                        IdentifierName(nameof(DialogueChoice)))
-                    .WithInitializer(
-                        InitializerExpression(
-                            SyntaxKind.ObjectInitializerExpression,
-                            SeparatedList<ExpressionSyntax>(
-                                SyntaxNodeList(
-                                    Assignment<EDialogChoiceType?>(nameof(DialogueChoice.Type), dialogueChoice.Type,
-                                            null)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(DialogueChoice.ExcelSheet), dialogueChoice.ExcelSheet,
-                                            emptyChoice.ExcelSheet)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(DialogueChoice.Prompt), dialogueChoice.Prompt, emptyChoice.Prompt)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(DialogueChoice.Yes), dialogueChoice.Yes, emptyChoice.Yes)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(DialogueChoice.Answer), dialogueChoice.Answer, emptyChoice.Answer)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(DialogueChoice.AnswerIsRegularExpression),
-                                            dialogueChoice.AnswerIsRegularExpression,
-                                            emptyChoice.AnswerIsRegularExpression)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(DialogueChoice.DataId), dialogueChoice.DataId, emptyChoice.DataId)
-                                        .AsSyntaxNodeOrToken()))));
-            }
-            else if (value is JumpDestination jumpDestination)
-            {
-                return ObjectCreationExpression(
-                        IdentifierName(nameof(JumpDestination)))
-                    .WithInitializer(
-                        InitializerExpression(
-                            SyntaxKind.ObjectInitializerExpression,
-                            SeparatedList<ExpressionSyntax>(
-                                SyntaxNodeList(
-                                    Assignment<Vector3?>(nameof(JumpDestination.Position), jumpDestination.Position,
-                                            null)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(JumpDestination.StopDistance), jumpDestination.StopDistance, null)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(JumpDestination.DelaySeconds), jumpDestination.DelaySeconds, null)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(JumpDestination.Type), jumpDestination.Type, default)
-                                        .AsSyntaxNodeOrToken()))));
-            }
-            else if (value is ExcelRef excelRef)
-            {
-                if (excelRef.Type == ExcelRef.EType.Key)
-                {
-                    return ObjectCreationExpression(
-                            IdentifierName(nameof(ExcelRef)))
-                        .WithArgumentList(
-                            ArgumentList(
-                                SingletonSeparatedList(
-                                    Argument(LiteralValue(excelRef.AsKey())))));
-                }
-                else if (excelRef.Type == ExcelRef.EType.RowId)
-                {
-                    return ObjectCreationExpression(
-                            IdentifierName(nameof(ExcelRef)))
-                        .WithArgumentList(
-                            ArgumentList(
-                                SingletonSeparatedList(
-                                    Argument(LiteralValue(excelRef.AsRowId())))));
-                }
-                else
-                    throw new Exception($"Unsupported ExcelRef type {excelRef.Type}");
-            }
-            else if (value is ComplexCombatData complexCombatData)
-            {
-                var emptyData = new ComplexCombatData();
-                return ObjectCreationExpression(
-                        IdentifierName(nameof(ComplexCombatData)))
-                    .WithInitializer(
-                        InitializerExpression(
-                            SyntaxKind.ObjectInitializerExpression,
-                            SeparatedList<ExpressionSyntax>(
-                                SyntaxNodeList(
-                                    Assignment(nameof(ComplexCombatData.DataId), complexCombatData.DataId,
-                                            emptyData.DataId)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(ComplexCombatData.MinimumKillCount),
-                                            complexCombatData.MinimumKillCount, emptyData.MinimumKillCount)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(ComplexCombatData.RewardItemId), complexCombatData.RewardItemId,
-                                            emptyData.RewardItemId)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(ComplexCombatData.RewardItemCount),
-                                            complexCombatData.RewardItemCount,
-                                            emptyData.RewardItemCount)
-                                        .AsSyntaxNodeOrToken(),
-                                    AssignmentList(nameof(ComplexCombatData.CompletionQuestVariablesFlags),
-                                        complexCombatData.CompletionQuestVariablesFlags),
-                                    Assignment(nameof(ComplexCombatData.IgnoreQuestMarker),
-                                            complexCombatData.IgnoreQuestMarker,
-                                            emptyData.IgnoreQuestMarker)
-                                        .AsSyntaxNodeOrToken()))));
-            }
-            else if (value is QuestWorkValue qwv)
-            {
-                return ObjectCreationExpression(
-                        IdentifierName(nameof(QuestWorkValue)))
-                    .WithArgumentList(
-                        ArgumentList(
-                            SeparatedList<ArgumentSyntax>(
-                                new SyntaxNodeOrToken[]
-                                {
-                                    Argument(LiteralValue(qwv.High)),
-                                    Token(SyntaxKind.CommaToken),
-                                    Argument(LiteralValue(qwv.Low)),
-                                    Token(SyntaxKind.CommaToken),
-                                    Argument(LiteralValue(qwv.Mode))
-                                })));
-            }
-            else if (value is List<QuestWorkValue> list)
-            {
-                return CollectionExpression(
-                    SeparatedList<CollectionElementSyntax>(
-                        SyntaxNodeList(list.Select(x => ExpressionElement(
-                            LiteralValue(x)).AsSyntaxNodeOrToken()).ToArray())));
-            }
-            else if (value is SkipConditions skipConditions)
-            {
-                var emptySkip = new SkipConditions();
-                return ObjectCreationExpression(
-                        IdentifierName(nameof(SkipConditions)))
-                    .WithInitializer(
-                        InitializerExpression(
-                            SyntaxKind.ObjectInitializerExpression,
-                            SeparatedList<ExpressionSyntax>(
-                                SyntaxNodeList(
-                                    Assignment(nameof(SkipConditions.StepIf), skipConditions.StepIf, emptySkip.StepIf)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(SkipConditions.AetheryteShortcutIf),
-                                            skipConditions.AetheryteShortcutIf, emptySkip.AetheryteShortcutIf)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(skipConditions.AethernetShortcutIf),
-                                            skipConditions.AethernetShortcutIf, emptySkip.AethernetShortcutIf)
-                                        .AsSyntaxNodeOrToken()))));
-            }
-            else if (value is SkipStepConditions skipStepConditions)
-            {
-                var emptyStep = new SkipStepConditions();
-                return ObjectCreationExpression(
-                        IdentifierName(nameof(SkipStepConditions)))
-                    .WithInitializer(
-                        InitializerExpression(
-                            SyntaxKind.ObjectInitializerExpression,
-                            SeparatedList<ExpressionSyntax>(
-                                SyntaxNodeList(
-                                    Assignment(nameof(SkipStepConditions.Never), skipStepConditions.Never,
-                                            emptyStep.Never)
-                                        .AsSyntaxNodeOrToken(),
-                                    AssignmentList(nameof(SkipStepConditions.CompletionQuestVariablesFlags),
-                                            skipStepConditions.CompletionQuestVariablesFlags)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(SkipStepConditions.Flying), skipStepConditions.Flying,
-                                            emptyStep.Flying)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(SkipStepConditions.Chocobo), skipStepConditions.Chocobo,
-                                            emptyStep.Chocobo)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(SkipStepConditions.NotTargetable),
-                                            skipStepConditions.NotTargetable, emptyStep.NotTargetable)
-                                        .AsSyntaxNodeOrToken(),
-                                    AssignmentList(nameof(SkipStepConditions.InTerritory),
-                                        skipStepConditions.InTerritory).AsSyntaxNodeOrToken(),
-                                    AssignmentList(nameof(SkipStepConditions.NotInTerritory),
-                                        skipStepConditions.NotInTerritory).AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(SkipStepConditions.Item), skipStepConditions.Item, emptyStep.Item)
-                                        .AsSyntaxNodeOrToken(),
-                                    AssignmentList(nameof(SkipStepConditions.QuestsAccepted),
-                                        skipStepConditions.QuestsAccepted).AsSyntaxNodeOrToken(),
-                                    AssignmentList(nameof(SkipStepConditions.QuestsCompleted),
-                                        skipStepConditions.QuestsCompleted).AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(SkipStepConditions.AetheryteLocked),
-                                            skipStepConditions.AetheryteLocked, emptyStep.AetheryteLocked)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(SkipStepConditions.AetheryteUnlocked),
-                                            skipStepConditions.AetheryteUnlocked, emptyStep.AetheryteUnlocked)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(SkipStepConditions.NearPosition),
-                                            skipStepConditions.NearPosition, emptyStep.NearPosition)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(SkipStepConditions.ExtraCondition),
-                                            skipStepConditions.ExtraCondition, emptyStep.ExtraCondition)
-                                        .AsSyntaxNodeOrToken()))));
-            }
-            else if (value is SkipItemConditions skipItemCondition)
-            {
-                var emptyItem = new SkipItemConditions();
-                return ObjectCreationExpression(
-                        IdentifierName(nameof(SkipItemConditions)))
-                    .WithInitializer(
-                        InitializerExpression(
-                            SyntaxKind.ObjectInitializerExpression,
-                            SeparatedList<ExpressionSyntax>(
-                                SyntaxNodeList(
-                                    Assignment(nameof(SkipItemConditions.NotInInventory),
-                                        skipItemCondition.NotInInventory,
-                                        emptyItem.NotInInventory)))));
-            }
-            else if (value is NearPositionCondition nearPositionCondition)
-            {
-                var emptyCondition = new NearPositionCondition();
-                return ObjectCreationExpression(
-                        IdentifierName(nameof(NearPositionCondition)))
-                    .WithInitializer(
-                        InitializerExpression(
-                            SyntaxKind.ObjectInitializerExpression,
-                            SeparatedList<ExpressionSyntax>(
-                                SyntaxNodeList(
-                                    Assignment(nameof(NearPositionCondition.Position),
-                                        nearPositionCondition.Position, emptyCondition.Position).AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(NearPositionCondition.MaximumDistance),
-                                            nearPositionCondition.MaximumDistance, emptyCondition.MaximumDistance)
-                                        .AsSyntaxNodeOrToken()))));
-            }
-            else if (value is SkipAetheryteCondition skipAetheryteCondition)
-            {
-                var emptyAetheryte = new SkipAetheryteCondition();
-                return ObjectCreationExpression(
-                        IdentifierName(nameof(SkipAetheryteCondition)))
-                    .WithInitializer(
-                        InitializerExpression(
-                            SyntaxKind.ObjectInitializerExpression,
-                            SeparatedList<ExpressionSyntax>(
-                                SyntaxNodeList(
-                                    Assignment(nameof(SkipAetheryteCondition.Never), skipAetheryteCondition.Never,
-                                        emptyAetheryte.Never),
-                                    Assignment(nameof(SkipAetheryteCondition.InSameTerritory),
-                                        skipAetheryteCondition.InSameTerritory, emptyAetheryte.InSameTerritory),
-                                    AssignmentList(nameof(SkipAetheryteCondition.InTerritory),
-                                        skipAetheryteCondition.InTerritory),
-                                    Assignment(nameof(SkipAetheryteCondition.AetheryteLocked),
-                                            skipAetheryteCondition.AetheryteLocked, emptyAetheryte.AetheryteLocked)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(SkipAetheryteCondition.AetheryteUnlocked),
-                                            skipAetheryteCondition.AetheryteUnlocked, emptyAetheryte.AetheryteUnlocked)
-                                        .AsSyntaxNodeOrToken()))));
-            }
-            else if (value is GatheredItem gatheredItem)
-            {
-                var emptyItem = new GatheredItem();
-                return ObjectCreationExpression(
-                        IdentifierName(nameof(GatheredItem)))
-                    .WithInitializer(
-                        InitializerExpression(
-                            SyntaxKind.ObjectInitializerExpression,
-                            SeparatedList<ExpressionSyntax>(
-                                SyntaxNodeList(
-                                    Assignment(nameof(GatheredItem.ItemId), gatheredItem.ItemId, emptyItem.ItemId)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(GatheredItem.AlternativeItemId), gatheredItem.AlternativeItemId,
-                                            emptyItem.AlternativeItemId)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(GatheredItem.ItemCount), gatheredItem.ItemCount,
-                                            emptyItem.ItemCount)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(GatheredItem.Collectability), gatheredItem.Collectability,
-                                            emptyItem.Collectability)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(GatheredItem.QuestAcceptedAsClass),
-                                            gatheredItem.QuestAcceptedAsClass,
-                                            emptyItem.QuestAcceptedAsClass)
-                                        .AsSyntaxNodeOrToken()))));
-            }
-            else if (value is GatheringNodeGroup nodeGroup)
-            {
-                return ObjectCreationExpression(
-                        IdentifierName(nameof(GatheringNodeGroup)))
-                    .WithInitializer(
-                        InitializerExpression(
-                            SyntaxKind.ObjectInitializerExpression,
-                            SeparatedList<ExpressionSyntax>(
-                                SyntaxNodeList(
-                                    AssignmentList(nameof(GatheringNodeGroup.Nodes), nodeGroup.Nodes)
-                                        .AsSyntaxNodeOrToken()))));
-            }
-            else if (value is GatheringNode nodeLocation)
-            {
-                var emptyLocation = new GatheringNode();
-                return ObjectCreationExpression(
-                        IdentifierName(nameof(GatheringNode)))
-                    .WithInitializer(
-                        InitializerExpression(
-                            SyntaxKind.ObjectInitializerExpression,
-                            SeparatedList<ExpressionSyntax>(
-                                SyntaxNodeList(
-                                    Assignment(nameof(GatheringNode.DataId), nodeLocation.DataId,
-                                            emptyLocation.DataId)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(GatheringNode.Fly), nodeLocation.Fly, emptyLocation.Fly)
-                                        .AsSyntaxNodeOrToken(),
-                                    AssignmentList(nameof(GatheringNode.Locations), nodeLocation.Locations)
-                                        .AsSyntaxNodeOrToken()))));
-            }
-            else if (value is GatheringLocation location)
-            {
-                var emptyLocation = new GatheringLocation();
-                return ObjectCreationExpression(
-                        IdentifierName(nameof(GatheringLocation)))
-                    .WithInitializer(
-                        InitializerExpression(
-                            SyntaxKind.ObjectInitializerExpression,
-                            SeparatedList<ExpressionSyntax>(
-                                SyntaxNodeList(
-                                    Assignment(nameof(GatheringLocation.Position), location.Position,
-                                        emptyLocation.Position).AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(GatheringLocation.MinimumAngle), location.MinimumAngle,
-                                        emptyLocation.MinimumAngle).AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(GatheringLocation.MaximumAngle), location.MaximumAngle,
-                                        emptyLocation.MaximumAngle).AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(GatheringLocation.MinimumDistance),
-                                            location.MinimumDistance, emptyLocation.MinimumDistance)
-                                        .AsSyntaxNodeOrToken(),
-                                    Assignment(nameof(GatheringLocation.MaximumDistance),
-                                            location.MaximumDistance, emptyLocation.MaximumDistance)
-                                        .AsSyntaxNodeOrToken()))));
-            }
-            else if (value is null)
-                return LiteralExpression(SyntaxKind.NullLiteralExpression);
+            return value switch
+            {
+                null => LiteralExpression(SyntaxKind.NullLiteralExpression),
+                string s => LiteralExpression(SyntaxKind.StringLiteralExpression, Literal(s)),
+                bool b => LiteralExpression(b ? SyntaxKind.TrueLiteralExpression : SyntaxKind.FalseLiteralExpression),
+                short i16 => LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(i16)),
+                int i32 => LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(i32)),
+                byte u8 => LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(u8)),
+                ushort u16 => LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(u16)),
+                uint u32 => LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(u32)),
+                float f => LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(f)),
+                QuestStep step => step.ToExpressionSyntax(),
+                QuestId questId => questId.ToExpressionSyntax(),
+                LeveId leveId => leveId.ToExpressionSyntax(),
+                SatisfactionSupplyNpcId satisfactionSupplyNpcId => satisfactionSupplyNpcId.ToExpressionSyntax(),
+                Vector3 vector => vector.ToExpressionSyntax(),
+                AethernetShortcut aethernetShortcut => aethernetShortcut.ToExpressionSyntax(),
+                ChatMessage chatMessage => chatMessage.ToExpressionSyntax(),
+                DialogueChoice dialogueChoice => dialogueChoice.ToExpressionSyntax(),
+                JumpDestination jumpDestination => jumpDestination.ToExpressionSyntax(),
+                ExcelRef excelRef => excelRef.ToExpressionSyntax(),
+                ComplexCombatData complexCombatData => complexCombatData.ToExpressionSyntax(),
+                QuestWorkValue questWorkValue => questWorkValue.ToExpressionSyntax(),
+                List<QuestWorkValue> list => list.ToExpressionSyntax(), // TODO fix in AssignmentList
+                SkipConditions skipConditions => skipConditions.ToExpressionSyntax(),
+                SkipStepConditions skipStepConditions => skipStepConditions.ToExpressionSyntax(),
+                SkipItemConditions skipItemCondition => skipItemCondition.ToExpressionSyntax(),
+                NearPositionCondition nearPositionCondition => nearPositionCondition.ToExpressionSyntax(),
+                SkipAetheryteCondition skipAetheryteCondition => skipAetheryteCondition.ToExpressionSyntax(),
+                GatheredItem gatheredItem => gatheredItem.ToExpressionSyntax(),
+                GatheringNodeGroup nodeGroup => nodeGroup.ToExpressionSyntax(),
+                GatheringNode nodeLocation => nodeLocation.ToExpressionSyntax(),
+                GatheringLocation location => location.ToExpressionSyntax(),
+                not null when value.GetType().IsEnum => MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression,
+                    IdentifierName(value.GetType().Name), IdentifierName(value.GetType().GetEnumName(value)!)),
+                _ => throw new Exception($"Unsupported data type {value.GetType()} = {value}")
+            };
         }
         catch (Exception e)
         {
-            throw new Exception($"Unable to handle literal [{value}]: {e.StackTrace}", e);
+            throw new Exception($"Unable to handle literal [{value}]: {e}", e);
         }
-
-        throw new Exception($"Unsupported data type {value.GetType()} = {value}");
     }
 
     public static AssignmentExpressionSyntax? Assignment<T>(string name, T? value, T? defaultValue)
@@ -607,7 +97,7 @@ public static class RoslynShortcuts
         }
         catch (Exception e)
         {
-            throw new Exception($"Unable to handle assignment [{name}]: {e.Message}", e);
+            throw new Exception($"Unable to handle assignment [{name}]: {e}", e);
         }
     }
 
@@ -633,7 +123,7 @@ public static class RoslynShortcuts
         }
         catch (Exception e)
         {
-            throw new Exception($"Unable to handle list [{name}]: {e.StackTrace}", e);
+            throw new Exception($"Unable to handle list [{name}]: {e}", e);
         }
     }
 
index 08507425658a2b5847cfbc4da57c435f22b3dba4..3b1f5c7b534f2e22048744ca4a052d4c735c057e 100644 (file)
                 },
                 "AetheryteUnlocked": {
                   "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte"
+                },
+                "RequiredQuestVariablesNotMet": {
+                  "type": "boolean"
                 }
               },
               "additionalProperties": false
index ad636e323742fcea152290cf0859a699b2223191..383b57b79e2d5f17f1339d2f4bc822c0dcf4605a 100644 (file)
@@ -10,4 +10,5 @@ public sealed class SkipAetheryteCondition
     public List<ushort> InTerritory { get; set; } = new();
     public EAetheryteLocation? AetheryteLocked { get; set; }
     public EAetheryteLocation? AetheryteUnlocked { get; set; }
+    public bool RequiredQuestVariablesNotMet { get; set; }
 }