using Pf2e.Common;
using Pf2e.Database.Model.Base;
using Pf2e.Database.Model.Structure;
using Pf2e.Web.Helpers.Serialization;
using Action = Pf2e.Database.Model.Structure.Action;
namespace Pf2e.Web.Helpers;
public class EntitySerialization
{
public EntitySerialization()
{
if (_builders.Count == 0)
{
RegisterBuilders();
}
}
///
/// Сериализует объект в результат сериализации.
///
/// Объект для сериализации.
/// Результат сериализации.
public SerializationResult Serialize(object value)
{
SerializationResult result = new();
// Находим подходящий построитель для типа объекта
EntityBuilder? builder = _builders.FirstOrDefault(b => b.EntityType == value.GetType());
if (builder != null)
{
result.Groups = builder.Compile(value);
}
else
{
// Если построитель не найден, создаём пустой результат
result.Groups = [];
}
return result;
}
private static List _builders = [];
private static EntityBuilder NewBuilder()
where TEntity : class
{
EntityBuilder builder = new();
_builders.Add(builder);
return builder;
}
private static void RegisterBuilders()
{
// Добавляем построитель для FullEntity
NewBuilder()
.AddGroup(
"Основная сущность",
builder =>
{
builder.AddField(fe => fe.Entity).AddField(fe => fe.SubEntity);
}
);
NewBuilder()
.AddGroup(
"Сущность",
builder =>
{
builder
.AddField(entity => entity.Id)
.AddField(entity => entity.Name)
.AddField(entity => entity.Type)
.AddField(entity => entity.Slug)
.AddField(entity => entity.Traits)
.AddField(entity => entity.Description)
.AddField(entity => entity.IsTranslated)
.SetValueFormatter(v => (v as bool? == true) ? "Да" : "Нет")
.AddField(entity => entity.IsChecked)
.SetValueFormatter(v => (v as bool? == true) ? "Да" : "Нет")
.AddField(entity => entity.IsLegacy)
.SetValueFormatter(v => (v as bool? == true) ? "Да" : "Нет")
.AddField(entity => entity.Keywords)
.AddField(entity => entity.Sources)
.AddField(entity => entity.LegacyEntities)
.AddField(entity => entity.RemasterEntities);
}
);
NewBuilder()
.AddGroup(
"Действие",
builder =>
{
builder
.AddField(a => a.Id)
.AddField(a => a.Entity)
.AddField(a => a.Actions)
.AddField(a => a.Category)
.AddField(a => a.Extra);
}
);
NewBuilder()
.AddGroup(
"Родословная",
builder =>
{
builder
.AddField(a => a.Id)
.AddField(a => a.Entity)
.AddField(a => a.Size)
.AddField(a => a.Hp)
.AddField(a => a.Speed)
.AddField(a => a.VisionEnum)
.AddField(a => a.AncestryBoosts)
.AddField(a => a.AncestryItems)
.AddField(a => a.AncestryLanguages)
.AddField(a => a.Heritages);
}
);
NewBuilder()
.AddGroup(
"Архетип",
builder =>
{
builder
.AddField(a => a.Id)
.AddField(a => a.Entity)
.AddField(a => a.Level)
.AddField(a => a.Extra)
.AddField(a => a.DedicationFeat)
.UseCommentFrom(a => a.DedicationFeatId)
.AddField(a => a.Feats);
}
);
NewBuilder()
.AddGroup(
"Предыстория",
builder =>
{
builder
.AddField(b => b.Id)
.AddField(b => b.Entity)
.AddField(b => b.BackgroundBoosts)
.AddField(b => b.BackgroundItems)
.AddField(b => b.BackgroundSkills);
}
);
NewBuilder()
.AddGroup(
"Класс",
builder =>
{
builder
.AddField(c => c.Id)
.AddField(c => c.Entity)
.AddField(c => c.Hp)
.AddField(c => c.Spellcasting)
.AddField(c => c.Tradition)
.AddField(c => c.AdditionalTrainedSkills)
.AddField(c => c.ClassKeyAbilities)
.AddField(c => c.ClassProgressions)
.AddField(c => c.ClassTrainings)
.AddField(c => c.SubclassGroups);
}
);
NewBuilder()
.AddGroup(
"Состояние",
builder =>
{
builder
.AddField(c => c.Id)
.AddField(c => c.Entity)
.AddField(c => c.Group)
.AddField(c => c.Extra);
}
);
NewBuilder()
.AddGroup(
"Божество",
builder =>
{
builder
.AddField(d => d.Id)
.AddField(d => d.Entity)
.AddField(d => d.Type)
.AddField(d => d.Category)
.AddField(d => d.Fonts)
.AddField(d => d.Sanctification)
.AddField(d => d.SanctificationMust)
.AddField(d => d.Edicts)
.AddField(d => d.Anathema)
.AddField(d => d.ReligiousSymbol)
.AddField(d => d.SacredAnimal)
.AddField(d => d.AreaOfConcern)
.AddField(d => d.DeityAttributes)
.AddField(d => d.DeityDomains)
.AddField(d => d.DeitySpells)
.AddField(d => d.DeityWeapons)
.AddField(d => d.CategoryEntity)
.UseCommentFrom(d => d.CategoryId)
.AddField(d => d.Skills);
}
);
NewBuilder()
.AddGroup(
"Категория божества",
builder =>
{
builder
.AddField(dc => dc.Id)
.AddField(dc => dc.Entity)
.AddField(dc => dc.Description);
}
);
NewBuilder()
.AddGroup(
"Домен",
builder =>
{
builder
.AddField(d => d.Id)
.AddField(d => d.Entity)
.AddField(d => d.DomainSpell)
.UseCommentFrom(d => d.DomainSpellId)
.AddField(d => d.AdvancedDomainSpell)
.UseCommentFrom(d => d.AdvancedDomainSpellId)
.AddField(d => d.ApocryphalSpell)
.UseCommentFrom(d => d.ApocryphalSpellId)
.AddField(d => d.AdvancedApocryphalSpell)
.UseCommentFrom(d => d.AdvancedApocryphalSpellId)
.AddField(d => d.DeityDomains);
}
);
NewBuilder()
.AddGroup(
"Способность",
builder =>
{
builder
.AddField(f => f.Id)
.AddField(f => f.Entity)
.AddField(f => f.Category)
.AddField(f => f.Level)
.AddField(f => f.Actions)
.AddField(f => f.Extra)
.AddField(f => f.Archetypes)
.AddField(f => f.FeatPrerequisites);
}
);
NewBuilder()
.AddGroup(
"Наследие",
builder =>
{
builder
.AddField(h => h.Id)
.AddField(h => h.Entity)
.AddField(h => h.Ancestry)
.UseCommentFrom(h => h.AncestryId);
}
);
NewBuilder()
.AddGroup(
"Язык",
builder =>
{
builder.AddField(l => l.Id).AddField(l => l.Entity);
}
);
NewBuilder()
.AddGroup(
"Правило",
builder =>
{
builder
.AddField(r => r.Id)
.AddField(r => r.Entity)
.AddField(r => r.Order)
.AddField(r => r.Parent)
.UseCommentFrom(r => r.ParentId)
.AddField(r => r.Children)
.AddField(r => r.Breadcrumbs);
}
);
NewBuilder()
.AddGroup(
"Ритуал",
builder =>
{
builder
.AddField(r => r.Id)
.AddField(r => r.Entity)
.AddField(r => r.Level)
.AddField(r => r.CastTime)
.AddField(r => r.Duration)
.AddField(r => r.Elements)
.AddField(r => r.Range)
.AddField(r => r.PrimaryCheckRank)
.AddField(r => r.PrimaryCheckSuffix)
.AddField(r => r.SecondaryCasters)
.AddField(r => r.SecondaryCastersMax)
.AddField(r => r.SecondaryCastersSuffix)
.AddField(r => r.RangeString)
.AddField(r => r.Target)
.AddField(r => r.Cost)
.AddField(r => r.Requirement)
.AddField(r => r.Area)
.AddField(r => r.Checks);
}
);
NewBuilder()
.AddGroup(
"Заклинание",
builder =>
{
builder
.AddField(s => s.Id)
.AddField(s => s.Entity)
.AddField(s => s.Level)
.AddField(s => s.IsFocus)
.AddField(s => s.Actions)
.AddField(s => s.Duration)
.AddField(s => s.Range)
.AddField(s => s.Traditions)
.AddField(s => s.Elements)
.AddField(s => s.Trigger)
.AddField(s => s.Target)
.AddField(s => s.Cost)
.AddField(s => s.Requirement)
.AddField(s => s.SpellAreas)
.AddField(s => s.SpellDefenses);
}
);
NewBuilder()
.AddGroup(
"Подкласс",
builder =>
{
builder
.AddField(s => s.Id)
.AddField(s => s.Entity)
.AddField(s => s.Group)
.UseCommentFrom(s => s.GroupId)
.AddField(s => s.Additional)
.AddField(s => s.Extra)
.AddField(s => s.Entities)
.AddField(s => s.Trainings);
}
);
NewBuilder()
.AddGroup(
"Группа подклассов",
builder =>
{
builder
.AddField(sg => sg.Id)
.AddField(sg => sg.Entity)
.AddField(sg => sg.Class)
.UseCommentFrom(sg => sg.ClassId)
.AddField(sg => sg.Subclasses);
}
);
NewBuilder()
.AddGroup(
"Признак",
builder =>
{
builder
.AddField(t => t.Id)
.AddField(t => t.Entity)
.AddField(t => t.Type)
.AddField(t => t.Entities);
}
);
}
}