<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Knowledge Base (Posts about aoe2de)</title><link>https://bgstack15.ddns.net/blog/</link><description></description><atom:link href="https://bgstack15.ddns.net/blog/categories/aoe2de.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2026 &lt;a href="mailto:bgstack15@gmail.com"&gt;bgstack15&lt;/a&gt; 
&lt;a rel="license" href="https://www.gnu.org/licenses/gpl-3.0.html"&gt;
&lt;img alt="GNU General Public License v3.0"
style="border-width:0; margin-bottom:12px;"
src="https://bgstack15.ddns.net/.images/gplv3-127x51.png"&gt;&lt;/a&gt;</copyright><lastBuildDate>Mon, 13 Jul 2026 13:01:03 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>How to play AoE2DE multiplayer on linux without steam</title><link>https://bgstack15.ddns.net/blog/posts/2026/07/13/how-to-play-aoe2de-multiplayer-on-linux-without-steam/</link><dc:creator>bgstack15</dc:creator><description>&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;I recently purchased the remaining DLCs for &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/www.ageofempires.com/games/aoeiide/"&gt;Age of Empires II: Definitive Edition&lt;/a&gt; (&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/store.steampowered.com/app/813780/Age_of_Empires_II_Definitive_Edition/"&gt;steam&lt;/a&gt;) and I wanted to make sure that my ability to play this game survives Steam, my relationship with them, and even the world wide web.&lt;/p&gt;
&lt;p&gt;After a lot of research and the benefit of many Free Software tools, I can play multiplayer AoE2DE with my mods without Steam, on Linux! Here is my method for assembling a package for distributing to my systems without Internet. I have tested only for a few minutes between two machines in the same room. I don't know how this would scale to a vpn or wireless clients.&lt;/p&gt;
&lt;p&gt;This does not use system Wine, which crashes immediately with some opengl32 problem.&lt;/p&gt;
&lt;h2&gt;Building the package&lt;/h2&gt;
&lt;p&gt;This first asset is the proper Steam directory with all my DLCs installed.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;tar -zcf aoe2de-alldlcs-raw.2026-06-28.tgz "&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;HOME&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;/.steam/steam/steamapps/common/AoE2DE"
&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Explode my asset &lt;code&gt;aoe2de-alldlcs-raw.2026-06-28.tgz&lt;/code&gt; to ~/aoe2de.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;tar -zx -C ~ -f aoe2de-alldlcs-raw.2026-06-28.tgz
&lt;/pre&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Download dependency files to &lt;code&gt;~/aoe2de/prepare&lt;/code&gt;, which is a temporary spot.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="n"&gt;wget&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;GloriousEggroll&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;proton&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ge&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;custom&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;releases&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;download&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;GE&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Proton11&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;GE&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Proton11&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="n"&gt;tar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gz&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Open&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Wine&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Components&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;umu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;launcher&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;releases&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;download&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;1.4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;umu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;launcher_1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;4.0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;_amd64_debian&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;13.&lt;/span&gt;&lt;span class="n"&gt;deb&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Open&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Wine&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Components&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;umu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;launcher&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;releases&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;download&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;1.4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;umu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;launcher_1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;4.0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;_all_debian&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;13.&lt;/span&gt;&lt;span class="n"&gt;deb&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luskaner&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ageLANServerLauncherCompanion&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;releases&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;download&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ageLANServerLauncherCompanion_Age2FakeOnline_1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="n"&gt;zip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Detanup01&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gbe_fork&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;releases&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;download&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="n"&gt;_05_30&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;emu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;win&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luskaner&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ageLANServer&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;releases&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;download&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;14.1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ageLANServer_full_1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;14.1&lt;/span&gt;&lt;span class="n"&gt;_linux_x86&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;64.&lt;/span&gt;&lt;span class="n"&gt;tar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gz&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Move debs to &lt;code&gt;~/aoe2de/debs&lt;/code&gt;. They will need to be installed on any system that uses this package.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Explode GE-Proton11-1 to ~/aoe2de.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;tar -zx -C ~/aoe2de -f ~/aoe2de/prepare/GE-Proton11-1.tar.gz
&lt;/pre&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Prepare files from Goldberg Emulator fork.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;aoe2de&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;prepare&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="n"&gt;za&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;emu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;win&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;aoe2de&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;cp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pi&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;prepare&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;steamclient_experimental&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ColdClientLoader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ini&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;steamclient&lt;/span&gt;&lt;span class="o"&gt;*.&lt;/span&gt;&lt;span class="n"&gt;dll&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;steamclient_loader_x64&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Prepare the ColdClientLoader.ini. Here is the non-comment values I used.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="k"&gt;[SteamClient]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="na"&gt;Exe&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;AoE2DE\AoE2DE_s.exe&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="na"&gt;ExeRunDir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="na"&gt;ExeCommandLine&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;NOSTARTUP SKIPINTRO&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="na"&gt;AppId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;813780&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="na"&gt;SteamClientDll&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;steamclient.dll&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="na"&gt;SteamClient64Dll&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;steamclient64.dll&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="k"&gt;[Injection]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="na"&gt;ForceInjectSteamClient&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="na"&gt;ForceInjectGameOverlayRenderer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="na"&gt;DllsToInjectFolder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;dlls&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="na"&gt;IgnoreInjectionError&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="na"&gt;IgnoreLoaderArchDifference&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="k"&gt;[Persistence]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="na"&gt;Mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="k"&gt;[Debug]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="na"&gt;ResumeByDebugger&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Prepare configs for steam emulator&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;cd ~/aoe2de
mkdir -p dlls steam_settings saves
&lt;/pre&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Load dlls.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;cd ~/aoe2de/dlls
7za x ~/aoe2de/prepare/ageLANServerLauncherCompanion_Age2FakeOnline_1.0.0.0.zip
cp -pi ../prepare/release/steamclient_experimental/GameOverlayRenderer64.dll ../prepare/release/steamclient_experimental/extra_dlls/steamclient_extra_x64.dll .
&lt;/pre&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Prepare steam_settings.&lt;/p&gt;
&lt;p&gt;Prepare these based on &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/github.com/luskaner/ageLANServerLauncherCompanion"&gt;Reference 5&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;File &lt;code&gt;achievements.json&lt;/code&gt; is lengthy and not shown here.&lt;/p&gt;
&lt;p&gt;The DLCs that I own are these, for file &lt;code&gt;configs.app.ini&lt;/code&gt;.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="k"&gt;[app::dlcs]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="na"&gt;unlock_all&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="c1"&gt;# Expansions&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="na"&gt;2141580&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Age of Empires II: Definitive Edition - Return of Rome&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="na"&gt;2555420&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Age of Empires II: Definitive Edition - The Mountain Royals&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="c1"&gt;#2805510=Age of Empires II: Definitive Edition - Victors and Vanquished&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="na"&gt;2805520&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Age of Empires II: DE - Chronicles: Battle for Greece&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="na"&gt;3080080&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Age of Empires II: DE - The Three Kingdoms&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="c1"&gt;#3793540=Age of Empires II: DE - Chronicles: Alexander the Great&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="na"&gt;3219700&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Age of Empires II: DE – The Last Chieftains&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="na"&gt;1389240&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Age of Empires II: Definitive Edition - Lords of the West&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="na"&gt;1869820&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Age of Empires II: Definitive Edition - Dynasties of India&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="na"&gt;1557210&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Age of Empires II: Definitive Edition - Dawn of the Dukes&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="c1"&gt;# Animated Icons&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="c1"&gt;#2672800=Age of Empires II: Definitive Edition – La Hire’s Dry Humor Animated Icons&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="c1"&gt;#2672810=Age of Empires II: Definitive Edition – Joan’s Marvelous Moving Masterpieces Animated Icons&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="c1"&gt;#2672820=Age of Empires II: Definitive Edition – Barbarossa’s Barrel of Pickled Goods Animated Icons&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="c1"&gt;# Other&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="c1"&gt;#1039811=Enhanced Graphics Pack&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Prepare file &lt;code&gt;configs.user.ini&lt;/code&gt;.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="k"&gt;[user::general]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="c1"&gt;# Fill your account name as you would normally see.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="na"&gt;account_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;SpacesAreEvil65&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="c1"&gt;# Fill with your real steamid or leave empty for it to be auto-generated.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="na"&gt;account_steamid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="c1"&gt;# Choose one from steam_settings\supported_languages.txt (described in https://partner.steamgames.com/doc/store/localization/languages) or leave empty to be set as 'english'&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="c1"&gt;# Choose from 'Alpha-2' country code: https://www.iban.com/country-codes or leave empty to be set as 'US'&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="na"&gt;ip_country&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="k"&gt;[user::saves]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="na"&gt;local_save_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;saves&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;File &lt;code&gt;supported_languages.txt&lt;/code&gt; is exactly as is from &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/github.com/luskaner/ageLANServerLauncherCompanion"&gt;Reference 5&lt;/a&gt;.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;english
french
italian
german
japanese
koreana
brazilian
russian
schinese
latam
tchinese
turkish
vietnamese
spanish
polish
hindi
malay
&lt;/pre&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Prepare launcher script &lt;code&gt;aoe2de.sh&lt;/code&gt;.&lt;/p&gt;
&lt;div class="code"&gt;&lt;table class="codetable"&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/07/13/how-to-play-aoe2de-multiplayer-on-linux-without-steam/#-1"&gt;&lt;code data-line-number="1"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/07/13/how-to-play-aoe2de-multiplayer-on-linux-without-steam/#-2"&gt;&lt;code data-line-number="2"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="nv"&gt;PROTON_DISABLE_LSTEAMCLIENT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;WINEPREFIX&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;~/.wine-aoe2de &lt;span class="nv"&gt;PROTONPATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;~/aoe2de/GE-Proton11-1 umu-run ~/aoe2de/steamclient_loader_x64.exe NOSTARTUP SKIPINTRO
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;The first time you run, umu wants to download components from the Internet for your user. Client scripts &lt;code&gt;set-initial-umu.sh&lt;/code&gt; might be able to prevent that requirement.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Prepare scripts/ files.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/files/2026/listings/aoe2de-get-account-steamid.sh.html"&gt;files/2026/listings/aoe2de-get-account-steamid.sh&lt;/a&gt;  &lt;a href="https://bgstack15.ddns.net/blog/files/2026/listings/aoe2de-get-account-steamid.sh"&gt;(Source)&lt;/a&gt;&lt;/p&gt;&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;
&lt;span class="normal"&gt;7&lt;/span&gt;
&lt;span class="normal"&gt;8&lt;/span&gt;
&lt;span class="normal"&gt;9&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; -z &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="nv"&gt;scriptdir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; dirname &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; readlink -f &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="c1"&gt;# find first one. IGNORE the saves/settings/configs.user.ini which is the auto-generated one.&lt;/span&gt;
    &lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; find &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;scriptdir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;scriptdir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/.."&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;scriptdir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/../.."&lt;/span&gt; -ipath &lt;span class="s1"&gt;'*/steam_settings/configs.user.ini'&lt;/span&gt; -print -quit &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="nv"&gt;final_steamid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; awk -F&lt;span class="s1"&gt;'='&lt;/span&gt; &lt;span class="s1"&gt;'$1~/account_steamid/{print $NF}'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"account_steamid = &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;final_steamid&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;a href="https://bgstack15.ddns.net/blog/files/2026/listings/aoe2de-get-username.sh.html"&gt;files/2026/listings/aoe2de-get-username.sh&lt;/a&gt;  &lt;a href="https://bgstack15.ddns.net/blog/files/2026/listings/aoe2de-get-username.sh"&gt;(Source)&lt;/a&gt;&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;
&lt;span class="normal"&gt;7&lt;/span&gt;
&lt;span class="normal"&gt;8&lt;/span&gt;
&lt;span class="normal"&gt;9&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; -z &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="nv"&gt;scriptdir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; dirname &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; readlink -f &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="c1"&gt;# find first one&lt;/span&gt;
    &lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; find &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;scriptdir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;scriptdir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/.."&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;scriptdir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/../.."&lt;/span&gt; -ipath &lt;span class="s1"&gt;'*/steam_settings/configs.user.ini'&lt;/span&gt; -print -quit &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

awk -F&lt;span class="s1"&gt;'='&lt;/span&gt; &lt;span class="s1"&gt;'$1~/account_name/{print $NF}'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;a href="https://bgstack15.ddns.net/blog/files/2026/listings/aoe2de-set-account-steamid.sh.html"&gt;files/2026/listings/aoe2de-set-account-steamid.sh&lt;/a&gt;  &lt;a href="https://bgstack15.ddns.net/blog/files/2026/listings/aoe2de-set-account-steamid.sh"&gt;(Source)&lt;/a&gt;&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;
&lt;span class="normal"&gt;24&lt;/span&gt;
&lt;span class="normal"&gt;25&lt;/span&gt;
&lt;span class="normal"&gt;26&lt;/span&gt;
&lt;span class="normal"&gt;27&lt;/span&gt;
&lt;span class="normal"&gt;28&lt;/span&gt;
&lt;span class="normal"&gt;29&lt;/span&gt;
&lt;span class="normal"&gt;30&lt;/span&gt;
&lt;span class="normal"&gt;31&lt;/span&gt;
&lt;span class="normal"&gt;32&lt;/span&gt;
&lt;span class="normal"&gt;33&lt;/span&gt;
&lt;span class="normal"&gt;34&lt;/span&gt;
&lt;span class="normal"&gt;35&lt;/span&gt;
&lt;span class="normal"&gt;36&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="c1"&gt;# Useful because the emulator seems to pick the same number on every system when it needs to generate its own account_steamid.&lt;/span&gt;
&lt;span class="c1"&gt;# Dependencies:&lt;/span&gt;
&lt;span class="c1"&gt;#    dep-devuan: moreutils&lt;/span&gt;
&lt;span class="c1"&gt;# Env vars: APPLY VERBOSE&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; -z &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="nv"&gt;scriptdir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; dirname &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; readlink -f &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="c1"&gt;# find first one. IGNORE the saves/settings/configs.user.ini which is the auto-generated one.&lt;/span&gt;
    &lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; find &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;scriptdir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;scriptdir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/.."&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;scriptdir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/../.."&lt;/span&gt; -ipath &lt;span class="s1"&gt;'*/steam_settings/configs.user.ini'&lt;/span&gt; -print -quit &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c1"&gt;# Steam id is 17 digits long, decimal, and starts with 765611982&lt;/span&gt;
&lt;span class="nv"&gt;new_steamid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"765611982&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; &amp;lt;/dev/random tr -dc &lt;span class="s1"&gt;'0-9'&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; head -c8 &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# modconf.py breaks on set account_steamid because of the underscore. I will have to do this with awk or sed or similar 2026-06-30-3 23:55&lt;/span&gt;
&lt;span class="c1"&gt;#if test -n "${VERBOSE}" ; then echo "/usr/libexec/bgscripts/py/modconf.py ${APPLY:+-a} ${VERBOSE:+-v} -s '[user::general]' \"${INFILE}\" set account_steamid \"${new_steamid}\"" ; fi&lt;/span&gt;
&lt;span class="c1"&gt;#/usr/libexec/bgscripts/py/modconf.py ${APPLY:+-a} ${VERBOSE:+-v} -s '[user::general]' "${INFILE}" set account_steamid "${new_steamid}"&lt;/span&gt;

&lt;span class="c1"&gt;# So use basic awk instead&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; -n &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERBOSE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"awk -v \"b=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;new_steamid&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;\" -F'=' 'BEGIN{OFS=\"=\"} \$1~/account_steamid/{\$2=b} {print}' \"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;\" | sponge \"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;\""&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; -n &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;APPLY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;then&lt;/span&gt;
    awk -v &lt;span class="s2"&gt;"b=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;new_steamid&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; -F&lt;span class="s1"&gt;'='&lt;/span&gt; &lt;span class="s1"&gt;'BEGIN{OFS="="} $1~/account_steamid/{$2=b} {print}'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sponge &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="c1"&gt;# Regardless if it worked, read the value and show it.&lt;/span&gt;
    &lt;span class="nv"&gt;final_steamid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; awk -F&lt;span class="s1"&gt;'='&lt;/span&gt; &lt;span class="s1"&gt;'$1~/account_steamid/{print $NF}'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"account_steamid = &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;final_steamid&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c1"&gt;# modconf.py has a bug where it adds an additional newline after that updated line, so&lt;/span&gt;
&lt;span class="c1"&gt;# collapse multiple empty lines into a single empty line: ref https://unix.stackexchange.com/a/72749&lt;/span&gt;
awk &lt;span class="s1"&gt;'!NF {if (++n &amp;lt;= 1) print; next}; {n=0;print}'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sponge &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; -z &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;APPLY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Dry run only! Use APPLY=1"&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;a href="https://bgstack15.ddns.net/blog/files/2026/listings/aoe2de-set-cert-from-server.sh.html"&gt;files/2026/listings/aoe2de-set-cert-from-server.sh&lt;/a&gt;  &lt;a href="https://bgstack15.ddns.net/blog/files/2026/listings/aoe2de-set-cert-from-server.sh"&gt;(Source)&lt;/a&gt;&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;
&lt;span class="normal"&gt;24&lt;/span&gt;
&lt;span class="normal"&gt;25&lt;/span&gt;
&lt;span class="normal"&gt;26&lt;/span&gt;
&lt;span class="normal"&gt;27&lt;/span&gt;
&lt;span class="normal"&gt;28&lt;/span&gt;
&lt;span class="normal"&gt;29&lt;/span&gt;
&lt;span class="normal"&gt;30&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="nv"&gt;IPADDRESS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IPADDRESS&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; -z &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="nv"&gt;scriptdir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; dirname &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; readlink -f &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; find &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;scriptdir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;scriptdir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/.."&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;scriptdir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/../.."&lt;/span&gt; -ipath &lt;span class="s1"&gt;'*/certificates/cacert.pem'&lt;/span&gt; -print -quit &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; readlink -f &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; -z &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IPADDRESS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Fatal! Provide \$1 or IPADDRESS (IP address or hostname) to fetch certificate. Aborted."&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
    &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="nv"&gt;cert&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; &amp;lt;/dev/null openssl s_client -connect &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IPADDRESS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:443"&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&amp;gt;/dev/null &lt;span class="p"&gt;|&lt;/span&gt; openssl x509 -in /dev/stdin &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="c1"&gt;# Exit if the connection failed. Openssl x509 already printed an error, so do not print another.&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; -z &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;cert&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="nv"&gt;next_next_to_last&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;cert&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;'{a[NR]=$0} END {print a[NR-2]}'&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; ! grep -q -e &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;next_next_to_last&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"You need the cert! File &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; does not have the cert."&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; -n &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;APPLY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;then&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Applying the the cert."&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;cert&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &amp;gt;&amp;gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Dry run only! Please run with APPLY=1 to add the cert."&lt;/span&gt;
    &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"File &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; has the cert already."&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;a href="https://bgstack15.ddns.net/blog/files/2026/listings/aoe2de-set-etc-hosts.sh.html"&gt;files/2026/listings/aoe2de-set-etc-hosts.sh&lt;/a&gt;  &lt;a href="https://bgstack15.ddns.net/blog/files/2026/listings/aoe2de-set-etc-hosts.sh"&gt;(Source)&lt;/a&gt;&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;
&lt;span class="normal"&gt;24&lt;/span&gt;
&lt;span class="normal"&gt;25&lt;/span&gt;
&lt;span class="normal"&gt;26&lt;/span&gt;
&lt;span class="normal"&gt;27&lt;/span&gt;
&lt;span class="normal"&gt;28&lt;/span&gt;
&lt;span class="normal"&gt;29&lt;/span&gt;
&lt;span class="normal"&gt;30&lt;/span&gt;
&lt;span class="normal"&gt;31&lt;/span&gt;
&lt;span class="normal"&gt;32&lt;/span&gt;
&lt;span class="normal"&gt;33&lt;/span&gt;
&lt;span class="normal"&gt;34&lt;/span&gt;
&lt;span class="normal"&gt;35&lt;/span&gt;
&lt;span class="normal"&gt;36&lt;/span&gt;
&lt;span class="normal"&gt;37&lt;/span&gt;
&lt;span class="normal"&gt;38&lt;/span&gt;
&lt;span class="normal"&gt;39&lt;/span&gt;
&lt;span class="normal"&gt;40&lt;/span&gt;
&lt;span class="normal"&gt;41&lt;/span&gt;
&lt;span class="normal"&gt;42&lt;/span&gt;
&lt;span class="normal"&gt;43&lt;/span&gt;
&lt;span class="normal"&gt;44&lt;/span&gt;
&lt;span class="normal"&gt;45&lt;/span&gt;
&lt;span class="normal"&gt;46&lt;/span&gt;
&lt;span class="normal"&gt;47&lt;/span&gt;
&lt;span class="normal"&gt;48&lt;/span&gt;
&lt;span class="normal"&gt;49&lt;/span&gt;
&lt;span class="normal"&gt;50&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="c1"&gt;# Dependencies:&lt;/span&gt;
&lt;span class="c1"&gt;#    dep-devuan: bgscripts&lt;/span&gt;
&lt;span class="c1"&gt;# TODO:&lt;/span&gt;
&lt;span class="c1"&gt;#    clean up #ageLANServer entries&lt;/span&gt;
&lt;span class="nv"&gt;scriptdir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; dirname &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; readlink -f &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="p"&gt;/etc/hosts&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
mkdir -p &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;scriptdir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/backups"&lt;/span&gt;
&lt;span class="c1"&gt;# needs bgscripts&lt;/span&gt;
sudo bup &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;scriptdir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/backups"&lt;/span&gt;
&lt;span class="nv"&gt;IPADDRESS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IPADDRESS&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; -z &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IPADDRESS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Fatal! Need \$1 or IPADDRESS. Aborted."&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
    &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="c1"&gt;# I need to remove the loopback address for this host, only if this is the server&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"WARNING: for server only, please modify /etc/hosts and remove 127.0.0.1-type entries. Not implemented automatically yet."&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;

&lt;span class="c1"&gt;# nice idea, but I don't want to depend on this&lt;/span&gt;
&lt;span class="c1"&gt;# This only adds the relevant api.ageofempires.com entries.&lt;/span&gt;
&lt;span class="c1"&gt;#sudo "${scriptdir}/../ageLANServer/linux/launcher/bin/config-admin" setup --game age2 --ip "${IPADDRESS}"&lt;/span&gt;

&lt;span class="nv"&gt;_resolved&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; getent hosts &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IPADDRESS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;'{print $1}'&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Using resolved ip address &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;_resolved&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; word &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
aoe-api.reliclink.com &lt;span class="se"&gt;\&lt;/span&gt;
aoe-api.worldsedgelink.com &lt;span class="se"&gt;\&lt;/span&gt;
api.ageofempires.com &lt;span class="se"&gt;\&lt;/span&gt;
cdn.ageofempires.com &lt;span class="se"&gt;\&lt;/span&gt;
pb-live-release1-api.worldsedgelink.com &lt;span class="se"&gt;\&lt;/span&gt;
pb-live-release2-api.worldsedgelink.com &lt;span class="se"&gt;\&lt;/span&gt;
pb-live-release3-api.worldsedgelink.com &lt;span class="se"&gt;\&lt;/span&gt;
pb-live-release4-api.worldsedgelink.com &lt;span class="se"&gt;\&lt;/span&gt;
pb-live-release5-api.worldsedgelink.com &lt;span class="se"&gt;\&lt;/span&gt;
pb-live-release6-api.worldsedgelink.com &lt;span class="se"&gt;\&lt;/span&gt;
pb-live-release7-api.worldsedgelink.com &lt;span class="se"&gt;\&lt;/span&gt;
pb-live-release8-api.worldsedgelink.com &lt;span class="se"&gt;\&lt;/span&gt;
pb-live-release9-api.worldsedgelink.com &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="nv"&gt;long&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;word&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;#ageLANServer"&lt;/span&gt;
    &lt;span class="c1"&gt;# depends on bgscripts&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; -n &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERBOSE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"sudo updateval -v &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;_resolved&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;long&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt; &lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;_resolved&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;long&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;
    &lt;span class="k"&gt;fi&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; -n &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;APPLY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
        sudo updateval -a &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;_resolved&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;long&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;_resolved&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;long&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;a href="https://bgstack15.ddns.net/blog/files/2026/listings/aoe2de-set-initial-mods.sh.html"&gt;files/2026/listings/aoe2de-set-initial-mods.sh&lt;/a&gt;  &lt;a href="https://bgstack15.ddns.net/blog/files/2026/listings/aoe2de-set-initial-mods.sh"&gt;(Source)&lt;/a&gt;&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="nv"&gt;scriptdir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; dirname &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; readlink -f &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="p"&gt;/mnt/public/Support/Games/aoe2de-on-linux/aoe2de-mods-subscribed.2026-06-26.tgz&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;steamid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;scriptdir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/get-account-steamid.sh"&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;'{print $NF}'&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;WINEPREFIX&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WINEPREFIX&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;/.wine-aoe2de&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;destdir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WINEPREFIX&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/drive_c/users/steamuser/Games/Age of Empires 2 DE/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;steamid&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/mods"&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; -n &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERBOSE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"tar -zx -C \"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;destdir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;\" -f \"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;\""&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; -n &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;APPLY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;then&lt;/span&gt;
    mkdir -p &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;destdir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    tar -zx -C &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;destdir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; -f &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Dry run only! Please run with APPLY=1 to apply the initial mods."&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;a href="https://bgstack15.ddns.net/blog/files/2026/listings/aoe2de-set-initial-profile.sh.html"&gt;files/2026/listings/aoe2de-set-initial-profile.sh&lt;/a&gt;  &lt;a href="https://bgstack15.ddns.net/blog/files/2026/listings/aoe2de-set-initial-profile.sh"&gt;(Source)&lt;/a&gt;&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="nv"&gt;scriptdir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; dirname &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; readlink -f &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;indir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; readlink -f &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;scriptdir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/../initial-files"&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;steamid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;scriptdir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/get-account-steamid.sh"&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;'{print $NF}'&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;WINEPREFIX&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WINEPREFIX&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;/.wine-aoe2de&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;destdir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WINEPREFIX&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/drive_c/users/steamuser/Games/Age of Empires 2 DE/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;steamid&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; -n &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERBOSE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"cp -pr \"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;indir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/profile\" \"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;destdir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;\""&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; -n &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;APPLY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;then&lt;/span&gt;
    mkdir -p &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;destdir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    cp -pr &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;indir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/profile"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;destdir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Dry run only! Please run with APPLY=1 to apply the initial profile."&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;a href="https://bgstack15.ddns.net/blog/files/2026/listings/aoe2de-set-initial-registry.sh.html"&gt;files/2026/listings/aoe2de-set-initial-registry.sh&lt;/a&gt;  &lt;a href="https://bgstack15.ddns.net/blog/files/2026/listings/aoe2de-set-initial-registry.sh"&gt;(Source)&lt;/a&gt;&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="nv"&gt;PROTON_DISABLE_LSTEAMCLIENT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;WINEPREFIX&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;~/.wine-aoe2de &lt;span class="nv"&gt;PROTONPATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;~/aoe2de/GE-Proton11-1 umu-run regedit &lt;span class="s2"&gt;"x:\aoe2de\initial-files\aoe2de-partial.reg"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;a href="https://bgstack15.ddns.net/blog/files/2026/listings/aoe2de-set-initial-umu.sh.html"&gt;files/2026/listings/aoe2de-set-initial-umu.sh&lt;/a&gt;  &lt;a href="https://bgstack15.ddns.net/blog/files/2026/listings/aoe2de-set-initial-umu.sh"&gt;(Source)&lt;/a&gt;&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="nv"&gt;scriptdir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; dirname &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; readlink -f &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;indir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; readlink -f &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;scriptdir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/../initial-files"&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;destdir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/.local/share"&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; -n &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERBOSE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"cp -pr \"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;indir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/umu\" \"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;destdir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;\""&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; -n &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;APPLY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;then&lt;/span&gt;
    mkdir -p &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;destdir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    cp -pr &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;indir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/umu"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;destdir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Dry run only! Please run with APPLY=1 to apply the initial umu files."&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;a href="https://bgstack15.ddns.net/blog/files/2026/listings/aoe2de-set-username.sh.html"&gt;files/2026/listings/aoe2de-set-username.sh&lt;/a&gt;  &lt;a href="https://bgstack15.ddns.net/blog/files/2026/listings/aoe2de-set-username.sh"&gt;(Source)&lt;/a&gt;&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="c1"&gt;# Dependencies:&lt;/span&gt;
&lt;span class="c1"&gt;#    dep-devuan: bgscripts, moreutils&lt;/span&gt;
&lt;span class="c1"&gt;# Env vars: APPLY VERBOSE&lt;/span&gt;
&lt;span class="nv"&gt;USERNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;USERNAME&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; -z &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;USERNAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Fatal! Need \$1 or USERNAME. Aborted."&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; -z &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="nv"&gt;scriptdir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; dirname &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; readlink -f &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="c1"&gt;# find first one&lt;/span&gt;
    &lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; find &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;scriptdir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;scriptdir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/.."&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;scriptdir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/../.."&lt;/span&gt; -ipath &lt;span class="s1"&gt;'*/steam_settings/configs.user.ini'&lt;/span&gt; -print -quit &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c1"&gt;# This depends on bgscripts.&lt;/span&gt;
/usr/libexec/bgscripts/py/modconf.py &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;APPLY&lt;/span&gt;&lt;span class="p"&gt;:+-a&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERBOSE&lt;/span&gt;&lt;span class="p"&gt;:+-v&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; -s &lt;span class="s1"&gt;'[user::general]'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; account_name &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;USERNAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# modconf.py has a bug where it adds an additional newline after that updated line, so&lt;/span&gt;
&lt;span class="c1"&gt;# collapse multiple empty lines into a single empty line: ref https://unix.stackexchange.com/a/72749&lt;/span&gt;
awk &lt;span class="s1"&gt;'!NF {if (++n &amp;lt;= 1) print; next}; {n=0;print}'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sponge &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INFILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; -z &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;APPLY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Dry run only! Use APPLY=1"&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Prepare ageLANServer assets for server.&lt;/p&gt;
&lt;p&gt;These assets are only needed for the machine that will run the server.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;mkdir -p ~/aoe2de/ageLANServer/linux
tar -zx -C ~/aoe2de/ageLANServer/linux -f ~/aoe2de/prepare/ageLANServer_full_1.14.1_linux_x86-64.tar.gz
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Adjust &lt;code&gt;battle-server-manager/resources/config.age2.toml&lt;/code&gt;&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;Path = '../../../AoE2DE/BattleServer/BattleServer.exe'
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Adjust &lt;code&gt;server/resources/config/config.toml&lt;/code&gt;&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;Enabled = ["age2"]
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I could have written sed statements, but I didn't bother.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Prepare initial files.&lt;/p&gt;
&lt;p&gt;I copied what I think is a reasonably configured "low graphics" user profile from &lt;code&gt;~/.wine-aoe2de.attempt2/drive_c/users/steamuser/Games/Age\ of\ Empires\ 2\ DE/7656119EXAMPLE892&lt;/code&gt;. Place it as &lt;code&gt;~/aoe2de/initial-files/profile&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Prepare &lt;code&gt;initial-files/README.md&lt;/code&gt;.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="c1"&gt;# Profile&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;This&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;initial&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;already&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sets&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;graphics&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;low&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Most&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;but&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;probably&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;my&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;preferred&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;are&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;loaded&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;already&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="n"&gt;The&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;destination&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;following&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;WINEPREFIX&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;drive_c&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;steamuser&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Games&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Age&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Empires&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DE&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;7656119&lt;/span&gt;&lt;span class="n"&gt;EXAMPLE892&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="c1"&gt;# Umu&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;This&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;HOME&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;umu&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;01.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="c1"&gt;# Registry key&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="n"&gt;It&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;appears&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;some&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;are&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;some&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;are&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;WINEPREFIX&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;drive_c&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;steamuser&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Games&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Age&lt;/span&gt;\&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;of&lt;/span&gt;\&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Empires&lt;/span&gt;\&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;\&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DE&lt;/span&gt;&lt;span class="o"&gt;/$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;account_steamid&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Player&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nfp&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;So&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ones&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;However&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;also&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;appears&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="n"&gt;HKEY_USERS&lt;/span&gt;\&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;sid&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;UID&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;\&lt;span class="n"&gt;Software&lt;/span&gt;\&lt;span class="n"&gt;Microsoft&lt;/span&gt;\&lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Games&lt;/span&gt;\&lt;span class="n"&gt;Age&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Empires&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;II&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DE&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;which&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;predictable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Prepare the initial umu from a working environment. I found one that works for clients that is less than 1GB, with only steamrt4/.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;cp -pr ~/.local/share/umu ~/aoe2de/initial-files/
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;NOTE: It appears some values are in registry, and some are in &lt;code&gt;${WINEPREFIX}/drive_c/users/steamuser/Games/Age\ of\ Empires\ 2\ DE/${account_steamid}/profile/Player.nfp&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This command exports the registry keys for the game to &lt;code&gt;${HOME}\aoe2de-partial.reg&lt;/code&gt;. This depends on symlink &lt;code&gt;${WINEPREFIX}/dosdevices/x: -&amp;gt; ${HOME}&lt;/code&gt;&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="n"&gt;PROTON_DISABLE_LSTEAMCLIENT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mh"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;WINEPREFIX&lt;/span&gt;&lt;span class="o"&gt;=~/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wine&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;aoe2de&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PROTONPATH&lt;/span&gt;&lt;span class="o"&gt;=~/&lt;/span&gt;&lt;span class="n"&gt;aoe2de&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;GE&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Proton11&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;umu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;regedit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;E&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"x:&lt;/span&gt;&lt;span class="se"&gt;\a&lt;/span&gt;&lt;span class="s"&gt;oe2de\initial-files&lt;/span&gt;&lt;span class="se"&gt;\a&lt;/span&gt;&lt;span class="s"&gt;oe2de-partial.reg"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"HKEY_CURRENT_USER\Software\Microsoft\Microsoft Games\Age of Empires II DE"&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Build release asset #2.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;tar -zc -C ~ -f ~/aoe2de-other-components-2026-07-01.tgz --exclude 'AoE2DE' --exclude 'prepare' aoe2de
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This tar operation only took about r0:03.30.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Description of this working environment&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~/aoe2de&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ageLANServer/linux&lt;/code&gt; exploded from &lt;a href="https://github.com/luskaner/ageLANServer/releases/download/v1.14.1/ageLANServer_full_1.14.1_linux_x86-64.tar.gz"&gt;https://github.com/luskaner/ageLANServer/releases/download/v1.14.1/ageLANServer_full_1.14.1_linux_x86-64.tar.gz&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;battle-server-manager/resources/config.age2.toml&lt;/code&gt; customized&lt;/li&gt;
&lt;li&gt;&lt;code&gt;server/resources/config/config.toml&lt;/code&gt; customized&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AoE2DE&lt;/code&gt; proper Steam game with all my DLCs, named aoe2de-on-linux/aoe2de-alldlcs-raw.2026-06-28.tgz&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aoe2de.sh&lt;/code&gt; launcher script&lt;/li&gt;
&lt;li&gt;ColdClientLoader.ini customized&lt;/li&gt;
&lt;li&gt;steamclient64.dll&lt;/li&gt;
&lt;li&gt;steamclient.dll&lt;/li&gt;
&lt;li&gt;&lt;code&gt;steamclient_loader_x64.exe&lt;/code&gt; These four from &lt;a href="https://github.com/Detanup01/gbe_fork/releases/download/release-2026_05_30/emu-win-release.7z"&gt;https://github.com/Detanup01/gbe_fork/releases/download/release-2026_05_30/emu-win-release.7z&lt;/a&gt; &lt;code&gt;release/steamclient_experimental/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;debs/ Two files from &lt;a href="https://github.com/Open-Wine-Components/umu-launcher/releases/tag/1.4.0"&gt;https://github.com/Open-Wine-Components/umu-launcher/releases/tag/1.4.0&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;python3-umu-launcher_1.4.0-1_amd64_debian-13.deb&lt;/code&gt; &lt;a href="https://github.com/Open-Wine-Components/umu-launcher/releases/download/1.4.0/python3-umu-launcher_1.4.0-1_amd64_debian-13.deb"&gt;https://github.com/Open-Wine-Components/umu-launcher/releases/download/1.4.0/python3-umu-launcher_1.4.0-1_amd64_debian-13.deb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;umu-launcher_1.4.0-1_all_debian-13.deb&lt;/code&gt; &lt;a href="https://github.com/Open-Wine-Components/umu-launcher/releases/download/1.4.0/umu-launcher_1.4.0-1_all_debian-13.deb"&gt;https://github.com/Open-Wine-Components/umu-launcher/releases/download/1.4.0/umu-launcher_1.4.0-1_all_debian-13.deb&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;dlls/&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ageLANServerLauncherCompanion_Age2FakeOnline_1.0.0.0.dll&lt;/code&gt; from &lt;a href="https://github.com/luskaner/ageLANServerLauncherCompanion/releases/download/v1.3.0.0/ageLANServerLauncherCompanion_Age2FakeOnline_1.0.0.0.zip"&gt;https://github.com/luskaner/ageLANServerLauncherCompanion/releases/download/v1.3.0.0/ageLANServerLauncherCompanion_Age2FakeOnline_1.0.0.0.zip&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GameOverlayRenderer64.dll&lt;/li&gt;
&lt;li&gt;&lt;code&gt;steamclient_extra_x64.dll&lt;/code&gt; These two from &lt;a href="https://github.com/Detanup01/gbe_fork/releases/download/release-2026_05_30/emu-win-release.7z"&gt;https://github.com/Detanup01/gbe_fork/releases/download/release-2026_05_30/emu-win-release.7z&lt;/a&gt; &lt;code&gt;release/steamclient_experimental/&lt;/code&gt; and &lt;code&gt;extra_dlls/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;GE-Proton11-1/ exploded from &lt;a href="https://github.com/GloriousEggroll/proton-ge-custom/releases/download/GE-Proton11-1/GE-Proton11-1.tar.gz"&gt;https://github.com/GloriousEggroll/proton-ge-custom/releases/download/GE-Proton11-1/GE-Proton11-1.tar.gz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;initial-files/&lt;ul&gt;
&lt;li&gt;aoe2de-partial.reg Generated myself, in an attempt to store my settings.&lt;/li&gt;
&lt;li&gt;profile/ Generated myself, in an attempt to store my settings.&lt;/li&gt;
&lt;li&gt;umu/ Copy of ~/.local/share/umu to avoid needing the Internet for umu to fetch its components&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;saves/ Empty directory that will be used by clients&lt;/li&gt;
&lt;li&gt;scripts/ Generated myself, useful scripts for this package.&lt;/li&gt;
&lt;li&gt;steam_settings/ Minimal configs for steam emulator, described by &lt;a href="https://github.com/luskaner/ageLANServerLauncherCompanion"&gt;https://github.com/luskaner/ageLANServerLauncherCompanion&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;configs.app.ini Customized for the DLCs I own&lt;/li&gt;
&lt;li&gt;configs.user.ini Will be customized for each client, for &lt;code&gt;account_steamid&lt;/code&gt; and &lt;code&gt;account_username&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Operations&lt;/h2&gt;
&lt;p&gt;See also &lt;code&gt;/mnt/public/Support/Games/aoe2de-on-linux/aoe2de-without-steam.md&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Installing this offline bundle&lt;/h3&gt;
&lt;p&gt;A server and client get the same assets. The server needs some additional steps.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Explode tarball of AoE2DE itself, to ~/aoe2de.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;tar -zxf /mnt/public/Support/Games/aoe2de-on-linux/aoe2de-alldlcs-raw.2026-06-28.tgz -C ~
&lt;/pre&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Explode the other components.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;tar -zxf /mnt/public/Support/Games/aoe2de-on-linux/aoe2de-other-components-2026-07-01.tgz -C ~
&lt;/pre&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Installing a client&lt;/h4&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="n"&gt;In&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;aoe2de&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;some&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;`scripts&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="o"&gt;-*&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sh&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;APPLY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mh"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;steamid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;randomize&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;steamid&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;emulator&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;APPLY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mh"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;initial&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sh&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;APPLY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mh"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;initial&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;umu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sh&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;APPLY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mh"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;initial&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mods&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;optional&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;APPLY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mh"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"Steve Harvee 3"&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;initial&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sh&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="n"&gt;Some&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;can&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;only&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;be&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;after&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;up&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;running&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;see&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;section&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"Running a client"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;Installing a server&lt;/h4&gt;
&lt;p&gt;Run each step from the "Installing a client" first, except the ones for after a server is running. When you adjust /etc/hosts, remove or comment any &lt;code&gt;127.0.0.1 &amp;lt;hostname&amp;gt;&lt;/code&gt;-style records.&lt;/p&gt;
&lt;p&gt;It is possible that on a new system, you have to run this.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;sudo setcap CAP_NET_BIND_SERVICE=+eip ~/aoe2de/ageLANServer/linux/server/server
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Initialize a certificate.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;~/aoe2de/ageLANServer/linux/server/bin/genCert.sh
&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;Running a client&lt;/h4&gt;
&lt;p&gt;If you will play multiplayer, you need to know the IP address or hostname of the server. This sets the entries in &lt;code&gt;/etc/hosts&lt;/code&gt; which can be done manually if necessary.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;APPLY=1 ./set-etc-hosts.sh 192.168.1.45 # IP address or hostname of server
APPLY=1 ./set-cert-from-server.sh 192.168.1.45
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Run the short launcher.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;~/aoe2de/aoe2de.sh
&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;Running a server&lt;/h4&gt;
&lt;p&gt;Run the battle server manager in a terminal. It will spawn a new one to run, and return this prompt to you for the next command.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;~/aoe2de/ageLANServer/linux/battle-server-manager/start_age2.sh
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Run the server.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;~/aoe2de/ageLANServer/linux/server/start_age2.sh
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then run the client as described above in "Running a client".&lt;/p&gt;
&lt;h3&gt;Adding mods&lt;/h3&gt;
&lt;h4&gt;With script&lt;/h4&gt;
&lt;p&gt;From the second asset, use ~/aoe2de/scripts/set-initial-mods.sh. It depends on this network path for this file.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;/mnt/public/Support/Games/aoe2de-on-linux/aoe2de-mods-subscribed.2026-06-26.tgz
&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;Manually&lt;/h4&gt;
&lt;p&gt;Find the generated userid from &lt;code&gt;~/aoe2de/saves/settings.configs.user.ini&lt;/code&gt;.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;eval $( awk '/account_steamid/' ~/aoe2de/saves/settings/configs.user.ini | tr -dc 'a-zA-Z=0-9_' )
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Visit the user's mods directory and copy in the mods I have provided.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;cd ~/".wine-aoe2de/drive_c/users/steamuser/Games/Age of Empires 2 DE/&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;account_steamid&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;/mods"
tar -zxf /mnt/public/Support/Games/aoe2de-on-linux/aoe2de-mods-subscribed.2026-06-26.tgz
&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Updating the game&lt;/h3&gt;
&lt;p&gt;A full copy of the official game from steam needs to be updated, and then built into a tarball. The path would be similar to &lt;code&gt;/mnt/vm2/pcb-009-steam/steamapps/common/AoE2DE&lt;/code&gt;.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;cd /mnt/vm2/pcb-009-steam/steamapps/common
tar -zcf "AoE2DE-$( date "+%F" ).tgz" AoE2DE
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note that this would not have the exact same directory structure as the original first asset which was &lt;code&gt;aoe2de/AoE2DE/&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Updating "other components"&lt;/h3&gt;
&lt;p&gt;These dependencies might have newer versions. Check the references, and follow the "Building the package" steps.&lt;/p&gt;
&lt;h3&gt;Updating mods&lt;/h3&gt;
&lt;p&gt;Build a new tarball from the upstream machine that has the desired mods.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;tar -zc -C "/mnt/vm2/pcb-009-steam/steamapps/compatdata/813780/pfx/drive_c/users/steamuser/Games/Age of Empires 2 DE/&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;account_steamid&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;/mods" -f /mnt/public/Support/Games/aoe2de-on-linux/aoe2de-mods-subscribed.$( date "+%F" ).tgz
&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Related files&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;aoe2de-alldlcs-raw.2026-06-28.tgz&lt;/li&gt;
&lt;li&gt;aoe2de-other-components-2026-07-01.tgz&lt;/li&gt;
&lt;li&gt;aoe2de-mods-subscribed.2026-06-26.tgz&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/linuxvox.com/blog/how-to-install-proton-on-linux/"&gt;Installing Proton on Linux: A Comprehensive Guide — linuxvox.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;proton ge: &lt;a href="https://github.com/GloriousEggroll/proton-ge-custom/releases/download/GE-Proton11-1/GE-Proton11-1.tar.gz"&gt;https://github.com/GloriousEggroll/proton-ge-custom/releases/download/GE-Proton11-1/GE-Proton11-1.tar.gz&lt;/a&gt; from &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/github.com/GloriousEggroll/proton-ge-custom/releases"&gt;Releases · GloriousEggroll/proton-ge-custom&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/github.com/Open-Wine-Components/umu-launcher"&gt;Open-Wine-Components/umu-launcher: Unified launcher for Windows games on Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/umu.openwinecomponents.org/index.php"&gt;UMU Database Search&lt;/a&gt; shows nothing for "Empires" about AoE2, so GAMEID can be left undefined.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/github.com/luskaner/ageLANServerLauncherCompanion"&gt;luskaner/ageLANServerLauncherCompanion: Libraries to enhance or fix the game behaviour when using a custom launcher in Age LAN Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/github.com/Detanup01/gbe_fork/releases"&gt;Releases · Detanup01/gbe_fork&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/github.com/luskaner/ageLANServer"&gt;luskaner/ageLANServer: Web Server (and its launcher) for AoE 1, 2, 3 (all DE), AoE 4 and AoM: RT supporting offline multiplayer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/steamdb.info/app/813780/dlc/"&gt;Age of Empires II: Definitive Edition DLCs · SteamDB&lt;/a&gt; to find ids for the two DLCs I own that were not demonstrated in the configs.app.ini&lt;/li&gt;
&lt;/ol&gt;</description><category>aoc</category><category>aoe2de</category><category>proton</category><guid>https://bgstack15.ddns.net/blog/posts/2026/07/13/how-to-play-aoe2de-multiplayer-on-linux-without-steam/</guid><pubDate>Mon, 13 Jul 2026 12:46:00 GMT</pubDate></item><item><title>AoE2DE FPS limit affects benchmark rating</title><link>https://bgstack15.ddns.net/blog/posts/2025/10/02/aoe2de-fps-limit-affects-benchmark-rating/</link><dc:creator>bgstack15</dc:creator><description>&lt;p&gt;For the past number of months, my Age of Empires 2: Definitive Edition game would start lagging in larger ranked team games.&lt;/p&gt;
&lt;p&gt;I re-ran the benchmark test, and I ranked 971.2, which is too low for ranked team games (1000)! So that greatly concerned me, as this is the only game with serious requirements that I run. So I spent time investigating all the graphics settings, and rebooting and running only steam and AoE2DE.&lt;/p&gt;
&lt;p&gt;The moment I reached out to a friend who plays way more games than me, my next change solved the problem. I had set my fps limit down to 15, in the hopes of increasing game performance. Come to find out, it limits network performance when you lower the fps, and it also lowers the benchmark performance.&lt;/p&gt;
&lt;p&gt;So that test I had run, with 65 fps, ranked nice and high (1138.2) and then I am eligible to play ranked team games again!&lt;/p&gt;
&lt;p&gt;Here is a chart, for the curious. (This is the first time I am using the charting features in my ssg, &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/www.getnikola.com"&gt;nikola&lt;/a&gt;!)&lt;/p&gt;
&lt;p&gt;&lt;?xml version='1.0' encoding='utf-8'?&gt;
&lt;svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81" class="pygal-chart" viewbox="0 0 800 600"&gt;&lt;!--Generated with pygal 3.0.0 (lxml) ©Kozea 2012-2016 on 2025-09-20--&gt;&lt;!--http://pygal.org--&gt;&lt;!--http://github.com/Kozea/pygal--&gt;&lt;defs&gt;&lt;style type="text/css"&gt;#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81{-webkit-user-select:none;-webkit-font-smoothing:antialiased;font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .title{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:16px}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .legends .legend text{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:14px}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .axis text{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:10px}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .axis text.major{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:10px}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .text-overlay text.value{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:16px}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .text-overlay text.label{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:10px}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .tooltip{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:14px}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 text.no_data{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:64px}
#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81{background-color:#f0f0f0}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 path,#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 line,#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 rect,#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 circle{-webkit-transition:250ms ease-in;-moz-transition:250ms ease-in;transition:250ms ease-in}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .graph &amp;gt; .background{fill:#f0f0f0}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .plot &amp;gt; .background{fill:#f8f8f8}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .graph{fill:rgba(0,0,0,0.9)}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 text.no_data{fill:rgba(0,0,0,0.9)}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .title{fill:rgba(0,0,0,0.9)}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .legends .legend text{fill:rgba(0,0,0,0.9)}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .legends .legend:hover text{fill:rgba(0,0,0,0.9)}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .axis .line{stroke:rgba(0,0,0,0.9)}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .axis .guide.line{stroke:rgba(0,0,0,0.6)}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .axis .major.line{stroke:rgba(0,0,0,0.9)}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .axis text.major{fill:rgba(0,0,0,0.9)}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .axis.y .guides:hover .guide.line,#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .line-graph .axis.x .guides:hover .guide.line,#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .stackedline-graph .axis.x .guides:hover .guide.line,#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .xy-graph .axis.x .guides:hover .guide.line{stroke:rgba(0,0,0,0.9)}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .axis .guides:hover text{fill:rgba(0,0,0,0.9)}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .reactive{fill-opacity:.5;stroke-opacity:.8;stroke-width:1}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .ci{stroke:rgba(0,0,0,0.9)}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .reactive.active,#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .active .reactive{fill-opacity:.9;stroke-opacity:.9;stroke-width:4}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .ci .reactive.active{stroke-width:1.5}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .series text{fill:rgba(0,0,0,0.9)}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .tooltip rect{fill:#f8f8f8;stroke:rgba(0,0,0,0.9);-webkit-transition:opacity 250ms ease-in;-moz-transition:opacity 250ms ease-in;transition:opacity 250ms ease-in}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .tooltip .label{fill:rgba(0,0,0,0.9)}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .tooltip .label{fill:rgba(0,0,0,0.9)}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .tooltip .legend{font-size:.8em;fill:rgba(0,0,0,0.6)}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .tooltip .x_label{font-size:.6em;fill:rgba(0,0,0,0.9)}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .tooltip .xlink{font-size:.5em;text-decoration:underline}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .tooltip .value{font-size:1.5em}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .bound{font-size:.5em}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .max-value{font-size:.75em;fill:rgba(0,0,0,0.6)}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .map-element{fill:#f8f8f8;stroke:rgba(0,0,0,0.6) !important}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .map-element .reactive{fill-opacity:inherit;stroke-opacity:inherit}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .color-0,#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .color-0 a:visited{stroke:#00b2f0;fill:#00b2f0}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .color-1,#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .color-1 a:visited{stroke:#43d9be;fill:#43d9be}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .text-overlay .color-0 text{fill:black}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .text-overlay .color-1 text{fill:black}
#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 text.no_data{text-anchor:middle}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .guide.line{fill:none}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .centered{text-anchor:middle}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .title{text-anchor:middle}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .legends .legend text{fill-opacity:1}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .axis.x text{text-anchor:middle}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .axis.x:not(.web) text[transform]{text-anchor:start}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .axis.x:not(.web) text[transform].backwards{text-anchor:end}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .axis.y text{text-anchor:end}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .axis.y text[transform].backwards{text-anchor:start}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .axis.y2 text{text-anchor:start}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .axis.y2 text[transform].backwards{text-anchor:end}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .axis .guide.line{stroke-dasharray:4,4;stroke:black}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .axis .major.guide.line{stroke-dasharray:6,6;stroke:black}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .horizontal .axis.y .guide.line,#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .horizontal .axis.y2 .guide.line,#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .vertical .axis.x .guide.line{opacity:0}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .horizontal .axis.always_show .guide.line,#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .vertical .axis.always_show .guide.line{opacity:1 !important}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .axis.y .guides:hover .guide.line,#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .axis.y2 .guides:hover .guide.line,#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .axis.x .guides:hover .guide.line{opacity:1}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .axis .guides:hover text{opacity:1}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .nofill{fill:none}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .subtle-fill{fill-opacity:.2}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .dot{stroke-width:1px;fill-opacity:1;stroke-opacity:1}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .dot.active{stroke-width:5px}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .dot.negative{fill:transparent}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 text,#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 tspan{stroke:none !important}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .series text.active{opacity:1}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .tooltip rect{fill-opacity:.95;stroke-width:.5}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .tooltip text{fill-opacity:1}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .showable{visibility:hidden}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .showable.shown{visibility:visible}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .gauge-background{fill:rgba(229,229,229,1);stroke:none}#chart-c01dc40f-f3d6-43c1-8aeb-96c815e3bd81 .bg-lines{stroke:#f0f0f0;stroke-width:2px}&lt;/style&gt;&lt;script type="text/javascript"&gt;window.pygal = window.pygal || {};window.pygal.config = window.pygal.config || {};window.pygal.config['c01dc40f-f3d6-43c1-8aeb-96c815e3bd81'] = {"allow_interruptions": false, "box_mode": "extremes", "classes": ["pygal-chart"], "css": ["file://style.css", "file://graph.css"], "defs": [], "disable_xml_declaration": false, "dots_size": 2.5, "dynamic_print_values": false, "explicit_size": false, "fill": false, "force_uri_protocol": "https", "formatter": null, "half_pie": false, "height": 600, "include_x_axis": false, "inner_radius": 0, "interpolate": null, "interpolation_parameters": {}, "interpolation_precision": 250, "inverse_y_axis": false, "js": ["//kozea.github.io/pygal.js/2.0.x/pygal-tooltips.min.js"], "legend_at_bottom": false, "legend_at_bottom_columns": null, "legend_box_size": 12, "logarithmic": false, "margin": 20, "margin_bottom": null, "margin_left": null, "margin_right": null, "margin_top": null, "max_scale": 16, "min_scale": 4, "missing_value_fill_truncation": "x", "no_data_text": "No data", "no_prefix": false, "order_min": null, "pretty_print": false, "print_labels": false, "print_values": false, "print_values_position": "center", "print_zeroes": true, "range": null, "rounded_bars": null, "secondary_range": null, "show_dots": true, "show_legend": false, "show_minor_x_labels": true, "show_minor_y_labels": true, "show_only_major_dots": false, "show_x_guides": false, "show_x_labels": true, "show_y_guides": true, "show_y_labels": true, "spacing": 10, "stack_from_top": false, "strict": false, "stroke": true, "stroke_style": null, "style": {"background": "#f0f0f0", "ci_colors": [], "colors": ["#00b2f0", "#43d9be", "#0662ab", "#00668a", "#98eadb", "#97d959", "#033861", "#ffd541", "#7dcf30", "#3ecdff", "#daaa00"], "dot_opacity": "1", "font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "foreground": "rgba(0, 0, 0, 0.9)", "foreground_strong": "rgba(0, 0, 0, 0.9)", "foreground_subtle": "rgba(0, 0, 0, 0.6)", "guide_stroke_color": "black", "guide_stroke_dasharray": "4,4", "label_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "label_font_size": 10, "legend_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "legend_font_size": 14, "major_guide_stroke_color": "black", "major_guide_stroke_dasharray": "6,6", "major_label_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "major_label_font_size": 10, "no_data_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "no_data_font_size": 64, "opacity": ".5", "opacity_hover": ".9", "plot_background": "#f8f8f8", "stroke_opacity": ".8", "stroke_opacity_hover": ".9", "stroke_width": "1", "stroke_width_hover": "4", "title_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "title_font_size": 16, "tooltip_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "tooltip_font_size": 14, "transition": "250ms ease-in", "value_background": "rgba(229, 229, 229, 1)", "value_colors": [], "value_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "value_font_size": 16, "value_label_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "value_label_font_size": 10}, "title": "Benchmark rating per fps", "tooltip_border_radius": 0, "tooltip_fancy_mode": true, "truncate_label": null, "truncate_legend": null, "width": 800, "x_label_rotation": 0, "x_labels": null, "x_labels_major": null, "x_labels_major_count": null, "x_labels_major_every": null, "x_title": "max fps", "xrange": null, "y_label_rotation": 0, "y_labels": null, "y_labels_major": null, "y_labels_major_count": null, "y_labels_major_every": null, "y_title": "Benchmark rating", "zero": 0, "legends": ["fps", "min for ranked team games"]}&lt;/script&gt;&lt;script type="text/javascript" xlink:href="https://kozea.github.io/pygal.js/2.0.x/pygal-tooltips.min.js"&gt;&lt;/script&gt;&lt;/defs&gt;&lt;title&gt;Benchmark rating per fps&lt;/title&gt;&lt;g class="graph xy-graph vertical"&gt;&lt;rect x="0" y="0" width="800" height="600" class="background"&gt;&lt;/rect&gt;&lt;g transform="translate(80, 46)" class="plot"&gt;&lt;rect x="0" y="0" width="700.0" height="488" class="background"&gt;&lt;/rect&gt;&lt;g class="axis y always_show"&gt;&lt;path d="M0.000000 488.000000 h700.000000" class="line"&gt;&lt;/path&gt;&lt;g class="guides"&gt;&lt;path d="M0.000000 453.889452 h700.000000" class="guide line"&gt;&lt;/path&gt;&lt;text x="-5" y="457.3894518654998" class=""&gt;980&lt;/text&gt;&lt;title&gt;980&lt;/title&gt;&lt;/g&gt;&lt;g class="guides"&gt;&lt;path d="M0.000000 397.694150 h700.000000" class="major guide line"&gt;&lt;/path&gt;&lt;text x="-5" y="401.19415016121604" class="major"&gt;1000&lt;/text&gt;&lt;title&gt;1000&lt;/title&gt;&lt;/g&gt;&lt;g class="guides"&gt;&lt;path d="M0.000000 341.498848 h700.000000" class="guide line"&gt;&lt;/path&gt;&lt;text x="-5" y="344.99884845693225" class=""&gt;1020&lt;/text&gt;&lt;title&gt;1020&lt;/title&gt;&lt;/g&gt;&lt;g class="guides"&gt;&lt;path d="M0.000000 285.303547 h700.000000" class="guide line"&gt;&lt;/path&gt;&lt;text x="-5" y="288.8035467526486" class=""&gt;1040&lt;/text&gt;&lt;title&gt;1040&lt;/title&gt;&lt;/g&gt;&lt;g class="guides"&gt;&lt;path d="M0.000000 229.108245 h700.000000" class="guide line"&gt;&lt;/path&gt;&lt;text x="-5" y="232.60824504836478" class=""&gt;1060&lt;/text&gt;&lt;title&gt;1060&lt;/title&gt;&lt;/g&gt;&lt;g class="guides"&gt;&lt;path d="M0.000000 172.912943 h700.000000" class="guide line"&gt;&lt;/path&gt;&lt;text x="-5" y="176.41294334408104" class=""&gt;1080&lt;/text&gt;&lt;title&gt;1080&lt;/title&gt;&lt;/g&gt;&lt;g class="guides"&gt;&lt;path d="M0.000000 116.717642 h700.000000" class="major guide line"&gt;&lt;/path&gt;&lt;text x="-5" y="120.21764163979725" class="major"&gt;1100&lt;/text&gt;&lt;title&gt;1100&lt;/title&gt;&lt;/g&gt;&lt;g class="guides"&gt;&lt;path d="M0.000000 60.522340 h700.000000" class="guide line"&gt;&lt;/path&gt;&lt;text x="-5" y="64.02233993551351" class=""&gt;1120&lt;/text&gt;&lt;title&gt;1120&lt;/title&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class="axis x"&gt;&lt;path d="M0.000000 0.000000 v488.000000" class="line"&gt;&lt;/path&gt;&lt;g class="guides"&gt;&lt;path d="M80.769231 0.000000 v488.000000" class="guide line"&gt;&lt;/path&gt;&lt;text x="80.76923076923077" y="503.0" class=""&gt;20&lt;/text&gt;&lt;title&gt;20&lt;/title&gt;&lt;/g&gt;&lt;g class="guides"&gt;&lt;path d="M215.384615 0.000000 v488.000000" class="guide line"&gt;&lt;/path&gt;&lt;text x="215.3846153846154" y="503.0" class=""&gt;30&lt;/text&gt;&lt;title&gt;30&lt;/title&gt;&lt;/g&gt;&lt;g class="guides"&gt;&lt;path d="M350.000000 0.000000 v488.000000" class="guide line"&gt;&lt;/path&gt;&lt;text x="350.0" y="503.0" class=""&gt;40&lt;/text&gt;&lt;title&gt;40&lt;/title&gt;&lt;/g&gt;&lt;g class="guides"&gt;&lt;path d="M484.615385 0.000000 v488.000000" class="guide line"&gt;&lt;/path&gt;&lt;text x="484.61538461538464" y="503.0" class=""&gt;50&lt;/text&gt;&lt;title&gt;50&lt;/title&gt;&lt;/g&gt;&lt;g class="guides"&gt;&lt;path d="M619.230769 0.000000 v488.000000" class="guide line"&gt;&lt;/path&gt;&lt;text x="619.2307692307693" y="503.0" class=""&gt;60&lt;/text&gt;&lt;title&gt;60&lt;/title&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class="series serie-0 color-0"&gt;&lt;path d="M13.461538 478.615385 L80.769231 292.608936 215.384615 52.654998 350.000000 30.738830 484.615385 9.384615 686.538462 9.384615" class="line reactive nofill"&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class="series serie-1 color-1"&gt;&lt;path d="M13.461538 397.694150 L80.769231 397.694150 215.384615 397.694150 350.000000 397.694150 484.615385 397.694150 686.538462 397.694150" class="line reactive nofill"&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class="titles"&gt;&lt;text x="400.0" y="26" class="title plot_title"&gt;Benchmark rating per fps&lt;/text&gt;&lt;text x="430.0" y="580" class="title"&gt;max fps&lt;/text&gt;&lt;text x="0" y="316.0" class="title" transform="rotate(-90 0.000000 290.000000)"&gt;Benchmark rating&lt;/text&gt;&lt;/g&gt;&lt;g transform="translate(80, 46)" class="plot overlay"&gt;&lt;g class="series serie-0 color-0"&gt;&lt;g class="dots"&gt;&lt;circle cx="13.461538461538462" cy="478.6153846153845" r="2.5" class="dot reactive tooltip-trigger"&gt;&lt;/circle&gt;&lt;desc class="value"&gt;15: 971.2&lt;/desc&gt;&lt;desc class="x top"&gt;13.461538461538462&lt;/desc&gt;&lt;desc class="y top"&gt;478.6153846153845&lt;/desc&gt;&lt;/g&gt;&lt;g class="dots"&gt;&lt;circle cx="80.76923076923077" cy="292.6089359742051" r="2.5" class="dot reactive tooltip-trigger"&gt;&lt;/circle&gt;&lt;desc class="value"&gt;20: 1037.4&lt;/desc&gt;&lt;desc class="x top"&gt;80.76923076923077&lt;/desc&gt;&lt;desc class="y top"&gt;292.6089359742051&lt;/desc&gt;&lt;/g&gt;&lt;g class="dots"&gt;&lt;circle cx="215.3846153846154" cy="52.65499769691388" r="2.5" class="dot reactive tooltip-trigger"&gt;&lt;/circle&gt;&lt;desc class="value"&gt;30: 1122.8&lt;/desc&gt;&lt;desc class="x "&gt;215.3846153846154&lt;/desc&gt;&lt;desc class="y "&gt;52.65499769691388&lt;/desc&gt;&lt;/g&gt;&lt;g class="dots"&gt;&lt;circle cx="350.0" cy="30.738830032243357" r="2.5" class="dot reactive tooltip-trigger"&gt;&lt;/circle&gt;&lt;desc class="value"&gt;40: 1130.6&lt;/desc&gt;&lt;desc class="x "&gt;350.0&lt;/desc&gt;&lt;desc class="y "&gt;30.738830032243357&lt;/desc&gt;&lt;/g&gt;&lt;g class="dots"&gt;&lt;circle cx="484.61538461538464" cy="9.384615384615188" r="2.5" class="dot reactive tooltip-trigger"&gt;&lt;/circle&gt;&lt;desc class="value"&gt;50: 1138.2&lt;/desc&gt;&lt;desc class="x left"&gt;484.61538461538464&lt;/desc&gt;&lt;desc class="y left"&gt;9.384615384615188&lt;/desc&gt;&lt;/g&gt;&lt;g class="dots"&gt;&lt;circle cx="686.5384615384615" cy="9.384615384615188" r="2.5" class="dot reactive tooltip-trigger"&gt;&lt;/circle&gt;&lt;desc class="value"&gt;65: 1138.2&lt;/desc&gt;&lt;desc class="x left"&gt;686.5384615384615&lt;/desc&gt;&lt;desc class="y left"&gt;9.384615384615188&lt;/desc&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class="series serie-1 color-1"&gt;&lt;g class="dots"&gt;&lt;circle cx="13.461538461538462" cy="397.69415016121604" r="2.5" class="dot reactive tooltip-trigger"&gt;&lt;/circle&gt;&lt;desc class="value"&gt;15: 1000&lt;/desc&gt;&lt;desc class="x top"&gt;13.461538461538462&lt;/desc&gt;&lt;desc class="y top"&gt;397.69415016121604&lt;/desc&gt;&lt;/g&gt;&lt;g class="dots"&gt;&lt;circle cx="80.76923076923077" cy="397.69415016121604" r="2.5" class="dot reactive tooltip-trigger"&gt;&lt;/circle&gt;&lt;desc class="value"&gt;20: 1000&lt;/desc&gt;&lt;desc class="x top"&gt;80.76923076923077&lt;/desc&gt;&lt;desc class="y top"&gt;397.69415016121604&lt;/desc&gt;&lt;/g&gt;&lt;g class="dots"&gt;&lt;circle cx="215.3846153846154" cy="397.69415016121604" r="2.5" class="dot reactive tooltip-trigger"&gt;&lt;/circle&gt;&lt;desc class="value"&gt;30: 1000&lt;/desc&gt;&lt;desc class="x top"&gt;215.3846153846154&lt;/desc&gt;&lt;desc class="y top"&gt;397.69415016121604&lt;/desc&gt;&lt;/g&gt;&lt;g class="dots"&gt;&lt;circle cx="350.0" cy="397.69415016121604" r="2.5" class="dot reactive tooltip-trigger"&gt;&lt;/circle&gt;&lt;desc class="value"&gt;40: 1000&lt;/desc&gt;&lt;desc class="x top"&gt;350.0&lt;/desc&gt;&lt;desc class="y top"&gt;397.69415016121604&lt;/desc&gt;&lt;/g&gt;&lt;g class="dots"&gt;&lt;circle cx="484.61538461538464" cy="397.69415016121604" r="2.5" class="dot reactive tooltip-trigger"&gt;&lt;/circle&gt;&lt;desc class="value"&gt;50: 1000&lt;/desc&gt;&lt;desc class="x left top"&gt;484.61538461538464&lt;/desc&gt;&lt;desc class="y left top"&gt;397.69415016121604&lt;/desc&gt;&lt;/g&gt;&lt;g class="dots"&gt;&lt;circle cx="686.5384615384615" cy="397.69415016121604" r="2.5" class="dot reactive tooltip-trigger"&gt;&lt;/circle&gt;&lt;desc class="value"&gt;65: 1000&lt;/desc&gt;&lt;desc class="x left top"&gt;686.5384615384615&lt;/desc&gt;&lt;desc class="y left top"&gt;397.69415016121604&lt;/desc&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g transform="translate(80, 46)" class="plot text-overlay"&gt;&lt;g class="series serie-0 color-0"&gt;&lt;/g&gt;&lt;g class="series serie-1 color-1"&gt;&lt;/g&gt;&lt;/g&gt;&lt;g transform="translate(80, 46)" class="plot tooltip-overlay"&gt;&lt;g transform="translate(0 0)" style="opacity: 0" class="tooltip"&gt;&lt;rect rx="0" ry="0" width="0" height="0" class="tooltip-box"&gt;&lt;/rect&gt;&lt;g class="text"&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/p&gt;
&lt;p&gt;The system I tested has these characteristics.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OS: Devuan GNU+Linux Ceres&lt;/li&gt;
&lt;li&gt;RAM: 64 GB&lt;/li&gt;
&lt;li&gt;Graphics card: GeForce GTX 1050 Ti&lt;/li&gt;
&lt;/ul&gt;</description><category>aoc</category><category>aoe2de</category><category>chart</category><category>game</category><category>linux</category><category>narrative</category><category>nvidia</category><guid>https://bgstack15.ddns.net/blog/posts/2025/10/02/aoe2de-fps-limit-affects-benchmark-rating/</guid><pubDate>Thu, 02 Oct 2025 13:24:00 GMT</pubDate></item><item><title>AoE2:DE CaptureAge on Linux</title><link>https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/</link><dc:creator>bgstack15</dc:creator><description>&lt;p&gt;This is shamelessly copy-pasting &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/gist.github.com/Kjir/dadb0a2bc1a71aa265cfdbecaf7569b8"&gt;Running CaptureAge in Linux&lt;/a&gt; in case it ever disappears from the Internet.&lt;/p&gt;
&lt;h3&gt;Running CaptureAge in Linux&lt;/h3&gt;
&lt;p&gt;The latest version of CaptureAge (1.16.0) will now work with Linux.
To get it working, here are some steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Download the installer from the CaptureAge website&lt;/li&gt;
&lt;li&gt;Save the &lt;code&gt;captureage&lt;/code&gt; script and place it in a location of your choice (e.g. &lt;code&gt;~/.local/bin/&lt;/code&gt;). Ensure it's executable&lt;/li&gt;
&lt;li&gt;Find out the path to the &lt;code&gt;proton&lt;/code&gt; executable used by Steam for Age of Empires II and adjust &lt;code&gt;PROTON_EXEC&lt;/code&gt; accordingly&lt;/li&gt;
&lt;li&gt;Uncomment the line to run the installer and adjust the path if needed. Comment the last line.&lt;/li&gt;
&lt;li&gt;Check that the windows version is set to at least windows 10 with &lt;code&gt;protontricks 813780 winecfg&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;protontricks 813780 d3dcompiler_47&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Now run the &lt;code&gt;captureage&lt;/code&gt; script. Install captureage. It should run!&lt;/li&gt;
&lt;li&gt;Check if your CaptureAge is installed in AppData/Local/Programs/CaptureAge or AppData/Local/Programs/CADE and adjust accordingly.&lt;/li&gt;
&lt;li&gt;Change the &lt;code&gt;captureage&lt;/code&gt; script to not run the installation exe anymore, but directly CaptureAge&lt;/li&gt;
&lt;li&gt;Profit&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Figuring out the path to proton&lt;/h4&gt;
&lt;p&gt;To figure out the path to the proton executable used by Age of Empires II, set the Launch Options to &lt;code&gt;echo %command% &amp;gt; ~/steam_cmd.txt&lt;/code&gt;.
Start the game (it will not run, but exit immediately). Set back the Launch options to what they were.
You now have a file in your home directory that includes the full path to the proton executable.&lt;/p&gt;
&lt;h4&gt;Getting the aoe2de:// URLs to work with AoE2&lt;/h4&gt;
&lt;p&gt;To register the aoe2de:// URL handler, you need a desktop file and a script. Here is how to set it up:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Copy the &lt;code&gt;aoe2url&lt;/code&gt; file in a location of your choice, preferably &lt;code&gt;~/.local/bin&lt;/code&gt;. Ensure it's executable.&lt;/li&gt;
&lt;li&gt;Adjust the path to proton in the script. Same as above.&lt;/li&gt;
&lt;li&gt;Save the &lt;code&gt;AoE2UrlHelper.desktop&lt;/code&gt; file in &lt;code&gt;~/.local/share/applications/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Adjust the path the &lt;code&gt;aoe2url&lt;/code&gt; script on line 4&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;sudo update-desktop-database&lt;/code&gt; to add the application to the database&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;xdg-mime default AoE2UrlHelper.desktop x-scheme-handler/aoe2de&lt;/code&gt; to associate the URL Helper with the aoe2de:// scheme.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now you can open games by typing the game url (e.g.: &lt;code&gt;aoe2de://123456789&lt;/code&gt;) in the browser. You can also open games directly from the &lt;a href="https://aoe2recs.com/"&gt;Spectator Dashboard&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/files/2025/listings/aoe2url.html"&gt;files/2025/listings/aoe2url&lt;/a&gt;  &lt;a href="https://bgstack15.ddns.net/blog/files/2025/listings/aoe2url"&gt;(Source)&lt;/a&gt;&lt;/p&gt;&lt;div class="code"&gt;&lt;table class="codetable"&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-1"&gt;&lt;code data-line-number=" 1"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/usr/bin/bash&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-2"&gt;&lt;code data-line-number=" 2"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PROTON_LOG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-3"&gt;&lt;code data-line-number=" 3"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;STEAMAPPS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.local/share/Steam/steamapps"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-4"&gt;&lt;code data-line-number=" 4"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;STEAM_COMPAT_DATA_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$STEAMAPPS&lt;/span&gt;&lt;span class="s2"&gt;/compatdata/813780"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-5"&gt;&lt;code data-line-number=" 5"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;STEAM_COMPAT_CLIENT_INSTALL_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.steam"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-6"&gt;&lt;code data-line-number=" 6"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Adjust this to the proton executable used by AoE2 in Steam&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-7"&gt;&lt;code data-line-number=" 7"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PROTON_EXEC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/usr/share/steam/compatibilitytools.d/proton-ge-custom/proton"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-8"&gt;&lt;code data-line-number=" 8"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;WINEPREFIX&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$STEAMAPPS&lt;/span&gt;&lt;span class="s2"&gt;/compatdata/813780/pfx"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-9"&gt;&lt;code data-line-number=" 9"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-10"&gt;&lt;code data-line-number="10"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PROTON_EXEC&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; run &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$STEAMAPPS&lt;/span&gt;&lt;span class="s2"&gt;/common/AoE2DE/Tools_Builds/AOEURLHelper.exe"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/files/2025/listings/AoE2UrlHelper.desktop.html"&gt;files/2025/listings/AoE2UrlHelper.desktop&lt;/a&gt;  &lt;a href="https://bgstack15.ddns.net/blog/files/2025/listings/AoE2UrlHelper.desktop"&gt;(Source)&lt;/a&gt;&lt;/p&gt;&lt;div class="code"&gt;&lt;table class="codetable"&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-1"&gt;&lt;code data-line-number="1"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="k"&gt;[Desktop Entry]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-2"&gt;&lt;code data-line-number="2"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="na"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;AoE2 URL Opener&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-3"&gt;&lt;code data-line-number="3"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="na"&gt;Comment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Play this game on Steam (Open URL)&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-4"&gt;&lt;code data-line-number="4"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="na"&gt;Exec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/home/&amp;lt;youruser&amp;gt;/.local/bin/aoe2url %u&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-5"&gt;&lt;code data-line-number="5"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="na"&gt;Icon&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;steam_icon_813780&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-6"&gt;&lt;code data-line-number="6"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="na"&gt;Terminal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-7"&gt;&lt;code data-line-number="7"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Application&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-8"&gt;&lt;code data-line-number="8"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="na"&gt;MimeType&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;x-scheme-handler/aoe2de;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-9"&gt;&lt;code data-line-number="9"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="na"&gt;Categories&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Game;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/files/2025/listings/captureage.html"&gt;files/2025/listings/captureage&lt;/a&gt;  &lt;a href="https://bgstack15.ddns.net/blog/files/2025/listings/captureage"&gt;(Source)&lt;/a&gt;&lt;/p&gt;&lt;div class="code"&gt;&lt;table class="codetable"&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-1"&gt;&lt;code data-line-number=" 1"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/usr/bin/bash&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-2"&gt;&lt;code data-line-number=" 2"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PROTON_LOG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-3"&gt;&lt;code data-line-number=" 3"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;STEAMAPPS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.local/share/Steam/steamapps"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-4"&gt;&lt;code data-line-number=" 4"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;STEAM_COMPAT_DATA_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$STEAMAPPS&lt;/span&gt;&lt;span class="s2"&gt;/compatdata/813780"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-5"&gt;&lt;code data-line-number=" 5"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;STEAM_COMPAT_CLIENT_INSTALL_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.steam"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-6"&gt;&lt;code data-line-number=" 6"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;WINEPREFIX&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$STEAMAPPS&lt;/span&gt;&lt;span class="s2"&gt;/compatdata/813780/pfx"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-7"&gt;&lt;code data-line-number=" 7"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Adjust the path to the proton executable used by Age of Empires II&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-8"&gt;&lt;code data-line-number=" 8"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PROTON_EXEC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/usr/share/steam/compatibilitytools.d/proton-ge-custom/proton"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-9"&gt;&lt;code data-line-number=" 9"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="c1"&gt;# export WINEDEBUG=warn+all # This is for debug logs&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-10"&gt;&lt;code data-line-number="10"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="c1"&gt;# export OBS_VKCAPTURE=1 # Enable this for OBS Videogame capture&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-11"&gt;&lt;code data-line-number="11"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-12"&gt;&lt;code data-line-number="12"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="c1"&gt;#install capture age (only needed once). Adjust the location to point to the installer you downloaded.&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-13"&gt;&lt;code data-line-number="13"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="c1"&gt;# "$PROTON_EXEC" run "Z:/$HOME/Downloads/CaptureAgeSetup.exe"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-14"&gt;&lt;code data-line-number="14"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-15"&gt;&lt;code data-line-number="15"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="c1"&gt;# run capture age&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-16"&gt;&lt;code data-line-number="16"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Older version of CA:DE were installed in AppData/Local/Programs/CaptureAge . If it doesn't launch for you, check this path&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/#-17"&gt;&lt;code data-line-number="17"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PROTON_EXEC&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; run &lt;span class="s2"&gt;"C:/users/steamuser/AppData/Local/Programs/CADE/CaptureAge.exe"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</description><category>aoe2de</category><category>game</category><category>linux</category><guid>https://bgstack15.ddns.net/blog/posts/2025/08/23/aoe2de-captureage-on-linux/</guid><pubDate>Sat, 23 Aug 2025 13:08:00 GMT</pubDate></item><item><title>Current process for AoE2DE on Linux</title><link>https://bgstack15.ddns.net/blog/posts/2023/10/30/current-process-for-aoe2de-on-linux/</link><dc:creator>bgstack15</dc:creator><description>&lt;p&gt;Of all the non-open-source software I'm aware of, Valve is a great publisher. I use Steam weekly for playing my one modern computer game, Age of Empires 2 Definitive Edition.&lt;/p&gt;
&lt;p&gt;I upgraded my main workstation to only a 4-year-old computer (which now requires UEFI boot, bleh, for local devices; oh, but legacy boot works for removable devices which makes no sense to me), instead of my 10-year-old computer. I reinstalled Devuan GNU+Linux and got the Nvidia driver loaded.&lt;/p&gt;
&lt;p&gt;With some of the recent &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/steamcommunity.com/app/813780/discussions/3/3806153359221686360/?ctp=3"&gt;Proton fixes&lt;/a&gt;, I need only vanilla Proton experimental as my compatibility layer.&lt;/p&gt;
&lt;p&gt;I strained for a long time to get DXVK working. When I ran the game with &lt;code&gt;PROTON_USE_WINED3D=1&lt;/code&gt; in the launch command, the graphics would work only 2% of the time. But finally I found the magic instructions in a &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/github.com/doitsujin/dxvk/issues/2811#issuecomment-1289714236"&gt;github issues discussion&lt;/a&gt;: &lt;code&gt;DXVK_FILTER_DEVICE_NAME="NVIDIA"&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;So here is my full steam launch command for Age of Empires 2: Definitive Edition.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;DXVK_FILTER_DEVICE_NAME="NVIDIA" PROTON_USE_DXVK=1 PROTON_LOG=1 DXVK_HUD=all %command% NOSTARTUP SKIPINTRO
&lt;/pre&gt;&lt;/div&gt;</description><category>Age of Empires 2</category><category>aoe2de</category><category>game</category><guid>https://bgstack15.ddns.net/blog/posts/2023/10/30/current-process-for-aoe2de-on-linux/</guid><pubDate>Mon, 30 Oct 2023 12:57:09 GMT</pubDate></item><item><title>AoE2DE on Linux with Alsa</title><link>https://bgstack15.ddns.net/blog/posts/2022/09/30/aoe2de-on-linux-alsa/</link><dc:creator>bgstack15</dc:creator><description>&lt;p&gt;I recently reinstalled my gaming workstation, and of course I reinstalled &lt;a href="https://store.steampowered.com/app/813780/Age_of_Empires_II_Definitive_Edition/"&gt;Age of Empires 2: Definitive Edition&lt;/a&gt;. It's one of the few non-open source activities I allow myself.&lt;/p&gt;
&lt;p&gt;Well, with this OS reinstall, I set up &lt;a href="https://www.devuan.org/"&gt;Devuan GNU+Linux&lt;/a&gt; which uses sysvinit. I had the choise to use pulseaudio, like my &lt;a href="https://getfedora.org/"&gt;Fedora GNU/Linux&lt;/a&gt; installation used. I recall that you could use the pulseaudio graphical control utility to change the default audio sink, which immediately switched over running applications' default audio streams. However, I am going more traditional and less poettering-style, and using just alsa for audio these days (and fluxbox for my window manager, as &lt;a href="https://bgstack15.ddns.net/blog/categories/fluxbox/"&gt;previously discussed&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;I have had this setup for about a month, and it has gone well, including audio, until the past few days. Somehow, my default audio device switched probably to my Nvidia graphics card. I tried adjusting my &lt;code&gt;/etc/asound.conf&lt;/code&gt; which worked in general, such as for vlc.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;defaults.pcm.card 1
defaults.ctl.card 1
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I still needed to manually choose the correct card for the game, however. Reviewing the output of steam and/or the game (by running steam in a terminal window), I saw these logs:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;ALSA lib confmisc.c:767:(parse_card) cannot find card '0'
ALSA lib conf.c:4568:(_snd_config_evaluate) function snd_func_card_driver returned error: No such file or directory
ALSA lib confmisc.c:392:(snd_func_concat) error evaluating strings
ALSA lib conf.c:4568:(_snd_config_evaluate) function snd_func_concat returned error: No such file or directory
ALSA lib confmisc.c:1246:(snd_func_refer) error evaluating name
ALSA lib conf.c:4568:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This could have been because I unplugged what was getting picked for the default device, a cheap webcam that has a microphone but no speakers, so it really should never show up as an audio sink anyways.&lt;/p&gt;
&lt;p&gt;After reviewing my output of &lt;code&gt;aplay -l&lt;/code&gt; (a snippet is below), I set an environment variable in the Steam settings for the game.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;aplay&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="o"&gt;****&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PLAYBACK&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Hardware&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Devices&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;****&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;card&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PCH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;HDA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Intel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PCH&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ALC221&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Analog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ALC221&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Analog&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nl"&gt;Subdevices&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;Subdevice&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;subdevice&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;So in steam settings for AoE2DE, I now have it set up with:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;PROTON_USE_DXVK=1 ALSA_CARD='PCH' %command%
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Also, I am currently using Proton 7.0-4 for compatibility. I was previously using 5.13-6.&lt;/p&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;h3&gt;Weblinks&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://wiki.archlinux.org/title/Advanced_Linux_Sound_Architecture#Select_the_default_PCM_via_environment_variable"&gt;Advanced Linux Sound Architecture - ArchWiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://steamcommunity.com/app/221410/discussions/8/3453717519635204148/"&gt;Using apulse for alsa audio in games launched via proton? :: Steam for Linux Steam Play&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linuxquestions.org/questions/showthread.php?p=6313334#post6313334"&gt;[SOLVED] Steam/proton issues with some games, related to ALSA - Page 2&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Internet searches&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://duckduckgo.com/?q=alsa+lib+cannot+find+card+0"&gt;alsa lib cannot find card 0&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description><category>alsa</category><category>aoe2de</category><category>audio</category><category>game</category><category>linux</category><guid>https://bgstack15.ddns.net/blog/posts/2022/09/30/aoe2de-on-linux-alsa/</guid><pubDate>Fri, 30 Sep 2022 12:33:41 GMT</pubDate></item><item><title>Replicate some functionality of SenseiDE on GNU/Linux installation of AoE2DE</title><link>https://bgstack15.ddns.net/blog/posts/2021/04/17/replicate-some-functionality-of-senseide-on-gnu-linux-installation-of-aoe2de/</link><dc:creator>bgstack15</dc:creator><description>&lt;p&gt;I run &lt;a href="https://store.steampowered.com/app/813780/Age_of_Empires_II_Definitive_Edition/"&gt;Age of Empires 2 Definitive
Edition&lt;/a&gt;
on my Fedora system. A fellow clan member showed me Greg Stein's
&lt;a href="https://github.com/gregstein/SenseiDE"&gt;SenseiDE&lt;/a&gt; which makes a great control
panel for enabling/disabling some extraneous features of the game. Due to the
open source nature of this neat tool, I have been able to replicate some of
the tasks for my installation, in shell! Go check out &lt;a href="https://gitlab.com/bgstack15/aoe2de-seteffects"&gt;aoe2de-
seteffects&lt;/a&gt; on my gitlab.
&lt;a href="https://bgstack15.ddns.net/blog/2021/04/113511984-71933480-955a-11eb-9545-d5d6cc18c98c.jpg"&gt;&lt;img alt="SenseiDE with GNU logo
superimposed" src="https://bgstack15.ddns.net/blog/2021/04/113511984-71933480-955a-11eb-9545-d5d6cc18c98c.jpg"&gt;&lt;/a&gt;&lt;/p&gt;</description><category>Age of Empires 2</category><category>aoe2de</category><category>steam</category><guid>https://bgstack15.ddns.net/blog/posts/2021/04/17/replicate-some-functionality-of-senseide-on-gnu-linux-installation-of-aoe2de/</guid><pubDate>Sat, 17 Apr 2021 12:44:12 GMT</pubDate></item></channel></rss>