Add Joplin, old Mac, and Fedora WiFi runbooks; simplify JA3 Whisky scripts and hotspot recovery.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
ahauimix
2026-06-19 22:26:33 +03:00
parent 1938b7c743
commit 4bc9629a09
381 changed files with 3442 additions and 773 deletions

View File

@@ -30,26 +30,23 @@ bash ~/code/local_machine/scripts/games/gog/run-web-installer.sh \
## Jagged Alliance 3 **без GOG Galaxy** (канон)
**Runbook (установка + графика + RCA + антипаттерны):** [JA3_RUNBOOK.md](../../../docs/games/JA3_RUNBOOK.md)
**Runbook:** [JA3_RUNBOOK.md](../../../docs/games/JA3_RUNBOOK.md)
```bash
# Установка (Whisky GOG-Install): 5 частей offline backup в ~/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 — один раз setup, затем каждый раз run):
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
# Запуск (Whisky GOG-Install):
bash ~/code/local_machine/scripts/games/gog/run-ja3.sh
```
| Скрипт | Назначение |
|--------|------------|
| `install-ja3-innoextract.sh` | **Канон установки** (Whisky) |
| `finish-ja3-layout.sh` | CommonLua, реестр GOG |
| `setup-ja3-crossover.sh` | CrossOver bottle JA3-GOG + clone игры |
| **`run-ja3-crossover.sh`** | **Канон запуска** (D3D12 / D3DMetal) |
| `run-ja3.sh` | Whisky — **графика D3D12 не работает** (см. runbook) |
| **`run-ja3.sh`** | **Канон запуска** |
| `reset-ja3-whisky.sh` | Остановить JA3/Wine в GOG-Install |
Galaxy / web-stub — **не использовать** для JA3 ([GOG_GALAXY_7H_RCA.md](../../../docs/games/GOG_GALAXY_7H_RCA.md)).
@@ -62,3 +59,4 @@ bash ~/code/local_machine/scripts/games/gog/reset.sh
## Устаревшее (не использовать для GOG)
- `setup-wine-bottle.sh` / bottle **HoMM-OldenEra** — там Steam и общий префикс.
- CrossOver / `run-ja3-crossover.sh` / `JA3-GOG` / `JA3-WINE`**удалено** (2026-06).

View File

@@ -84,10 +84,10 @@ gog_swap_guard() {
return 0
}
# JA3/CrossOver: жёсткий стоп только если swap высокий И Wine/JA3 ещё живы.
# JA3/Whisky: жёсткий стоп только если swap высокий И Wine/JA3 ещё живы.
# «Залипший» swap после закрытия (macOS не отдал) — предупреждение, запуск разрешён.
gog_wine_or_ja3_active() {
pgrep -f 'JA3\.exe|wineserver|wine64-preloader|winedbg|wine64\.exe|CrossOver.*wine' >/dev/null 2>&1
pgrep -f 'JA3\.exe' >/dev/null 2>&1
}
gog_swap_guard_ja3_launch() {
@@ -102,15 +102,15 @@ gog_swap_guard_ja3_launch() {
if gog_wine_or_ja3_active; then
if awk -v u="${used}" -v m="${soft_mb}" 'BEGIN{exit !(u>=m)}'; then
echo "❌ Swap ~${used}MB и Wine/JA3 ещё работают (лимит ${soft_mb}MB)."
echo " bash ${GOG_DIR}/reset-ja3-crossover.sh или bash ${GOG_DIR}/emergency-stop.sh"
echo " затем reboot Mac. Или: JA3_IGNORE_SWAP=1 bash …/run-ja3-crossover.sh"
echo " bash ${GOG_DIR}/reset-ja3-whisky.sh"
echo " затем reboot Mac. Или: JA3_IGNORE_SWAP=1 bash ${GOG_DIR}/run-ja3.sh"
return 1
fi
return 0
fi
if awk -v u="${used}" -v m="${hard_mb}" 'BEGIN{exit !(u>=m)}'; then
echo "❌ Swap ~${used}MB (лимит ${hard_mb}MB) — reboot Mac."
echo " Или: JA3_IGNORE_SWAP=1 bash …/run-ja3-crossover.sh"
echo " Или: JA3_IGNORE_SWAP=1 bash ${GOG_DIR}/run-ja3.sh"
return 1
fi
if awk -v u="${used}" -v m="${soft_mb}" 'BEGIN{exit !(u>=m)}'; then
@@ -203,6 +203,20 @@ export_wine_env_ja3_d3dmetal() {
unset DXVK_ASYNC DXVK_HUD 2>/dev/null || true
}
# Whisky GOG-Install: D3D11 + DXVK-macOS (D3D12 через GPTK/D3DMetal при наличии).
export_wine_env_ja3_whisky() {
export_wine_env_gog
unset WINED3DMETAL 2>/dev/null || true
export WINEDLLOVERRIDES="d3d11,d3d10core,dxgi=n,b;d3d12=d;libxess,xess,dxcompiler,dxil,nvngx_dlss,XeFX,XeFX_Loader=d;gdiplus=n,b"
local _dxvk_conf="${BOTTLE_DIR}/drive_c/GOG Games/Jagged Alliance 3/dxvk.conf"
if [[ -f "${_dxvk_conf}" ]]; then
export DXVK_CONFIG_FILE="${_dxvk_conf}"
fi
unset DXVK_ASYNC DXVK_HUD 2>/dev/null || true
export SDL_VIDEO_MAC_FULLSCREEN_SPACES="${SDL_VIDEO_MAC_FULLSCREEN_SPACES:-0}"
export MVK_CONFIG_RESUME_LOST_DEVICE=1
}
gog_steam_client_in_bottle() {
local f
[[ -d "${BOTTLE_DIR}/drive_c/Program Files (x86)/Steam" ]] && return 0

View File

@@ -1,77 +0,0 @@
#!/usr/bin/env bash
# Курсор JA3 в CrossOver (Retina / HiDPI).
# Профили (JA3_MOUSE_PROFILE):
# legacy — RetinaMode=n (полный ход по Y; возможен сдвиг клика) — default
# retina-lite — RetinaMode=y без LogPixels (если legacy смещает, но нет клипа)
# retina — RetinaMode=y + LogPixels=192 (клип на середине экрана — не default)
set -euo pipefail
GOG_DIR="$(cd "$(dirname "$0")" && pwd)"
CX="/Applications/CrossOver.app/Contents/SharedSupport/CrossOver"
CX_BOTTLE="JA3-GOG"
CX_DIR="${HOME}/Library/Application Support/CrossOver/Bottles/${CX_BOTTLE}"
[[ -d "${CX}" ]] || {
echo "❌ CrossOver не установлен"
exit 1
}
PROFILE="${JA3_MOUSE_PROFILE:-legacy}"
WREG() { "${CX}/bin/wine" --bottle "${CX_BOTTLE}" "$@"; }
case "${PROFILE}" in
retina)
RETINA="y"
SET_DPI=1
DPI="${JA3_LOG_PIXELS:-192}"
SET_WIN8=1
;;
retina-lite)
RETINA="y"
SET_DPI=0
SET_WIN8=0
;;
legacy|*)
RETINA="n"
SET_DPI=0
SET_WIN8=0
PROFILE="legacy"
;;
esac
WREG reg add 'HKCU\Software\Wine\Mac Driver' /v RetinaMode /t REG_SZ /d "${RETINA}" /f >/dev/null
if [[ "${SET_DPI}" == "1" ]]; then
WREG reg add 'HKCU\Control Panel\Desktop' /v LogPixels /t REG_DWORD /d "${DPI}" /f >/dev/null
else
WREG reg delete 'HKCU\Control Panel\Desktop' /v LogPixels /f >/dev/null 2>&1 || true
fi
if [[ "${SET_WIN8}" == "1" ]]; then
WREG reg add 'HKCU\Control Panel\Desktop' /v Win8DpiScaling /t REG_DWORD /d 1 /f >/dev/null
else
WREG reg delete 'HKCU\Control Panel\Desktop' /v Win8DpiScaling /f >/dev/null 2>&1 || true
fi
CONF="${CX_DIR}/cxbottle.conf"
if [[ -f "${CONF}" ]] && ! grep -q 'SDL_VIDEO_MAC_FULLSCREEN_SPACES' "${CONF}"; then
sed -i '' '/^\[EnvironmentVariables\]/a\
"SDL_VIDEO_MAC_FULLSCREEN_SPACES" = "0"
' "${CONF}" 2>/dev/null || true
fi
echo "OK: profile=${PROFILE} RetinaMode=${RETINA}${CX_BOTTLE}"
echo " Перезапуск: bash ${GOG_DIR}/reset-ja3-crossover.sh && bash ${GOG_DIR}/run-ja3-crossover.sh"
case "${PROFILE}" in
legacy)
echo " Если клик смещён: JA3_MOUSE_PROFILE=retina-lite bash ${GOG_DIR}/fix-ja3-crossover-mouse.sh"
echo " Без перезапуска: верхний левый угол окна = угол экрана."
;;
retina-lite)
echo " Если смещение осталось: JA3_MOUSE_PROFILE=legacy …"
echo " Если клип на середине: JA3_MOUSE_PROFILE=legacy …"
;;
retina)
echo " ⚠️ retina+LogPixels=192 часто режет курсор на середине экрана."
echo " Если так: JA3_MOUSE_PROFILE=legacy bash ${GOG_DIR}/fix-ja3-crossover-mouse.sh"
;;
esac

View File

@@ -70,3 +70,18 @@ tell application "System Events"
end repeat
end tell' 2>/dev/null || true
}
# Только GOG-Install bottle — не трогает другие bottles.
gog_kill_whisky_bottle() {
pkill -9 -f "${BOTTLE_DIR}.*JA3\.exe" 2>/dev/null || true
pkill -9 -f "${BOTTLE_DIR}.*GalaxyClient" 2>/dev/null || true
pkill -9 -f "${BOTTLE_DIR}.*wineserver" 2>/dev/null || true
pkill -9 -f "${BOTTLE_DIR}.*wine64-preloader" 2>/dev/null || true
sleep 1
if [[ -d "${BOTTLE_DIR}" ]]; then
export WINEPREFIX="${BOTTLE_DIR}"
[[ -x "${WINE_SERV}" ]] && "${WINE_SERV}" -k 2>/dev/null || true
sleep 1
gog_remove_lock_files
fi
}

View File

@@ -1,17 +0,0 @@
#!/usr/bin/env bash
# Остановить JA3 / Wine (CrossOver bottle JA3-GOG) перед перезапуском.
set -euo pipefail
GOG_DIR="$(cd "$(dirname "$0")" && pwd)"
# shellcheck source=gog-process.sh
source "${GOG_DIR}/gog-process.sh"
bash "${GOG_DIR}/emergency-stop.sh" 2>/dev/null || gog_kill_all
pkill -f 'JA3\.exe' 2>/dev/null || true
pkill -f 'wineserver.*JA3-GOG' 2>/dev/null || true
CX="/Applications/CrossOver.app/Contents/SharedSupport/CrossOver"
if [[ -x "${CX}/bin/wine" ]]; then
"${CX}/bin/wine" --bottle JA3-GOG wineboot --kill 2>/dev/null || true
fi
sleep 2
pgrep -fl 'JA3\.exe|wineserver' 2>/dev/null | head -5 || echo "OK: процессы JA3/Wine остановлены"

View File

@@ -0,0 +1,10 @@
#!/usr/bin/env bash
# Остановить JA3/Wine в Whisky GOG-Install.
set -euo pipefail
GOG_DIR="$(cd "$(dirname "$0")" && pwd)"
# shellcheck source=gog-process.sh
source "${GOG_DIR}/gog-process.sh"
gog_kill_whisky_bottle
sleep 2
pgrep -fl "${BOTTLE_DIR}.*JA3" 2>/dev/null | head -5 || echo "OK: JA3/Wine в ${BOTTLE_NAME} остановлены"

View File

@@ -1,35 +0,0 @@
#!/usr/bin/env bash
# JA3 (GOG) через CrossOver + D3DMetal — D3D12 на Apple Silicon.
set -euo pipefail
GOG_DIR="$(cd "$(dirname "$0")" && pwd)"
# shellcheck source=config.sh
source "${GOG_DIR}/config.sh"
# shellcheck source=gog-process.sh
source "${GOG_DIR}/gog-process.sh"
CX="${HOME}/Applications/CrossOver.app/Contents/SharedSupport/CrossOver"
[[ -d "/Applications/CrossOver.app" ]] && CX="/Applications/CrossOver.app/Contents/SharedSupport/CrossOver"
CX_BOTTLE="JA3-GOG"
CX_DIR="${HOME}/Library/Application Support/CrossOver/Bottles/${CX_BOTTLE}"
[[ -d "${CX}" ]] || {
echo "❌ CrossOver не установлен: brew install --cask crossover"
exit 1
}
if [[ ! -f "${CX_DIR}/drive_c/GOG Games/Jagged Alliance 3/JA3.exe" ]]; then
bash "${GOG_DIR}/setup-ja3-crossover.sh"
fi
bash "${GOG_DIR}/emergency-stop.sh" >/dev/null 2>&1 || gog_kill_all
sleep 2
gog_swap_guard_ja3_launch "${JA3_SWAP_SOFT_MB:-1200}" "${JA3_SWAP_HARD_MB:-4096}" || exit 1
echo "Запуск JA3 (CrossOver D3DMetal; без Steam.app)…"
echo "Cmd+Tab → JA3. В графике: отключить heat haze."
echo "(лог «Steam … GOG» = GOG API-шим, не Steam client)"
# start /d — CWD с CommonLua/ (обязательно; --cx-app без /d → autorun.lua not found)
exec "${CX}/bin/wine" --bottle "${CX_BOTTLE}" start /d "C:\\GOG Games\\Jagged Alliance 3" \
"C:\\GOG Games\\Jagged Alliance 3\\JA3.exe" ${JA3_EXTRA_ARGS:--unpacked}

View File

@@ -1,57 +0,0 @@
#!/usr/bin/env bash
# JA3 через Wine 7.7 + D3DMetal (Game Porting Toolkit). Канон для D3D12 на Apple Silicon.
set -euo pipefail
GOG_DIR="$(cd "$(dirname "$0")" && pwd)"
GAMES_DIR="$(cd "${GOG_DIR}/.." && pwd)"
# shellcheck source=config.sh
source "${GOG_DIR}/config.sh"
# shellcheck source=gog-process.sh
source "${GOG_DIR}/gog-process.sh"
GPTK_WINE="/Applications/Game Porting Toolkit.app/Contents/Resources/wine"
GPTK_WINE64="${GPTK_WINE}/bin/wine64"
JA3_WIN='C:\GOG Games\Jagged Alliance 3\JA3.exe'
MARKER="${GAMES_CACHE_DIR}/.ja3_gptk_prefix"
[[ -x "${GPTK_WINE64}" ]] || {
echo "❌ brew install --cask gcenx/wine/game-porting-toolkit"
exit 1
}
if [[ -f "${MARKER}" ]]; then
GPTK_PREFIX="$(cat "${MARKER}")"
else
GPTK_PREFIX="${JA3_GPTK_PREFIX:-${GAMES_CACHE_DIR}/ja3-gptk-prefix}"
fi
if [[ ! -f "${GPTK_PREFIX}/system.reg" ]]; then
bash "${GOG_DIR}/setup-ja3-gptk-prefix.sh"
GPTK_PREFIX="$(cat "${MARKER}" 2>/dev/null || echo "${GPTK_PREFIX}")"
fi
JA3_UNIX="${GPTK_PREFIX}/drive_c/GOG Games/Jagged Alliance 3"
[[ -f "${JA3_UNIX}/JA3.exe" ]] || JA3_UNIX="$(readlink "${JA3_UNIX}" 2>/dev/null || true)"
[[ -f "${JA3_UNIX}/JA3.exe" ]] || {
echo "❌ Нет JA3 в GPTK prefix — bash ${GOG_DIR}/setup-ja3-gptk-prefix.sh"
exit 1
}
bash "${GOG_DIR}/emergency-stop.sh" >/dev/null 2>&1 || gog_kill_all
sleep 2
if [[ "${JA3_IGNORE_SWAP:-0}" != "1" ]] && ! gog_swap_guard "${JA3_SWAP_MAX_MB:-800}"; then
exit 1
fi
export WINEPREFIX="${GPTK_PREFIX}"
export WINEARCH=win64
export WINED3DMETAL=1
export WINEMSYNC=1
export WINEDEBUG=-all
export MVK_CONFIG_LOG_LEVEL=0
export DYLD_LIBRARY_PATH="${GPTK_WINE}/lib:${DYLD_LIBRARY_PATH:-}"
export WINEDLLOVERRIDES="libxess,xess,dxcompiler,dxil,nvngx_dlss,XeFX,XeFX_Loader=d;gdiplus=n,b"
echo "Запуск JA3 (GPTK Wine 7.7 + D3DMetal, prefix ${GPTK_PREFIX})…"
cd "${JA3_UNIX}"
exec "${GPTK_WINE64}" "${JA3_WIN}" ${JA3_EXTRA_ARGS:--unpacked}

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env bash
# Запуск Jagged Alliance 3 (GOG) без Steam client.
# Запуск Jagged Alliance 3 (GOG) без Steam client — Whisky GOG-Install.
set -euo pipefail
GOG_DIR="$(cd "$(dirname "$0")" && pwd)"
# shellcheck source=config.sh
@@ -26,7 +26,7 @@ if [[ "${JA3_IGNORE_SWAP:-0}" == "1" ]]; then
elif ! gog_swap_guard_ja3_launch "${JA3_SWAP_SOFT_MB:-1200}" "${JA3_SWAP_HARD_MB:-4096}"; then
used="$(gog_swap_used_mb 2>/dev/null || echo '?')"
echo ""
echo "Swap ~${used}MB — bash ${GOG_DIR}/reset-ja3-crossover.sh или reboot Mac"
echo "Swap ~${used}MB — bash ${GOG_DIR}/reset-ja3-whisky.sh или reboot Mac"
echo "Или: JA3_IGNORE_SWAP=1 bash ${GOG_DIR}/run-ja3.sh"
exit 1
fi
@@ -46,18 +46,6 @@ if ! ja3_gptk_available && ! ja3_bottle_uses_d3dmetal; then
fi
fi
CX="/Applications/CrossOver.app/Contents/SharedSupport/CrossOver"
if [[ ! -x "${CX}/bin/wine" ]]; then
:
elif [[ ! -f "${HOME}/Library/Application Support/CrossOver/Bottles/JA3-GOG/drive_c/GOG Games/Jagged Alliance 3/JA3.exe" ]]; then
echo ""
echo " JA3 (D3D12) на Mac: Whisky/Gcenx не поддерживает D3DMetal."
echo " brew install --cask crossover"
echo " bash ${GOG_DIR}/setup-ja3-crossover.sh && bash ${GOG_DIR}/run-ja3-crossover.sh"
echo ""
fi
# Whisky D3DMetal path — не работает для JA3/D3D12 на Gcenx (см. JA3_MAC_WITHOUT_GALAXY.md)
if ja3_gptk_available || ja3_bottle_uses_d3dmetal; then
bash "${GOG_DIR}/prepare-ja3-d3dmetal.sh" >/dev/null 2>&1 || true
fi
@@ -80,14 +68,9 @@ if [[ -f "${BOTTLE_DIR}/drive_c/Program Files (x86)/GOG Galaxy/GalaxyClientServi
fi
if ja3_gptk_available || ja3_bottle_uses_d3dmetal; then
echo "⚠️ Whisky D3DMetal не поддерживает JA3/D3D12 (Gcenx без D3DMetal hooks)."
echo " Используйте: bash ${GOG_DIR}/run-ja3-crossover.sh"
echo ""
fi
if ja3_gptk_available || ja3_bottle_uses_d3dmetal; then
echo "Запуск JA3 (Whisky — эксперимент; D3D12 → CrossOver)…"
echo "Запуск JA3 (Whisky + D3DMetal)…"
else
echo "Запуск JA3 (GOG, DXVK D3D11 fallback; без Steam.app)…"
echo "Запуск JA3 (Whisky, DXVK D3D11 fallback; без Steam.app)…"
fi
echo "Cmd+Tab → wine64. В графике: отключить heat haze."
echo "(лог «Steam … GOG» = GOG API-шим, не Steam client)"
@@ -98,6 +81,5 @@ else
_ja3_args="${JA3_EXTRA_ARGS:--unpacked -graphicsapi d3d11}"
fi
# start /d — CWD = папка игры (CommonLua/, иначе «graphics subsystem»/autorun.lua из Whisky Run)
# innoextract не запускает Inno-постскрипты; -unpacked + CommonLua на диске обязательны
# shellcheck disable=SC2086
exec "${WINE64}" start /d "C:\\GOG Games\\Jagged Alliance 3" "${JA3_WIN}" ${_ja3_args}

View File

@@ -1,64 +0,0 @@
#!/usr/bin/env bash
# Отдельный WINEPREFIX под Wine 7.7 из Game Porting Toolkit (D3D12 + D3DMetal).
# Whisky Wine 11 не грузит GPTK dxgi/d3d12 PE — JA3 падает на «Failed creating render device».
set -euo pipefail
GOG_DIR="$(cd "$(dirname "$0")" && pwd)"
GAMES_DIR="$(cd "${GOG_DIR}/.." && pwd)"
# shellcheck source=config.sh
source "${GOG_DIR}/config.sh"
GPTK_WINE="/Applications/Game Porting Toolkit.app/Contents/Resources/wine"
GPTK_WINE64="${GPTK_WINE}/bin/wine64"
JA3_SRC="${BOTTLE_DIR}/drive_c/GOG Games/Jagged Alliance 3"
GPTK_PREFIX="${JA3_GPTK_PREFIX:-${GAMES_CACHE_DIR}/ja3-gptk-prefix}"
[[ -x "${GPTK_WINE64}" ]] || {
echo "❌ brew install --cask gcenx/wine/game-porting-toolkit"
exit 1
}
[[ -f "${JA3_SRC}/JA3.exe" ]] || {
echo "❌ Нет JA3 в bottle ${BOTTLE_NAME} — install-ja3-innoextract.sh"
exit 1
}
export WINEARCH=win64
export WINEPREFIX="${GPTK_PREFIX}"
export WINED3DMETAL=1
export WINEMSYNC=1
export WINEDEBUG=-all
export DYLD_LIBRARY_PATH="${GPTK_WINE}/lib:${DYLD_LIBRARY_PATH:-}"
mkdir -p "${GPTK_PREFIX}"
if [[ ! -f "${GPTK_PREFIX}/system.reg" ]]; then
echo "Инициализация GPTK prefix: ${GPTK_PREFIX}"
"${GPTK_WINE64}" wineboot -i
fi
GOG_DRIVE="${GPTK_PREFIX}/drive_c/GOG Games"
JA3_LINK="${GOG_DRIVE}/Jagged Alliance 3"
mkdir -p "${GOG_DRIVE}"
if [[ -L "${JA3_LINK}" ]]; then
:
elif [[ -d "${JA3_LINK}" ]]; then
echo " JA3 уже в prefix (не symlink)"
else
ln -s "${JA3_SRC}" "${JA3_LINK}"
fi
# CommonLua + upscale cleanup (на исходной копии в GOG bottle)
bash "${GOG_DIR}/finish-ja3-layout.sh" >/dev/null 2>&1 || true
WINE64="${GPTK_WINE64}" BOTTLE_DIR="${GPTK_PREFIX}" export_wine_env_gog
export WINED3DMETAL=1
export WINEDLLOVERRIDES="libxess,xess,dxcompiler,dxil,nvngx_dlss,XeFX,XeFX_Loader=d;gdiplus=n,b"
GAME_ID='1556263729'
KEY="HKLM\\Software\\WOW6432Node\\GOG.com\\Games\\${GAME_ID}"
"${GPTK_WINE64}" reg add "${KEY}" /v gameName /t REG_SZ /d 'Jagged Alliance 3' /f >/dev/null
"${GPTK_WINE64}" reg add "${KEY}" /v exe /t REG_SZ /d 'JA3.exe' /f >/dev/null
"${GPTK_WINE64}" reg add "${KEY}" /v path /t REG_SZ /d 'C:\GOG Games\Jagged Alliance 3\' /f >/dev/null
echo "${GPTK_PREFIX}" >"${GAMES_CACHE_DIR}/.ja3_gptk_prefix"
echo "OK: GPTK prefix → ${GPTK_PREFIX}"
echo " Запуск: bash ${GOG_DIR}/run-ja3-gptk-wine.sh"