Продолжение

This commit is contained in:
2025-04-21 18:02:45 +04:00
parent beb61b7449
commit 35b571eb57
17 changed files with 388 additions and 227 deletions
@@ -0,0 +1,35 @@
using Pf2eModel.Model.Enum;
using Pf2eModel.Model.Structure;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors;
[AonprdProcessor("archetype")]
internal class ArchetypeProcessor(AonprdProcessorInput input) : AbstractProcessor(input)
{
public override EntityType Type => EntityType.Archetype;
public override Archetype Object { get; } = new();
protected override void Add() => Context.Archetypes.Add(Object);
public override void Process()
{
base.Process();
Object.Level = Input.GetOptional<int>("level");
}
protected override string GetDescription()
=> base.GetDescription() + AddedDescription([
"prerequisite_markdown",
"requirement_markdown",
"summary_markdown"
]);
}
@@ -1,4 +1,6 @@
using Microsoft.Extensions.Options; using LinqToDB;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using Pf2eModel.Model; using Pf2eModel.Model;
using Pf2eModel.Model.Common; using Pf2eModel.Model.Common;
@@ -76,6 +78,8 @@ internal class ClassProcessor(AonprdProcessorInput input) : AbstractProcessor(in
Object.Tradition = SpellTradition.All; Object.Tradition = SpellTradition.All;
break; break;
} }
ProcessDependecies();
} }
protected ICollection<ClassTraining> GetSkillTrainings() protected ICollection<ClassTraining> GetSkillTrainings()
@@ -192,4 +196,16 @@ internal class ClassProcessor(AonprdProcessorInput input) : AbstractProcessor(in
return classTraining; return classTraining;
}).ToList(); }).ToList();
} }
protected void ProcessDependecies()
{
Trait? classTrait = Context.Traits.FirstOrDefault(t => t.Entity.Name == Entity.Name);
if (classTrait is null)
{
return;
}
classTrait.Type = TraitType.Class;
}
} }
@@ -1,15 +1,10 @@
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using Pf2eModel.Model.Enum; using Pf2eModel.Model.Enum;
using Pf2eModel.Model.Structure; using Pf2eModel.Model.Structure;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors; namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors;
[AonprdProcessor("feat", ["trait", "source", "skill"])] [AonprdProcessor("feat", ["trait", "source", "archetype"])]
internal class FeatProcessor(AonprdProcessorInput input) : AbstractProcessor(input) internal class FeatProcessor(AonprdProcessorInput input) : AbstractProcessor(input)
{ {
public override EntityType Type => EntityType.Feat; public override EntityType Type => EntityType.Feat;
@@ -24,6 +19,9 @@ internal class FeatProcessor(AonprdProcessorInput input) : AbstractProcessor(inp
Object.Level = Input.GetRequired<int>("level"); Object.Level = Input.GetRequired<int>("level");
Object.Category = (Entity.Traits.Any(t => t.Type == TraitType.Class))
? ActionCategory.ClassFeat
: ActionCategory.Unknown;
AonprdProcessorInput.ActionStruct action = Input.ResolveActionString(Input.GetOptional<string>("actions") ?? ""); AonprdProcessorInput.ActionStruct action = Input.ResolveActionString(Input.GetOptional<string>("actions") ?? "");
Object.Actions = action.Actions; Object.Actions = action.Actions;
@@ -32,10 +30,6 @@ internal class FeatProcessor(AonprdProcessorInput input) : AbstractProcessor(inp
Object.IsPassive = action.IsPassive; Object.IsPassive = action.IsPassive;
Object.IsReaction = action.IsReaction; Object.IsReaction = action.IsReaction;
Object.Extra = GenerateExtra( Object.Extra = GenerateExtra(
"archetype", "archetype",
"element", "element",
@@ -46,7 +40,24 @@ internal class FeatProcessor(AonprdProcessorInput input) : AbstractProcessor(inp
"frequency" "frequency"
); );
string[] archetypeStrings = Input.GetOptional<JArray>("archetype")?.Select(t => t.ToString()).ToArray() ?? [];
var archetypes = Context.Archetypes.Where(a => archetypeStrings.Contains(a.Entity.Name)).ToArray();
if (archetypes.Length != 0)
{
Object.Category = ActionCategory.Archetype;
}
foreach (var archetype in archetypes)
{
Object.Archetypes.Add(archetype);
if (Entity.Name.Contains("Dedication"))
{
archetype.DedicationFeat = Object;
}
}
} }
protected override string GetDescription() protected override string GetDescription()
@@ -13,7 +13,7 @@ using Pf2eModel.Model.Enum;
namespace Pf2eModel.Migrations namespace Pf2eModel.Migrations
{ {
[DbContext(typeof(Pf2eDbContext))] [DbContext(typeof(Pf2eDbContext))]
[Migration("20250420145024_1")] [Migration("20250421123520_1")]
partial class _1 partial class _1
{ {
/// <inheritdoc /> /// <inheritdoc />
@@ -24,7 +24,7 @@ namespace Pf2eModel.Migrations
.HasAnnotation("ProductVersion", "9.0.4") .HasAnnotation("ProductVersion", "9.0.4")
.HasAnnotation("Relational:MaxIdentifierLength", 63); .HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "action_category", new[] { "unknown", "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, "alias_type", new[] { "legacy", "english", "legacy_english", "hobby", "other" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "alias_type", new[] { "legacy", "english", "legacy_english", "hobby", "other" });
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" });
@@ -36,14 +36,14 @@ namespace Pf2eModel.Migrations
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_rarity", new[] { "common", "uncommon", "rare", "unique" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_rarity", new[] { "common", "uncommon", "rare", "unique" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_type", new[] { "unknown", "trait", "action", "ancestry", "archetype", "background", "backpack", "campaign_feature", "class", "condition", "deity", "feat", "heritage", "spell", "language" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_type", new[] { "unknown", "trait", "action", "ancestry", "archetype", "background", "backpack", "campaign_feature", "class", "condition", "deity", "feat", "heritage", "spell", "language" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "feat_action_type", new[] { "passive", "action", "reaction", "free" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "feat_action_type", new[] { "passive", "action", "reaction", "free" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "feat_category", new[] { "ancestryfeature", "classfeature", "calling", "class", "skill", "general", "ancestry", "bonus", "deityboon", "curse", "pfsboon", "campaign_feature" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "feat_category", new[] { "uncategorized", "ancestry-feature", "class-feature", "calling", "class", "skill", "general", "ancestry", "bonus", "deityboon", "curse", "pfsboon", "campaign-feature" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "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" });
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, "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", "tradition" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "trait_type", new[] { "regular", "class", "tradition" });
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("DeityTraining", b => modelBuilder.Entity("DeityTraining", b =>
@@ -622,7 +622,7 @@ namespace Pf2eModel.Migrations
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1);
b.Property<int>("DedicationFeatId") b.Property<int?>("DedicationFeatId")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("dedication_feat_id") .HasColumnName("dedication_feat_id")
.HasColumnOrder(3); .HasColumnOrder(3);
@@ -638,13 +638,32 @@ namespace Pf2eModel.Migrations
.HasColumnOrder(2); .HasColumnOrder(2);
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_archetype"); .HasName("pk_archetypes");
b.HasIndex("DedicationFeatId") b.HasIndex("DedicationFeatId")
.IsUnique() .IsUnique()
.HasDatabaseName("ix_archetype_dedication_feat_id"); .HasDatabaseName("ix_archetypes_dedication_feat_id");
b.ToTable("archetype", (string)null); b.ToTable("archetypes", (string)null);
});
modelBuilder.Entity("Pf2eModel.Model.Structure.ArchetypeRelation.ArchetypeFeats", b =>
{
b.Property<int>("ArchetypeId")
.HasColumnType("integer")
.HasColumnName("archetype_id");
b.Property<int>("FeatId")
.HasColumnType("integer")
.HasColumnName("feat_id");
b.HasKey("ArchetypeId", "FeatId")
.HasName("pk_archetype_feats");
b.HasIndex("FeatId")
.HasDatabaseName("ix_archetype_feats_feat_id");
b.ToTable("archetype_feats", (string)null);
}); });
modelBuilder.Entity("Pf2eModel.Model.Structure.Background", b => modelBuilder.Entity("Pf2eModel.Model.Structure.Background", b =>
@@ -1091,11 +1110,6 @@ namespace Pf2eModel.Migrations
.HasColumnName("actions") .HasColumnName("actions")
.HasColumnOrder(5); .HasColumnOrder(5);
b.Property<int>("ArchetypeId")
.HasColumnType("integer")
.HasColumnName("archetype_id")
.HasColumnOrder(10);
b.Property<ActionCategory>("Category") b.Property<ActionCategory>("Category")
.HasColumnType("action_category") .HasColumnType("action_category")
.HasColumnName("category") .HasColumnName("category")
@@ -1104,7 +1118,7 @@ namespace Pf2eModel.Migrations
b.Property<string>("Extra") b.Property<string>("Extra")
.HasColumnType("text") .HasColumnType("text")
.HasColumnName("extra") .HasColumnName("extra")
.HasColumnOrder(11); .HasColumnOrder(10);
b.Property<bool>("IsFreeAction") b.Property<bool>("IsFreeAction")
.HasColumnType("boolean") .HasColumnType("boolean")
@@ -1134,9 +1148,6 @@ namespace Pf2eModel.Migrations
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_feats"); .HasName("pk_feats");
b.HasIndex("ArchetypeId")
.HasDatabaseName("ix_feats_archetype_id");
b.ToTable("feats", (string)null); b.ToTable("feats", (string)null);
}); });
@@ -1675,21 +1686,37 @@ namespace Pf2eModel.Migrations
.WithOne() .WithOne()
.HasForeignKey("Pf2eModel.Model.Structure.Archetype", "DedicationFeatId") .HasForeignKey("Pf2eModel.Model.Structure.Archetype", "DedicationFeatId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired() .HasConstraintName("fk_archetypes_feats_dedication_feat_id");
.HasConstraintName("fk_archetype_feats_dedication_feat_id");
b.HasOne("Pf2eModel.Model.Base.Entity", "Entity") b.HasOne("Pf2eModel.Model.Base.Entity", "Entity")
.WithOne() .WithOne()
.HasForeignKey("Pf2eModel.Model.Structure.Archetype", "Id") .HasForeignKey("Pf2eModel.Model.Structure.Archetype", "Id")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired() .IsRequired()
.HasConstraintName("fk_archetype_entities_id"); .HasConstraintName("fk_archetypes_entities_id");
b.Navigation("DedicationFeat"); b.Navigation("DedicationFeat");
b.Navigation("Entity"); b.Navigation("Entity");
}); });
modelBuilder.Entity("Pf2eModel.Model.Structure.ArchetypeRelation.ArchetypeFeats", b =>
{
b.HasOne("Pf2eModel.Model.Structure.Archetype", null)
.WithMany()
.HasForeignKey("ArchetypeId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_archetype_feats_archetypes_archetype_id");
b.HasOne("Pf2eModel.Model.Structure.Feat", null)
.WithMany()
.HasForeignKey("FeatId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_archetype_feats_feats_feat_id");
});
modelBuilder.Entity("Pf2eModel.Model.Structure.Background", b => modelBuilder.Entity("Pf2eModel.Model.Structure.Background", b =>
{ {
b.HasOne("Pf2eModel.Model.Base.Entity", "Entity") b.HasOne("Pf2eModel.Model.Base.Entity", "Entity")
@@ -1903,13 +1930,6 @@ namespace Pf2eModel.Migrations
modelBuilder.Entity("Pf2eModel.Model.Structure.Feat", b => modelBuilder.Entity("Pf2eModel.Model.Structure.Feat", b =>
{ {
b.HasOne("Pf2eModel.Model.Structure.Archetype", "Archetype")
.WithMany("Feats")
.HasForeignKey("ArchetypeId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_feats_archetype_archetype_id");
b.HasOne("Pf2eModel.Model.Base.Entity", "Entity") b.HasOne("Pf2eModel.Model.Base.Entity", "Entity")
.WithOne() .WithOne()
.HasForeignKey("Pf2eModel.Model.Structure.Feat", "Id") .HasForeignKey("Pf2eModel.Model.Structure.Feat", "Id")
@@ -1917,8 +1937,6 @@ namespace Pf2eModel.Migrations
.IsRequired() .IsRequired()
.HasConstraintName("fk_feats_entities_id"); .HasConstraintName("fk_feats_entities_id");
b.Navigation("Archetype");
b.Navigation("Entity"); b.Navigation("Entity");
}); });
@@ -2071,11 +2089,6 @@ namespace Pf2eModel.Migrations
b.Navigation("Heritages"); b.Navigation("Heritages");
}); });
modelBuilder.Entity("Pf2eModel.Model.Structure.Archetype", b =>
{
b.Navigation("Feats");
});
modelBuilder.Entity("Pf2eModel.Model.Structure.Background", b => modelBuilder.Entity("Pf2eModel.Model.Structure.Background", b =>
{ {
b.Navigation("BackgroundBoosts"); b.Navigation("BackgroundBoosts");
@@ -14,7 +14,7 @@ namespace Pf2eModel.Migrations
protected override void Up(MigrationBuilder migrationBuilder) protected override void Up(MigrationBuilder migrationBuilder)
{ {
migrationBuilder.AlterDatabase() migrationBuilder.AlterDatabase()
.Annotation("Npgsql:Enum:action_category", "unknown,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:alias_type", "legacy,english,legacy_english,hobby,other") .Annotation("Npgsql:Enum:alias_type", "legacy,english,legacy_english,hobby,other")
.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")
@@ -26,14 +26,14 @@ namespace Pf2eModel.Migrations
.Annotation("Npgsql:Enum:entity_rarity", "common,uncommon,rare,unique") .Annotation("Npgsql:Enum:entity_rarity", "common,uncommon,rare,unique")
.Annotation("Npgsql:Enum:entity_type", "unknown,trait,action,ancestry,archetype,background,backpack,campaign_feature,class,condition,deity,feat,heritage,spell,language") .Annotation("Npgsql:Enum:entity_type", "unknown,trait,action,ancestry,archetype,background,backpack,campaign_feature,class,condition,deity,feat,heritage,spell,language")
.Annotation("Npgsql:Enum:feat_action_type", "passive,action,reaction,free") .Annotation("Npgsql:Enum:feat_action_type", "passive,action,reaction,free")
.Annotation("Npgsql:Enum:feat_category", "ancestryfeature,classfeature,calling,class,skill,general,ancestry,bonus,deityboon,curse,pfsboon,campaign_feature") .Annotation("Npgsql:Enum:feat_category", "uncategorized,ancestry-feature,class-feature,calling,class,skill,general,ancestry,bonus,deityboon,curse,pfsboon,campaign-feature")
.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")
.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:training_stage", "untrained,trained,expert,master,legendary") .Annotation("Npgsql:Enum:training_stage", "untrained,trained,expert,master,legendary")
.Annotation("Npgsql:Enum:trait_type", "regular,tradition"); .Annotation("Npgsql:Enum:trait_type", "regular,class,tradition");
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
name: "entities", name: "entities",
@@ -269,6 +269,31 @@ namespace Pf2eModel.Migrations
onDelete: ReferentialAction.Cascade); onDelete: ReferentialAction.Cascade);
}); });
migrationBuilder.CreateTable(
name: "feats",
columns: table => new
{
id = table.Column<int>(type: "integer", nullable: false),
category = table.Column<ActionCategory>(type: "action_category", nullable: false),
level = table.Column<int>(type: "integer", nullable: false),
actions = table.Column<int>(type: "integer", nullable: true),
max_actions = table.Column<int>(type: "integer", nullable: true),
is_reaction = table.Column<bool>(type: "boolean", nullable: false),
is_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)
},
constraints: table =>
{
table.PrimaryKey("pk_feats", x => x.id);
table.ForeignKey(
name: "fk_feats_entities_id",
column: x => x.id,
principalTable: "entities",
principalColumn: "id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
name: "languages", name: "languages",
columns: table => new columns: table => new
@@ -729,6 +754,52 @@ namespace Pf2eModel.Migrations
onDelete: ReferentialAction.Cascade); onDelete: ReferentialAction.Cascade);
}); });
migrationBuilder.CreateTable(
name: "archetypes",
columns: table => new
{
id = table.Column<int>(type: "integer", nullable: false),
level = table.Column<int>(type: "integer", nullable: false),
dedication_feat_id = table.Column<int>(type: "integer", nullable: true),
extra = table.Column<string>(type: "text", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("pk_archetypes", x => x.id);
table.ForeignKey(
name: "fk_archetypes_entities_id",
column: x => x.id,
principalTable: "entities",
principalColumn: "id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "fk_archetypes_feats_dedication_feat_id",
column: x => x.dedication_feat_id,
principalTable: "feats",
principalColumn: "id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "feat_prerequisites",
columns: table => new
{
id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
feat_id = table.Column<int>(type: "integer", nullable: false),
value = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false)
},
constraints: table =>
{
table.PrimaryKey("pk_feat_prerequisites", x => x.id);
table.ForeignKey(
name: "fk_feat_prerequisites_feats_feat_id",
column: x => x.feat_id,
principalTable: "feats",
principalColumn: "id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
name: "ancestry_languages", name: "ancestry_languages",
columns: table => new columns: table => new
@@ -894,71 +965,23 @@ namespace Pf2eModel.Migrations
}); });
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
name: "archetype", name: "archetype_feats",
columns: table => new columns: table => new
{ {
id = table.Column<int>(type: "integer", nullable: false),
level = table.Column<int>(type: "integer", nullable: false),
dedication_feat_id = table.Column<int>(type: "integer", nullable: false),
extra = table.Column<string>(type: "text", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("pk_archetype", x => x.id);
table.ForeignKey(
name: "fk_archetype_entities_id",
column: x => x.id,
principalTable: "entities",
principalColumn: "id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "feats",
columns: table => new
{
id = table.Column<int>(type: "integer", nullable: false),
category = table.Column<ActionCategory>(type: "action_category", nullable: false),
level = table.Column<int>(type: "integer", nullable: false),
actions = table.Column<int>(type: "integer", nullable: true),
max_actions = table.Column<int>(type: "integer", nullable: true),
is_reaction = table.Column<bool>(type: "boolean", nullable: false),
is_free_action = table.Column<bool>(type: "boolean", nullable: false),
is_passive = table.Column<bool>(type: "boolean", nullable: false),
archetype_id = table.Column<int>(type: "integer", nullable: false), archetype_id = table.Column<int>(type: "integer", nullable: false),
extra = table.Column<string>(type: "text", nullable: true) feat_id = table.Column<int>(type: "integer", nullable: false)
}, },
constraints: table => constraints: table =>
{ {
table.PrimaryKey("pk_feats", x => x.id); table.PrimaryKey("pk_archetype_feats", x => new { x.archetype_id, x.feat_id });
table.ForeignKey( table.ForeignKey(
name: "fk_feats_archetype_archetype_id", name: "fk_archetype_feats_archetypes_archetype_id",
column: x => x.archetype_id, column: x => x.archetype_id,
principalTable: "archetype", principalTable: "archetypes",
principalColumn: "id", principalColumn: "id",
onDelete: ReferentialAction.Cascade); onDelete: ReferentialAction.Cascade);
table.ForeignKey( table.ForeignKey(
name: "fk_feats_entities_id", name: "fk_archetype_feats_feats_feat_id",
column: x => x.id,
principalTable: "entities",
principalColumn: "id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "feat_prerequisites",
columns: table => new
{
id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
feat_id = table.Column<int>(type: "integer", nullable: false),
value = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false)
},
constraints: table =>
{
table.PrimaryKey("pk_feat_prerequisites", x => x.id);
table.ForeignKey(
name: "fk_feat_prerequisites_feats_feat_id",
column: x => x.feat_id, column: x => x.feat_id,
principalTable: "feats", principalTable: "feats",
principalColumn: "id", principalColumn: "id",
@@ -981,8 +1004,13 @@ namespace Pf2eModel.Migrations
column: "language_id"); column: "language_id");
migrationBuilder.CreateIndex( migrationBuilder.CreateIndex(
name: "ix_archetype_dedication_feat_id", name: "ix_archetype_feats_feat_id",
table: "archetype", table: "archetype_feats",
column: "feat_id");
migrationBuilder.CreateIndex(
name: "ix_archetypes_dedication_feat_id",
table: "archetypes",
column: "dedication_feat_id", column: "dedication_feat_id",
unique: true); unique: true);
@@ -1081,11 +1109,6 @@ namespace Pf2eModel.Migrations
table: "feat_prerequisites", table: "feat_prerequisites",
column: "feat_id"); column: "feat_id");
migrationBuilder.CreateIndex(
name: "ix_feats_archetype_id",
table: "feats",
column: "archetype_id");
migrationBuilder.CreateIndex( migrationBuilder.CreateIndex(
name: "ix_heritages_ancestry_id", name: "ix_heritages_ancestry_id",
table: "heritages", table: "heritages",
@@ -1110,31 +1133,11 @@ namespace Pf2eModel.Migrations
name: "ix_spell_defenses_spell_id", name: "ix_spell_defenses_spell_id",
table: "spell_defenses", table: "spell_defenses",
column: "spell_id"); column: "spell_id");
migrationBuilder.AddForeignKey(
name: "fk_archetype_feats_dedication_feat_id",
table: "archetype",
column: "dedication_feat_id",
principalTable: "feats",
principalColumn: "id",
onDelete: ReferentialAction.Cascade);
} }
/// <inheritdoc /> /// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder) protected override void Down(MigrationBuilder migrationBuilder)
{ {
migrationBuilder.DropForeignKey(
name: "fk_archetype_entities_id",
table: "archetype");
migrationBuilder.DropForeignKey(
name: "fk_feats_entities_id",
table: "feats");
migrationBuilder.DropForeignKey(
name: "fk_archetype_feats_dedication_feat_id",
table: "archetype");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "actions"); name: "actions");
@@ -1147,6 +1150,9 @@ namespace Pf2eModel.Migrations
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "ancestry_languages"); name: "ancestry_languages");
migrationBuilder.DropTable(
name: "archetype_feats");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "background_boosts"); name: "background_boosts");
@@ -1225,6 +1231,9 @@ namespace Pf2eModel.Migrations
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "languages"); name: "languages");
migrationBuilder.DropTable(
name: "archetypes");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "backgrounds"); name: "backgrounds");
@@ -1255,14 +1264,11 @@ namespace Pf2eModel.Migrations
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "spells"); name: "spells");
migrationBuilder.DropTable(
name: "entities");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "feats"); name: "feats");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "archetype"); name: "entities");
} }
} }
} }
@@ -21,7 +21,7 @@ namespace Pf2eModel.Migrations
.HasAnnotation("ProductVersion", "9.0.4") .HasAnnotation("ProductVersion", "9.0.4")
.HasAnnotation("Relational:MaxIdentifierLength", 63); .HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "action_category", new[] { "unknown", "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, "alias_type", new[] { "legacy", "english", "legacy_english", "hobby", "other" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "alias_type", new[] { "legacy", "english", "legacy_english", "hobby", "other" });
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" });
@@ -33,14 +33,14 @@ namespace Pf2eModel.Migrations
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_rarity", new[] { "common", "uncommon", "rare", "unique" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_rarity", new[] { "common", "uncommon", "rare", "unique" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_type", new[] { "unknown", "trait", "action", "ancestry", "archetype", "background", "backpack", "campaign_feature", "class", "condition", "deity", "feat", "heritage", "spell", "language" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_type", new[] { "unknown", "trait", "action", "ancestry", "archetype", "background", "backpack", "campaign_feature", "class", "condition", "deity", "feat", "heritage", "spell", "language" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "feat_action_type", new[] { "passive", "action", "reaction", "free" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "feat_action_type", new[] { "passive", "action", "reaction", "free" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "feat_category", new[] { "ancestryfeature", "classfeature", "calling", "class", "skill", "general", "ancestry", "bonus", "deityboon", "curse", "pfsboon", "campaign_feature" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "feat_category", new[] { "uncategorized", "ancestry-feature", "class-feature", "calling", "class", "skill", "general", "ancestry", "bonus", "deityboon", "curse", "pfsboon", "campaign-feature" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "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" });
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, "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", "tradition" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "trait_type", new[] { "regular", "class", "tradition" });
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("DeityTraining", b => modelBuilder.Entity("DeityTraining", b =>
@@ -619,7 +619,7 @@ namespace Pf2eModel.Migrations
.HasColumnName("id") .HasColumnName("id")
.HasColumnOrder(1); .HasColumnOrder(1);
b.Property<int>("DedicationFeatId") b.Property<int?>("DedicationFeatId")
.HasColumnType("integer") .HasColumnType("integer")
.HasColumnName("dedication_feat_id") .HasColumnName("dedication_feat_id")
.HasColumnOrder(3); .HasColumnOrder(3);
@@ -635,13 +635,32 @@ namespace Pf2eModel.Migrations
.HasColumnOrder(2); .HasColumnOrder(2);
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_archetype"); .HasName("pk_archetypes");
b.HasIndex("DedicationFeatId") b.HasIndex("DedicationFeatId")
.IsUnique() .IsUnique()
.HasDatabaseName("ix_archetype_dedication_feat_id"); .HasDatabaseName("ix_archetypes_dedication_feat_id");
b.ToTable("archetype", (string)null); b.ToTable("archetypes", (string)null);
});
modelBuilder.Entity("Pf2eModel.Model.Structure.ArchetypeRelation.ArchetypeFeats", b =>
{
b.Property<int>("ArchetypeId")
.HasColumnType("integer")
.HasColumnName("archetype_id");
b.Property<int>("FeatId")
.HasColumnType("integer")
.HasColumnName("feat_id");
b.HasKey("ArchetypeId", "FeatId")
.HasName("pk_archetype_feats");
b.HasIndex("FeatId")
.HasDatabaseName("ix_archetype_feats_feat_id");
b.ToTable("archetype_feats", (string)null);
}); });
modelBuilder.Entity("Pf2eModel.Model.Structure.Background", b => modelBuilder.Entity("Pf2eModel.Model.Structure.Background", b =>
@@ -1088,11 +1107,6 @@ namespace Pf2eModel.Migrations
.HasColumnName("actions") .HasColumnName("actions")
.HasColumnOrder(5); .HasColumnOrder(5);
b.Property<int>("ArchetypeId")
.HasColumnType("integer")
.HasColumnName("archetype_id")
.HasColumnOrder(10);
b.Property<ActionCategory>("Category") b.Property<ActionCategory>("Category")
.HasColumnType("action_category") .HasColumnType("action_category")
.HasColumnName("category") .HasColumnName("category")
@@ -1101,7 +1115,7 @@ namespace Pf2eModel.Migrations
b.Property<string>("Extra") b.Property<string>("Extra")
.HasColumnType("text") .HasColumnType("text")
.HasColumnName("extra") .HasColumnName("extra")
.HasColumnOrder(11); .HasColumnOrder(10);
b.Property<bool>("IsFreeAction") b.Property<bool>("IsFreeAction")
.HasColumnType("boolean") .HasColumnType("boolean")
@@ -1131,9 +1145,6 @@ namespace Pf2eModel.Migrations
b.HasKey("Id") b.HasKey("Id")
.HasName("pk_feats"); .HasName("pk_feats");
b.HasIndex("ArchetypeId")
.HasDatabaseName("ix_feats_archetype_id");
b.ToTable("feats", (string)null); b.ToTable("feats", (string)null);
}); });
@@ -1672,21 +1683,37 @@ namespace Pf2eModel.Migrations
.WithOne() .WithOne()
.HasForeignKey("Pf2eModel.Model.Structure.Archetype", "DedicationFeatId") .HasForeignKey("Pf2eModel.Model.Structure.Archetype", "DedicationFeatId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired() .HasConstraintName("fk_archetypes_feats_dedication_feat_id");
.HasConstraintName("fk_archetype_feats_dedication_feat_id");
b.HasOne("Pf2eModel.Model.Base.Entity", "Entity") b.HasOne("Pf2eModel.Model.Base.Entity", "Entity")
.WithOne() .WithOne()
.HasForeignKey("Pf2eModel.Model.Structure.Archetype", "Id") .HasForeignKey("Pf2eModel.Model.Structure.Archetype", "Id")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired() .IsRequired()
.HasConstraintName("fk_archetype_entities_id"); .HasConstraintName("fk_archetypes_entities_id");
b.Navigation("DedicationFeat"); b.Navigation("DedicationFeat");
b.Navigation("Entity"); b.Navigation("Entity");
}); });
modelBuilder.Entity("Pf2eModel.Model.Structure.ArchetypeRelation.ArchetypeFeats", b =>
{
b.HasOne("Pf2eModel.Model.Structure.Archetype", null)
.WithMany()
.HasForeignKey("ArchetypeId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_archetype_feats_archetypes_archetype_id");
b.HasOne("Pf2eModel.Model.Structure.Feat", null)
.WithMany()
.HasForeignKey("FeatId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_archetype_feats_feats_feat_id");
});
modelBuilder.Entity("Pf2eModel.Model.Structure.Background", b => modelBuilder.Entity("Pf2eModel.Model.Structure.Background", b =>
{ {
b.HasOne("Pf2eModel.Model.Base.Entity", "Entity") b.HasOne("Pf2eModel.Model.Base.Entity", "Entity")
@@ -1900,13 +1927,6 @@ namespace Pf2eModel.Migrations
modelBuilder.Entity("Pf2eModel.Model.Structure.Feat", b => modelBuilder.Entity("Pf2eModel.Model.Structure.Feat", b =>
{ {
b.HasOne("Pf2eModel.Model.Structure.Archetype", "Archetype")
.WithMany("Feats")
.HasForeignKey("ArchetypeId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_feats_archetype_archetype_id");
b.HasOne("Pf2eModel.Model.Base.Entity", "Entity") b.HasOne("Pf2eModel.Model.Base.Entity", "Entity")
.WithOne() .WithOne()
.HasForeignKey("Pf2eModel.Model.Structure.Feat", "Id") .HasForeignKey("Pf2eModel.Model.Structure.Feat", "Id")
@@ -1914,8 +1934,6 @@ namespace Pf2eModel.Migrations
.IsRequired() .IsRequired()
.HasConstraintName("fk_feats_entities_id"); .HasConstraintName("fk_feats_entities_id");
b.Navigation("Archetype");
b.Navigation("Entity"); b.Navigation("Entity");
}); });
@@ -2068,11 +2086,6 @@ namespace Pf2eModel.Migrations
b.Navigation("Heritages"); b.Navigation("Heritages");
}); });
modelBuilder.Entity("Pf2eModel.Model.Structure.Archetype", b =>
{
b.Navigation("Feats");
});
modelBuilder.Entity("Pf2eModel.Model.Structure.Background", b => modelBuilder.Entity("Pf2eModel.Model.Structure.Background", b =>
{ {
b.Navigation("BackgroundBoosts"); b.Navigation("BackgroundBoosts");
+13
View File
@@ -6,6 +6,19 @@ public enum ActionCategory
{ {
Unknown, Unknown,
[PgName("archetype")]
Archetype,
[PgName("class-feature")]
ClassFeature,
[PgName("class-feat")]
ClassFeat,
[PgName("offensive")] [PgName("offensive")]
Offensive, Offensive,
+8 -5
View File
@@ -4,11 +4,14 @@ namespace Pf2eModel.Model.Enum;
public enum FeatCategory public enum FeatCategory
{ {
[PgName("ancestryfeature")] [PgName("uncategorized")]
Ancestryfeature, Uncategorized,
[PgName("classfeature")] [PgName("ancestry-feature")]
Classfeature, AncestryFeature,
[PgName("class-feature")]
ClassFeature,
[PgName("calling")] [PgName("calling")]
Calling, Calling,
@@ -37,6 +40,6 @@ public enum FeatCategory
[PgName("pfsboon")] [PgName("pfsboon")]
Pfsboon, Pfsboon,
[PgName("campaign_feature")] [PgName("campaign-feature")]
CampaignFeature, CampaignFeature,
} }
+3
View File
@@ -7,6 +7,9 @@ public enum TraitType
[PgName("regular")] [PgName("regular")]
Regular, Regular,
[PgName("class")]
Class,
[PgName("tradition")] [PgName("tradition")]
Tradition Tradition
} }
+3 -1
View File
@@ -1,4 +1,5 @@
using Pf2eModel.Model.Base; using Pf2eModel.Model.Base;
using Pf2eModel.Model.Enum;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
@@ -9,6 +10,7 @@ using System.Threading.Tasks;
namespace Pf2eModel.Model.Structure; namespace Pf2eModel.Model.Structure;
[EntityOfType(EntityType.Archetype)]
public class Archetype : IEntity public class Archetype : IEntity
{ {
[Key] [Key]
@@ -21,7 +23,7 @@ public class Archetype : IEntity
public int Level { get; set; } public int Level { get; set; }
[Column(Order = 3)] [Column(Order = 3)]
public int DedicationFeatId { get; set; } public int? DedicationFeatId { get; set; } = null;
[Column(Order = 4)] [Column(Order = 4)]
public string? Extra { get; set; } public string? Extra { get; set; }
@@ -0,0 +1,16 @@
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Pf2eModel.Model.Structure.ArchetypeRelation;
[PrimaryKey(nameof(ArchetypeId), nameof(FeatId))]
internal class ArchetypeFeats
{
public int ArchetypeId { get; set; }
public int FeatId { get; set; }
}
+2 -4
View File
@@ -37,13 +37,11 @@ public partial class Feat : IEntity
[Column(Order = 9)] [Column(Order = 9)]
public bool IsPassive { get; set; } = false; public bool IsPassive { get; set; } = false;
[Column(Order = 10)]
public int ArchetypeId { get; set; }
[Column(Order = 11)] [Column(Order = 10)]
public string? Extra { get; set; } public string? Extra { get; set; }
public Archetype Archetype { get; set; } = null!; public virtual ICollection<Archetype> Archetypes { get; set; } = [];
public virtual ICollection<FeatPrerequisite> FeatPrerequisites { get; set; } = []; public virtual ICollection<FeatPrerequisite> FeatPrerequisites { get; set; } = [];
} }
+2
View File
@@ -34,6 +34,8 @@ public partial class Pf2eDbContext : DbContext
public virtual DbSet<Ancestry> Ancestries { get; set; } public virtual DbSet<Ancestry> Ancestries { get; set; }
public virtual DbSet<Archetype> Archetypes { get; set; }
public virtual DbSet<AncestryBoost> AncestryBoosts { get; set; } public virtual DbSet<AncestryBoost> AncestryBoosts { get; set; }
public virtual DbSet<AncestryItem> AncestryItems { get; set; } public virtual DbSet<AncestryItem> AncestryItems { get; set; }
+6 -3
View File
@@ -9,6 +9,7 @@ using Pf2eModel.Model.Common;
using Pf2eModel.Model.Enum; using Pf2eModel.Model.Enum;
using Pf2eModel.Model.Structure; using Pf2eModel.Model.Structure;
using Pf2eModel.Model.Structure.AncestryRelation; using Pf2eModel.Model.Structure.AncestryRelation;
using Pf2eModel.Model.Structure.ArchetypeRelation;
using Pf2eModel.Model.Structure.BackgroundRelation; using Pf2eModel.Model.Structure.BackgroundRelation;
using Pf2eModel.Model.Structure.ClassRelation; using Pf2eModel.Model.Structure.ClassRelation;
using Pf2eModel.Model.Structure.DeityRelation; using Pf2eModel.Model.Structure.DeityRelation;
@@ -179,9 +180,11 @@ public partial class Pf2eDbContext
.HasForeignKey<Archetype>(a => a.DedicationFeatId) .HasForeignKey<Archetype>(a => a.DedicationFeatId)
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade);
entity.HasMany(a => a.Feats).WithOne(f => f.Archetype) entity.HasMany(a => a.Feats).WithMany(f => f.Archetypes)
.HasForeignKey(f => f.ArchetypeId) .UsingEntity<ArchetypeFeats>(
.OnDelete(DeleteBehavior.Cascade); l => l.HasOne<Feat>().WithMany().HasForeignKey(af => af.FeatId),
r => r.HasOne<Archetype>().WithMany().HasForeignKey(af => af.ArchetypeId)
);
}); });
// Background // Background
+3 -2
View File
@@ -39,12 +39,12 @@ internal class EntityConverter : JsonConverter
public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
{ {
Dictionary<string, object?> dictionary = DictionarySerialization(value!); Dictionary<string, object?> dictionary = DictionarySerialization(value!);
/*
if (value.GetType() != typeof(Entity)) if (value.GetType() != typeof(Entity))
{ {
dictionary.Remove("Entity"); dictionary.Remove("Entity");
} }
*/
switch (value) switch (value)
{ {
case Entity entity: case Entity entity:
@@ -61,6 +61,7 @@ internal class EntityConverter : JsonConverter
foreach (KeyValuePair<string, object> keyValuePair in dictionary) foreach (KeyValuePair<string, object> keyValuePair in dictionary)
{ {
writer.WritePropertyName(keyValuePair.Key, true); writer.WritePropertyName(keyValuePair.Key, true);
serializer.Serialize(writer, keyValuePair.Value); serializer.Serialize(writer, keyValuePair.Value);
} }
+16 -1
View File
@@ -175,7 +175,8 @@ public partial class MainViewForm : Form
Converters = [ Converters = [
new EntityConverter(), new EntityConverter(),
new StringEnumConverter { NamingStrategy = new CamelCaseNamingStrategy() }, new StringEnumConverter { NamingStrategy = new CamelCaseNamingStrategy() },
] ],
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
}; };
string result = JsonConvert.SerializeObject(entity, settings); string result = JsonConvert.SerializeObject(entity, settings);
@@ -195,6 +196,14 @@ public partial class MainViewForm : Form
.Include(a => a.AncestryBoosts) .Include(a => a.AncestryBoosts)
.FirstOrDefault(e => e.Id == entity.Id); .FirstOrDefault(e => e.Id == entity.Id);
case EntityType.Archetype:
return Context.Archetypes
.Include(a => a.DedicationFeat)
.ThenInclude(f => f.Entity)
.Include(a => a.Feats)
.ThenInclude(f => f.Entity)
.FirstOrDefault(a => a.Id == entity.Id);
case EntityType.Background: case EntityType.Background:
return Context.Backgrounds return Context.Backgrounds
.Include(b => b.BackgroundBoosts) .Include(b => b.BackgroundBoosts)
@@ -211,6 +220,12 @@ public partial class MainViewForm : Form
.Include(c => c.ClassProgressions) .Include(c => c.ClassProgressions)
.FirstOrDefault(c => c.Id == entity.Id); .FirstOrDefault(c => c.Id == entity.Id);
case EntityType.Feat:
return Context.Feats
.Include(f => f.Archetypes)
.ThenInclude(a => a.Entity)
.FirstOrDefault(f => f.Id == entity.Id);
default: default:
Type type = EntityOfTypeAttribute.Resolve(entity); Type type = EntityOfTypeAttribute.Resolve(entity);
return (IEntity?) Context.Find(type, entity.Id); return (IEntity?) Context.Find(type, entity.Id);
+54 -43
View File
@@ -1,4 +1,4 @@
# Pf2e Data Screapper # Pf2e Data Scrapper
Программа обработки данных для игры Pathfinder 2e для создания БД для дальнейшего использования на сайте локализации Pf2e. Программа обработки данных для игры Pathfinder 2e для создания БД для дальнейшего использования на сайте локализации Pf2e.
@@ -70,75 +70,85 @@ schema.AddValue(data); // Добавление данных
### Общее ### Общее
- [x] action.yaml - [x] action.yaml
- [x] ancestry.yaml - [x] ancestry.yaml
- [ ] apparition.yaml - [x] archetype.yaml
- [ ] arcane-school.yaml - [x] background.yaml
- [ ] arcane-thesis.yaml
- [ ] archetype.yaml
- [ ] article.yaml
- [ ] background.yaml
- [ ] bloodline.yaml
- [ ] category-page.yaml
- [ ] cause.yaml
- [ ] class-feature.yaml
- [ ] class-kit.yaml - [ ] class-kit.yaml
- [ ] class-sample.yaml - [ ] class-sample.yaml
- [ ] class.yaml - [x] class.yaml
- [ ] condition.yaml - [ ] condition.yaml
- [ ] conscious-mind.yaml
- [ ] creature-ability.yaml - [ ] creature-ability.yaml
- [ ] curse.yaml - [ ] curse.yaml
- [ ] deity-category.yaml
- [ ] deity.yaml
- [ ] deviant-ability-classification.yaml - [ ] deviant-ability-classification.yaml
- [ ] disease.yaml - [ ] disease.yaml
- [ ] doctrine.yaml
- [ ] domain.yaml
- [ ] druidic-order.yaml
- [ ] eidolon.yaml
- [ ] element.yaml
- [ ] epithet.yaml
- [x] feat.yaml
- [ ] hazard.yaml
- [ ] hellknight-order.yaml
- [ ] heritage.yaml - [ ] heritage.yaml
- [ ] hunters-edge.yaml
- [ ] hybrid-study.yaml
- [ ] ikon.yaml
- [ ] implement.yaml
- [ ] innovation.yaml
- [ ] instinct.yaml
- [ ] kingdom-event.yaml - [ ] kingdom-event.yaml
- [ ] kingdom-structure.yaml - [ ] kingdom-structure.yaml
- [x] language.yaml - [x] language.yaml
- [ ] lesson.yaml
- [ ] methodology.yaml
- [ ] muse.yaml
- [ ] mystery.yaml
- [ ] mythic-calling.yaml - [ ] mythic-calling.yaml
- [ ] patron.yaml
- [ ] plane.yaml - [ ] plane.yaml
- [ ] practice.yaml
- [ ] racket.yaml
- [ ] relic.yaml - [ ] relic.yaml
- [ ] research-field.yaml
- [ ] ritual.yaml - [ ] ritual.yaml
- [ ] rules.yaml
- [ ] sidebar.yaml - [ ] sidebar.yaml
- [ ] skill-general-action.yaml - [ ] skill-general-action.yaml
- [x] skill.yaml - [x] skill.yaml
- [x] source.yaml - [x] source.yaml
- [ ] spell.yaml - [ ] spell.yaml
- [ ] style.yaml
- [ ] subconscious-mind.yaml
- [ ] tenet.yaml
- [ ] tradition.yaml - [ ] tradition.yaml
- [x] trait.yaml - [x] trait.yaml
- [ ] warfare-army.yaml - [ ] warfare-army.yaml
- [ ] warfare-tactic.yaml - [ ] warfare-tactic.yaml
- [ ] way.yaml
- [ ] weapon-sub.yaml - [ ] weapon-sub.yaml
- [ ] weather-hazard.yaml - [ ] weather-hazard.yaml
**Тексты**
- [ ] article.yaml
- [ ] category-page.yaml
- [ ] rules.yaml
**Боги**
- [ ] deity.yaml
- [ ] deity-category.yaml
- [ ] domain.yaml
**Фиты**
- [x] feat.yaml
- [ ] class-feature.yaml
**Подклассы**
- [ ] research-field.yaml (Alchemist)
- [ ] apparition.yaml (Animist)
- [ ] practice.yaml (Animist)
- [ ] instinct.yaml (Barbarian)
- [ ] muse.yaml (Bard)
- [ ] cause.yaml (Champion)
- [ ] tenet.yaml (Champion)
- [ ] doctrine.yaml (Cleric)
- [ ] druidic-order.yaml (Druid)
- [ ] methodology.yaml (Investigator)
- [ ] element.yaml (Kineticist)
- [ ] hybrid-study.yaml (Magus)
- [ ] mystery.yaml (Oracle)
- [ ] conscious-mind.yaml (Psychic)
- [ ] subconscious-mind.yaml (Psychic)
- [ ] hunters-edge.yaml (Ranger)
- [ ] racket.yaml (Rogue)
- [ ] bloodline.yaml (Sorcerer)
- [ ] style.yaml (Swashbuckler)
- [ ] implement.yaml (Thaumaturge)
- [ ] lesson.yaml (Witch)
- [ ] patron.yaml (Witch)
- [ ] arcane-school.yaml (Wizard)
- [ ] arcane-thesis.yaml (Wizard)
- [ ] way.yaml (Gunslinger)
- [ ] innovation.yaml (Innovator)
- [ ] ikon.yaml (Exemplar)
- [ ] epithet.yaml (Exemplar)
- [ ] hellknight-order.yaml
- [ ] eidolon.yaml
### Бестиарий ### Бестиарий
Готово **0** из 10 Готово **0** из 10
@@ -169,6 +179,7 @@ schema.AddValue(data); // Добавление данных
- [ ] siege-weapon.yaml - [ ] siege-weapon.yaml
- [ ] vehicle.yaml - [ ] vehicle.yaml
- [ ] weapon.yaml - [ ] weapon.yaml
- [ ] hazard.yaml