Use named aetherytes/aethernet shards for attuning (instead of ids)
authorLiza Carvelli <liza@carvel.li>
Wed, 17 Jul 2024 10:58:08 +0000 (12:58 +0200)
committerLiza Carvelli <liza@carvel.li>
Wed, 17 Jul 2024 10:58:08 +0000 (12:58 +0200)
93 files changed:
QuestPathGenerator/QuestPathGenerator.csproj
QuestPathGenerator/QuestSourceGenerator.cs
QuestPathGenerator/packages.lock.json
QuestPaths/2.x - A Realm Reborn/Class Quests/SCH/1097_Forgotten but Not Gone.json [new file with mode: 0644]
QuestPaths/2.x - A Realm Reborn/MSQ-1/Gridania/123_ARC_Close to Home.json
QuestPaths/2.x - A Realm Reborn/MSQ-1/Gridania/124_CNJ_Close to Home.json
QuestPaths/2.x - A Realm Reborn/MSQ-1/Gridania/176_On to Bentbranch.json
QuestPaths/2.x - A Realm Reborn/MSQ-1/Gridania/507_The Gridanian Envoy.json
QuestPaths/2.x - A Realm Reborn/MSQ-1/Gridania/85_LNC_Close to Home.json
QuestPaths/2.x - A Realm Reborn/MSQ-1/Limsa/108_MRD_Close to Home.json
QuestPaths/2.x - A Realm Reborn/MSQ-1/Limsa/109_ACN_Close to Home.json
QuestPaths/2.x - A Realm Reborn/MSQ-1/Limsa/402_Thanks a Million.json
QuestPaths/2.x - A Realm Reborn/MSQ-1/Limsa/406_On to the Drydocks.json
QuestPaths/2.x - A Realm Reborn/MSQ-1/Limsa/462_On to Summerford.json
QuestPaths/2.x - A Realm Reborn/MSQ-1/Limsa/546_The Lominsan Envoy.json
QuestPaths/2.x - A Realm Reborn/MSQ-1/Limsa/674_Call of the Sea.json
QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/245_It's Probably Pirates.json
QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/510_A Wild Rose By Any Other Name.json
QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/660_Into a Copper Hell.json
QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/677_Fire in the Gloom.json
QuestPaths/2.x - A Realm Reborn/MSQ-2/1037_A Hero in Need.json
QuestPaths/2.x - A Realm Reborn/MSQ-2/3872_Hearts on Fire.json
QuestPaths/2.x - A Realm Reborn/MSQ-2/890_The Rose and the Unicorn.json
QuestPaths/2.x - A Realm Reborn/MSQ-2/984_Come-Into-My-Castrum.json
QuestPaths/4.x - Stormblood/MSQ/F - 4.5/3183_The Face of War.json [deleted file]
QuestPaths/4.x - Stormblood/MSQ/F-4.5/3183_The Face of War.json [new file with mode: 0644]
QuestPaths/4.x - Stormblood/MSQ/H-4.55/3184_A Brief Reprieve.json [new file with mode: 0644]
QuestPaths/4.x - Stormblood/MSQ/H-4.55/3185_A Requiem for Heroes.json [new file with mode: 0644]
QuestPaths/6.x - Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4358_Old Sharlayan New to You.json
QuestPaths/6.x - Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4359_Hitting the Books.json
QuestPaths/6.x - Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4363_Deeper into the Maze.json
QuestPaths/6.x - Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4369_On Low Tide.json
QuestPaths/6.x - Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4372_The Great Work.json
QuestPaths/6.x - Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4378_The Jewel of Thavnair.json
QuestPaths/6.x - Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4379_The Color of Joy.json
QuestPaths/6.x - Endwalker/MSQ/B-Garlemald/4383_A Frosty Reception.json
QuestPaths/6.x - Endwalker/MSQ/B-Garlemald/4393_Strange Bedfellows.json
QuestPaths/6.x - Endwalker/MSQ/B-Garlemald/4396_A Trip to the Moon.json
QuestPaths/6.x - Endwalker/MSQ/C-MareLamentorum/4401_A Harey Situation.json
QuestPaths/6.x - Endwalker/MSQ/D-Thavnair2/4410_The Blasphemy Unmasked.json
QuestPaths/6.x - Endwalker/MSQ/D-Thavnair2/4411_Amidst the Apocalypse.json
QuestPaths/6.x - Endwalker/MSQ/D-Thavnair2/4412_Beyond the Depths of Despair.json
QuestPaths/6.x - Endwalker/MSQ/D-Thavnair2/4418_At Worlds End.json
QuestPaths/6.x - Endwalker/MSQ/E-Elpis/4423_Ponder Warrant Cherish Welcome.json
QuestPaths/6.x - Endwalker/MSQ/E-Elpis/4426_Aether to Aether.json
QuestPaths/6.x - Endwalker/MSQ/E-Elpis/4430_A Past Not Yet Come to Pass.json
QuestPaths/6.x - Endwalker/MSQ/F-Labyrinthos2/4442_No Job Too Small.json
QuestPaths/6.x - Endwalker/MSQ/F-Labyrinthos2/4446_Hither and Yarns.json
QuestPaths/6.x - Endwalker/MSQ/G-UltimaThule/4454_On Burdened Wings.json
QuestPaths/6.x - Endwalker/MSQ/G-UltimaThule/4456_Roads Paved of Sacrifice.json
QuestPaths/6.x - Endwalker/MSQ/G-UltimaThule/4459_Victory x Lost.json
QuestPaths/6.x - Endwalker/MSQ/H-6.1/4531_Sharing the Wealth.json
QuestPaths/7.x - Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4861_The Nation of Tuliyollal.json
QuestPaths/7.x - Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4862_A City of Stairs.json
QuestPaths/7.x - Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4863_A Saga in Stone.json
QuestPaths/7.x - Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4866_A Festive People.json
QuestPaths/7.x - Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4872_Traders of Happiness.json
QuestPaths/7.x - Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4878_The Success of Others.json
QuestPaths/7.x - Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4880_A Leaking Workpot.json
QuestPaths/7.x - Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4889_History's Keepers.json
QuestPaths/7.x - Dawntrail/MSQ/C-Yak T'el/4898_Village of the Hunt.json
QuestPaths/7.x - Dawntrail/MSQ/C-Yak T'el/4904_City of Silence.json
QuestPaths/7.x - Dawntrail/MSQ/D-Shaaloani-HeritageFound1/4913_Saddled Up.json
QuestPaths/7.x - Dawntrail/MSQ/D-Shaaloani-HeritageFound1/4918_One With Nature.json
QuestPaths/7.x - Dawntrail/MSQ/D-Shaaloani-HeritageFound1/4927_The Land of Levin.json
QuestPaths/7.x - Dawntrail/MSQ/D-Shaaloani-HeritageFound1/4928_A Royal Welcome.json
QuestPaths/7.x - Dawntrail/MSQ/E-SolutionNine-HeritageFound2/4933_Solution Nine.json
QuestPaths/7.x - Dawntrail/MSQ/E-SolutionNine-HeritageFound2/4934_The Queen's Tour.json
QuestPaths/7.x - Dawntrail/MSQ/E-SolutionNine-HeritageFound2/4935_Her People, Her Family.json
QuestPaths/7.x - Dawntrail/MSQ/E-SolutionNine-HeritageFound2/4937_Gives You Teeth.json
QuestPaths/7.x - Dawntrail/MSQ/E-SolutionNine-HeritageFound2/4939_Drowned Vestiges.json
QuestPaths/7.x - Dawntrail/MSQ/F-Living Memory/4954_The Taste of Family.json
QuestPaths/7.x - Dawntrail/MSQ/F-Living Memory/4957_In Search of Discovery.json
QuestPaths/AssemblyQuestLoader.cs
QuestPaths/QuestPaths.csproj
QuestPaths/README.md
QuestPaths/quest-v1.json
Questionable.Model/Questionable.Model.csproj
Questionable.Model/V1/Converter/AethernetShardConverter.cs [new file with mode: 0644]
Questionable.Model/V1/Converter/AethernetShortcutConverter.cs
Questionable.Model/V1/EAetheryteLocation.cs
Questionable.Model/V1/QuestStep.cs
Questionable.Model/packages.lock.json
Questionable/Controller/QuestRegistry.cs
Questionable/Controller/Steps/Interactions/AethernetShard.cs
Questionable/Controller/Steps/Interactions/Aetheryte.cs
Questionable/Controller/Steps/Shared/Move.cs
Questionable/Data/AetheryteData.cs
Questionable/Questionable.csproj
Questionable/Validation/QuestValidator.cs
Questionable/Windows/DebugOverlay.cs
Questionable/Windows/QuestWindow.cs
Questionable/packages.lock.json

index ffeca7c1895d9b8e299f19b66ed1dd60c28a09c7..8ee14a8f25ff34fc03023f826485296b756aaa68 100644 (file)
 
     <ItemGroup>
         <PackageReference Include="Json.More.Net" Version="2.0.1.2" GeneratePathProperty="true" />
-        <PackageReference Include="JsonPointer.Net" Version="5.0.0" GeneratePathProperty="true" />
-        <PackageReference Include="JsonSchema.Net" Version="7.0.4" GeneratePathProperty="true" />
+        <PackageReference Include="JsonPointer.Net" Version="5.0.2" GeneratePathProperty="true" />
+        <PackageReference Include="JsonSchema.Net" Version="7.1.2" GeneratePathProperty="true" />
         <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4">
             <PrivateAssets>all</PrivateAssets>
             <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
         </PackageReference>
         <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.9.2"/>
         <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.9.2"/>
-        <PackageReference Include="System.Text.Json" Version="8.0.3" PrivateAssets="all"/>
+        <PackageReference Include="System.Text.Json" Version="8.0.4" PrivateAssets="all" />
     </ItemGroup>
 
     <ItemGroup>
index c583788544d2a335009e8e1558f25dbc5b4b2e6a..8cdd45623ed1ae3bc8d38e53ead47fdbd2fee6a5 100644 (file)
@@ -65,7 +65,7 @@ public class QuestSourceGenerator : ISourceGenerator
                 continue;
 
             var questNode = JsonNode.Parse(text.ToString());
-            var evaluationResult = questSchema.Evaluate(questNode, new EvaluationOptions()
+            var evaluationResult = questSchema.Evaluate(questNode, new EvaluationOptions
             {
                 Culture = CultureInfo.InvariantCulture,
                 OutputFormat = OutputFormat.List
@@ -323,6 +323,10 @@ public class QuestSourceGenerator : ISourceGenerator
                                                 .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(),
index c47bf1192d977b975c7e5e98624ed2869ee74eb4..ffdfcd94335151a8fe61b574d363635c127a0ef6 100644 (file)
@@ -13,9 +13,9 @@
       },
       "JsonPointer.Net": {
         "type": "Direct",
-        "requested": "[5.0.0, )",
-        "resolved": "5.0.0",
-        "contentHash": "fm4T5w20AY6C+p5/pJr0vrXRNGgtSfHl34I1LxC9zdPwS9S3j0GiR1Mz/CVPWKDXXGDpCt1APHpCq7kn5adCfA==",
+        "requested": "[5.0.2, )",
+        "resolved": "5.0.2",
+        "contentHash": "H/OtixKadr+ja1j7Fru3WG56V9zP0AKT1Bd0O7RWN/zH1bl8ZIwW9aCa4+xvzuVvt4SPmrvBu3G6NpAkNOwNAA==",
         "dependencies": {
           "Humanizer.Core": "2.14.1",
           "Json.More.Net": "2.0.1.2"
@@ -23,9 +23,9 @@
       },
       "JsonSchema.Net": {
         "type": "Direct",
-        "requested": "[7.0.4, )",
-        "resolved": "7.0.4",
-        "contentHash": "R0Hk2Tr/np4Q1NO8CBjyQsoiD1iFJyEQP20Sw7JnZCNGJoaSBe+g4b+nZqnBXPQhiqY5LGZ8JZwZkRh/eKZhEQ==",
+        "requested": "[7.1.2, )",
+        "resolved": "7.1.2",
+        "contentHash": "tvM82Wpsyk+C5aUWkqPZLo2ANDjEfCoDa9R24k7jRkCrwxbXnSBb7NpU1pz0ufp6qw+jIekHD9xJdUkjUtnZxQ==",
         "dependencies": {
           "JsonPointer.Net": "5.0.0"
         }
@@ -68,9 +68,9 @@
       },
       "System.Text.Json": {
         "type": "Direct",
-        "requested": "[8.0.3, )",
-        "resolved": "8.0.3",
-        "contentHash": "hpagS9joOwv6efWfrMmV9MjQXpiXZH72PgN067Ysfr6AWMSD1/1hEcvh/U5mUpPLezEWsOJSuVrmqDIVD958iA==",
+        "requested": "[8.0.4, )",
+        "resolved": "8.0.4",
+        "contentHash": "bAkhgDJ88XTsqczoxEMliSrpijKZHhbJQldhAmObj/RbrN3sU5dcokuXmWJWsdQAhiMJ9bTayWsL1C9fbbCRhw==",
         "dependencies": {
           "Microsoft.Bcl.AsyncInterfaces": "8.0.0",
           "System.Buffers": "4.5.1",
       "questionable.model": {
         "type": "Project",
         "dependencies": {
-          "System.Text.Json": "[8.0.3, )"
+          "System.Text.Json": "[8.0.4, )"
         }
       }
     }
diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/SCH/1097_Forgotten but Not Gone.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/SCH/1097_Forgotten but Not Gone.json
new file mode 100644 (file)
index 0000000..e5f83d3
--- /dev/null
@@ -0,0 +1,30 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "Position": {
+            "X": -336.41187,
+            "Y": 12.899764,
+            "Z": 3.5517142
+          },
+          "TerritoryId": 129,
+          "InteractionType": "WalkTo"
+        },
+        {
+          "DataId": 1000895,
+          "Position": {
+            "X": -335.74432,
+            "Y": 12.899764,
+            "Z": 1.3884888
+          },
+          "TerritoryId": 129,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    }
+  ]
+}
index 7d5749d37ac674bba0093ee12bb6be44b01544bc..31dc0077745cddedeb560f0f72482be5df775212 100644 (file)
           "$": "New Gridania Navmesh workaround"
         },
         {
-          "DataId": 2,
-          "Position": {
-            "X": 32.913696,
-            "Y": 2.670288,
-            "Z": 30.014404
-          },
-          "StopDistance": 10,
           "TerritoryId": 132,
           "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Gridania",
           "CompletionQuestVariablesFlags": [
             null,
             null,
           ]
         },
         {
-          "DataId": 25,
-          "Position": {
-            "X": 166.58276,
-            "Y": -1.7243042,
-            "Z": 86.13721
-          },
           "TerritoryId": 132,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Archers' Guild"
+          "AethernetShard": "[Gridania] Archers' Guild"
         },
         {
           "DataId": 1000197,
       "Sequence": 255,
       "Steps": [
         {
-          "DataId": 26,
-          "Position": {
-            "X": 101.27405,
-            "Y": 9.018005,
-            "Z": -111.31464
-          },
           "TerritoryId": 133,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Leatherworkers' Guild"
+          "AethernetShard": "[Gridania] Leatherworkers' Guild & Shaded Bower"
         },
         {
-          "DataId": 27,
-          "Position": {
-            "X": 121.23291,
-            "Y": 12.649658,
-            "Z": -229.63306
-          },
           "TerritoryId": 133,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Lancers' Guild"
+          "AethernetShard": "[Gridania] Lancers' Guild"
         },
         {
-          "DataId": 30,
-          "Position": {
-            "X": -73.92999,
-            "Y": 7.9804688,
-            "Z": -140.15417
-          },
           "TerritoryId": 133,
           "InteractionType": "AttuneAethernetShard",
+          "AethernetShard": "[Gridania] Mih Khetto's Amphitheatre",
           "AethernetShortcut": [
             "[Gridania] Lancers' Guild",
             "[Gridania] Leatherworkers' Guild & Shaded Bower"
-          ],
-          "Comment": "Mih Khetto's Amphitheatre"
+          ]
         },
         {
           "Position": {
           "InteractionType": "WalkTo"
         },
         {
-          "DataId": 29,
-          "Position": {
-            "X": -311.0857,
-            "Y": 7.94989,
-            "Z": -177.05048
-          },
           "TerritoryId": 133,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Botanists' Guild"
+          "AethernetShard": "[Gridania] Botanists' Guild"
         },
         {
-          "DataId": 28,
-          "Position": {
-            "X": -145.15906,
-            "Y": 4.9591064,
-            "Z": -11.7647705
-          },
           "TerritoryId": 133,
           "InteractionType": "AttuneAethernetShard",
+          "AethernetShard": "[Gridania] Conjurers' Guild",
           "AethernetShortcut": [
             "[Gridania] Botanists' Guild",
             "[Gridania] Mih Khetto's Amphitheatre"
-          ],
-          "Comment": "Conjurers' Guild"
+          ]
         },
         {
           "DataId": 1000100,
index cf8fea4446bb5bd17911ed7cd3f4669c0286a23b..4511ffc61b83194cf39a015ffad2a823217734ac 100644 (file)
           "$": "New Gridania Navmesh workaround"
         },
         {
-          "DataId": 2,
-          "Position": {
-            "X": 32.913696,
-            "Y": 2.670288,
-            "Z": 30.014404
-          },
-          "StopDistance": 10,
           "TerritoryId": 132,
           "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Gridania",
           "CompletionQuestVariablesFlags": [
             null,
             null,
           ]
         },
         {
-          "DataId": 25,
-          "Position": {
-            "X": 166.58276,
-            "Y": -1.7243042,
-            "Z": 86.13721
-          },
           "TerritoryId": 132,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Archers' Guild"
+          "AethernetShard": "[Gridania] Archers' Guild"
         },
         {
           "Position": {
           "$": "If done after aetheryte: 33 1 0 0 0 128"
         },
         {
-          "DataId": 26,
-          "Position": {
-            "X": 101.27405,
-            "Y": 9.018005,
-            "Z": -111.31464
-          },
           "TerritoryId": 133,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Leatherworkers' Guild"
+          "AethernetShard": "[Gridania] Leatherworkers' Guild & Shaded Bower"
         },
         {
-          "DataId": 27,
-          "Position": {
-            "X": 121.23291,
-            "Y": 12.649658,
-            "Z": -229.63306
-          },
           "TerritoryId": 133,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Lancers' Guild"
+          "AethernetShard": "[Gridania] Lancers' Guild"
         },
         {
-          "DataId": 30,
-          "Position": {
-            "X": -73.92999,
-            "Y": 7.9804688,
-            "Z": -140.15417
-          },
           "TerritoryId": 133,
           "InteractionType": "AttuneAethernetShard",
+          "AethernetShard": "[Gridania] Mih Khetto's Amphitheatre",
           "AethernetShortcut": [
             "[Gridania] Lancers' Guild",
             "[Gridania] Leatherworkers' Guild & Shaded Bower"
-          ],
-          "Comment": "Mih Khetto's Amphitheatre"
+          ]
         },
         {
           "Position": {
           "InteractionType": "WalkTo"
         },
         {
-          "DataId": 29,
-          "Position": {
-            "X": -311.0857,
-            "Y": 7.94989,
-            "Z": -177.05048
-          },
           "TerritoryId": 133,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Botanists' Guild"
+          "AethernetShard": "[Gridania] Botanists' Guild"
         },
         {
-          "DataId": 28,
-          "Position": {
-            "X": -145.15906,
-            "Y": 4.9591064,
-            "Z": -11.7647705
-          },
           "TerritoryId": 133,
           "InteractionType": "AttuneAethernetShard",
+          "AethernetShard": "[Gridania] Conjurers' Guild",
           "AethernetShortcut": [
             "[Gridania] Botanists' Guild",
             "[Gridania] Mih Khetto's Amphitheatre"
-          ],
-          "Comment": "Conjurers' Guild"
+          ]
         },
         {
           "DataId": 1000323,
index c40499d498f276810ddf62680d48a8ec49351f2a..08b6d172bc9a4aa786bce58f78f858836f5a403a 100644 (file)
       "Sequence": 255,
       "Steps": [
         {
-          "DataId": 3,
-          "Position": {
-            "X": 13.076904,
-            "Y": 0.56451416,
-            "Z": 35.90442
-          },
-          "StopDistance": 10,
           "TerritoryId": 148,
           "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Central Shroud - Bentbranch Meadows",
           "AethernetShortcut": [
             "[Gridania] Aetheryte Plaza",
             "[Gridania] Blue Badger Gate (Central Shroud)"
index 77325e764583eca4dccaf133b3ab0e94267599a8..d5e9de3202066b02bb7fec88580995112b3a3870 100644 (file)
       "Sequence": 6,
       "Steps": [
         {
-          "DataId": 8,
-          "Position": {
-            "X": -84.00108,
-            "Y": 20.77683,
-            "Z": 0.03414845
-          },
-          "StopDistance": 10,
           "TerritoryId": 129,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Limsa Lominsa"
         },
         {
-          "DataId": 49,
-          "Position": {
-            "X": -213.61108,
-            "Y": 16.739136,
-            "Z": 51.80432
-          },
           "TerritoryId": 129,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Hawkers' Alley"
+          "AethernetShard": "[Limsa Lominsa] Hawkers' Alley"
         },
         {
-          "DataId": 43,
-          "Position": {
-            "X": -335.1645,
-            "Y": 12.619202,
-            "Z": 56.381958
-          },
           "TerritoryId": 129,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Arcanists' Guild"
+          "AethernetShard": "[Limsa Lominsa] Arcanists' Guild"
         },
         {
-          "DataId": 44,
-          "Position": {
-            "X": -179.40033,
-            "Y": 4.8065186,
-            "Z": 182.97095
-          },
           "TerritoryId": 129,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Fishermens' Guild",
+          "AethernetShard": "[Limsa Lominsa] Fishermens' Guild",
           "AethernetShortcut": [
             "[Limsa Lominsa] Arcanists' Guild",
             "[Limsa Lominsa] Hawkers' Alley"
           ]
         },
         {
-          "DataId": 42,
-          "Position": {
-            "X": -56.50421,
-            "Y": 44.47998,
-            "Z": -131.45648
-          },
           "TerritoryId": 128,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Culinarians' Guild"
+          "AethernetShard": "[Limsa Lominsa] Culinarians' Guild"
         },
         {
-          "DataId": 48,
-          "Position": {
-            "X": -5.1728516,
-            "Y": 44.63257,
-            "Z": -218.06671
-          },
           "TerritoryId": 128,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Marauders' Guild"
+          "AethernetShard": "[Limsa Lominsa] Marauders' Guild"
         },
         {
-          "DataId": 41,
-          "Position": {
-            "X": 16.067688,
-            "Y": 40.787354,
-            "Z": 68.80286
-          },
           "TerritoryId": 128,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Aftcastle"
+          "AethernetShard": "[Limsa Lominsa] The Aftcastle"
         },
         {
           "DataId": 1002695,
           ]
         },
         {
-          "DataId": 51,
-          "Position": {
-            "X": 6.6376343,
-            "Y": 30.655273,
-            "Z": -24.826477
-          },
           "TerritoryId": 131,
-          "InteractionType": "AttuneAethernetShard"
+          "InteractionType": "AttuneAethernetShard",
+          "AethernetShard": "[Ul'dah] The Chamber of Rule"
         },
         {
           "DataId": 1001821,
index 22051447a6881b07ec07524172952608a8483e7c..6c9df7ad0cc33a0cb3ffe6e15bfba6cf3cba879e 100644 (file)
           "$": "New Gridania Navmesh workaround"
         },
         {
-          "DataId": 2,
-          "Position": {
-            "X": 32.913696,
-            "Y": 2.670288,
-            "Z": 30.014404
-          },
-          "StopDistance": 10,
           "TerritoryId": 132,
           "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Gridania",
           "CompletionQuestVariablesFlags": [
             null,
             null,
           ]
         },
         {
-          "DataId": 25,
-          "Position": {
-            "X": 166.58276,
-            "Y": -1.7243042,
-            "Z": 86.13721
-          },
           "TerritoryId": 132,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Archers' Guild"
+          "AethernetShard": "[Gridania] Archers' Guild"
         },
         {
           "Position": {
           "$": "If done after aetheryte: 33 1 0 0 0 128"
         },
         {
-          "DataId": 26,
-          "Position": {
-            "X": 101.27405,
-            "Y": 9.018005,
-            "Z": -111.31464
-          },
           "TerritoryId": 133,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Leatherworkers' Guild"
+          "AethernetShard": "[Gridania] Leatherworkers' Guild & Shaded Bower"
         },
         {
-          "DataId": 27,
-          "Position": {
-            "X": 121.23291,
-            "Y": 12.649658,
-            "Z": -229.63306
-          },
           "TerritoryId": 133,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Lancers' Guild"
+          "AethernetShard": "[Gridania] Lancers' Guild"
         },
         {
           "DataId": 1000251,
           "Comment": "Pick up Class Quest"
         },
         {
-          "DataId": 30,
-          "Position": {
-            "X": -73.92999,
-            "Y": 7.9804688,
-            "Z": -140.15417
-          },
           "TerritoryId": 133,
           "InteractionType": "AttuneAethernetShard",
+          "AethernetShard": "[Gridania] Mih Khetto's Amphitheatre",
           "AethernetShortcut": [
             "[Gridania] Lancers' Guild",
             "[Gridania] Leatherworkers' Guild & Shaded Bower"
-          ],
-          "Comment": "Mih Khetto's Amphitheatre"
+          ]
         },
         {
           "Position": {
           "InteractionType": "WalkTo"
         },
         {
-          "DataId": 29,
-          "Position": {
-            "X": -311.0857,
-            "Y": 7.94989,
-            "Z": -177.05048
-          },
           "TerritoryId": 133,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Botanists' Guild"
+          "AethernetShard": "[Gridania] Botanists' Guild"
         },
         {
-          "DataId": 28,
-          "Position": {
-            "X": -145.15906,
-            "Y": 4.9591064,
-            "Z": -11.7647705
-          },
           "TerritoryId": 133,
           "InteractionType": "AttuneAethernetShard",
+          "AethernetShard": "[Gridania] Conjurers' Guild",
           "AethernetShortcut": [
             "[Gridania] Botanists' Guild",
             "[Gridania] Mih Khetto's Amphitheatre"
-          ],
-          "Comment": "Conjurers' Guild"
+          ]
         },
         {
-          "DataId": 1000100,
-          "Position": {
-            "X": 23.819275,
-            "Y": -8,
-            "Z": 115.92273
-          },
           "TerritoryId": 132,
           "InteractionType": "CompleteQuest",
           "AethernetShortcut": [
index ebe54b3809490692c41c1f02033ebe3b356d2cb7..37b12c3e510d2720adbed107cfa665c2660862da 100644 (file)
           "Comment": "Quest Turn-In (Making a Name)"
         },
         {
-          "DataId": 8,
-          "Position": {
-            "X": -84.031494,
-            "Y": 20.767456,
-            "Z": 0.015197754
-          },
-          "StopDistance": 10,
           "TerritoryId": 129,
           "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Limsa Lominsa",
           "CompletionQuestVariablesFlags": [
             null,
             null,
           ]
         },
         {
-          "DataId": 49,
-          "Position": {
-            "X": -213.61108,
-            "Y": 16.739136,
-            "Z": 51.80432
-          },
           "TerritoryId": 129,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Hawkers' Alley"
+          "AethernetShard": "[Limsa Lominsa] Hawkers' Alley"
         },
         {
-          "DataId": 43,
-          "Position": {
-            "X": -335.1645,
-            "Y": 12.619202,
-            "Z": 56.381958
-          },
           "TerritoryId": 129,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Arcanists' Guild"
+          "AethernetShard": "[Limsa Lominsa] Arcanists' Guild"
         },
         {
-          "DataId": 44,
-          "Position": {
-            "X": -179.40033,
-            "Y": 4.8065186,
-            "Z": 182.97095
-          },
           "TerritoryId": 129,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Fishermens' Guild",
+          "AethernetShard": "[Limsa Lominsa] Fishermens' Guild",
           "AethernetShortcut": [
             "[Limsa Lominsa] Arcanists' Guild",
             "[Limsa Lominsa] Hawkers' Alley"
           ]
         },
         {
-          "DataId": 42,
-          "Position": {
-            "X": -56.50421,
-            "Y": 44.47998,
-            "Z": -131.45648
-          },
           "TerritoryId": 128,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Culinarians' Guild"
+          "AethernetShard": "[Limsa Lominsa] Culinarians' Guild"
         },
         {
-          "DataId": 48,
-          "Position": {
-            "X": -5.1728516,
-            "Y": 44.63257,
-            "Z": -218.06671
-          },
           "TerritoryId": 128,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Marauders' Guild"
+          "AethernetShard": "[Limsa Lominsa] Marauders' Guild"
         },
         {
           "DataId": 1000926,
index aced709cc4399db33f4490c92d4b48efd0ec54fe..23a804e4b98c6a1d8b3385785f62557675dfa2bc 100644 (file)
           "Comment": "Quest Turn-In (Making a Name)"
         },
         {
-          "DataId": 8,
-          "Position": {
-            "X": -84.031494,
-            "Y": 20.767456,
-            "Z": 0.015197754
-          },
-          "StopDistance": 10,
           "TerritoryId": 129,
           "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Gridania",
           "CompletionQuestVariablesFlags": [
             null,
             null,
           ]
         },
         {
-          "DataId": 49,
-          "Position": {
-            "X": -213.61108,
-            "Y": 16.739136,
-            "Z": 51.80432
-          },
           "TerritoryId": 129,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Hawkers' Alley"
+          "AethernetShard": "[Limsa Lominsa] Hawkers' Alley"
         },
         {
-          "DataId": 43,
-          "Position": {
-            "X": -335.1645,
-            "Y": 12.619202,
-            "Z": 56.381958
-          },
           "TerritoryId": 129,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Arcanists' Guild"
+          "AethernetShard": "[Limsa Lominsa] Arcanists' Guild"
         },
         {
           "DataId": 1000895,
           "Comment": "Pick up Class Quest"
         },
         {
-          "DataId": 44,
-          "Position": {
-            "X": -179.40033,
-            "Y": 4.8065186,
-            "Z": 182.97095
-          },
           "TerritoryId": 129,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Fishermens' Guild",
+          "AethernetShard": "[Limsa Lominsa] Fishermens' Guild",
           "AethernetShortcut": [
             "[Limsa Lominsa] Arcanists' Guild",
             "[Limsa Lominsa] Hawkers' Alley"
           ]
         },
         {
-          "DataId": 42,
-          "Position": {
-            "X": -56.50421,
-            "Y": 44.47998,
-            "Z": -131.45648
-          },
           "TerritoryId": 128,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Culinarians' Guild"
+          "AethernetShard": "[Limsa Lominsa] Culinarians' Guild"
         },
         {
-          "DataId": 48,
-          "Position": {
-            "X": -5.1728516,
-            "Y": 44.63257,
-            "Z": -218.06671
-          },
           "TerritoryId": 128,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Marauders' Guild"
+          "AethernetShard": "[Limsa Lominsa] Marauders' Guild"
         },
         {
           "DataId": 1000972,
index 4c1c9a485852a579aeab52b289020ded8ada39b5..dd6db84e9088e0797e6cd94ef4394225a581f51c 100644 (file)
           "TargetTerritoryId": 138
         },
         {
-          "DataId": 13,
-          "Position": {
-            "X": 651.5449,
-            "Y": 11.734131,
-            "Z": 513.35913
-          },
-          "StopDistance": 10,
           "TerritoryId": 138,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Western La Noscea - Swiftperch"
         },
         {
           "Position": {
index 8fa03f3df98d0423977e017d8807c4dfb7e11a77..1dfa7be208e9c58f71fd8d4e67a7c7a29aa5f097 100644 (file)
           "TargetTerritoryId": 135
         },
         {
-          "DataId": 10,
-          "Position": {
-            "X": 156.11499,
-            "Y": 15.518433,
-            "Z": 673.21277
-          },
-          "StopDistance": 10,
           "TerritoryId": 135,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Lower La Noscea - Moraby Drydocks"
         },
         {
           "DataId": 1002238,
index 369f54a982d783a05e529e2417355728c4419fb7..4358b60f17b61dddfd73526864d6f05807a9d7f5 100644 (file)
       "Sequence": 255,
       "Steps": [
         {
-          "DataId": 41,
-          "Position": {
-            "X": 16.067688,
-            "Y": 40.787354,
-            "Z": 68.80286
-          },
           "TerritoryId": 128,
-          "InteractionType": "AttuneAethernetShard"
+          "InteractionType": "AttuneAethernetShard",
+          "AethernetShard": "[Limsa Lominsa] The Aftcastle"
         },
         {
-          "DataId": 52,
-          "Position": {
-            "X": 227.98499,
-            "Y": 115.526,
-            "Z": -257.0382
-          },
-          "StopDistance": 10,
           "TerritoryId": 134,
           "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Middle La Noscea - Summerford Farms",
           "AethernetShortcut": [
             "[Limsa Lominsa] The Aftcastle",
             "[Limsa Lominsa] Zephyr Gate (Middle La Noscea)"
index c155d8ac4e5ab0340721179a2b1cad555671b599..e9b7bda98f25a8656f905e92187c6df399c29ecc 100644 (file)
       "Sequence": 5,
       "Steps": [
         {
-          "DataId": 2,
-          "Position": {
-            "X": 32.913696,
-            "Y": 2.670288,
-            "Z": 30.014404
-          },
-          "StopDistance": 10,
           "TerritoryId": 132,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Gridania"
         },
         {
-          "DataId": 25,
-          "Position": {
-            "X": 166.58276,
-            "Y": -1.7243042,
-            "Z": 86.13721
-          },
           "TerritoryId": 132,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Archers' Guild"
+          "AethernetShard": "[Gridania] Archers' Guild"
         },
         {
           "Position": {
           ]
         },
         {
-          "DataId": 26,
-          "Position": {
-            "X": 101.27405,
-            "Y": 9.018005,
-            "Z": -111.31464
-          },
           "TerritoryId": 133,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Leatherworkers' Guild"
+          "AethernetShard": "[Gridania] Leatherworkers' Guild & Shaded Bower"
         },
         {
-          "DataId": 27,
-          "Position": {
-            "X": 121.23291,
-            "Y": 12.649658,
-            "Z": -229.63306
-          },
           "TerritoryId": 133,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Lancers' Guild"
+          "AethernetShard": "[Gridania] Lancers' Guild"
         },
         {
-          "DataId": 30,
-          "Position": {
-            "X": -73.92999,
-            "Y": 7.9804688,
-            "Z": -140.15417
-          },
           "TerritoryId": 133,
           "InteractionType": "AttuneAethernetShard",
+          "AethernetShard": "[Gridania] Mih Khetto's Amphitheatre",
           "AethernetShortcut": [
             "[Gridania] Lancers' Guild",
             "[Gridania] Leatherworkers' Guild & Shaded Bower"
-          ],
-          "Comment": "Mih Khetto's Amphitheatre"
+          ]
         },
         {
           "Position": {
           "InteractionType": "WalkTo"
         },
         {
-          "DataId": 29,
-          "Position": {
-            "X": -311.0857,
-            "Y": 7.94989,
-            "Z": -177.05048
-          },
           "TerritoryId": 133,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Botanists' Guild"
+          "AethernetShard": "[Gridania] Botanists' Guild"
         },
         {
-          "DataId": 28,
-          "Position": {
-            "X": -145.15906,
-            "Y": 4.9591064,
-            "Z": -11.7647705
-          },
           "TerritoryId": 133,
           "InteractionType": "AttuneAethernetShard",
+          "AethernetShard": "[Gridania] Conjurers' Guild",
           "AethernetShortcut": [
             "[Gridania] Botanists' Guild",
             "[Gridania] Mih Khetto's Amphitheatre"
-          ],
-          "Comment": "Conjurers' Guild"
+          ]
         },
         {
           "DataId": 1000460,
           ]
         },
         {
-          "DataId": 51,
-          "Position": {
-            "X": 6.6376343,
-            "Y": 30.655273,
-            "Z": -24.826477
-          },
           "TerritoryId": 131,
-          "InteractionType": "AttuneAethernetShard"
+          "InteractionType": "AttuneAethernetShard",
+          "AethernetShard": "[Ul'dah] The Chamber of Rule"
         },
         {
           "DataId": 1001821,
index 0633ce02d76f38f8aa2404d75270f59ff096afa6..34393531fec34b8449528aacb65a793caeaea505 100644 (file)
       "Sequence": 255,
       "Steps": [
         {
-          "DataId": 37,
-          "Position": {
-            "X": -98.22869,
-            "Y": 42.37336,
-            "Z": 88.46719
-          },
           "TerritoryId": 131,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Alchemists' Guild"
+          "AethernetShard": "[Ul'dah] Alchemists' Guild"
         },
         {
           "Position": {
           ]
         },
         {
-          "DataId": 35,
-          "Position": {
-            "X": -53.8269,
-            "Y": 10.72502,
-            "Z": 12.24082
-          },
           "TerritoryId": 131,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Gladiators' Guild"
+          "AethernetShard": "[Ul'dah] Gladiators' Guild"
         },
         {
-          "DataId": 50,
-          "Position": {
-            "X": -19.31449,
-            "Y": 14.63075,
-            "Z": 72.0533
-          },
           "TerritoryId": 131,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Goldsmiths' Guild"
+          "AethernetShard": "[Ul'dah] Goldsmiths' Guild"
         },
         {
-          "DataId": 36,
-          "Position": {
-            "X": 33.52188,
-            "Y": 13.23228,
-            "Z": 113.2191
-          },
           "TerritoryId": 131,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Miners' Guild"
+          "AethernetShard": "[Ul'dah] Miners' Guild"
         },
         {
-          "DataId": 47,
-          "Position": {
-            "X": 89.67633,
-            "Y": 12.93493,
-            "Z": 58.2767
-          },
           "TerritoryId": 131,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Weavers' Guild"
+          "AethernetShard": "[Ul'dah] Weavers' Guild"
         },
         {
-          "DataId": 125,
-          "Position": {
-            "X": 131.9447,
-            "Y": 4.714966,
-            "Z": -29.800903
-          },
           "TerritoryId": 131,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Sapphire Avenue Exchange"
+          "AethernetShard": "[Ul'dah] Sapphire Avenue Exchange"
         },
         {
           "Position": {
           "TargetTerritoryId": 130
         },
         {
-          "DataId": 33,
-          "Position": {
-            "X": 64.22522,
-            "Y": 4.5318604,
-            "Z": -115.31244
-          },
           "TerritoryId": 130,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Adventurers' Guild"
+          "AethernetShard": "[Ul'dah] Adventurers' Guild"
         },
         {
-          "DataId": 9,
-          "Position": {
-            "X": -144.51825,
-            "Y": -1.3580933,
-            "Z": -169.6651
-          },
-          "StopDistance": 10,
           "TerritoryId": 130,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Ul'dah"
         },
         {
-          "DataId": 34,
-          "Position": {
-            "X": -154.83331,
-            "Y": 14.633362,
-            "Z": 73.07532
-          },
           "TerritoryId": 130,
-          "InteractionType": "AttuneAethernetShard"
+          "InteractionType": "AttuneAethernetShard",
+          "AethernetShard": "[Ul'dah] Thaumaturges' Guild"
         },
         {
           "DataId": 1000972,
index 26246353e25e0e5c3cd6c7edbf77773815eb1b9e..7c630a799529aec212632cd51127d7e3d404c083 100644 (file)
           "TargetTerritoryId": 138
         },
         {
-          "DataId": 14,
-          "Position": {
-            "X": 260.94446,
-            "Y": -19.60791,
-            "Z": 218.52441
-          },
-          "StopDistance": 10,
           "TerritoryId": 138,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Western La Noscea - Aleport"
         },
         {
           "DataId": 1017075,
index 855214bdb49ab4a35f29b303fab28ee4915e2d2a..4ba2e3cbb0b660e2318929184d35d745021dbcb7 100644 (file)
       "Sequence": 255,
       "Steps": [
         {
-          "DataId": 53,
-          "Position": {
-            "X": -16.159302,
-            "Y": 0.32037354,
-            "Z": -166.58276
-          },
-          "StopDistance": 10,
           "TerritoryId": 141,
           "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Central Thanalan - Black Brush Station",
           "AetheryteShortcut": "Ul'dah",
           "AethernetShortcut": [
             "[Ul'dah] Aetheryte Plaza",
           "$": "Camp Drybone Lantern"
         },
         {
-          "DataId": 18,
-          "Position": {
-            "X": -386.3432,
-            "Y": -57.1756,
-            "Z": 142.59558
-          },
-          "StopDistance": 10,
           "TerritoryId": 145,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Eastern Thanalan - Camp Drybone"
         },
         {
           "DataId": 1003929,
index c0126c0d3f84628194cf90a07adcc3b3d6c4a30c..7fdc48b239de30fc4f197099f034e87823834341 100644 (file)
       "Sequence": 2,
       "Steps": [
         {
-          "DataId": 17,
-          "Position": {
-            "X": 68.0094,
-            "Y": 48.203125,
-            "Z": -227.039
-          },
-          "StopDistance": 10,
           "TerritoryId": 140,
           "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Western Thanalan - Horizon",
           "AethernetShortcut": [
             "[Ul'dah] Adventurers' Guild",
             "[Ul'dah] Gate of the Sultana (Western Thanalan)"
index b63a8aba3f103987d4f5d265a9b0ae7c0e82a9bc..f296b5c67d2d9fb3adaf9a347d2998f8df438326 100644 (file)
           "$": "New Gridania Navmesh workaround"
         },
         {
-          "DataId": 3,
-          "Position": {
-            "X": 13.076904,
-            "Y": 0.56451416,
-            "Z": 35.90442
-          },
-          "StopDistance": 10,
           "TerritoryId": 148,
           "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Central Shroud - Bentbranch Meadows",
           "AethernetShortcut": [
             "[Gridania] Aetheryte Plaza",
             "[Gridania] Blue Badger Gate (Central Shroud)"
index 0047cff6b3a5aaa5a788ff42544280b83da60fd7..d0e61fe911521921a9343eb837ae90040cab42c0 100644 (file)
           "AetheryteShortcut": "Central Thanalan - Black Brush Station"
         },
         {
-          "DataId": 21,
-          "Position": {
-            "X": 20.98108,
-            "Y": 8.8349,
-            "Z": 454.0321
-          },
           "TerritoryId": 147,
           "StopDistance": 5,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Northern Thanalan - Camp Bluefog"
         },
         {
           "DataId": 1006638,
index c4abe93a518600211f8e36c049944ea2732bf851..de3f260fcfb067644c83cf4ff608784e61571d9f 100644 (file)
       "Sequence": 1,
       "Steps": [
         {
-          "DataId": 22,
-          "Position": {
-            "X": -26.596497,
-            "Y": 49.881714,
-            "Z": -30.838562
-          },
           "TerritoryId": 147,
           "StopDistance": 5,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Northern Thanalan - Ceruleum Processing Plant"
         },
         {
           "DataId": 1006647,
index 419b758475674a030c4584e14a67e0b0cb6b238d..aad4827868311d09420c88ca4c72814fdce21387 100644 (file)
       "Sequence": 255,
       "Steps": [
         {
-          "DataId": 23,
-          "Position": {
-            "X": 223.98718,
-            "Y": 315.7854,
-            "Z": -234.85168
-          },
           "TerritoryId": 155,
           "StopDistance": 5,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Coerthas Central Highlands - Camp Dragonhead"
         },
         {
           "DataId": 1006384,
index a919d0447e7fd2ca7008d37463c3662300980bb9..976a0cf90beb5b62de9541431ed3a59cfaf7b9cd 100644 (file)
           "InteractionType": "WalkTo"
         },
         {
-          "DataId": 24,
-          "Position": {
-            "X": 40.024292,
-            "Y": 24.002441,
-            "Z": -668.0247
-          },
           "TerritoryId": 156,
           "StopDistance": 5,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Mor Dhona"
         },
         {
           "DataId": 1006530,
diff --git a/QuestPaths/4.x - Stormblood/MSQ/F - 4.5/3183_The Face of War.json b/QuestPaths/4.x - Stormblood/MSQ/F - 4.5/3183_The Face of War.json
deleted file mode 100644 (file)
index 53b8b0d..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-  "$schema": "https://carvel.li/questionable/quest-1.0",
-  "Author": "liza",
-  "QuestSequence": [
-    {
-      "Sequence": 1,
-      "Steps": [
-        {
-          "TerritoryId": 829,
-          "InteractionType": "Duty",
-          "ContentFinderConditionId": 611
-        }
-      ]
-    }
-  ]
-}
diff --git a/QuestPaths/4.x - Stormblood/MSQ/F-4.5/3183_The Face of War.json b/QuestPaths/4.x - Stormblood/MSQ/F-4.5/3183_The Face of War.json
new file mode 100644 (file)
index 0000000..7cdc0e6
--- /dev/null
@@ -0,0 +1,74 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "TerritoryId": 829,
+          "InteractionType": "Duty",
+          "ContentFinderConditionId": 611
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "Position": {
+            "X": 0,
+            "Y": 0,
+            "Z": 0
+          },
+          "TerritoryId": 1,
+          "InteractionType": "WalkTo",
+          "Comment": "Filler"
+        }
+      ]
+    },
+    {
+      "Sequence": 3,
+      "Steps": [
+        {
+          "DataId": 1026845,
+          "Position": {
+            "X": -476.67664,
+            "Y": 107.63,
+            "Z": 103.74609
+          },
+          "StopDistance": 7,
+          "TerritoryId": 829,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 2002881,
+          "Position": {
+            "X": 21.133728,
+            "Y": 22.323914,
+            "Z": -631.281
+          },
+          "TerritoryId": 156,
+          "InteractionType": "Interact",
+          "TargetTerritoryId": 351,
+          "AetheryteShortcut": "Mor Dhona"
+        },
+        {
+          "DataId": 1026846,
+          "Position": {
+            "X": -1.6022339,
+            "Y": 0,
+            "Z": -9.658997
+          },
+          "TerritoryId": 351,
+          "InteractionType": "CompleteQuest"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/4.x - Stormblood/MSQ/H-4.55/3184_A Brief Reprieve.json b/QuestPaths/4.x - Stormblood/MSQ/H-4.55/3184_A Brief Reprieve.json
new file mode 100644 (file)
index 0000000..75a214e
--- /dev/null
@@ -0,0 +1,73 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1026846,
+          "Position": {
+            "X": -1.6022339,
+            "Y": 0,
+            "Z": -9.658997
+          },
+          "TerritoryId": 351,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 2002879,
+          "Position": {
+            "X": 0,
+            "Y": 3,
+            "Z": 27.5
+          },
+          "TerritoryId": 351,
+          "InteractionType": "Interact",
+          "TargetTerritoryId": 156
+        },
+        {
+          "Position": {
+            "X": 30.917934,
+            "Y": 20.495003,
+            "Z": -656.1909
+          },
+          "TerritoryId": 156,
+          "InteractionType": "WalkTo",
+          "Mount": true
+        },
+        {
+          "DataId": 1026794,
+          "Position": {
+            "X": 124.193115,
+            "Y": -15.239566,
+            "Z": -424.30762
+          },
+          "TerritoryId": 156,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1026797,
+          "Position": {
+            "X": -528.2521,
+            "Y": 8.691104,
+            "Z": -13.53479
+          },
+          "TerritoryId": 621,
+          "InteractionType": "CompleteQuest"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/4.x - Stormblood/MSQ/H-4.55/3185_A Requiem for Heroes.json b/QuestPaths/4.x - Stormblood/MSQ/H-4.55/3185_A Requiem for Heroes.json
new file mode 100644 (file)
index 0000000..11aeb5f
--- /dev/null
@@ -0,0 +1,106 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "TerritoryBlacklist": [
+    830
+  ],
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1026804,
+          "Position": {
+            "X": -524.55945,
+            "Y": 8.698304,
+            "Z": -15.487976
+          },
+          "StopDistance": 7,
+          "TerritoryId": 621,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1026804,
+          "Position": {
+            "X": -524.55945,
+            "Y": 8.698304,
+            "Z": -15.487976
+          },
+          "StopDistance": 7,
+          "TerritoryId": 621,
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_STMBDG102_03185_Q1_000_002",
+              "Yes": true
+            }
+          ]
+        },
+        {
+          "DataId": 1026845,
+          "Position": {
+            "X": -476.67664,
+            "Y": 107.63,
+            "Z": 103.74609
+          },
+          "TerritoryId": 829,
+          "InteractionType": "SinglePlayerDuty"
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "Position": {
+            "X": 0,
+            "Y": 0,
+            "Z": 0
+          },
+          "TerritoryId": 1,
+          "InteractionType": "WalkTo",
+          "Comment": "Filler"
+        }
+      ]
+    },
+    {
+      "Sequence": 3,
+      "Steps": [
+        {
+          "DataId": 2002881,
+          "Position": {
+            "X": 21.133728,
+            "Y": 22.323914,
+            "Z": -631.281
+          },
+          "TerritoryId": 156,
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Mor Dhona",
+          "TargetTerritoryId": 351
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1026990,
+          "Position": {
+            "X": -2.4262085,
+            "Y": 0,
+            "Z": -9.10968
+          },
+          "StopDistance": 7,
+          "TerritoryId": 351,
+          "InteractionType": "CompleteQuest"
+        }
+      ]
+    }
+  ]
+}
index 2d27822adfceac4cdb984786a3f626e37c227275..a5df5294297a5b0af1b2dc176c8dae9c8f0bda57 100644 (file)
       "Sequence": 3,
       "Steps": [
         {
-          "DataId": 189,
-          "Position": {
-            "X": 16.49812,
-            "Y": -16.247,
-            "Z": 127.753
-          },
           "TerritoryId": 962,
-          "InteractionType": "AttuneAethernetShard"
+          "InteractionType": "AttuneAethernetShard",
+          "AethernetShard": "[Old Sharlayan] Scholar's Harbor"
         },
         {
           "DataId": 1038578,
       "Sequence": 5,
       "Steps": [
         {
-          "DataId": 182,
-          "Position": {
-            "X": 0.08138847,
-            "Y": 4.818894,
-            "Z": -0.1004486
-          },
-          "StopDistance": 10,
           "TerritoryId": 962,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Old Sharlayan"
         },
         {
           "DataId": 1038578,
       "Sequence": 7,
       "Steps": [
         {
-          "DataId": 186,
-          "Position": {
-            "X": -36.94214,
-            "Y": 41.367188,
-            "Z": -156.6034
-          },
           "TerritoryId": 962,
-          "InteractionType": "AttuneAethernetShard"
+          "InteractionType": "AttuneAethernetShard",
+          "AethernetShard": "[Old Sharlayan] The Rostra"
         },
         {
           "DataId": 1038578,
       "Sequence": 8,
       "Steps": [
         {
-          "DataId": 187,
-          "Position": {
-            "X": 204.79126,
-            "Y": 21.774597,
-            "Z": -118.73047
-          },
           "TerritoryId": 962,
-          "InteractionType": "AttuneAethernetShard"
+          "InteractionType": "AttuneAethernetShard",
+          "AethernetShard": "[Old Sharlayan] The Leveilleur Estate"
         },
         {
-          "DataId": 188,
-          "Position": {
-            "X": 206.22559,
-            "Y": 1.8463135,
-            "Z": 13.77887
-          },
           "TerritoryId": 962,
-          "InteractionType": "AttuneAethernetShard"
+          "InteractionType": "AttuneAethernetShard",
+          "AethernetShard": "[Old Sharlayan] Journey's End"
         },
         {
           "DataId": 1038578,
index 60212ed823f4351f3684a1c732ba125b11ac83f4..353698e12ced9267e3e335f06605933d2188eb4a 100644 (file)
           "TargetTerritoryId": 962
         },
         {
-          "DataId": 185,
-          "Position": {
-            "X": -92.21033,
-            "Y": 2.304016,
-            "Z": 29.709229
-          },
           "TerritoryId": 962,
-          "InteractionType": "AttuneAethernetShard"
+          "InteractionType": "AttuneAethernetShard",
+          "AethernetShard": "[Old Sharlayan] The Baldesion Annex"
         },
         {
-          "DataId": 184,
-          "Position": {
-            "X": -291.1574,
-            "Y": 20.004517,
-            "Z": -74.143616
-          },
           "TerritoryId": 962,
-          "InteractionType": "AttuneAethernetShard"
+          "InteractionType": "AttuneAethernetShard",
+          "AethernetShard": "[Old Sharlayan] The Studium"
         },
         {
           "DataId": 1038675,
index 1c5d6da9b7665e30e7feafef9096d4dc40effbed..bcab46f992ca3cc68334eeba8e7ddfd35ee68f2c 100644 (file)
       "Sequence": 1,
       "Steps": [
         {
-          "DataId": 166,
-          "Position": {
-            "X": 443.5338,
-            "Y": 170.6416,
-            "Z": -476.18835
-          },
           "TerritoryId": 956,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Labyrinthos - Archeion"
         },
         {
           "DataId": 1037475,
index 2f4cfe3dd26fe96e07f217b87eb00f9dfcc760d7..ff22a9947eaef5c4b7c648d9214ce25b4c48f27d 100644 (file)
       "Sequence": 1,
       "Steps": [
         {
-          "DataId": 169,
-          "Position": {
-            "X": 193.529,
-            "Y": 6.991216,
-            "Z": 629.2394
-          },
           "StopDistance": 5,
           "TerritoryId": 957,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Thavnair - Yedlihmad"
         },
         {
           "DataId": 2011948,
index 613a4430f7117ae9752b38b896185471e06e35c4..2339d61ad4fca907f4a042e514ac011ddb734273 100644 (file)
       "Sequence": 2,
       "Steps": [
         {
-          "DataId": 170,
-          "Position": {
-            "X": -527.4888,
-            "Y": 4.785123,
-            "Z": 36.76496
-          },
           "StopDistance": 5,
           "TerritoryId": 957,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Thavnair - Great Work"
         },
         {
           "DataId": 1038631,
index 64ee72b52d4ce69c612374ba9bc53717e80816b8..76beecd671cd7f6b81eb4620b92224521ee24a5e 100644 (file)
       "Sequence": 3,
       "Steps": [
         {
-          "DataId": 194,
-          "Position": {
-            "X": 6.6071167,
-            "Y": -2.02948,
-            "Z": 110.55151
-          },
           "TerritoryId": 963,
-          "InteractionType": "AttuneAethernetShard"
+          "InteractionType": "AttuneAethernetShard",
+          "AethernetShard": "[Radz-at-Han] Alzadaal's Peace"
         },
         {
           "DataId": 1040256,
       "Sequence": 6,
       "Steps": [
         {
-          "DataId": 193,
-          "Position": {
-            "X": -144.33508,
-            "Y": 27.969727,
-            "Z": 202.2583
-          },
           "TerritoryId": 963,
-          "InteractionType": "AttuneAethernetShard"
+          "InteractionType": "AttuneAethernetShard",
+          "AethernetShard": "[Radz-at-Han] Airship Landing"
         },
         {
-          "DataId": 191,
-          "Position": {
-            "X": -365.95715,
-            "Y": 44.99878,
-            "Z": -31.815125
-          },
           "TerritoryId": 963,
-          "InteractionType": "AttuneAethernetShard"
+          "InteractionType": "AttuneAethernetShard",
+          "AethernetShard": "[Radz-at-Han] Meghaduta"
         },
         {
           "DataId": 1040259,
index dbf13385384dacedb149c32f896bf560e04c10ee..c7ea300ccfe4f691b2a648448c5da94d5119aa25 100644 (file)
       "Sequence": 2,
       "Steps": [
         {
-          "DataId": 192,
-          "Position": {
-            "X": -156.14563,
-            "Y": 35.99597,
-            "Z": 27.725586
-          },
           "TerritoryId": 963,
-          "InteractionType": "AttuneAethernetShard"
+          "InteractionType": "AttuneAethernetShard",
+          "AethernetShard": "[Radz-at-Han] Ruveydah Fibers"
         },
         {
           "DataId": 1040264,
index f28918e47c25f3cc78429583932dcd42f6ed2281..814743dc6feb7080b3495e09a59faf496bf3fed7 100644 (file)
       "Sequence": 3,
       "Steps": [
         {
-          "DataId": 172,
-          "Position": {
-            "X": -408.0791,
-            "Y": 24.18463,
-            "Z": 479.9764
-          },
           "StopDistance": 7,
           "TerritoryId": 958,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Garlemald - Camp Broken Glass"
         },
         {
           "DataId": 1038826,
index 7a8dadae0a733aaccf085522de61b53d61d50684..198ab7cee95d73504f5fece295c775d83784f02a 100644 (file)
       "Sequence": 3,
       "Steps": [
         {
-          "DataId": 173,
-          "Position": {
-            "X": 518.9136,
-            "Y": -35.324707,
-            "Z": -178.36273
-          },
           "StopDistance": 7,
           "TerritoryId": 958,
           "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Garlemald - Tertium",
           "DisableNavmesh": true
         },
         {
index d5b2d1f5e170929e6149f55862a6d83a314c1c1b..9c83d8c06ab7bfd27910d00405a7030c20787ddf 100644 (file)
       "Sequence": 3,
       "Steps": [
         {
-          "DataId": 174,
-          "Position": {
-            "X": -566.2438,
-            "Y": 134.6656,
-            "Z": 650.6459
-          },
-          "StopDistance": 10,
           "TerritoryId": 959,
           "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Mare Lamentorum - Sinus Lacrimarum",
           "Mount": true,
           "DisableNavmesh": true
         },
index c64201aaf1f5960d02be5b0df4f57736adb6feeb..f35f801881dda3d2b6b72245114ff9fa1e8b7559 100644 (file)
       "Sequence": 2,
       "Steps": [
         {
-          "DataId": 175,
-          "Position": {
-            "X": -0.01531982,
-            "Y": -128.8109,
-            "Z": -512.0165
-          },
-          "StopDistance": 10,
           "TerritoryId": 959,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Mare Lamentorum - Bestways Burrow"
         },
         {
           "Position": {
index 0cc3b6a2b8f82546e421c65ebd37740620177bec..ff78c6ff37d12cf4f1172f90d629c35ed0d664e4 100644 (file)
       "Sequence": 5,
       "Steps": [
         {
-          "DataId": 196,
-          "Position": {
-            "X": -42.61847,
-            "Y": -0.015319824,
-            "Z": -197.61963
-          },
           "TerritoryId": 963,
-          "InteractionType": "AttuneAethernetShard"
+          "InteractionType": "AttuneAethernetShard",
+          "AethernetShard": "[Radz-at-Han] Mehryde's Meyhane"
         },
         {
           "DataId": 1039001,
index 0cf92f462ea2795fb916f3e14bb1340f00c8e6b9..7fcde7cc391508ff0654cebec9263a2f36a9de75 100644 (file)
           "InteractionType": "Interact"
         },
         {
-          "DataId": 198,
-          "Position": {
-            "X": 129.59485,
-            "Y": 26.993164,
-            "Z": 13.473633
-          },
           "TerritoryId": 963,
-          "InteractionType": "AttuneAethernetShard"
+          "InteractionType": "AttuneAethernetShard",
+          "AethernetShard": "[Radz-at-Han] Kama"
         },
         {
           "DataId": 1039540,
index 76f3be81855527a39ce4c438d147eb04ca184dca..54171b16c07751b1797942ea581d49881d587c27 100644 (file)
           "InteractionType": "Interact"
         },
         {
-          "DataId": 171,
-          "Position": {
-            "X": 405.1422,
-            "Y": 5.2643433,
-            "Z": -244.4953
-          },
-          "StopDistance": 10,
           "TerritoryId": 957,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Thavnair - Palaka's Stand"
         },
         {
           "DataId": 1039016,
index 15e713b59c20b918cbf0fde0dfb82578e1239489..d44bf4dc3ff9df4507b2bf1bf2be786f731faadb 100644 (file)
       "Sequence": 2,
       "Steps": [
         {
-          "DataId": 183,
-          "Position": {
-            "X": 25.986084,
-            "Y": 3.250122,
-            "Z": -27.023743
-          },
           "TerritoryId": 963,
           "InteractionType": "AttuneAetheryte",
-          "StopDistance": 10,
+          "Aetheryte": "Radz-at-Han",
           "DisableNavmesh": true
         },
         {
-          "DataId": 195,
-          "Position": {
-            "X": -141.3616,
-            "Y": 3.999954,
-            "Z": -98.43509
-          },
           "TerritoryId": 963,
-          "InteractionType": "AttuneAethernetShard"
+          "InteractionType": "AttuneAethernetShard",
+          "AethernetShard": "[Radz-at-Han] Hall of the Radiant Host"
         },
         {
           "DataId": 1040374,
index 0041d1b8fb4b36a8319b3a25f4d8b4dbb711ba8e..068a7edcdfce8a7ac77982e8431f556cb4c6431b 100644 (file)
       "Sequence": 2,
       "Steps": [
         {
-          "DataId": 176,
-          "Position": {
-            "X": 159.96033,
-            "Y": 11.703674,
-            "Z": 126.878784
-          },
           "StopDistance": 6,
           "TerritoryId": 961,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Elpis - Anagnorisis"
         },
         {
           "DataId": 1040018,
index 3fcbe3ac79a4ff936e5862a8f49a498aa94ecb6b..ef4ab3beeb969417f34d64ff534fcc23619e79d8 100644 (file)
       "Sequence": 3,
       "Steps": [
         {
-          "DataId": 177,
-          "Position": {
-            "X": -633.7225,
-            "Y": -19.821533,
-            "Z": 542.56494
-          },
           "TerritoryId": 961,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Elpis - Twelve Wonders"
         },
         {
           "DataId": 1040081,
index d5b68a15cce4d5a85df5e488deadc86e9a1cb19a..d51100520f395de6de40b69080561fdc6bf0eeda 100644 (file)
       "Sequence": 1,
       "Steps": [
         {
-          "DataId": 178,
-          "Position": {
-            "X": -529.9001,
-            "Y": 161.24207,
-            "Z": -222.2782
-          },
           "StopDistance": 7,
           "TerritoryId": 961,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Elpis - Poieten Oikos"
         },
         {
           "DataId": 1040112,
index e340f5c64e12cfe30c93dddb13f03050d029aee1..5d9d42d97924bf83e96839e882252d1f096934bd 100644 (file)
       "Sequence": 255,
       "Steps": [
         {
-          "DataId": 167,
-          "Position": {
-            "X": 8.377136,
-            "Y": -27.542603,
-            "Z": -46.67737
-          },
           "StopDistance": 7,
           "TerritoryId": 956,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Labyrinthos - Sharlayan Hamlet"
         },
         {
           "DataId": 1039761,
index 66a0ccc03ae22d0a2133c1ce63aa4c8ead3a6bff..73bf083a3c44ce9fc28d24b697bfc27a89d54060 100644 (file)
       "Sequence": 4,
       "Steps": [
         {
-          "DataId": 168,
-          "Position": {
-            "X": -729.18286,
-            "Y": -27.634155,
-            "Z": 302.1438
-          },
           "StopDistance": 6,
           "TerritoryId": 956,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Labyrinthos - Aporia"
         },
         {
           "DataId": 1040447,
index 2ed153b2744cdbb73ff3369c0bd6c7ac29b98c22..14f12e52d18290ab74b02e8cb62bc4cac1e5a76f 100644 (file)
           "$.1": "QuestVariables if done after [1]: 2 0 0 0 0 96"
         },
         {
-          "DataId": 179,
-          "Position": {
-            "X": -544.1215,
-            "Y": 74.34187,
-            "Z": 269.6726
-          },
           "StopDistance": 10,
           "TerritoryId": 960,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Ultima Thule - Reah Tahra"
         },
         {
           "DataId": 1038006,
index ad0c553e1f2bbe7801f135ad91d23af14f33f79d..5aa4b4027ae6c07eb5a8fc288e60ef9c5e9f1260 100644 (file)
           "$.1": "QuestVariables if done after [1]: 2 0 0 0 0 192"
         },
         {
-          "DataId": 180,
-          "Position": {
-            "X": 64.286255,
-            "Y": 272.48022,
-            "Z": -657.49603
-          },
           "StopDistance": 8,
           "TerritoryId": 960,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Ultima Thule - Abode of the Ea"
         },
         {
           "DataId": 2012356,
index 7d723af8dbbcee091932397ac1c01ae7edb75ad9..fea444db81c9e99b909ec118a05d03a269047b32 100644 (file)
       "Sequence": 255,
       "Steps": [
         {
-          "DataId": 181,
-          "Position": {
-            "X": 489.2804,
-            "Y": 437.5829,
-            "Z": 333.63843
-          },
           "StopDistance": 5,
           "TerritoryId": 960,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Ultima Thule - Base Omicron"
         },
         {
           "DataId": 1039791,
index fe187b272ae0c3b3baaa683ef2bee5c88e33f65a..19154119a79f3102b50c263414aeac475a56b45f 100644 (file)
       "Sequence": 1,
       "Steps": [
         {
-          "DataId": 199,
-          "Position": {
-            "X": 57.91655,
-            "Y": -24.69344,
-            "Z": -210.6151
-          },
           "TerritoryId": 963,
-          "InteractionType": "AttuneAethernetShard"
+          "InteractionType": "AttuneAethernetShard",
+          "AethernetShard": "[Radz-at-Han] The High Crucible of Al-Kimiya"
         },
         {
           "DataId": 1039589,
index 203eee2787d173bc298c7a6b271db461205645e5..611c90d46ea19d158d1b3e3742da65ddb67102ec 100644 (file)
       "Sequence": 4,
       "Steps": [
         {
-          "DataId": 216,
-          "Position": {
-            "X": -24.06776,
-            "Y": 0.8,
-            "Z": 7.599182
-          },
           "StopDistance": 7,
           "TerritoryId": 1185,
           "InteractionType": "AttuneAetheryte",
-          "DisableNavmesh": true
+          "Aetheryte": "Tuliyollal"
         },
         {
           "Position": {
           "InteractionType": "WalkTo"
         },
         {
-          "DataId": 224,
-          "Position": {
-            "X": 71.7937,
-            "Y": 47.074097,
-            "Z": -333.21124
-          },
           "TerritoryId": 1185,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Brightploom Post"
+          "AethernetShard": "[Tuliyollal] Brightploom Post"
         },
         {
           "DataId": 1046504,
index 95eaff80003c08fdb1dcc295fe51aacc4b47eab3..9132c121aa6449185dc3b5cbf98b02e1477feb7e 100644 (file)
       "Sequence": 4,
       "Steps": [
         {
-          "DataId": 219,
-          "Position": {
-            "X": -187.1214,
-            "Y": 39.93274,
-            "Z": 6.088318
-          },
           "TerritoryId": 1185,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "The Resplendent Quarter"
+          "AethernetShard": "[Tuliyollal] The Resplendent Quarter"
         },
         {
           "DataId": 1046509,
       "Sequence": 5,
       "Steps": [
         {
-          "DataId": 218,
-          "Position": {
-            "X": -413.68738,
-            "Y": 2.9754639,
-            "Z": -45.975464
-          },
           "TerritoryId": 1185,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Dirigible Landing"
+          "Comment": "Dirigible Landing",
+          "AethernetShard": "[Tuliyollal] Dirigible Landing"
         },
         {
           "DataId": 1046509,
index ba5c7a98cd8257beb55d44d283950be808990a44..bca5f6500730f8b4905890906310e09e908f1678 100644 (file)
       "Sequence": 2,
       "Steps": [
         {
-          "DataId": 220,
-          "Position": {
-            "X": -149.73682,
-            "Y": -15.030151,
-            "Z": 198.90125
-          },
           "TerritoryId": 1185,
-          "InteractionType": "AttuneAethernetShard"
+          "InteractionType": "AttuneAethernetShard",
+          "AethernetShard": "[Tuliyollal] The For'ard Cabins"
         },
         {
           "DataId": 1046512,
       "Sequence": 255,
       "Steps": [
         {
-          "DataId": 221,
-          "Position": {
-            "X": -14.98317,
-            "Y": -10.00001,
-            "Z": 135.5848
-          },
           "TerritoryId": 1185,
-          "InteractionType": "AttuneAethernetShard"
+          "InteractionType": "AttuneAethernetShard",
+          "AethernetShard": "[Tuliyollal] Bayside Bevy Marketplace"
         },
         {
           "Position": {
           "Comment": "Resplentend Quarter Lamp nav"
         },
         {
-          "DataId": 222,
-          "Position": {
-            "X": -99.13794,
-            "Y": 100.72473,
-            "Z": -222.03406
-          },
           "TerritoryId": 1185,
-          "InteractionType": "AttuneAethernetShard"
+          "InteractionType": "AttuneAethernetShard",
+          "AethernetShard": "[Tuliyollal] Vollok Shoonsa"
         },
         {
           "DataId": 1046517,
index b737858caf47cd1b8fdb7672d813ee9009baba47..ae92a02501c52f4ec735dee9eb7b3c36a42539e5 100644 (file)
           "InteractionType": "WalkTo"
         },
         {
-          "DataId": 202,
-          "Position": {
-            "X": -169.51251,
-            "Y": 6.576599,
-            "Z": -479.42322
-          },
-          "StopDistance": 11,
           "TerritoryId": 1188,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Kozama'uka - Ok'hanu"
         },
         {
           "DataId": 1046699,
index 5f987a11cf82e2f6a40adbe2d119b5fe046cefbd..5a8da687186832c29fdeac0dfbb055a77aa29031 100644 (file)
           ]
         },
         {
-          "DataId": 200,
-          "Position": {
-            "X": 332.9855,
-            "Y": -160.0985,
-            "Z": -416.1924
-          },
-          "StopDistance": 10,
           "TerritoryId": 1187,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Urqopacha - Wachunpelo"
         },
         {
           "DataId": 1046559,
index 9a8138f252a4cb9b00a6e245dfe1d9fbc03a792f..bd80eff94d47bbec50923726dffdfde9dfab6bde 100644 (file)
       "Sequence": 3,
       "Steps": [
         {
-          "DataId": 223,
-          "Position": {
-            "X": 166.27747,
-            "Y": -17.990417,
-            "Z": 38.742676
-          },
           "TerritoryId": 1185,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Wachumeqimeqi"
+          "AethernetShard": "[Tuliyollal] Wachumeqimeqi"
         },
         {
           "Position": {
index 20faf30d80509dfecbfa6207c49c9de901ebbd8c..a9b3124c0df88ef53fc21885c78b914eb547cc2e 100644 (file)
       "Sequence": 1,
       "Steps": [
         {
-          "DataId": 203,
-          "Position": {
-            "X": 541.1674,
-            "Y": 117.4462,
-            "Z": 203.6108
-          },
-          "StopDistance": 10,
           "TerritoryId": 1188,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Kozama'uka - Many Fires"
         },
         {
           "Position": {
       "Sequence": 255,
       "Steps": [
         {
-          "DataId": 204,
-          "Position": {
-            "X": -477.53113,
-            "Y": 124.04053,
-            "Z": 311.32983
-          },
-          "StopDistance": 10,
           "TerritoryId": 1188,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Kozama'uka - Earthenshire"
         },
         {
           "DataId": 1046613,
index 5fb8769c131a0d0cdb51b6d3655ba0cb6439431b..58d1bd577268de7599fa569cc3ca1bbc138a7912 100644 (file)
       "Sequence": 3,
       "Steps": [
         {
-          "DataId": 201,
-          "Position": {
-            "X": 465.62903,
-            "Y": 114.94617,
-            "Z": 634.9126
-          },
-          "StopDistance": 10,
           "TerritoryId": 1187,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Urqopacha - Worlar's Echo"
         },
         {
           "DataId": 1046819,
index 3fed7a14a3d07881d060016e522d65f5607a0c89..3797eacac3004d600fb883b85e6970c0f346e1a0 100644 (file)
           ]
         },
         {
-          "DataId": 205,
-          "Position": {
-            "X": -397.0547,
-            "Y": 23.53558,
-            "Z": -431.921
-          },
-          "StopDistance": 10,
           "TerritoryId": 1189,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Yak T'el - Iq Br'aax"
         },
         {
           "DataId": 2013645,
index 70659de18927eda34d0db2ef27f714b41f2cc31e..8525c2495646745b8a2c1bd9095ca25e05b07726 100644 (file)
       "Sequence": 1,
       "Steps": [
         {
-          "DataId": 206,
-          "Position": {
-            "X": 721.40076,
-            "Y": -132.31104,
-            "Z": 526.1769
-          },
-          "StopDistance": 10,
           "TerritoryId": 1189,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Yak T'el - Mamook"
         },
         {
           "DataId": 2013953,
index 7210560c175a1ae2e08acd60b6655d58ce7158dc..4fb9580b9baffb68c495e868039ee8135660e42e 100644 (file)
       "Sequence": 1,
       "Steps": [
         {
-          "DataId": 207,
-          "Position": {
-            "X": 386.4091,
-            "Y": -0.1697721,
-            "Z": 467.6294
-          },
           "StopDistance": 8,
           "TerritoryId": 1190,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Shaaloani - Hhusatahwi"
         },
         {
           "DataId": 1046953,
       "Sequence": 3,
       "Steps": [
         {
-          "DataId": 208,
-          "Position": {
-            "X": -291.70673,
-            "Y": 19.08899,
-            "Z": -114.54956
-          },
           "StopDistance": 8,
           "TerritoryId": 1190,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Shaaloani - Sheshenewezi Springs"
         },
         {
           "Position": {
index a5e0205f924f62fb025da8242217c48376a2b52d..77411fc7801ca79f417e6139b693038c1c646d71 100644 (file)
       "Sequence": 3,
       "Steps": [
         {
-          "DataId": 209,
-          "Position": {
-            "X": 311.36023,
-            "Y": -14.175659,
-            "Z": -567.74243
-          },
           "StopDistance": 8,
           "TerritoryId": 1190,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Shaaloani - Mehwahhetsoan"
         },
         {
           "DataId": 2013960,
index e531b0fbd8802e379543da9cf44385c6dc58d770..e78757a7af4bd06fbc81a804d826a84638c4b894 100644 (file)
       "Sequence": 3,
       "Steps": [
         {
-          "DataId": 210,
-          "Position": {
-            "X": 514.6105,
-            "Y": 145.86096,
-            "Z": 207.56836
-          },
           "StopDistance": 8,
           "TerritoryId": 1191,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Heritage Found - Yyasulani Station"
         },
         {
           "DataId": 2013817,
index cdd98121a149157abcf7d7a2a1a64d9d12972fcc..2e140d5e05fec37a16f76b93b79af09735b508f6 100644 (file)
       "Sequence": 255,
       "Steps": [
         {
-          "DataId": 211,
-          "Position": {
-            "X": -223.0173,
-            "Y": 31.94039,
-            "Z": -584.0194
-          },
-          "StopDistance": 10,
           "TerritoryId": 1191,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Heritage Found - The Outskirts"
         },
         {
           "DataId": 1047403,
index 7d3d23e75dc44942d0b1986f3cecb76d1c864a36..b0ce5f88ef6836ecd702bccdd2341b43853ea6c0 100644 (file)
       "Sequence": 4,
       "Steps": [
         {
-          "DataId": 230,
-          "Position": {
-            "X": -30.41562,
-            "Y": -6.050003,
-            "Z": 209.3459
-          },
           "TerritoryId": 1186,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Information Center"
+          "AethernetShard": "[Solution Nine] Information Center"
         },
         {
           "DataId": 1048060,
           "InteractionType": "WalkTo"
         },
         {
-          "DataId": 217,
-          "Position": {
-            "X": -0.015319824,
-            "Y": 8.987488,
-            "Z": -0.015319824
-          },
           "StopDistance": 11,
           "TerritoryId": 1186,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Solution Nine"
         },
         {
           "DataId": 1048061,
index 59abad93cac0b1dac71ef7211bd9346a5ad58106..c4114a882de959bb04033db7499a2b4daf7aa5d9 100644 (file)
       "Sequence": 4,
       "Steps": [
         {
-          "DataId": 235,
-          "Position": {
-            "X": -160.0287,
-            "Y": 0,
-            "Z": 21.5968
-          },
           "TerritoryId": 1186,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Nexus Arcade"
+          "AethernetShard": "[Solution Nine] Nexus Arcade"
         },
         {
           "DataId": 1048065,
       "Sequence": 6,
       "Steps": [
         {
-          "DataId": 236,
-          "Position": {
-            "X": -378.13385,
-            "Y": 13.992493,
-            "Z": 136.49194
-          },
           "TerritoryId": 1186,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Residential Sector"
+          "AethernetShard": "[Solution Nine] Residential Sector"
         },
         {
           "DataId": 1048065,
index f218060eaf0c2861419da3abca1d2ee017bdee17..70c6474d0923e8e57b8bfadac003bae2fe31f319 100644 (file)
           "InteractionType": "WalkTo"
         },
         {
-          "DataId": 234,
-          "Position": {
-            "X": -32.059265,
-            "Y": 38.04065,
-            "Z": -345.2354
-          },
           "TerritoryId": 1186,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Resolution"
+          "AethernetShard": "[Solution Nine] Resolution"
         },
         {
           "DataId": 1048073,
index 8bb04ed077cf6acfbe0acb5274e5e8badb25cf12..b6c1ee3e30e090e48e9e5c7e6c310f52247b9ade 100644 (file)
           "TargetTerritoryId": 1186
         },
         {
-          "DataId": 232,
-          "Position": {
-            "X": 258.28943,
-            "Y": 50.736206,
-            "Z": 148.72961
-          },
           "TerritoryId": 1186,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Neon Stein"
+          "AethernetShard": "[Solution Nine] Neon Stein"
         },
         {
-          "DataId": 231,
-          "Position": {
-            "X": 382.6809,
-            "Y": 59.983154,
-            "Z": 76.67651
-          },
           "TerritoryId": 1186,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "True Vue"
+          "AethernetShard": "[Solution Nine] True Vue"
         },
         {
           "DataId": 1048090,
       "Sequence": 5,
       "Steps": [
         {
-          "DataId": 233,
-          "Position": {
-            "X": 374.77686,
-            "Y": 60.01367,
-            "Z": 325.67322
-          },
           "TerritoryId": 1186,
           "InteractionType": "AttuneAethernetShard",
-          "Comment": "Arcadion"
+          "AethernetShard": "[Solution Nine] The Arcadion"
         },
         {
           "DataId": 1048083,
index 1d0fc93bc19a8a23a9eb302ab51642b45637937a..4515a03118be5e639b1cf700289753e807cb21dc 100644 (file)
       "Sequence": 5,
       "Steps": [
         {
-          "DataId": 212,
-          "Position": {
-            "X": -219.53156,
-            "Y": 32.913696,
-            "Z": 120.77515
-          },
-          "StopDistance": 10,
           "TerritoryId": 1191,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Heritage Found - Electrope Strike"
         },
         {
           "DataId": 2013972,
index 96e9737a7e2f89e0b7fdc53f8607aab9a7a56317..e54dc5c9095c9530a719b1624d576a64426802c0 100644 (file)
           ]
         },
         {
-          "DataId": 214,
-          "Position": {
-            "X": 657.98413,
-            "Y": 28.976807,
-            "Z": -284.01617
-          },
-          "StopDistance": 10,
           "TerritoryId": 1192,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Living Memory - Leynode Pyro"
         },
         {
           "DataId": 1047943,
index 50df03aa9839357769eacc237cdd16690c3eddac..5b6c99cff4052797356f9f7716f83477420981ca 100644 (file)
           ]
         },
         {
-          "DataId": 215,
-          "Position": {
-            "X": -255.26825,
-            "Y": 59.433838,
-            "Z": -397.6654
-          },
-          "StopDistance": 10,
           "TerritoryId": 1192,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "Aetheryte": "Living Memory - Leynode Aero"
         },
         {
           "DataId": 1047993,
index 3c8b7b714c155bb5a3bf2940ac4bed9d32eecc63..086e4ad9b161c44ed168fb30d6c7d122a9a2dd6f 100644 (file)
@@ -1,5 +1,7 @@
 using System.Collections.Generic;
 using System.Diagnostics.CodeAnalysis;
+using System.IO;
+using System.Reflection;
 using Questionable.Model.V1;
 
 namespace Questionable.QuestPaths;
@@ -13,4 +15,7 @@ public static partial class AssemblyQuestLoader
 #else
         new Dictionary<ushort, QuestRoot>();
 #endif
+
+    public static Stream QuestSchema =>
+        typeof(AssemblyQuestLoader).Assembly.GetManifestResourceStream("Questionable.QuestPaths.QuestSchema")!;
 }
index 1ffde5cead5ffcaf9142502de3d44a9c91d920b4..cb63fbaa440058fe77be7228ce1c241039c5298d 100644 (file)
                           ReferenceOutputAssembly="false"/>
     </ItemGroup>
 
+    <ItemGroup>
+        <None Remove="quest-v1.json"/>
+        <EmbeddedResource Include="quest-v1.json">
+            <LogicalName>Questionable.QuestPaths.QuestSchema</LogicalName>
+        </EmbeddedResource>
+    </ItemGroup>
+
     <ItemGroup Condition="'$(Configuration)' == 'Release'">
         <None Remove="2.x - A Realm Reborn"/>
         <None Remove="3.x - Heavensward"/>
@@ -25,7 +32,6 @@
         <None Remove="5.x - Shadowbringers"/>
         <None Remove="6.x - Endwalker"/>
         <None Remove="7.x - Dawntrail"/>
-        <None Remove="quest-v1.json"/>
         <AdditionalFiles Include="2.x - A Realm Reborn\**\*.json"/>
         <AdditionalFiles Include="3.x - Heavensward\**\*.json"/>
         <AdditionalFiles Include="4.x - Stormblood\**\*.json"/>
         <AdditionalFiles Include="7.x - Dawntrail\**\*.json"/>
         <AdditionalFiles Include="quest-v1.json"/>
     </ItemGroup>
+
+    <ItemGroup>
+      <Folder Include="5.x - Shadowbringers\MSQ\A2-Kholusia1\" />
+      <Folder Include="5.x - Shadowbringers\MSQ\A3-AmhAreng1\" />
+      <Folder Include="5.x - Shadowbringers\MSQ\A4 - Crystarium 2\" />
+      <Folder Include="5.x - Shadowbringers\MSQ\B-Il Mheg\" />
+      <Folder Include="5.x - Shadowbringers\MSQ\C-Rak'tika\" />
+    </ItemGroup>
 </Project>
index b969cf1775bc672021d52246b2bf3b9c40eb3493..0b7fdcfcb3d120467247155a136e5eff5cd6cc24 100644 (file)
@@ -20,6 +20,10 @@ Generally, the folder name is derived from SE's classification of quests.
 
 ### Stormblood
 
+- `MSQ`: `StmBd@@` with `@@` being the letter/number used as part of the folder name
+  - `StmBdA1`: `A1 - xxx`
+  - `StmBdB`: `B - 4.1` (and so on for later patches)
+
 ### Shadowbringers
 
 - `MSQ`: `LucKm@` with `@` being the letter used as part of the folder name
index 40c859666eb2b0322c20540be9deae2c86860850..14f1a4d1e17b5b3c24118f01e5dbf604d8aac1e2 100644 (file)
                   ]
                 },
                 "AetheryteShortcut": {
-                  "type": "string",
                   "description": "The Aetheryte to teleport to (before moving)",
-                  "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",
-                    "Gold Saucer",
-                    "Wolves' Den Pier",
-                    "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 - Pia 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",
-                    "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"
-                  ]
+                  "$ref": "#/$defs/Aetheryte"
                 },
                 "AethernetShortcut": {
                   "type": "array",
                   "minItems": 2,
                   "maxItems": 2,
                   "items": {
-                    "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",
-                      "[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)",
-                      "[Idyllshire] Aetheryte Plaza",
-                      "[Idyllshire] West Idyllshire",
-                      "[Idyllshire] Prologue Gate",
-                      "[Idyllshire] Epilogue Gate",
-                      "[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",
-                      "[Crystarium] Aetheryte Plaza",
-                      "[Crystarium] Musica Universalis Markets",
-                      "[Crystarium] Themenos 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)"
-                    ]
+                    "$ref": "#/$defs/AethernetShard"
                   }
                 },
                 "ItemId": {
                   "if": {
                     "properties": {
                       "InteractionType": {
-                        "anyOf": [
-                          {
-                            "const": "AttuneAethernetShard"
-                          },
-                          {
-                            "const": "AttuneAetheryte"
-                          }
-                        ]
+                        "const": "AttuneAetheryte"
                       }
                     }
                   },
                   "then": {
+                    "properties": {
+                      "Aetheryte": {
+                        "$ref": "#/$defs/Aetheryte"
+                      },
+                      "DataId": {
+                        "type": "null"
+                      },
+                      "Position": {
+                        "type": "null"
+                      }
+                    },
                     "required": [
-                      "DataId",
-                      "Position"
+                      "Aetheryte"
+                    ]
+                  }
+                },
+                {
+                  "if": {
+                    "properties": {
+                      "InteractionType": {
+                        "const": "AttuneAethernetShard"
+                      }
+                    }
+                  },
+                  "then": {
+                    "properties": {
+                      "AethernetShard": {
+                        "$ref": "#/$defs/AethernetShard"
+                      },
+                      "DataId": {
+                        "type": "null"
+                      },
+                      "Position": {
+                        "type": "null"
+                      }
+                    },
+                    "required": [
+                      "AethernetShard"
                     ]
                   }
                 },
                     "properties": {
                       "ContentFinderConditionId": {
                         "type": "integer",
-                        "exclusiveMinimum": 0
+                        "exclusiveMinimum": 0,
+                        "exclusiveMaximum": 3000
+                      },
+                      "DataId": {
+                        "type": "null"
+                      },
+                      "Position": {
+                        "type": "null"
                       }
                     },
                     "required": [
   ],
   "additionalProperties": false,
   "$defs": {
+    "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",
+        "Gold Saucer",
+        "Wolves' Den Pier",
+        "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 - Pia 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",
+        "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",
+        "[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)",
+        "[Idyllshire] Aetheryte Plaza",
+        "[Idyllshire] West Idyllshire",
+        "[Idyllshire] Prologue Gate",
+        "[Idyllshire] Epilogue Gate",
+        "[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",
+        "[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)"
+      ]
+    },
     "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",
index c1fcd0f183db8b06a08a4b673644a18a0c15911c..8909f97e2136b39451a647037f7dd4d7f5223507 100644 (file)
@@ -10,6 +10,6 @@
     </PropertyGroup>
 
     <ItemGroup>
-        <PackageReference Include="System.Text.Json" Version="8.0.3"/>
+        <PackageReference Include="System.Text.Json" Version="8.0.4" />
     </ItemGroup>
 </Project>
diff --git a/Questionable.Model/V1/Converter/AethernetShardConverter.cs b/Questionable.Model/V1/Converter/AethernetShardConverter.cs
new file mode 100644 (file)
index 0000000..93b84a9
--- /dev/null
@@ -0,0 +1,142 @@
+using System.Collections.Generic;
+
+namespace Questionable.Model.V1.Converter;
+
+public sealed class AethernetShardConverter() : EnumConverter<EAetheryteLocation>(Values)
+{
+    public static readonly Dictionary<EAetheryteLocation, string> Values = new()
+    {
+        { EAetheryteLocation.Gridania, "[Gridania] Aetheryte Plaza" },
+        { EAetheryteLocation.GridaniaArcher, "[Gridania] Archers' Guild" },
+        { EAetheryteLocation.GridaniaLeatherworker, "[Gridania] Leatherworkers' Guild & Shaded Bower" },
+        { EAetheryteLocation.GridaniaLancer, "[Gridania] Lancers' Guild" },
+        { EAetheryteLocation.GridaniaConjurer, "[Gridania] Conjurers' Guild" },
+        { EAetheryteLocation.GridaniaBotanist, "[Gridania] Botanists' Guild" },
+        { EAetheryteLocation.GridaniaAmphitheatre, "[Gridania] Mih Khetto's Amphitheatre" },
+        { EAetheryteLocation.GridaniaBlueBadgerGate, "[Gridania] Blue Badger Gate (Central Shroud)" },
+        { EAetheryteLocation.GridaniaYellowSerpentGate, "[Gridania] Yellow Serpent Gate (North Shroud)" },
+        { EAetheryteLocation.GridaniaWhiteWolfGate, "[Gridania] White Wolf Gate (Central Shroud)" },
+        { EAetheryteLocation.GridaniaAirship, "[Gridania] Airship Landing" },
+
+        { EAetheryteLocation.Uldah, "[Ul'dah] Aetheryte Plaza" },
+        { EAetheryteLocation.UldahAdventurers, "[Ul'dah] Adventurers' Guild" },
+        { EAetheryteLocation.UldahThaumaturge, "[Ul'dah] Thaumaturges' Guild" },
+        { EAetheryteLocation.UldahGladiator, "[Ul'dah] Gladiators' Guild" },
+        { EAetheryteLocation.UldahMiner, "[Ul'dah] Miners' Guild" },
+        { EAetheryteLocation.UldahWeaver, "[Ul'dah] Weavers' Guild" },
+        { EAetheryteLocation.UldahGoldsmith, "[Ul'dah] Goldsmiths' Guild" },
+        { EAetheryteLocation.UldahSapphireAvenue, "[Ul'dah] Sapphire Avenue Exchange" },
+        { EAetheryteLocation.UldahAlchemist, "[Ul'dah] Alchemists' Guild" },
+        { EAetheryteLocation.UldahChamberOfRule, "[Ul'dah] The Chamber of Rule" },
+        { EAetheryteLocation.UldahGateOfTheSultana, "[Ul'dah] Gate of the Sultana (Western Thanalan)" },
+        { EAetheryteLocation.UldahGateOfNald, "[Ul'dah] Gate of Nald (Central Thanalan)" },
+        { EAetheryteLocation.UldahGateOfThal, "[Ul'dah] Gate of Thal (Central Thanalan)" },
+        { EAetheryteLocation.UldahAirship, "[Ul'dah] Airship Landing" },
+
+        { EAetheryteLocation.Limsa, "[Limsa Lominsa] Aetheryte Plaza" },
+        { EAetheryteLocation.LimsaArcanist, "[Limsa Lominsa] Arcanists' Guild" },
+        { EAetheryteLocation.LimsaFisher, "[Limsa Lominsa] Fishermens' Guild" },
+        { EAetheryteLocation.LimsaHawkersAlley, "[Limsa Lominsa] Hawkers' Alley" },
+        { EAetheryteLocation.LimsaAftcastle, "[Limsa Lominsa] The Aftcastle" },
+        { EAetheryteLocation.LimsaCulinarian, "[Limsa Lominsa] Culinarians' Guild" },
+        { EAetheryteLocation.LimsaMarauder, "[Limsa Lominsa] Marauders' Guild" },
+        { EAetheryteLocation.LimsaZephyrGate, "[Limsa Lominsa] Zephyr Gate (Middle La Noscea)" },
+        { EAetheryteLocation.LimsaTempestGate, "[Limsa Lominsa] Tempest Gate (Lower La Noscea)" },
+        { EAetheryteLocation.LimsaAirship, "[Limsa Lominsa] Airship Landing" },
+
+        { EAetheryteLocation.Ishgard, "[Ishgard] Aetheryte Plaza" },
+        { EAetheryteLocation.IshgardForgottenKnight, "[Ishgard] The Forgotten Knight" },
+        { EAetheryteLocation.IshgardSkysteelManufactory, "[Ishgard] Skysteel Manufactory" },
+        { EAetheryteLocation.IshgardBrume, "[Ishgard] The Brume" },
+        { EAetheryteLocation.IshgardAthenaeumAstrologicum, "[Ishgard] Athenaeum Astrologicum" },
+        { EAetheryteLocation.IshgardJeweledCrozier, "[Ishgard] The Jeweled Crozier" },
+        { EAetheryteLocation.IshgardSaintReymanaudsCathedral, "[Ishgard] Saint Reymanaud's Cathedral" },
+        { EAetheryteLocation.IshgardTribunal, "[Ishgard] The Tribunal" },
+        { EAetheryteLocation.IshgardLastVigil, "[Ishgard] The Last Vigil" },
+        { EAetheryteLocation.IshgardGatesOfJudgement, "[Ishgard] The Gates of Judgement (Coerthas Central Highlands)" },
+
+        { EAetheryteLocation.Idyllshire, "[Idyllshire] Aetheryte Plaza" },
+        { EAetheryteLocation.IdyllshireWest, "[Idyllshire] West Idyllshire" },
+        { EAetheryteLocation.IdyllshirePrologueGate, "[Idyllshire] Prologue Gate" },
+        { EAetheryteLocation.IdyllshireEpilogueGate, "[Idyllshire] Epilogue Gate" },
+
+        { EAetheryteLocation.RhalgrsReach, "[Rhalgr's Reach] Aetheryte Plaza" },
+        { EAetheryteLocation.RhalgrsReachWest, "[Rhalgr's Reach] Western Rhalgr's Reach" },
+        { EAetheryteLocation.RhalgrsReachNorthEast, "[Rhalgr's Reach] Northeastern Rhalgr's Reach" },
+        { EAetheryteLocation.RhalgrsReachFringesGate, "[Rhalgr's Reach] Fringes Gate" },
+        { EAetheryteLocation.RhalgrsReachPeaksGate, "[Rhalgr's Reach] Peaks Gate" },
+
+        { EAetheryteLocation.Kugane, "[Kugane] Aetheryte Plaza" },
+        { EAetheryteLocation.KuganeShiokazeHostelry, "[Kugane] Shiokaze Hostelry" },
+        { EAetheryteLocation.KuganePier1, "[Kugane] Pier #1" },
+        { EAetheryteLocation.KuganeThavnairianConsulate, "[Kugane] Thavnairian Consulate" },
+        { EAetheryteLocation.KuganeMarkets, "[Kugane] Kogane Dori Markets" },
+        { EAetheryteLocation.KuganeBokairoInn, "[Kugane] Bokairo Inn" },
+        { EAetheryteLocation.KuganeRubyBazaar, "[Kugane] The Ruby Bazaar" },
+        { EAetheryteLocation.KuganeSekiseigumiBarracks, "[Kugane] Sekiseigumi Barracks" },
+        { EAetheryteLocation.KuganeRakuzaDistrict, "[Kugane] Rakuza District" },
+        { EAetheryteLocation.KuganeRubyPrice, "[Kugane] The Ruby Price" },
+        { EAetheryteLocation.KuganeAirship, "[Kugane] Airship Landing" },
+
+        { EAetheryteLocation.Crystarium, "[Crystarium] Aetheryte Plaza" },
+        { EAetheryteLocation.CrystariumMarkets, "[Crystarium] Musica Universalis Markets" },
+        { EAetheryteLocation.CrystariumTemenosRookery, "[Crystarium] Temenos Rookery" },
+        { EAetheryteLocation.CrystariumDossalGate, "[Crystarium] The Dossal Gate" },
+        { EAetheryteLocation.CrystariumPendants, "[Crystarium] The Pendants" },
+        { EAetheryteLocation.CrystariumAmaroLaunch, "[Crystarium] The Amaro Launch" },
+        { EAetheryteLocation.CrystariumCrystallineMean, "[Crystarium] The Crystalline Mean" },
+        { EAetheryteLocation.CrystariumCabinetOfCuriosity, "[Crystarium] The Cabinet of Curiosity" },
+        { EAetheryteLocation.CrystariumTessellation, "[Crystarium] Tessellation (Lakeland)" },
+
+        { EAetheryteLocation.Eulmore, "[Eulmore] Aetheryte Plaza" },
+        { EAetheryteLocation.EulmoreSoutheastDerelict, "[Eulmore] Southeast Derelicts" },
+        { EAetheryteLocation.EulmoreNightsoilPots, "[Eulmore] Nightsoil Pots" },
+        { EAetheryteLocation.EulmoreGloryGate, "[Eulmore] The Glory Gate" },
+        { EAetheryteLocation.EulmoreMainstay, "[Eulmore] The Mainstay" },
+        { EAetheryteLocation.EulmorePathToGlory, "[Eulmore] The Path to Glory (Kholusia)" },
+
+        { EAetheryteLocation.OldSharlayan, "[Old Sharlayan] Aetheryte Plaza" },
+        { EAetheryteLocation.OldSharlayanStudium, "[Old Sharlayan] The Studium" },
+        { EAetheryteLocation.OldSharlayanBaldesionAnnex, "[Old Sharlayan] The Baldesion Annex" },
+        { EAetheryteLocation.OldSharlayanRostra, "[Old Sharlayan] The Rostra" },
+        { EAetheryteLocation.OldSharlayanLeveilleurEstate, "[Old Sharlayan] The Leveilleur Estate" },
+        { EAetheryteLocation.OldSharlayanJourneysEnd, "[Old Sharlayan] Journey's End" },
+        { EAetheryteLocation.OldSharlayanScholarsHarbor, "[Old Sharlayan] Scholar's Harbor" },
+        { EAetheryteLocation.OldSharlayanHallOfArtifice, "[Old Sharlayan] The Hall of Artifice (Labyrinthos)" },
+
+        { EAetheryteLocation.RadzAtHan, "[Radz-at-Han] Aetheryte Plaza" },
+        { EAetheryteLocation.RadzAtHanMeghaduta, "[Radz-at-Han] Meghaduta" },
+        { EAetheryteLocation.RadzAtHanRuveydahFibers, "[Radz-at-Han] Ruveydah Fibers" },
+        { EAetheryteLocation.RadzAtHanAirship, "[Radz-at-Han] Airship Landing" },
+        { EAetheryteLocation.RadzAtHanAlzadaalsPeace, "[Radz-at-Han] Alzadaal's Peace" },
+        { EAetheryteLocation.RadzAtHanHallOfTheRadiantHost, "[Radz-at-Han] Hall of the Radiant Host" },
+        { EAetheryteLocation.RadzAtHanMehrydesMeyhane, "[Radz-at-Han] Mehryde's Meyhane" },
+        { EAetheryteLocation.RadzAtHanKama, "[Radz-at-Han] Kama" },
+        { EAetheryteLocation.RadzAtHanHighCrucible, "[Radz-at-Han] The High Crucible of Al-Kimiya" },
+        { EAetheryteLocation.RadzAtHanGateOfFirstSight, "[Radz-at-Han] The Gate of First Sight (Thavnair)" },
+
+        { EAetheryteLocation.Tuliyollal, "[Tuliyollal] Aetheryte Plaza" },
+        { EAetheryteLocation.TuliyollalDirigibleLanding, "[Tuliyollal] Dirigible Landing" },
+        { EAetheryteLocation.TuliyollalTheResplendentQuarter, "[Tuliyollal] The Resplendent Quarter" },
+        { EAetheryteLocation.TuliyollalTheForardCabins, "[Tuliyollal] The For'ard Cabins" },
+        { EAetheryteLocation.TuliyollalBaysideBevyMarketplace, "[Tuliyollal] Bayside Bevy Marketplace" },
+        { EAetheryteLocation.TuliyollalVollokShoonsa, "[Tuliyollal] Vollok Shoonsa" },
+        { EAetheryteLocation.TuliyollalWachumeqimeqi, "[Tuliyollal] Wachumeqimeqi" },
+        { EAetheryteLocation.TuliyollalBrightploomPost, "[Tuliyollal] Brightploom Post" },
+        { EAetheryteLocation.TuliyollalArchOfTheDawnUrqopacha, "[Tuliyollal] Arch of the Dawn (Urqopacha)" },
+        { EAetheryteLocation.TuliyollalArchOfTheDawnKozamauka, "[Tuliyollal] Arch of the Dawn (Kozama'uka)" },
+        { EAetheryteLocation.TuliyollalIhuykatumu, "[Tuliyollal] Ihuykatumu (Kozama'uka)" },
+        { EAetheryteLocation.TuliyollalDirigibleLandingYakTel, "[Tuliyollal] Dirigible Landing (Yak T'el)" },
+        { EAetheryteLocation.TuliyollalXakTuralSkygate, "[Tuliyollal] Xak Tural Skygate (Shaaloani)" },
+
+        { EAetheryteLocation.SolutionNine, "[Solution Nine] Aetheryte Plaza" },
+        { EAetheryteLocation.SolutionNineInformationCenter, "[Solution Nine] Information Center" },
+        { EAetheryteLocation.SolutionNineTrueVue, "[Solution Nine] True Vue" },
+        { EAetheryteLocation.SolutionNineNeonStein, "[Solution Nine] Neon Stein" },
+        { EAetheryteLocation.SolutionNineTheArcadion, "[Solution Nine] The Arcadion" },
+        { EAetheryteLocation.SolutionNineResolution, "[Solution Nine] Resolution" },
+        { EAetheryteLocation.SolutionNineNexusArcade, "[Solution Nine] Nexus Arcade" },
+        { EAetheryteLocation.SolutionNineResidentialSector, "[Solution Nine] Residential Sector" },
+        { EAetheryteLocation.SolutionNineScanningPortNine, "[Solution Nine] Scanning Port Nine (Heritage Found)" },
+    };
+}
index d85f7479be96e2451a672f3139ac01c7108440fa..8b90769f8a5133f48c045dc8ff682691c1463c0d 100644 (file)
@@ -8,142 +8,7 @@ namespace Questionable.Model.V1.Converter;
 
 public sealed class AethernetShortcutConverter : JsonConverter<AethernetShortcut>
 {
-    private static readonly Dictionary<EAetheryteLocation, string> EnumToString = new()
-    {
-        { EAetheryteLocation.Gridania, "[Gridania] Aetheryte Plaza" },
-        { EAetheryteLocation.GridaniaArcher, "[Gridania] Archers' Guild" },
-        { EAetheryteLocation.GridaniaLeatherworker, "[Gridania] Leatherworkers' Guild & Shaded Bower" },
-        { EAetheryteLocation.GridaniaLancer, "[Gridania] Lancers' Guild" },
-        { EAetheryteLocation.GridaniaConjurer, "[Gridania] Conjurers' Guild" },
-        { EAetheryteLocation.GridaniaBotanist, "[Gridania] Botanists' Guild" },
-        { EAetheryteLocation.GridaniaAmphitheatre, "[Gridania] Mih Khetto's Amphitheatre" },
-        { EAetheryteLocation.GridaniaBlueBadgerGate, "[Gridania] Blue Badger Gate (Central Shroud)" },
-        { EAetheryteLocation.GridaniaYellowSerpentGate, "[Gridania] Yellow Serpent Gate (North Shroud)" },
-        { EAetheryteLocation.GridaniaWhiteWolfGate, "[Gridania] White Wolf Gate (Central Shroud)" },
-        { EAetheryteLocation.GridaniaAirship, "[Gridania] Airship Landing" },
-
-        { EAetheryteLocation.Uldah, "[Ul'dah] Aetheryte Plaza" },
-        { EAetheryteLocation.UldahAdventurers, "[Ul'dah] Adventurers' Guild" },
-        { EAetheryteLocation.UldahThaumaturge, "[Ul'dah] Thaumaturges' Guild" },
-        { EAetheryteLocation.UldahGladiator, "[Ul'dah] Gladiators' Guild" },
-        { EAetheryteLocation.UldahMiner, "[Ul'dah] Miners' Guild" },
-        { EAetheryteLocation.UldahWeaver, "[Ul'dah] Weavers' Guild" },
-        { EAetheryteLocation.UldahGoldsmith, "[Ul'dah] Goldsmiths' Guild" },
-        { EAetheryteLocation.UldahSapphireAvenue, "[Ul'dah] Sapphire Avenue Exchange" },
-        { EAetheryteLocation.UldahAlchemist, "[Ul'dah] Alchemists' Guild" },
-        { EAetheryteLocation.UldahChamberOfRule, "[Ul'dah] The Chamber of Rule" },
-        { EAetheryteLocation.UldahGateOfTheSultana, "[Ul'dah] Gate of the Sultana (Western Thanalan)" },
-        { EAetheryteLocation.UldahGateOfNald, "[Ul'dah] Gate of Nald (Central Thanalan)" },
-        { EAetheryteLocation.UldahGateOfThal, "[Ul'dah] Gate of Thal (Central Thanalan)" },
-        { EAetheryteLocation.UldahAirship, "[Ul'dah] Airship Landing" },
-
-        { EAetheryteLocation.Limsa, "[Limsa Lominsa] Aetheryte Plaza" },
-        { EAetheryteLocation.LimsaArcanist, "[Limsa Lominsa] Arcanists' Guild" },
-        { EAetheryteLocation.LimsaFisher, "[Limsa Lominsa] Fishermens' Guild" },
-        { EAetheryteLocation.LimsaHawkersAlley, "[Limsa Lominsa] Hawkers' Alley" },
-        { EAetheryteLocation.LimsaAftcastle, "[Limsa Lominsa] The Aftcastle" },
-        { EAetheryteLocation.LimsaCulinarian, "[Limsa Lominsa] Culinarians' Guild" },
-        { EAetheryteLocation.LimsaMarauder, "[Limsa Lominsa] Marauders' Guild" },
-        { EAetheryteLocation.LimsaZephyrGate, "[Limsa Lominsa] Zephyr Gate (Middle La Noscea)" },
-        { EAetheryteLocation.LimsaTempestGate, "[Limsa Lominsa] Tempest Gate (Lower La Noscea)" },
-        { EAetheryteLocation.LimsaAirship, "[Limsa Lominsa] Airship Landing" },
-
-        { EAetheryteLocation.Ishgard, "[Ishgard] Aetheryte Plaza" },
-        { EAetheryteLocation.IshgardForgottenKnight, "[Ishgard] The Forgotten Knight" },
-        { EAetheryteLocation.IshgardSkysteelManufactory, "[Ishgard] Skysteel Manufactory" },
-        { EAetheryteLocation.IshgardBrume, "[Ishgard] The Brume" },
-        { EAetheryteLocation.IshgardAthenaeumAstrologicum, "[Ishgard] Athenaeum Astrologicum" },
-        { EAetheryteLocation.IshgardJeweledCrozier, "[Ishgard] The Jeweled Crozier" },
-        { EAetheryteLocation.IshgardSaintReymanaudsCathedral, "[Ishgard] Saint Reymanaud's Cathedral" },
-        { EAetheryteLocation.IshgardTribunal, "[Ishgard] The Tribunal" },
-        { EAetheryteLocation.IshgardLastVigil, "[Ishgard] The Last Vigil" },
-        { EAetheryteLocation.IshgardGatesOfJudgement, "[Ishgard] The Gates of Judgement (Coerthas Central Highlands)" },
-
-        { EAetheryteLocation.Idyllshire, "[Idyllshire] Aetheryte Plaza" },
-        { EAetheryteLocation.IdyllshireWest, "[Idyllshire] West Idyllshire" },
-        { EAetheryteLocation.IdyllshirePrologueGate, "[Idyllshire] Prologue Gate" },
-        { EAetheryteLocation.IdyllshireEpilogueGate, "[Idyllshire] Epilogue Gate" },
-
-        { EAetheryteLocation.RhalgrsReach, "[Rhalgr's Reach] Aetheryte Plaza" },
-        { EAetheryteLocation.RhalgrsReachWest, "[Rhalgr's Reach] Western Rhalgr's Reach" },
-        { EAetheryteLocation.RhalgrsReachNorthEast, "[Rhalgr's Reach] Northeastern Rhalgr's Reach" },
-        { EAetheryteLocation.RhalgrsReachFringesGate, "[Rhalgr's Reach] Fringes Gate" },
-        { EAetheryteLocation.RhalgrsReachPeaksGate, "[Rhalgr's Reach] Peaks Gate" },
-
-        { EAetheryteLocation.Kugane, "[Kugane] Aetheryte Plaza" },
-        { EAetheryteLocation.KuganeShiokazeHostelry, "[Kugane] Shiokaze Hostelry" },
-        { EAetheryteLocation.KuganePier1, "[Kugane] Pier #1" },
-        { EAetheryteLocation.KuganeThavnairianConsulate, "[Kugane] Thavnairian Consulate" },
-        { EAetheryteLocation.KuganeMarkets, "[Kugane] Kogane Dori Markets" },
-        { EAetheryteLocation.KuganeBokairoInn, "[Kugane] Bokairo Inn" },
-        { EAetheryteLocation.KuganeRubyBazaar, "[Kugane] The Ruby Bazaar" },
-        { EAetheryteLocation.KuganeSekiseigumiBarracks, "[Kugane] Sekiseigumi Barracks" },
-        { EAetheryteLocation.KuganeRakuzaDistrict, "[Kugane] Rakuza District" },
-        { EAetheryteLocation.KuganeRubyPrice, "[Kugane] The Ruby Price" },
-        { EAetheryteLocation.KuganeAirship, "[Kugane] Airship Landing" },
-
-        { EAetheryteLocation.Crystarium, "[Crystarium] Aetheryte Plaza" },
-        { EAetheryteLocation.CrystariumMarkets, "[Crystarium] Musica Universalis Markets" },
-        { EAetheryteLocation.CrystariumThemenosRookery, "[Crystarium] Themenos Rookery" },
-        { EAetheryteLocation.CrystariumDossalGate, "[Crystarium] The Dossal Gate" },
-        { EAetheryteLocation.CrystariumPendants, "[Crystarium] The Pendants" },
-        { EAetheryteLocation.CrystariumAmaroLaunch, "[Crystarium] The Amaro Launch" },
-        { EAetheryteLocation.CrystariumCrystallineMean, "[Crystarium] The Crystalline Mean" },
-        { EAetheryteLocation.CrystariumCabinetOfCuriosity, "[Crystarium] The Cabinet of Curiosity" },
-        { EAetheryteLocation.CrystariumTessellation, "[Crystarium] Tessellation (Lakeland)" },
-
-        { EAetheryteLocation.Eulmore, "[Eulmore] Aetheryte Plaza" },
-        { EAetheryteLocation.EulmoreSoutheastDerelict, "[Eulmore] Southeast Derelicts" },
-        { EAetheryteLocation.EulmoreNightsoilPots, "[Eulmore] Nightsoil Pots" },
-        { EAetheryteLocation.EulmoreGloryGate, "[Eulmore] The Glory Gate" },
-        { EAetheryteLocation.EulmoreMainstay, "[Eulmore] The Mainstay" },
-        { EAetheryteLocation.EulmorePathToGlory, "[Eulmore] The Path to Glory (Kholusia)" },
-
-        { EAetheryteLocation.OldSharlayan, "[Old Sharlayan] Aetheryte Plaza" },
-        { EAetheryteLocation.OldSharlayanStudium, "[Old Sharlayan] The Studium" },
-        { EAetheryteLocation.OldSharlayanBaldesionAnnex, "[Old Sharlayan] The Baldesion Annex" },
-        { EAetheryteLocation.OldSharlayanRostra, "[Old Sharlayan] The Rostra" },
-        { EAetheryteLocation.OldSharlayanLeveilleurEstate, "[Old Sharlayan] The Leveilleur Estate" },
-        { EAetheryteLocation.OldSharlayanJourneysEnd, "[Old Sharlayan] Journey's End" },
-        { EAetheryteLocation.OldSharlayanScholarsHarbor, "[Old Sharlayan] Scholar's Harbor" },
-        { EAetheryteLocation.OldSharlayanHallOfArtifice, "[Old Sharlayan] The Hall of Artifice (Labyrinthos)" },
-
-        { EAetheryteLocation.RadzAtHan, "[Radz-at-Han] Aetheryte Plaza" },
-        { EAetheryteLocation.RadzAtHanMeghaduta, "[Radz-at-Han] Meghaduta" },
-        { EAetheryteLocation.RadzAtHanRuveydahFibers, "[Radz-at-Han] Ruveydah Fibers" },
-        { EAetheryteLocation.RadzAtHanAirship, "[Radz-at-Han] Airship Landing" },
-        { EAetheryteLocation.RadzAtHanAlzadaalsPeace, "[Radz-at-Han] Alzadaal's Peace" },
-        { EAetheryteLocation.RadzAtHanHallOfTheRadiantHost, "[Radz-at-Han] Hall of the Radiant Host" },
-        { EAetheryteLocation.RadzAtHanMehrydesMeyhane, "[Radz-at-Han] Mehryde's Meyhane" },
-        { EAetheryteLocation.RadzAtHanKama, "[Radz-at-Han] Kama" },
-        { EAetheryteLocation.RadzAtHanHighCrucible, "[Radz-at-Han] The High Crucible of Al-Kimiya" },
-        { EAetheryteLocation.RadzAtHanGateOfFirstSight, "[Radz-at-Han] The Gate of First Sight (Thavnair)" },
-
-        { EAetheryteLocation.Tuliyollal, "[Tuliyollal] Aetheryte Plaza" },
-        { EAetheryteLocation.TuliyollalDirigibleLanding, "[Tuliyollal] Dirigible Landing" },
-        { EAetheryteLocation.TuliyollalTheResplendentQuarter, "[Tuliyollal] The Resplendent Quarter" },
-        { EAetheryteLocation.TuliyollalTheForardCabins, "[Tuliyollal] The For'ard Cabins" },
-        { EAetheryteLocation.TuliyollalBaysideBevyMarketplace, "[Tuliyollal] Bayside Bevy Marketplace" },
-        { EAetheryteLocation.TuliyollalVollokShoonsa, "[Tuliyollal] Vollok Shoonsa" },
-        { EAetheryteLocation.TuliyollalWachumeqimeqi, "[Tuliyollal] Wachumeqimeqi" },
-        { EAetheryteLocation.TuliyollalBrightploomPost, "[Tuliyollal] Brightploom Post" },
-        { EAetheryteLocation.TuliyollalArchOfTheDawnUrqopacha, "[Tuliyollal] Arch of the Dawn (Urqopacha)" },
-        { EAetheryteLocation.TuliyollalArchOfTheDawnKozamauka, "[Tuliyollal] Arch of the Dawn (Kozama'uka)" },
-        { EAetheryteLocation.TuliyollalIhuykatumu, "[Tuliyollal] Ihuykatumu (Kozama'uka)" },
-        { EAetheryteLocation.TuliyollalDirigibleLandingYakTel, "[Tuliyollal] Dirigible Landing (Yak T'el)" },
-        { EAetheryteLocation.TuliyollalXakTuralSkygate, "[Tuliyollal] Xak Tural Skygate (Shaaloani)" },
-
-        { EAetheryteLocation.SolutionNine, "[Solution Nine] Aetheryte Plaza" },
-        { EAetheryteLocation.SolutionNineInformationCenter, "[Solution Nine] Information Center" },
-        { EAetheryteLocation.SolutionNineTrueVue, "[Solution Nine] True Vue" },
-        { EAetheryteLocation.SolutionNineNeonStein, "[Solution Nine] Neon Stein" },
-        { EAetheryteLocation.SolutionNineTheArcadion, "[Solution Nine] The Arcadion" },
-        { EAetheryteLocation.SolutionNineResolution, "[Solution Nine] Resolution" },
-        { EAetheryteLocation.SolutionNineNexusArcade, "[Solution Nine] Nexus Arcade" },
-        { EAetheryteLocation.SolutionNineResidentialSector, "[Solution Nine] Residential Sector" },
-        { EAetheryteLocation.SolutionNineScanningPortNine, "[Solution Nine] Scanning Port Nine (Heritage Found)" },
-    };
-
+    private static readonly Dictionary<EAetheryteLocation, string> EnumToString = AethernetShardConverter.Values;
     private static readonly Dictionary<string, EAetheryteLocation> StringToEnum =
         EnumToString.ToDictionary(x => x.Value, x => x.Key);
 
index dc51f5752e9a3d018167488698eab1e571eb2f2c..1ddde305e010c4c36ee305ffcf86caec1865bf13 100644 (file)
@@ -139,7 +139,7 @@ public enum EAetheryteLocation
 
     Crystarium = 133,
     CrystariumMarkets = 149,
-    CrystariumThemenosRookery = 150,
+    CrystariumTemenosRookery = 150,
     CrystariumDossalGate = 151,
     CrystariumPendants = 152,
     CrystariumAmaroLaunch = 153,
index 55ee70c0d427702070340833e97fbc16a609f411..dc932f65f1edf6e49dce5b9ab3d881d280f4f799 100644 (file)
@@ -33,6 +33,17 @@ public sealed class QuestStep
     public bool? IgnoreDistanceToObject { get; set; }
     public string? Comment { get; set; }
 
+    /// <summary>
+    /// Only used when attuning to an aetheryte.
+    /// </summary>
+    public EAetheryteLocation? Aetheryte { get; set; }
+
+    /// <summary>
+    /// Only used when attuning to an aethernet shard.
+    /// </summary>
+    [JsonConverter(typeof(AethernetShardConverter))]
+    public EAetheryteLocation? AethernetShard { get; set; }
+
     public EAetheryteLocation? AetheryteShortcut { get; set; }
 
     public AethernetShortcut? AethernetShortcut { get; set; }
@@ -80,6 +91,8 @@ public sealed class QuestStep
     {
         if (InteractionType == EInteractionType.WalkTo)
             return StopDistance ?? 0.25f;
+        if (InteractionType == EInteractionType.AttuneAetheryte)
+            return StopDistance ?? 10f;
         else
             return StopDistance ?? DefaultStopDistance;
     }
index 7bcc7e48327ef5f4797cd5b87142e878fbc195bc..c609cb4fe2ca1e86708dbc3b022e52adec24d67b 100644 (file)
@@ -13,9 +13,9 @@
       },
       "System.Text.Json": {
         "type": "Direct",
-        "requested": "[8.0.3, )",
-        "resolved": "8.0.3",
-        "contentHash": "hpagS9joOwv6efWfrMmV9MjQXpiXZH72PgN067Ysfr6AWMSD1/1hEcvh/U5mUpPLezEWsOJSuVrmqDIVD958iA==",
+        "requested": "[8.0.4, )",
+        "resolved": "8.0.4",
+        "contentHash": "bAkhgDJ88XTsqczoxEMliSrpijKZHhbJQldhAmObj/RbrN3sU5dcokuXmWJWsdQAhiMJ9bTayWsL1C9fbbCRhw==",
         "dependencies": {
           "Microsoft.Bcl.AsyncInterfaces": "8.0.0",
           "System.Buffers": "4.5.1",
index a0632997730e14154348bc646f1c8c64cb8f524d..99cb4800811476102780fde38e38f04fe22239c5 100644 (file)
@@ -6,11 +6,15 @@ using System.Globalization;
 using System.IO;
 using System.Linq;
 using System.Text.Json;
+using System.Text.Json.Nodes;
+using System.Threading.Tasks;
 using Dalamud.Plugin;
+using Json.Schema;
 using Microsoft.Extensions.Logging;
 using Questionable.Data;
 using Questionable.Model;
 using Questionable.Model.V1;
+using Questionable.QuestPaths;
 using Questionable.Validation;
 
 namespace Questionable.Controller;
@@ -21,6 +25,7 @@ internal sealed class QuestRegistry
     private readonly QuestData _questData;
     private readonly QuestValidator _questValidator;
     private readonly ILogger<QuestRegistry> _logger;
+    private readonly JsonSchema _questSchema;
 
     private readonly Dictionary<ushort, Quest> _quests = new();
 
@@ -31,6 +36,7 @@ internal sealed class QuestRegistry
         _questData = questData;
         _questValidator = questValidator;
         _logger = logger;
+        _questSchema = JsonSchema.FromStream(AssemblyQuestLoader.QuestSchema).AsTask().Result;
     }
 
     public IEnumerable<Quest> AllQuests => _quests.Values;
@@ -40,6 +46,7 @@ internal sealed class QuestRegistry
 
     public void Reload()
     {
+        _questValidator.ClearIssues();
         _quests.Clear();
 
         LoadQuestsFromAssembly();
@@ -64,7 +71,7 @@ internal sealed class QuestRegistry
     {
         _logger.LogInformation("Loading quests from assembly");
 
-        foreach ((ushort questId, QuestRoot questRoot) in QuestPaths.AssemblyQuestLoader.GetQuests())
+        foreach ((ushort questId, QuestRoot questRoot) in AssemblyQuestLoader.GetQuests())
         {
             Quest quest = new()
             {
@@ -113,7 +120,6 @@ internal sealed class QuestRegistry
 
     private void ValidateQuests()
     {
-        _questValidator.ClearIssues();
         _questValidator.Validate(_quests.Values.Where(x => !x.ReadOnly));
     }
 
@@ -124,10 +130,31 @@ internal sealed class QuestRegistry
         if (questId == null)
             return;
 
+        var questNode = JsonNode.Parse(stream);
+        Task.Run(() =>
+        {
+            var evaluationResult = _questSchema.Evaluate(questNode, new EvaluationOptions
+            {
+                Culture = CultureInfo.InvariantCulture,
+                OutputFormat = OutputFormat.List
+            });
+            if (!evaluationResult.IsValid)
+            {
+                _questValidator.AddIssue(new ValidationIssue
+                {
+                    QuestId = questId.Value,
+                    Sequence = null,
+                    Step = null,
+                    Severity = EIssueSeverity.Error,
+                    Description = "JSON Validation failed"
+                });
+            }
+        });
+
         Quest quest = new Quest
         {
             QuestId = questId.Value,
-            Root = JsonSerializer.Deserialize<QuestRoot>(stream)!,
+            Root = questNode.Deserialize<QuestRoot>()!,
             Info = _questData.GetQuestInfo(questId.Value),
             ReadOnly = false,
         };
index ec3969c9083dc256f8d001ce1a527d9f9821979e..87a4f348d0946a3e663151aea8fa3ca28efb31ea 100644 (file)
@@ -17,10 +17,10 @@ internal static class AethernetShard
             if (step.InteractionType != EInteractionType.AttuneAethernetShard)
                 return null;
 
-            ArgumentNullException.ThrowIfNull(step.DataId);
+            ArgumentNullException.ThrowIfNull(step.AethernetShard);
 
             return serviceProvider.GetRequiredService<DoAttune>()
-                .With((EAetheryteLocation)step.DataId);
+                .With(step.AethernetShard.Value);
         }
     }
 
index 6babf23332aea08bc672e37fa376b1e559654b39..a6bccc4caeeae1ebdd91905ccfacfe87f291ff88 100644 (file)
@@ -15,10 +15,10 @@ internal static class Aetheryte
             if (step.InteractionType != EInteractionType.AttuneAetheryte)
                 return null;
 
-            ArgumentNullException.ThrowIfNull(step.DataId);
+            ArgumentNullException.ThrowIfNull(step.Aetheryte);
 
             return serviceProvider.GetRequiredService<DoAttune>()
-                .With((EAetheryteLocation)step.DataId.Value);
+                .With(step.Aetheryte.Value);
         }
     }
 
index 71d1a00e73233f7f06603aebc879a8d4753f9b22..b679440589fd2c9c5312cf6e6e99dccf1f4e0c5e 100644 (file)
@@ -19,7 +19,7 @@ namespace Questionable.Controller.Steps.Shared;
 
 internal static class Move
 {
-    internal sealed class Factory(IServiceProvider serviceProvider) : ITaskFactory
+    internal sealed class Factory(IServiceProvider serviceProvider, AetheryteData aetheryteData) : ITaskFactory
     {
         public IEnumerable<ITask> CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step)
         {
@@ -37,6 +37,20 @@ internal static class Move
                 task.StopDistance = step.StopDistance.Value;
                 return [task];
             }
+            else if (step is { InteractionType: EInteractionType.AttuneAetheryte, Aetheryte: not null })
+            {
+                var builder = serviceProvider.GetRequiredService<MoveBuilder>();
+                builder.Step = step;
+                builder.Destination = aetheryteData.Locations[step.Aetheryte.Value];
+                return builder.Build();
+            }
+            else if (step is { InteractionType: EInteractionType.AttuneAethernetShard, AethernetShard: not null })
+            {
+                var builder = serviceProvider.GetRequiredService<MoveBuilder>();
+                builder.Step = step;
+                builder.Destination = aetheryteData.Locations[step.AethernetShard.Value];
+                return builder.Build();
+            }
 
             return [];
         }
index e69adc4a3899cea5e61c3bf112d3c04993f51a51..3aa1d728a8c38e41a678b19c9367b1ef6524204e 100644 (file)
@@ -151,7 +151,7 @@ internal sealed class AetheryteData
 
                 { EAetheryteLocation.Crystarium, new(-65.0188f, 4.5318604f, 0.015197754f) },
                 { EAetheryteLocation.CrystariumMarkets, new(-6.149414f, -7.736328f, 148.72961f) },
-                { EAetheryteLocation.CrystariumThemenosRookery, new(-107.37775f, -0.015319824f, -58.762512f) },
+                { EAetheryteLocation.CrystariumTemenosRookery, new(-107.37775f, -0.015319824f, -58.762512f) },
                 { EAetheryteLocation.CrystariumDossalGate, new(64.86609f, -0.015319824f, -18.173523f) },
                 { EAetheryteLocation.CrystariumPendants, new(35.477173f, -0.015319824f, 222.58337f) },
                 { EAetheryteLocation.CrystariumAmaroLaunch, new(66.60559f, 35.99597f, -131.09033f) },
index 7561523ea9329847e90166b8a61ea6fa99ea5b3f..1e2c3f0c457c955447643c07ca8dfc90b167b26c 100644 (file)
 
     <ItemGroup>
         <PackageReference Include="Dalamud.Extensions.MicrosoftLogging" Version="4.0.1"/>
-        <PackageReference Include="JetBrains.Annotations" Version="2023.3.0" ExcludeAssets="runtime"/>
+        <PackageReference Include="JetBrains.Annotations" Version="2024.2.0" ExcludeAssets="runtime" />
+        <PackageReference Include="JsonSchema.Net" Version="7.1.2" />
         <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0"/>
-        <PackageReference Include="System.Text.Json" Version="8.0.3"/>
+        <PackageReference Include="System.Text.Json" Version="8.0.4" />
     </ItemGroup>
 
     <ItemGroup>
index f6047a67becaf181ba25aa28af8f148d40e79e70..1e6d62010e3cb169a3edff7550f3233f2cf9248c 100644 (file)
@@ -54,4 +54,6 @@ internal sealed class QuestValidator
                 .ToList();
         });
     }
+
+    public void AddIssue(ValidationIssue issue) => _validationIssues.Add(issue);
 }
index 2c27dc69e5b633d3ade6cee2f929ce25d3501ab3..5d60f4a75abf6b442350f5c464bcad3fe323e3a0 100644 (file)
@@ -1,4 +1,5 @@
 using System;
+using System.Diagnostics.CodeAnalysis;
 using System.Globalization;
 using System.Linq;
 using System.Numerics;
@@ -8,6 +9,7 @@ using Dalamud.Interface.Windowing;
 using Dalamud.Plugin.Services;
 using ImGuiNET;
 using Questionable.Controller;
+using Questionable.Data;
 using Questionable.Model;
 using Questionable.Model.V1;
 
@@ -20,10 +22,11 @@ internal sealed class DebugOverlay : Window
     private readonly IGameGui _gameGui;
     private readonly IClientState _clientState;
     private readonly ICondition _condition;
+    private readonly AetheryteData _aetheryteData;
     private readonly Configuration _configuration;
 
     public DebugOverlay(QuestController questController, QuestRegistry questRegistry, IGameGui gameGui,
-        IClientState clientState, ICondition condition, Configuration configuration)
+        IClientState clientState, ICondition condition, AetheryteData aetheryteData, Configuration configuration)
         : base("Questionable Debug Overlay###QuestionableDebugOverlay",
             ImGuiWindowFlags.NoTitleBar | ImGuiWindowFlags.NoScrollbar | ImGuiWindowFlags.NoBackground |
             ImGuiWindowFlags.NoInputs | ImGuiWindowFlags.NoSavedSettings, true)
@@ -33,6 +36,7 @@ internal sealed class DebugOverlay : Window
         _gameGui = gameGui;
         _clientState = clientState;
         _condition = condition;
+        _aetheryteData = aetheryteData;
         _configuration = configuration;
 
         Position = Vector2.Zero;
@@ -75,14 +79,14 @@ internal sealed class DebugOverlay : Window
         for (int i = currentQuest.Step; i <= sequence.Steps.Count; ++i)
         {
             QuestStep? step = sequence.FindStep(i);
-            if (step == null || step.Position == null)
-                continue;
-
-            DrawStep(i.ToString(CultureInfo.InvariantCulture), step,
-                Vector3.Distance(_clientState.LocalPlayer!.Position, step.Position.Value) <
-                step.CalculateActualStopDistance()
-                    ? 0xFF00FF00
-                    : 0xFF0000FF);
+            if (step != null && TryGetPosition(step, out Vector3? position))
+            {
+                DrawStep(i.ToString(CultureInfo.InvariantCulture), step, position.Value,
+                    Vector3.Distance(_clientState.LocalPlayer!.Position, position.Value) <
+                    step.CalculateActualStopDistance()
+                        ? 0xFF00FF00
+                        : 0xFF0000FF);
+            }
         }
     }
 
@@ -96,25 +100,49 @@ internal sealed class DebugOverlay : Window
             for (int i = 0; i < sequence.Steps.Count; ++i)
             {
                 QuestStep? step = sequence.FindStep(i);
-                DrawStep($"{quest.QuestId} / {sequence.Sequence} / {i}", step, 0xFFFFFFFF);
+                if (step != null && TryGetPosition(step, out Vector3? position))
+                {
+                    DrawStep($"{quest.QuestId} / {sequence.Sequence} / {i}", step, position.Value, 0xFFFFFFFF);
+                }
             }
         }
     }
 
-    private void DrawStep(string counter, QuestStep? step, uint color)
+    private void DrawStep(string counter, QuestStep step, Vector3 position, uint color)
     {
-        if (step == null ||
-            step.Position == null ||
-            step.Disabled ||
-            step.TerritoryId != _clientState.TerritoryType)
+        if (step.Disabled || step.TerritoryId != _clientState.TerritoryType)
             return;
 
-        bool visible = _gameGui.WorldToScreen(step.Position.Value, out Vector2 screenPos);
+        bool visible = _gameGui.WorldToScreen(position, out Vector2 screenPos);
         if (!visible)
             return;
 
         ImGui.GetWindowDrawList().AddCircleFilled(screenPos, 3f, color);
         ImGui.GetWindowDrawList().AddText(screenPos + new Vector2(10, -8), color,
-            $"{counter}: {step.InteractionType}\n{step.Position.Value.ToString("G", CultureInfo.InvariantCulture)} [{(step.Position.Value - _clientState.LocalPlayer!.Position).Length():N2}]\n{step.Comment}");
+            $"{counter}: {step.InteractionType}\n{position.ToString("G", CultureInfo.InvariantCulture)} [{(position - _clientState.LocalPlayer!.Position).Length():N2}]\n{step.Comment}");
+    }
+
+    private bool TryGetPosition(QuestStep step, [NotNullWhen(true)] out Vector3? position)
+    {
+        if (step.Position != null)
+        {
+            position = step.Position;
+            return true;
+        }
+        else if (step.InteractionType == EInteractionType.AttuneAetheryte && step.Aetheryte != null)
+        {
+            position = _aetheryteData.Locations[step.Aetheryte.Value];
+            return true;
+        }
+        else if (step.InteractionType == EInteractionType.AttuneAethernetShard && step.AethernetShard != null)
+        {
+            position = _aetheryteData.Locations[step.AethernetShard.Value];
+            return true;
+        }
+        else
+        {
+            position = null;
+            return false;
+        }
     }
 }
index 84a89e989cb6861dcf6bea67dee4aa314373fe73..73f242e07d42efd90707f7d5394252be8964055c 100644 (file)
@@ -9,6 +9,7 @@ using Dalamud.Game.Text;
 using Dalamud.Interface;
 using Dalamud.Interface.Colors;
 using Dalamud.Interface.Components;
+using Dalamud.Interface.Utility;
 using Dalamud.Interface.Utility.Raii;
 using Dalamud.Plugin;
 using Dalamud.Plugin.Services;
@@ -277,7 +278,8 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
             {
                 ImGui.SameLine();
                 if (ImGuiComponents.IconButton(FontAwesomeIcon.Atlas))
-                    _commandManager.DispatchCommand("/questinfo", currentQuest.Quest.QuestId.ToString(CultureInfo.InvariantCulture), commandInfo);
+                    _commandManager.DispatchCommand("/questinfo",
+                        currentQuest.Quest.QuestId.ToString(CultureInfo.InvariantCulture), commandInfo);
             }
 
             bool autoAcceptNextQuest = _configuration.General.AutoAcceptNextQuest;
@@ -596,18 +598,70 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
         if (_questRegistry.ValidationIssueCount > 0)
         {
             ImGui.SameLine();
+            if (DrawValidationIssuesButton())
+                _questValidationWindow.IsOpen = true;
+        }
+    }
 
-            bool colored = _questRegistry.ValidationErrorCount > 0;
-            if (colored)
-                ImGui.PushStyleColor(ImGuiCol.Text, ImGuiColors.DalamudRed);
+    private bool DrawValidationIssuesButton()
+    {
+        int errorCount = _questRegistry.ValidationErrorCount;
+        int infoCount = _questRegistry.ValidationIssueCount - _questRegistry.ValidationErrorCount;
+        if (errorCount == 0 && infoCount == 0)
+            return false;
 
-            if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.Flag,
-                    $"{_questRegistry.ValidationIssueCount}"))
-                _questValidationWindow.IsOpen = true;
+        int partsToRender = errorCount == 0 || infoCount == 0 ? 1 : 2;
+        using var id = ImRaii.PushId("validationissues");
+
+        ImGui.PushFont(UiBuilder.IconFont);
+        var icon1 = FontAwesomeIcon.TimesCircle;
+        var icon2 = FontAwesomeIcon.InfoCircle;
+        Vector2 iconSize1 = errorCount > 0 ? ImGui.CalcTextSize(icon1.ToIconString()) : Vector2.Zero;
+        Vector2 iconSize2 = infoCount > 0 ? ImGui.CalcTextSize(icon2.ToIconString()) : Vector2.Zero;
+        ImGui.PopFont();
+
+        string text1 = errorCount > 0 ? errorCount.ToString(CultureInfo.InvariantCulture) : string.Empty;
+        string text2 = infoCount > 0 ? infoCount.ToString(CultureInfo.InvariantCulture) : string.Empty;
+        Vector2 textSize1 = errorCount > 0 ? ImGui.CalcTextSize(text1) : Vector2.Zero;
+        Vector2 textSize2 = infoCount > 0 ? ImGui.CalcTextSize(text2) : Vector2.Zero;
+        var dl = ImGui.GetWindowDrawList();
+        var cursor = ImGui.GetCursorScreenPos();
+
+        var iconPadding = 3 * ImGuiHelpers.GlobalScale;
+
+        // Draw an ImGui button with the icon and text
+        var buttonWidth = iconSize1.X + iconSize2.X + textSize1.X + textSize2.X +
+                          (ImGui.GetStyle().FramePadding.X * 2) + iconPadding * 2 * partsToRender;
+        var buttonHeight = ImGui.GetFrameHeight();
+        var button = ImGui.Button(string.Empty, new Vector2(buttonWidth, buttonHeight));
+
+        // Draw the icon on the window drawlist
+        Vector2 position = new Vector2(cursor.X + ImGui.GetStyle().FramePadding.X,
+            cursor.Y + ImGui.GetStyle().FramePadding.Y);
+        if (errorCount > 0)
+        {
+            ImGui.PushFont(UiBuilder.IconFont);
+            dl.AddText(position, ImGui.GetColorU32(ImGuiColors.DalamudRed), icon1.ToIconString());
+            ImGui.PopFont();
+            position = position with { X = position.X + iconSize1.X + iconPadding };
+
+            // Draw the text on the window drawlist
+            dl.AddText(position, ImGui.GetColorU32(ImGuiCol.Text), text1);
+            position = position with { X = position.X + textSize1.X + 2 * iconPadding };
+        }
 
-            if (colored)
-                ImGui.PopStyleColor();
+        if (infoCount > 0)
+        {
+            ImGui.PushFont(UiBuilder.IconFont);
+            dl.AddText(position, ImGui.GetColorU32(ImGuiColors.ParsedBlue), icon2.ToIconString());
+            ImGui.PopFont();
+            position = position with { X = position.X + iconSize2.X + iconPadding };
+
+            // Draw the text on the window drawlist
+            dl.AddText(position, ImGui.GetColorU32(ImGuiCol.Text), text2);
         }
+
+        return button;
     }
 
     private void DrawRemainingTasks()
index a2ba101cb6b59da5ef4e4059e0191ac47d3a5855..53ca99c0488723238b85cdf03bc0cd4efd1d446a 100644 (file)
       },
       "JetBrains.Annotations": {
         "type": "Direct",
-        "requested": "[2023.3.0, )",
-        "resolved": "2023.3.0",
-        "contentHash": "PHfnvdBUdGaTVG9bR/GEfxgTwWM0Z97Y6X3710wiljELBISipSfF5okn/vz+C2gfO+ihoEyVPjaJwn8ZalVukA=="
+        "requested": "[2024.2.0, )",
+        "resolved": "2024.2.0",
+        "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw=="
+      },
+      "JsonSchema.Net": {
+        "type": "Direct",
+        "requested": "[7.1.2, )",
+        "resolved": "7.1.2",
+        "contentHash": "tvM82Wpsyk+C5aUWkqPZLo2ANDjEfCoDa9R24k7jRkCrwxbXnSBb7NpU1pz0ufp6qw+jIekHD9xJdUkjUtnZxQ==",
+        "dependencies": {
+          "JsonPointer.Net": "5.0.0"
+        }
       },
       "Microsoft.Extensions.DependencyInjection": {
         "type": "Direct",
       },
       "System.Text.Json": {
         "type": "Direct",
-        "requested": "[8.0.3, )",
-        "resolved": "8.0.3",
-        "contentHash": "hpagS9joOwv6efWfrMmV9MjQXpiXZH72PgN067Ysfr6AWMSD1/1hEcvh/U5mUpPLezEWsOJSuVrmqDIVD958iA==",
+        "requested": "[8.0.4, )",
+        "resolved": "8.0.4",
+        "contentHash": "bAkhgDJ88XTsqczoxEMliSrpijKZHhbJQldhAmObj/RbrN3sU5dcokuXmWJWsdQAhiMJ9bTayWsL1C9fbbCRhw==",
         "dependencies": {
           "System.Text.Encodings.Web": "8.0.0"
         }
       },
+      "Humanizer.Core": {
+        "type": "Transitive",
+        "resolved": "2.14.1",
+        "contentHash": "lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw=="
+      },
+      "Json.More.Net": {
+        "type": "Transitive",
+        "resolved": "2.0.1.2",
+        "contentHash": "uF3QeiaXEfH92emz0/BWUiNtMSfxIIvgynuB0Bf1vF4s8eWTcZitBx9l+g/FDaJk5XxqBv9buQXizXKQcXFG1w=="
+      },
+      "JsonPointer.Net": {
+        "type": "Transitive",
+        "resolved": "5.0.0",
+        "contentHash": "fm4T5w20AY6C+p5/pJr0vrXRNGgtSfHl34I1LxC9zdPwS9S3j0GiR1Mz/CVPWKDXXGDpCt1APHpCq7kn5adCfA==",
+        "dependencies": {
+          "Humanizer.Core": "2.14.1",
+          "Json.More.Net": "2.0.1.2"
+        }
+      },
       "Microsoft.Build.Tasks.Git": {
         "type": "Transitive",
         "resolved": "8.0.0",
       "questionable.model": {
         "type": "Project",
         "dependencies": {
-          "System.Text.Json": "[8.0.3, )"
+          "System.Text.Json": "[8.0.4, )"
         }
       },
       "questpaths": {