Lossless-редактор save-файлов кампании Barotrauma. Просмотр и правка любого поля сейва с гарантией байтовой совместимости: всё, что ты не менял, остаётся байт-в-байт как в оригинале.
Кроссплатформенный: работает как веб-приложение (любой современный браузер, файл не
покидает машину) и как нативное десктоп-приложение на Tauri (Linux / Windows / macOS)
с сохранением поверх исходного файла и автоматическим .bak.
Парсер хранит каждый узел вместе с его исходным текстом; сериализатор выводит нетронутые узлы verbatim. Если ничего не изменено — на выходе исходный файл байт-в-байт. Это проверяется self-тестом при каждой загрузке (контейнер, XML и UTF-8 на уровне байтов) до любых правок; при расхождении редактор отказывается работать с файлом.
- Вкладки: Настройки (сложность/множители с подсказками эффектов), Экономика (кошелёк, магазины, сток), Экипаж (скиллы/опыт/таланты/афликции ботов), Карта (радиация, локации, массовый ретроактивный пересчёт запечённой сложности уровней), Инспектор (дерево всего документа, поиск, правка любого атрибута), XML (сырой текст с применением через lossless-проверку), Дифф (было→стало), Проверки (диапазоны, enum'ы, danger-поля).
- Дифф считается структурным сравнением с оригиналом, а не флагами — переживает правку через сырой XML.
- Защита от битых и вредоносных файлов: кап на gzip-бомбы, отказ на не-UTF-8, безопасный декодер entity.
Требования: Node.js ≥ 20. Для десктопной сборки дополнительно Rust ≥ 1.77.2 и системные зависимости Tauri v2 (https://v2.tauri.app/start/prerequisites/).
Rust через rustup: после установки шимов обязательно выбрать тулчейн —
rustup default stable (без этого cargo выдаст «no default is configured»).
На Linux нужен webkit2gtk-4.1: проверка pkg-config --modversion webkit2gtk-4.1;
Debian/Ubuntu: libwebkit2gtk-4.1-dev, Gentoo: net-libs/webkit-gtk (слот 4.1),
Arch: webkit2gtk-4.1.
npm install
npm run dev -w @bse/ui # dev-сервер на http://localhost:5173
npm run build -w @bse/ui # сборка
Результат сборки — один самодостаточный файл packages/ui/dist/index.html
(всё инлайнится). Открывается двойным кликом прямо с диска, никакой сервер не
нужен; файл можно просто переслать другому человеку. Альтернативно:
npm run preview -w @bse/ui поднимет его на localhost.
В браузере открытие через диалог/drag-drop, сохранение — скачиванием файла.
npm install
npm run dev -w @bse/desktop # дев-режим с hot reload
npm run build:bin -w @bse/desktop # только бинарь: src-tauri/target/release/bse
npm run build -w @bse/desktop # бинарь + пакеты (deb/rpm; msi/dmg на своих ОС)
В десктопной версии «Открыть файл…» помнит путь, «Сохранить (.bak)» пишет поверх
исходника (сначала копия имя.save.bak, затем атомарная запись через tmp+rename),
«Сохранить как…» — в новый путь. IPC-поверхность Rust-стороны — ровно две команды:
read_save и write_save_with_backup; никакого доступа к ФС из webview сверх этого,
CSP включён.
cd packages/core
npx tsx test/roundtrip.test.ts # identity контейнера/XML, хирургия мутаций
npx tsx test/model.test.ts # schema, metadata KV, diff, validate
npx tsx test/property.test.ts # случайные правки с гадкими значениями
npx tsx test/compare.test.ts # tree-diff, raw-rebase, bulk rescale
npx tsx test/browser-codec.test.ts # браузерный gzip-путь
npx tsx test/escape.test.ts # entity-декодер: prototype leak, кодпоинты
npx tsx test/hardening.test.ts # gzip-бомба, не-UTF-8
npx tsc --noEmit
Без аргумента тесты генерируют синтетическую фикстуру; чтобы прогнать против
реального сейва — передай путь: npx tsx test/roundtrip.test.ts /path/to.save.
.github/workflows/ci.yml— на каждый push/PR: typecheck обоих пакетов, все 7 тест-сюит на синтетической фикстуре, сборка веб-версии..github/workflows/release.yml— на тегv*(или вручную): tauri-action собирает пакеты под Linux (deb/rpm + голый бинарь в tar.xz), Windows (msi/exe) и macOS (dmg, отдельно aarch64 и x86_64) и складывает их в draft-релиз GitHub.
Выпуск версии:
git tag v0.1.0 && git push origin v0.1.0
После завершения workflow — опубликовать draft-релиз в разделе Releases.
.save = gzip поверх контейнера
[int32 nameLen][UTF-16LE name][int32 dataLen][bytes]… до EOF.
gamesession.xml лежит в контейнере без сжатия (UTF-8 + BOM, CRLF),
.sub-файлы — отдельные gzip, редактором пробрасываются verbatim.
MIT — см. LICENSE.
bse — Barotrauma save editor. Lossless campaign-save editing: every byte you
didn't touch stays identical. Web app + Tauri desktop (Linux/Windows/macOS).
Build web: npm install && npm run build -w @bse/ui. Build desktop:
npm run build -w @bse/desktop (needs Rust ≥ 1.77.2 and Tauri v2 prerequisites).
Tests: see packages/core/test/. MIT licensed.