From aa1e52602e83b0613129ab4beccb700e4a50cac7 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Thu, 16 Jan 2025 02:54:28 +0500 Subject: [PATCH] support steamPlay --- data_from_portwine/scripts/add_in_steam.sh | 67 ++++++++++++++++------ 1 file changed, 49 insertions(+), 18 deletions(-) diff --git a/data_from_portwine/scripts/add_in_steam.sh b/data_from_portwine/scripts/add_in_steam.sh index 92254b3..a0d316d 100755 --- a/data_from_portwine/scripts/add_in_steam.sh +++ b/data_from_portwine/scripts/add_in_steam.sh @@ -293,7 +293,9 @@ parseSteamShortcutEntryLaunchOptions() { } parseSteamTargetExe() { - grep -E 'flatpak|start\.sh' "$1" | head -n 1 | awk -F'"' '{print $(NF-1)}' + exe=$(sed -n 's/^export portwine_exe="\([^"]*\)"/\1/p' "$1") + [[ -z "${exe}" ]] && exe=$(grep -E 'flatpak|start\.sh' "$1" | head -n 1 | awk -F'"' '{print $(NF-1)}') + [[ -n "${exe}" ]] && echo "${exe}" } restartSteam() { @@ -356,10 +358,10 @@ addGrids() { fi if [[ -n "${SteamGridDBId}" ]] || [[ -n "${SteamAppId}" ]]; then create_new_dir "${STCFGPATH}/grid" - downloadImageSteamGridDB "grids" "${NOSTAIDGRID:-0}.jpg" "mimes=image/jpeg" "dimensions=460x215,920x430" || downloadImageSteam "header.jpg" "${NOSTAIDGRID:-0}.jpg" || echo "Failed to load header.jpg" - downloadImageSteamGridDB "grids" "${NOSTAIDGRID:-0}p.jpg" "mimes=image/jpeg" "dimensions=600x900,660x930" || downloadImageSteam "library_600x900_2x.jpg" "${NOSTAIDGRID:-0}p.jpg" || echo "Failed to load library_600x900_2x.jpg" - downloadImageSteamGridDB "heroes" "${NOSTAIDGRID:-0}_hero.jpg" "mimes=image/jpeg" || downloadImageSteam "library_hero.jpg" "${NOSTAIDGRID:-0}_hero.jpg" || echo "Failed to load library_hero.jpg" - downloadImageSteamGridDB "logos" "${NOSTAIDGRID:-0}_logo.png" "mimes=image/png" || downloadImageSteam "logo.png" "${NOSTAIDGRID:-0}_logo.png" || echo "Failed to load logo.png" + downloadImageSteamGridDB "grids" "${NOSTAPPID:-0}.jpg" "mimes=image/jpeg" "dimensions=460x215,920x430" || downloadImageSteam "header.jpg" "${NOSTAPPID:-0}.jpg" || echo "Failed to load header.jpg" + downloadImageSteamGridDB "grids" "${NOSTAPPID:-0}p.jpg" "mimes=image/jpeg" "dimensions=600x900,660x930" || downloadImageSteam "library_600x900_2x.jpg" "${NOSTAPPID:-0}p.jpg" || echo "Failed to load library_600x900_2x.jpg" + downloadImageSteamGridDB "heroes" "${NOSTAPPID:-0}_hero.jpg" "mimes=image/jpeg" || downloadImageSteam "library_hero.jpg" "${NOSTAPPID:-0}_hero.jpg" || echo "Failed to load library_hero.jpg" + downloadImageSteamGridDB "logos" "${NOSTAPPID:-0}_logo.png" "mimes=image/png" || downloadImageSteam "logo.png" "${NOSTAPPID:-0}_logo.png" || echo "Failed to load logo.png" else echo "Game is not found" fi @@ -423,16 +425,18 @@ removeNonSteamGame() { if [[ -n "${NOSTSHPATH}" ]]; then mv "${SCPATH}" "${SCPATH//.vdf}_${PROGNAME}_backup.vdf" 2>/dev/null jq --arg id "${appid}" 'map(select(.id != $id))' <<< "${games}" | jq -c '.[]' | while read -r game; do - NOSTAIDGRID=$(jq -r '.id' <<< "${game}") + NOSTAPPID=$(jq -r '.id' <<< "${game}") NOSTAPPNAME=$(jq -r '.name' <<< "${game}") NOSTEXEPATH=$(jq -r '.exe' <<< "${game}") NOSTSTDIR=$(jq -r '.dir' <<< "${game}") NOSTICONPATH=$(jq -r '.icon' <<< "${game}") NOSTARGS=$(jq -r '.args' <<< "${game}") - NOSTAIDVDFHEX=$(bigToLittleEndian $(printf '%08x' "${NOSTAIDGRID}")) + NOSTAIDVDFHEX=$(bigToLittleEndian $(printf '%08x' "${NOSTAPPID}")) addEntry done rm -f "${STCFGPATH}/grid/${appid}.jpg" "${STCFGPATH}/grid/${appid}p.jpg" "${STCFGPATH}/grid/${appid}_hero.jpg" "${STCFGPATH}/grid/${appid}_logo.png" + rm -rf "${HOME}/.local/share/Steam/steamapps/compatdata/${appid}" + rm -rf "${HOME}/.local/share/Steam/steamapps/shadercache/${appid}" if [[ -f "${NOSTSHPATH}" ]]; then isInstallGame=false for STUIDCUR in $(getUserIds); do @@ -464,8 +468,8 @@ addNonSteamGame() { if [[ -n "${SCPATH}" ]]; then [[ -z "${NOSTSHPATH}" ]] && NOSTSHPATH="${STEAM_SCRIPTS}/${name_desktop}.sh" NOSTAPPNAME="${name_desktop}" - NOSTAIDGRID=$(getAppId "${NOSTSHPATH}") - if [[ -z "${NOSTAIDGRID}" ]]; then + NOSTAPPID=$(getAppId "${NOSTSHPATH}") + if [[ -z "${NOSTAPPID}" ]]; then NOSTEXEPATH="${NOSTSHPATH}" if [[ -z "${NOSTSTDIR}" ]]; then NOSTSTDIR="${STEAM_SCRIPTS}" @@ -473,17 +477,18 @@ addNonSteamGame() { NOSTICONPATH="${PORT_WINE_PATH}/data/img/${name_desktop_png}.png" NOSTAIDVDF="$(generateShortcutVDFAppId "${NOSTAPPNAME}${NOSTEXEPATH}")" # signed integer AppID, stored in the VDF as hexidecimal - ex: -598031679 NOSTAIDVDFHEX="$(generateShortcutVDFHexAppId "$NOSTAIDVDF")" # 4byte little-endian hexidecimal of above 32bit signed integer, which we write out to the binary VDF - ex: c1c25adc - NOSTAIDGRID="$(extractSteamId32 "$NOSTAIDVDF")" # unsigned 32bit ingeger version of "$NOSTAIDVDF", which is used as the AppID for Steam artwork ("grids"), as well as for our shortcuts + NOSTAPPID="$(extractSteamId32 "$NOSTAIDVDF")" # unsigned 32bit ingeger version of "$NOSTAIDVDF", which is used as the AppID for Steam artwork ("grids"), as well as for our shortcuts create_new_dir "${STEAM_SCRIPTS}" - echo "#!/usr/bin/env bash" > "${NOSTSHPATH}" - echo "export START_FROM_STEAM=1" >> "${NOSTSHPATH}" - echo "export LD_PRELOAD=" >> "${NOSTSHPATH}" - if check_flatpak; then - echo "flatpak run ru.linux_gaming.PortProton \"${portwine_exe}\" " >> "${NOSTSHPATH}" - else - echo "\"${PORT_SCRIPTS_PATH}/start.sh\" \"${portwine_exe}\" " >> "${NOSTSHPATH}" - fi + cat <<-EOF > "${NOSTSHPATH}" + #!/usr/bin/env bash + export FLATPAK_IN_USE=$(check_flatpak && echo 1 || echo 0) + export portwine_exe="${portwine_exe}" + export PORT_WINE_PATH="${PORT_WINE_PATH}" + export PORT_SCRIPTS_PATH="\${PORT_WINE_PATH}/data/scripts" + source "\${PORT_SCRIPTS_PATH}/add_in_steam.sh" + rungame "\$@" + EOF chmod u+x "${NOSTSHPATH}" if [[ -f "${SCPATH}" ]] ; then @@ -504,3 +509,29 @@ addNonSteamGame() { return 1 fi } + +rungame() { + export START_FROM_STEAM=1 + if [[ -n "${STEAM_COMPAT_DATA_PATH:-}" ]]; then + cd "$(dirname "${portwine_exe}")" + PORTWINE_DB_FILE="${portwine_exe}.ppdb" + if [[ -f "${PORTWINE_DB_FILE}" ]]; then + source "${PORTWINE_DB_FILE}" + fi + for path in "ProgramData" "users/Public" "users/steamuser"; do + if [[ ! -L "${WINEPREFIX}/drive_c/${path}" ]]; then + mkdir -p "${WINEPREFIX}/drive_c/users/" + rm -rf "${WINEPREFIX}/drive_c/${path}" + ln -sr "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME:-DEFAULT}/drive_c/${path}" "${WINEPREFIX}/drive_c/${path}" + fi + done + "${STEAM_COMPAT_TOOL_PATHS%%:*}/proton" "run" "${portwine_exe}" + else + export LD_PRELOAD= + if [[ "${FLATPAK_IN_USE:-0}" == 1 ]]; then + flatpak run ru.linux_gaming.PortProton "${portwine_exe}" + else + "${PORT_SCRIPTS_PATH}/start.sh" "${portwine_exe}" + fi + fi +}