Video Game Launchers
There’s a special disdain that I feel whenever I launch a game, through Steam, Lutris, or some other medium, only to be greeted by some janky .NET or Electron launcher. It’s even more egregious when a game releases without a launcher, only to have one patched in later on, as a means of trying to sell you things.
Not content with baking adverts for their other games into the menu of your favourite ARPG, companies1 feel the need to spoil the very first step of your experience with their product, by at best making you find the new ‘Play’ button, hidden behind the first ‘Play’ button; or at worst, they manage to break the entire experience because you don’t happen to have .NET 3.5 installed on your PC, so the game doesn’t start at all…
Bypassing Launchers
Steam lets you set custom commands for your games, and launches its games using
a sort of bash wrapper script. Because of this, we can adjust which
executables are started and where. I’ll list some examples from my own system.
Batman: Arkham Asylum GOTY Edition
BAGOTY=(%command%); "${BAGOTY[@]/%BmLauncher.exe/ShippingPC-BmGame.exe}"
Baldur’s Gate 3
BG3=(%command%); "${BG3[@]/%LariLauncher.exe/../bin/bg3_dx11.exe}"
Civilization VI
CIV=(%command%); "${CIV[@]/%LauncherPatcher.exe/../Base/Binaries/Win64Steam/CivilizationVI.exe}"
In the above examples, it might not be obvious what’s happening. And being Linux
(bash) it’s also entirely possible to accomplish the same thing with different
mechanisms. An earlier version of these commands that I hacked up used sed
liberally, but it was cumbersome.
Effectively, we’re first setting a variable, e.g. BG3 to the typical output of
%command% which is the ’execution command’ that Steam runs when you hit
‘Play’.
It’s up to publishers what they want this %command% to do, but you can
find out what it’s doing by starting steam from the command line, changing
your Launch Options to something like echo %command% and simply checking what
scrolls by when you hit Play on your favourite game. It will usually be a path
to the .exe of a given game (or launcher, if the game publisher hates you).
Once we’ve set the variable, we then do some bash substitution, looking for the
point at which the .exe is called, and replacing it inline with another path.
In the simplest of the examples above, I simply redirect the BmLauncher.exe
path to ShippingPC-BmGame.exe instead. Presto, Batman launches without the
launcher.
The above all used Proton.
Caveats
Launchers with Settings
Launchers, by and large, are pointless; however some go an extra step of irritating, by putting the ‘configuration’ for the game inside the launcher, and stopping you from making changes inside the game itself2.
In these cases, it is normal to have to find the configuration (usually .ini)
file for a game, and adjust values within the file manually, this is error-prone
if you make a typo, but as long as you’re careful, it’s possible for most games.
Using Other Launch Options
What if you also want to use gamescope or gamemoderun? Well the adjustments
still work, but you have to take care with your ordering. My full BG3 example is
below, using mangohud, gamemoderun, and gamescope alongside the launcher
dismissal.
BG3=(%command%); MANGOHUD=1 gamemoderun gamescope -W 3840 -H 2160 --hdr-enabled --fullscreen "${BG3[@]/%LariLauncher.exe/../bin/bg3_dx11.exe}"