WIP some IDE test

This commit is contained in:
Liza 2025-02-05 01:21:28 +01:00
parent ceae3d5d21
commit 82abbfa535
Signed by: liza
GPG Key ID: 2C41B84815CF6445
14 changed files with 510 additions and 429 deletions

View File

@ -23,7 +23,11 @@
<LogicalName>Questionable.GatheringPaths.GatheringLocationSchema</LogicalName> <LogicalName>Questionable.GatheringPaths.GatheringLocationSchema</LogicalName>
</EmbeddedResource> </EmbeddedResource>
<AdditionalFiles Include="gatheringlocation-v1.json" /> <AdditionalFiles Include="gatheringlocation-v1.json" />
<AdditionalFiles Include="..\Questionable.Model\common-schema.json" /> <AdditionalFiles Include="..\Questionable.Model\common-aethernetshard.json" />
<AdditionalFiles Include="..\Questionable.Model\common-aetheryte.json" />
<AdditionalFiles Include="..\Questionable.Model\common-classjob.json" />
<AdditionalFiles Include="..\Questionable.Model\common-completionflags.json" />
<AdditionalFiles Include="..\Questionable.Model\common-vector3.json" />
<AdditionalFiles Include="..\QuestPaths\quest-v1.json" /> <AdditionalFiles Include="..\QuestPaths\quest-v1.json" />
</ItemGroup> </ItemGroup>

View File

@ -55,7 +55,7 @@
"type": "object", "type": "object",
"properties": { "properties": {
"Position": { "Position": {
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Vector3" "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-vector3.json"
}, },
"MinimumAngle": { "MinimumAngle": {
"type": "number", "type": "number",

View File

@ -16,14 +16,38 @@ public static class Utils
{ {
public static List<AdditionalText> RegisterSchemas(GeneratorExecutionContext context) public static List<AdditionalText> RegisterSchemas(GeneratorExecutionContext context)
{ {
var commonSchemaFile = context.AdditionalFiles.Single(x => Path.GetFileName(x.Path) == "common-schema.json"); var commonAethernetShardFile =
context.AdditionalFiles.Single(x => Path.GetFileName(x.Path) == "common-aethernetshard.json");
var commonAetheryteFile =
context.AdditionalFiles.Single(x => Path.GetFileName(x.Path) == "common-aetheryte.json");
var commonClassJobFile =
context.AdditionalFiles.Single(x => Path.GetFileName(x.Path) == "common-classjob.json");
var commonCompletionFlagsFile =
context.AdditionalFiles.Single(x => Path.GetFileName(x.Path) == "common-completionflags.json");
var commonVector3File = context.AdditionalFiles.Single(x => Path.GetFileName(x.Path) == "common-vector3.json");
var gatheringSchemaFile = var gatheringSchemaFile =
context.AdditionalFiles.SingleOrDefault(x => Path.GetFileName(x.Path) == "gatheringlocation-v1.json"); context.AdditionalFiles.SingleOrDefault(x => Path.GetFileName(x.Path) == "gatheringlocation-v1.json");
var questSchemaFile = context.AdditionalFiles.SingleOrDefault(x => Path.GetFileName(x.Path) == "quest-v1.json"); var questSchemaFile = context.AdditionalFiles.SingleOrDefault(x => Path.GetFileName(x.Path) == "quest-v1.json");
SchemaRegistry.Global.Register( SchemaRegistry.Global.Register(
new Uri("https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json"), new Uri(
JsonSchema.FromText(commonSchemaFile.GetText()!.ToString())); "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-aethernetshard.json"),
JsonSchema.FromText(commonAethernetShardFile.GetText()!.ToString()));
SchemaRegistry.Global.Register(
new Uri(
"https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-aetheryte.json"),
JsonSchema.FromText(commonAetheryteFile.GetText()!.ToString()));
SchemaRegistry.Global.Register(
new Uri(
"https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-classjob.json"),
JsonSchema.FromText(commonClassJobFile.GetText()!.ToString()));
SchemaRegistry.Global.Register(
new Uri(
"https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-completionflags.json"),
JsonSchema.FromText(commonCompletionFlagsFile.GetText()!.ToString()));
SchemaRegistry.Global.Register(
new Uri("https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-vector3.json"),
JsonSchema.FromText(commonVector3File.GetText()!.ToString()));
if (gatheringSchemaFile != null) if (gatheringSchemaFile != null)
{ {
@ -40,7 +64,16 @@ public static class Utils
JsonSchema.FromText(questSchemaFile.GetText()!.ToString())); JsonSchema.FromText(questSchemaFile.GetText()!.ToString()));
} }
List<AdditionalText?> jsonSchemaFiles = [commonSchemaFile, gatheringSchemaFile, questSchemaFile]; List<AdditionalText?> jsonSchemaFiles =
[
commonAethernetShardFile,
commonAetheryteFile,
commonClassJobFile,
commonCompletionFlagsFile,
commonVector3File,
gatheringSchemaFile,
questSchemaFile
];
return jsonSchemaFiles.Where(x => x != null).Cast<AdditionalText>().ToList(); return jsonSchemaFiles.Where(x => x != null).Cast<AdditionalText>().ToList();
} }

View File

@ -24,7 +24,11 @@
</EmbeddedResource> </EmbeddedResource>
<AdditionalFiles Include="4.x - Stormblood\Class Quests\BTN\2623_The White Death.json" /> <AdditionalFiles Include="4.x - Stormblood\Class Quests\BTN\2623_The White Death.json" />
<AdditionalFiles Include="quest-v1.json" /> <AdditionalFiles Include="quest-v1.json" />
<AdditionalFiles Include="..\Questionable.Model\common-schema.json" /> <AdditionalFiles Include="..\Questionable.Model\common-aethernetshard.json" />
<AdditionalFiles Include="..\Questionable.Model\common-aetheryte.json" />
<AdditionalFiles Include="..\Questionable.Model\common-classjob.json" />
<AdditionalFiles Include="..\Questionable.Model\common-completionflags.json" />
<AdditionalFiles Include="..\Questionable.Model\common-vector3.json" />
</ItemGroup> </ItemGroup>
<ItemGroup Condition="'$(Configuration)' == 'Release'"> <ItemGroup Condition="'$(Configuration)' == 'Release'">

View File

@ -76,7 +76,7 @@
"exclusiveMinimum": 0 "exclusiveMinimum": 0
}, },
"Position": { "Position": {
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Vector3" "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-vector3.json"
}, },
"StopDistance": { "StopDistance": {
"type": [ "type": [
@ -170,7 +170,7 @@
}, },
"AetheryteShortcut": { "AetheryteShortcut": {
"description": "The Aetheryte to teleport to (before moving)", "description": "The Aetheryte to teleport to (before moving)",
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte" "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-aetheryte.json"
}, },
"AethernetShortcut": { "AethernetShortcut": {
"type": "array", "type": "array",
@ -178,7 +178,7 @@
"minItems": 2, "minItems": 2,
"maxItems": 2, "maxItems": 2,
"items": { "items": {
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/AethernetShard" "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-aethernetshard.json"
} }
}, },
"ItemId": { "ItemId": {
@ -200,7 +200,7 @@
"type": "boolean" "type": "boolean"
}, },
"CompletionQuestVariablesFlags": { "CompletionQuestVariablesFlags": {
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/CompletionFlags" "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-completionflags.json"
}, },
"Flying": { "Flying": {
"type": "string", "type": "string",
@ -270,16 +270,16 @@
} }
}, },
"AetheryteLocked": { "AetheryteLocked": {
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte" "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-aetheryte.json"
}, },
"AetheryteUnlocked": { "AetheryteUnlocked": {
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte" "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-aetheryte.json"
}, },
"NearPosition": { "NearPosition": {
"type": "object", "type": "object",
"properties": { "properties": {
"Position": { "Position": {
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Vector3" "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-vector3.json"
}, },
"MaximumDistance": { "MaximumDistance": {
"type": "number" "type": "number"
@ -342,10 +342,10 @@
} }
}, },
"AetheryteLocked": { "AetheryteLocked": {
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte" "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-aetheryte.json"
}, },
"AetheryteUnlocked": { "AetheryteUnlocked": {
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte" "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-aetheryte.json"
}, },
"RequiredQuestVariablesNotMet": { "RequiredQuestVariablesNotMet": {
"type": "boolean" "type": "boolean"
@ -354,7 +354,7 @@
"type": "object", "type": "object",
"properties": { "properties": {
"Position": { "Position": {
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Vector3" "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-vector3.json"
}, },
"MaximumDistance": { "MaximumDistance": {
"type": "number" "type": "number"
@ -383,10 +383,10 @@
"type": "boolean" "type": "boolean"
}, },
"AetheryteLocked": { "AetheryteLocked": {
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte" "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-aetheryte.json"
}, },
"AetheryteUnlocked": { "AetheryteUnlocked": {
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte" "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-aetheryte.json"
} }
}, },
"additionalProperties": false "additionalProperties": false
@ -395,7 +395,7 @@
"additionalProperties": false "additionalProperties": false
}, },
"CompletionQuestVariablesFlags": { "CompletionQuestVariablesFlags": {
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/CompletionFlags" "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-completionflags.json"
}, },
"RequiredQuestVariables": { "RequiredQuestVariables": {
"type": "array", "type": "array",
@ -439,14 +439,14 @@
"description": "Which class or job you are using whenever this step gets executed", "description": "Which class or job you are using whenever this step gets executed",
"type": "array", "type": "array",
"items": { "items": {
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/ClassJob" "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-classjob.json"
} }
}, },
"RequiredQuestAcceptedJob": { "RequiredQuestAcceptedJob": {
"description": "Which class or job you were using when accepting this quest (e.g. for beast tribes)", "description": "Which class or job you were using when accepting this quest (e.g. for beast tribes)",
"type": "array", "type": "array",
"items": { "items": {
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/ClassJob" "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-classjob.json"
} }
}, },
"DelaySecondsAtStart": { "DelaySecondsAtStart": {
@ -509,7 +509,7 @@
"then": { "then": {
"properties": { "properties": {
"Aetheryte": { "Aetheryte": {
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte" "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-aetheryte.json"
}, },
"DataId": { "DataId": {
"type": "null" "type": "null"
@ -541,7 +541,7 @@
"then": { "then": {
"properties": { "properties": {
"AethernetShard": { "AethernetShard": {
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/AethernetShard" "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-aethernetshard.json"
}, },
"DataId": { "DataId": {
"type": "null" "type": "null"
@ -641,7 +641,7 @@
"type": "integer" "type": "integer"
}, },
"CompletionQuestVariablesFlags": { "CompletionQuestVariablesFlags": {
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/CompletionFlags" "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-completionflags.json"
}, },
"IgnoreQuestMarker": { "IgnoreQuestMarker": {
"type": "boolean" "type": "boolean"
@ -1054,7 +1054,7 @@
"type": "object", "type": "object",
"properties": { "properties": {
"Position": { "Position": {
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Vector3" "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-vector3.json"
}, },
"StopDistance": { "StopDistance": {
"type": [ "type": [
@ -1424,7 +1424,7 @@
"then": { "then": {
"properties": { "properties": {
"TargetClass": { "TargetClass": {
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/ClassJob" "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-classjob.json"
} }
}, },
"required": [ "required": [

View File

@ -4,6 +4,14 @@ namespace Questionable.Model;
public static class AssemblyModelLoader public static class AssemblyModelLoader
{ {
public static Stream CommonSchema => public static Stream CommonAetheryte =>
typeof(AssemblyModelLoader).Assembly.GetManifestResourceStream("Questionable.Model.CommonSchema")!; typeof(AssemblyModelLoader).Assembly.GetManifestResourceStream("Questionable.Model.CommonAetheryte")!;
public static Stream CommonAethernetShard =>
typeof(AssemblyModelLoader).Assembly.GetManifestResourceStream("Questionable.Model.CommonAethernetShard")!;
public static Stream CommonClassJob =>
typeof(AssemblyModelLoader).Assembly.GetManifestResourceStream("Questionable.Model.CommonClassJob")!;
public static Stream CommonCompletionFlags =>
typeof(AssemblyModelLoader).Assembly.GetManifestResourceStream("Questionable.Model.CommonCompletionFlags")!;
public static Stream CommonVector3 =>
typeof(AssemblyModelLoader).Assembly.GetManifestResourceStream("Questionable.Model.CommonVector3")!;
} }

View File

@ -16,9 +16,25 @@
<ItemGroup> <ItemGroup>
<None Remove="common-schema.json" /> <None Remove="common-aethernetshard.json" />
<EmbeddedResource Include="common-schema.json"> <None Remove="common-aetheryte.json" />
<LogicalName>Questionable.Model.CommonSchema</LogicalName> <None Remove="common-classjob.json" />
<None Remove="common-completionflags.json" />
<None Remove="common-vector3.json" />
<EmbeddedResource Include="common-aethernetshard.json">
<LogicalName>Questionable.Model.CommonAethernetShard</LogicalName>
</EmbeddedResource>
<EmbeddedResource Include="common-aetheryte.json">
<LogicalName>Questionable.Model.CommonAetheryte</LogicalName>
</EmbeddedResource>
<EmbeddedResource Include="common-classjob.json">
<LogicalName>Questionable.Model.CommonClassJob</LogicalName>
</EmbeddedResource>
<EmbeddedResource Include="common-completionflags.json">
<LogicalName>Questionable.Model.CommonCompletionFlags</LogicalName>
</EmbeddedResource>
<EmbeddedResource Include="common-vector3.json">
<LogicalName>Questionable.Model.CommonVector3</LogicalName>
</EmbeddedResource> </EmbeddedResource>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -0,0 +1,151 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "/liza/Questionable/raw/branch/master/Questionable.Model/common-aethernetshard.json",
"type": "string",
"enum": [
"[Gridania] Aetheryte Plaza",
"[Gridania] Archers' Guild",
"[Gridania] Leatherworkers' Guild & Shaded Bower",
"[Gridania] Lancers' Guild",
"[Gridania] Conjurers' Guild",
"[Gridania] Botanists' Guild",
"[Gridania] Mih Khetto's Amphitheatre",
"[Gridania] Blue Badger Gate (Central Shroud)",
"[Gridania] Yellow Serpent Gate (North Shroud)",
"[Gridania] White Wolf Gate (Central Shroud)",
"[Gridania] Airship Landing",
"[Ul'dah] Aetheryte Plaza",
"[Ul'dah] Adventurers' Guild",
"[Ul'dah] Thaumaturges' Guild",
"[Ul'dah] Gladiators' Guild",
"[Ul'dah] Miners' Guild",
"[Ul'dah] Weavers' Guild",
"[Ul'dah] Goldsmiths' Guild",
"[Ul'dah] Sapphire Avenue Exchange",
"[Ul'dah] Alchemists' Guild",
"[Ul'dah] Gate of the Sultana (Western Thanalan)",
"[Ul'dah] Gate of Nald (Central Thanalan)",
"[Ul'dah] Gate of Thal (Central Thanalan)",
"[Ul'dah] The Chamber of Rule",
"[Ul'dah] Airship Landing",
"[Limsa Lominsa] Aetheryte Plaza",
"[Limsa Lominsa] Arcanists' Guild",
"[Limsa Lominsa] Fishermens' Guild",
"[Limsa Lominsa] Hawkers' Alley",
"[Limsa Lominsa] The Aftcastle",
"[Limsa Lominsa] Culinarians' Guild",
"[Limsa Lominsa] Marauders' Guild",
"[Limsa Lominsa] Zephyr Gate (Middle La Noscea)",
"[Limsa Lominsa] Tempest Gate (Lower La Noscea)",
"[Limsa Lominsa] Airship Landing",
"[Gold Saucer] Aetheryte Plaza",
"[Gold Saucer] Entrance & Card Squares",
"[Gold Saucer] Wonder Square East",
"[Gold Saucer] Wonder Square West",
"[Gold Saucer] Event Square",
"[Gold Saucer] Cactpot Board",
"[Gold Saucer] Round Square",
"[Gold Saucer] Chocobo Square",
"[Gold Saucer] Minion Square",
"[Ishgard] Aetheryte Plaza",
"[Ishgard] The Forgotten Knight",
"[Ishgard] Skysteel Manufactory",
"[Ishgard] The Brume",
"[Ishgard] Athenaeum Astrologicum",
"[Ishgard] The Jeweled Crozier",
"[Ishgard] Saint Reymanaud's Cathedral",
"[Ishgard] The Tribunal",
"[Ishgard] The Last Vigil",
"[Ishgard] The Gates of Judgement (Coerthas Central Highlands)",
"[Ishgard] Firmament",
"[Firmament] The Mendicant's Court",
"[Firmament] The Mattock",
"[Firmament] The New Nest",
"[Firmament] Saint Roelle's Dais",
"[Firmament] Featherfall",
"[Firmament] Hoarfrost Hall",
"[Firmament] Western Risensong Quarter",
"[Firmament] Eastern Risensong Quarter",
"[Idyllshire] Aetheryte Plaza",
"[Idyllshire] West Idyllshire",
"[Idyllshire] Prologue Gate (Western Hinterlands)",
"[Idyllshire] Epilogue Gate (Eastern Hinterlands)",
"[Rhalgr's Reach] Aetheryte Plaza",
"[Rhalgr's Reach] Western Rhalgr's Reach",
"[Rhalgr's Reach] Northeastern Rhalgr's Reach",
"[Rhalgr's Reach] Fringes Gate",
"[Rhalgr's Reach] Peaks Gate",
"[Kugane] Aetheryte Plaza",
"[Kugane] Shiokaze Hostelry",
"[Kugane] Pier #1",
"[Kugane] Thavnairian Consulate",
"[Kugane] Kogane Dori Markets",
"[Kugane] Bokairo Inn",
"[Kugane] The Ruby Bazaar",
"[Kugane] Sekiseigumi Barracks",
"[Kugane] Rakuza District",
"[Kugane] The Ruby Price",
"[Kugane] Airship Landing",
"[Doman Enclave] Aetheryte Plaza",
"[Doman Enclave] The Northern Enclave",
"[Doman Enclave] The Southern Enclave",
"[Doman Enclave] Ferry Docks",
"[Doman Enclave] The One River",
"[Doman Enclave] Gangos",
"[Crystarium] Aetheryte Plaza",
"[Crystarium] Musica Universalis Markets",
"[Crystarium] Temenos Rookery",
"[Crystarium] The Dossal Gate",
"[Crystarium] The Pendants",
"[Crystarium] The Amaro Launch",
"[Crystarium] The Crystalline Mean",
"[Crystarium] The Cabinet of Curiosity",
"[Crystarium] Tessellation (Lakeland)",
"[Eulmore] Aetheryte Plaza",
"[Eulmore] Southeast Derelicts",
"[Eulmore] Nightsoil Pots",
"[Eulmore] The Glory Gate",
"[Eulmore] The Mainstay",
"[Eulmore] The Path to Glory (Kholusia)",
"[Old Sharlayan] Aetheryte Plaza",
"[Old Sharlayan] The Studium",
"[Old Sharlayan] The Baldesion Annex",
"[Old Sharlayan] The Rostra",
"[Old Sharlayan] The Leveilleur Estate",
"[Old Sharlayan] Journey's End",
"[Old Sharlayan] Scholar's Harbor",
"[Old Sharlayan] The Hall of Artifice (Labyrinthos)",
"[Radz-at-Han] Aetheryte Plaza",
"[Radz-at-Han] Meghaduta",
"[Radz-at-Han] Ruveydah Fibers",
"[Radz-at-Han] Airship Landing",
"[Radz-at-Han] Alzadaal's Peace",
"[Radz-at-Han] Hall of the Radiant Host",
"[Radz-at-Han] Mehryde's Meyhane",
"[Radz-at-Han] Kama",
"[Radz-at-Han] The High Crucible of Al-Kimiya",
"[Radz-at-Han] The Gate of First Sight (Thavnair)",
"[Tuliyollal] Aetheryte Plaza",
"[Tuliyollal] Dirigible Landing",
"[Tuliyollal] The Resplendent Quarter",
"[Tuliyollal] The For'ard Cabins",
"[Tuliyollal] Bayside Bevy Marketplace",
"[Tuliyollal] Vollok Shoonsa",
"[Tuliyollal] Wachumeqimeqi",
"[Tuliyollal] Brightploom Post",
"[Tuliyollal] Arch of the Dawn (Urqopacha)",
"[Tuliyollal] Arch of the Dawn (Kozama'uka)",
"[Tuliyollal] Ihuykatumu (Kozama'uka)",
"[Tuliyollal] Dirigible Landing (Yak T'el)",
"[Tuliyollal] Xak Tural Skygate (Shaaloani)",
"[Solution Nine] Aetheryte Plaza",
"[Solution Nine] Information Center",
"[Solution Nine] True Vue",
"[Solution Nine] Neon Stein",
"[Solution Nine] The Arcadion",
"[Solution Nine] Resolution",
"[Solution Nine] Nexus Arcade",
"[Solution Nine] Residential Sector",
"[Solution Nine] Scanning Port Nine (Heritage Found)"
]
}

View File

@ -0,0 +1,114 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "/liza/Questionable/raw/branch/master/Questionable.Model/common-aetheryte.json",
"type": "string",
"enum": [
"Gridania",
"Central Shroud - Bentbranch Meadows",
"East Shroud - Hawthorne Hut",
"South Shroud - Quarrymill",
"South Shroud - Camp Tranquil",
"North Shroud - Fallgourd Float",
"Ul'dah",
"Western Thanalan - Horizon",
"Central Thanalan - Black Brush Station",
"Eastern Thanalan - Camp Drybone",
"Southern Thanalan - Little Ala Mhigo",
"Southern Thanalan - Forgotten Springs",
"Northern Thanalan - Camp Bluefog",
"Northern Thanalan - Ceruleum Processing Plant",
"Limsa Lominsa",
"Middle La Noscea - Summerford Farms",
"Lower La Noscea - Moraby Drydocks",
"Eastern La Noscea - Costa Del Sol",
"Eastern La Noscea - Wineport",
"Western La Noscea - Swiftperch",
"Western La Noscea - Aleport",
"Upper La Noscea - Camp Bronze Lake",
"Outer La Noscea - Camp Overlook",
"Coerthas Central Highlands - Camp Dragonhead",
"Mor Dhona",
"Wolves' Den Pier",
"Gold Saucer",
"Ishgard",
"Idyllshire",
"Coerthas Western Highlands - Falcon's Nest",
"The Sea of Clouds - Camp Cloudtop",
"The Sea of Clouds - Ok' Zundu",
"Azys Lla - Helix",
"The Dravanian Forelands - Tailfeather",
"The Dravanian Forelands - Anyx Trine",
"The Churning Mists - Moghome",
"The Churning Mists - Zenith",
"Rhalgr's Reach",
"Fringes - Castrum Oriens",
"Fringes - Peering Stones",
"Peaks - Ala Gannha",
"Peaks - Ala Ghiri",
"Lochs - Porta Praetoria",
"Lochs - Ala Mhigan Quarter",
"Kugane",
"Ruby Sea - Tamamizu",
"Ruby Sea - Onokoro",
"Yanxia - Namai",
"Yanxia - House of the Fierce",
"Azim Steppe - Reunion",
"Azim Steppe - Dawn Throne",
"Azim Steppe - Dhoro Iloh",
"Doman Enclave",
"Crystarium",
"Eulmore",
"Lakeland - Fort Jobb",
"Lakeland - Ostall Imperative",
"Kholusia - Stilltide",
"Kholusia - Wright",
"Kholusia - Tomra",
"Amh Araeng - Mord Souq",
"Amh Araeng - Inn at Journey's Head",
"Amh Araeng - Twine",
"Rak'tika - Slitherbough",
"Rak'tika - Fanow",
"Il Mheg - Lydha Lran",
"Il Mheg - Pla Enni",
"Il Mheg - Wolekdorf",
"Tempest - Ondo Cups",
"Tempest - Macarenses Angle",
"Old Sharlayan",
"Radz-at-Han",
"Labyrinthos - Archeion",
"Labyrinthos - Sharlayan Hamlet",
"Labyrinthos - Aporia",
"Thavnair - Yedlihmad",
"Thavnair - Great Work",
"Thavnair - Palaka's Stand",
"Garlemald - Camp Broken Glass",
"Garlemald - Tertium",
"Mare Lamentorum - Sinus Lacrimarum",
"Mare Lamentorum - Bestways Burrow",
"Elpis - Anagnorisis",
"Elpis - Twelve Wonders",
"Elpis - Poieten Oikos",
"Ultima Thule - Reah Tahra",
"Ultima Thule - Abode of the Ea",
"Ultima Thule - Base Omicron",
"Tuliyollal",
"Solution Nine",
"Urqopacha - Wachunpelo",
"Urqopacha - Worlar's Echo",
"Kozama'uka - Ok'hanu",
"Kozama'uka - Many Fires",
"Kozama'uka - Earthenshire",
"Kozama'uka - Dock Poga",
"Yak T'el - Iq Br'aax",
"Yak T'el - Mamook",
"Shaaloani - Hhusatahwi",
"Shaaloani - Sheshenewezi Springs",
"Shaaloani - Mehwahhetsoan",
"Heritage Found - Yyasulani Station",
"Heritage Found - The Outskirts",
"Heritage Found - Electrope Strike",
"Living Memory - Leynode Mnemo",
"Living Memory - Leynode Pyro",
"Living Memory - Leynode Aero"
]
}

View File

@ -0,0 +1,53 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "/liza/Questionable/raw/branch/master/Questionable.Model/common-classjob.json",
"type": "string",
"enum": [
"Gladiator",
"Pugilist",
"Marauder",
"Lancer",
"Archer",
"Conjurer",
"Thaumaturge",
"Carpenter",
"Blacksmith",
"Armorer",
"Goldsmith",
"Leatherworker",
"Weaver",
"Alchemist",
"Culinarian",
"Miner",
"Botanist",
"Fisher",
"Paladin",
"Monk",
"Warrior",
"Dragoon",
"Bard",
"White Mage",
"Black Mage",
"Arcanist",
"Summoner",
"Scholar",
"Rogue",
"Ninja",
"Machinist",
"Dark Knight",
"Astrologian",
"Samurai",
"Red Mage",
"Blue Mage",
"Gunbreaker",
"Dancer",
"Reaper",
"Sage",
"Viper",
"Pictomancer",
"DoW",
"DoM",
"DoH",
"DoL"
]
}

View File

@ -0,0 +1,59 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "/liza/Questionable/raw/branch/master/Questionable.Model/common-completionflags.json",
"type": "array",
"description": "Quest Variables that dictate whether or not this step is skipped: null is don't check, positive values need to be set, negative values need to be unset",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"High": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 15
},
"Low": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 15
},
"Negative": {
"type": "boolean"
},
"Mode": {
"type": "string",
"enum": [
"Bitwise",
"Exact"
]
}
}
},
{
"type": "number",
"enum": [
1,
2,
4,
8,
16,
32,
64,
128
]
},
{
"type": "null"
}
]
},
"minItems": 6,
"maxItems": 6
}

View File

@ -1,395 +0,0 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json",
"$defs": {
"Vector3": {
"type": "object",
"description": "Position to try reaching after the jump",
"properties": {
"X": {
"type": "number"
},
"Y": {
"type": "number"
},
"Z": {
"type": "number"
}
},
"required": [
"X",
"Y",
"Z"
]
},
"Aetheryte": {
"type": "string",
"enum": [
"Gridania",
"Central Shroud - Bentbranch Meadows",
"East Shroud - Hawthorne Hut",
"South Shroud - Quarrymill",
"South Shroud - Camp Tranquil",
"North Shroud - Fallgourd Float",
"Ul'dah",
"Western Thanalan - Horizon",
"Central Thanalan - Black Brush Station",
"Eastern Thanalan - Camp Drybone",
"Southern Thanalan - Little Ala Mhigo",
"Southern Thanalan - Forgotten Springs",
"Northern Thanalan - Camp Bluefog",
"Northern Thanalan - Ceruleum Processing Plant",
"Limsa Lominsa",
"Middle La Noscea - Summerford Farms",
"Lower La Noscea - Moraby Drydocks",
"Eastern La Noscea - Costa Del Sol",
"Eastern La Noscea - Wineport",
"Western La Noscea - Swiftperch",
"Western La Noscea - Aleport",
"Upper La Noscea - Camp Bronze Lake",
"Outer La Noscea - Camp Overlook",
"Coerthas Central Highlands - Camp Dragonhead",
"Mor Dhona",
"Wolves' Den Pier",
"Gold Saucer",
"Ishgard",
"Idyllshire",
"Coerthas Western Highlands - Falcon's Nest",
"The Sea of Clouds - Camp Cloudtop",
"The Sea of Clouds - Ok' Zundu",
"Azys Lla - Helix",
"The Dravanian Forelands - Tailfeather",
"The Dravanian Forelands - Anyx Trine",
"The Churning Mists - Moghome",
"The Churning Mists - Zenith",
"Rhalgr's Reach",
"Fringes - Castrum Oriens",
"Fringes - Peering Stones",
"Peaks - Ala Gannha",
"Peaks - Ala Ghiri",
"Lochs - Porta Praetoria",
"Lochs - Ala Mhigan Quarter",
"Kugane",
"Ruby Sea - Tamamizu",
"Ruby Sea - Onokoro",
"Yanxia - Namai",
"Yanxia - House of the Fierce",
"Azim Steppe - Reunion",
"Azim Steppe - Dawn Throne",
"Azim Steppe - Dhoro Iloh",
"Doman Enclave",
"Crystarium",
"Eulmore",
"Lakeland - Fort Jobb",
"Lakeland - Ostall Imperative",
"Kholusia - Stilltide",
"Kholusia - Wright",
"Kholusia - Tomra",
"Amh Araeng - Mord Souq",
"Amh Araeng - Inn at Journey's Head",
"Amh Araeng - Twine",
"Rak'tika - Slitherbough",
"Rak'tika - Fanow",
"Il Mheg - Lydha Lran",
"Il Mheg - Pla Enni",
"Il Mheg - Wolekdorf",
"Tempest - Ondo Cups",
"Tempest - Macarenses Angle",
"Old Sharlayan",
"Radz-at-Han",
"Labyrinthos - Archeion",
"Labyrinthos - Sharlayan Hamlet",
"Labyrinthos - Aporia",
"Thavnair - Yedlihmad",
"Thavnair - Great Work",
"Thavnair - Palaka's Stand",
"Garlemald - Camp Broken Glass",
"Garlemald - Tertium",
"Mare Lamentorum - Sinus Lacrimarum",
"Mare Lamentorum - Bestways Burrow",
"Elpis - Anagnorisis",
"Elpis - Twelve Wonders",
"Elpis - Poieten Oikos",
"Ultima Thule - Reah Tahra",
"Ultima Thule - Abode of the Ea",
"Ultima Thule - Base Omicron",
"Tuliyollal",
"Solution Nine",
"Urqopacha - Wachunpelo",
"Urqopacha - Worlar's Echo",
"Kozama'uka - Ok'hanu",
"Kozama'uka - Many Fires",
"Kozama'uka - Earthenshire",
"Kozama'uka - Dock Poga",
"Yak T'el - Iq Br'aax",
"Yak T'el - Mamook",
"Shaaloani - Hhusatahwi",
"Shaaloani - Sheshenewezi Springs",
"Shaaloani - Mehwahhetsoan",
"Heritage Found - Yyasulani Station",
"Heritage Found - The Outskirts",
"Heritage Found - Electrope Strike",
"Living Memory - Leynode Mnemo",
"Living Memory - Leynode Pyro",
"Living Memory - Leynode Aero"
]
},
"AethernetShard": {
"type": "string",
"enum": [
"[Gridania] Aetheryte Plaza",
"[Gridania] Archers' Guild",
"[Gridania] Leatherworkers' Guild & Shaded Bower",
"[Gridania] Lancers' Guild",
"[Gridania] Conjurers' Guild",
"[Gridania] Botanists' Guild",
"[Gridania] Mih Khetto's Amphitheatre",
"[Gridania] Blue Badger Gate (Central Shroud)",
"[Gridania] Yellow Serpent Gate (North Shroud)",
"[Gridania] White Wolf Gate (Central Shroud)",
"[Gridania] Airship Landing",
"[Ul'dah] Aetheryte Plaza",
"[Ul'dah] Adventurers' Guild",
"[Ul'dah] Thaumaturges' Guild",
"[Ul'dah] Gladiators' Guild",
"[Ul'dah] Miners' Guild",
"[Ul'dah] Weavers' Guild",
"[Ul'dah] Goldsmiths' Guild",
"[Ul'dah] Sapphire Avenue Exchange",
"[Ul'dah] Alchemists' Guild",
"[Ul'dah] Gate of the Sultana (Western Thanalan)",
"[Ul'dah] Gate of Nald (Central Thanalan)",
"[Ul'dah] Gate of Thal (Central Thanalan)",
"[Ul'dah] The Chamber of Rule",
"[Ul'dah] Airship Landing",
"[Limsa Lominsa] Aetheryte Plaza",
"[Limsa Lominsa] Arcanists' Guild",
"[Limsa Lominsa] Fishermens' Guild",
"[Limsa Lominsa] Hawkers' Alley",
"[Limsa Lominsa] The Aftcastle",
"[Limsa Lominsa] Culinarians' Guild",
"[Limsa Lominsa] Marauders' Guild",
"[Limsa Lominsa] Zephyr Gate (Middle La Noscea)",
"[Limsa Lominsa] Tempest Gate (Lower La Noscea)",
"[Limsa Lominsa] Airship Landing",
"[Gold Saucer] Aetheryte Plaza",
"[Gold Saucer] Entrance & Card Squares",
"[Gold Saucer] Wonder Square East",
"[Gold Saucer] Wonder Square West",
"[Gold Saucer] Event Square",
"[Gold Saucer] Cactpot Board",
"[Gold Saucer] Round Square",
"[Gold Saucer] Chocobo Square",
"[Gold Saucer] Minion Square",
"[Ishgard] Aetheryte Plaza",
"[Ishgard] The Forgotten Knight",
"[Ishgard] Skysteel Manufactory",
"[Ishgard] The Brume",
"[Ishgard] Athenaeum Astrologicum",
"[Ishgard] The Jeweled Crozier",
"[Ishgard] Saint Reymanaud's Cathedral",
"[Ishgard] The Tribunal",
"[Ishgard] The Last Vigil",
"[Ishgard] The Gates of Judgement (Coerthas Central Highlands)",
"[Ishgard] Firmament",
"[Firmament] The Mendicant's Court",
"[Firmament] The Mattock",
"[Firmament] The New Nest",
"[Firmament] Saint Roelle's Dais",
"[Firmament] Featherfall",
"[Firmament] Hoarfrost Hall",
"[Firmament] Western Risensong Quarter",
"[Firmament] Eastern Risensong Quarter",
"[Idyllshire] Aetheryte Plaza",
"[Idyllshire] West Idyllshire",
"[Idyllshire] Prologue Gate (Western Hinterlands)",
"[Idyllshire] Epilogue Gate (Eastern Hinterlands)",
"[Rhalgr's Reach] Aetheryte Plaza",
"[Rhalgr's Reach] Western Rhalgr's Reach",
"[Rhalgr's Reach] Northeastern Rhalgr's Reach",
"[Rhalgr's Reach] Fringes Gate",
"[Rhalgr's Reach] Peaks Gate",
"[Kugane] Aetheryte Plaza",
"[Kugane] Shiokaze Hostelry",
"[Kugane] Pier #1",
"[Kugane] Thavnairian Consulate",
"[Kugane] Kogane Dori Markets",
"[Kugane] Bokairo Inn",
"[Kugane] The Ruby Bazaar",
"[Kugane] Sekiseigumi Barracks",
"[Kugane] Rakuza District",
"[Kugane] The Ruby Price",
"[Kugane] Airship Landing",
"[Doman Enclave] Aetheryte Plaza",
"[Doman Enclave] The Northern Enclave",
"[Doman Enclave] The Southern Enclave",
"[Doman Enclave] Ferry Docks",
"[Doman Enclave] The One River",
"[Doman Enclave] Gangos",
"[Crystarium] Aetheryte Plaza",
"[Crystarium] Musica Universalis Markets",
"[Crystarium] Temenos Rookery",
"[Crystarium] The Dossal Gate",
"[Crystarium] The Pendants",
"[Crystarium] The Amaro Launch",
"[Crystarium] The Crystalline Mean",
"[Crystarium] The Cabinet of Curiosity",
"[Crystarium] Tessellation (Lakeland)",
"[Eulmore] Aetheryte Plaza",
"[Eulmore] Southeast Derelicts",
"[Eulmore] Nightsoil Pots",
"[Eulmore] The Glory Gate",
"[Eulmore] The Mainstay",
"[Eulmore] The Path to Glory (Kholusia)",
"[Old Sharlayan] Aetheryte Plaza",
"[Old Sharlayan] The Studium",
"[Old Sharlayan] The Baldesion Annex",
"[Old Sharlayan] The Rostra",
"[Old Sharlayan] The Leveilleur Estate",
"[Old Sharlayan] Journey's End",
"[Old Sharlayan] Scholar's Harbor",
"[Old Sharlayan] The Hall of Artifice (Labyrinthos)",
"[Radz-at-Han] Aetheryte Plaza",
"[Radz-at-Han] Meghaduta",
"[Radz-at-Han] Ruveydah Fibers",
"[Radz-at-Han] Airship Landing",
"[Radz-at-Han] Alzadaal's Peace",
"[Radz-at-Han] Hall of the Radiant Host",
"[Radz-at-Han] Mehryde's Meyhane",
"[Radz-at-Han] Kama",
"[Radz-at-Han] The High Crucible of Al-Kimiya",
"[Radz-at-Han] The Gate of First Sight (Thavnair)",
"[Tuliyollal] Aetheryte Plaza",
"[Tuliyollal] Dirigible Landing",
"[Tuliyollal] The Resplendent Quarter",
"[Tuliyollal] The For'ard Cabins",
"[Tuliyollal] Bayside Bevy Marketplace",
"[Tuliyollal] Vollok Shoonsa",
"[Tuliyollal] Wachumeqimeqi",
"[Tuliyollal] Brightploom Post",
"[Tuliyollal] Arch of the Dawn (Urqopacha)",
"[Tuliyollal] Arch of the Dawn (Kozama'uka)",
"[Tuliyollal] Ihuykatumu (Kozama'uka)",
"[Tuliyollal] Dirigible Landing (Yak T'el)",
"[Tuliyollal] Xak Tural Skygate (Shaaloani)",
"[Solution Nine] Aetheryte Plaza",
"[Solution Nine] Information Center",
"[Solution Nine] True Vue",
"[Solution Nine] Neon Stein",
"[Solution Nine] The Arcadion",
"[Solution Nine] Resolution",
"[Solution Nine] Nexus Arcade",
"[Solution Nine] Residential Sector",
"[Solution Nine] Scanning Port Nine (Heritage Found)"
]
},
"ClassJob": {
"type": "string",
"enum": [
"Gladiator",
"Pugilist",
"Marauder",
"Lancer",
"Archer",
"Conjurer",
"Thaumaturge",
"Carpenter",
"Blacksmith",
"Armorer",
"Goldsmith",
"Leatherworker",
"Weaver",
"Alchemist",
"Culinarian",
"Miner",
"Botanist",
"Fisher",
"Paladin",
"Monk",
"Warrior",
"Dragoon",
"Bard",
"White Mage",
"Black Mage",
"Arcanist",
"Summoner",
"Scholar",
"Rogue",
"Ninja",
"Machinist",
"Dark Knight",
"Astrologian",
"Samurai",
"Red Mage",
"Blue Mage",
"Gunbreaker",
"Dancer",
"Reaper",
"Sage",
"Viper",
"Pictomancer",
"DoW",
"DoM",
"DoH",
"DoL"
]
},
"CompletionFlags": {
"type": "array",
"description": "Quest Variables that dictate whether or not this step is skipped: null is don't check, positive values need to be set, negative values need to be unset",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"High": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 15
},
"Low": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 15
},
"Negative": {
"type": "boolean"
},
"Mode": {
"type": "string",
"enum": [
"Bitwise",
"Exact"
]
}
}
},
{
"type": "number",
"enum": [
1,
2,
4,
8,
16,
32,
64,
128
]
},
{
"type": "null"
}
]
},
"minItems": 6,
"maxItems": 6
}
}
}

View File

@ -0,0 +1,22 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "/liza/Questionable/raw/branch/master/Questionable.Model/common-vector3.json",
"type": "object",
"description": "Position in the world",
"properties": {
"X": {
"type": "number"
},
"Y": {
"type": "number"
},
"Z": {
"type": "number"
}
},
"required": [
"X",
"Y",
"Z"
]
}

View File

@ -17,8 +17,20 @@ internal sealed class JsonSchemaValidator : IQuestValidator
public JsonSchemaValidator() public JsonSchemaValidator()
{ {
SchemaRegistry.Global.Register( SchemaRegistry.Global.Register(
new Uri("https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json"), new Uri("https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-aethernetshard.json"),
JsonSchema.FromStream(AssemblyModelLoader.CommonSchema).AsTask().Result); JsonSchema.FromStream(AssemblyModelLoader.CommonAethernetShard).AsTask().Result);
SchemaRegistry.Global.Register(
new Uri("https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-aetheryte.json"),
JsonSchema.FromStream(AssemblyModelLoader.CommonAetheryte).AsTask().Result);
SchemaRegistry.Global.Register(
new Uri("https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-classjob.json"),
JsonSchema.FromStream(AssemblyModelLoader.CommonClassJob).AsTask().Result);
SchemaRegistry.Global.Register(
new Uri("https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-completionflags.json"),
JsonSchema.FromStream(AssemblyModelLoader.CommonCompletionFlags).AsTask().Result);
SchemaRegistry.Global.Register(
new Uri("https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-vector3.json"),
JsonSchema.FromStream(AssemblyModelLoader.CommonVector3).AsTask().Result);
} }
public IEnumerable<ValidationIssue> Validate(Quest quest) public IEnumerable<ValidationIssue> Validate(Quest quest)