diff --git a/server/NeonSprawl.Server/Game/Quests/QuestDefinitionCatalogLoader.cs b/server/NeonSprawl.Server/Game/Quests/QuestDefinitionCatalogLoader.cs index 5d36b66..b0566b2 100644 --- a/server/NeonSprawl.Server/Game/Quests/QuestDefinitionCatalogLoader.cs +++ b/server/NeonSprawl.Server/Game/Quests/QuestDefinitionCatalogLoader.cs @@ -260,33 +260,25 @@ public static class QuestDefinitionCatalogLoader objectiveIdsSeen = new HashSet(StringComparer.Ordinal); var parsedSteps = new List(); - var stepsNode = rowObj["steps"] as JsonArray; - if (stepsNode is null) + var stepsNode = rowObj["steps"]; + if (stepsNode is not JsonArray stepsArray) { steps = parsedSteps; return errors; } - for (var si = 0; si < stepsNode.Count; si++) + for (var si = 0; si < stepsArray.Count; si++) { - if (stepsNode[si] is not JsonObject stepObj) + if (stepsArray[si] is not JsonObject stepObj) continue; var sid = (stepObj["id"] as JsonValue)?.GetValue(); - if (sid is not null) + if (sid is not null && !stepIdsSeen.Add(sid)) { - if (stepIdsSeen.Contains(sid)) - { - errors.Add($"error: {path} quests[{questIndex}] steps[{si}]: duplicate step id '{sid}'"); - } - else - { - stepIdsSeen.Add(sid); - } + errors.Add($"error: {path} quests[{questIndex}] steps[{si}]: duplicate step id '{sid}'"); } - var objectivesNode = stepObj["objectives"] as JsonArray; - if (objectivesNode is null) + if (stepObj["objectives"] is not JsonArray objectivesNode) continue; for (var oi = 0; oi < objectivesNode.Count; oi++) @@ -295,25 +287,18 @@ public static class QuestDefinitionCatalogLoader continue; var oid = (objObj["id"] as JsonValue)?.GetValue(); - if (oid is not null) + if (oid is not null && !objectiveIdsSeen.Add(oid)) { - if (objectiveIdsSeen.Contains(oid)) - { - errors.Add( - $"error: {path} quests[{questIndex}] steps[{si}] objectives[{oi}]: " + - $"duplicate objective id '{oid}' within quest"); - } - else - { - objectiveIdsSeen.Add(oid); - } + errors.Add( + $"error: {path} quests[{questIndex}] steps[{si}] objectives[{oi}]: " + + $"duplicate objective id '{oid}' within quest"); } } } - for (var si = 0; si < stepsNode.Count; si++) + for (var si = 0; si < stepsArray.Count; si++) { - if (stepsNode[si] is JsonObject stepObj) + if (stepsArray[si] is JsonObject stepObj) parsedSteps.Add(ParseStep(stepObj)); } @@ -331,7 +316,7 @@ public static class QuestDefinitionCatalogLoader return new QuestDefRow(id, displayName, prerequisiteQuestIds, steps, completionRewardBundle, factionGateRules); } - private static IReadOnlyList ParseFactionGateRules(JsonArray? array) + private static List ParseFactionGateRules(JsonArray? array) { if (array is null || array.Count == 0) return []; @@ -361,7 +346,7 @@ public static class QuestDefinitionCatalogLoader return new QuestRewardBundleRow(itemGrants, skillXpGrants, reputationGrants); } - private static IReadOnlyList ParseReputationGrantRows(JsonArray? array) + private static List ParseReputationGrantRows(JsonArray? array) { if (array is null || array.Count == 0) return []; @@ -380,7 +365,7 @@ public static class QuestDefinitionCatalogLoader return rows; } - private static IReadOnlyList ParseItemGrantRows(JsonArray? array) + private static List ParseItemGrantRows(JsonArray? array) { if (array is null || array.Count == 0) return []; @@ -399,7 +384,7 @@ public static class QuestDefinitionCatalogLoader return rows; } - private static IReadOnlyList ParseSkillXpGrantRows(JsonArray? array) + private static List ParseSkillXpGrantRows(JsonArray? array) { if (array is null || array.Count == 0) return []; @@ -457,7 +442,7 @@ public static class QuestDefinitionCatalogLoader return new QuestObjectiveDefRow(id, kind, itemId, quantity, recipeId, encounterId); } - private static IReadOnlyList ParseStringArray(JsonArray? array) + private static List ParseStringArray(JsonArray? array) { if (array is null) return [];