From f76e074cd890340d48df1b66df5ef8cb7ccd878c Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sat, 17 Aug 2024 20:59:42 +0200 Subject: [PATCH] Rework source gen --- .../AethernetShortcutExtensions.cs | 29 + .../RoslynElements/ChatMessageExtensions.cs | 28 + .../ComplexCombatDataExtensions.cs | 42 ++ .../DialogueChoiceExtensions.cs | 43 ++ .../RoslynElements/ExcelRefExtensions.cs | 30 + .../RoslynElements/GatheredItemExtensions.cs | 38 ++ .../GatheringLocationExtensions.cs | 34 + .../RoslynElements/GatheringNodeExtensions.cs | 29 + .../GatheringNodeGroupExtensions.cs | 23 + .../JumpDestinationExtensions.cs | 33 + .../RoslynElements/LeveIdExtensions.cs | 19 + .../RoslynElements/QuestIdExtensions.cs | 19 + .../RoslynElements/QuestStepExtensions.cs | 135 ++++ .../QuestWorkValueExtensions.cs | 38 ++ .../SatisfactionSupplyIdExtensions.cs | 19 + .../SkipConditionsExtensions.cs | 143 +++++ .../RoslynElements/Vector3Extensions.cs | 28 + QuestPathGenerator/RoslynShortcuts.cs | 590 ++---------------- QuestPaths/quest-v1.json | 3 + .../Questing/SkipAetheryteCondition.cs | 1 + 20 files changed, 774 insertions(+), 550 deletions(-) create mode 100644 QuestPathGenerator/RoslynElements/AethernetShortcutExtensions.cs create mode 100644 QuestPathGenerator/RoslynElements/ChatMessageExtensions.cs create mode 100644 QuestPathGenerator/RoslynElements/ComplexCombatDataExtensions.cs create mode 100644 QuestPathGenerator/RoslynElements/DialogueChoiceExtensions.cs create mode 100644 QuestPathGenerator/RoslynElements/ExcelRefExtensions.cs create mode 100644 QuestPathGenerator/RoslynElements/GatheredItemExtensions.cs create mode 100644 QuestPathGenerator/RoslynElements/GatheringLocationExtensions.cs create mode 100644 QuestPathGenerator/RoslynElements/GatheringNodeExtensions.cs create mode 100644 QuestPathGenerator/RoslynElements/GatheringNodeGroupExtensions.cs create mode 100644 QuestPathGenerator/RoslynElements/JumpDestinationExtensions.cs create mode 100644 QuestPathGenerator/RoslynElements/LeveIdExtensions.cs create mode 100644 QuestPathGenerator/RoslynElements/QuestIdExtensions.cs create mode 100644 QuestPathGenerator/RoslynElements/QuestStepExtensions.cs create mode 100644 QuestPathGenerator/RoslynElements/QuestWorkValueExtensions.cs create mode 100644 QuestPathGenerator/RoslynElements/SatisfactionSupplyIdExtensions.cs create mode 100644 QuestPathGenerator/RoslynElements/SkipConditionsExtensions.cs create mode 100644 QuestPathGenerator/RoslynElements/Vector3Extensions.cs diff --git a/QuestPathGenerator/RoslynElements/AethernetShortcutExtensions.cs b/QuestPathGenerator/RoslynElements/AethernetShortcutExtensions.cs new file mode 100644 index 00000000..c2db7c7d --- /dev/null +++ b/QuestPathGenerator/RoslynElements/AethernetShortcutExtensions.cs @@ -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( + SyntaxNodeList( + Assignment(nameof(AethernetShortcut.From), + aethernetShortcut.From, + null) + .AsSyntaxNodeOrToken(), + Assignment(nameof(AethernetShortcut.To), + aethernetShortcut.To, + null) + .AsSyntaxNodeOrToken())))); + } +} diff --git a/QuestPathGenerator/RoslynElements/ChatMessageExtensions.cs b/QuestPathGenerator/RoslynElements/ChatMessageExtensions.cs new file mode 100644 index 00000000..29e0cb63 --- /dev/null +++ b/QuestPathGenerator/RoslynElements/ChatMessageExtensions.cs @@ -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( + 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 index 00000000..f683890f --- /dev/null +++ b/QuestPathGenerator/RoslynElements/ComplexCombatDataExtensions.cs @@ -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( + 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 index 00000000..18de00c1 --- /dev/null +++ b/QuestPathGenerator/RoslynElements/DialogueChoiceExtensions.cs @@ -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( + SyntaxNodeList( + Assignment(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 index 00000000..2b111b2d --- /dev/null +++ b/QuestPathGenerator/RoslynElements/ExcelRefExtensions.cs @@ -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 index 00000000..179c7a66 --- /dev/null +++ b/QuestPathGenerator/RoslynElements/GatheredItemExtensions.cs @@ -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( + 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 index 00000000..7d02a0e2 --- /dev/null +++ b/QuestPathGenerator/RoslynElements/GatheringLocationExtensions.cs @@ -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( + 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 index 00000000..ed4608e5 --- /dev/null +++ b/QuestPathGenerator/RoslynElements/GatheringNodeExtensions.cs @@ -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( + 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 index 00000000..f3177a64 --- /dev/null +++ b/QuestPathGenerator/RoslynElements/GatheringNodeGroupExtensions.cs @@ -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( + SyntaxNodeList( + AssignmentList(nameof(GatheringNodeGroup.Nodes), nodeGroup.Nodes) + .AsSyntaxNodeOrToken())))); + } +} diff --git a/QuestPathGenerator/RoslynElements/JumpDestinationExtensions.cs b/QuestPathGenerator/RoslynElements/JumpDestinationExtensions.cs new file mode 100644 index 00000000..2a55d056 --- /dev/null +++ b/QuestPathGenerator/RoslynElements/JumpDestinationExtensions.cs @@ -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( + SyntaxNodeList( + Assignment(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 index 00000000..3bfd5550 --- /dev/null +++ b/QuestPathGenerator/RoslynElements/LeveIdExtensions.cs @@ -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 index 00000000..fc9870ee --- /dev/null +++ b/QuestPathGenerator/RoslynElements/QuestIdExtensions.cs @@ -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 index 00000000..0e4e9dd0 --- /dev/null +++ b/QuestPathGenerator/RoslynElements/QuestStepExtensions.cs @@ -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( + 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( + 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 index 00000000..e9fb67ac --- /dev/null +++ b/QuestPathGenerator/RoslynElements/QuestWorkValueExtensions.cs @@ -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( + 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 list) + { + return CollectionExpression( + SeparatedList( + 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 index 00000000..91c468d3 --- /dev/null +++ b/QuestPathGenerator/RoslynElements/SatisfactionSupplyIdExtensions.cs @@ -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 index 00000000..b53e02dd --- /dev/null +++ b/QuestPathGenerator/RoslynElements/SkipConditionsExtensions.cs @@ -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( + 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( + 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( + 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( + 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( + 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 index 00000000..dda60afe --- /dev/null +++ b/QuestPathGenerator/RoslynElements/Vector3Extensions.cs @@ -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( + new SyntaxNodeOrToken[] + { + Argument(LiteralValue(vector.X)), + Token(SyntaxKind.CommaToken), + Argument(LiteralValue(vector.Y)), + Token(SyntaxKind.CommaToken), + Argument(LiteralValue(vector.Z)) + }))); + } +} diff --git a/QuestPathGenerator/RoslynShortcuts.cs b/QuestPathGenerator/RoslynShortcuts.cs index 3d251f28..cc146a0b 100644 --- a/QuestPathGenerator/RoslynShortcuts.cs +++ b/QuestPathGenerator/RoslynShortcuts.cs @@ -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) + return value switch { - var emptyStep = new QuestStep(); - return ObjectCreationExpression( - IdentifierName(nameof(QuestStep))) - .WithArgumentList( - ArgumentList( - SeparatedList( - 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( - 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( - 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( - SyntaxNodeList( - Assignment(nameof(AethernetShortcut.From), - aethernetShortcut.From, - null) - .AsSyntaxNodeOrToken(), - Assignment(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( - 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( - SyntaxNodeList( - Assignment(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( - SyntaxNodeList( - Assignment(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( - 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( - 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 list) - { - return CollectionExpression( - SeparatedList( - 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( - 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( - 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( - 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( - 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( - 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( - 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( - 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( - 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( - 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); + 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 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(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); } } diff --git a/QuestPaths/quest-v1.json b/QuestPaths/quest-v1.json index 08507425..3b1f5c7b 100644 --- a/QuestPaths/quest-v1.json +++ b/QuestPaths/quest-v1.json @@ -295,6 +295,9 @@ }, "AetheryteUnlocked": { "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte" + }, + "RequiredQuestVariablesNotMet": { + "type": "boolean" } }, "additionalProperties": false diff --git a/Questionable.Model/Questing/SkipAetheryteCondition.cs b/Questionable.Model/Questing/SkipAetheryteCondition.cs index ad636e32..383b57b7 100644 --- a/Questionable.Model/Questing/SkipAetheryteCondition.cs +++ b/Questionable.Model/Questing/SkipAetheryteCondition.cs @@ -10,4 +10,5 @@ public sealed class SkipAetheryteCondition public List InTerritory { get; set; } = new(); public EAetheryteLocation? AetheryteLocked { get; set; } public EAetheryteLocation? AetheryteUnlocked { get; set; } + public bool RequiredQuestVariablesNotMet { get; set; } }