RetroArch

RetroArch

Not enough ratings
Запускаем свой эмулятор под видом Retroarch с оверлеем Steam
By LEGUSOR
Приветствую! В этом руководстве будет описано несколько способов замещения запуска оригинального Retroarch любым вашим эмулятором, чтобы Steam-клиент при этом думал, что запускается именно оригинал, сохраняя функционал оверлеея.

Зачем? причины могут быть разные: неудобства интерфейса retroarch, отсутствие каких-либо эмуляторов, привычка запуска на отдельных эмуляторах, лучшая совместимость отдельных эмуляторов с теми или иными играми, модификациями вроде наборов текстур, ромхаков и т.п.

Вы сами решаете, надо ли вам это или нет - я лишь объясню ход действий.
   
Award
Favorite
Favorited
Unfavorite
Способ №1: BAT в EXE
1. Установить Retroarch.

Примечание: если сам RetroArch не нужен, то можно удалить содержимое папки, ведь после установки у Steam-клиента остается файл appmanifest_1118310.acf. Или можно в папке ничего не трогать, чтобы иметь возможность параллельно пользоваться RetroArch. Целевым эмулятором в данном примере будет DuckStation для PS1.

2. Зайти в папку с программой (Retroarch -> ПКМ -> Управление -> Посмотреть локальные файлы):
  • ...\Steam\steamapps\common\RetroArch
Далее найти файл retroarch.exe, после чего либо переименовать, либо переместить, либо удалить - как хотите. В моем случае файл переименован в retroarch.bak.



3. Сделать подмену файла. В моем случае создание bat-файла с прописью на запуск нужного эмулятора, с последующей конвертацией в exe-файл с оригинальным названием через стороннее ПО (BAT to EXE converter).
3.2. Открываем программу, меняем язык, если надо.
В окне прописываем команду, после чего сохраняем файл как retroarch.bat, далее сразу же конвертируем в retroarch.exe, и программа сообщит о готовности. Получившийся retroarch.exe кидаем в корневую папку самого приложения в Steam-клиенте по пути:
  • ...\Steam\steamapps\common\RetroArch
3.3. Немного о тексте с командой start, так как у вас путь к целевому эмулятору может быть разным:
  • Если путь на латыни и без пробелов, то пример такой:
start C:\EMULS\duckstation-windows-x64-release\duckstation-qt-x64-ReleaseLTCG.exe
  • Если в пути есть пробелы, то пример такой:
start "" "C:\EMULS\duckstation windows x64 release\duckstation-qt-x64-ReleaseLTCG.exe"
  • Если в пути есть кириллица, то пример такой (в две строчки):
chcp 65001
start "" "C:\EMULS\Мой Эмулятор\duckstation-qt-x64-ReleaseLTCG.exe"
  • Если проблемы типа "Не удается найти путь\открыть указанный файл", то попробуйте пример в несколько строк с переходом в папку исполняемого файла командой cd, с последующим запуском отдельной командой start:
@echo off
cd C:\EMULS\duckstation-windows-x64-release
start duckstation-qt-x64-ReleaseLTCG.exe

Способ №2: Окно на PASCAL
Данный способ считаю оптимальным по простоте, удобству, скорости, весу устанавливаемого ПО и конечного результата, отсутствию необходимости в дополнительных костылях, плюс никакого сранья в системе автозапускаемыми модулями после установки. Преимущество перед способом выше - нет необходимости в нескольких файлах и их перетасовки с изменением имен, - все эмуляторы по кнопкам запускаются из одного окна.

Это будет приложение в виде окна с кнопками, созданное в PASCAL ABC NET. В примере рассмотрено две кнопки, но вы можете добавлять столько, сколько потребуется под ваши нужды. Все по принципу CTRL+C, CTRL+V.






2. Устанавливаем, куда нам удобно.




3. Запускаем PASCAL ABCNET, в окно копируем болванку с кодом (текстом программы).
{$apptype windows}
{$reference 'System.Drawing.dll'}
{$reference 'System.Windows.Forms.dll'}
uses
System,
System.Windows.Forms,
System.Drawing,
System.Net;

var
Form0: Form;
b1, b2: Button;

procedure b1_Click(sender: object; e: EventArgs);
begin
exec('C:\EMULS\rpcs3-v0.0.35-17665-1a51ce1e_win64\rpcs3.exe');
end;

procedure b2_Click(sender: object; e: EventArgs);
begin
exec('C:\EMULS\shadps4-win64-qt-0.6.0\shadPS4.exe');
end;

begin
Form0 := new Form;
Form0.Text := 'EmuStarter';
Form0.Width := 350;
Form0.Height := 350;

b1 := new Button;
b1.Text := 'PS3 - RPCS3';
b1.Width := 120;
b1.Left := 80;
b1.Top := 90;

b2 := new Button;
b2.Text := 'PS4 - ShadPS4';
b2.Width := 120;
b2.Left := 80;
b2.Top := 120;

b1.Click += b1_Click;
b2.Click += b2_Click;

Form0.Controls.Add(b1);
Form0.Controls.Add(b2);
Application.Run(Form0);
end.



Все записи, начинающиеся с // являются комментариями. Их можно оставить или удалить за ненадобностью. Так я пояснил действия.

4. Меняем код как вам нужно, сохраняем CTRL+S, после чего проверяем работоспособность, нажав F9 - Выполнить.
Если все хорошо, жмем CTRL+F9 - Компилировать.




По итогу в рабочей папке программы output появится ваш готовый exe-файл, который в дальнейшем будет использован для замещения Retroarch.
  • ...\PascalABCNET\Рабочая_папка\Output


5. Переходим в папку приложения Retroarch по пути:
  • ...\Steam\steamapps\common\RetroArch
Оригинальный файл retroarch.exe переименовываем как угодно. Если не пользуйтесь им, то просто удалите все содержимое папки Retroarch.

Скомпилированное ранее в конечный вид окно с кнопками для запуска эмуляторов в виде exe-файла переименовываем в retroarch.exe и помещаем туда же, в папку приложения, вместо оригинального:
  • ...\Steam\steamapps\common\RetroArch

Способ №3: Окно на Python, Часть первая - BAT-файлы
Данный способ в моем исполнении получился громоздким и костыльным, но оставлю ему право на жизнь как концепции. Суть в том, что сначала в папке с исполняемым exe-файлом каждого эмулятора создается bat-файл с прописью для запуска, который в дальнейшем будет использоваться как действие для кнопки в созданной на Python форме в виде окна с кнопками.



Отдельные bat-файлы выбраны потому, что прямая команда на запуск исполняемого файла в Python может вызывать ошибки при запуске некоторых эмуляторов, так и потребовать для корректного запуска, например, конкретного пользователя, иначе чуда не произойдет. Эти моменты как раз можно быстро и просто по-колхозному без навыков и знаний программирования разрешить через bat-файл.
В Python есть элементы кода, отвечающие за нормальный запуск приложения с опросом содержимого его папки или как-то так, но я где-то потерял страницу с нагугленным по теме материалом.

Знания программирования вам здесь не требуются, а у меня их нет, т.к. принцип CTRL+C, CTRL+V, и создано все это дело по доступной в интернете информации. Python немного весит, не требует регистрации где-либо и не оставляет в системе на постоянку автозапускаемые модули после установки.


1. У вас есть несколько целевых эмуляторов, для которых создается окно с кнопками. Открываем папки эмуляторов, где у каждого хранится исполняемый exe-файл, и создаем там .bat-файл с произвольным именем, например start.bat. Просто включите в свойствах вида папок отображение расширений файлов, создайте текстовый документ и переименуйте расширение после точки из txt в bat. Далее правой кнопкой мыши по файлу -> Изменить.



2. Внутри каждого bat-файла прописываем команду start и полный путь до исполняемого файла эмулятора. Пути у каждого свои.
В примере все тот же DuckStation. Вариант прописи с двойными кавычками избавит от назойливого окна консоли при запуске.
start "" "C:\EMULS\duckstation-windows-x64-release\duckstation-qt-x64-ReleaseLTCG.exe"


ПРИМЕЧАНИЕ:
Может получиться так, что конкретный эмулятор, как у меня в случае с RPCS3, может вообще никак не запускаться, если только его принудительно не стартануть от своего пользователя с паролем. Эту проблему решает команда ниже. Увидеть проблему вы сможете во время пробной компиляции окна в Python, поэтому тут предупрежу заранее - в вашем случае такого может вообще не случиться.
runas /savecred /user:youruser "C:\EMULS\rpcs3-v0.0.35-17665-1a51ce1e_win64\rpcs3.exe"
Где:
youruser - это имя вашего пользователя Windows, его и пишете.
В дальнейшем при запуске однократно вылезет окно, в котором надо будет ввести пароль от вашего пользователя, если он есть. При этом во время ввода строка в консоли не будет ничего отображать - просто вводим пароль и жмем Enter. Готово!


Это никакой не SCAM - мы всего лишь использовали команду "запуск от имени" - runas с сохранением пароля по флагу /savecred в диспетчере учетных данных Windows на локальном компьютере, что можно легко посмотреть, просто открыв Панель управления -> Учетные записи пользователей -> Диспетчер учетных данных, либо вызвав "Выполнить" и вбив в строку команду control keymgr.dll
За ненадобностью эти данные можно удалить в любой момент.



Способ №3: Окно на Python, Часть вторая - Python


4. Устанавливаем любым удобным способом: автоматически, либо вручную, с указанием пути:



4.1. Запускаем среду написания кода IDLE. Либо через строку меню "Пуск", либо через окно "Поиск" - как вам удобно.



5. Жмем "File -> New File". Открывается окно для ввода текста программы (кода). Копируем туда болванку из примера, которую вы в последствии будете переделывать под свои цели в рамках концепции данного руководства, если таковая вас устраивает.
# Import Library
from tkinter import *
import os
from tkinter.filedialog import askopenfilename

# Create Object
root = Tk()
root.title("EmuStarter")

# Set geometry
root.geometry('250x350')

def ps1():
os.system('"%s"' % "C:\\EMULS\\duckstation-windows-x64-release\\start.bat")
Button(root, text ='PS1 - Duckstation', command = ps1).pack(side = TOP, pady = 10)

def ps2():
os.system('"%s"' % "C:\\EMULS\\pcsx2-windows-x64\\start.bat")
Button(root, text ='PS2 - PCSX2', command = ps2).pack(side = TOP, pady = 10)

def ps3():
os.system('"%s"' % "C:\\EMULS\\rpcs3-v0.0.35-17665-1a51ce1e_win64\\start.bat")
Button(root, text ='PS3 - RPCS3', command = ps3).pack(side = TOP, pady = 10)

def ps4():
os.system('"%s"' % "C:\\EMULS\\shadps4-win64-qt-0.6.0\\start.bat")
Button(root, text ='PS4 - ShadPS4', command = ps4).pack(side = TOP, pady = 10)

def dream():
os.system('"%s"' % "C:\\EMULS\\flycast\\start.bat")
Button(root, text ='Dreamcast - FlyCast', command = dream).pack(side = TOP, pady = 10)

def ngc():
os.system('"%s"' % "C:\\EMULS\\Dolphin-x64\\start.bat")
Button(root, text ='Gamecube and Wii - Dolphin', command = ngc).pack(side = TOP, pady = 10)

def switch():
os.system('"%s"' % "C:\\EMULS\\ryujinx-1.1.1339-win_x64\\publish\\start.bat")
Button(root, text ='Switch - Ryujinx', command = switch).pack(side = TOP, pady = 10)

# Execute Tkinter
root.mainloop()


  • Теперь немного о том, что и как можно редактировать:
root.title("EmuStarter") - в кавычках меняется имя окна.
root.geometry('250x350') - в кавычках меняется размер окна: ширина х высота.

Всего в примере семь кнопок - каждая содержит три строки по тексту программы. Удалите эти три строки - удаляется кнопка. Допишите их - появится новая кнопка. Разберем на примере кнопки запуска эмулятора DuckStation:

def ps1():
os.system('"%s"' % "C:\\EMULS\\duckstation-windows-x64-release\\start.bat")
Button(root, text ='PS1 - Duckstation', command = ps1).pack(side = TOP, pady = 10)

  • Где:
def ps1(): - объявляем функцию с именем ps1. Вместо ps1 пишете что вам угодно.
os.system('"%s"' % "C:\\EMULS\\duckstation-windows-x64-release\\start.bat") - в двойных кавычках пишем полный путь к нашему ранее созданному bat-файлу для запуска целевого эмулятора. Обязательно в данном контексте использовать двойные \\, в противном случае при компиляции начнется сраньё предупреждениями, из-за чего у вас не будет работать кнопка.

Button(root, text ='PS1 - Duckstation', command = ps1).pack(side = TOP, pady = 10)
# 'PS1 - Duckstation' - пишем имя вашей кнопки.
# command = ps1 - выполнение ранее объявленной функции ps1. Имя функции и команда должны совпадать, т.е. def ps1 и command = ps1
# (side = TOP, pady = 10) - вроде бы положение кнопки. Я в этом не разбирался и налепил одну за одной. И так сойдет.

6. После того, как разобрались с текстом программы и написали как нужно, сохраняем файл, жмем F5, чтобы скомпилировать предварительный результат:


Способ №3: Окно на Python, Часть третья - Конвертация в EXE
На очереди конвертация ранее созданной программы в один исполняемый файл, который будет запускаться вместо Retroarch из-под клиента Steam по нажатии кнопки "Играть". Для этой цели есть разные методы, в примере выбран вариант Auto PY to EXE.
После установки Python нам из командной строки доступна команда pip, что будет использована в примере.
Далее открываем командную строку CMD.
— Жмем Win+R -> в строке вводим cmd
— Открылась командная строка. Вводим:
pip install auto-py-to-exe
— Ждем, пока установится, если предложит обновления, соглашаемся и обновляем.





8. Снова открываем командную строку, куда вводим команду:
auto-py-to-exe
ИЛИ запускаем сам файл по пути установки Python:
  • ...\Python\Scripts\auto-py-to-exe



9. Открылось окно auto-py-to-exe.
— Переключаем язык на русский.
— "Расположение скрипта" - тут выбираем наш ранее сохраненный файл .py с кодом программы.
— Выбираем "Один файл" и "Оконное приложение (скрыть консоль)".
— Жмем "Конвертировать PY в EXE". Дожидаемся завершения.
— Жмем "Открыть папку вывода" и получаем готовый результат в виде exe-файла.



  • ПРИМЕЧАНИЕ
На случай возможных проблем с правами учетных записей или контроля UAC можно зайти в меню настроек "Расширенные" и включить два параметра:
uac admin
uac uiaccess


Способ №3: Окно на Python, Часть четвертая - Замена файлов
Финальный шаг.
10. Переходим в папку приложения Retroarch по пути:
  • ...\Steam\steamapps\common\RetroArch
Оригинальный файл retroarch.exe переименовываем как угодно. Если не пользуйтесь им, то просто удалите все содержимое папки Retroarch.

Скомпилированное ранее в конечный вид окно с кнопками для запуска эмуляторов в виде exe-файла переименовываем в retroarch.exe и помещаем туда же, в папку приложения, вместо оригинального:
  • ...\Steam\steamapps\common\RetroArch

Заключение
Теперь при нажатии кнопки "Играть" в клиенте Steam запустится либо ваш эмулятор, либо окно для их запуска, в зависимости от выбранного способа, а когда вы начнете игру, будет доступен оверлей Steam.
Так можно сделать либо несколько файлов для перетасовки - каждый под свой эмулятор (способ №1), либо написать под себя окно с кнопками на Pascal (способ №2), Python (способ №3), C++ и т.п., которое будет маскироваться под retroarch.exe и включать нужный эмулятор сразу без создания множества файлов, а может и вообще прибегнуть к средствам вроде LaunchBox, RetroBat, ProjectArcade и подобным - но это уже на ваше усмотрение.
Здесь я лишь представил простые и легкие методы, доступные всем.