pkgname=starcraft-ris pkgver=1.16.1 pkgrel=1 pkgdesc="StarCraft: Brood War" arch=('any') license=('custom') install=starcraft-ris.install source=() sha256sums=() makedepends=('wine' 'xorg-server-xvfb' 'xdotool' 'icoutils' 'imagemagick') optdepends=('gamescope') options=('!strip' '!zipman') _install_path="/home/ris/Games/Starcraft" prepare() { set -x pkill -f "SC-installer.exe" || true rm -rf "${srcdir}/"* || true ln -sf "${startdir}/assets/SC-installer.exe" "${srcdir}/" unzip -q -o "$startdir/assets/After Brood War.zip" -d "$srcdir/extracted" unrar x -o+ "$startdir/assets/Empires_War.rar" "$srcdir/extracted/" cat << 'EOF' > "${srcdir}/run.sh" #!/usr/bin/env bash SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" export WINEPREFIX="${SCRIPT_DIR}" export WINEDEBUG="-all" RES=$(xrandr --current 2>/dev/null | grep '*' | head -n1 | awk '{print $1}') RES=${RES:-"1920x1080"} export WINEDLLOVERRIDES="mscoree,mshtml=;ddraw=native" #export WINEDLLOVERRIDES="mscoree,mshtml=;ddraw=native,builtin;wined3d=builtin" exec /usr/bin/wine "C:\\Program Files (x86)\\Starcraft\\StarCraft.exe" "$@" EOF cat << 'EOF' > "${srcdir}/run-gamescope.sh" #!/usr/bin/env bash SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" export WINEPREFIX="${SCRIPT_DIR}" export WINEDEBUG="-all" RES=$(xrandr --current 2>/dev/null | grep '*' | head -n1 | awk '{print $1}') RES=${RES:-"1920x1080"} OUTPUT=$(xrandr --current 2>/dev/null | grep ' connected' | head -n1 | awk '{print $1}') WIDTH="${RES%%x*}" HEIGHT="${RES##*x}" export WINEDLLOVERRIDES="mscoree,mshtml=;ddraw=native" gamescope -w 640 -h 480 -W "$WIDTH" -H "$HEIGHT" -F nearest -S fit --fullscreen -- /usr/bin/wine "C:\\Program Files (x86)\\Starcraft\\StarCraft.exe" "$@" > /dev/null 2>&1 & disown sleep 3 while pgrep -f '^C:\\Program Files \(x86\)\\Starcraft\\StarCraft\.exe' > /dev/null; do sleep 2 done pkill -9 -f "gamescope.*StarCraft\.exe" > /dev/null 2>/dev/null pkill -9 -f "gamescopereaper" > /dev/null 2>/dev/null wineserver -k for pid in $(pgrep -u "$USER" -x "winedevice.exe"); do if [ -f "/proc/$pid/environ" ]; then if tr '\0' '\n' < "/proc/$pid/environ" 2>/dev/null | grep -q "^WINEPREFIX=${WINEPREFIX}$"; then kill -9 "$pid" 2>/dev/null fi fi done EOF cat << 'EOF' > "${srcdir}/starcraft.desktop" [Desktop Entry] Type=Application Name=StarCraft: Brood War Exec=sh -c 'cd "\$(dirname "%k")" && ./run.sh' Icon=starcraft Terminal=false Categories=Game;StrategyGame; EOF cat << EOF > "${srcdir}/starcraft-menu.desktop" [Desktop Entry] Type=Application Name=StarCraft: Brood War Exec=${_install_path}/run.sh Icon=starcraft Terminal=false Categories=Game;StrategyGame; EOF } build() { set -x local target_dir="${srcdir}${_install_path}" export WINEPREFIX="${target_dir}" #export WINEDEBUG="fixme+all,err+all" export WINEDEBUG="-all" export WINEARCH="win64" export LIBGL_ALWAYS_SOFTWARE=1 export MESA_LOG_LEVEL=error export EGL_LOG_LEVEL=fatal rm -f "$target_dir/drive_c/Program Files (x86)/Starcraft/BwarInst.log" mkdir -p "$WINEPREFIX" WINEDLLOVERRIDES="mscoree,mshtml=" xvfb-run -a -s "-screen 0 1024x768x24" wineboot --init > /dev/null 2>&1 wineserver -w ALSACFG_CONFIG_DIR="" AUDIODEV=null xvfb-run wine "${srcdir}/SC-installer.exe" > /dev/null 2>&1 & while true; do WINDOW_ID=$(DISPLAY=:99 xdotool search --name "Starcraft: Brood War" 2>/dev/null | head -n 1) [ -n "$WINDOW_ID" ] && break sleep 1 done WINDOW_ID=$(DISPLAY=:99 xdotool search --name "Starcraft: Brood War" | head -n 1) DISPLAY=:99 xdotool type --window "$WINDOW_ID" "s" 2>/dev/null sleep 1 DISPLAY=:99 xdotool key --window "$WINDOW_ID" "Return" 2>/dev/null sleep 1 DISPLAY=:99 xdotool key --window "$WINDOW_ID" alt+o 2>/dev/null while [ ! -f "$target_dir/drive_c/Program Files (x86)/Starcraft/BwarInst.log" ]; do sleep 2 done DISPLAY=:99 xdotool key --window "$WINDOW_ID" "x" 2>/dev/null || true unzip -o "${startdir}/assets/cnc-ddraw.zip" "ddraw.dll" "ddraw.ini" -d "$target_dir/drive_c/Program Files (x86)/Starcraft/" INI_PATH="$target_dir/drive_c/Program Files (x86)/Starcraft/ddraw.ini" sed -i 's/^fullscreen=.*/fullscreen=true/g' "$INI_PATH" sed -i 's/^windowed=.*/windowed=true/g' "$INI_PATH" sed -i 's/^maintas=.*/maintas=true/g' "$INI_PATH" wrestool -x --type=14 "$target_dir/drive_c/Program Files (x86)/Starcraft/StarCraft.exe" -o "$target_dir/starcraft.ico" local ico_path="$target_dir/starcraft.ico" if [ -f "$ico_path" ]; then magick "${ico_path}[0]" "${srcdir}/starcraft-16x16.png" magick "${ico_path}[1]" "${srcdir}/starcraft-32x32.png" magick "$ico_path" \ \( -clone 1 -resize 24x24 +write "${srcdir}/starcraft-24x24.png" \) \ -exit fi } package() { local install_dir="${_install_path}" local user_home="/home/ris" local icondir="${user_home}/.local/share/icons/hicolor" local appdir="${user_home}/.local/share/applications" mkdir -p "${pkgdir}${install_dir}" mkdir -p "${pkgdir}${appdir}" mkdir -p "${pkgdir}${icondir}/256x256/apps" mkdir -p "${pkgdir}${icondir}/32x32/apps" chmod 755 "$pkgdir/home" chmod 700 "$pkgdir/home/ris" chown -R ris:ris "${srcdir}/$_install_path" cp -r "${srcdir}${install_dir}/"* "${pkgdir}/${install_dir}/" cp -r "${srcdir}/extracted/"* "${pkgdir}/${install_dir}/drive_c/Program Files (x86)/Starcraft/Maps/" install -Dm755 "${srcdir}/run.sh" "${pkgdir}${install_dir}/run.sh" install -Dm755 "${srcdir}/run-gamescope.sh" "${pkgdir}${install_dir}/run-gamescope.sh" install -Dm644 "${srcdir}/starcraft.desktop" "${pkgdir}${install_dir}/starcraft.desktop" install -Dm644 "${srcdir}/starcraft-menu.desktop" "${pkgdir}${appdir}/starcraft.desktop" install -Dm644 "${srcdir}/starcraft-32x32.png" "${pkgdir}${icondir}/32x32/apps/starcraft.png" install -Dm644 "${srcdir}/starcraft-24x24.png" "${pkgdir}${icondir}/24x24/apps/starcraft.png" install -Dm644 "${srcdir}/starcraft-16x16.png" "${pkgdir}${icondir}/16x16/apps/starcraft.png" install -Dm644 "$startdir/PKGBUILD" -t "$pkgdir/usr/share/doc/$pkgname/" install -Dm644 "$startdir/${pkgname}.install" -t "$pkgdir/usr/share/doc/$pkgname/" chown -R ris:ris "${pkgdir}/home/ris" }