Update source gen v2.1
authorLiza Carvelli <liza@carvel.li>
Mon, 5 Aug 2024 05:51:34 +0000 (07:51 +0200)
committerLiza Carvelli <liza@carvel.li>
Mon, 5 Aug 2024 05:51:34 +0000 (07:51 +0200)
QuestPathGenerator/GatheringSourceGenerator.cs
QuestPathGenerator/QuestSourceGenerator.cs
QuestPathGenerator/RoslynShortcuts.cs
QuestPathGenerator/Utils.cs
QuestPaths/AssemblyQuestLoader.cs
Questionable/Controller/QuestRegistry.cs

index b2177b25f390515e7a5dbcc59fd8f466d084002a..589aabb2412acfb4334f478e9cd8bb2c5858f8f9 100644 (file)
@@ -44,7 +44,8 @@ public class GatheringSourceGenerator : ISourceGenerator
         var gatheringSchema = JsonSchema.FromText(jsonSchemaFile.GetText()!.ToString());
 
         List<(ushort, GatheringRoot)> gatheringLocations = [];
-        foreach (var (id, node) in Utils.GetAdditionalFiles(context, jsonSchemaFile, gatheringSchema, InvalidJson))
+        foreach (var (id, node) in Utils.GetAdditionalFiles(context, jsonSchemaFile, gatheringSchema, InvalidJson,
+                     ushort.Parse))
         {
             var gatheringLocation = node.Deserialize<GatheringRoot>()!;
             gatheringLocations.Add((id, gatheringLocation));
index 8bff39152bb92b07afcbc6f7f3a87733f3789956..3d3d1c05441a053b83f9ac95e98246fe34640fda 100644 (file)
@@ -47,8 +47,9 @@ public class QuestSourceGenerator : ISourceGenerator
     {
         var questSchema = JsonSchema.FromText(jsonSchemaFile.GetText()!.ToString());
 
-        List<(ushort, QuestRoot)> quests = [];
-        foreach (var (id, node) in Utils.GetAdditionalFiles(context, jsonSchemaFile, questSchema, InvalidJson))
+        List<(ElementId, QuestRoot)> quests = [];
+        foreach (var (id, node) in Utils.GetAdditionalFiles(context, jsonSchemaFile, questSchema, InvalidJson,
+                     ElementId.FromString))
         {
             var quest = node.Deserialize<QuestRoot>()!;
             if (quest.Disabled)
@@ -65,8 +66,8 @@ public class QuestSourceGenerator : ISourceGenerator
             return;
 
         var partitionedQuests = quests
-            .OrderBy(x => x.Item1)
-            .GroupBy(x => $"LoadQuests{x.Item1 / 50}")
+            .OrderBy(x => x.Item1.Value)
+            .GroupBy(x => $"LoadQuests{x.Item1.Value / 50}")
             .ToList();
 
         var methods = Utils.CreateMethods("LoadQuests", partitionedQuests, CreateInitializer);
@@ -123,7 +124,7 @@ public class QuestSourceGenerator : ISourceGenerator
         context.AddSource("AssemblyQuestLoader.g.cs", code.ToFullString());
     }
 
-    private static StatementSyntax[] CreateInitializer(List<(ushort QuestId, QuestRoot Root)> quests)
+    private static StatementSyntax[] CreateInitializer(List<(ElementId QuestId, QuestRoot Root)> quests)
     {
         List<StatementSyntax> statements = [];
 
@@ -138,9 +139,7 @@ public class QuestSourceGenerator : ISourceGenerator
                                 SeparatedList<ArgumentSyntax>(
                                     new SyntaxNodeOrToken[]
                                     {
-                                        Argument(
-                                            LiteralExpression(SyntaxKind.NumericLiteralExpression,
-                                                Literal(quest.QuestId))),
+                                        Argument(LiteralValue(quest.QuestId)),
                                         Token(SyntaxKind.CommaToken),
                                         Argument(CreateQuestRootExpression(quest.QuestId, quest.Root))
                                     })))));
@@ -149,7 +148,7 @@ public class QuestSourceGenerator : ISourceGenerator
         return statements.ToArray();
     }
 
-    private static ObjectCreationExpressionSyntax CreateQuestRootExpression(ushort questId, QuestRoot quest)
+    private static ObjectCreationExpressionSyntax CreateQuestRootExpression(ElementId questId, QuestRoot quest)
     {
         try
         {
index 0a8e19e23e3025dcd4ae22318961dba8344cc234..027e597ae90812e1f3148fd4789860d8d3c07aac 100644 (file)
@@ -74,6 +74,15 @@ public static class RoslynShortcuts
                             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(
index 5e1baac022f43ae18f6658173986134e65d0fe24..bbae8921e22a1cc5ca9f69c676a4e3efb7090d97 100644 (file)
@@ -14,8 +14,8 @@ namespace Questionable.QuestPathGenerator;
 
 public static class Utils
 {
-    public static IEnumerable<(ushort, JsonNode)> GetAdditionalFiles(GeneratorExecutionContext context,
-        AdditionalText jsonSchemaFile, JsonSchema jsonSchema, DiagnosticDescriptor invalidJson)
+    public static IEnumerable<(T, JsonNode)> GetAdditionalFiles<T>(GeneratorExecutionContext context,
+        AdditionalText jsonSchemaFile, JsonSchema jsonSchema, DiagnosticDescriptor invalidJson, Func<string, T> idParser)
     {
         var commonSchemaFile = context.AdditionalFiles.Single(x => Path.GetFileName(x.Path) == "common-schema.json");
         List<AdditionalText> jsonSchemaFiles = [jsonSchemaFile, commonSchemaFile];
@@ -36,7 +36,7 @@ public static class Utils
             if (!name.Contains("_"))
                 continue;
 
-            ushort id = ushort.Parse(name.Substring(0, name.IndexOf('_')));
+            T id = idParser(name.Substring(0, name.IndexOf('_')));
 
             var text = additionalFile.GetText();
             if (text == null)
@@ -68,9 +68,9 @@ public static class Utils
         }
     }
 
-    public static List<MethodDeclarationSyntax> CreateMethods<T>(string prefix,
-        List<IGrouping<string, (ushort, T)>> partitions,
-        Func<List<(ushort, T)>, StatementSyntax[]> toInitializers)
+    public static List<MethodDeclarationSyntax> CreateMethods<TId, TQuest>(string prefix,
+        List<IGrouping<string, (TId, TQuest)>> partitions,
+        Func<List<(TId, TQuest)>, StatementSyntax[]> toInitializers)
     {
         List<MethodDeclarationSyntax> methods =
         [
index 3ef7df15ceb1af26c58174e5875d7a655c0992e6..c5fbdfb77810e7dd074eddae0924db3051e62c8c 100644 (file)
@@ -9,9 +9,9 @@ namespace Questionable.QuestPaths;
 [SuppressMessage("ReSharper", "PartialTypeWithSinglePart", Justification = "Required for RELEASE")]
 public static partial class AssemblyQuestLoader
 {
-    private static Dictionary<ushort, QuestRoot>? _quests;
+    private static Dictionary<ElementId, QuestRoot>? _quests;
 
-    public static IReadOnlyDictionary<ushort, QuestRoot> GetQuests()
+    public static IReadOnlyDictionary<ElementId, QuestRoot> GetQuests()
     {
         if (_quests == null)
         {
@@ -28,5 +28,5 @@ public static partial class AssemblyQuestLoader
         typeof(AssemblyQuestLoader).Assembly.GetManifestResourceStream("Questionable.QuestPaths.QuestSchema")!;
 
     [SuppressMessage("ReSharper", "UnusedMember.Local")]
-    private static void AddQuest(ushort questId, QuestRoot root) => _quests![questId] = root;
+    private static void AddQuest(ElementId questId, QuestRoot root) => _quests![questId] = root;
 }
index 58b93f3ff287eddec4c4c263a43e68ee32e5e68b..4457b3abf2564e8c1881c87a2efff70fbf652148 100644 (file)
@@ -87,13 +87,13 @@ internal sealed class QuestRegistry
     {
         _logger.LogInformation("Loading quests from assembly");
 
-        foreach ((ushort questId, QuestRoot questRoot) in AssemblyQuestLoader.GetQuests())
+        foreach ((ElementId questId, QuestRoot questRoot) in AssemblyQuestLoader.GetQuests())
         {
             Quest quest = new()
             {
-                Id = new QuestId(questId),
+                Id = questId,
                 Root = questRoot,
-                Info = _questData.GetQuestInfo(new QuestId(questId)),
+                Info = _questData.GetQuestInfo(questId),
                 ReadOnly = true,
             };
             _quests[quest.Id] = quest;