(upstream package; see Snap)
A second breath of life for Wolfenstein: Enemy Territory
This is Sturmgeist — a fork of ET: Legacy. Upstream docs, wiki, and releases remain the reference for the wider project; use this repo for fork-specific changes and CI.
Quick links
| Website | etlegacy.com |
| Downloads | etlegacy.com/download |
| Wiki / FAQ | github.com/etlegacy/etlegacy/wiki |
| Docs | etlegacy.readthedocs.io |
| Lua API | etlegacy-lua-docs.readthedocs.io |
| Translation | Transifex — etlegacy |
| Chat | #etlegacy (IRC), Discord |
| Windows signing | SignPath — etlegacy |
ET: Legacy is based on Wolfenstein: Enemy Territory (GPL release, 2010).
- Engine — Fixes, security hardening, fewer legacy deps, optional modern renderers, compatibility with ET 2.60b and many mods.
- Legacy mod — Gameplay-close improvements, lightweight, Lua-extensible.
More context: ET: Legacy wiki.
- CONTRIBUTING.md — workflow, upstream fetch, validation.
- SECURITY.md — reporting issues.
The tree contains engine and mod code only, not retail game data (still under the original EULA).
You need pak0.pk3 under etmain/. Some mods also need pak1.pk3 / pak2.pk3. Splash Damage — W:ET hosts the free base game.
- Not compatible with PunkBuster servers or ETPro servers.
- 64-bit Linux clients need a 64-bit mod on the server; 32-bit-only mods require a 32-bit build or cross-compile. See Compatible mods.
If system packages are missing, fetch the libs submodule (bundled third-party sources):
git submodule update --init --recursiveThen tune BUNDLED_LIBS and per-library BUNDLED_* flags in CMake. Version notes: Libs changelog (wiki).
Required (typical desktop build)
- CMake
- OpenGL + GLEW (OpenGL renderers)
- SDL2
- Zlib, MiniZip
- libjpeg-turbo or libjpeg
Common optional features (often on by default in CMake)
- libcurl, WolfSSL or OpenSSL
- Lua, Ogg Vorbis, Theora, Freetype, libpng, SQLite, OpenAL
Vulkan renderer (-DFEATURE_RENDERER_VULKAN=ON)
- Vulkan loader — CMake
find_package(Vulkan)(e.g. LunarG SDK or distrolibvulkan-dev). - easybuild (Linux/macOS): pass
-vulkanor-vkto add the Vulkan backend next to OpenGL 1 (dynamic renderer build is forced on if needed). Example:./easybuild.sh build -64 -vulkan. - Ray-tracing / advanced RHI work in progress — track draft PR #5 (
cursor/vulkan-ray-tracing-bee0) for KHR RT experiments; default Vulkan path remains the shipped renderer stack.
High refresh displays (e.g. 120 Hz)
- Default client cap
com_maxfpsis 120 (still clamped 20–500). Raise it if your display and GPU can sustain higher frame times consistently. - Vsync is controlled separately (e.g.
r_swapIntervalfor OpenGL; use driver or in-game settings as appropriate for Vulkan).
git clone https://github.com/timfox/sturmgeist.git
cd sturmgeist
git submodule update --init --recursiveThat initializes the libs/ submodule (bundled native libraries). The Android JoyStick sources live under app/libs/joystick/ in this fork (vendored in-tree, not a submodule). Use BUNDLED_LIBS and BUNDLED_* in CMake to prefer bundled vs system libraries.
Sync from upstream without merging:
pixi run upstream-fetch
# then: git log --oneline HEAD..FETCH_HEADSee Development helpers and CONTRIBUTING.md.
GitHub Actions on main / master run .github/workflows/ci.yml (Linux containers, macOS, Windows, Android, optional log checks). The Android job uses JDK 21 in CI, and the vendored JoyStick library uses the same Gradle 8.13 wrapper as the root app so Gradle can instrument current dependency bytecode (for example BouncyCastle multi-release JARs). build.yml (ETLBuild) runs on tagged releases, a weekly schedule, and manual dispatch. snapcraft.yml builds the upstream etlegacy-snap tree after ETLBuild completes; it expects SNAPCRAFT_STORE_CREDENTIALS where publishing is desired.
Forks without LEGACY_CI_WEBHOOK still get a full CI signal; the optional Discord notify step is skipped when that secret is unset. The check-compiler-warnings job scans native build logs for new compiler warnings in game code; Android and Windows (win / win64) logs are treated as informational only (see misc/collect-and-check-gh-build-logs.py).
Pull request hygiene: Before merging, confirm the branch is rebased on current main and does not revert unrelated work. Close or update stale PRs that show merge conflicts against main.
Measuring filesystem startup: Use +set fs_startupTiming 1 on the command line (or set fs_startupTiming to 1 in the console before a full FS re-init). The log prints FS startup wall time: N ms after pk3 search paths are built. For per-frame timing once running, use com_speeds.
Pixi workspace: pixi.toml.
| Command | Purpose |
|---|---|
pixi install then pixi run -e validation check-changes |
Format / workflow checks on changed files (merge base from .upstream-remote-branch or origin/main / origin/master) |
pixi run -e validation autoformat |
Apply formatters |
pixi run -e validation lint-workflows |
actionlint on .github/workflows |
pixi run upstream-fetch |
git fetch upstream master into FETCH_HEAD only (ETL_UPSTREAM, ETL_UPSTREAM_BRANCH override) |
Local builds: ./easybuild.sh help.
Install layout is controlled in CMake, notably:
| Variable | Role |
|---|---|
INSTALL_DEFAULT_BASEDIR |
Default fs_basepath (empty → cwd when not installing system-wide) |
INSTALL_DEFAULT_BINDIR |
Executables (default bin under prefix) |
INSTALL_DEFAULT_SHAREDIR |
Shared data (default share) |
INSTALL_DEFAULT_MODDIR |
Libraries / paks (default lib/etlegacy + legacy) |
DOCDIR |
Docs (default INSTALL_DEFAULT_SHAREDIR/doc/etlegacy) |
Option A — easybuild
./easybuild.sh # 32-bit build, or
./easybuild.sh -64 # 64-bitDefault install: ~/etlegacy.
Option B — CMake
mkdir build && cd build
cmake ..
make
sudo make install # optional; set install vars firstRelease packaging — optional LTO
For Release / RelWithDebInfo / MinSizeRel, you can enable link-time optimization if your toolchain supports it (CMake IPO):
cmake -DENABLE_LTO=ON ..Leave it off for normal development (faster links). It cannot be combined with ENABLE_ASAN.
Notes
- 32-bit builds may need multilib /
-develpackages. - nasm is needed for bundled jpeg-turbo.
- If CMake picks wrong lib bitness:
CC="gcc -m32" CXX="g++ -m32" cmake .. - X11: missing audio →
libpulse-devorlibasound2-dev; odd mouse →libxi-dev.
mkdir build && cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-cross-mingw-linux.cmake ..
makeAdjust the MinGW prefix in cmake/Toolchain-cross-mingw-linux.cmake if needed (default i686-w64-mingw32).
- Visual Studio — Desktop development with C++
- CMake on
PATH
easybuild: run easybuild.bat → install under My Documents\ETLegacy-Build.
CLI / VS: from a build/ folder:
cmake -G "NMake Makefiles" -DBUNDLED_LIBS=YES .. && nmakeor a VS generator, e.g. cmake -G "Visual Studio 17" -A Win32 -DBUNDLED_LIBS=YES ...
Notes
- Failed bundled libs: in
libs/,git clean -df && git reset --hard HEAD, then rebuild. - libcurl + missing sed: GnuWin sed or use Git’s tools on
PATH.
- Xcode CLT (
xcode-select --install) or full Xcode - Homebrew
brew install cmake autoconf nasm automake libtool
# system libs if not using BUNDLED_LIBS:
brew install glew sdl2 minizip jpeg-turbo curl lua libogg libvorbis theora freetype libpng sqlite openal-soft
# or: brew bundle && brew bundle --file=misc/macos/libs.Brewfileeasybuild: Mojave and older: ./easybuild.sh or ./easybuild.sh -64. Catalina+: ./easybuild.sh -64 --osx=10.15. See easybuild.sh for flags.
CMake: mkdir build && cd build && cmake .. && make (set install variables before make install if needed).
OpenGL and GLES are supported. See easybuild.sh (RPI section): e.g. ./easybuild.sh -RPI -j4 and toggle FEATURE_RENDERER_GLES as documented there. Dependencies vary by distro; see script comments and wiki for current package names.
Official ET: Legacy snap sources live in etlegacy/etlegacy-snap (snapcraft.io/etlegacy). This fork’s workflow checks out that repo to build; it is not a fork-specific snap name unless you maintain your own branch and store credentials.
See COPYING.txt (GPLv3) and file headers. Wolfenstein: Enemy Territory is subject to additional terms from id Software; see COPYING and upstream notices.
Copyright (C) 1991–1992 RSA Data Security, Inc. Use and derivative works must retain the RSA MD4 identification where referenced. Provided as is.
Public-domain C implementation; no copyright claimed. Use freely as is.