F4SE-плагин для Fallout 4, который выводит на экран активные эффекты (active magic effects) игрока в виде иконок, обновляющихся в реальном времени. Отображение реализовано через [PrismaUI](https://www.nexusmods.com/fallout4/mods/) (веб-слой поверх игры); C++ часть только отслеживает активные эффекты и управляет данными, вся отрисовка — на TypeScript/React.
## Возможности
- Опрос активных эффектов игрока раз в ~0.2с.
- Три режима отображения иконки: «иконка + % оставшегося времени», «иконка + полоса оставшегося времени», «только иконка». У бесконечных эффектов режим всегда «только иконка» — считать оставшееся время не от чего.
- Стакающиеся эффекты (несколько активных инстансов одного и того же эффекта) — не дублируются иконками, а показываются одной иконкой с цифрой стака в углу.
- Визуальная индикация появления/снятия эффекта — короткая цветная вспышка кольцом вокруг иконки (зелёная при появлении, красная при снятии), независимо от остальных настроек отображения.
- Цветовой градиент между цветом «только появился» и «вот-вот закончится» (с возможностью инверсии). На самой иконке цвет может показываться четырьмя способами: кольцом вокруг иконки, заливкой самой иконки, круглой подложкой без цвета, либо не показываться вовсе — независимо от режима отображения процента/полосы.
- Прозрачность и масштаб — отдельно для каждого эффекта.
- Режим «не показывать постоянно» (flash-only): иконка показывается вспышкой при появлении эффекта, затем скрывается, и снова показывается вспышкой при его снятии — вместо того чтобы висеть на экране всё время, пока эффект активен. Настраивается на каждый эффект отдельно, с глобальным значением по умолчанию для эффектов без JSON.
- Отдельный, независимый переключатель «не показывать постоянно бесконечные эффекты» — можно, например, держать конечные баффы с таймером на экране постоянно, а бесконечные пассивные эффекты показывать только вспышкой.
- Опция полностью скрывать бесконечные эффекты без своего JSON-описания (на эффекты с JSON не действует — у них для этого свой флаг **Visible**) и настраиваемый порог, начиная с которого длительность считается «бесконечной».
- Показ либо только эффектов, заданных через JSON, либо вообще всех активных эффектов игрока (с общим настраиваемым внешним видом по умолчанию для тех, что не заданы через JSON — они всегда показываются только во фрейме, без свободного позиционирования).
- Флаг движка `kHideInUI` по умолчанию уважается для эффектов без JSON-описания — но если для эффекта есть JSON, он показывается всегда, независимо от этого флага.
- Свободное позиционирование иконки (drag-n-drop) **или** автоматическая раскладка в одном из двух фреймов:
-
**Permanent** — сетка слева-направо/сверху-вниз с ручным порядком, для эффектов, которые показываются постоянно.
-
**Temporary** — группа по центру, для эффектов в режиме «не показывать постоянно» (самый недавно изменившийся — первым).
Фреймы можно двигать и растягивать, у каждого настраивается выравнивание содержимого.
- Панель настроек прямо в игре — всё перечисленное выше настраивается мышью, без правки файлов.
- Всё расширяется без пересборки плагина простым добавлением файлов в соответствующие папки: свои эффекты (`definitions`), переводы интерфейса (`locales`), кастомные шрифты (`fonts`).
- Горячая клавиша, открывающая панель настроек — по умолчанию **F3**, переназначаема и требует удержания.
## Требования
- [F4SE](https://f4se.silverlock.org/)
- [PrismaUI_F4](https://www.nexusmods.com/fallout4/mods/) (плагин использует V4 API — нужна свежая версия)
## Установка
Через любой менеджер модов (MO2, Vortex) — обычная структура `Data/…`. Собранный `ActiveEffects.dll` кладётся в `Data/F4SE/Plugins/`, вместе с ним разворачивается папка `Data/F4SE/Plugins/ActiveEffects/` (описания эффектов/шрифты/переводы) и веб-интерфейс в `Data/PrismaUI_F4/views/ActiveEffects/`.
## Использование
1. Удерживайте горячую клавишу (по умолчанию **F3**) не менее 3 секунд — откроется панель настроек, поверх HUD появятся иконки для перетаскивания.
2. В обычном режиме HUD кликов не перехватывает — управление персонажем не блокируется.
3. Чтобы закрыть панель — снова удержите ту же клавишу нужное время.
### Что можно сделать в панели
**Общие настройки** (вверху панели): Show HUD, язык, шрифт, горячая клавиша + Rebind + время удержания.
**Раздел «Effects»** (глобальные настройки, не привязанные к конкретному эффекту):
- **Show** — только эффекты из `definitions/` (Only defined effects) или вообще все активные эффекты игрока (All player effects).
- **Respect game’s “hide in UI” flag** — виден только в режиме «All»: уважать ли флаг `kHideInUI` для эффектов без своего JSON.
- **Hide infinite-duration effects** — виден только в режиме «All»: полностью скрыть бесконечные эффекты без своего JSON. На эффекты, для которых есть JSON-описание, не действует — у них для этого есть собственный флаг **Visible**.
- **Infinite threshold (s)** — длительность (в секундах), начиная с которой (или равной 0) эффект считается бесконечным.
- **Flash-only for infinite effects** — принудительно применять режим «не показывать постоянно» ко всем бесконечным эффектам, независимо от их собственной настройки.
- **Default appearance** (только в режиме «All») — цвет иконки, масштаб, прозрачность и flash-only для эффектов без своего JSON-описания.
**Настройки каждого эффекта** (для всех, у кого есть JSON в `definitions/`):
- **Visible**, режим отображения (иконка+полоса/иконка+процент/только иконка — % считается от оставшегося времени, для бесконечных эффектов режим всегда «только иконка»), **Icon color** (Ring/Fill/Badge/None), цвет «только появился»/«вот-вот закончится», **Invert**, **Opacity**, **Size**.
- **Free position** — свободное перетаскивание, иначе попадает в Permanent (постоянно видимые) или Temporary (flash-only) фрейм.
- **Order** — порядок в сетке Permanent-фрейма.
- **Flash only** + **Flash duration** — не показывать постоянно, только вспышкой при появлении/снятии.
- **Show name** — показывать ли название эффекта под иконкой. Для эффектов без своего JSON (режим «All player effects») название показывается всегда, независимо от этой настройки.
**Фреймы**: заголовок — потяните, чтобы переместить; уголок снизу-справа — потяните, чтобы изменить размер; выпадающий список в заголовке — выравнивание содержимого.
## Где хранятся настройки
- `Data/F4SE/Plugins/ActiveEffects.json` — глобальные настройки (HUD, фреймы, язык, шрифт, горячая клавиша, раздел Effects).
- `Data/F4SE/Plugins/ActiveEffects/definitions/*.json` — один файл на эффект: откуда брать магический эффект и как его показывать. Правки через панель настроек сохраняются прямо в этот файл.
- `Data/F4SE/Plugins/ActiveEffects/locales/*.json` — переводы интерфейса.
- `Data/F4SE/Plugins/ActiveEffects/fonts/*.{ttf,otf,woff,woff2}` — кастомные шрифты.
Все три папки сканируются один раз при старте игры (`kGameDataReady`).
## Добавление своего эффекта
Создайте в `definitions/` файл `<Ключ>.json` и положите рядом иконку — схема и пример подробно описаны в `/definitions/README.txt` (тот же файл разворачивается в `Data/F4SE/Plugins/ActiveEffects/definitions/README.txt`). Коротко:
```json
{
"displayName": "Adrenaline Rush",
"magicEffect": { "editorID": "Adrenalin", "plugin": "Fallout4.esm", "formId": "0x80F" },
"icon": "Adrenalin.svg",
"defaults": {
"x": 5, "y": 10,
"mode": "iconOnly",
"colorMode": "ring",
"colorMin": "#8B0000", "colorMax": "#00C800",
"invert": false,
"scale": 1.0, "opacity": 1.0,
"visible": true,
"freePosition": false, "order": 0,
"flashOnly": false, "flashSeconds": 3.0,
"showName": true
}
}
```
Эффекты всегда читаются с игрока. Если эффект найти не удалось — определение пропускается с предупреждением в лог, остальные эффекты это не затрагивает.
## Добавление перевода / шрифта
`locales/<код>.json` с `displayName` + плоской картой `strings` (полный список ключей — в `/locales/en.json`), и просто файл шрифта в `fonts/`.

