F4SE-плагин для Fallout 4, который выводит на экран hardcore-survival статы игрока (адреналин, недосып, голод, жажда — и любые другие ActorValue, которые вы захотите добавить самостоятельно!) в виде иконок с процентом или полосой, обновляющихся в реальном времени. Отображение реализовано через [PrismaUI](https://www.nexusmods.com/fallout4/mods/) (веб-слой поверх игры); C+±часть только отслеживает изменения ActorValue и управляет данными, вся отрисовка — на TypeScript/React.
https://www.youtube.com/watch?v=SFAdcvwTjrg
## Возможности
- Живое обновление без опроса — реакция на `ActorValueChangedEvent`, а не поллинг каждый кадр.
- Два режима отображения иконки: «иконка + процент» и «иконка + полоса».
- Цветовой градиент между цветом на 0% и цветом на 100% (с возможностью инверсии — 0 читается как 100% и наоборот).
- Прозрачность и масштаб — отдельно для каждой иконки.
- Режим «показывать только при изменении»: иконка появляется при изменении значения и гаснет через заданную задержку; можно задать «критическое» значение (мин/макс), при пересечении которого иконка становится видна постоянно.
- Свободное позиционирование иконки (drag-n-drop) **или** автоматическая раскладка в одном из двух фреймов:
- **Permanent** — сетка слева-направо/сверху-вниз с ручным порядком.
- **Temporary** — группа по центру, предназначена для иконок «только при изменении».
Фреймы можно двигать и растягивать, у каждого настраивается выравнивание содержимого (с начала / по центру / с конца).
- Панель настроек прямо в игре — все перечисленное выше настраивается мышью, без правки файлов.
- Всё расширяется без пересборки плагина простым добавлением файлов в соответствующие папки:
- свои статы (`definitions`),
- переводы интерфейса (`locales`),
- кастомные шрифты (`fonts`).
- Горячая клавиша, открывающая панель настроек, переназначаема и требует удержания (не короткого нажатия) — чтобы не мешать другому назначению той же клавиши.
## Возможности добавления своих иконок для отслеживания и отображения любых ActorValue
- Вам всего лишь нужно добавить файл .json с описанием вашей иконки и .svg с изображением в F4SE/Plugins/SurvivalStats/definitions по образцу как это сделано для иконок выживания.
## Требования
- [F4SE](https://f4se.silverlock.org/)
- [PrismaUI_F4](https://www.nexusmods.com/fallout4/mods/) (плагин использует V4 API — нужна свежая версия)
## Установка
Через любой менеджер модов (MO2, Vortex) — обычная структура `Data/…`. Собранный `SurvivalStats.dll` кладётся в `Data/F4SE/Plugins/`, вместе с ним разворачивается папка `Data/F4SE/Plugins/SurvivalStats/` (иконки/шрифты/переводы) и веб-интерфейс в `Data/PrismaUI_F4/views/SurvivalStats/`.
## Использование
1. Удерживайте горячую клавишу (по умолчанию **F4**) не менее 3 секунд — откроется панель настроек, поверх HUD появятся иконки для перетаскивания.
2. В обычном режиме HUD кликов не перехватывает — управление персонажем не блокируется, панель просто не отрисовывается поверх геймплея.
3. Чтобы закрыть панель — снова удержите ту же клавишу нужное время.
### Что можно сделать в панели
**Общие настройки** (вверху панели):
- **Show HUD** — полностью показать/скрыть HUD (панель настроек при этом всё равно доступна).
- **Language** — выбор языка интерфейса из обнаруженных файлов в `locales/`.
- **Font** — выбор шрифта из обнаруженных файлов в `fonts/` (или «По умолчанию»).
- **Hotkey** — текущая горячая клавиша + кнопка **Rebind** (нажать и затем нажать любую нужную клавишу/кнопку геймпада) + поле длительности удержания в секундах.
**Настройки каждой иконки**:
- **Visible** — показывать иконку вообще.
- Режим отображения — иконка+полоса / иконка+процент.
- Цвет на 0% и на 100% (свой color-picker, т.к. движок PrismaUI не поддерживает нативный ``).
- **Max** — верхняя граница шкалы (сырое значение ActorValue, соответствующее 100%).
- **Invert** — поменять местами 0% и 100%.
- **Opacity** — прозрачность.
- **Size** — масштаб иконки.
- **Free position** — если включено, иконку можно свободно таскать по экрану; если выключено, иконка попадает в один из фреймов (в Permanent — если не стоит «Show only on change», иначе в Temporary).
- **Order** — порядок в сетке Permanent-фрейма (виден только когда иконка не свободная и не «только при изменении»); можно также менять порядок перетаскиванием иконки на другую внутри фрейма.
- **Show only on change** — показывать иконку только при изменении значения:
- **Hide after** — через сколько секунд после последнего изменения иконка скрывается.
- **Critical** — «Off» / «Below value» / «Above value» + пороговое значение: при пересечении порога иконка показывается постоянно, игнорируя таймер скрытия.
**Фреймы** (видны в режиме редактирования, если в них есть хоть одна иконка): заголовок — потяните, чтобы переместить; уголок снизу-справа — потяните, чтобы изменить размер; выпадающий список в заголовке — выравнивание содержимого.
## Где хранятся настройки
- `Data/F4SE/Plugins/SurvivalStats.json` — глобальные настройки: видимость HUD, положение панели, положение/размер/выравнивание фреймов, язык, шрифт, горячая клавиша.
- `Data/F4SE/Plugins/SurvivalStats/definitions/*.json` — **один файл на стат**: и откуда брать значение, и как его показывать. Правки через панель настроек сохраняются прямо в этот файл — отдельного хранилища для «пользовательских» значений нет.
- `Data/F4SE/Plugins/SurvivalStats/locales/*.json` — переводы интерфейса.
- `Data/F4SE/Plugins/SurvivalStats/fonts/*.{ttf,otf,woff,woff2}` — кастомные шрифты.
Все три папки сканируются один раз при старте игры (`kGameDataReady`).
## Добавление своего стата
Чтобы вывести на HUD ещё один ActorValue (свой или из любого другого плагина), создайте в `definitions/` файл `<ИмяСтата>.json` и положите рядом иконку. Имя файла (без расширения) становится внутренним ключом стата.
```json
{
“displayName”: “Radiation”,
“actorValue”: { “editorID”: “RadiationRads” },
“icon”: “radiation.svg”,
“defaults”: {
“x”: 5,
“y”: 50,
“mode”: “iconBar”,
“colorMin”: “#00C800”,
“colorMax”: “#8B0000”,
“maxValue”: 1000,
“invert”: false,
“scale”: 1.0,
“opacity”: 1.0,
“visible”: true,
“showOnChangeOnly”: false,
“hideDelaySeconds”: 3,
“freePosition”: true,
“order”: 0,
“critical”: “none”,
“criticalValue”: 0
}
}
```
Поля:
- `displayName` — имя по умолчанию (используется, если в активном переводе нет ключа `stat.<ИмяФайла>`).
- `actorValue` — как найти ActorValue:
- `editorID` — пробуется первым (например `“Adrenalin”`);
- `plugin` + `formId` — запасной вариант для форм без известного editorID (`formId` — локальный ID внутри плагина, шестнадцатеричной строкой, например `“0x80F”`).
- `icon` — имя файла иконки рядом с JSON. Поддерживаются `.svg`, `.png`, `.jpg`/`.jpeg`, `.webp`.
- `defaults` — стартовые настройки отображения; после первого запуска панель настроек редактирует их прямо в этом файле (поля один в один совпадают с тем, что описано в разделе «Что можно сделать в панели» выше).
Если ActorValue или иконку найти не удалось — стат пропускается с предупреждением в лог, остальные статы это не затрагивает.
## Добавление перевода
Создайте `locales/<код>.json` (например `de.json`):
```json
{
“displayName”: “Deutsch”,
“strings”: {
“panel.title”: “SurvivalStats HUD”,
“field.visible”: “Sichtbar”,
“stat.Adrenalin”: “Adrenalin”
}
}
```
- `displayName` — имя языка, как оно покажется в выпадающем списке.
- `strings` — плоская карта `ключ → перевод`. Полный список ключей интерфейса смотрите в `assets/locales/en.json` (это одновременно и встроенный английский, зашитый в UI как запасной вариант). Переводить можно не всё — отсутствующие ключи подставляются из английского, поэтому частичный перевод не ломает интерфейс.
- Названия статов переопределяются ключом `stat.<ИмяФайлаОпределения>` (например `stat.HungerEffect`) — если такого ключа нет, используется `displayName` из файла определения стата.
## Добавление шрифта
Просто положите файл (`.ttf`/`.otf`/`.woff`/`.woff2`) в `fonts/` — он появится в выпадающем списке «Font» в панели настроек под своим именем файла (без расширения).
## Сборка из исходников
- C++: [xmake](https://xmake.io/), CommonLibF4 (`C:/cpp/clibf4`), glaze (JSON) — `xmake build -y SurvivalStats`. Решение для Visual Studio генерируется командой `xmake project -k vsxmake2022`.
- UI: TypeScript + React + Vite, папка `ui/` (`npm install && npm run build`). Сборка UI запускается автоматически перед сборкой C++ (см. `before_build` в `xmake.lua`) и копируется в `assets/views/SurvivalStats`.
