--- /dev/null
+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()))));
+ }
+}
--- /dev/null
+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()))));
+ }
+}
--- /dev/null
+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()))));
+ }
+}
--- /dev/null
+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()))));
+ }
+}
--- /dev/null
+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}");
+ }
+}
--- /dev/null
+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()))));
+ }
+}
--- /dev/null
+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()))));
+ }
+}
--- /dev/null
+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()))));
+ }
+}
--- /dev/null
+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()))));
+ }
+}
--- /dev/null
+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()))));
+ }
+}
--- /dev/null
+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)))));
+ }
+}
--- /dev/null
+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)))));
+ }
+}
--- /dev/null
+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()))));
+ }
+}
--- /dev/null
+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())));
+ }
+}
--- /dev/null
+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)))));
+ }
+}
--- /dev/null
+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()))));
+ }
+}
--- /dev/null
+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))
+ })));
+ }
+}
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;
{
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)
}
catch (Exception e)
{
- throw new Exception($"Unable to handle assignment [{name}]: {e.Message}", e);
+ throw new Exception($"Unable to handle assignment [{name}]: {e}", e);
}
}
}
catch (Exception e)
{
- throw new Exception($"Unable to handle list [{name}]: {e.StackTrace}", e);
+ throw new Exception($"Unable to handle list [{name}]: {e}", e);
}
}
},
"AetheryteUnlocked": {
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte"
+ },
+ "RequiredQuestVariablesNotMet": {
+ "type": "boolean"
}
},
"additionalProperties": false
public List<ushort> InTerritory { get; set; } = new();
public EAetheryteLocation? AetheryteLocked { get; set; }
public EAetheryteLocation? AetheryteUnlocked { get; set; }
+ public bool RequiredQuestVariablesNotMet { get; set; }
}