Compare commits
5
Commits
54ef2cf331
...
53baa87144
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
53baa87144 | ||
|
|
fb8fbc9fbb | ||
|
|
74295465db | ||
|
|
3c65274b45 | ||
|
|
1a977ee988 |
+2
-1
@@ -365,4 +365,5 @@ FodyWeavers.xsd
|
|||||||
|
|
||||||
.vscode
|
.vscode
|
||||||
|
|
||||||
/Pf2eDataScrapper/.env
|
.env
|
||||||
|
.aider*
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ namespace Pf2eDataScrapper;
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Класс настроек.
|
/// Класс настроек.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal static class EnvSettings
|
public static class EnvSettings
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Загрузка файла настроек `.env`.
|
/// Загрузка файла настроек `.env`.
|
||||||
@@ -36,5 +36,8 @@ internal static class EnvSettings
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static string OutputDir => new(OutputDirPath);
|
public static string OutputDir => new(OutputDirPath);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Строка подключения к базе данных.
|
||||||
|
/// </summary>
|
||||||
public static string DatabaseConnection => EnvReader.GetStringValue("DATABASE_CONNECTION");
|
public static string DatabaseConnection => EnvReader.GetStringValue("DATABASE_CONNECTION");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,9 @@ internal abstract class AbstractImporter
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public abstract string Slug { get; }
|
public abstract string Slug { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Репозиторий для данных, загруженных из необходимых источников.
|
||||||
|
/// </summary>
|
||||||
public abstract AbstractImporterRepository Repository { get; }
|
public abstract AbstractImporterRepository Repository { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -1,33 +1,60 @@
|
|||||||
using Microsoft.EntityFrameworkCore;
|
using Pf2eModel;
|
||||||
using Pf2eModel;
|
|
||||||
using Slugify;
|
using Slugify;
|
||||||
|
|
||||||
namespace Pf2eDataScrapper.Importers;
|
namespace Pf2eDataScrapper.Importers;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Класс предоставляет методы для работы с базой данных.
|
||||||
|
/// </summary>
|
||||||
public class DatabaseHelper
|
public class DatabaseHelper
|
||||||
{
|
{
|
||||||
public Pf2eDbContext Context = new();
|
/// <summary>
|
||||||
|
/// Последний найденный идентификатор сущности.
|
||||||
public readonly SlugHelper Slugger = new();
|
/// Используется для генерации новых ID сущностей.
|
||||||
|
/// </summary>
|
||||||
private int _id;
|
private int _id;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Генерирует новый уникальный идентификатор сущности. и возвращает его.
|
||||||
|
/// </summary>
|
||||||
public int NextEntityId => ++_id;
|
public int NextEntityId => ++_id;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Сервис для работы с URL-Slug. Используется для преобразования названий в URL-friendly формат.
|
||||||
|
/// </summary>
|
||||||
|
public readonly SlugHelper Slugger = new();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Context для доступа к базе данных.
|
||||||
|
/// </summary>
|
||||||
|
public readonly Pf2eDbContext Context = new();
|
||||||
|
|
||||||
private DatabaseHelper()
|
private DatabaseHelper()
|
||||||
{
|
{
|
||||||
_id = Context.Entities.Any() ? Context.Entities.Max(e => e.Id) : 0;
|
_id = Context.Entities.Any() ? Context.Entities.Max(e => e.Id) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Генерирует slug из названия.
|
||||||
|
/// </summary>
|
||||||
public string GenerateSlug(string name)
|
public string GenerateSlug(string name)
|
||||||
{
|
{
|
||||||
return Slugger.GenerateSlug(name);
|
return Slugger.GenerateSlug(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Возвращает singleton-инстанцию класса <see cref="DatabaseHelper"/>.
|
||||||
|
/// </summary>
|
||||||
public static readonly DatabaseHelper Instance = new();
|
public static readonly DatabaseHelper Instance = new();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Контекст для доступа к базе данных.
|
||||||
|
/// </summary>
|
||||||
public static Pf2eDbContext DbContext => Instance.Context;
|
public static Pf2eDbContext DbContext => Instance.Context;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Обновляет контекст и сохраняет изменения в базе данных.
|
||||||
|
/// </summary>
|
||||||
public static void ResetContext()
|
public static void ResetContext()
|
||||||
{
|
{
|
||||||
Instance.Context.SaveChanges();
|
Instance.Context.SaveChanges();
|
||||||
|
|||||||
@@ -4,28 +4,42 @@ using Pf2eDataScrapper.Importers.Repositories;
|
|||||||
|
|
||||||
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd;
|
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Класс обработки данных с сайта Архивов Нефеса.
|
||||||
|
/// </summary>
|
||||||
internal class AonprdImporter : AbstractImporter
|
internal class AonprdImporter : AbstractImporter
|
||||||
{
|
{
|
||||||
public override string Name => SourceName;
|
/// <inheritdoc/>
|
||||||
|
public override string Name => TargetName;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override string Slug => "aonprd";
|
public override string Slug => "aonprd";
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override AbstractImporterRepository Repository =>
|
public override AbstractImporterRepository Repository =>
|
||||||
new AonprdRepository(this, "https://elasticsearch.aonprd.com");
|
new AonprdRepository(this, "https://elasticsearch.aonprd.com");
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Инструмент для работы с данными сайта Архивов Нефеса.
|
||||||
|
/// </summary>
|
||||||
public AonprdLoader Loader { get; }
|
public AonprdLoader Loader { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Конструктор класса <see cref="AonprdImporter"/>.
|
||||||
|
/// </summary>
|
||||||
public AonprdImporter()
|
public AonprdImporter()
|
||||||
{
|
{
|
||||||
Loader = new AonprdLoader(this);
|
Loader = new(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Prepare()
|
public override void Prepare()
|
||||||
{
|
{
|
||||||
Repository.Update();
|
Repository.Update();
|
||||||
Loader.Prepare();
|
Loader.Prepare();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void BuildSchemas()
|
public override void BuildSchemas()
|
||||||
{
|
{
|
||||||
AonprdSchemaBuilder builder = new(Loader);
|
AonprdSchemaBuilder builder = new(Loader);
|
||||||
@@ -34,6 +48,7 @@ internal class AonprdImporter : AbstractImporter
|
|||||||
builder.Save(EnvSettings.OutputDir);
|
builder.Save(EnvSettings.OutputDir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Import()
|
public override void Import()
|
||||||
{
|
{
|
||||||
AonprdDataBuilder builder = new(Loader);
|
AonprdDataBuilder builder = new(Loader);
|
||||||
@@ -43,5 +58,8 @@ internal class AonprdImporter : AbstractImporter
|
|||||||
builder.Build();
|
builder.Build();
|
||||||
}
|
}
|
||||||
|
|
||||||
public const string SourceName = "Archives of Nethys Pathfinder 2e";
|
/// <summary>
|
||||||
|
/// Название внешней ссылки.
|
||||||
|
/// </summary>
|
||||||
|
public const string TargetName = "Archives of Nethys Pathfinder 2e";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,23 +3,37 @@ using Pf2eDataScrapper.Importers.Implementations.Aonprd.Compendium;
|
|||||||
|
|
||||||
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd;
|
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Класс загрузки данных с сайта Архивов Нефеса.
|
||||||
|
/// </summary>
|
||||||
internal class AonprdLoader(AonprdImporter importer)
|
internal class AonprdLoader(AonprdImporter importer)
|
||||||
{
|
{
|
||||||
public AonprdImporter Importer = importer;
|
/// <summary>
|
||||||
|
/// Референс на импортер, используемый для загрузки данных.
|
||||||
|
/// </summary>
|
||||||
|
public AonprdImporter Importer { get; } = importer;
|
||||||
|
|
||||||
public AonprdCompendium Compendium = new();
|
/// <summary>
|
||||||
|
/// Компендиум данных с сайта Архивов Нефеса.
|
||||||
|
/// </summary>
|
||||||
|
public AonprdCompendium Compendium { get; } = new();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Число элементов в компендарии.
|
||||||
|
/// </summary>
|
||||||
public int ItemCount => Compendium.Count();
|
public int ItemCount => Compendium.Count();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Подготовка данных перед загрузкой.
|
||||||
|
/// </summary>
|
||||||
public void Prepare()
|
public void Prepare()
|
||||||
{
|
{
|
||||||
using StreamReader indexFile = new(Path.Combine(Importer.Dir, "index.json"));
|
using StreamReader indexFile = new(Path.Combine(Importer.Dir, "index.json"));
|
||||||
JObject indexJson = JObject.Parse(indexFile.ReadToEnd());
|
JObject indexJson = JObject.Parse(indexFile.ReadToEnd());
|
||||||
|
|
||||||
foreach (KeyValuePair<string, JToken?> kvp in indexJson)
|
foreach ((string file, JToken? value) in indexJson)
|
||||||
{
|
{
|
||||||
string file = kvp.Key;
|
JArray items = (JArray)value!;
|
||||||
JArray items = (JArray)kvp.Value!;
|
|
||||||
|
|
||||||
foreach (JToken item in items)
|
foreach (JToken item in items)
|
||||||
{
|
{
|
||||||
@@ -28,16 +42,30 @@ internal class AonprdLoader(AonprdImporter importer)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Возвращает коллекцию всех доступных загружаемых элементов.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Коллекция всех загружаемых элементов.</returns>
|
||||||
public IEnumerable<LoaderEntry> Entries()
|
public IEnumerable<LoaderEntry> Entries()
|
||||||
{
|
{
|
||||||
return Entries([.. Compendium.Types.Keys]);
|
return Entries([.. Compendium.Types.Keys]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Возвращает коллекцию доступных загружаемых элементов.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="types">Тип, которые нужно включить в результат.</param>
|
||||||
|
/// <returns>Коллекция загружаемых элементов, соответствующих предоставленному типу.</returns>
|
||||||
public IEnumerable<LoaderEntry> Entries(string types)
|
public IEnumerable<LoaderEntry> Entries(string types)
|
||||||
{
|
{
|
||||||
return Entries([types]);
|
return Entries([types]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Возвращает коллекцию доступных загружаемых элементов.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="types">Типы, которые нужно включить в результат.</param>
|
||||||
|
/// <returns>Коллекция загружаемых элементов, соответствующих предоставленным типам.</returns>
|
||||||
public IEnumerable<LoaderEntry> Entries(string[] types)
|
public IEnumerable<LoaderEntry> Entries(string[] types)
|
||||||
{
|
{
|
||||||
foreach (string file in Compendium.Files(types))
|
foreach (string file in Compendium.Files(types))
|
||||||
@@ -64,8 +92,14 @@ internal class AonprdLoader(AonprdImporter importer)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Класс, представляющий загружаемый элемент.
|
||||||
|
/// </summary>
|
||||||
public class LoaderEntry(string id, string file, JObject itemJson) : AonprdReference(id, file)
|
public class LoaderEntry(string id, string file, JObject itemJson) : AonprdReference(id, file)
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Возвращает JSON-объект, содерждающий данные о элементе.
|
||||||
|
/// </summary>
|
||||||
public JObject Json { get; } = itemJson;
|
public JObject Json { get; } = itemJson;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,13 +4,25 @@ using Pf2eDataScrapper.Importers.Repositories;
|
|||||||
|
|
||||||
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd;
|
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Основной класс для работы с репозиторием данных Aonprd.
|
||||||
|
/// </summary>
|
||||||
internal class AonprdRepository(AbstractImporter importer, string searchUrl)
|
internal class AonprdRepository(AbstractImporter importer, string searchUrl)
|
||||||
: AbstractImporterRepository(importer)
|
: AbstractImporterRepository(importer)
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// URL для доступа к API Aonprd.
|
||||||
|
/// </summary>
|
||||||
public readonly string SearchUrl = searchUrl;
|
public readonly string SearchUrl = searchUrl;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Текущая ревизия данных. Значение обновляется при обновлении репозитория.
|
||||||
|
/// </summary>
|
||||||
public int Revision { get; private set; }
|
public int Revision { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Метод для загрузки данных из API Aonprd.
|
||||||
|
/// </summary>
|
||||||
private string Load(string url)
|
private string Load(string url)
|
||||||
{
|
{
|
||||||
if (!url.StartsWith("http://") && !url.StartsWith("https://"))
|
if (!url.StartsWith("http://") && !url.StartsWith("https://"))
|
||||||
@@ -25,6 +37,7 @@ internal class AonprdRepository(AbstractImporter importer, string searchUrl)
|
|||||||
return reader.ReadToEnd();
|
return reader.ReadToEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Update()
|
public override void Update()
|
||||||
{
|
{
|
||||||
if (CheckRevision())
|
if (CheckRevision())
|
||||||
@@ -69,9 +82,9 @@ internal class AonprdRepository(AbstractImporter importer, string searchUrl)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Проверка актуальности данных
|
/// Проверка актуальности данных.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>true - актуальная ревизия, false - устаревшая/отсутсвует</returns>
|
/// <returns>true - актуальная ревизия, false - устаревшая/отсутсвует.</returns>
|
||||||
private bool CheckRevision()
|
private bool CheckRevision()
|
||||||
{
|
{
|
||||||
JObject page = JObject.Parse(Load("/aon/_doc/feat-1"));
|
JObject page = JObject.Parse(Load("/aon/_doc/feat-1"));
|
||||||
@@ -92,6 +105,11 @@ internal class AonprdRepository(AbstractImporter importer, string searchUrl)
|
|||||||
return lastRevision == Revision.ToString();
|
return lastRevision == Revision.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Запись данных в файл.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path">Путь к файлу.</param>
|
||||||
|
/// <param name="content">Содержимое, которе требуется записать в файл.</param>
|
||||||
private void WriteFile(string path, string content)
|
private void WriteFile(string path, string content)
|
||||||
{
|
{
|
||||||
string filePath = Path.Combine(RepositoryDirPath, path);
|
string filePath = Path.Combine(RepositoryDirPath, path);
|
||||||
|
|||||||
@@ -1,9 +1,20 @@
|
|||||||
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.Compendium;
|
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.Compendium;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Класс хранения данных компендиума.
|
||||||
|
/// </summary>
|
||||||
internal class AonprdCompendium
|
internal class AonprdCompendium
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Словарь данных компендиума.
|
||||||
|
/// </summary>
|
||||||
public readonly Dictionary<string, AonprdType> Types = [];
|
public readonly Dictionary<string, AonprdType> Types = [];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Добавить ссылку на сущность с указанием файла, в котором она хранится.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id">Идентификатор сущности.</param>
|
||||||
|
/// <param name="file">Имя файла.</param>
|
||||||
public void AddReference(string id, string file)
|
public void AddReference(string id, string file)
|
||||||
{
|
{
|
||||||
AonprdReference reference = new(id, file);
|
AonprdReference reference = new(id, file);
|
||||||
@@ -14,15 +25,29 @@ internal class AonprdCompendium
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Types.Add(reference.Type, new AonprdType(reference));
|
Types.Add(reference.Type, new(reference));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Возвращает количество элементов в компендиуме.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Количество элементов.</returns>
|
||||||
public int Count() => Types.Values.Sum(t => t.Count);
|
public int Count() => Types.Values.Sum(t => t.Count);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Возвращает количество элементов для указанных типов данных.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="types">Список типов.</param>
|
||||||
|
/// <returns>Количество элементов.</returns>
|
||||||
public int Count(IEnumerable<string> types) =>
|
public int Count(IEnumerable<string> types) =>
|
||||||
Types.Values.Where(t => types.Contains(t.Type)).Sum(t => t.Count);
|
Types.Values.Where(t => types.Contains(t.Type)).Sum(t => t.Count);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Возвращает список файлов для выбора сущностей указанных типов данных.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="types">Список типов.</param>
|
||||||
|
/// <returns>Список искомых файлов.</returns>
|
||||||
public IEnumerable<string> Files(IEnumerable<string> types) =>
|
public IEnumerable<string> Files(IEnumerable<string> types) =>
|
||||||
Types.Values.Where(t => types.Contains(t.Type)).SelectMany(t => t.Files).Distinct();
|
Types.Values.Where(t => types.Contains(t.Type)).SelectMany(t => t.Files).Distinct();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,37 @@
|
|||||||
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.Compendium;
|
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.Compendium;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Ссылка на сущность с указанием файла, в котором она хранится.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id">Идентификатор сущности.</param>
|
||||||
|
/// <param name="file">Имя файла.</param>
|
||||||
internal class AonprdReference(string id, string file)
|
internal class AonprdReference(string id, string file)
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Идентификатор сущности.
|
||||||
|
/// </summary>
|
||||||
public readonly string Id = id;
|
public readonly string Id = id;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Тип сущности.
|
||||||
|
/// </summary>
|
||||||
public readonly string Type = ResolveType(id);
|
public readonly string Type = ResolveType(id);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Имя файла, в котором хранится сущность.
|
||||||
|
/// </summary>
|
||||||
public readonly string File = file;
|
public readonly string File = file;
|
||||||
|
|
||||||
public static string ResolveType(string id)
|
/// <summary>
|
||||||
|
/// Определение типа сущности как префикса идентификатора.
|
||||||
|
/// </summary>
|
||||||
|
private static string ResolveType(string id)
|
||||||
{
|
{
|
||||||
static string? subType(string type, string cat)
|
string type = string.Join('-', id.Split('-')[..^1]);
|
||||||
|
|
||||||
|
return SubType(type, "equipment") ?? SubType(type, "weapon") ?? type;
|
||||||
|
|
||||||
|
static string? SubType(string type, string cat)
|
||||||
{
|
{
|
||||||
return type.StartsWith($"{cat}-") && type != cat
|
return type.StartsWith($"{cat}-") && type != cat
|
||||||
? type.EndsWith("-bonus")
|
? type.EndsWith("-bonus")
|
||||||
@@ -18,9 +39,5 @@ internal class AonprdReference(string id, string file)
|
|||||||
: $"{cat}-sub"
|
: $"{cat}-sub"
|
||||||
: null;
|
: null;
|
||||||
}
|
}
|
||||||
|
|
||||||
string type = string.Join('-', id.Split('-')[0..^1]);
|
|
||||||
|
|
||||||
return subType(type, "equipment") ?? subType(type, "weapon") ?? type;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,19 @@
|
|||||||
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.Compendium;
|
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.Compendium;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Класс AonprdType представляет собой уникальный тип данных, связанный с Aon (Advanced Opportunity Network).
|
||||||
|
/// Это основной класс, который хранит информацию о различных элементах системы.
|
||||||
|
/// </summary>
|
||||||
internal class AonprdType(string type)
|
internal class AonprdType(string type)
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Идентификатор типа данных.
|
||||||
|
/// </summary>
|
||||||
public readonly string Type = type;
|
public readonly string Type = type;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Список ссылок на сущности, связанных с этим типом.
|
||||||
|
/// </summary>
|
||||||
public readonly List<AonprdReference> Items = [];
|
public readonly List<AonprdReference> Items = [];
|
||||||
|
|
||||||
public AonprdType(AonprdReference reference)
|
public AonprdType(AonprdReference reference)
|
||||||
@@ -12,12 +22,21 @@ internal class AonprdType(string type)
|
|||||||
Items.Add(reference);
|
Items.Add(reference);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Добавляет новую ссылку в список.
|
||||||
|
/// </summary>
|
||||||
public void Add(AonprdReference reference)
|
public void Add(AonprdReference reference)
|
||||||
{
|
{
|
||||||
Items.Add(reference);
|
Items.Add(reference);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<string> Files => [.. Items.Select(x => x.File).Distinct()];
|
/// <summary>
|
||||||
|
/// Возвращает уникальные файлы, использованные в ссылках.
|
||||||
|
/// </summary>
|
||||||
|
public List<string> Files => Items.Select(x => x.File).Distinct().ToList();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Число элементов в списке ссылок.
|
||||||
|
/// </summary>
|
||||||
public int Count => Items.Count;
|
public int Count => Items.Count;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,12 +5,19 @@ using Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors;
|
|||||||
|
|
||||||
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder;
|
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Класс для создание схемы данных Архива Нефиса.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="loader"></param>
|
||||||
internal class AonprdDataBuilder(AonprdLoader loader)
|
internal class AonprdDataBuilder(AonprdLoader loader)
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Класс работы с базой данных.
|
||||||
|
/// </summary>
|
||||||
public readonly Pf2eDatabase Database = Pf2eDatabase.Instance;
|
public readonly Pf2eDatabase Database = Pf2eDatabase.Instance;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Загрузчик данных.
|
/// Основной класс для работы с данными Архива Нефиса.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public readonly AonprdLoader Loader = loader;
|
public readonly AonprdLoader Loader = loader;
|
||||||
|
|
||||||
@@ -19,8 +26,14 @@ internal class AonprdDataBuilder(AonprdLoader loader)
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public AonprdCompendium Compendium => Loader.Compendium;
|
public AonprdCompendium Compendium => Loader.Compendium;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Коллекция обработчиков данных.
|
||||||
|
/// </summary>
|
||||||
public readonly AonprdProcessorCollection Processors = new();
|
public readonly AonprdProcessorCollection Processors = new();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Очистить таблицы в базе данных.
|
||||||
|
/// </summary>
|
||||||
public void TruncateTables()
|
public void TruncateTables()
|
||||||
{
|
{
|
||||||
Console.WriteLine("Truncating all old data...");
|
Console.WriteLine("Truncating all old data...");
|
||||||
@@ -30,14 +43,29 @@ internal class AonprdDataBuilder(AonprdLoader loader)
|
|||||||
Console.WriteLine("Truncation completed!");
|
Console.WriteLine("Truncation completed!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Конфигурация интерфейса вывода результатов.
|
||||||
|
/// </summary>
|
||||||
protected ConcurrentWriter Window = null!;
|
protected ConcurrentWriter Window = null!;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Основное окно для вывода информации.
|
||||||
|
/// </summary>
|
||||||
protected Window Output = null!;
|
protected Window Output = null!;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Полоса прогресса для основного процесса обработки данных.
|
||||||
|
/// </summary>
|
||||||
protected ProgressBar ProcessProgressBar = null!;
|
protected ProgressBar ProcessProgressBar = null!;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Полоса прогресса для под-процессов обработки данных.
|
||||||
|
/// </summary>
|
||||||
protected ProgressBar SubProcessProgressBar = null!;
|
protected ProgressBar SubProcessProgressBar = null!;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Метод для настройки интерфейса.
|
||||||
|
/// </summary>
|
||||||
protected void ConfigureWindow()
|
protected void ConfigureWindow()
|
||||||
{
|
{
|
||||||
Window = new Window(0, 0, Console.WindowWidth, Console.WindowHeight).Concurrent();
|
Window = new Window(0, 0, Console.WindowWidth, Console.WindowHeight).Concurrent();
|
||||||
@@ -56,6 +84,9 @@ internal class AonprdDataBuilder(AonprdLoader loader)
|
|||||||
SubProcessProgressBar = new(bars, 1, 15);
|
SubProcessProgressBar = new(bars, 1, 15);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Обработка отдельного процессора данных.
|
||||||
|
/// </summary>
|
||||||
protected void RunProcessor(AonprdProcessorCollection.ProcessorItem item, JObject json)
|
protected void RunProcessor(AonprdProcessorCollection.ProcessorItem item, JObject json)
|
||||||
{
|
{
|
||||||
AonprdProcessorInput input = new(json);
|
AonprdProcessorInput input = new(json);
|
||||||
@@ -76,6 +107,9 @@ internal class AonprdDataBuilder(AonprdLoader loader)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Полная обработка и сохранение данных.
|
||||||
|
/// </summary>
|
||||||
public void Build()
|
public void Build()
|
||||||
{
|
{
|
||||||
ConfigureWindow();
|
ConfigureWindow();
|
||||||
|
|||||||
+35
@@ -1,5 +1,12 @@
|
|||||||
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder;
|
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Атрибут обработчика данных Архивов Нефиса.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name">Название обработчика.</param>
|
||||||
|
/// <param name="type">Тип данных, которые обработчик обрабатывает.</param>
|
||||||
|
/// <param name="dependencies">Названия обработчиков, которые должны быть выполнены до запуска этого обработчика.</param>
|
||||||
|
/// <param name="includeDefaults">Флаг, указывающий, следует ли добавить важные общие зависимости для обработчка.</param>
|
||||||
[AttributeUsage(AttributeTargets.Class)]
|
[AttributeUsage(AttributeTargets.Class)]
|
||||||
public class AonprdProcessorAttribute(
|
public class AonprdProcessorAttribute(
|
||||||
string name,
|
string name,
|
||||||
@@ -8,23 +15,51 @@ public class AonprdProcessorAttribute(
|
|||||||
bool includeDefaults = true
|
bool includeDefaults = true
|
||||||
) : Attribute
|
) : Attribute
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Важные общие зависимости для обработчка.
|
||||||
|
/// </summary>
|
||||||
private static readonly string[] DefaultDependencies = ["trait", "source"];
|
private static readonly string[] DefaultDependencies = ["trait", "source"];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Название обработчика.
|
||||||
|
/// </summary>
|
||||||
public readonly string Name = name;
|
public readonly string Name = name;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Тип данных, которые обработчик обрабатывает.
|
||||||
|
/// </summary>
|
||||||
public readonly string? Type = type;
|
public readonly string? Type = type;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Названия обработчиков, которые должны быть выполнены до запуска этого обработчика.
|
||||||
|
/// </summary>
|
||||||
public readonly IEnumerable<string> Dependencies =
|
public readonly IEnumerable<string> Dependencies =
|
||||||
[
|
[
|
||||||
.. includeDefaults ? DefaultDependencies : [],
|
.. includeDefaults ? DefaultDependencies : [],
|
||||||
.. dependencies,
|
.. dependencies,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Конструктор класса <see cref="AonprdProcessorAttribute"/> со стандартными общими зависимости для обработчка.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="type">Тип данных, которые обработчик обрабатывает. Также будет использоваться в качестве названия.</param>
|
||||||
public AonprdProcessorAttribute(string type)
|
public AonprdProcessorAttribute(string type)
|
||||||
: this(type, type, DefaultDependencies) { }
|
: this(type, type, DefaultDependencies) { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Конструктор класса <see cref="AonprdProcessorAttribute"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="type">Тип данных, которые обработчик обрабатывает. Также будет использоваться в качестве названия.</param>
|
||||||
|
/// <param name="dependencies">Названия обработчиков, которые должны быть выполнены до запуска этого обработчика.</param>
|
||||||
|
/// <param name="includeDefaults">Флаг, указывающий, следует ли добавить важные общие зависимости для обработчка.</param>
|
||||||
public AonprdProcessorAttribute(string type, string[] dependencies, bool includeDefaults = true)
|
public AonprdProcessorAttribute(string type, string[] dependencies, bool includeDefaults = true)
|
||||||
: this(type, type, dependencies, includeDefaults) { }
|
: this(type, type, dependencies, includeDefaults) { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Конструктор класса <see cref="AonprdProcessorAttribute"/> со стандартными общими зависимости для обработчка.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name">Название обработчика.</param>
|
||||||
|
/// <param name="type">Тип данных, которые обработчик обрабатывает.</param>
|
||||||
public AonprdProcessorAttribute(string name, string type)
|
public AonprdProcessorAttribute(string name, string type)
|
||||||
: this(name, type, DefaultDependencies) { }
|
: this(name, type, DefaultDependencies) { }
|
||||||
}
|
}
|
||||||
|
|||||||
+44
-3
@@ -3,21 +3,47 @@ using Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors;
|
|||||||
|
|
||||||
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder;
|
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Класс отвечает за управление обработчиками, отмеченных атрибутом <see cref="AonprdProcessorAttribute"/>.
|
||||||
|
/// </summary>
|
||||||
internal class AonprdProcessorCollection
|
internal class AonprdProcessorCollection
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Элемент коллекции обработчика.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="attribute">Атрибут, связанный с обаботчиком.</param>
|
||||||
|
/// <param name="constructor">Конструктор обработчика.</param>
|
||||||
public class ProcessorItem(AonprdProcessorAttribute attribute, ConstructorInfo constructor)
|
public class ProcessorItem(AonprdProcessorAttribute attribute, ConstructorInfo constructor)
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Атрибут, связанный с обаботчиком.
|
||||||
|
/// </summary>
|
||||||
public readonly AonprdProcessorAttribute Attribute = attribute;
|
public readonly AonprdProcessorAttribute Attribute = attribute;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Конструктор обработчика.
|
||||||
|
/// </summary>
|
||||||
public readonly ConstructorInfo Constructor = constructor;
|
public readonly ConstructorInfo Constructor = constructor;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Приоритет выполнения обработчика.
|
||||||
|
/// </summary>
|
||||||
public int Priority = -1;
|
public int Priority = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Список всех объявленных обработчиков.
|
||||||
|
/// </summary>
|
||||||
private readonly List<ProcessorItem> _allItems;
|
private readonly List<ProcessorItem> _allItems;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Список используемых обработчиков.
|
||||||
|
/// </summary>
|
||||||
public List<ProcessorItem> Items { get; private set; } = [];
|
public List<ProcessorItem> Items { get; private set; } = [];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Конструктор класса <see cref="AonprdProcessorCollection"/>, загружающий все обработчики.
|
||||||
|
/// </summary>
|
||||||
public AonprdProcessorCollection()
|
public AonprdProcessorCollection()
|
||||||
{
|
{
|
||||||
foreach (Type type in Assembly.GetExecutingAssembly().GetTypes())
|
foreach (Type type in Assembly.GetExecutingAssembly().GetTypes())
|
||||||
@@ -29,7 +55,7 @@ internal class AonprdProcessorCollection
|
|||||||
|
|
||||||
if (!type.IsSubclassOf(typeof(AbstractProcessor)))
|
if (!type.IsSubclassOf(typeof(AbstractProcessor)))
|
||||||
{
|
{
|
||||||
throw new Exception(
|
throw new(
|
||||||
$"'AonprdProcessor' attribute should only be applied to children of 'AbstractProcessor' class. '{type.FullName}' is not."
|
$"'AonprdProcessor' attribute should only be applied to children of 'AbstractProcessor' class. '{type.FullName}' is not."
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -56,6 +82,9 @@ internal class AonprdProcessorCollection
|
|||||||
_allItems = Items.ToList();
|
_allItems = Items.ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Проверка, что все зависимости всех обработчиков могут быть удовлетворены.
|
||||||
|
/// </summary>
|
||||||
private void CheckDependencies()
|
private void CheckDependencies()
|
||||||
{
|
{
|
||||||
foreach (ProcessorItem item in Items)
|
foreach (ProcessorItem item in Items)
|
||||||
@@ -72,6 +101,9 @@ internal class AonprdProcessorCollection
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Сортировать обработчики в соответсвии со всеми зависимостями.
|
||||||
|
/// </summary>
|
||||||
private void SortItems()
|
private void SortItems()
|
||||||
{
|
{
|
||||||
CheckDependencies();
|
CheckDependencies();
|
||||||
@@ -104,6 +136,10 @@ internal class AonprdProcessorCollection
|
|||||||
Items.Sort((a, b) => a.Priority - b.Priority);
|
Items.Sort((a, b) => a.Priority - b.Priority);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Итерация через все используемые обработчики.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Итератор.</returns>
|
||||||
public IEnumerable<ProcessorItem> Iterate()
|
public IEnumerable<ProcessorItem> Iterate()
|
||||||
{
|
{
|
||||||
SortItems();
|
SortItems();
|
||||||
@@ -114,9 +150,14 @@ internal class AonprdProcessorCollection
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UseOnlyNames(string[] processorNames)
|
/// <summary>
|
||||||
|
/// Ограничить список используемых обработчиков по названию.
|
||||||
|
/// Автоматически включает все обработчики, от которых зависят указанные в аргументе обработчики.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="processorNames">Коллекция названиий требуемых обработчиков.</param>
|
||||||
|
public void UseOnlyNames(ICollection<string> processorNames)
|
||||||
{
|
{
|
||||||
if (processorNames.Length == 0)
|
if (processorNames.Count == 0)
|
||||||
{
|
{
|
||||||
Items = _allItems;
|
Items = _allItems;
|
||||||
return;
|
return;
|
||||||
|
|||||||
+42
-6
@@ -3,8 +3,13 @@ using Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Helpers;
|
|||||||
|
|
||||||
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder;
|
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Класс для работы с JSON-объектом при обработки данных с Архивов Нефиса.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="input">JSON-объект, который будет использоваться для доступа к данным.</param>
|
||||||
internal class AonprdProcessorInput(JObject input) : ProcessorInput(input)
|
internal class AonprdProcessorInput(JObject input) : ProcessorInput(input)
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc/>
|
||||||
public override T Enum<T>(string value)
|
public override T Enum<T>(string value)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -17,6 +22,11 @@ internal class AonprdProcessorInput(JObject input) : ProcessorInput(input)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Обработать строку, содержащую информацию о количестве действий.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="input">Входная строка с данными.</param>
|
||||||
|
/// <returns>Структура, хранящая информацию о количетсве действий.</returns>
|
||||||
public ActionStruct ResolveActionString(string input)
|
public ActionStruct ResolveActionString(string input)
|
||||||
{
|
{
|
||||||
ActionStruct result = new();
|
ActionStruct result = new();
|
||||||
@@ -89,13 +99,39 @@ internal class AonprdProcessorInput(JObject input) : ProcessorInput(input)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Класс структуры, хранящей информацию о количетсве действий.
|
||||||
|
/// </summary>
|
||||||
public class ActionStruct
|
public class ActionStruct
|
||||||
{
|
{
|
||||||
public int Actions;
|
/// <summary>
|
||||||
public int MaxActions;
|
/// Количество действий
|
||||||
public bool IsPassive;
|
/// </summary>
|
||||||
public bool IsReaction;
|
public int Actions { get; set; }
|
||||||
public bool IsFreeAction;
|
|
||||||
public bool TwoRounds;
|
/// <summary>
|
||||||
|
/// Максимальное количество действий
|
||||||
|
/// </summary>
|
||||||
|
public int MaxActions { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Флаг, указывающий, что действия не требуются.
|
||||||
|
/// </summary>
|
||||||
|
public bool IsPassive { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Флаг, указывающий, что действие может быть использовано как реакция.
|
||||||
|
/// </summary>
|
||||||
|
public bool IsReaction { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Флаг, указывающий, что можно использовать свободное действие.
|
||||||
|
/// </summary>
|
||||||
|
public bool IsFreeAction { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Флаг, указывающий, что действие может быть продлено до 2 раундов.
|
||||||
|
/// </summary>
|
||||||
|
public bool TwoRounds { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+13
@@ -2,11 +2,24 @@
|
|||||||
|
|
||||||
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Helpers;
|
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Helpers;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Класс-помощник, хранящий необходимые глобальные данные.
|
||||||
|
/// Реализует шаблон <c>Singleton</c>.
|
||||||
|
/// </summary>
|
||||||
internal class AonprdBuilderGlobals
|
internal class AonprdBuilderGlobals
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Цель внешних ссылок Архивов Нефисов.
|
||||||
|
/// </summary>
|
||||||
public ExternalTarget AonprdTarget = null!;
|
public ExternalTarget AonprdTarget = null!;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Конструктор класса <see cref="AonprdBuilderGlobals"/>.
|
||||||
|
/// </summary>
|
||||||
private AonprdBuilderGlobals() { }
|
private AonprdBuilderGlobals() { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Экземпляр класса <see cref="AonprdBuilderGlobals"/>.
|
||||||
|
/// </summary>
|
||||||
public static readonly AonprdBuilderGlobals Instance = new();
|
public static readonly AonprdBuilderGlobals Instance = new();
|
||||||
}
|
}
|
||||||
|
|||||||
+36
-3
@@ -2,8 +2,14 @@
|
|||||||
|
|
||||||
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Helpers;
|
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Helpers;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Класс, помогающий разрешить строковые значения с Архивов Нефиса в перечисления.
|
||||||
|
/// </summary>
|
||||||
public static class AonprdEnumResolver
|
public static class AonprdEnumResolver
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Коллекция классов, разрешающих строковые значения в перечисления.
|
||||||
|
/// </summary>
|
||||||
private static readonly ICollection<Solver> Solvers =
|
private static readonly ICollection<Solver> Solvers =
|
||||||
[
|
[
|
||||||
new Solver<SourceCategory>(
|
new Solver<SourceCategory>(
|
||||||
@@ -18,11 +24,11 @@ public static class AonprdEnumResolver
|
|||||||
{ "Society", SourceCategory.Society },
|
{ "Society", SourceCategory.Society },
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
new Solver<AncestryVision>(
|
new Solver<VisionEnum>(
|
||||||
new()
|
new()
|
||||||
{
|
{
|
||||||
{ "Low-Light Vision", AncestryVision.LowLightVision },
|
{ "Low-Light VisionEnum", VisionEnum.LowLightVision },
|
||||||
{ "Darkvision", AncestryVision.DarkVision },
|
{ "Darkvision", VisionEnum.DarkVision },
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
new Solver<AttributeValues>(
|
new Solver<AttributeValues>(
|
||||||
@@ -62,6 +68,18 @@ public static class AonprdEnumResolver
|
|||||||
),
|
),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Разрешить строковое значение с Архивов Нефиса в перечисление.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Тип искомого перечисления.</typeparam>
|
||||||
|
/// <param name="value">Обрабатываемое строковоее значение.</param>
|
||||||
|
/// <returns>Значение искомого перечисления.</returns>
|
||||||
|
/// <exception cref="EnumResolverEnumUnknownException">
|
||||||
|
/// Исключение, если для указанного типа перечисления не указан класс, разрешающий строковые значения.
|
||||||
|
/// </exception>
|
||||||
|
/// <exception cref="EnumResolverValueUnknownException">
|
||||||
|
/// Исключение, если указанное значение не получилось преобразовать искомое значение.
|
||||||
|
/// </exception>
|
||||||
public static T Resolve<T>(string value)
|
public static T Resolve<T>(string value)
|
||||||
where T : Enum
|
where T : Enum
|
||||||
{
|
{
|
||||||
@@ -81,11 +99,17 @@ public static class AonprdEnumResolver
|
|||||||
: throw new EnumResolverValueUnknownException(type, value);
|
: throw new EnumResolverValueUnknownException(type, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Класс, разрешающий строковые значения в перечисления.
|
||||||
|
/// </summary>
|
||||||
private abstract class Solver
|
private abstract class Solver
|
||||||
{
|
{
|
||||||
public abstract Type Type { get; }
|
public abstract Type Type { get; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Абстрактный общий класс, разрешающий строковые значения в перечисления.
|
||||||
|
/// </summary>
|
||||||
private class Solver<T>(Dictionary<string, T> data) : Solver
|
private class Solver<T>(Dictionary<string, T> data) : Solver
|
||||||
where T : Enum
|
where T : Enum
|
||||||
{
|
{
|
||||||
@@ -93,9 +117,18 @@ public static class AonprdEnumResolver
|
|||||||
public Dictionary<string, T> Data { get; } = data;
|
public Dictionary<string, T> Data { get; } = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Исключение, указывающее, что для указанного типа перечисления не указан класс, разрешающий строковые значения.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="t">Тип искомого перечисления.</param>
|
||||||
public class EnumResolverEnumUnknownException(Type t)
|
public class EnumResolverEnumUnknownException(Type t)
|
||||||
: Exception($"Can't resolve type '{t.FullName}': Solver not defined");
|
: Exception($"Can't resolve type '{t.FullName}': Solver not defined");
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Исключение, указывающее, что указанное значение не получилось преобразовать искомое значение.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="t">Тип искомого перечисления.</param>
|
||||||
|
/// <param name="value">Искомое значение.</param>
|
||||||
public class EnumResolverValueUnknownException(Type t, string value)
|
public class EnumResolverValueUnknownException(Type t, string value)
|
||||||
: Exception($"Can't resolve type '{t.FullName}': Value '{value}' is not matched");
|
: Exception($"Can't resolve type '{t.FullName}': Value '{value}' is not matched");
|
||||||
}
|
}
|
||||||
|
|||||||
+61
-5
@@ -2,10 +2,22 @@
|
|||||||
|
|
||||||
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Helpers;
|
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Helpers;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Класс-помощник, для обработки строкового ввода с Архивов Нефиса.
|
||||||
|
/// Реализует шаблон <c>Singleton</c>.
|
||||||
|
/// </summary>
|
||||||
internal partial class StringHelper
|
internal partial class StringHelper
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Конструктор класса <see cref="StringHelper"/>
|
||||||
|
/// </summary>
|
||||||
private StringHelper() { }
|
private StringHelper() { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Разбиение строки по нестабильным строковым разделителям (например, <c>", "</c>, <c>" or "</c> и т.д.).
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="value">Исходная строка.</param>
|
||||||
|
/// <returns>Коллекция строк.</returns>
|
||||||
public List<string> RowSplit(string value)
|
public List<string> RowSplit(string value)
|
||||||
{
|
{
|
||||||
return value
|
return value
|
||||||
@@ -17,6 +29,11 @@ internal partial class StringHelper
|
|||||||
.ToList();
|
.ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Разбор списка ссылок в исходной строке.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="input">Исходная строка.</param>
|
||||||
|
/// <returns>Структура, содеражащая информацию разбиении строки по ссылкам.</returns>
|
||||||
public MarkdownLinkSplit ParseMarkdownLinks(string input)
|
public MarkdownLinkSplit ParseMarkdownLinks(string input)
|
||||||
{
|
{
|
||||||
MarkdownLinkSplit result = new();
|
MarkdownLinkSplit result = new();
|
||||||
@@ -39,31 +56,70 @@ internal partial class StringHelper
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Извлечение информации о названии источника.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="input">Исходная строка.</param>
|
||||||
|
/// <returns>Название источника.</returns>
|
||||||
public string ResolveSource(string input)
|
public string ResolveSource(string input)
|
||||||
{
|
{
|
||||||
Match match = SourceSuffixRegex().Match(input);
|
Match match = SourceSuffixRegex().Match(input);
|
||||||
return match.Captures.Count > 0 ? match.Captures[0].Value : "";
|
return match.Captures.Count > 0 ? match.Captures[0].Value : "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Экземпляр класса <see cref="StringHelper"/>.
|
||||||
|
/// </summary>
|
||||||
public static StringHelper Instance { get; } = new();
|
public static StringHelper Instance { get; } = new();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Регулярное выражение для извлечения источника из строки с Markdown-ссылкой.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Регулярное выражение.</returns>
|
||||||
[GeneratedRegex(@"^\[.*?\]\(.*?\)\s+(.*)$")]
|
[GeneratedRegex(@"^\[.*?\]\(.*?\)\s+(.*)$")]
|
||||||
public static partial Regex SourceSuffixRegex();
|
public static partial Regex SourceSuffixRegex();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Регулярное выражение для выявления Markdown-ссылок в строке.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Регулярное выражение.</returns>
|
||||||
[GeneratedRegex(@"(.*?)\[(.*?)\]\((.*?)\)")]
|
[GeneratedRegex(@"(.*?)\[(.*?)\]\((.*?)\)")]
|
||||||
public static partial Regex LinkRegex();
|
public static partial Regex LinkRegex();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Класс структуры, содеражащая информацию разбиении строки по ссылкам.
|
||||||
|
/// </summary>
|
||||||
internal class MarkdownLinkSplit
|
internal class MarkdownLinkSplit
|
||||||
{
|
{
|
||||||
public List<MarkdownLink> Links = [];
|
/// <summary>
|
||||||
|
/// Список содержащихся ссылок.
|
||||||
|
/// </summary>
|
||||||
|
public List<MarkdownLink> Links { get; } = [];
|
||||||
|
|
||||||
public string Suffix = "";
|
/// <summary>
|
||||||
|
/// Завершающая часть ссылки.
|
||||||
|
/// </summary>
|
||||||
|
public string Suffix { get; set; } = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Информация о ссылке в строке.
|
||||||
|
/// </summary>
|
||||||
internal class MarkdownLink
|
internal class MarkdownLink
|
||||||
{
|
{
|
||||||
public string Prefix { get; set; } = "";
|
/// <summary>
|
||||||
public string Text { get; set; } = "";
|
/// Данные, содержащиеся до ссылки.
|
||||||
public string Url { get; set; } = "";
|
/// </summary>
|
||||||
|
public string Prefix { get; init; } = "";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Текст ссылки.
|
||||||
|
/// </summary>
|
||||||
|
public string Text { get; init; } = "";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// URL ссылки.
|
||||||
|
/// </summary>
|
||||||
|
public string Url { get; init; } = "";
|
||||||
}
|
}
|
||||||
|
|||||||
+37
-3
@@ -1,29 +1,55 @@
|
|||||||
using Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Helpers;
|
using Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors;
|
||||||
using Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors;
|
|
||||||
using Pf2eModel.Model.Base;
|
using Pf2eModel.Model.Base;
|
||||||
using Pf2eModel.Model.Base.Source;
|
using Pf2eModel.Model.Base.Source;
|
||||||
using Pf2eModel.Model.Common.I18n;
|
using Pf2eModel.Model.Common.I18n;
|
||||||
|
|
||||||
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder;
|
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Обработчик сущностей, помеченных как устаревшие.
|
||||||
|
/// </summary>
|
||||||
internal class LegacyEntityHandler
|
internal class LegacyEntityHandler
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Идентификатор устаревшей сущности.
|
||||||
|
/// </summary>
|
||||||
public string LegacyId { get; private set; }
|
public string LegacyId { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Название устаревшей сущности.
|
||||||
|
/// </summary>
|
||||||
public string LegacyName { get; private set; } = "";
|
public string LegacyName { get; private set; } = "";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Коллекция источников устревшей сущности.
|
||||||
|
/// </summary>
|
||||||
public List<EntitySource> LegacySources { get; private set; } = [];
|
public List<EntitySource> LegacySources { get; private set; } = [];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Флаг, указывающий, что сведения об устаревшей сущности готовы к добавлению в обновлённые.
|
||||||
|
/// </summary>
|
||||||
public bool LegacyPrepared { get; private set; } = false;
|
public bool LegacyPrepared { get; private set; } = false;
|
||||||
|
|
||||||
public List<Entity> RemasterEntities = [];
|
/// <summary>
|
||||||
|
/// Список обновлённых сущностей, что отметели устаревшую сущность как предшественника.
|
||||||
|
/// </summary>
|
||||||
|
public List<Entity> RemasterEntities { get; } = [];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Конструктор класса <see cref="LegacyEntityHandler"/>, если сущность сама отмечена как устаревшая.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="processor">Обработчик устаревшей сущности.</param>
|
||||||
public LegacyEntityHandler(AbstractEntityProcessor processor)
|
public LegacyEntityHandler(AbstractEntityProcessor processor)
|
||||||
{
|
{
|
||||||
LegacyId = processor.Input.GetRequired<string>("id");
|
LegacyId = processor.Input.GetRequired<string>("id");
|
||||||
Prepare(processor);
|
Prepare(processor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Конструктор класса <see cref="LegacyEntityHandler"/>, если обновлённая сущность указывает на ещё недобавленную устаревшую сущность.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="legacyId">Идентификатор устаревшей сущности.</param>
|
||||||
|
/// <param name="remasterEntity">Обновлённая сущность.</param>
|
||||||
public LegacyEntityHandler(string legacyId, Entity remasterEntity)
|
public LegacyEntityHandler(string legacyId, Entity remasterEntity)
|
||||||
{
|
{
|
||||||
LegacyId = legacyId;
|
LegacyId = legacyId;
|
||||||
@@ -31,6 +57,10 @@ internal class LegacyEntityHandler
|
|||||||
RemasterEntities.Add(remasterEntity);
|
RemasterEntities.Add(remasterEntity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Подготовить данные об устравшей сущности.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="processor">Обработчик устаревшей сущности.</param>
|
||||||
public void Prepare(AbstractEntityProcessor processor)
|
public void Prepare(AbstractEntityProcessor processor)
|
||||||
{
|
{
|
||||||
if (LegacyPrepared)
|
if (LegacyPrepared)
|
||||||
@@ -48,6 +78,10 @@ internal class LegacyEntityHandler
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Применить данные устаревшей сущности к обновлённой.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="remasterEntity">Обновлённая сущность.</param>
|
||||||
public void Apply(Entity remasterEntity)
|
public void Apply(Entity remasterEntity)
|
||||||
{
|
{
|
||||||
if (!remasterEntity.Name.Contains(LegacyName))
|
if (!remasterEntity.Name.Contains(LegacyName))
|
||||||
|
|||||||
+96
-8
@@ -14,17 +14,37 @@ using Pf2eModel.Model.Structure;
|
|||||||
|
|
||||||
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors;
|
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Абстрактный класс-обработчик сущностей, полученных из Архивов Нефиса.
|
||||||
|
/// Класс предназначен для обработки данных с помощью различных обработчиков,
|
||||||
|
/// для которых указан атрибут <see cref="AonprdProcessorAttribute"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="input">Объект обработки вводимого JSON.</param>
|
||||||
|
/// <seealso cref="AonprdProcessorAttribute"/>
|
||||||
internal abstract class AbstractEntityProcessor(AonprdProcessorInput input)
|
internal abstract class AbstractEntityProcessor(AonprdProcessorInput input)
|
||||||
: AbstractProcessor(input)
|
: AbstractProcessor(input)
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Корневая сущность.
|
||||||
|
/// </summary>
|
||||||
public Entity Entity { get; } = new();
|
public Entity Entity { get; } = new();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Тип сущности.
|
||||||
|
/// </summary>
|
||||||
public abstract EntityType Type { get; }
|
public abstract EntityType Type { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Основная сущность.
|
||||||
|
/// </summary>
|
||||||
public abstract IEntity Object { get; }
|
public abstract IEntity Object { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Добавление основной сущности в контекст базы данных.
|
||||||
|
/// </summary>
|
||||||
public abstract void Add();
|
public abstract void Add();
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Process()
|
public override void Process()
|
||||||
{
|
{
|
||||||
if (Input.GetOptional<JArray>("remaster_id") is not null)
|
if (Input.GetOptional<JArray>("remaster_id") is not null)
|
||||||
@@ -42,27 +62,54 @@ internal abstract class AbstractEntityProcessor(AonprdProcessorInput input)
|
|||||||
ProcessLegacy();
|
ProcessLegacy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Save()
|
public override void Save()
|
||||||
{
|
{
|
||||||
Add();
|
Add();
|
||||||
Context.SaveChanges();
|
Context.SaveChanges();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Description generation
|
#region "Генерация описания"
|
||||||
|
|
||||||
protected virtual string[] AddedDescriptionPaths() => [];
|
/// <summary>
|
||||||
|
/// Получение списка полей, которые должны быть добавлены в описание.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
// [Obsolete("Данный метод будет отключён на финальных этапах разработки.")]
|
||||||
|
protected virtual ICollection<string> AddedDescriptionPaths() => [];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Создание строкового представления объекта по указанному пути для добавления к описанию сущности.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path">Путь к добавляемому объекту.</param>
|
||||||
|
/// <returns>Строковое представление для добавления к описанию сущности.</returns>
|
||||||
|
// [Obsolete("Данный метод будет отключён на финальных этапах разработки.")]
|
||||||
protected string AddedDescription(string path) =>
|
protected string AddedDescription(string path) =>
|
||||||
$"\r\n\r\n========== [{path}] ==========\r\n\r\n{Input.GetOptional<string>(path) ?? ""}";
|
$"\r\n\r\n========== [{path}] ==========\r\n\r\n{Input.GetOptional<object?>(path)?.ToString() ?? ""}";
|
||||||
|
|
||||||
protected string AddedDescription(string[] paths) =>
|
/// <summary>
|
||||||
|
/// Создание строкового представления объектов по указанным путям для добавления к описанию сущности.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="paths">Список путей к добавляемым объектам.</param>
|
||||||
|
/// <returns>Строковое представление для добавления к описанию сущности.</returns>
|
||||||
|
// [Obsolete("Данный метод будет отключён на финальных этапах разработки.")]
|
||||||
|
protected string AddedDescription(ICollection<string> paths) =>
|
||||||
string.Join("", paths.Select(AddedDescription));
|
string.Join("", paths.Select(AddedDescription));
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Сгенерировать описание сущности.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Описание сущности</returns>
|
||||||
protected virtual string GetDescription() =>
|
protected virtual string GetDescription() =>
|
||||||
Input.GetRequired<string>("markdown") + AddedDescription(AddedDescriptionPaths());
|
Input.GetRequired<string>("markdown") + AddedDescription(AddedDescriptionPaths());
|
||||||
|
|
||||||
// Entity generation
|
#endregion
|
||||||
|
|
||||||
|
#region "Генерация сущности"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Генерация основных полей корневой сущности.
|
||||||
|
/// </summary>
|
||||||
protected virtual void AddEntity()
|
protected virtual void AddEntity()
|
||||||
{
|
{
|
||||||
Entity.Id = Helper.NextEntityId;
|
Entity.Id = Helper.NextEntityId;
|
||||||
@@ -81,6 +128,9 @@ internal abstract class AbstractEntityProcessor(AonprdProcessorInput input)
|
|||||||
Context.Entities.Add(Entity);
|
Context.Entities.Add(Entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Генерация источников сущности.
|
||||||
|
/// </summary>
|
||||||
protected virtual void AddSource()
|
protected virtual void AddSource()
|
||||||
{
|
{
|
||||||
foreach (EntitySource entitySource in GetSources())
|
foreach (EntitySource entitySource in GetSources())
|
||||||
@@ -89,6 +139,9 @@ internal abstract class AbstractEntityProcessor(AonprdProcessorInput input)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Генерация внешних ссылок сущности.
|
||||||
|
/// </summary>
|
||||||
protected virtual void AddExternal()
|
protected virtual void AddExternal()
|
||||||
{
|
{
|
||||||
EntityExternal external = new()
|
EntityExternal external = new()
|
||||||
@@ -102,6 +155,10 @@ internal abstract class AbstractEntityProcessor(AonprdProcessorInput input)
|
|||||||
Context.EntityExternals.Add(external);
|
Context.EntityExternals.Add(external);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Генерация списка признаков сущности.
|
||||||
|
/// </summary>
|
||||||
|
/// <exception cref="Exception"></exception>
|
||||||
protected virtual void AddTraits()
|
protected virtual void AddTraits()
|
||||||
{
|
{
|
||||||
JToken? traitsJson = Input.Input.SelectToken("trait");
|
JToken? traitsJson = Input.Input.SelectToken("trait");
|
||||||
@@ -137,6 +194,13 @@ internal abstract class AbstractEntityProcessor(AonprdProcessorInput input)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Обработка сущности, отмеченной как устаревшей.
|
||||||
|
///
|
||||||
|
/// Обработка происходит в классе <see cref="LegacyEntityHandler"/>
|
||||||
|
/// </summary>
|
||||||
protected virtual void ProcessLegacy()
|
protected virtual void ProcessLegacy()
|
||||||
{
|
{
|
||||||
JArray? legacyIdArray = Input.GetOptional<JArray>("legacy_id");
|
JArray? legacyIdArray = Input.GetOptional<JArray>("legacy_id");
|
||||||
@@ -171,6 +235,10 @@ internal abstract class AbstractEntityProcessor(AonprdProcessorInput input)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получение списка источников сущности.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
public List<EntitySource> GetSources()
|
public List<EntitySource> GetSources()
|
||||||
{
|
{
|
||||||
string[] sourceNames = Input
|
string[] sourceNames = Input
|
||||||
@@ -186,7 +254,7 @@ internal abstract class AbstractEntityProcessor(AonprdProcessorInput input)
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<EntitySource> entitySources = new();
|
List<EntitySource> entitySources = [];
|
||||||
|
|
||||||
foreach (string sourceName in sourceNames)
|
foreach (string sourceName in sourceNames)
|
||||||
{
|
{
|
||||||
@@ -208,11 +276,16 @@ internal abstract class AbstractEntityProcessor(AonprdProcessorInput input)
|
|||||||
return entitySources;
|
return entitySources;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string GenerateExtra(params string[] args)
|
/// <summary>
|
||||||
|
/// Генерация JSON-строки из объектов, располагаюхися по путям, указанным в <paramref name="paths"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="paths">Коллекция путей, из которых необходимо достатить объекты.</param>
|
||||||
|
/// <returns>JSON-строка.</returns>
|
||||||
|
public string GenerateJsonString(params ICollection<string> paths)
|
||||||
{
|
{
|
||||||
Dictionary<string, object?> data = [];
|
Dictionary<string, object?> data = [];
|
||||||
|
|
||||||
foreach (string key in args)
|
foreach (string key in paths)
|
||||||
{
|
{
|
||||||
data.Add(key, Input.Input.SelectToken(key));
|
data.Add(key, Input.Input.SelectToken(key));
|
||||||
}
|
}
|
||||||
@@ -220,6 +293,12 @@ internal abstract class AbstractEntityProcessor(AonprdProcessorInput input)
|
|||||||
return JsonConvert.SerializeObject(data, new JsonSerializerSettings());
|
return JsonConvert.SerializeObject(data, new JsonSerializerSettings());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Создание контрольной суммы объекта.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="input">Строковое представление вычисляемого объекта.</param>
|
||||||
|
/// <param name="isLowercase">Использовать шестнадцатеричные цифры в нижнем регистре.</param>
|
||||||
|
/// <returns>Контрольная сумма объекта.</returns>
|
||||||
public static string Md5(string input, bool isLowercase = false)
|
public static string Md5(string input, bool isLowercase = false)
|
||||||
{
|
{
|
||||||
using MD5 md5 = MD5.Create();
|
using MD5 md5 = MD5.Create();
|
||||||
@@ -231,8 +310,17 @@ internal abstract class AbstractEntityProcessor(AonprdProcessorInput input)
|
|||||||
protected static readonly List<LegacyEntityHandler> LegacyHandlers = [];
|
protected static readonly List<LegacyEntityHandler> LegacyHandlers = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Исключение, показывающее, что обработка сущности пропускается как устаревшая.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name">Название сущности.</param>
|
||||||
public class LegacyItemException(string name)
|
public class LegacyItemException(string name)
|
||||||
: Exception($"Item '{name}' is linked with newer version, skipping.") { }
|
: Exception($"Item '{name}' is linked with newer version, skipping.") { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Исключение, показывающее, что обработка сущности пропускается.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name">Название сущности.</param>
|
||||||
|
/// <param name="reason">Причина пропуска.</param>
|
||||||
public class SkipItemException(string name, string reason)
|
public class SkipItemException(string name, string reason)
|
||||||
: Exception($"Item '{name}' is skipped, reason: {reason}.") { }
|
: Exception($"Item '{name}' is skipped, reason: {reason}.") { }
|
||||||
|
|||||||
+28
@@ -3,19 +3,47 @@ using Pf2eModel;
|
|||||||
|
|
||||||
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors;
|
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Абстрактный класс-обработчик данных, полученных из Архивов Нефиса.
|
||||||
|
/// Класс предназначен для обработки данных с помощью различных обработчиков,
|
||||||
|
/// для которых указан атрибут <see cref="AonprdProcessorAttribute"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="input">Объект обработки вводимого JSON.</param>
|
||||||
|
/// <seealso cref="AonprdProcessorAttribute"/>
|
||||||
internal abstract class AbstractProcessor(AonprdProcessorInput input)
|
internal abstract class AbstractProcessor(AonprdProcessorInput input)
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Вспомогательный класс для работы с базой данных.
|
||||||
|
/// </summary>
|
||||||
protected readonly DatabaseHelper Helper = DatabaseHelper.Instance;
|
protected readonly DatabaseHelper Helper = DatabaseHelper.Instance;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Вспомогательный класс для работы со строками и форматированием.
|
||||||
|
/// </summary>
|
||||||
protected readonly StringHelper StringHelper = StringHelper.Instance;
|
protected readonly StringHelper StringHelper = StringHelper.Instance;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Вспомогательный класс для работы с глобальными настройками.
|
||||||
|
/// </summary>
|
||||||
protected readonly AonprdBuilderGlobals Globals = AonprdBuilderGlobals.Instance;
|
protected readonly AonprdBuilderGlobals Globals = AonprdBuilderGlobals.Instance;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Контекст базы данных для работы с данными.
|
||||||
|
/// </summary>
|
||||||
public readonly Pf2eDbContext Context = DatabaseHelper.DbContext;
|
public readonly Pf2eDbContext Context = DatabaseHelper.DbContext;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Объект обработки вводимого JSON.
|
||||||
|
/// </summary>
|
||||||
public readonly AonprdProcessorInput Input = input;
|
public readonly AonprdProcessorInput Input = input;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Основной метод обработки данных.
|
||||||
|
/// </summary>
|
||||||
public abstract void Process();
|
public abstract void Process();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Метод для сохранения изменений в базе данных.
|
||||||
|
/// </summary>
|
||||||
public abstract void Save();
|
public abstract void Save();
|
||||||
}
|
}
|
||||||
|
|||||||
+25
-2
@@ -6,32 +6,56 @@ using Pf2eModel.Model.Structure;
|
|||||||
|
|
||||||
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors;
|
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Абстрактный класс-обработчик сущностей подклассов, полученных из Архивов Нефиса.
|
||||||
|
/// Класс предназначен для обработки данных с помощью различных обработчиков,
|
||||||
|
/// для которых указан атрибут <see cref="AonprdProcessorAttribute"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="input">Объект обработки вводимого JSON.</param>
|
||||||
|
/// <seealso cref="AonprdProcessorAttribute"/>
|
||||||
internal abstract class AbstractSubclassProcessor(AonprdProcessorInput input)
|
internal abstract class AbstractSubclassProcessor(AonprdProcessorInput input)
|
||||||
: AbstractEntityProcessor(input)
|
: AbstractEntityProcessor(input)
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc/>
|
||||||
public override EntityType Type => EntityType.Subclass;
|
public override EntityType Type => EntityType.Subclass;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public abstract override Subclass Object { get; }
|
public abstract override Subclass Object { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Название подкласса.
|
||||||
|
/// </summary>
|
||||||
public abstract string? ClassName { get; }
|
public abstract string? ClassName { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Название группы подклассов.
|
||||||
|
/// </summary>
|
||||||
public abstract string GroupName { get; }
|
public abstract string GroupName { get; }
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Add() => Context.Subclasses.Add(Object);
|
public override void Add() => Context.Subclasses.Add(Object);
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Process()
|
public override void Process()
|
||||||
{
|
{
|
||||||
base.Process();
|
base.Process();
|
||||||
|
|
||||||
Object.Group = GetGroup();
|
Object.Group = GetGroup();
|
||||||
|
ProcessObject();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Обработка полей подкласса.
|
||||||
|
/// </summary>
|
||||||
public abstract void ProcessObject();
|
public abstract void ProcessObject();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получение CLR-представления группы подклассов, к которому относится обрабатываемый подкласс.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>CLR-представления группы подклассов.</returns>
|
||||||
public SubclassGroup GetGroup()
|
public SubclassGroup GetGroup()
|
||||||
{
|
{
|
||||||
SubclassGroup? group = Context.SubclassGroups.FirstOrDefault(g =>
|
SubclassGroup? group = Context.SubclassGroups.FirstOrDefault(g =>
|
||||||
// ReSharper disable once EntityFramework.UnsupportedServerSideFunctionCall
|
|
||||||
Pf2eDbContext.LocaleSearch(g.Entity.Name, GroupName)
|
Pf2eDbContext.LocaleSearch(g.Entity.Name, GroupName)
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -42,7 +66,6 @@ internal abstract class AbstractSubclassProcessor(AonprdProcessorInput input)
|
|||||||
|
|
||||||
Class? cl = ClassName is not null
|
Class? cl = ClassName is not null
|
||||||
? Context.Classes.FirstOrDefault(c =>
|
? Context.Classes.FirstOrDefault(c =>
|
||||||
// ReSharper disable once EntityFramework.UnsupportedServerSideFunctionCall
|
|
||||||
Pf2eDbContext.LocaleSearch(c.Entity.Name, GroupName)
|
Pf2eDbContext.LocaleSearch(c.Entity.Name, GroupName)
|
||||||
)
|
)
|
||||||
: null;
|
: null;
|
||||||
|
|||||||
+1
-1
@@ -11,7 +11,7 @@ internal class ExternalProcessor(AonprdProcessorInput input) : AbstractProcessor
|
|||||||
{
|
{
|
||||||
AonprdTarget = new()
|
AonprdTarget = new()
|
||||||
{
|
{
|
||||||
Name = AonprdImporter.SourceName,
|
Name = AonprdImporter.TargetName,
|
||||||
Icon = "http://www.google.com/s2/favicons?domain=2e.aonprd.com",
|
Icon = "http://www.google.com/s2/favicons?domain=2e.aonprd.com",
|
||||||
Prefix = "https://2e.aonprd.com",
|
Prefix = "https://2e.aonprd.com",
|
||||||
};
|
};
|
||||||
|
|||||||
+7
-5
@@ -7,8 +7,15 @@ namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processo
|
|||||||
[AonprdProcessor("skill", [], false)]
|
[AonprdProcessor("skill", [], false)]
|
||||||
internal class SkillProcessor(AonprdProcessorInput input) : AbstractProcessor(input)
|
internal class SkillProcessor(AonprdProcessorInput input) : AbstractProcessor(input)
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Обучаемый объект.
|
||||||
|
/// </summary>
|
||||||
public Training Training = null!;
|
public Training Training = null!;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public override void Save() => Context.Trainings.Add(Training);
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Process()
|
public override void Process()
|
||||||
{
|
{
|
||||||
Training = new()
|
Training = new()
|
||||||
@@ -17,9 +24,4 @@ internal class SkillProcessor(AonprdProcessorInput input) : AbstractProcessor(in
|
|||||||
Type = TrainingType.Skill,
|
Type = TrainingType.Skill,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Save()
|
|
||||||
{
|
|
||||||
Context.Trainings.Add(Training);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
+5
@@ -6,8 +6,12 @@ namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processo
|
|||||||
[AonprdProcessor("source", [], false)]
|
[AonprdProcessor("source", [], false)]
|
||||||
internal class SourceProcessor(AonprdProcessorInput input) : AbstractProcessor(input)
|
internal class SourceProcessor(AonprdProcessorInput input) : AbstractProcessor(input)
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Источник сущности.
|
||||||
|
/// </summary>
|
||||||
protected Source Source = null!;
|
protected Source Source = null!;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Process()
|
public override void Process()
|
||||||
{
|
{
|
||||||
Source = new()
|
Source = new()
|
||||||
@@ -18,6 +22,7 @@ internal class SourceProcessor(AonprdProcessorInput input) : AbstractProcessor(i
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Save()
|
public override void Save()
|
||||||
{
|
{
|
||||||
Context.Sources.Add(Source);
|
Context.Sources.Add(Source);
|
||||||
|
|||||||
+7
-4
@@ -1,6 +1,4 @@
|
|||||||
using Microsoft.EntityFrameworkCore;
|
using Pf2eModel;
|
||||||
using Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Helpers;
|
|
||||||
using Pf2eModel;
|
|
||||||
using Pf2eModel.Model.Base;
|
using Pf2eModel.Model.Base;
|
||||||
using Pf2eModel.Model.Common;
|
using Pf2eModel.Model.Common;
|
||||||
using Pf2eModel.Model.Common.I18n;
|
using Pf2eModel.Model.Common.I18n;
|
||||||
@@ -12,12 +10,16 @@ namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processo
|
|||||||
[AonprdProcessor("apparition", ["class", "spell", "skill"])]
|
[AonprdProcessor("apparition", ["class", "spell", "skill"])]
|
||||||
internal class ApparitionProcessor(AonprdProcessorInput input) : AbstractSubclassProcessor(input)
|
internal class ApparitionProcessor(AonprdProcessorInput input) : AbstractSubclassProcessor(input)
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc/>
|
||||||
public override Subclass Object { get; } = new();
|
public override Subclass Object { get; } = new();
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override string ClassName => "Animist";
|
public override string ClassName => "Animist";
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override string GroupName => "Apparition";
|
public override string GroupName => "Apparition";
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void ProcessObject()
|
public override void ProcessObject()
|
||||||
{
|
{
|
||||||
// Spells
|
// Spells
|
||||||
@@ -52,7 +54,7 @@ internal class ApparitionProcessor(AonprdProcessorInput input) : AbstractSubclas
|
|||||||
|
|
||||||
foreach (string name in trainingNames)
|
foreach (string name in trainingNames)
|
||||||
{
|
{
|
||||||
Training? training = trainings.FirstOrDefault(t => t.Name!.Contains(name));
|
Training? training = trainings.FirstOrDefault(t => t.Name.Contains(name));
|
||||||
training ??= new()
|
training ??= new()
|
||||||
{
|
{
|
||||||
Name = new() { { LocaleType.English, name } },
|
Name = new() { { LocaleType.English, name } },
|
||||||
@@ -70,6 +72,7 @@ internal class ApparitionProcessor(AonprdProcessorInput input) : AbstractSubclas
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
protected override string GetDescription() =>
|
protected override string GetDescription() =>
|
||||||
base.GetDescription()
|
base.GetDescription()
|
||||||
+ AddedDescription(["skill_markdown", "spell_markdown", "summary_markdown"]);
|
+ AddedDescription(["skill_markdown", "spell_markdown", "summary_markdown"]);
|
||||||
|
|||||||
+16
-14
@@ -5,12 +5,16 @@ namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processo
|
|||||||
[AonprdProcessor("action")]
|
[AonprdProcessor("action")]
|
||||||
internal class ActionProcessor(AonprdProcessorInput input) : AbstractEntityProcessor(input)
|
internal class ActionProcessor(AonprdProcessorInput input) : AbstractEntityProcessor(input)
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc/>
|
||||||
public override EntityType Type => EntityType.Action;
|
public override EntityType Type => EntityType.Action;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override Pf2eModel.Model.Structure.Action Object { get; } = new();
|
public override Pf2eModel.Model.Structure.Action Object { get; } = new();
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Add() => Context.Actions.Add(Object);
|
public override void Add() => Context.Actions.Add(Object);
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Process()
|
public override void Process()
|
||||||
{
|
{
|
||||||
if (Input.GetRequired<string>("markdown").StartsWith("**Activate**"))
|
if (Input.GetRequired<string>("markdown").StartsWith("**Activate**"))
|
||||||
@@ -21,20 +25,18 @@ internal class ActionProcessor(AonprdProcessorInput input) : AbstractEntityProce
|
|||||||
base.Process();
|
base.Process();
|
||||||
|
|
||||||
Object.Actions = Input.EnumOptional("actions", ActionEnum.Passive);
|
Object.Actions = Input.EnumOptional("actions", ActionEnum.Passive);
|
||||||
Object.Extra = GenerateExtra("school");
|
Object.Extra = GenerateJsonString("school");
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override string GetDescription() =>
|
/// <inheritdoc/>
|
||||||
base.GetDescription()
|
protected override string[] AddedDescriptionPaths() =>
|
||||||
+ AddedDescription(
|
[
|
||||||
[
|
"cost_markdown",
|
||||||
"cost_markdown",
|
"trait_markdown",
|
||||||
"trait_markdown",
|
"source_markdown",
|
||||||
"source_markdown",
|
"search_markdown",
|
||||||
"search_markdown",
|
"requirement_markdown",
|
||||||
"requirement_markdown",
|
"trigger_markdown",
|
||||||
"trigger_markdown",
|
"summary_markdown",
|
||||||
"summary_markdown",
|
];
|
||||||
]
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-2
@@ -7,12 +7,16 @@ namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processo
|
|||||||
[AonprdProcessor("ancestry", ["trait", "source", "language"])]
|
[AonprdProcessor("ancestry", ["trait", "source", "language"])]
|
||||||
internal class AncestryProcessor(AonprdProcessorInput input) : AbstractEntityProcessor(input)
|
internal class AncestryProcessor(AonprdProcessorInput input) : AbstractEntityProcessor(input)
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc/>
|
||||||
public override EntityType Type => EntityType.Ancestry;
|
public override EntityType Type => EntityType.Ancestry;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override Ancestry Object { get; } = new();
|
public override Ancestry Object { get; } = new();
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Add() => Context.Ancestries.Add(Object);
|
public override void Add() => Context.Ancestries.Add(Object);
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Process()
|
public override void Process()
|
||||||
{
|
{
|
||||||
string type = Input.GetRequired<string>("type");
|
string type = Input.GetRequired<string>("type");
|
||||||
@@ -26,7 +30,7 @@ internal class AncestryProcessor(AonprdProcessorInput input) : AbstractEntityPro
|
|||||||
|
|
||||||
Object.Size = Input
|
Object.Size = Input
|
||||||
.GetRequired<JArray>("size")
|
.GetRequired<JArray>("size")
|
||||||
.Select(t => Input.Enum<Size>(t.ToString()))
|
.Select(t => Input.Enum<SizeEnum>(t.ToString()))
|
||||||
.ToArray();
|
.ToArray();
|
||||||
|
|
||||||
string hp = Input.GetRequired<string>("hp_raw");
|
string hp = Input.GetRequired<string>("hp_raw");
|
||||||
@@ -34,7 +38,7 @@ internal class AncestryProcessor(AonprdProcessorInput input) : AbstractEntityPro
|
|||||||
|
|
||||||
Object.Speed = Convert.ToInt32(Input.GetOptional<int>("speed.land"));
|
Object.Speed = Convert.ToInt32(Input.GetOptional<int>("speed.land"));
|
||||||
|
|
||||||
Object.Vision = Input.EnumOptional("vision", AncestryVision.Normal);
|
Object.VisionEnum = Input.EnumOptional("vision", VisionEnum.Normal);
|
||||||
|
|
||||||
AddBoosts("attribute", true);
|
AddBoosts("attribute", true);
|
||||||
AddBoosts("attribute_flaw", false);
|
AddBoosts("attribute_flaw", false);
|
||||||
|
|||||||
+7
-3
@@ -6,12 +6,16 @@ namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processo
|
|||||||
[AonprdProcessor("archetype")]
|
[AonprdProcessor("archetype")]
|
||||||
internal class ArchetypeProcessor(AonprdProcessorInput input) : AbstractEntityProcessor(input)
|
internal class ArchetypeProcessor(AonprdProcessorInput input) : AbstractEntityProcessor(input)
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc/>
|
||||||
public override EntityType Type => EntityType.Archetype;
|
public override EntityType Type => EntityType.Archetype;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override Archetype Object { get; } = new();
|
public override Archetype Object { get; } = new();
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Add() => Context.Archetypes.Add(Object);
|
public override void Add() => Context.Archetypes.Add(Object);
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Process()
|
public override void Process()
|
||||||
{
|
{
|
||||||
base.Process();
|
base.Process();
|
||||||
@@ -19,7 +23,7 @@ internal class ArchetypeProcessor(AonprdProcessorInput input) : AbstractEntityPr
|
|||||||
Object.Level = Input.GetOptional<int>("level");
|
Object.Level = Input.GetOptional<int>("level");
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override string GetDescription() =>
|
/// <inheritdoc/>
|
||||||
base.GetDescription()
|
protected override string[] AddedDescriptionPaths() =>
|
||||||
+ AddedDescription(["prerequisite_markdown", "requirement_markdown", "summary_markdown"]);
|
["prerequisite_markdown", "requirement_markdown", "summary_markdown"];
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-5
@@ -8,12 +8,16 @@ namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processo
|
|||||||
[AonprdProcessor("background")]
|
[AonprdProcessor("background")]
|
||||||
internal class BackgroundProcessor(AonprdProcessorInput input) : AbstractEntityProcessor(input)
|
internal class BackgroundProcessor(AonprdProcessorInput input) : AbstractEntityProcessor(input)
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc/>
|
||||||
public override EntityType Type => EntityType.Background;
|
public override EntityType Type => EntityType.Background;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override Background Object { get; } = new();
|
public override Background Object { get; } = new();
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Add() => Context.Backgrounds.Add(Object);
|
public override void Add() => Context.Backgrounds.Add(Object);
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Process()
|
public override void Process()
|
||||||
{
|
{
|
||||||
base.Process();
|
base.Process();
|
||||||
@@ -31,9 +35,7 @@ internal class BackgroundProcessor(AonprdProcessorInput input) : AbstractEntityP
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override string GetDescription() =>
|
/// <inheritdoc/>
|
||||||
base.GetDescription()
|
protected override string[] AddedDescriptionPaths() =>
|
||||||
+ AddedDescription(
|
["feat_markdown", "summary_markdown", "skill_markdown", "prerequisite_markdown"];
|
||||||
["feat_markdown", "summary_markdown", "skill_markdown", "prerequisite_markdown"]
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|||||||
+44
-12
@@ -6,18 +6,23 @@ using Pf2eModel.Model.Common.I18n;
|
|||||||
using Pf2eModel.Model.Enum;
|
using Pf2eModel.Model.Enum;
|
||||||
using Pf2eModel.Model.Structure;
|
using Pf2eModel.Model.Structure;
|
||||||
using Pf2eModel.Model.Structure.ClassRelation;
|
using Pf2eModel.Model.Structure.ClassRelation;
|
||||||
|
using static System.Text.RegularExpressions.Regex;
|
||||||
|
|
||||||
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors.Types;
|
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors.Types;
|
||||||
|
|
||||||
[AonprdProcessor("class", ["trait", "source", "skill"])]
|
[AonprdProcessor("class", ["trait", "source", "skill"])]
|
||||||
internal class ClassProcessor(AonprdProcessorInput input) : AbstractEntityProcessor(input)
|
internal partial class ClassProcessor(AonprdProcessorInput input) : AbstractEntityProcessor(input)
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc/>
|
||||||
public override EntityType Type => EntityType.Class;
|
public override EntityType Type => EntityType.Class;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override Class Object { get; } = new();
|
public override Class Object { get; } = new();
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Add() => Context.Classes.Add(Object);
|
public override void Add() => Context.Classes.Add(Object);
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Process()
|
public override void Process()
|
||||||
{
|
{
|
||||||
base.Process();
|
base.Process();
|
||||||
@@ -79,9 +84,13 @@ internal class ClassProcessor(AonprdProcessorInput input) : AbstractEntityProces
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ProcessDependecies();
|
ProcessClassTrait();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получение коллекции обучений, связанных с классом.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Коллекция обучения.</returns>
|
||||||
protected ICollection<ClassTraining> GetSkillTrainings()
|
protected ICollection<ClassTraining> GetSkillTrainings()
|
||||||
{
|
{
|
||||||
List<string> skillNames = Input
|
List<string> skillNames = Input
|
||||||
@@ -103,6 +112,12 @@ internal class ClassProcessor(AonprdProcessorInput input) : AbstractEntityProces
|
|||||||
.ToArray();
|
.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Обработка массива со списком обучений.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="array">JSON-массив обучений.</param>
|
||||||
|
/// <param name="type">Тип обучения.</param>
|
||||||
|
/// <returns>Коллекция обучений.</returns>
|
||||||
protected ICollection<ClassTraining> ProcessTraining(JArray array, TrainingType type)
|
protected ICollection<ClassTraining> ProcessTraining(JArray array, TrainingType type)
|
||||||
{
|
{
|
||||||
const string pattern = @"^(.*?) in\s+(?:the)?\s*(.*)$";
|
const string pattern = @"^(.*?) in\s+(?:the)?\s*(.*)$";
|
||||||
@@ -110,18 +125,16 @@ internal class ClassProcessor(AonprdProcessorInput input) : AbstractEntityProces
|
|||||||
|
|
||||||
foreach (string value in array.Select(token => token.ToString()))
|
foreach (string value in array.Select(token => token.ToString()))
|
||||||
{
|
{
|
||||||
MatchCollection m = Regex.Matches(value, pattern);
|
MatchCollection m = Matches(value, pattern);
|
||||||
|
|
||||||
if (m.Count == 0)
|
if (m.Count == 0)
|
||||||
{
|
{
|
||||||
throw new Exception($"Can't parse training string '{value}'");
|
throw new($"Can't parse training string '{value}'");
|
||||||
}
|
}
|
||||||
|
|
||||||
TrainingRank rank = Input.Enum<TrainingRank>(m[0].Groups[1].Value);
|
TrainingRank rank = Input.Enum<TrainingRank>(m[0].Groups[1].Value);
|
||||||
|
|
||||||
string[] parts = GetTrainingString(m[0].Groups[2].Value);
|
foreach (string part in GetTrainingString(m[0].Groups[2].Value))
|
||||||
|
|
||||||
foreach (string part in parts)
|
|
||||||
{
|
{
|
||||||
Training? training = Context.Trainings.FirstOrDefault(t =>
|
Training? training = Context.Trainings.FirstOrDefault(t =>
|
||||||
Pf2eDbContext.LocaleSearch(t.Name, part) && t.Type == type
|
Pf2eDbContext.LocaleSearch(t.Name, part) && t.Type == type
|
||||||
@@ -129,7 +142,7 @@ internal class ClassProcessor(AonprdProcessorInput input) : AbstractEntityProces
|
|||||||
|
|
||||||
if (training == null)
|
if (training == null)
|
||||||
{
|
{
|
||||||
training = new Training()
|
training = new()
|
||||||
{
|
{
|
||||||
Name = new() { [LocaleType.English] = part },
|
Name = new() { [LocaleType.English] = part },
|
||||||
Type = type,
|
Type = type,
|
||||||
@@ -152,17 +165,26 @@ internal class ClassProcessor(AonprdProcessorInput input) : AbstractEntityProces
|
|||||||
return trainings;
|
return trainings;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected string[] GetTrainingString(string value)
|
/// <summary>
|
||||||
|
/// Получение коллекции названий обучений из строкового представления из Архивов Нефиса.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="value">Строковое представление обучений из Архивов Нефиса.</param>
|
||||||
|
/// <returns>Коллекция названий обучений.</returns>
|
||||||
|
protected ICollection<string> GetTrainingString(string value)
|
||||||
{
|
{
|
||||||
return value.StartsWith("favored weapon of your deity") ? ["Favored weapon of your deity"]
|
return value.StartsWith("favored weapon of your deity") ? ["Favored weapon of your deity"]
|
||||||
: value == "simple and martial weapons" ? ["Simple weapon", "Martial weapon"]
|
: value == "simple and martial weapons" ? ["Simple weapon", "Martial weapon"]
|
||||||
: Regex
|
: TrainingStringSeparatorRegex()
|
||||||
.Split(value, @"\s*(?:,|and)\s*")
|
.Split(value)
|
||||||
.Where(s => s != "")
|
.Where(s => s != "")
|
||||||
.Select(s => string.Concat(s[0].ToString().ToUpper(), s.AsSpan(1)))
|
.Select(s => string.Concat(s[0].ToString().ToUpper(), s.AsSpan(1)))
|
||||||
.ToArray();
|
.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получение CLR-представления обучений спасброскам.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Коллекция обучений.</returns>
|
||||||
protected ICollection<ClassTraining> GetSaveTrainings()
|
protected ICollection<ClassTraining> GetSaveTrainings()
|
||||||
{
|
{
|
||||||
Dictionary<string, Training> result = Context
|
Dictionary<string, Training> result = Context
|
||||||
@@ -201,7 +223,10 @@ internal class ClassProcessor(AonprdProcessorInput input) : AbstractEntityProces
|
|||||||
.ToList();
|
.ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void ProcessDependecies()
|
/// <summary>
|
||||||
|
/// Объявление соотеветсвующего классу признака классовым.
|
||||||
|
/// </summary>
|
||||||
|
protected void ProcessClassTrait()
|
||||||
{
|
{
|
||||||
Trait? classTrait = Context.Traits.FirstOrDefault(t => t.Entity.Name == Entity.Name);
|
Trait? classTrait = Context.Traits.FirstOrDefault(t => t.Entity.Name == Entity.Name);
|
||||||
|
|
||||||
@@ -212,4 +237,11 @@ internal class ClassProcessor(AonprdProcessorInput input) : AbstractEntityProces
|
|||||||
|
|
||||||
classTrait.Type = TraitType.Class;
|
classTrait.Type = TraitType.Class;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получение регулярного выражения для разделения строки строкового представления обучений.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Регулярное выражение.</returns>
|
||||||
|
[GeneratedRegex(@"\s*(?:,|and)\s*")]
|
||||||
|
protected static partial Regex TrainingStringSeparatorRegex();
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-4
@@ -8,12 +8,16 @@ namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processo
|
|||||||
[AonprdProcessor("feat", ["trait", "source", "archetype"])]
|
[AonprdProcessor("feat", ["trait", "source", "archetype"])]
|
||||||
internal class FeatProcessor(AonprdProcessorInput input) : AbstractEntityProcessor(input)
|
internal class FeatProcessor(AonprdProcessorInput input) : AbstractEntityProcessor(input)
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc/>
|
||||||
public override EntityType Type => EntityType.Feat;
|
public override EntityType Type => EntityType.Feat;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override Feat Object { get; } = new();
|
public override Feat Object { get; } = new();
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Add() => Context.Feats.Add(Object);
|
public override void Add() => Context.Feats.Add(Object);
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Process()
|
public override void Process()
|
||||||
{
|
{
|
||||||
base.Process();
|
base.Process();
|
||||||
@@ -21,8 +25,8 @@ internal class FeatProcessor(AonprdProcessorInput input) : AbstractEntityProcess
|
|||||||
Object.Level = Input.GetRequired<int>("level");
|
Object.Level = Input.GetRequired<int>("level");
|
||||||
|
|
||||||
Object.Category = Entity.Traits.Any(t => t.Type == TraitType.Class)
|
Object.Category = Entity.Traits.Any(t => t.Type == TraitType.Class)
|
||||||
? ActionCategory.ClassFeat
|
? FeatCategory.Class
|
||||||
: ActionCategory.Unknown;
|
: FeatCategory.Uncategorized;
|
||||||
|
|
||||||
AonprdProcessorInput.ActionStruct action = Input.ResolveActionString(
|
AonprdProcessorInput.ActionStruct action = Input.ResolveActionString(
|
||||||
Input.GetOptional<string>("actions") ?? ""
|
Input.GetOptional<string>("actions") ?? ""
|
||||||
@@ -33,7 +37,7 @@ internal class FeatProcessor(AonprdProcessorInput input) : AbstractEntityProcess
|
|||||||
Object.IsPassive = action.IsPassive;
|
Object.IsPassive = action.IsPassive;
|
||||||
Object.IsReaction = action.IsReaction;
|
Object.IsReaction = action.IsReaction;
|
||||||
|
|
||||||
Object.Extra = GenerateExtra(
|
Object.Extra = GenerateJsonString(
|
||||||
"archetype",
|
"archetype",
|
||||||
"element",
|
"element",
|
||||||
"heighten",
|
"heighten",
|
||||||
@@ -54,7 +58,7 @@ internal class FeatProcessor(AonprdProcessorInput input) : AbstractEntityProcess
|
|||||||
|
|
||||||
if (archetypes.Length != 0)
|
if (archetypes.Length != 0)
|
||||||
{
|
{
|
||||||
Object.Category = ActionCategory.Archetype;
|
Object.Category = FeatCategory.Archetype;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (Archetype archetype in archetypes)
|
foreach (Archetype archetype in archetypes)
|
||||||
@@ -68,6 +72,7 @@ internal class FeatProcessor(AonprdProcessorInput input) : AbstractEntityProcess
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
protected override string GetDescription() =>
|
protected override string GetDescription() =>
|
||||||
base.GetDescription()
|
base.GetDescription()
|
||||||
+ AddedDescription(
|
+ AddedDescription(
|
||||||
|
|||||||
+3
@@ -6,9 +6,12 @@ namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processo
|
|||||||
[AonprdProcessor("language")]
|
[AonprdProcessor("language")]
|
||||||
internal class LanguageProcessor(AonprdProcessorInput input) : AbstractEntityProcessor(input)
|
internal class LanguageProcessor(AonprdProcessorInput input) : AbstractEntityProcessor(input)
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc/>
|
||||||
public override EntityType Type => EntityType.Language;
|
public override EntityType Type => EntityType.Language;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override Language Object { get; } = new();
|
public override Language Object { get; } = new();
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Add() => Context.Languages.Add(Object);
|
public override void Add() => Context.Languages.Add(Object);
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-8
@@ -1,30 +1,27 @@
|
|||||||
using System.Collections.Generic;
|
using System.Text.RegularExpressions;
|
||||||
using System.Diagnostics;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text.RegularExpressions;
|
|
||||||
using System.Xml.Linq;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Helpers;
|
using Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Helpers;
|
||||||
using Pf2eModel;
|
using Pf2eModel;
|
||||||
using Pf2eModel.Model.Common;
|
|
||||||
using Pf2eModel.Model.Common.I18n;
|
using Pf2eModel.Model.Common.I18n;
|
||||||
using Pf2eModel.Model.Enum;
|
using Pf2eModel.Model.Enum;
|
||||||
using Pf2eModel.Model.Structure;
|
using Pf2eModel.Model.Structure;
|
||||||
using Pf2eModel.Model.Structure.RitualRelation;
|
using Pf2eModel.Model.Structure.RitualRelation;
|
||||||
using Pf2eModel.Model.Structure.SpellRelation;
|
|
||||||
|
|
||||||
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors.Types;
|
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors.Types;
|
||||||
|
|
||||||
[AonprdProcessor("ritual", ["trait", "source", "skill"])]
|
[AonprdProcessor("ritual", ["trait", "source", "skill"])]
|
||||||
internal partial class RitualProcessor(AonprdProcessorInput input) : AbstractEntityProcessor(input)
|
internal partial class RitualProcessor(AonprdProcessorInput input) : AbstractEntityProcessor(input)
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc/>
|
||||||
public override EntityType Type => EntityType.Ritual;
|
public override EntityType Type => EntityType.Ritual;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override Ritual Object { get; } = new();
|
public override Ritual Object { get; } = new();
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Add() => Context.Rituals.Add(Object);
|
public override void Add() => Context.Rituals.Add(Object);
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Process()
|
public override void Process()
|
||||||
{
|
{
|
||||||
base.Process();
|
base.Process();
|
||||||
@@ -365,6 +362,7 @@ internal partial class RitualProcessor(AonprdProcessorInput input) : AbstractEnt
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
protected override string[] AddedDescriptionPaths() =>
|
protected override string[] AddedDescriptionPaths() =>
|
||||||
[
|
[
|
||||||
"summary_markdown",
|
"summary_markdown",
|
||||||
|
|||||||
+17
-5
@@ -1,11 +1,8 @@
|
|||||||
using System.Data;
|
using Newtonsoft.Json.Linq;
|
||||||
using Microsoft.EntityFrameworkCore.Migrations.Operations;
|
|
||||||
using Newtonsoft.Json.Linq;
|
|
||||||
using Pf2eModel.Model.Base.Source;
|
using Pf2eModel.Model.Base.Source;
|
||||||
using Pf2eModel.Model.Base.Targets;
|
using Pf2eModel.Model.Base.Targets;
|
||||||
using Pf2eModel.Model.Common.I18n;
|
using Pf2eModel.Model.Common.I18n;
|
||||||
using Pf2eModel.Model.Enum;
|
using Pf2eModel.Model.Enum;
|
||||||
using Pf2eModel.Model.Structure;
|
|
||||||
using Rule = Pf2eModel.Model.Structure.Rule;
|
using Rule = Pf2eModel.Model.Structure.Rule;
|
||||||
|
|
||||||
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors.Types.Rules;
|
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors.Types.Rules;
|
||||||
@@ -13,14 +10,21 @@ namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processo
|
|||||||
[AonprdProcessor("rules", ["rules-toc"])]
|
[AonprdProcessor("rules", ["rules-toc"])]
|
||||||
internal class RuleProcessor(AonprdProcessorInput input) : AbstractEntityProcessor(input)
|
internal class RuleProcessor(AonprdProcessorInput input) : AbstractEntityProcessor(input)
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc/>
|
||||||
public override EntityType Type => EntityType.Rule;
|
public override EntityType Type => EntityType.Rule;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override Rule Object { get; } = new();
|
public override Rule Object { get; } = new();
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Add() => Context.Rules.Add(Object);
|
public override void Add() => Context.Rules.Add(Object);
|
||||||
|
|
||||||
public readonly RuleTocCollection Toc = RuleTocCollection.Instance;
|
/// <summary>
|
||||||
|
/// Структура генерации содержания правил.
|
||||||
|
/// </summary>
|
||||||
|
public RuleTocCollection Toc { get; } = RuleTocCollection.Instance;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Process()
|
public override void Process()
|
||||||
{
|
{
|
||||||
// base.Process();
|
// base.Process();
|
||||||
@@ -93,6 +97,10 @@ internal class RuleProcessor(AonprdProcessorInput input) : AbstractEntityProcess
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получение источника, к которому относится правило.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Источник, к которому относится правило.</returns>
|
||||||
private Source GetSource()
|
private Source GetSource()
|
||||||
{
|
{
|
||||||
foreach (EntitySource entitySource in Entity.Sources)
|
foreach (EntitySource entitySource in Entity.Sources)
|
||||||
@@ -103,6 +111,10 @@ internal class RuleProcessor(AonprdProcessorInput input) : AbstractEntityProcess
|
|||||||
throw new("Source not found");
|
throw new("Source not found");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получение внешней ссылки, из которой получено правило.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Внешняя ссылка.</returns>
|
||||||
private EntityExternal GetExternal()
|
private EntityExternal GetExternal()
|
||||||
{
|
{
|
||||||
foreach (EntityExternal entityExternal in Entity.Externals)
|
foreach (EntityExternal entityExternal in Entity.Externals)
|
||||||
|
|||||||
+124
-6
@@ -1,17 +1,27 @@
|
|||||||
using System.Linq;
|
using Pf2eModel.Model.Base.Source;
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using LinqToDB.DataProvider.ClickHouse;
|
|
||||||
using Pf2eModel.Model.Base.Source;
|
|
||||||
|
|
||||||
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors.Types.Rules;
|
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors.Types.Rules;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Класс коллекции книг, содержащих правила.
|
||||||
|
/// Реализует шаблон <c>Singleton</c>.
|
||||||
|
/// </summary>
|
||||||
internal class RuleTocCollection
|
internal class RuleTocCollection
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Список книг, содержащих правила.
|
||||||
|
/// </summary>
|
||||||
public List<RuleTocBook> Books { get; } = [];
|
public List<RuleTocBook> Books { get; } = [];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Поиск книги по числовому идентификатору.
|
||||||
|
/// </summary>
|
||||||
public RuleTocBook this[int id] =>
|
public RuleTocBook this[int id] =>
|
||||||
Books.FirstOrDefault(i => i.SourceId == id) ?? throw new($"Book with id {id} not found");
|
Books.FirstOrDefault(i => i.SourceId == id) ?? throw new($"Book with id {id} not found");
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Поиск книги по CLR-представлению источника.
|
||||||
|
/// </summary>
|
||||||
public RuleTocBook this[Source source]
|
public RuleTocBook this[Source source]
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@@ -29,6 +39,9 @@ internal class RuleTocCollection
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Поиск книги по имени.
|
||||||
|
/// </summary>
|
||||||
public RuleTocBook? FindName(string name)
|
public RuleTocBook? FindName(string name)
|
||||||
{
|
{
|
||||||
foreach (RuleTocBook book in Books)
|
foreach (RuleTocBook book in Books)
|
||||||
@@ -42,6 +55,9 @@ internal class RuleTocCollection
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Поиск правила по идентификатору.
|
||||||
|
/// </summary>
|
||||||
public RuleTocItem? FindEntityId(int id)
|
public RuleTocItem? FindEntityId(int id)
|
||||||
{
|
{
|
||||||
foreach (RuleTocBook book in Books)
|
foreach (RuleTocBook book in Books)
|
||||||
@@ -57,13 +73,17 @@ internal class RuleTocCollection
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static RuleTocCollection Instance { get; } = new();
|
/// <summary>
|
||||||
|
/// Возвращает строковое представление коллекции в файле YAML.
|
||||||
|
/// </summary>
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
{
|
{
|
||||||
return string.Join("\n", Books.Select(book => book.ToString()).ToList());
|
return string.Join("\n", Books.Select(book => book.ToString()).ToList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Сохраняет коллекцию в файле YAML.
|
||||||
|
/// </summary>
|
||||||
public void SaveFile()
|
public void SaveFile()
|
||||||
{
|
{
|
||||||
string fileName =
|
string fileName =
|
||||||
@@ -74,15 +94,41 @@ internal class RuleTocCollection
|
|||||||
|
|
||||||
writer.Write(ToString());
|
writer.Write(ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Экземпляр класса <see cref="RuleTocCollection"/>.
|
||||||
|
/// </summary>
|
||||||
|
public static RuleTocCollection Instance { get; } = new();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Класс представляет собой книгу, содержащую правила.
|
||||||
|
/// </summary>
|
||||||
internal class RuleTocBook(Source source)
|
internal class RuleTocBook(Source source)
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Идентификатор источника.
|
||||||
|
/// </summary>
|
||||||
public int SourceId { get; } = source.Id;
|
public int SourceId { get; } = source.Id;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Названия источника.
|
||||||
|
/// </summary>
|
||||||
public string SourceName { get; } = source.Name;
|
public string SourceName { get; } = source.Name;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Список дочерних правил.
|
||||||
|
/// </summary>
|
||||||
|
/// <summary>
|
||||||
|
/// Список дочерних элементов.
|
||||||
|
/// </summary>
|
||||||
public List<RuleTocItem> Children { get; } = [];
|
public List<RuleTocItem> Children { get; } = [];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Находит элемент по хлебным крошкам.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="breadcrumbs">Массив хлебных крошек, указывающих на путь в дереве.</param>
|
||||||
|
/// <returns><see cref="RuleTocItem"/> или <c>null</c> если элемент не найден.</returns>
|
||||||
public RuleTocItem Get(string[] breadcrumbs)
|
public RuleTocItem Get(string[] breadcrumbs)
|
||||||
{
|
{
|
||||||
RuleTocItem? node = null;
|
RuleTocItem? node = null;
|
||||||
@@ -110,6 +156,12 @@ internal class RuleTocBook(Source source)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Проверяет, существует ли имя в текущей книге или дочерних элементах.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name">Имя для проверки.</param>
|
||||||
|
/// <param name="node">Начальный элемент для поиска.</param>
|
||||||
|
/// <returns>true если имя.</returns>
|
||||||
public bool IsNameExists(string name, RuleTocItem? node = null)
|
public bool IsNameExists(string name, RuleTocItem? node = null)
|
||||||
{
|
{
|
||||||
foreach (RuleTocItem item in node?.Children ?? Children)
|
foreach (RuleTocItem item in node?.Children ?? Children)
|
||||||
@@ -123,6 +175,12 @@ internal class RuleTocBook(Source source)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Находит элемент по идентификатору сущности.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id">Идентификатор сущности.</param>
|
||||||
|
/// <param name="node">Начальный узел для поиска.</param>
|
||||||
|
/// <returns><see cref="RuleTocItem"/> или <c>null</c> если элемент не найден.</returns>
|
||||||
public RuleTocItem? GetByEntityId(int id, RuleTocItem? node = null)
|
public RuleTocItem? GetByEntityId(int id, RuleTocItem? node = null)
|
||||||
{
|
{
|
||||||
if (node?.RuleId == id)
|
if (node?.RuleId == id)
|
||||||
@@ -143,6 +201,10 @@ internal class RuleTocBook(Source source)
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Возвращает строковое представление книги в файле YAML.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Строковое представление книги.</returns>
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
{
|
{
|
||||||
return $"\"{SourceName}\":\n"
|
return $"\"{SourceName}\":\n"
|
||||||
@@ -153,28 +215,67 @@ internal class RuleTocBook(Source source)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Класс представляет собой элемент дерева правил.
|
||||||
|
/// </summary>
|
||||||
internal class RuleTocItem(string name, RuleTocItem? parent)
|
internal class RuleTocItem(string name, RuleTocItem? parent)
|
||||||
{
|
{
|
||||||
public string? Id { get; set; } = null;
|
public string? Id { get; set; } = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Имя элемента.
|
||||||
|
/// </summary>
|
||||||
public string Name { get; } = name;
|
public string Name { get; } = name;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Идентификатор правила.
|
||||||
|
/// </summary>
|
||||||
public int? RuleId { get; set; } = null;
|
public int? RuleId { get; set; } = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Указывает, что элемент обрабатывается.
|
||||||
|
/// </summary>
|
||||||
public bool IsHandled { get; set; } = false;
|
public bool IsHandled { get; set; } = false;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Родительский элемент дерева.
|
||||||
|
/// </summary>
|
||||||
public RuleTocItem? Parent { get; } = parent;
|
public RuleTocItem? Parent { get; } = parent;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Порядок дочерних элементов.
|
||||||
|
/// </summary>
|
||||||
public List<string>? ChildrenOrder { get; set; } = null;
|
public List<string>? ChildrenOrder { get; set; } = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Коллекция дочерних элементов.
|
||||||
|
/// </summary>
|
||||||
public List<RuleTocItem> Children { get; } = [];
|
public List<RuleTocItem> Children { get; } = [];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Предыдущий идентификатор.
|
||||||
|
/// </summary>
|
||||||
public string? PreviousId { get; set; }
|
public string? PreviousId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Следующий идентификатор.
|
||||||
|
/// </summary>
|
||||||
public string? NextId { get; set; }
|
public string? NextId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Идентификатор первого дочернего элемента.
|
||||||
|
/// </summary>
|
||||||
public string? FirstChildId { get; set; }
|
public string? FirstChildId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Идентификатор последнего дочернего элемента.
|
||||||
|
/// </summary>
|
||||||
public string? LastChildId { get; set; }
|
public string? LastChildId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Возвращает строковое представление элемента содержания в файле YAML.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Строковое представление элемента содержания.</returns>
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
{
|
{
|
||||||
List<string> rows =
|
List<string> rows =
|
||||||
@@ -200,6 +301,12 @@ internal class RuleTocItem(string name, RuleTocItem? parent)
|
|||||||
return string.Join("\n", rows);
|
return string.Join("\n", rows);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Увеличение отступа строкового представления элемента содержания в файле YAML.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="amount">Количество отступов.</param>
|
||||||
|
/// <returns>Строковое представление элемента содержания с отступом.</returns>
|
||||||
|
/// <seealso cref="Tab"/>
|
||||||
public string Indent(int amount = 1)
|
public string Indent(int amount = 1)
|
||||||
{
|
{
|
||||||
string result = ToString();
|
string result = ToString();
|
||||||
@@ -210,10 +317,21 @@ internal class RuleTocItem(string name, RuleTocItem? parent)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Увеличение отступа строки.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="str">Входная строка.</param>
|
||||||
|
/// <returns>Строка с отступом.</returns>
|
||||||
|
/// <seealso cref="Tab"/>
|
||||||
public static string Indent(string str)
|
public static string Indent(string str)
|
||||||
{
|
{
|
||||||
return Tab + str.Replace("\n", $"\n{Tab}");
|
return Tab + str.Replace("\n", $"\n{Tab}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Строка отступа строки.
|
||||||
|
/// </summary>
|
||||||
|
/// <seealso cref="Indent(int)"/>
|
||||||
|
/// <seealso cref="Indent(string)"/>
|
||||||
public const string Tab = " ";
|
public const string Tab = " ";
|
||||||
}
|
}
|
||||||
|
|||||||
+43
-3
@@ -14,10 +14,17 @@ namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processo
|
|||||||
[AonprdProcessor("rules-order", null, ["rules"], false)]
|
[AonprdProcessor("rules-order", null, ["rules"], false)]
|
||||||
internal class RulesOrderProcessor(AonprdProcessorInput input) : AbstractProcessor(input)
|
internal class RulesOrderProcessor(AonprdProcessorInput input) : AbstractProcessor(input)
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Структура генерации содержания правил.
|
||||||
|
/// </summary>
|
||||||
public readonly RuleTocCollection Toc = RuleTocCollection.Instance;
|
public readonly RuleTocCollection Toc = RuleTocCollection.Instance;
|
||||||
|
|
||||||
private readonly List<OrderItem> OrderItems = [];
|
/// <summary>
|
||||||
|
/// Список записей о порядке правил в своих главах.
|
||||||
|
/// </summary>
|
||||||
|
private readonly List<OrderItem> _orderItems = [];
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Process()
|
public override void Process()
|
||||||
{
|
{
|
||||||
Toc.SaveFile();
|
Toc.SaveFile();
|
||||||
@@ -38,6 +45,10 @@ internal class RulesOrderProcessor(AonprdProcessorInput input) : AbstractProcess
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Обработка конкретного правила.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="rule"></param>
|
||||||
private void Process(Rule rule)
|
private void Process(Rule rule)
|
||||||
{
|
{
|
||||||
RuleTocItem? item = Toc.FindEntityId(rule.Id);
|
RuleTocItem? item = Toc.FindEntityId(rule.Id);
|
||||||
@@ -52,6 +63,10 @@ internal class RulesOrderProcessor(AonprdProcessorInput input) : AbstractProcess
|
|||||||
// Дети будут раставлены автоматически по связи
|
// Дети будут раставлены автоматически по связи
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Построение списка записей о порядке правил из дочерних элементов содержания.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="item">Элемент содержания, дочерние элементы которого необходимо обработать.</param>
|
||||||
private void BuildIdOrderDictionary(RuleTocItem item)
|
private void BuildIdOrderDictionary(RuleTocItem item)
|
||||||
{
|
{
|
||||||
List<RuleTocItem> items = [];
|
List<RuleTocItem> items = [];
|
||||||
@@ -88,6 +103,10 @@ internal class RulesOrderProcessor(AonprdProcessorInput input) : AbstractProcess
|
|||||||
BuildIdOrderDictionary(items);
|
BuildIdOrderDictionary(items);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Построение списка записей о порядке правил из списка элементов содержания.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="items">Список элементов содержания для обработки.</param>
|
||||||
private void BuildIdOrderDictionary(List<RuleTocItem> items)
|
private void BuildIdOrderDictionary(List<RuleTocItem> items)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < items.Count; i++)
|
for (int i = 0; i < items.Count; i++)
|
||||||
@@ -104,14 +123,20 @@ internal class RulesOrderProcessor(AonprdProcessorInput input) : AbstractProcess
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Добавление элемента содержания.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id">Идентификатор правила.</param>
|
||||||
|
/// <param name="order">Порядок правила.</param>
|
||||||
|
/// <param name="parentId">Идентификатор главы, в которой находится глава.</param>
|
||||||
private void AddOrderItem(int id, int order, int? parentId)
|
private void AddOrderItem(int id, int order, int? parentId)
|
||||||
{
|
{
|
||||||
if (OrderItems.Any(item => item.Id == id))
|
if (_orderItems.Any(item => item.Id == id))
|
||||||
{
|
{
|
||||||
throw new($"Order item with id {id} already exists");
|
throw new($"Order item with id {id} already exists");
|
||||||
}
|
}
|
||||||
|
|
||||||
OrderItems.Add(
|
_orderItems.Add(
|
||||||
new()
|
new()
|
||||||
{
|
{
|
||||||
Id = id,
|
Id = id,
|
||||||
@@ -121,15 +146,30 @@ internal class RulesOrderProcessor(AonprdProcessorInput input) : AbstractProcess
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Save()
|
public override void Save()
|
||||||
{
|
{
|
||||||
Context.SaveChanges();
|
Context.SaveChanges();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Запись, указывающая порядок правила в своей главе.
|
||||||
|
/// </summary>
|
||||||
private record OrderItem
|
private record OrderItem
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Идентификатор правила.
|
||||||
|
/// </summary>
|
||||||
public int Id { get; init; }
|
public int Id { get; init; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Порядок правила.
|
||||||
|
/// </summary>
|
||||||
public int Order { get; init; }
|
public int Order { get; init; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Идентификатор главы, в которой находится глава.
|
||||||
|
/// </summary>
|
||||||
public int? ParentId { get; init; }
|
public int? ParentId { get; init; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+28
-2
@@ -9,11 +9,22 @@ namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processo
|
|||||||
[AonprdProcessor("rules-toc", null, ["source"], false)]
|
[AonprdProcessor("rules-toc", null, ["source"], false)]
|
||||||
internal partial class RulesTocProcessor(AonprdProcessorInput input) : AbstractProcessor(input)
|
internal partial class RulesTocProcessor(AonprdProcessorInput input) : AbstractProcessor(input)
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Селектор HTML-элемента, в котором находится содержание.
|
||||||
|
/// </summary>
|
||||||
private const string Selector = "#ctl00_RadDrawer1_Content_MainContent_DetailedOutput";
|
private const string Selector = "#ctl00_RadDrawer1_Content_MainContent_DetailedOutput";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Ссылка на страницу с содержанием.
|
||||||
|
/// </summary>
|
||||||
private const string Url = "https://2e.aonprd.com/Rules.aspx";
|
private const string Url = "https://2e.aonprd.com/Rules.aspx";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Структура генерации содержания правил.
|
||||||
|
/// </summary>
|
||||||
public readonly RuleTocCollection Toc = RuleTocCollection.Instance;
|
public readonly RuleTocCollection Toc = RuleTocCollection.Instance;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Process()
|
public override void Process()
|
||||||
{
|
{
|
||||||
IDocument document = DownloadPage();
|
IDocument document = DownloadPage();
|
||||||
@@ -64,6 +75,12 @@ internal partial class RulesTocProcessor(AonprdProcessorInput input) : AbstractP
|
|||||||
Toc.SaveFile();
|
Toc.SaveFile();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Обработка ссылки в содержании для создания нового элемента содержания..
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="value">Строка с ссылкой.</param>
|
||||||
|
/// <param name="parent">Родительсий элемент, к которому будет относиться новый элемент содержания.</param>
|
||||||
|
/// <returns>Новый элемент содержания.</returns>
|
||||||
private RuleTocItem ParseLink(string value, RuleTocItem? parent = null)
|
private RuleTocItem ParseLink(string value, RuleTocItem? parent = null)
|
||||||
{
|
{
|
||||||
Match linkMatch = LinkRegex().Match(value);
|
Match linkMatch = LinkRegex().Match(value);
|
||||||
@@ -79,6 +96,10 @@ internal partial class RulesTocProcessor(AonprdProcessorInput input) : AbstractP
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Скачивание страницы, указанной в <see cref="Url"/>, и получение очищенного элемента, указанного в <see cref="Selector"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
private IDocument DownloadPage()
|
private IDocument DownloadPage()
|
||||||
{
|
{
|
||||||
IConfiguration config = Configuration.Default.WithDefaultLoader();
|
IConfiguration config = Configuration.Default.WithDefaultLoader();
|
||||||
@@ -89,7 +110,7 @@ internal partial class RulesTocProcessor(AonprdProcessorInput input) : AbstractP
|
|||||||
|
|
||||||
string html = root.OuterHtml;
|
string html = root.OuterHtml;
|
||||||
|
|
||||||
foreach (string s in new string[] { "br", "\r", "\n", "<u>", "</u>", "&NoRedirect=1" })
|
foreach (string s in new[] { "br", "\r", "\n", "<u>", "</u>", "&NoRedirect=1" })
|
||||||
{
|
{
|
||||||
html = html.Replace(s, "");
|
html = html.Replace(s, "");
|
||||||
}
|
}
|
||||||
@@ -97,8 +118,13 @@ internal partial class RulesTocProcessor(AonprdProcessorInput input) : AbstractP
|
|||||||
return context.OpenAsync(req => req.Content(html)).Result;
|
return context.OpenAsync(req => req.Content(html)).Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Save() { }
|
public override void Save() { }
|
||||||
|
|
||||||
[GeneratedRegex(@"<a href=""Rules\.aspx\?ID=(\d+)"">(.*?)</a>")]
|
/// <summary>
|
||||||
|
/// Получить скомпилированное регулярное выражение для получения HTML-ссылки.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Регулярное выражение получения HTML-ссылки.</returns>
|
||||||
|
[GeneratedRegex("""<a href="Rules\.aspx\?ID=(\d+)">(.*?)</a>""")]
|
||||||
public static partial Regex LinkRegex();
|
public static partial Regex LinkRegex();
|
||||||
}
|
}
|
||||||
|
|||||||
+24
-19
@@ -9,12 +9,16 @@ namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processo
|
|||||||
[AonprdProcessor("spell")]
|
[AonprdProcessor("spell")]
|
||||||
internal class SpellProcessor(AonprdProcessorInput input) : AbstractEntityProcessor(input)
|
internal class SpellProcessor(AonprdProcessorInput input) : AbstractEntityProcessor(input)
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc/>
|
||||||
public override EntityType Type => EntityType.Spell;
|
public override EntityType Type => EntityType.Spell;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override Spell Object { get; } = new();
|
public override Spell Object { get; } = new();
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Add() => Context.Spells.Add(Object);
|
public override void Add() => Context.Spells.Add(Object);
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Process()
|
public override void Process()
|
||||||
{
|
{
|
||||||
base.Process();
|
base.Process();
|
||||||
@@ -51,6 +55,9 @@ internal class SpellProcessor(AonprdProcessorInput input) : AbstractEntityProces
|
|||||||
ProcessArea();
|
ProcessArea();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Обработка области применения заклинания.
|
||||||
|
/// </summary>
|
||||||
private void ProcessArea()
|
private void ProcessArea()
|
||||||
{
|
{
|
||||||
List<string> areaTypes = (Input.GetOptional<string[]>("area_type") ?? []).ToList();
|
List<string> areaTypes = (Input.GetOptional<string[]>("area_type") ?? []).ToList();
|
||||||
@@ -112,23 +119,21 @@ internal class SpellProcessor(AonprdProcessorInput input) : AbstractEntityProces
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override string GetDescription() =>
|
/// <inheritdoc/>
|
||||||
base.GetDescription()
|
protected override string[] AddedDescriptionPaths() =>
|
||||||
+ AddedDescription(
|
[
|
||||||
[
|
"range",
|
||||||
"range",
|
"range_raw",
|
||||||
"range_raw",
|
"bloodline_markdown",
|
||||||
"bloodline_markdown",
|
"cost_markdown",
|
||||||
"cost_markdown",
|
"deity_markdown",
|
||||||
"deity_markdown",
|
"domain_markdown",
|
||||||
"domain_markdown",
|
"lesson_markdown",
|
||||||
"lesson_markdown",
|
"mystery_markdown",
|
||||||
"mystery_markdown",
|
"requirement_markdown",
|
||||||
"requirement_markdown",
|
"summary_markdown",
|
||||||
"summary_markdown",
|
"tradition_markdown",
|
||||||
"tradition_markdown",
|
"patron_theme_markdown",
|
||||||
"patron_theme_markdown",
|
"saving_throw_markdown",
|
||||||
"saving_throw_markdown",
|
];
|
||||||
]
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|||||||
+6
@@ -6,12 +6,16 @@ namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processo
|
|||||||
[AonprdProcessor("trait", ["external"], false)]
|
[AonprdProcessor("trait", ["external"], false)]
|
||||||
internal class TraitProcessor(AonprdProcessorInput input) : AbstractEntityProcessor(input)
|
internal class TraitProcessor(AonprdProcessorInput input) : AbstractEntityProcessor(input)
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc/>
|
||||||
public override EntityType Type => EntityType.Trait;
|
public override EntityType Type => EntityType.Trait;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override Trait Object { get; } = new();
|
public override Trait Object { get; } = new();
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Add() => Context.Traits.Add(Object);
|
public override void Add() => Context.Traits.Add(Object);
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Process()
|
public override void Process()
|
||||||
{
|
{
|
||||||
base.Process();
|
base.Process();
|
||||||
@@ -21,11 +25,13 @@ internal class TraitProcessor(AonprdProcessorInput input) : AbstractEntityProces
|
|||||||
Context.Traits.Add(Object);
|
Context.Traits.Add(Object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
protected override void AddTraits()
|
protected override void AddTraits()
|
||||||
{
|
{
|
||||||
// Необходимо пропускать
|
// Необходимо пропускать
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
protected override string GetDescription() =>
|
protected override string GetDescription() =>
|
||||||
base.GetDescription() + AddedDescription(["summary_markdown", "search_markdown"]);
|
base.GetDescription() + AddedDescription(["summary_markdown", "search_markdown"]);
|
||||||
}
|
}
|
||||||
|
|||||||
+35
-3
@@ -4,20 +4,34 @@ using Pf2eDataScrapper.SchemaBuilder;
|
|||||||
|
|
||||||
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.SchemaBuilder;
|
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.SchemaBuilder;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Класс создания схемы данных с сайта Архивов Нефеса.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="loader">Загузчик данных с сайта Архивов Нефеса.</param>
|
||||||
internal class AonprdSchemaBuilder(AonprdLoader loader)
|
internal class AonprdSchemaBuilder(AonprdLoader loader)
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Загузчик данных с сайта Архивов Нефеса.
|
||||||
|
/// </summary>
|
||||||
public readonly AonprdLoader Loader = loader;
|
public readonly AonprdLoader Loader = loader;
|
||||||
|
|
||||||
|
/// <inheritdoc cref="AonprdLoader.Compendium"/>
|
||||||
public readonly AonprdCompendium Compendium = loader.Compendium;
|
public readonly AonprdCompendium Compendium = loader.Compendium;
|
||||||
|
|
||||||
// public readonly AonprdSchemaTypeResolver Resolver = new();
|
// public readonly AonprdSchemaTypeResolver Resolver = new();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Дополнительные схемы данных.
|
||||||
|
/// </summary>
|
||||||
public readonly Dictionary<string, SchemaNode> Schemas = new()
|
public readonly Dictionary<string, SchemaNode> Schemas = new()
|
||||||
{
|
{
|
||||||
{ "_subclass", new SchemaNode {Path = "_subclass"} }
|
["_subclass"] = new() { Path = "_subclass" },
|
||||||
};
|
};
|
||||||
|
|
||||||
private string[] _subclassSchemaTypes =
|
/// <summary>
|
||||||
|
/// Список типов, являющихся подклассами.
|
||||||
|
/// </summary>
|
||||||
|
private readonly string[] _subclassSchemaTypes =
|
||||||
[
|
[
|
||||||
"research-field",
|
"research-field",
|
||||||
"apparition",
|
"apparition",
|
||||||
@@ -49,6 +63,11 @@ internal class AonprdSchemaBuilder(AonprdLoader loader)
|
|||||||
"epithet",
|
"epithet",
|
||||||
];
|
];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Выбор целевого элемента схемы данных для ввода.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="entry">Входные данные.</param>
|
||||||
|
/// <returns>Целевой элемент схемы данных.</returns>
|
||||||
private SchemaNode GetSchema(AonprdLoader.LoaderEntry entry)
|
private SchemaNode GetSchema(AonprdLoader.LoaderEntry entry)
|
||||||
{
|
{
|
||||||
string key = entry.Type;
|
string key = entry.Type;
|
||||||
@@ -58,7 +77,7 @@ internal class AonprdSchemaBuilder(AonprdLoader loader)
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
value = new SchemaNode
|
value = new()
|
||||||
{
|
{
|
||||||
// Resolver = Resolver,
|
// Resolver = Resolver,
|
||||||
Path = key,
|
Path = key,
|
||||||
@@ -68,6 +87,9 @@ internal class AonprdSchemaBuilder(AonprdLoader loader)
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Построение схемы данных.
|
||||||
|
/// </summary>
|
||||||
public void BuildSchemas()
|
public void BuildSchemas()
|
||||||
{
|
{
|
||||||
Console.WriteLine("Building schemas...");
|
Console.WriteLine("Building schemas...");
|
||||||
@@ -89,6 +111,10 @@ internal class AonprdSchemaBuilder(AonprdLoader loader)
|
|||||||
bar.Refresh(Loader.ItemCount, "Done!");
|
bar.Refresh(Loader.ItemCount, "Done!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Сохранение постренных схем данных.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="targetDir">Целевой каталог.</param>
|
||||||
public void Save(string targetDir)
|
public void Save(string targetDir)
|
||||||
{
|
{
|
||||||
Console.WriteLine("Dumping schemas...");
|
Console.WriteLine("Dumping schemas...");
|
||||||
@@ -105,6 +131,12 @@ internal class AonprdSchemaBuilder(AonprdLoader loader)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Сохранение отдельной схемы данных.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="dir">Целевой каталог.</param>
|
||||||
|
/// <param name="name">Название схемы.</param>
|
||||||
|
/// <param name="schema">Сохраняемая схема.</param>
|
||||||
protected void SaveSchema(string dir, string name, SchemaNode schema)
|
protected void SaveSchema(string dir, string name, SchemaNode schema)
|
||||||
{
|
{
|
||||||
char[] invalids = Path.GetInvalidFileNameChars();
|
char[] invalids = Path.GetInvalidFileNameChars();
|
||||||
|
|||||||
@@ -4,10 +4,23 @@ using Pf2eModel.Model.Common.I18n;
|
|||||||
|
|
||||||
namespace Pf2eDataScrapper.Importers;
|
namespace Pf2eDataScrapper.Importers;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Класс для работы с JSON-объектом.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="input">JSON-объект, который будет использоваться для доступа к данным.</param>
|
||||||
internal class ProcessorInput(JObject input)
|
internal class ProcessorInput(JObject input)
|
||||||
{
|
{
|
||||||
public readonly JObject Input = input;
|
/// <summary>
|
||||||
|
/// Входящий JSON-объект, который содержит данные для обработки.
|
||||||
|
/// </summary>
|
||||||
|
public JObject Input { get; } = input;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Значение из JSON по заданному пути, которое обязательно должно существовать.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path">Путь в JSON.</param>
|
||||||
|
/// <returns>Объект типа `T` или `null`, если не удалось найти значение.</returns>
|
||||||
|
/// <exception cref="NullReferenceException">Если значение не найдено.</exception>
|
||||||
public virtual T GetRequired<T>(string path)
|
public virtual T GetRequired<T>(string path)
|
||||||
{
|
{
|
||||||
JToken token =
|
JToken token =
|
||||||
@@ -16,6 +29,11 @@ internal class ProcessorInput(JObject input)
|
|||||||
return token.ToObject<T>() ?? throw new NullReferenceException($"'{path}' is null");
|
return token.ToObject<T>() ?? throw new NullReferenceException($"'{path}' is null");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Значение из JSON по заданному пути, которое может не существовать.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path">Путь в JSON</param>
|
||||||
|
/// <returns>Объект типа `T` или `null`, если значение не найдено</returns>
|
||||||
public virtual T? GetOptional<T>(string path)
|
public virtual T? GetOptional<T>(string path)
|
||||||
{
|
{
|
||||||
JToken? token = Input.SelectToken(path) ?? null;
|
JToken? token = Input.SelectToken(path) ?? null;
|
||||||
@@ -25,6 +43,12 @@ internal class ProcessorInput(JObject input)
|
|||||||
: token.ToObject<T>() ?? default;
|
: token.ToObject<T>() ?? default;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Значение из JSON по заданному пути с возможностью предоставить значение по умолчанию.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path">Путь в JSON.</param>
|
||||||
|
/// <param name="defaultValue">Значение, которое возвращается, если значение не найдено.</param>
|
||||||
|
/// <returns>Объект типа `T` или `defaultValue`, если значение не найдено.</returns>
|
||||||
public virtual T GetOptional<T>(string path, T defaultValue)
|
public virtual T GetOptional<T>(string path, T defaultValue)
|
||||||
{
|
{
|
||||||
JToken? token = Input.SelectToken(path) ?? null;
|
JToken? token = Input.SelectToken(path) ?? null;
|
||||||
@@ -35,6 +59,11 @@ internal class ProcessorInput(JObject input)
|
|||||||
return token.ToObject<T>() ?? defaultValue;
|
return token.ToObject<T>() ?? defaultValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Преобразование значения из JSON по заданному пути в перечисление с использованием `PgName` атрибута.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path">Путь в JSON.</param>
|
||||||
|
/// <returns>Перечисление T или выбрасывает исключение, если значение не соответствует жодному варианту.</returns>
|
||||||
public virtual T EnumRequired<T>(string path)
|
public virtual T EnumRequired<T>(string path)
|
||||||
where T : Enum
|
where T : Enum
|
||||||
{
|
{
|
||||||
@@ -45,6 +74,12 @@ internal class ProcessorInput(JObject input)
|
|||||||
return Enum<T>(value);
|
return Enum<T>(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Преобразование значения из JSON по заданному пути в перечисление с возможностью предоставить значение по умолчанию.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path">Путь в JSON</param>
|
||||||
|
/// <param name="defaultValue">Значение, которое возвращается, если значение не найдено.</param>
|
||||||
|
/// <returns>Значение перечисления T или defaultValue</returns>
|
||||||
public virtual T EnumOptional<T>(string path, T defaultValue)
|
public virtual T EnumOptional<T>(string path, T defaultValue)
|
||||||
where T : Enum
|
where T : Enum
|
||||||
{
|
{
|
||||||
@@ -65,11 +100,23 @@ internal class ProcessorInput(JObject input)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Преобразование значения из JSON по заданному пути в строку локализации для заданного типа локализации.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path">Путь в JSON.</param>
|
||||||
|
/// <param name="type">Тип локализации.</param>
|
||||||
|
/// <returns>Объект <see cref="LocaleString"/> с добавленным значением для заданного типа.</returns>
|
||||||
public virtual LocaleString GetRequiredLocale(string path, LocaleType type)
|
public virtual LocaleString GetRequiredLocale(string path, LocaleType type)
|
||||||
{
|
{
|
||||||
return new() { [type] = GetRequired<string>(path) };
|
return new() { [type] = GetRequired<string>(path) };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Преобразование значения из JSON по заданному пути в строку локализации для заданного типа локализации.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path">Путь в JSON.</param>
|
||||||
|
/// <param name="type">Тип локализации.</param>
|
||||||
|
/// <returns>Объект <see cref="LocaleString"/> или null, если значение не найдено.</returns>
|
||||||
public virtual LocaleString? GetOptionalLocale(string path, LocaleType type)
|
public virtual LocaleString? GetOptionalLocale(string path, LocaleType type)
|
||||||
{
|
{
|
||||||
string? value = GetOptional<string>(path);
|
string? value = GetOptional<string>(path);
|
||||||
@@ -80,6 +127,11 @@ internal class ProcessorInput(JObject input)
|
|||||||
return new() { [type] = value };
|
return new() { [type] = value };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Преобразование значения из JSON в перечисление.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="value">Значение, которое нужно преобразовать</param>
|
||||||
|
/// <returns>Объект типа `T`, если преобразование успешно, иначе выбрасывает исключение</returns>
|
||||||
public virtual T Enum<T>(string value)
|
public virtual T Enum<T>(string value)
|
||||||
where T : Enum
|
where T : Enum
|
||||||
{
|
{
|
||||||
@@ -104,6 +156,11 @@ internal class ProcessorInput(JObject input)
|
|||||||
throw new InvalidEnumStringException(typeof(T), value);
|
throw new InvalidEnumStringException(typeof(T), value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Исключение при неверном значении для перечисленния.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="type">Тип перечисленния.</param>
|
||||||
|
/// <param name="value">Некорректное значение.</param>
|
||||||
public class InvalidEnumStringException(Type type, string value)
|
public class InvalidEnumStringException(Type type, string value)
|
||||||
: Exception($"Invalid value '{value}' for enum type {type.FullName}.") { }
|
: Exception($"Invalid value '{value}' for enum type {type.FullName}.") { }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,26 @@
|
|||||||
namespace Pf2eDataScrapper.Importers.Repositories;
|
namespace Pf2eDataScrapper.Importers.Repositories;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Класс абстрактного репозитория.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="importer">Импортёр, использующий репозиторий.</param>
|
||||||
internal abstract class AbstractImporterRepository(AbstractImporter importer)
|
internal abstract class AbstractImporterRepository(AbstractImporter importer)
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Импортёр, использующий репозиторий.
|
||||||
|
/// </summary>
|
||||||
public readonly AbstractImporter Importer = importer;
|
public readonly AbstractImporter Importer = importer;
|
||||||
|
|
||||||
|
/// <inheritdoc cref="AbstractImporter.Dir"/>
|
||||||
public string RepositoryDirPath => Importer.Dir;
|
public string RepositoryDirPath => Importer.Dir;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// CLR-представкление директории с данными.
|
||||||
|
/// </summary>
|
||||||
public DirectoryInfo RepositoryDir => new(RepositoryDirPath);
|
public DirectoryInfo RepositoryDir => new(RepositoryDirPath);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Обновление данных в репозитории.
|
||||||
|
/// </summary>
|
||||||
public abstract void Update();
|
public abstract void Update();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,27 +2,31 @@
|
|||||||
|
|
||||||
namespace Pf2eDataScrapper.Importers.Repositories;
|
namespace Pf2eDataScrapper.Importers.Repositories;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Репозиторий, загружающий данные из GIT-источника.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="importer">Импортёр, использующий репозиторий.</param>
|
||||||
|
/// <param name="url">Ссылка на GIT-репозиторий.</param>
|
||||||
internal class GitRepository(AbstractImporter importer, string url)
|
internal class GitRepository(AbstractImporter importer, string url)
|
||||||
: AbstractImporterRepository(importer)
|
: AbstractImporterRepository(importer)
|
||||||
{
|
{
|
||||||
public readonly string Url = url;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Обновление импортёра
|
/// Ссылка на GIT-репозиторий.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
public string Url { get; } = url;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void Update()
|
public override void Update()
|
||||||
{
|
{
|
||||||
string gitPath = Path.Combine(RepositoryDirPath, Importer.Slug);
|
if (Directory.Exists(RepositoryDirPath))
|
||||||
|
|
||||||
if (Directory.Exists(gitPath))
|
|
||||||
{
|
{
|
||||||
// git pull
|
// git pull
|
||||||
Process process = new()
|
Process process = new()
|
||||||
{
|
{
|
||||||
StartInfo = new ProcessStartInfo()
|
StartInfo = new()
|
||||||
{
|
{
|
||||||
FileName = "git",
|
FileName = "git",
|
||||||
WorkingDirectory = gitPath,
|
WorkingDirectory = RepositoryDirPath,
|
||||||
Arguments = "pull",
|
Arguments = "pull",
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@@ -33,10 +37,10 @@ internal class GitRepository(AbstractImporter importer, string url)
|
|||||||
// git clone
|
// git clone
|
||||||
Process process = new()
|
Process process = new()
|
||||||
{
|
{
|
||||||
StartInfo = new ProcessStartInfo()
|
StartInfo = new()
|
||||||
{
|
{
|
||||||
FileName = "git",
|
FileName = "git",
|
||||||
WorkingDirectory = RepositoryDirPath,
|
WorkingDirectory = EnvSettings.DataDirPath,
|
||||||
Arguments = $"clone {Url} {Importer.Slug}",
|
Arguments = $"clone {Url} {Importer.Slug}",
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -3,11 +3,24 @@ using Npgsql;
|
|||||||
|
|
||||||
namespace Pf2eDataScrapper;
|
namespace Pf2eDataScrapper;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Main class for database connection and operations.
|
||||||
|
/// </summary>
|
||||||
public partial class Pf2eDatabase
|
public partial class Pf2eDatabase
|
||||||
{
|
{
|
||||||
public NpgsqlConnection Connection;
|
/// <summary>
|
||||||
|
/// Подключение к базе данных.
|
||||||
|
/// </summary>
|
||||||
|
public readonly NpgsqlConnection Connection;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Имя пользователя для подключения к базе данных.
|
||||||
|
/// </summary>
|
||||||
public readonly string Username;
|
public readonly string Username;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Название базы данных.
|
||||||
|
/// </summary>
|
||||||
public readonly string DatabaseName;
|
public readonly string DatabaseName;
|
||||||
|
|
||||||
private Pf2eDatabase()
|
private Pf2eDatabase()
|
||||||
@@ -15,7 +28,7 @@ public partial class Pf2eDatabase
|
|||||||
Username = UsernamePattern().Match(EnvSettings.DatabaseConnection).Groups[1].Value;
|
Username = UsernamePattern().Match(EnvSettings.DatabaseConnection).Groups[1].Value;
|
||||||
DatabaseName = DatabaseNamePattern().Match(EnvSettings.DatabaseConnection).Groups[1].Value;
|
DatabaseName = DatabaseNamePattern().Match(EnvSettings.DatabaseConnection).Groups[1].Value;
|
||||||
|
|
||||||
Connection = new NpgsqlConnection(EnvSettings.DatabaseConnection);
|
Connection = new(EnvSettings.DatabaseConnection);
|
||||||
Connection.Open();
|
Connection.Open();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -24,10 +37,19 @@ public partial class Pf2eDatabase
|
|||||||
Connection.Close();
|
Connection.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Singleton instance of the database connection manager.
|
||||||
|
/// </summary>
|
||||||
public static Pf2eDatabase Instance { get; } = new();
|
public static Pf2eDatabase Instance { get; } = new();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Current transaction associated with this database connection.
|
||||||
|
/// </summary>
|
||||||
public NpgsqlTransaction? Transaction { get; private set; }
|
public NpgsqlTransaction? Transaction { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Begin a new transaction on the database connection.
|
||||||
|
/// </summary>
|
||||||
public void StartTransaction()
|
public void StartTransaction()
|
||||||
{
|
{
|
||||||
if (Transaction != null)
|
if (Transaction != null)
|
||||||
@@ -38,6 +60,9 @@ public partial class Pf2eDatabase
|
|||||||
Transaction = Connection.BeginTransaction();
|
Transaction = Connection.BeginTransaction();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Commit the current transaction to the database.
|
||||||
|
/// </summary>
|
||||||
public void Commit()
|
public void Commit()
|
||||||
{
|
{
|
||||||
if (Transaction == null)
|
if (Transaction == null)
|
||||||
@@ -48,6 +73,10 @@ public partial class Pf2eDatabase
|
|||||||
Transaction.Commit();
|
Transaction.Commit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Execute a SQL command against the database.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sql">The SQL command to execute</param>
|
||||||
public void ExecuteCommand(string sql)
|
public void ExecuteCommand(string sql)
|
||||||
{
|
{
|
||||||
NpgsqlCommand command = GetCommand(sql);
|
NpgsqlCommand command = GetCommand(sql);
|
||||||
@@ -55,9 +84,14 @@ public partial class Pf2eDatabase
|
|||||||
command.ExecuteNonQuery();
|
command.ExecuteNonQuery();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a new SQL command for the database connection.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sql">The SQL command string</param>
|
||||||
|
/// <returns>A new NpgsqlCommand object</returns>
|
||||||
public NpgsqlCommand GetCommand(string sql)
|
public NpgsqlCommand GetCommand(string sql)
|
||||||
{
|
{
|
||||||
return new NpgsqlCommand(sql, Connection);
|
return new(sql, Connection);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
using Pf2eDataScrapper;
|
using Pf2eDataScrapper;
|
||||||
using Pf2eDataScrapper.Importers.Implementations.Aonprd;
|
using Pf2eDataScrapper.Importers.Implementations.Aonprd;
|
||||||
|
|
||||||
//Console.SetWindowSize(Console.LargestWindowWidth - 20, Console.LargestWindowHeight - 10);
|
// Console.SetWindowSize(Console.LargestWindowWidth - 20, Console.LargestWindowHeight - 10);
|
||||||
|
|
||||||
EnvSettings.Load();
|
EnvSettings.Load();
|
||||||
|
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ internal class SchemaNode
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public SchemaNode()
|
public SchemaNode()
|
||||||
{
|
{
|
||||||
this.Root = true;
|
Root = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -73,10 +73,10 @@ internal class SchemaNode
|
|||||||
/// <param name="name">Имя элемента.</param>
|
/// <param name="name">Имя элемента.</param>
|
||||||
public SchemaNode(SchemaNode parent, string name)
|
public SchemaNode(SchemaNode parent, string name)
|
||||||
{
|
{
|
||||||
this.Parent = parent;
|
Parent = parent;
|
||||||
this.Name = name;
|
Name = name;
|
||||||
this.Path = parent.Path + "." + name;
|
Path = parent.Path + "." + name;
|
||||||
this.Resolver = parent.Resolver;
|
Resolver = parent.Resolver;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -24,9 +24,8 @@ internal class TypeResolver
|
|||||||
string[] pathParts = path.Split('.');
|
string[] pathParts = path.Split('.');
|
||||||
string[] nodeParts = node.Path.Split('.');
|
string[] nodeParts = node.Path.Split('.');
|
||||||
|
|
||||||
return pathParts.Length > nodeParts.Length
|
return pathParts.Length <= nodeParts.Length
|
||||||
? false
|
&& !pathParts.Where((t, i) => t != "*" && t != nodeParts[i]).Any();
|
||||||
: !pathParts.Where((t, i) => t != "*" && t != nodeParts[i]).Any();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -76,7 +75,7 @@ internal class TypeResolver
|
|||||||
/// Возникает, если у `value` значение идентично `null`
|
/// Возникает, если у `value` значение идентично `null`
|
||||||
/// (такие значения должны обрабаотываться в `SchemaNode`).
|
/// (такие значения должны обрабаотываться в `SchemaNode`).
|
||||||
/// </exception>
|
/// </exception>
|
||||||
public AbstractSchemaType Resolve(SchemaNode node, JToken? value, bool disableResolve)
|
public AbstractSchemaType Resolve(SchemaNode node, JToken? value, bool disableResolve = false)
|
||||||
{
|
{
|
||||||
if (!disableResolve)
|
if (!disableResolve)
|
||||||
{
|
{
|
||||||
@@ -99,19 +98,4 @@ internal class TypeResolver
|
|||||||
_ => new StaticSchemaType(node, type),
|
_ => new StaticSchemaType(node, type),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Определение типа поля.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="node">Поле схемы данных, для которого создаётся тип.</param>
|
|
||||||
/// <param name="value">Добавляемое значение.</param>
|
|
||||||
/// <returns>Новый тип для схемы данных</returns>
|
|
||||||
/// <exception cref="ArgumentNullException">
|
|
||||||
/// Возникает, если у `value` значение идентично `null`
|
|
||||||
/// (такие значения должны обрабаотываться в `SchemaNode`).
|
|
||||||
/// </exception>
|
|
||||||
public AbstractSchemaType Resolve(SchemaNode node, JToken? value)
|
|
||||||
{
|
|
||||||
return this.Resolve(node, value, false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ internal abstract class AbstractSchemaType(SchemaNode parent)
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Элемент схемы данных, к которому относится тип.
|
/// Элемент схемы данных, к которому относится тип.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public SchemaNode Parent = parent;
|
public readonly SchemaNode Parent = parent;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Корневой элемент схемы данных.
|
/// Корневой элемент схемы данных.
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ internal class ArraySchemaType(SchemaNode parent) : AbstractSchemaType(parent)
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Схема элемента массива.
|
/// Схема элемента массива.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected SchemaNode ElementSchema = new(parent, "[]");
|
protected readonly SchemaNode ElementSchema = new(parent, "[]");
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Проверка, что значение совместимо с текущим типом.
|
/// Проверка, что значение совместимо с текущим типом.
|
||||||
@@ -41,7 +41,7 @@ internal class ArraySchemaType(SchemaNode parent) : AbstractSchemaType(parent)
|
|||||||
{
|
{
|
||||||
if (value.Type != JTokenType.Array)
|
if (value.Type != JTokenType.Array)
|
||||||
{
|
{
|
||||||
throw new Exception("Value is not an array, did you forget to call IsCompatibleValue?");
|
throw new("Value is not an array, did you forget to call IsCompatibleValue?");
|
||||||
}
|
}
|
||||||
|
|
||||||
JArray array = (JArray)value;
|
JArray array = (JArray)value;
|
||||||
|
|||||||
@@ -11,12 +11,12 @@ internal class DictionarySchemaType(SchemaNode parent) : AbstractSchemaType(pare
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Схема ключей словаря.
|
/// Схема ключей словаря.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public SchemaNode KeyNode = new(parent, "[key]");
|
public readonly SchemaNode KeyNode = new(parent, "[key]");
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Схема значений словаря.
|
/// Схема значений словаря.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public SchemaNode ItemNode = new(parent, "[value]");
|
public readonly SchemaNode ItemNode = new(parent, "[value]");
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Проверка, что значение совместимо с текущим типом.
|
/// Проверка, что значение совместимо с текущим типом.
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ internal class ObjectSchemaType(SchemaNode parent) : AbstractSchemaType(parent)
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Элемнты полей объекта.
|
/// Элемнты полей объекта.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public List<SchemaNode> Fields = [];
|
public readonly List<SchemaNode> Fields = [];
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Проверка, что значение совместимо с текущим типом.
|
/// Проверка, что значение совместимо с текущим типом.
|
||||||
@@ -31,12 +31,9 @@ internal class ObjectSchemaType(SchemaNode parent) : AbstractSchemaType(parent)
|
|||||||
{
|
{
|
||||||
JObject obj = (JObject)value;
|
JObject obj = (JObject)value;
|
||||||
|
|
||||||
foreach (SchemaNode field in Fields)
|
foreach (SchemaNode field in Fields.Where(field => !obj.ContainsKey(field.Name)))
|
||||||
{
|
{
|
||||||
if (!obj.ContainsKey(field.Name))
|
field.IsNullable = true;
|
||||||
{
|
|
||||||
field.IsNullable = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (KeyValuePair<string, JToken?> pair in obj)
|
foreach (KeyValuePair<string, JToken?> pair in obj)
|
||||||
@@ -45,7 +42,7 @@ internal class ObjectSchemaType(SchemaNode parent) : AbstractSchemaType(parent)
|
|||||||
|
|
||||||
if (field is null)
|
if (field is null)
|
||||||
{
|
{
|
||||||
field = new SchemaNode(Parent, pair.Key);
|
field = new(Parent, pair.Key);
|
||||||
Fields.Add(field);
|
Fields.Add(field);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -60,11 +57,9 @@ internal class ObjectSchemaType(SchemaNode parent) : AbstractSchemaType(parent)
|
|||||||
{
|
{
|
||||||
Fields.Sort(
|
Fields.Sort(
|
||||||
(a, b) =>
|
(a, b) =>
|
||||||
{
|
a.IsNullable && !b.IsNullable
|
||||||
return a.IsNullable && !b.IsNullable
|
|
||||||
? 0
|
? 0
|
||||||
: string.Compare(a.Name, b.Name, StringComparison.Ordinal);
|
: string.Compare(a.Name, b.Name, StringComparison.Ordinal)
|
||||||
}
|
|
||||||
);
|
);
|
||||||
|
|
||||||
foreach (SchemaNode field in Fields)
|
foreach (SchemaNode field in Fields)
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ internal class StaticSchemaType(SchemaNode parent, JTokenType type) : AbstractSc
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Тип значения.
|
/// Тип значения.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected JTokenType Type = type;
|
protected readonly JTokenType Type = type;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Набор возможных значений и их количества.
|
/// Набор возможных значений и их количества.
|
||||||
|
|||||||
@@ -1,15 +1,30 @@
|
|||||||
using System.Reflection;
|
using System.ComponentModel;
|
||||||
|
using System.Reflection;
|
||||||
using Pf2eModel.Model;
|
using Pf2eModel.Model;
|
||||||
using Pf2eModel.Model.Base;
|
using Pf2eModel.Model.Base;
|
||||||
using Pf2eModel.Model.Enum;
|
using Pf2eModel.Model.Enum;
|
||||||
|
|
||||||
namespace Pf2eModel;
|
namespace Pf2eModel;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Аттрибут, указывающий тип сущности.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="type">Тип сущности.</param>
|
||||||
[AttributeUsage(AttributeTargets.Class)]
|
[AttributeUsage(AttributeTargets.Class)]
|
||||||
public class EntityOfTypeAttribute(EntityType type) : Attribute
|
public class EntityOfTypeAttribute(EntityType type) : Attribute
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Тип сущности.
|
||||||
|
/// </summary>
|
||||||
public EntityType Type { get; } = type;
|
public EntityType Type { get; } = type;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Метод для получения программного типа сущности по её типу.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="entity">Тип сущности.</param>
|
||||||
|
/// <returns>Программный тип сущности.</returns>
|
||||||
|
/// <exception cref="Exception">Если есть ошибка в структурах.</exception>
|
||||||
|
/// <exception cref="InvalidEnumArgumentException">Тип сущности.</exception>
|
||||||
public static Type Resolve(Entity entity)
|
public static Type Resolve(Entity entity)
|
||||||
{
|
{
|
||||||
foreach (Type type in Assembly.GetExecutingAssembly().GetTypes())
|
foreach (Type type in Assembly.GetExecutingAssembly().GetTypes())
|
||||||
@@ -21,7 +36,7 @@ public class EntityOfTypeAttribute(EntityType type) : Attribute
|
|||||||
|
|
||||||
if (!type.IsAssignableTo(typeof(IEntity)))
|
if (!type.IsAssignableTo(typeof(IEntity)))
|
||||||
{
|
{
|
||||||
throw new Exception(
|
throw new(
|
||||||
$"'EntityOfTypeAttribute' attribute should only be applied to children of 'IEntity' class. '{type.FullName}' is not."
|
$"'EntityOfTypeAttribute' attribute should only be applied to children of 'IEntity' class. '{type.FullName}' is not."
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -34,6 +49,8 @@ public class EntityOfTypeAttribute(EntityType type) : Attribute
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new Exception($"Can't resolve class associated with '{entity.Type}' EntityType.");
|
throw new InvalidEnumArgumentException(
|
||||||
|
$"Can't resolve class associated with '{entity.Type}' EntityType."
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+228
-142
@@ -13,7 +13,7 @@ using Pf2eModel.Model.Enum;
|
|||||||
namespace Pf2eModel.Migrations
|
namespace Pf2eModel.Migrations
|
||||||
{
|
{
|
||||||
[DbContext(typeof(Pf2eDbContext))]
|
[DbContext(typeof(Pf2eDbContext))]
|
||||||
[Migration("20250508101742_1")]
|
[Migration("20250510202833_1")]
|
||||||
partial class _1
|
partial class _1
|
||||||
{
|
{
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
@@ -24,28 +24,28 @@ namespace Pf2eModel.Migrations
|
|||||||
.HasAnnotation("ProductVersion", "9.0.4")
|
.HasAnnotation("ProductVersion", "9.0.4")
|
||||||
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
||||||
|
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "action_category", new[] { "unknown", "archetype", "class-feature", "class-feat", "offensive", "defensive", "interaction", "familiar", "army_tactic", "army_war_action", "kingdom_activity", "kingdom_feat", "kingdom_feature" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "action_category", new[] { "archetype", "army_tactic", "army_war_action", "class-feat", "class-feature", "defensive", "familiar", "interaction", "kingdom_activity", "kingdom_feat", "kingdom_feature", "offensive", "unknown" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "action_enum", new[] { "unknown", "1", "2", "3", "reaction", "free", "passive", "other", "1-3", "1-2", "2-3", "2/2 rounds", "reaction/1", "reaction/2", "reaction/3", "free/1", "1 minute", "5 minutes", "10 minutes", "30 minutes", "1 hour" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "action_enum", new[] { "1", "1 hour", "1 minute", "1-2", "1-3", "10 minutes", "2", "2-3", "2/2 rounds", "3", "30 minutes", "5 minutes", "free", "free/1", "other", "passive", "reaction", "reaction/1", "reaction/2", "reaction/3", "unknown" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "ancestry_vision", new[] { "normal", "low-light-vision", "dark-vision" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "attribute_values", new[] { "cha", "con", "dex", "free", "int", "str", "wis" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "attribute_values", new[] { "free", "str", "dex", "con", "int", "wis", "cha" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "class_progression_type", new[] { "ancestry_feat", "attribute_increase", "class_feat", "entity", "general_feat", "skill_feat", "skill_increase" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "class_progression_type", new[] { "entity", "ancestry_feat", "class_feat", "general_feat", "skill_feat", "skill_increase" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "condition_group", new[] { "abilities", "attitudes", "death", "detection", "senses", "unknown" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "condition_group", new[] { "unknown", "senses", "abilities", "death", "attitudes", "detection" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "deity_category", new[] { "covenant", "deity", "pantheon", "philosophy" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "deity_category", new[] { "deity", "pantheon", "covenant", "philosophy" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "deity_fonts", new[] { "any", "harm", "heal", "none" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "deity_fonts", new[] { "none", "heal", "harm", "any" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "deity_sanctification", new[] { "any", "holy", "unholy" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "deity_sanctification", new[] { "holy", "unholy", "any" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "element_enum", new[] { "air", "earth", "fire", "metal", "universal", "water", "wood" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_rarity", new[] { "common", "uncommon", "rare", "unique" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_rarity", new[] { "common", "rare", "uncommon", "unique" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_type", new[] { "unknown", "trait", "action", "ancestry", "archetype", "background", "backpack", "campaign_feature", "class", "subclass_group", "subclass", "condition", "deity", "feat", "heritage", "spell", "ritual", "language", "rule" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_type", new[] { "action", "ancestry", "archetype", "background", "backpack", "campaign_feature", "class", "condition", "deity", "feat", "heritage", "language", "ritual", "rule", "spell", "subclass", "subclass_group", "trait", "unknown" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "feat_action_type", new[] { "passive", "action", "reaction", "free" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "feat_category", new[] { "ancestry", "ancestry-feature", "archetype", "bonus", "calling", "campaign-feature", "class", "class-feature", "curse", "deityboon", "general", "pfsboon", "skill", "uncategorized" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "feat_category", new[] { "uncategorized", "ancestry-feature", "class-feature", "calling", "class", "skill", "general", "ancestry", "bonus", "deityboon", "curse", "pfsboon", "campaign-feature" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "locale_type", new[] { "english", "hobby", "legacy", "legacy_english", "other", "russian" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "locale_type", new[] { "english", "legacy_english", "russian", "legacy", "hobby", "other" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "size_enum", new[] { "huge", "large", "medium", "small", "tiny" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "size", new[] { "tiny", "small", "medium", "large" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "source_category", new[] { "adventure-path", "adventures", "blog-posts", "comics", "lost-omens", "rulebook", "society" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "source_category", new[] { "rulebook", "adventure-path", "lost-omens", "adventures", "comics", "blog-posts", "society" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_area_type", new[] { "burst", "circle", "cone", "cube", "cuboid", "cylinder", "emanation", "line", "other", "square", "varies" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_area_type", new[] { "burst", "emanation", "cone", "line", "square", "cube", "cylinder", "varies", "cuboid", "circle", "other" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_damage_category", new[] { "normal", "persistent", "splash" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_damage_category", new[] { "persistent", "splash" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_damage_kinds", new[] { "any", "damage", "healing" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_damage_kinds", new[] { "damage", "healing", "any" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_tradition", new[] { "all", "arcane", "divine", "elemental", "none", "occult", "primal" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_tradition", new[] { "none", "divine", "occult", "arcane", "primal", "elemental", "all" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "training_rank", new[] { "expert", "legendary", "master", "mythic", "trained", "untrained" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "training_rank", new[] { "untrained", "trained", "expert", "master", "legendary", "mythic" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "trait_type", new[] { "class", "regular", "tradition" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "trait_type", new[] { "regular", "class", "tradition" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "vision_enum", new[] { "dark-vision", "low-light-vision", "normal" });
|
||||||
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
||||||
|
|
||||||
modelBuilder.Entity("DeityTraining", b =>
|
modelBuilder.Entity("DeityTraining", b =>
|
||||||
@@ -120,7 +120,7 @@ namespace Pf2eModel.Migrations
|
|||||||
.HasColumnType("text")
|
.HasColumnType("text")
|
||||||
.HasColumnName("description")
|
.HasColumnName("description")
|
||||||
.HasColumnOrder(6)
|
.HasColumnOrder(6)
|
||||||
.HasComment("Текстовое описание объекта");
|
.HasComment("Текстовое описание сущности");
|
||||||
|
|
||||||
b.Property<string>("Img")
|
b.Property<string>("Img")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
@@ -134,13 +134,13 @@ namespace Pf2eModel.Migrations
|
|||||||
.HasColumnType("boolean")
|
.HasColumnType("boolean")
|
||||||
.HasColumnName("is_checked")
|
.HasColumnName("is_checked")
|
||||||
.HasColumnOrder(9)
|
.HasColumnOrder(9)
|
||||||
.HasComment("Флаг, указывающий, что объект был проверен и не требует автоматической перезаписи");
|
.HasComment("Флаг, указывающий, что сущность был проверен и не требует автоматической перезаписи");
|
||||||
|
|
||||||
b.Property<bool?>("IsTranslated")
|
b.Property<bool?>("IsTranslated")
|
||||||
.HasColumnType("boolean")
|
.HasColumnType("boolean")
|
||||||
.HasColumnName("is_translated")
|
.HasColumnName("is_translated")
|
||||||
.HasColumnOrder(8)
|
.HasColumnOrder(8)
|
||||||
.HasComment("Флаг, указывающий, что у объекта существует перевод");
|
.HasComment("Флаг, указывающий, что у сущности существует перевод");
|
||||||
|
|
||||||
b.Property<string>("Name")
|
b.Property<string>("Name")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
@@ -152,7 +152,8 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<EntityRarity>("Rarity")
|
b.Property<EntityRarity>("Rarity")
|
||||||
.HasColumnType("entity_rarity")
|
.HasColumnType("entity_rarity")
|
||||||
.HasColumnName("rarity")
|
.HasColumnName("rarity")
|
||||||
.HasColumnOrder(7);
|
.HasColumnOrder(7)
|
||||||
|
.HasComment("Редкость сущности");
|
||||||
|
|
||||||
b.Property<string>("Slug")
|
b.Property<string>("Slug")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
@@ -166,7 +167,7 @@ namespace Pf2eModel.Migrations
|
|||||||
.HasColumnType("entity_type")
|
.HasColumnType("entity_type")
|
||||||
.HasColumnName("type")
|
.HasColumnName("type")
|
||||||
.HasColumnOrder(3)
|
.HasColumnOrder(3)
|
||||||
.HasComment("Тип объекта");
|
.HasComment("Тип сущности");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_entities");
|
.HasName("pk_entities");
|
||||||
@@ -188,14 +189,16 @@ namespace Pf2eModel.Migrations
|
|||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasColumnType("jsonb")
|
.HasColumnType("jsonb")
|
||||||
.HasColumnName("name")
|
.HasColumnName("name")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Отображаемое имя");
|
||||||
|
|
||||||
b.Property<string>("Slug")
|
b.Property<string>("Slug")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasMaxLength(255)
|
.HasMaxLength(255)
|
||||||
.HasColumnType("character varying(255)")
|
.HasColumnType("character varying(255)")
|
||||||
.HasColumnName("slug")
|
.HasColumnName("slug")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Часть имени в URL");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_keywords");
|
.HasName("pk_keywords");
|
||||||
@@ -209,21 +212,24 @@ namespace Pf2eModel.Migrations
|
|||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
b.Property<int>("KeywordId")
|
b.Property<int>("KeywordId")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("keyword_id")
|
.HasColumnName("keyword_id")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Идентификатор ключевого слова");
|
||||||
|
|
||||||
b.Property<string>("Value")
|
b.Property<string>("Value")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasMaxLength(255)
|
.HasMaxLength(255)
|
||||||
.HasColumnType("character varying(255)")
|
.HasColumnType("character varying(255)")
|
||||||
.HasColumnName("value")
|
.HasColumnName("value")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Синоним");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_keyword_aliases");
|
.HasName("pk_keyword_aliases");
|
||||||
@@ -240,14 +246,16 @@ namespace Pf2eModel.Migrations
|
|||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(0);
|
.HasColumnOrder(0)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
b.Property<int>("EntityId")
|
b.Property<int>("EntityId")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("entity_id")
|
.HasColumnName("entity_id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор сущности");
|
||||||
|
|
||||||
b.Property<bool>("IsRemaster")
|
b.Property<bool>("IsRemaster")
|
||||||
.HasColumnType("boolean")
|
.HasColumnType("boolean")
|
||||||
@@ -258,7 +266,8 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("SourceId")
|
b.Property<int>("SourceId")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("source_id")
|
.HasColumnName("source_id")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Идентификатор источника");
|
||||||
|
|
||||||
b.Property<string>("Suffix")
|
b.Property<string>("Suffix")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
@@ -286,26 +295,30 @@ namespace Pf2eModel.Migrations
|
|||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
b.Property<SourceCategory>("Category")
|
b.Property<SourceCategory>("Category")
|
||||||
.HasColumnType("source_category")
|
.HasColumnType("source_category")
|
||||||
.HasColumnName("category")
|
.HasColumnName("category")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Категория источника");
|
||||||
|
|
||||||
b.Property<string>("Name")
|
b.Property<string>("Name")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasMaxLength(255)
|
.HasMaxLength(255)
|
||||||
.HasColumnType("character varying(255)")
|
.HasColumnType("character varying(255)")
|
||||||
.HasColumnName("name")
|
.HasColumnName("name")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Отображаемое имя");
|
||||||
|
|
||||||
b.Property<DateOnly?>("ReleaseDate")
|
b.Property<DateOnly?>("ReleaseDate")
|
||||||
.HasColumnType("date")
|
.HasColumnType("date")
|
||||||
.HasColumnName("release_date")
|
.HasColumnName("release_date")
|
||||||
.HasColumnOrder(4);
|
.HasColumnOrder(4)
|
||||||
|
.HasComment("Дата выхода источника");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_sources");
|
.HasName("pk_sources");
|
||||||
@@ -318,12 +331,14 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("EntityId")
|
b.Property<int>("EntityId")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("entity_id")
|
.HasColumnName("entity_id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор сущности");
|
||||||
|
|
||||||
b.Property<int>("TargetId")
|
b.Property<int>("TargetId")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("target_id")
|
.HasColumnName("target_id")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Идентификатор цели");
|
||||||
|
|
||||||
b.Property<string>("Md5")
|
b.Property<string>("Md5")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
@@ -331,7 +346,7 @@ namespace Pf2eModel.Migrations
|
|||||||
.HasColumnType("character varying(32)")
|
.HasColumnType("character varying(32)")
|
||||||
.HasColumnName("md5")
|
.HasColumnName("md5")
|
||||||
.HasColumnOrder(5)
|
.HasColumnOrder(5)
|
||||||
.HasComment("Контроль версии объекта");
|
.HasComment("Контрольная сумма объекта");
|
||||||
|
|
||||||
b.Property<string>("Suffix")
|
b.Property<string>("Suffix")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
@@ -356,7 +371,8 @@ namespace Pf2eModel.Migrations
|
|||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
@@ -365,21 +381,24 @@ namespace Pf2eModel.Migrations
|
|||||||
.HasMaxLength(255)
|
.HasMaxLength(255)
|
||||||
.HasColumnType("character varying(255)")
|
.HasColumnType("character varying(255)")
|
||||||
.HasColumnName("icon")
|
.HasColumnName("icon")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Иконка цели");
|
||||||
|
|
||||||
b.Property<string>("Name")
|
b.Property<string>("Name")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasMaxLength(255)
|
.HasMaxLength(255)
|
||||||
.HasColumnType("character varying(255)")
|
.HasColumnType("character varying(255)")
|
||||||
.HasColumnName("name")
|
.HasColumnName("name")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Отображаемое имя");
|
||||||
|
|
||||||
b.Property<string>("Prefix")
|
b.Property<string>("Prefix")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasMaxLength(255)
|
.HasMaxLength(255)
|
||||||
.HasColumnType("character varying(255)")
|
.HasColumnType("character varying(255)")
|
||||||
.HasColumnName("prefix")
|
.HasColumnName("prefix")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Префикс для URL-адреса внешней ссылки");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_external_targets");
|
.HasName("pk_external_targets");
|
||||||
@@ -393,24 +412,28 @@ namespace Pf2eModel.Migrations
|
|||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
b.Property<int>("Max")
|
b.Property<int>("Max")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("max")
|
.HasColumnName("max")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Максимальная продолжительсность");
|
||||||
|
|
||||||
b.Property<int>("Per")
|
b.Property<int>("Per")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("per")
|
.HasColumnName("per")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Частота использования");
|
||||||
|
|
||||||
b.Property<int?>("Value")
|
b.Property<int?>("Value")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("value")
|
.HasColumnName("value")
|
||||||
.HasColumnOrder(4);
|
.HasColumnOrder(4)
|
||||||
|
.HasComment("Значение использования");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_frequencies");
|
.HasName("pk_frequencies");
|
||||||
@@ -424,7 +447,8 @@ namespace Pf2eModel.Migrations
|
|||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
@@ -432,12 +456,14 @@ namespace Pf2eModel.Migrations
|
|||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasColumnType("jsonb")
|
.HasColumnType("jsonb")
|
||||||
.HasColumnName("name")
|
.HasColumnName("name")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Название способности");
|
||||||
|
|
||||||
b.Property<int>("Type")
|
b.Property<int>("Type")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("type")
|
.HasColumnName("type")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Тип способности");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_trainings");
|
.HasName("pk_trainings");
|
||||||
@@ -450,17 +476,20 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
b.Property<ActionEnum>("Actions")
|
b.Property<ActionEnum>("Actions")
|
||||||
.HasColumnType("action_enum")
|
.HasColumnType("action_enum")
|
||||||
.HasColumnName("actions")
|
.HasColumnName("actions")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Количество действий");
|
||||||
|
|
||||||
b.Property<string>("Extra")
|
b.Property<string>("Extra")
|
||||||
.HasColumnType("text")
|
.HasColumnType("text")
|
||||||
.HasColumnName("extra")
|
.HasColumnName("extra")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Дополнительная информация");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_actions");
|
.HasName("pk_actions");
|
||||||
@@ -473,28 +502,33 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
b.Property<int>("Hp")
|
b.Property<int>("Hp")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("hp")
|
.HasColumnName("hp")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Количество очков здоровья");
|
||||||
|
|
||||||
b.PrimitiveCollection<Size[]>("Size")
|
b.PrimitiveCollection<SizeEnum[]>("Size")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasColumnType("size[]")
|
.HasColumnType("size_enum[]")
|
||||||
.HasColumnName("size")
|
.HasColumnName("size")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Размеры родословной");
|
||||||
|
|
||||||
b.Property<int>("Speed")
|
b.Property<int>("Speed")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("speed")
|
.HasColumnName("speed")
|
||||||
.HasColumnOrder(4);
|
.HasColumnOrder(4)
|
||||||
|
.HasComment("Скорость передвижения");
|
||||||
|
|
||||||
b.Property<AncestryVision>("Vision")
|
b.Property<VisionEnum>("VisionEnum")
|
||||||
.HasColumnType("ancestry_vision")
|
.HasColumnType("vision_enum")
|
||||||
.HasColumnName("vision")
|
.HasColumnName("vision_enum")
|
||||||
.HasColumnOrder(5);
|
.HasColumnOrder(5)
|
||||||
|
.HasComment("Тип зрения");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_ancestries");
|
.HasName("pk_ancestries");
|
||||||
@@ -593,22 +627,26 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
b.Property<int?>("DedicationFeatId")
|
b.Property<int?>("DedicationFeatId")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("dedication_feat_id")
|
.HasColumnName("dedication_feat_id")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("ID посвящения");
|
||||||
|
|
||||||
b.Property<string>("Extra")
|
b.Property<string>("Extra")
|
||||||
.HasColumnType("text")
|
.HasColumnType("text")
|
||||||
.HasColumnName("extra")
|
.HasColumnName("extra")
|
||||||
.HasColumnOrder(4);
|
.HasColumnOrder(4)
|
||||||
|
.HasComment("Дополнительная информация");
|
||||||
|
|
||||||
b.Property<int>("Level")
|
b.Property<int>("Level")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("level")
|
.HasColumnName("level")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Уровень");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_archetypes");
|
.HasName("pk_archetypes");
|
||||||
@@ -644,7 +682,8 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_backgrounds");
|
.HasName("pk_backgrounds");
|
||||||
@@ -746,32 +785,32 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
b.Property<int>("AdditionalTrainedSkills")
|
b.Property<int>("AdditionalTrainedSkills")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("additional_trained_skills")
|
.HasColumnName("additional_trained_skills")
|
||||||
.HasColumnOrder(7);
|
.HasColumnOrder(7)
|
||||||
|
.HasComment("Дополнительные навыки");
|
||||||
|
|
||||||
b.Property<int>("Hp")
|
b.Property<int>("Hp")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("hp")
|
.HasColumnName("hp")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Количество очков здоровья");
|
||||||
b.Property<int>("Perception")
|
|
||||||
.HasColumnType("integer")
|
|
||||||
.HasColumnName("perception")
|
|
||||||
.HasColumnOrder(4);
|
|
||||||
|
|
||||||
b.Property<bool>("Spellcasting")
|
b.Property<bool>("Spellcasting")
|
||||||
.HasColumnType("boolean")
|
.HasColumnType("boolean")
|
||||||
.HasColumnName("spellcasting")
|
.HasColumnName("spellcasting")
|
||||||
.HasColumnOrder(5);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Заклинатель?");
|
||||||
|
|
||||||
b.Property<SpellTradition>("Tradition")
|
b.Property<SpellTradition?>("Tradition")
|
||||||
.HasColumnType("spell_tradition")
|
.HasColumnType("spell_tradition")
|
||||||
.HasColumnName("tradition")
|
.HasColumnName("tradition")
|
||||||
.HasColumnOrder(6);
|
.HasColumnOrder(6)
|
||||||
|
.HasComment("Традиция заклинаний");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_classes");
|
.HasName("pk_classes");
|
||||||
@@ -948,17 +987,20 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
b.Property<string>("Extra")
|
b.Property<string>("Extra")
|
||||||
.HasColumnType("text")
|
.HasColumnType("text")
|
||||||
.HasColumnName("extra")
|
.HasColumnName("extra")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Дополнительная информация");
|
||||||
|
|
||||||
b.Property<ConditionGroup?>("Group")
|
b.Property<ConditionGroup?>("Group")
|
||||||
.HasColumnType("condition_group")
|
.HasColumnType("condition_group")
|
||||||
.HasColumnName("group")
|
.HasColumnName("group")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Группа состояния");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_conditions");
|
.HasName("pk_conditions");
|
||||||
@@ -971,27 +1013,32 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
b.Property<DeityCategory>("Category")
|
b.Property<DeityCategory>("Category")
|
||||||
.HasColumnType("deity_category")
|
.HasColumnType("deity_category")
|
||||||
.HasColumnName("category")
|
.HasColumnName("category")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Тип божества");
|
||||||
|
|
||||||
b.Property<DeityFonts>("Fonts")
|
b.Property<DeityFonts>("Fonts")
|
||||||
.HasColumnType("deity_fonts")
|
.HasColumnType("deity_fonts")
|
||||||
.HasColumnName("fonts")
|
.HasColumnName("fonts")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Тип божественной силы");
|
||||||
|
|
||||||
b.Property<DeitySanctification>("Sanctification")
|
b.Property<DeitySanctification>("Sanctification")
|
||||||
.HasColumnType("deity_sanctification")
|
.HasColumnType("deity_sanctification")
|
||||||
.HasColumnName("sanctification")
|
.HasColumnName("sanctification")
|
||||||
.HasColumnOrder(4);
|
.HasColumnOrder(4)
|
||||||
|
.HasComment("Тип освящения");
|
||||||
|
|
||||||
b.Property<bool>("SanctificationMust")
|
b.Property<bool>("SanctificationMust")
|
||||||
.HasColumnType("boolean")
|
.HasColumnType("boolean")
|
||||||
.HasColumnName("sanctification_must")
|
.HasColumnName("sanctification_must")
|
||||||
.HasColumnOrder(5);
|
.HasColumnOrder(5)
|
||||||
|
.HasComment("Обязательное освящение");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_deities");
|
.HasName("pk_deities");
|
||||||
@@ -1126,22 +1173,26 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
b.Property<int?>("Actions")
|
b.Property<int?>("Actions")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("actions")
|
.HasColumnName("actions")
|
||||||
.HasColumnOrder(5);
|
.HasColumnOrder(5)
|
||||||
|
.HasComment("Количество действий");
|
||||||
|
|
||||||
b.Property<ActionCategory>("Category")
|
b.Property<FeatCategory>("Category")
|
||||||
.HasColumnType("action_category")
|
.HasColumnType("feat_category")
|
||||||
.HasColumnName("category")
|
.HasColumnName("category")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Категория способности");
|
||||||
|
|
||||||
b.Property<string>("Extra")
|
b.Property<string>("Extra")
|
||||||
.HasColumnType("text")
|
.HasColumnType("text")
|
||||||
.HasColumnName("extra")
|
.HasColumnName("extra")
|
||||||
.HasColumnOrder(10);
|
.HasColumnOrder(10)
|
||||||
|
.HasComment("Дополнительная информация");
|
||||||
|
|
||||||
b.Property<bool>("IsFreeAction")
|
b.Property<bool>("IsFreeAction")
|
||||||
.HasColumnType("boolean")
|
.HasColumnType("boolean")
|
||||||
@@ -1161,7 +1212,8 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Level")
|
b.Property<int>("Level")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("level")
|
.HasColumnName("level")
|
||||||
.HasColumnOrder(4);
|
.HasColumnOrder(4)
|
||||||
|
.HasComment("Уровень способности");
|
||||||
|
|
||||||
b.Property<int?>("MaxActions")
|
b.Property<int?>("MaxActions")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
@@ -1210,12 +1262,14 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
b.Property<int?>("AncestryId")
|
b.Property<int?>("AncestryId")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("ancestry_id")
|
.HasColumnName("ancestry_id")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Идентификатор родословной");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_heritages");
|
.HasName("pk_heritages");
|
||||||
@@ -1229,12 +1283,10 @@ namespace Pf2eModel.Migrations
|
|||||||
modelBuilder.Entity("Pf2eModel.Model.Structure.Language", b =>
|
modelBuilder.Entity("Pf2eModel.Model.Structure.Language", b =>
|
||||||
{
|
{
|
||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
|
||||||
|
|
||||||
b.Property<int>("EntityId")
|
b.Property<int>("EntityId")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
@@ -1254,7 +1306,8 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
b.Property<int>("CastTime")
|
b.Property<int>("CastTime")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
@@ -1265,7 +1318,8 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<string>("Cost")
|
b.Property<string>("Cost")
|
||||||
.HasColumnType("jsonb")
|
.HasColumnType("jsonb")
|
||||||
.HasColumnName("cost")
|
.HasColumnName("cost")
|
||||||
.HasColumnOrder(14);
|
.HasColumnOrder(14)
|
||||||
|
.HasComment("Стоимость ритуала");
|
||||||
|
|
||||||
b.Property<int>("Duration")
|
b.Property<int>("Duration")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
@@ -1273,61 +1327,72 @@ namespace Pf2eModel.Migrations
|
|||||||
.HasColumnOrder(4)
|
.HasColumnOrder(4)
|
||||||
.HasComment("Время действия эффекта ритуала в секундах");
|
.HasComment("Время действия эффекта ритуала в секундах");
|
||||||
|
|
||||||
b.PrimitiveCollection<int[]>("Elements")
|
b.PrimitiveCollection<ElementEnum[]>("Elements")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasColumnType("integer[]")
|
.HasColumnType("element_enum[]")
|
||||||
.HasColumnName("elements")
|
.HasColumnName("elements")
|
||||||
.HasColumnOrder(5);
|
.HasColumnOrder(5)
|
||||||
|
.HasComment("Элементы ритуала");
|
||||||
|
|
||||||
b.Property<int>("Level")
|
b.Property<int>("Level")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("level")
|
.HasColumnName("level")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Уровень ритуала");
|
||||||
|
|
||||||
b.Property<TrainingRank>("PrimaryCheckRank")
|
b.Property<TrainingRank>("PrimaryCheckRank")
|
||||||
.HasColumnType("training_rank")
|
.HasColumnType("training_rank")
|
||||||
.HasColumnName("primary_check_rank")
|
.HasColumnName("primary_check_rank")
|
||||||
.HasColumnOrder(7);
|
.HasColumnOrder(7)
|
||||||
|
.HasComment("Ранг основной проверки");
|
||||||
|
|
||||||
b.Property<string>("PrimaryCheckSuffix")
|
b.Property<string>("PrimaryCheckSuffix")
|
||||||
.HasColumnType("jsonb")
|
.HasColumnType("jsonb")
|
||||||
.HasColumnName("primary_check_suffix")
|
.HasColumnName("primary_check_suffix")
|
||||||
.HasColumnOrder(8);
|
.HasColumnOrder(8)
|
||||||
|
.HasComment("Дополнительная информация об основной проверки");
|
||||||
|
|
||||||
b.Property<int>("Range")
|
b.Property<int>("Range")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("range")
|
.HasColumnName("range")
|
||||||
.HasColumnOrder(6);
|
.HasColumnOrder(6)
|
||||||
|
.HasComment("Дальнность ритуала");
|
||||||
|
|
||||||
b.Property<string>("RangeString")
|
b.Property<string>("RangeString")
|
||||||
.HasColumnType("jsonb")
|
.HasColumnType("jsonb")
|
||||||
.HasColumnName("range_string")
|
.HasColumnName("range_string")
|
||||||
.HasColumnOrder(12);
|
.HasColumnOrder(12)
|
||||||
|
.HasComment("Дальность ритуала");
|
||||||
|
|
||||||
b.Property<string>("Requirement")
|
b.Property<string>("Requirement")
|
||||||
.HasColumnType("jsonb")
|
.HasColumnType("jsonb")
|
||||||
.HasColumnName("requirement")
|
.HasColumnName("requirement")
|
||||||
.HasColumnOrder(15);
|
.HasColumnOrder(15)
|
||||||
|
.HasComment("Требования к ритуалу");
|
||||||
|
|
||||||
b.Property<int>("SecondaryCasters")
|
b.Property<int>("SecondaryCasters")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("secondary_casters")
|
.HasColumnName("secondary_casters")
|
||||||
.HasColumnOrder(9);
|
.HasColumnOrder(9)
|
||||||
|
.HasComment("Количество дополнительных заклинателей");
|
||||||
|
|
||||||
b.Property<int>("SecondaryCastersMax")
|
b.Property<int>("SecondaryCastersMax")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("secondary_casters_max")
|
.HasColumnName("secondary_casters_max")
|
||||||
.HasColumnOrder(10);
|
.HasColumnOrder(10)
|
||||||
|
.HasComment("Максимальное количество дополнительных заклинателей");
|
||||||
|
|
||||||
b.Property<string>("SecondaryCastersSuffix")
|
b.Property<string>("SecondaryCastersSuffix")
|
||||||
.HasColumnType("jsonb")
|
.HasColumnType("jsonb")
|
||||||
.HasColumnName("secondary_casters_suffix")
|
.HasColumnName("secondary_casters_suffix")
|
||||||
.HasColumnOrder(11);
|
.HasColumnOrder(11)
|
||||||
|
.HasComment("Дополнительная информация о дополнительных заклинателях");
|
||||||
|
|
||||||
b.Property<string>("Target")
|
b.Property<string>("Target")
|
||||||
.HasColumnType("jsonb")
|
.HasColumnType("jsonb")
|
||||||
.HasColumnName("target")
|
.HasColumnName("target")
|
||||||
.HasColumnOrder(13);
|
.HasColumnOrder(13)
|
||||||
|
.HasComment("Цель ритуала");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_rituals");
|
.HasName("pk_rituals");
|
||||||
@@ -1411,7 +1476,8 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
b.PrimitiveCollection<string[]>("Breadcrumbs")
|
b.PrimitiveCollection<string[]>("Breadcrumbs")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
@@ -1421,12 +1487,14 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Order")
|
b.Property<int>("Order")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("order")
|
.HasColumnName("order")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Порядок отображения");
|
||||||
|
|
||||||
b.Property<int?>("ParentId")
|
b.Property<int?>("ParentId")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("parent_id")
|
.HasColumnName("parent_id")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Родительского правило");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_rules");
|
.HasName("pk_rules");
|
||||||
@@ -1442,34 +1510,40 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
b.Property<ActionEnum>("Actions")
|
b.Property<ActionEnum>("Actions")
|
||||||
.HasColumnType("action_enum")
|
.HasColumnType("action_enum")
|
||||||
.HasColumnName("actions")
|
.HasColumnName("actions")
|
||||||
.HasColumnOrder(4);
|
.HasColumnOrder(4)
|
||||||
|
.HasComment("Количество действий");
|
||||||
|
|
||||||
b.Property<string>("Cost")
|
b.Property<string>("Cost")
|
||||||
.HasColumnType("jsonb")
|
.HasColumnType("jsonb")
|
||||||
.HasColumnName("cost")
|
.HasColumnName("cost")
|
||||||
.HasColumnOrder(11);
|
.HasColumnOrder(11)
|
||||||
|
.HasComment("Стоимость заклинания");
|
||||||
|
|
||||||
b.Property<int?>("Duration")
|
b.Property<int?>("Duration")
|
||||||
.HasMaxLength(255)
|
.HasMaxLength(255)
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("duration")
|
.HasColumnName("duration")
|
||||||
.HasColumnOrder(5);
|
.HasColumnOrder(5)
|
||||||
|
.HasComment("Время длительности заклинания");
|
||||||
|
|
||||||
b.PrimitiveCollection<int[]>("Elements")
|
b.PrimitiveCollection<ElementEnum[]>("Elements")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasColumnType("integer[]")
|
.HasColumnType("element_enum[]")
|
||||||
.HasColumnName("elements")
|
.HasColumnName("elements")
|
||||||
.HasColumnOrder(8);
|
.HasColumnOrder(8)
|
||||||
|
.HasComment("Элементы заклинания");
|
||||||
|
|
||||||
b.Property<bool>("IsFocus")
|
b.Property<bool>("IsFocus")
|
||||||
.HasColumnType("boolean")
|
.HasColumnType("boolean")
|
||||||
.HasColumnName("is_focus")
|
.HasColumnName("is_focus")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Фокус?");
|
||||||
|
|
||||||
b.Property<int>("Level")
|
b.Property<int>("Level")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
@@ -1479,28 +1553,33 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Range")
|
b.Property<int>("Range")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("range")
|
.HasColumnName("range")
|
||||||
.HasColumnOrder(6);
|
.HasColumnOrder(6)
|
||||||
|
.HasComment("Дальность заклинания");
|
||||||
|
|
||||||
b.Property<string>("Requirement")
|
b.Property<string>("Requirement")
|
||||||
.HasColumnType("jsonb")
|
.HasColumnType("jsonb")
|
||||||
.HasColumnName("requirement")
|
.HasColumnName("requirement")
|
||||||
.HasColumnOrder(12);
|
.HasColumnOrder(12)
|
||||||
|
.HasComment("Требования к заклинанию");
|
||||||
|
|
||||||
b.Property<string>("Target")
|
b.Property<string>("Target")
|
||||||
.HasColumnType("jsonb")
|
.HasColumnType("jsonb")
|
||||||
.HasColumnName("target")
|
.HasColumnName("target")
|
||||||
.HasColumnOrder(10);
|
.HasColumnOrder(10)
|
||||||
|
.HasComment("Цель заклинания");
|
||||||
|
|
||||||
b.PrimitiveCollection<SpellTradition[]>("Traditions")
|
b.PrimitiveCollection<SpellTradition[]>("Traditions")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasColumnType("spell_tradition[]")
|
.HasColumnType("spell_tradition[]")
|
||||||
.HasColumnName("traditions")
|
.HasColumnName("traditions")
|
||||||
.HasColumnOrder(7);
|
.HasColumnOrder(7)
|
||||||
|
.HasComment("Традиции заклинания");
|
||||||
|
|
||||||
b.Property<string>("Trigger")
|
b.Property<string>("Trigger")
|
||||||
.HasColumnType("jsonb")
|
.HasColumnType("jsonb")
|
||||||
.HasColumnName("trigger")
|
.HasColumnName("trigger")
|
||||||
.HasColumnOrder(9);
|
.HasColumnOrder(9)
|
||||||
|
.HasComment("Триггер заклинания");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_spells");
|
.HasName("pk_spells");
|
||||||
@@ -1655,13 +1734,15 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
b.Property<string>("Additional")
|
b.Property<string>("Additional")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasColumnType("jsonb")
|
.HasColumnType("jsonb")
|
||||||
.HasColumnName("additional")
|
.HasColumnName("additional")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Дополнительная информация");
|
||||||
|
|
||||||
b.Property<string>("Extra")
|
b.Property<string>("Extra")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
@@ -1672,7 +1753,8 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("GroupId")
|
b.Property<int>("GroupId")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("group_id")
|
.HasColumnName("group_id")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Группа подклассов");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_subclasses");
|
.HasName("pk_subclasses");
|
||||||
@@ -1688,12 +1770,14 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
b.Property<int?>("ClassId")
|
b.Property<int?>("ClassId")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("class_id")
|
.HasColumnName("class_id")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Идентификатор класса");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_subclass_groups");
|
.HasName("pk_subclass_groups");
|
||||||
@@ -1709,12 +1793,14 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
b.Property<TraitType>("Type")
|
b.Property<TraitType>("Type")
|
||||||
.HasColumnType("trait_type")
|
.HasColumnType("trait_type")
|
||||||
.HasColumnName("type")
|
.HasColumnName("type")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Тип признака");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_traits");
|
.HasName("pk_traits");
|
||||||
+121
-123
@@ -14,28 +14,28 @@ namespace Pf2eModel.Migrations
|
|||||||
protected override void Up(MigrationBuilder migrationBuilder)
|
protected override void Up(MigrationBuilder migrationBuilder)
|
||||||
{
|
{
|
||||||
migrationBuilder.AlterDatabase()
|
migrationBuilder.AlterDatabase()
|
||||||
.Annotation("Npgsql:Enum:action_category", "unknown,archetype,class-feature,class-feat,offensive,defensive,interaction,familiar,army_tactic,army_war_action,kingdom_activity,kingdom_feat,kingdom_feature")
|
.Annotation("Npgsql:Enum:action_category", "archetype,army_tactic,army_war_action,class-feat,class-feature,defensive,familiar,interaction,kingdom_activity,kingdom_feat,kingdom_feature,offensive,unknown")
|
||||||
.Annotation("Npgsql:Enum:action_enum", "unknown,1,2,3,reaction,free,passive,other,1-3,1-2,2-3,2/2 rounds,reaction/1,reaction/2,reaction/3,free/1,1 minute,5 minutes,10 minutes,30 minutes,1 hour")
|
.Annotation("Npgsql:Enum:action_enum", "1,1 hour,1 minute,1-2,1-3,10 minutes,2,2-3,2/2 rounds,3,30 minutes,5 minutes,free,free/1,other,passive,reaction,reaction/1,reaction/2,reaction/3,unknown")
|
||||||
.Annotation("Npgsql:Enum:ancestry_vision", "normal,low-light-vision,dark-vision")
|
.Annotation("Npgsql:Enum:attribute_values", "cha,con,dex,free,int,str,wis")
|
||||||
.Annotation("Npgsql:Enum:attribute_values", "free,str,dex,con,int,wis,cha")
|
.Annotation("Npgsql:Enum:class_progression_type", "ancestry_feat,attribute_increase,class_feat,entity,general_feat,skill_feat,skill_increase")
|
||||||
.Annotation("Npgsql:Enum:class_progression_type", "entity,ancestry_feat,class_feat,general_feat,skill_feat,skill_increase")
|
.Annotation("Npgsql:Enum:condition_group", "abilities,attitudes,death,detection,senses,unknown")
|
||||||
.Annotation("Npgsql:Enum:condition_group", "unknown,senses,abilities,death,attitudes,detection")
|
.Annotation("Npgsql:Enum:deity_category", "covenant,deity,pantheon,philosophy")
|
||||||
.Annotation("Npgsql:Enum:deity_category", "deity,pantheon,covenant,philosophy")
|
.Annotation("Npgsql:Enum:deity_fonts", "any,harm,heal,none")
|
||||||
.Annotation("Npgsql:Enum:deity_fonts", "none,heal,harm,any")
|
.Annotation("Npgsql:Enum:deity_sanctification", "any,holy,unholy")
|
||||||
.Annotation("Npgsql:Enum:deity_sanctification", "holy,unholy,any")
|
.Annotation("Npgsql:Enum:element_enum", "air,earth,fire,metal,universal,water,wood")
|
||||||
.Annotation("Npgsql:Enum:entity_rarity", "common,uncommon,rare,unique")
|
.Annotation("Npgsql:Enum:entity_rarity", "common,rare,uncommon,unique")
|
||||||
.Annotation("Npgsql:Enum:entity_type", "unknown,trait,action,ancestry,archetype,background,backpack,campaign_feature,class,subclass_group,subclass,condition,deity,feat,heritage,spell,ritual,language,rule")
|
.Annotation("Npgsql:Enum:entity_type", "action,ancestry,archetype,background,backpack,campaign_feature,class,condition,deity,feat,heritage,language,ritual,rule,spell,subclass,subclass_group,trait,unknown")
|
||||||
.Annotation("Npgsql:Enum:feat_action_type", "passive,action,reaction,free")
|
.Annotation("Npgsql:Enum:feat_category", "ancestry,ancestry-feature,archetype,bonus,calling,campaign-feature,class,class-feature,curse,deityboon,general,pfsboon,skill,uncategorized")
|
||||||
.Annotation("Npgsql:Enum:feat_category", "uncategorized,ancestry-feature,class-feature,calling,class,skill,general,ancestry,bonus,deityboon,curse,pfsboon,campaign-feature")
|
.Annotation("Npgsql:Enum:locale_type", "english,hobby,legacy,legacy_english,other,russian")
|
||||||
.Annotation("Npgsql:Enum:locale_type", "english,legacy_english,russian,legacy,hobby,other")
|
.Annotation("Npgsql:Enum:size_enum", "huge,large,medium,small,tiny")
|
||||||
.Annotation("Npgsql:Enum:size", "tiny,small,medium,large")
|
.Annotation("Npgsql:Enum:source_category", "adventure-path,adventures,blog-posts,comics,lost-omens,rulebook,society")
|
||||||
.Annotation("Npgsql:Enum:source_category", "rulebook,adventure-path,lost-omens,adventures,comics,blog-posts,society")
|
.Annotation("Npgsql:Enum:spell_area_type", "burst,circle,cone,cube,cuboid,cylinder,emanation,line,other,square,varies")
|
||||||
.Annotation("Npgsql:Enum:spell_area_type", "burst,emanation,cone,line,square,cube,cylinder,varies,cuboid,circle,other")
|
.Annotation("Npgsql:Enum:spell_damage_category", "normal,persistent,splash")
|
||||||
.Annotation("Npgsql:Enum:spell_damage_category", "persistent,splash")
|
.Annotation("Npgsql:Enum:spell_damage_kinds", "any,damage,healing")
|
||||||
.Annotation("Npgsql:Enum:spell_damage_kinds", "damage,healing,any")
|
.Annotation("Npgsql:Enum:spell_tradition", "all,arcane,divine,elemental,none,occult,primal")
|
||||||
.Annotation("Npgsql:Enum:spell_tradition", "none,divine,occult,arcane,primal,elemental,all")
|
.Annotation("Npgsql:Enum:training_rank", "expert,legendary,master,mythic,trained,untrained")
|
||||||
.Annotation("Npgsql:Enum:training_rank", "untrained,trained,expert,master,legendary,mythic")
|
.Annotation("Npgsql:Enum:trait_type", "class,regular,tradition")
|
||||||
.Annotation("Npgsql:Enum:trait_type", "regular,class,tradition");
|
.Annotation("Npgsql:Enum:vision_enum", "dark-vision,low-light-vision,normal");
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
migrationBuilder.CreateTable(
|
||||||
name: "entities",
|
name: "entities",
|
||||||
@@ -44,13 +44,13 @@ namespace Pf2eModel.Migrations
|
|||||||
id = table.Column<int>(type: "integer", nullable: false)
|
id = table.Column<int>(type: "integer", nullable: false)
|
||||||
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||||
name = table.Column<string>(type: "jsonb", nullable: false, comment: "Отображаемое имя"),
|
name = table.Column<string>(type: "jsonb", nullable: false, comment: "Отображаемое имя"),
|
||||||
type = table.Column<EntityType>(type: "entity_type", nullable: false, comment: "Тип объекта"),
|
type = table.Column<EntityType>(type: "entity_type", nullable: false, comment: "Тип сущности"),
|
||||||
slug = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false, comment: "Часть имени в URL"),
|
slug = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false, comment: "Часть имени в URL"),
|
||||||
img = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false, comment: "Изображение объекта"),
|
img = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false, comment: "Изображение объекта"),
|
||||||
description = table.Column<string>(type: "text", nullable: false, comment: "Текстовое описание объекта"),
|
description = table.Column<string>(type: "text", nullable: false, comment: "Текстовое описание сущности"),
|
||||||
rarity = table.Column<EntityRarity>(type: "entity_rarity", nullable: false),
|
rarity = table.Column<EntityRarity>(type: "entity_rarity", nullable: false, comment: "Редкость сущности"),
|
||||||
is_translated = table.Column<bool>(type: "boolean", nullable: true, comment: "Флаг, указывающий, что у объекта существует перевод"),
|
is_translated = table.Column<bool>(type: "boolean", nullable: true, comment: "Флаг, указывающий, что у сущности существует перевод"),
|
||||||
is_checked = table.Column<bool>(type: "boolean", nullable: true, comment: "Флаг, указывающий, что объект был проверен и не требует автоматической перезаписи")
|
is_checked = table.Column<bool>(type: "boolean", nullable: true, comment: "Флаг, указывающий, что сущность был проверен и не требует автоматической перезаписи")
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
@@ -61,11 +61,11 @@ namespace Pf2eModel.Migrations
|
|||||||
name: "external_targets",
|
name: "external_targets",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
id = table.Column<int>(type: "integer", nullable: false)
|
id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор")
|
||||||
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||||
name = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false),
|
name = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false, comment: "Отображаемое имя"),
|
||||||
icon = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false),
|
icon = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false, comment: "Иконка цели"),
|
||||||
prefix = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false)
|
prefix = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false, comment: "Префикс для URL-адреса внешней ссылки")
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
@@ -76,11 +76,11 @@ namespace Pf2eModel.Migrations
|
|||||||
name: "frequencies",
|
name: "frequencies",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
id = table.Column<int>(type: "integer", nullable: false)
|
id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор")
|
||||||
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||||
max = table.Column<int>(type: "integer", nullable: false),
|
max = table.Column<int>(type: "integer", nullable: false, comment: "Максимальная продолжительсность"),
|
||||||
per = table.Column<int>(type: "integer", nullable: false),
|
per = table.Column<int>(type: "integer", nullable: false, comment: "Частота использования"),
|
||||||
value = table.Column<int>(type: "integer", nullable: true)
|
value = table.Column<int>(type: "integer", nullable: true, comment: "Значение использования")
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
@@ -93,8 +93,8 @@ namespace Pf2eModel.Migrations
|
|||||||
{
|
{
|
||||||
id = table.Column<int>(type: "integer", nullable: false)
|
id = table.Column<int>(type: "integer", nullable: false)
|
||||||
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||||
name = table.Column<string>(type: "jsonb", nullable: false),
|
name = table.Column<string>(type: "jsonb", nullable: false, comment: "Отображаемое имя"),
|
||||||
slug = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false)
|
slug = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false, comment: "Часть имени в URL")
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
@@ -105,11 +105,11 @@ namespace Pf2eModel.Migrations
|
|||||||
name: "sources",
|
name: "sources",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
id = table.Column<int>(type: "integer", nullable: false)
|
id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор")
|
||||||
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||||
name = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false),
|
name = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false, comment: "Отображаемое имя"),
|
||||||
category = table.Column<SourceCategory>(type: "source_category", nullable: false),
|
category = table.Column<SourceCategory>(type: "source_category", nullable: false, comment: "Категория источника"),
|
||||||
release_date = table.Column<DateOnly>(type: "date", nullable: true)
|
release_date = table.Column<DateOnly>(type: "date", nullable: true, comment: "Дата выхода источника")
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
@@ -120,10 +120,10 @@ namespace Pf2eModel.Migrations
|
|||||||
name: "trainings",
|
name: "trainings",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
id = table.Column<int>(type: "integer", nullable: false)
|
id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор")
|
||||||
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||||
name = table.Column<string>(type: "jsonb", nullable: false),
|
name = table.Column<string>(type: "jsonb", nullable: false, comment: "Название способности"),
|
||||||
type = table.Column<int>(type: "integer", nullable: false)
|
type = table.Column<int>(type: "integer", nullable: false, comment: "Тип способности")
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
@@ -134,9 +134,9 @@ namespace Pf2eModel.Migrations
|
|||||||
name: "actions",
|
name: "actions",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
id = table.Column<int>(type: "integer", nullable: false),
|
id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор"),
|
||||||
actions = table.Column<ActionEnum>(type: "action_enum", nullable: false),
|
actions = table.Column<ActionEnum>(type: "action_enum", nullable: false, comment: "Количество действий"),
|
||||||
extra = table.Column<string>(type: "text", nullable: true)
|
extra = table.Column<string>(type: "text", nullable: true, comment: "Дополнительная информация")
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
@@ -153,11 +153,11 @@ namespace Pf2eModel.Migrations
|
|||||||
name: "ancestries",
|
name: "ancestries",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
id = table.Column<int>(type: "integer", nullable: false),
|
id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор"),
|
||||||
size = table.Column<Size[]>(type: "size[]", nullable: false),
|
size = table.Column<SizeEnum[]>(type: "size_enum[]", nullable: false, comment: "Размеры родословной"),
|
||||||
hp = table.Column<int>(type: "integer", nullable: false),
|
hp = table.Column<int>(type: "integer", nullable: false, comment: "Количество очков здоровья"),
|
||||||
speed = table.Column<int>(type: "integer", nullable: false),
|
speed = table.Column<int>(type: "integer", nullable: false, comment: "Скорость передвижения"),
|
||||||
vision = table.Column<AncestryVision>(type: "ancestry_vision", nullable: false)
|
vision_enum = table.Column<VisionEnum>(type: "vision_enum", nullable: false, comment: "Тип зрения")
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
@@ -174,7 +174,7 @@ namespace Pf2eModel.Migrations
|
|||||||
name: "backgrounds",
|
name: "backgrounds",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
id = table.Column<int>(type: "integer", nullable: false)
|
id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор")
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
@@ -191,12 +191,11 @@ namespace Pf2eModel.Migrations
|
|||||||
name: "classes",
|
name: "classes",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
id = table.Column<int>(type: "integer", nullable: false),
|
id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор"),
|
||||||
hp = table.Column<int>(type: "integer", nullable: false),
|
hp = table.Column<int>(type: "integer", nullable: false, comment: "Количество очков здоровья"),
|
||||||
perception = table.Column<int>(type: "integer", nullable: false),
|
spellcasting = table.Column<bool>(type: "boolean", nullable: false, comment: "Заклинатель?"),
|
||||||
spellcasting = table.Column<bool>(type: "boolean", nullable: false),
|
tradition = table.Column<SpellTradition>(type: "spell_tradition", nullable: true, comment: "Традиция заклинаний"),
|
||||||
tradition = table.Column<SpellTradition>(type: "spell_tradition", nullable: false),
|
additional_trained_skills = table.Column<int>(type: "integer", nullable: false, comment: "Дополнительные навыки")
|
||||||
additional_trained_skills = table.Column<int>(type: "integer", nullable: false)
|
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
@@ -213,9 +212,9 @@ namespace Pf2eModel.Migrations
|
|||||||
name: "conditions",
|
name: "conditions",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
id = table.Column<int>(type: "integer", nullable: false),
|
id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор"),
|
||||||
group = table.Column<ConditionGroup>(type: "condition_group", nullable: true),
|
group = table.Column<ConditionGroup>(type: "condition_group", nullable: true, comment: "Группа состояния"),
|
||||||
extra = table.Column<string>(type: "text", nullable: true)
|
extra = table.Column<string>(type: "text", nullable: true, comment: "Дополнительная информация")
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
@@ -232,11 +231,11 @@ namespace Pf2eModel.Migrations
|
|||||||
name: "deities",
|
name: "deities",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
id = table.Column<int>(type: "integer", nullable: false),
|
id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор"),
|
||||||
category = table.Column<DeityCategory>(type: "deity_category", nullable: false),
|
category = table.Column<DeityCategory>(type: "deity_category", nullable: false, comment: "Тип божества"),
|
||||||
fonts = table.Column<DeityFonts>(type: "deity_fonts", nullable: false),
|
fonts = table.Column<DeityFonts>(type: "deity_fonts", nullable: false, comment: "Тип божественной силы"),
|
||||||
sanctification = table.Column<DeitySanctification>(type: "deity_sanctification", nullable: false),
|
sanctification = table.Column<DeitySanctification>(type: "deity_sanctification", nullable: false, comment: "Тип освящения"),
|
||||||
sanctification_must = table.Column<bool>(type: "boolean", nullable: false)
|
sanctification_must = table.Column<bool>(type: "boolean", nullable: false, comment: "Обязательное освящение")
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
@@ -253,15 +252,15 @@ namespace Pf2eModel.Migrations
|
|||||||
name: "feats",
|
name: "feats",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
id = table.Column<int>(type: "integer", nullable: false),
|
id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор"),
|
||||||
category = table.Column<ActionCategory>(type: "action_category", nullable: false),
|
category = table.Column<FeatCategory>(type: "feat_category", nullable: false, comment: "Категория способности"),
|
||||||
level = table.Column<int>(type: "integer", nullable: false),
|
level = table.Column<int>(type: "integer", nullable: false, comment: "Уровень способности"),
|
||||||
actions = table.Column<int>(type: "integer", nullable: true),
|
actions = table.Column<int>(type: "integer", nullable: true, comment: "Количество действий"),
|
||||||
max_actions = table.Column<int>(type: "integer", nullable: true),
|
max_actions = table.Column<int>(type: "integer", nullable: true),
|
||||||
is_reaction = table.Column<bool>(type: "boolean", nullable: false),
|
is_reaction = table.Column<bool>(type: "boolean", nullable: false),
|
||||||
is_free_action = table.Column<bool>(type: "boolean", nullable: false),
|
is_free_action = table.Column<bool>(type: "boolean", nullable: false),
|
||||||
is_passive = table.Column<bool>(type: "boolean", nullable: false),
|
is_passive = table.Column<bool>(type: "boolean", nullable: false),
|
||||||
extra = table.Column<string>(type: "text", nullable: true)
|
extra = table.Column<string>(type: "text", nullable: true, comment: "Дополнительная информация")
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
@@ -278,8 +277,7 @@ namespace Pf2eModel.Migrations
|
|||||||
name: "languages",
|
name: "languages",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
id = table.Column<int>(type: "integer", nullable: false)
|
id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор"),
|
||||||
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
|
||||||
entity_id = table.Column<int>(type: "integer", nullable: false)
|
entity_id = table.Column<int>(type: "integer", nullable: false)
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
@@ -297,21 +295,21 @@ namespace Pf2eModel.Migrations
|
|||||||
name: "rituals",
|
name: "rituals",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
id = table.Column<int>(type: "integer", nullable: false),
|
id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор"),
|
||||||
level = table.Column<int>(type: "integer", nullable: false),
|
level = table.Column<int>(type: "integer", nullable: false, comment: "Уровень ритуала"),
|
||||||
cast_time = table.Column<int>(type: "integer", nullable: false, comment: "Продолжительность ритуала в секундах"),
|
cast_time = table.Column<int>(type: "integer", nullable: false, comment: "Продолжительность ритуала в секундах"),
|
||||||
duration = table.Column<int>(type: "integer", nullable: false, comment: "Время действия эффекта ритуала в секундах"),
|
duration = table.Column<int>(type: "integer", nullable: false, comment: "Время действия эффекта ритуала в секундах"),
|
||||||
elements = table.Column<int[]>(type: "integer[]", nullable: false),
|
elements = table.Column<ElementEnum[]>(type: "element_enum[]", nullable: false, comment: "Элементы ритуала"),
|
||||||
range = table.Column<int>(type: "integer", nullable: false),
|
range = table.Column<int>(type: "integer", nullable: false, comment: "Дальнность ритуала"),
|
||||||
primary_check_rank = table.Column<TrainingRank>(type: "training_rank", nullable: false),
|
primary_check_rank = table.Column<TrainingRank>(type: "training_rank", nullable: false, comment: "Ранг основной проверки"),
|
||||||
primary_check_suffix = table.Column<string>(type: "jsonb", nullable: true),
|
primary_check_suffix = table.Column<string>(type: "jsonb", nullable: true, comment: "Дополнительная информация об основной проверки"),
|
||||||
secondary_casters = table.Column<int>(type: "integer", nullable: false),
|
secondary_casters = table.Column<int>(type: "integer", nullable: false, comment: "Количество дополнительных заклинателей"),
|
||||||
secondary_casters_max = table.Column<int>(type: "integer", nullable: false),
|
secondary_casters_max = table.Column<int>(type: "integer", nullable: false, comment: "Максимальное количество дополнительных заклинателей"),
|
||||||
secondary_casters_suffix = table.Column<string>(type: "jsonb", nullable: true),
|
secondary_casters_suffix = table.Column<string>(type: "jsonb", nullable: true, comment: "Дополнительная информация о дополнительных заклинателях"),
|
||||||
range_string = table.Column<string>(type: "jsonb", nullable: true),
|
range_string = table.Column<string>(type: "jsonb", nullable: true, comment: "Дальность ритуала"),
|
||||||
target = table.Column<string>(type: "jsonb", nullable: true),
|
target = table.Column<string>(type: "jsonb", nullable: true, comment: "Цель ритуала"),
|
||||||
cost = table.Column<string>(type: "jsonb", nullable: true),
|
cost = table.Column<string>(type: "jsonb", nullable: true, comment: "Стоимость ритуала"),
|
||||||
requirement = table.Column<string>(type: "jsonb", nullable: true)
|
requirement = table.Column<string>(type: "jsonb", nullable: true, comment: "Требования к ритуалу")
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
@@ -328,9 +326,9 @@ namespace Pf2eModel.Migrations
|
|||||||
name: "rules",
|
name: "rules",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
id = table.Column<int>(type: "integer", nullable: false),
|
id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор"),
|
||||||
order = table.Column<int>(type: "integer", nullable: false),
|
order = table.Column<int>(type: "integer", nullable: false, comment: "Порядок отображения"),
|
||||||
parent_id = table.Column<int>(type: "integer", nullable: true),
|
parent_id = table.Column<int>(type: "integer", nullable: true, comment: "Родительского правило"),
|
||||||
breadcrumbs = table.Column<string[]>(type: "text[]", nullable: false)
|
breadcrumbs = table.Column<string[]>(type: "text[]", nullable: false)
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
@@ -353,18 +351,18 @@ namespace Pf2eModel.Migrations
|
|||||||
name: "spells",
|
name: "spells",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
id = table.Column<int>(type: "integer", nullable: false),
|
id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор"),
|
||||||
level = table.Column<int>(type: "integer", nullable: false),
|
level = table.Column<int>(type: "integer", nullable: false),
|
||||||
is_focus = table.Column<bool>(type: "boolean", nullable: false),
|
is_focus = table.Column<bool>(type: "boolean", nullable: false, comment: "Фокус?"),
|
||||||
actions = table.Column<ActionEnum>(type: "action_enum", nullable: false),
|
actions = table.Column<ActionEnum>(type: "action_enum", nullable: false, comment: "Количество действий"),
|
||||||
duration = table.Column<int>(type: "integer", maxLength: 255, nullable: true),
|
duration = table.Column<int>(type: "integer", maxLength: 255, nullable: true, comment: "Время длительности заклинания"),
|
||||||
range = table.Column<int>(type: "integer", nullable: false),
|
range = table.Column<int>(type: "integer", nullable: false, comment: "Дальность заклинания"),
|
||||||
traditions = table.Column<SpellTradition[]>(type: "spell_tradition[]", nullable: false),
|
traditions = table.Column<SpellTradition[]>(type: "spell_tradition[]", nullable: false, comment: "Традиции заклинания"),
|
||||||
elements = table.Column<int[]>(type: "integer[]", nullable: false),
|
elements = table.Column<ElementEnum[]>(type: "element_enum[]", nullable: false, comment: "Элементы заклинания"),
|
||||||
trigger = table.Column<string>(type: "jsonb", nullable: true),
|
trigger = table.Column<string>(type: "jsonb", nullable: true, comment: "Триггер заклинания"),
|
||||||
target = table.Column<string>(type: "jsonb", nullable: true),
|
target = table.Column<string>(type: "jsonb", nullable: true, comment: "Цель заклинания"),
|
||||||
cost = table.Column<string>(type: "jsonb", nullable: true),
|
cost = table.Column<string>(type: "jsonb", nullable: true, comment: "Стоимость заклинания"),
|
||||||
requirement = table.Column<string>(type: "jsonb", nullable: true)
|
requirement = table.Column<string>(type: "jsonb", nullable: true, comment: "Требования к заклинанию")
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
@@ -381,8 +379,8 @@ namespace Pf2eModel.Migrations
|
|||||||
name: "traits",
|
name: "traits",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
id = table.Column<int>(type: "integer", nullable: false),
|
id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор"),
|
||||||
type = table.Column<TraitType>(type: "trait_type", nullable: false)
|
type = table.Column<TraitType>(type: "trait_type", nullable: false, comment: "Тип признака")
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
@@ -399,10 +397,10 @@ namespace Pf2eModel.Migrations
|
|||||||
name: "entity_externals",
|
name: "entity_externals",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
entity_id = table.Column<int>(type: "integer", nullable: false),
|
entity_id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор сущности"),
|
||||||
target_id = table.Column<int>(type: "integer", nullable: false),
|
target_id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор цели"),
|
||||||
suffix = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false, comment: "Часть URL до объекта. Для источников Foundry - полный UUID объекта"),
|
suffix = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false, comment: "Часть URL до объекта. Для источников Foundry - полный UUID объекта"),
|
||||||
md5 = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: false, comment: "Контроль версии объекта")
|
md5 = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: false, comment: "Контрольная сумма объекта")
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
@@ -449,10 +447,10 @@ namespace Pf2eModel.Migrations
|
|||||||
name: "keyword_aliases",
|
name: "keyword_aliases",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
id = table.Column<int>(type: "integer", nullable: false)
|
id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор")
|
||||||
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||||
keyword_id = table.Column<int>(type: "integer", nullable: false),
|
keyword_id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор ключевого слова"),
|
||||||
value = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false)
|
value = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false, comment: "Синоним")
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
@@ -469,10 +467,10 @@ namespace Pf2eModel.Migrations
|
|||||||
name: "entity_sources",
|
name: "entity_sources",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
id = table.Column<int>(type: "integer", nullable: false)
|
id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор")
|
||||||
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||||
entity_id = table.Column<int>(type: "integer", nullable: false),
|
entity_id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор сущности"),
|
||||||
source_id = table.Column<int>(type: "integer", nullable: false),
|
source_id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор источника"),
|
||||||
suffix = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false, comment: "Номер страницы, эррата и т.д."),
|
suffix = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false, comment: "Номер страницы, эррата и т.д."),
|
||||||
is_remaster = table.Column<bool>(type: "boolean", nullable: false, comment: "Флаг, указывающий, что объект является частью ремастера")
|
is_remaster = table.Column<bool>(type: "boolean", nullable: false, comment: "Флаг, указывающий, что объект является частью ремастера")
|
||||||
},
|
},
|
||||||
@@ -543,8 +541,8 @@ namespace Pf2eModel.Migrations
|
|||||||
name: "heritages",
|
name: "heritages",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
id = table.Column<int>(type: "integer", nullable: false),
|
id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор"),
|
||||||
ancestry_id = table.Column<int>(type: "integer", nullable: true)
|
ancestry_id = table.Column<int>(type: "integer", nullable: true, comment: "Идентификатор родословной")
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
@@ -713,8 +711,8 @@ namespace Pf2eModel.Migrations
|
|||||||
name: "subclass_groups",
|
name: "subclass_groups",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
id = table.Column<int>(type: "integer", nullable: false),
|
id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор"),
|
||||||
class_id = table.Column<int>(type: "integer", nullable: true)
|
class_id = table.Column<int>(type: "integer", nullable: true, comment: "Идентификатор класса")
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
@@ -820,10 +818,10 @@ namespace Pf2eModel.Migrations
|
|||||||
name: "archetypes",
|
name: "archetypes",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
id = table.Column<int>(type: "integer", nullable: false),
|
id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор"),
|
||||||
level = table.Column<int>(type: "integer", nullable: false),
|
level = table.Column<int>(type: "integer", nullable: false, comment: "Уровень"),
|
||||||
dedication_feat_id = table.Column<int>(type: "integer", nullable: true),
|
dedication_feat_id = table.Column<int>(type: "integer", nullable: true, comment: "ID посвящения"),
|
||||||
extra = table.Column<string>(type: "text", nullable: true)
|
extra = table.Column<string>(type: "text", nullable: true, comment: "Дополнительная информация")
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
@@ -1059,9 +1057,9 @@ namespace Pf2eModel.Migrations
|
|||||||
name: "subclasses",
|
name: "subclasses",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
id = table.Column<int>(type: "integer", nullable: false),
|
id = table.Column<int>(type: "integer", nullable: false, comment: "Идентификатор"),
|
||||||
group_id = table.Column<int>(type: "integer", nullable: false),
|
group_id = table.Column<int>(type: "integer", nullable: false, comment: "Группа подклассов"),
|
||||||
additional = table.Column<string>(type: "jsonb", nullable: false),
|
additional = table.Column<string>(type: "jsonb", nullable: false, comment: "Дополнительная информация"),
|
||||||
extra = table.Column<string>(type: "text", nullable: false)
|
extra = table.Column<string>(type: "text", nullable: false)
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
@@ -21,28 +21,28 @@ namespace Pf2eModel.Migrations
|
|||||||
.HasAnnotation("ProductVersion", "9.0.4")
|
.HasAnnotation("ProductVersion", "9.0.4")
|
||||||
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
||||||
|
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "action_category", new[] { "unknown", "archetype", "class-feature", "class-feat", "offensive", "defensive", "interaction", "familiar", "army_tactic", "army_war_action", "kingdom_activity", "kingdom_feat", "kingdom_feature" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "action_category", new[] { "archetype", "army_tactic", "army_war_action", "class-feat", "class-feature", "defensive", "familiar", "interaction", "kingdom_activity", "kingdom_feat", "kingdom_feature", "offensive", "unknown" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "action_enum", new[] { "unknown", "1", "2", "3", "reaction", "free", "passive", "other", "1-3", "1-2", "2-3", "2/2 rounds", "reaction/1", "reaction/2", "reaction/3", "free/1", "1 minute", "5 minutes", "10 minutes", "30 minutes", "1 hour" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "action_enum", new[] { "1", "1 hour", "1 minute", "1-2", "1-3", "10 minutes", "2", "2-3", "2/2 rounds", "3", "30 minutes", "5 minutes", "free", "free/1", "other", "passive", "reaction", "reaction/1", "reaction/2", "reaction/3", "unknown" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "ancestry_vision", new[] { "normal", "low-light-vision", "dark-vision" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "attribute_values", new[] { "cha", "con", "dex", "free", "int", "str", "wis" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "attribute_values", new[] { "free", "str", "dex", "con", "int", "wis", "cha" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "class_progression_type", new[] { "ancestry_feat", "attribute_increase", "class_feat", "entity", "general_feat", "skill_feat", "skill_increase" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "class_progression_type", new[] { "entity", "ancestry_feat", "class_feat", "general_feat", "skill_feat", "skill_increase" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "condition_group", new[] { "abilities", "attitudes", "death", "detection", "senses", "unknown" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "condition_group", new[] { "unknown", "senses", "abilities", "death", "attitudes", "detection" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "deity_category", new[] { "covenant", "deity", "pantheon", "philosophy" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "deity_category", new[] { "deity", "pantheon", "covenant", "philosophy" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "deity_fonts", new[] { "any", "harm", "heal", "none" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "deity_fonts", new[] { "none", "heal", "harm", "any" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "deity_sanctification", new[] { "any", "holy", "unholy" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "deity_sanctification", new[] { "holy", "unholy", "any" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "element_enum", new[] { "air", "earth", "fire", "metal", "universal", "water", "wood" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_rarity", new[] { "common", "uncommon", "rare", "unique" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_rarity", new[] { "common", "rare", "uncommon", "unique" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_type", new[] { "unknown", "trait", "action", "ancestry", "archetype", "background", "backpack", "campaign_feature", "class", "subclass_group", "subclass", "condition", "deity", "feat", "heritage", "spell", "ritual", "language", "rule" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_type", new[] { "action", "ancestry", "archetype", "background", "backpack", "campaign_feature", "class", "condition", "deity", "feat", "heritage", "language", "ritual", "rule", "spell", "subclass", "subclass_group", "trait", "unknown" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "feat_action_type", new[] { "passive", "action", "reaction", "free" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "feat_category", new[] { "ancestry", "ancestry-feature", "archetype", "bonus", "calling", "campaign-feature", "class", "class-feature", "curse", "deityboon", "general", "pfsboon", "skill", "uncategorized" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "feat_category", new[] { "uncategorized", "ancestry-feature", "class-feature", "calling", "class", "skill", "general", "ancestry", "bonus", "deityboon", "curse", "pfsboon", "campaign-feature" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "locale_type", new[] { "english", "hobby", "legacy", "legacy_english", "other", "russian" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "locale_type", new[] { "english", "legacy_english", "russian", "legacy", "hobby", "other" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "size_enum", new[] { "huge", "large", "medium", "small", "tiny" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "size", new[] { "tiny", "small", "medium", "large" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "source_category", new[] { "adventure-path", "adventures", "blog-posts", "comics", "lost-omens", "rulebook", "society" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "source_category", new[] { "rulebook", "adventure-path", "lost-omens", "adventures", "comics", "blog-posts", "society" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_area_type", new[] { "burst", "circle", "cone", "cube", "cuboid", "cylinder", "emanation", "line", "other", "square", "varies" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_area_type", new[] { "burst", "emanation", "cone", "line", "square", "cube", "cylinder", "varies", "cuboid", "circle", "other" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_damage_category", new[] { "normal", "persistent", "splash" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_damage_category", new[] { "persistent", "splash" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_damage_kinds", new[] { "any", "damage", "healing" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_damage_kinds", new[] { "damage", "healing", "any" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_tradition", new[] { "all", "arcane", "divine", "elemental", "none", "occult", "primal" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_tradition", new[] { "none", "divine", "occult", "arcane", "primal", "elemental", "all" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "training_rank", new[] { "expert", "legendary", "master", "mythic", "trained", "untrained" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "training_rank", new[] { "untrained", "trained", "expert", "master", "legendary", "mythic" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "trait_type", new[] { "class", "regular", "tradition" });
|
||||||
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "trait_type", new[] { "regular", "class", "tradition" });
|
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "vision_enum", new[] { "dark-vision", "low-light-vision", "normal" });
|
||||||
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
||||||
|
|
||||||
modelBuilder.Entity("DeityTraining", b =>
|
modelBuilder.Entity("DeityTraining", b =>
|
||||||
@@ -117,7 +117,7 @@ namespace Pf2eModel.Migrations
|
|||||||
.HasColumnType("text")
|
.HasColumnType("text")
|
||||||
.HasColumnName("description")
|
.HasColumnName("description")
|
||||||
.HasColumnOrder(6)
|
.HasColumnOrder(6)
|
||||||
.HasComment("Текстовое описание объекта");
|
.HasComment("Текстовое описание сущности");
|
||||||
|
|
||||||
b.Property<string>("Img")
|
b.Property<string>("Img")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
@@ -131,13 +131,13 @@ namespace Pf2eModel.Migrations
|
|||||||
.HasColumnType("boolean")
|
.HasColumnType("boolean")
|
||||||
.HasColumnName("is_checked")
|
.HasColumnName("is_checked")
|
||||||
.HasColumnOrder(9)
|
.HasColumnOrder(9)
|
||||||
.HasComment("Флаг, указывающий, что объект был проверен и не требует автоматической перезаписи");
|
.HasComment("Флаг, указывающий, что сущность был проверен и не требует автоматической перезаписи");
|
||||||
|
|
||||||
b.Property<bool?>("IsTranslated")
|
b.Property<bool?>("IsTranslated")
|
||||||
.HasColumnType("boolean")
|
.HasColumnType("boolean")
|
||||||
.HasColumnName("is_translated")
|
.HasColumnName("is_translated")
|
||||||
.HasColumnOrder(8)
|
.HasColumnOrder(8)
|
||||||
.HasComment("Флаг, указывающий, что у объекта существует перевод");
|
.HasComment("Флаг, указывающий, что у сущности существует перевод");
|
||||||
|
|
||||||
b.Property<string>("Name")
|
b.Property<string>("Name")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
@@ -149,7 +149,8 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<EntityRarity>("Rarity")
|
b.Property<EntityRarity>("Rarity")
|
||||||
.HasColumnType("entity_rarity")
|
.HasColumnType("entity_rarity")
|
||||||
.HasColumnName("rarity")
|
.HasColumnName("rarity")
|
||||||
.HasColumnOrder(7);
|
.HasColumnOrder(7)
|
||||||
|
.HasComment("Редкость сущности");
|
||||||
|
|
||||||
b.Property<string>("Slug")
|
b.Property<string>("Slug")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
@@ -163,7 +164,7 @@ namespace Pf2eModel.Migrations
|
|||||||
.HasColumnType("entity_type")
|
.HasColumnType("entity_type")
|
||||||
.HasColumnName("type")
|
.HasColumnName("type")
|
||||||
.HasColumnOrder(3)
|
.HasColumnOrder(3)
|
||||||
.HasComment("Тип объекта");
|
.HasComment("Тип сущности");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_entities");
|
.HasName("pk_entities");
|
||||||
@@ -185,14 +186,16 @@ namespace Pf2eModel.Migrations
|
|||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasColumnType("jsonb")
|
.HasColumnType("jsonb")
|
||||||
.HasColumnName("name")
|
.HasColumnName("name")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Отображаемое имя");
|
||||||
|
|
||||||
b.Property<string>("Slug")
|
b.Property<string>("Slug")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasMaxLength(255)
|
.HasMaxLength(255)
|
||||||
.HasColumnType("character varying(255)")
|
.HasColumnType("character varying(255)")
|
||||||
.HasColumnName("slug")
|
.HasColumnName("slug")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Часть имени в URL");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_keywords");
|
.HasName("pk_keywords");
|
||||||
@@ -206,21 +209,24 @@ namespace Pf2eModel.Migrations
|
|||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
b.Property<int>("KeywordId")
|
b.Property<int>("KeywordId")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("keyword_id")
|
.HasColumnName("keyword_id")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Идентификатор ключевого слова");
|
||||||
|
|
||||||
b.Property<string>("Value")
|
b.Property<string>("Value")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasMaxLength(255)
|
.HasMaxLength(255)
|
||||||
.HasColumnType("character varying(255)")
|
.HasColumnType("character varying(255)")
|
||||||
.HasColumnName("value")
|
.HasColumnName("value")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Синоним");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_keyword_aliases");
|
.HasName("pk_keyword_aliases");
|
||||||
@@ -237,14 +243,16 @@ namespace Pf2eModel.Migrations
|
|||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(0);
|
.HasColumnOrder(0)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
b.Property<int>("EntityId")
|
b.Property<int>("EntityId")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("entity_id")
|
.HasColumnName("entity_id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор сущности");
|
||||||
|
|
||||||
b.Property<bool>("IsRemaster")
|
b.Property<bool>("IsRemaster")
|
||||||
.HasColumnType("boolean")
|
.HasColumnType("boolean")
|
||||||
@@ -255,7 +263,8 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("SourceId")
|
b.Property<int>("SourceId")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("source_id")
|
.HasColumnName("source_id")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Идентификатор источника");
|
||||||
|
|
||||||
b.Property<string>("Suffix")
|
b.Property<string>("Suffix")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
@@ -283,26 +292,30 @@ namespace Pf2eModel.Migrations
|
|||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
b.Property<SourceCategory>("Category")
|
b.Property<SourceCategory>("Category")
|
||||||
.HasColumnType("source_category")
|
.HasColumnType("source_category")
|
||||||
.HasColumnName("category")
|
.HasColumnName("category")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Категория источника");
|
||||||
|
|
||||||
b.Property<string>("Name")
|
b.Property<string>("Name")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasMaxLength(255)
|
.HasMaxLength(255)
|
||||||
.HasColumnType("character varying(255)")
|
.HasColumnType("character varying(255)")
|
||||||
.HasColumnName("name")
|
.HasColumnName("name")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Отображаемое имя");
|
||||||
|
|
||||||
b.Property<DateOnly?>("ReleaseDate")
|
b.Property<DateOnly?>("ReleaseDate")
|
||||||
.HasColumnType("date")
|
.HasColumnType("date")
|
||||||
.HasColumnName("release_date")
|
.HasColumnName("release_date")
|
||||||
.HasColumnOrder(4);
|
.HasColumnOrder(4)
|
||||||
|
.HasComment("Дата выхода источника");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_sources");
|
.HasName("pk_sources");
|
||||||
@@ -315,12 +328,14 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("EntityId")
|
b.Property<int>("EntityId")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("entity_id")
|
.HasColumnName("entity_id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор сущности");
|
||||||
|
|
||||||
b.Property<int>("TargetId")
|
b.Property<int>("TargetId")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("target_id")
|
.HasColumnName("target_id")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Идентификатор цели");
|
||||||
|
|
||||||
b.Property<string>("Md5")
|
b.Property<string>("Md5")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
@@ -328,7 +343,7 @@ namespace Pf2eModel.Migrations
|
|||||||
.HasColumnType("character varying(32)")
|
.HasColumnType("character varying(32)")
|
||||||
.HasColumnName("md5")
|
.HasColumnName("md5")
|
||||||
.HasColumnOrder(5)
|
.HasColumnOrder(5)
|
||||||
.HasComment("Контроль версии объекта");
|
.HasComment("Контрольная сумма объекта");
|
||||||
|
|
||||||
b.Property<string>("Suffix")
|
b.Property<string>("Suffix")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
@@ -353,7 +368,8 @@ namespace Pf2eModel.Migrations
|
|||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
@@ -362,21 +378,24 @@ namespace Pf2eModel.Migrations
|
|||||||
.HasMaxLength(255)
|
.HasMaxLength(255)
|
||||||
.HasColumnType("character varying(255)")
|
.HasColumnType("character varying(255)")
|
||||||
.HasColumnName("icon")
|
.HasColumnName("icon")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Иконка цели");
|
||||||
|
|
||||||
b.Property<string>("Name")
|
b.Property<string>("Name")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasMaxLength(255)
|
.HasMaxLength(255)
|
||||||
.HasColumnType("character varying(255)")
|
.HasColumnType("character varying(255)")
|
||||||
.HasColumnName("name")
|
.HasColumnName("name")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Отображаемое имя");
|
||||||
|
|
||||||
b.Property<string>("Prefix")
|
b.Property<string>("Prefix")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasMaxLength(255)
|
.HasMaxLength(255)
|
||||||
.HasColumnType("character varying(255)")
|
.HasColumnType("character varying(255)")
|
||||||
.HasColumnName("prefix")
|
.HasColumnName("prefix")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Префикс для URL-адреса внешней ссылки");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_external_targets");
|
.HasName("pk_external_targets");
|
||||||
@@ -390,24 +409,28 @@ namespace Pf2eModel.Migrations
|
|||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
b.Property<int>("Max")
|
b.Property<int>("Max")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("max")
|
.HasColumnName("max")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Максимальная продолжительсность");
|
||||||
|
|
||||||
b.Property<int>("Per")
|
b.Property<int>("Per")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("per")
|
.HasColumnName("per")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Частота использования");
|
||||||
|
|
||||||
b.Property<int?>("Value")
|
b.Property<int?>("Value")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("value")
|
.HasColumnName("value")
|
||||||
.HasColumnOrder(4);
|
.HasColumnOrder(4)
|
||||||
|
.HasComment("Значение использования");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_frequencies");
|
.HasName("pk_frequencies");
|
||||||
@@ -421,7 +444,8 @@ namespace Pf2eModel.Migrations
|
|||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
@@ -429,12 +453,14 @@ namespace Pf2eModel.Migrations
|
|||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasColumnType("jsonb")
|
.HasColumnType("jsonb")
|
||||||
.HasColumnName("name")
|
.HasColumnName("name")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Название способности");
|
||||||
|
|
||||||
b.Property<int>("Type")
|
b.Property<int>("Type")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("type")
|
.HasColumnName("type")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Тип способности");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_trainings");
|
.HasName("pk_trainings");
|
||||||
@@ -447,17 +473,20 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
b.Property<ActionEnum>("Actions")
|
b.Property<ActionEnum>("Actions")
|
||||||
.HasColumnType("action_enum")
|
.HasColumnType("action_enum")
|
||||||
.HasColumnName("actions")
|
.HasColumnName("actions")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Количество действий");
|
||||||
|
|
||||||
b.Property<string>("Extra")
|
b.Property<string>("Extra")
|
||||||
.HasColumnType("text")
|
.HasColumnType("text")
|
||||||
.HasColumnName("extra")
|
.HasColumnName("extra")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Дополнительная информация");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_actions");
|
.HasName("pk_actions");
|
||||||
@@ -470,28 +499,33 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
b.Property<int>("Hp")
|
b.Property<int>("Hp")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("hp")
|
.HasColumnName("hp")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Количество очков здоровья");
|
||||||
|
|
||||||
b.PrimitiveCollection<Size[]>("Size")
|
b.PrimitiveCollection<SizeEnum[]>("Size")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasColumnType("size[]")
|
.HasColumnType("size_enum[]")
|
||||||
.HasColumnName("size")
|
.HasColumnName("size")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Размеры родословной");
|
||||||
|
|
||||||
b.Property<int>("Speed")
|
b.Property<int>("Speed")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("speed")
|
.HasColumnName("speed")
|
||||||
.HasColumnOrder(4);
|
.HasColumnOrder(4)
|
||||||
|
.HasComment("Скорость передвижения");
|
||||||
|
|
||||||
b.Property<AncestryVision>("Vision")
|
b.Property<VisionEnum>("VisionEnum")
|
||||||
.HasColumnType("ancestry_vision")
|
.HasColumnType("vision_enum")
|
||||||
.HasColumnName("vision")
|
.HasColumnName("vision_enum")
|
||||||
.HasColumnOrder(5);
|
.HasColumnOrder(5)
|
||||||
|
.HasComment("Тип зрения");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_ancestries");
|
.HasName("pk_ancestries");
|
||||||
@@ -590,22 +624,26 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
b.Property<int?>("DedicationFeatId")
|
b.Property<int?>("DedicationFeatId")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("dedication_feat_id")
|
.HasColumnName("dedication_feat_id")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("ID посвящения");
|
||||||
|
|
||||||
b.Property<string>("Extra")
|
b.Property<string>("Extra")
|
||||||
.HasColumnType("text")
|
.HasColumnType("text")
|
||||||
.HasColumnName("extra")
|
.HasColumnName("extra")
|
||||||
.HasColumnOrder(4);
|
.HasColumnOrder(4)
|
||||||
|
.HasComment("Дополнительная информация");
|
||||||
|
|
||||||
b.Property<int>("Level")
|
b.Property<int>("Level")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("level")
|
.HasColumnName("level")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Уровень");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_archetypes");
|
.HasName("pk_archetypes");
|
||||||
@@ -641,7 +679,8 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_backgrounds");
|
.HasName("pk_backgrounds");
|
||||||
@@ -743,32 +782,32 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
b.Property<int>("AdditionalTrainedSkills")
|
b.Property<int>("AdditionalTrainedSkills")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("additional_trained_skills")
|
.HasColumnName("additional_trained_skills")
|
||||||
.HasColumnOrder(7);
|
.HasColumnOrder(7)
|
||||||
|
.HasComment("Дополнительные навыки");
|
||||||
|
|
||||||
b.Property<int>("Hp")
|
b.Property<int>("Hp")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("hp")
|
.HasColumnName("hp")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Количество очков здоровья");
|
||||||
b.Property<int>("Perception")
|
|
||||||
.HasColumnType("integer")
|
|
||||||
.HasColumnName("perception")
|
|
||||||
.HasColumnOrder(4);
|
|
||||||
|
|
||||||
b.Property<bool>("Spellcasting")
|
b.Property<bool>("Spellcasting")
|
||||||
.HasColumnType("boolean")
|
.HasColumnType("boolean")
|
||||||
.HasColumnName("spellcasting")
|
.HasColumnName("spellcasting")
|
||||||
.HasColumnOrder(5);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Заклинатель?");
|
||||||
|
|
||||||
b.Property<SpellTradition>("Tradition")
|
b.Property<SpellTradition?>("Tradition")
|
||||||
.HasColumnType("spell_tradition")
|
.HasColumnType("spell_tradition")
|
||||||
.HasColumnName("tradition")
|
.HasColumnName("tradition")
|
||||||
.HasColumnOrder(6);
|
.HasColumnOrder(6)
|
||||||
|
.HasComment("Традиция заклинаний");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_classes");
|
.HasName("pk_classes");
|
||||||
@@ -945,17 +984,20 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
b.Property<string>("Extra")
|
b.Property<string>("Extra")
|
||||||
.HasColumnType("text")
|
.HasColumnType("text")
|
||||||
.HasColumnName("extra")
|
.HasColumnName("extra")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Дополнительная информация");
|
||||||
|
|
||||||
b.Property<ConditionGroup?>("Group")
|
b.Property<ConditionGroup?>("Group")
|
||||||
.HasColumnType("condition_group")
|
.HasColumnType("condition_group")
|
||||||
.HasColumnName("group")
|
.HasColumnName("group")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Группа состояния");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_conditions");
|
.HasName("pk_conditions");
|
||||||
@@ -968,27 +1010,32 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
b.Property<DeityCategory>("Category")
|
b.Property<DeityCategory>("Category")
|
||||||
.HasColumnType("deity_category")
|
.HasColumnType("deity_category")
|
||||||
.HasColumnName("category")
|
.HasColumnName("category")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Тип божества");
|
||||||
|
|
||||||
b.Property<DeityFonts>("Fonts")
|
b.Property<DeityFonts>("Fonts")
|
||||||
.HasColumnType("deity_fonts")
|
.HasColumnType("deity_fonts")
|
||||||
.HasColumnName("fonts")
|
.HasColumnName("fonts")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Тип божественной силы");
|
||||||
|
|
||||||
b.Property<DeitySanctification>("Sanctification")
|
b.Property<DeitySanctification>("Sanctification")
|
||||||
.HasColumnType("deity_sanctification")
|
.HasColumnType("deity_sanctification")
|
||||||
.HasColumnName("sanctification")
|
.HasColumnName("sanctification")
|
||||||
.HasColumnOrder(4);
|
.HasColumnOrder(4)
|
||||||
|
.HasComment("Тип освящения");
|
||||||
|
|
||||||
b.Property<bool>("SanctificationMust")
|
b.Property<bool>("SanctificationMust")
|
||||||
.HasColumnType("boolean")
|
.HasColumnType("boolean")
|
||||||
.HasColumnName("sanctification_must")
|
.HasColumnName("sanctification_must")
|
||||||
.HasColumnOrder(5);
|
.HasColumnOrder(5)
|
||||||
|
.HasComment("Обязательное освящение");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_deities");
|
.HasName("pk_deities");
|
||||||
@@ -1123,22 +1170,26 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
b.Property<int?>("Actions")
|
b.Property<int?>("Actions")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("actions")
|
.HasColumnName("actions")
|
||||||
.HasColumnOrder(5);
|
.HasColumnOrder(5)
|
||||||
|
.HasComment("Количество действий");
|
||||||
|
|
||||||
b.Property<ActionCategory>("Category")
|
b.Property<FeatCategory>("Category")
|
||||||
.HasColumnType("action_category")
|
.HasColumnType("feat_category")
|
||||||
.HasColumnName("category")
|
.HasColumnName("category")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Категория способности");
|
||||||
|
|
||||||
b.Property<string>("Extra")
|
b.Property<string>("Extra")
|
||||||
.HasColumnType("text")
|
.HasColumnType("text")
|
||||||
.HasColumnName("extra")
|
.HasColumnName("extra")
|
||||||
.HasColumnOrder(10);
|
.HasColumnOrder(10)
|
||||||
|
.HasComment("Дополнительная информация");
|
||||||
|
|
||||||
b.Property<bool>("IsFreeAction")
|
b.Property<bool>("IsFreeAction")
|
||||||
.HasColumnType("boolean")
|
.HasColumnType("boolean")
|
||||||
@@ -1158,7 +1209,8 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Level")
|
b.Property<int>("Level")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("level")
|
.HasColumnName("level")
|
||||||
.HasColumnOrder(4);
|
.HasColumnOrder(4)
|
||||||
|
.HasComment("Уровень способности");
|
||||||
|
|
||||||
b.Property<int?>("MaxActions")
|
b.Property<int?>("MaxActions")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
@@ -1207,12 +1259,14 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
b.Property<int?>("AncestryId")
|
b.Property<int?>("AncestryId")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("ancestry_id")
|
.HasColumnName("ancestry_id")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Идентификатор родословной");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_heritages");
|
.HasName("pk_heritages");
|
||||||
@@ -1226,12 +1280,10 @@ namespace Pf2eModel.Migrations
|
|||||||
modelBuilder.Entity("Pf2eModel.Model.Structure.Language", b =>
|
modelBuilder.Entity("Pf2eModel.Model.Structure.Language", b =>
|
||||||
{
|
{
|
||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
|
||||||
|
|
||||||
b.Property<int>("EntityId")
|
b.Property<int>("EntityId")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
@@ -1251,7 +1303,8 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
b.Property<int>("CastTime")
|
b.Property<int>("CastTime")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
@@ -1262,7 +1315,8 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<string>("Cost")
|
b.Property<string>("Cost")
|
||||||
.HasColumnType("jsonb")
|
.HasColumnType("jsonb")
|
||||||
.HasColumnName("cost")
|
.HasColumnName("cost")
|
||||||
.HasColumnOrder(14);
|
.HasColumnOrder(14)
|
||||||
|
.HasComment("Стоимость ритуала");
|
||||||
|
|
||||||
b.Property<int>("Duration")
|
b.Property<int>("Duration")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
@@ -1270,61 +1324,72 @@ namespace Pf2eModel.Migrations
|
|||||||
.HasColumnOrder(4)
|
.HasColumnOrder(4)
|
||||||
.HasComment("Время действия эффекта ритуала в секундах");
|
.HasComment("Время действия эффекта ритуала в секундах");
|
||||||
|
|
||||||
b.PrimitiveCollection<int[]>("Elements")
|
b.PrimitiveCollection<ElementEnum[]>("Elements")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasColumnType("integer[]")
|
.HasColumnType("element_enum[]")
|
||||||
.HasColumnName("elements")
|
.HasColumnName("elements")
|
||||||
.HasColumnOrder(5);
|
.HasColumnOrder(5)
|
||||||
|
.HasComment("Элементы ритуала");
|
||||||
|
|
||||||
b.Property<int>("Level")
|
b.Property<int>("Level")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("level")
|
.HasColumnName("level")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Уровень ритуала");
|
||||||
|
|
||||||
b.Property<TrainingRank>("PrimaryCheckRank")
|
b.Property<TrainingRank>("PrimaryCheckRank")
|
||||||
.HasColumnType("training_rank")
|
.HasColumnType("training_rank")
|
||||||
.HasColumnName("primary_check_rank")
|
.HasColumnName("primary_check_rank")
|
||||||
.HasColumnOrder(7);
|
.HasColumnOrder(7)
|
||||||
|
.HasComment("Ранг основной проверки");
|
||||||
|
|
||||||
b.Property<string>("PrimaryCheckSuffix")
|
b.Property<string>("PrimaryCheckSuffix")
|
||||||
.HasColumnType("jsonb")
|
.HasColumnType("jsonb")
|
||||||
.HasColumnName("primary_check_suffix")
|
.HasColumnName("primary_check_suffix")
|
||||||
.HasColumnOrder(8);
|
.HasColumnOrder(8)
|
||||||
|
.HasComment("Дополнительная информация об основной проверки");
|
||||||
|
|
||||||
b.Property<int>("Range")
|
b.Property<int>("Range")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("range")
|
.HasColumnName("range")
|
||||||
.HasColumnOrder(6);
|
.HasColumnOrder(6)
|
||||||
|
.HasComment("Дальнность ритуала");
|
||||||
|
|
||||||
b.Property<string>("RangeString")
|
b.Property<string>("RangeString")
|
||||||
.HasColumnType("jsonb")
|
.HasColumnType("jsonb")
|
||||||
.HasColumnName("range_string")
|
.HasColumnName("range_string")
|
||||||
.HasColumnOrder(12);
|
.HasColumnOrder(12)
|
||||||
|
.HasComment("Дальность ритуала");
|
||||||
|
|
||||||
b.Property<string>("Requirement")
|
b.Property<string>("Requirement")
|
||||||
.HasColumnType("jsonb")
|
.HasColumnType("jsonb")
|
||||||
.HasColumnName("requirement")
|
.HasColumnName("requirement")
|
||||||
.HasColumnOrder(15);
|
.HasColumnOrder(15)
|
||||||
|
.HasComment("Требования к ритуалу");
|
||||||
|
|
||||||
b.Property<int>("SecondaryCasters")
|
b.Property<int>("SecondaryCasters")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("secondary_casters")
|
.HasColumnName("secondary_casters")
|
||||||
.HasColumnOrder(9);
|
.HasColumnOrder(9)
|
||||||
|
.HasComment("Количество дополнительных заклинателей");
|
||||||
|
|
||||||
b.Property<int>("SecondaryCastersMax")
|
b.Property<int>("SecondaryCastersMax")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("secondary_casters_max")
|
.HasColumnName("secondary_casters_max")
|
||||||
.HasColumnOrder(10);
|
.HasColumnOrder(10)
|
||||||
|
.HasComment("Максимальное количество дополнительных заклинателей");
|
||||||
|
|
||||||
b.Property<string>("SecondaryCastersSuffix")
|
b.Property<string>("SecondaryCastersSuffix")
|
||||||
.HasColumnType("jsonb")
|
.HasColumnType("jsonb")
|
||||||
.HasColumnName("secondary_casters_suffix")
|
.HasColumnName("secondary_casters_suffix")
|
||||||
.HasColumnOrder(11);
|
.HasColumnOrder(11)
|
||||||
|
.HasComment("Дополнительная информация о дополнительных заклинателях");
|
||||||
|
|
||||||
b.Property<string>("Target")
|
b.Property<string>("Target")
|
||||||
.HasColumnType("jsonb")
|
.HasColumnType("jsonb")
|
||||||
.HasColumnName("target")
|
.HasColumnName("target")
|
||||||
.HasColumnOrder(13);
|
.HasColumnOrder(13)
|
||||||
|
.HasComment("Цель ритуала");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_rituals");
|
.HasName("pk_rituals");
|
||||||
@@ -1408,7 +1473,8 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
b.PrimitiveCollection<string[]>("Breadcrumbs")
|
b.PrimitiveCollection<string[]>("Breadcrumbs")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
@@ -1418,12 +1484,14 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Order")
|
b.Property<int>("Order")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("order")
|
.HasColumnName("order")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Порядок отображения");
|
||||||
|
|
||||||
b.Property<int?>("ParentId")
|
b.Property<int?>("ParentId")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("parent_id")
|
.HasColumnName("parent_id")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Родительского правило");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_rules");
|
.HasName("pk_rules");
|
||||||
@@ -1439,34 +1507,40 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
b.Property<ActionEnum>("Actions")
|
b.Property<ActionEnum>("Actions")
|
||||||
.HasColumnType("action_enum")
|
.HasColumnType("action_enum")
|
||||||
.HasColumnName("actions")
|
.HasColumnName("actions")
|
||||||
.HasColumnOrder(4);
|
.HasColumnOrder(4)
|
||||||
|
.HasComment("Количество действий");
|
||||||
|
|
||||||
b.Property<string>("Cost")
|
b.Property<string>("Cost")
|
||||||
.HasColumnType("jsonb")
|
.HasColumnType("jsonb")
|
||||||
.HasColumnName("cost")
|
.HasColumnName("cost")
|
||||||
.HasColumnOrder(11);
|
.HasColumnOrder(11)
|
||||||
|
.HasComment("Стоимость заклинания");
|
||||||
|
|
||||||
b.Property<int?>("Duration")
|
b.Property<int?>("Duration")
|
||||||
.HasMaxLength(255)
|
.HasMaxLength(255)
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("duration")
|
.HasColumnName("duration")
|
||||||
.HasColumnOrder(5);
|
.HasColumnOrder(5)
|
||||||
|
.HasComment("Время длительности заклинания");
|
||||||
|
|
||||||
b.PrimitiveCollection<int[]>("Elements")
|
b.PrimitiveCollection<ElementEnum[]>("Elements")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasColumnType("integer[]")
|
.HasColumnType("element_enum[]")
|
||||||
.HasColumnName("elements")
|
.HasColumnName("elements")
|
||||||
.HasColumnOrder(8);
|
.HasColumnOrder(8)
|
||||||
|
.HasComment("Элементы заклинания");
|
||||||
|
|
||||||
b.Property<bool>("IsFocus")
|
b.Property<bool>("IsFocus")
|
||||||
.HasColumnType("boolean")
|
.HasColumnType("boolean")
|
||||||
.HasColumnName("is_focus")
|
.HasColumnName("is_focus")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Фокус?");
|
||||||
|
|
||||||
b.Property<int>("Level")
|
b.Property<int>("Level")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
@@ -1476,28 +1550,33 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Range")
|
b.Property<int>("Range")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("range")
|
.HasColumnName("range")
|
||||||
.HasColumnOrder(6);
|
.HasColumnOrder(6)
|
||||||
|
.HasComment("Дальность заклинания");
|
||||||
|
|
||||||
b.Property<string>("Requirement")
|
b.Property<string>("Requirement")
|
||||||
.HasColumnType("jsonb")
|
.HasColumnType("jsonb")
|
||||||
.HasColumnName("requirement")
|
.HasColumnName("requirement")
|
||||||
.HasColumnOrder(12);
|
.HasColumnOrder(12)
|
||||||
|
.HasComment("Требования к заклинанию");
|
||||||
|
|
||||||
b.Property<string>("Target")
|
b.Property<string>("Target")
|
||||||
.HasColumnType("jsonb")
|
.HasColumnType("jsonb")
|
||||||
.HasColumnName("target")
|
.HasColumnName("target")
|
||||||
.HasColumnOrder(10);
|
.HasColumnOrder(10)
|
||||||
|
.HasComment("Цель заклинания");
|
||||||
|
|
||||||
b.PrimitiveCollection<SpellTradition[]>("Traditions")
|
b.PrimitiveCollection<SpellTradition[]>("Traditions")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasColumnType("spell_tradition[]")
|
.HasColumnType("spell_tradition[]")
|
||||||
.HasColumnName("traditions")
|
.HasColumnName("traditions")
|
||||||
.HasColumnOrder(7);
|
.HasColumnOrder(7)
|
||||||
|
.HasComment("Традиции заклинания");
|
||||||
|
|
||||||
b.Property<string>("Trigger")
|
b.Property<string>("Trigger")
|
||||||
.HasColumnType("jsonb")
|
.HasColumnType("jsonb")
|
||||||
.HasColumnName("trigger")
|
.HasColumnName("trigger")
|
||||||
.HasColumnOrder(9);
|
.HasColumnOrder(9)
|
||||||
|
.HasComment("Триггер заклинания");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_spells");
|
.HasName("pk_spells");
|
||||||
@@ -1652,13 +1731,15 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
b.Property<string>("Additional")
|
b.Property<string>("Additional")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasColumnType("jsonb")
|
.HasColumnType("jsonb")
|
||||||
.HasColumnName("additional")
|
.HasColumnName("additional")
|
||||||
.HasColumnOrder(3);
|
.HasColumnOrder(3)
|
||||||
|
.HasComment("Дополнительная информация");
|
||||||
|
|
||||||
b.Property<string>("Extra")
|
b.Property<string>("Extra")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
@@ -1669,7 +1750,8 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("GroupId")
|
b.Property<int>("GroupId")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("group_id")
|
.HasColumnName("group_id")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Группа подклассов");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_subclasses");
|
.HasName("pk_subclasses");
|
||||||
@@ -1685,12 +1767,14 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
b.Property<int?>("ClassId")
|
b.Property<int?>("ClassId")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("class_id")
|
.HasColumnName("class_id")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Идентификатор класса");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_subclass_groups");
|
.HasName("pk_subclass_groups");
|
||||||
@@ -1706,12 +1790,14 @@ namespace Pf2eModel.Migrations
|
|||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
.HasColumnType("integer")
|
.HasColumnType("integer")
|
||||||
.HasColumnName("id")
|
.HasColumnName("id")
|
||||||
.HasColumnOrder(1);
|
.HasColumnOrder(1)
|
||||||
|
.HasComment("Идентификатор");
|
||||||
|
|
||||||
b.Property<TraitType>("Type")
|
b.Property<TraitType>("Type")
|
||||||
.HasColumnType("trait_type")
|
.HasColumnType("trait_type")
|
||||||
.HasColumnName("type")
|
.HasColumnName("type")
|
||||||
.HasColumnOrder(2);
|
.HasColumnOrder(2)
|
||||||
|
.HasComment("Тип признака");
|
||||||
|
|
||||||
b.HasKey("Id")
|
b.HasKey("Id")
|
||||||
.HasName("pk_traits");
|
.HasName("pk_traits");
|
||||||
|
|||||||
@@ -10,51 +10,93 @@ using Pf2eModel.Model.Structure;
|
|||||||
|
|
||||||
namespace Pf2eModel.Model.Base;
|
namespace Pf2eModel.Model.Base;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Корневая сущность.
|
||||||
|
/// </summary>
|
||||||
public class Entity
|
public class Entity
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Идентификатор сущности.
|
||||||
|
/// </summary>
|
||||||
[Key]
|
[Key]
|
||||||
[Column(Order = 1)]
|
[Column(Order = 1)]
|
||||||
public int Id { get; set; }
|
public int Id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Отображаемое имя сущности.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 2)]
|
[Column(Order = 2)]
|
||||||
[Comment("Отображаемое имя")]
|
[Comment("Отображаемое имя")]
|
||||||
public LocaleString Name { get; set; } = [];
|
public LocaleString Name { get; set; } = [];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Тип сущности.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 3)]
|
[Column(Order = 3)]
|
||||||
[Comment("Тип объекта")]
|
[Comment("Тип сущности")]
|
||||||
public EntityType Type { get; set; }
|
public EntityType Type { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Часть имени в URL.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 4)]
|
[Column(Order = 4)]
|
||||||
[MaxLength(Pf2eDbContext.NameLength)]
|
[MaxLength(Pf2eDbContext.NameLength)]
|
||||||
[Comment("Часть имени в URL")]
|
[Comment("Часть имени в URL")]
|
||||||
public string Slug { get; set; } = null!;
|
public string Slug { get; set; } = null!;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Изображение сущности.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 5)]
|
[Column(Order = 5)]
|
||||||
[StringLength(255)]
|
[StringLength(255)]
|
||||||
[Comment("Изображение объекта")]
|
[Comment("Изображение объекта")]
|
||||||
public string Img { get; set; } = null!;
|
public string Img { get; set; } = null!;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Текстовое описание сущности.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 6)]
|
[Column(Order = 6)]
|
||||||
[Comment("Текстовое описание объекта")]
|
[Comment("Текстовое описание сущности")]
|
||||||
// ReSharper disable once EntityFramework.ModelValidation.UnlimitedStringLength
|
|
||||||
public string Description { get; set; } = null!;
|
public string Description { get; set; } = null!;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Редкость сущности.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 7)]
|
[Column(Order = 7)]
|
||||||
|
[Comment("Редкость сущности")]
|
||||||
public EntityRarity Rarity { get; set; } = EntityRarity.Common;
|
public EntityRarity Rarity { get; set; } = EntityRarity.Common;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Флаг, указывающий, что у объекта существует перевод.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 8)]
|
[Column(Order = 8)]
|
||||||
[Comment("Флаг, указывающий, что у объекта существует перевод")]
|
[Comment("Флаг, указывающий, что у сущности существует перевод")]
|
||||||
public bool? IsTranslated { get; set; } = false;
|
public bool? IsTranslated { get; set; } = false;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Флаг, указывающий, что объект был проверен и не требует автоматической перезаписи.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 9)]
|
[Column(Order = 9)]
|
||||||
[Comment("Флаг, указывающий, что объект был проверен и не требует автоматической перезаписи")]
|
[Comment("Флаг, указывающий, что сущность был проверен и не требует автоматической перезаписи")]
|
||||||
public bool? IsChecked { get; set; } = false;
|
public bool? IsChecked { get; set; } = false;
|
||||||
|
|
||||||
public virtual ICollection<Trait> Traits { get; set; } = [];
|
/// <summary>
|
||||||
|
/// Коллекция признаков, связанных с сущностью.
|
||||||
|
/// </summary>
|
||||||
|
public ICollection<Trait> Traits { get; set; } = [];
|
||||||
|
|
||||||
public virtual ICollection<Keyword> Keywords { get; set; } = [];
|
/// <summary>
|
||||||
|
/// Коллекция ключевых слов, связанных с сущностью.
|
||||||
|
/// </summary>
|
||||||
|
public ICollection<Keyword> Keywords { get; set; } = [];
|
||||||
|
|
||||||
public virtual ICollection<EntitySource> Sources { get; set; } = [];
|
/// <summary>
|
||||||
|
/// Коллекция источников, связанных с сущностью.
|
||||||
|
/// </summary>
|
||||||
|
public ICollection<EntitySource> Sources { get; set; } = [];
|
||||||
|
|
||||||
public virtual ICollection<EntityExternal> Externals { get; set; } = [];
|
/// <summary>
|
||||||
|
/// Коллекция внешних ссылок, связанных с сущностью.
|
||||||
|
/// </summary>
|
||||||
|
public ICollection<EntityExternal> Externals { get; set; } = [];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,25 +1,45 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.ComponentModel.DataAnnotations.Schema;
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Pf2eModel.Model.Common.I18n;
|
using Pf2eModel.Model.Common.I18n;
|
||||||
|
|
||||||
namespace Pf2eModel.Model.Base.Keywords;
|
namespace Pf2eModel.Model.Base.Keywords;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Ключевое слово.
|
||||||
|
/// </summary>
|
||||||
public class Keyword
|
public class Keyword
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Идентификатор.
|
||||||
|
/// </summary>
|
||||||
[Key]
|
[Key]
|
||||||
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
||||||
[Column(Order = 1)]
|
[Column(Order = 1)]
|
||||||
public int Id { get; set; }
|
public int Id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Отображаемое имя ключевого слова.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 2)]
|
[Column(Order = 2)]
|
||||||
|
[Comment("Отображаемое имя")]
|
||||||
public LocaleString Name = [];
|
public LocaleString Name = [];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Часть имени в URL.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 3)]
|
[Column(Order = 3)]
|
||||||
[MaxLength(Pf2eDbContext.NameLength)]
|
[MaxLength(Pf2eDbContext.NameLength)]
|
||||||
|
[Comment("Часть имени в URL")]
|
||||||
public string Slug { get; set; } = null!;
|
public string Slug { get; set; } = null!;
|
||||||
|
|
||||||
[Newtonsoft.Json.JsonIgnore]
|
/// <summary>
|
||||||
|
/// Коллекция сущностей, которые используют это ключевое слово.
|
||||||
|
/// </summary>
|
||||||
public ICollection<Entity> Entities { get; set; } = [];
|
public ICollection<Entity> Entities { get; set; } = [];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Коллекция синонимов ключевого слова.
|
||||||
|
/// </summary>
|
||||||
public ICollection<KeywordAlias> Aliases { get; set; } = [];
|
public ICollection<KeywordAlias> Aliases { get; set; } = [];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,22 +1,40 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.ComponentModel.DataAnnotations.Schema;
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
|
||||||
namespace Pf2eModel.Model.Base.Keywords;
|
namespace Pf2eModel.Model.Base.Keywords;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Синоним ключевого слова.
|
||||||
|
/// </summary>
|
||||||
public class KeywordAlias
|
public class KeywordAlias
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Идентификатор.
|
||||||
|
/// </summary>
|
||||||
[Key]
|
[Key]
|
||||||
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
||||||
[Column(Order = 1)]
|
[Column(Order = 1)]
|
||||||
|
[Comment("Идентификатор")]
|
||||||
public int Id { get; set; }
|
public int Id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Идентификатор связаннного ключевого слова.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 2)]
|
[Column(Order = 2)]
|
||||||
|
[Comment("Идентификатор ключевого слова")]
|
||||||
public int KeywordId { get; set; }
|
public int KeywordId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Значение синонима ключевого слова.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 3)]
|
[Column(Order = 3)]
|
||||||
[MaxLength(Pf2eDbContext.NameLength)]
|
[MaxLength(Pf2eDbContext.NameLength)]
|
||||||
|
[Comment("Синоним")]
|
||||||
public string Value { get; set; } = null!;
|
public string Value { get; set; } = null!;
|
||||||
|
|
||||||
[Newtonsoft.Json.JsonIgnore]
|
/// <summary>
|
||||||
|
/// Ключевое слово, к которому относится синоним.
|
||||||
|
/// </summary>
|
||||||
public Keyword Keyword { get; set; } = null!;
|
public Keyword Keyword { get; set; } = null!;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,30 +4,56 @@ using Microsoft.EntityFrameworkCore;
|
|||||||
|
|
||||||
namespace Pf2eModel.Model.Base.Source;
|
namespace Pf2eModel.Model.Base.Source;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Связь между сущностью и источником.
|
||||||
|
/// </summary>
|
||||||
public class EntitySource
|
public class EntitySource
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Идентификатор связи.
|
||||||
|
/// </summary>
|
||||||
[Key]
|
[Key]
|
||||||
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
||||||
[Column(Order = 0)]
|
[Column(Order = 0)]
|
||||||
|
[Comment("Идентификатор")]
|
||||||
public int Id { get; set; }
|
public int Id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Идентификатор сущности.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 1)]
|
[Column(Order = 1)]
|
||||||
|
[Comment("Идентификатор сущности")]
|
||||||
public int EntityId { get; set; }
|
public int EntityId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Идентификатор источника.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 2)]
|
[Column(Order = 2)]
|
||||||
|
[Comment("Идентификатор источника")]
|
||||||
public int SourceId { get; set; }
|
public int SourceId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Дополнительная информация о источнике, например, номер страницы, номер тома и т.д.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 3)]
|
[Column(Order = 3)]
|
||||||
[MaxLength(255)]
|
[MaxLength(255)]
|
||||||
[Comment("Номер страницы, эррата и т.д.")]
|
[Comment("Номер страницы, эррата и т.д.")]
|
||||||
public string Suffix { get; set; } = null!;
|
public string Suffix { get; set; } = null!;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Флаг, указывающий, что объект является частью ремастера.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 4)]
|
[Column(Order = 4)]
|
||||||
[Comment("Флаг, указывающий, что объект является частью ремастера")]
|
[Comment("Флаг, указывающий, что объект является частью ремастера")]
|
||||||
public bool IsRemaster { get; set; }
|
public bool IsRemaster { get; set; }
|
||||||
|
|
||||||
[Newtonsoft.Json.JsonIgnore]
|
/// <summary>
|
||||||
|
/// Сущность, к которой относится источник.
|
||||||
|
/// </summary>
|
||||||
public Entity Entity { get; set; } = null!;
|
public Entity Entity { get; set; } = null!;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Источник, к которому относится сущность.
|
||||||
|
/// </summary>
|
||||||
public Source Source { get; set; } = null!;
|
public Source Source { get; set; } = null!;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,26 +1,48 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.ComponentModel.DataAnnotations.Schema;
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Pf2eModel.Model.Enum;
|
using Pf2eModel.Model.Enum;
|
||||||
|
|
||||||
namespace Pf2eModel.Model.Base.Source;
|
namespace Pf2eModel.Model.Base.Source;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Источник сущности.
|
||||||
|
/// </summary>
|
||||||
public class Source
|
public class Source
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Идентификатор источника.
|
||||||
|
/// </summary>
|
||||||
[Key]
|
[Key]
|
||||||
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
||||||
[Column(Order = 1)]
|
[Column(Order = 1)]
|
||||||
|
[Comment("Идентификатор")]
|
||||||
public int Id { get; set; }
|
public int Id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Отображаемое имя источника.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 2)]
|
[Column(Order = 2)]
|
||||||
[MaxLength(Pf2eDbContext.NameLength)]
|
[MaxLength(Pf2eDbContext.NameLength)]
|
||||||
|
[Comment("Отображаемое имя")]
|
||||||
public string Name { get; set; } = null!;
|
public string Name { get; set; } = null!;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Категория источника.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 3)]
|
[Column(Order = 3)]
|
||||||
|
[Comment("Категория источника")]
|
||||||
public SourceCategory Category { get; set; }
|
public SourceCategory Category { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Дата выхода источника.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 4)]
|
[Column(Order = 4)]
|
||||||
|
[Comment("Дата выхода источника")]
|
||||||
public DateOnly? ReleaseDate { get; set; }
|
public DateOnly? ReleaseDate { get; set; }
|
||||||
|
|
||||||
[Newtonsoft.Json.JsonIgnore]
|
/// <summary>
|
||||||
|
/// Связанные сущности.
|
||||||
|
/// </summary>
|
||||||
public ICollection<EntitySource> EntitySources { get; set; } = [];
|
public ICollection<EntitySource> EntitySources { get; set; } = [];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,13 +4,24 @@ using Microsoft.EntityFrameworkCore;
|
|||||||
|
|
||||||
namespace Pf2eModel.Model.Base.Targets;
|
namespace Pf2eModel.Model.Base.Targets;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Внешняя ссылка сущности.
|
||||||
|
/// </summary>
|
||||||
[PrimaryKey(nameof(EntityId), nameof(TargetId))]
|
[PrimaryKey(nameof(EntityId), nameof(TargetId))]
|
||||||
public class EntityExternal
|
public class EntityExternal
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Идентификатор сущности.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 1)]
|
[Column(Order = 1)]
|
||||||
|
[Comment("Идентификатор сущности")]
|
||||||
public int EntityId { get; set; }
|
public int EntityId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Идентификатор цели.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 2)]
|
[Column(Order = 2)]
|
||||||
|
[Comment("Идентификатор цели")]
|
||||||
public int TargetId { get; set; }
|
public int TargetId { get; set; }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -19,18 +30,30 @@ public class EntityExternal
|
|||||||
public string ExternalId { get; set; } = "";
|
public string ExternalId { get; set; } = "";
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Конечная часть URL внешней ссылки.
|
||||||
|
/// Для источников Foundry - полный UUID объекта.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 4)]
|
[Column(Order = 4)]
|
||||||
[MaxLength(255)]
|
[MaxLength(255)]
|
||||||
[Comment("Часть URL до объекта. Для источников Foundry - полный UUID объекта")]
|
[Comment("Часть URL до объекта. Для источников Foundry - полный UUID объекта")]
|
||||||
public string Suffix { get; set; } = "";
|
public string Suffix { get; set; } = "";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Контрольная сумма объекта.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 5)]
|
[Column(Order = 5)]
|
||||||
[MaxLength(32)]
|
[MaxLength(32)]
|
||||||
[Comment("Контроль версии объекта")]
|
[Comment("Контрольная сумма объекта")]
|
||||||
public string Md5 { get; set; } = null!;
|
public string Md5 { get; set; } = null!;
|
||||||
|
|
||||||
[Newtonsoft.Json.JsonIgnore]
|
/// <summary>
|
||||||
public virtual Entity Entity { get; set; } = null!;
|
/// Сущность, которая ссылается на внешнюю ссылку.
|
||||||
|
/// </summary>
|
||||||
|
public Entity Entity { get; set; } = null!;
|
||||||
|
|
||||||
public virtual ExternalTarget Target { get; set; } = null!;
|
/// <summary>
|
||||||
|
/// Цель внешней ссылки.
|
||||||
|
/// </summary>
|
||||||
|
public ExternalTarget Target { get; set; } = null!;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,28 +1,49 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.ComponentModel.DataAnnotations.Schema;
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
|
||||||
namespace Pf2eModel.Model.Base.Targets;
|
namespace Pf2eModel.Model.Base.Targets;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Цель внешней ссылки.
|
||||||
|
/// </summary>
|
||||||
public class ExternalTarget
|
public class ExternalTarget
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Идентификатор цели.
|
||||||
|
/// </summary>
|
||||||
[Key]
|
[Key]
|
||||||
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
||||||
[Column(Order = 1)]
|
[Column(Order = 1)]
|
||||||
|
[Comment("Идентификатор")]
|
||||||
public int Id { get; set; }
|
public int Id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Название цели.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 2)]
|
[Column(Order = 2)]
|
||||||
[StringLength(Pf2eDbContext.NameLength)]
|
[StringLength(Pf2eDbContext.NameLength)]
|
||||||
|
[Comment("Отображаемое имя")]
|
||||||
public string Name { get; set; } = null!;
|
public string Name { get; set; } = null!;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Иконка цели.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 3)]
|
[Column(Order = 3)]
|
||||||
[StringLength(255)]
|
[StringLength(255)]
|
||||||
|
[Comment("Иконка цели")]
|
||||||
public string Icon { get; set; } = null!;
|
public string Icon { get; set; } = null!;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Префикс для URL-адреса внешней ссылки.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 3)]
|
[Column(Order = 3)]
|
||||||
[StringLength(Pf2eDbContext.NameLength)]
|
[StringLength(Pf2eDbContext.NameLength)]
|
||||||
|
[Comment("Префикс для URL-адреса внешней ссылки")]
|
||||||
public string Prefix { get; set; } = null!;
|
public string Prefix { get; set; } = null!;
|
||||||
|
|
||||||
[Column(Order = 4)]
|
/// <summary>
|
||||||
[Newtonsoft.Json.JsonIgnore]
|
/// Коллекция сущностей, которые ссылаются на эту цель.
|
||||||
|
/// </summary>
|
||||||
public ICollection<EntityExternal> EntityExternals { get; set; } = [];
|
public ICollection<EntityExternal> EntityExternals { get; set; } = [];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,21 +1,41 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.ComponentModel.DataAnnotations.Schema;
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
|
||||||
namespace Pf2eModel.Model.Common;
|
namespace Pf2eModel.Model.Common;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Частота использования.
|
||||||
|
/// </summary>
|
||||||
public class Frequency
|
public class Frequency
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Идентификатор.
|
||||||
|
/// </summary>
|
||||||
[Key]
|
[Key]
|
||||||
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
||||||
[Column(Order = 1)]
|
[Column(Order = 1)]
|
||||||
|
[Comment("Идентификатор")]
|
||||||
public int Id { get; set; }
|
public int Id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Максимальная продолжительсность.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 2)]
|
[Column(Order = 2)]
|
||||||
|
[Comment("Максимальная продолжительсность")]
|
||||||
public int Max { get; set; }
|
public int Max { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Частота использования.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 3)]
|
[Column(Order = 3)]
|
||||||
|
[Comment("Частота использования")]
|
||||||
public int Per { get; set; }
|
public int Per { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Значение использования.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 4)]
|
[Column(Order = 4)]
|
||||||
|
[Comment("Значение использования")]
|
||||||
public int? Value { get; set; }
|
public int? Value { get; set; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,8 +3,16 @@ using System.Reflection;
|
|||||||
|
|
||||||
namespace Pf2eModel.Model.Common.I18n;
|
namespace Pf2eModel.Model.Common.I18n;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Расширения для работы с локализацией.
|
||||||
|
/// </summary>
|
||||||
public static class LocaleExtension
|
public static class LocaleExtension
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Получение строкового представления типа локализации.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="localeType">Тип локализации.</param>
|
||||||
|
/// <returns>Строковое представление типа локализации.</returns>
|
||||||
public static string GetTypeString(this LocaleType localeType)
|
public static string GetTypeString(this LocaleType localeType)
|
||||||
{
|
{
|
||||||
FieldInfo fi = localeType.GetType().GetField(localeType.ToString())!;
|
FieldInfo fi = localeType.GetType().GetField(localeType.ToString())!;
|
||||||
@@ -16,7 +24,13 @@ public static class LocaleExtension
|
|||||||
?? localeType.ToString();
|
?? localeType.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static LocaleType GetTypeByString(this string localeType)
|
/// <summary>
|
||||||
|
/// Получение типа локализации по строковому представлению типа локализации.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="localeTypeString">Строковое представление типа локализации.</param>
|
||||||
|
/// <returns>Тип локализации.</returns>
|
||||||
|
/// <exception cref="InvalidEnumArgumentException">Исключение, если строковое представление не соответсвует ни одному типу локализации.</exception>
|
||||||
|
public static LocaleType GetTypeByString(this string localeTypeString)
|
||||||
{
|
{
|
||||||
foreach (FieldInfo field in typeof(LocaleType).GetFields())
|
foreach (FieldInfo field in typeof(LocaleType).GetFields())
|
||||||
{
|
{
|
||||||
@@ -28,7 +42,7 @@ public static class LocaleExtension
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (descriptionAttribute.Description == localeType)
|
if (descriptionAttribute.Description == localeTypeString)
|
||||||
{
|
{
|
||||||
return (LocaleType)field.GetValue(null)!;
|
return (LocaleType)field.GetValue(null)!;
|
||||||
}
|
}
|
||||||
@@ -36,6 +50,7 @@ public static class LocaleExtension
|
|||||||
|
|
||||||
throw new InvalidEnumArgumentException();
|
throw new InvalidEnumArgumentException();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
public static IQueryable<T> WhereLocale(
|
public static IQueryable<T> WhereLocale(
|
||||||
this IQueryable<T> query, Expression<Func<T, LocaleString>> expression, string searchTerm) where T : class
|
this IQueryable<T> query, Expression<Func<T, LocaleString>> expression, string searchTerm) where T : class
|
||||||
|
|||||||
@@ -1,11 +1,26 @@
|
|||||||
namespace Pf2eModel.Model.Common.I18n;
|
namespace Pf2eModel.Model.Common.I18n;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Элемент локализации.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="type">Тип локализации.</param>
|
||||||
|
/// <param name="value">Значение локализации.</param>
|
||||||
public class LocaleItem(LocaleType type, string value)
|
public class LocaleItem(LocaleType type, string value)
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Тип локализации.
|
||||||
|
/// </summary>
|
||||||
public LocaleType Locale { get; set; } = type;
|
public LocaleType Locale { get; set; } = type;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Значение локализации.
|
||||||
|
/// </summary>
|
||||||
public string Value { get; set; } = value;
|
public string Value { get; set; } = value;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Конструктор класса <see cref="LocaleItem"/> по паре ключ-значение.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="item">Пара ключ-значение по строковому представлению типа.</param>
|
||||||
public LocaleItem(KeyValuePair<string, string> item)
|
public LocaleItem(KeyValuePair<string, string> item)
|
||||||
: this(LocaleExtension.GetTypeByString(item.Key), item.Value) { }
|
: this(item.Key.GetTypeByString(), item.Value) { }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,40 +3,90 @@ using Newtonsoft.Json.Linq;
|
|||||||
|
|
||||||
namespace Pf2eModel.Model.Common.I18n;
|
namespace Pf2eModel.Model.Common.I18n;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Локализованная строка.
|
||||||
|
/// </summary>
|
||||||
public class LocaleString : ICollection<LocaleItem>
|
public class LocaleString : ICollection<LocaleItem>
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Список локализаций строк.
|
||||||
|
/// </summary>
|
||||||
private readonly List<LocaleItem> _items = [];
|
private readonly List<LocaleItem> _items = [];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Проверяет наличие хотя бы одной локализации.
|
||||||
|
/// </summary>
|
||||||
private void AssureDefault()
|
private void AssureDefault()
|
||||||
{
|
{
|
||||||
if (_items.Count == 0)
|
if (_items.Count == 0)
|
||||||
{
|
{
|
||||||
_items.Add(new LocaleItem(LocaleType.English, string.Empty));
|
_items.Add(new(LocaleType.English, string.Empty));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Количество локализаций.
|
||||||
|
/// </summary>
|
||||||
public int Count => _items.Count;
|
public int Count => _items.Count;
|
||||||
|
|
||||||
public bool IsReadOnly => false;
|
/// <summary>
|
||||||
|
/// Коллекция реализованных типов локализаций.
|
||||||
|
/// </summary>
|
||||||
public ICollection<LocaleType> Types => _items.Select(c => c.Locale).ToList();
|
public ICollection<LocaleType> Types => _items.Select(c => c.Locale).ToList();
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public bool IsReadOnly => false;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Конструктор класса <see cref="LocaleString"/>.
|
||||||
|
/// </summary>
|
||||||
public LocaleString()
|
public LocaleString()
|
||||||
{
|
{
|
||||||
AssureDefault();
|
AssureDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
private LocaleType _E(string localeString) => LocaleExtension.GetTypeByString(localeString);
|
/// <summary>
|
||||||
|
/// Получение типа локализации по строковому представлению.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="localeString">Строковое представление.</param>
|
||||||
|
/// <returns>Тип локализации.</returns>
|
||||||
|
private LocaleType _E(string localeString) => localeString.GetTypeByString();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получение типа локализации с учётом её наличия в коллекции.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="locale">Искомый тип локализации.</param>
|
||||||
|
/// <returns>Реальный тип локализации.</returns>
|
||||||
private LocaleType RealLocale(LocaleType locale) =>
|
private LocaleType RealLocale(LocaleType locale) =>
|
||||||
Contains(locale) ? locale : LocaleType.English;
|
Contains(locale) ? locale : LocaleType.English;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получение типа локализации по строковому представлению с учётом её наличия в коллекции.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="localeString">Строковое представление искомого типа локализации.</param>
|
||||||
|
/// <returns>Реальный тип локализации.</returns>
|
||||||
private LocaleType RealLocale(string localeString) => RealLocale(_E(localeString));
|
private LocaleType RealLocale(string localeString) => RealLocale(_E(localeString));
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получение объекта локализованной строки по типу локализации.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="locale">Искомый тип локализации.</param>
|
||||||
|
/// <returns>Объект локализованной строки.</returns>
|
||||||
public LocaleItem GetItem(LocaleType locale) => this.First(c => c.Locale == RealLocale(locale));
|
public LocaleItem GetItem(LocaleType locale) => this.First(c => c.Locale == RealLocale(locale));
|
||||||
|
|
||||||
public LocaleItem GetItem(string locale) => this.First(c => c.Locale == RealLocale(locale));
|
/// <summary>
|
||||||
|
/// Получение объекта локализованной строки по строковому представлению типа локализации.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="localeString">Строковое представление искомого типа локализации.</param>
|
||||||
|
/// <returns>Объект локализованной строки.</returns>
|
||||||
|
public LocaleItem GetItem(string localeString) =>
|
||||||
|
this.First(c => c.Locale == RealLocale(localeString));
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получение локализованной строки по типу локализации.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="locale">Искомый тип локализации.</param>
|
||||||
|
/// <returns>Локализованная строка.</returns>
|
||||||
public string this[LocaleType locale]
|
public string this[LocaleType locale]
|
||||||
{
|
{
|
||||||
get => GetItem(locale).Value;
|
get => GetItem(locale).Value;
|
||||||
@@ -48,52 +98,87 @@ public class LocaleString : ICollection<LocaleItem>
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_items.Add(new LocaleItem(locale, value));
|
_items.Add(new(locale, value));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получение локализованной строки по типу локализации.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="localeString">Строковое представление искомого типа локализации.</param>
|
||||||
|
/// <returns>Локализованная строка.</returns>
|
||||||
public string this[string localeString]
|
public string this[string localeString]
|
||||||
{
|
{
|
||||||
get => this[_E(localeString)];
|
get => this[_E(localeString)];
|
||||||
set => this[_E(localeString)] = value;
|
set => this[_E(localeString)] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Добавление объекта локализованной строки в коллекцию.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="item">Объект локализированной строки.</param>
|
||||||
public void Add(LocaleItem item)
|
public void Add(LocaleItem item)
|
||||||
{
|
{
|
||||||
this[item.Locale] = item.Value;
|
this[item.Locale] = item.Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Добавление локализованной строки в коллекцию.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="locale">Тип локализации.</param>
|
||||||
|
/// <param name="value">Строка локазации.</param>
|
||||||
public void Add(LocaleType locale, string value)
|
public void Add(LocaleType locale, string value)
|
||||||
{
|
{
|
||||||
this[locale] = value;
|
this[locale] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Отчистка коллекции локализованных строк.
|
||||||
|
/// </summary>
|
||||||
public void Clear()
|
public void Clear()
|
||||||
{
|
{
|
||||||
_items.Clear();
|
_items.Clear();
|
||||||
AssureDefault();
|
AssureDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Проверка наличия объекта локализованной строки в коллекции.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="item">Объект локализированной строки.</param>
|
||||||
|
/// <returns>`true`, если объект есть; `false`, если нет.</returns>
|
||||||
public bool Contains(LocaleItem item)
|
public bool Contains(LocaleItem item)
|
||||||
{
|
{
|
||||||
return _items.Contains(item);
|
return _items.Contains(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Проверка наличия локализованной строки в коллекции по типу локализации.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="locale">Тип локализации.</param>
|
||||||
|
/// <returns>`true`, если искомый тип локализации есть; `false`, если нет.</returns>
|
||||||
public bool Contains(LocaleType locale)
|
public bool Contains(LocaleType locale)
|
||||||
{
|
{
|
||||||
return Types.Contains(locale);
|
return Types.Contains(locale);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Contains(string value)
|
/// <summary>
|
||||||
|
/// Проверка наличия локализованной строки в коллекции по строковому представлению типа локализации.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="localeString">Строковое представление искомого типа локализации.</param>
|
||||||
|
/// <returns>`true`, если искомый тип локализации есть; `false`, если нет.</returns>
|
||||||
|
public bool Contains(string localeString)
|
||||||
{
|
{
|
||||||
return this.Any(item => item.Value == value);
|
return this.Any(item => item.Value == localeString);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public void CopyTo(LocaleItem[] array, int arrayIndex)
|
public void CopyTo(LocaleItem[] array, int arrayIndex)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public bool Remove(LocaleItem item)
|
public bool Remove(LocaleItem item)
|
||||||
{
|
{
|
||||||
bool result = _items.Remove(item);
|
bool result = _items.Remove(item);
|
||||||
@@ -107,21 +192,28 @@ public class LocaleString : ICollection<LocaleItem>
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public IEnumerator<LocaleItem> GetEnumerator()
|
public IEnumerator<LocaleItem> GetEnumerator()
|
||||||
{
|
{
|
||||||
return _items.GetEnumerator();
|
return _items.GetEnumerator();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
IEnumerator IEnumerable.GetEnumerator()
|
IEnumerator IEnumerable.GetEnumerator()
|
||||||
{
|
{
|
||||||
return GetEnumerator();
|
return GetEnumerator();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
{
|
{
|
||||||
return this[LocaleType.English];
|
return this[LocaleType.English];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Сериализация локализованной строки в JSON-формат.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Строковое представление JSON-представления.</returns>
|
||||||
public string Serialize()
|
public string Serialize()
|
||||||
{
|
{
|
||||||
JObject json = [];
|
JObject json = [];
|
||||||
@@ -134,10 +226,15 @@ public class LocaleString : ICollection<LocaleItem>
|
|||||||
return json.ToString();
|
return json.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Десериализация локализованной строки из JSON-формата.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="input">Строковое представление JSON-представления.</param>
|
||||||
|
/// <returns>Объект локализованной строки.</returns>
|
||||||
public static LocaleString Deserialize(string input)
|
public static LocaleString Deserialize(string input)
|
||||||
{
|
{
|
||||||
JObject json = JObject.Parse(input);
|
JObject json = JObject.Parse(input);
|
||||||
LocaleString result = new();
|
LocaleString result = [];
|
||||||
|
|
||||||
foreach (KeyValuePair<string, JToken?> item in json)
|
foreach (KeyValuePair<string, JToken?> item in json)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
namespace Pf2eModel.Model.Common.I18n;
|
namespace Pf2eModel.Model.Common.I18n;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Тип локализации.
|
||||||
|
/// </summary>
|
||||||
public enum LocaleType
|
public enum LocaleType
|
||||||
{
|
{
|
||||||
[Description("en")]
|
[Description("en")]
|
||||||
|
|||||||
@@ -1,20 +1,36 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.ComponentModel.DataAnnotations.Schema;
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Pf2eModel.Model.Common.I18n;
|
using Pf2eModel.Model.Common.I18n;
|
||||||
using Pf2eModel.Model.Enum;
|
using Pf2eModel.Model.Enum;
|
||||||
|
|
||||||
namespace Pf2eModel.Model.Common;
|
namespace Pf2eModel.Model.Common;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Изучаемая способность.
|
||||||
|
/// </summary>
|
||||||
public class Training
|
public class Training
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Идентификатор.
|
||||||
|
/// </summary>
|
||||||
[Key]
|
[Key]
|
||||||
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
||||||
[Column(Order = 1)]
|
[Column(Order = 1)]
|
||||||
|
[Comment("Идентификатор")]
|
||||||
public int Id { get; set; }
|
public int Id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Название способности.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 2)]
|
[Column(Order = 2)]
|
||||||
|
[Comment("Название способности")]
|
||||||
public LocaleString Name { get; set; } = [];
|
public LocaleString Name { get; set; } = [];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Тип способности.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 3)]
|
[Column(Order = 3)]
|
||||||
|
[Comment("Тип способности")]
|
||||||
public TrainingType Type { get; set; }
|
public TrainingType Type { get; set; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,10 +2,20 @@
|
|||||||
|
|
||||||
namespace Pf2eModel.Model.Enum;
|
namespace Pf2eModel.Model.Enum;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Тип действия.
|
||||||
|
/// </summary>
|
||||||
public enum ActionCategory
|
public enum ActionCategory
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Неизвестный тип действия.
|
||||||
|
/// </summary>
|
||||||
|
[PgName("unknown")]
|
||||||
Unknown,
|
Unknown,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Действие архетипа.
|
||||||
|
/// </summary>
|
||||||
[PgName("archetype")]
|
[PgName("archetype")]
|
||||||
Archetype,
|
Archetype,
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
namespace Pf2eModel.Model.Enum;
|
namespace Pf2eModel.Model.Enum;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Перечиленение количества действий.
|
||||||
|
/// </summary>
|
||||||
public enum ActionEnum
|
public enum ActionEnum
|
||||||
{
|
{
|
||||||
[PgName("unknown")]
|
[PgName("unknown")]
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
using NpgsqlTypes;
|
|
||||||
|
|
||||||
namespace Pf2eModel.Model.Enum;
|
|
||||||
|
|
||||||
public enum AncestryVision
|
|
||||||
{
|
|
||||||
[PgName("normal")]
|
|
||||||
Normal,
|
|
||||||
|
|
||||||
[PgName("low-light-vision")]
|
|
||||||
LowLightVision,
|
|
||||||
|
|
||||||
[PgName("dark-vision")]
|
|
||||||
DarkVision,
|
|
||||||
}
|
|
||||||
@@ -2,26 +2,50 @@
|
|||||||
|
|
||||||
namespace Pf2eModel.Model.Enum;
|
namespace Pf2eModel.Model.Enum;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Перечисление значений атрибутов.
|
||||||
|
/// </summary>
|
||||||
public enum AttributeValues
|
public enum AttributeValues
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Свободный атрибут.
|
||||||
|
/// </summary>
|
||||||
[PgName("free")]
|
[PgName("free")]
|
||||||
Free,
|
Free,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Сила.
|
||||||
|
/// </summary>
|
||||||
[PgName("str")]
|
[PgName("str")]
|
||||||
Strength,
|
Strength,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Ловкость.
|
||||||
|
/// </summary>
|
||||||
[PgName("dex")]
|
[PgName("dex")]
|
||||||
Dexterity,
|
Dexterity,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Телосложение.
|
||||||
|
/// </summary>
|
||||||
[PgName("con")]
|
[PgName("con")]
|
||||||
Constitution,
|
Constitution,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Интеллект.
|
||||||
|
/// </summary>
|
||||||
[PgName("int")]
|
[PgName("int")]
|
||||||
Intelligence,
|
Intelligence,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Мудрость.
|
||||||
|
/// </summary>
|
||||||
[PgName("wis")]
|
[PgName("wis")]
|
||||||
Wisdom,
|
Wisdom,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Харизма.
|
||||||
|
/// </summary>
|
||||||
[PgName("cha")]
|
[PgName("cha")]
|
||||||
Charisma,
|
Charisma,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,23 +2,50 @@
|
|||||||
|
|
||||||
namespace Pf2eModel.Model.Enum;
|
namespace Pf2eModel.Model.Enum;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Тип элемента прогрессии класса.
|
||||||
|
/// </summary>
|
||||||
public enum ClassProgressionType
|
public enum ClassProgressionType
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Неизвестный тип прогрессии класса.
|
||||||
|
/// </summary>
|
||||||
[PgName("entity")]
|
[PgName("entity")]
|
||||||
Entity,
|
Entity,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Навык архетипа.
|
||||||
|
/// </summary>
|
||||||
[PgName("ancestry_feat")]
|
[PgName("ancestry_feat")]
|
||||||
AncestryFeat,
|
AncestryFeat,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Классовая особенность.
|
||||||
|
/// </summary>
|
||||||
[PgName("class_feat")]
|
[PgName("class_feat")]
|
||||||
ClassFeat,
|
ClassFeat,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Общий навык.
|
||||||
|
/// </summary>
|
||||||
[PgName("general_feat")]
|
[PgName("general_feat")]
|
||||||
GeneralFeat,
|
GeneralFeat,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Навык
|
||||||
|
/// </summary>
|
||||||
[PgName("skill_feat")]
|
[PgName("skill_feat")]
|
||||||
SkillFeat,
|
SkillFeat,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Увеличение навыка.
|
||||||
|
/// </summary>
|
||||||
[PgName("skill_increase")]
|
[PgName("skill_increase")]
|
||||||
SkillIncrease,
|
SkillIncrease,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Увеличение атрибута.
|
||||||
|
/// </summary>
|
||||||
|
[PgName("attribute_increase")]
|
||||||
|
AttributeIncrease,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,23 +2,44 @@
|
|||||||
|
|
||||||
namespace Pf2eModel.Model.Enum;
|
namespace Pf2eModel.Model.Enum;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Тип состояния
|
||||||
|
/// </summary>
|
||||||
public enum ConditionGroup
|
public enum ConditionGroup
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Неизвестое состояние.
|
||||||
|
/// </summary>
|
||||||
[PgName("unknown")]
|
[PgName("unknown")]
|
||||||
Unknown,
|
Unknown,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Чувство.
|
||||||
|
/// </summary>
|
||||||
[PgName("senses")]
|
[PgName("senses")]
|
||||||
Senses,
|
Senses,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Способность.
|
||||||
|
/// </summary>
|
||||||
[PgName("abilities")]
|
[PgName("abilities")]
|
||||||
Abilities,
|
Abilities,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Смерть.
|
||||||
|
/// </summary>
|
||||||
[PgName("death")]
|
[PgName("death")]
|
||||||
Death,
|
Death,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Отношение. (???)
|
||||||
|
/// </summary>
|
||||||
[PgName("attitudes")]
|
[PgName("attitudes")]
|
||||||
Attitudes,
|
Attitudes,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Обнаружение.
|
||||||
|
/// </summary>
|
||||||
[PgName("detection")]
|
[PgName("detection")]
|
||||||
Detection,
|
Detection,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,17 +2,32 @@
|
|||||||
|
|
||||||
namespace Pf2eModel.Model.Enum;
|
namespace Pf2eModel.Model.Enum;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Тип божества.
|
||||||
|
/// </summary>
|
||||||
public enum DeityCategory
|
public enum DeityCategory
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Божество.
|
||||||
|
/// </summary>
|
||||||
[PgName("deity")]
|
[PgName("deity")]
|
||||||
Deity,
|
Deity,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Пантеон.
|
||||||
|
/// </summary>
|
||||||
[PgName("pantheon")]
|
[PgName("pantheon")]
|
||||||
Pantheon,
|
Pantheon,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Ковенант.
|
||||||
|
/// </summary>
|
||||||
[PgName("covenant")]
|
[PgName("covenant")]
|
||||||
Covenant,
|
Covenant,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Философия.
|
||||||
|
/// </summary>
|
||||||
[PgName("philosophy")]
|
[PgName("philosophy")]
|
||||||
Philosophy,
|
Philosophy,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,17 +2,32 @@
|
|||||||
|
|
||||||
namespace Pf2eModel.Model.Enum;
|
namespace Pf2eModel.Model.Enum;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Тип божественной силы.
|
||||||
|
/// </summary>
|
||||||
public enum DeityFonts
|
public enum DeityFonts
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Без божественной силы.
|
||||||
|
/// </summary>
|
||||||
[PgName("none")]
|
[PgName("none")]
|
||||||
None,
|
None,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Исцеление.
|
||||||
|
/// </summary>
|
||||||
[PgName("heal")]
|
[PgName("heal")]
|
||||||
Heal,
|
Heal,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Урон.
|
||||||
|
/// </summary>
|
||||||
[PgName("harm")]
|
[PgName("harm")]
|
||||||
Harm,
|
Harm,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Любой тип божественной силы.
|
||||||
|
/// </summary>
|
||||||
[PgName("any")]
|
[PgName("any")]
|
||||||
Any,
|
Any,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,14 +2,26 @@
|
|||||||
|
|
||||||
namespace Pf2eModel.Model.Enum;
|
namespace Pf2eModel.Model.Enum;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Тип освящения божества.
|
||||||
|
/// </summary>
|
||||||
public enum DeitySanctification
|
public enum DeitySanctification
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Святость.
|
||||||
|
/// </summary>
|
||||||
[PgName("holy")]
|
[PgName("holy")]
|
||||||
Holy,
|
Holy,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Нечестивость.
|
||||||
|
/// </summary>
|
||||||
[PgName("unholy")]
|
[PgName("unholy")]
|
||||||
Unholy,
|
Unholy,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Любое.
|
||||||
|
/// </summary>
|
||||||
[PgName("any")]
|
[PgName("any")]
|
||||||
Any,
|
Any,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,26 +2,50 @@
|
|||||||
|
|
||||||
namespace Pf2eModel.Model.Enum;
|
namespace Pf2eModel.Model.Enum;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Перечисление элементов.
|
||||||
|
/// </summary>
|
||||||
public enum ElementEnum
|
public enum ElementEnum
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Универсальный элемент.
|
||||||
|
/// </summary>
|
||||||
[PgName("universal")]
|
[PgName("universal")]
|
||||||
Universal,
|
Universal,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Воздух.
|
||||||
|
/// </summary>
|
||||||
[PgName("air")]
|
[PgName("air")]
|
||||||
Air,
|
Air,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Вода.
|
||||||
|
/// </summary>
|
||||||
[PgName("water")]
|
[PgName("water")]
|
||||||
Water,
|
Water,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Земля.
|
||||||
|
/// </summary>
|
||||||
[PgName("earth")]
|
[PgName("earth")]
|
||||||
Earth,
|
Earth,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Огонь.
|
||||||
|
/// </summary>
|
||||||
[PgName("fire")]
|
[PgName("fire")]
|
||||||
Fire,
|
Fire,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Дерево.
|
||||||
|
/// </summary>
|
||||||
[PgName("wood")]
|
[PgName("wood")]
|
||||||
Wood,
|
Wood,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Металл.
|
||||||
|
/// </summary>
|
||||||
[PgName("metal")]
|
[PgName("metal")]
|
||||||
Metal,
|
Metal,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,17 +2,32 @@
|
|||||||
|
|
||||||
namespace Pf2eModel.Model.Enum;
|
namespace Pf2eModel.Model.Enum;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Перечисление редкости сущности.
|
||||||
|
/// </summary>
|
||||||
public enum EntityRarity
|
public enum EntityRarity
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Обычная редкость.
|
||||||
|
/// </summary>
|
||||||
[PgName("common")]
|
[PgName("common")]
|
||||||
Common,
|
Common,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Необычная редкость.
|
||||||
|
/// </summary>
|
||||||
[PgName("uncommon")]
|
[PgName("uncommon")]
|
||||||
Uncommon,
|
Uncommon,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Редкая редкость.
|
||||||
|
/// </summary>
|
||||||
[PgName("rare")]
|
[PgName("rare")]
|
||||||
Rare,
|
Rare,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Уникальная редкость.
|
||||||
|
/// </summary>
|
||||||
[PgName("unique")]
|
[PgName("unique")]
|
||||||
Unique,
|
Unique,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,62 +2,122 @@
|
|||||||
|
|
||||||
namespace Pf2eModel.Model.Enum;
|
namespace Pf2eModel.Model.Enum;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Тип сущности.
|
||||||
|
/// </summary>
|
||||||
public enum EntityType
|
public enum EntityType
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Неизвестный тип сущности.
|
||||||
|
/// </summary>
|
||||||
[PgName("unknown")]
|
[PgName("unknown")]
|
||||||
Unknown,
|
Unknown,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Признак.
|
||||||
|
/// </summary>
|
||||||
[PgName("trait")]
|
[PgName("trait")]
|
||||||
Trait,
|
Trait,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Действие.
|
||||||
|
/// </summary>
|
||||||
[PgName("action")]
|
[PgName("action")]
|
||||||
Action,
|
Action,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Родословная.
|
||||||
|
/// </summary>
|
||||||
[PgName("ancestry")]
|
[PgName("ancestry")]
|
||||||
Ancestry,
|
Ancestry,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Архетип.
|
||||||
|
/// </summary>
|
||||||
[PgName("archetype")]
|
[PgName("archetype")]
|
||||||
Archetype,
|
Archetype,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Происхождение.
|
||||||
|
/// </summary>
|
||||||
[PgName("background")]
|
[PgName("background")]
|
||||||
Background,
|
Background,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Рюкзак.
|
||||||
|
/// </summary>
|
||||||
[PgName("backpack")]
|
[PgName("backpack")]
|
||||||
Backpack,
|
Backpack,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Способность кампании.
|
||||||
|
/// </summary>
|
||||||
[PgName("campaign_feature")]
|
[PgName("campaign_feature")]
|
||||||
CampaignFeature,
|
CampaignFeature,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Класс.
|
||||||
|
/// </summary>
|
||||||
[PgName("class")]
|
[PgName("class")]
|
||||||
Class,
|
Class,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Группа подклассов.
|
||||||
|
/// </summary>
|
||||||
[PgName("subclass_group")]
|
[PgName("subclass_group")]
|
||||||
SubclassGroup,
|
SubclassGroup,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Подкласс.
|
||||||
|
/// </summary>
|
||||||
[PgName("subclass")]
|
[PgName("subclass")]
|
||||||
Subclass,
|
Subclass,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Состояние.
|
||||||
|
/// </summary>
|
||||||
[PgName("condition")]
|
[PgName("condition")]
|
||||||
Condition,
|
Condition,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Божество.
|
||||||
|
/// </summary>
|
||||||
[PgName("deity")]
|
[PgName("deity")]
|
||||||
Deity,
|
Deity,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Навык.
|
||||||
|
/// </summary>
|
||||||
[PgName("feat")]
|
[PgName("feat")]
|
||||||
Feat,
|
Feat,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Наследие.
|
||||||
|
/// </summary>
|
||||||
[PgName("heritage")]
|
[PgName("heritage")]
|
||||||
Heritage,
|
Heritage,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Заклианиние.
|
||||||
|
/// </summary>
|
||||||
[PgName("spell")]
|
[PgName("spell")]
|
||||||
Spell,
|
Spell,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Ритуал.
|
||||||
|
/// </summary>
|
||||||
[PgName("ritual")]
|
[PgName("ritual")]
|
||||||
Ritual,
|
Ritual,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Язык.
|
||||||
|
/// </summary>
|
||||||
[PgName("language")]
|
[PgName("language")]
|
||||||
Language,
|
Language,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Правило.
|
||||||
|
/// </summary>
|
||||||
[PgName("rule")]
|
[PgName("rule")]
|
||||||
Rule,
|
Rule,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
using NpgsqlTypes;
|
|
||||||
|
|
||||||
namespace Pf2eModel.Model.Enum;
|
|
||||||
|
|
||||||
public enum FeatActionType
|
|
||||||
{
|
|
||||||
[PgName("passive")]
|
|
||||||
Passive,
|
|
||||||
|
|
||||||
[PgName("action")]
|
|
||||||
Action,
|
|
||||||
|
|
||||||
[PgName("reaction")]
|
|
||||||
Reaction,
|
|
||||||
|
|
||||||
[PgName("free")]
|
|
||||||
Free,
|
|
||||||
}
|
|
||||||
@@ -7,11 +7,14 @@ public enum FeatCategory
|
|||||||
[PgName("uncategorized")]
|
[PgName("uncategorized")]
|
||||||
Uncategorized,
|
Uncategorized,
|
||||||
|
|
||||||
|
[PgName("ancestry")]
|
||||||
|
Ancestry,
|
||||||
|
|
||||||
[PgName("ancestry-feature")]
|
[PgName("ancestry-feature")]
|
||||||
AncestryFeature,
|
AncestryFeature,
|
||||||
|
|
||||||
[PgName("class-feature")]
|
[PgName("archetype")]
|
||||||
ClassFeature,
|
Archetype,
|
||||||
|
|
||||||
[PgName("calling")]
|
[PgName("calling")]
|
||||||
Calling,
|
Calling,
|
||||||
@@ -19,15 +22,15 @@ public enum FeatCategory
|
|||||||
[PgName("class")]
|
[PgName("class")]
|
||||||
Class,
|
Class,
|
||||||
|
|
||||||
|
[PgName("class-feature")]
|
||||||
|
ClassFeature,
|
||||||
|
|
||||||
[PgName("skill")]
|
[PgName("skill")]
|
||||||
Skill,
|
Skill,
|
||||||
|
|
||||||
[PgName("general")]
|
[PgName("general")]
|
||||||
General,
|
General,
|
||||||
|
|
||||||
[PgName("ancestry")]
|
|
||||||
Ancestry,
|
|
||||||
|
|
||||||
[PgName("bonus")]
|
[PgName("bonus")]
|
||||||
Bonus,
|
Bonus,
|
||||||
|
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
using NpgsqlTypes;
|
|
||||||
|
|
||||||
namespace Pf2eModel.Model.Enum;
|
|
||||||
|
|
||||||
public enum Size
|
|
||||||
{
|
|
||||||
[PgName("tiny")]
|
|
||||||
Tiny,
|
|
||||||
|
|
||||||
[PgName("small")]
|
|
||||||
Small,
|
|
||||||
|
|
||||||
[PgName("medium")]
|
|
||||||
Medium,
|
|
||||||
|
|
||||||
[PgName("large")]
|
|
||||||
Large,
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
using NpgsqlTypes;
|
||||||
|
|
||||||
|
namespace Pf2eModel.Model.Enum;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Размер.
|
||||||
|
/// </summary>
|
||||||
|
public enum SizeEnum
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Крошечный размер.
|
||||||
|
/// </summary>
|
||||||
|
[PgName("tiny")]
|
||||||
|
Tiny,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Маленький размер.
|
||||||
|
/// </summary>
|
||||||
|
[PgName("small")]
|
||||||
|
Small,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Средний размер.
|
||||||
|
/// </summary>
|
||||||
|
[PgName("medium")]
|
||||||
|
Medium,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Большой размер.
|
||||||
|
/// </summary>
|
||||||
|
[PgName("large")]
|
||||||
|
Large,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Громадный размер.
|
||||||
|
/// </summary>
|
||||||
|
[PgName("huge")]
|
||||||
|
Huge,
|
||||||
|
}
|
||||||
@@ -2,26 +2,50 @@
|
|||||||
|
|
||||||
namespace Pf2eModel.Model.Enum;
|
namespace Pf2eModel.Model.Enum;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Перечисление категорий источников.
|
||||||
|
/// </summary>
|
||||||
public enum SourceCategory
|
public enum SourceCategory
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Неизвестная категория источника.
|
||||||
|
/// </summary>
|
||||||
[PgName("rulebook")]
|
[PgName("rulebook")]
|
||||||
Rulebooks,
|
Rulebooks,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Серия приключений.
|
||||||
|
/// </summary>
|
||||||
[PgName("adventure-path")]
|
[PgName("adventure-path")]
|
||||||
AdventurePaths,
|
AdventurePaths,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Lost Omens
|
||||||
|
/// </summary>
|
||||||
[PgName("lost-omens")]
|
[PgName("lost-omens")]
|
||||||
LostOmens,
|
LostOmens,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Приключение.
|
||||||
|
/// </summary>
|
||||||
[PgName("adventures")]
|
[PgName("adventures")]
|
||||||
Adventures,
|
Adventures,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Комиксы.
|
||||||
|
/// </summary>
|
||||||
[PgName("comics")]
|
[PgName("comics")]
|
||||||
Comics,
|
Comics,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Блог-посты.
|
||||||
|
/// </summary>
|
||||||
[PgName("blog-posts")]
|
[PgName("blog-posts")]
|
||||||
BlogPosts,
|
BlogPosts,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Сообщество.
|
||||||
|
/// </summary>
|
||||||
[PgName("society")]
|
[PgName("society")]
|
||||||
Society,
|
Society,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,38 +2,74 @@
|
|||||||
|
|
||||||
namespace Pf2eModel.Model.Enum;
|
namespace Pf2eModel.Model.Enum;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Тип области заклинания.
|
||||||
|
/// </summary>
|
||||||
public enum SpellAreaType
|
public enum SpellAreaType
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Взрыв.
|
||||||
|
/// </summary>
|
||||||
[PgName("burst")]
|
[PgName("burst")]
|
||||||
Burst,
|
Burst,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Эманация.
|
||||||
|
/// </summary>
|
||||||
[PgName("emanation")]
|
[PgName("emanation")]
|
||||||
Emanation,
|
Emanation,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Конус.
|
||||||
|
/// </summary>
|
||||||
[PgName("cone")]
|
[PgName("cone")]
|
||||||
Cone,
|
Cone,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Линия.
|
||||||
|
/// </summary>
|
||||||
[PgName("line")]
|
[PgName("line")]
|
||||||
Line,
|
Line,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Квадрат.
|
||||||
|
/// </summary>
|
||||||
[PgName("square")]
|
[PgName("square")]
|
||||||
Square,
|
Square,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Куб.
|
||||||
|
/// </summary>
|
||||||
[PgName("cube")]
|
[PgName("cube")]
|
||||||
Cube,
|
Cube,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Цилиндр.
|
||||||
|
/// </summary>
|
||||||
[PgName("cylinder")]
|
[PgName("cylinder")]
|
||||||
Cylinder,
|
Cylinder,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Варьируемое.
|
||||||
|
/// </summary>
|
||||||
[PgName("varies")]
|
[PgName("varies")]
|
||||||
Varies,
|
Varies,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Параллелипипед.
|
||||||
|
/// </summary>
|
||||||
[PgName("cuboid")]
|
[PgName("cuboid")]
|
||||||
Cuboid,
|
Cuboid,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Круг.
|
||||||
|
/// </summary>
|
||||||
[PgName("circle")]
|
[PgName("circle")]
|
||||||
Circle,
|
Circle,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Иное.
|
||||||
|
/// </summary>
|
||||||
[PgName("other")]
|
[PgName("other")]
|
||||||
Other,
|
Other,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,11 +2,26 @@
|
|||||||
|
|
||||||
namespace Pf2eModel.Model.Enum;
|
namespace Pf2eModel.Model.Enum;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Тип урона заклинания.
|
||||||
|
/// </summary>
|
||||||
public enum SpellDamageCategory
|
public enum SpellDamageCategory
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Обычный урон.
|
||||||
|
/// </summary>
|
||||||
|
[PgName("normal")]
|
||||||
|
Normal,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Продолжительный урон.
|
||||||
|
/// </summary>
|
||||||
[PgName("persistent")]
|
[PgName("persistent")]
|
||||||
Persistent,
|
Persistent,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Брызги.
|
||||||
|
/// </summary>
|
||||||
[PgName("splash")]
|
[PgName("splash")]
|
||||||
Splash,
|
Splash,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,14 +2,26 @@
|
|||||||
|
|
||||||
namespace Pf2eModel.Model.Enum;
|
namespace Pf2eModel.Model.Enum;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Тип урона заклинания.
|
||||||
|
/// </summary>
|
||||||
public enum SpellDamageKinds
|
public enum SpellDamageKinds
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Урон.
|
||||||
|
/// </summary>
|
||||||
[PgName("damage")]
|
[PgName("damage")]
|
||||||
Damage,
|
Damage,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Исцеление.
|
||||||
|
/// </summary>
|
||||||
[PgName("healing")]
|
[PgName("healing")]
|
||||||
Healing,
|
Healing,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Любое.
|
||||||
|
/// </summary>
|
||||||
[PgName("any")]
|
[PgName("any")]
|
||||||
Any,
|
Any,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,26 +2,50 @@
|
|||||||
|
|
||||||
namespace Pf2eModel.Model.Enum;
|
namespace Pf2eModel.Model.Enum;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Традиция заклинания.
|
||||||
|
/// </summary>
|
||||||
public enum SpellTradition
|
public enum SpellTradition
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Без традиции.
|
||||||
|
/// </summary>
|
||||||
[PgName("none")]
|
[PgName("none")]
|
||||||
None,
|
None,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Сакральная традиция.
|
||||||
|
/// </summary>
|
||||||
[PgName("divine")]
|
[PgName("divine")]
|
||||||
Divine,
|
Divine,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Оккультная традиция.
|
||||||
|
/// </summary>
|
||||||
[PgName("occult")]
|
[PgName("occult")]
|
||||||
Occult,
|
Occult,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Арканная традиция.
|
||||||
|
/// </summary>
|
||||||
[PgName("arcane")]
|
[PgName("arcane")]
|
||||||
Arcane,
|
Arcane,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Примальная традиция.
|
||||||
|
/// </summary>
|
||||||
[PgName("primal")]
|
[PgName("primal")]
|
||||||
Primal,
|
Primal,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Элементная традиция.
|
||||||
|
/// </summary>
|
||||||
[PgName("elemental")]
|
[PgName("elemental")]
|
||||||
Elemental,
|
Elemental,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Все традиции.
|
||||||
|
/// </summary>
|
||||||
[PgName("all")]
|
[PgName("all")]
|
||||||
All,
|
All,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,23 +2,44 @@
|
|||||||
|
|
||||||
namespace Pf2eModel.Model.Enum;
|
namespace Pf2eModel.Model.Enum;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Ранг тренировки.
|
||||||
|
/// </summary>
|
||||||
public enum TrainingRank
|
public enum TrainingRank
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Необученный.
|
||||||
|
/// </summary>
|
||||||
[PgName("untrained")]
|
[PgName("untrained")]
|
||||||
Untrained,
|
Untrained,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Обученный.
|
||||||
|
/// </summary>
|
||||||
[PgName("trained")]
|
[PgName("trained")]
|
||||||
Trained,
|
Trained,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Эксперт.
|
||||||
|
/// </summary>
|
||||||
[PgName("expert")]
|
[PgName("expert")]
|
||||||
Expert,
|
Expert,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Мастер.
|
||||||
|
/// </summary>
|
||||||
[PgName("master")]
|
[PgName("master")]
|
||||||
Master,
|
Master,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Легендарный.
|
||||||
|
/// </summary>
|
||||||
[PgName("legendary")]
|
[PgName("legendary")]
|
||||||
Legendary,
|
Legendary,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Мифический.
|
||||||
|
/// </summary>
|
||||||
[PgName("mythic")]
|
[PgName("mythic")]
|
||||||
Mythic,
|
Mythic,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,23 +2,44 @@
|
|||||||
|
|
||||||
namespace Pf2eModel.Model.Enum;
|
namespace Pf2eModel.Model.Enum;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Тип тренировки.
|
||||||
|
/// </summary>
|
||||||
public enum TrainingType
|
public enum TrainingType
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Восприятие.
|
||||||
|
/// </summary>
|
||||||
[PgName("perception")]
|
[PgName("perception")]
|
||||||
Perception,
|
Perception,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Навык.
|
||||||
|
/// </summary>
|
||||||
[PgName("skill")]
|
[PgName("skill")]
|
||||||
Skill,
|
Skill,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Знание.
|
||||||
|
/// </summary>
|
||||||
[PgName("lore")]
|
[PgName("lore")]
|
||||||
Lore,
|
Lore,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Оружие.
|
||||||
|
/// </summary>
|
||||||
[PgName("weapon")]
|
[PgName("weapon")]
|
||||||
Weapon,
|
Weapon,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Защита.
|
||||||
|
/// </summary>
|
||||||
[PgName("armor")]
|
[PgName("armor")]
|
||||||
Armor,
|
Armor,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Спасбросок.
|
||||||
|
/// </summary>
|
||||||
[PgName("save")]
|
[PgName("save")]
|
||||||
Save,
|
Save,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,14 +2,26 @@
|
|||||||
|
|
||||||
namespace Pf2eModel.Model.Enum;
|
namespace Pf2eModel.Model.Enum;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Тип признака.
|
||||||
|
/// </summary>
|
||||||
public enum TraitType
|
public enum TraitType
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Обычный признак.
|
||||||
|
/// </summary>
|
||||||
[PgName("regular")]
|
[PgName("regular")]
|
||||||
Regular,
|
Regular,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Признак класса.
|
||||||
|
/// </summary>
|
||||||
[PgName("class")]
|
[PgName("class")]
|
||||||
Class,
|
Class,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Признак традиции.
|
||||||
|
/// </summary>
|
||||||
[PgName("tradition")]
|
[PgName("tradition")]
|
||||||
Tradition,
|
Tradition,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,27 @@
|
|||||||
|
using NpgsqlTypes;
|
||||||
|
|
||||||
|
namespace Pf2eModel.Model.Enum;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Перечисление типов зрения.
|
||||||
|
/// </summary>
|
||||||
|
public enum VisionEnum
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Обычное зрение.
|
||||||
|
/// </summary>
|
||||||
|
[PgName("normal")]
|
||||||
|
Normal,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Зрение в темноте.
|
||||||
|
/// </summary>
|
||||||
|
[PgName("low-light-vision")]
|
||||||
|
LowLightVision,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Тёмное зрение.
|
||||||
|
/// </summary>
|
||||||
|
[PgName("dark-vision")]
|
||||||
|
DarkVision,
|
||||||
|
}
|
||||||
@@ -3,10 +3,19 @@ using Pf2eModel.Model.Base;
|
|||||||
|
|
||||||
namespace Pf2eModel.Model;
|
namespace Pf2eModel.Model;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Интерфейс сущностей структуры.
|
||||||
|
/// </summary>
|
||||||
public interface IEntity
|
public interface IEntity
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Идентификатор сущности.
|
||||||
|
/// </summary>
|
||||||
public int Id { get; set; }
|
public int Id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Корневая сущность.
|
||||||
|
/// </summary>
|
||||||
[JsonIgnore]
|
[JsonIgnore]
|
||||||
public Entity Entity { get; set; }
|
public Entity Entity { get; set; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,23 +1,38 @@
|
|||||||
using System.ComponentModel.DataAnnotations.Schema;
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Pf2eModel.Model.Base;
|
using Pf2eModel.Model.Base;
|
||||||
using Pf2eModel.Model.Enum;
|
using Pf2eModel.Model.Enum;
|
||||||
|
|
||||||
namespace Pf2eModel.Model.Structure;
|
namespace Pf2eModel.Model.Structure;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Действие.
|
||||||
|
/// </summary>
|
||||||
[EntityOfType(EntityType.Action)]
|
[EntityOfType(EntityType.Action)]
|
||||||
public class Action : IEntity
|
public class Action : IEntity
|
||||||
{
|
{
|
||||||
[System.ComponentModel.DataAnnotations.Key]
|
/// <inheritdoc/>
|
||||||
|
[Key]
|
||||||
[DatabaseGenerated(DatabaseGeneratedOption.None)]
|
[DatabaseGenerated(DatabaseGeneratedOption.None)]
|
||||||
[Column(Order = 1)]
|
[Column(Order = 1)]
|
||||||
|
[Comment("Идентификатор")]
|
||||||
public int Id { get; set; }
|
public int Id { get; set; }
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public Entity Entity { get; set; } = null!;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Количество действий.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 2)]
|
[Column(Order = 2)]
|
||||||
|
[Comment("Количество действий")]
|
||||||
public ActionEnum Actions { get; set; } = ActionEnum.Unknown;
|
public ActionEnum Actions { get; set; } = ActionEnum.Unknown;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Дополнительная информация.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 3)]
|
[Column(Order = 3)]
|
||||||
// ReSharper disable once EntityFramework.ModelValidation.UnlimitedStringLength
|
[Comment("Дополнительная информация")]
|
||||||
public string? Extra { get; set; }
|
public string? Extra { get; set; }
|
||||||
|
|
||||||
public Entity Entity { get; set; } = null!;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,37 +1,73 @@
|
|||||||
using System.ComponentModel.DataAnnotations.Schema;
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Pf2eModel.Model.Base;
|
using Pf2eModel.Model.Base;
|
||||||
using Pf2eModel.Model.Enum;
|
using Pf2eModel.Model.Enum;
|
||||||
using Pf2eModel.Model.Structure.AncestryRelation;
|
using Pf2eModel.Model.Structure.AncestryRelation;
|
||||||
|
|
||||||
namespace Pf2eModel.Model.Structure;
|
namespace Pf2eModel.Model.Structure;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Родословная.
|
||||||
|
/// </summary>
|
||||||
[EntityOfType(EntityType.Ancestry)]
|
[EntityOfType(EntityType.Ancestry)]
|
||||||
public class Ancestry : IEntity
|
public class Ancestry : IEntity
|
||||||
{
|
{
|
||||||
[System.ComponentModel.DataAnnotations.Key]
|
/// <inheritdoc/>
|
||||||
|
[Key]
|
||||||
[DatabaseGenerated(DatabaseGeneratedOption.None)]
|
[DatabaseGenerated(DatabaseGeneratedOption.None)]
|
||||||
[Column(Order = 1)]
|
[Column(Order = 1)]
|
||||||
|
[Comment("Идентификатор")]
|
||||||
public int Id { get; set; }
|
public int Id { get; set; }
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public Entity Entity { get; set; } = null!;
|
public Entity Entity { get; set; } = null!;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Размеры родословной.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 2)]
|
[Column(Order = 2)]
|
||||||
public Size[] Size { get; set; } = [];
|
[Comment("Размеры родословной")]
|
||||||
|
public SizeEnum[] Size { get; set; } = [];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Количество очков здоровья.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 3)]
|
[Column(Order = 3)]
|
||||||
|
[Comment("Количество очков здоровья")]
|
||||||
public int Hp { get; set; }
|
public int Hp { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Скорость передвижения.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 4)]
|
[Column(Order = 4)]
|
||||||
|
[Comment("Скорость передвижения")]
|
||||||
public int Speed { get; set; }
|
public int Speed { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Тип зрения.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 5)]
|
[Column(Order = 5)]
|
||||||
public AncestryVision Vision { get; set; } = AncestryVision.Normal;
|
[Comment("Тип зрения")]
|
||||||
|
public VisionEnum VisionEnum { get; set; } = VisionEnum.Normal;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Коллекция повышениий аттрибутов.
|
||||||
|
/// </summary>
|
||||||
public ICollection<AncestryBoost> AncestryBoosts { get; set; } = [];
|
public ICollection<AncestryBoost> AncestryBoosts { get; set; } = [];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Коллекция сущностей родословной.
|
||||||
|
/// </summary>
|
||||||
public ICollection<AncestryItem> AncestryItems { get; set; } = [];
|
public ICollection<AncestryItem> AncestryItems { get; set; } = [];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Коллекция языков родословной.
|
||||||
|
/// </summary>
|
||||||
public ICollection<AncestryLanguage> AncestryLanguages { get; set; } = [];
|
public ICollection<AncestryLanguage> AncestryLanguages { get; set; } = [];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Коллекция наследий.
|
||||||
|
/// </summary>
|
||||||
public ICollection<Heritage> Heritages { get; set; } = [];
|
public ICollection<Heritage> Heritages { get; set; } = [];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,30 +1,55 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.ComponentModel.DataAnnotations.Schema;
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Pf2eModel.Model.Base;
|
using Pf2eModel.Model.Base;
|
||||||
using Pf2eModel.Model.Enum;
|
using Pf2eModel.Model.Enum;
|
||||||
|
|
||||||
namespace Pf2eModel.Model.Structure;
|
namespace Pf2eModel.Model.Structure;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Архетип.
|
||||||
|
/// </summary>
|
||||||
[EntityOfType(EntityType.Archetype)]
|
[EntityOfType(EntityType.Archetype)]
|
||||||
public class Archetype : IEntity
|
public class Archetype : IEntity
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc/>
|
||||||
[Key]
|
[Key]
|
||||||
|
[DatabaseGenerated(DatabaseGeneratedOption.None)]
|
||||||
[Column(Order = 1)]
|
[Column(Order = 1)]
|
||||||
|
[Comment("Идентификатор")]
|
||||||
public int Id { get; set; }
|
public int Id { get; set; }
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public Entity Entity { get; set; } = null!;
|
public Entity Entity { get; set; } = null!;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Уровень.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 2)]
|
[Column(Order = 2)]
|
||||||
|
[Comment("Уровень")]
|
||||||
public int Level { get; set; }
|
public int Level { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Идентификатор способности, которая является посвящением в архетип.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 3)]
|
[Column(Order = 3)]
|
||||||
|
[Comment("ID посвящения")]
|
||||||
public int? DedicationFeatId { get; set; } = null;
|
public int? DedicationFeatId { get; set; } = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Дополнительная информация об архетипе.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 4)]
|
[Column(Order = 4)]
|
||||||
// ReSharper disable once EntityFramework.ModelValidation.UnlimitedStringLength
|
[Comment("Дополнительная информация")]
|
||||||
public string? Extra { get; set; }
|
public string? Extra { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Посвящение в архетип.
|
||||||
|
/// </summary>
|
||||||
public Feat DedicationFeat { get; set; } = null!;
|
public Feat DedicationFeat { get; set; } = null!;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Способности архетипа.
|
||||||
|
/// </summary>
|
||||||
public ICollection<Feat> Feats { get; set; } = [];
|
public ICollection<Feat> Feats { get; set; } = [];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,24 +1,40 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.ComponentModel.DataAnnotations.Schema;
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Pf2eModel.Model.Base;
|
using Pf2eModel.Model.Base;
|
||||||
using Pf2eModel.Model.Enum;
|
using Pf2eModel.Model.Enum;
|
||||||
using Pf2eModel.Model.Structure.BackgroundRelation;
|
using Pf2eModel.Model.Structure.BackgroundRelation;
|
||||||
|
|
||||||
namespace Pf2eModel.Model.Structure;
|
namespace Pf2eModel.Model.Structure;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Предыстория.
|
||||||
|
/// </summary>
|
||||||
[EntityOfType(EntityType.Background)]
|
[EntityOfType(EntityType.Background)]
|
||||||
public class Background : IEntity
|
public class Background : IEntity
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc/>
|
||||||
[Key]
|
[Key]
|
||||||
[DatabaseGenerated(DatabaseGeneratedOption.None)]
|
[DatabaseGenerated(DatabaseGeneratedOption.None)]
|
||||||
[Column(Order = 1)]
|
[Column(Order = 1)]
|
||||||
|
[Comment("Идентификатор")]
|
||||||
public int Id { get; set; }
|
public int Id { get; set; }
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public Entity Entity { get; set; } = null!;
|
public Entity Entity { get; set; } = null!;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Аттрибуты предыстории.
|
||||||
|
/// </summary>
|
||||||
public ICollection<BackgroundBoost> BackgroundBoosts { get; set; } = [];
|
public ICollection<BackgroundBoost> BackgroundBoosts { get; set; } = [];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Способности предыстории.
|
||||||
|
/// </summary>
|
||||||
public ICollection<BackgroundItem> BackgroundItems { get; set; } = [];
|
public ICollection<BackgroundItem> BackgroundItems { get; set; } = [];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Навыки предыстории.
|
||||||
|
/// </summary>
|
||||||
public ICollection<BackgroundTraining> BackgroundSkills { get; set; } = [];
|
public ICollection<BackgroundTraining> BackgroundSkills { get; set; } = [];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,40 +1,73 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.ComponentModel.DataAnnotations.Schema;
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Pf2eModel.Model.Base;
|
using Pf2eModel.Model.Base;
|
||||||
using Pf2eModel.Model.Enum;
|
using Pf2eModel.Model.Enum;
|
||||||
using Pf2eModel.Model.Structure.ClassRelation;
|
using Pf2eModel.Model.Structure.ClassRelation;
|
||||||
|
|
||||||
namespace Pf2eModel.Model.Structure;
|
namespace Pf2eModel.Model.Structure;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Класс.
|
||||||
|
/// </summary>
|
||||||
[EntityOfType(EntityType.Class)]
|
[EntityOfType(EntityType.Class)]
|
||||||
public class Class : IEntity
|
public class Class : IEntity
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc/>
|
||||||
[Key]
|
[Key]
|
||||||
|
[DatabaseGenerated(DatabaseGeneratedOption.None)]
|
||||||
[Column(Order = 1)]
|
[Column(Order = 1)]
|
||||||
|
[Comment("Идентификатор")]
|
||||||
public int Id { get; set; }
|
public int Id { get; set; }
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public Entity Entity { get; set; } = null!;
|
public Entity Entity { get; set; } = null!;
|
||||||
|
|
||||||
[Column(Order = 3)]
|
/// <summary>
|
||||||
|
/// Количество очков здоровья.
|
||||||
|
/// </summary>
|
||||||
|
[Column(Order = 2)]
|
||||||
|
[Comment("Количество очков здоровья")]
|
||||||
public int Hp { get; set; }
|
public int Hp { get; set; }
|
||||||
|
|
||||||
[Column(Order = 4)]
|
/// <summary>
|
||||||
public int Perception { get; set; }
|
/// Флаг, указывающий на то, что класс является заклинательным.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 5)]
|
[Column(Order = 3)]
|
||||||
|
[Comment("Заклинатель?")]
|
||||||
public bool Spellcasting { get; set; }
|
public bool Spellcasting { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Традиция заклинаний класса.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 6)]
|
[Column(Order = 6)]
|
||||||
public SpellTradition Tradition { get; set; }
|
[Comment("Традиция заклинаний")]
|
||||||
|
public SpellTradition? Tradition { get; set; } = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Количество дополнительных навыков.
|
||||||
|
/// </summary>
|
||||||
[Column(Order = 7)]
|
[Column(Order = 7)]
|
||||||
|
[Comment("Дополнительные навыки")]
|
||||||
public int AdditionalTrainedSkills { get; set; }
|
public int AdditionalTrainedSkills { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Аттрибуты класса.
|
||||||
|
/// </summary>
|
||||||
public virtual ICollection<ClassKeyAbility> ClassKeyAbilities { get; set; } = [];
|
public virtual ICollection<ClassKeyAbility> ClassKeyAbilities { get; set; } = [];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Прогрессия класса.
|
||||||
|
/// </summary>
|
||||||
public virtual ICollection<ClassProgression> ClassProgressions { get; set; } = [];
|
public virtual ICollection<ClassProgression> ClassProgressions { get; set; } = [];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Навыки класса.
|
||||||
|
/// </summary>
|
||||||
public virtual ICollection<ClassTraining> ClassTrainings { get; set; } = [];
|
public virtual ICollection<ClassTraining> ClassTrainings { get; set; } = [];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Группы подклассов.
|
||||||
|
/// </summary>
|
||||||
public virtual ICollection<SubclassGroup> SubclassGroups { get; set; } = [];
|
public virtual ICollection<SubclassGroup> SubclassGroups { get; set; } = [];
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user