Headless modding toolkit for Space Rangers HD: A War Apart / Космические рейнджеры HD: Революция.
Публичная GitHub-версия универсального SRHD ModKit для анализа, изменения и безопасной сборки модов. Автор: Xenomorphchyma.
Публичное название — SRHD XenoModKit. Внутренние имена
SRHD ModKit,srhd_modkit,srhd.pyиsrhd.cmdсохранены для совместимости.
- проверять мод целиком и выпускать воспроизводимый ZIP с SHA-256-манифестом;
- читать и изменять BlockPar
DATбез ручного открытия редактора; - анализировать, декомпилировать, сравнивать, изменять и собирать
RSON, модульныеRSM, legacy-SVRиSCR; - обнаруживать опасные runtime-шаблоны, связанные с зависанием на «Проходит время»;
- проверять регистрацию скриптов в
Main.datи согласованностьCacheData; - находить ошибки CP1251, UTF-8 и повреждённый русский текст до запуска игры;
- нативно проверять и преобразовывать
GI ↔ PNGбез RangerTools или Pillow; - читать, проверять и извлекать
GAI,HAIиPKG; - детерминированно собирать подтверждённые разновидности
GAIиPKG; - нативно читать, проверять, редактировать через JSON и собирать текстовые квесты
QM/QMMбез TGE; - анализировать зависимости и конфликты активного набора модов;
- собирать варианты проекта, кэшировать дорогие компиляции и публиковать папку/ZIP из одного
srhd-modkit.toml; - создавать и статически проверять Host API V1 x86-плагины XenoNativeLoader 0.6.5+ (проверено с 0.6.7 из XenoMods), не исполняя недоверенную DLL;
- сохранять неизвестные форматы побайтно и отмечать неполное покрытие.
ModKit разворачивает мод в игру только по явной release deploy,
project deploy либо настроенной project publish, не изменяет ModCFG.txt
и не требует GUI.
- Исправлены ложные ошибки для графовых
TVar Array: повторныйnewarrayне обязателен, а доказанныйArrayDelete(array, 0)допускает последующий обход с нуля до сброса массива. - Прямой ограниченный обход
GalaxyStar(i)при0 <= i < GalaxyStars()распознаётся без лишнего null-guard; сохранённые индексы, изменение счётчика и условные присваивания не получают общего исключения. script buildи Python API принимают точечный--allow CODE[:GLOB]. Project workflow передаёт свои исключения в RSON-компиляцию; подавленные сообщения остаются в JSON, а набор исключений входит в ключ кэша.- Исправлен кэш исходников внутри папки мода: случайный путь staging больше не вызывает постоянную пересборку;
project planи build согласованы. - Добавлены перекрёстные тесты CacheData для BlockParEditor 1.9/2.1 и трёх кодировок, а также реальная MSVC x86-сборка Native Loader-плагина с проверкой отсутствующей DLL, кэша и повторяемости ZIP.
- Обновлены руководство по скриптам, документация проектной сборки и скилл для нейросетей.
Проверка выпуска: 400 тестов и 42 подтеста прошли, 2 теста пропущены.
Четыре интеграционных теста останавливаются при legacy SVR → RSON с
Runtime error 217 внешнего RScript 4.10f. Сбой воспроизведён и до этих
изменений; он не считается исправленным. RScript 4.15f отдельно успешно
пересобрал оба проверяемых планетарных мода. Не отключайте проверку результата
ради обхода ошибки старого EXE.
Требуется Windows 10/11 x64 и Python 3.12 или новее. Для проверки поведения мода в игре нужна установленная Space Rangers HD, но путь к игре не требуется для запуска самой библиотеки.
git clone https://github.com/Xenomorphchyma/SRHD-XenoModKit.git
Set-Location SRHD-XenoModKit
python -B srhd.py --version
python -B srhd.py --helpОбязательных Python-пакетов нет. Установка через pip для запуска srhd.py не нужна.
Проверить доступность дополнительных кодеков:
python -B srhd.py toolsДля полной работы с DAT, RSON/RSM/SCR и legacy-SVR запустите:
.\scripts\setup-tools.ps1Скрипт скачивает BlockParEditor 2.1, RScript 4.15f и rsmc из официальных зафиксированных релизов, проверяет SHA-256 архивов и EXE и кладёт их рядом с клоном:
Рабочая папка/
├── SRHD-XenoModKit/
├── BlockParEditor/
├── RScript/
├── RScript410/
└── RSMCompiler/
При обновлении уже проверенные 1.9/4.10f не удаляются: установщик переносит их
в BlockParEditor19/ и RScript410/. На чистой установке 4.10f также
добавляется в RScript410/, потому что она нужна для legacy RSON ↔ SVR,
которой больше нет в CLI 4.15f.
Другой каталог можно задать явно:
.\scripts\setup-tools.ps1 -ToolsRoot C:\SRHD-Tools
python -B srhd.py tools --tools-root C:\SRHD-ToolsПодробные источники, контрольные суммы и ручная установка описаны в THIRD_PARTY_TOOLS_RU.md.
| Возможность | После клонирования | Дополнительный инструмент |
|---|---|---|
| структура мода, ModuleInfo, пути, мусорные файлы | да | — |
| кодировки и русский игровой текст | да | — |
| SCR binary-аудит и runtime-lint RSON | да | — |
GI ↔ PNG, включая режимы 0_32, 0_16, 2 |
да | — |
| GAI/HAI/PKG чтение и проверка | да | — |
| GAI/PKG сборка с обратной проверкой | да | — |
| QM/QMM чтение, JSON-редактирование, сборка и аудит | да | — |
| неизвестные форматы и SHA-256-манифест | да | — |
| DAT ↔ TXT и полный DAT-аудит | после setup | BlockParEditor 2.1 |
| RSON ↔ SCR, настоящий CLI SCR → RSON | после setup | RScript 4.15f |
| RSM export/build/validate | после setup | RScript 4.15f + rsmc |
| RSON ↔ SVR (legacy) | после setup | совместимый RScript 4.10f |
Быстрый аудит во время разработки:
python -B srhd.py audit C:\Mods\MyMod --profile dev --jsonПолная проверка и релиз:
python -B srhd.py release check C:\Mods\MyMod --json
python -B srhd.py release build C:\Mods\MyMod C:\Releases\MyMod.zip --json
python -B srhd.py release plan C:\Work\MyMod "C:\Games\Space Rangers HD\Mods" --prefix OtherMods/MyMod --json
python -B srhd.py release deploy C:\Work\MyMod "C:\Games\Space Rangers HD\Mods" --prefix OtherMods/MyMod --overwrite --jsonrelease deploy принимает корень Mods/Builds, а --prefix — путь мода
внутри него. Существующая целевая папка заменяется только при явном
--overwrite; это точная замена, поэтому файлы, удалённые из проекта, не
сохраняются от прежней сборки. Исходники исключены по умолчанию.
Release staging is audited again after all excludes are applied. A source
Source/.../Main.txt does not replace runtime CFG/Main.dat, and symlinks or
junctions are rejected instead of silently omitted. Unknown formats remain
non-blocking by default; CI can opt into --require-complete. Failed audit
execution is exposed as operational_failure=true and exit code 3.
Для постоянной разработки удобнее один раз добавить проектный файл, а затем использовать короткие команды:
python -B srhd.py project init C:\Work\MyMod --json
python -B srhd.py project plan --variant earth-test --json
python -B srhd.py project doctor --json
python -B srhd.py project validate
python -B srhd.py project build --variant earth-test --json
python -B srhd.py project deploy --variant earth-test --target game --dry-run --json
python -B srhd.py project publish --variant release --jsonПроверка обновления и языков:
python -B srhd.py release upgrade-check C:\Work\MyMod-old C:\Work\MyMod-new --json
python -B srhd.py lang coverage C:\Work\MyMod-new --base Rus --json
python -B srhd.py schema validate C:\Work\MyMod-new.audit.json --json
python -B srhd.py native init C:\Work\MyNativeMod --id MyNativeRuntime --json
python -B srhd.py native validate C:\Work\MyNativeMod --jsonПолная схема, варианты, кэш, цели и восстановление описаны в руководстве по проектной сборке.
Безопасная рабочая копия:
python -B srhd.py stage C:\Mods\Original C:\Work\MyModDAT / BlockPar:
python -B srhd.py dat tree C:\Work\MyMod\CFG\Main.dat --json
python -B srhd.py dat decode C:\Work\MyMod\CFG\Main.dat C:\Work\Main.txt
python -B srhd.py dat validate C:\Work\MyMod\CFG\Main.dat --jsonСкрипты:
python -B srhd.py script audit-mod C:\Work\MyMod --json
python -B srhd.py script lint-runtime C:\Work\MyMod --strict --json
python -B srhd.py script decompile C:\Work\Mod_Name.scr C:\Work\Mod_Name.rson `
--lang-dat C:\Work\Lang.dat --json
python -B srhd.py script compare-scr C:\Work\Original.scr C:\Work\Patched.scr --json
python -B srhd.py script compare-storage C:\Work\Old.rson C:\Work\New.rson --json
python -B srhd.py script set-code C:\Work\Script.rson C:\Work\Script.edited.rson `
--id 17 --field OnActCode --code-file C:\Work\player-buy-handler.txt
python -B srhd.py script build C:\Work\Script.rson --scr C:\Work\Script.scr --lang C:\Work\Lang.txt
python -B srhd.py script export-rsm C:\Work\Script.rson C:\Work\ScriptRsm --split
python -B srhd.py script validate-rsm C:\Work\ScriptRsm\main.rsm --lang-base C:\Work\Lang.dat --json
python -B srhd.py script build-rsm C:\Work\ScriptRsm\main.rsm --scr C:\Work\Script.scr `
--lang-dat C:\Work\Lang.dat --lang-base C:\Work\Lang.base.dat --jsonТекстовые квесты без TGE:
python -B srhd.py quest info C:\Work\Quest.qmm --json
python -B srhd.py quest validate C:\Work\Quest.qmm --json
python -B srhd.py quest export-json C:\Work\Quest.qmm C:\Work\Quest.json
python -B srhd.py quest build C:\Work\Quest.json C:\Work\Quest.edited.qmm --json
python -B srhd.py quest roundtrip C:\Work\Quest.edited.qmm --jsonGI/PNG без дополнительных программ:
python -B srhd.py convert gi-png C:\Work\Images -o C:\Work\PNG
python -B srhd.py convert png-gi C:\Work\PNG -o C:\Work\Images --mode 0_320_32 сохраняет RGBA пиксель-в-пиксель; 0_16 использует RGB565, а режим
2 — три RLE-слоя с RGB565 и отдельной прозрачностью. Старые GI типов 1,
3, 4 и служебные GI с нулевым холстом сохраняются без изменений и честно
получают unsupported, поскольку их нельзя безопасно представить как PNG.
При выводе в DATA\ItemsUseless режим 2 рекомендуется для совместимости
крупного слота и уменьшенных карточек предмета. Если явно выбран другой режим,
конвертация всё равно завершается, а CLI/Python API возвращает рекомендацию
gi-items-useless-mode-2-recommended.
Для поддерживаемого GI команды resource info --json и
resource verify --json включают alpha_geometry: непустые границы с
исключительным finish_x/finish_y, прозрачные поля, их асимметрию и
взвешенный по альфе центр. Это диагностические числа, а не автоматическая
оценка художественной композиции.
По умолчанию небольшой проект RScript получает 60 секунд без подтверждённого
прогресса и не менее 600 секунд общего времени. Для крупных проектов оба окна
автоматически растут по размеру RSON/SCR, числу объектов и строк кода. Изменение
ожидаемого файла, файловый ввод-вывод процесса или переход шага скрытой
автоматизации сдвигают окно; простая загрузка CPU прогрессом не считается.
Положительный --timeout задаёт явный общий предел, а 0 у script build или
обоих таймаутов декомпиляции и сравнения отключает оба ограничения.
Совместимость активных модов без изменения ModCFG.txt:
python -B srhd.py compat "C:\Games\Space Rangers HD\Mods\ModCFG.txt" `
--mods-root "C:\Games\Space Rangers HD\Mods" --jsonload_order и владельцы пересекающихся путей выводятся в эффективном порядке
движка: стабильная сортировка по возрастанию Priority, где отсутствующее поле
равно нулю, а CurrentMod разрешает равенство. Исходная позиция остаётся в
configured_order; compat никогда не переписывает конфигурацию. Даже при
известном порядке сложное наложение сохраняет resolution: unknown, пока
семантика конкретного BlockPar/SCR/CacheData-пересечения не доказана.
release buildсоздаёт staging-копию, проверяет архив повторным чтением и сверяет хэши.- Ошибки блокируют релиз; предупреждения блокируются только с
--warnings-as-errors. unsupportedозначает неполное покрытие, а не повреждение файла.- GUI заблокирован по умолчанию и не нужен для штатных сценариев.
script validateдо запуска RScript ловит незакрытые строки/комментарии/скобки и случайный русский текст вне строки или комментария — известную причину зависания старого компилятора.script decompileв RScript 4.15f использует настоящий CLI; 4.10f запускается только как legacy-бэкенд на изолированном невидимом desktop. Исходный SCR не изменяется, а RSON публикуется лишь после циклаSCR → RSON → SCR.- Сбой импорта непустого Lang.dat не скрывается: JSON содержит структурированную диагностику, а восстановление без диалогов выполняется только по явному
--fallback-without-lang. - Машинные отчёты декомпиляции, сравнения и совместимости persistent-хранилища имеют схемы
srhd-modkit-decompile-v1,srhd-modkit-scr-compare-v1иsrhd-modkit-storage-compat-v1. - Непроверенное восстановление удаляется; сохранить его можно только по отдельному явному пути
--keep-unverified.--deep-roundtripдополнительно проверяет стабильность числа объектов, связей, строк кода и типов после второго восстановления. - QM/QMM writer не меняет исходник: JSON собирается в новый QMM, затем файл перечитывается и сравнивается с моделью. Проверка формата не заменяет прохождение квеста в игре.
- HAI поддерживается только для чтения и проверки.
- Статический анализ не заменяет запуск в игре, проверку сохранений и конкретной комбинации модов.
- Подробное руководство на русском
- Архитектура аудита и границы форматов
- Скриптинг SRHD и runtime-lint
- Текстовые квесты QM/QMM
- Проектная сборка, варианты, кэш и deploy
- Внешние инструменты и SHA-256
- Уведомления о сторонних исследованиях форматов
- Авторство
В репозитории находится headless-скилл .agents/skills/srhd-modkit. При работе Codex внутри клона он обнаруживается автоматически; явный вызов:
$srhd-modkit
Скилл требует использовать CLI/Python API, не запускать GUI, не изменять установленную игру и честно сообщать о неполном покрытии.
python -B -m unittest discover -s tests -vТекущий набор из 325 тестов проверяет нативные PNG/GI, лексический preflight,
прогресс-зависимые таймауты, fail-closed декомпиляцию, глубокий round-trip,
RScript 4.10f/4.15f, RSM/rsmc, BlockPar 2.1 и завершение скрытого дерева
процессов при обрыве агента, а также
QM/QMM reader/writer, формулы квестов и JSON-цикл. На локальном корпусе глубоко проверено 3098 из 3131
GI; оставшиеся 33 корректно классифицированы как unsupported. Дополнительно
dev-аудит был выполнен на 425 установленных модах без падений валидаторов.
В корпусе распознано 48 QM/QMM.
SRHD XenoModKit создан и поддерживается Xenomorphchyma. Сторонние кодеки и форматы принадлежат их соответствующим авторам; они перечислены отдельно и не присваиваются проекту.