Latest UZDoom Changes
Latest 50 commits
Unofficial development builds at DRD Team
28-Mar-2026 (Saturday) at 00:49:28 GMT-0700 by theshadsy
Fixed underflow in P_RadiusAttack
This fixes #1081. The underflow occurred when converting points to an integer, then multiplying that by a potentially large number.
Initially, I thought the solution to this issue would be to clamp this calculation around INT_MIN and INT_MAX. However, the more I thought about it... why was points being converted to an integer at all? Was that really necessary? I decided to dig deep into the code's history, and I actually found some good answers. Believe it or not, this bug was identified 10 years ago (!), fixed, and then accidentally broken again.
Wrapping points in an int() function was a hacky solution introduced in 2016 to prevent fractional damage values been 0.0–1.0 from being applied. https://github.com/UZDoom/UZDoom/commit/1011e26eb98393a8b5e582df4e1d58d70012e5ee
Just a few weeks later, this was identified as a potential source of underflows/overflows, and the int() function was itself wrapped in a double() function. https://github.com/UZDoom/UZDoom/commit/ba7260c1761c2f6846235bbc96650ab4eb728baa
Around a year later, the "is damage > 0" calculation was split out into its own variable called check. However, the new implementation did not wrap int(points) in a double() function. As a result, the over/underflow bug was accidentally reintroduced during calculation. https://github.com/UZDoom/UZDoom/commit/26144340b804521c1d069aece5aa30f95eddf1ce
In the interest of keeping backwards compatibility and maintaining the original intent of this code, the easiest solution is simply to wrap int(points) in a double() function again. This returns the code to its functional state in April 2016 when the bug was first identified and addressed.
There are probably better ways to prevent fractional damage between 0.0–1.0 from being applied, but that's outside the scope of just getting this back to where it originally was.
26-Mar-2026 (Thursday) at 20:23:56 GMT+0400 by DyNaM1Kk
Add colors parameter to NameKeys
09-Apr-2026 (Thursday) at 16:50:01 GMT-0400 by Marcus Minhorst
Enable lights by default, until we can add a graphics preset menu
08-Apr-2026 (Wednesday) at 11:40:15 GMT+0800 by dwing
Fix scrolling to the selected item for GamesList and LangList in launcher (#1083)
06-Apr-2026 (Monday) at 19:27:53 GMT-0400 by Marcus Minhorst
Cache can now be shared between ports
07-Apr-2026 (Tuesday) at 22:48:28 GMT-0400 by Marcus Minhorst
Translation sync (#1243)
-
Add missing translations
-
Removed translation in order to re-add it
-
Squashed 'libraries/Translation/' content from commit a402403bdf
git-subtree-dir: libraries/Translation git-subtree-split: a402403bdfcf7c12f7a3bef16c38fad24cba469d
05-Apr-2026 (Sunday) at 12:19:44 GMT-0400 by Marcus Minhorst
Fix localized texture references to reflect new language system
04-Apr-2026 (Saturday) at 19:44:52 GMT-0400 by Marcus Minhorst
Fix some warnings
03-Apr-2026 (Friday) at 14:25:47 GMT-0400 by Marcus Minhorst
Un-nest AddLocalizedVariants
03-Apr-2026 (Friday) at 14:00:44 GMT-0400 by Marcus Minhorst
Fix reference to old default stringtable id
02-Apr-2026 (Thursday) at 18:16:25 GMT-0400 by Marcus Minhorst
Use language script
02-Apr-2026 (Thursday) at 18:30:00 GMT-0400 by Marcus Minhorst
Store and expose script
02-Apr-2026 (Thursday) at 18:29:47 GMT-0400 by Marcus Minhorst
Use FName directly, instead of storing pointers
02-Apr-2026 (Thursday) at 14:10:12 GMT+0800 by dwing
Fix oversights in stringtable refactor
28-Mar-2026 (Saturday) at 16:45:40 GMT-0300 by RageSpark
Add Compat Flag to Doom (Strict), Boom (Strict), MBF21 (Strict) compatmodes
28-Mar-2026 (Saturday) at 15:10:56 GMT-0300 by RageSpark
Emulate Mikoportals Compatibility flag
Fixes #642, tested and fully working with the examples at the mentioned issue.
07-Apr-2026 (Tuesday) at 19:57:43 GMT+0800 by dwing
Fix missing geometry update of LauncherWindow when language changed
07-Apr-2026 (Tuesday) at 14:42:05 GMT+0800 by dwing
SetMaxDisplayItems from 2 to 4 for LoadList in Launcher
05-Apr-2026 (Sunday) at 18:50:43 GMT-0500 by Xaser Acheron
revert changes to auto-apply WALLF_BLOCKRENDERING to 1-sided lines; just do two checks instead
Revert "patch old savegames on load to add WALLF_BLOCKRENDERING to 1-sided lines"
This reverts commit 20da27478da28650b65fd4f57f773fa529ebd966.
Revert "apply WALLF_BLOCKRENDERING to all 1-sided lines in maploader & collapse the two checks in HWDrawInfo::AddLine into one"
This reverts commit ee94a6ecac3598b0337c9f2203759e1352e9f75e.
update comment
08-Nov-2025 (Saturday) at 03:24:58 GMT-0600 by Xaser Acheron
patch old savegames on load to add WALLF_BLOCKRENDERING to 1-sided lines
08-Nov-2025 (Saturday) at 03:24:08 GMT-0600 by Xaser Acheron
apply WALLF_BLOCKRENDERING to all 1-sided lines in maploader & collapse the two checks in HWDrawInfo::AddLine into one
08-Nov-2025 (Saturday) at 00:57:52 GMT-0600 by Xaser Acheron
add "blockrendering" sidedef flag; instructs the renderer to clip the world beyond (like a 1-sided line does), but only for that side.
05-Apr-2026 (Sunday) at 17:19:08 GMT-0400 by Marcus Minhorst
Expose git distance to engine
05-Apr-2026 (Sunday) at 14:56:32 GMT-0400 by Marcus Minhorst
Add release data
05-Apr-2026 (Sunday) at 14:04:03 GMT-0400 by Marcus Minhorst
Unpack dmg files
05-Apr-2026 (Sunday) at 12:50:50 GMT-0400 by Marcus Minhorst
Disable intel mac builds due to them hanging often
05-Apr-2026 (Sunday) at 13:36:39 GMT-0400 by Leah Anderson
Capitalize application name
Co-authored-by: Marcus Minhorst marcus.minhorst@gmail.com
02-Apr-2026 (Thursday) at 09:29:09 GMT-0600 by Leah Anderson
no license?
31-Mar-2026 (Tuesday) at 09:33:46 GMT-0600 by Leah Anderson
Use DMG for packaging macOS builds
04-Apr-2026 (Saturday) at 12:49:04 GMT-0300 by Ricardo Luís Vaz Silva
intel macos builds are bugged, disable them on experimental for now while things aren't fixed on trunk
03-Apr-2026 (Friday) at 19:00:44 GMT-0700 by River-Salmon
fix sliders not displaying with Japanese language
03-Apr-2026 (Friday) at 18:49:21 GMT-0700 by River-Salmon
Fix user's BigTextFont choice not actually being used for the main menu
03-Apr-2026 (Friday) at 17:44:26 GMT-0700 by River-Salmon
clarified font requirements in the error message
03-Apr-2026 (Friday) at 17:40:17 GMT-0700 by River-Salmon
Font at 2x atlas size by default
06-Dec-2025 (Saturday) at 18:47:52 GMT-0700 by Dileep V. Reddy
Covering FF_THINFLOOR or 'ignore bottom height' flag on 3D floors.
17-Nov-2025 (Monday) at 09:51:51 GMT-0700 by Dileep V. Reddy
Added entering3DLiquid bool field to FTraceResults for use with callbacks triggered by the TRACE_3DLiquidcallback flag.
17-Nov-2025 (Monday) at 07:51:26 GMT-0700 by Dileep V. Reddy
Added a TRACE_3DLiquidCallback flag to run callback when a 3DFloor liquid-surface crossing occurs. HitType will be TRACE_HitFloor for top crossing, TRACE_HitCeiling for bottom crossing, and TRACE_HitWall for side-wall crossing. The return from callback will be ignored and assumed to be TRACE_Continue, just like for TRACE_ReportPortals.
06-Nov-2025 (Thursday) at 16:21:48 GMT-0700 by Dileep V. Reddy
Changed struct to lambda function as per KCat's suggestion. Addressed an edge case.
28-Oct-2025 (Tuesday) at 18:45:31 GMT-0600 by Dileep V. Reddy
Removed bad attempt at Trace Callback for crossing 3D liquid top surface.
28-Oct-2025 (Tuesday) at 16:05:17 GMT-0600 by Dileep V. Reddy
Internally (minor) refractored trace code. Next() now really returns next intercept. Fixed trace behavior when crossing flats without crossing lines, especially through sector portals. Properly propulate Results->ffloor when hitting 3D-floor flat. Crossing liquid top surfaces only populates Results->Crossing[3D]Water when intercept is within sector. Also fixed OoB usage of trace (which is not exposed to zscript).
30-Mar-2026 (Monday) at 16:07:29 GMT-0700 by River-Salmon
improve text alignment / fix misalignment at 4x
30-Mar-2026 (Monday) at 15:36:15 GMT-0700 by River-Salmon
Fixed SymbolsFont not being put in the Fonts linked list (fixes symbols font not having color translations)
28-Mar-2026 (Saturday) at 14:58:53 GMT-0700 by River-Salmon
starter fix for sliders not appearing:
-SymbolsFont is now a duplicate of the ConFont, but with post fixup. -TODO: the color theming for the sliders is not working
28-Mar-2026 (Saturday) at 14:17:11 GMT-0700 by River-Salmon
remove unused text file
28-Mar-2026 (Saturday) at 02:01:08 GMT-0300 by Ricardo Luís Vaz Silva
Add ttf PR to experimental branch
-
Discover ttf files in wadsrc
-
Add Trex to build pipeline
-
FFont can link back to a Trex Atlas
-
Generate Atlas and copy to FGameTexture
-
Basic rendering of shaped text:
-uses trex to line up glyphs and render them -FFont uses Trex's spacing information that makes alignment stuff mostly "just work" -added a very important comment to indicate that the src settings for texture rects are in 0-1 space
-
use LCD rendering mode for dynamic text instead
-
fix vertical glyph alignment
-
Add supersample and fix left align
-
cleanup + horizontal alignment improvements
-
improved vertical alignment in menu stacks
-
code clarification
-
fix vertical alignment in notify buffer when using dynamic font
-
use << as stopgap instead of left arrow symbol since fonts usually support <<
-
FontHeight now accounts for supersample scale
-
Dynamic Font Fallback
When we cannot render a string using the provided font, fallback to Noto Sans.
- Dynamic Fallbacks are per-font based on language
-The desired fallback font is selected when Language is changed -IBM Plex fonts are used for fallbacks as they are stylistically not too far from Lexend Deca and have good character support.
-
Remove noto sans, use IBM plex for misc fallback
-
text shaping improvement for dynamic fonts:
-virtual scale is ignored when using Dynamic Fonts -text is still really really small.. to be continued
-
minor clarifying cleanup
-
made the default fallback ibm plex sans since we removed noto
-
more misc clarifying cleanup
-
Finally cracked making the vertical offset right... I think
-
add SetTextureParmsSubrect:
-This is meant to really properly handle the text scaling. It takes into account the source subrect of the texture when determining virtual coordinates. -Appears to work on the non-Normal resolution scaling modes. -doesn't seem to work in the big text menus. -allows for the removal of many hacks.
-
minor safety check in GetCharWidth
-
re-use the TextShaper for each font
before we were constructing a new TextShaper for each text draw. Now we re-use the existing one. This is a considerable performance improvement when shaped text is on screen
-
use < instead of << as the selection arrow since it fits better
-
directly override NewSmallFont when language changes
This is potentially a temporary solution to JP and KO, in those cases we know that the primary font probably cannot display the necessary glyphs. In that case, we should directly switch over to the JP and KO fonts to get the correct text shaping in menus.
-
reuse textshaper for font during StringWidth()
-
fix glyphs rendering at the wrong size in "normal" res scaling mode
-
fixed big main menu text not rendering with ui_generic or asian languages
-
minor safety check in StringWidth()
-
strip color tags when drawing dynamic text
TODO: actually respect the color tags
-
Use colortags to change text color. Does not yet strip all the relevant chars
-
Inline color tags now actually change text color
-
Color Tag sequences respected + skipped
in other words, color tag behavior should now work as intended.
-
"fixed" mouse selection for option menu list items
-
add simdutf lib
-
Intermediate String Representation + KosugiMaru + Settings menu:
Big bundle of related changes here. -Text rendering now converts input strings to an intermediate representation using utf32. This makes parsing straightforward and enabled named color tags to work properly with asian languages. -Added KosugiMaru as a fallback JP font. -Added a settings menu where you can specify which fonts and fallback fonts you'd like to use. Right now the options are defined in menudef.txt
-
Add dropshadow
-
support parsing the +-!* color tags
-
Properly grab fallback font at startup
-
Normalize shadow offset based on size
-
fix drop shadow positioning on "Normal" scaling mode
-
apply user's font override setting on startup
-
dynamic text rendering support for Intermission
-
more fonts
-
use red triangle arrow as selector
-
dynamic text accounts for patchscale
makes DTA_ScaleX etc work
- support dynamic fonts in fullscreen hud
althud not yet supported. vanillla statusbar will likely not be supported
-
"Don't Override" setting rolls back to VGA menu font
-
- tag reverts text to white; fixed color tags not always terminating
Multiple color tags in the same substring were stacking up, causing only the first color to work.
-
match normal behavior for + and -
-
Font options menu now also in Accessibility menu
-
User Font Choice:
-Adds a semantic "Small Text" font choice, which is NOT a direct override of NewSmallFont. Instead, code and scripts use FFont::GetSmallTextFont() to grab the font the user chose. This allows semantic substitution without hacking away at pointers. The parameter for GetSmallTextFont() is the font to use as the default if the user has not provided a preference. -added a few more fonts. -updated lots of code and script to use GetSmallTextFont() -exposed GetSmallTextFont() to script.
-
Allow Font Choice for Title and Description text
-
add Font Choice for Console Font
-
remove Noto Sans KR
-
add Atkinson Hyperlegible
-
use appropriate RenderStyle for text
drop shadows are now also drawn via the shadow render style.
- more Font configurability:
-cvar and option for Supersample scale -BigText option -SmallText user option used in more places, including hud messages -Description Font used in more places -Console font integrated in more places
-
guard against using palette translation on dynamic fonts
-
removed unused line
-
Console Fonts:
-Only allow Hack Bold or 'Don't override' for the console font choice. -Use the user-selected font for the command buffer.
- remove TODO comments re: dynamic font discovery
I'm likely not going to support dynamically populating the list with fonts since there is too much human intervention required to make sure fonts are used in a compatible way.
-
Offset selector position based on font height
-
generic_ui cvar makes skill and episode menu use text
-
generic_ui makes main menu use text
-
accessor: GetActiveLanguage()
-
Asian language improvements:
-user choice available for JP and KO fonts -the font getters now use these language font choices, fixing incorrect text shaping (because we were previously relying on fallback to draw asian glyphs)
-
fix missing ']' and cursor for console when using dynamic font
-
locally distribute Trex instead of using FetchContent
-
remove outdated comment
-
use grayscale single-channel texture to save memory
-
add stb_image_write to common and use that for trex...
...rather than using FetchContent to retrieve the whole STB over the net.
-
remove fetchcontent for stb in trex
-
add FreeType and Harfbuzz inline (no FetchContent), use these for Trex
-
user font choice for Cyrillic
-
fix fallback strings being split into every character separately
-
fixed incorrect defaults for CYR font choice
-
replace Atkinson Hyperlegible with Lexica Ultralegible, which supports Esperanto
-
revert to LCD text render mode:
-monochrome was causing weird visual issues -It was not making the kinds of transformative memory saving we would have needed -this looks better
- Proper StringWidth() measurement when fallbacks kick in:
-StringWidth now uses the full-fat ParseIntoIntermediateDrawStrings() in order to get proper measurements even when some glyphs have to be substituted. Currently visible when Kreon Bold has to fall back to using Hack Bold for Esperanto symbols.
-
Use text shaping to properly place commandbuffer cursor when using a dynamic font
-
add IBM Plex Serif to replace Kreon Bold:
-Kreon did not properly support Esperanto glyphs. -IBM Plex Serif is consistent with sizing with Plex Sans, so it's a natural choice for the serif option. -renamed the Plex files (while preserving reserved names) to avoid naming conflicts with UZDoom's font identifiers (UZDoom generates font names from the first few characters of the ttf file) -Fixed an incorrect identifier for Hack Bold
- remove Lexend Deca:
-it did not support the 'ff' ligature. -we should cut down on font choices a little in order to save memory. Users still have the Plex Sans and Lexica Ultralegible sans serif options.
- misc cleanup of DrawText:
-removed RedIsAlpha flag to restore LCD subpixel behavior -removed some red herring flags that were being set -included a header that was being transitively included
-
exposed IsValidDynamicFont() to script
-
First pass at using dynamic fonts in Stat Screen
-
center-vertical align arrow in MessageBox when using dynamic fonts
Fixes issue with the selection arrow looking way off target
- automap timer positioned using StringWidth()
Fixes issue where timer clips off the right side of the screen when using dynamic fonts.
- strip color tags before checking CanPrint() with dynamic fonts
since the color tags aren't valid unicode codepoints, CanPrint() was returning false because these non-existent codepoints weren't in the atlas. Fixes automap map name not using dynamic text where preferred.
- Fixed notify buffer text too small:
-removed leftover hack that forced 1 scale on notify buffer text when using dynamic fonts
- minor optimization: use codepoints directly with ShapeUnicode()...
Avoids copying all the char32_t into a vector and then converting them into codepoints and calling ShapeUnicode() anyway.
- better fallback font behavior:
Fallback font is now dynamically determined based on input character, allowing us to properly substitute in asian fonts where necessary. Ex: If you change your language while playing, you can have multiple languages in the command console in the same time. This fixes being able to render that properly.
- allow mipmap on font atlases
mitigates scaling artifacts considerably
- use single-channel font atlas textures
-Fixed rendering artifacts from the single channel textures by properly using black background fill. -was able to measure that the single channel atlas textures are substantially smaller on the heap.
- Adjust font height to make them roughly the same size on screen:
-use ttf font metrics to adjust the size of the glyphs in the generated atlas, which gives you better consistency in sizing between different fonts being rendered side-by-side -throws an error if you use something other than Unicode ttf -uses FreeType directly to get these metrics -baselines are based on Plex
- use std::runtime_error instead of std::exception for unicode error message
Should fix mac and linux
-
fix "cannot call ctor directly" re: font loading
-
Remove now-unused DynamicFallback member and related funcs:
You should now be using the dynamic fallback finder that uses a char32.
-
actual loc keys for font remapping + add missing CYR cvars
-
allow mapping of BigTextFont in the other writing systems
-
Chat input uses user font choice for Console
-
fixed dynamic fonts not respecting specified font color:
-This does not affect color tags within strings, but instead fixes text calls where they are specifying what color the text should be using normalcolor at the DrawText call site.
-
Fixed dynamic font text being semitransparent
-
first pass at supporting dynamic font in AltHUD
-
althud timer and latency displays scaled to reasonable size when using dynamic font
-
fixed heretic fullscreenHUD incorrectly getting dynamic text:
-though that isn't supported yet, the heretic fullscreen hud was getting dynamic text with improper scaling.
-
removed unused HUDFontOverride
-
fix alignment of time text on althud automap
-
dynamic fonts not enabled by default
-
expose BigUpper font to script
-
use menuDelegate.PickFont to do semantic font substitution in list menus
Allows for automatic substitution of fonts based on user preferences, using the original font in the list def as the way of determining what font type we're supposed to use (BigUpper, BigFont = BigText, etc)
-
GetGlyphHeight vmnative
-
Major DrawText refactor for autoscaling and dynamic text:
-draw text paths split into DrawDynamicFontText and DrawStaticFontText inside DrawTextCommon -proof of concept of substituting fonts inside DrawTextCommon, meaning NO callsites for DrawText will have to be modified in order to support user font substitution. Tested with Reelism 2 -Algorithm for automatically scaling dynamic text to roughly match the scale of the original text it's replacing. This pretty much "just works" in Reelism 2. -TODO: there should be some way to disable autoscaling at the callsite if the mod author wants to handle dynamic text placement themselves
-
GetMaxAscender() for dynamic fonts
-
CheckParm<void> and CheckReturn<void>
-
Scriptify dynamic font substitution:
-Dynamic font substitution is handled by menuDelegate.PickFont, allowing the substitution to be controlled by script, and consequently, be moddable
- Add separate font declaration, SymbolsFont, for Sliders:
-Since sliders in UI are currently handled by using glyphs from ConFont, dynamically substituting this font would break the sliders. -Instead, we make an alias for the original ConFont called SymbolsFont, which is not ever substituted. That way, we can safely draw sliders regardless of user font settings.
-
moved menuDelegate extern inside DrawTextCommon scope
-
mirror changes from merge commits in original PR
-
scoreboard bigfont
Co-authored-by: River-Salmon 40964273+River-Salmon@users.noreply.github.com
03-Apr-2026 (Friday) at 13:16:09 GMT-0400 by Marcus Minhorst
Disabled visible haptics debug printout
03-Apr-2026 (Friday) at 13:02:22 GMT-0400 by Marcus Minhorst
Added some more fallbacks to make old mods compatible
13-Feb-2026 (Friday) at 17:49:47 GMT+0100 by Gutawer
switch RNG over to simpler PCG generator
03-Apr-2026 (Friday) at 10:42:11 GMT-0400 by Marcus Minhorst
Zmusic sync (#1218)
- Squashed 'libraries/ZMusic/' changes from c3e437f7dd..7bafecf6ff
7bafecf6ff Merge pull request #11 from charlesthobe/code_organization 3eef72774b AlsaMIDIDevice and CoreMIDIDevice protect against spurious wakeups 2d7d7ad011 Merge pull request #10 from leahanderson1/trunk e823617125 attribution fixes ed35e9b5d1 Merge pull request #9 from charlesthobe/code_organization 624e19f5d2 AlsaMIDIDevice and CoreMIDIDevice small refactor 3c280823de Merge pull request #8 from charlesthobe/uzmusic_sync cf9be31ce1 CoreMIDIDevice: Fix potential crash when enumerating device names f5154cd7b9 Sync to Upstream ZMusic commit 09c3cbe 09c3cbea05 AlsaMIDIDevice: Refactor (#90) cc0097304f CoreMIDIDevice: Wire up CoreMIDIDevice (#91) cb15f4ba82 AlsaMIDIDevice: fix potential race condition (#89) 18040ccfe4 AlsaMIDIDevice: refactor (#88) 7ad5bf0c90 Add eol=lf, renormalize 131d4575ea enable reading of zipped GUS patch sets directly without client side support. 4c04b7bc41 Sync to Upstream ZMusic commit 59101ab757be25cd658c9dc7656f7c736dbf1014 59101ab757 Refactor: Implement CoreMIDI-side scheduling for macOS MIDI playback (#86) 387f676104 Merge pull request #85 from johncurley/coremidi 38a1db9f4c Merge branch 'master' into coremidi 7e4fb82037 removed unnecessary sampler variable bb8d139a83 Added a scheduler thread and timing based on ALSA backend b151968eb0 Added core midi support to ZMusic 2dca40198b Added core midi support to ZMusic
git-subtree-dir: libraries/ZMusic git-subtree-split: 7bafecf6ffee73a0de3b53623ff83e606247943a
- Update CONTRIBUTORS
01-Apr-2026 (Wednesday) at 22:13:42 GMT-0400 by Marcus Minhorst
Update CONTRIBUTORS
