# 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) §2–4 |
| **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`.
- Держать **≥15–20 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:08–04: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:08–04: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** — 2–3 раза, пауза **15–30 с** между попытками.
- Если не коннектится — **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 2–3× или 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*
