Expand local_machine docs and automation for connectivity, games, and ops.

Add proxy/VPN/telegram launchd and emergency runbooks; reorganize apps docs;
document JA3 CrossOver runbook and Wine troubleshooting; add GOG/HoMM game
scripts, disk cleanup guides, and gitea push-via-proxy helper. Ignore temp/.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
ahauimix
2026-06-01 08:12:19 +03:00
parent a39ef89125
commit 1938b7c743
135 changed files with 9933 additions and 388 deletions

View File

@@ -0,0 +1,117 @@
# GOG Galaxy — RCA за ~7 часов (2026-05-28)
Bottle: **GOG-Install** (`9ee55e7c-a58e-411e-a93f-30530d4f1073`).
## Swap / подвисание Mac
Запуски Galaxy (CEF + несколько `GalaxyClient Helper` + MoltenVK в foreground) **грузят RAM и swap**. При `used swap` > ~400MB скрипты **блокируют** новый запуск.
```bash
bash ~/code/local_machine/scripts/games/gog/emergency-stop.sh
# перезагрузка Mac — если система всё ещё тяжёлая
```
**Не запускать подряд:** `launch-galaxy.sh`, `launch-galaxy-ui.sh`, Whisky pin — без `emergency-stop` между попытками.
## Статус (честно)
| Что проверено | Результат |
|---------------|-----------|
| `GalaxyClient.exe` в процессах после `launch-galaxy.sh` | **Да** (многократно) |
| `GalaxyInitialization.log`: `will continue` | **Да** |
| `GalaxyClient.log`: `Showing login form` | **Да** |
| `GalaxyClient.log`: `Successfully brought window to the foreground` | **Да** |
| **Окно видно пользователю на macOS** | **Нет** (не подтверждено) |
**Вывод:** клиент **запускается**, login UI **в логах есть**; проблема — **отрисовка/привязка окна CEF в Wine на Mac**, не «бинарника нет».
Собрать свежие логи:
```bash
bash ~/code/local_machine/scripts/games/gog/collect-gog-logs-7h.sh
```
## Хронология (по логам bottle, MSK)
| Время (≈) | Событие | Значение |
|-------------|---------|----------|
| 04:56 | `Second client instance``will exit` | повторный launch без `reset.sh` |
| 05:08 | то же | lock / второй экземпляр |
| 05:1505:18 | `will continue`, login form, foreground | **рабочий запуск процесса** |
| 05:1905:20 | `DeelevateStrategy` fatal, exit **-31** | запуск **без** `/deelevated` (vdesktop) |
| 05:21+ | `/deelevated` в Init, login form | фикс в `config.sh` |
| 05:2905:35 | login + foreground (vdesktop) | процесс OK, окно на Mac — нет |
| 06:53 | Init: `/deelevated /runWithoutUpdating`, login form | последний автотест |
## Типичные строки в логах
**Успех процесса:**
```
Initialization strategy 'InitClientStrategy' ... The client will continue.
No refresh token found. Showing login form.
Successfully brought window to the foreground.
```
**Падение (старый антипаттерн):**
```
Something went wrong during DeelevateStrategy.
... exit code -31 (Privilege de-elevation is needed.). The client will exit.
```
**Окно на Mac (CEF):**
```
Received message from source not matching parent window.
eglInitialize: No available renderers.
```
## JA3 без Galaxy UI (рекомендуется на этом Mac)
Galaxy login в Wine **не показывает окно** → ставить игру через **offline installer** в браузере:
1. https://www.gog.com/ → Library → Jagged Alliance 3 → **Download offline backup**
2. На Mac:
```bash
bash ~/code/local_machine/scripts/games/gog/emergency-stop.sh
bash ~/code/local_machine/scripts/games/gog/install-ja3-offline.sh ~/Downloads/setup_jagged_alliance_3*.exe
```
## Канон запуска Galaxy (best effort, может не быть окна)
1. **Whisky GUI (предпочтительно для окна):**
```bash
bash ~/code/local_machine/scripts/games/gog/launch-galaxy-whisky.sh
# → pin «gog-galaxy» → Run
```
2. **Терминал (процесс + логин в логе):**
```bash
bash ~/code/local_machine/scripts/games/gog/reset.sh
bash ~/code/local_machine/scripts/games/gog/launch-galaxy.sh
```
3. **Если окна нет — foreground + vdesktop:**
```bash
bash ~/code/local_machine/scripts/games/gog/launch-galaxy-ui.sh
```
4. **A/B CEF (как Steam):**
```bash
GOG_CEF_PROFILE=steam bash ~/code/local_machine/scripts/games/gog/launch-galaxy-ui.sh
```
## Что не считать «успехом»
- Скрипт печатает `OK: GOG Galaxy запущен` — только процесс + лог, **не** видимое окно.
- Web-stub / `GalaxySetup.exe` в Wine — **не** доводят установку (gdi32/Inno).
## Связанные документы
- [TROUBLESHOOTING.md — GOG Galaxy: окно](TROUBLESHOOTING.md#gog-galaxy-окно-не-открывается)
- [gog/README.md](../../scripts/games/gog/README.md)

View File

@@ -0,0 +1,216 @@
# Jagged Alliance 3 на Mac без GOG Galaxy
**Полный runbook (установка + графика + RCA + антипаттерны):** [JA3_RUNBOOK.md](JA3_RUNBOOK.md)
Источники: [GOG — offline installers](https://support.gog.com/hc/en-us/articles/213148105-How-do-I-download-my-purchased-items), [Porting Kit / JA3](https://www.paulthetall.com/jagged-aliance-3-for-mac/), практика на этой машине (**установка 2026-05-28**, **запуск CrossOver 2026-05-29**).
## Главное
| | |
|--|--|
| **GOG Galaxy** | **не нужен** для одиночной игры (DRM-free) |
| **Galaxy** | только для мультиплеера (по карточке GOG) |
| **Что нужно** | **Offline backup** (Windows): `setup_*.exe` + `setup_*-1.bin``-4.bin` |
| **Установка** | **`innoextract`** в bottle — **не** Wine-Inno (падает на botva2/gdi32) |
| **Исполняемый файл** | `C:\GOG Games\Jagged Alliance 3\JA3.exe` |
| **Bottle** | **GOG-Install** (`scripts/games/gog/bottle.env`) — не HoMM/Steam |
| **Galaxy в Wine** | **не использовать** для JA3 — CEF, swap ([GOG_GALAXY_7H_RCA.md](GOG_GALAXY_7H_RCA.md)) |
| **Запуск игры** | **CrossOver** `run-ja3-crossover.sh` — см. [JA3_RUNBOOK.md](JA3_RUNBOOK.md) |
| **Steam.app / Steam.exe** | **не в контуре** — отдельный bottle HoMM; в GOG-bottle клиента Steam быть не должно |
### Не путать с Steam
В логе JA3 бывает `Steam initialized (AppId …, Beta branch GOG)` — это **GOG Galaxy wrapper** (`steam_api64.dll` + `Galaxy.dll` в папке игры), **не** установленный Steam client и **не** `Steam.app` на Mac.
| Файл | Это |
|------|-----|
| `steam_api64.dll` в папке JA3 | GOG API-шим, **не удалять** |
| `Program Files (x86)/Steam/steam.exe` | Steam client — **удалить** из GOG-bottle |
```bash
# только GOG-bottle:
bash ~/code/local_machine/scripts/games/gog/purge-steam-from-bottle.sh
# все bottle + остатки macOS:
bash ~/code/local_machine/scripts/games/purge-steam-wine.sh
```
---
## Runbook: установка multipart с экономией диска
Сценарий: все части offline backup лежат в **`~/Games/`** (или `JA3_GAMES_DIR`). На диске мало места (~1012 GB свободно) — **нельзя** копировать 15 GB архивов в bottle и **нельзя** распаковывать во вторую папку `cache/`.
### Файлы (5 частей, одна папка)
| Файл | Размер | Роль |
|------|--------|------|
| `setup_jagged_alliance_3_1.5.2_(80730).exe` | ~1.6 MB | Лаунчер Inno (обязателен) |
| `setup_jagged_alliance_3_1.5.2_(80730)-1.bin``-4.bin` | ~15 GB суммарно | Данные установщика |
Имя `.exe` должно **совпадать с префиксом `.bin`** (без ` (1)` от браузера). Если скачали как `…(80730) (1).exe` — переименовать в `…(80730).exe`.
### Почему не Wine
```bash
# ❌ install-ja3-multipart.sh / install-ja3-offline.sh через wine64
# Падает за ~10 с — Inno Setup + botva2 в Wine (как GalaxySetup).
```
Канон при **наличии архивов**: **`install-ja3-innoextract.sh`** + **`run-ja3.sh`** (флаг `-unpacked`).
**Важно:** одного innoextract **мало** — Inno не выполняет пост-скрипты (Lua/VFS). Скрипты копируют `CommonLua` и запускают с **`-unpacked`**. Если графика падает (`Failed creating render device`) — доведите установку Wine-инсталлятором: **`install-ja3-wine-finish.sh`** (нужны все 5 файлов в `~/Games/`) или [Porting Kit](https://www.paulthetall.com/jagged-aliance-3-for-mac/).
### Алгоритм экономии места (что делает скрипт)
1. **Перед стартом** — безопасная очистка cache (не трогает архивы в `~/Games`):
- `scripts/games/cache/gog-galaxy-extract-gog-bottle`
- `scripts/games/cache/ja3-extract-test`
- `setup_galaxy.exe` в cache, если Galaxy уже установлен в bottle
2. **Распаковка сразу в bottle**`…/drive_c/GOG Games/Jagged Alliance 3/` (без дубликата в `cache/`).
3. **По ходу `innoextract`** — при сообщении `Opening "…-2.bin"` удаляется `-1.bin`, при `-3.bin``-2.bin`, при `-4.bin``-3.bin` (освобождает ~4 GB за шаг).
4. **Флаг `-m`** — не извлекать временные файлы Inno (`tmp/`).
5. **После успеха** — удаляются оставшиеся `.bin` и `.exe` в `~/Games` (~15 GB). Отключить: `JA3_KEEP_BINS=1`.
Пиковая нагрузка на диск: **~16 GB** под игру в bottle + оставшиеся `.bin` (уменьшаются по шагам 3), а не **~31 GB** (архивы + полная копия в cache).
Минимум свободного места на Data: **~800 MB** во время работы (`JA3_MIN_FREE_MB`, по умолчанию 800), при условии что срабатывает удаление `.bin` по ходу. Если диск забит на 100% — сначала освободить 12 GB вручную (Корзина, cache), иначе `innoextract` упадёт на больших `Packs/*.hpk`.
### Команды (один раз)
```bash
# 1) Bottle GOG-Install (если ещё нет)
bash ~/code/local_machine/scripts/games/gog/list-bottles.sh
bash ~/code/local_machine/scripts/games/gog/use-bottle.sh <UUID> GOG-Install
bash ~/code/local_machine/scripts/games/gog/setup-ja3-bottle.sh # DXVK в GOG-bottle
# 2) Все 5 файлов в ~/Games/
ls ~/Games/setup_jagged_alliance_3_1.5.2_\(80730\)*
# 3) Установка (innoextract + экономия диска)
bash ~/code/local_machine/scripts/games/gog/install-ja3-innoextract.sh
# Лог: /tmp/ja3-innoextract-GOG-Install.log
```
Обёртка с автодетектом multipart в `~/Games`:
```bash
bash ~/code/local_machine/scripts/games/gog/install-ja3.sh
```
Недостающий только `.exe` (~1 MB):
```bash
# account.gog.com → JA3 → offline backup, первая часть
# или:
lgogdownloader --login
bash ~/code/local_machine/scripts/games/gog/fetch-ja3-setup-exe.sh
```
### Переменные окружения
| Переменная | По умолчанию | Назначение |
|------------|--------------|------------|
| `JA3_GAMES_DIR` | `~/Games` | Папка с `setup_*.exe` и `.bin` |
| `JA3_MIN_FREE_MB` | `800` | Стоп, если свободно меньше (MB) |
| `JA3_KEEP_BINS` | `0` | `1` — не удалять архивы после установки |
| `JA3_CLEANUP_PARTIAL` | `1` | Удалить незавершённую распаковку в bottle при ошибке |
### Графика: DirectX 12 (обязательно на Mac)
JA3 на Windows использует **D3D12**. **DXVK-macOS** (только D3D10/11) **не заменяет** D3D12.
#### Корневая причина «Failed to initialize graphics subsystem» (RCA 2026-05-29, M1 Pro)
| Слой | Что происходит |
|------|----------------|
| **Whisky / Gcenx Wine 11.9** | `d3d12.dll` = wined3d → **Vulkan** (`d3d12_get_vk_physical_device Could not find Vulkan physical device`). **Нет D3DMetal hooks** ([Gcenx#97](https://github.com/Gcenx/macOS_Wine_builds/issues/97)). |
| **GPTK PE + Gcenx ntdll** | `__wine_unix_call` / `dxgi.dll not found` — PE DLL GPTK несовместимы с чужим Wine. |
| **GPTK Wine 7.7 alone** | `comctl32.dll failed to initialize` на этой macOS — не запускается даже notepad. |
| **CrossOver 26 + D3DMetal** | **Работает.** Встроенные `apple_gptk` + `WINED3DMETAL=1`. |
Сообщения GOG API (`MatchmakingServers`, `Music`, `Game name not defined`) — **не причина** краша.
#### Канон запуска (подтверждено на этой машине)
```bash
brew install --cask crossover # один раз
bash ~/code/local_machine/scripts/games/gog/setup-ja3-crossover.sh
bash ~/code/local_machine/scripts/games/gog/run-ja3-crossover.sh
```
CrossOver bottle **JA3-GOG** (win10_64, D3DMetal on). Игра клонируется APFS clonefile в bottle (Wine **не читает** symlink за пределы prefix → `CommonLua/Core/autorun.lua not found`).
**Whisky `run-ja3.sh` для D3D12 на Mac не работает** — только CrossOver (или Porting Kit GUI).
Альтернатива GUI: [Porting Kit](https://www.paulthetall.com/jagged-aliance-3-for-mac/) (тот же GPTK/D3DMetal стек).
### Запуск игры
```bash
bash ~/code/local_machine/scripts/games/gog/run-ja3-crossover.sh
```
Whisky (`run-ja3.sh`) — только установка innoextract в GOG-Install; **графика D3D12 → CrossOver**.
Обход (тормоза, на свой риск):
```bash
JA3_IGNORE_SWAP=1 bash ~/code/local_machine/scripts/games/gog/run-ja3.sh
```
Cmd+Tab → `wine64` / `JA3`. В графике при артефактах: **отключить heat haze**.
**Ошибка «Failed to initialize graphics subsystem»:** Whisky/Gcenx Wine **не поддерживает D3DMetal** для d3d12. Используйте **CrossOver**: `setup-ja3-crossover.sh` + `run-ja3-crossover.sh`. Из Whisky Run **не запускать** — только CrossOver bottle JA3-GOG с `start /d` (CWD + CommonLua).
### Итог на диске (после успеха на этой машине)
| До | После |
|----|--------|
| ~15 GB архивы в `~/Games` | архивы удалены |
| bottle ~1.4 GB | bottle **+~16 GB** (`GOG Games/Jagged Alliance 3`) |
| свободно ~10 GB | свободно **~12 GB** (архивы сняты, игра в bottle) |
---
## Скачивание (браузер на Mac)
1. https://www.gog.com/account → **Jagged Alliance 3**
2. **Windows**, язык → **Download offline backup game installers**
3. Скачать **все 5 частей** (`.exe` ~1 MB + четыре `.bin`) в одну папку, например `~/Games/`
---
## Альтернатива: один .exe без .bin
Если GOG отдал один большой `setup_jagged_alliance_3_*.exe` (без multipart):
```bash
bash ~/code/local_machine/scripts/games/gog/install-ja3-offline.sh ~/Downloads/setup_jagged_alliance_3_*.exe
```
В Wine тоже может упасть — тогда тот же **`install-ja3-innoextract.sh`**, положив единственный `.exe` в `JA3_GAMES_DIR` (без `.bin` innoextract возьмёт данные из exe).
---
## Чего не делать
| ❌ | ✅ |
|----|-----|
| `GOG_Galaxy_Jagged_Alliance_3.exe` web-stub | offline backup в `~/Games` |
| `install-ja3-multipart.sh` (Wine `/VERYSILENT`) | `install-ja3-innoextract.sh` |
| Распаковка в `scripts/games/cache/ja3-*` | сразу в `drive_c/GOG Games/…` |
| Держать `.bin` после установки без нужды | скрипт удалит (~15 GB) |
| `launch-galaxy.sh` / Galaxy CEF для JA3 | **`run-ja3-crossover.sh`** ([JA3_RUNBOOK.md](JA3_RUNBOOK.md)) |
| Whisky `run-ja3.sh` для D3D12 | CrossOver + D3DMetal |
| `RetinaMode=y` + `LogPixels=192` для мыши JA3 | Клип курсора на середине экрана → **legacy** ([JA3_RUNBOOK.md](JA3_RUNBOOK.md) §9) |
| Жёсткий стоп JA3 при swap 800 MB без Wine | Устарело; warn до 4 GB — [JA3_RUNBOOK.md](JA3_RUNBOOK.md) §4 |
---
## Связанные документы
- **[JA3_RUNBOOK.md](JA3_RUNBOOK.md)** — канон запуска, RCA 2829.05, антипаттерны
- [WINE_APPS_LAUNCH_RUNBOOK.md](WINE_APPS_LAUNCH_RUNBOOK.md) — §5 JA3
- [WINE_MAC_RUNBOOK.md](WINE_MAC_RUNBOOK.md) — §3.5
- [TROUBLESHOOTING.md](TROUBLESHOOTING.md) — GOG Inno / swap
- [GOG_GALAXY_7H_RCA.md](GOG_GALAXY_7H_RCA.md)

297
docs/games/JA3_RUNBOOK.md Normal file
View File

@@ -0,0 +1,297 @@
# Jagged Alliance 3 (GOG) — runbook Mac / Apple Silicon
**Машина:** M1 Pro, macOS Sonoma+, bottle Whisky **GOG-Install** (`9ee55e7c-a58e-411e-a93f-30530d4f1073`).
**Проверено:** 2026-05-28 (установка) · 2026-05-29 (запуск через CrossOver).
Связанные документы: [JA3_MAC_WITHOUT_GALAXY.md](JA3_MAC_WITHOUT_GALAXY.md) (установка offline), [TROUBLESHOOTING.md](TROUBLESHOOTING.md), [GOG_GALAXY_7H_RCA.md](GOG_GALAXY_7H_RCA.md).
---
## 1. Быстрый путь (канон)
### Установка (один раз, Whisky)
```bash
# Offline backup (5 файлов) в ~/Games/
bash ~/code/local_machine/scripts/games/gog/install-ja3-innoextract.sh
bash ~/code/local_machine/scripts/games/gog/finish-ja3-layout.sh
```
### Запуск (каждый раз, CrossOver + D3DMetal)
```bash
brew install --cask crossover # один раз
bash ~/code/local_machine/scripts/games/gog/setup-ja3-crossover.sh # один раз
bash ~/code/local_machine/scripts/games/gog/run-ja3-crossover.sh
```
- **Cmd+Tab** → окно `JA3.exe`
- В настройках графики: **отключить heat haze**
- **Swap:** «залипший» swap после Wine (24 GB без процессов) **не блокирует** запуск — только предупреждение. Стоп: swap ≥ **4096 MB** без Wine, или swap ≥ **1200 MB** пока **Wine/JA3 ещё работают**`reset-ja3-crossover.sh` / reboot. Обход: `JA3_IGNORE_SWAP=1`
### Два «контура»
| Контур | Роль | Инструмент |
|--------|------|------------|
| **GOG-Install** (Whisky) | innoextract, файлы игры, CommonLua, реестр GOG | `install-ja3-innoextract.sh`, `finish-ja3-layout.sh` |
| **JA3-GOG** (CrossOver) | **запуск** D3D12 через D3DMetal | `setup-ja3-crossover.sh`, `run-ja3-crossover.sh` |
Whisky **`run-ja3.sh` не запускает JA3 с рабочей графикой** — только CrossOver (или Porting Kit GUI).
---
## 2. Почему CrossOver, а не Whisky
JA3 на Windows использует **DirectX 12**. На Apple Silicon единственный рабочий путь — **Apple D3DMetal** (Game Porting Toolkit), встроенный в **CrossOver 23+** с флагом `WINED3DMETAL=1`.
**Whisky** использует **Gcenx Wine** — maintainer явно пишет, что сборки **не содержат D3DMetal hooks** ([Gcenx/macOS_Wine_builds#97](https://github.com/Gcenx/macOS_Wine_builds/issues/97)). В этом случае `d3d12.dll` (94 KB) идёт через **wined3d → Vulkan**, а на Mac нет Vulkan physical device:
```text
fixme:d3d12:d3d12_get_vk_physical_device Could not find Vulkan physical device for DXGI adapter.
```
→ UI: **«Failed to initialize graphics subsystem»**
→ лог JA3: **`Failed creating render device`**
Копирование `D3DMetal.framework` + `libd3dshared.dylib` + моста `d3d12.so` **не достаточно**, если PE `d3d12.dll` / `ntdll` от Gcenx — unix-вызовы D3DMetal не подключены.
---
## 3. RCA: злоключения 2026-05-28 — 2026-05-29
Хронология попыток на этой машине (чат + логи `JA3.exe-*.log`, Wine debug).
### Фаза A — установка и ложные следы (28.05)
| # | Симптом / действие | Реальная причина | Итог |
|---|-------------------|------------------|------|
| A1 | GOG web-stub, пустые кнопки | Нет **gdiplus** (winetricks) | ✅ `install-gdiplus.sh` + corefonts |
| A2 | Galaxy CEF, окна нет | HWND/CEF в Wine, swap | Galaxy **не нужен** для JA3 offline |
| A3 | Лог `Steam initialized … Beta branch GOG` | GOG API-шим (`steam_api64.dll`), **не** Steam.app | ❌ не причина краша |
| A4 | `CreateSubsystem failed MatchmakingServers/Music` | GOG wrapper без Galaxy service | ❌ шум, не графика |
| A5 | `Game name not defined` | innoextract не выполнил Inno-постскрипты | ⚠️ косметика; фикс: `register-ja3-registry.sh` |
| A6 | Swap ~3 GB, скрипт блокирует запуск | «Залипший» swap после Wine; macOS не отдаёт без reboot | ✅ `gog_swap_guard_ja3_launch`: warn до 4 GB без процессов; reboot если Mac тормозит |
### Фаза B — «графика» в Whisky (2829.05)
| # | Попытка | Лог / ошибка | Почему не работает |
|---|---------|--------------|-------------------|
| B1 | DXVK + `-graphicsapi d3d11` | `Failed creating render device` | DXVK = D3D10/11, **не D3D12** |
| B2 | DXMT v0.80 | `dxgi.dll` **c000007b** | Несовместимость с Gcenx Wine 11 + overrides |
| B3 | `upgrade-whisky-wine-gcenx.sh` (11.9) + GPTK bridge | `d3d12_get_vk_physical_device` | Gcenx d3d12 = **Vulkan**, не Metal |
| B4 | GPTK PE `d3d12.dll`/`dxgi.dll` (114/86 KB) в `system32` | Всё ещё Vulkan path или `dxgi not found` | PE GPTK 7.7 ≠ ntdll Gcenx 11 |
| B5 | GPTK PE в `wine/lib/x86_64-windows` | `Library dxgi.dll not found` (c0000135) | `__wine_unix_call` не реализован в Gcenx ntdll |
| B6 | Замена `ntdll.so` на GPTK | `virtual_alloc_first_teb` / wine не стартует | Нельзя мешать ntdll разных Wine |
| B7 | `ditto` всего GPTK `lib/` в Whisky | Wine **7.7 GPTK** поверх bottle | Перезаписал `wine64` → comctl32 и др. |
| B8 | `prepare-ja3-d3dmetal.sh` (убрать d3d12 из system32) | Всё равно render device fail | Builtin Gcenx d3d12 без Metal |
| B9 | `forceD3D11: true` в Metadata.plist | Противоречие с D3D12 backend | Исправлено на `false` — без эффекта на Gcenx |
| B10 | GPTK Wine 7.7, отдельный prefix | `comctl32.dll failed to initialize` (c0000005) | GPTK Wine 7.7 **сломан** на этой macOS |
| B11 | `fixmywhisky.sh` (ditto GPTK lib) | Как B7 | Только D3DMetal.framework + bridge **без** подмены всего Wine |
### Фаза C — CrossOver (29.05, **успех**)
| # | Шаг | Результат |
|---|-----|-----------|
| C1 | `brew install --cask crossover` | CrossOver 26.1, встроенный `apple_gptk` |
| C2 | Bottle **JA3-GOG**, template **win10_64** (не win32 Wow64!) | `kernel32` c000007b на 32-bit bottle |
| C3 | `WINED3DMETAL=1`, `WINEDXVK=0` в `cxbottle.conf` | D3D12 → Metal |
| C4 | Symlink игры из Whisky bottle | `CommonLua/Core/autorun.lua: File Not Found` — Wine **не читает** symlink **вне** prefix |
| C5 | `cp -cR` (APFS clonefile) игры в CrossOver bottle | Файлы видны Wine; **~0** доп. места на APFS |
| C6 | `start /d "C:\GOG Games\Jagged Alliance 3" JA3.exe -unpacked` | CWD с `CommonLua/`; не `--cx-app` без `/d` |
| C7 | Запуск | **JA3.exe** стабильно работает, нет `Failed creating render device` |
| C8 | Курсор: смещение клика → `RetinaMode=y` + `LogPixels=192` | Курсор **не опускается ниже середины экрана** (Y делится пополам) | ✅ профиль **`legacy`**: `RetinaMode=n`, без LogPixels — **подтверждено 2026-05-29** |
### Сигнатуры в логах (диагностика)
| Строка | Значение |
|--------|----------|
| `Failed creating render device` | D3D12 не дошёл до GPU — Whisky/Gcenx, не CrossOver |
| `d3d12_get_vk_physical_device Could not find Vulkan` | Gcenx wined3d path — нужен CrossOver D3DMetal |
| `Failed to initialize graphics subsystem` (UI) | То же, пользовательский текст JA3 |
| `Error opening 'CommonLua/Core/autorun.lua'` | Нет CWD (`start /d`) или symlink вместо клона в bottle |
| `comctl32.dll failed to initialize` | GPTK Wine 7.7 — не использовать |
| `__wine_unix_call` / `aborting` | GPTK PE на чужом Wine |
| `dxgi.dll` **c000007b** | DXMT + неправильные overrides |
| `Language: English` без `Failed creating` | Графика OK; смотреть CommonLua / crash дальше |
| Курсор виден, клик смещён по Y | HiDPI без согласованного масштаба Wine | `fix-ja3-crossover-mouse.sh` → профиль **legacy** |
| Курсор **не ниже середины экрана** | `RetinaMode=y` + `LogPixels=192` / двойной DPI | **legacy** (не retina); перезапуск JA3 |
Логи JA3:
`…/AppData/Roaming/Jagged Alliance 3/logs/JA3.exe-*.log`
Whisky: `…/Containers/com.franke.Whisky/Bottles/9ee55e7c-…/`
CrossOver: `~/Library/Application Support/CrossOver/Bottles/JA3-GOG/`
---
## 4. Антипаттерны (полный список)
### Установка
| ❌ Не делать | ✅ Вместо |
|-------------|----------|
| GOG web-stub `GOG_Galaxy_Jagged_Alliance_3.exe` | Offline backup 5 частей в `~/Games/` |
| `install-ja3-multipart.sh` (Wine Inno) | `install-ja3-innoextract.sh` |
| Распаковка в `scripts/games/cache/` | Сразу в `drive_c/GOG Games/…` |
| Bottle **HoMM-OldenEra** (Steam) | Bottle **GOG-Install** |
| Удалять `steam_api64.dll` в папке игры | Это GOG-шим, **оставить** |
| Steam client в GOG-bottle | `purge-steam-from-bottle.sh` |
### Графика / Wine
| ❌ Не делать | ✅ Вместо |
|-------------|----------|
| Whisky `run-ja3.sh` для игры | **`run-ja3-crossover.sh`** |
| `upgrade-whisky-wine-gcenx.sh` «для D3DMetal» | Gcenx **не** поддерживает D3DMetal hooks |
| `ditto` всего GPTK `lib/` в Whisky Libraries | Только `D3DMetal.framework` + `libd3dshared` + `.so` bridge (см. `install-gptk-whisky.sh`) |
| GPTK PE `d3d12/dxgi` в system32 **Whisky** | CrossOver со встроенным `apple_gptk` |
| Замена `ntdll.so` GPTK в Gcenx Wine | Ломает preloader |
| DXVK / DXMT для JA3 как «замена D3D12» | Не подтверждено; JA3 = D3D12 |
| `dxgi,d3d11=n,b` с DXMT | Ломает цепочку → c000007b |
| Whisky Run **`JA3.exe`** без CWD | `start /d` или `run-ja3.cmd` (Whisky) / CrossOver `start /d` |
| Symlink игры из Whisky в CrossOver bottle | **`cp -cR`** (APFS clone) |
| CrossOver bottle **win32** / Wow64 | **`win10_64`** |
| `--cx-app JA3.exe` без `start /d` | `start /d "…Jagged Alliance 3" JA3.exe -unpacked` |
| `forceD3D11: true` + backend d3dMetal | `forceD3D11: false` (Metadata Whisky — не решает Gcenx) |
### Окружение
| ❌ Не делать | ✅ Вместо |
|-------------|----------|
| Считать «залипший» swap 24 GB блокером JA3 | Запуск разрешён (warn); reboot — если Mac тормозит |
| Запуск JA3 при swap ≥ **1200 MB** + **Wine/JA3 ещё работают** | `reset-ja3-crossover.sh` → reboot |
| Запуск JA3 при swap ≥ **4096 MB** без Wine | Reboot Mac или `JA3_IGNORE_SWAP=1` |
| Жёсткий лимит **800 MB** для `run-ja3-crossover.sh` | Устарело; см. `gog_swap_guard_ja3_launch` в `config.sh` |
| Путать лог Galaxy с JA3 | JA3 offline **без** Galaxy UI |
| Чинить «graphics» через Galaxy service | `MatchmakingServers`/`Music` — шум GOG API |
### Мышь (CrossOver / Retina)
| ❌ Не делать | ✅ Вместо |
|-------------|----------|
| `RetinaMode=y` + `LogPixels=192` + `Win8DpiScaling=1` «по умолчанию» | **`fix-ja3-crossover-mouse.sh`** — профиль **legacy** (`RetinaMode=n`) |
| CrossOver GUI **High Resolution Mode** без проверки | Если клип Y на середине → **legacy** |
| Менять реестр мыши без перезапуска JA3 | `reset-ja3-crossover.sh``run-ja3-crossover.sh` |
| Профиль **retina** при клипе на середине экрана | **legacy**; при смещении клика — **retina-lite** |
| Ожидать фикс мыши «на лету» | Workaround: верхний левый угол окна = угол экрана |
---
## 5. Скрипты
| Скрипт | Назначение | Статус |
|--------|------------|--------|
| `install-ja3-innoextract.sh` | Multipart offline → bottle | ✅ канон установки |
| `finish-ja3-layout.sh` | CommonLua, реестр, upscale DLL | ✅ после innoextract |
| `setup-ja3-crossover.sh` | Bottle JA3-GOG, clone игры, D3DMetal | ✅ один раз |
| **`run-ja3-crossover.sh`** | **Запуск игры** | ✅ **канон** |
| `reset-ja3-crossover.sh` | Stop JA3 / Wine перед перезапуском | ✅ |
| `fix-ja3-crossover-mouse.sh` | Профили мыши (legacy / retina-lite / retina) | ✅ default **legacy** |
| `run-ja3.sh` | Whisky (эксперимент; графика fail) | ⚠️ только с предупреждением |
| `prepare-ja3-d3dmetal.sh` | Whisky D3DMetal prep | ⚠️ не решает Gcenx d3d12 |
| `upgrade-whisky-wine-gcenx.sh` | Wine 11.9 | ❌ для JA3 не использовать |
| `run-ja3-gptk-wine.sh` | GPTK Wine 7.7 prefix | ❌ comctl32 на этой Mac |
| `install-ja3-dxmt.sh` | DXMT fallback d3d11 | ❌ c000007b |
| `emergency-stop.sh` | Kill Wine/GOG перед запуском | ✅ |
---
## 6. CrossOver bottle (детали)
**Путь:** `~/Library/Application Support/CrossOver/Bottles/JA3-GOG/`
**cxbottle.conf** (минимум):
```ini
"WINED3DMETAL" = "1"
"WINEDXVK" = "0"
```
**Игра:** `drive_c/GOG Games/Jagged Alliance 3/` — APFS-клон из Whisky GOG-Install (не symlink).
**Проверка:**
```bash
pgrep -fl 'JA3\.exe'
grep -E 'Failed creating|autorun|CRASH' \
"$HOME/Library/Application Support/CrossOver/Bottles/JA3-GOG/drive_c/users/"*/AppData/Roaming/Jagged\ Alliance\ 3/logs/*.log | tail
```
---
## 7. Альтернативы
| Вариант | Комментарий |
|---------|-------------|
| [Porting Kit](https://www.paulthetall.com/jagged-aliance-3-for-mac/) + GOG offline | Тот же GPTK/D3DMetal; GUI, «просто работает» на M-series |
| CrossOver GUI | Bottle JA3-GOG → Install → Run exe; D3DMetal в Advanced Settings |
| Whisky + GPTK drag DMG | [Whisky#124](https://github.com/Whisky-App/Whisky/issues/124) — для **DX12** на Gcenx всё равно нет hooks |
---
## 9. Курсор: HiDPI / Retina (CrossOver)
**Проверено 2026-05-29** на M1 Pro + CrossOver 26.1, bottle **JA3-GOG**.
### Симптомы
| Симптом | Типичная причина |
|---------|------------------|
| Клик «выше/ниже» UI, курсор виден | Wine отдаёт logical pixels, игра рисует в другом масштабе |
| **Курсор не опускается ниже середины экрана** | `RetinaMode=y` + `LogPixels=192` — координата Y делится пополам |
### Профили (`fix-ja3-crossover-mouse.sh`)
| Профиль | Реестр | Когда |
|---------|--------|-------|
| **`legacy`** (default) | `RetinaMode=n`, LogPixels/Win8Dpi **удалены** | **Канон** — полный ход курсора по Y; возможен небольшой сдвиг клика |
| `retina-lite` | `RetinaMode=y`, без LogPixels | Если legacy смещает клик, но **нет** клипа на середине |
| `retina` | `RetinaMode=y`, `LogPixels=192`, `Win8DpiScaling=1` | ❌ часто **клип Y на 50%** — не использовать как default |
```bash
# Канон (после смены профиля — перезапуск JA3)
bash ~/code/local_machine/scripts/games/gog/fix-ja3-crossover-mouse.sh
bash ~/code/local_machine/scripts/games/gog/reset-ja3-crossover.sh
bash ~/code/local_machine/scripts/games/gog/run-ja3-crossover.sh
# Если legacy смещает клик
JA3_MOUSE_PROFILE=retina-lite bash ~/code/local_machine/scripts/games/gog/fix-ja3-crossover-mouse.sh
bash ~/code/local_machine/scripts/games/gog/reset-ja3-crossover.sh
bash ~/code/local_machine/scripts/games/gog/run-ja3-crossover.sh
```
**Без перезапуска (workaround):** перетащите окно JA3 так, чтобы **верхний левый угол окна** совпал с **верхним левым углом экрана**.
CrossOver GUI: Bottle **JA3-GOG****High Resolution Mode** — при клипе на середине **выключить** (эквивалент **legacy**).
---
## 10. Быстрые команды (терминал)
| Действие | Команда |
|----------|---------|
| **Запуск** | `bash ~/code/local_machine/scripts/games/gog/run-ja3-crossover.sh` |
| **Стоп / reset Wine** | `bash ~/code/local_machine/scripts/games/gog/reset-ja3-crossover.sh` |
| **Стоп всё GOG/Wine** | `bash ~/code/local_machine/scripts/games/gog/emergency-stop.sh` |
| **Первичная настройка bottle** | `bash ~/code/local_machine/scripts/games/gog/setup-ja3-crossover.sh` |
| **Фикс мыши** | `bash ~/code/local_machine/scripts/games/gog/fix-ja3-crossover-mouse.sh` |
| Swap «залип» 24 GB, Wine нет | просто `run-ja3-crossover.sh` (warn) |
| Swap + Wine/JA3 живы ≥ 1200 MB | `reset-ja3-crossover.sh` → reboot |
| Swap ≥ 4096 MB без Wine | reboot Mac |
| Обход swap | `JA3_IGNORE_SWAP=1 bash …/run-ja3-crossover.sh` |
| Профиль мыши | `JA3_MOUSE_PROFILE=legacy\|retina-lite\|retina` + fix + reset + run |
**Полный цикл перезапуска:**
```bash
bash ~/code/local_machine/scripts/games/gog/reset-ja3-crossover.sh
bash ~/code/local_machine/scripts/games/gog/run-ja3-crossover.sh
```
---
## 8. Ссылки
- [Gcenx — нет D3DMetal в packages](https://github.com/Gcenx/macOS_Wine_builds/issues/97)
- [CrossOver — D3DMetal advanced settings](https://support.codeweavers.com/miscellanous/advanced-settings-in-crossover-mac-26)
- [Whisky — GPU / GPTK tracking](https://github.com/Whisky-App/Whisky/issues/124)
- [Proton JA3 — graphics / LocalStorage](https://github.com/ValveSoftware/Proton/issues/7039) (Linux; отражения Off/Low — аналог для Wine при других GPU)

0
docs/games/README.md Normal file
View File

View File

@@ -0,0 +1,962 @@
# HoMM Olden Era — troubleshooting (Whisky / Wine)
- **Запуск приложений:** [WINE_APPS_LAUNCH_RUNBOOK.md](./WINE_APPS_LAUNCH_RUNBOOK.md)
- **Подготовка Wine/GOG:** [WINE_MAC_RUNBOOK.md](./WINE_MAC_RUNBOOK.md)
- **GOG web-stub (отдельный bottle):** [`../../scripts/games/gog/README.md`](../../scripts/games/gog/README.md)
- **JA3 (GOG):** [JA3_RUNBOOK.md](./JA3_RUNBOOK.md)
- **Мышь / Unity:** [UNITY_POINTER_MOUSE_FIX.md](./UNITY_POINTER_MOUSE_FIX.md)
- **Скрипты:** [`../../scripts/games`](../../scripts/games)
Bottle HoMM/Steam: `38412122-AAE1-4831-9F2E-6A0EB364B3F9` · Steam App ID: `3105440`
GOG web-stub: bottle **`GOG-Install`** (`scripts/games/gog/bottle.env`) — **не** HoMM UUID.
---
## Быстрая таблица
| Симптом | Первый шаг | Раздел |
|---------|------------|--------|
| Пустой UI Steam (кнопки без текста) | `fix-steam-ui``reset``steam-ui` | [§ Кривой UI Steam](#кривой-ui-steam-пустой-vgui) |
| **Окно Steam не появляется** | `diagnose-steam-ui` → kill Mac Steam → `reset``steam-ui` | [§ Нет окна Steam](#нет-окна-steam-ui) |
| Игра есть, **сейвы пустые** | `diagnose-saves` → login → `play` | [§ Сейвы](#игра-запустилась-сейвы-не-подтянулись) |
| `play` висит, exe не стартует | `reset``steam-ui` → login → `play` | [§ Нет прогресса](#нет-прогресса-play-не-доходит-до-игры) |
| Игра не стартует / D3D11 crash | **не** Play в Steam → `play` | [§ Запуск игры](#запуск-игры-канон) |
| DirectX 11 | `dxvk``play` | [§ Графика](#графика-directx-11--failed-to-initialize) |
| ЛКМ не работает | `diagnose` | [UNITY_POINTER_MOUSE_FIX.md](./UNITY_POINTER_MOUSE_FIX.md) |
| **Connection Problem** в Steam | `osascript` quit Steam → `reset``steam-ui` → Retry / Offline | [§ Connection Problem](#connection-problem-steam-не-подключается-к-серверам) |
| Steam завис / нет места | `disk``reset` | [§ Steam зависает](#steam-зависает--мало-места) |
| Пустой текст / `FontFamily` / `winFont` | см. профиль: Steam → `dwrite`; GOG stub → `gdiplus` | [§ Шрифты — антипаттерны](#шрифты-антипаттерны-сводка) |
| GOG stub: пустые кнопки / `FontFamily` | `gog/install-gdiplus` + `gog/install-corefonts` в **GOG-bottle** | [§ GOG web-stub](#gog-web-stub-отдельный-bottle) |
| **GOG Galaxy: окна нет**, скрипт OK | offline installer JA3; Galaxy — best effort | [§ GOG Galaxy — окно](#gog-galaxy-окно-не-открывается) · [GOG_GALAXY_7H_RCA.md](GOG_GALAXY_7H_RCA.md) |
| GOG Galaxy → **swap**, Mac «встал» | `gog/emergency-stop.sh` → перезагрузка | [GOG_GALAXY_7H_RCA.md](GOG_GALAXY_7H_RCA.md) § Swap |
| GOG stub: «запустил, окна нет» | **Cmd+Tab**`GOG_Galaxy_*.exe` / `wine64` | [§ GOG — проверка успеха](#gog-web-stub-отдельный-bottle) |
| **JA3: Failed to initialize graphics subsystem** | CrossOver D3DMetal, не Whisky | [JA3_RUNBOOK.md](JA3_RUNBOOK.md) §24 |
| **JA3: курсор не ниже середины / смещение клика** | профиль мыши **legacy** vs retina | [JA3_RUNBOOK.md](JA3_RUNBOOK.md) §9 |
| **JA3 без Galaxy** | install → Whisky; **запуск → CrossOver** | [JA3_RUNBOOK.md](JA3_RUNBOOK.md) |
| Установить через web-stub | только GalaxySetup (ломается в Wine) | [§ GOG web-stub](#gog-web-stub-отдельный-bottle) |
| `fork failed`, Mac «встал», swap 20+ GB | `winedbg` / Steam assert loop → § Swap | [§ Swap и winedbg](#захламление-swap-и-утечка-winedbg) |
| «20 GB съело» после GOG | обычно **не** stub — swap + дампы Steam | [§ Swap](#захламление-swap-и-утечка-winedbg) · [§ GOG](#gog-web-stub-отдельный-bottle) |
---
## Антипаттерны (не делать)
| ❌ Антипаттерн | Почему ломается | ✅ Вместо этого |
|----------------|-----------------|-----------------|
| **Play** у Olden Era **в окне Steam UI** | applaunch **без** `export_wine_env_game` → D3D11 / «Bad EXE format» в `Player.log` | Steam **Logged On****`start.sh play`** (Terminal) |
| **`start.sh game`** / exe **без** Steam в bottle | `SteamApi_Init failed` · слоты пустые | Whisky → Steam → Logged On → **`play`** |
| **`start.sh play`** при **Logged Off** | нет Steam API → пустые сейвы / отказ | `diagnose-saves` → login / Offline → `play` |
| **`-applaunch 3105440`** до login | триггер CEF `message_window.cc` · UI мёртв | сначала **Logged On**, потом **`play`** |
| **`HOMM_STEAM_VDESKTOP=1`** | CEF хуже · `Failed to set primary display settings` | **`steam-ui`** / Whisky Run (**не** VDESKTOP) |
| **Terminal `steam-ui` + Whisky Run** параллельно | двойной Wine · зомби | **один** контур: Whisky **или** Terminal |
| **`reset` без** `.exe`-зомби | `pkill` не ловит `C:\…\SteamService.exe` | **`reset`** (2026-05-27) или nuclear recovery |
| Запуск с **`-silent`** (старые скрипты / ручной `Steam.exe -silent`) | `forcing desktopui via -silent` → VGUI + `winFont` → пустой диалог | `steam-ui` или `play` **без** `-silent` |
| Только скопировать шрифты в `Fonts/` без `fix-steam-ui` | `winFont` остаётся — DWrite не отключён | **`bash start.sh fix-steam-ui`** (реестр + шрифты + dwrite override) |
| Игра «открылась» = сейвы работают | FileManager может видеть папку `Steam_<ID>/saves`, но **Store** не инициализирован без Steam | Проверять `Player.log` и `diagnose-saves` |
| Закрыть пустой диалог Steam крестиком | Steam остаётся **Logged Off**; следующий запуск снова без сейвов | **Правая** кнопка внизу или Tab → Enter |
| Нативный **Mac Steam** + bottle | Connection Problem · `steamid=0` | **`killall steam_osx ipcserver`** → только Wine-Steam |
| **`osascript quit Steam`** при отмене (-128) | Mac Steam жив | **Cmd+Q** / **`killall steam_osx`** |
| Импорт bottle **isaacmarovitz**, Whisky **franke** пустой | другой контейнер | **`migrate-bottle-to-franke-whisky.sh`** |
| Whisky «Launched steam.exe» = UI OK | нужен **steamwebhelper** (CEF) | `diagnose-steam-ui` · `cef_log` |
| **`HOMM_GAME_FORCE=1`** каждый день | пустые слоты | только отладка графики |
| Смотреть только `cache/*.tsv` | не диагностика bottle | `Steam/logs/*.txt`, **`Player.log`**, **`diagnose-*`** |
| **GOG web-stub** в bottle **HoMM-OldenEra** | общий префикс со **Steam**`winedbg`, дампы `Steam/dumps/`, шрифты из `Steam/resource/fonts`, `export_wine_env_steam` ломает .NET | **`scripts/games/gog/`** + новый bottle → `gog/use-bottle.sh` |
| **`setup-wine-bottle.sh`** для GOG JA3 | скрипт для **Steam/HoMM**, не для GOG stub | `gog/setup-bottle.sh` |
| **`start.sh reset`** после GOG в том же bottle | убивает **Steam** и игру; не лечит GOG-шрифты | `gog/reset.sh` в GOG-bottle; HoMM: отдельная сессия |
| **`export_wine_env_steam`** / `dwrite=n,b` для GOG .NET installer | `FontFamilyNotFound` / пустой WinForms | `gog/install-gdiplus.sh` + `gog/run-web-installer.sh` (`gdiplus=n,b`) |
| GOG stub **без** `winetricks gdiplus` | `GenericSansSerif` / unimplemented GDI+ | `bash …/gog/install-gdiplus.sh` в GOG-bottle |
| Диагностика GOG через **`Steam/dumps`** | ложный след; stub **не** пишет туда | `/tmp/gog-web-installer-*.log`, `gog/diagnose-session.sh` |
| Думать, что stub **скачал 20 GB** | stub ~500 KB; при `FontFamily` падает **до** загрузки игры | `df -h`; искать swap / `setup_galaxy.exe`×2 / `Steam/dumps` |
| **`wineboot -k`** «на всякий случай» при каждом GOG | трогает **весь** префикс (Steam, CEF-кэш) | GOG-bottle: `gog/setup-bottle.sh --fonts-only`; HoMM: `reset` только когда нужен Steam |
| Параллельно **isaac** + **franke** Whisky / старый `wineserver` | второй `wineserver`, сотни `winedbg`, swap под 100% | `pkill -9 winedbg`; `pkill wineserver`; один контейнер Whisky |
| **`pkill -f GOG`** в HoMM-bottle при живом Steam | не связано со stub; мешает отладке | разнести bottle; GOG: `gog/reset.sh` |
| Только `install-corefonts` **без** `install-gdiplus` | шрифты в `Fonts/` есть, но .NET падает на **GenericSansSerif** (Wine GDI+ stub) | **`gog/install-gdiplus.sh`** → `WINEDLLOVERRIDES=gdiplus=n,b` |
| Debian URL для `arial32.exe` (404) | corefonts неполные | зеркало SourceForge в `gog/install-corefonts.sh` |
| **Whisky → Fonts / winetricks corefonts** | зеркала Microsoft **404** ([Whisky #515](https://github.com/Whisky-App/Whisky/issues/515)) | macOS → `Fonts/` + наши скрипты; GOG: `gog/install-corefonts.sh` |
| **`WINEDLLOVERRIDES=gdiplus=b`** для GOG **web-stub** | builtin gdiplus не даёт **GenericSansSerif** для .NET | **`gdiplus=n,b`** (`export_wine_env_gog`) |
| **`--profile steam`** / `dwrite=n,b` для GOG .NET | другой стек, не GDI+ | `run-wine-exe.sh --profile gog` или `gog/run-web-installer.sh` |
| Только **`winetricks liberation`** без macOS Fonts + реестр | частично; Steam/GOG UI всё ещё пустые | `setup-wine-bottle.sh` / `gog/setup-bottle.sh` + `fix-steam-ui` (Steam) |
| Скопировать `.ttf` **без** `reg add …\Fonts` | GDI не видит файлы | `fix-steam-ui`, `gog/wine-fonts.sh` (`--fonts-only`) |
| **`install-corefonts`** без **`cabextract`** | `.exe` MS fonts не распакуются | `brew install cabextract` |
| **`install-gdiplus`** до **`setup-bottle`** | нет базовых шрифтов/реестра в bottle | порядок: `setup-bottle``install-gdiplus``install-corefonts` |
| «26 файлов в Fonts» = stub OK | без **native gdiplus** .NET всё равно падает | маркер `.gog_gdiplus_installed` + нет `FontFamily` в логе |
| Пустой **GalaxySetup** (красный X, gdi32) | **не** нехватка Arial — **Inno/botva2 + gdi32** | `gog/install-galaxy-extract.sh` + `launch-galaxy.sh`; см. [§ Setup gdi32](#setup-красный-x-пустое-окно-gdi32-rca-2026-05-28) |
Полная сводка по шрифтам и `WINEDLLOVERRIDES`: [§ Шрифты — антипаттерны](#шрифты-антипаттерны-сводка).
---
## Шрифты: антипаттерны (сводка)
Три **разных** механизма — не смешивать лечение:
| Контур | API / лог | Профиль DLL | Скрипты |
|--------|-----------|-------------|---------|
| **Steam VGUI** (login, опросы) | `winFont` в `console_log.txt` | **`dwrite=n,b`** + `DWriteEnable=0` | `fix-steam-ui`, `setup-wine-bottle.sh`, `steam-ui` |
| **GOG web-stub** (.NET WinForms) | `FontFamilyNotFound`, `GenericSansSerif`, `GdipGetGenericFontFamilySansSerif` | **`gdiplus=n,b`** (native gdiplus) | `gog/install-gdiplus.sh`, `gog/install-corefonts.sh`, `gog/setup-bottle.sh` |
| **GOG Galaxy** (CEF, login) | обычно **не** `FontFamily`; сеть/auth | `gdiplus=n,b` при запуске клиента | `gog/launch-galaxy.sh` |
| **Inno + botva2** (`GalaxySetup.exe`) | `gdi32.dll` AV, пустой MsgBox | `gdiplus=b` **не спасает** | **не Wine-Inno**`innoextract` / клиент Galaxy |
### Антипаттерны (шрифты и overrides)
| ❌ | Почему | ✅ |
|----|--------|-----|
| Копировать шрифты в `C:\windows\Fonts` **без** реестра `…\CurrentVersion\Fonts` | Wine/GDI не подхватывает файлы | `fix-steam-ui` / `gog/setup-bottle.sh` / `setup-wine-bottle.sh --fonts-only` |
| Только файлы в `Fonts/`, **без** `DWriteEnable=0` (Steam) | DWrite-заглушка, пустой VGUI | **`start.sh fix-steam-ui`** |
| Steam **без** `WINEDLLOVERRIDES=dwrite=n,b` при запуске | подгружается сломанный `dwrite.dll` | `export_wine_env_steam` в `config.sh``steam-ui` / `play` |
| GOG stub **без** winetricks **gdiplus** | Wine GDI+ stub → **GenericSansSerif** | **`gog/install-gdiplus.sh`** (~900 MB) |
| GOG stub с **`gdiplus=b`** (только builtin) | нет native **GenericSansSerif** | **`gdiplus=n,b`** |
| GOG stub с **`dwrite=n,b`** (профиль Steam) | не тот стек для .NET WinForms | **`export_wine_env_gog`** |
| Только **`install-corefonts`**, без **gdiplus** | `.ttf` есть, лог всё равно `FontFamilyNotFound` | оба скрипта + порядок ниже |
| **`setup-wine-bottle.sh`** для GOG web-stub | DWrite/Steam-реестр, **нет** gdiplus | **`gog/setup-bottle.sh`** |
| **`setup-gog-bottle.sh`** (HoMM) для JA3 | устаревшая обёртка | **`gog/setup-bottle.sh`** |
| **winetricks corefonts** из Whisky GUI | 404 на CDN Microsoft | SourceForge в **`gog/install-corefonts.sh`**; macOS Fonts |
| **Debian-only** URL `msttcorefonts` | 404 | primary: `downloads.sourceforge.net/corefonts/…` |
| **`winetricks liberation`** как единственный шаг | мало гарантий для VGUI/.NET | macOS + corefonts + профиль DLL |
| **`WINE_SETUP_WINETRICKS=1`** вместо наших скриптов | долго, зеркала падают | `setup-wine-bottle.sh` (macOS Fonts); GOG: `gog/*` |
| **`wineboot -k`** «обновить шрифты» в HoMM-bottle | сбрасывает Steam/CEF | GOG: `gog/setup-bottle.sh --fonts-only`; HoMM: `--fonts-only` без `-k` |
| GOG в **HoMM-bottle** «шрифты уже есть от Steam» | **`export_wine_env_steam`**, чужие `Steam/resource/fonts` | отдельный bottle **`GOG-Install`** |
| Считать **GalaxySetup** пустым окном проблемой **шрифтов** | это **gdi32 + botva2**, не Arial | [§ Setup gdi32](#setup-красный-x-пустое-окно-gdi32-rca-2026-05-28) |
| **`run-wine-exe.sh --profile plain`** для .NET installer | нет overrides | **`--profile gog`** или **`steam`** по таблице выше |
| Запуск stub **без** проверки лога | «OK» в shell, процесс уже умер | `grep -i FontFamily /tmp/gog-web-installer-*.log` |
| **`launch-galaxy.sh` OK**, окна нет | Second client / lock | `gog/reset.sh` → снова launch; [§ GOG Galaxy — окно](#gog-galaxy-окно-не-открывается) |
| Повторный launch без **`reset.sh`** | `Second client instance` → exit | `reset` убивает процессы и `lock-files/*.lock` |
### Порядок (GOG-bottle, web-stub)
```bash
bash …/gog/setup-bottle.sh # macOS Fonts + реестр + сеть
bash …/gog/install-gdiplus.sh # native gdiplus, gdiplus=n,b
brew install cabextract # для corefonts
bash …/gog/install-corefonts.sh # arial32 / times32 / andale32
bash …/gog/run-web-installer.sh …/GOG_Galaxy_*.exe
```
Маркеры: `.gog_gdiplus_installed`, `.gog_corefonts_installed`, `.gog_setup_v1`.
### Порядок (HoMM-bottle, Steam VGUI)
```bash
bash …/setup-wine-bottle.sh # один раз
bash …/start.sh fix-steam-ui # DWriteEnable=0 + шрифты
bash …/start.sh reset && steam-ui # перезапуск с dwrite=n,b
```
### Проверка
```bash
# Steam
grep winFont …/Steam/logs/console_log.txt | tail -5
# GOG stub
grep -i FontFamily /tmp/gog-web-installer-GOG-Install.log || echo "OK: нет FontFamily"
# Сколько файлов в Fonts (не доказательство gdiplus!)
ls …/drive_c/windows/Fonts | wc -l
test -f …/Bottles/<GOG-UUID>/.gog_gdiplus_installed && echo "gdiplus marker OK"
```
Детали: [§ Кривой UI Steam](#кривой-ui-steam-пустой-vgui) · [§ GOG web-stub](#gog-web-stub-отдельный-bottle) · [WINE_MAC_RUNBOOK.md §2](./WINE_MAC_RUNBOOK.md).
---
### Канонический контур (GOG web-stub / JA3)
**Проверено 2026-05-28:** stub `GOG_Galaxy_Jagged_Alliance_3.exe` в bottle **`GOG-Install`** — окно с подписями, скачивание `GalaxySetup.exe` (~99 MB).
```bash
# один раз (создаёт bottle, gdiplus ~900 MB, шрифты, запускает stub):
bash ~/code/local_machine/scripts/games/gog/install-all.sh \
~/path/to/GOG_Galaxy_Jagged_Alliance_3.exe
# или по шагам — см. scripts/games/gog/README.md
```
После stub: **Cmd+Tab** → установщик → дождаться JA3 (**≥20 GB** на диске).
### Канонический контур (HoMM / Steam)
1. **`killall steam_osx ipcserver`** (если был Mac Steam)
2. **Whisky****HoMM-OldenEra****Run****Logged On** (или Offline)
3. **`bash ~/code/local_machine/scripts/games/start.sh play`**
4. В игре: **Загрузить** → skirmish → **1 / 2 / 3**
**Recovery CEF/UI:**
```bash
osascript -e 'quit app "Whisky"' 2>/dev/null; sleep 2
pkill -9 -f 'SteamService.exe|steamwebhelper|38412122|Steam.exe' 2>/dev/null
bash ~/code/local_machine/scripts/games/start.sh reset
open -a Whisky
# Run Steam только из Whisky — не steam-ui параллельно
```
---
## Кривой UI Steam (пустой VGUI)
**Кратко:** Steam в Wine рисует кнопки/radio, но **без текста** → login/applaunch зависают. Лечится **один раз** `fix-steam-ui`, затем всегда запуск через **`steam-ui`** (не `-silent`).
### Симптомы
- Тёмное окно: **5 radio слева**, **2 кнопки внизу**, подписей нет.
- Иногда после частичного фикса: **Connection Problem** / login **с текстом** — это уже другой слой (сеть), VGUI-фикс сработал.
- Это **Steam VGUI**, не Heroes Olden Era.
Лог `…/Steam/logs/console_log.txt`:
```text
src\vgui2\src\surface_gdiwin32.cpp (1336) : winFont
```
(много строк подряд = шрифты/DWrite всё ещё ломают отрисовку)
### Причина
| Слой | Что ломается |
|------|----------------|
| **DirectWrite** | Steam на Windows ждёт DWrite; в WhiskyWine заглушка → GDI не рисует глифы |
| **GDI / winFont** | VGUI-диалоги (опрос, interstitial, часть login) остаются «пустыми» |
| **`-silent`** | Форсит `desktopui`/VGUI — усугубляет проблему |
Только копировать шрифты в `Fonts/` **без** `DWriteEnable=0` и **без** `dwrite=n,b`**недостаточно** → [§ Шрифты — антипаттерны](#шрифты-антипаттерны-сводка).
---
### Решение (канон, один раз + перезапуск)
```bash
osascript -e 'quit app "Steam"' 2>/dev/null || true
bash ~/code/local_machine/scripts/games/start.sh fix-steam-ui
bash ~/code/local_machine/scripts/games/start.sh reset
bash ~/code/local_machine/scripts/games/start.sh steam-ui
```
#### Шаг A — `fix-steam-ui` (скрипт `fix-homm-steam-ui.sh`)
| # | Действие | Зачем |
|---|----------|--------|
| 1 | `HKCU\Software\Valve\Steam`**`DWriteEnable = 0`** | Steam не использует сломанный DWrite в Wine |
| 2 | Копия **Arial, Tahoma, Verdana, Times, Courier, Marlett, GoNoto**`drive_c/windows/Fonts/` | GDI находит базовые шрифты |
| 3 | При каждом `steam-ui` / `play`: **`WINEDLLOVERRIDES=dwrite=n,b`** (`config.sh``export_wine_env_steam`) | Wine не подгружает native dwrite.dll |
Повторять `fix-steam-ui` нужно только после **нового bottle** или если вручную сбросили реестр Wine.
#### Шаг B — `reset`
Обязателен после фикса: старый `Steam.exe` стартовал **без** новых overrides и с кэшем VGUI.
#### Шаг C — `steam-ui`
| ✅ Правильно | ❌ Неправильно |
|-------------|----------------|
| `bash ~/code/local_machine/scripts/games/start.sh steam-ui` | `Steam.exe -silent` |
| Whisky → Run Steam → **`start.sh play`** | **Play** у Olden Era в Steam UI (нет DXVK env) |
| `start.sh play` при **Logged On** | `play` / `game` при **Logged Off** |
| `start.sh game` (= то же что `play` при login) | `HOMM_GAME_FORCE=1` для сейвов |
---
### Проверка, что UI починился
1. **Визуально:** login / **Connection Problem** / библиотека — **есть читаемый текст** (не пустые прямоугольники).
2. **Лог:** после нового запуска в `console_log.txt` **нет** новой пачки `winFont` при открытии того же диалога.
3. **Login:** в `connection_log.txt` eventually `Logged On` или осмысленный **Retry** / **Offline Mode** (см. [§ Connection Problem](#connection-problem-steam-не-подключается-к-серверам)).
```bash
tail -20 ~/Library/Containers/com.franke.Whisky/Bottles/38412122-*/drive_c/Program\ Files\ \(x86\)/Steam/logs/console_log.txt | grep winFont || echo "winFont нет — хорошо"
```
*(Если bottle ещё в `com.isaacmarovitz.Whisky` — замените префикс контейнера.)*
---
### Если текст **всё ещё** пустой (обход до перезапуска)
Диалог **вслепую** (опрос GPU / interstitial **до** login):
1. Верхний radio — оставить (дефолт).
2. **Правая** кнопка внизу → OK / Continue / Launch.
3. Или: `Tab` несколько раз → `Enter`.
Затем снова **`reset` + `fix-steam-ui` + `steam-ui`** — часто VGUI остаётся пустым, пока висит процесс от старой сессии.
---
### После починки UI → сейвы
Пустой UI и **Connection Problem** — разные проблемы. Когда текст появился, но сейвы пустые → [§ Сейвы](#игра-запустилась-сейвы-не-подтянулись).
```bash
bash ~/code/local_machine/scripts/games/start.sh diagnose-saves
```
---
### Не путать окна
| Окно | Признак |
|------|---------|
| **Steam VGUI (кривой)** | Серый flat UI, 5 radio, 2 кнопки **без** текста |
| **Steam CEF (норм)** | Login, Connection Problem, библиотека — **с текстом** |
| **Heroes Olden Era** | 3D, Unfrozen, меню игры |
---
## Нет окна Steam UI
### Whisky пустой / UI не появляется из Terminal
Bottle мог быть в **старом** контейнере `isaacmarovitz`**Whisky 3 (franke) его не видит** → окна нет.
**Один раз:**
```bash
bash ~/code/local_machine/scripts/games/migrate-bottle-to-franke-whisky.sh
```
Затем:
1. **Открыть Whisky.app** — в списке должен быть **HoMM-OldenEra**.
2. В bottle: **Run**`C:\Program Files (x86)\Steam\Steam.exe` (или закреплённый Steam).
3. Либо Terminal (если окно появилось):
```bash
killall steam_osx ipcserver 2>/dev/null
bash ~/code/local_machine/scripts/games/start.sh reset
bash ~/code/local_machine/scripts/games/start.sh steam-ui
```
Диагностика:
```bash
bash ~/code/local_machine/scripts/games/start.sh diagnose-steam-ui
```
### Симптом
`bash …/start.sh steam-ui` — в Terminal пара строк и **нет окна**; или окно не найти.
### Диагностика
```bash
bash ~/code/local_machine/scripts/games/start.sh diagnose-steam-ui
```
| Строка | Плохо | Что делать |
|--------|-------|------------|
| Mac Steam | ❌ steam_osx | `killall steam_osx ipcserver` (см. § Connection Problem) |
| Steam.exe | ❌ | `reset``steam-ui` снова |
| steamwebhelper | ❌ | CEF не поднялся — см. ниже |
| winFont | ⚠️ | `fix-steam-ui` |
### Запуск (копипаст по порядку)
```bash
killall steam_osx ipcserver 2>/dev/null
bash ~/code/local_machine/scripts/games/start.sh fix-steam-ui
bash ~/code/local_machine/scripts/games/start.sh reset
bash ~/code/local_machine/scripts/games/start.sh steam-ui
```
- Terminal **зависнет** на `steam-ui` — так и должно быть, Steam работает.
- Окно искать: **Cmd+Tab** (wine64), **Mission Control** — не в Whisky.
- Если `diagnose-steam-ui` показывает ❌ steamwebhelper — **CEF не поднялся** (см. [§ CEF / steamwebhelper](#cef--steamwebhelper-пустой-ui-после-update)):
```bash
osascript -e 'quit app "Whisky"' 2>/dev/null; sleep 2
pkill -9 -f 'SteamService.exe|steamwebhelper|38412122|Steam.exe' 2>/dev/null
bash ~/code/local_machine/scripts/games/start.sh reset
open -a Whisky
# HoMM-OldenEra → Run Steam (не Terminal steam-ui параллельно)
```
**Не использовать** `HOMM_STEAM_VDESKTOP=1` — ухудшает CEF (`Failed to set primary display settings`).
- Тёмное окно **без текста** — [§ Кривой UI Steam](#кривой-ui-steam-пустой-vgui): Tab → Enter или правая кнопка.
---
## CEF / steamwebhelper (пустой UI после update)
### Симптомы
- Whisky пишет «Launched: steam.exe», но **нет библиотеки / login** (чёрное окно или только VGUI).
- `diagnose-steam-ui`: ❌ **steamwebhelper**.
- `cef_log.txt`:
```text
message_window.cc: Failed to create a message-only window: Class does not exist
```
**crash loop** steamwebhelper → нет CEF UI.
### Типичные триггеры (антипаттерны)
1. **`Steam.exe -applaunch 3105440`** при **Logged Off** (первый applaunch без UI).
2. Параллельный запуск **Terminal + Whisky**.
3. Зомби **`SteamService.exe` / `steamwebhelper`** после `reset` со старыми `pkill`-паттернами.
4. Авто-update Steam client (утренний build ~242 MB) + грязная сессия.
### Recovery (единственный надёжный порядок)
```bash
killall steam_osx ipcserver 2>/dev/null
osascript -e 'quit app "Whisky"' 2>/dev/null; sleep 2
pkill -9 -f 'SteamService.exe|steamwebhelper|38412122|Steam.exe' 2>/dev/null
bash ~/code/local_machine/scripts/games/start.sh reset
pgrep -lf Steam || echo "OK: процессов Steam нет"
open -a Whisky
```
В Whisky: **HoMM-OldenEra****Run** на `Steam.exe`**не** `steam-ui` из Terminal одновременно.
Если после чистой сессии CEF всё ещё мёртв:
- Заблокировать авто-update: `steam.cfg` с `BootStrapperInhibitAll=1` в папке Steam.
- Откат Steam client на предыдущий build (операторский скрипт `downgrade-steam-client.sh` — по запросу).
Проверка login:
```bash
tail -3 ~/Library/Containers/com.franke.Whisky/Bottles/38412122-*/drive_c/Program\ Files\ \(x86\)/Steam/logs/connection_log.txt
```
Нужна строка **`Logged On`**, не `Logged Off`.
---
## Игра запустилась — сейвы не подтянулись
- Окно Heroes открывается, меню **Загрузить** пустое.
- На Mac файлы **есть**: `1.saveskirmish`, `2.saveskirmish`, `3.saveskirmish`.
- В `Player.log`:
```text
SteamApi_Init failed with FailedGeneric - error: ConnectToGlobalUser failed.
Store state changed to Failed
```
### Причина (корень)
Сейвы лежат в `users/Steam_<ID>/saves/singleplayer/`, но **слоты в UI** требуют живый **Steam-клиент в том же bottle** (`Logged On`). Прямой exe обходит Steam → Store не инициализируется.
### Диагностика одной командой
```bash
bash ~/code/local_machine/scripts/games/start.sh diagnose-saves
```
| Проверка | OK | Плохо |
|----------|-----|-------|
| Файлы `*.saveskirmish` | 3 файла в singleplayer | папка пустая |
| `connection_log.txt` | `[Logged On, …]` | `[Logged Off, 0, 0]` |
| `Player.log` | нет `SteamApi_Init failed` | `ConnectToGlobalUser failed` |
### Рабочий цикл (сейвы 1 / 2 / 3)
1. Steam в bottle: **Logged On** (Whisky → Run или `steam-ui`).
2. **Не** жмите Play в Steam UI.
```bash
bash ~/code/local_machine/scripts/games/start.sh play
bash ~/code/local_machine/scripts/games/start.sh diagnose-saves
```
В игре: **Загрузить****skirmish / одиночная** (не кампания) → слоты **1**, **2**, **3**.
Путь к файлам:
```bash
bash ~/code/local_machine/scripts/games/start.sh saves
```
---
## Запуск игры (канон)
| Шаг | Действие |
|-----|----------|
| 1 | Mac Steam **выключен** (`pgrep -x Steam` → пусто) |
| 2 | Wine-Steam **Logged On** (Whisky → Run или `steam-ui` → Retry / Offline) |
| 3 | **`bash ~/code/local_machine/scripts/games/start.sh play`** — **не** кнопка Play в Steam |
`play` при **Logged On** вызывает **`game`** (DXVK-macOS + Unity windowed). Это тот же контур, что работал «утром».
### Если игра падает на D3D11
`Player.log`: `GfxDevice: creating device client` / `d3d11.dll` — вы запустили через **Steam UI Play**, не через `play`.
```bash
bash ~/code/local_machine/scripts/games/start.sh diagnose
bash ~/code/local_machine/scripts/games/start.sh play
```
Альтернатива (явный exe, Steam не закрывать):
```bash
bash ~/code/local_machine/scripts/games/start.sh game
```
---
## Нет прогресса: `play` не доходит до игры
### Чеклист по логам
| Проверка | Где | Плохо | Хорошо |
|----------|-----|-------|--------|
| Steam login | `connection_log.txt` | `Logged Off`, `steamid=0` | `Logged On` |
| applaunch | `console_log.txt` | нет `GameAction` / `Game process added` | `AppID 3105440 … HeroesOldenEra.exe` |
| Steam API | `Player.log` | `SteamApi_Init failed` | нет ошибки Store |
### Рабочий цикл
```bash
bash ~/code/local_machine/scripts/games/start.sh reset
bash ~/code/local_machine/scripts/games/start.sh fix-steam-ui
bash ~/code/local_machine/scripts/games/start.sh steam-ui
# login / Offline Mode → затем play (не Play в Steam UI)
bash ~/code/local_machine/scripts/games/start.sh play
```
---
## Захламление swap и утечка winedbg
### Симптомы
| Признак | Что это |
|---------|---------|
| Terminal: **`fork failed: resource temporarily unavailable`** | ядро не создаёт процессы — часто **swap исчерпан** |
| `sysctl vm.swapusage`**used ≈ total** (например 22/23 GB) | macOS вынесла память в swap; система «тяжёлая» |
| **`pgrep winedbg \| wc -l`** → сотни / тысячи | отладчики Wine после **assert/crash Steam** (не от GOG stub) |
| `wineserver` из **`com.isaacmarovitz.Whisky`** при bottle во **franke** | legacy-процесс, лишний CPU |
| Диск **98%**, «пропало 20 GB» | чаще **не одна** операция, а swap + дубликаты файлов (см. ниже) |
GOG web-stub **сам по себе** почти не ест RAM: при `FontFamilyNotFound` процесс **сразу выходит**; загрузка JA3 **не начинается**.
### Типичная цепочка (антипаттерн)
1. Bottle **HoMM-OldenEra** (Steam + HoMM + эксперименты с GOG в том же префиксе).
2. Steam CEF / VGUI в цикле → `Steam/dumps/assert_steam.exe_*.dmp` (сотни MB).
3. На каждый assert Wine поднимает **`winedbg --auto`** → сотни процессов → **swap**.
4. Параллельно Cursor, Zoom, GOG Galaxy CEF → усиление.
5. Любой `bash` / `brew`**`fork failed`**.
Это **не** «JA3 скачал 20 GB», а **давление памяти + мусор на диске**.
### Что реально занимает диск (проверка)
```bash
# swap
sysctl vm.swapusage
# утечка процессов
pgrep winedbg | wc -l
pgrep -lf wineserver
# HoMM-bottle (если GOG гоняли там — будет мусор)
BOTTLE=~/Library/Containers/com.franke.Whisky/Bottles/38412122-AAE1-4831-9F2E-6A0EB364B3F9
du -sh "$BOTTLE/drive_c/Program Files (x86)/Steam/dumps" 2>/dev/null
du -sh "$BOTTLE/drive_c/setup_galaxy.exe" 2>/dev/null # дубликат ~277M — можно rm
du -sh ~/code/local_machine/scripts/games/cache/setup_galaxy.exe 2>/dev/null
```
| Путь | Ориентир | Действие |
|------|----------|----------|
| `Steam/dumps/*.dmp` | до **~400 MB** | удалить старые `.dmp` (Steam пересоздаст при новом crash) |
| `drive_c/setup_galaxy.exe` | **~277 MB** | `rm` если есть копия в `scripts/games/cache/` |
| `cache/setup_galaxy.exe` | **~277 MB** | оставить один экземпляр |
| Swap **used** | десятки GB | см. экстренный сброс ниже |
### Экстренный сброс (копипаст)
```bash
# 1) Убить зомби-отладчики (безопасно для данных bottle)
pkill -9 winedbg 2>/dev/null
pkill -9 wineserver 2>/dev/null
# 2) HoMM/Steam bottle — только если не нужен сейчас живой Steam
bash ~/code/local_machine/scripts/games/start.sh reset
# 3) Дампы Steam (опционально, освобождает сотни MB)
rm -f ~/Library/Containers/com.franke.Whisky/Bottles/38412122-*/drive_c/Program\ Files\ \(x86\)/Steam/dumps/*.dmp
# 4) Дубликат установщика GOG в drive_c (если копировали в HoMM-bottle)
rm -f ~/Library/Containers/com.franke.Whisky/Bottles/38412122-*/drive_c/setup_galaxy.exe
```
После этого: **перезагрузка Mac** — самый надёжный способ **освободить swap** (macOS не отдаёт swap мгновенно только kill процессов).
Профилактика:
- **Не** гонять GOG web-stub в HoMM-bottle → [§ GOG web-stub](#gog-web-stub-отдельный-bottle).
- После серии падений Steam: `reset` + очистка `Steam/dumps`.
- Держать **≥1520 GB свободно** на Data перед установкой игр (не путать с «занятым swap»).
---
## GOG web-stub (отдельный bottle)
Файл `GOG_Galaxy_*.exe` (~500 KB) — загрузчик полного установщика с gog.com, **не** игра. Скачивает `GalaxySetup.exe` и ставит игру через GOG installer в Wine.
**Не путать с:** GOG Galaxy 2.0 (лаунчер в HoMM-bottle, `start.sh gog`, логин через CEF) — к web-stub **не** относится.
### Что сработало (RCA 2026-05-28, JA3)
| Попытка | Результат |
|---------|-----------|
| HoMM-bottle + `setup-wine-bottle.sh` + stub | `FontFamilyNotFound` / пустые кнопки; в логе **FATAL** `GenericSansSerif` |
| Тот же bottle + 26 шрифтов (macOS + corefonts) **без gdiplus** | снова `FontFamilyNotFound` — файлы есть, Wine **не отдаёт** generic font family |
| Bottle **`GOG-Install`** + `install-gdiplus.sh` + `install-corefonts.sh` + stub | **OK:** процесс жив, подписи в UI, в `Temp/GalaxyInstaller_*/GalaxySetup.exe` **~99 MB** |
**Корневая причина:** .NET WinForms вызывает `GdipGetGenericFontFamilySansSerif` → без **native `gdiplus.dll`** (winetricks) Wine отвечает `FontFamilyNotFound`, даже при полном `windows/Fonts`.
**Обязательный порядок в GOG-bottle:**
1. `gog/create-bottle.sh` или `gog/use-bottle.sh <UUID>``bottle.env`
2. `gog/setup-bottle.sh` — шрифты macOS + реестр + сеть Wine
3. **`gog/install-gdiplus.sh`** — winetricks, ~900 MB скачивание, `gdiplus=n,b`
4. `gog/install-corefonts.sh` — SourceForge `arial32` / `times32` / `andale32`
5. `gog/run-web-installer.sh` путь к `GOG_Galaxy_*.exe`
Одной командой: `bash …/gog/install-all.sh /path/GOG_Galaxy_*.exe`
### Проверка успеха (после запуска stub)
```bash
# процесс
pgrep -fl 'GOG_Galaxy_Jagged'
# лог без FontFamily (имя bottle в пути)
grep -i FontFamily /tmp/gog-web-installer-GOG-Install.log || echo "OK: нет FontFamily"
# скачан полный setup (путь меняется: GalaxyInstaller_<random>)
find ~/Library/Containers/com.franke.Whisky/Bottles -path '*/GalaxyInstaller_*/GalaxySetup.exe' -ls 2>/dev/null
```
| Признак | Значение |
|---------|----------|
| Лог | `/tmp/gog-web-installer-GOG-Install.log` — нет `FontFamily could not be found` |
| Temp | `…/users/eternal/AppData/Local/Temp/GalaxyInstaller_*/GalaxySetup.exe` растёт (~100 MB+) |
| Окно | **Cmd+Tab**`GOG_Galaxy_Jagged_Alliance_3.exe` (не в окне Whisky) |
| Bottle | только `gog/bottle.env`**не** смотреть `Steam/dumps` в HoMM-bottle |
### Антипаттерны (кратко)
Полный список по шрифтам: [§ Шрифты — антипаттерны](#шрифты-антипаттерны-сводка).
| ❌ | ✅ |
|----|-----|
| HoMM-bottle + `setup-wine-bottle.sh` + stub | `gog/install-all.sh` или `gog/README.md` |
| Только corefonts, **без** gdiplus | `setup-bottle`**`install-gdiplus`** → `install-corefonts` |
| `dwrite=n,b` или `gdiplus=b` для stub | **`gdiplus=n,b`** (`export_wine_env_gog`) |
| GalaxySetup пустой X = «добавить шрифты» | **gdi32/Inno**`install-galaxy-extract` + `launch-galaxy` |
| Смотреть `Steam/dumps` | `/tmp/gog-web-installer-*.log`, `gog/diagnose-session.sh` |
| `start.sh reset` для GOG | `bash …/gog/reset.sh` |
| 20 GB «съел stub» при `FontFamily` в логе | падение **до** загрузки игры — [§ Swap](#захламление-swap-и-утечка-winedbg) |
### Симптомы и фикс
| Симптом | Причина | Действие |
|---------|---------|----------|
| Пустые radio/кнопки, окно есть | нет corefonts **или** нет gdiplus | `install-gdiplus.sh` **и** `install-corefonts.sh` |
| `FontFamilyNotFound` / `GenericSansSerif` | нет native **gdiplus** (типично) | `bash …/gog/install-gdiplus.sh` → снова stub |
| Скрипт пишет OK, окна нет | см. [§ GOG Galaxy — окно](#gog-galaxy-окно-не-открывается) | `reset.sh``launch-galaxy.sh` |
| «Installer Already Running» | второй stub | `gog/reset.sh` |
| Нет `bottle.env` | GOG-bottle не создан | `gog/create-bottle.sh` или `gog/use-bottle.sh <UUID>` |
| Stub завис на загрузке | мало места на Data | `df -h`**≥20 GB** свободно |
### GOG Galaxy: окно не открывается
**RCA за 7 часов (2026-05-28):** [GOG_GALAXY_7H_RCA.md](GOG_GALAXY_7H_RCA.md) — хронология запусков, что **подтверждено в логах** (процесс + login form), и что **не** подтверждено (видимое окно на macOS).
Собрать логи: `bash …/gog/collect-gog-logs-7h.sh``temp/gog-logs-7h-*`.
`launch-galaxy.sh` пишет OK, а окна нет — чаще всего **не «нет приложения»**, а **CEF/HWND в Wine** или второй экземпляр убил новое окно.
| Лог (`GalaxyInitialization.log`) | Что значит |
|----------------------------------|------------|
| `Second client instance detected``The client will exit` | висел старый `GalaxyClient` / lock; **новое окно не создаётся** |
| `will continue` + в `ps` есть `GalaxyClient.exe` | клиент **жив****Cmd+Tab**`GalaxyClient` / `wine64` |
| `Failed to locate Galaxy Client window` | restore не нашёл окно (часто после «Second client») |
| `DeelevateStrategy` / `Privilege de-elevation` / exit **-31** | нет `/deelevated` или сервис 1053 | `launch-galaxy.sh` (уже передаёт `/runWithoutUpdating /deelevated`) |
**Канон (2026-05-28):**
```bash
# 1) Whisky GUI (лучше для окна на Mac):
bash ~/code/local_machine/scripts/games/gog/launch-galaxy-whisky.sh
# → pin «gog-galaxy» → Run
# 2) Терминал (процесс; окно может не появиться):
bash ~/code/local_machine/scripts/games/gog/reset.sh
bash ~/code/local_machine/scripts/games/gog/launch-galaxy.sh
# 3) Если окна нет — foreground + vdesktop:
bash ~/code/local_machine/scripts/games/gog/launch-galaxy-ui.sh
```
В `GalaxyClient.log` бывает `Successfully brought window to the foreground`, а на Mac пусто — CEF в `cef.log`: `Received message from source not matching parent window` (HWND родителя в Wine). **Виртуальный desktop** (`explorer /desktop=GOGGalaxy,1280x800`) даёт отдельное окно Wine; **foreground** (`launch-galaxy-ui.sh`) привязывает его к Terminal.
RCA: `bash …/gog/diagnose-galaxy-window.sh`
Один раз: `bash …/gog/pin-galaxy-whisky.sh` → Whisky → bottle **GOG-Install** → pin **gog-galaxy** → Run.
A/B CEF: `GOG_CEF_PROFILE=steam bash …/launch-galaxy-ui.sh` (добавляет `-cef-in-process-gpu`, как Steam).
| ❌ Антипаттерн | ✅ |
|----|-----|
| `reset.sh` старый (не убивал `GalaxyClient.exe`) | обновлённый `gog/reset.sh` + `gog-process.sh` |
| Повторный `launch-galaxy` без reset | всегда `reset``launch` |
| Смотреть только Whisky, не Cmd+Tab | окно Wine **вне** главного окна Whisky |
| Запуск из `~/code/local_machine` без `cd drive_c` | `launch-galaxy.sh` сам ставит cwd в `drive_c` |
**JA3 на Mac:** установка — offline backup + `install-ja3-innoextract.sh` (Whisky GOG-Install). **Запуск — CrossOver D3DMetal:** `setup-ja3-crossover.sh` + `run-ja3-crossover.sh`. Whisky `run-ja3.sh` **не** даёт рабочую D3D12. Runbook: [JA3_RUNBOOK.md](JA3_RUNBOOK.md).
### Setup: красный X, пустое окно, gdi32 (RCA 2026-05-28)
После успешного **web-stub** (скачан `GalaxySetup.exe` ~290 MB) второй этап — **Inno Setup + botva2.dll**. В Wine типично:
| Лог Inno (`Setup Log … #00N.txt`) | Значение |
|-----------------------------------|----------|
| `Found GalaxyClientExePath` + `Showing Galaxy already running dialog` | рядом висит `GalaxyInstaller.exe` или в реестре уже есть путь к Galaxy |
| `GalaxyClient registry found, but executable returned an empty version` | Wine не отдаёт `FileVersion` для `GalaxyClient.exe` |
| `Access violation … gdi32.dll` Read of address `00000068` | отрисовка MsgBox (текст пустой — тот же класс багов, что и пустой UI) |
**Рабочий обход (проверено):**
1. **GOG Galaxy**`innoextract` + VC++ redist из `setup_galaxy.exe`, **не** `GalaxySetup.exe` в Wine:
```bash
bash ~/code/local_machine/scripts/games/gog/install-galaxy-extract.sh
```
2. **Jagged Alliance 3** — из клиента Galaxy после входа (CEF, не botva2):
```bash
bash ~/code/local_machine/scripts/games/gog/launch-galaxy.sh
# → Cmd+Tab → GalaxyClient → Install JA3
```
Или одной цепочкой: `bash …/gog/finish-ja3-install.sh`
Web-stub + `GalaxySetup /VERYSILENT` на этом Wine **не доводят** установку до конца (gdi32 на любом bottle).
Снять логи: `bash …/gog/collect-setup-rca.sh` → `temp/gog-setup-rca-*`
### Повторный запуск stub
```bash
bash ~/code/local_machine/scripts/games/gog/reset.sh
# Предпочтительно без stub:
bash ~/code/local_machine/scripts/games/gog/finish-ja3-install.sh
# Или принудительно stub (часто упирается в gdi32 на GalaxySetup):
GOG_USE_WEB_STUB=1 bash ~/code/local_machine/scripts/games/gog/install-all.sh \
~/code/hunabapp-dev/temp/GOG_Galaxy_Jagged_Alliance_3.exe
```
Диагностика:
```bash
bash ~/code/local_machine/scripts/games/gog/diagnose-session.sh
bash ~/code/local_machine/scripts/games/gog/collect-setup-rca.sh
```
См. также: [`scripts/games/gog/README.md`](../../scripts/games/gog/README.md), [WINE_MAC_RUNBOOK.md §3.3](./WINE_MAC_RUNBOOK.md).
---
## Steam зависает / мало места
### Симптомы
`Failed creating file mapping`, `CSteamEngine::BMainLoop stalled`, `wineserver crashed`, **`winedbg`** размножается → см. [§ Swap](#захламление-swap-и-утечка-winedbg).
### Действия
```bash
bash ~/code/local_machine/scripts/games/start.sh disk # ≥10 GB
pkill -9 winedbg 2>/dev/null
bash ~/code/local_machine/scripts/games/start.sh reset
bash ~/code/local_machine/scripts/games/start.sh steam-ui
```
Очистка: `Steam/dumps/*.dmp`, `scripts/games/cache/*.dmg`, `Libraries.tar.gz` (после установки Wine), Корзина.
---
## Графика DirectX 11 / Failed to initialize
```bash
bash ~/code/local_machine/scripts/games/start.sh dxvk
bash ~/code/local_machine/scripts/games/start.sh play
```
Только **Gcenx DXVK-macOS**, не vanilla DXVK 2.5. Запуск — **`play`** (DXVK env), **не** Play в Steam UI.
---
## Мышь: курсор двигается, ЛКМ нет
```bash
bash ~/code/local_machine/scripts/games/start.sh diagnose
```
→ [UNITY_POINTER_MOUSE_FIX.md](./UNITY_POINTER_MOUSE_FIX.md)
---
## Whisky «Zero KB»
```bash
bash ~/code/local_machine/scripts/games/install-whiskywine-manual.sh
```
---
---
## Connection Problem: Steam не подключается к серверам
### Симптомы
Диалог **Connection Problem** — *There was a problem communicating with Steam*. Кнопки **Retry** и **Enter Offline Mode**.
Интернет на Mac есть, но Wine-Steam **не логинится** → сейвы в игре пустые.
### Что видно в логах
`Steam/logs/connection_log.txt`:
| Этап | OK | Плохо |
|------|-----|-------|
| HTTP probe | `Connectivity test … OK!` | timeout |
| CM / WebSocket | `ConnectionCompleted` → `Logged On` | `ConnectionDisconnected('Disconnected By Remote Host')` |
| console_log | — | `LogonFailure No Connection` |
Утром (04:0804:10) было **2 обрыва** WebSocket, на **3-й** попытке (CM `cmp2-lhr1.steamserver.net:443`) — `Logged On`. Днём сессии часто **не доходят** до CM, если параллельно открыт Mac Steam.
### Причины (по частоте)
1. **Запущен нативный Steam.app** на Mac (сейчас типичный случай) — конфликт с bottle.
2. **WebSocket к Steam CM** нестабилен в Wine — нужны повторные Retry (как в 04:0804:10).
3. VPN / смена сети — CM отваливается (`Disconnected By Remote Host`).
4. IPv6 в Wine падает (не критично, если WebSocket:443 жив).
### Что делать (по порядку)
Команды ниже — **копировать в Terminal целиком по шагам** (путь абсолютный, переменная `G` не нужна).
**1. Полностью закрыть Mac Steam**
Удаление **Steam.app** из `/Applications` **не убирает** клиент: он часто остаётся в
`~/Library/Application Support/Steam/Steam.AppBundle/` и процессах `steam_osx` / `ipcserver`.
```bash
killall steam_osx 2>/dev/null
killall ipcserver 2>/dev/null
pkill -f 'Steam.AppBundle/Steam/Contents/MacOS' 2>/dev/null
pgrep -f 'Steam.AppBundle/Steam/Contents/MacOS/steam_osx' >/dev/null && echo "⚠️ Mac Steam ещё жив" || echo "OK: Mac Steam остановлен"
```
(Если был установлен: `osascript -e 'quit app "Steam"'` — при ошибке `-128` используйте `killall` выше.)
**2. Перезапуск bottle**
```bash
bash ~/code/local_machine/scripts/games/start.sh reset
bash ~/code/local_machine/scripts/games/start.sh steam-ui
```
**3. В диалоге Connection Problem** (окно Wine-Steam)
- **Retry** — 23 раза, пауза **1530 с** между попытками.
- Если не коннектится — **Enter Offline Mode**.
Offline Mode для Heroes **нормален**: сейвы **локальные** (`1/2/3.saveskirmish` уже на диске), облако Steam не обязательно.
После **Logged On** или **Offline Mode**:
```bash
bash ~/code/local_machine/scripts/games/start.sh play
```
❌ **Не** нажимать **Play** у Olden Era в библиотеке Steam — applaunch без game-env → D3D11 crash.
**4. Проверка**
```bash
bash ~/code/local_machine/scripts/games/start.sh diagnose-saves
```
Нужно **не** `Logged Off`, а **`Logged On`** или Steam в offline с поднятым `Steam.exe`.
**Всё одним блоком** (шаг 3 — вручную в окне Steam):
```bash
osascript -e 'quit app "Steam"'
bash ~/code/local_machine/scripts/games/start.sh reset
bash ~/code/local_machine/scripts/games/start.sh steam-ui
# → Retry 23× или Enter Offline Mode → затем:
bash ~/code/local_machine/scripts/games/start.sh play
bash ~/code/local_machine/scripts/games/start.sh diagnose-saves
```
### Антипаттерн
❌ Жать **Retry** при открытом Mac Steam — почти всегда снова Connection Problem.
---
## Steam offline (ручной режим)
1. Whisky → Kill All Bottles
2. Закрыть **Steam.app** на Mac
3. `bash ~/code/local_machine/scripts/games/start.sh steam-ui`
---
## Полезные команды
**HoMM / Steam (bottle HoMM-OldenEra):**
```bash
bash ~/code/local_machine/scripts/games/start.sh fix-steam-ui
bash ~/code/local_machine/scripts/games/start.sh diagnose-saves
bash ~/code/local_machine/scripts/games/start.sh reset
bash ~/code/local_machine/scripts/games/start.sh steam-ui
bash ~/code/local_machine/scripts/games/start.sh play
bash ~/code/local_machine/scripts/games/start.sh saves
```
**GOG web-stub (отдельный bottle):**
```bash
bash ~/code/local_machine/scripts/games/gog/install-all.sh /path/GOG_Galaxy_*.exe
bash ~/code/local_machine/scripts/games/gog/install-gdiplus.sh
bash ~/code/local_machine/scripts/games/gog/install-corefonts.sh
bash ~/code/local_machine/scripts/games/gog/run-web-installer.sh /path/GOG_Galaxy_*.exe
bash ~/code/local_machine/scripts/games/gog/diagnose-session.sh
bash ~/code/local_machine/scripts/games/gog/reset.sh
```
**Память / swap:**
```bash
sysctl vm.swapusage
pgrep winedbg | wc -l
pkill -9 winedbg; pkill -9 wineserver
```
Логи:
```
# Steam / HoMM
~/Library/Containers/…/Bottles/38412122-…/drive_c/Program Files (x86)/Steam/logs/
~/Library/Containers/…/…/AppData/LocalLow/Unfrozen/HeroesOldenEra/Player.log
# GOG web-stub (имя bottle в имени файла)
/tmp/gog-web-installer-GOG-Install.log
```
---
*Последняя сверка: 2026-05-28 (§ шрифты: сводка антипаттернов Steam dwrite / GOG gdiplus; GOG-Install stub OK; GalaxySetup → gdi32) · Whisky 3 · WhiskyWine 11*

View File

@@ -0,0 +1,48 @@
# HoMM Olden Era: курсор двигается, клики не работают (Whisky / Wine на macOS)
## Корневая причина (не «битая мышь»)
Современный Unity (в т.ч. ветки с Unity 6 input stack) вызывает Windows API **`EnableMouseInPointer`** и дальше ждёт сообщения **`WM_POINTER`**. В типичном Wine из Whisky эта функция сейчас **заглушка** → в `Player.log` появляется строка:
```text
EnableMouseInPointer failed with the following error: Call not implemented.
```
Пока это так, **никакие** танцы с `WineBus` / SDL / виртуальным desktop / оконным fullscreen **не обязаны** починить ЛКМ: курсор может двигаться, а нажатия и hover в UI игнорируются.
Проверка одной командой (после хотя бы одного запуска игры):
```bash
bash ~/code/local_machine/scripts/games/diagnose-homm-mouse.sh
```
---
## Что реально работает сегодня
### Вариант A — CrossOver (рекомендуется для Unity с этим симптомом)
1. Установить **CrossOver** для macOS (CodeWeavers).
2. При необходимости применить готовый патч слоя Wine под `EnableMouseInPointer` (см. репозиторий с инструкцией и бинарниками под конкретную версию CrossOver):
[dabielf/crossover-unity-mouse-fix](https://github.com/dabielf/crossover-unity-mouse-fix)
3. Запускать игру **из CrossOver**, а не из «голого» WhiskyWine, если патч ставился в CrossOver.
Важно: патч из репозитория рассчитан на **пути внутри `CrossOver.app`**, а не на `~/Library/Application Support/com.isaacmarovitz.Whisky/Libraries/`. Копирование DLL из CrossOver в Whisky **вручную** — высокий риск несовместимости ABI (краши Wine).
### Вариант B — ждать/переезжать на Wine с upstream-фиксом
Следить за [Wine Bug #53847](https://bugs.winehq.org/show_bug.cgi?id=53847) и обновлениями **WhiskyWine**, когда туда попадёт полноценная реализация (или использовать сборку Wine, где она уже есть), и только потом снова тестировать в Whisky.
---
## Связь с нашими скриптами
- `start.sh input` / `fix-homm-wine-input.sh` — про **HID/SDL и геймпады**, не про `EnableMouseInPointer`.
- `start.sh game` + DXVK-macOS — про **графику (D3D11)**, не про pointer stack Unity.
---
## Быстрый чеклист
1. `bash ~/code/local_machine/scripts/games/diagnose-homm-mouse.sh`
2. Если exit code **2** и есть строка про `EnableMouseInPointer` → идём в CrossOver/другой Wine, а не в «ещё один SDL-твик».

View File

@@ -0,0 +1,225 @@
# Runbook: запуск Windows-приложений в Wine (Whisky)
**Главный документ по пуску** любых `.exe` в bottle на Mac. Подготовка bottle, шрифты, GOG/сеть — [WINE_MAC_RUNBOOK.md](./WINE_MAC_RUNBOOK.md). Сбои — [TROUBLESHOOTING.md](./TROUBLESHOOTING.md). **Шрифты / пустой UI:** [TROUBLESHOOTING § шрифты](./TROUBLESHOOTING.md#шрифты-антипаттерны-сводка) (`dwrite` для Steam, `gdiplus=n,b` для GOG stub).
- **Скрипты:** [`../../scripts/games`](../../scripts/games)
- **Универсальный запуск:** `bash …/scripts/games/run-wine-exe.sh` (см. §2)
---
## 1. Новая программа — пройти по порядку
Скопируйте чеклист; для каждого пункта есть команда ниже.
| # | Вопрос | Действие |
|---|--------|----------|
| 1 | **Какой тип?** | Таблица §1.1 → профиль Wine |
| 2 | **Свой bottle?** | Steam/Unity/много игр → часто **да**; GOG web-stub → **отдельный** `GOG-Install`; один офлайн-setup → можно общий |
| 3 | **Место на диске** | `bash …/start.sh disk`**≥20 GB** для установщиков/игр, **≥3 GB** для лаунчера |
| 4 | **Один раз: bottle** | Whisky → **Windows 10 64-bit** → Sync **MSync**; Wine: `install-whiskywine-manual.sh` |
| 5 | **Один раз: шрифты/сеть** | `bash …/setup-wine-bottle.sh` (HoMM/Steam bottle) или `gog/setup-bottle.sh` (GOG bottle) |
| 6 | **Установка** | Steam/GOG/офлайн `.exe` — §1.1; **не** два установщика GOG одновременно |
| 7 | **Запуск** | §2 — `run-wine-exe.sh`, `start.sh …`, или Whisky → Run |
| 8 | **Зафиксировать** | Добавить строку в §6 и при необходимости обёртку в `scripts/games/` |
### 1.1 Тип приложения → установка и профиль
| Тип | Примеры | Установка (один раз) | Профиль запуска (`run-wine-exe.sh`) |
|-----|---------|----------------------|-------------------------------------|
| **Steam + игра** | HoMM Olden Era | `install-steam-extract.sh`, игра из Steam | `steam` → UI; `game` → exe + DXVK |
| **GOG Galaxy (лаунчер)** | Galaxy 2.0 | `start.sh gog-install` или `gog/install-galaxy-extract.sh` | `gog` |
| **GOG web-stub** | `GOG_Galaxy_*.exe` | Только bottle `gog/` — [gog/README.md](../../scripts/games/gog/README.md) | `gog` |
| **Офлайн setup .exe** | backup с gog.com | Скопировать в `drive_c/`, запустить установщик | `plain` или `gog` |
| **GOG multipart + innoextract** | JA3 offline backup | `gog/install-ja3-innoextract.sh` — [JA3 runbook](JA3_RUNBOOK.md) | **CrossOver:** `run-ja3-crossover.sh` |
| **.NET WinForms installer** | web-stub, мастера GOG | **`gog/install-gdiplus.sh`** + corefonts | `gog` |
| **CEF (Steam/GOG UI)** | Steam.exe, GalaxyClient | CEF-флаги в `config.sh` / `gog/config.sh` | `steam` / `gog` |
| **DX11 игра (Unity и т.д.)** | Olden Era | `install-dxvk-macos.sh` | `game` |
| **Прочий Win32 .exe** | утилиты, старые игры | Обычно только setup bottle + шрифты | `plain` |
**Inno Setup + botva2** (GOG `GalaxySetup.exe`, **JA3 offline setup**): в Wine часто **gdi32** — не полагаться на `/VERYSILENT`. Galaxy — **innoextract**; **JA3 multipart**`gog/install-ja3-innoextract.sh`. Запуск JA3 — [JA3_RUNBOOK.md](JA3_RUNBOOK.md). См. [TROUBLESHOOTING.md § Setup](./TROUBLESHOOTING.md).
Подробная подготовка по типам: [WINE_MAC_RUNBOOK.md §3](./WINE_MAC_RUNBOOK.md).
---
## 2. Запуск (любая программа)
### 2.1 Универсально: `run-wine-exe.sh`
```bash
# Справка
bash ~/code/local_machine/scripts/games/run-wine-exe.sh --help
# Программа уже в drive_c (путь Wine)
bash ~/code/local_machine/scripts/games/run-wine-exe.sh \
--bottle HoMM-OldenEra \
--profile game \
'C:\Program Files (x86)\Steam\steamapps\common\My Game\game.exe'
# Установщик с Mac (копируется в C:\)
bash ~/code/local_machine/scripts/games/run-wine-exe.sh \
--bottle GOG-Install \
--profile gog \
~/Downloads/Setup_Game.exe
# Bottle GOG из gog/bottle.env (без --bottle)
bash ~/code/local_machine/scripts/games/run-wine-exe.sh --profile gog 'C:\Program Files (x86)\GOG Galaxy\GalaxyClient.exe'
```
| `--profile` | `WINEDLLOVERRIDES` / env | Когда |
|-------------|--------------------------|--------|
| `plain` | по умолчанию Wine | утилиты, простые exe |
| `steam` | `dwrite=n,b` | Steam.exe, VGUI |
| `gog` | `gdiplus=n,b` | GOG Galaxy, .NET installers |
| `game` | DXVK + `d3d11=n,b` | DX11/Unity после `install-dxvk-macos.sh` |
Переменные bottle: `WINE_BOTTLE_ID=<UUID>` или `WINE_BOTTLE_NAME=HoMM-OldenEra`. GOG-bottle: `GOG_BOTTLE=1` (читает `gog/bottle.env`).
Фон + лог:
```bash
bash …/run-wine-exe.sh --background --log /tmp/my-app.log --profile plain 'C:\app\foo.exe'
```
### 2.2 Через Whisky GUI
1. Открыть bottle → **Run** → выбрать `.exe` из `drive_c` **или** с Mac (Whisky скопирует).
2. Окно: **Cmd+Tab**`wine64` / имя процесса, не только окно Whisky.
### 2.3 Готовые обёртки (`start.sh`)
| Задача | Команда |
|--------|---------|
| Steam UI | `bash …/start.sh steam-ui` |
| HoMM (игра + сейвы) | `bash …/start.sh play` |
| GOG Galaxy | `bash …/start.sh gog` |
| Сброс процессов bottle | `bash …/start.sh reset` |
| Место на диске | `bash …/start.sh disk` |
| GOG bottle: клиент | `bash …/gog/launch-galaxy.sh` |
| GOG bottle: JA3 установка | `bash …/gog/install-ja3-innoextract.sh` |
| GOG bottle: JA3 запуск | `bash …/gog/run-ja3-crossover.sh` — [JA3_RUNBOOK.md](JA3_RUNBOOK.md) |
Полный список: `bash …/start.sh` без аргументов.
### 2.4 Вручную (если нет скрипта)
```bash
export WINEPREFIX="$HOME/Library/Containers/com.franke.Whisky/Bottles/<UUID>"
WINE64="$HOME/Library/Application Support/com.franke.Whisky/Libraries/Wine/bin/wine64"
export DYLD_LIBRARY_PATH="$HOME/Library/Application Support/com.franke.Whisky/Libraries/Wine/lib"
export WINEMSYNC=1 WINEESYNC=1
"$WINE64" 'C:\path\app.exe'
```
Профили overrides — [WINE_MAC_RUNBOOK.md §4](./WINE_MAC_RUNBOOK.md).
---
## 3. Инфраструктура (один раз на машину)
| Компонент | Путь |
|-----------|------|
| Whisky 3 | `brew install --cask frankea/whisky/whisky` |
| Wine | `bash …/install-whiskywine-manual.sh` |
| Bottle | `~/Library/Containers/com.franke.Whisky/Bottles/<UUID>/` |
| Кэш установщиков | `scripts/games/cache/` |
Проверка места: `bash …/start.sh disk`.
Создание bottle: Whisky **+** → Windows 10 → имя; для GOG: `bash …/gog/create-bottle.sh GOG-Install`.
---
## 4. Шаблон: добавить программу в репозиторий
1. **Имя и bottle** — зафиксировать UUID в `config.sh` или `gog/bottle.env`.
2. **Скрипт установки** (если повторяемо) — `scripts/games/install-<app>.sh` или секция в `gog/`.
3. **Скрипт запуска** — команда в `start.sh` *или* документированный `run-wine-exe.sh --profile …`.
4. **Строка в §6** ниже — тип, bottle, команда запуска, путь к exe.
5. **Сбои** — краткий симптом в [TROUBLESHOOTING.md](./TROUBLESHOOTING.md).
---
## 5. Уже настроенные приложения
| Приложение | Bottle | Запуск | Примечание |
|------------|--------|--------|------------|
| **Steam** | HoMM-OldenEra | `start.sh steam-ui` | Не параллельно с Steam.app |
| **HoMM Olden Era** | HoMM-OldenEra | `start.sh play` | Не Play в Steam UI; нужен DXVK — §7 |
| **GOG Galaxy 2.0** | HoMM-OldenEra | `start.sh gog` | Логин в Wine — best effort |
| **Jagged Alliance 3** | GOG-Install + CrossOver **JA3-GOG** | `gog/run-ja3-crossover.sh` | Установка: Whisky `install-ja3-innoextract.sh` ([runbook](JA3_RUNBOOK.md)) |
| **GOG Galaxy 2.0** | GOG-Install | `gog/launch-galaxy.sh` | Best effort; JA3 — **не** через Galaxy на этом Mac |
| **Любой новый .exe** | свой / общий | `run-wine-exe.sh` | §2.1 |
---
## 6. Справочник скриптов
| Файл | Назначение |
|------|------------|
| **run-wine-exe.sh** | Универсальный пуск exe в выбранном bottle |
| **start.sh** | Steam / HoMM / GOG / reset / disk / dxvk |
| **setup-wine-bottle.sh** | Шрифты + реестр + сеть (HoMM bottle) |
| **config.sh** | UUID HoMM, `export_wine_env_*` |
| **gog/** | Отдельный bottle, gdiplus, web-stub |
| **install-dxvk-macos.sh** | DX11 для Unity |
---
## 7. HoMM Olden Era (ежедневно)
Краткая выжимка; детали сейвов/графики — прежние §45 методички.
### Однократно
```bash
brew install p7zip
bash ~/code/local_machine/scripts/games/install-whiskywine-manual.sh
bash ~/code/local_machine/scripts/games/install-steam-extract.sh
bash ~/code/local_machine/scripts/games/install-dxvk-macos.sh
bash ~/code/local_machine/scripts/games/setup-wine-bottle.sh
```
Bottle **HoMM-OldenEra**, Sync **MSync**.
### Каждый запуск
Steam **Logged On** → затем:
```bash
bash ~/code/local_machine/scripts/games/start.sh play
```
Не **Play** у Olden Era в окне Steam (нет DXVK).
Альтернатива: `start.sh game`; сейвы: `start.sh saves`; диагностика: `start.sh diagnose-saves`.
### Переменные (`start.sh game`)
| Переменная | По умолчанию | Назначение |
|------------|----------------|------------|
| `HOMM_VDESKTOP` | `1920x1080` | Виртуальный стол Wine |
| `HOMM_USE_WINEVDESKTOP` | `1` | `0` — без explorer /desktop |
| `HOMM_UNITY_WINDOWED` | `1` | Оконный режим Unity |
| `HOMM_UNITY_EXTRA` | *(пусто)* | напр. `-popupwindow` |
### Сейвы (singleplayer 1/2/3)
```
~/Library/Containers/com.franke.Whisky/Bottles/38412122-AAE1-4831-9F2E-6A0EB364B3F9/drive_c/users/eternal/AppData/LocalLow/Unfrozen/HeroesOldenEra/users/Steam_<ID>/saves/singleplayer/
```
*Bottle ID: `38412122-AAE1-4831-9F2E-6A0EB364B3F9` · Whisky 3 · WhiskyWine 3*
---
## 8. Шпаргалка
```bash
G=~/code/local_machine/scripts/games
bash "$G/run-wine-exe.sh" --help
bash "$G/start.sh" disk
bash "$G/setup-wine-bottle.sh"
bash "$G/start.sh" play
bash "$G/gog/launch-galaxy.sh"
```

View File

@@ -0,0 +1,205 @@
# Runbook: подготовка Windows-приложений в Wine на macOS (Whisky)
Один раз: bottle, шрифты, сеть, установка по **типу** приложения. **Ежедневный запуск** любых `.exe` — [WINE_APPS_LAUNCH_RUNBOOK.md](./WINE_APPS_LAUNCH_RUNBOOK.md).
Антипаттерны (GOG в HoMM-bottle, swap/winedbg): [TROUBLESHOOTING.md](./TROUBLESHOOTING.md).
Источники: [Whisky](https://github.com/Whisky-App/Whisky) (архив, Apple Silicon + macOS 14+), [Whisky #1220 CEF](https://github.com/IsaacMarovitz/Whisky/issues/1220), [CodeWeavers GOG Galaxy tip](https://www.codeweavers.com/compatibility/crossover/tips/gog-galaxy/gog-galaxy-working), практика bottle на этой машине (2026-05).
---
## 1. Жёсткие требования (без этого не обещаем успех)
| Условие | Значение |
|--------|----------|
| Mac | **Apple Silicon** (M1+) |
| macOS | **14 Sonoma+** (Whisky 3 / GPTK) |
| Whisky | Установлен, bottle **Windows 10, 64-bit** |
| Свободное место | **≥20 GB** для GOG/игр (web-stub + установка); **≥3 GB** минимум для Steam/лаунчеров |
| Один лаунчер | Не запускать **нативный Steam.app** параллельно с Wine Steam |
| Один установщик | Не открывать **два** `GOG_Galaxy_*.exe` — будет «Installer Already Running» |
| GOG web-stub | **Отдельный bottle** + `scripts/games/gog/` (не HoMM/Steam) |
| Подготовка HoMM/Steam | **Один раз:** `setup-wine-bottle.sh` |
---
## 2. Один раз: подготовка bottle
```bash
bash ~/code/local_machine/scripts/games/setup-wine-bottle.sh
```
Делает автоматически:
- Копирует **Arial, Tahoma, Verdana** и др. из macOS в `C:\windows\Fonts`
- По возможности `winetricks liberation` (GOG web-installer / .NET WinForms)
- Реестр: **MS Shell Dlg → Tahoma**, GenericSansSerif → Arial
- **DnsIPv6Enabled=0**, ProxyEnable=0 в bottle
- Steam **DWriteEnable=0** (пустой текст VGUI)
Повтор при сбое шрифтов:
```bash
bash ~/code/local_machine/scripts/games/setup-wine-bottle.sh --force
```
> **Не полагайтесь на `winetricks corefonts` из GUI Whisky** — зеркала Microsoft часто отдают 404 ([Whisky #515](https://github.com/Whisky-App/Whisky/issues/515)). Наш скрипт копирует шрифты с Mac.
>
> Опционально (медленно): `WINE_SETUP_WINETRICKS=1 bash …/setup-wine-bottle.sh --force`
---
## 3. Типы приложений и как запускать
### 3.1 Steam + Unity (HoMM Olden Era)
| Шаг | Команда |
|-----|---------|
| DXVK в bottle (один раз) | `bash …/start.sh dxvk` |
| Steam UI + логин | `bash …/start.sh steam-ui` |
| Пустой текст Steam | `bash …/start.sh fix-steam-ui` |
| Игра (сейвы 1/2/3) | `bash …/start.sh play` |
| Зависло | `bash …/start.sh reset` |
**CEF Steam (обязательно):** `-allosarches -cef-force-32bit -cef-in-process-gpu -no-cef-sandbox -cef-disable-gpu` — уже в `config.sh`.
**Игра:** DXVK + `d3d11=n,b`. **Не** смешивать с `export_wine_env_steam` при запуске exe.
### 3.2 GOG Galaxy 2.0 (лаунчер)
| Шаг | Команда |
|-----|---------|
| Установка (один раз) | `bash …/start.sh gog-install` |
| Запуск | `bash …/start.sh gog` |
| Перезапуск | `bash …/start.sh gog-restart` |
| Логин сбрасывает пароль | `bash …/start.sh fix-gog-auth` + `diagnose-gog-auth` |
**CEF GOG:** `-allosarches -cef-force-32bit -no-cef-sandbox -cef-disable-gpu` (без `-cef-in-process-gpu` — иначе CPU spin).
**Ограничение Wine:** нативный HTTP клиент Galaxy (`auth.gog.com/token`, `cfg.gog.com`) часто **таймаут 1520 с** → логин в клиенте **ненадёжен**. Обходы ниже в §5.
### 3.3 GOG web-stub (~500 KB) — **отдельный bottle, без Steam**
**Не** запускать в bottle HoMM-OldenEra (там Steam, дампы, `winedbg`). См. `scripts/games/gog/README.md`.
```bash
# Whisky → New Bottle → Windows 10 64-bit → «GOG-Install»
bash ~/code/local_machine/scripts/games/gog/list-bottles.sh
bash ~/code/local_machine/scripts/games/gog/use-bottle.sh <UUID> GOG-Install
bash ~/code/local_machine/scripts/games/gog/create-bottle.sh GOG-Install
bash ~/code/local_machine/scripts/games/gog/setup-bottle.sh
bash ~/code/local_machine/scripts/games/gog/install-gdiplus.sh # обязательно для .NET
brew install cabextract
bash ~/code/local_machine/scripts/games/gog/install-corefonts.sh
bash ~/code/local_machine/scripts/games/gog/run-web-installer.sh \
~/path/to/GOG_Galaxy_Jagged_Alliance_3.exe
```
Старые обёртки (`run-gog-web-installer.sh`, `setup-wine-bottle.sh` для GOG) перенаправляют в `gog/`.
**Типичные сбои:**
| Симптом | Действие |
|---------|----------|
| Пустые подписи / `FontFamilyNotFound` | `gog/install-corefonts.sh``gog/setup-bottle.sh --force` |
| «Installer Already Running» | `bash …/gog/reset.sh` |
| Нет bottle.env | `gog/use-bottle.sh <UUID>` |
Лог: `/tmp/gog-web-installer-GOG-Install.log`
### 3.4 GOG offline backup (рекомендуется при проблемах с сетью)
1. На [gog.com](https://www.gog.com) → библиотека → игра → **offline backup installer** (полный `.exe`, ГБ).
2. Скопировать в bottle: `…/drive_c/Setup_Game.exe`
3. Запуск:
```bash
source ~/code/local_machine/scripts/games/config.sh
export_wine_env
"$WINE64" 'C:\Setup_Game.exe'
```
Или через Whisky: Run → выбрать exe в `drive_c`.
### 3.5 JA3 multipart — innoextract, экономия диска
Для **Jagged Alliance 3** (и похожих GOG multipart backup): Wine-Inno **не доводит**; канон — **`gog/install-ja3-innoextract.sh`**.
Кратко:
1. Пять файлов в **`~/Games/`**: `setup_jagged_alliance_3_1.5.2_(80730).exe` + `-1.bin``-4.bin`.
2. Bottle **GOG-Install** (`gog/bottle.env`).
3. `bash …/gog/install-ja3-innoextract.sh` — распаковка в `drive_c/GOG Games/Jagged Alliance 3/`, `.bin` удаляются по мере чтения, после успеха — все архивы в `~/Games` (~15 GB).
4. Запуск: `bash …/gog/run-ja3-crossover.sh` (swap guard: см. [JA3_RUNBOOK.md](JA3_RUNBOOK.md) §4, §10).
Полный runbook: [JA3_MAC_WITHOUT_GALAXY.md](JA3_MAC_WITHOUT_GALAXY.md).
---
## 4. Переменные окружения (уже в скриптах)
```bash
export WINEPREFIX="<bottle>"
export WINEMSYNC=1
export WINEESYNC=1
export DYLD_LIBRARY_PATH="<Whisky>/Libraries/Wine/lib:…"
```
| Профиль | WINEDLLOVERRIDES | Когда |
|---------|------------------|--------|
| Steam / GOG UI | `dwrite=n,b` | steam-ui, gog |
| Unity / DX11 игра | `d3d11,d3d10core=n,b` | play, game |
---
## 5. GOG: если «не подключается» / сброс пароля
1. Логи: `bash …/start.sh diagnose-gog-auth`
2. `bash …/start.sh fix-gog-auth``gog-restart`
3. Если в логе `timeout … auth.gog.com/token`**вход в Galaxy под Wine часто не сохраняется**; используйте **offline installer** или покупку/ключ через браузер на Mac.
4. Mac до `auth.gog.com` отвечает <1 с — проблема в **Poco/Qt в Wine**, не в пароле.
---
## 6. Диагностика (чеклист)
```bash
bash ~/code/local_machine/scripts/games/start.sh disk # место
bash ~/code/local_machine/scripts/games/start.sh reset # убить Wine Steam/GOG
pgrep -fl 'GalaxyClient|GOG_Galaxy|steam\.exe' # дубликаты
```
| Лог | Путь |
|-----|------|
| GOG client | `…/ProgramData/GOG.com/Galaxy/logs/GalaxyClient.log` |
| GOG CEF | `…/ProgramData/GOG.com/Galaxy/logs/cef.log` |
| Web-stub | `/tmp/gog-web-installer.log` |
| Steam | `…/Steam/logs/connection_log.txt` |
---
## 7. Команды (шпаргалка)
```bash
BASE=~/code/local_machine/scripts/games
bash "$BASE/setup-wine-bottle.sh" # один раз
bash "$BASE/start.sh" steam-ui # Steam
bash "$BASE/start.sh" play # HoMM
bash "$BASE/start.sh" gog-install && gog # GOG Galaxy
bash "$BASE/run-gog-web-installer.sh" …/GOG_Galaxy_*.exe
bash "$BASE/start.sh" reset # всё убить в bottle
```
Документация: [WINE_APPS_LAUNCH_RUNBOOK.md](WINE_APPS_LAUNCH_RUNBOOK.md) · [TROUBLESHOOTING.md](TROUBLESHOOTING.md)
---
## 8. Честные ограничения
- **Whisky архивен** ([maintenance notice](https://docs.getwhisky.app/maintenance-notice)); альтернатива — [Moonshine](https://github.com/ybmeng/moonshine) (Wine 11.x).
- **GOG Galaxy login** в Wine на этой конфигурации — **best effort**, не гарантия.
- **Web-stub** требует сеть из Wine; при таймаутах — только **offline backup**.
- **Диск <10% свободно** — CEF crash loop, freeze; см. `docs/disk_cleanup/`.