Больше работы над парсингом заклинаний

This commit is contained in:
2025-05-06 01:23:34 +04:00
parent c1b70a12eb
commit 5693fa8ce8
13 changed files with 279 additions and 239 deletions
@@ -90,6 +90,8 @@ internal class AonprdDataBuilder(AonprdLoader loader)
continue; continue;
} }
SubProcessProgressBar.Refresh(0, "");
SubProcessProgressBar.Max = Compendium.Count([item.Attribute.Type]); SubProcessProgressBar.Max = Compendium.Count([item.Attribute.Type]);
foreach (AonprdLoader.LoaderEntry entry in Loader.Entries(item.Attribute.Type)) foreach (AonprdLoader.LoaderEntry entry in Loader.Entries(item.Attribute.Type))
@@ -9,7 +9,7 @@ using Pf2eModel.Model.Structure;
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors.Subclasses; namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors.Subclasses;
[AonprdProcessor("apparition", ["class", "spell", "trainings"])] [AonprdProcessor("apparition", ["class", "spell", "skill"])]
internal class ApparitionProcessor(AonprdProcessorInput input) : AbstractSubclassProcessor(input) internal class ApparitionProcessor(AonprdProcessorInput input) : AbstractSubclassProcessor(input)
{ {
public override Subclass Object { get; } = new(); public override Subclass Object { get; } = new();
@@ -1,4 +1,5 @@
using Pf2eModel.Model.Common.I18n; using Newtonsoft.Json.Linq;
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.SpellRelation; using Pf2eModel.Model.Structure.SpellRelation;
@@ -21,6 +22,15 @@ internal class SpellProcessor(AonprdProcessorInput input) : AbstractEntityProces
Object.Level = Input.GetRequired<int>("level"); Object.Level = Input.GetRequired<int>("level");
Object.Actions = Input.EnumOptional("actions", ActionEnum.Unknown); Object.Actions = Input.EnumOptional("actions", ActionEnum.Unknown);
Object.IsFocus = Input.GetRequired<string>("spell_type") == "Focus"; Object.IsFocus = Input.GetRequired<string>("spell_type") == "Focus";
Object.Duration = Input.GetOptional<int>("duration", -1);
Object.Range = Input.GetOptional<int>("range", -1);
Object.Trigger = Input.GetOptionalLocale("trigger_markdown", LocaleType.English);
Object.Target = Input.GetOptionalLocale("target_markdown", LocaleType.English);
Object.Traditions = (Input.GetOptional<JArray>("tradition") ?? [])
.Select(token => Input.Enum<SpellTradition>(token.ToString()))
.ToArray();
switch (Input.GetRequired<string>("spell_type")) switch (Input.GetRequired<string>("spell_type"))
{ {
@@ -32,25 +42,78 @@ internal class SpellProcessor(AonprdProcessorInput input) : AbstractEntityProces
break; break;
} }
foreach (string areaType in Input.GetOptional<string[]>("area_type") ?? []) ProcessArea();
}
private void ProcessArea()
{
List<string> areaTypes = (Input.GetOptional<string[]>("area_type") ?? []).ToList();
switch (areaTypes.Count)
{ {
Object.SpellAreas.Add( case 0:
return;
case 1:
A(
new()
{
Spell = Object,
Type = Input.Enum<SpellAreaType>(areaTypes[0]),
Details = Input.GetOptionalLocale("area_raw", LocaleType.English),
}
);
return;
}
List<string> areaDetails = (Input.GetOptional<string>("area_raw") ?? "")
.Replace(", or", ",")
.Replace(" or ", ", ")
.Split(", ")
.ToList();
if (areaTypes.Remove("square"))
{
A(new() { Spell = Object, Type = SpellAreaType.Square });
}
if (areaTypes.Count != areaDetails.Count)
{
throw new(
$"Area details count does not match area types count for spell {Entity.Name[LocaleType.English]}"
);
}
for (int i = 0; i < areaTypes.Count; i++)
{
A(
new() new()
{ {
Spell = Object, Spell = Object,
Type = Input.EnumRequired<SpellAreaType>(areaType), Type = Input.Enum<SpellAreaType>(areaTypes[i]),
Value = 0, Details = new() { [LocaleType.English] = areaDetails[i] },
} }
); );
} }
return;
void A(SpellArea spellArea)
{
Object.SpellAreas.Add(spellArea);
Context.SpellAreas.Add(spellArea);
}
} }
protected override string GetDescription() => protected override string GetDescription() =>
base.GetDescription() base.GetDescription()
+ AddedDescription( + AddedDescription(
[ [
"area_raw", "range",
"range_raw",
"bloodline_markdown", "bloodline_markdown",
"cost_markdown",
"deity_markdown", "deity_markdown",
"domain_markdown", "domain_markdown",
"lesson_markdown", "lesson_markdown",
@@ -59,9 +122,7 @@ internal class SpellProcessor(AonprdProcessorInput input) : AbstractEntityProces
"summary_markdown", "summary_markdown",
"tradition_markdown", "tradition_markdown",
"patron_theme_markdown", "patron_theme_markdown",
"trigger_markdown",
"saving_throw_markdown", "saving_throw_markdown",
"target_markdown",
] ]
); );
} }
@@ -1,5 +1,6 @@
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using NpgsqlTypes; using NpgsqlTypes;
using Pf2eModel.Model.Common.I18n;
namespace Pf2eDataScrapper.Importers; namespace Pf2eDataScrapper.Importers;
@@ -24,6 +25,16 @@ internal class ProcessorInput(JObject input)
: token.ToObject<T>() ?? default; : token.ToObject<T>() ?? default;
} }
public virtual T GetOptional<T>(string path, T defaultValue)
{
JToken? token = Input.SelectToken(path) ?? null;
if (token is null || token.Type == JTokenType.Null)
{
return defaultValue;
}
return token.ToObject<T>() ?? defaultValue;
}
public virtual T EnumRequired<T>(string path) public virtual T EnumRequired<T>(string path)
where T : Enum where T : Enum
{ {
@@ -54,6 +65,21 @@ internal class ProcessorInput(JObject input)
} }
} }
public virtual LocaleString GetRequiredLocale(string path, LocaleType type)
{
return new() { [type] = GetRequired<string>(path) };
}
public virtual LocaleString? GetOptionalLocale(string path, LocaleType type)
{
string? value = GetOptional<string>(path);
if (value is null)
{
return null;
}
return new() { [type] = value };
}
public virtual T Enum<T>(string value) public virtual T Enum<T>(string value)
where T : Enum where T : Enum
{ {
@@ -13,7 +13,7 @@ using Pf2eModel.Model.Enum;
namespace Pf2eModel.Migrations namespace Pf2eModel.Migrations
{ {
[DbContext(typeof(Pf2eDbContext))] [DbContext(typeof(Pf2eDbContext))]
[Migration("20250505114131_1")] [Migration("20250505211157_1")]
partial class _1 partial class _1
{ {
/// <inheritdoc /> /// <inheritdoc />
@@ -25,6 +25,7 @@ namespace Pf2eModel.Migrations
.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[] { "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_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, "ancestry_vision", new[] { "normal", "low-light-vision", "dark-vision" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "ancestry_vision", new[] { "normal", "low-light-vision", "dark-vision" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "attribute_values", new[] { "free", "str", "dex", "con", "int", "wis", "cha" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "attribute_values", new[] { "free", "str", "dex", "con", "int", "wis", "cha" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "class_progression_type", new[] { "entity", "ancestry_feat", "class_feat", "general_feat", "skill_feat", "skill_increase" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "class_progression_type", new[] { "entity", "ancestry_feat", "class_feat", "general_feat", "skill_feat", "skill_increase" });
@@ -39,9 +40,10 @@ namespace Pf2eModel.Migrations
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "locale_type", new[] { "english", "legacy_english", "russian", "legacy", "hobby", "other" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "locale_type", new[] { "english", "legacy_english", "russian", "legacy", "hobby", "other" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "size", new[] { "tiny", "small", "medium", "large" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "size", new[] { "tiny", "small", "medium", "large" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "source_category", new[] { "rulebook", "adventure-path", "lost-omens", "adventures", "comics", "blog-posts", "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", "emanation", "cone", "line", "square", "cube", "cylinder" }); 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[] { "persistent", "splash" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_damage_category", new[] { "persistent", "splash" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_damage_kinds", new[] { "damage", "healing", "any" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_damage_kinds", new[] { "damage", "healing", "any" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_tradition", new[] { "none", "divine", "occult", "arcane", "primal", "elemental", "all" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "training_stage", new[] { "untrained", "trained", "expert", "master", "legendary" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "training_stage", new[] { "untrained", "trained", "expert", "master", "legendary" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "trait_type", new[] { "regular", "class", "tradition" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "trait_type", new[] { "regular", "class", "tradition" });
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
@@ -305,19 +307,19 @@ namespace Pf2eModel.Migrations
b.Property<int>("EntityId") b.Property<int>("EntityId")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("entity_id") .HasColumnName("entity_id")
.HasColumnOrder(0); .HasColumnOrder(1);
b.Property<int>("TargetId") b.Property<int>("TargetId")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("target_id") .HasColumnName("target_id")
.HasColumnOrder(1); .HasColumnOrder(2);
b.Property<string>("Md5") b.Property<string>("Md5")
.IsRequired() .IsRequired()
.HasMaxLength(32) .HasMaxLength(32)
.HasColumnType("character varying(32)") .HasColumnType("character varying(32)")
.HasColumnName("md5") .HasColumnName("md5")
.HasColumnOrder(3) .HasColumnOrder(5)
.HasComment("Контроль версии объекта"); .HasComment("Контроль версии объекта");
b.Property<string>("Suffix") b.Property<string>("Suffix")
@@ -325,7 +327,7 @@ namespace Pf2eModel.Migrations
.HasMaxLength(255) .HasMaxLength(255)
.HasColumnType("character varying(255)") .HasColumnType("character varying(255)")
.HasColumnName("suffix") .HasColumnName("suffix")
.HasColumnOrder(2) .HasColumnOrder(4)
.HasComment("Часть URL до объекта. Для источников Foundry - полный UUID объекта"); .HasComment("Часть URL до объекта. Для источников Foundry - полный UUID объекта");
b.HasKey("EntityId", "TargetId") b.HasKey("EntityId", "TargetId")
@@ -439,35 +441,15 @@ namespace Pf2eModel.Migrations
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1);
b.Property<int?>("Actions") b.Property<ActionEnum>("Actions")
.HasColumnType("integer") .HasColumnType("action_enum")
.HasColumnName("actions") .HasColumnName("actions")
.HasColumnOrder(3); .HasColumnOrder(2);
b.Property<string>("Extra") b.Property<string>("Extra")
.HasColumnType("text") .HasColumnType("text")
.HasColumnName("extra") .HasColumnName("extra")
.HasColumnOrder(6); .HasColumnOrder(3);
b.Property<bool>("IsFreeAction")
.HasColumnType("boolean")
.HasColumnName("is_free_action")
.HasColumnOrder(6);
b.Property<bool>("IsPassive")
.HasColumnType("boolean")
.HasColumnName("is_passive")
.HasColumnOrder(6);
b.Property<bool>("IsReaction")
.HasColumnType("boolean")
.HasColumnName("is_reaction")
.HasColumnOrder(5);
b.Property<int?>("MaxActions")
.HasColumnType("integer")
.HasColumnName("max_actions")
.HasColumnOrder(4);
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_actions"); .HasName("pk_actions");
@@ -775,8 +757,8 @@ namespace Pf2eModel.Migrations
.HasColumnName("spellcasting") .HasColumnName("spellcasting")
.HasColumnOrder(5); .HasColumnOrder(5);
b.Property<int>("Tradition") b.Property<SpellTradition>("Tradition")
.HasColumnType("integer") .HasColumnType("spell_tradition")
.HasColumnName("tradition") .HasColumnName("tradition")
.HasColumnOrder(6); .HasColumnOrder(6);
@@ -1263,65 +1245,47 @@ namespace Pf2eModel.Migrations
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1);
b.Property<bool>("CanHeightening") b.Property<ActionEnum>("Actions")
.HasColumnType("boolean") .HasColumnType("action_enum")
.HasColumnName("can_heightening") .HasColumnName("actions")
.HasColumnOrder(11);
b.Property<int>("Cost")
.HasColumnType("integer")
.HasColumnName("cost")
.HasColumnOrder(3); .HasColumnOrder(3);
b.Property<bool>("Counteraction") b.Property<int?>("Duration")
.HasColumnType("boolean") .HasMaxLength(255)
.HasColumnName("counteraction") .HasColumnType("integer")
.HasColumnName("duration")
.HasColumnOrder(4); .HasColumnOrder(4);
b.Property<string>("Duration") b.Property<bool>("IsFocus")
.IsRequired() .HasColumnType("boolean")
.HasMaxLength(255) .HasColumnName("is_focus")
.HasColumnType("character varying(255)") .HasColumnOrder(5);
.HasColumnName("duration")
.HasColumnOrder(6);
b.Property<int>("Level") b.Property<int>("Level")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("level") .HasColumnName("level")
.HasColumnOrder(2); .HasColumnOrder(2);
b.Property<string>("Range") b.Property<int>("Range")
.IsRequired() .HasColumnType("integer")
.HasMaxLength(255)
.HasColumnType("character varying(255)")
.HasColumnName("range") .HasColumnName("range")
.HasColumnOrder(7); .HasColumnOrder(6);
b.Property<string>("Requirements")
.IsRequired()
.HasMaxLength(255)
.HasColumnType("character varying(255)")
.HasColumnName("requirements")
.HasColumnOrder(8);
b.Property<bool>("Sustained")
.HasColumnType("boolean")
.HasColumnName("sustained")
.HasColumnOrder(5);
b.Property<string>("Target") b.Property<string>("Target")
.IsRequired() .HasColumnType("jsonb")
.HasMaxLength(255)
.HasColumnType("character varying(255)")
.HasColumnName("target") .HasColumnName("target")
.HasColumnOrder(9); .HasColumnOrder(8);
b.Property<string>("Time") b.PrimitiveCollection<SpellTradition[]>("Traditions")
.IsRequired() .IsRequired()
.HasMaxLength(255) .HasColumnType("spell_tradition[]")
.HasColumnType("character varying(255)") .HasColumnName("traditions")
.HasColumnName("time") .HasColumnOrder(6);
.HasColumnOrder(10);
b.Property<string>("Trigger")
.HasColumnType("jsonb")
.HasColumnName("trigger")
.HasColumnOrder(7);
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_spells"); .HasName("pk_spells");
@@ -1331,30 +1295,36 @@ namespace Pf2eModel.Migrations
modelBuilder.Entity("Pf2eModel.Model.Structure.SpellRelation.SpellArea", b => modelBuilder.Entity("Pf2eModel.Model.Structure.SpellRelation.SpellArea", b =>
{ {
b.Property<int>("SpellId") b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("spell_id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1);
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Details") b.Property<string>("Details")
.HasMaxLength(255) .HasMaxLength(255)
.HasColumnType("character varying(255)") .HasColumnType("jsonb")
.HasColumnName("details") .HasColumnName("details")
.HasColumnOrder(3);
b.Property<int>("SpellId")
.HasColumnType("integer")
.HasColumnName("spell_id")
.HasColumnOrder(2); .HasColumnOrder(2);
b.Property<SpellAreaType>("Type") b.Property<SpellAreaType>("Type")
.HasColumnType("spell_area_type") .HasColumnType("spell_area_type")
.HasColumnName("type") .HasColumnName("type")
.HasColumnOrder(3);
b.Property<int>("Value")
.HasColumnType("integer")
.HasColumnName("value")
.HasColumnOrder(4); .HasColumnOrder(4);
b.HasKey("SpellId") b.HasKey("Id")
.HasName("pk_spell_areas"); .HasName("pk_spell_areas");
b.HasIndex("SpellId")
.HasDatabaseName("ix_spell_areas_spell_id");
b.ToTable("spell_areas", (string)null); b.ToTable("spell_areas", (string)null);
}); });
@@ -2109,9 +2079,10 @@ namespace Pf2eModel.Migrations
modelBuilder.Entity("Pf2eModel.Model.Structure.SpellRelation.SpellArea", b => modelBuilder.Entity("Pf2eModel.Model.Structure.SpellRelation.SpellArea", b =>
{ {
b.HasOne("Pf2eModel.Model.Structure.Spell", "Spell") b.HasOne("Pf2eModel.Model.Structure.Spell", "Spell")
.WithOne("SpellArea") .WithMany("SpellAreas")
.HasForeignKey("Pf2eModel.Model.Structure.SpellRelation.SpellArea", "SpellId") .HasForeignKey("SpellId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_spell_areas_spells_spell_id"); .HasConstraintName("fk_spell_areas_spells_spell_id");
b.Navigation("Spell"); b.Navigation("Spell");
@@ -2120,7 +2091,7 @@ namespace Pf2eModel.Migrations
modelBuilder.Entity("Pf2eModel.Model.Structure.SpellRelation.SpellDamage", b => modelBuilder.Entity("Pf2eModel.Model.Structure.SpellRelation.SpellDamage", b =>
{ {
b.HasOne("Pf2eModel.Model.Structure.Spell", "Spell") b.HasOne("Pf2eModel.Model.Structure.Spell", "Spell")
.WithMany("SpellDamages") .WithMany()
.HasForeignKey("SpellId") .HasForeignKey("SpellId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired() .IsRequired()
@@ -2276,9 +2247,7 @@ namespace Pf2eModel.Migrations
modelBuilder.Entity("Pf2eModel.Model.Structure.Spell", b => modelBuilder.Entity("Pf2eModel.Model.Structure.Spell", b =>
{ {
b.Navigation("SpellArea"); b.Navigation("SpellAreas");
b.Navigation("SpellDamages");
b.Navigation("SpellDefenses"); b.Navigation("SpellDefenses");
@@ -15,6 +15,7 @@ namespace Pf2eModel.Migrations
{ {
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", "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_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:ancestry_vision", "normal,low-light-vision,dark-vision") .Annotation("Npgsql:Enum:ancestry_vision", "normal,low-light-vision,dark-vision")
.Annotation("Npgsql:Enum:attribute_values", "free,str,dex,con,int,wis,cha") .Annotation("Npgsql:Enum:attribute_values", "free,str,dex,con,int,wis,cha")
.Annotation("Npgsql:Enum:class_progression_type", "entity,ancestry_feat,class_feat,general_feat,skill_feat,skill_increase") .Annotation("Npgsql:Enum:class_progression_type", "entity,ancestry_feat,class_feat,general_feat,skill_feat,skill_increase")
@@ -29,9 +30,10 @@ namespace Pf2eModel.Migrations
.Annotation("Npgsql:Enum:locale_type", "english,legacy_english,russian,legacy,hobby,other") .Annotation("Npgsql:Enum:locale_type", "english,legacy_english,russian,legacy,hobby,other")
.Annotation("Npgsql:Enum:size", "tiny,small,medium,large") .Annotation("Npgsql:Enum:size", "tiny,small,medium,large")
.Annotation("Npgsql:Enum:source_category", "rulebook,adventure-path,lost-omens,adventures,comics,blog-posts,society") .Annotation("Npgsql:Enum:source_category", "rulebook,adventure-path,lost-omens,adventures,comics,blog-posts,society")
.Annotation("Npgsql:Enum:spell_area_type", "burst,emanation,cone,line,square,cube,cylinder") .Annotation("Npgsql:Enum:spell_area_type", "burst,emanation,cone,line,square,cube,cylinder,varies,cuboid,circle,other")
.Annotation("Npgsql:Enum:spell_damage_category", "persistent,splash") .Annotation("Npgsql:Enum:spell_damage_category", "persistent,splash")
.Annotation("Npgsql:Enum:spell_damage_kinds", "damage,healing,any") .Annotation("Npgsql:Enum:spell_damage_kinds", "damage,healing,any")
.Annotation("Npgsql:Enum:spell_tradition", "none,divine,occult,arcane,primal,elemental,all")
.Annotation("Npgsql:Enum:training_stage", "untrained,trained,expert,master,legendary") .Annotation("Npgsql:Enum:training_stage", "untrained,trained,expert,master,legendary")
.Annotation("Npgsql:Enum:trait_type", "regular,class,tradition"); .Annotation("Npgsql:Enum:trait_type", "regular,class,tradition");
@@ -133,11 +135,7 @@ namespace Pf2eModel.Migrations
columns: table => new columns: table => new
{ {
id = table.Column<int>(type: "integer", nullable: false), id = table.Column<int>(type: "integer", nullable: false),
actions = table.Column<int>(type: "integer", nullable: true), actions = table.Column<ActionEnum>(type: "action_enum", nullable: false),
max_actions = table.Column<int>(type: "integer", nullable: true),
is_reaction = 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),
extra = table.Column<string>(type: "text", nullable: true) extra = table.Column<string>(type: "text", nullable: true)
}, },
constraints: table => constraints: table =>
@@ -197,7 +195,7 @@ namespace Pf2eModel.Migrations
hp = table.Column<int>(type: "integer", nullable: false), hp = table.Column<int>(type: "integer", nullable: false),
perception = table.Column<int>(type: "integer", nullable: false), perception = table.Column<int>(type: "integer", nullable: false),
spellcasting = table.Column<bool>(type: "boolean", nullable: false), spellcasting = table.Column<bool>(type: "boolean", nullable: false),
tradition = table.Column<int>(type: "integer", nullable: false), tradition = table.Column<SpellTradition>(type: "spell_tradition", nullable: false),
additional_trained_skills = table.Column<int>(type: "integer", nullable: false) additional_trained_skills = table.Column<int>(type: "integer", nullable: false)
}, },
constraints: table => constraints: table =>
@@ -301,15 +299,13 @@ namespace Pf2eModel.Migrations
{ {
id = table.Column<int>(type: "integer", nullable: false), id = table.Column<int>(type: "integer", nullable: false),
level = table.Column<int>(type: "integer", nullable: false), level = table.Column<int>(type: "integer", nullable: false),
cost = table.Column<int>(type: "integer", nullable: false), actions = table.Column<ActionEnum>(type: "action_enum", nullable: false),
counteraction = table.Column<bool>(type: "boolean", nullable: false), duration = table.Column<int>(type: "integer", maxLength: 255, nullable: true),
sustained = table.Column<bool>(type: "boolean", nullable: false), is_focus = table.Column<bool>(type: "boolean", nullable: false),
duration = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false), traditions = table.Column<SpellTradition[]>(type: "spell_tradition[]", nullable: false),
range = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false), range = table.Column<int>(type: "integer", nullable: false),
requirements = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false), trigger = table.Column<string>(type: "jsonb", nullable: true),
target = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false), target = table.Column<string>(type: "jsonb", nullable: true)
time = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false),
can_heightening = table.Column<bool>(type: "boolean", nullable: false)
}, },
constraints: table => constraints: table =>
{ {
@@ -861,14 +857,15 @@ namespace Pf2eModel.Migrations
name: "spell_areas", name: "spell_areas",
columns: table => new columns: table => new
{ {
id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
spell_id = table.Column<int>(type: "integer", nullable: false), spell_id = table.Column<int>(type: "integer", nullable: false),
details = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: true), details = table.Column<string>(type: "jsonb", maxLength: 255, nullable: true),
type = table.Column<SpellAreaType>(type: "spell_area_type", nullable: false), type = table.Column<SpellAreaType>(type: "spell_area_type", nullable: false)
value = table.Column<int>(type: "integer", nullable: false)
}, },
constraints: table => constraints: table =>
{ {
table.PrimaryKey("pk_spell_areas", x => x.spell_id); table.PrimaryKey("pk_spell_areas", x => x.id);
table.ForeignKey( table.ForeignKey(
name: "fk_spell_areas_spells_spell_id", name: "fk_spell_areas_spells_spell_id",
column: x => x.spell_id, column: x => x.spell_id,
@@ -1206,6 +1203,11 @@ namespace Pf2eModel.Migrations
table: "languages", table: "languages",
column: "entity_id"); column: "entity_id");
migrationBuilder.CreateIndex(
name: "ix_spell_areas_spell_id",
table: "spell_areas",
column: "spell_id");
migrationBuilder.CreateIndex( migrationBuilder.CreateIndex(
name: "ix_spell_damages_spell_id", name: "ix_spell_damages_spell_id",
table: "spell_damages", table: "spell_damages",
@@ -22,6 +22,7 @@ namespace Pf2eModel.Migrations
.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[] { "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_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, "ancestry_vision", new[] { "normal", "low-light-vision", "dark-vision" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "ancestry_vision", new[] { "normal", "low-light-vision", "dark-vision" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "attribute_values", new[] { "free", "str", "dex", "con", "int", "wis", "cha" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "attribute_values", new[] { "free", "str", "dex", "con", "int", "wis", "cha" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "class_progression_type", new[] { "entity", "ancestry_feat", "class_feat", "general_feat", "skill_feat", "skill_increase" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "class_progression_type", new[] { "entity", "ancestry_feat", "class_feat", "general_feat", "skill_feat", "skill_increase" });
@@ -36,9 +37,10 @@ namespace Pf2eModel.Migrations
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "locale_type", new[] { "english", "legacy_english", "russian", "legacy", "hobby", "other" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "locale_type", new[] { "english", "legacy_english", "russian", "legacy", "hobby", "other" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "size", new[] { "tiny", "small", "medium", "large" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "size", new[] { "tiny", "small", "medium", "large" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "source_category", new[] { "rulebook", "adventure-path", "lost-omens", "adventures", "comics", "blog-posts", "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", "emanation", "cone", "line", "square", "cube", "cylinder" }); 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[] { "persistent", "splash" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_damage_category", new[] { "persistent", "splash" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_damage_kinds", new[] { "damage", "healing", "any" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_damage_kinds", new[] { "damage", "healing", "any" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_tradition", new[] { "none", "divine", "occult", "arcane", "primal", "elemental", "all" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "training_stage", new[] { "untrained", "trained", "expert", "master", "legendary" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "training_stage", new[] { "untrained", "trained", "expert", "master", "legendary" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "trait_type", new[] { "regular", "class", "tradition" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "trait_type", new[] { "regular", "class", "tradition" });
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
@@ -302,19 +304,19 @@ namespace Pf2eModel.Migrations
b.Property<int>("EntityId") b.Property<int>("EntityId")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("entity_id") .HasColumnName("entity_id")
.HasColumnOrder(0); .HasColumnOrder(1);
b.Property<int>("TargetId") b.Property<int>("TargetId")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("target_id") .HasColumnName("target_id")
.HasColumnOrder(1); .HasColumnOrder(2);
b.Property<string>("Md5") b.Property<string>("Md5")
.IsRequired() .IsRequired()
.HasMaxLength(32) .HasMaxLength(32)
.HasColumnType("character varying(32)") .HasColumnType("character varying(32)")
.HasColumnName("md5") .HasColumnName("md5")
.HasColumnOrder(3) .HasColumnOrder(5)
.HasComment("Контроль версии объекта"); .HasComment("Контроль версии объекта");
b.Property<string>("Suffix") b.Property<string>("Suffix")
@@ -322,7 +324,7 @@ namespace Pf2eModel.Migrations
.HasMaxLength(255) .HasMaxLength(255)
.HasColumnType("character varying(255)") .HasColumnType("character varying(255)")
.HasColumnName("suffix") .HasColumnName("suffix")
.HasColumnOrder(2) .HasColumnOrder(4)
.HasComment("Часть URL до объекта. Для источников Foundry - полный UUID объекта"); .HasComment("Часть URL до объекта. Для источников Foundry - полный UUID объекта");
b.HasKey("EntityId", "TargetId") b.HasKey("EntityId", "TargetId")
@@ -436,35 +438,15 @@ namespace Pf2eModel.Migrations
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1);
b.Property<int?>("Actions") b.Property<ActionEnum>("Actions")
.HasColumnType("integer") .HasColumnType("action_enum")
.HasColumnName("actions") .HasColumnName("actions")
.HasColumnOrder(3); .HasColumnOrder(2);
b.Property<string>("Extra") b.Property<string>("Extra")
.HasColumnType("text") .HasColumnType("text")
.HasColumnName("extra") .HasColumnName("extra")
.HasColumnOrder(6); .HasColumnOrder(3);
b.Property<bool>("IsFreeAction")
.HasColumnType("boolean")
.HasColumnName("is_free_action")
.HasColumnOrder(6);
b.Property<bool>("IsPassive")
.HasColumnType("boolean")
.HasColumnName("is_passive")
.HasColumnOrder(6);
b.Property<bool>("IsReaction")
.HasColumnType("boolean")
.HasColumnName("is_reaction")
.HasColumnOrder(5);
b.Property<int?>("MaxActions")
.HasColumnType("integer")
.HasColumnName("max_actions")
.HasColumnOrder(4);
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_actions"); .HasName("pk_actions");
@@ -772,8 +754,8 @@ namespace Pf2eModel.Migrations
.HasColumnName("spellcasting") .HasColumnName("spellcasting")
.HasColumnOrder(5); .HasColumnOrder(5);
b.Property<int>("Tradition") b.Property<SpellTradition>("Tradition")
.HasColumnType("integer") .HasColumnType("spell_tradition")
.HasColumnName("tradition") .HasColumnName("tradition")
.HasColumnOrder(6); .HasColumnOrder(6);
@@ -1260,65 +1242,47 @@ namespace Pf2eModel.Migrations
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1);
b.Property<bool>("CanHeightening") b.Property<ActionEnum>("Actions")
.HasColumnType("boolean") .HasColumnType("action_enum")
.HasColumnName("can_heightening") .HasColumnName("actions")
.HasColumnOrder(11);
b.Property<int>("Cost")
.HasColumnType("integer")
.HasColumnName("cost")
.HasColumnOrder(3); .HasColumnOrder(3);
b.Property<bool>("Counteraction") b.Property<int?>("Duration")
.HasColumnType("boolean") .HasMaxLength(255)
.HasColumnName("counteraction") .HasColumnType("integer")
.HasColumnName("duration")
.HasColumnOrder(4); .HasColumnOrder(4);
b.Property<string>("Duration") b.Property<bool>("IsFocus")
.IsRequired() .HasColumnType("boolean")
.HasMaxLength(255) .HasColumnName("is_focus")
.HasColumnType("character varying(255)") .HasColumnOrder(5);
.HasColumnName("duration")
.HasColumnOrder(6);
b.Property<int>("Level") b.Property<int>("Level")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("level") .HasColumnName("level")
.HasColumnOrder(2); .HasColumnOrder(2);
b.Property<string>("Range") b.Property<int>("Range")
.IsRequired() .HasColumnType("integer")
.HasMaxLength(255)
.HasColumnType("character varying(255)")
.HasColumnName("range") .HasColumnName("range")
.HasColumnOrder(7); .HasColumnOrder(6);
b.Property<string>("Requirements")
.IsRequired()
.HasMaxLength(255)
.HasColumnType("character varying(255)")
.HasColumnName("requirements")
.HasColumnOrder(8);
b.Property<bool>("Sustained")
.HasColumnType("boolean")
.HasColumnName("sustained")
.HasColumnOrder(5);
b.Property<string>("Target") b.Property<string>("Target")
.IsRequired() .HasColumnType("jsonb")
.HasMaxLength(255)
.HasColumnType("character varying(255)")
.HasColumnName("target") .HasColumnName("target")
.HasColumnOrder(9); .HasColumnOrder(8);
b.Property<string>("Time") b.PrimitiveCollection<SpellTradition[]>("Traditions")
.IsRequired() .IsRequired()
.HasMaxLength(255) .HasColumnType("spell_tradition[]")
.HasColumnType("character varying(255)") .HasColumnName("traditions")
.HasColumnName("time") .HasColumnOrder(6);
.HasColumnOrder(10);
b.Property<string>("Trigger")
.HasColumnType("jsonb")
.HasColumnName("trigger")
.HasColumnOrder(7);
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_spells"); .HasName("pk_spells");
@@ -1328,30 +1292,36 @@ namespace Pf2eModel.Migrations
modelBuilder.Entity("Pf2eModel.Model.Structure.SpellRelation.SpellArea", b => modelBuilder.Entity("Pf2eModel.Model.Structure.SpellRelation.SpellArea", b =>
{ {
b.Property<int>("SpellId") b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("spell_id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1);
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Details") b.Property<string>("Details")
.HasMaxLength(255) .HasMaxLength(255)
.HasColumnType("character varying(255)") .HasColumnType("jsonb")
.HasColumnName("details") .HasColumnName("details")
.HasColumnOrder(3);
b.Property<int>("SpellId")
.HasColumnType("integer")
.HasColumnName("spell_id")
.HasColumnOrder(2); .HasColumnOrder(2);
b.Property<SpellAreaType>("Type") b.Property<SpellAreaType>("Type")
.HasColumnType("spell_area_type") .HasColumnType("spell_area_type")
.HasColumnName("type") .HasColumnName("type")
.HasColumnOrder(3);
b.Property<int>("Value")
.HasColumnType("integer")
.HasColumnName("value")
.HasColumnOrder(4); .HasColumnOrder(4);
b.HasKey("SpellId") b.HasKey("Id")
.HasName("pk_spell_areas"); .HasName("pk_spell_areas");
b.HasIndex("SpellId")
.HasDatabaseName("ix_spell_areas_spell_id");
b.ToTable("spell_areas", (string)null); b.ToTable("spell_areas", (string)null);
}); });
@@ -2106,9 +2076,10 @@ namespace Pf2eModel.Migrations
modelBuilder.Entity("Pf2eModel.Model.Structure.SpellRelation.SpellArea", b => modelBuilder.Entity("Pf2eModel.Model.Structure.SpellRelation.SpellArea", b =>
{ {
b.HasOne("Pf2eModel.Model.Structure.Spell", "Spell") b.HasOne("Pf2eModel.Model.Structure.Spell", "Spell")
.WithOne("SpellArea") .WithMany("SpellAreas")
.HasForeignKey("Pf2eModel.Model.Structure.SpellRelation.SpellArea", "SpellId") .HasForeignKey("SpellId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_spell_areas_spells_spell_id"); .HasConstraintName("fk_spell_areas_spells_spell_id");
b.Navigation("Spell"); b.Navigation("Spell");
@@ -2117,7 +2088,7 @@ namespace Pf2eModel.Migrations
modelBuilder.Entity("Pf2eModel.Model.Structure.SpellRelation.SpellDamage", b => modelBuilder.Entity("Pf2eModel.Model.Structure.SpellRelation.SpellDamage", b =>
{ {
b.HasOne("Pf2eModel.Model.Structure.Spell", "Spell") b.HasOne("Pf2eModel.Model.Structure.Spell", "Spell")
.WithMany("SpellDamages") .WithMany()
.HasForeignKey("SpellId") .HasForeignKey("SpellId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired() .IsRequired()
@@ -2273,9 +2244,7 @@ namespace Pf2eModel.Migrations
modelBuilder.Entity("Pf2eModel.Model.Structure.Spell", b => modelBuilder.Entity("Pf2eModel.Model.Structure.Spell", b =>
{ {
b.Navigation("SpellArea"); b.Navigation("SpellAreas");
b.Navigation("SpellDamages");
b.Navigation("SpellDefenses"); b.Navigation("SpellDefenses");
+3
View File
@@ -19,6 +19,9 @@ public enum SpellTradition
[PgName("primal")] [PgName("primal")]
Primal, Primal,
[PgName("elemental")]
Elemental,
[PgName("all")] [PgName("all")]
All, All,
} }
+17 -9
View File
@@ -24,20 +24,31 @@ public class Spell : IEntity
public ActionEnum Actions { get; set; } = ActionEnum.Other; public ActionEnum Actions { get; set; } = ActionEnum.Other;
[Column(Order = 4)] [Column(Order = 4)]
[MaxLength(255)]
public int? Duration { get; set; } = null;
[Column(Order = 5)]
public bool IsFocus { get; set; } public bool IsFocus { get; set; }
// --- [Column(Order = 6)]
public SpellTradition[] Traditions { get; set; } = [];
[Column(Order = 6)]
public int Range { get; set; }
[Column(Order = 7)]
public LocaleString? Trigger { get; set; } = null;
[Column(Order = 8)]
public LocaleString? Target { get; set; } = null;
/*
[Column(Order = 4)] [Column(Order = 4)]
public bool Counteraction { get; set; } public bool Counteraction { get; set; }
[Column(Order = 5)] [Column(Order = 5)]
public bool Sustained { get; set; } public bool Sustained { get; set; }
[Column(Order = 6)]
[MaxLength(255)]
public string Duration { get; set; } = null!;
[Column(Order = 7)] [Column(Order = 7)]
[MaxLength(255)] [MaxLength(255)]
public string Range { get; set; } = null!; public string Range { get; set; } = null!;
@@ -56,14 +67,11 @@ public class Spell : IEntity
[Column(Order = 11)] [Column(Order = 11)]
public bool CanHeightening { get; set; } public bool CanHeightening { get; set; }
*/
// ---
public virtual ICollection<SpellArea> SpellAreas { get; set; } = []; public virtual ICollection<SpellArea> SpellAreas { get; set; } = [];
public virtual SpellRitual? SpellRitual { get; set; } public virtual SpellRitual? SpellRitual { get; set; }
public virtual ICollection<SpellDamage> SpellDamages { get; set; } = new List<SpellDamage>();
public virtual ICollection<SpellDefense> SpellDefenses { get; set; } = new List<SpellDefense>(); public virtual ICollection<SpellDefense> SpellDefenses { get; set; } = new List<SpellDefense>();
} }
@@ -1,5 +1,6 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using Pf2eModel.Model.Common.I18n;
using Pf2eModel.Model.Enum; using Pf2eModel.Model.Enum;
namespace Pf2eModel.Model.Structure.SpellRelation; namespace Pf2eModel.Model.Structure.SpellRelation;
@@ -7,7 +8,7 @@ namespace Pf2eModel.Model.Structure.SpellRelation;
public class SpellArea public class SpellArea
{ {
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column(Order = 1)] [Column(Order = 1)]
public int Id { get; set; } public int Id { get; set; }
@@ -16,13 +17,10 @@ public class SpellArea
[Column(Order = 3)] [Column(Order = 3)]
[MaxLength(255)] [MaxLength(255)]
public string? Details { get; set; } public LocaleString? Details { get; set; }
[Column(Order = 4)] [Column(Order = 4)]
public SpellAreaType Type { get; set; } public SpellAreaType Type { get; set; }
[Column(Order = 5)]
public int Value { get; set; }
public virtual Spell Spell { get; set; } = null!; public virtual Spell Spell { get; set; } = null!;
} }
+2
View File
@@ -123,6 +123,7 @@ public partial class Pf2eDbContext : DbContext
builder => builder =>
{ {
builder builder
.MapEnum<ActionEnum>()
.MapEnum<EntityType>() .MapEnum<EntityType>()
.MapEnum<EntityRarity>() .MapEnum<EntityRarity>()
.MapEnum<LocaleType>() .MapEnum<LocaleType>()
@@ -140,6 +141,7 @@ public partial class Pf2eDbContext : DbContext
.MapEnum<SpellAreaType>() .MapEnum<SpellAreaType>()
.MapEnum<SpellDamageCategory>() .MapEnum<SpellDamageCategory>()
.MapEnum<SpellDamageKinds>() .MapEnum<SpellDamageKinds>()
.MapEnum<SpellTradition>()
.MapEnum<AttributeValues>() .MapEnum<AttributeValues>()
.MapEnum<TrainingStage>() .MapEnum<TrainingStage>()
.MapEnum<SourceCategory>(); .MapEnum<SourceCategory>();
+13 -17
View File
@@ -46,26 +46,22 @@ public partial class Pf2eDbContext
private void BindLocaleString<T>( private void BindLocaleString<T>(
EntityTypeBuilder<T> entity, EntityTypeBuilder<T> entity,
Expression<Func<T, LocaleString>> func Expression<Func<T, LocaleString?>> func,
bool required = true
) )
where T : class where T : class
{ {
/*
entity.OwnsMany(func, d =>
{
d.ToJson();
});
*/
entity entity
.Property(func) .Property(func)
.HasConversion(v => v.Serialize(), v => LocaleString.Deserialize(v)) .HasConversion(v => v.Serialize(), v => LocaleString.Deserialize(v))
.HasColumnType("jsonb"); .HasColumnType("jsonb")
.IsRequired(required);
} }
private void DefineEnums(ModelBuilder modelBuilder) private void DefineEnums(ModelBuilder modelBuilder)
{ {
modelBuilder modelBuilder
.HasPostgresEnum<ActionEnum>()
.HasPostgresEnum<EntityType>() .HasPostgresEnum<EntityType>()
.HasPostgresEnum<EntityRarity>() .HasPostgresEnum<EntityRarity>()
.HasPostgresEnum<LocaleType>() .HasPostgresEnum<LocaleType>()
@@ -83,6 +79,7 @@ public partial class Pf2eDbContext
.HasPostgresEnum<SpellAreaType>() .HasPostgresEnum<SpellAreaType>()
.HasPostgresEnum<SpellDamageCategory>() .HasPostgresEnum<SpellDamageCategory>()
.HasPostgresEnum<SpellDamageKinds>() .HasPostgresEnum<SpellDamageKinds>()
.HasPostgresEnum<SpellTradition>()
.HasPostgresEnum<AttributeValues>() .HasPostgresEnum<AttributeValues>()
.HasPostgresEnum<TrainingStage>() .HasPostgresEnum<TrainingStage>()
.HasPostgresEnum<SourceCategory>(); .HasPostgresEnum<SourceCategory>();
@@ -437,6 +434,9 @@ public partial class Pf2eDbContext
{ {
BindEntity(entity); BindEntity(entity);
BindLocaleString(entity, s => s.Trigger, false);
BindLocaleString(entity, s => s.Target, false);
entity entity
.HasMany(e => e.SpellAreas) .HasMany(e => e.SpellAreas)
.WithOne(e => e.Spell) .WithOne(e => e.Spell)
@@ -450,20 +450,16 @@ public partial class Pf2eDbContext
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(false); .IsRequired(false);
entity
.HasMany(e => e.SpellDamages)
.WithOne(e => e.Spell)
.HasForeignKey(e => e.SpellId)
.OnDelete(DeleteBehavior.Cascade);
entity entity
.HasMany(e => e.SpellDefenses) .HasMany(e => e.SpellDefenses)
.WithOne(e => e.Spell) .WithOne(e => e.Spell)
.HasForeignKey(e => e.SpellId) .HasForeignKey(e => e.SpellId)
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade);
}); });
modelBuilder.Entity<SpellArea>(entity => { }); modelBuilder.Entity<SpellArea>(entity =>
modelBuilder.Entity<SpellDamage>(entity => { }); {
BindLocaleString(entity, a => a.Details, false);
});
modelBuilder.Entity<SpellDefense>(entity => { }); modelBuilder.Entity<SpellDefense>(entity => { });
modelBuilder.Entity<SpellRitual>(entity => { }); modelBuilder.Entity<SpellRitual>(entity => { });
+4
View File
@@ -75,6 +75,10 @@ public class EntityView
context => context =>
context.Feats.Include(f => f.Archetypes).ThenInclude(a => a.Entity).AsQueryable() context.Feats.Include(f => f.Archetypes).ThenInclude(a => a.Entity).AsQueryable()
), ),
new Getter<Spell>(
EntityType.Spell,
context => context.Spells.Include(s => s.SpellAreas).Include(s => s.SpellDefenses)
),
]; ];
private abstract class Getter(EntityType type) private abstract class Getter(EntityType type)