Here comes Unvanquished 0.55.3, our third point release in the 0.55 cycle!

More game merges, and some vampires
As stated in the 0.55 blog post in October, we want to focus on the gameplay for the 0.55 cycle, especially merging what’s currently implemented on game servers that acts as a kind of staging areas for the project. This means, as stated on the current roadmap, the first task on the roadmap since October is to merge gameplay changes from Kai and Sweet’s servers.
The most notable thing being delivered is the Vampire mode implemented by Sweet, Kai and Reaper. This is an alternative build point mechanic. In default mode, teams are mining the build points with mining structures (drills, leeches) and are losing them by losing buildables. In vampire mode, each team gets a fixed pool of build points and destroying an enemy buildable captures the build point, actually vampirizing the build point pool of the other team (hence then name). A bar at the top of the screen displays the current state of the game. The cvar to enable the vampire mode is g_BPVampire
. Additionally, servers using vampire mode often tweak build point cvars to use fixed pools without mining structures: set g_maxMiners 0
and (for example) set g_BPInitialBudget 100
.

Among changes by Sweet we merged are the ability for humans to refill their weapon while holding the blaster, various bot fixes like preventing them to fight with a construction kit or making them able to rebuild the reactor and the overmind.
This release also delivers the new vsay and Bot command menus implemented by Grise.

Among other things, Enneract improved the look of the new Chaingun, Gireen lowered the default bot skill, and Reaper reworked the Tyrant trample and attack interactions.
Merged from bmorel’s server is the move of entityType_t
in the game logic to make it easier to develop mods while dealing less with engine source changes.
Too early to bloom
As of 0.55.2, bloom looked bad on many maps. The bloom effect was initially developed targeting clamped overbright (max brightness 1x for textures lit by a map’s baked-in lighting). But since 0.55.0 we had unclamped overbright, with max brightness 4x. With a lot of bright pixels on the screen already, bloom goes out of control. It was a problem that bloom could strongly alter the appearance of a map. 0.55.3 dials back the overbright a bit to max brightness 2x (matching default behavior of Quake 3 and Tremulous 1.1), but the effect of bloom could still be large sometimes.
So, with this version, the default behavior is to not use bloom. Selecting a graphics preset will disable bloom. It can also be configured independently under Options > Graphics > Effects.
Those having previously enabled bloom can disable it there, or just reapply they preferred preset. By luck, a new lighting operation, the tonemapper, may limit the effect of bad bloom, but you better disable bloom for now. By delivering this to players we also fulfill the need of mappers like Sweet who requested a way to make sure their maps look as intended on players’ devices.
The Dæmon engine is a project to bring modern rendering techniques to games like Unvanquished from the start, and we are still committed to this objective. So sometimes improvements may conflict with features we had for years, like bloom. Disabling bloom is actually an easy way to keep very active the development of new techniques while keeping some stability content producers are looking for.
Not too late for an update
This point release is also part of our effort to return to a more frequent release schedule. We would have preferred to ship it in February, but there it is! The 0.55.2 version was delivered for Christmas, The 0.55.3 one is ready for Easter! We’re sorry to have missed Valentine’s day. 😉️
Introducing the tonemapper
Reaper continued his impressive and abundant contributions to the renderer, and this time we can highlight the tonemapper! Reaper implemented a Lottes HDR->LDR tonemapper which modifies the light to prevent clamping and conserving details on high and low ends of the lighting range.
The tonemapper is also a ground work for the upcoming adaptive exposure feature!
Reaper also deeply rewrote parts of the engine, and re-implemented the GLSL shader cache in a better way… More details can be found on the changelog below.
An optional contact field for server owners
We now recommend admins of public game servers to fill the contact
cvar to add a way to contact them if needed. This is optional and the format is totally free. One can put a forum or chat nickname, an e-mail address or whatever they like.
This can be used for example to reach a server owner who have not updated his server after an important release. For example when the 0.55 version was released, some invisible collision map bugs were mistakenly shipped. So we needed game servers owners to promptly update their servers to prevent players to face those unwanted bugs, and no server owner wants to keep a buggy build running.
Filling this cvar is currently optional but strongly recommended, as it helps to get in touch when needed.
We updated the server configuration sample accordingly.
Some news on ongoing work
A lot of things are being done in the background!
Illwieckz now has a working branch for a linear light blending mode, which is required for physically correct lighting.
Reaper has ongoing work to optimize some skeleton-related IPC to speed-up the model rendering.
Illwieckz and Slipher are working on modernizing our NaCl toolchain and runtime.
As a reminder, we use Native Client as a virtualization technology to sandbox the game code, which makes possible for players to download and securely play games downloaded from online servers. While Native Client is officially deprecated by Google, the WebAssembly alternative is not mature enough for our need. So we have to keep NaCl with us a little bit. Fortunately Google is still maintaining some NaCl components for their own need of already-released Android maintenance. We are then working on rebuilding the Saigo compiler which is based on latest Clang 20, and rebuilding the NaCl runtime.
As a result of those effort, Unvanquished 0.55.3 is already shipping a newly built nacl_loader
for Linux on amd64
platform. This fixes the NaCl crash handling that was not working anymore on recent Linux kernels with the old loader we used.
Let’s play!
It’s time to download the game and join a server!
Changelog since the 0.55.2 release
Here follows a list of changes, not exhaustive, but meant to capture most of the work being done:
Game changelog
Gameplay
- Humans now refill while holding the blaster (Sweet);
- Cancel the trample when attacking (Reaper);
- Vampire game mode (Sweet, Kai and Reaper);
Bots
- Human bots don’t fight with the Construction Kit (Sweet);
- Default skill is lowered (Gireen);
- Bots without jetpack don’t use jetpack navigation data anymore (Slipher);
- Bots can now rebuild the reactor and the overmind (Sweet);
- Behavior tree fixes (Sweet);
- Correct for delta angles with goon pounce/barb (Slipher);
User interface (game)
- Add circle menu for bot commands (Grise, Sweet);
- Add bind interface for the menu for bot commands (Grise);
- Updated translations (Many);
- Add vsay circle menu (Grise);
- Add bind interface for the vsay circle menu (Grise);
Game media
- Make the
needammo
vsay work again (Grise); - Fix
NaN
in a pulse rifle IQE file (Illwieckz); - Bake in ambient occlusion and adjust
metal_orm
of the Chaingun (Enneract); - Make ground fire shader
entityMergable
(Slipher);
Game server
- Update the server config sample (Illwieckz);
- Add the
contact
cvar (Illwieckz);
Framework (game)
- Lua and FreeType are now built as submodule (Illwieckz).
- The engine and the game now report the compiler they were built with, making easier to track compiler-specific bugs (Illwieckz);
- Use type safe for IPC (Slipher);
- Do not crash if sound is unknown (bmorel);
- Generate automatic entity IDs for map entities without an ID (Sweet);
- Add fast lookup for entity IDs (Sweet);
- Move entityType_t in gamelogic (bmorel);
Rendering (game)
- Fix an incorrect frame bug in MDV animation (Reaper);
- Fix acid tube gas being too transparent (Slipher);
- Fix
realLight
keyword for particle coloring (Slipher, Reaper); - Reorder the cgame data loading (Illwieckz);
- Fix framerate-dependent animation blending (Slipher);
- Disable bloom for now (Illwieckz);
Engine changelog
User interface (engine)
- Add
noforward
/-forward-only
command line arguments (Slipher); - Fix out of order shader log messages (Reaper);
- Add
r_materialSystemSkip
andr_forceRendererTime
(Reaper); - List commands in alphabetical order (Slipher);
- List cvars in alphabetical order (Illwieckz);
- Add debug info for shader compilation/link time (Reaper);
- Fix –help output not appearing through a pipe (Slipher);
- Make the error popup disableable (Illwieckz);
- Rewrite the
GLimp_LogComment()
calls (Illwieckz); - Make surface parse error messages more meaningful (Reaper);
Framework (engine)
- Faster and/or more precise reverse square root approximation (Illwieckz);
- Fix incorrect
heatHaze
shader macro (Reaper); - Identify the game by its name in SDL (Kai);
- Migrate renderer commands to the C++ interface (Slipher);
- Fix /net_restart on Windows with running server (Slipher);
- Fix build NaCl from Visual Studio (Slipher);
- Add
USE_FLOAT_EXCEPTIONS
CMake option andcommon.floatExceptions.*
cvars to enable floating point exception trapping (Illwieckz); - Add more fault commands to test for floating point exception trapping (Illwieckz);
- Add “dummy game” cgame module to quickly test how a map renders without a full featured-game (Slipher);
- Fix generator expressions with VS CMake integration (Slipher);
- Reorganize files for making possible to build NaCl games with Saigo (Illwieckz);
- Improve a bit the build script to build external dependencies (Illwieckz);
- Rebuild the NaCl loader for Linux amd64 (Slipher);
- Fix fatal C++ exception handling for MSVC native exe (Slipher);
- Produce NaCl crash dump upon C++ exception (Slipher);
- Add cvar to disable native exe crash handling (Slipher);
- Don’t abort for non-main thread NaCl crash (Slipher);
Rendering (engine)
- Fix unnecessary generic shader permutations (Reaper);
- Rewrite the packing of color modulation information (Reaper);
- Fix light styles with
u_Color
(Reaper); - NUKE leftover CPU lightGrid functionality (Reaper);
- Fix ambientColor keyword (Reaper);
- Port some rendering cvars to the new style (Reaper);
- Define appropriate flags for all engine commands (Slipher);
- Fix bug with 2d drawing GL state (Reaper);
- Fix crash in
GenerateWorldMaterials()
(Reaper); - Allocate material memory for stages rather than surfaces (Reaper);
- Fix material system dynamic stages (Reaper);
- Use UBOs for texData when possible (Reaper);
- Use a UBO for materials instead of an SSBO (Reaper);
- Update
QuatFromMatrix()
from the tracing code to avoid compiler optimization mistakes (Illwieckz); - Use faster invere square root in
QuatFromMatrix()
like it was meant to be (Illwieckz); - Use dGPU if both dGPU and iGPU are available on Windows (Reaper);
- Fix light grid array size calculation to avoid compiler optimization mistakes (Illwieckz);
- Clean-up
GLBuffer
interface, use DSA (Reaper); - NUKE unused
GLIndirectBuffer
(Reaper); - Clean-up material system buffer bindings (Reaper);
- Fix loading
.dds
images with paths prefixed withdds/
(like DarkPlaces/Doom 3) (Illwieckz); - Fix glsl_restart with material system (Reaper);
- Fix alpha = 1 colorMod (Reaper);
- Detect and rewrite NaN in IQM model (Illwieckz);
- Workaround for atomic ops on AMD (Reaper);
- Implement Lottes HDR->LDR tonemapper (Reaper);
- Fix a crash with r_noportals (Reaper);
- Fix texture scroll (Reaper);
- NUKE unused refractionMap/dispersionMap (Reaper);
- Disable unsupported GLSL extensions on low GLSL version (Illwieckz);
- Don’t restart the video on macOS when toggling fullscreen (Slipher);
- Add the
setWindowOrigin
command (Slipher); - Implement partial overbright clamping like Quake 3 (Slipher);
- Add the
r_overbrightQ3
cvar to simulate Quake 3 overbright (Slipher); - Fix the UI being affected by subgroup profiler (Reaper);
- Improve shader building (Reaper);
- Fix
CGEN_IDENTITY_LIGHTING
` with 2D drawing (Slipher); - Use a simple
screenSpace
vertex GLSL shader and deduplicate many (Reaper); - Change the
cameraEffects
GLSL shader to use thescreenSpace
vertex shader (Reaper); - Add some non-bitwise alternative for some low-end devices (Illwieckz);
- NUKE surface sorting by fog and allow merging main surfaces regardless of
fogNum
(Reaper); - Rewrite
unpackUnorm4x8()
with explicituint
casting and do explicituint
casting in GLSL shaders (Illwieckz); - NUKE some duplicated code (Reaper);
- Move duplicate code from
ParseFace()
andParseTriSurf()
intoParseTriangleSurface()
(Reaper); - Move
SF_TRIANGLES
plane calculation to map loading (Reaper); - Add
GeometryOptimiser
(Reaper); - Merge duplicate map vertices (Reaper).
One thought on “Unvanquished 0.55.3, tonemapped vampires”