forked from liza/Questionable
Schema update
This commit is contained in:
parent
dd7152024a
commit
ae87b4ccc5
3
GatheringPathRenderer/GatheringPathRenderer.csproj
Normal file
3
GatheringPathRenderer/GatheringPathRenderer.csproj
Normal file
@ -0,0 +1,3 @@
|
||||
<Project Sdk="Dalamud.NET.Sdk/10.0.0">
|
||||
<Import Project="..\LLib\LLib.targets"/>
|
||||
</Project>
|
11
GatheringPathRenderer/RendererPlugin.cs
Normal file
11
GatheringPathRenderer/RendererPlugin.cs
Normal file
@ -0,0 +1,11 @@
|
||||
using Dalamud.Plugin;
|
||||
|
||||
namespace GatheringPathRenderer;
|
||||
|
||||
public sealed class RendererPlugin : IDalamudPlugin
|
||||
{
|
||||
public void Dispose()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
81
GatheringPathRenderer/packages.lock.json
Normal file
81
GatheringPathRenderer/packages.lock.json
Normal 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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
0
GatheringPaths/2.x - A Realm Reborn/.gitkeep
Normal file
0
GatheringPaths/2.x - A Realm Reborn/.gitkeep
Normal file
0
GatheringPaths/3.x - Heavensward/.gitkeep
Normal file
0
GatheringPaths/3.x - Heavensward/.gitkeep
Normal file
0
GatheringPaths/4.x - Stormblood/.gitkeep
Normal file
0
GatheringPaths/4.x - Stormblood/.gitkeep
Normal file
0
GatheringPaths/5.x - Shadowbringers/.gitkeep
Normal file
0
GatheringPaths/5.x - Shadowbringers/.gitkeep
Normal file
56
GatheringPaths/6.x - Endwalker/Thavnair/820_Pewter Ore.json
Normal file
56
GatheringPaths/6.x - Endwalker/Thavnair/820_Pewter Ore.json
Normal 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
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
0
GatheringPaths/7.x - Dawntrail/.gitkeep
Normal file
0
GatheringPaths/7.x - Dawntrail/.gitkeep
Normal file
32
GatheringPaths/AssemblyGatheringLocationLoader.cs
Normal file
32
GatheringPaths/AssemblyGatheringLocationLoader.cs
Normal 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;
|
||||
}
|
43
GatheringPaths/GatheringPaths.csproj
Normal file
43
GatheringPaths/GatheringPaths.csproj
Normal 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>
|
98
GatheringPaths/gatheringlocation-v1.json
Normal file
98
GatheringPaths/gatheringlocation-v1.json
Normal 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"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
26
GatheringPaths/packages.lock.json
Normal file
26
GatheringPaths/packages.lock.json
Normal 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, )"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Questing;
|
||||
using Questionable.QuestPathGenerator;
|
||||
using Xunit;
|
||||
|
||||
|
163
QuestPathGenerator/GatheringSourceGenerator.cs
Normal file
163
QuestPathGenerator/GatheringSourceGenerator.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,16 +1,14 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Nodes;
|
||||
using Json.Schema;
|
||||
using Microsoft.CodeAnalysis;
|
||||
using Microsoft.CodeAnalysis.CSharp;
|
||||
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Questing;
|
||||
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
|
||||
using static Questionable.QuestPathGenerator.RoslynShortcuts;
|
||||
|
||||
@ -38,47 +36,21 @@ public class QuestSourceGenerator : ISourceGenerator
|
||||
|
||||
public void Execute(GeneratorExecutionContext context)
|
||||
{
|
||||
List<(ushort, QuestRoot)> quests = [];
|
||||
|
||||
// Find schema definition
|
||||
AdditionalText jsonSchemaFile =
|
||||
context.AdditionalFiles.Single(x => Path.GetFileName(x.Path) == "quest-v1.json");
|
||||
var questSchema = JsonSchema.FromText(jsonSchemaFile.GetText()!.ToString());
|
||||
|
||||
// Go through all files marked as an Additional File in file properties.
|
||||
foreach (var additionalFile in context.AdditionalFiles)
|
||||
{
|
||||
if (additionalFile == null || additionalFile == jsonSchemaFile)
|
||||
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);
|
||||
AdditionalText? questSchema =
|
||||
context.AdditionalFiles.SingleOrDefault(x => Path.GetFileName(x.Path) == "quest-v1.json");
|
||||
if (questSchema != null)
|
||||
GenerateQuestSource(context, questSchema);
|
||||
}
|
||||
|
||||
var quest = questNode.Deserialize<QuestRoot>()!;
|
||||
private void GenerateQuestSource(GeneratorExecutionContext context, AdditionalText jsonSchemaFile)
|
||||
{
|
||||
var questSchema = JsonSchema.FromText(jsonSchemaFile.GetText()!.ToString());
|
||||
|
||||
List<(ushort, QuestRoot)> quests = [];
|
||||
foreach (var (id, node) in Utils.GetAdditionalFiles(context, jsonSchemaFile, questSchema, InvalidJson))
|
||||
{
|
||||
var quest = node.Deserialize<QuestRoot>()!;
|
||||
if (quest.Disabled)
|
||||
{
|
||||
quest.Author = [];
|
||||
@ -97,38 +69,7 @@ public class QuestSourceGenerator : ISourceGenerator
|
||||
.GroupBy(x => $"LoadQuests{x.Item1 / 50}")
|
||||
.ToList();
|
||||
|
||||
List<MethodDeclarationSyntax> methods =
|
||||
[
|
||||
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 methods = Utils.CreateMethods("LoadQuests", partitionedQuests, CreateInitializer);
|
||||
|
||||
var code =
|
||||
CompilationUnit()
|
||||
@ -156,7 +97,13 @@ public class QuestSourceGenerator : ISourceGenerator
|
||||
QualifiedName(
|
||||
IdentifierName("Questionable"),
|
||||
IdentifierName("Model")),
|
||||
IdentifierName("V1")))
|
||||
IdentifierName("Questing"))),
|
||||
UsingDirective(
|
||||
QualifiedName(
|
||||
QualifiedName(
|
||||
IdentifierName("Questionable"),
|
||||
IdentifierName("Model")),
|
||||
IdentifierName("Common")))
|
||||
}))
|
||||
.WithMembers(
|
||||
SingletonList<MemberDeclarationSyntax>(
|
||||
|
@ -6,7 +6,9 @@ using System.Numerics;
|
||||
using Microsoft.CodeAnalysis;
|
||||
using Microsoft.CodeAnalysis.CSharp;
|
||||
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;
|
||||
|
||||
namespace Questionable.QuestPathGenerator;
|
||||
@ -312,6 +314,32 @@ public static class RoslynShortcuts
|
||||
Assignment(nameof(SkipAetheryteCondition.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)
|
||||
return LiteralExpression(SyntaxKind.NullLiteralExpression);
|
||||
}
|
||||
|
109
QuestPathGenerator/Utils.cs
Normal file
109
QuestPathGenerator/Utils.cs
Normal 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;
|
||||
}
|
||||
}
|
@ -2,8 +2,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Questing;
|
||||
|
||||
namespace Questionable.QuestPaths;
|
||||
|
||||
|
@ -23,6 +23,7 @@
|
||||
<LogicalName>Questionable.QuestPaths.QuestSchema</LogicalName>
|
||||
</EmbeddedResource>
|
||||
<AdditionalFiles Include="quest-v1.json" />
|
||||
<AdditionalFiles Include="..\Questionable.Model\common-schema.json" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup Condition="'$(Configuration)' == 'Release'">
|
||||
|
@ -154,7 +154,7 @@
|
||||
},
|
||||
"AetheryteShortcut": {
|
||||
"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": {
|
||||
"type": "array",
|
||||
@ -162,7 +162,7 @@
|
||||
"minItems": 2,
|
||||
"maxItems": 2,
|
||||
"items": {
|
||||
"$ref": "#/$defs/AethernetShard"
|
||||
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/AethernetShard"
|
||||
}
|
||||
},
|
||||
"ItemId": {
|
||||
@ -183,7 +183,7 @@
|
||||
"type": "boolean"
|
||||
},
|
||||
"CompletionQuestVariablesFlags": {
|
||||
"$ref": "#/$defs/CompletionFlags"
|
||||
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/CompletionFlags"
|
||||
},
|
||||
"Flying": {
|
||||
"type": "string",
|
||||
@ -271,7 +271,7 @@
|
||||
"additionalProperties": false
|
||||
},
|
||||
"CompletionQuestVariablesFlags": {
|
||||
"$ref": "#/$defs/CompletionFlags"
|
||||
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/CompletionFlags"
|
||||
},
|
||||
"RequiredQuestVariables": {
|
||||
"type": "array",
|
||||
@ -383,7 +383,7 @@
|
||||
"then": {
|
||||
"properties": {
|
||||
"Aetheryte": {
|
||||
"$ref": "#/$defs/Aetheryte"
|
||||
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte"
|
||||
},
|
||||
"DataId": {
|
||||
"type": "null"
|
||||
@ -415,7 +415,7 @@
|
||||
"then": {
|
||||
"properties": {
|
||||
"AethernetShard": {
|
||||
"$ref": "#/$defs/AethernetShard"
|
||||
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/AethernetShard"
|
||||
},
|
||||
"DataId": {
|
||||
"type": "null"
|
||||
@ -507,7 +507,7 @@
|
||||
"type": "integer"
|
||||
},
|
||||
"CompletionQuestVariablesFlags": {
|
||||
"$ref": "#/$defs/CompletionFlags"
|
||||
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/CompletionFlags"
|
||||
},
|
||||
"IgnoreQuestMarker": {
|
||||
"type": "boolean"
|
||||
@ -1073,300 +1073,5 @@
|
||||
"QuestSequence",
|
||||
"Author"
|
||||
],
|
||||
"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
|
||||
}
|
||||
}
|
||||
"additionalProperties": false
|
||||
}
|
||||
|
9
Questionable.Model/AssemblyModelLoader.cs
Normal file
9
Questionable.Model/AssemblyModelLoader.cs
Normal 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")!;
|
||||
}
|
@ -1,6 +1,7 @@
|
||||
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)
|
||||
{
|
@ -5,7 +5,7 @@ using System.Linq;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Questionable.Model.V1.Converter;
|
||||
namespace Questionable.Model.Common.Converter;
|
||||
|
||||
public abstract class EnumConverter<T> : JsonConverter<T>
|
||||
where T : Enum
|
@ -3,7 +3,7 @@ using System.Collections.Generic;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Questionable.Model.V1.Converter;
|
||||
namespace Questionable.Model.Common.Converter;
|
||||
|
||||
public sealed class StringListOrValueConverter : JsonConverter<List<string>>
|
||||
{
|
@ -3,7 +3,7 @@ using System.Numerics;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Questionable.Model.V1.Converter;
|
||||
namespace Questionable.Model.Common.Converter;
|
||||
|
||||
public sealed class VectorConverter : JsonConverter<Vector3>
|
||||
{
|
@ -1,7 +1,8 @@
|
||||
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))]
|
||||
public enum EAetheryteLocation
|
13
Questionable.Model/Gathering/GatheringNodeLocation.cs
Normal file
13
Questionable.Model/Gathering/GatheringNodeLocation.cs
Normal 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;
|
||||
}
|
18
Questionable.Model/Gathering/GatheringRoot.cs
Normal file
18
Questionable.Model/Gathering/GatheringRoot.cs
Normal 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; } = [];
|
||||
}
|
@ -1,7 +1,8 @@
|
||||
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))]
|
||||
public sealed class AethernetShortcut
|
@ -1,4 +1,4 @@
|
||||
namespace Questionable.Model.V1;
|
||||
namespace Questionable.Model.Questing;
|
||||
|
||||
public sealed class ChatMessage
|
||||
{
|
@ -1,6 +1,6 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Questionable.Model.V1;
|
||||
namespace Questionable.Model.Questing;
|
||||
|
||||
public sealed class ComplexCombatData
|
||||
{
|
@ -1,6 +1,7 @@
|
||||
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)
|
||||
{
|
@ -1,6 +1,8 @@
|
||||
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)
|
||||
{
|
@ -3,8 +3,9 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text.Json;
|
||||
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>
|
||||
{
|
@ -1,6 +1,7 @@
|
||||
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)
|
||||
{
|
@ -1,6 +1,7 @@
|
||||
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)
|
||||
{
|
@ -1,6 +1,7 @@
|
||||
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)
|
||||
{
|
@ -2,7 +2,7 @@
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Questionable.Model.V1.Converter;
|
||||
namespace Questionable.Model.Questing.Converter;
|
||||
|
||||
public sealed class ExcelRefConverter : JsonConverter<ExcelRef>
|
||||
{
|
@ -1,6 +1,7 @@
|
||||
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)
|
||||
{
|
@ -1,6 +1,7 @@
|
||||
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)
|
||||
{
|
@ -1,6 +1,7 @@
|
||||
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)
|
||||
{
|
@ -2,7 +2,7 @@
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Questionable.Model.V1.Converter;
|
||||
namespace Questionable.Model.Questing.Converter;
|
||||
|
||||
public sealed class QuestWorkConfigConverter : JsonConverter<QuestWorkValue>
|
||||
{
|
@ -1,6 +1,7 @@
|
||||
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)
|
||||
{
|
@ -1,6 +1,7 @@
|
||||
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)
|
||||
{
|
@ -1,7 +1,7 @@
|
||||
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
|
||||
{
|
@ -1,7 +1,7 @@
|
||||
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))]
|
||||
public enum EAction
|
@ -1,4 +1,4 @@
|
||||
namespace Questionable.Model.V1;
|
||||
namespace Questionable.Model.Questing;
|
||||
|
||||
public enum EDialogChoiceType
|
||||
{
|
@ -1,7 +1,7 @@
|
||||
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))]
|
||||
public enum EEmote
|
@ -1,7 +1,7 @@
|
||||
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))]
|
||||
public enum EEnemySpawnType
|
@ -1,7 +1,7 @@
|
||||
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))]
|
||||
public enum EExtraSkipCondition
|
@ -1,7 +1,7 @@
|
||||
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))]
|
||||
public enum EInteractionType
|
@ -1,7 +1,7 @@
|
||||
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))]
|
||||
public enum EJumpType
|
@ -1,7 +1,7 @@
|
||||
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))]
|
||||
public enum ELockedSkipCondition
|
@ -1,7 +1,7 @@
|
||||
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))]
|
||||
public enum EQuestWorkMode
|
@ -1,6 +1,6 @@
|
||||
using System;
|
||||
|
||||
namespace Questionable.Model.V1;
|
||||
namespace Questionable.Model.Questing;
|
||||
|
||||
public class ExcelRef
|
||||
{
|
@ -1,8 +1,9 @@
|
||||
using System.Numerics;
|
||||
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
|
||||
{
|
@ -1,8 +1,9 @@
|
||||
using System.Collections.Generic;
|
||||
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
|
||||
{
|
@ -1,7 +1,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace Questionable.Model.V1;
|
||||
namespace Questionable.Model.Questing;
|
||||
|
||||
public sealed class QuestSequence
|
||||
{
|
@ -1,9 +1,11 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Numerics;
|
||||
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
|
||||
{
|
@ -1,8 +1,8 @@
|
||||
using System;
|
||||
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))]
|
||||
public sealed class QuestWorkValue(byte? high, byte? low, EQuestWorkMode mode)
|
@ -1,4 +1,4 @@
|
||||
namespace Questionable.Model.V1;
|
||||
namespace Questionable.Model.Questing;
|
||||
|
||||
public sealed class SkipAetheryteCondition
|
||||
{
|
@ -1,4 +1,4 @@
|
||||
namespace Questionable.Model.V1;
|
||||
namespace Questionable.Model.Questing;
|
||||
|
||||
public sealed class SkipConditions
|
||||
{
|
@ -1,4 +1,4 @@
|
||||
namespace Questionable.Model.V1;
|
||||
namespace Questionable.Model.Questing;
|
||||
|
||||
public sealed class SkipItemConditions
|
||||
{
|
@ -1,7 +1,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace Questionable.Model.V1;
|
||||
namespace Questionable.Model.Questing;
|
||||
|
||||
public sealed class SkipStepConditions
|
||||
{
|
@ -13,4 +13,12 @@
|
||||
<ItemGroup>
|
||||
<PackageReference Include="System.Text.Json" Version="8.0.4" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
<ItemGroup>
|
||||
<None Remove="common-schema.json" />
|
||||
<EmbeddedResource Include="common-schema.json">
|
||||
<LogicalName>Questionable.Model.CommonSchema</LogicalName>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
299
Questionable.Model/common-schema.json
Normal file
299
Questionable.Model/common-schema.json
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
@ -15,6 +15,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Questionable.Model", "Quest
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "QuestPathGenerator.Tests", "QuestPathGenerator.Tests\QuestPathGenerator.Tests.csproj", "{4FD6F346-8961-4BD5-BDA2-E5F426DE4FC7}"
|
||||
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
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
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}.Release|x64.ActiveCfg = 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
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
@ -14,7 +14,7 @@ using FFXIVClientStructs.FFXIV.Client.System.Memory;
|
||||
using FFXIVClientStructs.FFXIV.Client.System.String;
|
||||
using Lumina.Excel.GeneratedSheets;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Questing;
|
||||
|
||||
namespace Questionable;
|
||||
|
||||
|
@ -14,7 +14,7 @@ using FFXIVClientStructs.FFXIV.Common.Math;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Questionable.Controller.CombatModules;
|
||||
using Questionable.Controller.Utils;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Questing;
|
||||
|
||||
namespace Questionable.Controller;
|
||||
|
||||
|
@ -14,7 +14,7 @@ using LLib.GameUI;
|
||||
using Lumina.Excel.GeneratedSheets;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Questionable.Data;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Questing;
|
||||
using Quest = Questionable.Model.Quest;
|
||||
using ValueType = FFXIVClientStructs.FFXIV.Component.GUI.ValueType;
|
||||
|
||||
|
@ -18,8 +18,10 @@ using Microsoft.Extensions.Logging;
|
||||
using Questionable.Controller.NavigationOverrides;
|
||||
using Questionable.External;
|
||||
using Questionable.Model;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.V1.Converter;
|
||||
using Questionable.Model.Common;
|
||||
using Questionable.Model.Common.Converter;
|
||||
using Questionable.Model.Questing;
|
||||
using Questionable.Model.Questing.Converter;
|
||||
|
||||
namespace Questionable.Controller;
|
||||
|
||||
|
@ -10,7 +10,7 @@ using Questionable.Controller.Steps;
|
||||
using Questionable.Controller.Steps.Shared;
|
||||
using Questionable.External;
|
||||
using Questionable.Model;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Questing;
|
||||
|
||||
namespace Questionable.Controller;
|
||||
|
||||
|
@ -11,7 +11,7 @@ using Dalamud.Plugin;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Questionable.Data;
|
||||
using Questionable.Model;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Questing;
|
||||
using Questionable.QuestPaths;
|
||||
using Questionable.Validation;
|
||||
using Questionable.Validation.Validators;
|
||||
|
@ -2,7 +2,7 @@
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Questionable.Model;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Questing;
|
||||
|
||||
namespace Questionable.Controller.Steps.Common;
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
using System.Collections.Generic;
|
||||
using Questionable.Model;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Questing;
|
||||
|
||||
namespace Questionable.Controller.Steps;
|
||||
|
||||
|
@ -7,7 +7,7 @@ using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Questionable.Controller.Steps.Common;
|
||||
using Questionable.Model;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Questing;
|
||||
|
||||
namespace Questionable.Controller.Steps.Interactions;
|
||||
|
||||
|
@ -4,7 +4,7 @@ using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Questionable.Data;
|
||||
using Questionable.Model;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Questing;
|
||||
|
||||
namespace Questionable.Controller.Steps.Interactions;
|
||||
|
||||
|
@ -1,9 +1,9 @@
|
||||
using System;
|
||||
using FFXIVClientStructs.FFXIV.Client.Game.Object;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Questionable.Model;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Common;
|
||||
using Questionable.Model.Questing;
|
||||
using ObjectKind = Dalamud.Game.ClientState.Objects.Enums.ObjectKind;
|
||||
|
||||
namespace Questionable.Controller.Steps.Interactions;
|
||||
|
@ -2,7 +2,8 @@
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Questionable.Model;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Common;
|
||||
using Questionable.Model.Questing;
|
||||
|
||||
namespace Questionable.Controller.Steps.Interactions;
|
||||
|
||||
|
@ -6,7 +6,7 @@ using Questionable.Controller.Steps.Common;
|
||||
using Questionable.Controller.Steps.Shared;
|
||||
using Questionable.Controller.Utils;
|
||||
using Questionable.Model;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Questing;
|
||||
|
||||
namespace Questionable.Controller.Steps.Interactions;
|
||||
|
||||
|
@ -12,7 +12,7 @@ using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Questionable.Controller.Steps.Common;
|
||||
using Questionable.Model;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Questing;
|
||||
|
||||
namespace Questionable.Controller.Steps.Interactions;
|
||||
|
||||
|
@ -3,7 +3,7 @@ using Dalamud.Game.ClientState.Conditions;
|
||||
using Dalamud.Plugin.Services;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Questionable.Model;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Questing;
|
||||
|
||||
namespace Questionable.Controller.Steps.Interactions;
|
||||
|
||||
|
@ -3,7 +3,7 @@ using System.Collections.Generic;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Questionable.Controller.Steps.Common;
|
||||
using Questionable.Model;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Questing;
|
||||
|
||||
namespace Questionable.Controller.Steps.Interactions;
|
||||
|
||||
|
@ -6,7 +6,7 @@ using FFXIVClientStructs.FFXIV.Client.Game;
|
||||
using Lumina.Excel.GeneratedSheets;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Questing;
|
||||
using Quest = Questionable.Model.Quest;
|
||||
|
||||
namespace Questionable.Controller.Steps.Interactions;
|
||||
|
@ -8,7 +8,7 @@ using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Questionable.Controller.Steps.Shared;
|
||||
using Questionable.Model;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Questing;
|
||||
|
||||
namespace Questionable.Controller.Steps.Interactions;
|
||||
|
||||
|
@ -5,7 +5,7 @@ using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Questionable.Controller.Steps.Common;
|
||||
using Questionable.Model;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Questing;
|
||||
|
||||
namespace Questionable.Controller.Steps.Interactions;
|
||||
|
||||
|
@ -3,7 +3,7 @@ using System.Collections.Generic;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Questionable.Controller.Steps.Common;
|
||||
using Questionable.Model;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Questing;
|
||||
|
||||
namespace Questionable.Controller.Steps.Interactions;
|
||||
|
||||
|
@ -4,7 +4,7 @@ using Dalamud.Plugin.Services;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Questionable.External;
|
||||
using Questionable.Model;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Questing;
|
||||
|
||||
namespace Questionable.Controller.Steps.Interactions;
|
||||
|
||||
|
@ -13,7 +13,8 @@ using Questionable.Controller.Steps.Shared;
|
||||
using Questionable.Controller.Utils;
|
||||
using Questionable.Data;
|
||||
using Questionable.Model;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Common;
|
||||
using Questionable.Model.Questing;
|
||||
using AethernetShortcut = Questionable.Controller.Steps.Shared.AethernetShortcut;
|
||||
|
||||
namespace Questionable.Controller.Steps.Interactions;
|
||||
|
@ -8,8 +8,10 @@ using Microsoft.Extensions.Logging;
|
||||
using Questionable.Data;
|
||||
using Questionable.External;
|
||||
using Questionable.Model;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.V1.Converter;
|
||||
using Questionable.Model.Common;
|
||||
using Questionable.Model.Common.Converter;
|
||||
using Questionable.Model.Questing;
|
||||
using Questionable.Model.Questing.Converter;
|
||||
|
||||
namespace Questionable.Controller.Steps.Shared;
|
||||
|
||||
|
@ -7,7 +7,8 @@ using Microsoft.Extensions.Logging;
|
||||
using Questionable.Controller.Steps.Common;
|
||||
using Questionable.Data;
|
||||
using Questionable.Model;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Common;
|
||||
using Questionable.Model.Questing;
|
||||
|
||||
namespace Questionable.Controller.Steps.Shared;
|
||||
|
||||
|
@ -13,7 +13,7 @@ using Questionable.Controller.NavigationOverrides;
|
||||
using Questionable.Controller.Steps.Common;
|
||||
using Questionable.Data;
|
||||
using Questionable.Model;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Questing;
|
||||
|
||||
namespace Questionable.Controller.Steps.Shared;
|
||||
|
||||
|
@ -11,7 +11,8 @@ using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Questionable.Controller.Utils;
|
||||
using Questionable.Model;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Common;
|
||||
using Questionable.Model.Questing;
|
||||
|
||||
namespace Questionable.Controller.Steps.Shared;
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Questionable.Model;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Questing;
|
||||
|
||||
namespace Questionable.Controller.Steps.Shared;
|
||||
|
||||
|
@ -12,7 +12,7 @@ using Questionable.Controller.Steps.Common;
|
||||
using Questionable.Controller.Utils;
|
||||
using Questionable.Data;
|
||||
using Questionable.Model;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Questing;
|
||||
|
||||
namespace Questionable.Controller.Steps.Shared;
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Questionable.Controller.Steps.Common;
|
||||
using Questionable.Model;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Questing;
|
||||
|
||||
namespace Questionable.Controller.Steps.Shared;
|
||||
|
||||
|
@ -4,7 +4,7 @@ using System.Linq;
|
||||
using FFXIVClientStructs.FFXIV.Application.Network.WorkDefinitions;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Questionable.Controller.Steps.Shared;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Questing;
|
||||
|
||||
namespace Questionable.Controller.Utils;
|
||||
|
||||
|
@ -4,8 +4,7 @@ using System.Linq;
|
||||
using System.Numerics;
|
||||
using Dalamud.Plugin.Services;
|
||||
using Lumina.Excel.GeneratedSheets;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Common;
|
||||
|
||||
namespace Questionable.Data;
|
||||
|
||||
|
2
Questionable/External/LifestreamIpc.cs
vendored
2
Questionable/External/LifestreamIpc.cs
vendored
@ -1,7 +1,7 @@
|
||||
using Dalamud.Plugin;
|
||||
using Dalamud.Plugin.Ipc;
|
||||
using Questionable.Data;
|
||||
using Questionable.Model.V1;
|
||||
using Questionable.Model.Common;
|
||||
|
||||
namespace Questionable.External;
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user