SurvivalStats HUD

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`.