The Funtoo Linux project has transitioned to "Hobby Mode" and this wiki is now read-only.
Doom
Playing Classic Doom on Funtoo
A big upgrade to Funtoo's Doom-playing ability has been merged into `next`!
This page will document how to use it.
Quickstart
To play Classic Doom on Funtoo, you need a source port, one or more internal game data files (IWADs), and potentially also some maps to play (PWADs). The Doom source code has been free software for a long time; accordingly, several source ports are available for Linux. Two have been updated recently in Funtoo: GZDoom and Odamex. GZDoom is a good choice for playing alone, offline; Odamex is the preferred multiplayer source port, and can optionally include facilities for running a server.
Environment variables
Set DOOMWADPATH in `~/.bashrc` like
DOOMWADPATH="/usr/share/doom:${HOME}/.local/share/games/doom/wads:${DOOMWADPATH}"
This variable determines the default location that other Doom software will look for game data.
Don't forget to refresh your environment after changing your ~/.bashrc.
Singleplayer
Fix USE flags for sda2-mixer by adding to `/etc/portage/package.use/doom`:
media-libs/sdl2-mixer midi timidity
Install packages
$ emerge -v doomrunner gzdoom
Install IWADs Copy your IWADs to `/usr/share/doom`. Optionally install Freedoom:
$ emerge -v freedoom-data
Start DoomRunner
Configure the engines
- Add engine by clicking the '+' icon
- Navigate in the file picker to `/usr/bin/gzdoom` (or type it in the text field)
Configure search paths
- maps: set it to `/usr/share/doom` or `~/.local/share/games/doom/maps`, wherever you will put your maps. Ebuilds that install maps put them in `/usr/share/doom`, so that's a good choice if you don't have any yourself yet.
- mods: set it to `~/.local/share/games/doom/mods`
Close the initial config window.
Configure a profile for single player
- Create preset: Rename "Default" to "GZDoom singleplayer"
- Select engine: gzdoom
- Select IWAD: Pick whichever game you intend to play. IF
- Select map pack: Leave this alone unless you downloaded maps.
- Select config (optional): Leave this alone.
- Add mods: Leave this alone unless you have mods to play.
Start the game!
Multiplayer
Fix USE flags for sda2-mixer by adding to `/etc/portage/package.use/doom`:
media-libs/sdl2-mixer midi timidity
Copy your IWAD file(s) to `/usr/share/doom`. It is rare to find a Freedoom server, so you will need a commercial DOOM2.WAD file.
Install packages
$ emerge -v odamex
Fix timidity
$ eselect timidity set freepats
Find a game to play by browsing the active server list at https://odamex.net/servers/. Join it with
$ odamex +connect doom.funtoo.org
Alternatively, start the Odamex Launcher (`odalaunch` at the shell). Ignore the wxWidgets messages and optionally uncheck the box to continue showing them. They are a BUG and should be reported and fixed. In the Settings dialog (File -> Settings in the menu), in the File Locations tab, choose the Odamex Path to be "/usr/bin". If you don't perform this step, the launcher won't be able to find the executable.
Ensure that the paths with your WADs and IWADs are in the list.
Choose a game from the list and begin playing.
Source ports
Several Classic Doom source ports are available in Funtoo's tree. Of those, the following are autogenerated at the latest version:
- games-engines/gzdoom: Good for playing single player.
- games-engines/odamex: Preferred for multiplayer; enables an Online Doom Advanced Multiplayer EXperience.
Odamex
Odamex is a very good source port for multiplayer. It has the only free software Doom server, `odasrv`.
Config files
Odamex puts its configuration in files under `~/.odamex` in the user's home directory. The Odamex client config file is `odamex.cfg.` The default location where the server looks for its config file `odasrv.cfg` is also in the same directory.
Downloaded WADs
Odamex can (and will, by default) download WADs from the server if possible. If the server doesn't allow downloading, Odamex will attempt to find the WAD in one of the public repositories about which it knows. These WADs will end up in `~/.odamex/` with the config files.
Recommended Settings
A few settings in the Odamex client are worth noticing:
Resolution/etc.: Display mode
Crosshair: in Odamex, Display -> Heads-up Display -> at the very bottom
Player: Change name and color
Controls: Bind a key for Jump, e.g. Space
Mouse options: Always free look
Make the player list/scoreboard large enough to read it: Display options -> Heads-up Display -> scoreboard scaling, set to 1.0 or 0.9.
Game data
WAD files
Doom data files are organized inside a type of archive called a WAD (pronounced like the word "wad") file. The term 'WAD' is an acronym representing "Where's All [the] Data?".
There are a few types of WADs:
- IWADs are internal game data, often commercial; these include sprites and sounds, as well as maps.
- [PWADs are extra and contain map data.]
Game data files / IWADs
In order to play Doom with a Doom source port, a WAD file for the internal game data, called an IWAD, is required. Commercial IWADs for the original Doom games come with modern Doom games; so it's possible you have one already. See https://doomwiki.org/wiki/IWAD for reference.
Another way to acquire Classic Doom IWADs is to purchase them directly from Steam or GOG.
- The original Doom from 1993, containing four episodes each with eight maps: https://www.gog.com/en/game/doom_1993
- Doom II: https://www.gog.com/en/game/doom_ii
Most current-day maps and mods are based on the Doom II IWAD.
Doom source ports can be played without commercial IWADs by using Freedoom.
- https://freedoom.org
- games-fps/freedoom-data
Ebuilds that install free IWADs place them in `/usr/share/doom`. It is a good idea to place commercial IWADs there, too.
Maps
The commercial and free IWADs come with a lot of great maps. In addition, the community has been making Doom maps and mods for almost thirty years.
A selection of community-produced maps are available in Funtoo's tree. It is easy to add them, and Doom resources traditionally are distributed freely; so more can be made available directly in Funtoo upon request.
Eviternity was created as a 25th birthday gift to Doom and was released on Doom's 25th release anniversary. It's sequel, Eviternity II, coincided with Doom's 30th birthday.
- games-fps/eviternity
- games-fps/eviternity-ii
It is a good idea to put maps in their own directory, like `~/.local/share/games/doom/maps`. Ebuilds that install maps will add them to `/usr/share/doom`; this may change in the future to `/usr/share/games/doom/maps`.
Mods
Mods differ from maps in that they make use of features in a particular source port, rather than simply changing the game's internal data, or building something with components contained within it.
Most mods seem to work with GZDoom, so if you're interested in a particular mod, it's not a bad idea to start there.
Brutal Doom
One popular mod that introduces many modern game elements is Brutal Doom: https://www.moddb.com/mods/brutal-doom
Sprite fixes
There exists a mod that fixes various little glitches with the artwork, available at https://www.doomworld.com/idgames/graphics/sprfix20
TODO: add games-fps/doom2-sprite-fixes
DoomRunner
DoomRunner is a launcher that makes it easy to set up profiles for combinations of the various source ports, IWADs/PWADs, and mods. DoomRunner generates command line arguments for the source port, starts it, and offers a way to kill it if it misbehaves.
DoomRunner allows to configure profiles for different game modes, something that is very useful for playing single player games with a source port like GZDoom that sets everything from command line arguments.
- games-util/doomrunner
Configuring DoomRunner involves first organizing your files into directories that make it easy to find your files. The recommended setup looks like this, with files stored in subdirectories under `~/.local/share/games/doom`:
$ ls ~/.local/share/games/doom maps mods
Various Doom-related ebuilds place files in `/usr/share/doom`
$ ls /usr/share/doom
Multiplayer
Note: It is strongly recommended that you ensure that you can play Doom in a single-player mode with your chosen source port before attempting to play multiplayer.
Odamex is the preferred multiplayer engine. It is very easy to get started with Odamex on Funtoo.
With Odamex
A few methods exist:
Join a game directly from the command line, as with GZDoom, if you know the host to which you want to connect:
$ odamex +connect doom.example.org
Use `odalaunch`, the Odamex Launcher, to find a game; ignore the warnings from wxWidgets:
$ odalaunch
Sadly, the `odalaunch` program is able to find servers, but unable to start the client due to a bug; so it is necessary to use another method to join the game.
DoomRunner can be used with `odamex` just as well as with `GZDoom`, but with a caveat that `odamex` can't find IWADs that are specified by absolute path in DoomRunner unless they are in a directory it knows about from its own configuration.
Or browse the available games at https://odamex.net/servers, choose one to join, and use its host:port combination as the argument to `odamex +connect`.
Operating a server
Useful resources:
Master servers
Odamex master servers listen on `15000/udp` and maintain lists of the servers that are up and running, including information like how many players are logged in. Server operators should set a few relevant variables in the `odasrv` config file that affect the server's appearance in the list.
The master server can be installed by setting `USE="master"` and re-installing `games-engines/odamex`.
Optionally using Docker
- Use `boxer` to build a simple Funtoo docker container from a stage3
- Use that container as a base image and install `odamex` with `USE="server"`
- Save the container as a new image
- Use `slim-toolkit` to minify the odasrv container
- Sample `docker-compose.yaml`:
- Execute like `docker compose up -d`
Don't forget to open the relevant ports on your firewall.
- `10666/udp` is the listening port
- `15000/udp` is used as an outgoing port to contact master servers
With GZDoom
It is possible to play small multiplayer games with GZDoom, e.g. on a local network with 2-4 players. Problematically, if one player disconnects, they can never rejoin the game again unless everyone else quits and starts over.
Music
Note: To make the MIDI music work in various sourceports, it is necessary to set USE="midi timidity" for `media-libs/sdl2-mixer`. Then remember to run `eselect timidity set 1`. The ebuild for `games-engines/odamex` will require this condition to be true.
Alternative soundfonts exist for Timidity. A great one that is freely available is `8MBGSFX`, obtainable from https://www.doomworld.com/idgames/utils/sound_edit/8mbgmpat. It works easily with a few steps:
- Extract the contents to `/usr/share/tinidity/8mbgsfx`.
- Change all the filenames to lowercase; they seem to come from a case-insensitive Windows system.
- Edit `/usr/share/timidity/8mbgsfx/timidity.cfg` and change the `dir` path to the right place on a Funtoo machine.
- From `/usr/share/timidity`:
$ sudo rm current $ sudo ln -sf /usr/share/timidity/8mbgsfx current
TODO: need to make an autogen for it to perform that procedure automatically
Using a Playstation 4 Controller with Bluetooth
It's possible to play Doom with a PS4 controller on Funtoo. It may be possible to use a PS5 controller in a different way, via the kernel driver. In practice, I've found it easier to remap the controller to a set of keyboard and mouse actions. This remapping is performed by a python program called `ds4drv`.
Note: Making Bluetooth work in general is not very difficult on Funtoo, and is beyond the scope of this document. It will be assumed here that other Bluetooth devices pair to the machine on which the controller will be used.
Pairing the Controller with the Computer
First you need to pair the controller with the computer.
- Hold down the Share button, and then hold the PS button at the same time until the controller's lights start flashing.
- Perform the usual procedure on the computer to pair with a device that's in pairing mode.
Installing Software
Now you need `ds4drv`. An easy way to install it is with `pipx` that isolates python executables into their own virtual environments, and makes them available in your path.
$ pip install pipx --user $ pipx ensurepath $ pipx install ds4drv
Dealing with Device Permissions
Get the following file and put it in the `/etc/udev/rules.d/` directory: https://github.com/chrippa/ds4drv/blob/master/udev/50-ds4drv.rules
Then you can ask `udev` to use it immediately:
$ udevadm control --reload-rules $ udevadm trigger
Configuring the Button Mapping for Doom
Now you need to configure `ds4drv`. Copy the following into ~/.config/ds4drv.conf`
[ds4drv] hidraw = true
[controller:1] # Enables LED flash on low battery battery-flash = true
# Sets LED color led = ff00ff
# default mapping mapping = doom
[mapping:doom] # General button to key mapping KEY_UP = dpad_up KEY_LEFT = dpad_left KEY_DOWN = dpad_down KEY_RIGHT = dpad_right
# needed for the menus KEY_ENTER = button_cross
# Turn analog stick directions into buttons KEY_W = -left_analog_y KEY_A = -left_analog_x KEY_S = +left_analog_y KEY_D = +left_analog_x
# Map relative mouse movement to a analog stick REL_X = right_analog_x REL_Y = right_analog_y
# Map mouse buttons BTN_LEFT = button_r2 BTN_RIGHT = button_l2
# Emulate mouse wheel on r1 and l1 #REL_WHEELUP = button_l1 #REL_WHEELDOWN = button_r1 && button_r2 # it's actually more useful to set the weapons to the dpad # and employ those buttons for something different # a key for quick turn around, in Odamex LEFT_SHIFT = button_r3 # jump KEY_SPACE = button_l1
# Mouse settings mouse_sensitivity = 0.3 mouse_deadzone = 10
# Scroll wheel emulation settings (values are in seconds) mouse_scroll_repeat_delay = 0.25 # How long to wait before continual scrolling mouse_scroll_delay = 0.05 # Lower this to scroll faster; raise to scroll slower
# other keys, bound for DOOM
# use/action button KEY_E = button_circle
# yes, for leaving KEY_Y = button_triangle
# map KEY_TAB = button_trackpad
# esc KEY_ESC = button_options
# score KEY_BACKSLASH = button_share
There are more functions available to `dsvdrv`, such as mapping button combinations to shell commands outside of the game. For information, see the sample config file here: https://github.com/chrippa/ds4drv/blob/master/ds4drv.conf
Start the Program
Now if you run
$ ds4drv
with the controller paired, you should see output in the terminal indicating that the controller has been found by `ds4drv`. You are now ready to play. Both the controller and the keyboard will work.
You might need to load the `uinput` module first:
$ sudo modprobe uinput
To load the module automatically at boot time, you can add `uinput` to the line in `/etc/conf.d/modules` that says `modules="..."`. It might be commented out or empty initially on your system.