# Disco Elysium — Русский (Codex) для Windows

Это Windows-установщик отдельной локализации «Русский (Codex)». Он не
заменяет официальный русский язык и умеет вернуть исходные файлы.

## Установка

1. Полностью закройте Disco Elysium.
2. Если скачан ZIP, распакуйте его в обычную папку.
3. Дважды нажмите `Disco-Elysium-Russian-Codex-Windows.exe` и подтвердите
   стандартный запрос Windows на изменение файлов игры.
4. Проверьте найденный путь и нажмите «УСТАНОВИТЬ».
5. Запустите игру и выберите «Русский (Codex)» в настройках языка.

Флажок названий навыков можно выключить: перевод останется, а надписи на
24 карточках будут английскими. Повторный запуск установщика безопасно
переключает этот режим через проверенную резервную копию.

## Удаление

Закройте игру, снова запустите EXE и нажмите
«УДАЛИТЬ / ОТКАТИТЬ».

Резервные копии хранятся в `%ProgramData%\Disco Elysium Russian Codex`.
Установщик сверяет SHA-256 до и после каждой операции и не пишет поверх
неизвестных файлов.

Для сохранения отдельного четырнадцатого языка между запусками установщик
также применяет проверенную точечную правку к `GameAssembly.dll`.
Штатная функция знает только индексы `0…12` и превращает индекс
«Русский (Codex)» (`13`) в Japanese. Патч хранит в `Settings.json` безопасный
индекс English (`0`), а реальное I2-имя `RussianBlind` — в штатном
PlayerPrefs-ключе `I2 Language`. При установленном моде English-ветка читает
это I2-имя; при удалении игры через Steam оригинальная DLL видит обычный
индекс `0` и запускается на English. Остальные официальные языки не меняются.
Оригинальная DLL резервируется и целиком восстанавливается при удалении мода.

Сборки установщика до версии 1.0 могли сохранить копию в пользовательском
`%LOCALAPPDATA%` или в системном профиле Parallels. Новый установщик
автоматически переносит такую копию в `%ProgramData%`, но только после
проверки её точного SHA-256.

## Совместимость

Проверенный профиль: Windows-версия Disco Elysium Steam build `23980936`.
Поиск не привязан к магазину: GOG или другая установка с тем же точным
набором Unity-файлов также принимается. Отличающаяся сборка будет
остановлена до любых изменений и потребует отдельного профиля хэшей.

Перевод перенесён из общего языкового пакета. Windows и macOS используют
разные установщики и платформенные Unity-патчи, но один и тот же текст,
I2-имя `RussianBlind`, код `ru-RU` и видимое имя «Русский (Codex)».

Установщик также согласует пользовательские настройки языка: после установки
он записывает безопасный индекс `0` и I2-имя `RussianBlind`, а после удаления
возвращает `0` + `English`. Steam не удаляет `Settings.json` и Unity
PlayerPrefs вместе с игрой, поэтому хранить нестандартный индекс `13` на диске
нельзя: он переживает переустановку и в оригинальной DLL означает Japanese.

Основной Windows lockit имеет отдельные `m_Name`, `m_AssetBundleName`,
CAB и `.resS`-узел. При сборке также переписывается путь потоковых данных
текстуры на новый CAB. Совпадение CAB с официальным `lockits/russian`
приводит к отказу Unity загрузить пользовательский bundle: отдельные
подписи карточек остаются русскими, а заголовки, описания навыков и другой
`GeneralLockit` отображаются по-английски. Поэтому генератор проверяет и
детерминированно переименовывает все UnityFS-узлы основного lockit.

Патч `GameAssembly.dll` привязан к точному SHA-256 Steam build `23980936`.
На неизвестной DLL установка останавливается до записи. Генератор
`scripts/patch_startup_language.py` дополнительно проверяет исходные байты
функции `SettingsPersister.GetLanguageName`, а релиз несёт только компактный
`GameAssembly.dll.dcpatch`, не оригинальную DLL игры.

EXE не подписан коммерческим сертификатом, поэтому SmartScreen может
показать предупреждение о неизвестном издателе. Контрольные суммы внутри
пакета всё равно проверяются до и после каждой операции.

## Сборка

Windows EXE кросс-компилируется на macOS командой `../build.sh`. Требуются
Xcode для macOS-приложения и MinGW-w64 (`x86_64-w64-mingw32-gcc` и
`windres`) для нативной Windows-оболочки. Проверенные `.dcpatch` являются
исходными данными релиза и лежат в `assets/patches`; каталог `work` в
сборку не входит.
