Commit 81d72ff0 authored by Mikhail Tergoev's avatar Mikhail Tergoev

Merge branch 'devel'

parents 0e9b7955 e40c4e56
......@@ -2,6 +2,40 @@ 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:
* 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 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
* 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)
......
......@@ -2,6 +2,40 @@
-----------------------------------------
История изменений:
###Scripts version 2385### / stable / Дата: 29.12.2024 / Размер скачиваемого обновления: 195 мегабайт
* кумулятивное обновление стабильной версии скриптов PortProton
###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 мегабайт
* обновлены версии:
* 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
* 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)
......
data_from_portwine/img/gui/dolphin.png

1.6 KB | W: | H:

data_from_portwine/img/gui/dolphin.png

1.91 KB | W: | H:

data_from_portwine/img/gui/dolphin.png
data_from_portwine/img/gui/dolphin.png
data_from_portwine/img/gui/dolphin.png
data_from_portwine/img/gui/dolphin.png
  • 2-up
  • Swipe
  • Onion skin
data_from_portwine/img/gui/lgc.png

494 Bytes | W: | H:

data_from_portwine/img/gui/lgc.png

5.19 KB | W: | H:

data_from_portwine/img/gui/lgc.png
data_from_portwine/img/gui/lgc.png
data_from_portwine/img/gui/lgc.png
data_from_portwine/img/gui/lgc.png
  • 2-up
  • Swipe
  • Onion skin
data_from_portwine/img/gui/vba-m.png

3.37 KB | W: | H:

data_from_portwine/img/gui/vba-m.png

2.66 KB | W: | H:

data_from_portwine/img/gui/vba-m.png
data_from_portwine/img/gui/vba-m.png
data_from_portwine/img/gui/vba-m.png
data_from_portwine/img/gui/vba-m.png
  • 2-up
  • Swipe
  • Onion skin
......@@ -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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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"
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"
msgid "For adding shortcut to STEAM, needed restart.\\n\\nRestart STEAM now?"
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.)"
msgid "Restarting STEAM... Please wait."
msgstr ""
msgid "--autoinstall and the name of what needs to be installed is given in "
"the list below:"
msgid "Please wait. downloading covers for"
msgstr ""
......@@ -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"
......
......@@ -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 "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"
msgid "For adding shortcut to STEAM, needed restart.\\n\\nRestart STEAM now?"
msgstr ""
"Скрипты отладки для PortProton\n"
" (сохраняет лог в"
msgid "Check update scripts for PortProton"
msgstr "Проверьте скрипты обновления для PortProton"
"Для добавления ярлыка в STEAM требуется перезапуск.\\n\\nПерезапустить STEAM "
"сейчас?"
msgid ""
"Launches the application immediately, requires the path to the .exe file"
msgstr "Запускает приложение сразу, требует путь к exe-файлу"
msgid "Restarting STEAM... Please wait."
msgstr "Перезапускаем STEAM... Пожалуйста, подождите."
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 "Please wait. downloading covers for"
msgstr "Пожалуйста, подождите. Загрузка обложек для"
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 "Запущено"
......
......@@ -2,14 +2,6 @@
# GPL-3.0 license
# 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}\""
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
## ----------------------
......@@ -29,344 +21,370 @@ BASESTEAMGRIDDBAPI="https://www.steamgriddb.com/api/v2"
### 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
# 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
getSteamShortcutsVdfFileHex() {
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
}
if [[ -f "$GAMEARTSOURCE" ]] ; then
$GAMEARTCMD "$GAMEARTSOURCE" "$GAMEARTDEST"
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)')
if [[ -n "${exe}" ]]; then
if [[ "${exe}" =~ .sh$ ]] ; then
parseSteamTargetExe "${exe}"
else
echo "${exe}";
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#*=}" # <appid>_hero.png -- Banner used on game screen, logo goes on top of this
shift ;;
-lg=*|--logo=*)
SGLOGO="${i#*=}" # <appid>_logo.png -- Logo used e.g. on game screen
shift ;;
-ba=*|--boxart=*)
SGBOXART="${i#*=}" # <appid>p.png -- Used in library
shift ;;
-tf=*|--tenfoot=*)
SGTENFOOT="${i#*=}" # <appid>.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"
fi
}
# 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
getSteamGameId() {
printf "%u\n" $(($1 << 32 | 0x02000000))
}
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
# 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"
getAppId() {
listNonSteamGames | jq -r --arg exe "$1" 'map(select(.exe == $exe)) | first(.[]?.id)'
}
getSteamId() {
unset SteamAppId
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 [[ -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
else
echo "No game name given."
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
}
# 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
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
echo "You must provide a filename AppID when searching with SteamGridDB Game Name"
SteamGridDBTypeSteam=false
fi
SteamGridDBId="$(jq '.data[0].id' <<< "${SGDBRES}")"
echo "${SteamGridDBId}"
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
}
listInstalledSteamGames() {
manifests=("${HOME}/.local/share/Steam/steamapps"/appmanifest_*.acf)
if [ ! -e "${manifests[0]}" ]; then
jq -n '[]'
else
for manifest_file in "${manifests[@]}"; do
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
}
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 '.'
}
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' )"
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() {
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}"
}
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, -)?"
parseSteamShortcutEntryAppID() {
SHORTCUTVDFAPPIDHEXPAT="617070696400" # 'appid'
convertSteamShortcutAppID "$(printf "%s" "$1" | grep -oP "${SHORTCUTVDFAPPIDHEXPAT}\K.{8}")"
}
parseSteamTargetExe() {
grep -E 'flatpak|start\.sh' "$1" | head -n 1 | awk -F'"' '{print $(NF-1)}'
}
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
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
}
# 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"
downloadImage() {
if ! curl -Lf# -o "${STCFGPATH}/grid/$2" "$1"; then
return 1
fi
}
downloadImageSteam() {
if [[ -z "${SteamAppId}" ]]; then
getSteamId > /dev/null
fi
if [[ -n "${SteamAppId}" ]]; then
downloadImage "https://cdn.cloudflare.steamstatic.com/steam/apps/${SteamAppId}/$1" "$2"
else
return 1
fi
}
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"
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
}
pw_stop_progress_bar
addGrids() {
if [[ -n "${SGDBAPIKEY}" ]]; then
getSteamGridDBId "${name_desktop}" > /dev/null
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
}
## 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
if [[ "$DOWNLOAD_STEAM_GRID" == "1" ]] ; then
commandlineGetSteamGridDBArtwork --search-name="$NOSTSEARCHNAME" --filename-appid="$NOSTAIDGRID" "$NOSTSEARCHFLAG" --apply --replace-existing
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" "$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"
if [[ "$DOWNLOAD_STEAM_GRID" == "1" ]] ; then
setGameArt "$NOSTAIDGRID" --hero="$NOSTGHERO" --logo="$NOSTGLOGO" --boxart="$NOSTGBOXART" --tenfoot="$NOSTGTENFOOT" "$SGACOPYMETHOD"
fi
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
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}"
# 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
pw_stop_progress_bar
fi
restartSteam
fi
else
return 1
fi
}
......@@ -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
......@@ -544,7 +542,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 +582,7 @@ try_download () {
export dest="$2"
local silent="false"
export no_mirror="false"
case "$3" in
silent)
silent=true ;;
......@@ -833,6 +831,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
......@@ -1503,6 +1546,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
......@@ -1639,9 +1693,15 @@ init_wine_ver () {
fi
fi
export WINE_LIBRARY_PATH="${WINEDIR}/lib64:${WINEDIR}/lib"
if ! check_flatpak ; then
export WINE_LIBRARY_PATH="${WINEDIR}/lib64:${WINEDIR}/lib"
fi
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
}
......@@ -1673,7 +1733,8 @@ pw_init_runtime () {
PW_PV_OVERRIDES="/usr/lib/pressure-vessel/overrides/lib"
export PW_LD_LIBRARY_PATH="\
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:\
......@@ -1682,6 +1743,7 @@ ${PW_PV_OVERRIDES}/i386-linux-gnu/aliases:\
/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"
......@@ -1829,8 +1891,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
......@@ -1847,7 +1908,6 @@ kill_portwine () {
kill -n 9 "${pw_kill_pids}" &>/dev/null
fi
done
return 0
}
export -f kill_portwine
......@@ -1949,7 +2009,7 @@ stop_portwine () {
case "$1" in
--restart)
restart_pp ;;
*)
*)
unset SKIP_CHECK_UPDATES
exit 0 ;;
esac
......@@ -2376,9 +2436,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
}
......@@ -2699,6 +2795,49 @@ pw_skip_get_info () {
export LOCALE_LIST
fi
GET_AMD_VULKAN_DRIVER_LIST="amdvlk amdgpupro radv"
unset AMD_VULKAN_DRIVER_LIST
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
export AMD_VULKAN_CB=":DCB"
fi
logical_cores=$(grep -c ^"processor" /proc/cpuinfo)
if [[ "${logical_cores}" -le "4" ]] ; then
GET_LOGICAL_CORE="1!$(seq -s! 1 $(( logical_cores - 1 )))"
......@@ -2755,7 +2894,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
......@@ -2788,6 +2927,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"
......@@ -2959,7 +3099,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
......@@ -3009,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
......@@ -3032,6 +3172,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
......@@ -3161,7 +3302,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}"
......@@ -3176,7 +3317,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"
......@@ -3246,7 +3387,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
......@@ -3259,6 +3400,9 @@ start_portwine () {
export int_xneur=1
fi
#https://github.com/flathub/net.lutris.Lutris/pull/368#issuecomment-1751381312
[[ $(check_vendor_gpu) =~ nvidia ]] && export WEBKIT_DISABLE_DMABUF_RENDERER=1
if check_gamescope_session ; then
export PW_GAMEMODERUN_SLR=""
elif [[ "$PW_USE_GAMEMODE" = "1" ]] \
......@@ -3266,14 +3410,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
......@@ -3450,7 +3596,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
;;
......@@ -3801,6 +3947,11 @@ start_portwine () {
export WINE_CPU_TOPOLOGY="${PW_WINE_CPU_TOPOLOGY}"
fi
if [[ -n "${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
......@@ -3828,7 +3979,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
......@@ -3967,7 +4118,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
......@@ -3975,10 +4126,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
......@@ -4092,7 +4243,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
......@@ -4225,24 +4376,41 @@ 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
pw_run start /high /b "${LAUNCH_URI}" &
unset GAMEPID
while true ; do
sleep 5
if [[ -z "$GAMEPID" ]] ; then
GAMEPID="$(pgrep -fa 'EpicPortal|epicusername|epiclocale|AUTH_LOGIN' | awk '{print $1}')"
else
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
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 () {
......@@ -4355,7 +4523,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"
......@@ -4903,6 +5071,14 @@ gui_edit_db () {
CPU_LIMIT_VAR="disabled"
fi
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
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 <b>WINDOWS</b> emulation]}!${translations[Changing the <b>WINDOWS</b> emulation version may be required to run older games. <b>WINDOWS</b> versions below 10 do not support new games with DirectX 12]} :CB" "${ADD_WINVER_EDIT_DB}" \
--field="${translations[AUTOINSTALL WITH <b>WINETRICKS</b>]}!${translations[Automatically install with <b>WINETRICKS</b> additional libraries required to run the game/program. List of libraries separated by spaces]} :CBE" "$(combobox_fix --empty "${PW_DLL_INSTALL}" "vcrun2019 corefonts lucida")" \
......@@ -4925,6 +5101,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 \
......@@ -4974,6 +5151,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 )))"
......@@ -4983,7 +5161,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}')"
......@@ -5933,7 +6111,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"
......@@ -6009,66 +6186,13 @@ 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}"
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"
# 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"
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
......@@ -6081,6 +6205,37 @@ 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
exe_path=$(sed -n 's/^Icon File Name\s*:\s*//p' "${PW_TMPFS_PATH}/exiftool.tmp")
else
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
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" ]] \
......@@ -6091,6 +6246,30 @@ 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
export PW_NO_RESTART_PPDB="1"
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")
......@@ -6101,38 +6280,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
......@@ -6166,6 +6314,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 \
......
#!/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}}')
"
......@@ -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 () {
......
#!/usr/bin/env bash
#Author: fidel
#FSonora+DLC.exe
#Rating=1-5
#####################examples###########################
export WINEDLLOVERRIDES="ddraw=n,b"
export PW_WINE_USE="WINE_LG"
......@@ -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-"
......
......@@ -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"
......
......@@ -3,8 +3,8 @@
# type: games
# name: Ankama Launcher
# image: ankama
# info_en:
# info_ru:
# info_en: Launcher for Ankama studio games.
# info_ru: Лаунчер для игр Ankama.
########################################################################
export LAUNCH_PARAMETERS="/S"
export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/Ankama-Setup.exe"
......
......@@ -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"
......
......@@ -3,8 +3,8 @@
# type: games
# name: Arizona Games Launcher
# image: arizonagameslauncher
# info_en:
# info_ru:
# info_en: Launcher for the Arizona Role Play game.
# info_ru: Лаунчер для игры Arizona Role Play.
########################################################################
export PW_PREFIX_NAME="ARIZONA_GAMES_LAUNCHER"
export LAUNCH_PARAMETERS="/S"
......
......@@ -3,8 +3,8 @@
# type: games
# name: Battle.net Launcher
# image: battle_net
# info_en:
# info_ru:
# info_en: Launcher for Activision and Blizzard studio games.
# info_ru: Лаунчер для игр Activision и Blizzard.
########################################################################
export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/Battle.net-Setup.exe"
export PW_WINE_USE="WINE_LG"
......
......@@ -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"
......
......@@ -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-"
......
......@@ -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"
......
......@@ -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"
......
......@@ -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"
......
......@@ -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}')
......
......@@ -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-"
......
......@@ -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"
......
......@@ -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"
......
......@@ -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"
......
......@@ -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
......
......@@ -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"
......
......@@ -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-"
......
......@@ -3,8 +3,8 @@
# type: games
# name: EA App (TEST)
# image: eaapp
# info_en:
# info_ru:
# info_en: Launcher for EA studio games.
# info_ru: Лаунчер для игр EA.
########################################################################
export LAUNCH_PARAMETERS="/silent /repair"
export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/EAappInstaller.exe"
......
......@@ -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"
......
......@@ -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"
......
......@@ -3,8 +3,8 @@
# type: games
# name: Epic Games Launcher
# image: epicgames
# info_en:
# info_ru:
# info_en: Launcher for the Epic Games game library.
# info_ru: Лаунчер для библиотеки игр Epic Games.
########################################################################
export LAUNCH_PARAMETERS="/q"
export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/EpicGamesLauncherInstaller.msi"
......
......@@ -3,14 +3,14 @@
# 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
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}"
......
......@@ -3,8 +3,8 @@
# type: games
# name: EVE Online Launcher
# image: eve
# info_en:
# info_ru:
# 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"
......
......@@ -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-"
......
......@@ -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"
......
......@@ -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
......
......@@ -3,8 +3,8 @@
# type: games
# name: Gameforge Client
# image: gameforge
# info_en:
# info_ru:
# info_en: Launcher for Gameforge studio games.
# info_ru: Лаунчер для игр Gameforge.
##########################################################################
pw_shutdown_please () {
if [[ "$PW_USE_RUNTIME" != 1 ]]
......
......@@ -3,8 +3,8 @@
# type: games
# name: GameXP
# image: gamexp
# info_en:
# info_ru:
# info_en: Launcher for GameXP studio games.
# info_ru: Лаунчер для игр GameXP.
########################################################################
export PW_PREFIX_NAME="GAMEXP"
export LAUNCH_PARAMETERS="/VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-"
......
#!/usr/bin/env bash
# Author: Castro-Fidel (linux-gaming.ru)
# type: games
# name: GoG Galaxy Launcher
# name: GOG Galaxy Launcher
# image: gog
# info_en:
# info_ru:
# info_en: Launcher for the GOG game library.
# info_ru: Лаунчер для библиотеки игр GOG.
########################################################################
GOG_VER="$(curl "https://remote-config.gog.com/components/webinstaller?component_version=2.0.0" \
| awk -F'setup_galaxy_' '{print $2}' \
......
......@@ -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"
......
......@@ -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"
......
......@@ -3,8 +3,8 @@
# type: games
# name: HoYoPlay
# image: hoyoplay
# info_en:
# info_ru:
# info_en: Launcher for HoYoverse studio games.
# info_ru: Лаунчер для игр HoYoverse.
########################################################################
export PW_VULKAN_USE=2
export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/Hoyolauncher_installer.exe"
......
......@@ -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"
......
......@@ -3,8 +3,8 @@
# type: games
# name: ITCH.IO
# image: itch
# info_en:
# info_ru:
# info_en: Launcher for the library of indie games.
# info_ru: Лаунчер для библиотеки инди-игр.
##########################################################################
export LAUNCH_PARAMETERS="--silent"
export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/itch-setup.exe"
......
......@@ -3,8 +3,8 @@
# type: games
# name: Lesta Game Center
# image: lgc
# info_en:
# info_ru:
# info_en: Launcher for Lesta Games studio games.
# info_ru: Лаунчер для игр Lesta Games.
########################################################################
export LAUNCH_PARAMETERS="/VERYSILENT"
export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/Lesta_Game_Center_Install_RU.exe"
......@@ -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"
......
......@@ -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"
......@@ -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"
......
......@@ -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
......
......@@ -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"
......
......@@ -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}')
......
......@@ -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"
......
......@@ -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"
......
......@@ -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"
......
......@@ -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"
......
......@@ -3,8 +3,8 @@
# type: games
# name: Plarium Play
# image: plariumplay
# info_en:
# info_ru:
# info_en: Launcher for Plarium studio games.
# info_ru: Лаунчер для игр Plarium.
########################################################################
export LAUNCH_PARAMETERS="/s"
export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/plarium_play_setup.exe"
......
#!/usr/bin/env bash
# Author: chal55rus (Sergey P.)
# type: emulators
# name: PPSSPP Window
# name: PPSSPP
# 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"
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}"
......
......@@ -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}' \
......
......@@ -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"
......
......@@ -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
......
......@@ -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"
......
......@@ -3,8 +3,8 @@
# type: games
# name: Rockstar Games Launcher
# image: Rockstar
# info_en:
# info_ru:
# info_en: Launcher for Rockstar studio games.
# info_ru: Лаунчер для игр Rockstar.
########################################################################
export PW_VULKAN_USE="1"
export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/Rockstar-Games-Launcher.exe"
......
......@@ -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"
......
......@@ -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"
......
......@@ -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"
......
......@@ -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"
......
......@@ -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"
......
......@@ -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"
......
#!/usr/bin/env bash
# Author: Castro-Fidel (linux-gaming.ru)
# type: games
# name: Steam (unstable)
# name: Steam (UNSTABLE)
# image: steam
# info_en:
# info_ru:
# info_en: Launcher for the Steam game library.
# info_ru: Лаунчер для библиотеки игр Steam.
########################################################################
export LAUNCH_PARAMETERS="/S /D=c:\Program Files (x86)\Steam"
export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/SteamSetup.exe"
......
......@@ -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"
......
......@@ -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"
......
......@@ -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"
......
......@@ -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}' \
......
......@@ -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}' \
......
......@@ -3,8 +3,8 @@
# type: games
# name: Ubisoft Game Launcher
# image: ubc
# info_en:
# info_ru:
# info_en: Launcher for Ubisoft studio games.
# info_ru: Лаунчер для игр Ubisoft.
########################################################################
export LAUNCH_PARAMETERS="/S /D=c:\Program Files (x86)\Ubisoft Game Launcher"
export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/UbisoftConnectInstaller.exe"
......
......@@ -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"
......
......@@ -3,8 +3,8 @@
# type: games
# name: vkPlay Games Center
# image: mygames
# info_en:
# info_ru:
# info_en: Launcher for the VK Play game library.
# info_ru: Лаунчер для библиотеки игр VK Play.
########################################################################
export PW_PREFIX_NAME="VK_PLAY"
export PW_AUTOINSTALL_EXE="${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}/drive_c/users/steamuser/AppData/Local/VKPlayLoader.exe"
......
......@@ -3,8 +3,8 @@
# type: games
# name: W3D Hub Launcher
# image: w3dhub
# info_en:
# info_ru:
# info_en: Launcher for W3D Hub community games.
# info_ru: Лаунчер для игр W3D Hub.
########################################################################
export PW_PREFIX_NAME="DOTNET"
export LAUNCH_PARAMETERS="/S"
......
......@@ -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"
......
......@@ -3,8 +3,8 @@
# type: games
# name: Wargaming Game Center
# image: wgc
# info_en:
# info_ru:
# info_en: Launcher for Wargaming studio games.
# info_ru: Лаунчер для игр Wargaming.
########################################################################
export LAUNCH_PARAMETERS="/VERYSILENT"
[[ "$LANGUAGE" == "ru" ]] && export WGC_LOC=RU || export WGC_LOC=EU
......@@ -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"
......
......@@ -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"
......
......@@ -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
......
......@@ -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
......
......@@ -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"
......
......@@ -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
......
......@@ -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")"
......@@ -92,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
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}*
......@@ -372,8 +376,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)
......@@ -678,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
......@@ -905,6 +931,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 ;;
......
#!/usr/bin/env bash
#Author: Castro-Fidel (linux-gaming.ru)
#SCRIPTS_NEXT_VERSION=2380
#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"
......@@ -41,10 +41,10 @@ export STAGING_SHARED_MEMORY="1"
export PW_SOUND_DRIVER_USE="pulse"
###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"
......@@ -55,9 +55,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.2-1"
export VKD3D_STABLE_VER="1.1-2602"
export VKD3D_GIT_VER="1.1-4271"
export VKD3D_GIT_VER="1.1-4326"
###VKBASALT###
export PW_VKBASALT_EFFECTS="Curves:cas"
export PW_VKBASALT_FFX_CAS="0.50"
......@@ -135,6 +135,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"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment