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));
 
     {
         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)
             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);
         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 = [];
 
                                 SeparatedList<ArgumentSyntax>(
                                     new SyntaxNodeOrToken[]
                                     {
-                                        Argument(
-                                            LiteralExpression(SyntaxKind.NumericLiteralExpression,
-                                                Literal(quest.QuestId))),
+                                        Argument(LiteralValue(quest.QuestId)),
                                         Token(SyntaxKind.CommaToken),
                                         Argument(CreateQuestRootExpression(quest.QuestId, quest.Root))
                                     })))));
         return statements.ToArray();
     }
 
-    private static ObjectCreationExpressionSyntax CreateQuestRootExpression(ushort questId, QuestRoot quest)
+    private static ObjectCreationExpressionSyntax CreateQuestRootExpression(ElementId questId, QuestRoot quest)
     {
         try
         {
 
                             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(
 
 
 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];
             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)
         }
     }
 
-    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 =
         [
 
 [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)
         {
         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;
 }
 
     {
         _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;