UZDoom version history/prerelease
| Note: This page is for drafting release notes for upcoming versions of UZDoom. All listed features are subject to change. |
Commits since last release: https://github.com/UZDoom/UZDoom/compare/g4.14.2...trunk
4.14.3 (xx 11 2025)
UZDoom’s First Release!
Hello all, and welcome to UZDoom! You've no doubt seen our new look courtesy of Cardboard Marty. With 4.14.3 marks the first official release of the port, a smaller update designed to hold the masses over until 5.0. While we wish we could include a bunch of goodies with it, those will still need some time to bake in the oven. Rest assured, 5.0 development is still moving along smoothly and we’re now in “fix things” mode. For now, 4.14.3 will contain a bunch of bug fixes and security updates since we’re intentionally keeping it smaller in scope.
Why 4.14.3? Mainly because it makes things a lot easier to transition over since more stuff than you’d think relies on that version number. Speaking of, if you’re coming over from GZDoom, we’ve got some instructions to let you transfer over your saves and configuration files as smoothly as possible.
Transferring From GZDoom
For configuration files, locate the folder containing it and rename both the folder and configuration file from gzdoom to uzdoom. If you’re using a portable configuration file, rename it from gzdoom_portable.ini to uzdoom_portable.ini and place it in your UZDoom folder. If you were using a custom configuration file, UZDoom will load it as-is.
- On Windows, this will be located in your Documents directory under My Games.
- On Linux, this will be located in
~/.config - On Mac, this will be located in your Application Support directory.
For saves, locate the folder containing them and rename it from gzdoom to uzdoom. If you were already using a custom save location, transferring your configuration file will automatically handle this. Note: Only saves from GZDoom 4.0.0 and greater can be transferred.
- On Windows, this will be located in your Saved Games directory.
- On Linux, see below
- On Mac, this will be located in your Documents directory.
Linux Path Changes
The location UZDoom searches for files has changed to more closely match the freedesktop specification.
- Text configs have been moved to
$XDG_CONFIG_HOME/uzdoom(~/.config/uzdoomby default).~/.config/gzdoom/gzdoom.ini→~/.config/uzdoom/uzdoom.ini~/.config/gzdoom/autoexec.ini→~/.config/uzdoom/autoexec.ini
- Game cache has been moved to
$XDG_CACHE_HOME/uzdoom(~/.cache/uzdoomby default).~/.config/zdoom/cache→~/.cache/uzdoom
- All other game data (eg wads, skins, saves) has been moved to
$XDG_CONFIG_HOME/games/uzdoom(~/.local/share/games/uzdoomby default).~/.config/gzdoom/DOOM.WAD→~/.local/share/games/uzdoom/DOOM.WAD~/.config/gzdoom/savegames→~/.local/share/games/uzdoom/savegames~/.config/gzdoom/skins→~/.local/share/games/uzdoom/skins
In practice, you want to:
- Create folder
~/.local/share/games/uzdoom, and move everything from~/.config/gzdoomexceptgzdoom.iniandautoexec.iniinto it. - Rename
gzdoom.initouzdoom.ini. - Rename
~/.config/gzdoomto~/.config/uzdoom.
Defaults
Defaults have long been a contentious issue in the ZDoom community, with some feeling it strays too far from what makes vanilla shine while others enjoy the visual flare compared to classical ports. We can understand both sides of this, and while we want to balance it as best we can, we ultimately felt that having so many extra graphical options on by default was too much. As such, we won’t be removing any of these features but instead will be going for an opt-in approach to make it easier to manage for first-time users. We feel these changes can help give better visual cohesion with content designed for vanilla while also balancing the legacy of maps and mods that relied on them. One of UZDoom’s biggest strengths, after all, is its ability to play almost anything thrown at it.
To go deeper into the why, we’d like to give some core philosophies around our decisions for how we chose defaults:
- Out of the box, Doom should reasonably resemble how it originally looked. There are a large number of reasons someone would want to use UZDoom including its powerful scripting capabilities, its accessibility options, and the fact it can play just about darn near anything without hassle. Forcing users into the menu to achieve this is not the correct way to go about it, so only select effects will be enabled that we feel don’t distract heavily from its original vision. For the fancier effects, we’ve tried our best to make them more consistent with Doom’s overall aesthetic so that even when used, they don’t appear to clash.
- Modernization should also be done where reasonable. The reality is that we aren’t playing Doom in software on CRTs anymore but with 3D acceleration and modern monitors. This introduces some stark differences, so those should be accounted for as best as possible. For this reason, enhancements that don’t take away from the aesthetic like anisotropic filtering and distance-based filtering have been left on to help clean up the image. We also understand we have a legacy of maps designed for GZDoom to account for, and not all user options are controllable by mappers, so certain things like the software light banding have been left off to prevent breaking visual cohesion with these.
- Getting a more vanilla experience should be made easier. Having to constantly go into the menu or mess with console variables isn’t fun, and things should be made more streamlined. For this reason we’re starting with a new tweak: the automap now has a Default color mode to automatically match the current game’s art style. In the future the Auto modes for ZDoom’s translucency will also be enhanced to allow better fine tuning for balancing vanilla visuals with mods expecting transparency. We’ll be looking into ways to improve this on the gameplay front as well since ZDoom introduced some differences that we know can break things like combat encounters in unexpected ways. While we have plans to fix up the menu, the best solution is for users to not feel like they need to constantly fall back on it at all.
Changes From GZDoom 4.14.2
- Multiple security fixes. This update is being deemed as critical. It’s highly recommended to upgrade to it.
- Added new game-based cursors (courtesy of Nash Muhandes). These are much more cursor-y, and very good at pointing and clicking on things.
- Changed defaults to be more balanced between vanilla and modern.
- Lowered the master volume so it's less likely to blow out the system audio and become muffled (especially with things like the Plasma Rifle firing sound).
- Added the Default option for automap colors, allowing the automap to choose based on which game is being played.
- Added a Display option to control the render style of rocket explosions (these now default to additive instead of translucent since we felt it visually fit the other projectiles better).
- Made the mouse less sensitive in menus when it’s been dormant for a short period. This should help reduce it accidentally shifting the selected option randomly while idle.
- Added the powerup_fade_scalar cvar for controlling the strength of the fade on power ups (e.g. the Radiation Suit’s green tint).
- Added support for the BUSY script flag for ACS.
- Fixed audio not muting properly when the game is unfocused, causing it to build up and play back explosively in certain cases (especially for multiplayer games).
- Fixed the master volume not properly applying to music when the game starts up.
- Fixed weapon bobbing not disabling correctly when manually set to 0 via cvar.
- Fixed the wrong music being played during Strife’s bad endings.
- Fixed the opening subtitle for Strife not displaying.
- Fixed the Iron Lich’s whirlwind blaming the wrong target for its damage dealt.
- Fixed the textured automap being broken.
- Fixed mid textures clipping incorrectly when skewed.
- Fixed a crash with VisualThinkers when loading from a save.
- Fixed IQM models with decoupled animations not displaying correctly if spawned without an animation.
- Fixed gun flashes from MBF21 weapons not displaying correctly.
- Fixed a bug with CreateTossable where items wouldn’t be removed if their amount was 0.
- Fixed Quat’s Conjugate and Inverse functions throwing a JIT error.
- Fixed the BrokenLines class being unserializable.
- Fixed level data fields e.g. Sector not being cleared properly when transitioning between levels.
Known Issues
- Texture filtering will still apply on Intel graphics cards when mipmapping is enabled, even with the mode set to one of the non-standard None options. This can be fixed by either setting the texture filtering mode to standard None or setting anisotropic filtering to Off. For the menu, setting the hw_2dmip cvar to false will fix it. Currently being investigated.
5.0 (xx xx 202x)
After a nearly year-long development cycle and multiple internal reworks, UZDoom 5.0 has finally arrived. This includes bone manipulations for IQM models, Actor uniforms for shaders, significantly improved controller support (including haptic feedback), the overhauled network code, ZScript debugger support, and much more. A brand new theme has also been applied to the launcher to bring it closer to its original color scheme.
General
- Multiple security fixes. This update is being deemed as critical. If you’re using a version older than 5.0, it’s highly recommended you update to the latest.
- Controller support has been improved significantly. Missing buttons e.g. paddles can now be assigned properly and analog stick curves have been tweaked to feel much more natural. Binds for these have been cleared as a result in order to update all configurations to the new handling.
- Added haptic feedback for controllers.
- Added a bind for deleting saves with controllers.
- Added tooltips to menus. These will give better explanations of what each option does with hover tooltips being used to further explain the specifics of each value when necessary.
- Various improvements to the option menu scrolling behavior.
- Optimized dynamic light linking. This should help moving dynamic lights from e.g. projectiles perform better in maps with complex level geometry.
- When auto-starting a game via e.g. -skill #, UZDoom will now use the first map in the first episode found. This should make starting games with unorthodox map setups more streamlined.
- Added support for Heretic + Hexen (2025).
- Added cl_debugprediction cvar for testing latency within singleplayer games. The value is the number of ticks of lag to emulate.
- Added gl_weapon_purelightlevel cvar to make PSprites match their surrounding light level instead of always being brighter.
- Added the -episode # command-line argument for more easily starting from episodes rather than needing to know the map name.
- Added RecursivePath= to the config for IWAD and file look up that allows all subfolders in the given directory to be searched as well. This won’t work for subfolders that act as files.
- Exposed controls for Heretic’s, Hexen’s, and Strife’s items.
- turbo is now considered a cheat.
- Added support for Boom's multiple help screens.
- Minor fixes for MBF21.
- Minor fixes for id24.
- Fixed the “no infighting” map flag not working.
- Fixed the SMF_PRECISE flag in A_SeekerMissile not tracking crouching players properly.
- Fixed certain fonts rendering incorrectly in menus compared to the vanilla Doom graphics.
- Fixed a crash with the setinv console command.
- Fixed a crash with opening the scoreboard in niche scenarios.
- Fixed a potential crash when saving.
Launcher
- Reworked the theme to more closely match the original launcher window.
- Added an option to disable loading support WADs e.g. the Legacy of Rust assets if you have Doom + Doom II installed.
- Added a multiplayer tab for hosting and joining net games.
- Additional parameters will now be remembered.
- Holding shift will now also stop mods from auto-launching games.
Lumps
MAPINFO
- Added Skymist to map blocks. This allows setting a transparent overlay texture on skies that acts as a layer of fog. Supports animated textures and skyboxes.
- Added ThickFogDistance and ThickFogMultiplier to map blocks for additive fog. ThickFogDistance controls what range it starts and ThickFogMultiplier controls the density of the fog.
- Added UsePauseString to the gameinfo block. Allows displaying the PAUSED text as a string instead of a graphic.
MENUDEF
- Added DoubleTapControl and DoubleControl option menu settings. DoubleTapControl bindings allow for double tapping a key to execute an action while DoubleControl bindings allow for both a single tap and double tap action to be bound to a key at the same time.
- Added Tooltip keyword. This can be used with both list and option menus and binds a description to the widget defined before it. If a widget has a tooltip, it will be displayed at the bottom of the menu when selected. In addition, Option Values now accept a third optional parameter, a description, that is displayed next to the option when it's hovered over for a second. This allows for explanations of complex options that can't be handled by the basic tooltip.
MODELDEF
- Added ViewModelFOV. When a model is being used as a PSprite, this will allow for directly setting its field of view. Positive values are fixed FOVs while negative values act as a scalar from the default 90 FOV.
ACS
- Added support for CLIENTSIDE scripts. If the script has either no activator or is the local player, it will run client-side. Client-side scripts from other players are ignored. If the activator of the script is a non-player, it will run but not client-side.
ZScript
- DAP debug servers will now work with ZScript. This can be used with e.g. VisualStudio Code in order to properly debug ZScript via stepping, pausing, etc.
- Added Behaviors. These pseudo-interfaces are meant to replace Inventory tokens, have a much simpler API, and can only have one of a given type at a time making it easier to manage. BehaviorIterators can be used to iterate across either all Behaviors on a given Actor or all Behaviors of a given type currently in the game. All Behaviors are guaranteed to have an Actor that owns them, allowing them to be passed around as a handle if behavior-based typing is needed.
- Added client-side Thinkers. These will run locally even while the game world is paused. They can be spawned via LevelLocals’ SpawnClientSideThinker function or by marking Actors with +CLIENTSIDE. These have heavy restrictions on what they can interact with as other clients in net games will not know about them, so caution should be used when modifying the world directly from them. Objects can be checked if they're client-side via the IsClientSide function. Note: These have their own Actor, Behavior, and Thinker iterators. A parameter to get client-side Thinkers has been provided for these when creating them. They will not appear in the blockmap or sector thing lists.
- Reworked the level traveling system. All Actors can now be set to travel between levels similar to the player via their AddToTravellingList function. Note that this can only be done once traveling has been initiated. The Travelling and PostTravelled virtual functions have been moved to all Thinkers as a result.
- Removed the ability to manually assign Actors to the STAT_STATIC statnum and all Thinkers to the STAT_TRAVELLING statnum.
- const functions will now properly make self constant. To get the previous behavior back, use unsafe(const).
- Added unsafe(clearscope) scope for fields. This can be used to make fields that seamlessly interact between play and ui scopes. Note: This has a high chance to desync multiplayer, so use with caution.
- Classes and structs can now be marked as deprecated.
- The HUD will now tick again while the world is paused.
- Added Actor uniforms. These allow for shaders to access Actor-specific fields to control them, similar to global uniforms.
- Added +INTERPOLATESCALE and +INTERPOLATEALPHA flags to Actors.
- Actors will now track how they were spawned in their SpawnFlags field. MTF_MAPTHING is for Actors placed in the map and MTF_CONSOLETHING is for Actors spawned via the console. All other Actors are considered manual spawns.
- Added fadeoutstep parameter to A_SpawnParticleEx, allowing particles to first fade in when spawned and then back out. This requires either SPF_FADE_IN_OUT or SPF_FADE_IN_HOLD_OUT to be set.
- Added WorldPaused function to LevelLocals for checking if the world is currently considered paused (menu open, console down, etc.).
- Added ChangeSkyMist function to LevelLocals for changing the skymist texture.
- Added SetSkyFog and SetThickFog functions to LevelLocals for controlling fog levels.
- Added SpawnThinker and SpawnClientSideThinker functions to LevelLocals, allowing Thinkers to be created with a default stat num.
- Added RemoveUUIDSaveSlots function to SavegameManager. This allows all saves related to the current game session to be deleted at once.
- Added GetNextPlayer and GetNextPlayerNumber functions to PlayerInfo. Allows iterating through players more easily.
- Added GetDeltaTime and GetPhysicsTimeStep functions. current in GetDeltaTime can be used to get exact measurements. Both return time in seconds.
- Added GetStatNum function to Thinkers.
- Added GetSelfObituary virtual function for overriding self inflicted death obituaries.
- Added OnRevive virtual function for performing actions on Actors when they’re guaranteed to have been revived.
- Added DepleteBy virtual function for Inventory items. This is called when attempting to remove an amount of an item from the inventory.
- Added OnSelect and OnDeselect virtual functions for Weapons when they’re selected and deselected respectively.
- Exported CloseDialog for StrifeDialogReplys.
- Exported EpisodeInfo and SkillInfo structs. This will make it possible to create custom selection menus for these.
- Exported IsInt and IsDouble functions for strings.
- Exported the HUD’s Draw virtual function in its entirety, making full overrides possible.
- Exported the scoreboard drawing logic to allow creating custom ones.
- Exported ReactToDamage virtual for overriding pain logic in Actors. Returns true or false based on whether or not the Actor entered a pain state.
- Fixed Pre/PostMorph virtual functions being called twice for monsters.
IQM Bone Manipulation
- ?
Multiplayer
While UZDoom will continue rely on deterministic gameplay for the foreseeable future, significant improvements to its networking stability have been made and Packet-Server, a long forgotten alternative networking mode, has been fixed and is now the default. This will make joining net games simpler and act more as expected where the host will have no delay and everyone else’s delay will match their latency. Individual clients that desync in this mode will only be impacted on their end meaning other players can continue to play uninterrupted.
- Increased the max player count to 64.
- Overhauled the net game lobby. Everyone will now be able to see who has joined and hosts will be able to better manage guests. Hosts can now preemptively start the game instead of needing to wait for the lobby to fill fully, allowing for arbitrary max player counts. Note: Bans are IP-based and only temporary.
- Reworked save file management for net games. These will now have their own subfolder, NetGame, in order to prevent accidentally overriding singleplayer saves. Files saved also use their given name instead of the save## format to make them easier to load. Only hosts can save by default now (can be changed via the net_limitsaves cvar).
- Networked the host’s -loadgame argument. This will still require everyone to have the save file with its given name, but should make reopening a playthrough easier since now only the host needs to specify it. Guests can still manually specify -loadgame to override this should they need a different file name.
- Players can now only connect if they’re using the same engine version.
- Significant improvements to connect rejection messages.
- Auto loaded files and support WADs are now disabled when playing online. These must always be specified manually.
- Re-added intermission readying and unreadying. Alternative types of readying systems have been added including vote-based, host only, or anyone. If voting, a timer has been added when enough players are ready to force continue the game.
- Added new options for the chat including what messages to allow and disabling of certain properties e.g. the chat sound.
- Added mute, muteall, unmute, unmuteall, and listmuted console commands. Messages from muted players will be ignored. mute and unmute can take multiple player numbers as arguments.
- Hosts can now control who can pause the game including disabling it entirely.
- Hosts can now control who’s able to initiate conversations with NPCs.
- Renamed settings controllers console commands to addsettingscontrollers, removesettingscontrollers, removeallsettingscontrollers, and listsettingscontrollers. addsettingscontrollers and removesettingscontrollers can now take multiple player numbers as arguments.
- Added a cool down for repeatable actions e.g. opening doors.
- Added the -coop command-line argument for more easily setting up co-op friendly game sessions.
- More items have been marked with +WEAPONSPAWN to remove things like added ammo when playing with multiplayer weapons disabled.
- Exposed controls for spy cam previous and clearing the spy cam.
- Fixed the inventory bar closing faster than intended under high latencies.
- Fixed certain things not predicting correctly during packet loss. This should help alleviate issues like interpolation not resetting and the camera not bobbing correctly during poor net conditions.
- Fixed an issue with player data assignment when loading a save.
- Fixed +playerclass not being respected for new players joining an existing save.
- Fixed various instabilities with prediction that could lead to crashes.
Known Issues
- Players disconnecting in net games can cause desyncs under poor net conditions. Currently being worked on.
- Rare crashes can still occur from client-side prediction. Currently being worked on.
- When starting a net game, the lobby window will close but the game will not be given focus, causing it to appear black and like nothing happened. Can be fixed by tabbing back into the game. Currently being investigated.
- Demos recorded in 5.0 can desync. Currently being investigated.