Продолжение

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 Pf2eModel.Model;
using Pf2eModel.Model.Common;
@@ -76,6 +78,8 @@ internal class ClassProcessor(AonprdProcessorInput input) : AbstractProcessor(in
Object.Tradition = SpellTradition.All;
break;
}
ProcessDependecies();
}
protected ICollection<ClassTraining> GetSkillTrainings()
@@ -192,4 +196,16 @@ internal class ClassProcessor(AonprdProcessorInput input) : AbstractProcessor(in
return classTraining;
}).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 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("feat", ["trait", "source", "skill"])]
[AonprdProcessor("feat", ["trait", "source", "archetype"])]
internal class FeatProcessor(AonprdProcessorInput input) : AbstractProcessor(input)
{
public override EntityType Type => EntityType.Feat;
@@ -24,6 +19,9 @@ internal class FeatProcessor(AonprdProcessorInput input) : AbstractProcessor(inp
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") ?? "");
Object.Actions = action.Actions;
@@ -32,21 +30,34 @@ internal class FeatProcessor(AonprdProcessorInput input) : AbstractProcessor(inp
Object.IsPassive = action.IsPassive;
Object.IsReaction = action.IsReaction;
Object.Extra = GenerateExtra(
"archetype",
"element",
"heighten",
"element",
"heighten",
"heighten_group",
"heighten_level",
"school",
"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()
@@ -13,7 +13,7 @@ using Pf2eModel.Model.Enum;
namespace Pf2eModel.Migrations
{
[DbContext(typeof(Pf2eDbContext))]
[Migration("20250420145024_1")]
[Migration("20250421123520_1")]
partial class _1
{
/// <inheritdoc />
@@ -24,7 +24,7 @@ namespace Pf2eModel.Migrations
.HasAnnotation("ProductVersion", "9.0.4")
.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, "ancestry_vision", new[] { "normal", "low-light-vision", "dark-vision" });
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_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_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, "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_damage_category", new[] { "persistent", "splash" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_damage_kinds", new[] { "damage", "healing", "any" });
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);
modelBuilder.Entity("DeityTraining", b =>
@@ -622,7 +622,7 @@ namespace Pf2eModel.Migrations
.HasColumnName("id")
.HasColumnOrder(1);
b.Property<int>("DedicationFeatId")
b.Property<int?>("DedicationFeatId")
.HasColumnType("integer")
.HasColumnName("dedication_feat_id")
.HasColumnOrder(3);
@@ -638,13 +638,32 @@ namespace Pf2eModel.Migrations
.HasColumnOrder(2);
b.HasKey("Id")
.HasName("pk_archetype");
.HasName("pk_archetypes");
b.HasIndex("DedicationFeatId")
.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 =>
@@ -1091,11 +1110,6 @@ namespace Pf2eModel.Migrations
.HasColumnName("actions")
.HasColumnOrder(5);
b.Property<int>("ArchetypeId")
.HasColumnType("integer")
.HasColumnName("archetype_id")
.HasColumnOrder(10);
b.Property<ActionCategory>("Category")
.HasColumnType("action_category")
.HasColumnName("category")
@@ -1104,7 +1118,7 @@ namespace Pf2eModel.Migrations
b.Property<string>("Extra")
.HasColumnType("text")
.HasColumnName("extra")
.HasColumnOrder(11);
.HasColumnOrder(10);
b.Property<bool>("IsFreeAction")
.HasColumnType("boolean")
@@ -1134,9 +1148,6 @@ namespace Pf2eModel.Migrations
b.HasKey("Id")
.HasName("pk_feats");
b.HasIndex("ArchetypeId")
.HasDatabaseName("ix_feats_archetype_id");
b.ToTable("feats", (string)null);
});
@@ -1675,21 +1686,37 @@ namespace Pf2eModel.Migrations
.WithOne()
.HasForeignKey("Pf2eModel.Model.Structure.Archetype", "DedicationFeatId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_archetype_feats_dedication_feat_id");
.HasConstraintName("fk_archetypes_feats_dedication_feat_id");
b.HasOne("Pf2eModel.Model.Base.Entity", "Entity")
.WithOne()
.HasForeignKey("Pf2eModel.Model.Structure.Archetype", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_archetype_entities_id");
.HasConstraintName("fk_archetypes_entities_id");
b.Navigation("DedicationFeat");
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 =>
{
b.HasOne("Pf2eModel.Model.Base.Entity", "Entity")
@@ -1903,13 +1930,6 @@ namespace Pf2eModel.Migrations
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")
.WithOne()
.HasForeignKey("Pf2eModel.Model.Structure.Feat", "Id")
@@ -1917,8 +1937,6 @@ namespace Pf2eModel.Migrations
.IsRequired()
.HasConstraintName("fk_feats_entities_id");
b.Navigation("Archetype");
b.Navigation("Entity");
});
@@ -2071,11 +2089,6 @@ namespace Pf2eModel.Migrations
b.Navigation("Heritages");
});
modelBuilder.Entity("Pf2eModel.Model.Structure.Archetype", b =>
{
b.Navigation("Feats");
});
modelBuilder.Entity("Pf2eModel.Model.Structure.Background", b =>
{
b.Navigation("BackgroundBoosts");
@@ -14,7 +14,7 @@ namespace Pf2eModel.Migrations
protected override void Up(MigrationBuilder migrationBuilder)
{
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:ancestry_vision", "normal,low-light-vision,dark-vision")
.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_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_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: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_damage_category", "persistent,splash")
.Annotation("Npgsql:Enum:spell_damage_kinds", "damage,healing,any")
.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(
name: "entities",
@@ -269,6 +269,31 @@ namespace Pf2eModel.Migrations
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(
name: "languages",
columns: table => new
@@ -729,6 +754,52 @@ namespace Pf2eModel.Migrations
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(
name: "ancestry_languages",
columns: table => new
@@ -894,71 +965,23 @@ namespace Pf2eModel.Migrations
});
migrationBuilder.CreateTable(
name: "archetype",
name: "archetype_feats",
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),
extra = table.Column<string>(type: "text", nullable: true)
feat_id = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("pk_feats", x => x.id);
table.PrimaryKey("pk_archetype_feats", x => new { x.archetype_id, x.feat_id });
table.ForeignKey(
name: "fk_feats_archetype_archetype_id",
name: "fk_archetype_feats_archetypes_archetype_id",
column: x => x.archetype_id,
principalTable: "archetype",
principalTable: "archetypes",
principalColumn: "id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "fk_feats_entities_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",
name: "fk_archetype_feats_feats_feat_id",
column: x => x.feat_id,
principalTable: "feats",
principalColumn: "id",
@@ -981,8 +1004,13 @@ namespace Pf2eModel.Migrations
column: "language_id");
migrationBuilder.CreateIndex(
name: "ix_archetype_dedication_feat_id",
table: "archetype",
name: "ix_archetype_feats_feat_id",
table: "archetype_feats",
column: "feat_id");
migrationBuilder.CreateIndex(
name: "ix_archetypes_dedication_feat_id",
table: "archetypes",
column: "dedication_feat_id",
unique: true);
@@ -1081,11 +1109,6 @@ namespace Pf2eModel.Migrations
table: "feat_prerequisites",
column: "feat_id");
migrationBuilder.CreateIndex(
name: "ix_feats_archetype_id",
table: "feats",
column: "archetype_id");
migrationBuilder.CreateIndex(
name: "ix_heritages_ancestry_id",
table: "heritages",
@@ -1110,31 +1133,11 @@ namespace Pf2eModel.Migrations
name: "ix_spell_defenses_spell_id",
table: "spell_defenses",
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 />
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(
name: "actions");
@@ -1147,6 +1150,9 @@ namespace Pf2eModel.Migrations
migrationBuilder.DropTable(
name: "ancestry_languages");
migrationBuilder.DropTable(
name: "archetype_feats");
migrationBuilder.DropTable(
name: "background_boosts");
@@ -1225,6 +1231,9 @@ namespace Pf2eModel.Migrations
migrationBuilder.DropTable(
name: "languages");
migrationBuilder.DropTable(
name: "archetypes");
migrationBuilder.DropTable(
name: "backgrounds");
@@ -1255,14 +1264,11 @@ namespace Pf2eModel.Migrations
migrationBuilder.DropTable(
name: "spells");
migrationBuilder.DropTable(
name: "entities");
migrationBuilder.DropTable(
name: "feats");
migrationBuilder.DropTable(
name: "archetype");
name: "entities");
}
}
}
@@ -21,7 +21,7 @@ namespace Pf2eModel.Migrations
.HasAnnotation("ProductVersion", "9.0.4")
.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, "ancestry_vision", new[] { "normal", "low-light-vision", "dark-vision" });
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_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_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, "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_damage_category", new[] { "persistent", "splash" });
NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "spell_damage_kinds", new[] { "damage", "healing", "any" });
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);
modelBuilder.Entity("DeityTraining", b =>
@@ -619,7 +619,7 @@ namespace Pf2eModel.Migrations
.HasColumnName("id")
.HasColumnOrder(1);
b.Property<int>("DedicationFeatId")
b.Property<int?>("DedicationFeatId")
.HasColumnType("integer")
.HasColumnName("dedication_feat_id")
.HasColumnOrder(3);
@@ -635,13 +635,32 @@ namespace Pf2eModel.Migrations
.HasColumnOrder(2);
b.HasKey("Id")
.HasName("pk_archetype");
.HasName("pk_archetypes");
b.HasIndex("DedicationFeatId")
.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 =>
@@ -1088,11 +1107,6 @@ namespace Pf2eModel.Migrations
.HasColumnName("actions")
.HasColumnOrder(5);
b.Property<int>("ArchetypeId")
.HasColumnType("integer")
.HasColumnName("archetype_id")
.HasColumnOrder(10);
b.Property<ActionCategory>("Category")
.HasColumnType("action_category")
.HasColumnName("category")
@@ -1101,7 +1115,7 @@ namespace Pf2eModel.Migrations
b.Property<string>("Extra")
.HasColumnType("text")
.HasColumnName("extra")
.HasColumnOrder(11);
.HasColumnOrder(10);
b.Property<bool>("IsFreeAction")
.HasColumnType("boolean")
@@ -1131,9 +1145,6 @@ namespace Pf2eModel.Migrations
b.HasKey("Id")
.HasName("pk_feats");
b.HasIndex("ArchetypeId")
.HasDatabaseName("ix_feats_archetype_id");
b.ToTable("feats", (string)null);
});
@@ -1672,21 +1683,37 @@ namespace Pf2eModel.Migrations
.WithOne()
.HasForeignKey("Pf2eModel.Model.Structure.Archetype", "DedicationFeatId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_archetype_feats_dedication_feat_id");
.HasConstraintName("fk_archetypes_feats_dedication_feat_id");
b.HasOne("Pf2eModel.Model.Base.Entity", "Entity")
.WithOne()
.HasForeignKey("Pf2eModel.Model.Structure.Archetype", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_archetype_entities_id");
.HasConstraintName("fk_archetypes_entities_id");
b.Navigation("DedicationFeat");
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 =>
{
b.HasOne("Pf2eModel.Model.Base.Entity", "Entity")
@@ -1900,13 +1927,6 @@ namespace Pf2eModel.Migrations
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")
.WithOne()
.HasForeignKey("Pf2eModel.Model.Structure.Feat", "Id")
@@ -1914,8 +1934,6 @@ namespace Pf2eModel.Migrations
.IsRequired()
.HasConstraintName("fk_feats_entities_id");
b.Navigation("Archetype");
b.Navigation("Entity");
});
@@ -2068,11 +2086,6 @@ namespace Pf2eModel.Migrations
b.Navigation("Heritages");
});
modelBuilder.Entity("Pf2eModel.Model.Structure.Archetype", b =>
{
b.Navigation("Feats");
});
modelBuilder.Entity("Pf2eModel.Model.Structure.Background", b =>
{
b.Navigation("BackgroundBoosts");
+13
View File
@@ -6,6 +6,19 @@ public enum ActionCategory
{
Unknown,
[PgName("archetype")]
Archetype,
[PgName("class-feature")]
ClassFeature,
[PgName("class-feat")]
ClassFeat,
[PgName("offensive")]
Offensive,
+8 -5
View File
@@ -4,11 +4,14 @@ namespace Pf2eModel.Model.Enum;
public enum FeatCategory
{
[PgName("ancestryfeature")]
Ancestryfeature,
[PgName("uncategorized")]
Uncategorized,
[PgName("classfeature")]
Classfeature,
[PgName("ancestry-feature")]
AncestryFeature,
[PgName("class-feature")]
ClassFeature,
[PgName("calling")]
Calling,
@@ -37,6 +40,6 @@ public enum FeatCategory
[PgName("pfsboon")]
Pfsboon,
[PgName("campaign_feature")]
[PgName("campaign-feature")]
CampaignFeature,
}
+3
View File
@@ -7,6 +7,9 @@ public enum TraitType
[PgName("regular")]
Regular,
[PgName("class")]
Class,
[PgName("tradition")]
Tradition
}
+3 -1
View File
@@ -1,4 +1,5 @@
using Pf2eModel.Model.Base;
using Pf2eModel.Model.Enum;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
@@ -9,6 +10,7 @@ using System.Threading.Tasks;
namespace Pf2eModel.Model.Structure;
[EntityOfType(EntityType.Archetype)]
public class Archetype : IEntity
{
[Key]
@@ -21,7 +23,7 @@ public class Archetype : IEntity
public int Level { get; set; }
[Column(Order = 3)]
public int DedicationFeatId { get; set; }
public int? DedicationFeatId { get; set; } = null;
[Column(Order = 4)]
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)]
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 Archetype Archetype { get; set; } = null!;
public virtual ICollection<Archetype> Archetypes { 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<Archetype> Archetypes { get; set; }
public virtual DbSet<AncestryBoost> AncestryBoosts { 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.Structure;
using Pf2eModel.Model.Structure.AncestryRelation;
using Pf2eModel.Model.Structure.ArchetypeRelation;
using Pf2eModel.Model.Structure.BackgroundRelation;
using Pf2eModel.Model.Structure.ClassRelation;
using Pf2eModel.Model.Structure.DeityRelation;
@@ -179,9 +180,11 @@ public partial class Pf2eDbContext
.HasForeignKey<Archetype>(a => a.DedicationFeatId)
.OnDelete(DeleteBehavior.Cascade);
entity.HasMany(a => a.Feats).WithOne(f => f.Archetype)
.HasForeignKey(f => f.ArchetypeId)
.OnDelete(DeleteBehavior.Cascade);
entity.HasMany(a => a.Feats).WithMany(f => f.Archetypes)
.UsingEntity<ArchetypeFeats>(
l => l.HasOne<Feat>().WithMany().HasForeignKey(af => af.FeatId),
r => r.HasOne<Archetype>().WithMany().HasForeignKey(af => af.ArchetypeId)
);
});
// Background
+3 -2
View File
@@ -39,12 +39,12 @@ internal class EntityConverter : JsonConverter
public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
{
Dictionary<string, object?> dictionary = DictionarySerialization(value!);
/*
if (value.GetType() != typeof(Entity))
{
dictionary.Remove("Entity");
}
*/
switch (value)
{
case Entity entity:
@@ -61,6 +61,7 @@ internal class EntityConverter : JsonConverter
foreach (KeyValuePair<string, object> keyValuePair in dictionary)
{
writer.WritePropertyName(keyValuePair.Key, true);
serializer.Serialize(writer, keyValuePair.Value);
}
+16 -1
View File
@@ -175,7 +175,8 @@ public partial class MainViewForm : Form
Converters = [
new EntityConverter(),
new StringEnumConverter { NamingStrategy = new CamelCaseNamingStrategy() },
]
],
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
};
string result = JsonConvert.SerializeObject(entity, settings);
@@ -195,6 +196,14 @@ public partial class MainViewForm : Form
.Include(a => a.AncestryBoosts)
.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:
return Context.Backgrounds
.Include(b => b.BackgroundBoosts)
@@ -211,6 +220,12 @@ public partial class MainViewForm : Form
.Include(c => c.ClassProgressions)
.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:
Type type = EntityOfTypeAttribute.Resolve(entity);
return (IEntity?) Context.Find(type, entity.Id);
+54 -43
View File
@@ -1,4 +1,4 @@
# Pf2e Data Screapper
# Pf2e Data Scrapper
Программа обработки данных для игры Pathfinder 2e для создания БД для дальнейшего использования на сайте локализации Pf2e.
@@ -70,75 +70,85 @@ schema.AddValue(data); // Добавление данных
### Общее
- [x] action.yaml
- [x] ancestry.yaml
- [ ] apparition.yaml
- [ ] arcane-school.yaml
- [ ] arcane-thesis.yaml
- [ ] archetype.yaml
- [ ] article.yaml
- [ ] background.yaml
- [ ] bloodline.yaml
- [ ] category-page.yaml
- [ ] cause.yaml
- [ ] class-feature.yaml
- [x] archetype.yaml
- [x] background.yaml
- [ ] class-kit.yaml
- [ ] class-sample.yaml
- [ ] class.yaml
- [x] class.yaml
- [ ] condition.yaml
- [ ] conscious-mind.yaml
- [ ] creature-ability.yaml
- [ ] curse.yaml
- [ ] deity-category.yaml
- [ ] deity.yaml
- [ ] deviant-ability-classification.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
- [ ] hunters-edge.yaml
- [ ] hybrid-study.yaml
- [ ] ikon.yaml
- [ ] implement.yaml
- [ ] innovation.yaml
- [ ] instinct.yaml
- [ ] kingdom-event.yaml
- [ ] kingdom-structure.yaml
- [x] language.yaml
- [ ] lesson.yaml
- [ ] methodology.yaml
- [ ] muse.yaml
- [ ] mystery.yaml
- [ ] mythic-calling.yaml
- [ ] patron.yaml
- [ ] plane.yaml
- [ ] practice.yaml
- [ ] racket.yaml
- [ ] relic.yaml
- [ ] research-field.yaml
- [ ] ritual.yaml
- [ ] rules.yaml
- [ ] sidebar.yaml
- [ ] skill-general-action.yaml
- [x] skill.yaml
- [x] source.yaml
- [ ] spell.yaml
- [ ] style.yaml
- [ ] subconscious-mind.yaml
- [ ] tenet.yaml
- [ ] tradition.yaml
- [x] trait.yaml
- [ ] warfare-army.yaml
- [ ] warfare-tactic.yaml
- [ ] way.yaml
- [ ] weapon-sub.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
@@ -169,6 +179,7 @@ schema.AddValue(data); // Добавление данных
- [ ] siege-weapon.yaml
- [ ] vehicle.yaml
- [ ] weapon.yaml
- [ ] hazard.yaml