This is a fork of prboom+ with extra tooling for demo recording and playback, with a focus on speedrunning.

Related tags

Graphics dsda-doom

dsda-doom v0.15.1

This is a fork of prboom+ with extra tooling for demo recording and playback, with a focus on speedrunning.

Heretic Support (beta)

  • DSDA-Doom includes demo-compatible support for heretic (all the demos stored on dsda are in sync).
  • Not everything is a 1 to 1 match with vanilla heretic (similar to doom in prboom+) - some of this will be fixed and refined. The game should be identical mechanically.
  • Heretic game logic should be set automatically if you use HERETIC.WAD as the iwad. If it doesn't work, please use the -heretic commandline option. This flips a switch in the engine that determines all the core game data.
  • You do not need to (and can't) set the complevel when playing heretic. It is implicitly set to 0, since heretic is based on doom v1.2.
  • Setting the "Status Bar and Menu Appearance" option to "not adjusted" will have no effect for heretic (it will default instead to "Doom format").
  • The "Apply multisampling" automap option is disabled for heretic.
  • Arbitrary music file replacement is currently disabled (even for doom). This will be fixed.
  • The automap is partially supported. It's functional but does not have, for example, the parchment background. That being said, many of the extra features added in prboom+ also apply to the heretic automap. Automap colors are not configurable for heretic.
  • Some of the more advanced features are not implemented for heretic yet, and using them may cause crashes or other odd behaviour. This includes ghost players, key frames (working but not always in sync), and the analysis code.
  • Heretic cheats aren't implemented yet, but you should be able to use the corresponding doom ones.
  • Dehacked support for heretic isn't implemented / investigated yet. It's possible some things will work by chance.
  • At the end of E2, one of the images requires palette swapping. This is not implemented yet, so the image will look wrong.
  • There isn't a separate heretic configuration file - if you'd like to keep different key configurations for each game, you'll have to keep two config files (for now).
  • Save files should work but are not compatible with the original.
  • Advanced hud is not implemented for heretic.
  • Extended hud colors are different due to heretic's different palette and the existing color translation tables. This can be improved eventually.
  • The heretic font does not have all the characters that the doom font does. As a result, the prboom+ hud font has been extended to the full character set and is used in various menus.
  • Some menus extend over the hud. This will be cleaned up later.
  • Any number of things may be broken...please let me know on dw or discord if you run into a problem.

New Stuff

  • Use -analysis to write an analysis.txt file with run details.
  • Use -track_pacifist to enable a "Not pacifist!" message to appear when breaking the category rules.
  • Use -track_100k to enable a "100K achieved!" message to appear when reaching 100% kills on a map.
  • Use -time_keys to show a split when you pick up a key.
  • Use -time_use to show a split when you press the use key.
  • Use -time_secrets to show a split when you find a secret.
  • Use -time_all to enable all the split options.
  • Use -export_ghost ghost to write a ghost file (.gst).
  • Use -import_ghost ghost_a ghost_b ... to import ghost files (.gst).
  • Use -tas to disable strict mode.
  • Use -first_input f s t to "build" the first command of a tas, where f = forwardmove, s = sidemove, and t = angleturn.
    • Example: -first_input 50 50 32 will do a quarter turn left and sr50 forward right.
  • Through the use of automatic and manual key frames, you can now rewind the game.
  • The time with tics is now displayed on the intermission screen (top left corner).
  • The extended hud provides a hybrid of the classic and advanced huds.
  • Use the "restart current map" key while demo recording to perform an in-game restart. Known issue: solo net is not preserved properly.
  • You can configure multiple input profiles.
  • You can configure multiple keys to one action.
  • You can bind (many) cheats.


  • Smart Totals renamed to Max Totals and fixed to show kill constraint for max.
  • If there is a demo name clash and overwriting is off: use incrementing name demo-12345.lmp.
  • Removed the "continue from save slots set in demos" feature. The implementation was confusing and bugged.

New Settings

  • Strict Mode: disable TAS options while recording, unless using -tas.
  • Cycle Ghost Colors: cycle through the 4 player colors when spawning ghosts.
  • Automatic Key Frame Interval (s): time between automatic key frames.
  • Automatic Key Frame Depth: how many key frames to store (max rewind length).
  • Extended Hud: add extra info on top of the default hud.
  • Wipe At Full Speed: always display the wipe animation at normal speed.
  • Track Demo Attempts: show the attempt count (session / total) when starting a demo.

Key Frames

Key frames capture the game state at a given moment, similar to save files. By automatically recording key frames at fixed intervals, it is possible to "rewind" the game. This can be used during normal play, while recording (tas) demos, and during demo playback. You can also set a manual "quick key frame" at a specific point and rewind to that moment at any later time. When storing a key frame while recording, a backup file is created (backup-ttt.kf). You can continue a demo from a key frame like so: -record x.lmp -from_key_frame backup-1234.kf -complevel x. While recording from a key frame, the demo restart key will return you to the original key frame, even if you have made other key frames later on.


A ghost follows the life of the player recorded in the ghost file. This can be useful to compare demos, or to compete against demos while you play. For movies, ghosts that enter the next map ahead of the player will pause until that map is reached. Ghosts that are left behind will fast-forward to the current map.

Analysis File

This file contains summary data about a run in key-value pairs. Current contents:

  • skill, 1 to 5.
  • nomonsters, 1 or 0 (-nomonsters parameter).
  • respawn, 1 or 0 (-respawn parameter).
  • fast, 1 or 0 (-fast parameter).
  • pacifist, 1 or 0.
  • stroller, 1 or 0.
  • reality, 1 or 0 (no damage taken).
  • almost_reality, 1 or 0 (only nukage damage taken).
  • 100k, 1 or 0 (100% kills as seen on intermission).
  • 100s, 1 or 0 (100% secrets as seen on intermission).
  • missed_monsters, monsters left alive (not including icon spawns).
  • missed_secrets, secrets left uncollected.
  • weapon_collector, 1 or 0 (0 if no weapons).
  • tyson_weapons, 1 or 0 (only pistol, chainsaw, and fist used).
  • turbo, 1 or 0.
  • category, UV Max, NoMo, etc.

Category Detection

If multiple categories are detected, the first match in this list is chosen: UV Max, UV Tyson, Stroller, Pacifist, UV Speed

Example: if you complete UV Tyson on a map and collect all the secrets, the analysis will show UV Max.

Use the extra flags (pacifist, stroller, tyson_weapons) to check the details.

Irrelevant categories for a run are ignored. E.g., you won't see NM 100S if a map has no secrets and you won't see Pacifist if a map has no monsters.


  • The DSDA-Doom icon was designed by Mal (129thVisplane). Thanks!
  • Simple shadows render as hom-like rectangles in OpenGL mode

    Simple shadows render as hom-like rectangles in OpenGL mode


    I've been using a post 0.24.3 version of the game compiled somewhere around April, so I am not quite sure when the problem occurred exactly, but here is how simple shadows look for me in latest master branch: doom00

    bug 0.25 
    opened by rrPKrr 16
  • Music Player & .ogg files

    Music Player & .ogg files

    Encountered strange error with DSDA where a .wad has an .ogg file as the music for a level.

    This plays fine and causes no problems, unless you set your music player to anything but FluidSynth, in which case the game promptly crashes with a Signal 11 error, and it will keep happening even when you change back. This happens even though the map in question wouldn't even be accessed normally and thus the track wouldn't even play. Does not happen in Woof.

    opened by Chonkblonk 10
  • Indexed Lightmode (paletted software rendering emulation on the GPU)

    Indexed Lightmode (paletted software rendering emulation on the GPU)

    This PR adds a new "indexed" lightmode which emulates Doom's software lighting using PLAYPAL and COLORMAP, using Jazz Mickle's technique pioneered in this article.

    The intent is to make it look as close to the software renderer as possible, so folks who prefer that look (and/or get really picky about COLORMAP fades) can get it without sacrificing the huge performance gains from actually using the GPU. :P

    There are a couple of minor to-dos still (precaching improvements, spectres), but nothing worth blocking the merge anymore. The main feature is done now, yay :D

    Some outdated musings, for posterity:

    At time of writing, the basics are in (new lightmode option, texture handling, and a first pass of the lighting shader), but there's quite a few bugfixes and housekeeping things to do (e.g. enabling mipmaps or filtering will break it to hell right now), and I also need to implement pain fades & weapon flashes. Still, this is the bulk of the work and the most "intrusive" part, so take a look and lemme know what you think.

    I also need to merge #96 -- I'll get on that soonish :P

    [EDIT] Leaving a to-do list for myself:

    • [x] Merge master
    • [x] DSDA Palette Cycling (hey ho this already works :D )
    • [x] Pain/item fades via palette, not the GL method
    • [x] Use colormap for Invuln/Light-amp
    • [x] Software-style Gamma
    • [x] Disable mipmapping & texture filtering while in Indexed mode (these don't mix, sorry y'all)
    • [x] Disable detail textures (? -- is this even a real feature the engine does? never seen it in Doom ever).
    • [x] Fix textured automap
    • [x] Fix gun flash intensity (seems to be doubling up right now)
    • [x] Sky support
    • [x] UI support
    • [ ] Spectres?
    • [x] Fix oddball red texture translucency shenanigans in Bauhaus MAP01
    • [x] Test high-res textures (tl;dr: this is a no go. skip all that business.)
    • [x] Test BOOM colormap features (this might just work out of the box? fingers crossed)
    • [x] Test translucency (presumably no TRANMAP support, that's outside of scope)
    • [ ] Improve precaching (right now it only precaches the indexed textures XOR the normal ones)
    • [ ] Precache colormap textures

    Probably a few things I'm missing that will come up when folks give this a test in the wild. :P

    opened by XaserAcheron 8
  • determine heretic/hexen mode from the executable name

    determine heretic/hexen mode from the executable name

    I'd like to install two additional executables into the Debian package, dsda-heretic and dsda-hexen, which are mere symlinks to dsda-doom. So, I have separate executables for each game without the need to explicitly specify a command line parameter. The executables will recognize the desired game from their own file name.

    In other words, make it work just like chocolate-doom/-heretic/-hexen. :wink:

    opened by fabiangreffrath 8
  • CMake: Set _FILE_OFFSET_BITS=64 on Linux

    CMake: Set _FILE_OFFSET_BITS=64 on Linux

    By default without _GNU_SOURCE, off64_t is not defined. This breaks MUSIC/dumbplayer.c workaround for making off_t 64-bit. Even 64-bit Linux is affected.

    Define _FILE_OFFSET_BITS=64 explicitly so that off_t is defined as a 64-bit type. This also skips the workaround in dumbplayer.c source file.

    The UNIX AND NOT APPLE is assumed to mean Linux, though it might trigger on non-Linux systems as well.

    I only tested this on my Gentoo x86-64 machine, building both in 32-bit and 64-bit mode.

    The idea of adding _GNU_SOURCE came to me by comparing the compiler flags while building dsda-doom and coelckers/prboom-plus. In the latter, there is an unrelated change that adds _GNU_SOURCE:

    opened by BigBigos 7
  • Add separate install option for `dsda-doom.wad`

    Add separate install option for `dsda-doom.wad`


    This is a suggestion from Homebrew/homebrew-core#108013.

    This PR adds a CMake cache entry named EXTRA_DOOMWADDIRS which consists in a list of additional directories to check for WADs similar to DOOMWADDIR.


    While working on the Homebrew integration we noticed the following issues:

    • When leaving DOOMWADDIR to its default (<prefix>/share/games/doom), the games/doom part gets symlinked into HOMEBREW_PREFIX. The issue is that when reinstalling/updating/uninstalling dsda-doom, this folder would get wiped and all your WADs erased.
    • When setting DOOMWADDIR to HOMEBREW_PREFIX/share/games/doom, build fails on macOS due to quarantine as CMake tries to create the missing directories when it doesn't have the privileges to do so.

    The current makeshift solution is the following:

    • Install step:
      • Leave DOOMWADDIR to its default.
      • After CMake install, move dsda-doom.wad away.
    • Post-install step:,
      • Create HOMEBREW_PREFIX/share/games/doom.
      • Symlink dsda-doom.wad into it
      • Symlink HOMEBREW_PREFIX/share/games/doom into dsda's prefix.

    With this PR, HOMEBREW_PREFIX/share/games/doom could be set as an EXTRA_DOOMWADDIRS and be searched while not being deleted when dsda gets updated.

    It's worth mentioning that HOMEBREW_PREFIX is not the same on all platforms and can be chosen by the user, here are the defaults:

    • /opt/homebrew (M1 mac)
    • /usr/local (x86_64 mac)
    • /home/linuxbrew/.linuxbrew (Linux)
    opened by FtZPetruska 6
  • PortMidi volume spikes

    PortMidi volume spikes

    Reported by zeromaster on discord:

    There is occasionally a music volume spike when quitting dsda-doom. Also happens when entering the intermission screen. It only happens with PortMidi and not when using FluidSynth.

    opened by kraflab 5
  • GL_RGB5_A1 causes palette distortions in Indexed lighting mode

    GL_RGB5_A1 causes palette distortions in Indexed lighting mode

    Hey! The new indexed lighting mode is absolutely amazing! Had some issues with palette the first time I launched the game though. It seems like it's texture format "gl_rgb5_a1" that doesn't work nicely with the new mode.

    opened by rrPKrr 4
  • Purge demoex file

    Purge demoex file

    Previously, loading the demo footer involved these steps:

    • Load the demo file
    • Locate the end marker
    • Check for the pwad signature
    • Copy the demo footer as a pwad into a temporary file
    • Add the temporary file to the wad list
    • Load all wad files
    • Read the necessary lump from the demo ex pwad
    • Unload all wad files
    • Unload the demo

    This PR changes it to instead read the demo footer in memory directly.

    There is another quirk of the startup procedure:

    • The port tries to guess the IWAD (defaults to doom2 if it finds it)
    • The demo footer can add an IWAD (-iwad DOOM.WAD for instance)
    • Now the wad file list has multiple iwads, and the autoload may load wads for the wrong iwad

    This PR marks obsoleted IWADs to be skipped, which causes them to be ignored for autoload as well as when loading the wad files themselves in W_Init.

    opened by kraflab 4

    FEATURE REQUEST: "Aggro-all cheat"

    Hi all!

    For map testing, I think it would be nice to have a cheat that changes the state of all currently idle demons to a wandering state. This would help make testing maps with teleport ambushes and such more efficient.


    enhancement 0.25 
    opened by srludicolo 4
  • Rewrite scaled time management

    Rewrite scaled time management

    The core of the code managing scaled time (game clock rate above or below 100) is the question "what tick are we on?" The scaled code asked this question based on real time and then scaled the result itself. This means that the answer to the question changed exactly as frequently as the real time result. So if we ran the game at 150% speed, then we'd have the following:

    | Elapsed Real Time | Real Time Tick | Scaled Time Tick | | --- | --- | --- | | 0 | 0 | 0 (0 * 1.5) | | 1/35 s | 1 | 1 (1 * 1.5) | | 2/35 s | 2 | 3 (2 * 1.5) |

    Unfortunately, we never render tick 2, because 1 scales to 1 and 2 scales to 3.

    While rates below 100% didn't have the missing tick problem, they still had the problem of the answer changing only as often as 1/35 of a second. If the game is run at 60% for instance, the time between ticks is inconsistent, as shown here:

    | Elapsed Real Time | Real Time Tick | Scaled Time Tick | | --- | --- | --- | | 0 | 0 | 0 (0 * 0.6) | | 1/35 s | 1 | 0 (1 * 0.6) | | 2/35 s | 2 | 1 (2 * 0.6) | | 3/35 s | 3 | 1 (3 * 0.6) | | 4/35 s | 4 | 2 (4 * 0.6) | | 5/35 s | 5 | 3 (5 * 0.6) |

    The new code scales time before answering the question "what tick are we on?"

    opened by kraflab 4
  • [Bug/Feature Request] Desynced Flat Animations from Vanilla / Unity Port

    [Bug/Feature Request] Desynced Flat Animations from Vanilla / Unity Port

    Hey DSDA Doom team,

    There's a certain effect that I'd like do have working in all ports, but it seems that DSDA Doom and PrBoom+ ports are not consistent with FLAT animations like Vanilla/Unity Port.

    I also found that Chocolate and Crispy Doom also didn't sync them correctly. I submitted a bug report (, in that I found the reason for the desync in those ports. It has to do with the ports not including FF_START in the lump order.

    Let me start by how flat animations work in Doom from my rigorous testing.

    • Flat animation timing is synced exactly every time you load up a map, regardless of map if you have a flat that changes from blue>red>yellow>green, when you load the map and it starts on blue once, it will always start on blue.
    • The timing of the flat animation is based upon on the lump order of the WAD. This means you can change the timing / first frame of the flat animation in the game, by moving where the first flat lump of the animation is. For example: say a WAD begins with FF_START, F_SKY1, and then SLIME01 with the first slime animation frames SLIME02-04 after. now say when you load the map, the level starts with the flat as blue, everytime you reload the map, it'll always be blue at the start. Now say you move SLIME01-SLIME04 above F_SKY1. When you load the map now it the flat that starts on map load is now green. Everytime you reload the map or any map in the mapset, the flat will always start on green.
    • The flat animation order is determined locally per wad archive. This means that the lump order nor flat animation doesn't change depending on if you load wads before or after the wad with the FLAT lumps.
    • Textures work in a similar way however instead of lump order, it is based on the order of textures in the TEXTURE1 lump. however they seem to be synced correctly in all ports, unlike flats at the moment.

    The map i'm testing is here (MAP25): 200 Line Massacre ^ The flat and textures currently sync up with Vanilla / Unity Port / Eternity Engine.

    I suggest this fix:

    Both Doom Retro and Woof have implemented this fix. It basically forces animations to start from the first frame (similar to how ZDoom ports deal with animated textures and flats).

    Here is a video showing the effect in the wad (This vid was made for the Chocolate Doom bug report):

    bug 0.25 
    opened by andrikpowell 3
  • feature request: zip support

    feature request: zip support

    I check the patch notes from time to time and 0.25 is shaping up to be a pretty major release... Would you consider adding zip archive support, too?

    I think it would be a pretty handy feature: Woof has it and being able to load the archive downloaded from dsda/idgames directly has pampered me a little bit lately..

    Thank you for all the work on this port!

    enhancement 0.26+ 
    opened by liPillON 2
  • Statusbar character not rendering properly in software with significant graphic offsets

    Statusbar character not rendering properly in software with significant graphic offsets

    If it helps, I've tested this in GZDoom, Eternity, Woof, Doom Retro and DSDA, and out of those the only ones with this issue were Woof, and DSDA (but only under software renderer). Note that i only specifically tested GZDoom's OpenGL and OpenGLES renderers, though.

    Attached below comparison screenshots between hardware and software in DSDA (pay attention to the %) + the wad where i discovered this issue doom266 doom267

    bug 0.25 
    opened by MattFright 0
Ryan Krafnick
Ryan Krafnick
Simple and efficient screen recording utility for Windows.

simple and efficient screen recording utility for Windows

Mārtiņš Možeiko 472 Nov 18, 2022
[WIP] A media playback library for Dart & Flutter apps on Windows & Linux. Based on libVLC & libVLC++.

dart_vlc Bringing power of VLC to Flutter & Dart apps on Windows & Linux Installation dependencies: ... dart_vlc: ^0.0.1 Documentation Create a ne

Hitesh Kumar Saini 397 Nov 18, 2022
Orbit is a multiplatform-focus graphical engine build on top of OpenGl, ImGui

Orbit Engine Orbit is a multiplatform-focus graphical engine build on top of OpenGl, ImGui and more... The development of the engine is documented via

Madsycode 11 Jul 3, 2021
2D mesh deformation interactive demo

2D mesh deformation interactive demo

Dmitry V. Sokolov 17 Apr 4, 2022
OpenGL Demo: Simulating Ocean Waves with FFT

OceanFFT Realistic ocean wave simulation, primarily based on J. Tessendorf's paper, using OpenGL compute shaders. Checkout the demo video here. In the

Achal Pandey 67 Nov 21, 2022
A PlayStation® Portable™ demo

Suicide Barbie by The Black Lotus A PlayStation® Portable™ demo Release History Source code (MIT licensed) released December 31st, 2020. OE/M33 'slim'

null 58 Oct 13, 2022
Playground for DirectX 11 / 12 simple graphics demo examples ...

graphicsdemoskeleton Playground for DirectX 11 / 12 simple graphics demo examples ... If anyone from Microsoft reads this: C99 support is broken in Di

Wolfgang Engel 46 Jan 13, 2022
A fork of Microsoft's D3D12 Raytracing Fallback Layer

D3D12 Raytracing Fallback Layer The D3D12 Raytracing Fallback Layer is a library that emulates the DirectX Raytracing (DXR) API on devices without nat

Phil Guo 9 Sep 13, 2022
Source Code for "Ray Tracing Gems: High-Quality and Real-Time Rendering with DXR and Other APIs" by Eric Haines and Tomas Akenine-Möller

Apress Source Code This repository accompanies Ray Tracing Gems: High-Quality and Real-Time Rendering with DXR and Other APIs by Eric Haines and Tomas

Apress 851 Nov 21, 2022
Horde3D is a small 3D rendering and animation engine. It is written in an effort to create an engine being as lightweight and conceptually clean as possible.

Horde3D Horde3D is a 3D rendering engine written in C++ with an effort being as lightweight and conceptually clean as possible. Horde3D requires a ful

Volker Vogelhuber 1.3k Nov 19, 2022
Lightweight and modular C++11 graphics middleware for games and data visualization

Magnum — Lightweight and modular C++11/C++14 graphics middleware for games and data visualization Looking for an open-source library that gives you gr

Vladimír Vondruš 4.3k Nov 28, 2022
ANSI C library for NURBS, B-Splines, and Bézier curves with interfaces for C++, C#, D, Go, Java, Lua, Octave, PHP, Python, R, and Ruby.

TinySpline TinySpline is a small, yet powerful library for interpolating, transforming, and querying arbitrary NURBS, B-Splines, and Bézier curves. Th

Marcel Steinbeck 876 Nov 26, 2022
Real-Time SLAM for Monocular, Stereo and RGB-D Cameras, with Loop Detection and Relocalization Capabilities

Real-Time SLAM for Monocular, Stereo and RGB-D Cameras, with Loop Detection and Relocalization Capabilities

Raul Mur-Artal 7.7k Nov 25, 2022
A C++/DirectX 11 implementation of "A Scalable and Production Ready Sky and Atmosphere Rendering Technique"

Atmosphere Renderer A C++/DirectX 11 implementation of "A Scalable and Production Ready Sky and Atmosphere Rendering Technique" Features interactive e

Z Guan 35 Nov 15, 2022
StereoKit is an easy-to-use open source mixed reality library for building HoloLens and VR applications with C# and OpenXR!

StereoKit is an easy-to-use open source mixed reality library for building HoloLens and VR applications with C# and OpenXR! Inspired by libraries like XNA and Processing, StereoKit is meant to be fun to use and easy to develop with, yet still quite capable of creating professional and business ready software.

Nick Klingensmith 716 Nov 19, 2022
FFVideo - an example FFmpeg lib, and wxWidgets Player with video filters and face detection

An example FFmpeg lib, and wxWidgets Player application with video filters and face detection, it is a no-audio video player intended for video experiments and developers learning how to code media applications.

Blake Senftner 20 Mar 26, 2022
Draco is a library for compressing and decompressing 3D geometric meshes and point clouds.

Draco is a library for compressing and decompressing 3D geometric meshes and point clouds. It is intended to improve the storage and transmission of 3D graphics.

Google 5.3k Nov 27, 2022
A multi core friendly rigid body physics and collision detection library suitable for games and VR applications.

A multi core friendly rigid body physics and collision detection library suitable for games and VR applications.

null 2.4k Nov 22, 2022
Brand new engine with new and QoL features. Grafex is Psych engine with some additions and Better graphics

Friday Night Funkin' - Graphex Engine Credits: Grafex Mod aka Psych Graphic Rework: Xale - Lead Coding, Artist PurpleSnake - Second Coder Psych Engine

Xale 3 Sep 5, 2022