From bca5c38922d3a876662bc14bc22f004e459dba58 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Sun, 3 Nov 2024 00:12:22 +0500 Subject: [PATCH 01/48] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=BF=D0=B8?= =?UTF-8?q?=D1=81=D0=B0=D0=BB=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B8=20=D0=B8=D0=B7?= =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data_from_portwine/scripts/get_images.sh | 61 ++++++++++++++++++++++++ data_from_portwine/scripts/var | 1 + 2 files changed, 62 insertions(+) create mode 100755 data_from_portwine/scripts/get_images.sh diff --git a/data_from_portwine/scripts/get_images.sh b/data_from_portwine/scripts/get_images.sh new file mode 100755 index 00000000..4a4be5d7 --- /dev/null +++ b/data_from_portwine/scripts/get_images.sh @@ -0,0 +1,61 @@ +#!/bin/bash +# AppName= AppId= SteamAppId= SteamGridDBId= SGGRIDDIR= ./get_images.sh + +if [[ -z "${SGDBAPIKEY}" || -z "${BASESTEAMGRIDDBAPI}" ]]; then + source "${PORT_SCRIPTS_PATH:-$(dirname "$(readlink --canonicalize-existing "$0")")}/var" +fi + +function downloadImage { + local path="${SGGRIDDIR:-${PWD}}" + local url="$1" + local files="$2" + local cur=''; + if [[ -n "${url}" && -n "${files}" ]]; then + for file in ${files[@]}; do + if [[ -z "$cur" ]]; then + curl -Lf# -o "${path}/${file}" "${url}" + else + cp "${path}/${cur}" "${path}/${file}" + fi + cur="${file}" + done + fi +} + +function downloadImageSteam { + downloadImage "https://cdn.cloudflare.steamstatic.com/steam/apps/$1" "$2" +} + +function downloadImageSteamgriddb { + SGDBIMGRES=$(curl -Ls -H "Authorization: Bearer ${SGDBAPIKEY}" "${BASESTEAMGRIDDBAPI}/$1&limit=1") + if jq -e ".success == true and (.data | length > 0)" <<< "${SGDBIMGRES}" > /dev/null 2>&1; then + SGDBIMGURL=$(jq -r '.data[0].url' <<< "${SGDBIMGRES}") + downloadImage "${SGDBIMGURL}" "$2" + fi +} + +if [[ -z "${SteamAppId}" && -z "${SteamGridDBId}" && -n "${AppName}" && -n "${SGDBAPIKEY}" ]]; then + SGDBRES=$(curl -Ls -H "Authorization: Bearer ${SGDBAPIKEY}" "${BASESTEAMGRIDDBAPI}/search/autocomplete/${AppName// /_}") + if jq -e ".success == true and (.data | length > 0)" <<< "${SGDBRES}" > /dev/null 2>&1; then + export SteamGridDBId="$(jq '.data[0].id' <<< "${SGDBRES}")" + if jq -e '.data[0].types | contains(["steam"])' <<< "${SGDBRES}" > /dev/null; then + SRES=$(curl -Ls -e "https://www.steamgriddb.com/game/${SteamGridDBId}" "https://www.steamgriddb.com/api/public/game/${SteamGridDBId}") + if jq -e ".success == true" <<< "${SRES}" > /dev/null 2>&1; then + export SteamAppId="$(jq -r '.data.platforms.steam.id' <<< "${SRES}")" + fi + fi + fi +fi + +if [[ -n "${SteamAppId}" ]]; then + downloadImageSteam "${SteamAppId}/header.jpg" "${AppId:-0}.jpg" + downloadImageSteam "${SteamAppId}/library_600x900_2x.jpg" "${AppId:-0}p.jpg" + downloadImageSteam "${SteamAppId}/library_hero.jpg" "${AppId:-0}_hero.jpg" + downloadImageSteam "${SteamAppId}/logo.png" "${AppId:-0}_logo.png" +elif [[ -n "${SteamGridDBId}" && -n "${SGDBAPIKEY}" ]]; then + downloadImageSteamgriddb "grids/game/${SteamGridDBId}?mimes=image/jpeg" "${AppId:-0}.jpg ${AppId:-0}p.jpg" + downloadImageSteamgriddb "heroes/game/${SteamGridDBId}?mimes=image/jpeg" "${AppId:-0}_hero.jpg" + downloadImageSteamgriddb "logos/game/${SteamGridDBId}?mimes=image/png" "${AppId:-0}_logo.png" +else + echo "Game is not found" +fi diff --git a/data_from_portwine/scripts/var b/data_from_portwine/scripts/var index 74e9fba4..b600c10c 100755 --- a/data_from_portwine/scripts/var +++ b/data_from_portwine/scripts/var @@ -137,6 +137,7 @@ export DEFPFX_VER="v1" export PW_MUST_WINEDLLOVERRIDES="steam_api,steam_api64,steamclient,steamclient64=n;dotnetfx35.exe,dotnetfx35setup.exe=b;winemenubuilder.exe=" ################################################################# # Get our APi on https://www.steamgriddb.com/profile/preferences/api/ +export BASESTEAMGRIDDBAPI="https://www.steamgriddb.com/api/v2" export SGDBAPIKEY="4a022f8848eaaa8e9c30067cd6676129" ################################################################# export DXVK_CONFIG_FILE="${PORT_WINE_PATH}/data/dxvk.conf" From 150953c7e6e45771b40c2c421c3407d3b264c815 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Sun, 3 Nov 2024 00:12:29 +0500 Subject: [PATCH 02/48] =?UTF-8?q?=D0=B2=D1=8B=D0=BD=D0=B5=D1=81=20=D0=B2?= =?UTF-8?q?=D1=81=D0=B5=20=D1=87=D1=82=D0=BE=20=D1=81=D0=B2=D1=8F=D0=B7?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D0=BE=D0=B5=20=D1=81=20=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B1=D1=80=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F=D0=BC=D0=B8=20?= =?UTF-8?q?=D0=B2=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9?= =?UTF-8?q?=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data_from_portwine/scripts/add_in_steam.sh | 301 ++------------------- 1 file changed, 25 insertions(+), 276 deletions(-) diff --git a/data_from_portwine/scripts/add_in_steam.sh b/data_from_portwine/scripts/add_in_steam.sh index 9a8429af..4d2f00b4 100755 --- a/data_from_portwine/scripts/add_in_steam.sh +++ b/data_from_portwine/scripts/add_in_steam.sh @@ -3,13 +3,12 @@ # based on https://github.com/sonic2kk/steamtinkerlaunch/blob/master/steamtinkerlaunch PROGNAME="PortProton" NOSTAPPNAME="$name_desktop" -NOSTEXEPATH="\"${STEAM_SCRIPTS}/${name_desktop}.sh\"" -# NOSTSTDIR="\"${PATH_TO_GAME}\"" +NOSTSHPATH="${STEAM_SCRIPTS}/${name_desktop}.sh" +NOSTEXEPATH="\"${NOSTSHPATH}\"" +NOSTICONPATH="${PORT_WINE_PATH}/data/img/$name_desktop_png.png" if [[ -z "${NOSTSTDIR}" ]] ; then NOSTSTDIR="\"${STEAM_SCRIPTS}\"" fi -NOSTICONPATH="${PORT_WINE_PATH}/data/img/$name_desktop_png.png" -BASESTEAMGRIDDBAPI="https://www.steamgriddb.com/api/v2" ## How Non-Steam AppIDs work, because it took me almost a year to figure this out ## ---------------------- @@ -55,151 +54,10 @@ function generateShortcutGridAppId { ## ---------- ### END MAGIC APPID FUNCTIONS -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 +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 NOSTAIDVDFHEXFMT="\x$(awk '{$1=$1}1' FPAT='.{2}' OFS="\\\x" <<< "$NOSTAIDVDFHEX")" # binary-formatted string hex of the above which we actually write out - ex: \xc1\xc2\x5a\xdc -NOSTAIDGRID="$( generateShortcutGridAppId "$NOSTAIDVDF" )" # unsigned 32bit ingeger version of "$NOSTAIDVDF", which is used as the AppID for Steam artwork ("grids"), as well as for our shortcuts - -# Set artwork for Steam game by copying/linking/moving passed artwork to steam grid folder -function setGameArt { - function applyGameArt { - GAMEARTAPPID="$1" - GAMEARTSOURCE="$2" # e.g. /home/gaben/GamesArt/cs2_hero.png - GAMEARTSUFFIX="$3" # e.g. "_hero" etc - GAMEARTCMD="$4" - - GAMEARTBASE="$( basename "$GAMEARTSOURCE" )" - GAMEARTDEST="${SGGRIDDIR}/${GAMEARTAPPID}${GAMEARTSUFFIX}.${GAMEARTBASE#*.}" # path to filename in grid e.g. turns "/home/gaben/GamesArt/cs2_hero.png" into "~/.local/share/Steam/userdata/1234567/config/grid/4440654_hero.png" - - if [[ -n "$GAMEARTSOURCE" ]] ; then - if [[ -f "$GAMEARTDEST" ]] ; then - rm "$GAMEARTDEST" - fi - - if [[ -f "$GAMEARTSOURCE" ]] ; then - $GAMEARTCMD "$GAMEARTSOURCE" "$GAMEARTDEST" - fi - fi - } - - GAME_APPID="$1" # We don't validate AppID as it would drastically slow down the process for large libraries - - SETARTCMD="cp" # Default command will copy art - for i in "$@"; do - case $i in - -hr=*|--hero=*) - SGHERO="${i#*=}" # _hero.png -- Banner used on game screen, logo goes on top of this - shift ;; - -lg=*|--logo=*) - SGLOGO="${i#*=}" # _logo.png -- Logo used e.g. on game screen - shift ;; - -ba=*|--boxart=*) - SGBOXART="${i#*=}" # p.png -- Used in library - shift ;; - -tf=*|--tenfoot=*) - SGTENFOOT="${i#*=}" # .png -- Used as small boxart for e.g. most recently played banner - shift ;; - --copy) - SETARTCMD="cp" # Copy file to grid folder -- Default - shift ;; - --link) - SETARTCMD="ln -s" # Symlink file to grid folder - shift ;; - --move) - SETARTCMD="mv" # Move file to grid folder - shift ;; - esac - done - - applyGameArt "$GAME_APPID" "$SGHERO" "_hero" "$SETARTCMD" - applyGameArt "$GAME_APPID" "$SGLOGO" "_logo" "$SETARTCMD" - applyGameArt "$GAME_APPID" "$SGBOXART" "p" "$SETARTCMD" - applyGameArt "$GAME_APPID" "$SGTENFOOT" "" "$SETARTCMD" -} - -# This is formatted as a flag because we can pass "$SGACOPYMETHOD" as an argument to setGameArt, and it will be interpreted as --copy -SGACOPYMETHOD="${SGACOPYMETHOD:---copy}" - -## Generic function to fetch some artwork from SteamGridDB based on an endpoint -## TODO: Steam only officially supports PNGs, test to see if WebP works when manually copied, and if it doesn't, we should try to only download PNG files -## TODO: Add max filesize option? Some artworks are really big, we should skip ones that are too large (though this may mean many animated APNG artworks will get skipped, because APNG can be huge) -function downloadArtFromSteamGridDB { - # Required parameters - SEARCHID="$1" - SEARCHENDPOINT="$2" - SGDBFILENAME="${3:-SEARCHID}" - - # Optional parameters - SEARCHSTYLES="$4" - SEARCHDIMS="$5" - SEARCHTYPES="$6" - SEARCHNSFW="$7" - SEARCHHUMOR="$8" - SEARCHEPILEPSY="$9" - - SGDBHASFILE="${10:-SGDBHASFILE}" - FORCESGDBDLTOSTEAM="${11}" - - SGDB_ENDPOINT_STR="${SEARCHENDPOINT}/$(echo "$SEARCHID" | awk '{print $1}' | paste -s -d, -)?" - - [[ -n "$SEARCHSTYLES" ]] && SGDB_ENDPOINT_STR+="&styles=${SEARCHSTYLES}" - [[ -n "$SEARCHDIMS" ]] && SGDB_ENDPOINT_STR+="&dimensions=${SEARCHDIMS}" - [[ -n "$SEARCHTYPES" ]] && SGDB_ENDPOINT_STR+="&types=${SEARCHTYPES}" - [[ -n "$SEARCHNSFW" ]] && SGDB_ENDPOINT_STR+="&nsfw=${SEARCHNSFW}" - [[ -n "$SEARCHHUMOR" ]] && SGDB_ENDPOINT_STR+="&humor=${SEARCHHUMOR}" - [[ -n "$SEARCHEPILEPSY" ]] && SGDB_ENDPOINT_STR+="&epilepsy=${SEARCHEPILEPSY}" - - RESPONSE=$(curl -H "Authorization: Bearer $SGDBAPIKEY" -s "$SGDB_ENDPOINT_STR" 2> >(grep -v "SSL_INIT")) - if ! jq -e '.success' <<< "$RESPONSE" > /dev/null; then - echo "The server response wasn't 'success' for this batch of requested games." - return - fi - - RESPONSE_LENGTH=$(jq '.data | length' <<< "$RESPONSE") - - if [[ "$RESPONSE_LENGTH" == "0" ]] ; then - echo "No grid found to download - maybe loosen filters?" - fi - - if jq -e ".data[0].url" <<< "$RESPONSE" > /dev/null; then - RESPONSE="{\"success\":true,\"data\":[$RESPONSE]}" - RESPONSE_LENGTH=1 - fi - - for i in $(seq 0 $(("$RESPONSE_LENGTH" - 1))); do - if ! jq -e ".data[$i].success" <<< "$RESPONSE" > /dev/null; then - echo "The server response for '$SEARCHID' wasn't 'success'" - fi - if ! URLSTR=$(jq -e -r ".data[$i].data[0].url" <<< "$RESPONSE"); then - echo "No grid found to download for '$SEARCHID' - maybe loosen filters?" - fi - - GRIDDLURL="${URLSTR//\"}" - if grep -q "^https" <<< "$GRIDDLURL"; then - DLSRC="${GRIDDLURL//\"}" - GRIDDLDIR="${SGGRIDDIR}" - mkdir -p "$GRIDDLDIR" - DLDST="${GRIDDLDIR}/${SGDBFILENAME}.${GRIDDLURL##*.}" - STARTDL=1 - - if [[ -f "$DLDST" ]] ; then - if [[ "$SGDBHASFILE" == "backup" ]] ; then - BACKDIR="${GRIDDLDIR}/backup" - mkdir -p "$BACKDIR" - mv "$DLDST" "$BACKDIR" - elif [[ "$SGDBHASFILE" == "replace" ]] ; then - rm "$DLDST" 2>/dev/null - fi - fi - - if [[ "$STARTDL" -eq 1 ]] ; then - curl -f -# -A 'Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)' -H 'Cache-Control: no-cache, no-store' -H 'Pragma: no-cache' -L "$DLSRC" -o "$DLDST" 2>&1 - fi - else - echo "No grid found to download for '$SEARCHID' - maybe loosen filters?" - fi - done -} +NOSTAIDGRID="$(generateShortcutGridAppId "$NOSTAIDVDF")" # unsigned 32bit ingeger version of "$NOSTAIDVDF", which is used as the AppID for Steam artwork ("grids"), as well as for our shortcuts if [[ -f "$SCPATH" ]] ; then cp "$SCPATH" "${SCPATH//.vdf}_${PROGNAME}_backup.vdf" 2>/dev/null @@ -211,132 +69,27 @@ else NEWSET=0 fi -# Search SteamGridDB endpoint using game title and return the first (best match) Game ID -function getSGDBGameIDFromTitle { - SGDBSEARCHNAME="$1" - - if [[ -n "$SGDBSEARCHNAME" ]] ; then - SGDBSEARCHENDPOINT="${BASESTEAMGRIDDBAPI}/search/autocomplete/${SGDBSEARCHNAME}" - SGDBSEARCHNAMERESP="$(curl -H "Authorization: Bearer $SGDBAPIKEY" -s "$SGDBSEARCHENDPOINT" 2> >(grep -v "SSL_INIT") )" - if jq -e '.success' 1> /dev/null <<< "$SGDBSEARCHNAMERESP"; then - if [[ "$(jq '.data | length' <<< "$SGDBSEARCHNAMERESP" )" -gt 0 ]] ; then - SGDBSEARCH_FOUNDNAME="$(jq '.data[0].name' <<< "$SGDBSEARCHNAMERESP" )" - SGDBSEARCH_FOUNDGAID="$(jq '.data[0].id' <<< "$SGDBSEARCHNAMERESP" )" - - echo "$SGDBSEARCH_FOUNDGAID" - fi - fi - else - echo "No game name given." - fi -} - -# Used to get either Steam or Non-Steam artwork depending on a flag -- Used internally and for commandline usage -function commandlineGetSteamGridDBArtwork { - GSGDBA_HASFILE="$SGDBHASFILE" # Optional override for how to handle existinf file (downloadArtFromSteamGridDB defaults to '$SGDBHASFILE') - GSGDBA_APPLYARTWORK="$SGDBDLTOSTEAM" - GSGDBA_SEARCHNAME="" - GSGDBA_FOUNDGAMEID="" # ID found from SteamGridDB endpoint using GSGDBA_SEARCHNAME - for i in "${@}"; do - case $i in - --search-name=*) - GSGDBA_SEARCHNAME="${i#*=}" # Optional SteamGridDB Game Name -- Will use this to try and find matching SteamGridDB Game Art - shift ;; - --nonsteam) - SGDBENDPOINTTYPE="game" - shift ;; - --filename-appid=*) - GSGDBA_FILENAME="${i#*=}" # AppID to use in filename (Non-Steam Games need a different AppID) - shift ;; - ## Override Global Menu setting for how to handle existing artwork - ## in case user wants to replace all existing artwork, default STL setting is 'skip' and will only copy files over to grid dir if they don't exist, so user can easily fill in missing artwork only) - --replace-existing) - GSGDBA_HASFILE="replace" - shift ;; - --backup-existing) - GSGDBA_HASFILE="backup" - shift ;; - ## Flag to force downloading to SteamGridDB folder (used for addNonSteamGame internally) - --apply) - GSGDBA_APPLYARTWORK="1" - shift ;; - esac - done - - # If we pass a name to search on and we get a Game ID back from SteamGridDB, set this as the ID to search for artwork on - if [[ -n "$GSGDBA_SEARCHNAME" ]] ; then - if [[ -n "$GSGDBA_FILENAME" ]] ; then - GSGDBA_FOUNDGAMEID="$( getSGDBGameIDFromTitle "$GSGDBA_SEARCHNAME" )" - if [[ -n "$GSGDBA_FOUNDGAMEID" ]] ; then - GSGDBA_APPID="$GSGDBA_FOUNDGAMEID" - SGDBENDPOINTTYPE="game" - fi - else - echo "You must provide a filename AppID when searching with SteamGridDB Game Name" - fi - fi - - SGDBSEARCHENDPOINT_HERO="${BASESTEAMGRIDDBAPI}/heroes/${SGDBENDPOINTTYPE}" - SGDBSEARCHENDPOINT_LOGO="${BASESTEAMGRIDDBAPI}/logos/${SGDBENDPOINTTYPE}" - SGDBSEARCHENDPOINT_BOXART="${BASESTEAMGRIDDBAPI}/grids/${SGDBENDPOINTTYPE}" # Grid endpoint is used for Boxart and Tenfoot, which SteamGridDB counts as vertical/horizontal grids respectively - SGDB_ENDPOINT_STR_TEST="${SGDBSEARCHENDPOINT_HERO}/$(echo "$GSGDBA_APPID" | awk '{print $1}' | paste -s -d, -)?" - - - set -o pipefail - TEST_RESPONSE=$(curl -H "Authorization: Bearer $SGDBAPIKEY" -s "$SGDB_ENDPOINT_STR_TEST" 2> >(grep -v "SSL_INIT")) - if [[ "${PIPESTATUS[0]}" != 0 ]] && [[ "$DOWNLOAD_STEAM_GRID" != 0 ]]; then - pw_notify_send -i info \ - "${translations[SteamGridDB is not responding, forcing cover download to be disabled]}" - sed -i 's/DOWNLOAD_STEAM_GRID=.*/DOWNLOAD_STEAM_GRID="0"/' "$USER_CONF" - export DOWNLOAD_STEAM_GRID="0" - return - fi - - # Download Hero, Logo, Boxart, Tenfoot from SteamGridDB from given endpoint using given AppID - # On SteamGridDB tenfoot called horizontal Steam grid, so fetch it by passing specific dimensions matching this -- Users can override this, but default is what SteamGridDB expects for the tenfoot sizes - if [[ ! -z "$GSGDBA_FOUNDGAMEID" ]] ; then - pw_start_progress_bar_block "${translations[Please wait. downloading covers for]} $NOSTAPPNAME" - - downloadArtFromSteamGridDB "$GSGDBA_APPID" "$SGDBSEARCHENDPOINT_HERO" "${GSGDBA_FILENAME}_hero" "$SGDBHEROSTYLES" "$SGDBHERODIMS" "$SGDBHEROTYPES" "$SGDBHERONSFW" "$SGDBHEROHUMOR" "$SGDBHEROEPILEPSY" "$GSGDBA_HASFILE" "$GSGDBA_APPLYARTWORK" - # Logo doesn't have dimensions, so it's left intentionally blank - downloadArtFromSteamGridDB "$GSGDBA_APPID" "$SGDBSEARCHENDPOINT_LOGO" "${GSGDBA_FILENAME}_logo" "$SGDBLOGOSTYLES" "" "$SGDBLOGOTYPES" "$SGDBLOGONSFW" "$SGDBLOGOHUMOR" "$SGDBLOGOEPILEPSY" "$GSGDBA_HASFILE" "$GSGDBA_APPLYARTWORK" - downloadArtFromSteamGridDB "$GSGDBA_APPID" "$SGDBSEARCHENDPOINT_BOXART" "${GSGDBA_FILENAME}p" "$SGDBBOXARTSTYLES" "$SGDBBOXARTDIMS" "$SGDBBOXARTTYPES" "$SGDBBOXARTNSFW" "$SGDBBOXARTHUMOR" "$SGDBBOXARTEPILEPSY" "$GSGDBA_HASFILE" "$GSGDBA_APPLYARTWORK" - downloadArtFromSteamGridDB "$GSGDBA_APPID" "$SGDBSEARCHENDPOINT_BOXART" "${GSGDBA_FILENAME}" "$SGDBTENFOOTSTYLES" "$SGDBTENFOOTDIMS" "$SGDBTENFOOTTYPES" "$SGDBTENFOOTNSFW" "$SGDBTENFOOTHUMOR" "$SGDBTENFOOTEPILEPSY" "$GSGDBA_HASFILE" "$GSGDBA_APPLYARTWORK" - - pw_stop_progress_bar - fi -} - -## Fetch artwork from SteamGridDB -# Regular artwork -# The entered search name is prioritised over actual game EXE name, only one will be used and we will always prefer custom name -# Ex: user names Non-Steam Game "The Elder Scrolls IV: Oblivion" but they enter a custom search name because they want artwork for "The Elder Scrolls IV: Oblivion Game of the Year Edition" -# In case art is not found for the custom name, users should enter either the Steam AppID or the SteamGridDB Game ID to use as a fallback (Steam AppID will always be preferred because it will always be exact) -# -# Therefore, the order of priority for artwork searching is: -# 1. Name search (only ONE of the below will be used) -# a. If the user enters a custom search name with --steamgriddb-game-name, search on that -# b. Otherwise, use the Non-Steam Game name -# 2. Fallback to ID search if no SteamGridDB ID is found on the name search -# a. If the user enters a Steam AppID with --steamgriddb-steam-appid, search on that -# b. Otherwise, fall back to searching on an entered SteamGridDB Game ID -# In short, search on ONE of the names, and if a Game ID is not found on either of these, fall back to searching on ONE of the passed IDs -# If no IDs are found after all of this, we can't get artwork. We will not fall back to EXE name if no ID is found on custom name, and we will not fall back to SteamGridDB Game ID if no art is found for Steam AppID -# If no values are provided we will simply search on Non-Steam Game name -NOSTSEARCHNAME="" # Name to search for SteamGridDB Game ID on (either custom name or app name) -NOSTSEARCHID="" # ID to search for the SteamGridDB artwork on (either Steam AppID or SteamGridDB Game ID) -NOSTSEARCHFLAG="--nonsteam" # Whether to search using a Steam AppID or SteamGridDB Game ID (will be set to --steam if we get an AppID) - -# Only add NOSTAPPNAME as fallback if we don't have an ID to search on, because commandlineGetSteamGridDBArtwork will prefer name over ID, so if we have to fall back to Non-Steam Name (i.e. no entered custom name) then only do so if we don't have an ID given -if [[ -n "$NOSTAPPNAME" ]] ; then - NOSTSEARCHNAME="$NOSTAPPNAME" - NOSTSEARCHNAME="${NOSTSEARCHNAME// /_}" -fi - -# Store the ID we searched with, so getSteamGridDBNonSteamIcon doesn't have to hit the endpoint again and we save an API call +export AppName="${NOSTAPPNAME}" +export AppId="${NOSTAIDGRID}" if [[ "$DOWNLOAD_STEAM_GRID" == "1" ]] ; then - commandlineGetSteamGridDBArtwork --search-name="$NOSTSEARCHNAME" --filename-appid="$NOSTAIDGRID" "$NOSTSEARCHFLAG" --apply --replace-existing + pw_start_progress_bar_block "${translations[Please wait. downloading covers for]} ${AppName}" + source "${PORT_SCRIPTS_PATH}/get_images.sh" + pw_stop_progress_bar fi + +echo "#!/usr/bin/env bash" > "${NOSTSHPATH}" +echo "# AppName=\""${AppName}\""" >> "${NOSTSHPATH}" +echo "# AppId=${AppId}" >> "${NOSTSHPATH}" +echo "# SteamAppId=${SteamAppId:-0}" >> "${NOSTSHPATH}" +echo "# SteamGridDBId=${SteamGridDBId:-0}" >> "${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 +chmod u+x "${NOSTSHPATH}" + { printf '\x00%s\x00' "$NEWSET" printf '\x02%s\x00%b' "appid" "$NOSTAIDVDFHEXFMT" @@ -366,7 +119,3 @@ fi printf '\x00%s\x00' "tags" printf '\x08\x08\x08\x08' } >> "$SCPATH" - -if [[ "$DOWNLOAD_STEAM_GRID" == "1" ]] ; then - setGameArt "$NOSTAIDGRID" --hero="$NOSTGHERO" --logo="$NOSTGLOGO" --boxart="$NOSTGBOXART" --tenfoot="$NOSTGTENFOOT" "$SGACOPYMETHOD" -fi From b2d45735c9d1c4df23d6923d02b4e2982381b8f7 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Sun, 3 Nov 2024 00:14:25 +0500 Subject: [PATCH 03/48] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D1=81=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D1=8E?= =?UTF-8?q?=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=D0=B0=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20steam=20=D1=8F=D1=80=D0=BB=D1=8B=D0=BA=D0=B0=20=D0=B2?= =?UTF-8?q?=20add=5Fin=5Fsteam.sh?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data_from_portwine/scripts/functions_helper | 8 -------- 1 file changed, 8 deletions(-) diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index 21876fff..a569a6a9 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -5828,14 +5828,6 @@ portwine_output_yad_shortcut () { if [[ -f "${SCPATH}" ]]; then export STEAM_SCRIPTS="${PORT_WINE_PATH}/steam_scripts" create_new_dir "${STEAM_SCRIPTS}" - echo "#!/usr/bin/env bash" > "${STEAM_SCRIPTS}/${name_desktop}.sh" - echo "export START_FROM_STEAM=1" >> "${STEAM_SCRIPTS}/${name_desktop}.sh" - echo "export LD_PRELOAD=" >> "${STEAM_SCRIPTS}/${name_desktop}.sh" - if check_flatpak - then echo "flatpak run ru.linux_gaming.PortProton \"${portwine_exe}\" " >> "${STEAM_SCRIPTS}/${name_desktop}.sh" - else echo "\"${PORT_SCRIPTS_PATH}/start.sh\" \"${portwine_exe}\" " >> "${STEAM_SCRIPTS}/${name_desktop}.sh" - fi - chmod u+x "${STEAM_SCRIPTS}/${name_desktop}.sh" create_new_dir "${STUIDPATH}/config/" create_new_dir "${STUIDPATH}/config/grid" export SGGRIDDIR="${STUIDPATH}/config/grid" From f51692c8855c0487201b7f0145a602c9a490b9a5 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Sun, 3 Nov 2024 00:45:38 +0500 Subject: [PATCH 04/48] =?UTF-8?q?=D1=83=D0=B1=D1=80=D0=B0=D0=BB=20=D0=BB?= =?UTF-8?q?=D0=B8=D1=88=D0=BD=D0=B5=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data_from_portwine/scripts/add_in_steam.sh | 3 --- 1 file changed, 3 deletions(-) diff --git a/data_from_portwine/scripts/add_in_steam.sh b/data_from_portwine/scripts/add_in_steam.sh index 4d2f00b4..c81c7049 100755 --- a/data_from_portwine/scripts/add_in_steam.sh +++ b/data_from_portwine/scripts/add_in_steam.sh @@ -78,10 +78,7 @@ if [[ "$DOWNLOAD_STEAM_GRID" == "1" ]] ; then fi echo "#!/usr/bin/env bash" > "${NOSTSHPATH}" -echo "# AppName=\""${AppName}\""" >> "${NOSTSHPATH}" echo "# AppId=${AppId}" >> "${NOSTSHPATH}" -echo "# SteamAppId=${SteamAppId:-0}" >> "${NOSTSHPATH}" -echo "# SteamGridDBId=${SteamGridDBId:-0}" >> "${NOSTSHPATH}" echo "export START_FROM_STEAM=1" >> "${NOSTSHPATH}" echo "export LD_PRELOAD=" >> "${NOSTSHPATH}" if check_flatpak From a186896c98fdf183621e8176fd8d4069f25638c7 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Sun, 10 Nov 2024 01:18:22 +0500 Subject: [PATCH 05/48] =?UTF-8?q?=D1=80=D0=B0=D0=B7=D1=80=D0=B5=D1=88?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B4=D0=BB=D1=8F=20=D0=BE=D0=B1?= =?UTF-8?q?=D0=BB=D0=BE=D0=B6=D0=B5=D0=BA=20SteamGridDB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data_from_portwine/scripts/get_images.sh | 75 +++++++++++++++--------- 1 file changed, 48 insertions(+), 27 deletions(-) diff --git a/data_from_portwine/scripts/get_images.sh b/data_from_portwine/scripts/get_images.sh index 4a4be5d7..818551e5 100755 --- a/data_from_portwine/scripts/get_images.sh +++ b/data_from_portwine/scripts/get_images.sh @@ -2,18 +2,20 @@ # AppName= AppId= SteamAppId= SteamGridDBId= SGGRIDDIR= ./get_images.sh if [[ -z "${SGDBAPIKEY}" || -z "${BASESTEAMGRIDDBAPI}" ]]; then - source "${PORT_SCRIPTS_PATH:-$(dirname "$(readlink --canonicalize-existing "$0")")}/var" + source "${PORT_SCRIPTS_PATH:-$(dirname "${BASH_SOURCE[0]}")}/var" fi -function downloadImage { +downloadImage() { local path="${SGGRIDDIR:-${PWD}}" local url="$1" - local files="$2" + local files=("$2") local cur=''; if [[ -n "${url}" && -n "${files}" ]]; then for file in ${files[@]}; do if [[ -z "$cur" ]]; then - curl -Lf# -o "${path}/${file}" "${url}" + if ! curl -Lf# -o "${path}/${file}" "${url}"; then + return 1 + fi else cp "${path}/${cur}" "${path}/${file}" fi @@ -22,40 +24,59 @@ function downloadImage { fi } -function downloadImageSteam { - downloadImage "https://cdn.cloudflare.steamstatic.com/steam/apps/$1" "$2" -} - -function downloadImageSteamgriddb { - SGDBIMGRES=$(curl -Ls -H "Authorization: Bearer ${SGDBAPIKEY}" "${BASESTEAMGRIDDBAPI}/$1&limit=1") - if jq -e ".success == true and (.data | length > 0)" <<< "${SGDBIMGRES}" > /dev/null 2>&1; then - SGDBIMGURL=$(jq -r '.data[0].url' <<< "${SGDBIMGRES}") - downloadImage "${SGDBIMGURL}" "$2" +downloadImageSteam() { + if [[ -n "${SteamAppId}" ]]; then + downloadImage "https://cdn.cloudflare.steamstatic.com/steam/apps/$1" "$2" + else + return 1 fi } -if [[ -z "${SteamAppId}" && -z "${SteamGridDBId}" && -n "${AppName}" && -n "${SGDBAPIKEY}" ]]; then +downloadImageSteamGridDB() { + if [[ -n "${SteamGridDBId}" && -n "${SGDBAPIKEY}" ]]; then + SGDBIMGAPI="${BASESTEAMGRIDDBAPI}/$1?limit=1" + [[ -n "$3" ]] && SGDBIMGAPI+="&$3" + [[ -n "$4" ]] && SGDBIMGAPI+="&$4" + SGDBIMGRES=$(curl -Ls -H "Authorization: Bearer ${SGDBAPIKEY}" "${SGDBIMGAPI}") + if jq -e ".success == true and (.data | length > 0)" <<< "${SGDBIMGRES}" > /dev/null 2>&1; then + SGDBIMGURL=$(jq -r '.data[0].url' <<< "${SGDBIMGRES}") + downloadImage "${SGDBIMGURL}" "$2" + elif [[ -n "$3" ]]; then + downloadImageSteamGridDB "$1" "$2" "" "$4" + else + return 1 + fi + else + return 1 + fi +} + +getSteamId() { + SRES=$(curl -Ls -e "https://www.steamgriddb.com/game/${SteamGridDBId}" "https://www.steamgriddb.com/api/public/game/${SteamGridDBId}") + if jq -e ".success == true" <<< "${SRES}" > /dev/null 2>&1; then + export SteamAppId="$(jq -r '.data.platforms.steam.id' <<< "${SRES}")" + fi +} + +getSteamGridDBId() { SGDBRES=$(curl -Ls -H "Authorization: Bearer ${SGDBAPIKEY}" "${BASESTEAMGRIDDBAPI}/search/autocomplete/${AppName// /_}") if jq -e ".success == true and (.data | length > 0)" <<< "${SGDBRES}" > /dev/null 2>&1; then export SteamGridDBId="$(jq '.data[0].id' <<< "${SGDBRES}")" if jq -e '.data[0].types | contains(["steam"])' <<< "${SGDBRES}" > /dev/null; then - SRES=$(curl -Ls -e "https://www.steamgriddb.com/game/${SteamGridDBId}" "https://www.steamgriddb.com/api/public/game/${SteamGridDBId}") - if jq -e ".success == true" <<< "${SRES}" > /dev/null 2>&1; then - export SteamAppId="$(jq -r '.data.platforms.steam.id' <<< "${SRES}")" - fi + getSteamId fi fi +} + +if [[ -z "${SteamAppId}" && -z "${SteamGridDBId}" && -n "${AppName}" && -n "${SGDBAPIKEY}" ]]; then + getSteamGridDBId fi -if [[ -n "${SteamAppId}" ]]; then - downloadImageSteam "${SteamAppId}/header.jpg" "${AppId:-0}.jpg" - downloadImageSteam "${SteamAppId}/library_600x900_2x.jpg" "${AppId:-0}p.jpg" - downloadImageSteam "${SteamAppId}/library_hero.jpg" "${AppId:-0}_hero.jpg" - downloadImageSteam "${SteamAppId}/logo.png" "${AppId:-0}_logo.png" -elif [[ -n "${SteamGridDBId}" && -n "${SGDBAPIKEY}" ]]; then - downloadImageSteamgriddb "grids/game/${SteamGridDBId}?mimes=image/jpeg" "${AppId:-0}.jpg ${AppId:-0}p.jpg" - downloadImageSteamgriddb "heroes/game/${SteamGridDBId}?mimes=image/jpeg" "${AppId:-0}_hero.jpg" - downloadImageSteamgriddb "logos/game/${SteamGridDBId}?mimes=image/png" "${AppId:-0}_logo.png" +if [[ -n "${SteamAppId}" ]] || [[ -n "${SteamGridDBId}" && -n "${SGDBAPIKEY}" ]]; then + downloadImageSteam "${SteamAppId}/header.jpg" "${AppId:-0}.jpg" || downloadImageSteamGridDB "grids/game/${SteamGridDBId}" "${AppId:-0}.jpg" "mimes=image/jpeg" "dimensions=460x215,920x430" || echo "Failed to load header.jpg" + downloadImageSteam "${SteamAppId}/library_600x900_2x.jpg" "${AppId:-0}p.jpg" || downloadImageSteamGridDB "grids/game/${SteamGridDBId}" "${AppId:-0}p.jpg" "mimes=image/jpeg" "dimensions=600x900,660x930" || echo "Failed to load library_600x900_2x.jpg" + downloadImageSteam "${SteamAppId}/library_hero.jpg" "${AppId:-0}_hero.jpg" || downloadImageSteamGridDB "heroes/game/${SteamGridDBId}" "${AppId:-0}_hero.jpg" "mimes=image/jpeg" || echo "Failed to load library_hero.jpg" + downloadImageSteam "${SteamAppId}/logo.png" "${AppId:-0}_logo.png" || downloadImageSteamGridDB "logos/game/${SteamGridDBId}" "${AppId:-0}_logo.png" "mimes=image/png" || echo "Failed to load logo.png" else echo "Game is not found" fi From 5b1f4a231b9fc14431ab896e55ee375ce65833f7 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Mon, 18 Nov 2024 02:17:24 +0500 Subject: [PATCH 06/48] remove get_images.sh --- data_from_portwine/scripts/add_in_steam.sh | 328 ++++++++++++++++---- data_from_portwine/scripts/functions_helper | 48 +-- data_from_portwine/scripts/get_images.sh | 82 ----- 3 files changed, 261 insertions(+), 197 deletions(-) delete mode 100755 data_from_portwine/scripts/get_images.sh diff --git a/data_from_portwine/scripts/add_in_steam.sh b/data_from_portwine/scripts/add_in_steam.sh index c81c7049..b351080c 100755 --- a/data_from_portwine/scripts/add_in_steam.sh +++ b/data_from_portwine/scripts/add_in_steam.sh @@ -28,91 +28,281 @@ fi ### BEGIN MAGIC APPID FUNCTIONS ## ---------- # Generate random signed 32bit integer which can be converted into hex, using the first argument (AppName and Exe fields) as seed (in an attempt to reduce the chances of the same AppID being generated twice) -function generateShortcutVDFAppId { - seed="$( echo -n "$1" | md5sum | cut -c1-8 )" - echo "-$(( 16#${seed} % 1000000000 ))" +generateShortcutVDFAppId() { + seed="$(echo -n "$1" | md5sum | cut -c1-8)" + echo "-$((16#${seed} % 1000000000))" } -function dec2hex { +dec2hex() { printf '%x\n' "$1" | cut -c 9- # cut removes the 'ffffffff' from the string (represents the sign) and starts from the 9th character } # Takes big-endian ("normal") hexidecimal number and converts to little-endian -function bigToLittleEndian { +bigToLittleEndian() { echo -n "$1" | tac -rs .. | tr -d '\n' } # Takes an signed 32bit integer and converts it to a 4byte little-endian hex number -function generateShortcutVDFHexAppId { - bigToLittleEndian "$( dec2hex "$1" )" +generateShortcutVDFHexAppId() { + bigToLittleEndian "$(dec2hex "$1")" } # Takes an signed 32bit integer and converts it to an unsigned 32bit integer -function generateShortcutGridAppId { - echo $(( $1 & 0xFFFFFFFF )) +generateShortcutGridAppId() { + echo $(($1 & 0xFFFFFFFF)) } ## ---------- ### END MAGIC APPID FUNCTIONS -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 -NOSTAIDVDFHEXFMT="\x$(awk '{$1=$1}1' FPAT='.{2}' OFS="\\\x" <<< "$NOSTAIDVDFHEX")" # binary-formatted string hex of the above which we actually write out - ex: \xc1\xc2\x5a\xdc -NOSTAIDGRID="$(generateShortcutGridAppId "$NOSTAIDVDF")" # unsigned 32bit ingeger version of "$NOSTAIDVDF", which is used as the AppID for Steam artwork ("grids"), as well as for our shortcuts +getSteamShortcutsVdfFileHex() { + LC_ALL=C perl -0777 -ne 'print unpack("H*", $_)' "${SCPATH}" +} -if [[ -f "$SCPATH" ]] ; then - cp "$SCPATH" "${SCPATH//.vdf}_${PROGNAME}_backup.vdf" 2>/dev/null - truncate -s-2 "$SCPATH" - OLDSET="$(grep -aPo '\x00[0-9]\x00\x02appid' "$SCPATH" | tail -n1 | tr -dc '0-9')" - NEWSET=$((OLDSET + 1)) -else - printf '\x00%s\x00' "shortcuts" > "$SCPATH" - NEWSET=0 +getSteamShortcutHex() { + getSteamShortcutsVdfFileHex | grep -oP "(${SHORTCUTVDFFILESTARTHEXPAT}|${SHORTCUTVDFENTRYBEGINHEXPAT})\K.*?(?=${SHORTCUTSVDFENTRYENDHEXPAT})" # Get entire shortcuts.vdf as hex, then grep each entry using the begin and end patterns for each block +} + +getSteamShortcutEntryHex() { + SHORTCUTSVDFINPUTHEX="$1" # The hex block representing the shortcut + SHORTCUTSVDFMATCHPATTERN="$2" # The pattern to match against in the block + printf "%s" "${SHORTCUTSVDFINPUTHEX}" | grep -oP "${SHORTCUTSVDFMATCHPATTERN}\K.*?(?=${SHORTCUTVDFENDPAT})" +} + +getAppId() { + listNonSteamGames | jq -r --arg exe "$1" 'map(select(.exe == $exe)) | first(.[]?.id)' +} + +getSteamId() { + if [[ $SteamGridDBTypeSteam == true ]]; then + SRES=$(curl -Ls -e "https://www.steamgriddb.com/game/${SteamGridDBId}" "https://www.steamgriddb.com/api/public/game/${SteamGridDBId}") + if jq -e ".success == true" <<< "${SRES}" > /dev/null 2>&1; then + SteamAppId="$(jq -r '.data.platforms.steam.id' <<< "${SRES}")" + fi + fi +} + +getSteamGridDBId() { + SGDBRES=$(curl -Ls -H "Authorization: Bearer ${SGDBAPIKEY}" "${BASESTEAMGRIDDBAPI}/search/autocomplete/${NOSTAPPNAME// /_}") + if jq -e ".success == true and (.data | length > 0)" <<< "${SGDBRES}" > /dev/null 2>&1; then + if jq -e '.data[0].types | contains(["steam"])' <<< "${SGDBRES}" > /dev/null; then + SteamGridDBTypeSteam=true + fi + SteamGridDBId="$(jq '.data[0].id' <<< "${SGDBRES}")" + fi +} + +getUserPath() { + SLUF="${HOME}/.local/share/Steam/config/loginusers.vdf" + if [[ -f "${SLUF}" ]]; then + SLUFUB=false + STUID64="" + while read -r line; do + if [[ "${line}" =~ ^[[:space:]]*\"([0-9]+)\"$ ]]; then + STUIDCUR="${BASH_REMATCH[1]}" + SLUFUB=true + elif [[ "${line}" == *'"MostRecent"'*'"1"' && ${SLUFUB} = true ]]; then + STUID64="${STUIDCUR}" + break + elif [[ "${line}" == "}" ]]; then + SLUFUB=false + fi + done < "${SLUF}" + if [ -n "${STUID64}" ]; then + STUID32=$((STUID64 - 76561197960265728)) + STUIDPATH="${HOME}/.local/share/Steam/userdata/${STUID32}" + if [[ -d "${STUIDPATH}" ]]; then + if [[ -f "${STUIDPATH}/config/shortcuts.vdf" ]]; then + echo "${STUIDPATH}/config" + fi + fi + fi + fi +} + +listNonSteamGames() { + getSteamShortcutHex | while read -r SCVDFE; do + jq -n \ + --arg id "$(parseSteamShortcutEntryAppID "${SCVDFE}")" \ + --arg name "$(parseSteamShortcutEntryAppName "${SCVDFE}")" \ + --arg exe "$(parseSteamShortcutEntryExe "${SCVDFE}")" \ + '{id: $id, name: $name, exe: $exe}' + done | jq -s '.' +} + +convertSteamShortcutAppID() { + SHORTCUTAPPIDHEX="$1" + SHORTCUTAPPIDLITTLEENDIAN="$( echo "${SHORTCUTAPPIDHEX}" | tac -rs .. | tr -d '\n' )" + echo "$((16#${SHORTCUTAPPIDLITTLEENDIAN}))" +} + +convertSteamShortcutHex() { + # printf "%s" "$1" | xxd -r -p | tr -d '\0' + LC_ALL=C perl -le 'print pack "H*", $ARGV[0]' "$1" | tr -d '\0' +} + +parseSteamShortcutEntryHex() { + SHORTCUTSVDFINPUTHEX="$1" # The hex block representing the shortcut + SHORTCUTSVDFMATCHPATTERN="$2" # The pattern to match against in the block + convertSteamShortcutHex "$(getSteamShortcutEntryHex "${SHORTCUTSVDFINPUTHEX}" "${SHORTCUTSVDFMATCHPATTERN}")" +} + +parseSteamShortcutEntryExe() { + parseSteamShortcutEntryHex "$1" "${SHORTCUTVDFEXEHEXPAT}" | tr -d '"' +} + +parseSteamShortcutEntryAppName() { + parseSteamShortcutEntryHex "$1" "${SHORTCUTVDFNAMEHEXPAT}" +} + +parseSteamShortcutEntryAppID() { + convertSteamShortcutAppID "$(printf "%s" "$1" | grep -oP "${SHORTCUTVDFAPPIDHEXPAT}\K.{8}")" +} + +restartSteam() { + if [[ "${PW_SKIP_RESTART_STEAM}" != 1 ]] && pgrep -i steam &>/dev/null ; then + if yad_question "${translations[For adding shortcut to STEAM, needed restart.\\n\\nRestart STEAM now?]}" ; then + pw_start_progress_bar_block "${translations[Restarting STEAM... Please wait.]}" + kill -s SIGTERM $(pgrep -a steam) &>/dev/null + while pgrep -i steam &>/dev/null ; do + sleep 0.5 + done + steam & + sleep 5 + pw_stop_progress_bar + exit 0 + fi + fi + unset PW_SKIP_RESTART_STEAM +} + +downloadImage() { + if ! curl -Lf# -o "${STCFGPATH}/grid/$2" "$1"; then + return 1 + fi +} + +downloadImageSteam() { + if [[ -z "${SteamAppId}" ]]; then + getSteamId + fi + if [[ -n "${SteamAppId}" ]]; then + downloadImage "https://cdn.cloudflare.steamstatic.com/steam/apps/${SteamAppId}/$1" "$2" + else + return 1 + fi +} + +downloadImageSteamGridDB() { + SGDBIMGAPI="${BASESTEAMGRIDDBAPI}/$1/game/${SteamGridDBId}?limit=1" + [[ -n "$3" ]] && SGDBIMGAPI+="&$3" + [[ -n "$4" ]] && SGDBIMGAPI+="&$4" + SGDBIMGRES=$(curl -Ls -H "Authorization: Bearer ${SGDBAPIKEY}" "${SGDBIMGAPI}") + if jq -e ".success == true and (.data | length > 0)" <<< "${SGDBIMGRES}" > /dev/null 2>&1; then + SGDBIMGURL=$(jq -r '.data[0].url' <<< "${SGDBIMGRES}") + downloadImage "${SGDBIMGURL}" "$2" + elif [[ -n "$3" ]]; then + downloadImageSteamGridDB "$1" "$2" "" "$4" + else + return 1 + fi +} + +addGrids() { + if [[ -n "${SGDBAPIKEY}" ]]; then + getSteamGridDBId + fi + if [[ -n "${SteamGridDBId}" ]]; then + create_new_dir "${STCFGPATH}/grid" + downloadImageSteamGridDB "grids" "${NOSTAIDGRID}.jpg" "mimes=image/jpeg" "dimensions=460x215,920x430" || downloadImageSteam "header.jpg" "${NOSTAIDGRID}.jpg" || echo "Failed to load header.jpg" + downloadImageSteamGridDB "grids" "${NOSTAIDGRID}p.jpg" "mimes=image/jpeg" "dimensions=600x900,660x930" || downloadImageSteam "library_600x900_2x.jpg" "${NOSTAIDGRID}p.jpg" || echo "Failed to load library_600x900_2x.jpg" + downloadImageSteamGridDB "heroes" "${NOSTAIDGRID}_hero.jpg" "mimes=image/jpeg" || downloadImageSteam "library_hero.jpg" "${NOSTAIDGRID}_hero.jpg" || echo "Failed to load library_hero.jpg" + downloadImageSteamGridDB "logos" "${NOSTAIDGRID}_logo.png" "mimes=image/png" || downloadImageSteam "logo.png" "${NOSTAIDGRID}_logo.png" || echo "Failed to load logo.png" + else + echo "Game is not found" + fi +} + +addNonSteamGame() { + if [[ -n "${SCPATH}" ]]; then + NOSTAIDGRID=$(getAppId "${NOSTSHPATH}") + if [[ -z "${NOSTAIDGRID}" ]]; then + 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 + NOSTAIDVDFHEXFMT="\x$(awk '{$1=$1}1' FPAT='.{2}' OFS="\\\x" <<< "$NOSTAIDVDFHEX")" # binary-formatted string hex of the above which we actually write out - ex: \xc1\xc2\x5a\xdc + NOSTAIDGRID="$(generateShortcutGridAppId "$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 + chmod u+x "${NOSTSHPATH}" + + if [[ -f "${SCPATH}" ]] ; then + cp "${SCPATH}" "${SCPATH//.vdf}_${PROGNAME}_backup.vdf" 2>/dev/null + truncate -s-2 "${SCPATH}" + OLDSET="$(grep -aPo '\x00[0-9]\x00\x02appid' "${SCPATH}" | tail -n1 | tr -dc '0-9')" + NEWSET=$((OLDSET + 1)) + else + printf '\x00%s\x00' "shortcuts" > "${SCPATH}" + NEWSET=0 + fi + + { + printf '\x00%s\x00' "${NEWSET}" + printf '\x02%s\x00%b' "appid" "${NOSTAIDVDFHEXFMT}" + printf '\x01%s\x00%s\x00' "AppName" "${NOSTAPPNAME}" + printf '\x01%s\x00%s\x00' "Exe" "${NOSTEXEPATH}" + printf '\x01%s\x00%s\x00' "StartDir" "${NOSTSTDIR}" + printf '\x01%s\x00%s\x00' "icon" "${NOSTICONPATH}" + printf '\x01%s\x00%s\x00' "ShortcutPath" "" + printf '\x01%s\x00%s\x00' "LaunchOptions" "" + + printf '\x02%s\x00%b\x00\x00\x00' "IsHidden" "\x00" + printf '\x02%s\x00%b\x00\x00\x00' "AllowDesktopConfig" "\x00" + + # These values are now stored in localconfig.vdf under the "Apps" section, + # under a block using the Non-Steam Game Signed 32bit AppID. (i.e., -223056321) + # This is handled by `updateLocalConfigAppsValue` below + # + # Unsure if required, but still write these to the shortcuts.vdf file for consistency + printf '\x02%s\x00%b\x00\x00\x00' "AllowOverlay" "\x00" + printf '\x02%s\x00%b\x00\x00\x00' "OpenVR" "\x00" + + printf '\x02%s\x00\x00\x00\x00\x00' "Devkit" + printf '\x01%s\x00\x00' "DevkitGameID" + printf '\x02%s\x00\x00\x00\x00\x00' "DevkitOverrideAppID" + printf '\x02%s\x00\x00\x00\x00\x00' "LastPlayTime" + printf '\x01%s\x00\x00' "FlatpakAppID" + printf '\x00%s\x00' "tags" + printf '\x08\x08\x08\x08' + } >> "${SCPATH}" + fi + + if [[ "${DOWNLOAD_STEAM_GRID}" == "1" ]] ; then + pw_start_progress_bar_block "${translations[Please wait. downloading covers for]} ${NOSTAPPNAME}" + addGrids + pw_stop_progress_bar + fi + + restartSteam + else + return 1 + fi +} + +SHORTCUTVDFFILESTARTHEXPAT="0073686f7274637574730000300002" # Bytes for beginning of the shortcuts.vdf file +SHORTCUTVDFENTRYBEGINHEXPAT="00080800.*?0002" # Pattern for beginning of shortcut entry in shortcuts.vdf -- Beginning of file has a different pattern, but every other pattern begins like this +SHORTCUTSVDFENTRYENDHEXPAT="000808" # Pattern for how shortcuts.vdf blocks end +SHORTCUTVDFAPPIDHEXPAT="617070696400" # 'appid' +SHORTCUTVDFNAMEHEXPAT="(014170704e616d6500|6170706e616d6500)" # 'AppName' and 'appname' +SHORTCUTVDFENDPAT="0001" # Generic end pattern for each shortcut.vdf column +SHORTCUTVDFEXEHEXPAT="000145786500" # 'Exe' ('exe' is 6578650a if we ever need it) +STCFGPATH="$(getUserPath)" +if [[ -n "${STCFGPATH}" ]]; then + SCPATH="${STCFGPATH}/shortcuts.vdf" fi - -export AppName="${NOSTAPPNAME}" -export AppId="${NOSTAIDGRID}" -if [[ "$DOWNLOAD_STEAM_GRID" == "1" ]] ; then - pw_start_progress_bar_block "${translations[Please wait. downloading covers for]} ${AppName}" - source "${PORT_SCRIPTS_PATH}/get_images.sh" - pw_stop_progress_bar -fi - -echo "#!/usr/bin/env bash" > "${NOSTSHPATH}" -echo "# AppId=${AppId}" >> "${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 -chmod u+x "${NOSTSHPATH}" - -{ - printf '\x00%s\x00' "$NEWSET" - printf '\x02%s\x00%b' "appid" "$NOSTAIDVDFHEXFMT" - printf '\x01%s\x00%s\x00' "AppName" "$NOSTAPPNAME" - printf '\x01%s\x00%s\x00' "Exe" "$NOSTEXEPATH" - printf '\x01%s\x00%s\x00' "StartDir" "$NOSTSTDIR" - printf '\x01%s\x00%s\x00' "icon" "$NOSTICONPATH" - printf '\x01%s\x00%s\x00' "ShortcutPath" "" - printf '\x01%s\x00%s\x00' "LaunchOptions" "$NOSTLAOP" - - printf '\x02%s\x00%b\x00\x00\x00' "IsHidden" "\x0${NOSTHIDE:-0}" - printf '\x02%s\x00%b\x00\x00\x00' "AllowDesktopConfig" "\x0${NOSTADC:-0}" - - # These values are now stored in localconfig.vdf under the "Apps" section, - # under a block using the Non-Steam Game Signed 32bit AppID. (i.e., -223056321) - # This is handled by `updateLocalConfigAppsValue` below - # - # Unsure if required, but still write these to the shortcuts.vdf file for consistency - printf '\x02%s\x00%b\x00\x00\x00' "AllowOverlay" "\x0${NOSTAO:-0}" - printf '\x02%s\x00%b\x00\x00\x00' "OpenVR" "\x0${NOSTVR:-0}" - - printf '\x02%s\x00\x00\x00\x00\x00' "Devkit" - printf '\x01%s\x00\x00' "DevkitGameID" - printf '\x02%s\x00\x00\x00\x00\x00' "DevkitOverrideAppID" - printf '\x02%s\x00\x00\x00\x00\x00' "LastPlayTime" - printf '\x01%s\x00\x00' "FlatpakAppID" - printf '\x00%s\x00' "tags" - printf '\x08\x08\x08\x08' -} >> "$SCPATH" diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index 4ac6cc91..2c7d302a 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -6009,52 +6009,8 @@ portwine_output_yad_shortcut () { fi if [[ "${PW_SHORTCUT_STEAM}" == "TRUE" ]] ; then - SLUF="${HOME}/.local/share/Steam/config/loginusers.vdf" - if [[ -f "${SLUF}" ]]; then - SLUFUB=false - STUID64="" - while read -r line; do - if [[ "${line}" =~ ^[[:space:]]*\"([0-9]+)\"$ ]]; then - STUIDCUR="${BASH_REMATCH[1]}" - SLUFUB=true - elif [[ "${line}" == *'"MostRecent"'*'"1"' && ${SLUFUB} = true ]]; then - STUID64="${STUIDCUR}" - break - elif [[ "${line}" == "}" ]]; then - SLUFUB=false - fi - done < "${SLUF}" - if [ -n "${STUID64}" ]; then - STUID32=$((STUID64 - 76561197960265728)) - STUIDPATH="${HOME}/.local/share/Steam/userdata/${STUID32}" - if [[ -d "${STUIDPATH}" ]]; then - export SCPATH="${STUIDPATH}/config/shortcuts.vdf" - if [[ -f "${SCPATH}" ]]; then - export STEAM_SCRIPTS="${PORT_WINE_PATH}/steam_scripts" - create_new_dir "${STEAM_SCRIPTS}" - create_new_dir "${STUIDPATH}/config/" - create_new_dir "${STUIDPATH}/config/grid" - export SGGRIDDIR="${STUIDPATH}/config/grid" - # shellcheck source=/dev/null - source "${PORT_SCRIPTS_PATH}/add_in_steam.sh" - if [[ "${PW_SKIP_RESTART_STEAM}" != 1 ]] && pgrep -i steam &>/dev/null ; then - if yad_question "${translations[For adding shortcut to STEAM, needed restart.\\n\\nRestart STEAM now?]}" ; then - pw_start_progress_bar_block "${translations[Restarting STEAM... Please wait.]}" - kill -s SIGTERM $(pgrep -a steam) &>/dev/null - while pgrep -i steam &>/dev/null ; do - sleep 0.5 - done - steam & - sleep 5 - pw_stop_progress_bar - exit 0 - fi - fi - unset PW_SKIP_RESTART_STEAM - fi - fi - fi - fi + source "${PORT_SCRIPTS_PATH}/add_in_steam.sh" + addNonSteamGame fi export PW_NEW_DESKTOP="1" diff --git a/data_from_portwine/scripts/get_images.sh b/data_from_portwine/scripts/get_images.sh deleted file mode 100755 index 818551e5..00000000 --- a/data_from_portwine/scripts/get_images.sh +++ /dev/null @@ -1,82 +0,0 @@ -#!/bin/bash -# AppName= AppId= SteamAppId= SteamGridDBId= SGGRIDDIR= ./get_images.sh - -if [[ -z "${SGDBAPIKEY}" || -z "${BASESTEAMGRIDDBAPI}" ]]; then - source "${PORT_SCRIPTS_PATH:-$(dirname "${BASH_SOURCE[0]}")}/var" -fi - -downloadImage() { - local path="${SGGRIDDIR:-${PWD}}" - local url="$1" - local files=("$2") - local cur=''; - if [[ -n "${url}" && -n "${files}" ]]; then - for file in ${files[@]}; do - if [[ -z "$cur" ]]; then - if ! curl -Lf# -o "${path}/${file}" "${url}"; then - return 1 - fi - else - cp "${path}/${cur}" "${path}/${file}" - fi - cur="${file}" - done - fi -} - -downloadImageSteam() { - if [[ -n "${SteamAppId}" ]]; then - downloadImage "https://cdn.cloudflare.steamstatic.com/steam/apps/$1" "$2" - else - return 1 - fi -} - -downloadImageSteamGridDB() { - if [[ -n "${SteamGridDBId}" && -n "${SGDBAPIKEY}" ]]; then - SGDBIMGAPI="${BASESTEAMGRIDDBAPI}/$1?limit=1" - [[ -n "$3" ]] && SGDBIMGAPI+="&$3" - [[ -n "$4" ]] && SGDBIMGAPI+="&$4" - SGDBIMGRES=$(curl -Ls -H "Authorization: Bearer ${SGDBAPIKEY}" "${SGDBIMGAPI}") - if jq -e ".success == true and (.data | length > 0)" <<< "${SGDBIMGRES}" > /dev/null 2>&1; then - SGDBIMGURL=$(jq -r '.data[0].url' <<< "${SGDBIMGRES}") - downloadImage "${SGDBIMGURL}" "$2" - elif [[ -n "$3" ]]; then - downloadImageSteamGridDB "$1" "$2" "" "$4" - else - return 1 - fi - else - return 1 - fi -} - -getSteamId() { - SRES=$(curl -Ls -e "https://www.steamgriddb.com/game/${SteamGridDBId}" "https://www.steamgriddb.com/api/public/game/${SteamGridDBId}") - if jq -e ".success == true" <<< "${SRES}" > /dev/null 2>&1; then - export SteamAppId="$(jq -r '.data.platforms.steam.id' <<< "${SRES}")" - fi -} - -getSteamGridDBId() { - SGDBRES=$(curl -Ls -H "Authorization: Bearer ${SGDBAPIKEY}" "${BASESTEAMGRIDDBAPI}/search/autocomplete/${AppName// /_}") - if jq -e ".success == true and (.data | length > 0)" <<< "${SGDBRES}" > /dev/null 2>&1; then - export SteamGridDBId="$(jq '.data[0].id' <<< "${SGDBRES}")" - if jq -e '.data[0].types | contains(["steam"])' <<< "${SGDBRES}" > /dev/null; then - getSteamId - fi - fi -} - -if [[ -z "${SteamAppId}" && -z "${SteamGridDBId}" && -n "${AppName}" && -n "${SGDBAPIKEY}" ]]; then - getSteamGridDBId -fi - -if [[ -n "${SteamAppId}" ]] || [[ -n "${SteamGridDBId}" && -n "${SGDBAPIKEY}" ]]; then - downloadImageSteam "${SteamAppId}/header.jpg" "${AppId:-0}.jpg" || downloadImageSteamGridDB "grids/game/${SteamGridDBId}" "${AppId:-0}.jpg" "mimes=image/jpeg" "dimensions=460x215,920x430" || echo "Failed to load header.jpg" - downloadImageSteam "${SteamAppId}/library_600x900_2x.jpg" "${AppId:-0}p.jpg" || downloadImageSteamGridDB "grids/game/${SteamGridDBId}" "${AppId:-0}p.jpg" "mimes=image/jpeg" "dimensions=600x900,660x930" || echo "Failed to load library_600x900_2x.jpg" - downloadImageSteam "${SteamAppId}/library_hero.jpg" "${AppId:-0}_hero.jpg" || downloadImageSteamGridDB "heroes/game/${SteamGridDBId}" "${AppId:-0}_hero.jpg" "mimes=image/jpeg" || echo "Failed to load library_hero.jpg" - downloadImageSteam "${SteamAppId}/logo.png" "${AppId:-0}_logo.png" || downloadImageSteamGridDB "logos/game/${SteamGridDBId}" "${AppId:-0}_logo.png" "mimes=image/png" || echo "Failed to load logo.png" -else - echo "Game is not found" -fi From 9da850b8d39fb90361b5fca5d6ed350e51a56d1c Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Mon, 18 Nov 2024 02:23:09 +0500 Subject: [PATCH 07/48] download grid only new game --- data_from_portwine/scripts/add_in_steam.sh | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/data_from_portwine/scripts/add_in_steam.sh b/data_from_portwine/scripts/add_in_steam.sh index b351080c..274ecb1f 100755 --- a/data_from_portwine/scripts/add_in_steam.sh +++ b/data_from_portwine/scripts/add_in_steam.sh @@ -281,15 +281,15 @@ addNonSteamGame() { printf '\x00%s\x00' "tags" printf '\x08\x08\x08\x08' } >> "${SCPATH}" - fi - if [[ "${DOWNLOAD_STEAM_GRID}" == "1" ]] ; then - pw_start_progress_bar_block "${translations[Please wait. downloading covers for]} ${NOSTAPPNAME}" - addGrids - pw_stop_progress_bar - fi + if [[ "${DOWNLOAD_STEAM_GRID}" == "1" ]] ; then + pw_start_progress_bar_block "${translations[Please wait. downloading covers for]} ${NOSTAPPNAME}" + addGrids + pw_stop_progress_bar + fi - restartSteam + restartSteam + fi else return 1 fi From ebef561808ad0e9c66510b306b5c1ce74b9a8241 Mon Sep 17 00:00:00 2001 From: Htylol Date: Mon, 18 Nov 2024 11:54:23 +0500 Subject: [PATCH 08/48] help_info moved to function --- data_from_portwine/scripts/help_info | 18 ------------------ data_from_portwine/scripts/start.sh | 22 ++++++++++++++++++++-- 2 files changed, 20 insertions(+), 20 deletions(-) delete mode 100755 data_from_portwine/scripts/help_info diff --git a/data_from_portwine/scripts/help_info b/data_from_portwine/scripts/help_info deleted file mode 100755 index 4b57e2cc..00000000 --- a/data_from_portwine/scripts/help_info +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash -files_from_autoinstall=$(ls "${PORT_SCRIPTS_PATH}/pw_autoinstall") -echo -e "${translations[use]}: [--repair] [--reinstall] [--autoinstall] - ---repair ${translations[Forces all scripts to be updated to a working state - (helps if PortProton is not working)]} ---reinstall ${translations[Reinstalls PortProton and resets all settings to default]} ---generate-pot ${translations[Creates a files with translations .pot and .po]} ---debug ${translations[Debug scripts for PortProton - (saved log in]} $PORT_WINE_PATH/scripts-debug.log) ---update ${translations[Check update scripts for PortProton]} ---launch ${translations[Launches the application immediately, requires the path to the .exe file]} ---edit-db ${translations[After the variable, the path to the .exe file is required and then the variables. - (List their variables and values for example PW_MANGOHUD=1 PW_VKBASALT=0, etc.)]} ---autoinstall ${translations[--autoinstall and the name of what needs to be installed is given in the list below:]} - -$(echo $files_from_autoinstall | awk '{for (i = 1; i <= NF; i++) {if (i % 10 == 0) {print ""} printf "%s ", $i}}') -" diff --git a/data_from_portwine/scripts/start.sh b/data_from_portwine/scripts/start.sh index 885b00fa..507fc63b 100755 --- a/data_from_portwine/scripts/start.sh +++ b/data_from_portwine/scripts/start.sh @@ -372,8 +372,26 @@ fi case "$1" in --help) - # shellcheck source=/dev/null - source "${PORT_SCRIPTS_PATH}/help_info" + help_info () { + files_from_autoinstall=$(ls "${PORT_SCRIPTS_PATH}/pw_autoinstall") + echo -e "${translations[use]}: [--repair] [--reinstall] [--autoinstall] + +--repair ${translations[Forces all scripts to be updated to a working state + (helps if PortProton is not working)]} +--reinstall ${translations[Reinstalls PortProton and resets all settings to default]} +--generate-pot ${translations[Creates a files with translations .pot and .po]} +--debug ${translations[Debug scripts for PortProton + (saved log in]} $PORT_WINE_PATH/scripts-debug.log) +--update ${translations[Check update scripts for PortProton]} +--launch ${translations[Launches the application immediately, requires the path to the .exe file]} +--edit-db ${translations[After the variable, the path to the .exe file is required and then the variables. + (List their variables and values for example PW_MANGOHUD=1 PW_VKBASALT=0, etc.)]} +--autoinstall ${translations[--autoinstall and the name of what needs to be installed is given in the list below:]} + +$(echo $files_from_autoinstall | awk '{for (i = 1; i <= NF; i++) {if (i % 10 == 0) {print ""} printf "%s ", $i}}') + " + } + help_info exit 0 ;; --reinstall) From bed58264a4c99c4ea8e0cc85a2048a0b18901fa7 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Mon, 18 Nov 2024 21:43:09 +0500 Subject: [PATCH 09/48] add func getAppTarget and parseSteamTargetExe --- data_from_portwine/scripts/add_in_steam.sh | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/data_from_portwine/scripts/add_in_steam.sh b/data_from_portwine/scripts/add_in_steam.sh index 274ecb1f..97fdb10c 100755 --- a/data_from_portwine/scripts/add_in_steam.sh +++ b/data_from_portwine/scripts/add_in_steam.sh @@ -2,11 +2,11 @@ # GPL-3.0 license # based on https://github.com/sonic2kk/steamtinkerlaunch/blob/master/steamtinkerlaunch PROGNAME="PortProton" -NOSTAPPNAME="$name_desktop" +NOSTAPPNAME="${name_desktop}" NOSTSHPATH="${STEAM_SCRIPTS}/${name_desktop}.sh" NOSTEXEPATH="\"${NOSTSHPATH}\"" -NOSTICONPATH="${PORT_WINE_PATH}/data/img/$name_desktop_png.png" -if [[ -z "${NOSTSTDIR}" ]] ; then +NOSTICONPATH="${PORT_WINE_PATH}/data/img/${name_desktop_png}.png" +if [[ -z "${NOSTSTDIR}" ]]; then NOSTSTDIR="\"${STEAM_SCRIPTS}\"" fi @@ -68,6 +68,11 @@ getSteamShortcutEntryHex() { printf "%s" "${SHORTCUTSVDFINPUTHEX}" | grep -oP "${SHORTCUTSVDFMATCHPATTERN}\K.*?(?=${SHORTCUTVDFENDPAT})" } +getAppTarget() { + exe=$(listNonSteamGames | jq -r --arg id "$1" 'map(select(.id == $id)) | first(.[].exe)') + [[ -n "${exe}" ]] && parseSteamTargetExe "${exe}" +} + getAppId() { listNonSteamGames | jq -r --arg exe "$1" 'map(select(.exe == $exe)) | first(.[]?.id)' } @@ -158,6 +163,10 @@ parseSteamShortcutEntryAppID() { convertSteamShortcutAppID "$(printf "%s" "$1" | grep -oP "${SHORTCUTVDFAPPIDHEXPAT}\K.{8}")" } +parseSteamTargetExe() { + grep -E 'flatpak|start\.sh' "$1" | head -n 1 | awk -F'"' '{print $(NF-1)}' +} + restartSteam() { if [[ "${PW_SKIP_RESTART_STEAM}" != 1 ]] && pgrep -i steam &>/dev/null ; then if yad_question "${translations[For adding shortcut to STEAM, needed restart.\\n\\nRestart STEAM now?]}" ; then From 6497b49238d6fab07cfdc435e833131508f61234 Mon Sep 17 00:00:00 2001 From: zorn-v Date: Tue, 19 Nov 2024 22:28:44 +1000 Subject: [PATCH 10/48] Fix exit with PW_GUI_DISABLED_CS=1 --- data_from_portwine/scripts/start.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/data_from_portwine/scripts/start.sh b/data_from_portwine/scripts/start.sh index 885b00fa..a2400b80 100755 --- a/data_from_portwine/scripts/start.sh +++ b/data_from_portwine/scripts/start.sh @@ -905,6 +905,7 @@ case "$PW_YAD_SET" in esac case "$PW_YAD_SET" in + '') ;; 98) portwine_change_shortcut ;; 100) portwine_create_shortcut ;; DEBUG|102) portwine_start_debug ;; From 69c59da675864ccad64e431129147b166e489bcd Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Tue, 19 Nov 2024 22:08:37 +0500 Subject: [PATCH 11/48] support application/x-ms-shortcut --- data_from_portwine/scripts/functions_helper | 61 ++++++++++----------- data_from_portwine/scripts/setup.sh | 2 +- data_from_portwine/scripts/start.sh | 6 +- 3 files changed, 35 insertions(+), 34 deletions(-) diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index 6a1eebc9..3a43a9e2 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -6081,6 +6081,34 @@ portwine_output_yad_shortcut () { fi } +parse_lnk () { + prefix_name=$(echo "$1" | awk -F"/prefixes/" '{print $2}' | awk -F"/" '{print $1}') + if fix_icon_name=$(grep -i "Icon File Name" "${PW_TMPFS_PATH}/exiftool.tmp" 2>/dev/null) \ + && [[ "${fix_icon_name//*.exe/true}" == "true" ]] ; then + link_drive=$(sed -n 's/^Icon File Name\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp" | cut -d: -f1 | awk '{print tolower($0)}') + link_path=$(sed -n 's/^Icon File Name\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp" | sed 's|%ProgramFiles(x86)%|C:\\Program Files (x86)|gi;s|%ProgramFiles%|C:\\Program Files|gi' | sed "s|^.|${PORT_WINE_PATH}/data/prefixes/${prefix_name:-DEFAULT}/dosdevices/$link_drive|g" | sed 's/\\/\//g') + else + link_drive=$(sed -n 's/^Local Base Path\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp" | cut -d: -f1 | awk '{print tolower($0)}') + link_path=$(sed -n 's/^Local Base Path\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp" | sed 's|%ProgramFiles(x86)%|C:\\Program Files (x86)|gi;s|%ProgramFiles%|C:\\Program Files|gi' | sed "s|^.|${PORT_WINE_PATH}/data/prefixes/${prefix_name:-DEFAULT}/dosdevices/$link_drive|g" | sed 's/\\/\//g') + fi + link_name=$(sed -n 's/^File Name\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp" | sed 's|\.lnk||') + link_cmd=$(sed -n 's/^Command Line Arguments\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp") +} + +get_lnk () { + if command -v exiftool &>/dev/null ; then + if timeout 3 exiftool "$1" &> "${PW_TMPFS_PATH}/exiftool.tmp" ; then + parse_lnk "$1" + else + print_error "exiftool - broken!" + fi + else + print_warning "use portable exiftool" + env PERL5LIB="${PW_PLUGINS_PATH}/portable/lib/perl5" "${PW_PLUGINS_PATH}/portable/bin/exiftool" "$1" &> "${PW_TMPFS_PATH}/exiftool.tmp" + parse_lnk "$1" + fi +} + pw_auto_create_shortcut () { if [[ "${PW_CHECK_AUTOINSTALL}" == "1" ]] \ || [[ "${PW_NO_AUTO_CREATE_SHORTCUT}" == "1" ]] \ @@ -6101,38 +6129,7 @@ pw_auto_create_shortcut () { read -r -a SORTED_LINKS < <(echo "${LINKS[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' ') for link_file in "${SORTED_LINKS[@]//#@_@#/ }" ; do - if command -v exiftool &>/dev/null ; then - if timeout 3 exiftool "$link_file" &> "${PW_TMPFS_PATH}/exiftool.tmp" ; then - prefix_name=$(echo "$link_file" | awk -F"/prefixes/" '{print $2}' | awk -F"/" '{print $1}') - if fix_icon_name=$(grep -i "Icon File Name" "${PW_TMPFS_PATH}/exiftool.tmp" 2>/dev/null) \ - && [[ "${fix_icon_name//*.exe/true}" == "true" ]] ; then - link_drive=$(sed -n 's/^Icon File Name\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp" | cut -d: -f1 | awk '{print tolower($0)}') - link_path=$(sed -n 's/^Icon File Name\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp" | sed 's|%ProgramFiles(x86)%|C:\\Program Files (x86)|gi;s|%ProgramFiles%|C:\\Program Files|gi' | sed "s|^.|${PORT_WINE_PATH}/data/prefixes/$prefix_name/dosdevices/$link_drive|g" | sed 's/\\/\//g') - else - link_drive=$(sed -n 's/^Local Base Path\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp" | cut -d: -f1 | awk '{print tolower($0)}') - link_path=$(sed -n 's/^Local Base Path\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp" | sed 's|%ProgramFiles(x86)%|C:\\Program Files (x86)|gi;s|%ProgramFiles%|C:\\Program Files|gi' | sed "s|^.|${PORT_WINE_PATH}/data/prefixes/$prefix_name/dosdevices/$link_drive|g" | sed 's/\\/\//g') - fi - link_name=$(sed -n 's/^File Name\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp" | sed 's|\.lnk||') - link_cmd=$(sed -n 's/^Command Line Arguments\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp") - else - print_error "exiftool - broken!" - fi - else - print_warning "use portable exiftool" - env PERL5LIB="${PW_PLUGINS_PATH}/portable/lib/perl5" "${PW_PLUGINS_PATH}/portable/bin/exiftool" "$link_file" &> "${PW_TMPFS_PATH}/exiftool.tmp" - prefix_name=$(echo "$link_file" | awk -F"/prefixes/" '{print $2}' | awk -F"/" '{print $1}') - if fix_icon_name=$(grep -i "Icon File Name" "${PW_TMPFS_PATH}/exiftool.tmp" 2>/dev/null) \ - && [[ "${fix_icon_name//*.exe/true}" == "true" ]] ; then - link_drive=$(sed -n 's/^Icon File Name\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp" | cut -d: -f1 | awk '{print tolower($0)}') - link_path=$(sed -n 's/^Icon File Name\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp" | sed 's|%ProgramFiles(x86)%|C:\\Program Files (x86)|gi;s|%ProgramFiles%|C:\\Program Files|gi' | sed "s|^.|${PORT_WINE_PATH}/data/prefixes/$prefix_name/dosdevices/$link_drive|g" | sed 's/\\/\//g') - else - link_drive=$(sed -n 's/^Local Base Path\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp" | cut -d: -f1 | awk '{print tolower($0)}') - link_path=$(sed -n 's/^Local Base Path\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp" | sed 's|%ProgramFiles(x86)%|C:\\Program Files (x86)|gi;s|%ProgramFiles%|C:\\Program Files|gi' | sed "s|^.|${PORT_WINE_PATH}/data/prefixes/$prefix_name/dosdevices/$link_drive|g" | sed 's/\\/\//g') - fi - link_name=$(sed -n 's/^File Name\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp" | sed 's|\.lnk||') - link_cmd=$(sed -n 's/^Command Line Arguments\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp") - fi - + get_lnk "${link_file}" if ! exe_path="$(realpath "${link_path}" 2>/dev/null)" ; then print_warning "Link broken for: $link_name" else diff --git a/data_from_portwine/scripts/setup.sh b/data_from_portwine/scripts/setup.sh index 63627fd4..0fdf094d 100755 --- a/data_from_portwine/scripts/setup.sh +++ b/data_from_portwine/scripts/setup.sh @@ -19,7 +19,7 @@ Type=Application Terminal=False Categories=Game StartupNotify=true -MimeType=application/x-ms-dos-executable;application/x-wine-extension-msp;application/x-msi;application/x-msdos-program;text/win-bat; +MimeType=application/x-ms-dos-executable;application/x-wine-extension-msp;application/x-msi;application/x-msdos-program;application/x-ms-shortcut;text/win-bat; Path=${PORT_SCRIPTS_PATH} Icon=${PORT_WINE_PATH}/data/img/w.png EOF diff --git a/data_from_portwine/scripts/start.sh b/data_from_portwine/scripts/start.sh index 885b00fa..c2dfd07a 100755 --- a/data_from_portwine/scripts/start.sh +++ b/data_from_portwine/scripts/start.sh @@ -52,7 +52,7 @@ if [[ "${1,,}" =~ .ppack$ ]] ; then export PW_NO_RESTART_PPDB="1" export PW_DISABLED_CREATE_DB="1" portwine_exe="$1" -elif [[ "${1,,}" =~ .(exe|bat|msi|reg)$ ]] ; then +elif [[ "${1,,}" =~ .(exe|bat|msi|reg|lnk)$ ]] ; then if [[ -f "$1" ]] ; then portwine_exe="$(realpath -s "$1")" elif [[ -f "$OLDPWD/$1" ]] ; then @@ -61,6 +61,10 @@ elif [[ "${1,,}" =~ .(exe|bat|msi|reg)$ ]] ; then portwine_exe="$1" MISSING_DESKTOP_FILE="1" fi + if [[ -n "${portwine_exe}" && "${1,,}" =~ .lnk$ ]] ; then + get_lnk "${portwine_exe}" + portwine_exe="$(realpath "${link_path}" 2>/dev/null)" + fi elif [[ "$1" =~ ^--(debug|launch|edit-db)$ && "${2,,}" =~ .(exe|bat|msi|reg)$ ]] ; then if [[ -f "$2" ]] ; then portwine_exe="$(realpath -s "$2")" From 51a24d9910e2b530dd27135bb57c87d63088ebb5 Mon Sep 17 00:00:00 2001 From: Max Date: Thu, 21 Nov 2024 18:14:58 +0300 Subject: [PATCH 12/48] Update PW_LGC MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit добавлена всплывашка для LGC --- data_from_portwine/scripts/pw_autoinstall/PW_LGC | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_LGC b/data_from_portwine/scripts/pw_autoinstall/PW_LGC index 3f1dedde..7eea1b97 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_LGC +++ b/data_from_portwine/scripts/pw_autoinstall/PW_LGC @@ -3,8 +3,8 @@ # type: games # name: Lesta Game Center # image: lgc -# info_en: -# info_ru: +# info_en: Launcher for Lesta Games. +# info_ru: Лаунчер для игр Lesta Games. ######################################################################## export LAUNCH_PARAMETERS="/VERYSILENT" export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/Lesta_Game_Center_Install_RU.exe" From 614cdcb8fe0b8976fbbad5e7a7a4ee751c8f88c2 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Thu, 21 Nov 2024 21:39:27 +0500 Subject: [PATCH 13/48] new func listInstalledSteamGames and getSteamGameId --- data_from_portwine/scripts/add_in_steam.sh | 77 +++++++++++++++------- 1 file changed, 55 insertions(+), 22 deletions(-) diff --git a/data_from_portwine/scripts/add_in_steam.sh b/data_from_portwine/scripts/add_in_steam.sh index 97fdb10c..78baaccd 100755 --- a/data_from_portwine/scripts/add_in_steam.sh +++ b/data_from_portwine/scripts/add_in_steam.sh @@ -2,13 +2,6 @@ # GPL-3.0 license # based on https://github.com/sonic2kk/steamtinkerlaunch/blob/master/steamtinkerlaunch PROGNAME="PortProton" -NOSTAPPNAME="${name_desktop}" -NOSTSHPATH="${STEAM_SCRIPTS}/${name_desktop}.sh" -NOSTEXEPATH="\"${NOSTSHPATH}\"" -NOSTICONPATH="${PORT_WINE_PATH}/data/img/${name_desktop_png}.png" -if [[ -z "${NOSTSTDIR}" ]]; then - NOSTSTDIR="\"${STEAM_SCRIPTS}\"" -fi ## How Non-Steam AppIDs work, because it took me almost a year to figure this out ## ---------------------- @@ -55,22 +48,42 @@ generateShortcutGridAppId() { ### END MAGIC APPID FUNCTIONS getSteamShortcutsVdfFileHex() { - LC_ALL=C perl -0777 -ne 'print unpack("H*", $_)' "${SCPATH}" + STCFGPATH="$(getUserPath)" + if [[ -n "${STCFGPATH}" ]]; then + SCPATH="${STCFGPATH}/shortcuts.vdf" + if [[ -f "${SCPATH}" ]]; then + LC_ALL=C perl -0777 -ne 'print unpack("H*", $_)' "${SCPATH}" + fi + fi } getSteamShortcutHex() { + SHORTCUTVDFFILESTARTHEXPAT="0073686f7274637574730000300002" # Bytes for beginning of the shortcuts.vdf file + SHORTCUTVDFENTRYBEGINHEXPAT="00080800.*?0002" # Pattern for beginning of shortcut entry in shortcuts.vdf -- Beginning of file has a different pattern, but every other pattern begins like this + SHORTCUTSVDFENTRYENDHEXPAT="000808" # Pattern for how shortcuts.vdf blocks end getSteamShortcutsVdfFileHex | grep -oP "(${SHORTCUTVDFFILESTARTHEXPAT}|${SHORTCUTVDFENTRYBEGINHEXPAT})\K.*?(?=${SHORTCUTSVDFENTRYENDHEXPAT})" # Get entire shortcuts.vdf as hex, then grep each entry using the begin and end patterns for each block } getSteamShortcutEntryHex() { SHORTCUTSVDFINPUTHEX="$1" # The hex block representing the shortcut SHORTCUTSVDFMATCHPATTERN="$2" # The pattern to match against in the block + SHORTCUTVDFENDPAT="0001" # Generic end pattern for each shortcut.vdf column printf "%s" "${SHORTCUTSVDFINPUTHEX}" | grep -oP "${SHORTCUTSVDFMATCHPATTERN}\K.*?(?=${SHORTCUTVDFENDPAT})" } getAppTarget() { exe=$(listNonSteamGames | jq -r --arg id "$1" 'map(select(.id == $id)) | first(.[].exe)') - [[ -n "${exe}" ]] && parseSteamTargetExe "${exe}" + if [[ -n "${exe}" ]]; then + if [[ "${exe}" =~ .sh$ ]] ; then + parseSteamTargetExe "${exe}" + else + echo "${exe}"; + fi + fi +} + +getSteamGameId() { + printf "%u\n" $(($1 << 32 | 0x02000000)) } getAppId() { @@ -78,6 +91,9 @@ getAppId() { } getSteamId() { + if [[ -n "${1:-}" ]]; then + getSteamGridDBId "$1" + fi if [[ $SteamGridDBTypeSteam == true ]]; then SRES=$(curl -Ls -e "https://www.steamgriddb.com/game/${SteamGridDBId}" "https://www.steamgriddb.com/api/public/game/${SteamGridDBId}") if jq -e ".success == true" <<< "${SRES}" > /dev/null 2>&1; then @@ -87,6 +103,7 @@ getSteamId() { } getSteamGridDBId() { + NOSTAPPNAME="$1" SGDBRES=$(curl -Ls -H "Authorization: Bearer ${SGDBAPIKEY}" "${BASESTEAMGRIDDBAPI}/search/autocomplete/${NOSTAPPNAME// /_}") if jq -e ".success == true and (.data | length > 0)" <<< "${SGDBRES}" > /dev/null 2>&1; then if jq -e '.data[0].types | contains(["steam"])' <<< "${SGDBRES}" > /dev/null; then @@ -124,6 +141,20 @@ getUserPath() { fi } +listInstalledSteamGames() { + manifests=("${HOME}/.local/share/Steam/steamapps"/appmanifest_*.acf) + if [ ! -e "${manifests[0]}" ]; then + jq -n '[]' + else + for manifest_file in "${manifests[@]}"; do + jq -n \ + --arg id "$(grep -Po '"appid"\s+"\K\d+' "$manifest_file")" \ + --arg name "$(grep -Po '"name"\s+"\K[^"]+' "$manifest_file")" \ + '{id: $id, name: $name}' + done | jq -s '.' + fi +} + listNonSteamGames() { getSteamShortcutHex | while read -r SCVDFE; do jq -n \ @@ -152,14 +183,17 @@ parseSteamShortcutEntryHex() { } parseSteamShortcutEntryExe() { + SHORTCUTVDFEXEHEXPAT="000145786500" # 'Exe' ('exe' is 6578650a if we ever need it) parseSteamShortcutEntryHex "$1" "${SHORTCUTVDFEXEHEXPAT}" | tr -d '"' } parseSteamShortcutEntryAppName() { + SHORTCUTVDFNAMEHEXPAT="(014170704e616d6500|6170706e616d6500)" # 'AppName' and 'appname' parseSteamShortcutEntryHex "$1" "${SHORTCUTVDFNAMEHEXPAT}" } parseSteamShortcutEntryAppID() { + SHORTCUTVDFAPPIDHEXPAT="617070696400" # 'appid' convertSteamShortcutAppID "$(printf "%s" "$1" | grep -oP "${SHORTCUTVDFAPPIDHEXPAT}\K.{8}")" } @@ -218,7 +252,7 @@ downloadImageSteamGridDB() { addGrids() { if [[ -n "${SGDBAPIKEY}" ]]; then - getSteamGridDBId + getSteamGridDBId "${name_desktop}" fi if [[ -n "${SteamGridDBId}" ]]; then create_new_dir "${STCFGPATH}/grid" @@ -232,6 +266,17 @@ addGrids() { } addNonSteamGame() { + NOSTAPPNAME="${name_desktop}" + NOSTSHPATH="${STEAM_SCRIPTS}/${name_desktop}.sh" + NOSTEXEPATH="\"${NOSTSHPATH}\"" + NOSTICONPATH="${PORT_WINE_PATH}/data/img/${name_desktop_png}.png" + if [[ -z "${NOSTSTDIR}" ]]; then + NOSTSTDIR="\"${STEAM_SCRIPTS}\"" + fi + STCFGPATH="$(getUserPath)" + if [[ -n "${STCFGPATH}" ]]; then + SCPATH="${STCFGPATH}/shortcuts.vdf" + fi if [[ -n "${SCPATH}" ]]; then NOSTAIDGRID=$(getAppId "${NOSTSHPATH}") if [[ -z "${NOSTAIDGRID}" ]]; then @@ -303,15 +348,3 @@ addNonSteamGame() { return 1 fi } - -SHORTCUTVDFFILESTARTHEXPAT="0073686f7274637574730000300002" # Bytes for beginning of the shortcuts.vdf file -SHORTCUTVDFENTRYBEGINHEXPAT="00080800.*?0002" # Pattern for beginning of shortcut entry in shortcuts.vdf -- Beginning of file has a different pattern, but every other pattern begins like this -SHORTCUTSVDFENTRYENDHEXPAT="000808" # Pattern for how shortcuts.vdf blocks end -SHORTCUTVDFAPPIDHEXPAT="617070696400" # 'appid' -SHORTCUTVDFNAMEHEXPAT="(014170704e616d6500|6170706e616d6500)" # 'AppName' and 'appname' -SHORTCUTVDFENDPAT="0001" # Generic end pattern for each shortcut.vdf column -SHORTCUTVDFEXEHEXPAT="000145786500" # 'Exe' ('exe' is 6578650a if we ever need it) -STCFGPATH="$(getUserPath)" -if [[ -n "${STCFGPATH}" ]]; then - SCPATH="${STCFGPATH}/shortcuts.vdf" -fi From aea3d99a9d87eecf33a9424880afc133d3ccb2cf Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Thu, 21 Nov 2024 22:57:41 +0500 Subject: [PATCH 14/48] new func listSteamGames --- data_from_portwine/scripts/add_in_steam.sh | 40 +++++++++++++++++----- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/data_from_portwine/scripts/add_in_steam.sh b/data_from_portwine/scripts/add_in_steam.sh index 78baaccd..6f264157 100755 --- a/data_from_portwine/scripts/add_in_steam.sh +++ b/data_from_portwine/scripts/add_in_steam.sh @@ -91,25 +91,32 @@ getAppId() { } getSteamId() { - if [[ -n "${1:-}" ]]; then - getSteamGridDBId "$1" + unset SteamAppId + NOSTAPPNAME="$1" + if [[ -n "${NOSTAPPNAME}" ]]; then + getSteamGridDBId "${NOSTAPPNAME}" > /dev/null fi if [[ $SteamGridDBTypeSteam == true ]]; then SRES=$(curl -Ls -e "https://www.steamgriddb.com/game/${SteamGridDBId}" "https://www.steamgriddb.com/api/public/game/${SteamGridDBId}") if jq -e ".success == true" <<< "${SRES}" > /dev/null 2>&1; then SteamAppId="$(jq -r '.data.platforms.steam.id' <<< "${SRES}")" + echo ${SteamAppId} fi fi } getSteamGridDBId() { + unset SteamGridDBId NOSTAPPNAME="$1" SGDBRES=$(curl -Ls -H "Authorization: Bearer ${SGDBAPIKEY}" "${BASESTEAMGRIDDBAPI}/search/autocomplete/${NOSTAPPNAME// /_}") if jq -e ".success == true and (.data | length > 0)" <<< "${SGDBRES}" > /dev/null 2>&1; then if jq -e '.data[0].types | contains(["steam"])' <<< "${SGDBRES}" > /dev/null; then SteamGridDBTypeSteam=true + else + SteamGridDBTypeSteam=false fi SteamGridDBId="$(jq '.data[0].id' <<< "${SGDBRES}")" + echo ${SteamGridDBId} fi } @@ -147,10 +154,13 @@ listInstalledSteamGames() { jq -n '[]' else for manifest_file in "${manifests[@]}"; do - jq -n \ - --arg id "$(grep -Po '"appid"\s+"\K\d+' "$manifest_file")" \ - --arg name "$(grep -Po '"name"\s+"\K[^"]+' "$manifest_file")" \ - '{id: $id, name: $name}' + name="$(grep -Po '"name"\s+"\K[^"]+' "$manifest_file")"; + if [[ ! "${name}" =~ ^(Proton |Steam Linux Runtime|Steamworks Common) ]]; then + jq -n \ + --arg id "$(grep -Po '"appid"\s+"\K\d+' "$manifest_file")" \ + --arg name "${name}" \ + '{id: $id, name: $name}' + fi done | jq -s '.' fi } @@ -165,6 +175,20 @@ listNonSteamGames() { done | jq -s '.' } +listSteamGames() { + ( + jq -r 'map({AppId: .id, SteamAppId: .id, SteamGameId: .id, Name: .name}) | .[] | tostring' <<< "$(listInstalledSteamGames)" + jq -r '.[] | tostring' <<< "$(listNonSteamGames)" | while read game; do + id=$(jq -r '.id' <<< "${game}") + name=$(jq -r '.name' <<< "${game}") + jq -r \ + --arg SteamAppId "$(getSteamId "${name}")" \ + --arg SteamGameId "$(getSteamGameId $id)" \ + '{AppId: .id, SteamAppId: ($SteamAppId | if . == "" then "0" else . end), SteamGameId: $SteamGameId, Name: .name} | tostring' <<< "${game}" + done + ) | jq -s '.' +} + convertSteamShortcutAppID() { SHORTCUTAPPIDHEX="$1" SHORTCUTAPPIDLITTLEENDIAN="$( echo "${SHORTCUTAPPIDHEX}" | tac -rs .. | tr -d '\n' )" @@ -226,7 +250,7 @@ downloadImage() { downloadImageSteam() { if [[ -z "${SteamAppId}" ]]; then - getSteamId + getSteamId > /dev/null fi if [[ -n "${SteamAppId}" ]]; then downloadImage "https://cdn.cloudflare.steamstatic.com/steam/apps/${SteamAppId}/$1" "$2" @@ -252,7 +276,7 @@ downloadImageSteamGridDB() { addGrids() { if [[ -n "${SGDBAPIKEY}" ]]; then - getSteamGridDBId "${name_desktop}" + getSteamGridDBId "${name_desktop}" > /dev/null fi if [[ -n "${SteamGridDBId}" ]]; then create_new_dir "${STCFGPATH}/grid" From b4a5190c0fe97d636b22c917128723d9fe2b63d1 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Fri, 22 Nov 2024 14:50:43 +0500 Subject: [PATCH 15/48] cache on getSteamId --- data_from_portwine/scripts/add_in_steam.sh | 30 +++++++++++++++------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/data_from_portwine/scripts/add_in_steam.sh b/data_from_portwine/scripts/add_in_steam.sh index 6f264157..7343139f 100755 --- a/data_from_portwine/scripts/add_in_steam.sh +++ b/data_from_portwine/scripts/add_in_steam.sh @@ -92,16 +92,28 @@ getAppId() { getSteamId() { unset SteamAppId - NOSTAPPNAME="$1" - if [[ -n "${NOSTAPPNAME}" ]]; then - getSteamGridDBId "${NOSTAPPNAME}" > /dev/null + local cache_file="${PORT_WINE_TMP_PATH:-/tmp}/steamid_cache.json" + [[ -n "${1:-}" ]] && NOSTAPPNAME="$1" + if [[ -z "${SteamIds:-}" ]] && [[ -f "${cache_file}" ]]; then + SteamIds=$(<"${cache_file}") fi - if [[ $SteamGridDBTypeSteam == true ]]; then - SRES=$(curl -Ls -e "https://www.steamgriddb.com/game/${SteamGridDBId}" "https://www.steamgriddb.com/api/public/game/${SteamGridDBId}") - if jq -e ".success == true" <<< "${SRES}" > /dev/null 2>&1; then - SteamAppId="$(jq -r '.data.platforms.steam.id' <<< "${SRES}")" - echo ${SteamAppId} + if [[ -n "${SteamIds:-}" ]] && jq -e --arg key "$NOSTAPPNAME" 'has($key)' <<< "${SteamIds}" > /dev/null; then + SteamAppId=$(jq -r --arg key "${NOSTAPPNAME}" '.[$key]' <<< "${SteamIds}") + else + if [[ -n "${1:-}" ]]; then + getSteamGridDBId "${NOSTAPPNAME}" > /dev/null fi + if [[ $SteamGridDBTypeSteam == true ]]; then + SRES=$(curl -Ls -e "https://www.steamgriddb.com/game/${SteamGridDBId}" "https://www.steamgriddb.com/api/public/game/${SteamGridDBId}") + if jq -e ".success == true" <<< "${SRES}" > /dev/null 2>&1; then + SteamAppId="$(jq -r '.data.platforms.steam.id' <<< "${SRES}")" + fi + fi + SteamIds=$(jq --arg key "${NOSTAPPNAME}" --arg value "${SteamAppId:-}" '. + {($key): $value}' <<< "${SteamIds:-$(jq -n '{}')}") + echo "${SteamIds}" > "${cache_file}" + fi + if [[ -n "${SteamAppId:-}" ]]; then + echo "${SteamAppId}" fi } @@ -116,7 +128,7 @@ getSteamGridDBId() { SteamGridDBTypeSteam=false fi SteamGridDBId="$(jq '.data[0].id' <<< "${SGDBRES}")" - echo ${SteamGridDBId} + echo "${SteamGridDBId}" fi } From 81aa9c9d2363b876aa60418ba8d239ab824934ae Mon Sep 17 00:00:00 2001 From: Muzifs Date: Fri, 22 Nov 2024 16:30:01 +0300 Subject: [PATCH 16/48] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=B2=D1=81=D0=BF=D0=BB=D1=8B=D0=B2=D0=B0?= =?UTF-8?q?=D1=88=D0=BA=D0=B8=20=D0=B4=D0=BB=D1=8F=20z=D0=BB=D0=B0=D1=83?= =?UTF-8?q?=D0=BD=D1=87=D0=B5=D1=80=D0=BE=D0=B2.=20=D0=9E=D0=B1=D0=BD?= =?UTF-8?q?=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BE=D0=B1=D0=BB=D0=BE?= =?UTF-8?q?=D0=B6=D0=BA=D0=B0=20Lesta=20Game=20Center.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data_from_portwine/img/gui/lgc.png | Bin 494 -> 1571 bytes .../scripts/pw_autoinstall/PW_ANKAMA | 4 ++-- .../pw_autoinstall/PW_ARIZONA_GAMES_LAUNCHER | 4 ++-- .../scripts/pw_autoinstall/PW_BATTLE_NET | 4 ++-- .../scripts/pw_autoinstall/PW_EAAPP | 4 ++-- .../scripts/pw_autoinstall/PW_EPIC | 4 ++-- .../scripts/pw_autoinstall/PW_EVE | 4 ++-- .../scripts/pw_autoinstall/PW_GAMEFORGE | 4 ++-- .../scripts/pw_autoinstall/PW_GAME_XP | 4 ++-- .../scripts/pw_autoinstall/PW_GOG | 4 ++-- .../scripts/pw_autoinstall/PW_HO_YO_PLAY | 4 ++-- .../scripts/pw_autoinstall/PW_ITCH | 4 ++-- .../scripts/pw_autoinstall/PW_LGC | 2 +- .../scripts/pw_autoinstall/PW_PLARIUM_PLAY | 4 ++-- .../scripts/pw_autoinstall/PW_ROCKSTAR | 4 ++-- .../scripts/pw_autoinstall/PW_STEAM | 6 +++--- .../scripts/pw_autoinstall/PW_UBISOFT | 4 ++-- .../scripts/pw_autoinstall/PW_VKPLAY | 4 ++-- .../scripts/pw_autoinstall/PW_W3D_HUB | 4 ++-- .../scripts/pw_autoinstall/PW_WGC | 4 ++-- 20 files changed, 38 insertions(+), 38 deletions(-) mode change 100755 => 100644 data_from_portwine/img/gui/lgc.png diff --git a/data_from_portwine/img/gui/lgc.png b/data_from_portwine/img/gui/lgc.png old mode 100755 new mode 100644 index d6f635769932a8acea48c0c460920424396d1fc2..9a0f97dfcd8477efd83c5da0daba0d9b8928ced0 GIT binary patch delta 1555 zcmV+u2JHFn1EUO(BYy#ZX+uL$Nkc;*aB^>EX>4Tx04R}tkv&L4Q5c4wdo2o68j^@; zxI;DN(jP%fSs;OdSbs~8v0qX8d{obZD?< zz+Q~afE)mnbOUP*tgqW9$fH2NVOj>r@hTgFHwBy7qF#Ha*wD9TEiDKg=p)P=^F&e5 zD3T#dfgl+y6n`9Igb6kA_g4H-ifClXprbHL4imNFNBqI>Y@O7|aCMR|1g+1m`#u0| zJMdj{-LE6p{XPcI6I@z#f36G@AK)p~wf;ls+=BC~x~A>I#WwUj=2cs*NFG2=rQq!p z{0Zo~0q=4(x7s}?_prDLk!#pLfWb6$t~A-Zy)n0cdw**A{Qw}>a_ld`T>bz6010qN zS#tmYE+YT{E+YYWr9XB6000McNliru=nEDL0wUjH#+m>C02y>eSad^gZEa<4bO1wg zWnpw>WFU8GbZ8()Nlj2!fese{00a_AL_t(&-p!g#ZyQw6c$+kP1?F?O6{4shsBJ) z;;}tr&y0PgD@)^tOC7@He8zm^@%#I)9S^?3tppP+kXa0M{^ffK9-o+Gaoq zv=RP5xQp=v5r;UQ@}(FsG^=~2z&64z%6kY`aXb&yv6PjnZY3@uyohoI#~UbL#c^zAS}*+RIE z$A1aJA@Ez`S?m(n4V0@1Wu_09rI*nhAhZzP0=te;?*Z7x>>V6iGhZ$-@1}JR&@w?d zdj+#=IM?*~)anFmW9(q8XBi`uWz$NUzz$w?Q318L>4-Y30v}mSa_S*H^57$Q*L2P$pE?;`COH-7g~Yg0Dm@O zKvbQu3#~K^)2T3FR|#MkL|5{=*i>P==?_&~>&Y0gm%0Lrwjj!fIyZo|8DdWJK3RDk zL{Rh2jiF`70gJQES;kuik2Y-lR>pX+P`OYg`^-y*N$8Ey1lm@i1{R@>bFug7j}gJC zRVd>Ai-Y+%uR1hFm{^n}o$%)^lz)xQdM$r69TBWc@+m2KPaI|lVwN!l84;|^SNYI+ zSD;YAy7|jC^J^e1P_R<9 zHNPC=^8s*Rnj%=4oOP;zd@{JU37lE6byh!Nba$|i%3fB?tD7^gAmighlz$K*P$Ie* zZQ?_-XyOZG;ghZ+TL?VHXe+m*i|`L{58+uB9f+IVOFL$Y1KuOx9*ze+FZ3_M&nU;U zX4)jy!mM7}d4d3He`4+cac2pD?g$)v`}!B#BnBJ%9Hx`yO-OVS2>pUNmr{u6~B_BRKHn1mR7@Uc#iY%yr;jg-we~fl@MSZpDSSRg1wFD%Sq1VEy4HzXak490TDmZu_M0HV6t=k z$OIoBwda5qPA&tjB;&V=>C;7c2pr>hLd1W3AtUkXf4Cl~2)IC*3Jd@M002ovPDHLk FV1j-h$8-Py delta 469 zcmV;`0V@8Z4DJJvBYyx1a7bBm000id000id0mpBsWB>pF8FWQhbW?9;ba!ELWdL_~ zcP?peYja~^aAhuUa%Y?FJQ@H10eeYAK~!jg?b=T(L{S*W@$Yko5He+KC<|q0XS@St zWwP=f>{wVRn$Xl_F;@P(3#BaB+F_?`6pM+mxM~tc86FF=nt$Znd>ye75Iy&hJ;} zZq7NPssIeF+|Q`!Jdg#t`JbMEQ&Bc=)-(G6qN)t#!wppyjl((8;_ceNk_;|~Gb*}g z9VZGAa>3WOX-&#P0E}Dbh)N+F06o@0V(4vi`MR@R80k+n9IL%5*Y|IUq;la@U^J8B za4y|&?7UKEYJaDiNGKP<_lQ!1+4i3)_ehLzJN7fz?v^$%@?rd z3t007tT~;H{$x0vVt2MT_B@57XUf&z9}*{4ps!2FjdjGHXY05|+2M@1<+qS8V6Ei~ zIQ_(z;Tx0N&Ao-Wa=fN;D)92ET-?>27HGBrc(e`?!%jm0oLQ%cO5iLIWz#xHRPRD5 z_ Date: Sat, 23 Nov 2024 16:31:28 +0300 Subject: [PATCH 17/48] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BD=D0=BE=D0=B2=D1=8B=D1=85=20?= =?UTF-8?q?=D0=B2=D1=81=D0=BF=D0=BB=D1=8B=D0=B2=D0=B0=D1=88=D0=B5=D0=BA.?= =?UTF-8?q?=20=D0=A1=D0=BD=D0=BE=D0=B2=D0=B0=20=D0=BE=D0=B1=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BB=D0=BE=D0=B3=D0=BE?= =?UTF-8?q?=D1=82=D0=B8=D0=BF=D0=B0=20Lesta=20Game=20Center.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data_from_portwine/img/gui/lgc.png | Bin 1571 -> 5314 bytes .../pw_autoinstall/PW_AGE_OF_EMPIRES_ONLINE | 4 ++-- .../scripts/pw_autoinstall/PW_ALBION_ONLINE | 4 ++-- .../scripts/pw_autoinstall/PW_ANOMALY_ZONE | 4 ++-- .../pw_autoinstall/PW_BLACK_DESERT_ONLINE | 4 ++-- .../scripts/pw_autoinstall/PW_BLOOD_AND_SOUL | 4 ++-- .../scripts/pw_autoinstall/PW_BROKEN_RANKS | 4 ++-- .../scripts/pw_autoinstall/PW_BSR | 4 ++-- .../scripts/pw_autoinstall/PW_CALIBER | 4 ++-- .../scripts/pw_autoinstall/PW_CEMU | 4 ++-- .../PW_CHICKEN_INVADERS_UNIVERSE | 4 ++-- .../scripts/pw_autoinstall/PW_CONTRACT_WARS | 4 ++-- .../scripts/pw_autoinstall/PW_CROSSOUT | 4 ++-- .../pw_autoinstall/PW_DC_UNIVERSE_ONLINE | 4 ++-- .../scripts/pw_autoinstall/PW_DEMUL | 4 ++-- .../scripts/pw_autoinstall/PW_DOLPHIN | 4 ++-- .../scripts/pw_autoinstall/PW_DOOMSDAY | 4 ++-- .../scripts/pw_autoinstall/PW_ELDEVIN | 4 ++-- .../scripts/pw_autoinstall/PW_ELSWORD | 4 ++-- .../scripts/pw_autoinstall/PW_EPSXE | 4 ++-- .../scripts/pw_autoinstall/PW_EVE | 4 ++-- .../scripts/pw_autoinstall/PW_EXOTANKS | 4 ++-- .../scripts/pw_autoinstall/PW_FARLIGHT84 | 4 ++-- .../scripts/pw_autoinstall/PW_FCEUX | 4 ++-- .../pw_autoinstall/PW_GOOSE_GOOSE_DUCK | 4 ++-- .../scripts/pw_autoinstall/PW_GUILD_WARS_2 | 4 ++-- .../scripts/pw_autoinstall/PW_IGCLIENT | 4 ++-- .../scripts/pw_autoinstall/PW_LOST_LIGHT | 4 ++-- .../scripts/pw_autoinstall/PW_MAME | 4 ++-- .../pw_autoinstall/PW_METAL_WAR_ONLINE | 4 ++-- .../scripts/pw_autoinstall/PW_MINI_WORLD | 4 ++-- .../scripts/pw_autoinstall/PW_MODERN_WARSHIPS | 4 ++-- 32 files changed, 62 insertions(+), 62 deletions(-) diff --git a/data_from_portwine/img/gui/lgc.png b/data_from_portwine/img/gui/lgc.png index 9a0f97dfcd8477efd83c5da0daba0d9b8928ced0..367e5c698b52d05c0d964b26fb6645b94352469c 100644 GIT binary patch literal 5314 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 delta 1490 zcmV;@1ugo*DWeRKB!7QtLqkwWLqi~Na&Km7Y-IodD3N`UJxD@P7>1vFEecZ_l89)y zLp9~nA3;l5Ac28cfm%cNCr$8Po5S_a7RDjR|~1)JHTUVEq5(6?qSEeIXxBg`E0L{ZQv zk|9fhAQ>za9Dibj2{rNeR{T+lXk^KtqcBSj6Sd+;{K4;Roz%#1b&@Xxtn{9zaf|;O!Lr z3Fx{3?{YP_+C3-tu(%14YuG=4!8CNPG}*hoF}HtvY76=O03g?L>@UGw{*z1)AqNWr zBHv=hnv--8D1Q=3L_t(&-p!g#ZyQwtOC7@He8zm^@%#I+FqHnWD5%UI%Uf*D!W~O~9ktWyhd7?{ zr5G?Yt9z!vHo`8-dk9x?JP*{dl$EM(B`zVnh;jwT8z^7nxC1;M0Qk@ZVGCs!<$d5a z9CeIUXn!6?14jel0)mf+uxGb1x-oz{8z`@$?5>#c^zAS}*+RIE#|gqA@LS?p>=M`w zl&cA4rVp5I7_K z>|m^C86%Ws(@L7a4qkLo38(>0gpDM8Oh&#sO@9$-VA@b36vKxZkycj7d`Uo{zMtzM z8vwDJ$*+OPWWD$Pl8?(;iu}k&3=#on({Fb+0K8lP=X`SygvxZ!sREHJ2ZYYe!RXvd z%nGL()2(O_x{#29eEgPk`dJD98Gf=ht_d;*;-WxkUhb#4tu@O>r=Is317Q`efZZGz z(0@(QL>4-Y30v}mSa_S*H^57$Q*L2P$pE?;`COH-7g~Yg05)PkRGqL3tuzeNsW4$z z31ApRSMs~qRAIa64^><1$r!Phx&n)~Aj*e2H-NPnVoviuS$Q2qQ1i}>p=HMbi?hvH z##;uDHf;P>#(1z$xlkqh%u9wz=#9|?+J9D|1{R@>bFug7j}gJCRVd>Ai-Y+%uR1hF zm{^n}o$%)^l#R`LEq^o}5v)t{DJgkR9A*e&mN5kx5v$)v`}! zB#BnBJ@+yD9&_Jedc@~mG;pJ?eunTPIPl~I;Z4L|!lbd}y>kRS0{+4{!0cPRr@ye@ z4AZ`q5MUjjD`4+}y^ZP1NzUah!T11Z1Bbu?5kJwfBfipLvUB{%1Ro!@=P!U3PA&tj sB;&V=>C;7c2pr>hLd1W3AtUkXf4Cl~2)IC*3IG5A07*qoM6N<$g3kQ6xBvhE diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_AGE_OF_EMPIRES_ONLINE b/data_from_portwine/scripts/pw_autoinstall/PW_AGE_OF_EMPIRES_ONLINE index 80bb53b1..9f13bd8f 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_AGE_OF_EMPIRES_ONLINE +++ b/data_from_portwine/scripts/pw_autoinstall/PW_AGE_OF_EMPIRES_ONLINE @@ -3,8 +3,8 @@ # type: games # name: Age of Empires Online # image: celeste -# info_en: -# info_ru: +# info_en: A multiplayer real-time strategy game where players build their civilizations, gather resources, and battle against opponents. The game features a unique economic system and the ability to develop cities through various missions and quests. +# info_ru: Многопользовательская стратегия в реальном времени, где игроки строят свои цивилизации, собирают ресурсы и сражаются с противниками. Игра предлагает уникальную экономическую систему и возможность развивать свои города с помощью различных миссий и задач. ######################################################################## export PW_PREFIX_NAME="AGE_OF_EMPIRES_ONLINE" export LAUNCH_PARAMETERS="/VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_ALBION_ONLINE b/data_from_portwine/scripts/pw_autoinstall/PW_ALBION_ONLINE index abfbe965..1a33b1e4 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_ALBION_ONLINE +++ b/data_from_portwine/scripts/pw_autoinstall/PW_ALBION_ONLINE @@ -3,8 +3,8 @@ # type: games # name: Albion Online # image: albiononline -# info_en: -# info_ru: +# info_en: A multiplayer sandbox MMORPG where players can explore an open world, engage in crafting, gather resources, and battle against other players. The game features a unique class system that allows players to change their roles based on the gear they equip. +# info_ru: Многопользовательская песочница в жанре MMORPG, где игроки могут исследовать открытый мир, заниматься ремеслом, добычей ресурсов и сражаться с другими игроками. Игра предлагает уникальную систему классов, позволяющую игрокам изменять свои роли в зависимости от выбранного снаряжения. ######################################################################## export PW_PREFIX_NAME="ALBION_ONLINE" export LAUNCH_PARAMETERS="/S" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_ANOMALY_ZONE b/data_from_portwine/scripts/pw_autoinstall/PW_ANOMALY_ZONE index 6c9b46ba..f04e5f26 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_ANOMALY_ZONE +++ b/data_from_portwine/scripts/pw_autoinstall/PW_ANOMALY_ZONE @@ -3,8 +3,8 @@ # type: games # name: Anomaly Zone # image: anomalyzone -# info_en: -# info_ru: +# info_en: An action game about stalkers, where players explore mysterious worlds and fight against a variety of opponents. The game offers an exciting storyline and the opportunity to improve the character by unlocking new abilities and equipment. +# info_ru: Экшен-игра про сталкеров, где игроки исследуют таинственные миры и сражаются с разнообразными противниками. Игра предлагает захватывающий сюжет и возможность улучшать персонажа, открывая новые способности и снаряжение. ######################################################################## export LAUNCH_PARAMETERS="/VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-" export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/az_webinst.exe" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_BLACK_DESERT_ONLINE b/data_from_portwine/scripts/pw_autoinstall/PW_BLACK_DESERT_ONLINE index 0d1949e2..f12c5c75 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_BLACK_DESERT_ONLINE +++ b/data_from_portwine/scripts/pw_autoinstall/PW_BLACK_DESERT_ONLINE @@ -3,8 +3,8 @@ # type: games # name: Black Desert Online (RU) # image: bdo -# info_en: -# info_ru: +# info_en: A massively multiplayer online role-playing game set in an open world, renowned for its stunning graphics and deep character customization system. Players can explore vast lands, complete quests, engage in PvP battles, and participate in various crafting activities. +# info_ru: Многопользовательская ролевая игра с открытым миром, известная своей потрясающей графикой и глубокой системой кастомизации персонажей. Игроки могут исследовать обширные земли, выполнять задания, участвовать в PvP-сражениях и заниматься различными ремеслами. ######################################################################## export PW_PREFIX_NAME="BLACK_DESERT_ONLINE" export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/BlackDesert_Installer_RU.exe" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_BLOOD_AND_SOUL b/data_from_portwine/scripts/pw_autoinstall/PW_BLOOD_AND_SOUL index b51e5e39..c1cae9a1 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_BLOOD_AND_SOUL +++ b/data_from_portwine/scripts/pw_autoinstall/PW_BLOOD_AND_SOUL @@ -3,8 +3,8 @@ # type: games # name: Blood and Soul # image: bloodandsoul -# info_en: -# info_ru: +# info_en: A multiplayer role-playing game featuring a rich combat system and vibrant graphics, inspired by Eastern mythology. Players can choose from various classes, explore unique locations, and battle powerful foes. +# info_ru: Многопользовательская ролевая игра с богатой системой боя и яркой графикой, вдохновленная восточной мифологией. Игроки могут выбирать из различных классов, исследовать уникальные локации и сражаться с могущественными врагами. ######################################################################## export PW_PREFIX_NAME="BLOOD_AND_SOUL" export LAUNCH_PARAMETERS="/VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_BROKEN_RANKS b/data_from_portwine/scripts/pw_autoinstall/PW_BROKEN_RANKS index 9360ddac..8ed01535 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_BROKEN_RANKS +++ b/data_from_portwine/scripts/pw_autoinstall/PW_BROKEN_RANKS @@ -3,8 +3,8 @@ # type: games # name: Broken Ranks (ENG) # image: brokenranks -# info_en: -# info_ru: +# info_en: An MMORPG game offering deep sleep and a unique combat system that focuses on the strategy and activities of the person. Players explore a dark world full of intrigue and danger, developing their characters and making key decisions that affect the course of history. +# info_ru: MMORPG игра, предлагающая глубокий сон и уникальную боевую систему, которая ориентирует внимание на стратегию и деятельность персоны. Игроки исследуют мрачный мир, полный интриг и опасностей, развивая своих героев и принимая ключевые решения, влияющие на ход истории. ######################################################################## export PW_PREFIX_NAME="BROKEN_RANKS" export LAUNCH_PARAMETERS="/q" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_BSR b/data_from_portwine/scripts/pw_autoinstall/PW_BSR index 4faba8ce..dd51ee95 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_BSR +++ b/data_from_portwine/scripts/pw_autoinstall/PW_BSR @@ -3,8 +3,8 @@ # type: games # name: Battle Of Space Raiders # image: bsr -# info_en: -# info_ru: +# info_en: An exciting space shooter game where players fight against alien invaders using a variety of ships and powerful weapons. Players will explore vast cosmic expanses, completing missions and battling enemies to save the galaxy from danger. +# info_ru: Захватывающая игра в жанре космического шутера, где игроки сражаются против инопланетных захватчиков, используя разнообразные корабли и мощное оружие. Игрокам предстоит исследовать бескрайние космические просторы, выполняя миссии и сражаясь с врагами, чтобы спасти галактику от угрозы. ######################################################################## export LAUNCH_PARAMETERS="/VERYSILENT /SUPPRESSMSGBOXES" export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/bsr_setup.exe" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_CALIBER b/data_from_portwine/scripts/pw_autoinstall/PW_CALIBER index 140ff624..cc42d863 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_CALIBER +++ b/data_from_portwine/scripts/pw_autoinstall/PW_CALIBER @@ -3,8 +3,8 @@ # type: games # name: CALIBER # image: caliber -# info_en: -# info_ru: +# info_en: A tactical third-person shooter where players can choose from various characters with unique abilities and engage in team-based modes. The game features realistic graphics and dynamic combat, providing an engaging gameplay experience. +# info_ru: Тактический шутер от третьего лица, где игроки могут выбирать из различных персонажей с уникальными способностями и сражаться в командных режимах. Игра предлагает реалистичную графику и динамичные бои, обеспечивая увлекательный игровой процесс. ######################################################################## export PW_PREFIX_NAME="CALIBER" export LAUNCH_PARAMETERS="/VERYSILENT /CLOSEAPPLICATIONS" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_CEMU b/data_from_portwine/scripts/pw_autoinstall/PW_CEMU index 51919ca7..539c2152 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_CEMU +++ b/data_from_portwine/scripts/pw_autoinstall/PW_CEMU @@ -3,8 +3,8 @@ # type: emulators # name: Cemu # image: cemu -# info_en: -# info_ru: +# info_en: A Wii U emulator that allows users to launch and play games released on this console with high performance and enhanced graphics. +# info_ru: Эмулятор Wii U, который позволяет пользователям запускать и играть в игры, выпущенные на этой консоли, с высокой производительностью и улучшенной графикой. ######################################################################## export PW_URL_CEMU=$(curl -s "https://api.github.com/repos/cemu-project/Cemu/releases" | grep -iEo 'https.*download.*' | grep "windows" | head -n1) export PW_CEMU_NAME=Cemu_$(echo "$PW_URL_CEMU" | awk -F"-" '{print $3}') diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_CHICKEN_INVADERS_UNIVERSE b/data_from_portwine/scripts/pw_autoinstall/PW_CHICKEN_INVADERS_UNIVERSE index fbe10442..b2e2d129 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_CHICKEN_INVADERS_UNIVERSE +++ b/data_from_portwine/scripts/pw_autoinstall/PW_CHICKEN_INVADERS_UNIVERSE @@ -3,8 +3,8 @@ # type: games # name: Chicken Invaders Universe # image: chickeninvadersuniverse -# info_en: -# info_ru: +# info_en: An exciting arcade game where players battle aggressive space chickens to defend their planet. The game features multiple levels, a cooperative mode, and the ability to upgrade their spaceship. +# info_ru: Захватывающая аркадная игра, в которой игроки сражаются с агрессивными курицами из космоса, защищая свою планету. Игра предлагает множество уровней, кооперативный режим и возможность улучшения космического корабля. ######################################################################## export PW_PREFIX_NAME="CHICKEN_INVADERS_UNIVERSE" export LAUNCH_PARAMETERS="/VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_CONTRACT_WARS b/data_from_portwine/scripts/pw_autoinstall/PW_CONTRACT_WARS index 051b918d..04380bd0 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_CONTRACT_WARS +++ b/data_from_portwine/scripts/pw_autoinstall/PW_CONTRACT_WARS @@ -3,8 +3,8 @@ # type: games # name: CONTRACT WARS # image: cwc -# info_en: -# info_ru: +# info_en: A multiplayer first-person shooter where players engage in battles between two teams on various maps. The game offers a wide selection of weapons and character customization options, making each match unique. +# info_ru: Многопользовательский шутер от первого лица, где игроки участвуют в противостоянии между двумя командами на разнообразных картах. Игра предлагает широкий выбор оружия и возможностей для настройки персонажей, что делает каждый матч уникальным. ######################################################################## export LAUNCH_PARAMETERS="/VERYSILENT" export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/CWClient_Install.exe" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_CROSSOUT b/data_from_portwine/scripts/pw_autoinstall/PW_CROSSOUT index 81ce58d8..ffd78202 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_CROSSOUT +++ b/data_from_portwine/scripts/pw_autoinstall/PW_CROSSOUT @@ -3,8 +3,8 @@ # type: games # name: Crossout # image: crossout -# info_en: -# info_ru: +# info_en: A multiplayer game featuring post-apocalyptic vehicle combat, where players build unique battle machines and fight against each other on open arenas. The game offers various battle modes and a rich customization system, allowing each player to express their individuality on the battlefield. +# info_ru: Многопользовательская игра с элементами постапокалиптического десанта, где игроки создают уникальные боевые машины и сражаются друг с другом на открытых аренах. Игра предлагает разнообразные режимы боя и богатую систему кастомизации, позволяя каждому выражать свою индивидуальность на поле боя. ######################################################################## export LAUNCH_PARAMETERS="/VERYSILENT" export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/crossout.exe" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_DC_UNIVERSE_ONLINE b/data_from_portwine/scripts/pw_autoinstall/PW_DC_UNIVERSE_ONLINE index ac3a3eb6..c7c86409 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_DC_UNIVERSE_ONLINE +++ b/data_from_portwine/scripts/pw_autoinstall/PW_DC_UNIVERSE_ONLINE @@ -3,8 +3,8 @@ # type: games # name: DC Universe Online (ENG) # image: dcuniverseonline -# info_en: -# info_ru: +# info_en: An MMORPG where players create their own superheroes or supervillains in the DC Comics universe and engage in epic battles alongside iconic characters like Superman and Batman. The game features extensive quests, exciting PvP modes, and the ability to team up with other players. +# info_ru: MMORPG, в которой игроки создают собственных супергероев или суперзлодеев во вселенной DC Comics и участвуют в эпических битвах с известными персонажами, такими как Супермен и Бэтмен. Игра предлагает обширные квесты, захватывающие PvP-режимы и возможность совместной игры с другими игроками. ######################################################################## export PW_PREFIX_NAME="DC_UNIVERSE_ONLINE" export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/DCUO_setup.exe" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_DEMUL b/data_from_portwine/scripts/pw_autoinstall/PW_DEMUL index 0ad2cc59..23c629a3 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_DEMUL +++ b/data_from_portwine/scripts/pw_autoinstall/PW_DEMUL @@ -3,8 +3,8 @@ # type: emulators # name: Demul # image: demul -# info_en: -# info_ru: +# info_en: An arcade game emulator that allows users to play classic games from the Sega NAOMI and Sega Atomiswave systems on their PCs. It delivers high-quality graphics and sound, along with numerous features, including online multiplayer support. +# info_ru: Эмулятор аркадных игровых автоматов, позволяющий играть в классические игры на системах Sega NAOMI и Sega Atomiswave на ПК. Он обеспечивает высокое качество графики и звука, а также поддерживает множество функций, включая сетевой режим. ######################################################################## export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/demul07_280418.7z" start_portwine diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_DOLPHIN b/data_from_portwine/scripts/pw_autoinstall/PW_DOLPHIN index 4b5e2b25..0faf992d 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_DOLPHIN +++ b/data_from_portwine/scripts/pw_autoinstall/PW_DOLPHIN @@ -3,8 +3,8 @@ # type: emulators # name: Dolphin 5.0 # image: dolphin -# info_en: -# info_ru: +# info_en: A powerful emulator for Nintendo GameCube and Wii consoles that allows users to play games on their PCs with enhanced graphics and performance. It supports a wide range of features, including HD resolution, numerous control configurations, and the ability to use modifications. +# info_ru: Можный эмулятор для игровых консолей Nintendo GameCube и Wii, который позволяет запускать игры на ПК с улучшенной графикой и производительностью. Он поддерживает широкий спектр функций, включая HD-разрешение, множество настройек управления и возможность использования модификаций. ########################################################################## export LAUNCH_PARAMETERS="/S" export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/dolphin-x64-5.0.exe" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_DOOMSDAY b/data_from_portwine/scripts/pw_autoinstall/PW_DOOMSDAY index f75c1bea..7db223d3 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_DOOMSDAY +++ b/data_from_portwine/scripts/pw_autoinstall/PW_DOOMSDAY @@ -3,8 +3,8 @@ # type: games # name: Doomsday # image: doomsday -# info_en: -# info_ru: +# info_en: A real-time strategy game where players manage a group of survivors in a post-apocalyptic world, aiming to rebuild civilization and defend against various threats. The game features base-building elements, tactical combat, and a deep narrative experience. +# info_ru: Стратегическая игра в реальном времени, где игроки управляют отрядом выживших в постапокалиптическом мире, стремясь восстановить цивилизацию и защититься от различных угроз. Игра предлагает элементы строительства базы, тактические сражения и глубокую проработку сюжета. ######################################################################## export PW_PREFIX_NAME="DOOMSDAY" export LAUNCH_PARAMETERS="/VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_ELDEVIN b/data_from_portwine/scripts/pw_autoinstall/PW_ELDEVIN index dde96a9f..8dbb7008 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_ELDEVIN +++ b/data_from_portwine/scripts/pw_autoinstall/PW_ELDEVIN @@ -3,8 +3,8 @@ # type: games # name: Eldevin (ENG) # image: eldevin -# info_en: -# info_ru: +# info_en: An MMORPG with vibrant graphics where players explore a vast fantasy world, complete quests, and battle enemies to develop their characters. The game features diverse classes and skills, as well as crafting and group interaction systems. +# info_ru: MMORPG с красочной графикой, где игроки исследуют обширный фэнтезийный мир, выполняют квесты и сражаются с врагами, чтобы развивать свои персонажи. Игра предлагает разнообразные классы и навыки, а также системы крафта и группового взаимодействия. ######################################################################## export PW_PREFIX_NAME="ELDEVIN" export LAUNCH_PARAMETERS="/S" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_ELSWORD b/data_from_portwine/scripts/pw_autoinstall/PW_ELSWORD index 76fd6c9b..d7a9334e 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_ELSWORD +++ b/data_from_portwine/scripts/pw_autoinstall/PW_ELSWORD @@ -3,8 +3,8 @@ # type: games # name: Elsword (ENG) # image: elsword -# info_en: -# info_ru: +# info_en: An anime-style MMORPG that combines elements of a platformer and a real-time combat system, allowing players to fight in exciting dungeons and PvP arenas. The game offers a variety of characters with unique skills, as well as opportunities for customization and playing together with friends. +# info_ru: MMORPG c аниме-стилем, которая сочетает в себе элементы платформера и боевой системы в реальном времени, позволяя игрокам сражаться в захватывающих подземельях и PvP-аренах. Игра предлагает множество персонажей с уникальными навыками, а также возможности для кастомизации и совместной игры с друзьями. ######################################################################## export PW_WINE_USE="WINE_LG" export PW_PREFIX_NAME="ELSWORD" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_EPSXE b/data_from_portwine/scripts/pw_autoinstall/PW_EPSXE index a0fc6543..3c1e6b54 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_EPSXE +++ b/data_from_portwine/scripts/pw_autoinstall/PW_EPSXE @@ -3,8 +3,8 @@ # type: emulators # name: ePSXe # image: epsxe -# info_en: -# info_ru: +# info_en: An emulator for the PlayStation console that allows users to play PS1 games on their PCs, providing excellent graphics and compatibility with most games. It supports various plugins to enhance sound and video, as well as features for saving and loading games at any moment. +# info_ru: Эмулятор для консоли PlayStation, который позволяет пользователям играть в игры для PS1 на ПК, обеспечивая отличную графику и совместимость с большинством игр. Он поддерживает различные плагины для улучшения звука и видео, а также функции сохранения и загрузки игр в любой момент. ######################################################################## export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/ePSXe205.zip" start_portwine diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_EVE b/data_from_portwine/scripts/pw_autoinstall/PW_EVE index 784e186a..082d199b 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_EVE +++ b/data_from_portwine/scripts/pw_autoinstall/PW_EVE @@ -3,8 +3,8 @@ # type: games # name: EVE Online Launcher # image: eve -# info_en: Launcher for the EVE Online game. -# info_ru: Лаунчер для игры EVE Online. +# info_en: Launcher for the EVE Online game. A vast multiplayer online game where players explore an endless cosmos, engage in trading, manufacturing, and combat with other players in a unique sandbox environment. The game is known for its complex economy, political intrigue, and the ability to form alliances among players to conquer galactic territories. +# info_ru: Лаунчер для игры EVE Online. Масштабная многопользовательская онлайн-игра, в которой игроки исследуют бескрайний космос, занимаются торговлей, производством и ведением космических боев с другими игроками в уникальной песочнице. Игра известна своей сложной экономикой, политическими интригами и возможностью создания альянсов между игроками для завоевания галактических территорий. ######################################################################## export PW_WINDOWS_VER="10" export PW_WINE_USE="WINE_LG" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_EXOTANKS b/data_from_portwine/scripts/pw_autoinstall/PW_EXOTANKS index 019cd9b9..404041ac 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_EXOTANKS +++ b/data_from_portwine/scripts/pw_autoinstall/PW_EXOTANKS @@ -3,8 +3,8 @@ # type: games # name: ExoTanks # image: exotanks -# info_en: -# info_ru: +# info_en: A multiplayer battle game where players control exoskeletons and fight in various arenas using powerful weapons and strategic gameplay. The game offers both team and solo modes, along with the ability to customize their exoskeleton for a unique playing style. +# info_ru: Многопользовательская боевая игра, в которой игроки управляют экзоскелетами и сражаются в различных аренах, используя мощное вооружение и стратегический подход. Игра предлагает как командные, так и одиночные режимы, а также возможность кастомизации своего экзоскелета для уникального стиля игры. ######################################################################## export PW_PREFIX_NAME="EXOTANKS" export LAUNCH_PARAMETERS="/VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_FARLIGHT84 b/data_from_portwine/scripts/pw_autoinstall/PW_FARLIGHT84 index 84c21eed..ff8b7cb5 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_FARLIGHT84 +++ b/data_from_portwine/scripts/pw_autoinstall/PW_FARLIGHT84 @@ -3,8 +3,8 @@ # type: games # name: Farlight 84 # image: farlight84 -# info_en: -# info_ru: +# info_en: A multiplayer battle royale game set in a colorful and futuristic world where players fight against each other using unique skills and weapons. The game features exciting gameplay with building elements, as well as the ability to utilize various vehicles to navigate the map. +# info_ru: Многопользовательская игра в жанре королевская битва, которая проходит в красочном и футуристическом мире, где игроки сражаются друг с другом с использованием уникальных навыков и оружия. Игра предлагает захватывающий геймплей с элементами строительства, а также возможность использовать различные транспортные средства для перемещения по карте. ######################################################################## export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/Farlight84_setup_1.3.0.1_238.exe" export PORTWINE_CREATE_SHORTCUT_NAME="Farlight 84" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_FCEUX b/data_from_portwine/scripts/pw_autoinstall/PW_FCEUX index ff7d72db..42c678e0 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_FCEUX +++ b/data_from_portwine/scripts/pw_autoinstall/PW_FCEUX @@ -3,8 +3,8 @@ # type: emulators # name: FCEUX # image: fceux -# info_en: -# info_ru: +# info_en: An emulator for the Nintendo Entertainment System (NES) that allows players to enjoy classic NES games on modern devices with high compatibility and various enhancements. The emulator includes tools for game development, testing, and recording. +# info_ru: Эмулятор Nintendo Entertainment System (NES), который позволяет игрокам наслаждаться классическими играми для NES на современных устройствах с высокой совместимостью и различными улучшениями. Эмулятор включает инструменты для разработки, тестирования и записи игр. ######################################################################## export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/fceux-2.6.5-win64.zip" start_portwine diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_GOOSE_GOOSE_DUCK b/data_from_portwine/scripts/pw_autoinstall/PW_GOOSE_GOOSE_DUCK index b4d6fd28..93100f77 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_GOOSE_GOOSE_DUCK +++ b/data_from_portwine/scripts/pw_autoinstall/PW_GOOSE_GOOSE_DUCK @@ -3,8 +3,8 @@ # type: games # name: Goose Goose Duck # image: goosegooseduck -# info_en: -# info_ru: +# info_en: A multiplayer social deduction game where players take on the roles of ducks or geese, trying to complete tasks and identify the "ducks" — the impostors among them. The game combines elements of strategy and communication, requiring players to coordinate and recognize deception. +# info_ru: Многопользовательская игра в жанре социальной дедукции, где игроки выступают в роли уток или гусей, пытаясь выполнить задания и выявить среди них "уток" — предателей. Игра сочетает в себе элементы стратегии и общения, требуя от игроков координации и способности распознавать обман. ######################################################################## VERSION="3.11.00" export PW_PREFIX_NAME="GOOSE_GOOSE_DUCK" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_GUILD_WARS_2 b/data_from_portwine/scripts/pw_autoinstall/PW_GUILD_WARS_2 index 1fa35518..455e74c6 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_GUILD_WARS_2 +++ b/data_from_portwine/scripts/pw_autoinstall/PW_GUILD_WARS_2 @@ -3,8 +3,8 @@ # type: games # name: Guild Wars 2 # image: gw2 -# info_en: -# info_ru: +# info_en: An MMORPG with a vibrant world and a unique system of dynamic events, where players can freely explore the realms of Tyria and engage in large-scale battles. The game offers a variety of races and classes, with an emphasis on cooperative play and player interaction. +# info_ru: MMORPG с ярким миром и уникальной системой динамических событий, где игроки могут свободно исследовать просторы Тираи и участвовать в масштабных сражениях. Игра предлагает разнообразие рас и классов, а также акцент на совместной игре и взаимодействии между игроками. ######################################################################## export LAUNCH_PARAMETERS="/VERYSILENT" export PW_PREFIX_NAME="GW2" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_IGCLIENT b/data_from_portwine/scripts/pw_autoinstall/PW_IGCLIENT index a95b0bb2..db74862e 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_IGCLIENT +++ b/data_from_portwine/scripts/pw_autoinstall/PW_IGCLIENT @@ -3,8 +3,8 @@ # type: games # name: Indiegala Client # image: igclient -# info_en: -# info_ru: +# info_en: Launcher for the Indiegala game library. +# info_ru: Лаунчер для библиотеки игр Indiegala. ######################################################################## export LAUNCH_PARAMETERS="/S" export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/igclient_setup.exe" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_LOST_LIGHT b/data_from_portwine/scripts/pw_autoinstall/PW_LOST_LIGHT index eed0d8e4..4572bf14 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_LOST_LIGHT +++ b/data_from_portwine/scripts/pw_autoinstall/PW_LOST_LIGHT @@ -3,8 +3,8 @@ # type: games # name: Lost Light # image: lostlight -# info_en: -# info_ru: +# info_en: A multiplayer first-person shooter with survival elements, where players explore a post-apocalyptic world and fight for resources. Players must team up to overcome dangers and complete missions, while constantly feeling the tension from potential encounters with other groups. +# info_ru: Многопользовательская игра в жанре шутера от первого лица с элементами выживания, где игроки исследуют постапокалиптический мир и сражаются за ресурсы. Игроки должны объединяться в команды, чтобы преодолевать опасности и выполнять миссии, при этом постоянно испытывая напряжение от возможных столкновений с другими группами. ######################################################################## export PW_PREFIX_NAME="LOST_LIGHT" export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/LostLight_installer.exe" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_MAME b/data_from_portwine/scripts/pw_autoinstall/PW_MAME index 5e452185..35ff0bbf 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_MAME +++ b/data_from_portwine/scripts/pw_autoinstall/PW_MAME @@ -3,8 +3,8 @@ # type: emulators # name: MAME # image: mame -# info_en: -# info_ru: +# info_en: An arcade game emulator that allows classic games to run on modern computers and devices. It supports a wide variety of arcade systems and helps preserve the history of video games by providing access to large collections of retro games. +# info_ru: Эмулятор аркадных игр, позволяющий запускать классические игры на современных компьютерах и устройствах. Он поддерживает множество аркадных систем и способствует сохранению истории видеоигр, предоставляя доступ к большим коллекциям ретро-игр. ######################################################################## export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/mame0259b_64bit.exe" start_portwine diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_METAL_WAR_ONLINE b/data_from_portwine/scripts/pw_autoinstall/PW_METAL_WAR_ONLINE index 1e80509f..a0abe40d 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_METAL_WAR_ONLINE +++ b/data_from_portwine/scripts/pw_autoinstall/PW_METAL_WAR_ONLINE @@ -3,8 +3,8 @@ # type: games # name: Metal War Online # image: mwo -# info_en: -# info_ru: +# info_en: A multiplayer online action game with strategic elements, where players control combat robots and battle on various arenas. The game offers extensive customization options for the machines and a variety of game modes, allowing each player to create a unique fighting style. +# info_ru: Многопользовательская онлайн-игра в жанре экшен с элементами стратегии, где игроки управляют боевыми роботами и сражаются на различных аренах. Игра предлагает богатую кастомизацию техники и разнообразные игровые режимы, позволяя каждому игроку создавать уникальный стиль боя. ######################################################################## export LAUNCH_PARAMETERS="/s /nr /l=Russian" export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/MWO_Launcher_Setup.exe" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_MINI_WORLD b/data_from_portwine/scripts/pw_autoinstall/PW_MINI_WORLD index 765ab94e..1c0ab36c 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_MINI_WORLD +++ b/data_from_portwine/scripts/pw_autoinstall/PW_MINI_WORLD @@ -3,8 +3,8 @@ # type: games # name: Mini World # image: miniworld -# info_en: -# info_ru: +# info_en: A sandbox game where players can explore, build, and create their unique worlds in a 3D environment. The game offers various modes, including survival and creative, as well as the ability to interact with other players in a multiplayer format. +# info_ru: Песочница, в которой игроки могут исследовать, строить и создавать свои уникальные миры в 3D-окружении. Игра предлагает разнообразные режимы, включая выживание и творчество, а также возможность взаимодействовать с другими игроками в многопользовательском формате. ######################################################################## URL_VER=$(curl https://www.miniworldgame.com/ | awk -F"/app_install/" '{print $2}' | awk -F"universal" '{print $1}') diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_MODERN_WARSHIPS b/data_from_portwine/scripts/pw_autoinstall/PW_MODERN_WARSHIPS index 9c093d6e..6e16cf1c 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_MODERN_WARSHIPS +++ b/data_from_portwine/scripts/pw_autoinstall/PW_MODERN_WARSHIPS @@ -3,8 +3,8 @@ # type: games # name: Modern Warships # image: mw -# info_en: -# info_ru: +# info_en: A multiplayer military game where players control modern battle ships and fight on naval arenas. The game offers a wide selection of vessels, realistic graphics, and thrilling multiplayer battles. +# info_ru: Многопользовательская военная игра, где игроки управляют современными боевыми кораблями и сражаются на морских аренах. Игра предлагает широкий выбор судов, реалистичную графику и захватывающие многопользовательские сражения. ######################################################################## export LAUNCH_PARAMETERS="/VERYSILENT" export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/modern_warships.exe" From 690ee9852be8dda46a05ccdb8b5423d4e11f3c78 Mon Sep 17 00:00:00 2001 From: Muzifs Date: Sun, 24 Nov 2024 12:50:09 +0300 Subject: [PATCH 18/48] =?UTF-8?q?=D0=92=D1=81=D0=BF=D0=BB=D1=8B=D0=B2?= =?UTF-8?q?=D0=B0=D1=88=D0=BA=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D0=B2=D1=81?= =?UTF-8?q?=D0=B5=D1=85=20=D0=B8=D0=B3=D1=80,=20=D0=BB=D0=B0=D1=83=D0=BD?= =?UTF-8?q?=D1=87=D0=B5=D1=80=D0=BE=D0=B2=20=D0=B8=20=D1=8D=D0=BC=D1=83?= =?UTF-8?q?=D0=BB=D1=8F=D1=82=D0=BE=D1=80=D0=BE=D0=B2=20=D0=B3=D0=BE=D1=82?= =?UTF-8?q?=D0=BE=D0=B2=D1=8B.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data_from_portwine/scripts/pw_autoinstall/PW_OSU | 4 ++-- data_from_portwine/scripts/pw_autoinstall/PW_PANZAR | 4 ++-- data_from_portwine/scripts/pw_autoinstall/PW_PATH_OF_EXILE | 4 ++-- data_from_portwine/scripts/pw_autoinstall/PW_PPSSPP | 4 ++-- data_from_portwine/scripts/pw_autoinstall/PW_PROJECT64 | 4 ++-- data_from_portwine/scripts/pw_autoinstall/PW_PULSE_ONLINE | 4 ++-- data_from_portwine/scripts/pw_autoinstall/PW_RETROARCH | 4 ++-- data_from_portwine/scripts/pw_autoinstall/PW_RISE_OF_FLIGHT | 4 ++-- data_from_portwine/scripts/pw_autoinstall/PW_RUSSIAN_FISHING | 4 ++-- data_from_portwine/scripts/pw_autoinstall/PW_SATURN | 4 ++-- .../scripts/pw_autoinstall/PW_SECRET_WORLD_LEGENDS | 4 ++-- data_from_portwine/scripts/pw_autoinstall/PW_STALCRAFT | 4 ++-- data_from_portwine/scripts/pw_autoinstall/PW_STALKER_ONLINE | 4 ++-- data_from_portwine/scripts/pw_autoinstall/PW_STAR_CONFLICT | 4 ++-- data_from_portwine/scripts/pw_autoinstall/PW_TANKI_ONLINE | 4 ++-- .../scripts/pw_autoinstall/PW_THE_LORD_OF_THE_RINGS_ONLINE | 4 ++-- .../scripts/pw_autoinstall/PW_THE_WORLD_NIFTY_CRAFT | 4 ++-- .../scripts/pw_autoinstall/PW_TOONTOWN_REWRITTEN | 4 ++-- data_from_portwine/scripts/pw_autoinstall/PW_TORIBASH | 4 ++-- data_from_portwine/scripts/pw_autoinstall/PW_VBA-M | 4 ++-- data_from_portwine/scripts/pw_autoinstall/PW_WARFRAME | 4 ++-- .../scripts/pw_autoinstall/PW_WORLD_OF_SEA_BATTLE | 4 ++-- data_from_portwine/scripts/pw_autoinstall/PW_XEMU | 4 ++-- data_from_portwine/scripts/pw_autoinstall/PW_XENIA | 4 ++-- data_from_portwine/scripts/pw_autoinstall/PW_YABAUSE | 4 ++-- 25 files changed, 50 insertions(+), 50 deletions(-) diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_OSU b/data_from_portwine/scripts/pw_autoinstall/PW_OSU index 851c3f9d..1e0b7e34 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_OSU +++ b/data_from_portwine/scripts/pw_autoinstall/PW_OSU @@ -3,8 +3,8 @@ # type: games # name: OSU # image: osu -# info_en: -# info_ru: +# info_en: A rhythm game where players click circles in time with music and rhythm. The game features various modes and a community where users can create and share their own maps. +# info_ru: Ритм-игра, в которой игроки нажимают кружки, следуя музыке и ритму. Игра предлагает различные режимы и комьюнити, где пользователи могут создавать и делиться собственными картами. ######################################################################## export PW_PREFIX_NAME="OSU" export PORTWINE_CREATE_SHORTCUT_NAME="OSU" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_PANZAR b/data_from_portwine/scripts/pw_autoinstall/PW_PANZAR index 288a65b3..92dcaeef 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_PANZAR +++ b/data_from_portwine/scripts/pw_autoinstall/PW_PANZAR @@ -3,8 +3,8 @@ # type: games # name: Panzar # image: panzar -# info_en: -# info_ru: +# info_en: A multiplayer online action game where players battle in teams using various character classes and unique abilities. The game features tactical battles on large maps with destructible environments. +# info_ru: Многопользовательская онлайн-игра в жанре экшен, где игроки сражаются в командах, используя различные классы персонажей и уникальные способности. Игра предлагает тактические сражения на больших картах с разрушительным взаимодействием окружения. ######################################################################## export LAUNCH_PARAMETERS="/VERYSILENT" export PW_WINDOWS_VER="7" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_PATH_OF_EXILE b/data_from_portwine/scripts/pw_autoinstall/PW_PATH_OF_EXILE index 86f47a38..38d4cec6 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_PATH_OF_EXILE +++ b/data_from_portwine/scripts/pw_autoinstall/PW_PATH_OF_EXILE @@ -3,8 +3,8 @@ # type: games # name: Path of Exile # image: poe -# info_en: -# info_ru: +# info_en: A free online action RPG where players explore a dark world, fight monsters, and develop their characters through a deep skill and item system. The game is known for its challenging gameplay and constantly updated content, including seasonal leagues and unique mechanics. +# info_ru: Бесплатная онлайн-игра в жанре action RPG, в которой игроки исследуют мрачный мир, сражаются с монстрами и развивают свои персонажи через глубокую систему навыков и предметов. Игра известна своим сложным геймплеем и постоянно обновляемым контентом, включая сезонные лиги и уникальные механики. ######################################################################## export LAUNCH_PARAMETERS="/S" export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/PathOfExileInstaller.exe" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_PPSSPP b/data_from_portwine/scripts/pw_autoinstall/PW_PPSSPP index d14c1019..084a504f 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_PPSSPP +++ b/data_from_portwine/scripts/pw_autoinstall/PW_PPSSPP @@ -3,8 +3,8 @@ # type: emulators # name: PPSSPP Window # image: ppsspp -# info_en: -# info_ru: +# info_en: An emulator for the PlayStation Portable (PSP) handheld gaming console, enabling users to play PSP games on computers and mobile devices. It supports enhanced graphics and various settings, allowing players to enjoy classic games at high quality. +# info_ru: Эмулятор портативной игровой консоли PlayStation Portable (PSP), позволяющий запускать игры PSP на компьютерах и мобильных устройствах. Он поддерживает улучшенную графику и различные настройки, что позволяет наслаждаться классическими играми с высоким качеством. ########################################################################## export LAUNCH_PARAMETERS="/VERYSILENT" export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/PPSSPPSetup.exe" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_PROJECT64 b/data_from_portwine/scripts/pw_autoinstall/PW_PROJECT64 index 745c410d..199deffe 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_PROJECT64 +++ b/data_from_portwine/scripts/pw_autoinstall/PW_PROJECT64 @@ -3,8 +3,8 @@ # type: emulators # name: Project64 # image: project64 -# info_en: -# info_ru: +# info_en: The Nintendo 64 emulator, which allows you to play games of this console on modern devices. Supports various graphics and control settings, providing a high-quality gaming experience. +# info_ru: Эмулятор Nintendo 64, который позволяет играть в игры этой консоли на современных устройствах. Поддерживает различные настройки графики и управления, обеспечивая высококачественный игровой опыт. ######################################################################## PR64_VER="$(curl https://www.pj64-emu.com/public-releases | grep 'installer' | head -n 1 \ | awk -F'/project64' '{print $2}' \ diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_PULSE_ONLINE b/data_from_portwine/scripts/pw_autoinstall/PW_PULSE_ONLINE index 85d3cfe8..b0db4d27 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_PULSE_ONLINE +++ b/data_from_portwine/scripts/pw_autoinstall/PW_PULSE_ONLINE @@ -3,8 +3,8 @@ # type: games # name: Pulse Online # image: pulseonline -# info_en: -# info_ru: +# info_en: A multiplayer online game in the MMORPG genre set in a sci-fi world with a unique combat system and deep crafting mechanics. Players can explore vast locations, complete quests, battle enemies, and interact with other participants in the game. +# info_ru: Многопользовательская онлайн-игра в жанре MMORPG, действие которой происходит в научно-фантастическом мире с уникальной боевой системой и глубоким крафтом. Игроки могут исследовать обширные локации, выполнять квесты, сражаться с противниками и взаимодействовать с другими участниками игры. ######################################################################## export PW_PREFIX_NAME="DOTNET" export PORTWINE_CREATE_SHORTCUT_NAME="Pulse Online" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_RETROARCH b/data_from_portwine/scripts/pw_autoinstall/PW_RETROARCH index cbac43a0..e7b821d8 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_RETROARCH +++ b/data_from_portwine/scripts/pw_autoinstall/PW_RETROARCH @@ -3,8 +3,8 @@ # type: emulators # name: RetroArch # image: retroarch -# info_en: -# info_ru: +# info_en: An interface for emulators that supports many game consoles and platforms, allowing users to run old games on modern devices. It offers a user-friendly interface, a rich library of emulation cores, and features for performance and graphics customization. +# info_ru: Интерфейс для эмуляторов, который поддерживает множество игровых консолей и платформ, позволяя пользователям запускать старые игры на современных устройствах. Он предлагает удобный интерфейс, богатую библиотеку ядер эмуляции и функции для настройки производительности и графики. ######################################################################## export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/RetroArch.7z" start_portwine diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_RISE_OF_FLIGHT b/data_from_portwine/scripts/pw_autoinstall/PW_RISE_OF_FLIGHT index 185042cb..e47fcd03 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_RISE_OF_FLIGHT +++ b/data_from_portwine/scripts/pw_autoinstall/PW_RISE_OF_FLIGHT @@ -3,8 +3,8 @@ # type: games # name: Rise of Flight # image: riseofflight -# info_en: -# info_ru: +# info_en: A flight combat simulator set during World War I, providing players with a realistic experience of piloting historical fighters. The game features various missions, a multiplayer mode, and detailed graphics, allowing players to immerse themselves in the atmosphere of aerial battles of that era. +# info_ru: Симулятор авиационных боев, действие которого происходит во время Первой мировой войны, предлагающий игрокам реалистичный опыт управления историческими истребителями. Игра включает в себя различные миссии, многопользовательский режим и детализированную графику, что позволяет ощутить атмосферу воздушных сражений того времени. ######################################################################## export PW_PREFIX_NAME="RISE_OF_FLIGHT" export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/ROF_UE.zip" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_RUSSIAN_FISHING b/data_from_portwine/scripts/pw_autoinstall/PW_RUSSIAN_FISHING index c0c5cf30..266cbbd6 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_RUSSIAN_FISHING +++ b/data_from_portwine/scripts/pw_autoinstall/PW_RUSSIAN_FISHING @@ -3,8 +3,8 @@ # type: games # name: Russian Fishing 4 # image: rf4launcher -# info_en: -# info_ru: +# info_en: A realistic fishing simulator that immerses players in the enjoyable process of catching fish in various beautiful bodies of water across Russia. The game features a wide selection of tackle, fish species, and opportunities for competition with other anglers. +# info_ru: Реалистичный симулятор рыбалки, который предлагает игрокам погрузиться в увлекательный процесс ловли рыбы в различных красивых водоемах России. Игра включает в себя широкий выбор снастей, видов рыб и возможностей для соревнований с другими рыбаками. ######################################################################## export LAUNCH_PARAMETERS="/q" export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/RF4SetupRU.exe" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_SATURN b/data_from_portwine/scripts/pw_autoinstall/PW_SATURN index 4c1ac85c..a621d6bb 100644 --- a/data_from_portwine/scripts/pw_autoinstall/PW_SATURN +++ b/data_from_portwine/scripts/pw_autoinstall/PW_SATURN @@ -3,8 +3,8 @@ # type: games # name: Saturn # image: saturn -# info_en: -# info_ru: +# info_en: A multiplayer online game that combines elements of strategy and role-playing, where players can explore space, build colonies, and battle opponents. The game features a deep crafting system and character development, allowing each player to create a unique strategy. +# info_ru: Многопользовательская онлайн-игра, сочетающая элементы стратегии и ролевого развлечения, где игроки могут исследовать космос, строить колонии и сражаться с противниками. Игра предлагает глубокую систему крафта и развития персонажей, позволяя каждому игроку строить уникальную стратегию. ######################################################################## export PW_PREFIX_NAME="NINSAR" export PW_WINE_USE="WINE_LG" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_SECRET_WORLD_LEGENDS b/data_from_portwine/scripts/pw_autoinstall/PW_SECRET_WORLD_LEGENDS index bc743a71..cfd5f135 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_SECRET_WORLD_LEGENDS +++ b/data_from_portwine/scripts/pw_autoinstall/PW_SECRET_WORLD_LEGENDS @@ -3,8 +3,8 @@ # type: games # name: Secret World Legends (ENG) # image: swl -# info_en: -# info_ru: +# info_en: An MMORPG with a unique story and setting based on myths, legends, and secret societies, allowing players to explore a modern world filled with supernatural beings and mysteries. The game offers freedom in skill selection and character building, along with engaging quests and a rich narrative. +# info_ru: MMORPG с уникальной историей и сеттингом, основанная на мифах, легендах и тайных обществах, позволяющая игрокам исследовать современный мир, полный сверхъестественных существ и загадок. Игра предлагает свободу в выборе навыков и построении персонажей, а также захватывающие квесты и глубокий сюжет. ######################################################################## export WINEDLLOVERRIDES="d3d9=b" export LAUNCH_PARAMETERS="/VERYSILENT" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_STALCRAFT b/data_from_portwine/scripts/pw_autoinstall/PW_STALCRAFT index 36b0c8e5..0d124e91 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_STALCRAFT +++ b/data_from_portwine/scripts/pw_autoinstall/PW_STALCRAFT @@ -3,8 +3,8 @@ # type: games # name: STALCRAFT # image: stalcraft -# info_en: -# info_ru: +# info_en: A multiplayer open-world game inspired by the S.T.A.L.K.E.R. universe, where players explore abandoned zones, battle mutants and other stalkers, and complete various quests. The game combines elements of survival, RPG, and first-person shooter, offering a unique experience in a post-apocalyptic world. +# info_ru: Многопользовательская игра с открытым миром, вдохновленная вселенной S.T.A.L.K.E.R., где игроки исследуют заброшенные зоны, сражаются с мутантами и другими сталкерами, а также выполняют различные квесты. Игра сочетает элементы выживания, RPG и шутера от первого лица, предлагая уникальный опыт в постапокалиптическом мире. ######################################################################## export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/EXBO_Setup_ru.exe" export PW_PREFIX_NAME="DOTNET" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_STALKER_ONLINE b/data_from_portwine/scripts/pw_autoinstall/PW_STALKER_ONLINE index b261e51d..35e3d026 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_STALKER_ONLINE +++ b/data_from_portwine/scripts/pw_autoinstall/PW_STALKER_ONLINE @@ -3,8 +3,8 @@ # type: games # name: Stalker Online # image: so -# info_en: -# info_ru: +# info_en: An MMORPG based on the popular S.T.A.L.K.E.R. series, where players can explore the danger Zone, complete quests, fight mutants and other players. The game offers elements of survival and interaction with the open world. +# info_ru: MMORPG, основанная на популярной серии S.T.A.L.K.E.R., где игроки могут исследовать опасную Зону, выполнять квесты, сражаться с мутантами и другими игроками. Игра предлагает элементы выживания и взаимодействия с открытым миром. ######################################################################## export LAUNCH_PARAMETERS="/S" export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/SO_installer.exe" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_STAR_CONFLICT b/data_from_portwine/scripts/pw_autoinstall/PW_STAR_CONFLICT index cf5c055f..f31fc38c 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_STAR_CONFLICT +++ b/data_from_portwine/scripts/pw_autoinstall/PW_STAR_CONFLICT @@ -3,8 +3,8 @@ # type: games # name: Star Conflict # image: starconflict -# info_en: -# info_ru: +# info_en: A multiplayer online game in the space simulator genre, where players control various fighting ships and engage in large-scale space battles. The game features a unique customization system and character progression, along with diverse combat modes and strategic elements. +# info_ru: Многопользовательская онлайн-игра в жанре космического симулятора, где игроки управляют различными боевыми кораблями и сражаются в масштабных космических сражениях. Игра предлагает уникальную систему кастомизации и развитие персонажей, а также разнообразные режимы боя и стратегические элементы. ######################################################################## export PW_PREFIX_NAME="STAR_CONFLICT" export LAUNCH_PARAMETERS="/VERYSILENT" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_TANKI_ONLINE b/data_from_portwine/scripts/pw_autoinstall/PW_TANKI_ONLINE index c9d94d13..a051d90d 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_TANKI_ONLINE +++ b/data_from_portwine/scripts/pw_autoinstall/PW_TANKI_ONLINE @@ -3,8 +3,8 @@ # type: games # name: Tanki Online # image: tankionline -# info_en: -# info_ru: +# info_en: A multiplayer browser game where players control tanks and engage in dynamic team battles across various maps. The game offers a wide selection of weapons and modifications, allowing players to create unique tanks and develop strategies for victory. +# info_ru: Многопользовательская браузерная игра, в которой игроки управляют танками и участвуют в динамичных командных сражениях на различных картах. Игра предлагает широкий выбор оружия и модификаций, позволяя создавать уникальные танки и разрабатывать тактики для победы. ######################################################################## export PW_PREFIX_NAME="TANKI_ONLINE" export LAUNCH_PARAMETERS="/S" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_THE_LORD_OF_THE_RINGS_ONLINE b/data_from_portwine/scripts/pw_autoinstall/PW_THE_LORD_OF_THE_RINGS_ONLINE index a92eb2f4..a2f58384 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_THE_LORD_OF_THE_RINGS_ONLINE +++ b/data_from_portwine/scripts/pw_autoinstall/PW_THE_LORD_OF_THE_RINGS_ONLINE @@ -3,8 +3,8 @@ # type: games # name: The Lord of the Rings Online (ENG) # image: lordofringsonline -# info_en: -# info_ru: +# info_en: An MMORPG based on the works of J. R. R. Tolkien, allowing players to explore Middle-earth, take part in epic quests and battles with famous characters and creatures from the Lord of the Rings universe. The game offers deep customization of characters, a rich plot and many opportunities to play alone or in a group. +# info_ru: MMORPG, основанная на произведениях Дж. Р. Р. Толкиена, позволяющая игрокам исследовать Средиземье, принимать участие в эпических квестах и сражениях с известными персонажами и созданиями из вселенной Властелина колец. Игра предлагает глубокую кастомизацию персонажей, богатый сюжет и множество возможностей для игры в одиночку или в группе. ######################################################################## export PW_PREFIX_NAME="THE_LORD_OF_THE_RINGS_ONLINE" export LAUNCH_PARAMETERS="/VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP- /LANG=en" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_THE_WORLD_NIFTY_CRAFT b/data_from_portwine/scripts/pw_autoinstall/PW_THE_WORLD_NIFTY_CRAFT index 256765cd..2c9554e9 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_THE_WORLD_NIFTY_CRAFT +++ b/data_from_portwine/scripts/pw_autoinstall/PW_THE_WORLD_NIFTY_CRAFT @@ -3,8 +3,8 @@ # type: games # name: The World of Nifty Craft (ENG) # image: theworldofniftycraft -# info_en: -# info_ru: +# info_en: A multiplayer online sandbox game where players can build, explore, and progress in a vibrant and diverse world filled with adventures. The game features a crafting system, unique opportunities for creativity, and interaction with other players. +# info_ru: Многопользовательская онлайн-игра в жанре песочницы, где игроки могут строить, исследовать и развиваться в ярком и разнообразном мире, наполненном приключениями. Игра предлагает систему крафта, уникальные возможности для творчества и взаимодействия с другими игроками. ######################################################################## export PW_PREFIX_NAME="THE_WORLD_NIFTY_CRAFT" export LAUNCH_PARAMETERS="/S" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_TOONTOWN_REWRITTEN b/data_from_portwine/scripts/pw_autoinstall/PW_TOONTOWN_REWRITTEN index f94dd30f..c8a459ff 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_TOONTOWN_REWRITTEN +++ b/data_from_portwine/scripts/pw_autoinstall/PW_TOONTOWN_REWRITTEN @@ -3,8 +3,8 @@ # type: games # name: Toontown Rewritten (ENG) # image: toontownrewritten -# info_en: -# info_ru: +# info_en: A multiplayer online game, where players take on the roles of cartoon characters battling foes in humorous and adventurous locations. The game offers cooperative gameplay, quests, mini-games, and opportunities for interaction with other players in a colorful world. +# info_ru: Многопользовательская онлайн-игра, где игроки берут на себя роли мультяшных персонажей, сражаясь с противниками в локациях, наполненных юмором и приключениями. Игра предлагает кооперативный геймплей, квесты, мини-игры и возможность взаимодействия с другими игроками в красочном мире. ######################################################################## URL_VER=$(curl https://www.toontownrewritten.com/play \ | awk -F"https://cdn.toontownrewritten.com/launcher/windows/TTRInstaller-" '{print $2}' \ diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_TORIBASH b/data_from_portwine/scripts/pw_autoinstall/PW_TORIBASH index 1aa84b22..2650a16e 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_TORIBASH +++ b/data_from_portwine/scripts/pw_autoinstall/PW_TORIBASH @@ -3,8 +3,8 @@ # type: games # name: Toribash # image: toribash -# info_en: -# info_ru: +# info_en: A fighting game where players control the joints of a character, creating their own movements and combos in real time. The game offers a deep level of strategy and creative expression, allowing users to develop their own techniques and engage in battles with other players. +# info_ru: Файтинг, где игроки управляют суставами персонажа, создавая собственные движения и комбо в реальном времени. Игра предлагает глубокий уровень стратегии и творческого самовыражения, позволяя пользователям разрабатывать свои собственные приемы и участвовать в боях с другими игроками. ######################################################################## URL_VER=$(curl https://www.toribash.com/downloads.php \ | awk -F"https://cache.toribash.com/Toribash-" '{print $2}' \ diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_VBA-M b/data_from_portwine/scripts/pw_autoinstall/PW_VBA-M index 0e0a13da..4fcae8b9 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_VBA-M +++ b/data_from_portwine/scripts/pw_autoinstall/PW_VBA-M @@ -3,8 +3,8 @@ # type: emulators # name: VBA-M # image: vba-m -# info_en: -# info_ru: +# info_en: The Nintendo Game Boy Advance (GBA) emulator, which allows users to play classic games of this portable console on modern devices. The program supports many functions, including saving the game, setting up controls and the ability to play a multiplayer game over the Internet. +# info_ru: Эмулятор Nintendo Game Boy Advance (GBA), который позволяет пользователям играть в классические игры этой портативной консоли на современных устройствах. Программа поддерживает множество функций, включая сохранение игры, настройка управления и возможность играть в режиме многопользовательской игры через интернет. ######################################################################## export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/visualboyadvance-m-Win-x86_64.zip" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_WARFRAME b/data_from_portwine/scripts/pw_autoinstall/PW_WARFRAME index a340c50b..0177ee58 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_WARFRAME +++ b/data_from_portwine/scripts/pw_autoinstall/PW_WARFRAME @@ -3,8 +3,8 @@ # type: games # name: Warframe # image: warframe -# info_en: -# info_ru: +# info_en: A free-to-play multiplayer online action RPG where players control ancient warriors known as Tenno and battle against various factions in diverse missions across the galaxy. The game offers extensive character customization options, cooperative gameplay, and continuously updated content. +# info_ru: Бесплатная многопользовательская онлайн-игра в жанре экшен-RPG, в которой игроки управляют древними воинами, известными как Тенно, и сражаются против различных фракций в разнообразных миссиях по всей галактике. Игра предлагает множество возможностей для кастомизации персонажей, кооперативный геймплей и постоянно обновляющийся контент. ######################################################################## export LAUNCH_PARAMETERS="/q" export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/Warframe.msi" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_WORLD_OF_SEA_BATTLE b/data_from_portwine/scripts/pw_autoinstall/PW_WORLD_OF_SEA_BATTLE index c410f4f8..7e243965 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_WORLD_OF_SEA_BATTLE +++ b/data_from_portwine/scripts/pw_autoinstall/PW_WORLD_OF_SEA_BATTLE @@ -3,8 +3,8 @@ # type: games # name: World of Sea Battle # image: wosb -# info_en: -# info_ru: +# info_en: A multiplayer game where players control ships and participate in naval battles, aiming to defeat their opponents. The game offers various gameplay modes, ship customization options, and tactical planning for team actions. +# info_ru: Многопользовательская игра, в которой игроки управляют кораблями и участвуют в морских сражениях, стремясь одержать победу над противниками. Игра предлагает различные игровые режимы, возможность кастомизации судов и тактическое планирование командных действий. ######################################################################## export LAUNCH_PARAMETERS="/S" export PW_PREFIX_NAME="WORLD_OF_SEA_BATTLE" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_XEMU b/data_from_portwine/scripts/pw_autoinstall/PW_XEMU index 81280401..c3d810b4 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_XEMU +++ b/data_from_portwine/scripts/pw_autoinstall/PW_XEMU @@ -3,8 +3,8 @@ # type: emulators # name: xemu # image: xemu -# info_en: -# info_ru: +# info_en: An emulator of the original Xbox console that allows users to launch and play games for this platform on modern computers. The emulator supports many features, including improved graphics, game state saving, and control settings. +# info_ru: Эмулятор оригинальной консоли Xbox, который позволяет пользователям запускать и играть в игры для этой платформы на современных компьютерах. Эмулятор поддерживает множество функций, включая улучшенную графику, сохранение состояния игры и настройку управления. ######################################################################## export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/xemu-win-release.zip" start_portwine diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_XENIA b/data_from_portwine/scripts/pw_autoinstall/PW_XENIA index 7efaaa04..b29577be 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_XENIA +++ b/data_from_portwine/scripts/pw_autoinstall/PW_XENIA @@ -3,8 +3,8 @@ # type: emulators # name: Xenia # image: xenia -# info_en: -# info_ru: +# info_en: An Xbox 360 console emulator that allows users to launch and play games for this platform on a PC. The emulator supports high resolution, improved performance, and an active community to discuss and develop game compatibility. +# info_ru: Эмулятор консоли Xbox 360, позволяющий пользователям запускать и играть в игры для этой платформы на ПК. Эмулятор поддерживает высокое разрешение, улучшенную производительность и активное сообщество для обсуждения и разработки совместимости игр. ######################################################################## export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/xenia_master.zip" start_portwine diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_YABAUSE b/data_from_portwine/scripts/pw_autoinstall/PW_YABAUSE index 62037819..ebfe17cc 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_YABAUSE +++ b/data_from_portwine/scripts/pw_autoinstall/PW_YABAUSE @@ -3,8 +3,8 @@ # type: emulators # name: Yabause # image: yabause -# info_en: -# info_ru: +# info_en: A Sega Saturn console emulator that allows users to play classic games for this platform on modern devices. It supports various functions such as state saving and control settings, providing a user-friendly experience for fans of this platform. +# info_ru: Эмулятор консоли Sega Saturn, который позволяет пользователям играть в классические игры для этой платформы на современных устройствах. Поддерживает различные функции, такие как сохранение состояния и настройка управления, обеспечивая удобный опыт для любителей данной платформы. ######################################################################## export LAUNCH_PARAMETERS="/S" export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/yabause-0.9.15-win64.exe" From 3b4262a11cc9a8a06eb2eb95bec8cb40dbdd85b8 Mon Sep 17 00:00:00 2001 From: Muzifs Date: Mon, 25 Nov 2024 14:59:36 +0300 Subject: [PATCH 19/48] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=B8=D0=BA=D0=BE=D0=BD=D0=BA=D0=B8=20=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=B1=D0=BE=D0=BB=D0=B5=D0=B5=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BA=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D1=8B=D0=B5=20=D1=83=20=D1=8D=D0=BC=D1=83=D0=BB=D1=8F=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BE=D0=B2:=20Dolphin,=20RetroArch,=20VBA-M.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit В файле PW_PPSSPP строка 4 изменена, так как название эмулятора не PPSSPP Window. --- data_from_portwine/img/gui/dolphin.png | Bin 1643 -> 1957 bytes data_from_portwine/img/gui/retroarch.png | Bin 2709 -> 5207 bytes data_from_portwine/img/gui/vba-m.png | Bin 3453 -> 2726 bytes .../scripts/pw_autoinstall/PW_PPSSPP | 2 +- 4 files changed, 1 insertion(+), 1 deletion(-) mode change 100755 => 100644 data_from_portwine/img/gui/dolphin.png diff --git a/data_from_portwine/img/gui/dolphin.png b/data_from_portwine/img/gui/dolphin.png old mode 100755 new mode 100644 index 8ee950ca3b6b6954343450d6240b234bffa4d803..824c6979ca87554094689cffbd78647adc5c90e0 GIT binary patch delta 1944 zcmV;J2WR-}45bf{BYy{MNkl?gNs=TvXVk~K`lm4J^?VjlK|HU4o@XgUUmb1q2ZB5Y>iK4R~@CBZo0k zdzzS8&!rN!=3rU#bc%D86ATR1j^%)0eB=8rEnckq9@gCP+F%sfgVKG|vsdCcw-B&r zIq9MC;jFZ*aDR3tf%Gs=$U$k1h~ULs;+;{tTic1Ybaclfu{ybZO(m|`jkslq8m%%? zzdK~~h>61rKSSooOoFLFv}2=eMXWti+j^{}v}V`-qaA}h(lckE==qxn1s+Tpnla;o zf_x`uR4!?`X#`S&Xd9G1eTfJd58RkXv^`2^QwMEz&40Aj)Dy}|XVkTql9iW_Cu||ov#BJ6qIv=ha12WI zne<|UwiL<&<0oPO=m2;Tf6?|S_8-nhcrT}y&<(35+QT!~Ts-}X!jTh3VmS)qgB$G; zWr4C2;(v?_#wU&(=>Q5%pJ|ndBi?@>ow!h0`uc=(5r4XY>z0iQUovvt z_@ZfJGDoELltRyb8k7SjPK&tg1a{z4p&jbtaXM5;yN-+Y6)9L``%&*At?Y4P%x8f~ zphxQv4w4YvTRvJr#)x6}H{HDYeg3-PF<9%Lqkn-VIy5%_sqwd7Hzs{Z2rt?b>oSYsTJkUD>e0Jj=xUCg=c&q1*~`?~ci8|6l{3iD^5e&}i;Nn6Crm zOMlOuXsE2?=(g9lo8!mtX6rZV&dNaU&)#@+%*@F@q34o9qSpPmIZ$6-F|T&x&JJ=i zbHJp438E|w`1nMzOeenAhD|dY?i*|eWZDkN^^E^Dw6$0}48_37qs>%r-nG{|+%T82 z`#&<%9~db3Q{AQ^<44Xhu@8-E;n3zi&3~=cwcS=qDBE)EptfyGSys<27L4yUR|3+|e;H7h?i!+3pzB0_g_J614&9dOXLh0;B}Q|M`@f*6DE`FPPdvCeL~nt$8r zJl;gt`%TSWq-!Uh_ad>AuTr|WeLy8kL|^p<9umdRtpLIH`c4j&{&SaG^-d8xf7mjx zfoq-|8ouIle=nFb<8s^9h$IddtEXjJfJwAW@$m%W3VfwV@8>AcPNHKO7h;_;IvP&W zT>Ty$bqxolt7{e76tiwY<3NHYmw(D_Xr8fxWVO_^ad`8#m;C2noIg-^QqDaap1$~o z>EBArO-JahdtAg+DWxmGuS8i@2=xkDaHCx&5b~7pv<_1A;gVAt-0pal6%4c?jI{z} zYA5l_9BJ(2#K9x9Rv)SHJKBGX-?fsB3%mLgb@@iQ0gIQdAVV78t>f6%9e)qA?yjf$ zH85&Kv7?%d1L|}D$6Yti1RYm(-1Tb-vOjN>7rO6OKkpLZl#&-^HsoVX7 z*@g2<@@$JqO3ZW-eZ8`{%nD+6opfoe*iTDU)o$sGJj}*>%KM9d*?M=Dw)I-e(U~=6 zZ+ABDdh?5Hxo_`j1}3eSrGH{^C58>I%en(|Rl`7{Pi4Y7xlh}y1QdRv+&UUgm?N)l zet>m%ujrjuSRw%@%;h57ism+@DeP$KqQ1PmD_Y<1BR0(c-2m}#)($TjpVY&zZrR?w ze8r8hHvZu`|MPpG@D*94Y#vt@VQ~}R)$V@NYdd&gDPH8sQ_E!X27gJ38D=P(d*hMV z&5e~u?UstY%h}iXAcq#mPK`gIM82ZK6t_3D1dna`$3pY+9V^eP0f2%(%e9u`5rpe? zfD~h(vEmTTl@)JEH1Z2_yVkREp?m7ONgL&A&*l3~2WxIWvG1){z}AuK>bJ|DU|vaHf8*o+BIyMs^5z9gt2>ynV$As$e1E delta 1627 zcmV-h2Bi6=59pF8FWQhbW?9;ba!ELWdL_~ zcP?peYja~^aAhuUa%Y?FJQ@H11^7usK~!jg-CBE0Q&$-Oo!fS`6a*9}c7T=uK8lKf zy3Ic{n<*Auf|dWPq$R zDvtt*1!aix?&J3Ck85vxd++USD_dc|BoA(T=8fN}b)m4q_y0W=qY z9-|Wj0KE>%>}_c@mjeKylp-}Fb2mUgh;($JfD)8gZ#5K>X&EzD5=zcSI-syX$qH5c zgvo~iOpA0Z;eUWINMrz-6X`(01*OPk07OSRkjFp_6G`u^IvPXKsc>oI!?vLg&#@lu zb2cgJC7Vm3c03f6S+k4y^sMFCh)YhuV0RyGUAlpxhl4QId>T?LK@)JRb!eOO5dgrr zXa<%p&Qz?^TA7Ka3bUYW>E=9<9`m;qiI>A$#fdR}7JpSzvSt?{DJKmXOS8gq643Um zrpKxuum|oL^DsDZE*2N80sye=WBK}5AWPuBVHsu@ZiYsugknBhjc=9W8EA>{K zMRV;PICP1!#x%p-n9}$SRL=gO1DJHU9)wZx`D=%Mgt2y8(Dfw=BpebG=)7?YiF2nb z8npds!JQflpPyE{9fT^+eqWz8hfW}+KDeF`5r42|7a`|O@md`&tXHaVzquWZ+kvTd z#Q}9E?B_^O03C(PF|Myw(Y}B{XZjjUe@A*l89u!e_TNtl%G5KSg?__PMJFEAohSpS z8^+oqS)JH@9EmPVBc3?2QqiV>z_=aN&_wBYVPAprCKFRC9&Wz%h&~R{pIsHm>ra*i z9DiCKoAoEl6pt3-IiS@8_5sDfeWBkYBw_we+A-1S5Vf-!0AT&~3I^`plbx_0o41dB ziKlKJk@X$aQ6d=VN`xdVKLl<)kA5IMT}cDnE*I=u=E~X`F#;ZFi@ijwKVO2qw>KaW zZE*u`o|Y$}Bp-1CVL=yzp154ZcU%^UNPkKe)ay>cxm9{TM)X3%W2jFucmSa7bzoh> zdxS4W2LT1Rx0_&mQF?D069fPN$5u=B!q_3uX+iSy;$9dXlQ;xWq7rO?W2Xlmp?%>_ zL4M5jfIr4u5BS4-CuUU0I8!eWwpBIZ=EXY21C@UL9%$0I7mEiUE|b;M7M|nN_J3XC zlV9OH2hM6fF#CGNkEj*000Pd#ZQ`-4gjET7A+ET z!f1jD+7|)>u15sg*JOdZoG|P;56u)KmK5Zn?RAcT?^+zwU5kXab6}m`x>9R(T*no} zcl^fduyz)$^R|K#?kbsV-V3$k0e>pCb9akmA3HH!*U>j=K5xrdTLe(=z1%yA85Imi zxgpf?7Dqt8_!Y#y!3A#1H^K0=86X7xVY!kK9>UR%mt#r?-ne<jAs)v*nw>KJ4Q2$-6J|Y3C3NTfT|6!P}Qet8SbZ>H0nb2!@c;E^HO| z(`&tDPeh62p1jKm5I>omO+YXL1ahe~>k4d3K)^A~{q0?K9NkS#$c&%Nm%%aUP5bGy z4uJZ}D5C*!JH2&S7EnEEIe#AlzBZ-Oz6AXJ1AaruF~ofnXJjGcr93`AP-qg!+ZXPF z`V%uRb2_{-&!_pg2G;B%uZ=Bp__Tdk>{BkyI>oxaJMW0^#Ox++@-au3gY>kHq-jZn z^#eyBcwVsot1W)S38*Uf0|3ZS;8*LB!vEqh7yL`?=tD09(CSD>5mYWHMKuG;?2U9F z;esKwlxb-+ms5h0NCy)-NOALR%LU^3cbnAo%$Es6-=`GwF?xT!@23=1456jXw=EX{ Z;2&t>lLO7z#+3j7002ovPDHLkV1nKv^+W&w diff --git a/data_from_portwine/img/gui/retroarch.png b/data_from_portwine/img/gui/retroarch.png index 02346a30678d6c00155d0cc42a79430bd6f894c5..543b7944d57c9a6216f938ce5852b9d9fe49b81b 100644 GIT binary patch literal 5207 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 fz Date: Wed, 27 Nov 2024 16:30:31 +0300 Subject: [PATCH 20/48] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D0=BF=D0=B5=D1=87=D0=B0?= =?UTF-8?q?=D1=82=D0=BE=D0=BA=20=D0=B8=20=D0=BD=D0=B5=D1=82=D0=BE=D1=87?= =?UTF-8?q?=D0=BD=D0=BE=D1=81=D1=82=D0=B5=D0=B9=20=D0=B2=20=D0=BD=D0=B0?= =?UTF-8?q?=D0=B7=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=D1=85.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data_from_portwine/scripts/pw_autoinstall/PW_EPSXE | 2 +- data_from_portwine/scripts/pw_autoinstall/PW_GOG | 2 +- data_from_portwine/scripts/pw_autoinstall/PW_LGC | 2 +- data_from_portwine/scripts/pw_autoinstall/PW_LOST_LIGHT | 2 +- data_from_portwine/scripts/pw_autoinstall/PW_OSU | 2 +- data_from_portwine/scripts/pw_autoinstall/PW_PPSSPP | 2 +- data_from_portwine/scripts/pw_autoinstall/PW_WGC | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_EPSXE b/data_from_portwine/scripts/pw_autoinstall/PW_EPSXE index 3c1e6b54..4ace6850 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_EPSXE +++ b/data_from_portwine/scripts/pw_autoinstall/PW_EPSXE @@ -10,7 +10,7 @@ export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/ePSXe205.zip" start_portwine if try_download "https://www.epsxe.com/files/ePSXe205.zip" "${PW_AUTOINSTALL_EXE}" no_mirror then - pw_start_progress_bar_install_game "VBA-M." + pw_start_progress_bar_install_game "ePSXe." "$pw_7z" x -y "${PW_AUTOINSTALL_EXE}" -o"$WINEPREFIX/drive_c/Program Files (x86)/EPSXe" portwine_exe="$WINEPREFIX/drive_c/Program Files (x86)/EPSXe/ePSXe.exe" try_remove_file "${PW_AUTOINSTALL_EXE}" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_GOG b/data_from_portwine/scripts/pw_autoinstall/PW_GOG index 347f3770..cbf4b29e 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_GOG +++ b/data_from_portwine/scripts/pw_autoinstall/PW_GOG @@ -1,7 +1,7 @@ #!/usr/bin/env bash # Author: Castro-Fidel (linux-gaming.ru) # type: games -# name: GoG Galaxy Launcher +# name: GOG Galaxy Launcher # image: gog # info_en: Launcher for the GOG game library. # info_ru: Лаунчер для библиотеки игр GOG. diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_LGC b/data_from_portwine/scripts/pw_autoinstall/PW_LGC index 0e0e1aeb..09955543 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_LGC +++ b/data_from_portwine/scripts/pw_autoinstall/PW_LGC @@ -14,7 +14,7 @@ start_portwine if try_download "https://redirect.lesta.ru/LGC/Lesta_Game_Center_Install_RU.exe" "${PW_AUTOINSTALL_EXE}" no_mirror then - pw_start_progress_bar_install_game "Lesta Game Center" + pw_start_progress_bar_install_game "Lesta Game Center." pw_kill_autostart lgc.exe & pw_run "${PW_AUTOINSTALL_EXE}" portwine_exe="$WINEPREFIX/drive_c/ProgramData/Lesta/GameCenter/api/lgc_api.exe" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_LOST_LIGHT b/data_from_portwine/scripts/pw_autoinstall/PW_LOST_LIGHT index 4572bf14..cfc749de 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_LOST_LIGHT +++ b/data_from_portwine/scripts/pw_autoinstall/PW_LOST_LIGHT @@ -15,7 +15,7 @@ URL_LOST_LIGHT="$(curl -s --list-only "https://adl.easebar.com/d/g/yhtj/c/lostli start_portwine if try_download "${URL_LOST_LIGHT}" "${PW_AUTOINSTALL_EXE}" no_mirror then - pw_start_progress_bar_install_game "LostLight." + pw_start_progress_bar_install_game "Lost Light." "$pw_7z" x -y "${PW_AUTOINSTALL_EXE}" -o"$WINEPREFIX/drive_c/Program Files (x86)/LostLight" export portwine_exe="$WINEPREFIX/drive_c/Program Files (x86)/LostLight/launcher.exe" pw_create_unique_exe "lostlight_launcher_pp" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_OSU b/data_from_portwine/scripts/pw_autoinstall/PW_OSU index 1e0b7e34..fa6fd28c 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_OSU +++ b/data_from_portwine/scripts/pw_autoinstall/PW_OSU @@ -1,7 +1,7 @@ #!/usr/bin/env bash # Author: cefeiko # type: games -# name: OSU +# name: OSU! # image: osu # info_en: A rhythm game where players click circles in time with music and rhythm. The game features various modes and a community where users can create and share their own maps. # info_ru: Ритм-игра, в которой игроки нажимают кружки, следуя музыке и ритму. Игра предлагает различные режимы и комьюнити, где пользователи могут создавать и делиться собственными картами. diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_PPSSPP b/data_from_portwine/scripts/pw_autoinstall/PW_PPSSPP index 143e53b5..99e1e894 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_PPSSPP +++ b/data_from_portwine/scripts/pw_autoinstall/PW_PPSSPP @@ -11,7 +11,7 @@ export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/PPSSPPSetup.exe" start_portwine if try_download "https://ppsspp.org/files/1_16_5/PPSSPPSetup.exe" "${PW_AUTOINSTALL_EXE}" no_mirror then - pw_start_progress_bar_install_game "PPSSPPS." + pw_start_progress_bar_install_game "PPSSPP." pw_run "${PW_AUTOINSTALL_EXE}" portwine_exe="$WINEPREFIX/drive_c/Program Files/PPSSPP/PPSSPPWindows64.exe" try_remove_file "${PW_AUTOINSTALL_EXE}" diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_WGC b/data_from_portwine/scripts/pw_autoinstall/PW_WGC index 909b41ac..47705602 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_WGC +++ b/data_from_portwine/scripts/pw_autoinstall/PW_WGC @@ -15,7 +15,7 @@ start_portwine if try_download "https://redirect.wargaming.net/WGC/Wargaming_Game_Center_Install_WoT_${WGC_LOC}.exe" "${PW_AUTOINSTALL_EXE}" no_mirror then - pw_start_progress_bar_install_game "WGC." + pw_start_progress_bar_install_game "Wargaming Game Center." pw_kill_autostart wgc.exe & pw_run "${PW_AUTOINSTALL_EXE}" portwine_exe="$WINEPREFIX/drive_c/ProgramData/Wargaming.net/GameCenter/api/wgc_api.exe" From e653583c7200060bbe9687ce0b0bd21db8f03e16 Mon Sep 17 00:00:00 2001 From: Muzifs Date: Wed, 27 Nov 2024 18:05:59 +0300 Subject: [PATCH 21/48] =?UTF-8?q?=D0=95=D1=81=D0=BB=D0=B8=20=D0=B2=20?= =?UTF-8?q?=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B8=D0=B3?= =?UTF-8?q?=D1=80=D1=8B=20=D0=B2=D0=BF=D0=B8=D1=81=D0=B0=D1=82=D1=8C=20!,?= =?UTF-8?q?=20=D1=82=D0=BE=20=D0=BF=D0=B5=D1=80=D0=B5=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D1=91=D1=82=20=D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B0?= =?UTF-8?q?=D1=82=D1=8C=D1=81=D1=8F=20=D0=B8=D0=BA=D0=BE=D0=BD=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=B2=20PP.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data_from_portwine/scripts/pw_autoinstall/PW_OSU | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_OSU b/data_from_portwine/scripts/pw_autoinstall/PW_OSU index fa6fd28c..1e0b7e34 100755 --- a/data_from_portwine/scripts/pw_autoinstall/PW_OSU +++ b/data_from_portwine/scripts/pw_autoinstall/PW_OSU @@ -1,7 +1,7 @@ #!/usr/bin/env bash # Author: cefeiko # type: games -# name: OSU! +# name: OSU # image: osu # info_en: A rhythm game where players click circles in time with music and rhythm. The game features various modes and a community where users can create and share their own maps. # info_ru: Ритм-игра, в которой игроки нажимают кружки, следуя музыке и ритму. Игра предлагает различные режимы и комьюнити, где пользователи могут создавать и делиться собственными картами. From 38f90a53203da970496ca54ed022e0a201e19cdf Mon Sep 17 00:00:00 2001 From: Boris Yumankulov Date: Thu, 28 Nov 2024 20:02:11 +0500 Subject: [PATCH 22/48] fix gstreamer work in flatpak --- data_from_portwine/scripts/functions_helper | 26 +++++++++++++-------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index 6a1eebc9..c5a3f6ac 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -1638,8 +1638,11 @@ init_wine_ver () { export WINEDLLPATH+=":${PATH_TO_GAME}" fi fi + + if ! check_flatpak ; then + export WINE_LIBRARY_PATH="${WINEDIR}/lib64:${WINEDIR}/lib" + fi - export WINE_LIBRARY_PATH="${WINEDIR}/lib64:${WINEDIR}/lib" export MEDIACONV_BLANK_VIDEO_FILE="${WINEDIR}"/share/media/blank.mkv export MEDIACONV_BLANK_AUDIO_FILE="${WINEDIR}"/share/media/blank.ptna return 0 @@ -1673,15 +1676,18 @@ pw_init_runtime () { PW_PV_OVERRIDES="/usr/lib/pressure-vessel/overrides/lib" - export PW_LD_LIBRARY_PATH="\ -${PW_PLUGINS_PATH}/portable/lib/lib64:\ -${PW_PLUGINS_PATH}/portable/lib/lib32:\ -${PW_PV_OVERRIDES}/x86_64-linux-gnu/aliases:\ -${PW_PV_OVERRIDES}/i386-linux-gnu/aliases:\ -/overrides/lib/x86_64-linux-gnu:\ -/overrides/lib/i386-linux-gnu:\ -/lib/x86_64-linux-gnu:\ -/lib/i386-linux-gnu" + if ! check_flatpak; then + export PW_LD_LIBRARY_PATH="\ + ${PW_PLUGINS_PATH}/portable/lib/lib64:\ + ${PW_PLUGINS_PATH}/portable/lib/lib32:\ + ${PW_PV_OVERRIDES}/x86_64-linux-gnu/aliases:\ + ${PW_PV_OVERRIDES}/i386-linux-gnu/aliases:\ + /overrides/lib/x86_64-linux-gnu:\ + /overrides/lib/i386-linux-gnu:\ + /lib/x86_64-linux-gnu:\ + /lib/i386-linux-gnu" + fi + if [[ -n "${PATH}" ]] then export PW_PATH="${PATH}:${PW_PLUGINS_PATH}/portable/bin" From de351cb79a6e88daeb852eaa4f1d9ee8b0adbf26 Mon Sep 17 00:00:00 2001 From: Boris Yumankulov Date: Sun, 1 Dec 2024 15:41:42 +0500 Subject: [PATCH 23/48] Fix webkit work on nvidia (fix GOG login) --- data_from_portwine/scripts/functions_helper | 5 +++++ data_from_portwine/scripts/start.sh | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index 6a1eebc9..761f3ad6 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -3259,6 +3259,11 @@ start_portwine () { export int_xneur=1 fi + #https://github.com/flathub/net.lutris.Lutris/pull/368#issuecomment-1751381312 + if [[ (echo $PW_GPU_USE | grep -i nvidia) ]] || [[ $(glxinfo | grep "OpenGL renderer" | grep -i nvidia) ]]; then + export WEBKIT_DISABLE_DMABUF_RENDERER=1 + fi + if check_gamescope_session ; then export PW_GAMEMODERUN_SLR="" elif [[ "$PW_USE_GAMEMODE" = "1" ]] \ diff --git a/data_from_portwine/scripts/start.sh b/data_from_portwine/scripts/start.sh index 885b00fa..5bfd7f4a 100755 --- a/data_from_portwine/scripts/start.sh +++ b/data_from_portwine/scripts/start.sh @@ -95,7 +95,7 @@ unset CHK_SYMLINK_FILE PW_MESA_GL_VERSION_OVERRIDE PW_VKD3D_FEATURE_LEVEL PATH_T unset PW_PREFIX_NAME WINEPREFIX VULKAN_MOD PW_WINE_VER PW_ADD_TO_ARGS_IN_RUNTIME PW_GAMEMODERUN_SLR AMD_VULKAN_ICD PW_WINE_CPU_TOPOLOGY unset MANGOHUD_CONFIG FPS_LIMIT PW_WINE_USE WINEDLLPATH WINE WINEDIR WINELOADER WINESERVER PW_USE_RUNTIME PORTWINE_CREATE_SHORTCUT_NAME MIRROR unset PW_LOCALE_SELECT PW_SETTINGS_INDICATION PW_GUI_START PW_AUTOINSTALL_EXE NOSTSTDIR RADV_DEBUG PW_NO_AUTO_CREATE_SHORTCUT -unset PW_TERM PW_EXEC_FROM_DESKTOP +unset PW_TERM PW_EXEC_FROM_DESKTOP WEBKIT_DISABLE_DMABUF_RENDERER export PORT_WINE_TMP_PATH="${PORT_WINE_PATH}/data/tmp" rm -f "$PORT_WINE_TMP_PATH"/*{exe,msi,tar}* From 73c5bc38b57739b0a74ce417931d191c1a2bfa84 Mon Sep 17 00:00:00 2001 From: Mikhail Tergoev Date: Sun, 1 Dec 2024 14:57:52 +0300 Subject: [PATCH 24/48] updated plugins v18 and gallium nine v0.10 --- data_from_portwine/scripts/var | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data_from_portwine/scripts/var b/data_from_portwine/scripts/var index d510766f..52112895 100755 --- a/data_from_portwine/scripts/var +++ b/data_from_portwine/scripts/var @@ -40,10 +40,10 @@ export PW_DINPUT_PROTOCOL="0" export STAGING_SHARED_MEMORY="1" ###DEFAULT_WINE### export PW_WINE_USE="PROTON_LG" -export PW_PLUGINS_VER="_v17" +export PW_PLUGINS_VER="_v18" export PW_FAKE_DLSS_VER="230506" export PW_FAKE_DLSS_3_VER="090" -export PW_GALLIUM_NINE_VER="0.9" +export PW_GALLIUM_NINE_VER="0.10" ###WINE_AND_PROTON_LG### export PW_PROTON_LG_VER="PROTON_LG_9-19" export PW_WINE_LG_VER="WINE_LG_9-12-2" From 795c77af6f2c386559da840dd2de392a07c4814e Mon Sep 17 00:00:00 2001 From: Mikhail Tergoev Date: Sun, 1 Dec 2024 15:21:40 +0300 Subject: [PATCH 25/48] borders=0 for loading_deck.gif --- data_from_portwine/scripts/functions_helper | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index e23255be..43c51b9c 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -4366,7 +4366,7 @@ pw_start_progress_bar_cover () { [[ "$2" != "--block" ]] && local AUTOCLOUSE="--close-on-unfocus" if check_gamescope_session ; then PW_GIF_FILE="${COVERS_PATH}/loading_deck.gif" - "${pw_yad}" --picture --filename="${PW_GIF_FILE}" $AUTOCLOUSE --no-buttons --undecorated --fullscreen --skip-taskbar > /dev/null 2>&1 & + "${pw_yad}" --picture --filename="${PW_GIF_FILE}" $AUTOCLOUSE --borders=0 --no-buttons --undecorated --fullscreen --skip-taskbar > /dev/null 2>&1 & PW_YAD_PID_PROGRESS_BAR+=($!) elif ! check_start_from_steam ; then PW_GIF_FILE="$1" From c23e800154be268a1f3897391ec0e6031add7e8b Mon Sep 17 00:00:00 2001 From: Mikhail Tergoev Date: Sun, 1 Dec 2024 15:45:58 +0300 Subject: [PATCH 26/48] updated WEBKIT_DISABLE_DMABUF_RENDERER check --- data_from_portwine/scripts/functions_helper | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index 43c51b9c..4e8e6302 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -3266,7 +3266,9 @@ start_portwine () { fi #https://github.com/flathub/net.lutris.Lutris/pull/368#issuecomment-1751381312 - if [[ (echo $PW_GPU_USE | grep -i nvidia) ]] || [[ $(glxinfo | grep "OpenGL renderer" | grep -i nvidia) ]]; then + if [[ "${PW_GPU_USE,,}" =~ nvidia ]] \ + || [[ $(glxinfo | grep "OpenGL renderer" | grep -i nvidia) ]] + then export WEBKIT_DISABLE_DMABUF_RENDERER=1 fi From 9cd86bd8592b3a7d496b68f1a15957075ffd555b Mon Sep 17 00:00:00 2001 From: Mikhail Tergoev Date: Sun, 1 Dec 2024 15:48:48 +0300 Subject: [PATCH 27/48] fixed var: PW_LD_LIBRARY_PATH --- data_from_portwine/scripts/functions_helper | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index 4e8e6302..be361047 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -1678,14 +1678,14 @@ pw_init_runtime () { if ! check_flatpak; then export PW_LD_LIBRARY_PATH="\ - ${PW_PLUGINS_PATH}/portable/lib/lib64:\ - ${PW_PLUGINS_PATH}/portable/lib/lib32:\ - ${PW_PV_OVERRIDES}/x86_64-linux-gnu/aliases:\ - ${PW_PV_OVERRIDES}/i386-linux-gnu/aliases:\ - /overrides/lib/x86_64-linux-gnu:\ - /overrides/lib/i386-linux-gnu:\ - /lib/x86_64-linux-gnu:\ - /lib/i386-linux-gnu" +${PW_PLUGINS_PATH}/portable/lib/lib64:\ +${PW_PLUGINS_PATH}/portable/lib/lib32:\ +${PW_PV_OVERRIDES}/x86_64-linux-gnu/aliases:\ +${PW_PV_OVERRIDES}/i386-linux-gnu/aliases:\ +/overrides/lib/x86_64-linux-gnu:\ +/overrides/lib/i386-linux-gnu:\ +/lib/x86_64-linux-gnu:\ +/lib/i386-linux-gnu" fi From 35a0ae913d652be842544b4d9d3d62888a82492c Mon Sep 17 00:00:00 2001 From: Mikhail Tergoev Date: Sun, 1 Dec 2024 15:48:57 +0300 Subject: [PATCH 28/48] Scripts version 2381 --- data_from_portwine/changelog_en | 11 +++++++++++ data_from_portwine/changelog_ru | 11 +++++++++++ data_from_portwine/scripts/functions_helper | 1 - data_from_portwine/scripts/var | 2 +- 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/data_from_portwine/changelog_en b/data_from_portwine/changelog_en index 3a4331d4..32194b56 100755 --- a/data_from_portwine/changelog_en +++ b/data_from_portwine/changelog_en @@ -2,6 +2,17 @@ You can help us in the development of the project on the website: https://linux- ---------------------------------------- Changelog: +###Scripts version 2381### / Date: 01.12.2024 / Download update size: 180 megabytes +* updated plugins v18 package + * gallium nine v0.10 + * removed unnecessary libraries +* removed white frame when loading PortProton in SteamDeck game mode +* updated cover download scripts for Steam (thanks alex2844) +* added the ability to launch windows shortcuts (thanks alex2844) +* fixed exit from PortProton when using GUI_DISABLED_CS (thanks zorn-v) +* added tooltips for launchers and emulators in the AUTO INSTALLATION tab (thanks if984) +* fixed the login window in GOG on NVIDIA video cards (thanks to Boria138) + ###Scripts version 2380### / stable / Date: 17.11.2024 / Download update size: 4 megabytes * fixed unpacking of prefixes from backups (thanks to Htylol) diff --git a/data_from_portwine/changelog_ru b/data_from_portwine/changelog_ru index 92d1980d..e0288e36 100755 --- a/data_from_portwine/changelog_ru +++ b/data_from_portwine/changelog_ru @@ -2,6 +2,17 @@ ----------------------------------------- История изменений: +###Scripts version 2381### / Дата: 01.12.2024 / Размер скачиваемого обновления: 180 мегабайт +* обновлен пакет plugins v18 + * gallium nine v0.10 + * удалены лишние библиотеки +* убрана белая рамка при загрузке PortProton в игровом режиме SteamDeck +* обновлены скрипты скачивания обложек для Steam (спасибо alex2844) +* добавлена возможность запуска windows ярлыков (спасибо alex2844) +* исправлен выход из PortProton при использовании GUI_DISABLED_CS (спасибо zorn-v) +* добавлены всплывающие подсказки для лаунчеров и эмуляторов во вкладке АВТОУСТАНОВКА (спасибо if984) +* исправлено окно авторизации в GOG на видеокартах NVIDIA (спасибо Boria138) + ###Scripts version 2380### / stable / Дата: 17.11.2024 / Размер скачиваемого обновления: 4 мегабайта * исправлена распаковка префиксов из резервных копий (спасибо Htylol) diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index be361047..6ff87bad 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -1688,7 +1688,6 @@ ${PW_PV_OVERRIDES}/i386-linux-gnu/aliases:\ /lib/i386-linux-gnu" fi - if [[ -n "${PATH}" ]] then export PW_PATH="${PATH}:${PW_PLUGINS_PATH}/portable/bin" else export PW_PATH="${PW_PLUGINS_PATH}/portable/bin" diff --git a/data_from_portwine/scripts/var b/data_from_portwine/scripts/var index 52112895..030217ed 100755 --- a/data_from_portwine/scripts/var +++ b/data_from_portwine/scripts/var @@ -1,6 +1,6 @@ #!/usr/bin/env bash #Author: Castro-Fidel (linux-gaming.ru) -#SCRIPTS_NEXT_VERSION=2380 +#SCRIPTS_NEXT_VERSION=2381 #SCRIPTS_STABLE_VERSION=2380 ######################################################################## export AI_TOP_GAMES="PW_LGC PW_VKPLAY PW_EPIC PW_BATTLE_NET PW_WORLD_OF_SEA_BATTLE PW_RUSSIAN_FISHING PW_HO_YO_PLAY PW_FARLIGHT84 PW_WARFRAME PW_WGC PW_UBISOFT" From b1076a47effbe9c0608ebad107f2a0eb6f0d47b0 Mon Sep 17 00:00:00 2001 From: Htylol Date: Sun, 1 Dec 2024 18:20:51 +0500 Subject: [PATCH 29/48] Fixed bug for name_desktop_png --- data_from_portwine/scripts/functions_helper | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index 6ff87bad..d679c526 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -2793,6 +2793,7 @@ edit_user_conf_from_gui () { } pw_create_gui_png () { + unset PORTPROTON_NAME name_desktop_png basename_portwine_exe="$(basename "${portwine_exe}")" if echo "$basename_portwine_exe" | grep -ie 'setup\|install\|\.msi$' &>/dev/null ; then export PW_ICON_FOR_YAD="${PORT_WINE_PATH}/data/img/setup.png" @@ -5945,7 +5946,6 @@ portwine_create_shortcut () { pw_stop_progress_bar pw_exit_tray [[ ! -e ${portwine_exe} ]] && return 1 - unset PORTPROTON_NAME name_desktop_png pw_create_gui_png [[ -z "${PW_SHORTCUT_MENU}" ]] && PW_SHORTCUT_MENU="TRUE" @@ -6123,6 +6123,7 @@ portwine_change_shortcut () { create_name_desktop export name_desktop="$PW_NAME_DESKTOP_PROXY" + pw_create_gui_png [[ -z "${name_desktop_png}" ]] && name_desktop_png="${PORTPROTON_NAME// /_}" OUTPUT=$("${pw_yad}" --title="${translations[Choices]}" --form \ From f3c6482099adb861a892d245525e38b605765b18 Mon Sep 17 00:00:00 2001 From: Htylol Date: Mon, 2 Dec 2024 03:55:22 +0500 Subject: [PATCH 30/48] Added check_vendor_gpu function --- data_from_portwine/scripts/functions_helper | 59 +++++++++++++++++---- 1 file changed, 50 insertions(+), 9 deletions(-) diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index 6ff87bad..8896216c 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -833,6 +833,51 @@ check_selinux () { } export -f check_selinux +check_vendor_gpu () { + unset VENDOR_GPU_USE + if [[ $PW_GPU_USE != disabled ]] ; then + case "${PW_GPU_USE,,}" in + *nvidia*) + [[ -d /sys/bus/pci/drivers/nvidia ]] && VENDOR_GPU_USE+=("nvidia") + [[ -d /sys/bus/pci/drivers/nouveau ]] && VENDOR_GPU_USE+=("nouveau") + ;; + *amd*) + [[ -d /sys/bus/pci/drivers/amdgpu ]] && VENDOR_GPU_USE+=("amd") + ;; + *intel*) + [[ -d /sys/bus/pci/drivers/i915 ]] && VENDOR_GPU_USE+=("intel") + ;; + esac + fi + + if command -v glxinfo &>/dev/null ; then + if [[ ! -f "${PW_TMPFS_PATH}/glxinfo.tmp" ]] ; then + glxinfo -B &> "${PW_TMPFS_PATH}/glxinfo.tmp" + fi + case "$(<"${PW_TMPFS_PATH}/glxinfo.tmp" tr '[:upper:]' '[:lower:]')" in + *nvidia*) + [[ -d /sys/bus/pci/drivers/nvidia ]] && VENDOR_GPU_USE+=("nvidia") + [[ -d /sys/bus/pci/drivers/nouveau ]] && VENDOR_GPU_USE+=("nouveau") + ;; + *amd*) + [[ -d /sys/bus/pci/drivers/amdgpu ]] && VENDOR_GPU_USE+=("amd") + ;; + *intel*) + [[ -d /sys/bus/pci/drivers/i915 ]] && VENDOR_GPU_USE+=("intel") + ;; + esac + fi + + if [[ -z ${VENDOR_GPU_USE[0]} ]] ; then + [[ -d /sys/bus/pci/drivers/nvidia ]] && VENDOR_GPU_USE+=("nvidia") + [[ -d /sys/bus/pci/drivers/nouveau ]] && VENDOR_GPU_USE+=("nouveau") + [[ -d /sys/bus/pci/drivers/amdgpu ]] && VENDOR_GPU_USE+=("amd") + [[ -d /sys/bus/pci/drivers/i915 ]] && VENDOR_GPU_USE+=("intel") + fi + + echo "${VENDOR_GPU_USE[*]}" +} + background_pid () { local arg1 arg2 arg3 PID arg1=$1 # --start или --end @@ -3265,11 +3310,7 @@ start_portwine () { fi #https://github.com/flathub/net.lutris.Lutris/pull/368#issuecomment-1751381312 - if [[ "${PW_GPU_USE,,}" =~ nvidia ]] \ - || [[ $(glxinfo | grep "OpenGL renderer" | grep -i nvidia) ]] - then - export WEBKIT_DISABLE_DMABUF_RENDERER=1 - fi + [[ $(check_vendor_gpu) =~ nvidia ]] && export WEBKIT_DISABLE_DMABUF_RENDERER=1 if check_gamescope_session ; then export PW_GAMEMODERUN_SLR="" @@ -3462,7 +3503,7 @@ start_portwine () { then export LIBGL_KOPPER_DRI2="1" fi - if [[ -d /sys/bus/pci/drivers/nouveau ]] ; then + if [[ $(check_vendor_gpu) =~ nouveau ]] ; then export NOUVEAU_USE_ZINK="1" fi ;; @@ -3979,7 +4020,7 @@ start_portwine () { || check_gamescope_session then export vk_xwayland_wait_ready="false" - if [[ -d /sys/bus/pci/drivers/amdgpu ]] ; then + if [[ $(check_vendor_gpu) =~ amd ]] ; then export RADV_DEBUG+="nodcc " export AMD_DEBUG="nodcc" if [[ ! $(<"${PW_TMPFS_PATH}/vulkaninfo.tmp") =~ VK_EXT_image_drm_format_modifier ]] ; then @@ -3987,10 +4028,10 @@ start_portwine () { grep -e '--backend' "${PW_TMPFS_PATH}/gamescope.tmp" &>/dev/null && PW_GS_BACKEND_SDL="1" fi fi - if [[ -d /sys/bus/pci/drivers/i915 ]] ; then + if [[ $(check_vendor_gpu) =~ intel ]] ; then export INTEL_DEBUG="norbc" fi - if [[ -d /sys/bus/pci/drivers/nvidia ]] ; then + if [[ $(check_vendor_gpu) =~ nvidia ]] ; then PW_GAMESCOPE_VARIABLES_BEFORE+="__GL_THREADED_OPTIMIZATIONS=0 " PW_GAMESCOPE_VARIABLES_AFTER+="__GL_THREADED_OPTIMIZATIONS=1 " fi From 933b4ee115a260e9da1f37d8d7353b6b7f7947a9 Mon Sep 17 00:00:00 2001 From: Htylol Date: Mon, 2 Dec 2024 01:28:46 +0500 Subject: [PATCH 31/48] Fixed icon bug --- data_from_portwine/scripts/start.sh | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/data_from_portwine/scripts/start.sh b/data_from_portwine/scripts/start.sh index c12bd25c..16c2d78e 100755 --- a/data_from_portwine/scripts/start.sh +++ b/data_from_portwine/scripts/start.sh @@ -700,28 +700,32 @@ else IFS=$'\n' PW_GENERATE_BUTTONS="--field= ${translations[Create shortcut...]}!${PW_GUI_ICON_PATH}/find_48.svg!:FBTNR%@bash -c \"button_click --normal pw_find_exe\"%" for dp in "${PW_AMOUNT_NEW_DESKTOP[@]}" "${PW_AMOUNT_OLD_DESKTOP[@]}" ; do - PW_NAME_D_ICON_48="${PW_ICON_PATH[dp]%.png}_48" - PW_NAME_D_ICON_128="${PW_ICON_PATH[dp]%.png}" - PW_NAME_D_ICON_NEW="${PW_NAME_D_ICON[dp]//\"/}" - resize_png "$PW_NAME_D_ICON_NEW" "${PW_NAME_D_ICON_48//"${PORT_WINE_PATH}/data/img/"/}" "48" - resize_png "$PW_NAME_D_ICON_NEW" "${PW_NAME_D_ICON_128//"${PORT_WINE_PATH}/data/img/"/}" "128" - PW_DESKTOP_FILES="${PW_ALL_DF[$dp]}" PW_DESKTOP_FILES_SHOW="$PW_DESKTOP_FILES" - if [[ $PW_DESKTOP_FILES =~ [\(\)\!\$\%\&\`\'\"\>\<\\\|\;] ]] ; then - PW_DESKTOP_FILES_SHOW_REGEX=(\! % \$ \& \<) - PW_DESKTOP_FILES_REGEX=(\( \) \! \$ % \& \` \' \" \> \< \\ \| \;) + PW_ICON_PATH[dp]=${PW_ICON_PATH[dp]%.png} + PW_NAME_D_ICON_NEW="${PW_NAME_D_ICON[dp]//\"/}" + PW_NAME_D_ICON_128="${PW_ICON_PATH[dp]}" + resize_png "$PW_NAME_D_ICON_NEW" "${PW_NAME_D_ICON_128//"${PORT_WINE_PATH}/data/img/"/}" "128" + if [[ $PW_DESKTOP_FILES =~ [\!\%\$\&\<] || ${PW_ICON_PATH[dp]} =~ [\!\%\$\&\<] ]] ; then + PW_DESKTOP_FILES_SHOW_REGEX=(\! % \$ \& \<) for i in "${PW_DESKTOP_FILES_SHOW_REGEX[@]}" ; do PW_DESKTOP_FILES_SHOW="${PW_DESKTOP_FILES_SHOW//$i/}" + PW_ICON_PATH[dp]="${PW_ICON_PATH[dp]//$i/}" done + fi + PW_NAME_D_ICON_48="${PW_ICON_PATH[dp]}_48" + resize_png "$PW_NAME_D_ICON_NEW" "${PW_NAME_D_ICON_48//"${PORT_WINE_PATH}/data/img/"/}" "48" + if [[ $PW_DESKTOP_FILES =~ [\(\)\!\$\%\&\`\'\"\>\<\\\|\;] ]] ; then + PW_DESKTOP_FILES_REGEX=(\( \) \! \$ % \& \` \' \" \> \< \\ \| \;) count=1 for j in "${PW_DESKTOP_FILES_REGEX[@]}" ; do PW_DESKTOP_FILES="${PW_DESKTOP_FILES//$j/#+_$count#}" (( count++ )) done fi + PW_GENERATE_BUTTONS+="--field= $(print_wrapped "${PW_DESKTOP_FILES_SHOW//".desktop"/""}" "25" "...")!${PW_NAME_D_ICON_48}.png!:FBTNR%@bash -c \"button_click --desktop "${PW_DESKTOP_FILES// /#@_@#}"\"%" done From da08048e01f6f44fd43ed2d0b4e3afa5468f0b7d Mon Sep 17 00:00:00 2001 From: Boris Yumankulov Date: Wed, 11 Dec 2024 17:02:18 +0500 Subject: [PATCH 32/48] Fix portproton --reinstall command --- data_from_portwine/scripts/functions_helper | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index 6ff87bad..7a78a4e0 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -1503,6 +1503,17 @@ pw_reinstall_pp () { then echo "" exit 1 + else + pw_clear_pfx + try_remove_dir "${PORT_WINE_PATH}/data/dist" + create_new_dir "${PORT_WINE_PATH}/data/dist" + try_remove_dir "${PORT_WINE_TMP_PATH}/VULKAN" + try_remove_file "${PORT_WINE_TMP_PATH}/scripts_update_notifier" + try_remove_file "${PORT_WINE_PATH}/data/user.conf" + try_remove_file "${PORT_WINE_TMP_PATH}/scripts_ver" + echo "" + unset SKIP_CHECK_UPDATES + print_info "Restarting PP for reinstall files..." fi elif yad_question "${translations[Do you really want to reinstall PortProton?\\nFor this, an internet connection will be required.]}" ; then pw_clear_pfx From d7113ad5d5d243a7cc696e52620187206c35004b Mon Sep 17 00:00:00 2001 From: Mikhail Tergoev Date: Thu, 12 Dec 2024 11:19:29 +0300 Subject: [PATCH 33/48] added fallout2.ppdb --- data_from_portwine/scripts/portwine_db/fallout2.ppdb | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 data_from_portwine/scripts/portwine_db/fallout2.ppdb diff --git a/data_from_portwine/scripts/portwine_db/fallout2.ppdb b/data_from_portwine/scripts/portwine_db/fallout2.ppdb new file mode 100644 index 00000000..758bb5e9 --- /dev/null +++ b/data_from_portwine/scripts/portwine_db/fallout2.ppdb @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +#Author: fidel +#FSonora+DLC.exe +#Rating=1-5 +#####################examples########################### +export WINEDLLOVERRIDES="ddraw=n,b" +export PW_WINE_USE="WINE_LG" From f7c9fee8c108038721adfe87515c65d579be52bb Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Fri, 13 Dec 2024 19:09:54 +0500 Subject: [PATCH 34/48] support egs --- data_from_portwine/scripts/functions_helper | 114 +++++++++++++++----- 1 file changed, 90 insertions(+), 24 deletions(-) diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index 6ff87bad..9074d8c5 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -4237,24 +4237,64 @@ portwine_launch () { fi [[ $PW_LOG != 1 ]] && debug_timer --start -s "PW_TIME_IN_GAME" - case "${portwine_exe,,}" in - *.exe) - pw_run "${PW_VD_TMP[@]}" ${WINE_WIN_START} "$portwine_exe" - ;; - *.bat) - PW_USE_TERMINAL=1 - pw_run "${PW_VD_TMP[@]}" "$portwine_exe" - ;; - *.msi) - pw_run "${PW_VD_TMP[@]}" msiexec /i "$portwine_exe" - ;; - *.reg) - pw_run "${PW_VD_TMP[@]}" regedit "$portwine_exe" - ;; - *) - pw_run "${PW_VD_TMP[@]}" winefile - ;; - esac + if [[ -n "${LAUNCH_URI}" ]]; then + WINEPROCESSES="^(start|winedbg|conhost|explorer|tabtip|services|rpcss|svchost|plugplay|winedevice).exe$" + if [[ "${LAUNCH_URI}" =~ ^com.epicgames.launcher ]]; then + WINEPROCESSES+="|^EOSOverlayRenderer|(EpicGamesLauncher|EpicWebHelper).exe$" + fi + pw_run start /high /b "${LAUNCH_URI}" & + while true; do + sleep 5 + if [[ -z "${exe_pid}" || ! -e "/proc/${exe_pid}" ]]; then + processes=$("${WINEDIR}/bin/winedbg" --command "info proc" 2>/dev/null) + exe_path=$(echo "${processes}" | grep -oP "(?<=\s)'[^']+'" | sed "s/^'//;s/'$//" | grep -Ev "${WINEPROCESSES}" | head -n 1) + echo "${processes}" > "${PORT_WINE_TMP_PATH}/processes" + if [[ -n "${exe_path}" ]]; then + unset exe_pid + isCmdline=FALSE + isMaps=FALSE + for pid in $(ls -lr /proc/*/exe | grep -E 'wine(64)?-preloader' | awk -F/ '{print $3}'); do + if [[ "$(tr '\0' ' ' < "/proc/${pid}/cmdline" 2>/dev/null)" == *"${exe_path}"* ]]; then + exe_pid="${pid}" + isCmdline=TRUE + elif grep -q "${exe_path}" "/proc/${pid}/maps" 2>/dev/null; then + exe_pid="${pid}" + isMaps=TRUE + else + continue + fi + break + done + echo "find proc: ${exe_path} [${exe_pid}|${isCmdline}|${isMaps}]" + elif [[ -n "${exe_pid}" ]]; then + echo "end proc: ${exe_pid}" + break; + fi + echo "update processes list" + else + echo "process isset: ${exe_pid}" + fi + done + else + case "${portwine_exe,,}" in + *.exe) + pw_run "${PW_VD_TMP[@]}" ${WINE_WIN_START} "$portwine_exe" + ;; + *.bat) + PW_USE_TERMINAL=1 + pw_run "${PW_VD_TMP[@]}" "$portwine_exe" + ;; + *.msi) + pw_run "${PW_VD_TMP[@]}" msiexec /i "$portwine_exe" + ;; + *.reg) + pw_run "${PW_VD_TMP[@]}" regedit "$portwine_exe" + ;; + *) + pw_run "${PW_VD_TMP[@]}" winefile + ;; + esac + fi } pw_winecfg () { @@ -6043,18 +6083,21 @@ portwine_output_yad_shortcut () { parse_lnk () { prefix_name=$(echo "$1" | awk -F"/prefixes/" '{print $2}' | awk -F"/" '{print $1}') - if fix_icon_name=$(grep -i "Icon File Name" "${PW_TMPFS_PATH}/exiftool.tmp" 2>/dev/null) \ - && [[ "${fix_icon_name//*.exe/true}" == "true" ]] ; then - link_drive=$(sed -n 's/^Icon File Name\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp" | cut -d: -f1 | awk '{print tolower($0)}') - link_path=$(sed -n 's/^Icon File Name\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp" | sed 's|%ProgramFiles(x86)%|C:\\Program Files (x86)|gi;s|%ProgramFiles%|C:\\Program Files|gi' | sed "s|^.|${PORT_WINE_PATH}/data/prefixes/${prefix_name:-DEFAULT}/dosdevices/$link_drive|g" | sed 's/\\/\//g') + if fix_icon_name=$(grep -i "Icon File Name" "${PW_TMPFS_PATH}/exiftool.tmp" 2>/dev/null) && [[ "${fix_icon_name//*.exe/true}" == "true" ]] ; then + exe_path=$(sed -n 's/^Icon File Name\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp") else - link_drive=$(sed -n 's/^Local Base Path\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp" | cut -d: -f1 | awk '{print tolower($0)}') - link_path=$(sed -n 's/^Local Base Path\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp" | sed 's|%ProgramFiles(x86)%|C:\\Program Files (x86)|gi;s|%ProgramFiles%|C:\\Program Files|gi' | sed "s|^.|${PORT_WINE_PATH}/data/prefixes/${prefix_name:-DEFAULT}/dosdevices/$link_drive|g" | sed 's/\\/\//g') + exe_path=$(sed -n 's/^Local Base Path\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp") fi + get_lnk_path "${exe_path}" link_name=$(sed -n 's/^File Name\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp" | sed 's|\.lnk||') link_cmd=$(sed -n 's/^Command Line Arguments\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp") } +get_lnk_path () { + link_drive=$(echo "$1" | cut -d: -f1 | awk '{print tolower($0)}') + link_path=$(echo "$1" | sed 's|%ProgramFiles(x86)%|C:\\Program Files (x86)|gi;s|%ProgramFiles%|C:\\Program Files|gi' | sed "s|^.|${PORT_WINE_PATH}/data/prefixes/${prefix_name:-${PW_PREFIX_NAME:-DEFAULT}}/dosdevices/${link_drive}|g" | sed 's/\\/\//g') +} + get_lnk () { if command -v exiftool &>/dev/null ; then if timeout 3 exiftool "$1" &> "${PW_TMPFS_PATH}/exiftool.tmp" ; then @@ -6079,6 +6122,29 @@ pw_auto_create_shortcut () { return 0 fi + if [[ "${portwine_exe}" =~ EpicGamesLauncher.exe$ ]]; then + for item_file in "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/ProgramData/Epic/EpicGamesLauncher/Data/Manifests/"*".item"; do + if [[ -f "${item_file}" ]]; then + exe_path=$(jq -r '.InstallLocation + "\\" + .LaunchExecutable' "${item_file}") + get_lnk_path "${exe_path}" + PORTWINE_CREATE_SHORTCUT_NAME=$(jq -r '.DisplayName' "${item_file}") + if ! exe_path="$(realpath "${link_path}" 2>/dev/null)" || [[ ! -f "${exe_path}" ]]; then + print_warning "Link broken for: ${PORTWINE_CREATE_SHORTCUT_NAME}" + elif [[ ! -f "${exe_path}.ppdb" ]]; then + unset FILE_SHA256SUM DESKTOP_NAME_FILE DESKTOP_CORRECT_FILE + item_id=$(jq -r '.AppName' "${item_file}") + portwine_exe="${exe_path}" + PORTWINE_DB_FILE="${portwine_exe}.ppdb" + LAUNCH_URI="com.epicgames.launcher://apps/${item_id}?action=launch&silent=true" + pw_init_db + edit_db_from_gui PW_PREFIX_NAME LAUNCH_URI + portwine_create_shortcut + fi + fi + done + return 0 + fi + unset LINKS for link_file in "${PORT_WINE_PATH}"/data/prefixes/*/drive_c/users/*/Desktop/*.lnk ; do link_file=$(readlink -f "$link_file") From fc565a2de8e8b7efb5a9bc7806c1a1585d2d29a9 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Fri, 13 Dec 2024 19:13:00 +0500 Subject: [PATCH 35/48] removed debug information --- data_from_portwine/scripts/functions_helper | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index 9074d8c5..95cff3d2 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -4245,34 +4245,24 @@ portwine_launch () { pw_run start /high /b "${LAUNCH_URI}" & while true; do sleep 5 - if [[ -z "${exe_pid}" || ! -e "/proc/${exe_pid}" ]]; then + if [[ -z "${exe_pid}" || ! -e "/proc/${exe_pid}" ]]; then processes=$("${WINEDIR}/bin/winedbg" --command "info proc" 2>/dev/null) exe_path=$(echo "${processes}" | grep -oP "(?<=\s)'[^']+'" | sed "s/^'//;s/'$//" | grep -Ev "${WINEPROCESSES}" | head -n 1) - echo "${processes}" > "${PORT_WINE_TMP_PATH}/processes" if [[ -n "${exe_path}" ]]; then unset exe_pid - isCmdline=FALSE - isMaps=FALSE for pid in $(ls -lr /proc/*/exe | grep -E 'wine(64)?-preloader' | awk -F/ '{print $3}'); do if [[ "$(tr '\0' ' ' < "/proc/${pid}/cmdline" 2>/dev/null)" == *"${exe_path}"* ]]; then exe_pid="${pid}" - isCmdline=TRUE elif grep -q "${exe_path}" "/proc/${pid}/maps" 2>/dev/null; then exe_pid="${pid}" - isMaps=TRUE else continue fi break done - echo "find proc: ${exe_path} [${exe_pid}|${isCmdline}|${isMaps}]" elif [[ -n "${exe_pid}" ]]; then - echo "end proc: ${exe_pid}" - break; + break fi - echo "update processes list" - else - echo "process isset: ${exe_pid}" fi done else From 8c60222c274c08aed980c60d26425838822359ae Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Fri, 13 Dec 2024 19:23:37 +0500 Subject: [PATCH 36/48] "${PORT_WINE_TMP_PATH}/processes" --- data_from_portwine/scripts/functions_helper | 1 + 1 file changed, 1 insertion(+) diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index 95cff3d2..7521f6d3 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -4248,6 +4248,7 @@ portwine_launch () { if [[ -z "${exe_pid}" || ! -e "/proc/${exe_pid}" ]]; then processes=$("${WINEDIR}/bin/winedbg" --command "info proc" 2>/dev/null) exe_path=$(echo "${processes}" | grep -oP "(?<=\s)'[^']+'" | sed "s/^'//;s/'$//" | grep -Ev "${WINEPROCESSES}" | head -n 1) + echo "${processes}" > "${PORT_WINE_TMP_PATH}/processes" if [[ -n "${exe_path}" ]]; then unset exe_pid for pid in $(ls -lr /proc/*/exe | grep -E 'wine(64)?-preloader' | awk -F/ '{print $3}'); do From b271c045040c641e751ad6be613183ee6d191807 Mon Sep 17 00:00:00 2001 From: Boris Yumankulov Date: Sat, 7 Dec 2024 16:45:29 +0500 Subject: [PATCH 37/48] Returned select needed amd vulkan implementation --- data_from_portwine/scripts/functions_helper | 120 +++++++++++++++++--- data_from_portwine/scripts/start.sh | 4 +- 2 files changed, 109 insertions(+), 15 deletions(-) diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index 6ff87bad..7faf75b0 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -544,7 +544,7 @@ try_force_link_dir () { if [[ ! -d "$1" ]] ; then print_info "directory $1 not found for link" elif [[ -z "$2" ]] ; then print_error "no way to link directory $1" else - if ln -s -f -r "$1" "$2" ; then + if ln -s -f -r "$1" "$2" ; then return 0 else print_error "failed to link directory $1 to $2" @@ -584,7 +584,7 @@ try_download () { export dest="$2" local silent="false" export no_mirror="false" - + case "$3" in silent) silent=true ;; @@ -1638,7 +1638,7 @@ init_wine_ver () { export WINEDLLPATH+=":${PATH_TO_GAME}" fi fi - + if ! check_flatpak ; then export WINE_LIBRARY_PATH="${WINEDIR}/lib64:${WINEDIR}/lib" fi @@ -1954,7 +1954,7 @@ stop_portwine () { case "$1" in --restart) restart_pp ;; - *) + *) unset SKIP_CHECK_UPDATES exit 0 ;; esac @@ -2381,9 +2381,45 @@ pw_init_db () { fi fi + case "${PW_AMD_VULKAN_USE}" in + "amdvlk") + PW_VK_ICD_FILENAMES="" + for dir in /opt/amdgpu/etc/vulkan/icd.d /etc/vulkan/icd.d /usr/share/vulkan/icd.d; do + for file in "$dir"/amd_icd*.json; do + [ -f "$file" ] && PW_VK_ICD_FILENAMES="${PW_VK_ICD_FILENAMES:+${PW_VK_ICD_FILENAMES}:}$file" + done + done + export PW_VK_ICD_FILENAMES + ;; + + "amdgpupro") + PW_VK_ICD_FILENAMES="" + for dir in /opt/amdgpu-pro/etc/vulkan/icd.d /usr/share/vulkan/icd.d; do + for file in "$dir"/amd_pro_icd*.json; do + [ -f "$file" ] && PW_VK_ICD_FILENAMES="${PW_VK_ICD_FILENAMES:+${PW_VK_ICD_FILENAMES}:}$file" + done + done + + # add libs from https://github.com/CosmicFusion/fedora-amdgpu-pro/tree/main/x86_64/libdrm-pro to ld_library_path (this repo is deprecated and archived but why not) + echo "$PW_VK_ICD_FILENAMES" | grep -qi "/opt/amdgpu-pro/etc/vulkan/icd.d/amd_icd.*.json" && \ + var_ld_library_path_update "/opt/amdgpu/libdrm/lib64:/opt/amdgpu/libdrm/lib32" + + export PW_VK_ICD_FILENAMES + ;; + + "radv") + PW_VK_ICD_FILENAMES="" + for file in /usr/share/vulkan/icd.d/radeon_icd.{i686,x86_64}.json; do + [ -f "$file" ] && PW_VK_ICD_FILENAMES="${PW_VK_ICD_FILENAMES:+${PW_VK_ICD_FILENAMES}:}$file" + done + export PW_VK_ICD_FILENAMES + ;; + esac + + [[ "${START_FROM_STEAM}" == 1 ]] && export PW_GUI_DISABLED_CS=1 [[ "${START_FROM_PP_GUI}" == 1 ]] && export PW_GUI_DISABLED_CS=0 && unset START_FROM_PP_GUI - + return 0 } @@ -2704,6 +2740,49 @@ pw_skip_get_info () { export LOCALE_LIST fi + GET_AMD_VULKAN_DRIVER_LIST="amdvlk amdgpupro radv" + unset AMD_VULKAN_DRIVER_LIST + + for DRIVER in $GET_AMD_VULKAN_DRIVER_LIST; do + case "$DRIVER" in + "amdvlk") + for file in /opt/amdgpu/etc/vulkan/icd.d/amd_icd*.json \ + /etc/vulkan/icd.d/amd_icd*.json \ + /usr/share/vulkan/icd.d/amd_icd*.json ; do + if [ -f "$file" ]; then + AMD_VULKAN_DRIVER_LIST+="amdvlk" + break + fi + done + ;; + "amdgpupro") + for file in /opt/amdgpu-pro/etc/vulkan/icd.d/amd_icd*.json \ + /usr/share/vulkan/icd.d/amd_pro_icd*.json; do + if [ -f "$file" ]; then + AMD_VULKAN_DRIVER_LIST+="!amdgpupro" + break + fi + done + ;; + "radv") + for file in /usr/share/vulkan/icd.d/radeon_icd.*.json ; do + if [ -f "$file" ]; then + AMD_VULKAN_DRIVER_LIST+="!radv" + break + fi + done + ;; + esac + done + export AMD_VULKAN_DRIVER_LIST + + if [[ -z "$AMD_VULKAN_DRIVER_LIST" ]] || check_flatpak ; then + AMD_VULKAN_CB=":DCB" + else + AMD_VULKAN_CB=":CB" + fi + export AMD_VULKAN_CB + logical_cores=$(grep -c ^"processor" /proc/cpuinfo) if [[ "${logical_cores}" -le "4" ]] ; then GET_LOGICAL_CORE="1!$(seq -s! 1 $(( logical_cores - 1 )))" @@ -2760,7 +2839,7 @@ edit_db_from_gui () { if [[ $(<"${PORTWINE_DB_FILE}") =~ export\ ${mod_db}= ]] then sed -i "s|export ${mod_db}=.*|export ${mod_db}=\"$proxy_mod_db\"|g" "${PORTWINE_DB_FILE}" else echo "export ${mod_db}=\"$proxy_mod_db\"" >> "${PORTWINE_DB_FILE}" - fi + fi done fi return 0 @@ -2964,7 +3043,7 @@ start_portwine () { then touch "${WINEPREFIX}/.${FILE_NAME_PFX}" else try_remove_file "${PFX_TMP}/${FILE_NAME_PFX}.tar.xz" - yad_error_download && exit 1 + yad_error_download && exit 1 fi fi fi @@ -3166,7 +3245,7 @@ start_portwine () { export DXVK_NVAPI_ALLOW_OTHER_DRIVERS="1" export WINEHAGS="1" ;; - + *) sed -i /'dxgi.customDeviceDesc =/c # dxgi.customDeviceDesc =' "${DXVK_CONFIG_FILE}" sed -i /'dxgi.customDeviceId =/c # dxgi.customDeviceId =' "${DXVK_CONFIG_FILE}" @@ -3181,7 +3260,7 @@ start_portwine () { # NVAPI, DLSS AND FAKE DLSS if [[ "${PW_USE_FAKE_DLSS_3}" == "1" ]] ; then - FAKE_DLSS_3_FILES="amd_fidelityfx_dx12.dll amd_fidelityfx_vk.dll dlss-enabler.dll dlss-enabler-upscaler.dll + FAKE_DLSS_3_FILES="amd_fidelityfx_dx12.dll amd_fidelityfx_vk.dll dlss-enabler.dll dlss-enabler-upscaler.dll dlssg_to_fsr3_amd_is_better-3.0.dll dlssg_to_fsr3_amd_is_better.dll libxess.dll nvapi64-proxy.dll winmm.dll _nvngx.dll nvngx-wrapper.dll nvngx.ini" DXVK_ENABLE_NVAPI="1" @@ -3251,7 +3330,7 @@ start_portwine () { var_vkd3d_config_update nodxr fi - if [[ "${PW_GPU_USE}" != "disabled" ]] ; then + if [[ "${PW_GPU_USE}" != "disabled" ]] && [[ "${PW_AMD_VULKAN_USE}" == "disabled" ]] ; then export DXVK_FILTER_DEVICE_NAME="${PW_GPU_USE}" export VKD3D_FILTER_DEVICE_NAME="${PW_GPU_USE}" fi @@ -3813,6 +3892,11 @@ start_portwine () { export WINE_CPU_TOPOLOGY="${PW_WINE_CPU_TOPOLOGY}" fi + if [[ ! -z "${PW_VK_ICD_FILENAMES}" ]] ; then + export VK_ICD_FILENAMES="${PW_VK_ICD_FILENAMES}" + export VK_DRIVER_FILES="${PW_VK_ICD_FILENAMES}" + fi + if [[ "${PW_MESA_GL_VERSION_OVERRIDE}" != "disabled" ]] ; then export MESA_GL_VERSION_OVERRIDE="${PW_MESA_GL_VERSION_OVERRIDE}" if [[ $PW_MESA_GL_VERSION_OVERRIDE = 3.2COMPAT ]] ; then @@ -3840,7 +3924,7 @@ start_portwine () { fi #run_winetricks_from_db - if [[ -n "${PW_MUST_HAVE_DLL}" ]] ; then + if [[ -n "${PW_MUST_HAVE_DLL}" ]] ; then PW_DLL_INSTALL="$(echo "${PW_MUST_HAVE_DLL} ${PW_DLL_INSTALL}" | awk '{ for(i=1;i<=NF;i++){a[$i]++} }END{ for(i in a){printf("%s ",i)} }' )" export PW_DLL_INSTALL fi @@ -4104,7 +4188,7 @@ pw_run () { PW_LD_LIBRARY_PATH="${PW_LD_LIBRARY_PATH}:${WINE_LIBRARY_PATH}" print_var "WINEDIR" "WINEPREFIX" "WINEDLLOVERRIDES" "PATH_TO_GAME" "PW_WINE_USE" "PW_VULKAN_USE" "VULKAN_DRIVER_NAME" print_var "VKD3D_CONFIG" "PW_LD_LIBRARY_PATH" "PATH" "WINEESYNC" "WINEFSYNC" "WINEFSYNC_FUTEX2" - print_var "WINEDLLPATH" "WINE_CPU_TOPOLOGY" "PW_RUN_GAMESCOPE" "LD_LIBRARY_PATH" + print_var "WINEDLLPATH" "WINE_CPU_TOPOLOGY" "PW_RUN_GAMESCOPE" "LD_LIBRARY_PATH" "PW_VK_ICD_FILENAMES" if [[ "$PW_USE_RUNTIME" == 1 ]] \ && [[ "$PW_WINE_USE" != "USE_SYSTEM_WINE" ]] then @@ -4915,6 +4999,14 @@ gui_edit_db () { CPU_LIMIT_VAR="disabled" fi + if [[ ! -z "${PW_AMD_VULKAN_USE}" ]] && \ + [[ "${PW_AMD_VULKAN_USE}" != "disabled" ]] ; then + AMD_VULKAN_VAR="${PW_AMD_VULKAN_USE}" + export DISABLE_LAYER_AMD_SWITCHABLE_GRAPHICS_1=1 + else + AMD_VULKAN_VAR="disabled" + fi + "${pw_yad}" --plug=$KEY_EDIT_DB_GUI --tabnum="2" --form --separator="%" --columns=1 \ --field="${translations[Change the version of WINDOWS emulation]}!${translations[Changing the WINDOWS emulation version may be required to run older games. WINDOWS versions below 10 do not support new games with DirectX 12]} :CB" "${ADD_WINVER_EDIT_DB}" \ --field="${translations[AUTOINSTALL WITH WINETRICKS]}!${translations[Automatically install with WINETRICKS additional libraries required to run the game/program. List of libraries separated by spaces]} :CBE" "$(combobox_fix --empty "${PW_DLL_INSTALL}" "vcrun2019 corefonts lucida")" \ @@ -4937,6 +5029,7 @@ A brief instruction: immediate - Unlimited frame rate + tearing. mailbox - Triple buffering. Unlimited frame rate + no tearing. relaxed - Same as fifo but allows tearing when below the monitors refresh rate.]} :CB" "$(combobox_fix --disabled "${PW_MESA_VK_WSI_PRESENT_MODE}" "fifo!immediate!mailbox!relaxed")" \ + --field="${translations[Select needed AMD vulkan implementation]}!${translations[Choosing which implementation of vulkan will be used to run the game]} $AMD_VULKAN_CB" "$(combobox_fix --disabled "$AMD_VULKAN_VAR" "$AMD_VULKAN_DRIVER_LIST")" \ 1> "$PW_TMPFS_PATH/tmp_output_yad_fps_limit" 2>/dev/null & "${pw_yad}" --notebook --key="$KEY_EDIT_DB_GUI" --title "${translations[EDIT DB]}" --text-align=center \ @@ -4986,6 +5079,7 @@ relaxed - Same as fifo but allows tearing when below the monitors refresh rate.] PW_VKD3D_FEATURE_LEVEL="${PW_ADD_SETTINGS[6]}" PW_LOCALE_SELECT="${PW_ADD_SETTINGS[7]}" PW_MESA_VK_WSI_PRESENT_MODE="${PW_ADD_SETTINGS[8]}" + PW_AMD_VULKAN_USE="${PW_ADD_SETTINGS[9]}" if [[ "${CPU_LIMIT}" =~ ^[0-9]+$ ]] ; then PW_WINE_CPU_TOPOLOGY="${CPU_LIMIT}:$(seq -s, 0 $(( CPU_LIMIT - 1 )))" @@ -4995,7 +5089,7 @@ relaxed - Same as fifo but allows tearing when below the monitors refresh rate.] export PW_WINE_CPU_TOPOLOGY edit_db_from_gui "${PW_EDIT_DB_LIST[@]}" LAUNCH_PARAMETERS PW_WINDOWS_VER PW_DLL_INSTALL WINEDLLOVERRIDES PW_WINE_CPU_TOPOLOGY \ - PW_MESA_GL_VERSION_OVERRIDE PW_VKD3D_FEATURE_LEVEL PW_LOCALE_SELECT PW_MESA_VK_WSI_PRESENT_MODE + PW_MESA_GL_VERSION_OVERRIDE PW_VKD3D_FEATURE_LEVEL PW_LOCALE_SELECT PW_MESA_VK_WSI_PRESENT_MODE PW_AMD_VULKAN_USE if [[ -z "$MANGOHUD_CONFIG" ]] ; then MONITOR_HEIGHT="$(echo "$PW_SCREEN_RESOLUTION" | awk -F'x' '{print $2}')" diff --git a/data_from_portwine/scripts/start.sh b/data_from_portwine/scripts/start.sh index c12bd25c..8ec14ef4 100755 --- a/data_from_portwine/scripts/start.sh +++ b/data_from_portwine/scripts/start.sh @@ -96,10 +96,10 @@ fi unset MANGOHUD MANGOHUD_DLSYM PW_NO_ESYNC PW_NO_FSYNC PW_VULKAN_USE WINEDLLOVERRIDES PW_NO_WRITE_WATCH PW_YAD_SET PW_ICON_FOR_YAD unset PW_CHECK_AUTOINSTALL PW_VKBASALT_EFFECTS PW_VKBASALT_FFX_CAS PORTWINE_DB PORTWINE_DB_FILE RADV_PERFTEST unset CHK_SYMLINK_FILE PW_MESA_GL_VERSION_OVERRIDE PW_VKD3D_FEATURE_LEVEL PATH_TO_GAME PW_START_DEBUG PORTPROTON_NAME PW_PATH -unset PW_PREFIX_NAME WINEPREFIX VULKAN_MOD PW_WINE_VER PW_ADD_TO_ARGS_IN_RUNTIME PW_GAMEMODERUN_SLR AMD_VULKAN_ICD PW_WINE_CPU_TOPOLOGY +unset PW_PREFIX_NAME WINEPREFIX VULKAN_MOD PW_WINE_VER PW_ADD_TO_ARGS_IN_RUNTIME PW_GAMEMODERUN_SLR PW_WINE_CPU_TOPOLOGY unset MANGOHUD_CONFIG FPS_LIMIT PW_WINE_USE WINEDLLPATH WINE WINEDIR WINELOADER WINESERVER PW_USE_RUNTIME PORTWINE_CREATE_SHORTCUT_NAME MIRROR unset PW_LOCALE_SELECT PW_SETTINGS_INDICATION PW_GUI_START PW_AUTOINSTALL_EXE NOSTSTDIR RADV_DEBUG PW_NO_AUTO_CREATE_SHORTCUT -unset PW_TERM PW_EXEC_FROM_DESKTOP WEBKIT_DISABLE_DMABUF_RENDERER +unset PW_TERM PW_EXEC_FROM_DESKTOP WEBKIT_DISABLE_DMABUF_RENDERER PW_AMD_VULKAN_USE PW_VK_ICD_FILENAMES export PORT_WINE_TMP_PATH="${PORT_WINE_PATH}/data/tmp" rm -f "$PORT_WINE_TMP_PATH"/*{exe,msi,tar}* From b20fa3bd7402ece5b64aca8eb7500ccdf407f089 Mon Sep 17 00:00:00 2001 From: Boris Yumankulov Date: Wed, 18 Dec 2024 22:29:36 +0500 Subject: [PATCH 38/48] Replace gamemode with powerprofilectl if sched-ext is enabled --- data_from_portwine/scripts/functions_helper | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index 6ff87bad..73dceee5 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -3278,14 +3278,16 @@ start_portwine () { then if command -v systemctl &>/dev/null \ && (systemctl is-active --quiet ananicy.service \ - || systemctl is-active --quiet ananicy-cpp.service) + || systemctl is-active --quiet ananicy-cpp.service \ + || systemctl is-active --quiet scx.service \ + || systemctl is-active --quiet scx_loader.service) then export GAMEMODERUN=0 export PW_GAMEMODERUN_SLR="" if command -v powerprofilesctl &>/dev/null ; then if powerprofilesctl list | grep -q 'performance:' ; then export PW_POWERPROFILECTL_SLR="powerprofilesctl launch -p performance --" - print_info "Gamemode replaced by powerprofilectl to avoid conflict with ananicy." + print_info "Gamemode replaced by powerprofilectl to avoid conflict with ananicy and sched-ext." else export PW_POWERPROFILECTL_SLR="" fi From d8e94ff5395f562c32984dfd8f021024d54126f1 Mon Sep 17 00:00:00 2001 From: Mikhail Tergoev Date: Sun, 22 Dec 2024 15:06:53 +0300 Subject: [PATCH 39/48] updated PROTON_LG, DXVK and VKD3D --- data_from_portwine/changelog_ru | 6 ++++++ data_from_portwine/scripts/functions_helper | 1 + data_from_portwine/scripts/var | 8 ++++---- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/data_from_portwine/changelog_ru b/data_from_portwine/changelog_ru index e0288e36..c6470f85 100755 --- a/data_from_portwine/changelog_ru +++ b/data_from_portwine/changelog_ru @@ -2,6 +2,12 @@ ----------------------------------------- История изменений: +###Scripts version 2382### / Дата: 22.12.2024 / Размер скачиваемого обновления: 270 мегабайт +* обновлен PROTON_LG до версии "9-21" +* обновлены версии: + * DXVK_GIT "2.5.1-35" (совместно с dxvk-nvapi) + * VKD3D_GIT "1.1-4325" (совместно vkd3d-shader) + ###Scripts version 2381### / Дата: 01.12.2024 / Размер скачиваемого обновления: 180 мегабайт * обновлен пакет plugins v18 * gallium nine v0.10 diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index 6ff87bad..647b818c 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -3037,6 +3037,7 @@ start_portwine () { LIST_ICU_DLL_LINKS="icuin68 icuuc68 icudt68" for dll in $LIST_ICU_DLL_LINKS ; do + try_force_link_file "${WINEDIR}/lib/icu/${dll}.dll" "${WINEPREFIX}/drive_c/windows/syswow64/${dll}.dll" try_force_link_file "${WINEDIR}/lib64/icu/${dll}.dll" "${WINEPREFIX}/drive_c/windows/system32/${dll}.dll" done diff --git a/data_from_portwine/scripts/var b/data_from_portwine/scripts/var index 030217ed..08dc5957 100755 --- a/data_from_portwine/scripts/var +++ b/data_from_portwine/scripts/var @@ -1,6 +1,6 @@ #!/usr/bin/env bash #Author: Castro-Fidel (linux-gaming.ru) -#SCRIPTS_NEXT_VERSION=2381 +#SCRIPTS_NEXT_VERSION=2382 #SCRIPTS_STABLE_VERSION=2380 ######################################################################## export AI_TOP_GAMES="PW_LGC PW_VKPLAY PW_EPIC PW_BATTLE_NET PW_WORLD_OF_SEA_BATTLE PW_RUSSIAN_FISHING PW_HO_YO_PLAY PW_FARLIGHT84 PW_WARFRAME PW_WGC PW_UBISOFT" @@ -45,7 +45,7 @@ export PW_FAKE_DLSS_VER="230506" export PW_FAKE_DLSS_3_VER="090" export PW_GALLIUM_NINE_VER="0.10" ###WINE_AND_PROTON_LG### -export PW_PROTON_LG_VER="PROTON_LG_9-19" +export PW_PROTON_LG_VER="PROTON_LG_9-21" export PW_WINE_LG_VER="WINE_LG_9-12-2" export PW_WINE_FULLSCREEN_FSR="1" export WINE_FULLSCREEN_FSR_MODE="ultra" @@ -54,9 +54,9 @@ export PW_VULKAN_USE="2" export VKD3D_LIMIT_TESS_FACTORS="64" export DXVK_LEGACY_VER="1.6.1" export DXVK_STABLE_VER="1.10.3-28" -export DXVK_GIT_VER="2.4.1-446" +export DXVK_GIT_VER="2.5.1-35" export VKD3D_STABLE_VER="1.1-2602" -export VKD3D_GIT_VER="1.1-4271" +export VKD3D_GIT_VER="1.1-4325" ###VKBASALT### export PW_VKBASALT_EFFECTS="Curves:cas" export PW_VKBASALT_FFX_CAS="0.50" From a89690d23e2b5ac76dcc14840fb466057bda1f16 Mon Sep 17 00:00:00 2001 From: Mikhail Tergoev Date: Sun, 22 Dec 2024 15:36:00 +0300 Subject: [PATCH 40/48] update local --- data_from_portwine/locales/PortProton.pot | 93 ++++++------ .../locales/es/LC_MESSAGES/PortProton.po | 110 ++++++++------- .../locales/ru/LC_MESSAGES/PortProton.mo | Bin 0 -> 96522 bytes .../locales/ru/LC_MESSAGES/PortProton.po | 132 +++++++++--------- 4 files changed, 175 insertions(+), 160 deletions(-) create mode 100644 data_from_portwine/locales/ru/LC_MESSAGES/PortProton.mo diff --git a/data_from_portwine/locales/PortProton.pot b/data_from_portwine/locales/PortProton.pot index b2028915..0cec05be 100644 --- a/data_from_portwine/locales/PortProton.pot +++ b/data_from_portwine/locales/PortProton.pot @@ -7,7 +7,7 @@ msgid "" msgstr "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" - "POT-Creation-Date: 2024-11-13 08:17+0500\n" + "POT-Creation-Date: 2024-12-22 15:30+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -26,6 +26,41 @@ msgstr "" msgid "Unpack is DONE for prefix:" msgstr "" +msgid "use" +msgstr "" + +msgid "Forces all scripts to be updated to a working state\n" + " (helps if " + "PortProton is not working)" +msgstr "" + +msgid "Reinstalls PortProton and resets all settings to default" +msgstr "" + +msgid "Creates a files with translations .pot and .po" +msgstr "" + +msgid "Debug scripts for PortProton\n" + " (saved log in" +msgstr "" + +msgid "Check update scripts for PortProton" +msgstr "" + +msgid "Launches the application immediately, requires the path to the .exe " + "file" +msgstr "" + +msgid "After the variable, the path to the .exe file is required and then " + "the variables.\n" + " (List their " + "variables and values for example PW_MANGOHUD=1 PW_VKBASALT=0, etc.)" +msgstr "" + +msgid "--autoinstall and the name of what needs to be installed is given in " + "the list below:" +msgstr "" + msgid "USE_SYSTEM_WINE" msgstr "" @@ -604,6 +639,12 @@ msgid "fifo - First in, first out. Limits the frame rate + no tearing. " "refresh rate." msgstr "" +msgid "Select needed AMD vulkan implementation" +msgstr "" + +msgid "Choosing which implementation of vulkan will be used to run the game" +msgstr "" + msgid "EDIT DB" msgstr "" @@ -1475,12 +1516,6 @@ msgstr "" msgid "Add shortcut to STEAM library" msgstr "" -msgid "For adding shortcut to STEAM, needed restart.\\n\\nRestart STEAM now?" -msgstr "" - -msgid "Restarting STEAM... Please wait." -msgstr "" - msgid "The shortcut will be changed in the PortProton directory." msgstr "" @@ -1624,8 +1659,8 @@ msgid "MIT License\n" "\n" "Permission is hereby granted, free of charge, to any person " "obtaining a copy\n" - "of this software and associated documentation files (the " - "\"Software\"), to deal\n" + "of this software and associated documentation files (the \"Software" + "\"), to deal\n" "in the Software without restriction, including without limitation " "the rights\n" "to use, copy, modify, merge, publish, distribute, sublicense, and/or " @@ -1708,43 +1743,11 @@ msgstr "" msgid "THIRD PARTY LIBRARIES" msgstr "" -msgid "SteamGridDB is not responding, forcing cover download to be disabled" +msgid "For adding shortcut to STEAM, needed restart.\\n\\nRestart STEAM now?" +msgstr "" + +msgid "Restarting STEAM... Please wait." msgstr "" msgid "Please wait. downloading covers for" msgstr "" - -msgid "use" -msgstr "" - -msgid "Forces all scripts to be updated to a working state\n" - " (helps if " - "PortProton is not working)" -msgstr "" - -msgid "Reinstalls PortProton and resets all settings to default" -msgstr "" - -msgid "Creates a files with translations .pot and .po" -msgstr "" - -msgid "Debug scripts for PortProton\n" - " (saved log in" -msgstr "" - -msgid "Check update scripts for PortProton" -msgstr "" - -msgid "Launches the application immediately, requires the path to the .exe " - "file" -msgstr "" - -msgid "After the variable, the path to the .exe file is required and then " - "the variables.\n" - " (List their " - "variables and values for example PW_MANGOHUD=1 PW_VKBASALT=0, etc.)" -msgstr "" - -msgid "--autoinstall and the name of what needs to be installed is given in " - "the list below:" -msgstr "" diff --git a/data_from_portwine/locales/es/LC_MESSAGES/PortProton.po b/data_from_portwine/locales/es/LC_MESSAGES/PortProton.po index 19c80eda..5f7a17f4 100644 --- a/data_from_portwine/locales/es/LC_MESSAGES/PortProton.po +++ b/data_from_portwine/locales/es/LC_MESSAGES/PortProton.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-11-13 08:17+0500\n" +"POT-Creation-Date: 2024-12-22 15:30+0300\n" "PO-Revision-Date: 2024-11-13 08:18+0500\n" "Last-Translator: \n" "Language-Team: \n" @@ -31,6 +31,47 @@ msgstr "El desempaquetado ha FALLADO para el prefijo:" msgid "Unpack is DONE for prefix:" msgstr "El desempaquetado se ha COMPLETADO para el prefijo:" +msgid "use" +msgstr "" + +msgid "" +"Forces all scripts to be updated to a working state\n" +" (helps if PortProton is " +"not working)" +msgstr "" + +#, fuzzy +msgid "Reinstalls PortProton and resets all settings to default" +msgstr "Restaurar configuraciones predeterminadas" + +msgid "Creates a files with translations .pot and .po" +msgstr "" + +msgid "" +"Debug scripts for PortProton\n" +" (saved log in" +msgstr "" + +#, fuzzy +msgid "Check update scripts for PortProton" +msgstr "Espere la actualización PortProton" + +msgid "" +"Launches the application immediately, requires the path to the .exe file" +msgstr "" + +msgid "" +"After the variable, the path to the .exe file is required and then the " +"variables.\n" +" (List their variables " +"and values for example PW_MANGOHUD=1 PW_VKBASALT=0, etc.)" +msgstr "" + +msgid "" +"--autoinstall and the name of what needs to be installed is given in the " +"list below:" +msgstr "" + msgid "USE_SYSTEM_WINE" msgstr "Usar Wine del sistema" @@ -751,6 +792,12 @@ msgstr "" "relaxed - Igual que fifo pero permite tearing por debajo de la frecuencia de " "refresco del monitor." +msgid "Select needed AMD vulkan implementation" +msgstr "" + +msgid "Choosing which implementation of vulkan will be used to run the game" +msgstr "" + msgid "EDIT DB" msgstr "CONFIGURACIÓN" @@ -1910,14 +1957,6 @@ msgstr "Agregar acceso directo al escritorio" msgid "Add shortcut to STEAM library" msgstr "Agregar acceso directo a la biblioteca de STEAM" -msgid "For adding shortcut to STEAM, needed restart.\\n\\nRestart STEAM now?" -msgstr "" -"Para agregar el acceso directo a STEAM, es necesario reiniciar.\\n\\¿Quieres " -"reiniciar STEAM ahora?" - -msgid "Restarting STEAM... Please wait." -msgstr "Restarting STEAM... Please wait." - msgid "The shortcut will be changed in the PortProton directory." msgstr "El acceso directo se cambiará en el directorio de PortProton." @@ -2207,54 +2246,21 @@ msgstr "UNIRSE" msgid "THIRD PARTY LIBRARIES" msgstr "BIBLIOTECAS DE TERCEROS" -msgid "SteamGridDB is not responding, forcing cover download to be disabled" +msgid "For adding shortcut to STEAM, needed restart.\\n\\nRestart STEAM now?" msgstr "" -"SteamGridDB no está respondiendo, forzando la desactivación de la descarga " -"de portadas" +"Para agregar el acceso directo a STEAM, es necesario reiniciar.\\n\\¿Quieres " +"reiniciar STEAM ahora?" + +msgid "Restarting STEAM... Please wait." +msgstr "Restarting STEAM... Please wait." msgid "Please wait. downloading covers for" msgstr "Por favor, espera. Descargando portadas para" -msgid "use" -msgstr "" - -msgid "" -"Forces all scripts to be updated to a working state\n" -" (helps if PortProton is " -"not working)" -msgstr "" - -#, fuzzy -msgid "Reinstalls PortProton and resets all settings to default" -msgstr "Restaurar configuraciones predeterminadas" - -msgid "Creates a files with translations .pot and .po" -msgstr "" - -msgid "" -"Debug scripts for PortProton\n" -" (saved log in" -msgstr "" - -#, fuzzy -msgid "Check update scripts for PortProton" -msgstr "Espere la actualización PortProton" - -msgid "" -"Launches the application immediately, requires the path to the .exe file" -msgstr "" - -msgid "" -"After the variable, the path to the .exe file is required and then the " -"variables.\n" -" (List their variables " -"and values for example PW_MANGOHUD=1 PW_VKBASALT=0, etc.)" -msgstr "" - -msgid "" -"--autoinstall and the name of what needs to be installed is given in the " -"list below:" -msgstr "" +#~ msgid "SteamGridDB is not responding, forcing cover download to be disabled" +#~ msgstr "" +#~ "SteamGridDB no está respondiendo, forzando la desactivación de la " +#~ "descarga de portadas" #~ msgid "Choice gui themes" #~ msgstr "Temas de interfaz gráfica de usuario elegidos" diff --git a/data_from_portwine/locales/ru/LC_MESSAGES/PortProton.mo b/data_from_portwine/locales/ru/LC_MESSAGES/PortProton.mo new file mode 100644 index 0000000000000000000000000000000000000000..9a35af3d3fdf9c50171c92bf1f1f10e77ac26d2f GIT binary patch literal 96522 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 literal 0 HcmV?d00001 diff --git a/data_from_portwine/locales/ru/LC_MESSAGES/PortProton.po b/data_from_portwine/locales/ru/LC_MESSAGES/PortProton.po index 3c0a8eae..60b9aec3 100644 --- a/data_from_portwine/locales/ru/LC_MESSAGES/PortProton.po +++ b/data_from_portwine/locales/ru/LC_MESSAGES/PortProton.po @@ -7,17 +7,17 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-11-13 08:17+0500\n" -"PO-Revision-Date: 2024-11-13 08:18+0500\n" +"POT-Creation-Date: 2024-12-22 15:30+0300\n" +"PO-Revision-Date: 2024-12-22 15:33+0300\n" "Last-Translator: \n" "Language-Team: \n" "Language: ru_RU\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" -"X-Generator: Poedit 3.4.4\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" +"X-Generator: Poedit 3.5\n" msgid "" "A running PortProton session was detected.\\nDo you want to end the previous " @@ -31,6 +31,55 @@ msgstr "Произошла ошибка во время распаковки п msgid "Unpack is DONE for prefix:" msgstr "Успешно распакован префикс:" +msgid "use" +msgstr "использовать" + +msgid "" +"Forces all scripts to be updated to a working state\n" +" (helps if PortProton is " +"not working)" +msgstr "" +"Принудительно обновляет все скрипты до рабочего состояния.\n" +" (помогает, если " +"PortProton не работает)" + +msgid "Reinstalls PortProton and resets all settings to default" +msgstr "Переустанавливает PortProton и сбрасывает все настройки по умолчанию" + +msgid "Creates a files with translations .pot and .po" +msgstr "Создает файлы с переводами .pot и .po" + +msgid "" +"Debug scripts for PortProton\n" +" (saved log in" +msgstr "" +"Скрипты отладки для PortProton\n" +" (сохраняет лог в" + +msgid "Check update scripts for PortProton" +msgstr "Проверьте скрипты обновления для PortProton" + +msgid "" +"Launches the application immediately, requires the path to the .exe file" +msgstr "Запускает приложение сразу, требует путь к exe-файлу" + +msgid "" +"After the variable, the path to the .exe file is required and then the " +"variables.\n" +" (List their variables " +"and values for example PW_MANGOHUD=1 PW_VKBASALT=0, etc.)" +msgstr "" +"После переменной необходимо указать путь к файлу .exe, а затем переменные.\n" +" (Перечислите их " +"переменные и значения, например PW_MANGOHUD=1 PW_VKBASALT=0 и т. д.)" + +msgid "" +"--autoinstall and the name of what needs to be installed is given in the " +"list below:" +msgstr "" +"--autoinstall и название того, что необходимо установить, указано в списке " +"ниже:" + msgid "USE_SYSTEM_WINE" msgstr "Использовать системную версию wine" @@ -764,6 +813,12 @@ msgstr "" "relaxed - то же, что и fifo, но допускает разрыв изображения, когда частота " "обновления монитора ниже." +msgid "Select needed AMD vulkan implementation" +msgstr "Выбор Vulkan драйвера для AMD" + +msgid "Choosing which implementation of vulkan will be used to run the game" +msgstr "Выбор драйвера Vulkan для запуска игры" + msgid "EDIT DB" msgstr "НАСТРОЙКИ" @@ -1888,14 +1943,6 @@ msgstr "Добавить ярлык на рабочий стол" msgid "Add shortcut to STEAM library" msgstr "Добавить ярлык в библиотеку STEAM" -msgid "For adding shortcut to STEAM, needed restart.\\n\\nRestart STEAM now?" -msgstr "" -"Для добавления ярлыка в STEAM требуется перезапуск.\\n\\nПерезапустить STEAM " -"сейчас?" - -msgid "Restarting STEAM... Please wait." -msgstr "Перезапускаем STEAM... Пожалуйста, подождите." - msgid "The shortcut will be changed in the PortProton directory." msgstr "Ярлык будет изменён в каталоге PortProton." @@ -2195,60 +2242,19 @@ msgstr "ПРИСОЕДЕНИТЬСЯ" msgid "THIRD PARTY LIBRARIES" msgstr "БИБЛИОТЕКИ" -msgid "SteamGridDB is not responding, forcing cover download to be disabled" -msgstr "SteamGridDB не отвечает, принудительно отключаем загрузку обложек" +msgid "For adding shortcut to STEAM, needed restart.\\n\\nRestart STEAM now?" +msgstr "" +"Для добавления ярлыка в STEAM требуется перезапуск.\\n\\nПерезапустить STEAM " +"сейчас?" + +msgid "Restarting STEAM... Please wait." +msgstr "Перезапускаем STEAM... Пожалуйста, подождите." msgid "Please wait. downloading covers for" msgstr "Пожалуйста, подождите. Загрузка обложек для" -msgid "use" -msgstr "использовать" - -msgid "" -"Forces all scripts to be updated to a working state\n" -" (helps if PortProton is " -"not working)" -msgstr "" -"Принудительно обновляет все скрипты до рабочего состояния.\n" -" (помогает, если " -"PortProton не работает)" - -msgid "Reinstalls PortProton and resets all settings to default" -msgstr "Переустанавливает PortProton и сбрасывает все настройки по умолчанию" - -msgid "Creates a files with translations .pot and .po" -msgstr "Создает файлы с переводами .pot и .po" - -msgid "" -"Debug scripts for PortProton\n" -" (saved log in" -msgstr "" -"Скрипты отладки для PortProton\n" -" (сохраняет лог в" - -msgid "Check update scripts for PortProton" -msgstr "Проверьте скрипты обновления для PortProton" - -msgid "" -"Launches the application immediately, requires the path to the .exe file" -msgstr "Запускает приложение сразу, требует путь к exe-файлу" - -msgid "" -"After the variable, the path to the .exe file is required and then the " -"variables.\n" -" (List their variables " -"and values for example PW_MANGOHUD=1 PW_VKBASALT=0, etc.)" -msgstr "" -"После переменной необходимо указать путь к файлу .exe, а затем переменные.\n" -" (Перечислите их " -"переменные и значения, например PW_MANGOHUD=1 PW_VKBASALT=0 и т. д.)" - -msgid "" -"--autoinstall and the name of what needs to be installed is given in the " -"list below:" -msgstr "" -"--autoinstall и название того, что необходимо установить, указано в списке " -"ниже:" +#~ msgid "SteamGridDB is not responding, forcing cover download to be disabled" +#~ msgstr "SteamGridDB не отвечает, принудительно отключаем загрузку обложек" #~ msgid "Running" #~ msgstr "Запущено" From 0d9ee584e5e6b93a0226de59ec2336f70dc78c5d Mon Sep 17 00:00:00 2001 From: Mikhail Tergoev Date: Sun, 22 Dec 2024 15:57:10 +0300 Subject: [PATCH 41/48] Scripts version 2382 --- data_from_portwine/changelog_en | 11 +++++++++++ data_from_portwine/changelog_ru | 5 +++++ 2 files changed, 16 insertions(+) diff --git a/data_from_portwine/changelog_en b/data_from_portwine/changelog_en index 32194b56..33a4767d 100755 --- a/data_from_portwine/changelog_en +++ b/data_from_portwine/changelog_en @@ -2,6 +2,17 @@ You can help us in the development of the project on the website: https://linux- ---------------------------------------- Changelog: +###Scripts version 2382### / Date: 22.12.2024 / Download update size: 270 megabytes +* updated PROTON_LG to version "9-21" +* updated versions: + * DXVK_GIT "2.5.1-35" (shared with dxvk-nvapi) + * VKD3D_GIT "1.1-4325" (shared with vkd3d-shader) +* fixed icon error when there are symbols in the example as in osu!.exe (thanks to Htylol and if984) +* fixed error in providing an icon from .bat for .exe file when changing the shortcut (thanks to Htylol) +* fix reinstalling PortProton using --reinstall argument (thanks Boria138) +* improved video card checking function (thanks to Htylol) +* Vulkan driver selection has been returned for AMD video cards (thanks to Boria138) + ###Scripts version 2381### / Date: 01.12.2024 / Download update size: 180 megabytes * updated plugins v18 package * gallium nine v0.10 diff --git a/data_from_portwine/changelog_ru b/data_from_portwine/changelog_ru index c6470f85..c6e81a48 100755 --- a/data_from_portwine/changelog_ru +++ b/data_from_portwine/changelog_ru @@ -7,6 +7,11 @@ * обновлены версии: * DXVK_GIT "2.5.1-35" (совместно с dxvk-nvapi) * VKD3D_GIT "1.1-4325" (совместно vkd3d-shader) +* исправлена ошибка иконки когда есть символы на примере как в osu!.exe (спасибо Htylol и if984) +* исправлена ошибка предоставлении иконки от .bat для .exe файла при изменении ярлыка (спасибо Htylol) +* исправление переустановки PortProton с помощью аргумента --reinstall (спасибо Boria138) +* улучшена фкнуция проверки видеокарты (спасибо Htylol) +* для видеокарт AMD возвращен выбор драйвера Vulkan (спасибо Boria138) ###Scripts version 2381### / Дата: 01.12.2024 / Размер скачиваемого обновления: 180 мегабайт * обновлен пакет plugins v18 From 5eb82457b84fadbb8b1f069395fb944ce5609eb1 Mon Sep 17 00:00:00 2001 From: Mikhail Tergoev Date: Sun, 22 Dec 2024 16:20:42 +0300 Subject: [PATCH 42/48] updated AMD_VULKAN_DRIVER_LIST --- data_from_portwine/scripts/functions_helper | 74 ++++++++++----------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index 87145e4a..52776725 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -2799,45 +2799,45 @@ pw_skip_get_info () { GET_AMD_VULKAN_DRIVER_LIST="amdvlk amdgpupro radv" unset AMD_VULKAN_DRIVER_LIST - for DRIVER in $GET_AMD_VULKAN_DRIVER_LIST; do - case "$DRIVER" in - "amdvlk") - for file in /opt/amdgpu/etc/vulkan/icd.d/amd_icd*.json \ - /etc/vulkan/icd.d/amd_icd*.json \ - /usr/share/vulkan/icd.d/amd_icd*.json ; do - if [ -f "$file" ]; then - AMD_VULKAN_DRIVER_LIST+="amdvlk" - break - fi - done - ;; - "amdgpupro") - for file in /opt/amdgpu-pro/etc/vulkan/icd.d/amd_icd*.json \ - /usr/share/vulkan/icd.d/amd_pro_icd*.json; do - if [ -f "$file" ]; then - AMD_VULKAN_DRIVER_LIST+="!amdgpupro" - break - fi - done - ;; - "radv") - for file in /usr/share/vulkan/icd.d/radeon_icd.*.json ; do - if [ -f "$file" ]; then - AMD_VULKAN_DRIVER_LIST+="!radv" - break - fi - done - ;; - esac - done - export AMD_VULKAN_DRIVER_LIST - - if [[ -z "$AMD_VULKAN_DRIVER_LIST" ]] || check_flatpak ; then - AMD_VULKAN_CB=":DCB" + if ! check_flatpak \ + && [[ $(check_vendor_gpu) =~ amd ]] + then + for DRIVER in $GET_AMD_VULKAN_DRIVER_LIST; do + case "$DRIVER" in + "amdvlk") + for file in /opt/amdgpu/etc/vulkan/icd.d/amd_icd*.json \ + /etc/vulkan/icd.d/amd_icd*.json \ + /usr/share/vulkan/icd.d/amd_icd*.json ; do + if [ -f "$file" ]; then + AMD_VULKAN_DRIVER_LIST+="amdvlk" + break + fi + done + ;; + "amdgpupro") + for file in /opt/amdgpu-pro/etc/vulkan/icd.d/amd_icd*.json \ + /usr/share/vulkan/icd.d/amd_pro_icd*.json; do + if [ -f "$file" ]; then + AMD_VULKAN_DRIVER_LIST+="!amdgpupro" + break + fi + done + ;; + "radv") + for file in /usr/share/vulkan/icd.d/radeon_icd.*.json ; do + if [ -f "$file" ]; then + AMD_VULKAN_DRIVER_LIST+="!radv" + break + fi + done + ;; + esac + done + export AMD_VULKAN_DRIVER_LIST + export AMD_VULKAN_CB=":CB" else - AMD_VULKAN_CB=":CB" + export AMD_VULKAN_CB=":DCB" fi - export AMD_VULKAN_CB logical_cores=$(grep -c ^"processor" /proc/cpuinfo) if [[ "${logical_cores}" -le "4" ]] ; then From 723596bb161ac6e3999d843cd28e2861388ba8e8 Mon Sep 17 00:00:00 2001 From: Mikhail Tergoev Date: Sun, 22 Dec 2024 18:37:22 +0300 Subject: [PATCH 43/48] updated create shortcat from epic games --- data_from_portwine/scripts/functions_helper | 37 ++++----------------- data_from_portwine/scripts/start.sh | 2 +- 2 files changed, 8 insertions(+), 31 deletions(-) diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index fae8e00c..e9dc33dc 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -1890,8 +1890,7 @@ export -f wait_wineserver kill_portwine () { if [[ "${PW_WINE_USE}" != "USE_SYSTEM_WINE" ]] ; then - check_flatpak - if [[ "$ALPINE_FP" == "1" ]] ; then + if check_flatpak && [[ "$ALPINE_FP" == "1" ]] ; then wine_pids=$(ls -l /proc/*/exe >/dev/null 2>&1 | grep -ie PortProton | grep -E 'wine(64)?-preloader|wineserver' | awk -F/ '{print $3}') bwrap_pids=$(pgrep -f wrap | grep PortProton | head -n 1) else @@ -1908,7 +1907,6 @@ kill_portwine () { kill -n 9 "${pw_kill_pids}" &>/dev/null fi done - return 0 } export -f kill_portwine @@ -4378,34 +4376,13 @@ portwine_launch () { [[ $PW_LOG != 1 ]] && debug_timer --start -s "PW_TIME_IN_GAME" if [[ -n "${LAUNCH_URI}" ]]; then - WINEPROCESSES="^(start|winedbg|conhost|explorer|tabtip|services|rpcss|svchost|plugplay|winedevice).exe$" - if [[ "${LAUNCH_URI}" =~ ^com.epicgames.launcher ]]; then - WINEPROCESSES+="|^EOSOverlayRenderer|(EpicGamesLauncher|EpicWebHelper).exe$" - fi pw_run start /high /b "${LAUNCH_URI}" & - while true; do + while true ; do sleep 5 - if [[ -z "${exe_pid}" || ! -e "/proc/${exe_pid}" ]]; then - processes=$("${WINEDIR}/bin/winedbg" --command "info proc" 2>/dev/null) - exe_path=$(echo "${processes}" | grep -oP "(?<=\s)'[^']+'" | sed "s/^'//;s/'$//" | grep -Ev "${WINEPROCESSES}" | head -n 1) - echo "${processes}" > "${PORT_WINE_TMP_PATH}/processes" - if [[ -n "${exe_path}" ]]; then - unset exe_pid - for pid in $(ls -lr /proc/*/exe | grep -E 'wine(64)?-preloader' | awk -F/ '{print $3}'); do - if [[ "$(tr '\0' ' ' < "/proc/${pid}/cmdline" 2>/dev/null)" == *"${exe_path}"* ]]; then - exe_pid="${pid}" - elif grep -q "${exe_path}" "/proc/${pid}/maps" 2>/dev/null; then - exe_pid="${pid}" - else - continue - fi - break - done - elif [[ -n "${exe_pid}" ]]; then - break - fi - fi + GAMEPID="$(pgrep -fa "$(basename "$portwine_exe")" | grep -v "start.sh" | grep -i "epic" | awk '{print $1}')" + [[ -n $GAMEPID ]] && break done + while [[ -f "/proc/$GAMEPID/exe" ]] ; do sleep 5 ; done else case "${portwine_exe,,}" in *.exe) @@ -6207,8 +6184,7 @@ portwine_output_yad_shortcut () { export PW_NEW_DESKTOP="1" - if [[ "$PW_NO_RESTART_PPDB" != "1" ]] \ - || [[ -z ${LINKS[1]} ]] ; then + if [[ "$PW_NO_RESTART_PPDB" != "1" ]] ; then print_info "Restarting PP..." [[ "$PW_GUI_START" == "NOTEBOOK" ]] && unset PW_YAD_FORM_TAB restart_pp @@ -6277,6 +6253,7 @@ pw_auto_create_shortcut () { PORTWINE_DB_FILE="${portwine_exe}.ppdb" LAUNCH_URI="com.epicgames.launcher://apps/${item_id}?action=launch&silent=true" pw_init_db + export PW_NO_RESTART_PPDB="1" edit_db_from_gui PW_PREFIX_NAME LAUNCH_URI portwine_create_shortcut fi diff --git a/data_from_portwine/scripts/start.sh b/data_from_portwine/scripts/start.sh index 0ba1643f..1d55a7bb 100755 --- a/data_from_portwine/scripts/start.sh +++ b/data_from_portwine/scripts/start.sh @@ -99,7 +99,7 @@ unset CHK_SYMLINK_FILE PW_MESA_GL_VERSION_OVERRIDE PW_VKD3D_FEATURE_LEVEL PATH_T unset PW_PREFIX_NAME WINEPREFIX VULKAN_MOD PW_WINE_VER PW_ADD_TO_ARGS_IN_RUNTIME PW_GAMEMODERUN_SLR PW_WINE_CPU_TOPOLOGY unset MANGOHUD_CONFIG FPS_LIMIT PW_WINE_USE WINEDLLPATH WINE WINEDIR WINELOADER WINESERVER PW_USE_RUNTIME PORTWINE_CREATE_SHORTCUT_NAME MIRROR unset PW_LOCALE_SELECT PW_SETTINGS_INDICATION PW_GUI_START PW_AUTOINSTALL_EXE NOSTSTDIR RADV_DEBUG PW_NO_AUTO_CREATE_SHORTCUT -unset PW_TERM PW_EXEC_FROM_DESKTOP WEBKIT_DISABLE_DMABUF_RENDERER PW_AMD_VULKAN_USE PW_VK_ICD_FILENAMES +unset PW_TERM PW_EXEC_FROM_DESKTOP WEBKIT_DISABLE_DMABUF_RENDERER PW_AMD_VULKAN_USE PW_VK_ICD_FILENAMES LAUNCH_URI export PORT_WINE_TMP_PATH="${PORT_WINE_PATH}/data/tmp" rm -f "$PORT_WINE_TMP_PATH"/*{exe,msi,tar}* From 9696b33f342b5aa228cd0ac77e8565b7ec4e8861 Mon Sep 17 00:00:00 2001 From: Mikhail Tergoev Date: Sun, 22 Dec 2024 18:37:56 +0300 Subject: [PATCH 44/48] Scripts version 2383 --- data_from_portwine/changelog_en | 3 +++ data_from_portwine/changelog_ru | 3 +++ data_from_portwine/scripts/var | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/data_from_portwine/changelog_en b/data_from_portwine/changelog_en index 33a4767d..96ee3399 100755 --- a/data_from_portwine/changelog_en +++ b/data_from_portwine/changelog_en @@ -2,6 +2,9 @@ You can help us in the development of the project on the website: https://linux- ---------------------------------------- Changelog: +###Scripts version 2383### / Date: 22.12.2024 / Download update size: 4 megabytes +* added automatic creation of shortcuts for games from Epic Games Launcher (thanks alex2844) + ###Scripts version 2382### / Date: 22.12.2024 / Download update size: 270 megabytes * updated PROTON_LG to version "9-21" * updated versions: diff --git a/data_from_portwine/changelog_ru b/data_from_portwine/changelog_ru index c6e81a48..3ce5f844 100755 --- a/data_from_portwine/changelog_ru +++ b/data_from_portwine/changelog_ru @@ -2,6 +2,9 @@ ----------------------------------------- История изменений: +###Scripts version 2383### / Дата: 22.12.2024 / Размер скачиваемого обновления: 4 мегабайта +* добавлено автоматическое создание ярлыков для игр из Epic Games Launcher (спасибо alex2844) + ###Scripts version 2382### / Дата: 22.12.2024 / Размер скачиваемого обновления: 270 мегабайт * обновлен PROTON_LG до версии "9-21" * обновлены версии: diff --git a/data_from_portwine/scripts/var b/data_from_portwine/scripts/var index 08dc5957..9f417682 100755 --- a/data_from_portwine/scripts/var +++ b/data_from_portwine/scripts/var @@ -1,6 +1,6 @@ #!/usr/bin/env bash #Author: Castro-Fidel (linux-gaming.ru) -#SCRIPTS_NEXT_VERSION=2382 +#SCRIPTS_NEXT_VERSION=2383 #SCRIPTS_STABLE_VERSION=2380 ######################################################################## export AI_TOP_GAMES="PW_LGC PW_VKPLAY PW_EPIC PW_BATTLE_NET PW_WORLD_OF_SEA_BATTLE PW_RUSSIAN_FISHING PW_HO_YO_PLAY PW_FARLIGHT84 PW_WARFRAME PW_WGC PW_UBISOFT" From 7514cd472a1b208d3264d86cd5861f008d0f9b22 Mon Sep 17 00:00:00 2001 From: Htylol Date: Sun, 22 Dec 2024 23:04:29 +0500 Subject: [PATCH 45/48] Added the ability to track the launch of .exe files from .bat files of Epic Games --- .../locales/ru/LC_MESSAGES/PortProton.mo | Bin 96522 -> 0 bytes data_from_portwine/scripts/functions_helper | 32 ++++++++++++------ 2 files changed, 22 insertions(+), 10 deletions(-) delete mode 100644 data_from_portwine/locales/ru/LC_MESSAGES/PortProton.mo diff --git a/data_from_portwine/locales/ru/LC_MESSAGES/PortProton.mo b/data_from_portwine/locales/ru/LC_MESSAGES/PortProton.mo deleted file mode 100644 index 9a35af3d3fdf9c50171c92bf1f1f10e77ac26d2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96522 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 diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index e9dc33dc..78ed0543 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -200,7 +200,7 @@ export -f change_locale generate_pot () { local FILES_FOR_GETTEXT i - FILES_FOR_GETTEXT=(functions_helper start.sh setup.sh add_in_steam.sh help_info) + FILES_FOR_GETTEXT=(functions_helper start.sh setup.sh add_in_steam.sh) for i in "${FILES_FOR_GETTEXT[@]}" ; do sed -e 's/{translations\[/(gettext \"/g' -e 's/]}/")/g' -e 's/eval_translations/gettext/g' \ "${PORT_SCRIPTS_PATH}/$i" > "${PORT_SCRIPTS_PATH}/${i}_tmp" @@ -220,7 +220,6 @@ generate_pot () { "data/scripts/setup.sh_tmp" \ "data/scripts/functions_helper_tmp" \ "data/scripts/add_in_steam.sh_tmp" \ - "data/scripts/help_info_tmp" \ -o "$TEMPLATE_POT" popd 1>/dev/null || fatal if [[ -f "$LANG_PO" ]] ; then @@ -236,7 +235,6 @@ generate_pot () { try_remove_file "${PORT_SCRIPTS_PATH}/setup.sh_tmp" try_remove_file "${PORT_SCRIPTS_PATH}/functions_helper_tmp" try_remove_file "${PORT_SCRIPTS_PATH}/add_in_steam.sh_tmp" - try_remove_file "${PORT_SCRIPTS_PATH}/help_info_tmp" try_remove_dir "${PW_CACHE_LANG_PATH}" } export -f generate_pot @@ -3946,7 +3944,7 @@ start_portwine () { export WINE_CPU_TOPOLOGY="${PW_WINE_CPU_TOPOLOGY}" fi - if [[ ! -z "${PW_VK_ICD_FILENAMES}" ]] ; then + if [[ -n "${PW_VK_ICD_FILENAMES}" ]] ; then export VK_ICD_FILENAMES="${PW_VK_ICD_FILENAMES}" export VK_DRIVER_FILES="${PW_VK_ICD_FILENAMES}" fi @@ -4375,14 +4373,28 @@ portwine_launch () { fi [[ $PW_LOG != 1 ]] && debug_timer --start -s "PW_TIME_IN_GAME" - if [[ -n "${LAUNCH_URI}" ]]; then + if [[ -n "${LAUNCH_URI}" ]] ; then pw_run start /high /b "${LAUNCH_URI}" & + unset portwine_eg while true ; do - sleep 5 - GAMEPID="$(pgrep -fa "$(basename "$portwine_exe")" | grep -v "start.sh" | grep -i "epic" | awk '{print $1}')" - [[ -n $GAMEPID ]] && break + if [[ -z $portwine_eg ]] ; then + if [[ $portwine_exe =~ .bat$ ]] ; then + portwine_eg=$(grep .exe "$portwine_exe" | tail -n 1) + portwine_eg=${portwine_eg//.exe/} + portwine_eg=${portwine_eg//[[:blank:]]*/} + portwine_eg=${portwine_eg//*[[:punct:]]/} + portwine_eg=${portwine_eg}.exe + else + portwine_eg=$(basename "$portwine_exe") + fi + fi + sleep 1 + if [[ -z $GAMEPID ]] ; then + GAMEPID="$(pgrep -fa "$portwine_eg" | grep -v "start.sh" | awk '{print $1}')" + else + waitpid "$GAMEPID" && break + fi done - while [[ -f "/proc/$GAMEPID/exe" ]] ; do sleep 5 ; done else case "${portwine_exe,,}" in *.exe) @@ -5063,7 +5075,7 @@ gui_edit_db () { CPU_LIMIT_VAR="disabled" fi - if [[ ! -z "${PW_AMD_VULKAN_USE}" ]] && \ + if [[ -n "${PW_AMD_VULKAN_USE}" ]] && \ [[ "${PW_AMD_VULKAN_USE}" != "disabled" ]] ; then AMD_VULKAN_VAR="${PW_AMD_VULKAN_USE}" export DISABLE_LAYER_AMD_SWITCHABLE_GRAPHICS_1=1 From f4ca43e4de9de42c5ba759e0a1fcc15660500644 Mon Sep 17 00:00:00 2001 From: Mikhail Tergoev Date: Sat, 28 Dec 2024 18:51:35 +0300 Subject: [PATCH 46/48] update create shortcut for EGS --- data_from_portwine/scripts/functions_helper | 25 ++++++++------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index 78ed0543..481d235c 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -4375,24 +4375,17 @@ portwine_launch () { [[ $PW_LOG != 1 ]] && debug_timer --start -s "PW_TIME_IN_GAME" if [[ -n "${LAUNCH_URI}" ]] ; then pw_run start /high /b "${LAUNCH_URI}" & - unset portwine_eg + unset GAMEPID while true ; do - if [[ -z $portwine_eg ]] ; then - if [[ $portwine_exe =~ .bat$ ]] ; then - portwine_eg=$(grep .exe "$portwine_exe" | tail -n 1) - portwine_eg=${portwine_eg//.exe/} - portwine_eg=${portwine_eg//[[:blank:]]*/} - portwine_eg=${portwine_eg//*[[:punct:]]/} - portwine_eg=${portwine_eg}.exe - else - portwine_eg=$(basename "$portwine_exe") - fi - fi - sleep 1 - if [[ -z $GAMEPID ]] ; then - GAMEPID="$(pgrep -fa "$portwine_eg" | grep -v "start.sh" | awk '{print $1}')" + sleep 5 + if [[ -z "$GAMEPID" ]] ; then + GAMEPID="$(pgrep -fa 'EpicPortal|epicusername|epiclocale|AUTH_LOGIN' | awk '{print $1}')" else - waitpid "$GAMEPID" && break + if waitpid "$GAMEPID" ; then + sleep 1 + GAMEPID="$(pgrep -fa 'EpicPortal|epicusername|epiclocale|AUTH_LOGIN' | awk '{print $1}')" + [[ -z "$GAMEPID" ]] && break || continue + fi fi done else From 460d07a4af802f29ca4232d5f2d72dfe6757d686 Mon Sep 17 00:00:00 2001 From: Mikhail Tergoev Date: Sun, 29 Dec 2024 16:47:35 +0300 Subject: [PATCH 47/48] Scripts version 2384 --- data_from_portwine/changelog_en | 8 +++++++- data_from_portwine/changelog_ru | 8 +++++++- data_from_portwine/scripts/add_in_steam.sh | 4 ++++ data_from_portwine/scripts/functions_helper | 5 ++++- .../scripts/portwine_db/EpicGamesLauncher.ppdb | 2 -- data_from_portwine/scripts/var | 8 ++++---- 6 files changed, 26 insertions(+), 9 deletions(-) diff --git a/data_from_portwine/changelog_en b/data_from_portwine/changelog_en index 96ee3399..52a42b16 100755 --- a/data_from_portwine/changelog_en +++ b/data_from_portwine/changelog_en @@ -2,11 +2,17 @@ You can help us in the development of the project on the website: https://linux- ---------------------------------------- Changelog: +###Scripts version 2384### / Date: 29.12.2024 / Download update size: 12 megabytes +* improved launch of shortcuts for games from Epic Games Launcher (thanks for the help Htylol) +* updated versions: + * DXVK_GIT "2.5.2-1" (shared with dxvk-nvapi) + * VKD3D_GIT "1.1-4326" (shared with vkd3d-shader) +* ATTENTION! Due to problems with access to the steamgriddb website, downloading of covers is temporarily disabled when creating shortcuts for the Steam library + ###Scripts version 2383### / Date: 22.12.2024 / Download update size: 4 megabytes * added automatic creation of shortcuts for games from Epic Games Launcher (thanks alex2844) ###Scripts version 2382### / Date: 22.12.2024 / Download update size: 270 megabytes -* updated PROTON_LG to version "9-21" * updated versions: * DXVK_GIT "2.5.1-35" (shared with dxvk-nvapi) * VKD3D_GIT "1.1-4325" (shared with vkd3d-shader) diff --git a/data_from_portwine/changelog_ru b/data_from_portwine/changelog_ru index 3ce5f844..85054a33 100755 --- a/data_from_portwine/changelog_ru +++ b/data_from_portwine/changelog_ru @@ -2,11 +2,17 @@ ----------------------------------------- История изменений: +###Scripts version 2384### / Дата: 29.12.2024 / Размер скачиваемого обновления: 12 мегабайт +* доработан запуск ярлыков для игр из Epic Games Launcher (спасибо за помощь Htylol) +* обновлены версии: + * DXVK_GIT "2.5.2-1" (совместно с dxvk-nvapi) + * VKD3D_GIT "1.1-4326" (совместно vkd3d-shader) +* ВНИМАНИЕ! Из за проблем с доступом к сайту steamgriddb, временно отключено скачивание обложек при создании ярлыков для библиотеки Steam + ###Scripts version 2383### / Дата: 22.12.2024 / Размер скачиваемого обновления: 4 мегабайта * добавлено автоматическое создание ярлыков для игр из Epic Games Launcher (спасибо alex2844) ###Scripts version 2382### / Дата: 22.12.2024 / Размер скачиваемого обновления: 270 мегабайт -* обновлен PROTON_LG до версии "9-21" * обновлены версии: * DXVK_GIT "2.5.1-35" (совместно с dxvk-nvapi) * VKD3D_GIT "1.1-4325" (совместно vkd3d-shader) diff --git a/data_from_portwine/scripts/add_in_steam.sh b/data_from_portwine/scripts/add_in_steam.sh index 7343139f..717da97a 100755 --- a/data_from_portwine/scripts/add_in_steam.sh +++ b/data_from_portwine/scripts/add_in_steam.sh @@ -372,6 +372,10 @@ addNonSteamGame() { printf '\x08\x08\x08\x08' } >> "${SCPATH}" + # TODO: замень использование steamgriddb на steam так как сайт steamgriddb у многих без VPN не работает + # а пока просто блочим использование + export DOWNLOAD_STEAM_GRID="0" + if [[ "${DOWNLOAD_STEAM_GRID}" == "1" ]] ; then pw_start_progress_bar_block "${translations[Please wait. downloading covers for]} ${NOSTAPPNAME}" addGrids diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index 481d235c..f7d31fcd 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -1699,6 +1699,9 @@ init_wine_ver () { export MEDIACONV_BLANK_VIDEO_FILE="${WINEDIR}"/share/media/blank.mkv export MEDIACONV_BLANK_AUDIO_FILE="${WINEDIR}"/share/media/blank.ptna + if [[ -d "${WINEDIR}"/share/espeak-ng-data ]] ; then + export ESPEAK_DATA_PATH="${WINEDIR}"/share/ + fi return 0 } @@ -3146,7 +3149,7 @@ start_portwine () { if [[ "${PW_LOG}" == 1 ]] \ || [[ -n "$PW_DEBUG" ]] then - export WINEDEBUG="fixme-all,err+loaddll,err+dll,err+file,err+reg" + export WINEDEBUG="+loaddll,+gstreamer" export WINE_MONO_TRACE="E:System.NotImplementedException" export VKBASALT_LOG_LEVEL="error" else diff --git a/data_from_portwine/scripts/portwine_db/EpicGamesLauncher.ppdb b/data_from_portwine/scripts/portwine_db/EpicGamesLauncher.ppdb index 7ae068ee..2a54a0aa 100644 --- a/data_from_portwine/scripts/portwine_db/EpicGamesLauncher.ppdb +++ b/data_from_portwine/scripts/portwine_db/EpicGamesLauncher.ppdb @@ -4,10 +4,8 @@ #Rating=5 ############################################## #export PW_COMMENT_DB="PortWINE database file for Epic Games Launcher" -export PW_VULKAN_USE=1 export LAUNCH_PARAMETERS="-SkipBuildPatchPrereq" export PW_DLL_INSTALL="vcrun2012 vcrun2013 vcrun2019" -export PW_USE_D3D_EXTRAS=1 export PW_WINE_USE="PROTON_LG" export WINEDLLOVERRIDES="vulkan-1=n,b" # add_in_start_portwine () { diff --git a/data_from_portwine/scripts/var b/data_from_portwine/scripts/var index 9f417682..206fc4f3 100755 --- a/data_from_portwine/scripts/var +++ b/data_from_portwine/scripts/var @@ -1,6 +1,6 @@ #!/usr/bin/env bash #Author: Castro-Fidel (linux-gaming.ru) -#SCRIPTS_NEXT_VERSION=2383 +#SCRIPTS_NEXT_VERSION=2384 #SCRIPTS_STABLE_VERSION=2380 ######################################################################## export AI_TOP_GAMES="PW_LGC PW_VKPLAY PW_EPIC PW_BATTLE_NET PW_WORLD_OF_SEA_BATTLE PW_RUSSIAN_FISHING PW_HO_YO_PLAY PW_FARLIGHT84 PW_WARFRAME PW_WGC PW_UBISOFT" @@ -45,7 +45,7 @@ export PW_FAKE_DLSS_VER="230506" export PW_FAKE_DLSS_3_VER="090" export PW_GALLIUM_NINE_VER="0.10" ###WINE_AND_PROTON_LG### -export PW_PROTON_LG_VER="PROTON_LG_9-21" +export PW_PROTON_LG_VER="PROTON_LG_9-19" export PW_WINE_LG_VER="WINE_LG_9-12-2" export PW_WINE_FULLSCREEN_FSR="1" export WINE_FULLSCREEN_FSR_MODE="ultra" @@ -54,9 +54,9 @@ export PW_VULKAN_USE="2" export VKD3D_LIMIT_TESS_FACTORS="64" export DXVK_LEGACY_VER="1.6.1" export DXVK_STABLE_VER="1.10.3-28" -export DXVK_GIT_VER="2.5.1-35" +export DXVK_GIT_VER="2.5.2-1" export VKD3D_STABLE_VER="1.1-2602" -export VKD3D_GIT_VER="1.1-4325" +export VKD3D_GIT_VER="1.1-4326" ###VKBASALT### export PW_VKBASALT_EFFECTS="Curves:cas" export PW_VKBASALT_FFX_CAS="0.50" From e40c4e56d104b706a9c26bd1bc15f639422d07b7 Mon Sep 17 00:00:00 2001 From: Mikhail Tergoev Date: Sun, 29 Dec 2024 16:51:19 +0300 Subject: [PATCH 48/48] STABLE: Scripts version 2385 --- data_from_portwine/changelog_en | 3 +++ data_from_portwine/changelog_ru | 3 +++ data_from_portwine/scripts/var | 4 ++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/data_from_portwine/changelog_en b/data_from_portwine/changelog_en index 52a42b16..82c56c4c 100755 --- a/data_from_portwine/changelog_en +++ b/data_from_portwine/changelog_en @@ -2,6 +2,9 @@ You can help us in the development of the project on the website: https://linux- ---------------------------------------- Changelog: +###Scripts version 2385### / stable / Date: 29.12.2024 / Download update size: 195 megabytes +* cumulative update to the stable version of PortProton scripts + ###Scripts version 2384### / Date: 29.12.2024 / Download update size: 12 megabytes * improved launch of shortcuts for games from Epic Games Launcher (thanks for the help Htylol) * updated versions: diff --git a/data_from_portwine/changelog_ru b/data_from_portwine/changelog_ru index 85054a33..8c9343f3 100755 --- a/data_from_portwine/changelog_ru +++ b/data_from_portwine/changelog_ru @@ -2,6 +2,9 @@ ----------------------------------------- История изменений: +###Scripts version 2385### / stable / Дата: 29.12.2024 / Размер скачиваемого обновления: 195 мегабайт +* кумулятивное обновление стабильной версии скриптов PortProton + ###Scripts version 2384### / Дата: 29.12.2024 / Размер скачиваемого обновления: 12 мегабайт * доработан запуск ярлыков для игр из Epic Games Launcher (спасибо за помощь Htylol) * обновлены версии: diff --git a/data_from_portwine/scripts/var b/data_from_portwine/scripts/var index 206fc4f3..6b250c9d 100755 --- a/data_from_portwine/scripts/var +++ b/data_from_portwine/scripts/var @@ -1,7 +1,7 @@ #!/usr/bin/env bash #Author: Castro-Fidel (linux-gaming.ru) -#SCRIPTS_NEXT_VERSION=2384 -#SCRIPTS_STABLE_VERSION=2380 +#SCRIPTS_NEXT_VERSION=2385 +#SCRIPTS_STABLE_VERSION=2385 ######################################################################## export AI_TOP_GAMES="PW_LGC PW_VKPLAY PW_EPIC PW_BATTLE_NET PW_WORLD_OF_SEA_BATTLE PW_RUSSIAN_FISHING PW_HO_YO_PLAY PW_FARLIGHT84 PW_WARFRAME PW_WGC PW_UBISOFT" # export PROTON_USE_XALIA="1"