diff --git a/Pf2eDataScrapper/Importers/Implementations/Aonprd/DataBuilder/Processors/Types/RitualProcessor.cs b/Pf2eDataScrapper/Importers/Implementations/Aonprd/DataBuilder/Processors/Types/RitualProcessor.cs index cd2383a..41ded25 100644 --- a/Pf2eDataScrapper/Importers/Implementations/Aonprd/DataBuilder/Processors/Types/RitualProcessor.cs +++ b/Pf2eDataScrapper/Importers/Implementations/Aonprd/DataBuilder/Processors/Types/RitualProcessor.cs @@ -1,7 +1,9 @@ using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Text.RegularExpressions; using System.Xml.Linq; +using Microsoft.EntityFrameworkCore; using Newtonsoft.Json.Linq; using Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Helpers; using Pf2eModel; @@ -46,11 +48,10 @@ internal partial class RitualProcessor(AonprdProcessorInput input) : AbstractEnt ProcessArea(); - Object.PrimaryCheckSuffix = Input.GetOptionalLocale( - "primary_check_markdown", - LocaleType.English - ); - // ProcessPrimaryCheck(); + ProcessPrimaryChecks(); + ProcessSecondaryChecks(); + + ProcessSecondaryCasters(); } private int CalculateCastTime(string value) @@ -100,7 +101,50 @@ internal partial class RitualProcessor(AonprdProcessorInput input) : AbstractEnt Context.RitualAreas.Add(ritualArea); } - private void ProcessPrimaryCheck() + private readonly Dictionary _castersCleanup = new() + { + [", up to a maximum of "] = "-", + [" or more"] = "-999", + [" (or more)"] = "-999", + ["up to "] = "0-", + [" to "] = "-", + ["at least 1"] = "1-999", + }; + + private void ProcessSecondaryCasters() + { + string? input = Input.GetOptional("secondary_casters_raw"); + + if (string.IsNullOrWhiteSpace(input)) + { + return; + } + + foreach (KeyValuePair pair in _castersCleanup) + { + input = input.Replace(pair.Key, pair.Value); + } + + Match match = CasterRegex().Match(input); + + if (!match.Success) + { + throw new($"Can't parse secondary casters: \"{input}\""); + } + + Object.SecondaryCasters = int.Parse(M(1)); + Object.SecondaryCastersMax = (M(2) != "") ? int.Parse(M(2)) : Object.SecondaryCasters; + + if (M(3) != "") + { + Object.SecondaryCastersSuffix = new() { [LocaleType.English] = M(3) }; + } + return; + + string M(int i) => match.Groups[i].Value; + } + + private void ProcessPrimaryChecks() { string? check = Input.GetOptional("primary_check_markdown"); @@ -109,21 +153,129 @@ internal partial class RitualProcessor(AonprdProcessorInput input) : AbstractEnt return; } + List parts = CheckStringPrepare(check); + + string suffix = ""; + + // Обработка частей + List ritualChecks = parts + .Select(part => ResolveCheck(part.Trim(), true, out suffix)) + .ToList(); + + if ( + ritualChecks.Any(c => c.Rank == TrainingRank.Untrained) + && ritualChecks.Any(c => c.Rank != TrainingRank.Untrained) + ) + { + // Смешанные ранги + TrainingRank[] ranks = ritualChecks + .Select(c => c.Rank) + .Distinct() + .Where(r => r != TrainingRank.Untrained) + .ToArray(); + + if (ranks.Length > 1) + { + throw new($"Can't resolve mixed ranks: {string.Join(", ", ranks)}"); + } + + foreach ( + RitualCheck ritualCheck in ritualChecks.Where(r => r.Rank == TrainingRank.Untrained) + ) + { + ritualCheck.Rank = ranks[0]; + } + } + + if (suffix != "") + { + Object.PrimaryCheckSuffix = new() { [LocaleType.English] = suffix }; + } + + foreach (RitualCheck ritualCheck in ritualChecks) + { + Object.Checks.Add(ritualCheck); + Context.RitualChecks.Add(ritualCheck); + } + } + + private void ProcessSecondaryChecks() + { + string? check = Input.GetOptional("secondary_check_markdown"); + + if (string.IsNullOrWhiteSpace(check)) + { + return; + } + + List parts = CheckStringPrepare(check); + + foreach (string part in parts) + { + RitualCheck ritualCheck = ResolveCheck(part.Trim(), false, out string suffix); + + if (suffix != "") + { + if (ritualCheck.TrainingString is not null) + { + ritualCheck.TrainingString[LocaleType.English] += $" ({suffix})"; + } + else + { + ritualCheck.TrainingString = new() { [LocaleType.English] = suffix }; + } + } + + Object.Checks.Add(ritualCheck); + Context.RitualChecks.Add(ritualCheck); + } + } + + private readonly Dictionary _checksCleanupReplaces = new() + { + ["DC 35 Arcana"] = "Arcana ", + [")or"] = ") or", + ["[Lore](/Skills.aspx?ID=41) (any)"] = "[Any Lore](/Skills.aspx?ID=41)", + ["[Lore](/Skills.aspx?ID=8) (any)"] = "[Any Lore](/Skills.aspx?ID=8)", + }; + + private readonly Dictionary _checksCleanupRegexes = new() + { + [new(@"(\w+) \[Lore\]", RegexOptions.Compiled | RegexOptions.Multiline)] = "[$1 Lore]", + }; + + private List CheckStringPrepare(string input) + { + // Отчистка проблемных частей + foreach (KeyValuePair pair in _checksCleanupReplaces) + { + input = input.Replace(pair.Key, pair.Value); + } + foreach (KeyValuePair pair in _checksCleanupRegexes) + { + input = pair.Key.Replace(input, pair.Value); + } + // Замена символа ссылок - check = StringHelper.MarkdownRegex().Replace(check, "$1[$2]{$3}"); - check = check.Replace("(", "<").Replace(")", ">").Replace("{", "(").Replace("}", ")"); + input = StringHelper.MarkdownRegex().Replace(input, "$1[$2]{$3}"); + input = input.Replace("(", "<").Replace(")", ">").Replace("{", "(").Replace("}", ")"); + + if (input.EndsWith(';') || input.EndsWith(',')) + { + input = input[..^1].Trim(); + } // Временная замена скобок ранга и дополнения #pragma warning disable SYSLIB1045 - MatchCollection rankMatches = new Regex(@"<(.*?)>").Matches(check); + MatchCollection rankMatches = new Regex(@"<(.*?)>").Matches(input); #pragma warning restore SYSLIB1045 for (int i = 0; i < rankMatches.Count; i++) { - check = check.Replace(rankMatches[i].Value, $"{{rank-{i}}}"); + input = input.Replace(rankMatches[i].Value, $"{{rank-{i}}}"); } // Разбиваем строку на части - List parts = StringHelper.RowSplit(check); + List parts = StringHelper.RowSplit(input); // Возвращаем скобки ранга и дополнения for (int i = 0; i < rankMatches.Count; i++) @@ -134,71 +286,14 @@ internal partial class RitualProcessor(AonprdProcessorInput input) : AbstractEnt } } - // Обработка частей - List ritualChecks = parts.Select(part => ResolveCheck(part, false)).ToList(); - - // TODO - // 1. Проверить ritualChecks, если в каких-то Untrained, а в каком-то есть ранг - все к этому рангу - // 2. Поставить primarySuffix - // 3. Добавить в коллекцию + return parts; } - private List ResolveChecks(string input, bool isSecondary) + private RitualCheck ResolveCheck(string input, bool isPrimary, out string suffix) { - List result = []; - List> checkStrings = []; - - foreach (string part in StringHelper.RowSplit(input)) - { - Match match = StringHelper.MarkdownRegex().Match(part); - - if (match.Success) - { - string prefix = match.Groups[1].Value.Trim(); - string text = match.Groups[2].Value.Trim(); - - checkStrings.Add([prefix + " " + text, text]); - } - else - { - checkStrings.Add([part.Trim()]); - } - } - - List checkOptions = checkStrings.SelectMany(a => a).ToList(); - List skills = Context - .Trainings.Where(t => Pf2eDbContext.LocaleSearchArray(t.Name, checkOptions)) - .ToList(); - - foreach (List checks in checkStrings) - { - Training? skill = skills.FirstOrDefault(t => - checks.Any(check => t.Name!.Contains(check)) - ); - - LocaleString? trainingString = - (skill is null) ? null : new() { [LocaleType.English] = checks[0] }; - - result.Add( - new() - { - Ritual = Object, - Training = skill, - IsSecondary = isSecondary, - TrainingString = trainingString, - } - ); - } - - return result; - } - - private string primarySuffix = ""; - - private RitualCheck ResolveCheck(string input, bool isSecondary) - { - RitualCheck result = new() { Ritual = Object, IsSecondary = isSecondary }; + RitualCheck result = new() { Ritual = Object, IsPrimary = isPrimary }; string? skillName = null; + string s = ""; Dictionary> regexDictionary = new() { @@ -207,9 +302,19 @@ internal partial class RitualProcessor(AonprdProcessorInput input) : AbstractEnt [PrimaryRegex1()] = match => { skillName = match.Groups[1].Value; - result.Rank = Input.Enum(match.Groups[4].Value.ToLower()); - primarySuffix += - match.Groups[3].Value + match.Groups[5].Value + match.Groups[6].Value; + try + { + result.Rank = Input.Enum(match.Groups[4].Value.ToLower()); + s += match.Groups[3].Value + match.Groups[5].Value + match.Groups[6].Value; + } + catch + { + s += + match.Groups[3].Value + + match.Groups[4].Value + + match.Groups[5].Value + + match.Groups[6].Value; + } }, // ? [name](url) @@ -217,14 +322,21 @@ internal partial class RitualProcessor(AonprdProcessorInput input) : AbstractEnt { skillName = match.Groups[2].Value; result.Rank = TrainingRank.Untrained; - primarySuffix += match.Groups[1].Value; + s += match.Groups[1].Value; }, // name [PrimaryRegex3()] = match => { skillName = match.Groups[1].Value; - result.Rank = Input.Enum(match.Groups[2].Value.ToLower()); + try + { + result.Rank = Input.Enum(match.Groups[2].Value.ToLower()); + } + catch + { + s += match.Groups[2].Value; + } }, }; @@ -232,25 +344,23 @@ internal partial class RitualProcessor(AonprdProcessorInput input) : AbstractEnt { Match match = pair.Key.Match(input); - if (!match.Success) + if (match.Success) { - continue; + pair.Value.Invoke(match); + break; } - - pair.Value.Invoke(match); } - if (skillName is null) - { - throw new($"Can't resolve skill name from \"{input}\""); - } + suffix = s; + + skillName ??= input; result.Training = Context.Trainings.FirstOrDefault(t => Pf2eDbContext.LocaleSearch(t.Name, skillName) ); result.TrainingString = - (result.Training is null) ? null : new() { [LocaleType.English] = skillName }; + (result.Training is not null) ? null : new() { [LocaleType.English] = skillName }; return result; } @@ -263,14 +373,8 @@ internal partial class RitualProcessor(AonprdProcessorInput input) : AbstractEnt "secondary_check_markdown", ]; - [GeneratedRegex(@"\((\/.*?)\)")] - private static partial Regex LinkRemoveRegex(); - - [GeneratedRegex(@"\((\w*)[;, ]?(.*?)\)")] - private static partial Regex PrimaryCheckSuffixRegex(); - [GeneratedRegex( - @"^ *\[\s*(.*?)\s*\]\((.*?)\)\s*([a-z' ]*?)<(.*?)(?:[;,]\s*(.*?))?>([a-z' ]*?)$", + @"^ *\[\s*(.*?)\s*\]\((.*?)\)\s*([a-z' ]*?)<(.*?)(?:[;,]?\s*(.*?))?>([a-z' ]*?)$", RegexOptions.Multiline )] private static partial Regex PrimaryRegex1(); @@ -280,350 +384,7 @@ internal partial class RitualProcessor(AonprdProcessorInput input) : AbstractEnt [GeneratedRegex(@"^ *(.*?)\s*<(.*?)> *$", RegexOptions.Multiline)] private static partial Regex PrimaryRegex3(); + + [GeneratedRegex(@"^(\d+)(?:\-(\d+))?,? *\(?(.*?)\)?$", RegexOptions.Multiline)] + private static partial Regex CasterRegex(); } - -/* -TEST DATA FOR PRIMARY RANK - -[Arcana](/Skills.aspx?ID=2) - -[Religion](/Skills.aspx?ID=13) - -[Arcana](/Skills.aspx?ID=2) -[Occultism](/Skills.aspx?ID=11) -[Religion](/Skills.aspx?ID=13) - -[Occultism](/Skills.aspx?ID=11) - -[Arcana](/Skills.aspx?ID=2) -[Nature](/Skills.aspx?ID=10) -[Occultism](/Skills.aspx?ID=11) -[Religion](/Skills.aspx?ID=13) - -[Nature](/Skills.aspx?ID=10) -[Religion](/Skills.aspx?ID=13) -[Occultism](/Skills.aspx?ID=11) - -[Religion](/Skills.aspx?ID=13) - -[Nature](/Skills.aspx?ID=10) -[Religion](/Skills.aspx?ID=13) - -[Arcana](/Skills.aspx?ID=2) -[Occultism](/Skills.aspx?ID=11) - -[Occultism](/Skills.aspx?ID=11) - -[Religion](/Skills.aspx?ID=13) - -[Occultism](/Skills.aspx?ID=11) - -[Arcana](/Skills.aspx?ID=2) -[Occultism](/Skills.aspx?ID=11) - -[Nature](/Skills.aspx?ID=10) - -[Crafting](/Skills.aspx?ID=4) - -[Occultism](/Skills.aspx?ID=11) - -[Arcana](/Skills.aspx?ID=2) -[Occultism](/Skills.aspx?ID=11) - -[Occultism](/Skills.aspx?ID=11) - -[Occultism](/Skills.aspx?ID=11) - -[Arcana](/Skills.aspx?ID=2) -[Occultism](/Skills.aspx?ID=11) - -[Arcana](/Skills.aspx?ID=2) -[Occultism](/Skills.aspx?ID=11) - -[Nature](/Skills.aspx?ID=10) - -[Occultism](/Skills.aspx?ID=11) -[Religion](/Skills.aspx?ID=13) - -[Occultism](/Skills.aspx?ID=11) - -[Occultism](/Skills.aspx?ID=11) - -[Arcana](/Skills.aspx?ID=2) -[Occultism](/Skills.aspx?ID=11) - -[Occultism](/Skills.aspx?ID=11) -[Religion](/Skills.aspx?ID=13) - -[Occultism](/Skills.aspx?ID=11) - -[Arcana](/Skills.aspx?ID=2) -[Nature](/Skills.aspx?ID=10) -[Occultism](/Skills.aspx?ID=11) -[Religion](/Skills.aspx?ID=13) matching the ley line's tradition - -[Arcana](/Skills.aspx?ID=2) -[Nature](/Skills.aspx?ID=10) -[Occultism](/Skills.aspx?ID=11) -[Religion](/Skills.aspx?ID=13) based on the ley line - -[Religion](/Skills.aspx?ID=13) - -[Performance](/Skills.aspx?ID=12) - -[Occultism](/Skills.aspx?ID=11) - [Religion](/Skills.aspx?ID=13) - -DC 40 [Arcana](/Skills.aspx?ID=2) -[Nature](/Skills.aspx?ID=10) - -[Occultism](/Skills.aspx?ID=11) -[Religion](/Skills.aspx?ID=13) - -[Nature](/Skills.aspx?ID=10) - -[Religion](/Skills.aspx?ID=13) - -[Nature](/Skills.aspx?ID=10) - -[Nature](/Skills.aspx?ID=10) - -[Occultism](/Skills.aspx?ID=11) -[Religion](/Skills.aspx?ID=13) - -[Arcana](/Skills.aspx?ID=2) -[Occultism](/Skills.aspx?ID=11) - -[Occultism](/Skills.aspx?ID=11) -[Religion](/Skills.aspx?ID=13) - -[Occultism](/Skills.aspx?ID=11) -[Religion](/Skills.aspx?ID=13) - -[Occultism](/Skills.aspx?ID=11) -[Religion](/Skills.aspx?ID=13) - -[Occultism](/Skills.aspx?ID=11) -[Religion](/Skills.aspx?ID=13) - -[Arcana](/Skills.aspx?ID=2) -[Occultism](/Skills.aspx?ID=11) - -[Arcana](/Skills.aspx?ID=2) -[Occultism](/Skills.aspx?ID=11) - -[Religion](/Skills.aspx?ID=13) - -[Crafting](/Skills.aspx?ID=4) -[Occultism](/Skills.aspx?ID=11) -[Religion](/Skills.aspx?ID=13) - -[Arcana](/Skills.aspx?ID=2) - -[Nature](/Skills.aspx?ID=10) - -[Arcana](/Skills.aspx?ID=2) -[Occultism](/Skills.aspx?ID=11) - -[Occultism](/Skills.aspx?ID=11) - -[Fortune-Telling Lore](/Skills.aspx?ID=8) -[Occultism](/Skills.aspx?ID=11) - -[Performance](/Skills.aspx?ID=12) - -[Nature](/Skills.aspx?ID=10) - -[Nature](/Skills.aspx?ID=10) - -[Arcana](/Skills.aspx?ID=2) -[Nature](/Skills.aspx?ID=10) - -Occultism -Religion - -[Arcana](/Skills.aspx?ID=2) -[Occultism](/Skills.aspx?ID=11) - -[Arcana](/Skills.aspx?ID=2) - - [Nature](/Skills.aspx?ID=10) -[Religion](/Skills.aspx?ID=13) - -[Nature](/Skills.aspx?ID=10) - -[Arcana](/Skills.aspx?ID=2) -[Occultism](/Skills.aspx?ID=11) - -[Nature](/Skills.aspx?ID=10) - -[Occultism](/Skills.aspx?ID=11) -[Religion](/Skills.aspx?ID=13) - -[Occultism](/Skills.aspx?ID=11) - -[Nature](/Skills.aspx?ID=10) -[Occultism](/Skills.aspx?ID=11) -[Religion](/Skills.aspx?ID=13) - -[Religion](/Skills.aspx?ID=13) - -[Nature](/Skills.aspx?ID=10) - -[Arcana](/Skills.aspx?ID=2) -[Occultism](/Skills.aspx?ID=11) -[Religion](/Skills.aspx?ID=13) - -[Arcana](/Skills.aspx?ID=2) -[Occultism](/Skills.aspx?ID=11) -[Religion](/Skills.aspx?ID=13) - -[Arcana](/Skills.aspx?ID=2) -[Nature](/Skills.aspx?ID=10) -[Occultism](/Skills.aspx?ID=11) -[Religion](/Skills.aspx?ID=13) - -[Religion](/Skills.aspx?ID=13) - -[Nature](/Skills.aspx?ID=10) - -[Nature](/Skills.aspx?ID=10) - - [Religion](/Skills.aspx?ID=13) - -[Arcana](/Skills.aspx?ID=2) -[Nature](/Skills.aspx?ID=10) -[Occultism](/Skills.aspx?ID=11) -[Religion](/Skills.aspx?ID=13) as determined by the tradition of spell cast in the ritual - -[Arcana](/Skills.aspx?ID=2) -[Nature](/Skills.aspx?ID=10) -[Occultism](/Skills.aspx?ID=11) -[Religion](/Skills.aspx?ID=13) - -[Diplomacy ](/Skills.aspx?ID=39) - -[Occultism ](/Skills.aspx?ID=44) -[Survival](/Skills.aspx?ID=49) - -[Occultism ](/Skills.aspx?ID=44) -[Religion ](/Skills.aspx?ID=46) - -[Religion](/Skills.aspx?ID=46) - -[Performance ](/Skills.aspx?ID=45) - -[Cooking Lore](/Skills.aspx?ID=41) - -[Cooking Lore](/Skills.aspx?ID=41) -[Tea Lore ](/Skills.aspx?ID=41) - -[Crafting](/Skills.aspx?ID=37) - -[Athletics](/Skills.aspx?ID=36) - -[Medicine](/Skills.aspx?ID=42) - -[Perception](/Rules.aspx?ID=2298) - -[Diplomacy](/Skills.aspx?ID=39) - -[Religion](/Skills.aspx?ID=46) - -[Religion](/Skills.aspx?ID=46) - -[Religion](/Skills.aspx?ID=46) - -[Arcana](/Skills.aspx?ID=35) -[Occultism](/Skills.aspx?ID=44) - -[Crafting](/Skills.aspx?ID=37) - -[Arcana](/Skills.aspx?ID=35) -[Occultism](/Skills.aspx?ID=44) - -[Crafting](/Skills.aspx?ID=37) -[Nature](/Skills.aspx?ID=43) -[Society](/Skills.aspx?ID=47) - -[Arcana](/Skills.aspx?ID=35) -[Occultism](/Skills.aspx?ID=44) - -[Nature](/Skills.aspx?ID=43) -[Religion](/Skills.aspx?ID=46) - -[Arcana](/Skills.aspx?ID=35) -[Occultism](/Skills.aspx?ID=44) -[Religion](/Skills.aspx?ID=46) - -[Arcana](/Skills.aspx?ID=35) -[Occultism](/Skills.aspx?ID=44) - -[Nature](/Skills.aspx?ID=43) - -[Religion](/Skills.aspx?ID=46) - -[Arcana](/Skills.aspx?ID=35) -[Occultism](/Skills.aspx?ID=44) - -[Arcana](/Skills.aspx?ID=35) -[Occultism](/Skills.aspx?ID=44) - -[Arcana](/Skills.aspx?ID=35) -[Nature](/Skills.aspx?ID=43) -[Occultism](/Skills.aspx?ID=44) - -[Cooking Lore](/Skills.aspx?ID=41) -[Crafting](/Skills.aspx?ID=37) -[Performance](/Skills.aspx?ID=45) -[Survival](/Skills.aspx?ID=49) - -[Medicine](/Skills.aspx?ID=42) - -[Cooking Lore](/Skills.aspx?ID=41) -[Crafting](/Skills.aspx?ID=37) -[Performance](/Skills.aspx?ID=45) -[Survival](/Skills.aspx?ID=49) - -skill corresponding to the target’s casting tradition - -[Arcana](/Skills.aspx?ID=35) -[Occultism](/Skills.aspx?ID=44) - -[Diplomacy](/Skills.aspx?ID=39) -[Society](/Skills.aspx?ID=47) - -[Diplomacy](/Skills.aspx?ID=39) -[Society](/Skills.aspx?ID=47) - -[Arcana](/Skills.aspx?ID=35) -[Nature](/Skills.aspx?ID=43) -[Occultism](/Skills.aspx?ID=44) -[Religion](/Skills.aspx?ID=46) - -[Occultism](/Skills.aspx?ID=44) - -[Arcana](/Skills.aspx?ID=35) -[Occultism](/Skills.aspx?ID=44) - -[Arcana](/Skills.aspx?ID=35) -[Occultism](/Skills.aspx?ID=44) - -[Crafting](/Skills.aspx?ID=37) - -[Nature](/Skills.aspx?ID=43) - -[Performance](/Skills.aspx?ID=45) - -[Religion](/Skills.aspx?ID=46) - -[Nature](/Skills.aspx?ID=43) - -[Arcana](/Skills.aspx?ID=35) -[Nature](/Skills.aspx?ID=43) -[Occultism](/Skills.aspx?ID=44) -[Religion](/Skills.aspx?ID=46) - -[Nature](/Skills.aspx?ID=43) -[Occultism](/Skills.aspx?ID=44) -*/ diff --git a/Pf2eModel/Migrations/20250506124313_1.Designer.cs b/Pf2eModel/Migrations/20250506175505_1.Designer.cs similarity index 99% rename from Pf2eModel/Migrations/20250506124313_1.Designer.cs rename to Pf2eModel/Migrations/20250506175505_1.Designer.cs index 8164062..62f9c7e 100644 --- a/Pf2eModel/Migrations/20250506124313_1.Designer.cs +++ b/Pf2eModel/Migrations/20250506175505_1.Designer.cs @@ -13,7 +13,7 @@ using Pf2eModel.Model.Enum; namespace Pf2eModel.Migrations { [DbContext(typeof(Pf2eDbContext))] - [Migration("20250506124313_1")] + [Migration("20250506175505_1")] partial class _1 { /// @@ -1358,9 +1358,9 @@ namespace Pf2eModel.Migrations NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("IsSecondary") + b.Property("IsPrimary") .HasColumnType("boolean") - .HasColumnName("is_secondary") + .HasColumnName("is_primary") .HasColumnOrder(6); b.Property("Rank") diff --git a/Pf2eModel/Migrations/20250506124313_1.cs b/Pf2eModel/Migrations/20250506175505_1.cs similarity index 99% rename from Pf2eModel/Migrations/20250506124313_1.cs rename to Pf2eModel/Migrations/20250506175505_1.cs index e6384d3..f5785b7 100644 --- a/Pf2eModel/Migrations/20250506124313_1.cs +++ b/Pf2eModel/Migrations/20250506175505_1.cs @@ -889,7 +889,7 @@ namespace Pf2eModel.Migrations training_id = table.Column(type: "integer", nullable: true), training_string = table.Column(type: "jsonb", nullable: true), rank = table.Column(type: "training_rank", nullable: false), - is_secondary = table.Column(type: "boolean", nullable: false) + is_primary = table.Column(type: "boolean", nullable: false) }, constraints: table => { diff --git a/Pf2eModel/Migrations/Pf2eDbContextModelSnapshot.cs b/Pf2eModel/Migrations/Pf2eDbContextModelSnapshot.cs index 2b14fa3..4d0591a 100644 --- a/Pf2eModel/Migrations/Pf2eDbContextModelSnapshot.cs +++ b/Pf2eModel/Migrations/Pf2eDbContextModelSnapshot.cs @@ -1355,9 +1355,9 @@ namespace Pf2eModel.Migrations NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("IsSecondary") + b.Property("IsPrimary") .HasColumnType("boolean") - .HasColumnName("is_secondary") + .HasColumnName("is_primary") .HasColumnOrder(6); b.Property("Rank") diff --git a/Pf2eModel/Model/Structure/RitualRelation/RitualCheck.cs b/Pf2eModel/Model/Structure/RitualRelation/RitualCheck.cs index 76e7de5..a7742e3 100644 --- a/Pf2eModel/Model/Structure/RitualRelation/RitualCheck.cs +++ b/Pf2eModel/Model/Structure/RitualRelation/RitualCheck.cs @@ -30,5 +30,5 @@ public class RitualCheck public TrainingRank Rank { get; set; } [Column(Order = 6)] - public bool IsSecondary { get; set; } + public bool IsPrimary { get; set; } } diff --git a/Pf2eViewer/EntityView.cs b/Pf2eViewer/EntityView.cs index 3455a70..8ee8b7e 100644 --- a/Pf2eViewer/EntityView.cs +++ b/Pf2eViewer/EntityView.cs @@ -81,7 +81,12 @@ public class EntityView ), new Getter( EntityType.Ritual, - context => context.Rituals.Include(r => r.Area).Include(r => r.Checks) + context => + context + .Rituals.Include(r => r.Area) + .Include(r => r.Checks) + .ThenInclude(c => c.Training) + .AsQueryable() ), ];