Install Unreal Tournament GOTY on Debian
Epic Games has approved downloading of Unreal Tournament (UT) from the Internet Archive. The game is from 1999 but there is an online community named OldUnreal still releasing patches for it. This is a special game for me. I remember many hours playing it with friends --- the original UT during high school and later, UT 2004 during university.
With the OldUnreal patches, UT runs on amd64 Linux. It does not require Wine. OldUnreal provides easy to use installers that download the game from Internet Archive and applies the patches but only for Windows. Here are instructions to install it on Linux (tested in Debian 12 - bookworm).
Download the original game (from Internet Archive)
If you don't have the game, download it from the Unreal Tournament: Game of the Year Edition page on the Internet Archive. They provide direct downloads for the two ISO files as well as a torrent file. Whatever way you download, you will need two image files have this checksum:
$ md5sum UT_GOTY_CD1.iso UT_GOTY_CD2.iso e5127537f44086f5ed36a9d29f992c00 UT_GOTY_CD1.iso b59a097bc6d899018ffbf65401b66231 UT_GOTY_CD2.iso
Download OldUnreal patches
There is no source released for the patches, only binary releases. They are available from OldUnreal's release page on Github.
v469d is the latest version and has Linux builds for amd64, arm64, and x86. Download it from Github and check its checksum:
$ md5sum OldUnreal-UTPatch469d-Linux-amd64.tar.bz2 d0e133165bf1630288583e52a40b90db OldUnreal-UTPatch469d-Linux-amd64.tar.bz2
Installation
The patches are supposed to be dropped on top of an existing installation. The wikipedia page for UT mentions a Linux installer that was distributed on the Unreal website. That website no longer exists. Copies of such installer can still be found online but I can't confirm their authenticity. The original will probably only target x86 systems anyway. Instead of an installer, it is possible to just copy the files to the right places so that's why I'm doing here.
The game expects a structure with all games files under a single directory. Following the Linux Filesystem Hierarchy Standard (FHS), this means it fits best under /opt/<provider>/<package>. I'm installing it there with com.oldunreal as the <provider> [1].
# Create all directories and mount the disk images sudo mkdir -p /opt/com.oldunreal/ut-goty-v469d sudo mkdir /mnt/cd1 /mnt/cd2 sudo mount -o loop,ro UT_GOTY_CD1.iso /mnt/cd1 sudo mount -o loop,ro UT_GOTY_CD2.iso /mnt/cd2 # Copy game asset files (but not maps) sudo rsync -r /mnt/cd1/Help \ /mnt/cd1/Music \ /mnt/cd1/Sounds \ /mnt/cd1/Textures \ /mnt/cd2/Help \ /mnt/cd2/Sounds \ /mnt/cd2/Textures \ /opt/com.oldunreal/ut-goty-v469d # Copy the uncompressed map files (the .unr.uz files are # compressed and will be uncompressed with the patched # programs later) sudo mkdir /opt/com.oldunreal/ut-goty-v469d/Maps/ sudo cp /mnt/cd1/Maps/*unr /opt/com.oldunreal/ut-goty-v469d/Maps/ # These files don't need executable permissions sudo chmod -R a-x+X /opt/com.oldunreal/ut-goty-v469d/ # Copy system files (ignore warnings from CD1 files # duplicated in CD2) sudo mkdir /opt/com.oldunreal/ut-goty-v469d/System/ sudo cp /mnt/cd1/System/*.u \ /mnt/cd2/System/*.u \ /mnt/cd1/System/*.int \ /mnt/cd2/System/*.int \ /opt/com.oldunreal/ut-goty-v469d/System/ # Extract the v469d patches on top of the "installation" sudo tar xjf OldUnreal-UTPatch469d-Linux-amd64.tar.bz2 \ -C /opt/com.oldunreal/ut-goty-v469d/ # Uncompress the remaining maps and move them in place for UZ_FPATH in /mnt/cd1/Maps/*.uz /mnt/cd2/maps/*.uz; do /opt/com.oldunreal/ut-goty-v469d/System64/ucc-bin decompress $UZ_FPATH sudo mv ~/.utpg/System/`basename $UZ_FPATH | sed 's,.uz$,,'` \ /opt/com.oldunreal/ut-goty-v469d/Maps done # Fix ownership of files sudo chown -R root:root /opt/com.oldunreal/ut-goty-v469d # Cleanup sudo umount /mnt/cd1 sudo umount /mnt/cd2 sudo rmdir /mnt/cd1 /mnt/cd2
Application Desktop entry
To get UT appear on the menus you need a desktop entry file. Place this file on /usr/local/share/applications/com.oldunreal.ut-goty.desktop [2]:
[Desktop Entry] Type=Application Version=1.0 Name=Unreal Tournament (UT) Icon=/opt/com.oldunreal/ut-goty-v469d/Help/Unreal.ico Exec=/opt/com.oldunreal/ut-goty-v469d/System64/ut-bin-amd64 Terminal=false Categories=Game;
and update the menu system:
sudo update-desktop-database sudo xdg-desktop-menu forceupdate
Fixing screen resolution
The first time I started UT, the screen resolution was off so that the the bottom left quadrant of the game window covered the whole monitor. None of the menus were visible. This is due to the default settings in ~/.utpg/System/UnrealTournament.ini. Exiting the game cleanly seems to automatically correct the configuration file [3].
Exiting the game cleanly can be tricky if you can't see the menus to click but these are the steps to do it from the keyboard:
- press Esc to skip the intro (or let it play to the end)
- The bottom left corner should read "Start a new game, load a game, or quit". This means that the "Game" menu bar is open. Do nothing. If it reads "Use the game menu to start a new game", click Alt+g to open the Game menu.
- Press Shift+q to select the "Quit" entry. A confirm quit dialog will appear which may not be on the visible part of the viewport.
- If the Quit dialog is visible and the "Yes" button is visible, click on it. If the "Yes" button is not visible, press Enter.
- You should have just exited UT. The next time you start the resolution should have been fixed.
[1] | I guess a case can also be made to use com.epicgames as the provider. I'm using OldUnreal because this is the version of the game distributed by them. |
[2] | It is not clear to me the best place to place desktop entries for stuff installed under /opt. On one hand, the system-wide location for application desktop entries installed locally, i.e., not managed by the OS package-manager, is /usr/local/share/applications. I feel that is a bit weird to place stuff from outside the /usr/local tree there but there isn't a better default place.
|
[3] | Restoring ~/.utpg/System/UnrealTournament.ini after exiting UT cleanly brings the problem back. The diff between before and after the clean exit show many lines changed but I couldn't fix the issue by manually setting any logical subset of those options. |