WIP some IDE test
authorLiza Carvelli <liza@carvel.li>
Wed, 5 Feb 2025 00:21:28 +0000 (01:21 +0100)
committerLiza Carvelli <liza@carvel.li>
Wed, 5 Feb 2025 00:21:28 +0000 (01:21 +0100)
14 files changed:
GatheringPaths/GatheringPaths.csproj
GatheringPaths/gatheringlocation-v1.json
QuestPathGenerator/Utils.cs
QuestPaths/QuestPaths.csproj
QuestPaths/quest-v1.json
Questionable.Model/AssemblyModelLoader.cs
Questionable.Model/Questionable.Model.csproj
Questionable.Model/common-aethernetshard.json [new file with mode: 0644]
Questionable.Model/common-aetheryte.json [new file with mode: 0644]
Questionable.Model/common-classjob.json [new file with mode: 0644]
Questionable.Model/common-completionflags.json [new file with mode: 0644]
Questionable.Model/common-schema.json [deleted file]
Questionable.Model/common-vector3.json [new file with mode: 0644]
Questionable/Validation/Validators/JsonSchemaValidator.cs

index eca2d022de6206ac5918936a1e9b9c6d7f57f61d..1581f5d172d88b704728be70c73d588d1a8cef71 100644 (file)
             <LogicalName>Questionable.GatheringPaths.GatheringLocationSchema</LogicalName>
         </EmbeddedResource>
         <AdditionalFiles Include="gatheringlocation-v1.json" />
-        <AdditionalFiles Include="..\Questionable.Model\common-schema.json" />
+        <AdditionalFiles Include="..\Questionable.Model\common-aethernetshard.json" />
+        <AdditionalFiles Include="..\Questionable.Model\common-aetheryte.json" />
+        <AdditionalFiles Include="..\Questionable.Model\common-classjob.json" />
+        <AdditionalFiles Include="..\Questionable.Model\common-completionflags.json" />
+        <AdditionalFiles Include="..\Questionable.Model\common-vector3.json" />
         <AdditionalFiles Include="..\QuestPaths\quest-v1.json" />
     </ItemGroup>
 
index beba3b18277c97c5e39f6495352f0fdb6fd5b7b1..dacb7ddc14cf1f3ffd01b420cefc0f2c74985b5f 100644 (file)
@@ -55,7 +55,7 @@
                     "type": "object",
                     "properties": {
                       "Position": {
-                        "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Vector3"
+                        "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-vector3.json"
                       },
                       "MinimumAngle": {
                         "type": "number",
index 4a08c9e0c06af8e4638a0b2772351289b596bd15..de364558be3aa8cba762e0b6343fb95aca081bae 100644 (file)
@@ -16,14 +16,38 @@ public static class Utils
 {
     public static List<AdditionalText> RegisterSchemas(GeneratorExecutionContext context)
     {
-        var commonSchemaFile = context.AdditionalFiles.Single(x => Path.GetFileName(x.Path) == "common-schema.json");
+        var commonAethernetShardFile =
+            context.AdditionalFiles.Single(x => Path.GetFileName(x.Path) == "common-aethernetshard.json");
+        var commonAetheryteFile =
+            context.AdditionalFiles.Single(x => Path.GetFileName(x.Path) == "common-aetheryte.json");
+        var commonClassJobFile =
+            context.AdditionalFiles.Single(x => Path.GetFileName(x.Path) == "common-classjob.json");
+        var commonCompletionFlagsFile =
+            context.AdditionalFiles.Single(x => Path.GetFileName(x.Path) == "common-completionflags.json");
+        var commonVector3File = context.AdditionalFiles.Single(x => Path.GetFileName(x.Path) == "common-vector3.json");
         var gatheringSchemaFile =
             context.AdditionalFiles.SingleOrDefault(x => Path.GetFileName(x.Path) == "gatheringlocation-v1.json");
         var questSchemaFile = context.AdditionalFiles.SingleOrDefault(x => Path.GetFileName(x.Path) == "quest-v1.json");
 
         SchemaRegistry.Global.Register(
-            new Uri("https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json"),
-            JsonSchema.FromText(commonSchemaFile.GetText()!.ToString()));
+            new Uri(
+                "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-aethernetshard.json"),
+            JsonSchema.FromText(commonAethernetShardFile.GetText()!.ToString()));
+        SchemaRegistry.Global.Register(
+            new Uri(
+                "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-aetheryte.json"),
+            JsonSchema.FromText(commonAetheryteFile.GetText()!.ToString()));
+        SchemaRegistry.Global.Register(
+            new Uri(
+                "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-classjob.json"),
+            JsonSchema.FromText(commonClassJobFile.GetText()!.ToString()));
+        SchemaRegistry.Global.Register(
+            new Uri(
+                "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-completionflags.json"),
+            JsonSchema.FromText(commonCompletionFlagsFile.GetText()!.ToString()));
+        SchemaRegistry.Global.Register(
+            new Uri("https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-vector3.json"),
+            JsonSchema.FromText(commonVector3File.GetText()!.ToString()));
 
         if (gatheringSchemaFile != null)
         {
@@ -40,7 +64,16 @@ public static class Utils
                 JsonSchema.FromText(questSchemaFile.GetText()!.ToString()));
         }
 
-        List<AdditionalText?> jsonSchemaFiles = [commonSchemaFile, gatheringSchemaFile, questSchemaFile];
+        List<AdditionalText?> jsonSchemaFiles =
+        [
+            commonAethernetShardFile,
+            commonAetheryteFile,
+            commonClassJobFile,
+            commonCompletionFlagsFile,
+            commonVector3File,
+            gatheringSchemaFile,
+            questSchemaFile
+        ];
         return jsonSchemaFiles.Where(x => x != null).Cast<AdditionalText>().ToList();
     }
 
index f0bd1b4281941c2e8a2da101007b3329dc5a7fe1..05bce7ac7a570f3281c9f2d0f337e6694649c938 100644 (file)
         </EmbeddedResource>
         <AdditionalFiles Include="4.x - Stormblood\Class Quests\BTN\2623_The White Death.json" />
         <AdditionalFiles Include="quest-v1.json" />
-        <AdditionalFiles Include="..\Questionable.Model\common-schema.json" />
+        <AdditionalFiles Include="..\Questionable.Model\common-aethernetshard.json" />
+        <AdditionalFiles Include="..\Questionable.Model\common-aetheryte.json" />
+        <AdditionalFiles Include="..\Questionable.Model\common-classjob.json" />
+        <AdditionalFiles Include="..\Questionable.Model\common-completionflags.json" />
+        <AdditionalFiles Include="..\Questionable.Model\common-vector3.json" />
     </ItemGroup>
 
     <ItemGroup Condition="'$(Configuration)' == 'Release'">
index 2654e0310ca9f0441790fa2c0ae3da491dbd4e72..62ad5764433d0c190d28dfb9bbef11a93d89f4d5 100644 (file)
@@ -76,7 +76,7 @@
           "exclusiveMinimum": 0
         },
         "Position": {
-          "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Vector3"
+          "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-vector3.json"
         },
         "StopDistance": {
           "type": [
         },
         "AetheryteShortcut": {
           "description": "The Aetheryte to teleport to (before moving)",
-          "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte"
+          "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-aetheryte.json"
         },
         "AethernetShortcut": {
           "type": "array",
           "minItems": 2,
           "maxItems": 2,
           "items": {
-            "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/AethernetShard"
+            "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-aethernetshard.json"
           }
         },
         "ItemId": {
                   "type": "boolean"
                 },
                 "CompletionQuestVariablesFlags": {
-                  "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/CompletionFlags"
+                  "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-completionflags.json"
                 },
                 "Flying": {
                   "type": "string",
                   }
                 },
                 "AetheryteLocked": {
-                  "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte"
+                  "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-aetheryte.json"
                 },
                 "AetheryteUnlocked": {
-                  "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte"
+                  "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-aetheryte.json"
                 },
                 "NearPosition": {
                   "type": "object",
                   "properties": {
                     "Position": {
-                      "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Vector3"
+                      "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-vector3.json"
                     },
                     "MaximumDistance": {
                       "type": "number"
                   }
                 },
                 "AetheryteLocked": {
-                  "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte"
+                  "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-aetheryte.json"
                 },
                 "AetheryteUnlocked": {
-                  "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte"
+                  "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-aetheryte.json"
                 },
                 "RequiredQuestVariablesNotMet": {
                   "type": "boolean"
                   "type": "object",
                   "properties": {
                     "Position": {
-                      "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Vector3"
+                      "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-vector3.json"
                     },
                     "MaximumDistance": {
                       "type": "number"
                   "type": "boolean"
                 },
                 "AetheryteLocked": {
-                  "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte"
+                  "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-aetheryte.json"
                 },
                 "AetheryteUnlocked": {
-                  "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte"
+                  "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-aetheryte.json"
                 }
               },
               "additionalProperties": false
           "additionalProperties": false
         },
         "CompletionQuestVariablesFlags": {
-          "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/CompletionFlags"
+          "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-completionflags.json"
         },
         "RequiredQuestVariables": {
           "type": "array",
           "description": "Which class or job you are using whenever this step gets executed",
           "type": "array",
           "items": {
-            "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/ClassJob"
+            "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-classjob.json"
           }
         },
         "RequiredQuestAcceptedJob": {
           "description": "Which class or job you were using when accepting this quest (e.g. for beast tribes)",
           "type": "array",
           "items": {
-            "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/ClassJob"
+            "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-classjob.json"
           }
         },
         "DelaySecondsAtStart": {
           "then": {
             "properties": {
               "Aetheryte": {
-                "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte"
+                "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-aetheryte.json"
               },
               "DataId": {
                 "type": "null"
           "then": {
             "properties": {
               "AethernetShard": {
-                "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/AethernetShard"
+                "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-aethernetshard.json"
               },
               "DataId": {
                 "type": "null"
                       "type": "integer"
                     },
                     "CompletionQuestVariablesFlags": {
-                      "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/CompletionFlags"
+                      "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-completionflags.json"
                     },
                     "IgnoreQuestMarker": {
                       "type": "boolean"
                 "type": "object",
                 "properties": {
                   "Position": {
-                    "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Vector3"
+                    "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-vector3.json"
                   },
                   "StopDistance": {
                     "type": [
           "then": {
             "properties": {
               "TargetClass": {
-                "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/ClassJob"
+                "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-classjob.json"
               }
             },
             "required": [
index d167cb25bfb323aa4c4f52a481d0810046e9863d..8e6aae2a11a89177e13172a65a6228f6fbb65f39 100644 (file)
@@ -4,6 +4,14 @@ namespace Questionable.Model;
 
 public static class AssemblyModelLoader
 {
-    public static Stream CommonSchema =>
-        typeof(AssemblyModelLoader).Assembly.GetManifestResourceStream("Questionable.Model.CommonSchema")!;
+    public static Stream CommonAetheryte =>
+        typeof(AssemblyModelLoader).Assembly.GetManifestResourceStream("Questionable.Model.CommonAetheryte")!;
+    public static Stream CommonAethernetShard =>
+        typeof(AssemblyModelLoader).Assembly.GetManifestResourceStream("Questionable.Model.CommonAethernetShard")!;
+    public static Stream CommonClassJob =>
+        typeof(AssemblyModelLoader).Assembly.GetManifestResourceStream("Questionable.Model.CommonClassJob")!;
+    public static Stream CommonCompletionFlags =>
+        typeof(AssemblyModelLoader).Assembly.GetManifestResourceStream("Questionable.Model.CommonCompletionFlags")!;
+    public static Stream CommonVector3 =>
+        typeof(AssemblyModelLoader).Assembly.GetManifestResourceStream("Questionable.Model.CommonVector3")!;
 }
index 62ae2a34b9f19cc1fac056a4184c08f16456ee6e..13afcd4390bf4069b79af69353636cc6fc19af06 100644 (file)
 
 
     <ItemGroup>
-        <None Remove="common-schema.json" />
-        <EmbeddedResource Include="common-schema.json">
-            <LogicalName>Questionable.Model.CommonSchema</LogicalName>
+        <None Remove="common-aethernetshard.json" />
+        <None Remove="common-aetheryte.json" />
+        <None Remove="common-classjob.json" />
+        <None Remove="common-completionflags.json" />
+        <None Remove="common-vector3.json" />
+        <EmbeddedResource Include="common-aethernetshard.json">
+            <LogicalName>Questionable.Model.CommonAethernetShard</LogicalName>
+        </EmbeddedResource>
+        <EmbeddedResource Include="common-aetheryte.json">
+            <LogicalName>Questionable.Model.CommonAetheryte</LogicalName>
+        </EmbeddedResource>
+        <EmbeddedResource Include="common-classjob.json">
+            <LogicalName>Questionable.Model.CommonClassJob</LogicalName>
+        </EmbeddedResource>
+        <EmbeddedResource Include="common-completionflags.json">
+            <LogicalName>Questionable.Model.CommonCompletionFlags</LogicalName>
+        </EmbeddedResource>
+        <EmbeddedResource Include="common-vector3.json">
+            <LogicalName>Questionable.Model.CommonVector3</LogicalName>
         </EmbeddedResource>
     </ItemGroup>
 </Project>
diff --git a/Questionable.Model/common-aethernetshard.json b/Questionable.Model/common-aethernetshard.json
new file mode 100644 (file)
index 0000000..d382d8f
--- /dev/null
@@ -0,0 +1,151 @@
+{
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "$id": "/liza/Questionable/raw/branch/master/Questionable.Model/common-aethernetshard.json",
+  "type": "string",
+  "enum": [
+    "[Gridania] Aetheryte Plaza",
+    "[Gridania] Archers' Guild",
+    "[Gridania] Leatherworkers' Guild & Shaded Bower",
+    "[Gridania] Lancers' Guild",
+    "[Gridania] Conjurers' Guild",
+    "[Gridania] Botanists' Guild",
+    "[Gridania] Mih Khetto's Amphitheatre",
+    "[Gridania] Blue Badger Gate (Central Shroud)",
+    "[Gridania] Yellow Serpent Gate (North Shroud)",
+    "[Gridania] White Wolf Gate (Central Shroud)",
+    "[Gridania] Airship Landing",
+    "[Ul'dah] Aetheryte Plaza",
+    "[Ul'dah] Adventurers' Guild",
+    "[Ul'dah] Thaumaturges' Guild",
+    "[Ul'dah] Gladiators' Guild",
+    "[Ul'dah] Miners' Guild",
+    "[Ul'dah] Weavers' Guild",
+    "[Ul'dah] Goldsmiths' Guild",
+    "[Ul'dah] Sapphire Avenue Exchange",
+    "[Ul'dah] Alchemists' Guild",
+    "[Ul'dah] Gate of the Sultana (Western Thanalan)",
+    "[Ul'dah] Gate of Nald (Central Thanalan)",
+    "[Ul'dah] Gate of Thal (Central Thanalan)",
+    "[Ul'dah] The Chamber of Rule",
+    "[Ul'dah] Airship Landing",
+    "[Limsa Lominsa] Aetheryte Plaza",
+    "[Limsa Lominsa] Arcanists' Guild",
+    "[Limsa Lominsa] Fishermens' Guild",
+    "[Limsa Lominsa] Hawkers' Alley",
+    "[Limsa Lominsa] The Aftcastle",
+    "[Limsa Lominsa] Culinarians' Guild",
+    "[Limsa Lominsa] Marauders' Guild",
+    "[Limsa Lominsa] Zephyr Gate (Middle La Noscea)",
+    "[Limsa Lominsa] Tempest Gate (Lower La Noscea)",
+    "[Limsa Lominsa] Airship Landing",
+    "[Gold Saucer] Aetheryte Plaza",
+    "[Gold Saucer] Entrance & Card Squares",
+    "[Gold Saucer] Wonder Square East",
+    "[Gold Saucer] Wonder Square West",
+    "[Gold Saucer] Event Square",
+    "[Gold Saucer] Cactpot Board",
+    "[Gold Saucer] Round Square",
+    "[Gold Saucer] Chocobo Square",
+    "[Gold Saucer] Minion Square",
+    "[Ishgard] Aetheryte Plaza",
+    "[Ishgard] The Forgotten Knight",
+    "[Ishgard] Skysteel Manufactory",
+    "[Ishgard] The Brume",
+    "[Ishgard] Athenaeum Astrologicum",
+    "[Ishgard] The Jeweled Crozier",
+    "[Ishgard] Saint Reymanaud's Cathedral",
+    "[Ishgard] The Tribunal",
+    "[Ishgard] The Last Vigil",
+    "[Ishgard] The Gates of Judgement (Coerthas Central Highlands)",
+    "[Ishgard] Firmament",
+    "[Firmament] The Mendicant's Court",
+    "[Firmament] The Mattock",
+    "[Firmament] The New Nest",
+    "[Firmament] Saint Roelle's Dais",
+    "[Firmament] Featherfall",
+    "[Firmament] Hoarfrost Hall",
+    "[Firmament] Western Risensong Quarter",
+    "[Firmament] Eastern Risensong Quarter",
+    "[Idyllshire] Aetheryte Plaza",
+    "[Idyllshire] West Idyllshire",
+    "[Idyllshire] Prologue Gate (Western Hinterlands)",
+    "[Idyllshire] Epilogue Gate (Eastern Hinterlands)",
+    "[Rhalgr's Reach] Aetheryte Plaza",
+    "[Rhalgr's Reach] Western Rhalgr's Reach",
+    "[Rhalgr's Reach] Northeastern Rhalgr's Reach",
+    "[Rhalgr's Reach] Fringes Gate",
+    "[Rhalgr's Reach] Peaks Gate",
+    "[Kugane] Aetheryte Plaza",
+    "[Kugane] Shiokaze Hostelry",
+    "[Kugane] Pier #1",
+    "[Kugane] Thavnairian Consulate",
+    "[Kugane] Kogane Dori Markets",
+    "[Kugane] Bokairo Inn",
+    "[Kugane] The Ruby Bazaar",
+    "[Kugane] Sekiseigumi Barracks",
+    "[Kugane] Rakuza District",
+    "[Kugane] The Ruby Price",
+    "[Kugane] Airship Landing",
+    "[Doman Enclave] Aetheryte Plaza",
+    "[Doman Enclave] The Northern Enclave",
+    "[Doman Enclave] The Southern Enclave",
+    "[Doman Enclave] Ferry Docks",
+    "[Doman Enclave] The One River",
+    "[Doman Enclave] Gangos",
+    "[Crystarium] Aetheryte Plaza",
+    "[Crystarium] Musica Universalis Markets",
+    "[Crystarium] Temenos Rookery",
+    "[Crystarium] The Dossal Gate",
+    "[Crystarium] The Pendants",
+    "[Crystarium] The Amaro Launch",
+    "[Crystarium] The Crystalline Mean",
+    "[Crystarium] The Cabinet of Curiosity",
+    "[Crystarium] Tessellation (Lakeland)",
+    "[Eulmore] Aetheryte Plaza",
+    "[Eulmore] Southeast Derelicts",
+    "[Eulmore] Nightsoil Pots",
+    "[Eulmore] The Glory Gate",
+    "[Eulmore] The Mainstay",
+    "[Eulmore] The Path to Glory (Kholusia)",
+    "[Old Sharlayan] Aetheryte Plaza",
+    "[Old Sharlayan] The Studium",
+    "[Old Sharlayan] The Baldesion Annex",
+    "[Old Sharlayan] The Rostra",
+    "[Old Sharlayan] The Leveilleur Estate",
+    "[Old Sharlayan] Journey's End",
+    "[Old Sharlayan] Scholar's Harbor",
+    "[Old Sharlayan] The Hall of Artifice (Labyrinthos)",
+    "[Radz-at-Han] Aetheryte Plaza",
+    "[Radz-at-Han] Meghaduta",
+    "[Radz-at-Han] Ruveydah Fibers",
+    "[Radz-at-Han] Airship Landing",
+    "[Radz-at-Han] Alzadaal's Peace",
+    "[Radz-at-Han] Hall of the Radiant Host",
+    "[Radz-at-Han] Mehryde's Meyhane",
+    "[Radz-at-Han] Kama",
+    "[Radz-at-Han] The High Crucible of Al-Kimiya",
+    "[Radz-at-Han] The Gate of First Sight (Thavnair)",
+    "[Tuliyollal] Aetheryte Plaza",
+    "[Tuliyollal] Dirigible Landing",
+    "[Tuliyollal] The Resplendent Quarter",
+    "[Tuliyollal] The For'ard Cabins",
+    "[Tuliyollal] Bayside Bevy Marketplace",
+    "[Tuliyollal] Vollok Shoonsa",
+    "[Tuliyollal] Wachumeqimeqi",
+    "[Tuliyollal] Brightploom Post",
+    "[Tuliyollal] Arch of the Dawn (Urqopacha)",
+    "[Tuliyollal] Arch of the Dawn (Kozama'uka)",
+    "[Tuliyollal] Ihuykatumu (Kozama'uka)",
+    "[Tuliyollal] Dirigible Landing (Yak T'el)",
+    "[Tuliyollal] Xak Tural Skygate (Shaaloani)",
+    "[Solution Nine] Aetheryte Plaza",
+    "[Solution Nine] Information Center",
+    "[Solution Nine] True Vue",
+    "[Solution Nine] Neon Stein",
+    "[Solution Nine] The Arcadion",
+    "[Solution Nine] Resolution",
+    "[Solution Nine] Nexus Arcade",
+    "[Solution Nine] Residential Sector",
+    "[Solution Nine] Scanning Port Nine (Heritage Found)"
+  ]
+}
diff --git a/Questionable.Model/common-aetheryte.json b/Questionable.Model/common-aetheryte.json
new file mode 100644 (file)
index 0000000..513b2d0
--- /dev/null
@@ -0,0 +1,114 @@
+{
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "$id": "/liza/Questionable/raw/branch/master/Questionable.Model/common-aetheryte.json",
+  "type": "string",
+  "enum": [
+    "Gridania",
+    "Central Shroud - Bentbranch Meadows",
+    "East Shroud - Hawthorne Hut",
+    "South Shroud - Quarrymill",
+    "South Shroud - Camp Tranquil",
+    "North Shroud - Fallgourd Float",
+    "Ul'dah",
+    "Western Thanalan - Horizon",
+    "Central Thanalan - Black Brush Station",
+    "Eastern Thanalan - Camp Drybone",
+    "Southern Thanalan - Little Ala Mhigo",
+    "Southern Thanalan - Forgotten Springs",
+    "Northern Thanalan - Camp Bluefog",
+    "Northern Thanalan - Ceruleum Processing Plant",
+    "Limsa Lominsa",
+    "Middle La Noscea - Summerford Farms",
+    "Lower La Noscea - Moraby Drydocks",
+    "Eastern La Noscea - Costa Del Sol",
+    "Eastern La Noscea - Wineport",
+    "Western La Noscea - Swiftperch",
+    "Western La Noscea - Aleport",
+    "Upper La Noscea - Camp Bronze Lake",
+    "Outer La Noscea - Camp Overlook",
+    "Coerthas Central Highlands - Camp Dragonhead",
+    "Mor Dhona",
+    "Wolves' Den Pier",
+    "Gold Saucer",
+    "Ishgard",
+    "Idyllshire",
+    "Coerthas Western Highlands - Falcon's Nest",
+    "The Sea of Clouds - Camp Cloudtop",
+    "The Sea of Clouds - Ok' Zundu",
+    "Azys Lla - Helix",
+    "The Dravanian Forelands - Tailfeather",
+    "The Dravanian Forelands - Anyx Trine",
+    "The Churning Mists - Moghome",
+    "The Churning Mists - Zenith",
+    "Rhalgr's Reach",
+    "Fringes - Castrum Oriens",
+    "Fringes - Peering Stones",
+    "Peaks - Ala Gannha",
+    "Peaks - Ala Ghiri",
+    "Lochs - Porta Praetoria",
+    "Lochs - Ala Mhigan Quarter",
+    "Kugane",
+    "Ruby Sea - Tamamizu",
+    "Ruby Sea - Onokoro",
+    "Yanxia - Namai",
+    "Yanxia - House of the Fierce",
+    "Azim Steppe - Reunion",
+    "Azim Steppe - Dawn Throne",
+    "Azim Steppe - Dhoro Iloh",
+    "Doman Enclave",
+    "Crystarium",
+    "Eulmore",
+    "Lakeland - Fort Jobb",
+    "Lakeland - Ostall Imperative",
+    "Kholusia - Stilltide",
+    "Kholusia - Wright",
+    "Kholusia - Tomra",
+    "Amh Araeng - Mord Souq",
+    "Amh Araeng - Inn at Journey's Head",
+    "Amh Araeng - Twine",
+    "Rak'tika - Slitherbough",
+    "Rak'tika - Fanow",
+    "Il Mheg - Lydha Lran",
+    "Il Mheg - Pla Enni",
+    "Il Mheg - Wolekdorf",
+    "Tempest - Ondo Cups",
+    "Tempest - Macarenses Angle",
+    "Old Sharlayan",
+    "Radz-at-Han",
+    "Labyrinthos - Archeion",
+    "Labyrinthos - Sharlayan Hamlet",
+    "Labyrinthos - Aporia",
+    "Thavnair - Yedlihmad",
+    "Thavnair - Great Work",
+    "Thavnair - Palaka's Stand",
+    "Garlemald - Camp Broken Glass",
+    "Garlemald - Tertium",
+    "Mare Lamentorum - Sinus Lacrimarum",
+    "Mare Lamentorum - Bestways Burrow",
+    "Elpis - Anagnorisis",
+    "Elpis - Twelve Wonders",
+    "Elpis - Poieten Oikos",
+    "Ultima Thule - Reah Tahra",
+    "Ultima Thule - Abode of the Ea",
+    "Ultima Thule - Base Omicron",
+    "Tuliyollal",
+    "Solution Nine",
+    "Urqopacha - Wachunpelo",
+    "Urqopacha - Worlar's Echo",
+    "Kozama'uka - Ok'hanu",
+    "Kozama'uka - Many Fires",
+    "Kozama'uka - Earthenshire",
+    "Kozama'uka - Dock Poga",
+    "Yak T'el - Iq Br'aax",
+    "Yak T'el - Mamook",
+    "Shaaloani - Hhusatahwi",
+    "Shaaloani - Sheshenewezi Springs",
+    "Shaaloani - Mehwahhetsoan",
+    "Heritage Found - Yyasulani Station",
+    "Heritage Found - The Outskirts",
+    "Heritage Found - Electrope Strike",
+    "Living Memory - Leynode Mnemo",
+    "Living Memory - Leynode Pyro",
+    "Living Memory - Leynode Aero"
+  ]
+}
diff --git a/Questionable.Model/common-classjob.json b/Questionable.Model/common-classjob.json
new file mode 100644 (file)
index 0000000..aa9fa7e
--- /dev/null
@@ -0,0 +1,53 @@
+{
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "$id": "/liza/Questionable/raw/branch/master/Questionable.Model/common-classjob.json",
+  "type": "string",
+  "enum": [
+    "Gladiator",
+    "Pugilist",
+    "Marauder",
+    "Lancer",
+    "Archer",
+    "Conjurer",
+    "Thaumaturge",
+    "Carpenter",
+    "Blacksmith",
+    "Armorer",
+    "Goldsmith",
+    "Leatherworker",
+    "Weaver",
+    "Alchemist",
+    "Culinarian",
+    "Miner",
+    "Botanist",
+    "Fisher",
+    "Paladin",
+    "Monk",
+    "Warrior",
+    "Dragoon",
+    "Bard",
+    "White Mage",
+    "Black Mage",
+    "Arcanist",
+    "Summoner",
+    "Scholar",
+    "Rogue",
+    "Ninja",
+    "Machinist",
+    "Dark Knight",
+    "Astrologian",
+    "Samurai",
+    "Red Mage",
+    "Blue Mage",
+    "Gunbreaker",
+    "Dancer",
+    "Reaper",
+    "Sage",
+    "Viper",
+    "Pictomancer",
+    "DoW",
+    "DoM",
+    "DoH",
+    "DoL"
+  ]
+}
diff --git a/Questionable.Model/common-completionflags.json b/Questionable.Model/common-completionflags.json
new file mode 100644 (file)
index 0000000..eb77d70
--- /dev/null
@@ -0,0 +1,59 @@
+{
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "$id": "/liza/Questionable/raw/branch/master/Questionable.Model/common-completionflags.json",
+  "type": "array",
+  "description": "Quest Variables that dictate whether or not this step is skipped: null is don't check, positive values need to be set, negative values need to be unset",
+  "items": {
+    "oneOf": [
+      {
+        "type": "object",
+        "properties": {
+          "High": {
+            "type": [
+              "number",
+              "null"
+            ],
+            "minimum": 0,
+            "maximum": 15
+          },
+          "Low": {
+            "type": [
+              "number",
+              "null"
+            ],
+            "minimum": 0,
+            "maximum": 15
+          },
+          "Negative": {
+            "type": "boolean"
+          },
+          "Mode": {
+            "type": "string",
+            "enum": [
+              "Bitwise",
+              "Exact"
+            ]
+          }
+        }
+      },
+      {
+        "type": "number",
+        "enum": [
+          1,
+          2,
+          4,
+          8,
+          16,
+          32,
+          64,
+          128
+        ]
+      },
+      {
+        "type": "null"
+      }
+    ]
+  },
+  "minItems": 6,
+  "maxItems": 6
+}
diff --git a/Questionable.Model/common-schema.json b/Questionable.Model/common-schema.json
deleted file mode 100644 (file)
index b0cdeee..0000000
+++ /dev/null
@@ -1,395 +0,0 @@
-{
-  "$schema": "https://json-schema.org/draft/2020-12/schema",
-  "$id": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json",
-  "$defs": {
-    "Vector3": {
-      "type": "object",
-      "description": "Position to try reaching after the jump",
-      "properties": {
-        "X": {
-          "type": "number"
-        },
-        "Y": {
-          "type": "number"
-        },
-        "Z": {
-          "type": "number"
-        }
-      },
-      "required": [
-        "X",
-        "Y",
-        "Z"
-      ]
-    },
-    "Aetheryte": {
-      "type": "string",
-      "enum": [
-        "Gridania",
-        "Central Shroud - Bentbranch Meadows",
-        "East Shroud - Hawthorne Hut",
-        "South Shroud - Quarrymill",
-        "South Shroud - Camp Tranquil",
-        "North Shroud - Fallgourd Float",
-        "Ul'dah",
-        "Western Thanalan - Horizon",
-        "Central Thanalan - Black Brush Station",
-        "Eastern Thanalan - Camp Drybone",
-        "Southern Thanalan - Little Ala Mhigo",
-        "Southern Thanalan - Forgotten Springs",
-        "Northern Thanalan - Camp Bluefog",
-        "Northern Thanalan - Ceruleum Processing Plant",
-        "Limsa Lominsa",
-        "Middle La Noscea - Summerford Farms",
-        "Lower La Noscea - Moraby Drydocks",
-        "Eastern La Noscea - Costa Del Sol",
-        "Eastern La Noscea - Wineport",
-        "Western La Noscea - Swiftperch",
-        "Western La Noscea - Aleport",
-        "Upper La Noscea - Camp Bronze Lake",
-        "Outer La Noscea - Camp Overlook",
-        "Coerthas Central Highlands - Camp Dragonhead",
-        "Mor Dhona",
-        "Wolves' Den Pier",
-        "Gold Saucer",
-        "Ishgard",
-        "Idyllshire",
-        "Coerthas Western Highlands - Falcon's Nest",
-        "The Sea of Clouds - Camp Cloudtop",
-        "The Sea of Clouds - Ok' Zundu",
-        "Azys Lla - Helix",
-        "The Dravanian Forelands - Tailfeather",
-        "The Dravanian Forelands - Anyx Trine",
-        "The Churning Mists - Moghome",
-        "The Churning Mists - Zenith",
-        "Rhalgr's Reach",
-        "Fringes - Castrum Oriens",
-        "Fringes - Peering Stones",
-        "Peaks - Ala Gannha",
-        "Peaks - Ala Ghiri",
-        "Lochs - Porta Praetoria",
-        "Lochs - Ala Mhigan Quarter",
-        "Kugane",
-        "Ruby Sea - Tamamizu",
-        "Ruby Sea - Onokoro",
-        "Yanxia - Namai",
-        "Yanxia - House of the Fierce",
-        "Azim Steppe - Reunion",
-        "Azim Steppe - Dawn Throne",
-        "Azim Steppe - Dhoro Iloh",
-        "Doman Enclave",
-        "Crystarium",
-        "Eulmore",
-        "Lakeland - Fort Jobb",
-        "Lakeland - Ostall Imperative",
-        "Kholusia - Stilltide",
-        "Kholusia - Wright",
-        "Kholusia - Tomra",
-        "Amh Araeng - Mord Souq",
-        "Amh Araeng - Inn at Journey's Head",
-        "Amh Araeng - Twine",
-        "Rak'tika - Slitherbough",
-        "Rak'tika - Fanow",
-        "Il Mheg - Lydha Lran",
-        "Il Mheg - Pla Enni",
-        "Il Mheg - Wolekdorf",
-        "Tempest - Ondo Cups",
-        "Tempest - Macarenses Angle",
-        "Old Sharlayan",
-        "Radz-at-Han",
-        "Labyrinthos - Archeion",
-        "Labyrinthos - Sharlayan Hamlet",
-        "Labyrinthos - Aporia",
-        "Thavnair - Yedlihmad",
-        "Thavnair - Great Work",
-        "Thavnair - Palaka's Stand",
-        "Garlemald - Camp Broken Glass",
-        "Garlemald - Tertium",
-        "Mare Lamentorum - Sinus Lacrimarum",
-        "Mare Lamentorum - Bestways Burrow",
-        "Elpis - Anagnorisis",
-        "Elpis - Twelve Wonders",
-        "Elpis - Poieten Oikos",
-        "Ultima Thule - Reah Tahra",
-        "Ultima Thule - Abode of the Ea",
-        "Ultima Thule - Base Omicron",
-        "Tuliyollal",
-        "Solution Nine",
-        "Urqopacha - Wachunpelo",
-        "Urqopacha - Worlar's Echo",
-        "Kozama'uka - Ok'hanu",
-        "Kozama'uka - Many Fires",
-        "Kozama'uka - Earthenshire",
-        "Kozama'uka - Dock Poga",
-        "Yak T'el - Iq Br'aax",
-        "Yak T'el - Mamook",
-        "Shaaloani - Hhusatahwi",
-        "Shaaloani - Sheshenewezi Springs",
-        "Shaaloani - Mehwahhetsoan",
-        "Heritage Found - Yyasulani Station",
-        "Heritage Found - The Outskirts",
-        "Heritage Found - Electrope Strike",
-        "Living Memory - Leynode Mnemo",
-        "Living Memory - Leynode Pyro",
-        "Living Memory - Leynode Aero"
-      ]
-    },
-    "AethernetShard": {
-      "type": "string",
-      "enum": [
-        "[Gridania] Aetheryte Plaza",
-        "[Gridania] Archers' Guild",
-        "[Gridania] Leatherworkers' Guild & Shaded Bower",
-        "[Gridania] Lancers' Guild",
-        "[Gridania] Conjurers' Guild",
-        "[Gridania] Botanists' Guild",
-        "[Gridania] Mih Khetto's Amphitheatre",
-        "[Gridania] Blue Badger Gate (Central Shroud)",
-        "[Gridania] Yellow Serpent Gate (North Shroud)",
-        "[Gridania] White Wolf Gate (Central Shroud)",
-        "[Gridania] Airship Landing",
-        "[Ul'dah] Aetheryte Plaza",
-        "[Ul'dah] Adventurers' Guild",
-        "[Ul'dah] Thaumaturges' Guild",
-        "[Ul'dah] Gladiators' Guild",
-        "[Ul'dah] Miners' Guild",
-        "[Ul'dah] Weavers' Guild",
-        "[Ul'dah] Goldsmiths' Guild",
-        "[Ul'dah] Sapphire Avenue Exchange",
-        "[Ul'dah] Alchemists' Guild",
-        "[Ul'dah] Gate of the Sultana (Western Thanalan)",
-        "[Ul'dah] Gate of Nald (Central Thanalan)",
-        "[Ul'dah] Gate of Thal (Central Thanalan)",
-        "[Ul'dah] The Chamber of Rule",
-        "[Ul'dah] Airship Landing",
-        "[Limsa Lominsa] Aetheryte Plaza",
-        "[Limsa Lominsa] Arcanists' Guild",
-        "[Limsa Lominsa] Fishermens' Guild",
-        "[Limsa Lominsa] Hawkers' Alley",
-        "[Limsa Lominsa] The Aftcastle",
-        "[Limsa Lominsa] Culinarians' Guild",
-        "[Limsa Lominsa] Marauders' Guild",
-        "[Limsa Lominsa] Zephyr Gate (Middle La Noscea)",
-        "[Limsa Lominsa] Tempest Gate (Lower La Noscea)",
-        "[Limsa Lominsa] Airship Landing",
-        "[Gold Saucer] Aetheryte Plaza",
-        "[Gold Saucer] Entrance & Card Squares",
-        "[Gold Saucer] Wonder Square East",
-        "[Gold Saucer] Wonder Square West",
-        "[Gold Saucer] Event Square",
-        "[Gold Saucer] Cactpot Board",
-        "[Gold Saucer] Round Square",
-        "[Gold Saucer] Chocobo Square",
-        "[Gold Saucer] Minion Square",
-        "[Ishgard] Aetheryte Plaza",
-        "[Ishgard] The Forgotten Knight",
-        "[Ishgard] Skysteel Manufactory",
-        "[Ishgard] The Brume",
-        "[Ishgard] Athenaeum Astrologicum",
-        "[Ishgard] The Jeweled Crozier",
-        "[Ishgard] Saint Reymanaud's Cathedral",
-        "[Ishgard] The Tribunal",
-        "[Ishgard] The Last Vigil",
-        "[Ishgard] The Gates of Judgement (Coerthas Central Highlands)",
-        "[Ishgard] Firmament",
-        "[Firmament] The Mendicant's Court",
-        "[Firmament] The Mattock",
-        "[Firmament] The New Nest",
-        "[Firmament] Saint Roelle's Dais",
-        "[Firmament] Featherfall",
-        "[Firmament] Hoarfrost Hall",
-        "[Firmament] Western Risensong Quarter",
-        "[Firmament] Eastern Risensong Quarter",
-        "[Idyllshire] Aetheryte Plaza",
-        "[Idyllshire] West Idyllshire",
-        "[Idyllshire] Prologue Gate (Western Hinterlands)",
-        "[Idyllshire] Epilogue Gate (Eastern Hinterlands)",
-        "[Rhalgr's Reach] Aetheryte Plaza",
-        "[Rhalgr's Reach] Western Rhalgr's Reach",
-        "[Rhalgr's Reach] Northeastern Rhalgr's Reach",
-        "[Rhalgr's Reach] Fringes Gate",
-        "[Rhalgr's Reach] Peaks Gate",
-        "[Kugane] Aetheryte Plaza",
-        "[Kugane] Shiokaze Hostelry",
-        "[Kugane] Pier #1",
-        "[Kugane] Thavnairian Consulate",
-        "[Kugane] Kogane Dori Markets",
-        "[Kugane] Bokairo Inn",
-        "[Kugane] The Ruby Bazaar",
-        "[Kugane] Sekiseigumi Barracks",
-        "[Kugane] Rakuza District",
-        "[Kugane] The Ruby Price",
-        "[Kugane] Airship Landing",
-        "[Doman Enclave] Aetheryte Plaza",
-        "[Doman Enclave] The Northern Enclave",
-        "[Doman Enclave] The Southern Enclave",
-        "[Doman Enclave] Ferry Docks",
-        "[Doman Enclave] The One River",
-        "[Doman Enclave] Gangos",
-        "[Crystarium] Aetheryte Plaza",
-        "[Crystarium] Musica Universalis Markets",
-        "[Crystarium] Temenos Rookery",
-        "[Crystarium] The Dossal Gate",
-        "[Crystarium] The Pendants",
-        "[Crystarium] The Amaro Launch",
-        "[Crystarium] The Crystalline Mean",
-        "[Crystarium] The Cabinet of Curiosity",
-        "[Crystarium] Tessellation (Lakeland)",
-        "[Eulmore] Aetheryte Plaza",
-        "[Eulmore] Southeast Derelicts",
-        "[Eulmore] Nightsoil Pots",
-        "[Eulmore] The Glory Gate",
-        "[Eulmore] The Mainstay",
-        "[Eulmore] The Path to Glory (Kholusia)",
-        "[Old Sharlayan] Aetheryte Plaza",
-        "[Old Sharlayan] The Studium",
-        "[Old Sharlayan] The Baldesion Annex",
-        "[Old Sharlayan] The Rostra",
-        "[Old Sharlayan] The Leveilleur Estate",
-        "[Old Sharlayan] Journey's End",
-        "[Old Sharlayan] Scholar's Harbor",
-        "[Old Sharlayan] The Hall of Artifice (Labyrinthos)",
-        "[Radz-at-Han] Aetheryte Plaza",
-        "[Radz-at-Han] Meghaduta",
-        "[Radz-at-Han] Ruveydah Fibers",
-        "[Radz-at-Han] Airship Landing",
-        "[Radz-at-Han] Alzadaal's Peace",
-        "[Radz-at-Han] Hall of the Radiant Host",
-        "[Radz-at-Han] Mehryde's Meyhane",
-        "[Radz-at-Han] Kama",
-        "[Radz-at-Han] The High Crucible of Al-Kimiya",
-        "[Radz-at-Han] The Gate of First Sight (Thavnair)",
-        "[Tuliyollal] Aetheryte Plaza",
-        "[Tuliyollal] Dirigible Landing",
-        "[Tuliyollal] The Resplendent Quarter",
-        "[Tuliyollal] The For'ard Cabins",
-        "[Tuliyollal] Bayside Bevy Marketplace",
-        "[Tuliyollal] Vollok Shoonsa",
-        "[Tuliyollal] Wachumeqimeqi",
-        "[Tuliyollal] Brightploom Post",
-        "[Tuliyollal] Arch of the Dawn (Urqopacha)",
-        "[Tuliyollal] Arch of the Dawn (Kozama'uka)",
-        "[Tuliyollal] Ihuykatumu (Kozama'uka)",
-        "[Tuliyollal] Dirigible Landing (Yak T'el)",
-        "[Tuliyollal] Xak Tural Skygate (Shaaloani)",
-        "[Solution Nine] Aetheryte Plaza",
-        "[Solution Nine] Information Center",
-        "[Solution Nine] True Vue",
-        "[Solution Nine] Neon Stein",
-        "[Solution Nine] The Arcadion",
-        "[Solution Nine] Resolution",
-        "[Solution Nine] Nexus Arcade",
-        "[Solution Nine] Residential Sector",
-        "[Solution Nine] Scanning Port Nine (Heritage Found)"
-      ]
-    },
-    "ClassJob": {
-      "type": "string",
-      "enum": [
-        "Gladiator",
-        "Pugilist",
-        "Marauder",
-        "Lancer",
-        "Archer",
-        "Conjurer",
-        "Thaumaturge",
-        "Carpenter",
-        "Blacksmith",
-        "Armorer",
-        "Goldsmith",
-        "Leatherworker",
-        "Weaver",
-        "Alchemist",
-        "Culinarian",
-        "Miner",
-        "Botanist",
-        "Fisher",
-        "Paladin",
-        "Monk",
-        "Warrior",
-        "Dragoon",
-        "Bard",
-        "White Mage",
-        "Black Mage",
-        "Arcanist",
-        "Summoner",
-        "Scholar",
-        "Rogue",
-        "Ninja",
-        "Machinist",
-        "Dark Knight",
-        "Astrologian",
-        "Samurai",
-        "Red Mage",
-        "Blue Mage",
-        "Gunbreaker",
-        "Dancer",
-        "Reaper",
-        "Sage",
-        "Viper",
-        "Pictomancer",
-        "DoW",
-        "DoM",
-        "DoH",
-        "DoL"
-      ]
-    },
-    "CompletionFlags": {
-      "type": "array",
-      "description": "Quest Variables that dictate whether or not this step is skipped: null is don't check, positive values need to be set, negative values need to be unset",
-      "items": {
-        "oneOf": [
-          {
-            "type": "object",
-            "properties": {
-              "High": {
-                "type": [
-                  "number",
-                  "null"
-                ],
-                "minimum": 0,
-                "maximum": 15
-              },
-              "Low": {
-                "type": [
-                  "number",
-                  "null"
-                ],
-                "minimum": 0,
-                "maximum": 15
-              },
-              "Negative": {
-                "type": "boolean"
-              },
-              "Mode": {
-                "type": "string",
-                "enum": [
-                  "Bitwise",
-                  "Exact"
-                ]
-              }
-            }
-          },
-          {
-            "type": "number",
-            "enum": [
-              1,
-              2,
-              4,
-              8,
-              16,
-              32,
-              64,
-              128
-            ]
-          },
-          {
-            "type": "null"
-          }
-        ]
-      },
-      "minItems": 6,
-      "maxItems": 6
-    }
-  }
-}
diff --git a/Questionable.Model/common-vector3.json b/Questionable.Model/common-vector3.json
new file mode 100644 (file)
index 0000000..6d78c12
--- /dev/null
@@ -0,0 +1,22 @@
+{
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "$id": "/liza/Questionable/raw/branch/master/Questionable.Model/common-vector3.json",
+  "type": "object",
+  "description": "Position in the world",
+  "properties": {
+    "X": {
+      "type": "number"
+    },
+    "Y": {
+      "type": "number"
+    },
+    "Z": {
+      "type": "number"
+    }
+  },
+  "required": [
+    "X",
+    "Y",
+    "Z"
+  ]
+}
index d6bb483d69bbee879d3efed7d3d0fc70258ea7e3..4f752e335d277ed86480b91422643ace14b888b7 100644 (file)
@@ -17,8 +17,20 @@ internal sealed class JsonSchemaValidator : IQuestValidator
     public JsonSchemaValidator()
     {
         SchemaRegistry.Global.Register(
-            new Uri("https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json"),
-            JsonSchema.FromStream(AssemblyModelLoader.CommonSchema).AsTask().Result);
+            new Uri("https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-aethernetshard.json"),
+            JsonSchema.FromStream(AssemblyModelLoader.CommonAethernetShard).AsTask().Result);
+        SchemaRegistry.Global.Register(
+            new Uri("https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-aetheryte.json"),
+            JsonSchema.FromStream(AssemblyModelLoader.CommonAetheryte).AsTask().Result);
+        SchemaRegistry.Global.Register(
+            new Uri("https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-classjob.json"),
+            JsonSchema.FromStream(AssemblyModelLoader.CommonClassJob).AsTask().Result);
+        SchemaRegistry.Global.Register(
+            new Uri("https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-completionflags.json"),
+            JsonSchema.FromStream(AssemblyModelLoader.CommonCompletionFlags).AsTask().Result);
+        SchemaRegistry.Global.Register(
+            new Uri("https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-vector3.json"),
+            JsonSchema.FromStream(AssemblyModelLoader.CommonVector3).AsTask().Result);
     }
 
     public IEnumerable<ValidationIssue> Validate(Quest quest)