396 lines
14 KiB
C#
396 lines
14 KiB
C#
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();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Сериализует объект в результат сериализации.
|
|
/// </summary>
|
|
/// <param name="value">Объект для сериализации.</param>
|
|
/// <returns>Результат сериализации.</returns>
|
|
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<EntityBuilder> _builders = [];
|
|
|
|
private static EntityBuilder<TEntity> NewBuilder<TEntity>()
|
|
where TEntity : class
|
|
{
|
|
EntityBuilder<TEntity> builder = new();
|
|
_builders.Add(builder);
|
|
return builder;
|
|
}
|
|
|
|
private static void RegisterBuilders()
|
|
{
|
|
// Добавляем построитель для FullEntity
|
|
NewBuilder<FullEntity>()
|
|
.AddGroup(
|
|
"Основная сущность",
|
|
builder =>
|
|
{
|
|
builder.AddField(fe => fe.Entity).AddField(fe => fe.SubEntity);
|
|
}
|
|
);
|
|
|
|
NewBuilder<Entity>()
|
|
.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<Action>()
|
|
.AddGroup(
|
|
"Действие",
|
|
builder =>
|
|
{
|
|
builder
|
|
.AddField(a => a.Id)
|
|
.AddField(a => a.Entity)
|
|
.AddField(a => a.Actions)
|
|
.AddField(a => a.Category)
|
|
.AddField(a => a.Extra);
|
|
}
|
|
);
|
|
|
|
NewBuilder<Ancestry>()
|
|
.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<Archetype>()
|
|
.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<Background>()
|
|
.AddGroup(
|
|
"Предыстория",
|
|
builder =>
|
|
{
|
|
builder
|
|
.AddField(b => b.Id)
|
|
.AddField(b => b.Entity)
|
|
.AddField(b => b.BackgroundBoosts)
|
|
.AddField(b => b.BackgroundItems)
|
|
.AddField(b => b.BackgroundSkills);
|
|
}
|
|
);
|
|
|
|
NewBuilder<Class>()
|
|
.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<Condition>()
|
|
.AddGroup(
|
|
"Состояние",
|
|
builder =>
|
|
{
|
|
builder
|
|
.AddField(c => c.Id)
|
|
.AddField(c => c.Entity)
|
|
.AddField(c => c.Group)
|
|
.AddField(c => c.Extra);
|
|
}
|
|
);
|
|
|
|
NewBuilder<Deity>()
|
|
.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<DeityCategory>()
|
|
.AddGroup(
|
|
"Категория божества",
|
|
builder =>
|
|
{
|
|
builder
|
|
.AddField(dc => dc.Id)
|
|
.AddField(dc => dc.Entity)
|
|
.AddField(dc => dc.Description);
|
|
}
|
|
);
|
|
|
|
NewBuilder<Domain>()
|
|
.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<Feat>()
|
|
.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<Heritage>()
|
|
.AddGroup(
|
|
"Наследие",
|
|
builder =>
|
|
{
|
|
builder
|
|
.AddField(h => h.Id)
|
|
.AddField(h => h.Entity)
|
|
.AddField(h => h.Ancestry)
|
|
.UseCommentFrom(h => h.AncestryId);
|
|
}
|
|
);
|
|
|
|
NewBuilder<Language>()
|
|
.AddGroup(
|
|
"Язык",
|
|
builder =>
|
|
{
|
|
builder.AddField(l => l.Id).AddField(l => l.Entity);
|
|
}
|
|
);
|
|
|
|
NewBuilder<Rule>()
|
|
.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<Ritual>()
|
|
.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<Spell>()
|
|
.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<Subclass>()
|
|
.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<SubclassGroup>()
|
|
.AddGroup(
|
|
"Группа подклассов",
|
|
builder =>
|
|
{
|
|
builder
|
|
.AddField(sg => sg.Id)
|
|
.AddField(sg => sg.Entity)
|
|
.AddField(sg => sg.Class)
|
|
.UseCommentFrom(sg => sg.ClassId)
|
|
.AddField(sg => sg.Subclasses);
|
|
}
|
|
);
|
|
|
|
NewBuilder<Trait>()
|
|
.AddGroup(
|
|
"Признак",
|
|
builder =>
|
|
{
|
|
builder
|
|
.AddField(t => t.Id)
|
|
.AddField(t => t.Entity)
|
|
.AddField(t => t.Type)
|
|
.AddField(t => t.Entities);
|
|
}
|
|
);
|
|
}
|
|
}
|