Getting UT436 to run again in 2025, mostly for compatibility checks.

The original installer, ut-install-436.run is broken these days:

$ ./ut-install-436.run --extract-only
Verifying archive integrity...tail: cannot open '+6' for reading: No such file or directory
Error in check sums 1237260170 2341625838

It exercises a call syntax that is no longer supported. Replacing tail +6 by tail -n +6 leads to the next error:

Verifying archive integrity...Error in check sums 2463042252 2341625838

After disabling the exit calls:

trap: usage: trap [-lp] [[arg] signal_spec ...]

The call to trap is missing the signal specification. After adding the missing ERR argument to the trap command like so:

-[ "$keep" = y ] || trap 'cd /tmp; /bin/rm -rf $tmpdir; exit $res'
+[ "$keep" = y ] || trap 'cd /tmp; /bin/rm -rf $tmpdir; exit $res' ERR

we get

Verifying archive integrity...Error in check sums 388931346 2341625838
OK
Uncompressing Unreal Tournament version 436 Linux install
gzip: stdin: not in gzip format
tar: This does not look like a tar archive
tar: Exiting with failure status due to previous errors

./436.run: line 162: ./setup.sh: No such file or directory

At this point, it's easier to just rip the compressed part off manually. There isn't even a need to run the installer, as the Linux parts are conveniently packaged (data.tar.gz) and just need to be unpacked:

$ hexdump -C ut-install-436.run
...
000016d0  73 0a 45 4e 44 5f 4f 46  5f 53 54 55 42 0a 1f 8b  |s.END_OF_STUB...|
...

$ ddrescue ut-install-436.run 436.tgz -i 0x16de -o 0
$ mkdir x436
$ tar -C x436 -xf 436.tgz
$ tar -C ~/ut99isounpacked -xvf x436/data.tar.gz $ cd x436/setup.data; ./bin/Linux/x86/loki_patch patch.dat ~/ut99isounpacked

If you don't run loki_patch, executing ut-bin later would otherwise die with:

appError called:
Class Actor Member Owner problem: Script=48 C++=52

Install libnsl1-32bit, libX11-6-32bit, libXext6-32bit (these are the hard requirements as emitted by ldd ut-bin).

Initializing OpenGLDrv...
binding libGL.so.1
appError called:
Could not load OpenGL library

cd ~/ut99isounpacked/System/
$ ./ut-bin -log
Failed to load 'WinDrv': Can't find file for package 'WinDrv'
Failed to load 'Class WinDrv.WindowsClient': Can't find file for package 'WinDrv'
Can't find file for package 'WinDrv'
appError called:
Can't find file for package 'WinDrv'
Executing UObject::StaticShutdownAfterError
Signal: SIGIOT [iot trap]
Aborting.
Exiting.
Name subsystem shut down

The INI file still declares WinDrv. Also extract:

$ cd ~/ut99isounpacked; tar -xvf $path_to_x436/OpenGL.ini.tar.gz

If you get

$ ./ut-bin -log ... Input system initialized for SDLViewport0 Opening SDL viewport. Bound to OpenGLDrv.so Loaded render device class. Initializing OpenGLDrv... binding libGL.so.1 appError called: Could not load OpenGL

This points to Mesa-libGL1-32bit being absent. (Because OpenGLDrv.so is dlopened, it could not be spotted earlier.) Install it.

If you get

binding libGL.so.1
Resizing SDL viewport. X: 0 Y: 0
OpenGL
appError called:
Couldn't set video mode: No video modes supported. (??)

you still have INI problems.

436 ought to run now.

binding libGL.so.1
Resizing SDL viewport. X: 640 Y: 480
OpenGL
GL_VENDOR     : Intel
GL_RENDERER   : Mesa Intel(R) Iris(R) Xe Graphics (TGL GT2)
GL_VERSION    : 4.6 (Compatibility Profile) Mesa 25.0.0
GL_EXTENSIONS : GL_ARB_multisample...
Device supports: GL
Device supports: GL_EXT_bgra
...
Bound to ALAudio.so
open /dev/dsp: No such file or directory
Audio initialization failed.
Game engine initialized
Startup time: 0.863434 seconds.
Entering main loop.
URL: Adding default option Name=Player
URL: Adding default option Class=Botpack.TMale2
URL: Adding default option team=255
URL: Adding default option skin=SoldierSkins.blkt
URL: Adding default option Face=SoldierSkins.Othello
Browse: Index.unr?entry?Name=Player?Class=Botpack.TMale2?team=255?skin=SoldierSkins.blkt?Face=SoldierSkins.Othello

To remedy the audio issue, load the OSS emulation layer. Install alsa-oss-32bit, libasound2-32bit, and, because of dlopen and $modern_userspace, also libpulse0-32bit and pipewire-alsa-32bit.

LD_PRELOAD=/usr/lib/libaoss.so.0 ./ut-bin

With emission over pipewire and Bluetooth, sound is pretty broken. This may be the result of all the newfangled technology and nobody ever anticipated stacking so many compat layers.

If you run into a symbol error involving GLIBC_ or GLIBCXX_ (I think this was with v451), this is because the bundled libstdc++.so.6 is disliked by the system ld.so/by the system libc.so. Fixable by simply force-loading the system-provided first (UT's own libstdc++ is then disregarded):

LD_PRELOAD=/usr/lib/libstdc++.so.6:/usr/lib/libaoss.so.0 ./ut-bin