var gatheringSchema = JsonSchema.FromText(jsonSchemaFile.GetText()!.ToString());
List<(ushort, GatheringRoot)> gatheringLocations = [];
- foreach (var (id, node) in Utils.GetAdditionalFiles(context, jsonSchemaFile, gatheringSchema, InvalidJson))
+ foreach (var (id, node) in Utils.GetAdditionalFiles(context, jsonSchemaFile, gatheringSchema, InvalidJson,
+ ushort.Parse))
{
var gatheringLocation = node.Deserialize<GatheringRoot>()!;
gatheringLocations.Add((id, gatheringLocation));
{
var questSchema = JsonSchema.FromText(jsonSchemaFile.GetText()!.ToString());
- List<(ushort, QuestRoot)> quests = [];
- foreach (var (id, node) in Utils.GetAdditionalFiles(context, jsonSchemaFile, questSchema, InvalidJson))
+ List<(ElementId, QuestRoot)> quests = [];
+ foreach (var (id, node) in Utils.GetAdditionalFiles(context, jsonSchemaFile, questSchema, InvalidJson,
+ ElementId.FromString))
{
var quest = node.Deserialize<QuestRoot>()!;
if (quest.Disabled)
return;
var partitionedQuests = quests
- .OrderBy(x => x.Item1)
- .GroupBy(x => $"LoadQuests{x.Item1 / 50}")
+ .OrderBy(x => x.Item1.Value)
+ .GroupBy(x => $"LoadQuests{x.Item1.Value / 50}")
.ToList();
var methods = Utils.CreateMethods("LoadQuests", partitionedQuests, CreateInitializer);
context.AddSource("AssemblyQuestLoader.g.cs", code.ToFullString());
}
- private static StatementSyntax[] CreateInitializer(List<(ushort QuestId, QuestRoot Root)> quests)
+ private static StatementSyntax[] CreateInitializer(List<(ElementId QuestId, QuestRoot Root)> quests)
{
List<StatementSyntax> statements = [];
SeparatedList<ArgumentSyntax>(
new SyntaxNodeOrToken[]
{
- Argument(
- LiteralExpression(SyntaxKind.NumericLiteralExpression,
- Literal(quest.QuestId))),
+ Argument(LiteralValue(quest.QuestId)),
Token(SyntaxKind.CommaToken),
Argument(CreateQuestRootExpression(quest.QuestId, quest.Root))
})))));
return statements.ToArray();
}
- private static ObjectCreationExpressionSyntax CreateQuestRootExpression(ushort questId, QuestRoot quest)
+ private static ObjectCreationExpressionSyntax CreateQuestRootExpression(ElementId questId, QuestRoot quest)
{
try
{
SingletonSeparatedList(
Argument(LiteralValue(leveId.Value)))));
}
+ else if (value is SatisfactionSupplyNpcId satisfactionSupplyNpcId)
+ {
+ return ObjectCreationExpression(
+ IdentifierName(nameof(SatisfactionSupplyNpcId)))
+ .WithArgumentList(
+ ArgumentList(
+ SingletonSeparatedList(
+ Argument(LiteralValue(satisfactionSupplyNpcId.Value)))));
+ }
else if (value is Vector3 vector)
{
return ObjectCreationExpression(
public static class Utils
{
- public static IEnumerable<(ushort, JsonNode)> GetAdditionalFiles(GeneratorExecutionContext context,
- AdditionalText jsonSchemaFile, JsonSchema jsonSchema, DiagnosticDescriptor invalidJson)
+ public static IEnumerable<(T, JsonNode)> GetAdditionalFiles<T>(GeneratorExecutionContext context,
+ AdditionalText jsonSchemaFile, JsonSchema jsonSchema, DiagnosticDescriptor invalidJson, Func<string, T> idParser)
{
var commonSchemaFile = context.AdditionalFiles.Single(x => Path.GetFileName(x.Path) == "common-schema.json");
List<AdditionalText> jsonSchemaFiles = [jsonSchemaFile, commonSchemaFile];
if (!name.Contains("_"))
continue;
- ushort id = ushort.Parse(name.Substring(0, name.IndexOf('_')));
+ T id = idParser(name.Substring(0, name.IndexOf('_')));
var text = additionalFile.GetText();
if (text == null)
}
}
- public static List<MethodDeclarationSyntax> CreateMethods<T>(string prefix,
- List<IGrouping<string, (ushort, T)>> partitions,
- Func<List<(ushort, T)>, StatementSyntax[]> toInitializers)
+ public static List<MethodDeclarationSyntax> CreateMethods<TId, TQuest>(string prefix,
+ List<IGrouping<string, (TId, TQuest)>> partitions,
+ Func<List<(TId, TQuest)>, StatementSyntax[]> toInitializers)
{
List<MethodDeclarationSyntax> methods =
[
[SuppressMessage("ReSharper", "PartialTypeWithSinglePart", Justification = "Required for RELEASE")]
public static partial class AssemblyQuestLoader
{
- private static Dictionary<ushort, QuestRoot>? _quests;
+ private static Dictionary<ElementId, QuestRoot>? _quests;
- public static IReadOnlyDictionary<ushort, QuestRoot> GetQuests()
+ public static IReadOnlyDictionary<ElementId, QuestRoot> GetQuests()
{
if (_quests == null)
{
typeof(AssemblyQuestLoader).Assembly.GetManifestResourceStream("Questionable.QuestPaths.QuestSchema")!;
[SuppressMessage("ReSharper", "UnusedMember.Local")]
- private static void AddQuest(ushort questId, QuestRoot root) => _quests![questId] = root;
+ private static void AddQuest(ElementId questId, QuestRoot root) => _quests![questId] = root;
}
{
_logger.LogInformation("Loading quests from assembly");
- foreach ((ushort questId, QuestRoot questRoot) in AssemblyQuestLoader.GetQuests())
+ foreach ((ElementId questId, QuestRoot questRoot) in AssemblyQuestLoader.GetQuests())
{
Quest quest = new()
{
- Id = new QuestId(questId),
+ Id = questId,
Root = questRoot,
- Info = _questData.GetQuestInfo(new QuestId(questId)),
+ Info = _questData.GetQuestInfo(questId),
ReadOnly = true,
};
_quests[quest.Id] = quest;