1
0
forked from liza/Questionable

Schema update

This commit is contained in:
Liza 2024-08-02 18:30:21 +02:00
parent dd7152024a
commit ae87b4ccc5
Signed by: liza
GPG Key ID: 7199F8D727D55F67
111 changed files with 1211 additions and 500 deletions

View File

@ -0,0 +1,3 @@
<Project Sdk="Dalamud.NET.Sdk/10.0.0">
<Import Project="..\LLib\LLib.targets"/>
</Project>

View File

@ -0,0 +1,11 @@
using Dalamud.Plugin;
namespace GatheringPathRenderer;
public sealed class RendererPlugin : IDalamudPlugin
{
public void Dispose()
{
}
}

View File

@ -0,0 +1,81 @@
{
"version": 1,
"dependencies": {
"net8.0-windows7.0": {
"DalamudPackager": {
"type": "Direct",
"requested": "[2.1.13, )",
"resolved": "2.1.13",
"contentHash": "rMN1omGe8536f4xLMvx9NwfvpAc9YFFfeXJ1t4P4PE6Gu8WCIoFliR1sh07hM+bfODmesk/dvMbji7vNI+B/pQ=="
},
"DotNet.ReproducibleBuilds": {
"type": "Direct",
"requested": "[1.1.1, )",
"resolved": "1.1.1",
"contentHash": "+H2t/t34h6mhEoUvHi8yGXyuZ2GjSovcGYehJrS2MDm2XgmPfZL2Sdxg+uL2lKgZ4M6tTwKHIlxOob2bgh0NRQ==",
"dependencies": {
"Microsoft.SourceLink.AzureRepos.Git": "1.1.1",
"Microsoft.SourceLink.Bitbucket.Git": "1.1.1",
"Microsoft.SourceLink.GitHub": "1.1.1",
"Microsoft.SourceLink.GitLab": "1.1.1"
}
},
"Microsoft.SourceLink.Gitea": {
"type": "Direct",
"requested": "[8.0.0, )",
"resolved": "8.0.0",
"contentHash": "KOBodmDnlWGIqZt2hT47Q69TIoGhIApDVLCyyj9TT5ct8ju16AbHYcB4XeknoHX562wO1pMS/1DfBIZK+V+sxg==",
"dependencies": {
"Microsoft.Build.Tasks.Git": "8.0.0",
"Microsoft.SourceLink.Common": "8.0.0"
}
},
"Microsoft.Build.Tasks.Git": {
"type": "Transitive",
"resolved": "8.0.0",
"contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ=="
},
"Microsoft.SourceLink.AzureRepos.Git": {
"type": "Transitive",
"resolved": "1.1.1",
"contentHash": "qB5urvw9LO2bG3eVAkuL+2ughxz2rR7aYgm2iyrB8Rlk9cp2ndvGRCvehk3rNIhRuNtQaeKwctOl1KvWiklv5w==",
"dependencies": {
"Microsoft.Build.Tasks.Git": "1.1.1",
"Microsoft.SourceLink.Common": "1.1.1"
}
},
"Microsoft.SourceLink.Bitbucket.Git": {
"type": "Transitive",
"resolved": "1.1.1",
"contentHash": "cDzxXwlyWpLWaH0em4Idj0H3AmVo3L/6xRXKssYemx+7W52iNskj/SQ4FOmfCb8YQt39otTDNMveCZzYtMoucQ==",
"dependencies": {
"Microsoft.Build.Tasks.Git": "1.1.1",
"Microsoft.SourceLink.Common": "1.1.1"
}
},
"Microsoft.SourceLink.Common": {
"type": "Transitive",
"resolved": "8.0.0",
"contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
},
"Microsoft.SourceLink.GitHub": {
"type": "Transitive",
"resolved": "1.1.1",
"contentHash": "IaJGnOv/M7UQjRJks7B6p7pbPnOwisYGOIzqCz5ilGFTApZ3ktOR+6zJ12ZRPInulBmdAf1SrGdDG2MU8g6XTw==",
"dependencies": {
"Microsoft.Build.Tasks.Git": "1.1.1",
"Microsoft.SourceLink.Common": "1.1.1"
}
},
"Microsoft.SourceLink.GitLab": {
"type": "Transitive",
"resolved": "1.1.1",
"contentHash": "tvsg47DDLqqedlPeYVE2lmiTpND8F0hkrealQ5hYltSmvruy/Gr5nHAKSsjyw5L3NeM/HLMI5ORv7on/M4qyZw==",
"dependencies": {
"Microsoft.Build.Tasks.Git": "1.1.1",
"Microsoft.SourceLink.Common": "1.1.1"
}
}
}
}
}

View File

View File

@ -0,0 +1,56 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/GatheringPaths/gatheringlocation-v1.json",
"Author": "liza",
"TerritoryId": 957,
"AetheryteShortcut": "Thavnair - Great Work",
"Nodes": [
{
"DataId": 33918,
"Position": {
"X": -582.5132,
"Y": 40.54578,
"Z": -426.0171
}
},
{
"DataId": 33919,
"Position": {
"X": -578.2101,
"Y": 41.27147,
"Z": -447.6376
}
},
{
"DataId": 33920,
"Position": {
"X": -488.2276,
"Y": 34.71221,
"Z": -359.6945
}
},
{
"DataId": 33921,
"Position": {
"X": -498.8687,
"Y": 31.08014,
"Z": -351.9397
}
},
{
"DataId": 33922,
"Position": {
"X": -304.0609,
"Y": 68.76999,
"Z": -479.1875
}
},
{
"DataId": 33923,
"Position": {
"X": -293.6989,
"Y": 68.77935,
"Z": -484.2256
}
}
]
}

View File

View File

@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using Questionable.Model.Gathering;
namespace Questionable.GatheringPaths;
[SuppressMessage("ReSharper", "PartialTypeWithSinglePart", Justification = "Required for RELEASE")]
public static partial class AssemblyGatheringLocationLoader
{
private static Dictionary<ushort, GatheringRoot>? _locations;
public static IReadOnlyDictionary<ushort, GatheringRoot> GetLocations()
{
if (_locations == null)
{
_locations = [];
#if RELEASE
LoadLocations();
#endif
}
return _locations ?? throw new InvalidOperationException("quest data is not initialized");
}
public static Stream QuestSchema =>
typeof(AssemblyGatheringLocationLoader).Assembly.GetManifestResourceStream("Questionable.GatheringPaths.GatheringLocationSchema")!;
[SuppressMessage("ReSharper", "UnusedMember.Local")]
private static void AddLocation(ushort questId, GatheringRoot root) => _locations![questId] = root;
}

View File

@ -0,0 +1,43 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0-windows</TargetFramework>
<LangVersion>12</LangVersion>
<Nullable>enable</Nullable>
<RootNamespace>Questionable.GatheringPaths</RootNamespace>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
<DebugType>none</DebugType>
<PathMap Condition="$(SolutionDir) != ''">$(SolutionDir)=X:\</PathMap>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
<Platforms>x64</Platforms>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Questionable.Model\Questionable.Model.csproj" />
<ProjectReference Include="..\QuestPathGenerator\QuestPathGenerator.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
</ItemGroup>
<ItemGroup>
<None Remove="gatheringlocation-v1.json" />
<EmbeddedResource Include="gatheringlocation-v1.json">
<LogicalName>Questionable.GatheringPaths.GatheringLocationSchema</LogicalName>
</EmbeddedResource>
<AdditionalFiles Include="gatheringlocation-v1.json" />
<AdditionalFiles Include="..\Questionable.Model\common-schema.json" />
</ItemGroup>
<ItemGroup Condition="'$(Configuration)' == 'Release'">
<None Remove="2.x - A Realm Reborn" />
<None Remove="3.x - Heavensward" />
<None Remove="4.x - Stormblood" />
<None Remove="5.x - Shadowbringers" />
<None Remove="6.x - Endwalker" />
<None Remove="7.x - Dawntrail" />
<AdditionalFiles Include="2.x - A Realm Reborn\**\*.json" />
<AdditionalFiles Include="3.x - Heavensward\**\*.json" />
<AdditionalFiles Include="4.x - Stormblood\**\*.json" />
<AdditionalFiles Include="5.x - Shadowbringers\**\*.json" />
<AdditionalFiles Include="6.x - Endwalker\**\*.json" />
<AdditionalFiles Include="7.x - Dawntrail\**\*.json" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,98 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.carvel.li/liza/Questionable/raw/branch/master/GatheringPaths/gatheringlocation-v1.json",
"title": "Gathering Location V1",
"description": "A series of gathering locationsk",
"type": "object",
"properties": {
"$schema": {
"type": "string",
"const": "https://git.carvel.li/liza/Questionable/raw/branch/master/GatheringPaths/gatheringlocation-v1.json"
},
"Author": {
"description": "Author of the gathering location data",
"type": [
"string",
"array"
],
"items": {
"type": "string"
}
},
"TerritoryId": {
"type": "number"
},
"AetheryteShortcut": {
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte"
},
"Nodes": {
"type": "array",
"items": {
"type": "object",
"properties": {
"DataId": {
"type": "number",
"minimum": 30000,
"maximum": 50000
},
"Position": {
"$ref": "#/$defs/Vector3"
},
"MinimumAngle": {
"type": "number",
"minimum": -360,
"maximum": 360
},
"MaximumAngle": {
"type": "number",
"minimum": -360,
"maximum": 360
},
"MinimumDistance": {
"type": "number",
"minimum": 0
},
"MaximumDistance": {
"type": "number",
"exclusiveMinimum": 0
}
},
"required": [
"DataId",
"Position"
],
"additionalProperties": false
}
}
},
"required": [
"$schema",
"Author",
"TerritoryId",
"AetheryteShortcut",
"Nodes"
],
"additionalProperties": false,
"$defs": {
"Vector3": {
"type": "object",
"description": "Position to (typically) walk to",
"properties": {
"X": {
"type": "number"
},
"Y": {
"type": "number"
},
"Z": {
"type": "number"
}
},
"required": [
"X",
"Y",
"Z"
]
}
}
}

View File

@ -0,0 +1,26 @@
{
"version": 1,
"dependencies": {
"net8.0-windows7.0": {
"System.Text.Encodings.Web": {
"type": "Transitive",
"resolved": "8.0.0",
"contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ=="
},
"System.Text.Json": {
"type": "Transitive",
"resolved": "8.0.4",
"contentHash": "bAkhgDJ88XTsqczoxEMliSrpijKZHhbJQldhAmObj/RbrN3sU5dcokuXmWJWsdQAhiMJ9bTayWsL1C9fbbCRhw==",
"dependencies": {
"System.Text.Encodings.Web": "8.0.0"
}
},
"questionable.model": {
"type": "Project",
"dependencies": {
"System.Text.Json": "[8.0.4, )"
}
}
}
}
}

View File

@ -1,4 +1,4 @@
using Questionable.Model.V1; using Questionable.Model.Questing;
using Questionable.QuestPathGenerator; using Questionable.QuestPathGenerator;
using Xunit; using Xunit;

View File

@ -0,0 +1,163 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Linq;
using System.Text.Json;
using Json.Schema;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Questionable.Model.Gathering;
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
using static Questionable.QuestPathGenerator.RoslynShortcuts;
namespace Questionable.QuestPathGenerator;
[Generator]
[SuppressMessage("MicrosoftCodeAnalysisReleaseTracking", "RS2008")]
public class GatheringSourceGenerator : ISourceGenerator
{
private static readonly DiagnosticDescriptor InvalidJson = new("GPG0001",
"Invalid JSON",
"Invalid gathering file: {0}",
nameof(GatheringSourceGenerator),
DiagnosticSeverity.Error,
true);
public void Initialize(GeneratorInitializationContext context)
{
// No initialization required for this generator.
}
public void Execute(GeneratorExecutionContext context)
{
// Find schema definition
AdditionalText? gatheringSchema =
context.AdditionalFiles.SingleOrDefault(x => Path.GetFileName(x.Path) == "gatheringlocation-v1.json");
if (gatheringSchema != null)
GenerateGatheringSource(context, gatheringSchema);
}
private void GenerateGatheringSource(GeneratorExecutionContext context, AdditionalText jsonSchemaFile)
{
var gatheringSchema = JsonSchema.FromText(jsonSchemaFile.GetText()!.ToString());
List<(ushort, GatheringRoot)> gatheringLocations = [];
foreach (var (id, node) in Utils.GetAdditionalFiles(context, jsonSchemaFile, gatheringSchema, InvalidJson))
{
var gatheringLocation = node.Deserialize<GatheringRoot>()!;
gatheringLocations.Add((id, gatheringLocation));
}
if (gatheringLocations.Count == 0)
return;
var partitionedLocations = gatheringLocations
.OrderBy(x => x.Item1)
.GroupBy(x => $"LoadLocation{x.Item1 / 100}")
.ToList();
var methods = Utils.CreateMethods("LoadLocations", partitionedLocations, CreateInitializer);
var code =
CompilationUnit()
.WithUsings(
List(
new[]
{
UsingDirective(
IdentifierName("System")),
UsingDirective(
QualifiedName(
IdentifierName("System"),
IdentifierName("Numerics"))),
UsingDirective(
QualifiedName(
IdentifierName("System"),
IdentifierName("IO"))),
UsingDirective(
QualifiedName(
QualifiedName(
IdentifierName("System"), IdentifierName("Collections")),
IdentifierName("Generic"))),
UsingDirective(
QualifiedName(
QualifiedName(
IdentifierName("Questionable"),
IdentifierName("Model")),
IdentifierName("Gathering"))),
UsingDirective(
QualifiedName(
QualifiedName(
IdentifierName("Questionable"),
IdentifierName("Model")),
IdentifierName("Common")))
}))
.WithMembers(
SingletonList<MemberDeclarationSyntax>(
FileScopedNamespaceDeclaration(
QualifiedName(
IdentifierName("Questionable"),
IdentifierName("GatheringPaths")))
.WithMembers(
SingletonList<MemberDeclarationSyntax>(
ClassDeclaration("AssemblyGatheringLocationLoader")
.WithModifiers(
TokenList(Token(SyntaxKind.PartialKeyword)))
.WithMembers(List<MemberDeclarationSyntax>(methods))))))
.NormalizeWhitespace();
// Add the source code to the compilation.
context.AddSource("AssemblyGatheringLocationLoader.g.cs", code.ToFullString());
}
private static StatementSyntax[] CreateInitializer(List<(ushort QuestId, GatheringRoot Root)> quests)
{
List<StatementSyntax> statements = [];
foreach (var quest in quests)
{
statements.Add(
ExpressionStatement(
InvocationExpression(
IdentifierName("AddLocation"))
.WithArgumentList(
ArgumentList(
SeparatedList<ArgumentSyntax>(
new SyntaxNodeOrToken[]
{
Argument(
LiteralExpression(SyntaxKind.NumericLiteralExpression,
Literal(quest.QuestId))),
Token(SyntaxKind.CommaToken),
Argument(CreateGatheringRootExpression(quest.QuestId, quest.Root))
})))));
}
return statements.ToArray();
}
private static ObjectCreationExpressionSyntax CreateGatheringRootExpression(ushort locationId, GatheringRoot root)
{
try
{
return ObjectCreationExpression(
IdentifierName(nameof(GatheringRoot)))
.WithInitializer(
InitializerExpression(
SyntaxKind.ObjectInitializerExpression,
SeparatedList<ExpressionSyntax>(
SyntaxNodeList(
AssignmentList(nameof(GatheringRoot.Author), root.Author).AsSyntaxNodeOrToken(),
Assignment(nameof(GatheringRoot.TerritoryId), root.TerritoryId, default)
.AsSyntaxNodeOrToken(),
Assignment(nameof(GatheringRoot.AetheryteShortcut), root.AetheryteShortcut, null),
AssignmentList(nameof(GatheringRoot.Nodes), root.Nodes).AsSyntaxNodeOrToken()))));
}
catch (Exception e)
{
throw new Exception($"GatheringGen[{locationId}]: {e.Message}", e);
}
}
}

View File

@ -1,16 +1,14 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Nodes;
using Json.Schema; using Json.Schema;
using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.CSharp.Syntax;
using Questionable.Model.V1; using Questionable.Model.Questing;
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory; using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
using static Questionable.QuestPathGenerator.RoslynShortcuts; using static Questionable.QuestPathGenerator.RoslynShortcuts;
@ -38,47 +36,21 @@ public class QuestSourceGenerator : ISourceGenerator
public void Execute(GeneratorExecutionContext context) public void Execute(GeneratorExecutionContext context)
{ {
List<(ushort, QuestRoot)> quests = [];
// Find schema definition // Find schema definition
AdditionalText jsonSchemaFile = AdditionalText? questSchema =
context.AdditionalFiles.Single(x => Path.GetFileName(x.Path) == "quest-v1.json"); context.AdditionalFiles.SingleOrDefault(x => Path.GetFileName(x.Path) == "quest-v1.json");
if (questSchema != null)
GenerateQuestSource(context, questSchema);
}
private void GenerateQuestSource(GeneratorExecutionContext context, AdditionalText jsonSchemaFile)
{
var questSchema = JsonSchema.FromText(jsonSchemaFile.GetText()!.ToString()); var questSchema = JsonSchema.FromText(jsonSchemaFile.GetText()!.ToString());
// Go through all files marked as an Additional File in file properties. List<(ushort, QuestRoot)> quests = [];
foreach (var additionalFile in context.AdditionalFiles) foreach (var (id, node) in Utils.GetAdditionalFiles(context, jsonSchemaFile, questSchema, InvalidJson))
{ {
if (additionalFile == null || additionalFile == jsonSchemaFile) var quest = node.Deserialize<QuestRoot>()!;
continue;
if (Path.GetExtension(additionalFile.Path) != ".json")
continue;
string name = Path.GetFileName(additionalFile.Path);
if (!name.Contains('_'))
continue;
ushort id = ushort.Parse(name.Substring(0, name.IndexOf('_')));
var text = additionalFile.GetText();
if (text == null)
continue;
var questNode = JsonNode.Parse(text.ToString());
var evaluationResult = questSchema.Evaluate(questNode, new EvaluationOptions
{
Culture = CultureInfo.InvariantCulture,
OutputFormat = OutputFormat.List
});
if (!evaluationResult.IsValid)
{
var error = Diagnostic.Create(InvalidJson,
null,
Path.GetFileName(additionalFile.Path));
context.ReportDiagnostic(error);
}
var quest = questNode.Deserialize<QuestRoot>()!;
if (quest.Disabled) if (quest.Disabled)
{ {
quest.Author = []; quest.Author = [];
@ -97,38 +69,7 @@ public class QuestSourceGenerator : ISourceGenerator
.GroupBy(x => $"LoadQuests{x.Item1 / 50}") .GroupBy(x => $"LoadQuests{x.Item1 / 50}")
.ToList(); .ToList();
List<MethodDeclarationSyntax> methods = var methods = Utils.CreateMethods("LoadQuests", partitionedQuests, CreateInitializer);
[
MethodDeclaration(
PredefinedType(
Token(SyntaxKind.VoidKeyword)),
Identifier("LoadQuests"))
.WithModifiers(
TokenList(
Token(SyntaxKind.PrivateKeyword),
Token(SyntaxKind.StaticKeyword)))
.WithBody(
Block(
partitionedQuests
.Select(x =>
ExpressionStatement(
InvocationExpression(
IdentifierName(x.Key))))))
];
foreach (var partition in partitionedQuests)
{
methods.Add(MethodDeclaration(
PredefinedType(
Token(SyntaxKind.VoidKeyword)),
Identifier(partition.Key))
.WithModifiers(
TokenList(
Token(SyntaxKind.PrivateKeyword),
Token(SyntaxKind.StaticKeyword)))
.WithBody(
Block(CreateInitializer(partition.ToList()))));
}
var code = var code =
CompilationUnit() CompilationUnit()
@ -156,7 +97,13 @@ public class QuestSourceGenerator : ISourceGenerator
QualifiedName( QualifiedName(
IdentifierName("Questionable"), IdentifierName("Questionable"),
IdentifierName("Model")), IdentifierName("Model")),
IdentifierName("V1"))) IdentifierName("Questing"))),
UsingDirective(
QualifiedName(
QualifiedName(
IdentifierName("Questionable"),
IdentifierName("Model")),
IdentifierName("Common")))
})) }))
.WithMembers( .WithMembers(
SingletonList<MemberDeclarationSyntax>( SingletonList<MemberDeclarationSyntax>(

View File

@ -6,7 +6,9 @@ using System.Numerics;
using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.CSharp.Syntax;
using Questionable.Model.V1; using Questionable.Model.Common;
using Questionable.Model.Gathering;
using Questionable.Model.Questing;
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory; using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
namespace Questionable.QuestPathGenerator; namespace Questionable.QuestPathGenerator;
@ -312,6 +314,32 @@ public static class RoslynShortcuts
Assignment(nameof(SkipAetheryteCondition.InSameTerritory), Assignment(nameof(SkipAetheryteCondition.InSameTerritory),
skipAetheryteCondition.InSameTerritory, emptyAetheryte.InSameTerritory))))); skipAetheryteCondition.InSameTerritory, emptyAetheryte.InSameTerritory)))));
} }
else if (value is GatheringNodeLocation nodeLocation)
{
var emptyLocation = new GatheringNodeLocation();
return ObjectCreationExpression(
IdentifierName(nameof(GatheringNodeLocation)))
.WithInitializer(
InitializerExpression(
SyntaxKind.ObjectInitializerExpression,
SeparatedList<ExpressionSyntax>(
SyntaxNodeList(
Assignment(nameof(GatheringNodeLocation.DataId), nodeLocation.DataId,
emptyLocation.DataId)
.AsSyntaxNodeOrToken(),
Assignment(nameof(GatheringNodeLocation.Position), nodeLocation.Position,
emptyLocation.Position).AsSyntaxNodeOrToken(),
Assignment(nameof(GatheringNodeLocation.MinimumAngle), nodeLocation.MinimumAngle,
emptyLocation.MinimumAngle).AsSyntaxNodeOrToken(),
Assignment(nameof(GatheringNodeLocation.MaximumAngle), nodeLocation.MaximumAngle,
emptyLocation.MaximumAngle).AsSyntaxNodeOrToken(),
Assignment(nameof(GatheringNodeLocation.MinimumDistance),
nodeLocation.MinimumDistance, emptyLocation.MinimumDistance)
.AsSyntaxNodeOrToken(),
Assignment(nameof(GatheringNodeLocation.MaximumDistance),
nodeLocation.MaximumDistance, emptyLocation.MaximumDistance)
.AsSyntaxNodeOrToken()))));
}
else if (value is null) else if (value is null)
return LiteralExpression(SyntaxKind.NullLiteralExpression); return LiteralExpression(SyntaxKind.NullLiteralExpression);
} }

109
QuestPathGenerator/Utils.cs Normal file
View File

@ -0,0 +1,109 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text.Json.Nodes;
using Json.Schema;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
namespace Questionable.QuestPathGenerator;
public static class Utils
{
public static IEnumerable<(ushort, JsonNode)> GetAdditionalFiles(GeneratorExecutionContext context,
AdditionalText jsonSchemaFile, JsonSchema jsonSchema, DiagnosticDescriptor invalidJson)
{
var commonSchemaFile = context.AdditionalFiles.Single(x => Path.GetFileName(x.Path) == "common-schema.json");
List<AdditionalText> jsonSchemaFiles = [jsonSchemaFile, commonSchemaFile];
SchemaRegistry.Global.Register(
new Uri("https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json"),
JsonSchema.FromText(commonSchemaFile.GetText()!.ToString()));
foreach (var additionalFile in context.AdditionalFiles)
{
if (additionalFile == null || jsonSchemaFiles.Contains(additionalFile))
continue;
if (Path.GetExtension(additionalFile.Path) != ".json")
continue;
string name = Path.GetFileName(additionalFile.Path);
if (!name.Contains("_"))
continue;
ushort id = ushort.Parse(name.Substring(0, name.IndexOf('_')));
var text = additionalFile.GetText();
if (text == null)
continue;
var node = JsonNode.Parse(text.ToString());
if (node == null)
continue;
string? schemaLocation = node["$schema"]?.GetValue<string?>();
if (schemaLocation == null || new Uri(schemaLocation) != jsonSchema.GetId())
continue;
var evaluationResult = jsonSchema.Evaluate(node, new EvaluationOptions
{
Culture = CultureInfo.InvariantCulture,
OutputFormat = OutputFormat.List,
});
if (!evaluationResult.IsValid)
{
var error = Diagnostic.Create(invalidJson,
null,
Path.GetFileName(additionalFile.Path));
context.ReportDiagnostic(error);
}
yield return (id, node);
}
}
public static List<MethodDeclarationSyntax> CreateMethods<T>(string prefix,
List<IGrouping<string, (ushort, T)>> partitions,
Func<List<(ushort, T)>, StatementSyntax[]> toInitializers)
{
List<MethodDeclarationSyntax> methods =
[
MethodDeclaration(
PredefinedType(
Token(SyntaxKind.VoidKeyword)),
Identifier(prefix))
.WithModifiers(
TokenList(
Token(SyntaxKind.PrivateKeyword),
Token(SyntaxKind.StaticKeyword)))
.WithBody(
Block(
partitions
.Select(x =>
ExpressionStatement(
InvocationExpression(
IdentifierName(x.Key))))))
];
foreach (var partition in partitions)
{
methods.Add(MethodDeclaration(
PredefinedType(
Token(SyntaxKind.VoidKeyword)),
Identifier(partition.Key))
.WithModifiers(
TokenList(
Token(SyntaxKind.PrivateKeyword),
Token(SyntaxKind.StaticKeyword)))
.WithBody(
Block(toInitializers(partition.ToList()))));
}
return methods;
}
}

View File

@ -2,8 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.IO; using System.IO;
using System.Reflection; using Questionable.Model.Questing;
using Questionable.Model.V1;
namespace Questionable.QuestPaths; namespace Questionable.QuestPaths;

View File

@ -23,6 +23,7 @@
<LogicalName>Questionable.QuestPaths.QuestSchema</LogicalName> <LogicalName>Questionable.QuestPaths.QuestSchema</LogicalName>
</EmbeddedResource> </EmbeddedResource>
<AdditionalFiles Include="quest-v1.json" /> <AdditionalFiles Include="quest-v1.json" />
<AdditionalFiles Include="..\Questionable.Model\common-schema.json" />
</ItemGroup> </ItemGroup>
<ItemGroup Condition="'$(Configuration)' == 'Release'"> <ItemGroup Condition="'$(Configuration)' == 'Release'">

View File

@ -154,7 +154,7 @@
}, },
"AetheryteShortcut": { "AetheryteShortcut": {
"description": "The Aetheryte to teleport to (before moving)", "description": "The Aetheryte to teleport to (before moving)",
"$ref": "#/$defs/Aetheryte" "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte"
}, },
"AethernetShortcut": { "AethernetShortcut": {
"type": "array", "type": "array",
@ -162,7 +162,7 @@
"minItems": 2, "minItems": 2,
"maxItems": 2, "maxItems": 2,
"items": { "items": {
"$ref": "#/$defs/AethernetShard" "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/AethernetShard"
} }
}, },
"ItemId": { "ItemId": {
@ -183,7 +183,7 @@
"type": "boolean" "type": "boolean"
}, },
"CompletionQuestVariablesFlags": { "CompletionQuestVariablesFlags": {
"$ref": "#/$defs/CompletionFlags" "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/CompletionFlags"
}, },
"Flying": { "Flying": {
"type": "string", "type": "string",
@ -271,7 +271,7 @@
"additionalProperties": false "additionalProperties": false
}, },
"CompletionQuestVariablesFlags": { "CompletionQuestVariablesFlags": {
"$ref": "#/$defs/CompletionFlags" "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/CompletionFlags"
}, },
"RequiredQuestVariables": { "RequiredQuestVariables": {
"type": "array", "type": "array",
@ -383,7 +383,7 @@
"then": { "then": {
"properties": { "properties": {
"Aetheryte": { "Aetheryte": {
"$ref": "#/$defs/Aetheryte" "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte"
}, },
"DataId": { "DataId": {
"type": "null" "type": "null"
@ -415,7 +415,7 @@
"then": { "then": {
"properties": { "properties": {
"AethernetShard": { "AethernetShard": {
"$ref": "#/$defs/AethernetShard" "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/AethernetShard"
}, },
"DataId": { "DataId": {
"type": "null" "type": "null"
@ -507,7 +507,7 @@
"type": "integer" "type": "integer"
}, },
"CompletionQuestVariablesFlags": { "CompletionQuestVariablesFlags": {
"$ref": "#/$defs/CompletionFlags" "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/CompletionFlags"
}, },
"IgnoreQuestMarker": { "IgnoreQuestMarker": {
"type": "boolean" "type": "boolean"
@ -1073,300 +1073,5 @@
"QuestSequence", "QuestSequence",
"Author" "Author"
], ],
"additionalProperties": false, "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 (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",
"[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",
"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,9 @@
using System.IO;
namespace Questionable.Model;
public static class AssemblyModelLoader
{
public static Stream CommonSchema =>
typeof(AssemblyModelLoader).Assembly.GetManifestResourceStream("Questionable.Model.CommonSchema")!;
}

View File

@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using Questionable.Model.Common.Converter;
namespace Questionable.Model.V1.Converter; namespace Questionable.Model.Common.Converter;
public sealed class AetheryteConverter() : EnumConverter<EAetheryteLocation>(Values) public sealed class AetheryteConverter() : EnumConverter<EAetheryteLocation>(Values)
{ {

View File

@ -5,7 +5,7 @@ using System.Linq;
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
namespace Questionable.Model.V1.Converter; namespace Questionable.Model.Common.Converter;
public abstract class EnumConverter<T> : JsonConverter<T> public abstract class EnumConverter<T> : JsonConverter<T>
where T : Enum where T : Enum

View File

@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
namespace Questionable.Model.V1.Converter; namespace Questionable.Model.Common.Converter;
public sealed class StringListOrValueConverter : JsonConverter<List<string>> public sealed class StringListOrValueConverter : JsonConverter<List<string>>
{ {

View File

@ -3,7 +3,7 @@ using System.Numerics;
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
namespace Questionable.Model.V1.Converter; namespace Questionable.Model.Common.Converter;
public sealed class VectorConverter : JsonConverter<Vector3> public sealed class VectorConverter : JsonConverter<Vector3>
{ {

View File

@ -1,7 +1,8 @@
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using Questionable.Model.V1.Converter; using Questionable.Model.Common.Converter;
using Questionable.Model.Questing.Converter;
namespace Questionable.Model.V1; namespace Questionable.Model.Common;
[JsonConverter(typeof(AetheryteConverter))] [JsonConverter(typeof(AetheryteConverter))]
public enum EAetheryteLocation public enum EAetheryteLocation

View File

@ -0,0 +1,13 @@
using System.Numerics;
namespace Questionable.Model.Gathering;
public sealed class GatheringNodeLocation
{
public uint DataId { get; set; }
public Vector3 Position { get; set; }
public float? MinimumAngle { get; set; }
public float? MaximumAngle { get; set; }
public float? MinimumDistance { get; set; } = 0.5f;
public float? MaximumDistance { get; set; } = 3f;
}

View File

@ -0,0 +1,18 @@
using System.Collections.Generic;
using System.Text.Json.Serialization;
using Questionable.Model.Common;
using Questionable.Model.Common.Converter;
namespace Questionable.Model.Gathering;
public sealed class GatheringRoot
{
[JsonConverter(typeof(StringListOrValueConverter))]
public List<string> Author { get; set; } = [];
public ushort TerritoryId { get; set; }
[JsonConverter(typeof(AetheryteConverter))]
public EAetheryteLocation? AetheryteShortcut { get; set; }
public List<GatheringNodeLocation> Nodes { get; set; } = [];
}

View File

@ -1,7 +1,8 @@
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using Questionable.Model.V1.Converter; using Questionable.Model.Common;
using Questionable.Model.Questing.Converter;
namespace Questionable.Model.V1; namespace Questionable.Model.Questing;
[JsonConverter(typeof(AethernetShortcutConverter))] [JsonConverter(typeof(AethernetShortcutConverter))]
public sealed class AethernetShortcut public sealed class AethernetShortcut

View File

@ -1,4 +1,4 @@
namespace Questionable.Model.V1; namespace Questionable.Model.Questing;
public sealed class ChatMessage public sealed class ChatMessage
{ {

View File

@ -1,6 +1,6 @@
using System.Collections.Generic; using System.Collections.Generic;
namespace Questionable.Model.V1; namespace Questionable.Model.Questing;
public sealed class ComplexCombatData public sealed class ComplexCombatData
{ {

View File

@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using Questionable.Model.Common.Converter;
namespace Questionable.Model.V1.Converter; namespace Questionable.Model.Questing.Converter;
public sealed class ActionConverter() : EnumConverter<EAction>(Values) public sealed class ActionConverter() : EnumConverter<EAction>(Values)
{ {

View File

@ -1,6 +1,8 @@
using System.Collections.Generic; using System.Collections.Generic;
using Questionable.Model.Common;
using Questionable.Model.Common.Converter;
namespace Questionable.Model.V1.Converter; namespace Questionable.Model.Questing.Converter;
public sealed class AethernetShardConverter() : EnumConverter<EAetheryteLocation>(Values) public sealed class AethernetShardConverter() : EnumConverter<EAetheryteLocation>(Values)
{ {

View File

@ -3,8 +3,9 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using Questionable.Model.Common;
namespace Questionable.Model.V1.Converter; namespace Questionable.Model.Questing.Converter;
public sealed class AethernetShortcutConverter : JsonConverter<AethernetShortcut> public sealed class AethernetShortcutConverter : JsonConverter<AethernetShortcut>
{ {

View File

@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using Questionable.Model.Common.Converter;
namespace Questionable.Model.V1.Converter; namespace Questionable.Model.Questing.Converter;
public sealed class DialogueChoiceTypeConverter() : EnumConverter<EDialogChoiceType>(Values) public sealed class DialogueChoiceTypeConverter() : EnumConverter<EDialogChoiceType>(Values)
{ {

View File

@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using Questionable.Model.Common.Converter;
namespace Questionable.Model.V1.Converter; namespace Questionable.Model.Questing.Converter;
public sealed class EmoteConverter() : EnumConverter<EEmote>(Values) public sealed class EmoteConverter() : EnumConverter<EEmote>(Values)
{ {

View File

@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using Questionable.Model.Common.Converter;
namespace Questionable.Model.V1.Converter; namespace Questionable.Model.Questing.Converter;
public sealed class EnemySpawnTypeConverter() : EnumConverter<EEnemySpawnType>(Values) public sealed class EnemySpawnTypeConverter() : EnumConverter<EEnemySpawnType>(Values)
{ {

View File

@ -2,7 +2,7 @@
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
namespace Questionable.Model.V1.Converter; namespace Questionable.Model.Questing.Converter;
public sealed class ExcelRefConverter : JsonConverter<ExcelRef> public sealed class ExcelRefConverter : JsonConverter<ExcelRef>
{ {

View File

@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using Questionable.Model.Common.Converter;
namespace Questionable.Model.V1.Converter; namespace Questionable.Model.Questing.Converter;
public sealed class InteractionTypeConverter() : EnumConverter<EInteractionType>(Values) public sealed class InteractionTypeConverter() : EnumConverter<EInteractionType>(Values)
{ {

View File

@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using Questionable.Model.Common.Converter;
namespace Questionable.Model.V1.Converter; namespace Questionable.Model.Questing.Converter;
public sealed class JumpTypeConverter() : EnumConverter<EJumpType>(Values) public sealed class JumpTypeConverter() : EnumConverter<EJumpType>(Values)
{ {

View File

@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using Questionable.Model.Common.Converter;
namespace Questionable.Model.V1.Converter; namespace Questionable.Model.Questing.Converter;
public sealed class LockedSkipConditionConverter() : EnumConverter<ELockedSkipCondition>(Values) public sealed class LockedSkipConditionConverter() : EnumConverter<ELockedSkipCondition>(Values)
{ {

View File

@ -2,7 +2,7 @@
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
namespace Questionable.Model.V1.Converter; namespace Questionable.Model.Questing.Converter;
public sealed class QuestWorkConfigConverter : JsonConverter<QuestWorkValue> public sealed class QuestWorkConfigConverter : JsonConverter<QuestWorkValue>
{ {

View File

@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using Questionable.Model.Common.Converter;
namespace Questionable.Model.V1.Converter; namespace Questionable.Model.Questing.Converter;
public sealed class QuestWorkModeConverter() : EnumConverter<EQuestWorkMode>(Values) public sealed class QuestWorkModeConverter() : EnumConverter<EQuestWorkMode>(Values)
{ {

View File

@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using Questionable.Model.Common.Converter;
namespace Questionable.Model.V1.Converter; namespace Questionable.Model.Questing.Converter;
public sealed class SkipConditionConverter() : EnumConverter<EExtraSkipCondition>(Values) public sealed class SkipConditionConverter() : EnumConverter<EExtraSkipCondition>(Values)
{ {

View File

@ -1,7 +1,7 @@
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using Questionable.Model.V1.Converter; using Questionable.Model.Questing.Converter;
namespace Questionable.Model.V1; namespace Questionable.Model.Questing;
public sealed class DialogueChoice public sealed class DialogueChoice
{ {

View File

@ -1,7 +1,7 @@
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using Questionable.Model.V1.Converter; using Questionable.Model.Questing.Converter;
namespace Questionable.Model.V1; namespace Questionable.Model.Questing;
[JsonConverter(typeof(ActionConverter))] [JsonConverter(typeof(ActionConverter))]
public enum EAction public enum EAction

View File

@ -1,4 +1,4 @@
namespace Questionable.Model.V1; namespace Questionable.Model.Questing;
public enum EDialogChoiceType public enum EDialogChoiceType
{ {

View File

@ -1,7 +1,7 @@
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using Questionable.Model.V1.Converter; using Questionable.Model.Questing.Converter;
namespace Questionable.Model.V1; namespace Questionable.Model.Questing;
[JsonConverter(typeof(EmoteConverter))] [JsonConverter(typeof(EmoteConverter))]
public enum EEmote public enum EEmote

View File

@ -1,7 +1,7 @@
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using Questionable.Model.V1.Converter; using Questionable.Model.Questing.Converter;
namespace Questionable.Model.V1; namespace Questionable.Model.Questing;
[JsonConverter(typeof(EnemySpawnTypeConverter))] [JsonConverter(typeof(EnemySpawnTypeConverter))]
public enum EEnemySpawnType public enum EEnemySpawnType

View File

@ -1,7 +1,7 @@
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using Questionable.Model.V1.Converter; using Questionable.Model.Questing.Converter;
namespace Questionable.Model.V1; namespace Questionable.Model.Questing;
[JsonConverter(typeof(SkipConditionConverter))] [JsonConverter(typeof(SkipConditionConverter))]
public enum EExtraSkipCondition public enum EExtraSkipCondition

View File

@ -1,7 +1,7 @@
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using Questionable.Model.V1.Converter; using Questionable.Model.Questing.Converter;
namespace Questionable.Model.V1; namespace Questionable.Model.Questing;
[JsonConverter(typeof(InteractionTypeConverter))] [JsonConverter(typeof(InteractionTypeConverter))]
public enum EInteractionType public enum EInteractionType

View File

@ -1,7 +1,7 @@
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using Questionable.Model.V1.Converter; using Questionable.Model.Questing.Converter;
namespace Questionable.Model.V1; namespace Questionable.Model.Questing;
[JsonConverter(typeof(JumpTypeConverter))] [JsonConverter(typeof(JumpTypeConverter))]
public enum EJumpType public enum EJumpType

View File

@ -1,7 +1,7 @@
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using Questionable.Model.V1.Converter; using Questionable.Model.Questing.Converter;
namespace Questionable.Model.V1; namespace Questionable.Model.Questing;
[JsonConverter(typeof(LockedSkipConditionConverter))] [JsonConverter(typeof(LockedSkipConditionConverter))]
public enum ELockedSkipCondition public enum ELockedSkipCondition

View File

@ -1,7 +1,7 @@
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using Questionable.Model.V1.Converter; using Questionable.Model.Questing.Converter;
namespace Questionable.Model.V1; namespace Questionable.Model.Questing;
[JsonConverter(typeof(QuestWorkModeConverter))] [JsonConverter(typeof(QuestWorkModeConverter))]
public enum EQuestWorkMode public enum EQuestWorkMode

View File

@ -1,6 +1,6 @@
using System; using System;
namespace Questionable.Model.V1; namespace Questionable.Model.Questing;
public class ExcelRef public class ExcelRef
{ {

View File

@ -1,8 +1,9 @@
using System.Numerics; using System.Numerics;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using Questionable.Model.V1.Converter; using Questionable.Model.Common.Converter;
using Questionable.Model.Questing.Converter;
namespace Questionable.Model.V1; namespace Questionable.Model.Questing;
public sealed class JumpDestination public sealed class JumpDestination
{ {

View File

@ -1,8 +1,9 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using Questionable.Model.V1.Converter; using Questionable.Model.Common.Converter;
using Questionable.Model.Questing.Converter;
namespace Questionable.Model.V1; namespace Questionable.Model.Questing;
public sealed class QuestRoot public sealed class QuestRoot
{ {

View File

@ -1,7 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
namespace Questionable.Model.V1; namespace Questionable.Model.Questing;
public sealed class QuestSequence public sealed class QuestSequence
{ {

View File

@ -1,9 +1,11 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Numerics; using System.Numerics;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using Questionable.Model.V1.Converter; using Questionable.Model.Common;
using Questionable.Model.Common.Converter;
using Questionable.Model.Questing.Converter;
namespace Questionable.Model.V1; namespace Questionable.Model.Questing;
public sealed class QuestStep public sealed class QuestStep
{ {

View File

@ -1,8 +1,8 @@
using System; using System;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using Questionable.Model.V1.Converter; using Questionable.Model.Questing.Converter;
namespace Questionable.Model.V1; namespace Questionable.Model.Questing;
[JsonConverter(typeof(QuestWorkConfigConverter))] [JsonConverter(typeof(QuestWorkConfigConverter))]
public sealed class QuestWorkValue(byte? high, byte? low, EQuestWorkMode mode) public sealed class QuestWorkValue(byte? high, byte? low, EQuestWorkMode mode)

View File

@ -1,4 +1,4 @@
namespace Questionable.Model.V1; namespace Questionable.Model.Questing;
public sealed class SkipAetheryteCondition public sealed class SkipAetheryteCondition
{ {

View File

@ -1,4 +1,4 @@
namespace Questionable.Model.V1; namespace Questionable.Model.Questing;
public sealed class SkipConditions public sealed class SkipConditions
{ {

View File

@ -1,4 +1,4 @@
namespace Questionable.Model.V1; namespace Questionable.Model.Questing;
public sealed class SkipItemConditions public sealed class SkipItemConditions
{ {

View File

@ -1,7 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
namespace Questionable.Model.V1; namespace Questionable.Model.Questing;
public sealed class SkipStepConditions public sealed class SkipStepConditions
{ {

View File

@ -13,4 +13,12 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="System.Text.Json" Version="8.0.4" /> <PackageReference Include="System.Text.Json" Version="8.0.4" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<None Remove="common-schema.json" />
<EmbeddedResource Include="common-schema.json">
<LogicalName>Questionable.Model.CommonSchema</LogicalName>
</EmbeddedResource>
</ItemGroup>
</Project> </Project>

View File

@ -0,0 +1,299 @@
{
"$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": {
"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 (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",
"[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",
"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

@ -15,6 +15,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Questionable.Model", "Quest
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "QuestPathGenerator.Tests", "QuestPathGenerator.Tests\QuestPathGenerator.Tests.csproj", "{4FD6F346-8961-4BD5-BDA2-E5F426DE4FC7}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "QuestPathGenerator.Tests", "QuestPathGenerator.Tests\QuestPathGenerator.Tests.csproj", "{4FD6F346-8961-4BD5-BDA2-E5F426DE4FC7}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GatheringPaths", "GatheringPaths\GatheringPaths.csproj", "{8BF98BEF-6F00-4197-91ED-75F8F1C35FFB}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GatheringPathRenderer", "GatheringPathRenderer\GatheringPathRenderer.csproj", "{F514DA95-9867-4F3F-8062-ACE0C62E8740}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64 Debug|x64 = Debug|x64
@ -45,6 +49,14 @@ Global
{C91EEF13-A1AC-4A40-B695-DD4E378E5989}.Debug|x64.Build.0 = Debug|x64 {C91EEF13-A1AC-4A40-B695-DD4E378E5989}.Debug|x64.Build.0 = Debug|x64
{C91EEF13-A1AC-4A40-B695-DD4E378E5989}.Release|x64.ActiveCfg = Release|x64 {C91EEF13-A1AC-4A40-B695-DD4E378E5989}.Release|x64.ActiveCfg = Release|x64
{C91EEF13-A1AC-4A40-B695-DD4E378E5989}.Release|x64.Build.0 = Release|x64 {C91EEF13-A1AC-4A40-B695-DD4E378E5989}.Release|x64.Build.0 = Release|x64
{8BF98BEF-6F00-4197-91ED-75F8F1C35FFB}.Debug|x64.ActiveCfg = Debug|Any CPU
{8BF98BEF-6F00-4197-91ED-75F8F1C35FFB}.Debug|x64.Build.0 = Debug|Any CPU
{8BF98BEF-6F00-4197-91ED-75F8F1C35FFB}.Release|x64.ActiveCfg = Release|Any CPU
{8BF98BEF-6F00-4197-91ED-75F8F1C35FFB}.Release|x64.Build.0 = Release|Any CPU
{F514DA95-9867-4F3F-8062-ACE0C62E8740}.Debug|x64.ActiveCfg = Debug|Any CPU
{F514DA95-9867-4F3F-8062-ACE0C62E8740}.Debug|x64.Build.0 = Debug|Any CPU
{F514DA95-9867-4F3F-8062-ACE0C62E8740}.Release|x64.ActiveCfg = Release|Any CPU
{F514DA95-9867-4F3F-8062-ACE0C62E8740}.Release|x64.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View File

@ -14,7 +14,7 @@ using FFXIVClientStructs.FFXIV.Client.System.Memory;
using FFXIVClientStructs.FFXIV.Client.System.String; using FFXIVClientStructs.FFXIV.Client.System.String;
using Lumina.Excel.GeneratedSheets; using Lumina.Excel.GeneratedSheets;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Questionable.Model.V1; using Questionable.Model.Questing;
namespace Questionable; namespace Questionable;

View File

@ -14,7 +14,7 @@ using FFXIVClientStructs.FFXIV.Common.Math;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Questionable.Controller.CombatModules; using Questionable.Controller.CombatModules;
using Questionable.Controller.Utils; using Questionable.Controller.Utils;
using Questionable.Model.V1; using Questionable.Model.Questing;
namespace Questionable.Controller; namespace Questionable.Controller;

View File

@ -14,7 +14,7 @@ using LLib.GameUI;
using Lumina.Excel.GeneratedSheets; using Lumina.Excel.GeneratedSheets;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Questionable.Data; using Questionable.Data;
using Questionable.Model.V1; using Questionable.Model.Questing;
using Quest = Questionable.Model.Quest; using Quest = Questionable.Model.Quest;
using ValueType = FFXIVClientStructs.FFXIV.Component.GUI.ValueType; using ValueType = FFXIVClientStructs.FFXIV.Component.GUI.ValueType;

View File

@ -18,8 +18,10 @@ using Microsoft.Extensions.Logging;
using Questionable.Controller.NavigationOverrides; using Questionable.Controller.NavigationOverrides;
using Questionable.External; using Questionable.External;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.V1; using Questionable.Model.Common;
using Questionable.Model.V1.Converter; using Questionable.Model.Common.Converter;
using Questionable.Model.Questing;
using Questionable.Model.Questing.Converter;
namespace Questionable.Controller; namespace Questionable.Controller;

View File

@ -10,7 +10,7 @@ using Questionable.Controller.Steps;
using Questionable.Controller.Steps.Shared; using Questionable.Controller.Steps.Shared;
using Questionable.External; using Questionable.External;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.V1; using Questionable.Model.Questing;
namespace Questionable.Controller; namespace Questionable.Controller;

View File

@ -11,7 +11,7 @@ using Dalamud.Plugin;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Questionable.Data; using Questionable.Data;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.V1; using Questionable.Model.Questing;
using Questionable.QuestPaths; using Questionable.QuestPaths;
using Questionable.Validation; using Questionable.Validation;
using Questionable.Validation.Validators; using Questionable.Validation.Validators;

View File

@ -2,7 +2,7 @@
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.V1; using Questionable.Model.Questing;
namespace Questionable.Controller.Steps.Common; namespace Questionable.Controller.Steps.Common;

View File

@ -1,6 +1,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.V1; using Questionable.Model.Questing;
namespace Questionable.Controller.Steps; namespace Questionable.Controller.Steps;

View File

@ -7,7 +7,7 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Questionable.Controller.Steps.Common; using Questionable.Controller.Steps.Common;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.V1; using Questionable.Model.Questing;
namespace Questionable.Controller.Steps.Interactions; namespace Questionable.Controller.Steps.Interactions;

View File

@ -4,7 +4,7 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Questionable.Data; using Questionable.Data;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.V1; using Questionable.Model.Questing;
namespace Questionable.Controller.Steps.Interactions; namespace Questionable.Controller.Steps.Interactions;

View File

@ -1,9 +1,9 @@
using System; using System;
using FFXIVClientStructs.FFXIV.Client.Game.Object;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.V1; using Questionable.Model.Common;
using Questionable.Model.Questing;
using ObjectKind = Dalamud.Game.ClientState.Objects.Enums.ObjectKind; using ObjectKind = Dalamud.Game.ClientState.Objects.Enums.ObjectKind;
namespace Questionable.Controller.Steps.Interactions; namespace Questionable.Controller.Steps.Interactions;

View File

@ -2,7 +2,8 @@
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.V1; using Questionable.Model.Common;
using Questionable.Model.Questing;
namespace Questionable.Controller.Steps.Interactions; namespace Questionable.Controller.Steps.Interactions;

View File

@ -6,7 +6,7 @@ using Questionable.Controller.Steps.Common;
using Questionable.Controller.Steps.Shared; using Questionable.Controller.Steps.Shared;
using Questionable.Controller.Utils; using Questionable.Controller.Utils;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.V1; using Questionable.Model.Questing;
namespace Questionable.Controller.Steps.Interactions; namespace Questionable.Controller.Steps.Interactions;

View File

@ -12,7 +12,7 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Questionable.Controller.Steps.Common; using Questionable.Controller.Steps.Common;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.V1; using Questionable.Model.Questing;
namespace Questionable.Controller.Steps.Interactions; namespace Questionable.Controller.Steps.Interactions;

View File

@ -3,7 +3,7 @@ using Dalamud.Game.ClientState.Conditions;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.V1; using Questionable.Model.Questing;
namespace Questionable.Controller.Steps.Interactions; namespace Questionable.Controller.Steps.Interactions;

View File

@ -3,7 +3,7 @@ using System.Collections.Generic;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Questionable.Controller.Steps.Common; using Questionable.Controller.Steps.Common;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.V1; using Questionable.Model.Questing;
namespace Questionable.Controller.Steps.Interactions; namespace Questionable.Controller.Steps.Interactions;

View File

@ -6,7 +6,7 @@ using FFXIVClientStructs.FFXIV.Client.Game;
using Lumina.Excel.GeneratedSheets; using Lumina.Excel.GeneratedSheets;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Questionable.Model.V1; using Questionable.Model.Questing;
using Quest = Questionable.Model.Quest; using Quest = Questionable.Model.Quest;
namespace Questionable.Controller.Steps.Interactions; namespace Questionable.Controller.Steps.Interactions;

View File

@ -8,7 +8,7 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Questionable.Controller.Steps.Shared; using Questionable.Controller.Steps.Shared;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.V1; using Questionable.Model.Questing;
namespace Questionable.Controller.Steps.Interactions; namespace Questionable.Controller.Steps.Interactions;

View File

@ -5,7 +5,7 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Questionable.Controller.Steps.Common; using Questionable.Controller.Steps.Common;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.V1; using Questionable.Model.Questing;
namespace Questionable.Controller.Steps.Interactions; namespace Questionable.Controller.Steps.Interactions;

View File

@ -3,7 +3,7 @@ using System.Collections.Generic;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Questionable.Controller.Steps.Common; using Questionable.Controller.Steps.Common;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.V1; using Questionable.Model.Questing;
namespace Questionable.Controller.Steps.Interactions; namespace Questionable.Controller.Steps.Interactions;

View File

@ -4,7 +4,7 @@ using Dalamud.Plugin.Services;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Questionable.External; using Questionable.External;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.V1; using Questionable.Model.Questing;
namespace Questionable.Controller.Steps.Interactions; namespace Questionable.Controller.Steps.Interactions;

View File

@ -13,7 +13,8 @@ using Questionable.Controller.Steps.Shared;
using Questionable.Controller.Utils; using Questionable.Controller.Utils;
using Questionable.Data; using Questionable.Data;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.V1; using Questionable.Model.Common;
using Questionable.Model.Questing;
using AethernetShortcut = Questionable.Controller.Steps.Shared.AethernetShortcut; using AethernetShortcut = Questionable.Controller.Steps.Shared.AethernetShortcut;
namespace Questionable.Controller.Steps.Interactions; namespace Questionable.Controller.Steps.Interactions;

View File

@ -8,8 +8,10 @@ using Microsoft.Extensions.Logging;
using Questionable.Data; using Questionable.Data;
using Questionable.External; using Questionable.External;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.V1; using Questionable.Model.Common;
using Questionable.Model.V1.Converter; using Questionable.Model.Common.Converter;
using Questionable.Model.Questing;
using Questionable.Model.Questing.Converter;
namespace Questionable.Controller.Steps.Shared; namespace Questionable.Controller.Steps.Shared;

View File

@ -7,7 +7,8 @@ using Microsoft.Extensions.Logging;
using Questionable.Controller.Steps.Common; using Questionable.Controller.Steps.Common;
using Questionable.Data; using Questionable.Data;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.V1; using Questionable.Model.Common;
using Questionable.Model.Questing;
namespace Questionable.Controller.Steps.Shared; namespace Questionable.Controller.Steps.Shared;

View File

@ -13,7 +13,7 @@ using Questionable.Controller.NavigationOverrides;
using Questionable.Controller.Steps.Common; using Questionable.Controller.Steps.Common;
using Questionable.Data; using Questionable.Data;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.V1; using Questionable.Model.Questing;
namespace Questionable.Controller.Steps.Shared; namespace Questionable.Controller.Steps.Shared;

View File

@ -11,7 +11,8 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Questionable.Controller.Utils; using Questionable.Controller.Utils;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.V1; using Questionable.Model.Common;
using Questionable.Model.Questing;
namespace Questionable.Controller.Steps.Shared; namespace Questionable.Controller.Steps.Shared;

View File

@ -2,7 +2,7 @@
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.V1; using Questionable.Model.Questing;
namespace Questionable.Controller.Steps.Shared; namespace Questionable.Controller.Steps.Shared;

View File

@ -12,7 +12,7 @@ using Questionable.Controller.Steps.Common;
using Questionable.Controller.Utils; using Questionable.Controller.Utils;
using Questionable.Data; using Questionable.Data;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.V1; using Questionable.Model.Questing;
namespace Questionable.Controller.Steps.Shared; namespace Questionable.Controller.Steps.Shared;

View File

@ -2,7 +2,7 @@
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Questionable.Controller.Steps.Common; using Questionable.Controller.Steps.Common;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.V1; using Questionable.Model.Questing;
namespace Questionable.Controller.Steps.Shared; namespace Questionable.Controller.Steps.Shared;

View File

@ -4,7 +4,7 @@ using System.Linq;
using FFXIVClientStructs.FFXIV.Application.Network.WorkDefinitions; using FFXIVClientStructs.FFXIV.Application.Network.WorkDefinitions;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Questionable.Controller.Steps.Shared; using Questionable.Controller.Steps.Shared;
using Questionable.Model.V1; using Questionable.Model.Questing;
namespace Questionable.Controller.Utils; namespace Questionable.Controller.Utils;

View File

@ -4,8 +4,7 @@ using System.Linq;
using System.Numerics; using System.Numerics;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using Lumina.Excel.GeneratedSheets; using Lumina.Excel.GeneratedSheets;
using Microsoft.Extensions.Logging; using Questionable.Model.Common;
using Questionable.Model.V1;
namespace Questionable.Data; namespace Questionable.Data;

View File

@ -1,7 +1,7 @@
using Dalamud.Plugin; using Dalamud.Plugin;
using Dalamud.Plugin.Ipc; using Dalamud.Plugin.Ipc;
using Questionable.Data; using Questionable.Data;
using Questionable.Model.V1; using Questionable.Model.Common;
namespace Questionable.External; namespace Questionable.External;

Some files were not shown because too many files have changed in this diff Show More