Документирование и небольшой рефакторинг модели.

This commit is contained in:
2025-05-11 00:31:15 +04:00
parent 1a977ee988
commit 3c65274b45
64 changed files with 1960 additions and 554 deletions
+51 -9
View File
@@ -10,51 +10,93 @@ using Pf2eModel.Model.Structure;
namespace Pf2eModel.Model.Base;
/// <summary>
/// Корневая сущность.
/// </summary>
public class Entity
{
/// <summary>
/// Идентификатор сущности.
/// </summary>
[Key]
[Column(Order = 1)]
public int Id { get; set; }
/// <summary>
/// Отображаемое имя сущности.
/// </summary>
[Column(Order = 2)]
[Comment("Отображаемое имя")]
public LocaleString Name { get; set; } = [];
/// <summary>
/// Тип сущности.
/// </summary>
[Column(Order = 3)]
[Comment("Тип объекта")]
[Comment("Тип сущности")]
public EntityType Type { get; set; }
/// <summary>
/// Часть имени в URL.
/// </summary>
[Column(Order = 4)]
[MaxLength(Pf2eDbContext.NameLength)]
[Comment("Часть имени в URL")]
public string Slug { get; set; } = null!;
/// <summary>
/// Изображение сущности.
/// </summary>
[Column(Order = 5)]
[StringLength(255)]
[Comment("Изображение объекта")]
public string Img { get; set; } = null!;
/// <summary>
/// Текстовое описание сущности.
/// </summary>
[Column(Order = 6)]
[Comment("Текстовое описание объекта")]
// ReSharper disable once EntityFramework.ModelValidation.UnlimitedStringLength
[Comment("Текстовое описание сущности")]
public string Description { get; set; } = null!;
/// <summary>
/// Редкость сущности.
/// </summary>
[Column(Order = 7)]
[Comment("Редкость сущности")]
public EntityRarity Rarity { get; set; } = EntityRarity.Common;
/// <summary>
/// Флаг, указывающий, что у объекта существует перевод.
/// </summary>
[Column(Order = 8)]
[Comment("Флаг, указывающий, что у объекта существует перевод")]
[Comment("Флаг, указывающий, что у сущности существует перевод")]
public bool? IsTranslated { get; set; } = false;
/// <summary>
/// Флаг, указывающий, что объект был проверен и не требует автоматической перезаписи.
/// </summary>
[Column(Order = 9)]
[Comment("Флаг, указывающий, что объект был проверен и не требует автоматической перезаписи")]
[Comment("Флаг, указывающий, что сущность был проверен и не требует автоматической перезаписи")]
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; } = [];
}
+21 -1
View File
@@ -1,25 +1,45 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Common.I18n;
namespace Pf2eModel.Model.Base.Keywords;
/// <summary>
/// Ключевое слово.
/// </summary>
public class Keyword
{
/// <summary>
/// Идентификатор.
/// </summary>
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column(Order = 1)]
public int Id { get; set; }
/// <summary>
/// Отображаемое имя ключевого слова.
/// </summary>
[Column(Order = 2)]
[Comment("Отображаемое имя")]
public LocaleString Name = [];
/// <summary>
/// Часть имени в URL.
/// </summary>
[Column(Order = 3)]
[MaxLength(Pf2eDbContext.NameLength)]
[Comment("Часть имени в URL")]
public string Slug { get; set; } = null!;
[Newtonsoft.Json.JsonIgnore]
/// <summary>
/// Коллекция сущностей, которые используют это ключевое слово.
/// </summary>
public ICollection<Entity> Entities { get; set; } = [];
/// <summary>
/// Коллекция синонимов ключевого слова.
/// </summary>
public ICollection<KeywordAlias> Aliases { get; set; } = [];
}
+19 -1
View File
@@ -1,22 +1,40 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
namespace Pf2eModel.Model.Base.Keywords;
/// <summary>
/// Синоним ключевого слова.
/// </summary>
public class KeywordAlias
{
/// <summary>
/// Идентификатор.
/// </summary>
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; }
/// <summary>
/// Идентификатор связаннного ключевого слова.
/// </summary>
[Column(Order = 2)]
[Comment("Идентификатор ключевого слова")]
public int KeywordId { get; set; }
/// <summary>
/// Значение синонима ключевого слова.
/// </summary>
[Column(Order = 3)]
[MaxLength(Pf2eDbContext.NameLength)]
[Comment("Синоним")]
public string Value { get; set; } = null!;
[Newtonsoft.Json.JsonIgnore]
/// <summary>
/// Ключевое слово, к которому относится синоним.
/// </summary>
public Keyword Keyword { get; set; } = null!;
}
+27 -1
View File
@@ -4,30 +4,56 @@ using Microsoft.EntityFrameworkCore;
namespace Pf2eModel.Model.Base.Source;
/// <summary>
/// Связь между сущностью и источником.
/// </summary>
public class EntitySource
{
/// <summary>
/// Идентификатор связи.
/// </summary>
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column(Order = 0)]
[Comment("Идентификатор")]
public int Id { get; set; }
/// <summary>
/// Идентификатор сущности.
/// </summary>
[Column(Order = 1)]
[Comment("Идентификатор сущности")]
public int EntityId { get; set; }
/// <summary>
/// Идентификатор источника.
/// </summary>
[Column(Order = 2)]
[Comment("Идентификатор источника")]
public int SourceId { get; set; }
/// <summary>
/// Дополнительная информация о источнике, например, номер страницы, номер тома и т.д.
/// </summary>
[Column(Order = 3)]
[MaxLength(255)]
[Comment("Номер страницы, эррата и т.д.")]
public string Suffix { get; set; } = null!;
/// <summary>
/// Флаг, указывающий, что объект является частью ремастера.
/// </summary>
[Column(Order = 4)]
[Comment("Флаг, указывающий, что объект является частью ремастера")]
public bool IsRemaster { get; set; }
[Newtonsoft.Json.JsonIgnore]
/// <summary>
/// Сущность, к которой относится источник.
/// </summary>
public Entity Entity { get; set; } = null!;
/// <summary>
/// Источник, к которому относится сущность.
/// </summary>
public Source Source { get; set; } = null!;
}
+23 -1
View File
@@ -1,26 +1,48 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Enum;
namespace Pf2eModel.Model.Base.Source;
/// <summary>
/// Источник сущности.
/// </summary>
public class Source
{
/// <summary>
/// Идентификатор источника.
/// </summary>
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; }
/// <summary>
/// Отображаемое имя источника.
/// </summary>
[Column(Order = 2)]
[MaxLength(Pf2eDbContext.NameLength)]
[Comment("Отображаемое имя")]
public string Name { get; set; } = null!;
/// <summary>
/// Категория источника.
/// </summary>
[Column(Order = 3)]
[Comment("Категория источника")]
public SourceCategory Category { get; set; }
/// <summary>
/// Дата выхода источника.
/// </summary>
[Column(Order = 4)]
[Comment("Дата выхода источника")]
public DateOnly? ReleaseDate { get; set; }
[Newtonsoft.Json.JsonIgnore]
/// <summary>
/// Связанные сущности.
/// </summary>
public ICollection<EntitySource> EntitySources { get; set; } = [];
}
+27 -4
View File
@@ -4,13 +4,24 @@ using Microsoft.EntityFrameworkCore;
namespace Pf2eModel.Model.Base.Targets;
/// <summary>
/// Внешняя ссылка сущности.
/// </summary>
[PrimaryKey(nameof(EntityId), nameof(TargetId))]
public class EntityExternal
{
/// <summary>
/// Идентификатор сущности.
/// </summary>
[Column(Order = 1)]
[Comment("Идентификатор сущности")]
public int EntityId { get; set; }
/// <summary>
/// Идентификатор цели.
/// </summary>
[Column(Order = 2)]
[Comment("Идентификатор цели")]
public int TargetId { get; set; }
/*
@@ -19,18 +30,30 @@ public class EntityExternal
public string ExternalId { get; set; } = "";
*/
/// <summary>
/// Конечная часть URL внешней ссылки.
/// Для источников Foundry - полный UUID объекта.
/// </summary>
[Column(Order = 4)]
[MaxLength(255)]
[Comment("Часть URL до объекта. Для источников Foundry - полный UUID объекта")]
public string Suffix { get; set; } = "";
/// <summary>
/// Контрольная сумма объекта.
/// </summary>
[Column(Order = 5)]
[MaxLength(32)]
[Comment("Контроль версии объекта")]
[Comment("Контрольная сумма объекта")]
public string Md5 { get; set; } = null!;
[Newtonsoft.Json.JsonIgnore]
public virtual Entity Entity { get; set; } = null!;
/// <summary>
/// Сущность, которая ссылается на внешнюю ссылку.
/// </summary>
public Entity Entity { get; set; } = null!;
public virtual ExternalTarget Target { get; set; } = null!;
/// <summary>
/// Цель внешней ссылки.
/// </summary>
public ExternalTarget Target { get; set; } = null!;
}
+23 -2
View File
@@ -1,28 +1,49 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
namespace Pf2eModel.Model.Base.Targets;
/// <summary>
/// Цель внешней ссылки.
/// </summary>
public class ExternalTarget
{
/// <summary>
/// Идентификатор цели.
/// </summary>
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; }
/// <summary>
/// Название цели.
/// </summary>
[Column(Order = 2)]
[StringLength(Pf2eDbContext.NameLength)]
[Comment("Отображаемое имя")]
public string Name { get; set; } = null!;
/// <summary>
/// Иконка цели.
/// </summary>
[Column(Order = 3)]
[StringLength(255)]
[Comment("Иконка цели")]
public string Icon { get; set; } = null!;
/// <summary>
/// Префикс для URL-адреса внешней ссылки.
/// </summary>
[Column(Order = 3)]
[StringLength(Pf2eDbContext.NameLength)]
[Comment("Префикс для URL-адреса внешней ссылки")]
public string Prefix { get; set; } = null!;
[Column(Order = 4)]
[Newtonsoft.Json.JsonIgnore]
/// <summary>
/// Коллекция сущностей, которые ссылаются на эту цель.
/// </summary>
public ICollection<EntityExternal> EntityExternals { get; set; } = [];
}
+20
View File
@@ -1,21 +1,41 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
namespace Pf2eModel.Model.Common;
/// <summary>
/// Частота использования.
/// </summary>
public class Frequency
{
/// <summary>
/// Идентификатор.
/// </summary>
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; }
/// <summary>
/// Максимальная продолжительсность.
/// </summary>
[Column(Order = 2)]
[Comment("Максимальная продолжительсность")]
public int Max { get; set; }
/// <summary>
/// Частота использования.
/// </summary>
[Column(Order = 3)]
[Comment("Частота использования")]
public int Per { get; set; }
/// <summary>
/// Значение использования.
/// </summary>
[Column(Order = 4)]
[Comment("Значение использования")]
public int? Value { get; set; }
}
+17 -2
View File
@@ -3,8 +3,16 @@ using System.Reflection;
namespace Pf2eModel.Model.Common.I18n;
/// <summary>
/// Расширения для работы с локализацией.
/// </summary>
public static class LocaleExtension
{
/// <summary>
/// Получение строкового представления типа локализации.
/// </summary>
/// <param name="localeType">Тип локализации.</param>
/// <returns>Строковое представление типа локализации.</returns>
public static string GetTypeString(this LocaleType localeType)
{
FieldInfo fi = localeType.GetType().GetField(localeType.ToString())!;
@@ -16,7 +24,13 @@ public static class LocaleExtension
?? 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())
{
@@ -28,7 +42,7 @@ public static class LocaleExtension
continue;
}
if (descriptionAttribute.Description == localeType)
if (descriptionAttribute.Description == localeTypeString)
{
return (LocaleType)field.GetValue(null)!;
}
@@ -36,6 +50,7 @@ public static class LocaleExtension
throw new InvalidEnumArgumentException();
}
/*
public static IQueryable<T> WhereLocale(
this IQueryable<T> query, Expression<Func<T, LocaleString>> expression, string searchTerm) where T : class
+16 -1
View File
@@ -1,11 +1,26 @@
namespace Pf2eModel.Model.Common.I18n;
/// <summary>
/// Элемент локализации.
/// </summary>
/// <param name="type">Тип локализации.</param>
/// <param name="value">Значение локализации.</param>
public class LocaleItem(LocaleType type, string value)
{
/// <summary>
/// Тип локализации.
/// </summary>
public LocaleType Locale { get; set; } = type;
/// <summary>
/// Значение локализации.
/// </summary>
public string Value { get; set; } = value;
/// <summary>
/// Конструктор класса <see cref="LocaleItem"/> по паре ключ-значение.
/// </summary>
/// <param name="item">Пара ключ-значение по строковому представлению типа.</param>
public LocaleItem(KeyValuePair<string, string> item)
: this(LocaleExtension.GetTypeByString(item.Key), item.Value) { }
: this(item.Key.GetTypeByString(), item.Value) { }
}
+106 -9
View File
@@ -3,40 +3,90 @@ using Newtonsoft.Json.Linq;
namespace Pf2eModel.Model.Common.I18n;
/// <summary>
/// Локализованная строка.
/// </summary>
public class LocaleString : ICollection<LocaleItem>
{
/// <summary>
/// Список локализаций строк.
/// </summary>
private readonly List<LocaleItem> _items = [];
/// <summary>
/// Проверяет наличие хотя бы одной локализации.
/// </summary>
private void AssureDefault()
{
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 bool IsReadOnly => false;
/// <summary>
/// Коллекция реализованных типов локализаций.
/// </summary>
public ICollection<LocaleType> Types => _items.Select(c => c.Locale).ToList();
/// <inheritdoc/>
public bool IsReadOnly => false;
/// <summary>
/// Конструктор класса <see cref="LocaleString"/>.
/// </summary>
public LocaleString()
{
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) =>
Contains(locale) ? locale : LocaleType.English;
/// <summary>
/// Получение типа локализации по строковому представлению с учётом её наличия в коллекции.
/// </summary>
/// <param name="localeString">Строковое представление искомого типа локализации.</param>
/// <returns>Реальный тип локализации.</returns>
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(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]
{
get => GetItem(locale).Value;
@@ -48,52 +98,87 @@ public class LocaleString : ICollection<LocaleItem>
}
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]
{
get => this[_E(localeString)];
set => this[_E(localeString)] = value;
}
/// <summary>
/// Добавление объекта локализованной строки в коллекцию.
/// </summary>
/// <param name="item">Объект локализированной строки.</param>
public void Add(LocaleItem item)
{
this[item.Locale] = item.Value;
}
/// <summary>
/// Добавление локализованной строки в коллекцию.
/// </summary>
/// <param name="locale">Тип локализации.</param>
/// <param name="value">Строка локазации.</param>
public void Add(LocaleType locale, string value)
{
this[locale] = value;
}
/// <summary>
/// Отчистка коллекции локализованных строк.
/// </summary>
public void Clear()
{
_items.Clear();
AssureDefault();
}
/// <summary>
/// Проверка наличия объекта локализованной строки в коллекции.
/// </summary>
/// <param name="item">Объект локализированной строки.</param>
/// <returns>`true`, если объект есть; `false`, если нет.</returns>
public bool Contains(LocaleItem item)
{
return _items.Contains(item);
}
/// <summary>
/// Проверка наличия локализованной строки в коллекции по типу локализации.
/// </summary>
/// <param name="locale">Тип локализации.</param>
/// <returns>`true`, если искомый тип локализации есть; `false`, если нет.</returns>
public bool Contains(LocaleType 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)
{
throw new NotImplementedException();
}
/// <inheritdoc/>
public bool Remove(LocaleItem item)
{
bool result = _items.Remove(item);
@@ -107,21 +192,28 @@ public class LocaleString : ICollection<LocaleItem>
return result;
}
/// <inheritdoc/>
public IEnumerator<LocaleItem> GetEnumerator()
{
return _items.GetEnumerator();
}
/// <inheritdoc/>
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
/// <inheritdoc/>
public override string ToString()
{
return this[LocaleType.English];
}
/// <summary>
/// Сериализация локализованной строки в JSON-формат.
/// </summary>
/// <returns>Строковое представление JSON-представления.</returns>
public string Serialize()
{
JObject json = [];
@@ -134,10 +226,15 @@ public class LocaleString : ICollection<LocaleItem>
return json.ToString();
}
/// <summary>
/// Десериализация локализованной строки из JSON-формата.
/// </summary>
/// <param name="input">Строковое представление JSON-представления.</param>
/// <returns>Объект локализованной строки.</returns>
public static LocaleString Deserialize(string input)
{
JObject json = JObject.Parse(input);
LocaleString result = new();
LocaleString result = [];
foreach (KeyValuePair<string, JToken?> item in json)
{
@@ -2,6 +2,9 @@
namespace Pf2eModel.Model.Common.I18n;
/// <summary>
/// Тип локализации.
/// </summary>
public enum LocaleType
{
[Description("en")]
+16
View File
@@ -1,20 +1,36 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Common.I18n;
using Pf2eModel.Model.Enum;
namespace Pf2eModel.Model.Common;
/// <summary>
/// Изучаемая способность.
/// </summary>
public class Training
{
/// <summary>
/// Идентификатор.
/// </summary>
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; }
/// <summary>
/// Название способности.
/// </summary>
[Column(Order = 2)]
[Comment("Название способности")]
public LocaleString Name { get; set; } = [];
/// <summary>
/// Тип способности.
/// </summary>
[Column(Order = 3)]
[Comment("Тип способности")]
public TrainingType Type { get; set; }
}
+10
View File
@@ -2,10 +2,20 @@
namespace Pf2eModel.Model.Enum;
/// <summary>
/// Тип действия.
/// </summary>
public enum ActionCategory
{
/// <summary>
/// Неизвестный тип действия.
/// </summary>
[PgName("unknown")]
Unknown,
/// <summary>
/// Действие архетипа.
/// </summary>
[PgName("archetype")]
Archetype,
+3
View File
@@ -2,6 +2,9 @@
namespace Pf2eModel.Model.Enum;
/// <summary>
/// Перечиленение количества действий.
/// </summary>
public enum ActionEnum
{
[PgName("unknown")]
-15
View File
@@ -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,
}
+24
View File
@@ -2,26 +2,50 @@
namespace Pf2eModel.Model.Enum;
/// <summary>
/// Перечисление значений атрибутов.
/// </summary>
public enum AttributeValues
{
/// <summary>
/// Свободный атрибут.
/// </summary>
[PgName("free")]
Free,
/// <summary>
/// Сила.
/// </summary>
[PgName("str")]
Strength,
/// <summary>
/// Ловкость.
/// </summary>
[PgName("dex")]
Dexterity,
/// <summary>
/// Телосложение.
/// </summary>
[PgName("con")]
Constitution,
/// <summary>
/// Интеллект.
/// </summary>
[PgName("int")]
Intelligence,
/// <summary>
/// Мудрость.
/// </summary>
[PgName("wis")]
Wisdom,
/// <summary>
/// Харизма.
/// </summary>
[PgName("cha")]
Charisma,
}
@@ -2,23 +2,50 @@
namespace Pf2eModel.Model.Enum;
/// <summary>
/// Тип элемента прогрессии класса.
/// </summary>
public enum ClassProgressionType
{
/// <summary>
/// Неизвестный тип прогрессии класса.
/// </summary>
[PgName("entity")]
Entity,
/// <summary>
/// Навык архетипа.
/// </summary>
[PgName("ancestry_feat")]
AncestryFeat,
/// <summary>
/// Классовая особенность.
/// </summary>
[PgName("class_feat")]
ClassFeat,
/// <summary>
/// Общий навык.
/// </summary>
[PgName("general_feat")]
GeneralFeat,
/// <summary>
/// Навык
/// </summary>
[PgName("skill_feat")]
SkillFeat,
/// <summary>
/// Увеличение навыка.
/// </summary>
[PgName("skill_increase")]
SkillIncrease,
/// <summary>
/// Увеличение атрибута.
/// </summary>
[PgName("attribute_increase")]
AttributeIncrease,
}
+21
View File
@@ -2,23 +2,44 @@
namespace Pf2eModel.Model.Enum;
/// <summary>
/// Тип состояния
/// </summary>
public enum ConditionGroup
{
/// <summary>
/// Неизвестое состояние.
/// </summary>
[PgName("unknown")]
Unknown,
/// <summary>
/// Чувство.
/// </summary>
[PgName("senses")]
Senses,
/// <summary>
/// Способность.
/// </summary>
[PgName("abilities")]
Abilities,
/// <summary>
/// Смерть.
/// </summary>
[PgName("death")]
Death,
/// <summary>
/// Отношение. (???)
/// </summary>
[PgName("attitudes")]
Attitudes,
/// <summary>
/// Обнаружение.
/// </summary>
[PgName("detection")]
Detection,
}
+15
View File
@@ -2,17 +2,32 @@
namespace Pf2eModel.Model.Enum;
/// <summary>
/// Тип божества.
/// </summary>
public enum DeityCategory
{
/// <summary>
/// Божество.
/// </summary>
[PgName("deity")]
Deity,
/// <summary>
/// Пантеон.
/// </summary>
[PgName("pantheon")]
Pantheon,
/// <summary>
/// Ковенант.
/// </summary>
[PgName("covenant")]
Covenant,
/// <summary>
/// Философия.
/// </summary>
[PgName("philosophy")]
Philosophy,
}
+15
View File
@@ -2,17 +2,32 @@
namespace Pf2eModel.Model.Enum;
/// <summary>
/// Тип божественной силы.
/// </summary>
public enum DeityFonts
{
/// <summary>
/// Без божественной силы.
/// </summary>
[PgName("none")]
None,
/// <summary>
/// Исцеление.
/// </summary>
[PgName("heal")]
Heal,
/// <summary>
/// Урон.
/// </summary>
[PgName("harm")]
Harm,
/// <summary>
/// Любой тип божественной силы.
/// </summary>
[PgName("any")]
Any,
}
@@ -2,14 +2,26 @@
namespace Pf2eModel.Model.Enum;
/// <summary>
/// Тип освящения божества.
/// </summary>
public enum DeitySanctification
{
/// <summary>
/// Святость.
/// </summary>
[PgName("holy")]
Holy,
/// <summary>
/// Нечестивость.
/// </summary>
[PgName("unholy")]
Unholy,
/// <summary>
/// Любое.
/// </summary>
[PgName("any")]
Any,
}
+24
View File
@@ -2,26 +2,50 @@
namespace Pf2eModel.Model.Enum;
/// <summary>
/// Перечисление элементов.
/// </summary>
public enum ElementEnum
{
/// <summary>
/// Универсальный элемент.
/// </summary>
[PgName("universal")]
Universal,
/// <summary>
/// Воздух.
/// </summary>
[PgName("air")]
Air,
/// <summary>
/// Вода.
/// </summary>
[PgName("water")]
Water,
/// <summary>
/// Земля.
/// </summary>
[PgName("earth")]
Earth,
/// <summary>
/// Огонь.
/// </summary>
[PgName("fire")]
Fire,
/// <summary>
/// Дерево.
/// </summary>
[PgName("wood")]
Wood,
/// <summary>
/// Металл.
/// </summary>
[PgName("metal")]
Metal,
}
+15
View File
@@ -2,17 +2,32 @@
namespace Pf2eModel.Model.Enum;
/// <summary>
/// Перечисление редкости сущности.
/// </summary>
public enum EntityRarity
{
/// <summary>
/// Обычная редкость.
/// </summary>
[PgName("common")]
Common,
/// <summary>
/// Необычная редкость.
/// </summary>
[PgName("uncommon")]
Uncommon,
/// <summary>
/// Редкая редкость.
/// </summary>
[PgName("rare")]
Rare,
/// <summary>
/// Уникальная редкость.
/// </summary>
[PgName("unique")]
Unique,
}
+60
View File
@@ -2,62 +2,122 @@
namespace Pf2eModel.Model.Enum;
/// <summary>
/// Тип сущности.
/// </summary>
public enum EntityType
{
/// <summary>
/// Неизвестный тип сущности.
/// </summary>
[PgName("unknown")]
Unknown,
/// <summary>
/// Признак.
/// </summary>
[PgName("trait")]
Trait,
/// <summary>
/// Действие.
/// </summary>
[PgName("action")]
Action,
/// <summary>
/// Родословная.
/// </summary>
[PgName("ancestry")]
Ancestry,
/// <summary>
/// Архетип.
/// </summary>
[PgName("archetype")]
Archetype,
/// <summary>
/// Происхождение.
/// </summary>
[PgName("background")]
Background,
/// <summary>
/// Рюкзак.
/// </summary>
[PgName("backpack")]
Backpack,
/// <summary>
/// Способность кампании.
/// </summary>
[PgName("campaign_feature")]
CampaignFeature,
/// <summary>
/// Класс.
/// </summary>
[PgName("class")]
Class,
/// <summary>
/// Группа подклассов.
/// </summary>
[PgName("subclass_group")]
SubclassGroup,
/// <summary>
/// Подкласс.
/// </summary>
[PgName("subclass")]
Subclass,
/// <summary>
/// Состояние.
/// </summary>
[PgName("condition")]
Condition,
/// <summary>
/// Божество.
/// </summary>
[PgName("deity")]
Deity,
/// <summary>
/// Навык.
/// </summary>
[PgName("feat")]
Feat,
/// <summary>
/// Наследие.
/// </summary>
[PgName("heritage")]
Heritage,
/// <summary>
/// Заклианиние.
/// </summary>
[PgName("spell")]
Spell,
/// <summary>
/// Ритуал.
/// </summary>
[PgName("ritual")]
Ritual,
/// <summary>
/// Язык.
/// </summary>
[PgName("language")]
Language,
/// <summary>
/// Правило.
/// </summary>
[PgName("rule")]
Rule,
}
-18
View File
@@ -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,
}
+8 -5
View File
@@ -7,11 +7,14 @@ public enum FeatCategory
[PgName("uncategorized")]
Uncategorized,
[PgName("ancestry")]
Ancestry,
[PgName("ancestry-feature")]
AncestryFeature,
[PgName("class-feature")]
ClassFeature,
[PgName("archetype")]
Archetype,
[PgName("calling")]
Calling,
@@ -19,15 +22,15 @@ public enum FeatCategory
[PgName("class")]
Class,
[PgName("class-feature")]
ClassFeature,
[PgName("skill")]
Skill,
[PgName("general")]
General,
[PgName("ancestry")]
Ancestry,
[PgName("bonus")]
Bonus,
-18
View File
@@ -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,
}
+39
View File
@@ -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,
}
+24
View File
@@ -2,26 +2,50 @@
namespace Pf2eModel.Model.Enum;
/// <summary>
/// Перечисление категорий источников.
/// </summary>
public enum SourceCategory
{
/// <summary>
/// Неизвестная категория источника.
/// </summary>
[PgName("rulebook")]
Rulebooks,
/// <summary>
/// Серия приключений.
/// </summary>
[PgName("adventure-path")]
AdventurePaths,
/// <summary>
/// Lost Omens
/// </summary>
[PgName("lost-omens")]
LostOmens,
/// <summary>
/// Приключение.
/// </summary>
[PgName("adventures")]
Adventures,
/// <summary>
/// Комиксы.
/// </summary>
[PgName("comics")]
Comics,
/// <summary>
/// Блог-посты.
/// </summary>
[PgName("blog-posts")]
BlogPosts,
/// <summary>
/// Сообщество.
/// </summary>
[PgName("society")]
Society,
}
+36
View File
@@ -2,38 +2,74 @@
namespace Pf2eModel.Model.Enum;
/// <summary>
/// Тип области заклинания.
/// </summary>
public enum SpellAreaType
{
/// <summary>
/// Взрыв.
/// </summary>
[PgName("burst")]
Burst,
/// <summary>
/// Эманация.
/// </summary>
[PgName("emanation")]
Emanation,
/// <summary>
/// Конус.
/// </summary>
[PgName("cone")]
Cone,
/// <summary>
/// Линия.
/// </summary>
[PgName("line")]
Line,
/// <summary>
/// Квадрат.
/// </summary>
[PgName("square")]
Square,
/// <summary>
/// Куб.
/// </summary>
[PgName("cube")]
Cube,
/// <summary>
/// Цилиндр.
/// </summary>
[PgName("cylinder")]
Cylinder,
/// <summary>
/// Варьируемое.
/// </summary>
[PgName("varies")]
Varies,
/// <summary>
/// Параллелипипед.
/// </summary>
[PgName("cuboid")]
Cuboid,
/// <summary>
/// Круг.
/// </summary>
[PgName("circle")]
Circle,
/// <summary>
/// Иное.
/// </summary>
[PgName("other")]
Other,
}
@@ -2,11 +2,26 @@
namespace Pf2eModel.Model.Enum;
/// <summary>
/// Тип урона заклинания.
/// </summary>
public enum SpellDamageCategory
{
/// <summary>
/// Обычный урон.
/// </summary>
[PgName("normal")]
Normal,
/// <summary>
/// Продолжительный урон.
/// </summary>
[PgName("persistent")]
Persistent,
/// <summary>
/// Брызги.
/// </summary>
[PgName("splash")]
Splash,
}
+12
View File
@@ -2,14 +2,26 @@
namespace Pf2eModel.Model.Enum;
/// <summary>
/// Тип урона заклинания.
/// </summary>
public enum SpellDamageKinds
{
/// <summary>
/// Урон.
/// </summary>
[PgName("damage")]
Damage,
/// <summary>
/// Исцеление.
/// </summary>
[PgName("healing")]
Healing,
/// <summary>
/// Любое.
/// </summary>
[PgName("any")]
Any,
}
+24
View File
@@ -2,26 +2,50 @@
namespace Pf2eModel.Model.Enum;
/// <summary>
/// Традиция заклинания.
/// </summary>
public enum SpellTradition
{
/// <summary>
/// Без традиции.
/// </summary>
[PgName("none")]
None,
/// <summary>
/// Сакральная традиция.
/// </summary>
[PgName("divine")]
Divine,
/// <summary>
/// Оккультная традиция.
/// </summary>
[PgName("occult")]
Occult,
/// <summary>
/// Арканная традиция.
/// </summary>
[PgName("arcane")]
Arcane,
/// <summary>
/// Примальная традиция.
/// </summary>
[PgName("primal")]
Primal,
/// <summary>
/// Элементная традиция.
/// </summary>
[PgName("elemental")]
Elemental,
/// <summary>
/// Все традиции.
/// </summary>
[PgName("all")]
All,
}
+21
View File
@@ -2,23 +2,44 @@
namespace Pf2eModel.Model.Enum;
/// <summary>
/// Ранг тренировки.
/// </summary>
public enum TrainingRank
{
/// <summary>
/// Необученный.
/// </summary>
[PgName("untrained")]
Untrained,
/// <summary>
/// Обученный.
/// </summary>
[PgName("trained")]
Trained,
/// <summary>
/// Эксперт.
/// </summary>
[PgName("expert")]
Expert,
/// <summary>
/// Мастер.
/// </summary>
[PgName("master")]
Master,
/// <summary>
/// Легендарный.
/// </summary>
[PgName("legendary")]
Legendary,
/// <summary>
/// Мифический.
/// </summary>
[PgName("mythic")]
Mythic,
}
+21
View File
@@ -2,23 +2,44 @@
namespace Pf2eModel.Model.Enum;
/// <summary>
/// Тип тренировки.
/// </summary>
public enum TrainingType
{
/// <summary>
/// Восприятие.
/// </summary>
[PgName("perception")]
Perception,
/// <summary>
/// Навык.
/// </summary>
[PgName("skill")]
Skill,
/// <summary>
/// Знание.
/// </summary>
[PgName("lore")]
Lore,
/// <summary>
/// Оружие.
/// </summary>
[PgName("weapon")]
Weapon,
/// <summary>
/// Защита.
/// </summary>
[PgName("armor")]
Armor,
/// <summary>
/// Спасбросок.
/// </summary>
[PgName("save")]
Save,
}
+12
View File
@@ -2,14 +2,26 @@
namespace Pf2eModel.Model.Enum;
/// <summary>
/// Тип признака.
/// </summary>
public enum TraitType
{
/// <summary>
/// Обычный признак.
/// </summary>
[PgName("regular")]
Regular,
/// <summary>
/// Признак класса.
/// </summary>
[PgName("class")]
Class,
/// <summary>
/// Признак традиции.
/// </summary>
[PgName("tradition")]
Tradition,
}
+27
View File
@@ -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,
}
+9
View File
@@ -3,10 +3,19 @@ using Pf2eModel.Model.Base;
namespace Pf2eModel.Model;
/// <summary>
/// Интерфейс сущностей структуры.
/// </summary>
public interface IEntity
{
/// <summary>
/// Идентификатор сущности.
/// </summary>
public int Id { get; set; }
/// <summary>
/// Корневая сущность.
/// </summary>
[JsonIgnore]
public Entity Entity { get; set; }
}
+20 -5
View File
@@ -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.Enum;
namespace Pf2eModel.Model.Structure;
/// <summary>
/// Действие.
/// </summary>
[EntityOfType(EntityType.Action)]
public class Action : IEntity
{
[System.ComponentModel.DataAnnotations.Key]
/// <inheritdoc/>
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!;
/// <summary>
/// Количество действий.
/// </summary>
[Column(Order = 2)]
[Comment("Количество действий")]
public ActionEnum Actions { get; set; } = ActionEnum.Unknown;
/// <summary>
/// Дополнительная информация.
/// </summary>
[Column(Order = 3)]
// ReSharper disable once EntityFramework.ModelValidation.UnlimitedStringLength
[Comment("Дополнительная информация")]
public string? Extra { get; set; }
public Entity Entity { get; set; } = null!;
}
+40 -4
View File
@@ -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.Enum;
using Pf2eModel.Model.Structure.AncestryRelation;
namespace Pf2eModel.Model.Structure;
/// <summary>
/// Родословная.
/// </summary>
[EntityOfType(EntityType.Ancestry)]
public class Ancestry : IEntity
{
[System.ComponentModel.DataAnnotations.Key]
/// <inheritdoc/>
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!;
/// <summary>
/// Размеры родословной.
/// </summary>
[Column(Order = 2)]
public Size[] Size { get; set; } = [];
[Comment("Размеры родословной")]
public SizeEnum[] Size { get; set; } = [];
/// <summary>
/// Количество очков здоровья.
/// </summary>
[Column(Order = 3)]
[Comment("Количество очков здоровья")]
public int Hp { get; set; }
/// <summary>
/// Скорость передвижения.
/// </summary>
[Column(Order = 4)]
[Comment("Скорость передвижения")]
public int Speed { get; set; }
/// <summary>
/// Тип зрения.
/// </summary>
[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; } = [];
/// <summary>
/// Коллекция сущностей родословной.
/// </summary>
public ICollection<AncestryItem> AncestryItems { get; set; } = [];
/// <summary>
/// Коллекция языков родословной.
/// </summary>
public ICollection<AncestryLanguage> AncestryLanguages { get; set; } = [];
/// <summary>
/// Коллекция наследий.
/// </summary>
public ICollection<Heritage> Heritages { get; set; } = [];
}
+26 -1
View File
@@ -1,30 +1,55 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Base;
using Pf2eModel.Model.Enum;
namespace Pf2eModel.Model.Structure;
/// <summary>
/// Архетип.
/// </summary>
[EntityOfType(EntityType.Archetype)]
public class Archetype : IEntity
{
/// <inheritdoc/>
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!;
/// <summary>
/// Уровень.
/// </summary>
[Column(Order = 2)]
[Comment("Уровень")]
public int Level { get; set; }
/// <summary>
/// Идентификатор способности, которая является посвящением в архетип.
/// </summary>
[Column(Order = 3)]
[Comment("ID посвящения")]
public int? DedicationFeatId { get; set; } = null;
/// <summary>
/// Дополнительная информация об архетипе.
/// </summary>
[Column(Order = 4)]
// ReSharper disable once EntityFramework.ModelValidation.UnlimitedStringLength
[Comment("Дополнительная информация")]
public string? Extra { get; set; }
/// <summary>
/// Посвящение в архетип.
/// </summary>
public Feat DedicationFeat { get; set; } = null!;
/// <summary>
/// Способности архетипа.
/// </summary>
public ICollection<Feat> Feats { get; set; } = [];
}
+16
View File
@@ -1,24 +1,40 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Base;
using Pf2eModel.Model.Enum;
using Pf2eModel.Model.Structure.BackgroundRelation;
namespace Pf2eModel.Model.Structure;
/// <summary>
/// Предыстория.
/// </summary>
[EntityOfType(EntityType.Background)]
public class Background : IEntity
{
/// <inheritdoc/>
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!;
/// <summary>
/// Аттрибуты предыстории.
/// </summary>
public ICollection<BackgroundBoost> BackgroundBoosts { get; set; } = [];
/// <summary>
/// Способности предыстории.
/// </summary>
public ICollection<BackgroundItem> BackgroundItems { get; set; } = [];
/// <summary>
/// Навыки предыстории.
/// </summary>
public ICollection<BackgroundTraining> BackgroundSkills { get; set; } = [];
}
+39 -6
View File
@@ -1,40 +1,73 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Base;
using Pf2eModel.Model.Enum;
using Pf2eModel.Model.Structure.ClassRelation;
namespace Pf2eModel.Model.Structure;
/// <summary>
/// Класс.
/// </summary>
[EntityOfType(EntityType.Class)]
public class Class : IEntity
{
/// <inheritdoc/>
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!;
[Column(Order = 3)]
/// <summary>
/// Количество очков здоровья.
/// </summary>
[Column(Order = 2)]
[Comment("Количество очков здоровья")]
public int Hp { get; set; }
[Column(Order = 4)]
public int Perception { get; set; }
[Column(Order = 5)]
/// <summary>
/// Флаг, указывающий на то, что класс является заклинательным.
/// </summary>
[Column(Order = 3)]
[Comment("Заклинатель?")]
public bool Spellcasting { get; set; }
/// <summary>
/// Традиция заклинаний класса.
/// </summary>
[Column(Order = 6)]
public SpellTradition Tradition { get; set; }
[Comment("Традиция заклинаний")]
public SpellTradition? Tradition { get; set; } = null;
/// <summary>
/// Количество дополнительных навыков.
/// </summary>
[Column(Order = 7)]
[Comment("Дополнительные навыки")]
public int AdditionalTrainedSkills { get; set; }
/// <summary>
/// Аттрибуты класса.
/// </summary>
public virtual ICollection<ClassKeyAbility> ClassKeyAbilities { get; set; } = [];
/// <summary>
/// Прогрессия класса.
/// </summary>
public virtual ICollection<ClassProgression> ClassProgressions { get; set; } = [];
/// <summary>
/// Навыки класса.
/// </summary>
public virtual ICollection<ClassTraining> ClassTrainings { get; set; } = [];
/// <summary>
/// Группы подклассов.
/// </summary>
public virtual ICollection<SubclassGroup> SubclassGroups { get; set; } = [];
}
+15 -1
View File
@@ -1,24 +1,38 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Base;
using Pf2eModel.Model.Enum;
namespace Pf2eModel.Model.Structure;
/// <summary>
/// Состояние.
/// </summary>
[EntityOfType(EntityType.Condition)]
public class Condition : IEntity
{
/// <inheritdoc/>
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!;
/// <summary>
/// Группа состояния.
/// </summary>
[Column(Order = 2)]
[Comment("Группа состояния")]
public ConditionGroup? Group { get; set; }
/// <summary>
/// Дополнительная информация.
/// </summary>
[Column(Order = 3)]
// ReSharper disable once EntityFramework.ModelValidation.UnlimitedStringLength
[Comment("Дополнительная информация")]
public string? Extra { get; set; }
}
+38
View File
@@ -1,5 +1,6 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Base;
using Pf2eModel.Model.Common;
using Pf2eModel.Model.Enum;
@@ -7,35 +8,72 @@ using Pf2eModel.Model.Structure.DeityRelation;
namespace Pf2eModel.Model.Structure;
/// <summary>
/// Божество.
/// </summary>
[EntityOfType(EntityType.Deity)]
public class Deity : IEntity
{
/// <inheritdoc/>
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!;
/// <summary>
/// Тип божества.
/// </summary>
[Column(Order = 2)]
[Comment("Тип божества")]
public DeityCategory Category { get; set; }
/// <summary>
/// Тип божественный силы.
/// </summary>
[Column(Order = 3)]
[Comment("Тип божественной силы")]
public DeityFonts Fonts { get; set; }
/// <summary>
/// Тип освящения.
/// </summary>
[Column(Order = 4)]
[Comment("Тип освящения")]
public DeitySanctification Sanctification { get; set; }
/// <summary>
/// Обязательное освящение.
/// </summary>
[Column(Order = 5)]
[Comment("Обязательное освящение")]
public bool SanctificationMust { get; set; }
/// <summary>
/// Аттрибуты божества.
/// </summary>
public ICollection<DeityAttribute> DeityAttributes { get; set; } = new List<DeityAttribute>();
/// <summary>
/// Домены божества.
/// </summary>
public ICollection<DeityDomain> DeityDomains { get; set; } = new List<DeityDomain>();
/// <summary>
/// Заклинания божества.
/// </summary>
public ICollection<DeitySpell> DeitySpells { get; set; } = new List<DeitySpell>();
/// <summary>
/// Оружия божества.
/// </summary>
public ICollection<DeityWeapon> DeityWeapons { get; set; } = new List<DeityWeapon>();
/// <summary>
/// Навыки божества.
/// </summary>
public ICollection<Training> Skills { get; set; } = new List<Training>();
}
+27 -2
View File
@@ -1,28 +1,44 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Base;
using Pf2eModel.Model.Enum;
using Pf2eModel.Model.Structure.FeatRelation;
namespace Pf2eModel.Model.Structure;
/// <summary>
/// Способность.
/// </summary>
[EntityOfType(EntityType.Feat)]
public class Feat : IEntity
{
/// <inheritdoc/>
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!;
/// <summary>
/// Категория способности.
/// </summary>
[Column(Order = 3)]
public ActionCategory Category { get; set; }
[Comment("Категория способности")]
public FeatCategory Category { get; set; }
/// <summary>
/// Уровень способности.
/// </summary>
[Column(Order = 4)]
[Comment("Уровень способности")]
public int Level { get; set; }
[Column(Order = 5)]
[Comment("Количество действий")]
public int? Actions { get; set; } = null;
[Column(Order = 6)]
@@ -37,11 +53,20 @@ public class Feat : IEntity
[Column(Order = 9)]
public bool IsPassive { get; set; } = false;
/// <summary>
/// Дополнительная информация.
/// </summary>
[Column(Order = 10)]
// ReSharper disable once EntityFramework.ModelValidation.UnlimitedStringLength
[Comment("Дополнительная информация")]
public string? Extra { get; set; }
/// <summary>
/// Архетипы, которые могут использовать эту способность.
/// </summary>
public ICollection<Archetype> Archetypes { get; set; } = [];
/// <summary>
/// Требования к получению способности.
/// </summary>
public ICollection<FeatPrerequisite> FeatPrerequisites { get; set; } = [];
}
+15 -1
View File
@@ -1,22 +1,36 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Base;
using Pf2eModel.Model.Enum;
namespace Pf2eModel.Model.Structure;
/// <summary>
/// Наследие.
/// </summary>
[EntityOfType(EntityType.Heritage)]
public class Heritage : IEntity
{
/// <inheritdoc/>
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!;
/// <summary>
/// Идентификатор родословной.
/// </summary>
[Column(Order = 2)]
[Comment("Идентификатор родословной")]
public int? AncestryId { get; set; }
public virtual Ancestry? Ancestry { get; set; }
/// <summary>
/// Родословная.
/// </summary>
public Ancestry? Ancestry { get; set; }
}
+8 -1
View File
@@ -1,17 +1,24 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Base;
using Pf2eModel.Model.Enum;
namespace Pf2eModel.Model.Structure;
/// <summary>
/// Язык.
/// </summary>
[EntityOfType(EntityType.Language)]
public class Language : IEntity
{
/// <inheritdoc/>
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!;
}
+69 -2
View File
@@ -8,60 +8,127 @@ using Pf2eModel.Model.Structure.RitualRelation;
namespace Pf2eModel.Model.Structure;
/// <summary>
/// Ритуал.
/// </summary>
[EntityOfType(EntityType.Ritual)]
public class Ritual : IEntity
{
/// <inheritdoc/>
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!;
/// <summary>
/// Уровень ритуала.
/// </summary>
[Column(Order = 2)]
[Comment("Уровень ритуала")]
public int Level { get; set; }
/// <summary>
/// Продолжительность ритуала в секундах.
/// </summary>
[Column(Order = 3)]
[Comment("Продолжительность ритуала в секундах")]
public int CastTime { get; set; }
/// <summary>
/// Время действия эффекта ритуала в секундах.
/// </summary>
[Column(Order = 4)]
[Comment("Время действия эффекта ритуала в секундах")]
public int Duration { get; set; }
/// <summary>
/// Элементы ритуала.
/// </summary>
[Column(Order = 5)]
[Comment("Элементы ритуала")]
public ElementEnum[] Elements { get; set; } = [];
/// <summary>
/// Дальнность ритуала в футах.
/// </summary>
[Column(Order = 6)]
[Comment("Дальнность ритуала")]
public int Range { get; set; }
/// <summary>
/// Ранг основной проверки.
/// </summary>
[Column(Order = 7)]
[Comment("Ранг основной проверки")]
public TrainingRank PrimaryCheckRank { get; set; } = TrainingRank.Trained;
/// <summary>
/// Дополнительная информация об основной проверки.
/// </summary>
[Column(Order = 8)]
[Comment("Дополнительная информация об основной проверки")]
public LocaleString? PrimaryCheckSuffix { get; set; } = null;
/// <summary>
/// Количество дополнительных заклинателей, необходимых для ритуала.
/// </summary>
[Column(Order = 9)]
[Comment("Количество дополнительных заклинателей")]
public int SecondaryCasters { get; set; } = 0;
/// <summary>
/// Максимальное количество дополнительных заклинателей, необходимых для ритуала.
/// </summary>
[Column(Order = 10)]
[Comment("Максимальное количество дополнительных заклинателей")]
public int SecondaryCastersMax { get; set; } = 0;
/// <summary>
/// Дополнительная информация о дополнительных заклинателях.
/// </summary>
[Column(Order = 11)]
[Comment("Дополнительная информация о дополнительных заклинателях")]
public LocaleString? SecondaryCastersSuffix { get; set; } = null;
/// <summary>
/// Строка, описывающая дальность ритуала.
/// </summary>
[Column(Order = 12)]
[Comment("Дальность ритуала")]
public LocaleString? RangeString { get; set; } = null;
/// <summary>
/// Строка, описывающая цель ритуала.
/// </summary>
[Column(Order = 13)]
[Comment("Цель ритуала")]
public LocaleString? Target { get; set; } = null;
/// <summary>
/// Строка, описывающая стоимость ритуала.
/// </summary>
[Column(Order = 14)]
[Comment("Стоимость ритуала")]
public LocaleString? Cost { get; set; } = null;
/// <summary>
/// Строка, описывающая требования к ритуалу.
/// </summary>
[Column(Order = 15)]
[Comment("Требования к ритуалу")]
public LocaleString? Requirement { get; set; } = null;
public virtual RitualArea? Area { get; set; } = null;
/// <summary>
/// Коллекция областей ритуала.
/// </summary>
public RitualArea? Area { get; set; } = null;
public virtual ICollection<RitualCheck> Checks { get; set; } = [];
/// <summary>
/// Коллекция проверок ритуала.
/// </summary>
public ICollection<RitualCheck> Checks { get; set; } = [];
}
+24
View File
@@ -1,29 +1,53 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Base;
using Pf2eModel.Model.Enum;
namespace Pf2eModel.Model.Structure;
/// <summary>
/// Правило.
/// </summary>
[EntityOfType(EntityType.Rule)]
public class Rule : IEntity
{
/// <inheritdoc/>
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!;
/// <summary>
/// Порядок отображения.
/// </summary>
[Column(Order = 2)]
[Comment("Порядок отображения")]
public int Order { get; set; }
/// <summary>
/// Идентификатор родительского правила.
/// </summary>
[Column(Order = 3)]
[Comment("Родительского правило")]
public int? ParentId { get; set; } = null;
/// <summary>
/// Родительское правило.
/// </summary>
public Rule? Parent { get; set; } = null;
/// <summary>
/// Дочерние правила.
/// </summary>
public ICollection<Rule> Children { get; set; } = [];
/// <summary>
/// Хлебные крошки для отображения в интерфейсе.
/// </summary>
public string[] Breadcrumbs { get; set; } = [];
}
+58 -2
View File
@@ -1,5 +1,6 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Base;
using Pf2eModel.Model.Common.I18n;
using Pf2eModel.Model.Enum;
@@ -7,48 +8,97 @@ using Pf2eModel.Model.Structure.SpellRelation;
namespace Pf2eModel.Model.Structure;
/// <summary>
/// Заклинание.
/// </summary>
[EntityOfType(EntityType.Spell)]
public class Spell : IEntity
{
/// <inheritdoc/>
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!;
/// <summary>
/// Уровень заклинания.
/// </summary>
[Column(Order = 2)]
public int Level { get; set; }
/// <summary>
/// Является ли заклинание фокусом.
/// </summary>
[Column(Order = 3)]
[Comment("Фокус?")]
public bool IsFocus { get; set; }
/// <summary>
/// Количество действий, необходимых для применения заклинания.
/// </summary>
[Column(Order = 4)]
[Comment("Количество действий")]
public ActionEnum Actions { get; set; } = ActionEnum.Other;
/// <summary>
/// Время длительности заклинания в секундах.
/// </summary>
[Column(Order = 5)]
[MaxLength(255)]
[Comment("Время длительности заклинания")]
public int? Duration { get; set; } = null;
/// <summary>
/// Дальность заклинания в футах.
/// </summary>
[Column(Order = 6)]
[Comment("Дальность заклинания")]
public int Range { get; set; }
/// <summary>
/// Традиции заклинания.
/// </summary>
[Column(Order = 7)]
[Comment("Традиции заклинания")]
public SpellTradition[] Traditions { get; set; } = [];
/// <summary>
/// Элементы заклинания.
/// </summary>
[Column(Order = 8)]
[Comment("Элементы заклинания")]
public ElementEnum[] Elements { get; set; } = [];
/// <summary>
/// Триггер заклинания.
/// </summary>
[Column(Order = 9)]
[Comment("Триггер заклинания")]
public LocaleString? Trigger { get; set; } = null;
/// <summary>
/// Цель заклинания.
/// </summary>
[Column(Order = 10)]
[Comment("Цель заклинания")]
public LocaleString? Target { get; set; } = null;
/// <summary>
/// Стоимость заклинания.
/// </summary>
[Column(Order = 11)]
[Comment("Стоимость заклинания")]
public LocaleString? Cost { get; set; } = null;
/// <summary>
/// Требования к заклинанию.
/// </summary>
[Column(Order = 12)]
[Comment("Требования к заклинанию")]
public LocaleString? Requirement { get; set; } = null;
/*
@@ -78,7 +128,13 @@ public class Spell : IEntity
public bool CanHeightening { get; set; }
*/
public virtual ICollection<SpellArea> SpellAreas { get; set; } = [];
/// <summary>
/// Коллекция области заклинания.
/// </summary>
public ICollection<SpellArea> SpellAreas { get; set; } = [];
public virtual ICollection<SpellDefense> SpellDefenses { get; set; } = new List<SpellDefense>();
/// <summary>
/// Коллекция защиты от заклинания.
/// </summary>
public ICollection<SpellDefense> SpellDefenses { get; set; } = new List<SpellDefense>();
}
+24 -3
View File
@@ -1,5 +1,6 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Base;
using Pf2eModel.Model.Common.I18n;
using Pf2eModel.Model.Enum;
@@ -7,28 +8,48 @@ using Pf2eModel.Model.Structure.ClassRelation;
namespace Pf2eModel.Model.Structure;
/// <summary>
/// Подкласс.
/// </summary>
[EntityOfType(EntityType.Subclass)]
public class Subclass : IEntity
{
/// <inheritdoc/>
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!;
/// <summary>
/// Идетификатор группы подклассов.
/// </summary>
[Column(Order = 2)]
[Comment("Группа подклассов")]
public int GroupId { get; set; }
/// <summary>
/// Группа подклассов.
/// </summary>
public SubclassGroup Group { get; set; } = null!;
/// <summary>
/// Дополнительная информация.
/// </summary>
[Column(Order = 3)]
[Comment("Дополнительная информация")]
public LocaleString Additional { get; set; } = [];
/// <summary>
/// Дополнительная информация в формате JSON.
/// </summary>
[Column(Order = 4)]
// ReSharper disable once EntityFramework.ModelValidation.UnlimitedStringLength
public string Extra { get; set; } = "{}";
public virtual ICollection<Entity> Entities { get; set; } = [];
public ICollection<Entity> Entities { get; set; } = [];
public virtual ICollection<SubclassTrainings> Trainings { get; set; } = [];
public ICollection<SubclassTrainings> Trainings { get; set; } = [];
}
@@ -1,23 +1,41 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Base;
using Pf2eModel.Model.Enum;
namespace Pf2eModel.Model.Structure;
/// <summary>
/// Группа подклассов.
/// </summary>
[EntityOfType(EntityType.SubclassGroup)]
public class SubclassGroup : IEntity
{
/// <inheritdoc/>
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!;
/// <summary>
/// Идентификатор класса.
/// </summary>
[Column(Order = 2)]
[Comment("Идентификатор класса")]
public int? ClassId { get; set; } = null;
/// <summary>
/// Класс, к которому относится группа подклассов.
/// </summary>
public Class? Class { get; set; } = null!;
/// <summary>
/// Коллекция подклассов, относящихся к этой группе.
/// </summary>
public ICollection<Subclass> Subclasses { get; set; } = [];
}
+15 -2
View File
@@ -1,23 +1,36 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Pf2eModel.Model.Base;
using Pf2eModel.Model.Enum;
namespace Pf2eModel.Model.Structure;
/// <summary>
/// Признак.
/// </summary>
[EntityOfType(EntityType.Trait)]
public class Trait : IEntity
{
/// <inheritdoc/>
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column(Order = 1)]
[Comment("Идентификатор")]
public int Id { get; set; }
/// <inheritdoc/>
public Entity Entity { get; set; } = null!;
/// <summary>
/// Тип признака.
/// </summary>
[Column(Order = 2)]
[Comment("Тип признака")]
public TraitType Type { get; set; }
[Newtonsoft.Json.JsonIgnore]
public virtual ICollection<Entity> Entities { get; set; } = [];
/// <summary>
/// Сущности, которые имеют данный признак.
/// </summary>
public ICollection<Entity> Entities { get; set; } = [];
}