Files
local_machine/scripts/games/config.sh
ahauimix 1938b7c743 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>
2026-06-01 08:12:19 +03:00

215 lines
8.2 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Shared paths for HoMM / Whisky (source from other scripts in this folder).
GAMES_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
GAMES_CACHE_DIR="${GAMES_DIR}/cache"
BOTTLE_ID="38412122-AAE1-4831-9F2E-6A0EB364B3F9"
BOTTLE_NAME="HoMM-OldenEra"
# franke Whisky 3 (Whisky.app) — канон; isaacmarovitz legacy после migrate-bottle-to-franke-whisky.sh
_FRANKE_BOTTLE="${HOME}/Library/Containers/com.franke.Whisky/Bottles/${BOTTLE_ID}"
_ISAAC_BOTTLE="${HOME}/Library/Containers/com.isaacmarovitz.Whisky/Bottles/${BOTTLE_ID}"
if [[ -d "${_FRANKE_BOTTLE}/drive_c" ]]; then
BOTTLE_DIR="${_FRANKE_BOTTLE}"
WHISKY_LIBS="${HOME}/Library/Application Support/com.franke.Whisky"
else
BOTTLE_DIR="${_ISAAC_BOTTLE}"
WHISKY_LIBS="${HOME}/Library/Application Support/com.isaacmarovitz.Whisky"
fi
unset _FRANKE_BOTTLE _ISAAC_BOTTLE
WINE64="${WHISKY_LIBS}/Libraries/Wine/bin/wine64"
WINE_LIB="${WHISKY_LIBS}/Libraries/Wine/lib"
STEAM_DIR="${BOTTLE_DIR}/drive_c/Program Files (x86)/Steam"
STEAM_EXE="${STEAM_DIR}/Steam.exe"
STEAM_SETUP="${GAMES_CACHE_DIR}/SteamSetup.exe"
LIBRARIES_TAR="${GAMES_CACHE_DIR}/Libraries.tar.gz"
# GOG Galaxy 2.0 (полный offline setup ~290 MB; web stub GOG_Galaxy_2.0.exe — только загрузчик)
GOG_SETUP="${GAMES_CACHE_DIR}/setup_galaxy.exe"
GOG_SETUP_URL="${GOG_SETUP_URL:-}"
GOG_DIR_X86="${BOTTLE_DIR}/drive_c/Program Files (x86)/GOG Galaxy"
GOG_DIR_X64="${BOTTLE_DIR}/drive_c/Program Files/GOG Galaxy"
GOG_EXE="${GOG_DIR_X86}/GalaxyClient.exe"
# CEF (как Steam/Whisky #1220). Без -cef-in-process-gpu — меньше gpu-process CPU spin.
GOG_GALAXY_BASE_ARGS="${GOG_GALAXY_BASE_ARGS:-/runWithoutUpdating /deelevated}"
GOG_GALAXY_CEF_ARGS="${GOG_GALAXY_CEF_ARGS:--allosarches -cef-force-32bit -no-cef-sandbox -cef-disable-gpu}"
homm_gog_cef_args_line() {
printf '%s %s' "${GOG_GALAXY_BASE_ARGS}" "${GOG_GALAXY_CEF_ARGS}"
}
homm_gog_cef_args_array() {
local _IFS=$IFS
IFS=' '
# shellcheck disable=SC2206
local -a _a=(${GOG_GALAXY_BASE_ARGS} ${GOG_GALAXY_CEF_ARGS})
IFS=$_IFS
printf '%s\n' "${_a[@]}"
}
homm_gog_exe() {
if [[ -f "${GOG_EXE}" ]]; then
echo "${GOG_EXE}"
return 0
fi
local found
found="$(find "${BOTTLE_DIR}/drive_c/Program Files"* -maxdepth 3 -name 'GalaxyClient.exe' 2>/dev/null | head -1)"
if [[ -n "${found}" ]]; then
echo "${found}"
return 0
fi
return 1
}
homm_wine_gog_running() {
pgrep -f "${BOTTLE_ID}.*[Gg]alaxy[Cc]lient" >/dev/null 2>&1 \
|| pgrep -f 'GOG Galaxy.*GalaxyClient' >/dev/null 2>&1 \
|| pgrep -f 'GalaxyClient\.exe' >/dev/null 2>&1
}
export_wine_env_gog() {
export_wine_env
unset WINEDLLOVERRIDES 2>/dev/null || true
export WINEDEBUG="${WINEDEBUG:--all}"
}
# Heroes of Might and Magic: Olden Era (Steam)
HOMM_APP_ID="3105440"
HOMM_DIR="${STEAM_DIR}/steamapps/common/Heroes of Might and Magic Olden Era"
HOMM_EXE="${HOMM_DIR}/HeroesOldenEra.exe"
WINEPATH_BIN="${WHISKY_LIBS}/Libraries/Wine/bin/winepath"
# Запуск игры: по умолчанию виртуальный стол Wine (часто лечит «двигается, ЛКМ нет»).
# HOMM_USE_WINEVDESKTOP=0 — запуск напрямую без explorer /desktop (быстрый A/B тест).
# HOMM_LAUNCH_DIRECT=1 — legacy-переключатель прямого запуска (оставлен для совместимости).
# HOMM_VDESKTOP=WxH — размер виртуального стола.
#
# По умолчанию Unity принудительно в оконном режиме (-screen-fullscreen 0 …):
# это часто восстанавливает ЛКМ на macOS+Wine при багах полноэкранного режима.
# Выключить: HOMM_UNITY_WINDOWED=0
HOMM_VDESKTOP="${HOMM_VDESKTOP:-1920x1080}"
HOMM_USE_WINEVDESKTOP="${HOMM_USE_WINEVDESKTOP:-1}"
HOMM_LAUNCH_DIRECT="${HOMM_LAUNCH_DIRECT:-0}"
HOMM_UNITY_WINDOWED="${HOMM_UNITY_WINDOWED:-1}"
# Дополнительные аргументы Unity через пробел, напр.: "-popupwindow"
HOMM_UNITY_EXTRA="${HOMM_UNITY_EXTRA:-}"
# Steam CEF (steamwebhelper): без этих флагов в Whisky/Wine часто нет окна UI
# (cef_log: message_window.cc Class does not exist, webhelper в цикле перезапуска).
# Источник: Whisky #1220 — -allosarches -cef-force-32bit -cef-in-process-gpu -no-cef-sandbox
HOMM_STEAM_CEF_ARGS="${HOMM_STEAM_CEF_ARGS:--allosarches -cef-force-32bit -cef-in-process-gpu -no-cef-sandbox -cef-disable-gpu}"
# HOMM_STEAM_VDESKTOP=1 — запуск через explorer /desktop (если окно «теряется»)
HOMM_STEAM_VDESKTOP="${HOMM_STEAM_VDESKTOP:-0}"
# Диск: APFS Data volume. Guard: block < HOMM_DISK_MIN_GB (3), warn < HOMM_DISK_WARN_PCT (10).
homm_data_volume_path() {
if [[ -d /System/Volumes/Data ]]; then
echo /System/Volumes/Data
elif [[ -n "${HOME:-}" && -d "${HOME}" ]]; then
echo "${HOME}"
else
echo /
fi
}
homm_disk_free_kb() {
df -k "$(homm_data_volume_path)" | awk 'NR==2 {print $4}'
}
homm_disk_total_kb() {
df -k "$(homm_data_volume_path)" | awk 'NR==2 {print $2}'
}
homm_disk_used_pct() {
df -k "$(homm_data_volume_path)" | awk 'NR==2 {gsub(/%/,"",$5); print $5}'
}
homm_disk_free_pct() {
local free_kb total_kb
free_kb="$(homm_disk_free_kb)"
total_kb="$(homm_disk_total_kb)"
if [[ "${total_kb}" -gt 0 ]]; then
echo $(( free_kb * 100 / total_kb ))
else
echo 0
fi
}
export_wine_env() {
export WINEPREFIX="${BOTTLE_DIR}"
export WINEMSYNC=1
export WINEESYNC=1
export DYLD_LIBRARY_PATH="${WINE_LIB}:${DYLD_LIBRARY_PATH:-}"
}
# Steam UI: без DXVK; dwrite=n,b — классический фикс пустого текста VGUI (см. fix-homm-steam-ui.sh).
export_wine_env_steam() {
export_wine_env
unset DXVK_ASYNC DXVK_HUD 2>/dev/null || true
export WINEDLLOVERRIDES="dwrite=n,b"
}
homm_kill_mac_steam() {
pkill -9 -f 'Steam.AppBundle/Steam/Contents/MacOS/steam_osx' 2>/dev/null || true
pkill -9 -f 'Steam.AppBundle/Steam/Contents/MacOS/ipcserver' 2>/dev/null || true
pkill -9 -f 'Steam Helper.app/Contents/MacOS/Steam Helper' 2>/dev/null || true
}
homm_steam_cef_args() {
# shellcheck disable=SC2206
echo ${HOMM_STEAM_CEF_ARGS}
}
homm_steam_connection_log() {
echo "${STEAM_DIR}/logs/connection_log.txt"
}
# Последняя сессия в connection_log — Logged On?
homm_steam_logged_on() {
local log
log="$(homm_steam_connection_log)"
[[ -f "${log}" ]] || return 1
tail -25 "${log}" | grep -qE '\[Logged On'
}
# Steam.exe в bottle (Terminal start.sh или Whisky GUI — argv часто C:\…\Steam\steam.exe).
# В regex избегать \S в "\Steam" — иначе ложные совпадения; используйте [/\\] или .
homm_wine_steam_running() {
pgrep -f "${BOTTLE_ID}.*[Ss]team\\.exe" >/dev/null 2>&1 \
|| pgrep -f "Whisky/Bottles/${BOTTLE_ID}.*[Ss]team\\.exe" >/dev/null 2>&1 \
|| pgrep -f 'Steam[/\\]steam\.exe' >/dev/null 2>&1 \
|| pgrep -f 'steamwebhelper\.exe' >/dev/null 2>&1
}
# Logged On + живой клиент (для play/game и сейвов).
homm_steam_ready_for_game() {
homm_steam_logged_on || return 1
homm_wine_steam_running
}
# Нативный Steam.app на Mac мешает bottle (login / CM / ipc).
homm_mac_steam_running() {
pgrep -f 'Steam\.AppBundle/Steam/Contents/MacOS/steam_osx' >/dev/null 2>&1
}
homm_warn_mac_steam() {
if homm_mac_steam_running; then
echo "⚠️ Запущен нативный Steam на Mac (часто остаётся после удаления Steam.app из /Applications)."
echo " Папка: ~/Library/Application Support/Steam/Steam.AppBundle/"
echo " Остановить:"
echo " pkill -f 'Steam.AppBundle/Steam/Contents/MacOS/steam_osx'"
echo " pkill -f 'Steam.AppBundle/Steam/Contents/MacOS/ipcserver'"
echo " Затем: bash ${GAMES_DIR}/start.sh reset && bash ${GAMES_DIR}/start.sh steam-ui"
return 1
fi
return 0
}
# Olden Era (Unity DX11): Gcenx DXVK-macOS в system32 — см. install-dxvk-macos.sh
export_wine_env_game() {
export_wine_env
export WINEDLLOVERRIDES="d3d11,d3d10core=n,b"
export DXVK_ASYNC=1
export DXVK_HUD=0
# Меньше конфликтов fullscreen с macOS Stage Manager / края экрана
export SDL_VIDEO_MAC_FULLSCREEN_SPACES="${SDL_VIDEO_MAC_FULLSCREEN_SPACES:-0}"
}