Update avatar_base implementation, assets and documentation

This commit is contained in:
cthangover committed 2026-10-31 15:28:48 +03:00
commit 1ac123dd1b
24 files changed
+862

No files matched your search

+55
View File
@@ -0,0 +1,55 @@
# Система аватаров: основа
`avatar_base` реализует независимое состояние аватара: группы, именованные пресеты,
композицию целевых значений и JSON-состояние для сохранений. Зависимости от диалогов,
боевых персонажей и Live2D нет. Полный формат и контракт: [en.md](en.md).
## Управление
```csharp
IAvatar avatar = AvatarCatalog.Create("my_game/marao");
avatar.ApplyPresets(new Dictionary<string, string> {
["emotion"] = "angry",
["eyes_state"] = "opened"
});
AvatarFrame target = avatar.Resolve();
AvatarState saved = avatar.CaptureState();
```
Контентный мод зависит от `avatar_base>=1` и объявляет сущности `Kind: avatar`.
У определения есть `Id`, `Renderer`, `BaseValues` и `Groups`. У группы — `Default`,
`Priority`, `Presets`; у пресета — `Values`. Имена групп и пресетов произвольные,
регистрозависимые. Значения пресетов — целевые привязки для конкретного рендера,
а не универсальные числа от 0 до 1.
Каждая группа выбирает один пресет. Изменение группы сохраняет остальные группы.
Все изменения проверяются до применения: опечатка не оставляет частично изменённое
состояние. Неизвестные значения отклоняются, автоматических подмен нет.
Композиция начинается с `BaseValues`, затем применяет группы по возрастанию
`Priority`, при равенстве — по имени (ordinal). Более поздняя группа перекрывает
одноимённую привязку целиком. Порядок команд ничего не меняет. Например, эмоция
имеет приоритет 0, явное состояние глаз — 100. Пустой пресет `auto` не вносит
привязок и тем самым возвращает управление эмоции. Это обычное имя, не ключевое слово.
`Resolve()` возвращает полный неизменяемый снимок, без оставшихся значений прошлого
пресета. `CaptureState()` — отдельный DTO с ID аватара и выбором пресетов. При
восстановлении отсутствующие группы получают значения по умолчанию, неизвестные
группы/пресеты и чужой ID отклоняются. Изменения ресурсов не меняют уже созданный
экземпляр: владелец пересоздаёт его при перезагрузке.
## Граница реализации
`IAvatarRenderer` задаёт контракт визуального адаптера: корневой `Control`, применение
полного целевого состояния, время перехода и освобождение принадлежащих ему ресурсов.
Мод `avatar_layers` уже выбирает и отображает PNG-слои. Будущий адаптер Live2D будет
выбирать параметры модели. `AvatarRenderers.Create(avatar)` находит фабрику по `Renderer`
и применяет начальное состояние. После изменений владелец явно вызывает
`renderer.Apply(avatar.Resolve())`. Фабрики автоматически регистрируются и удаляются
вместе с модами через стандартный `ModTypeConsumer`.
В этой версии нет адаптера Live2D, сценарных команд, редактора,
проверки совместимости картинок и автоматической интеграции с сохранениями.
Существующие диалоговые аватарки работают как прежде. JSON-пример и правила владения
ресурсами приведены в английской документации. Тесты проверяют независимость
экземпляров, приоритеты, атомарность, сериализацию и загрузку настоящего ресурса.