Files

4.7 KiB
Raw Permalink Blame History

Система аватаров: основа

avatar_base реализует независимое состояние аватара: группы, именованные пресеты, композицию целевых значений и JSON-состояние для сохранений. Зависимости от диалогов, боевых персонажей и Live2D нет. Полный формат и контракт: en.md.

Управление

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-пример и правила владения ресурсами приведены в английской документации. Тесты проверяют независимость экземпляров, приоритеты, атомарность, сериализацию и загрузку настоящего ресурса.