We’re proud to deliver you Unvanquished 0.56.2! This point release is all about Quality!
The Unvanquished 0.56 release has been a very important milestone with a huge amount of work shipped in it. But our community of volunteers is also very small, so not all bugs could have been caught before despite the huge amount of work having been done on testing and fixing as well!
You’ll may even notice we didn’t announce any 0.56.1! That’s because at the moment of publishing the 0.56 blog post we built a 0.56.1 point release to fix one missed bug, so the 0.56 blog post was already about 0.56.1.
If you have missed our 0.56 release we published two blog posts going in details about what’s new:
|
|
|
Vampire mode
Now let’s focus on what’s new in that 0.56.2 release.
The build point vampire gameplay is now enabled by default. The Vampire mode has first been introduced in our 0.55.3 release and was due for the 0.56 release, but we lacked manpower on the gameplay side to complete that. Here we go!
The Vampire mode had been implemented by Sweet, Kai and Reaper. The enablement work has been done by Illwieckz and Slipher.
The vampire mode is a gameplay variant where each team starts with a fixed pool of build points and earn more build points by capturing enemy’s point from the destruction of enemy’s buildables (bleeding the build points from the enemy). This turns the build point management into a tug-of-war mechanic and suits well short frenetic games, which is appreciated by players and easier for newcomers.

The traditional mining gameplay where build points have to be mined using leeches or drills is still available. Now that the vampire gameplay is the default gameplay and fits the need for a gameplay compatible with existing unmodified maps including Tremulous maps, the mining gameplay is now freed from the “it should work with all maps” constraint, so we may explore new concepts in the future. For example it’s now possible to explore territory capture gameplay mechanics that would require map modifications.
Presets are provided (in presets/gameplay) and the Server Setup graphical interface provides an easy way to switch the gameplay.
Quality, quality, quality
With Unvanquished 0.56 we shipped a new model skeleton code moving a lot of processing from the game code to the engine for better performance. This impressive rework has been done by Reaper. Despite 14 months of work and all the testing done by Reaper, Slipher and Illwieckz, it turns out this new implementation was still a bit wet…
Slipher and Illwieckz did extensive testing in the last month to track down the remaining bugs in that skeleton code. We merged fixes by Reaper, and Slipher implemented other fixes for remaining bugs.
Testing and tracking bugs is something that requires a lot of effort and dedication, is very tedious and less exciting, while being extremely important. So we take the opportunity of this blog to highlight this important work and to glorify the efforts of those who make these valuable and irreplaceable contributions.
Slipher also fixed rgbGen linearization, which is part of the new linear pipeline that made its official debut in 0.56 after some preview in 0.55.5. We will likely adjust some maps in the future to match the correctness.
Very cool rockets
Enneract fixed a rocket model orientation bug and also submitted a bunch of improvements on the sound and the graphics effect of rockets. He also made the grenades less dark.
Illwieckz fixed the attachment tag in the human model meant for attaching the radar backpack. So the radar backpack is now visible on player’s back anew.
Elegy for a review
We especially thank Gireen for all the rewiew he has done making this point release possible.
Like testing, reviewing is something very precious that can be easily overlooked, underestimated or neglected. But in its own way, reviewing is what makes something becomes real. By reviewing contributions, contributions get merged.
By reviewing contributions fast, contributions get merged fast, new changes are less likely to conflict with others, pull requests stops falling in review limbo, the code progresses quickly and releases can come frequently. Gireen did a lot of review and in such way, Gireen also made this release possible.
It’s easy to forget about reviewers—they’re not mentioned in changelog, but without them, there is no changelog.
Fading grass
We care a lot about compatibility with legacy assets made for Tremulous and id Tech 3 technologies in general.
Slipher just fixed an exotic but valid usage of alphaGen portal on non-portal surfaces. The alphaGen portal feature is meant to blend a portal surface with a texture with distance, basically progressively modifying the alpha channel of the portal from completely opaque to completely transparent while distance grows. This is used as a performance tweak in mirrors, to render a texture instead of the actual reflection when the mirror is far, with a smooth gradation of the reflection effect until disablement when going away.
This alphaGen operation was named portal in Quake 3 because it had been implemented for that portal trick, but blending a texture according to distance can make sense for more things… That’s exactly what the ancient-remains map did: it used alphaGen portal for something other than portals: grass!
With that effect, the grass is opaque when seen from afar, but transparent when close, making it easier for a dretch (which is very small and walks close to the ground) to move around without having the view obstructed by very close grass.
Maybe amd64 is the new Java
Our game code is virtualized using Native Client. The game code is virtualized so players can download custom compiled games from servers and run them securely.
Despite our will to migrate to WebAssembly in some vague future, it happens that Native Client works very well for our usage, is mature (more than Wasm outside of browsers…), and was even silently maintained by Google for all those years, despite public announcements deprecating it years ago. There exist newer loaders, C++20 Saigo compilers based on LLVM 21, things like that… The technology has no future, but the technology is not obsolete at all.
NaCl will still work for years and will even still be relevant for a decade, so with a team as small as ours and the little manpower we have, we prefer focusing on other things. We will probably not wait for a decade to switch to Wasm, but we have other priorities right now and appreciate the fact we are not pressured and can freely allocate our manpower on other things.
The only thing that annoys us in using NaCl is that it is stuck with the three platforms Google implemented: i686, am64 and armhf (they also implemented mips at first but latest compilers don’t implement that and no one cares).
Runlevel5 did something very cool: plumb the launching of NaCl over box64. Box64 is a translation layer to run amd64 code on arm64, riscv64, ppc64le and loongson.
It’s magic: no need to implement new platforms in the NaCl loader and compiler (no one will do that!), it’s possible to build a native engine for ppc64el (or other platforms supported by box64) and to run the virtualized game code on box64. As seen in this showcase video, it works.
Right now it is assumed you provide box64 yourself, and we don’t distribute builds for those other platforms, but if your platform isn’t officially supported by us and is supported by box64, you can already build a native engine and join servers, because the NaCl amd64 gamecode can run everywhere box64 runs! Maybe amd64 is the new Java…
Graphics driver workarounds
Our Dæmon game engine implements a load of workarounds for many graphics hardware and drivers. OpenGL is a standard, but everyone can do mistakes, including chip designers and driver developers.
With time our engine accumulated a large arsenal of tweaks… and the latest workaround shipped with Dæmon 0.56.2 is a workaround for the ZX C-1190, which is the GPU integrated in the amd64-compatible Zhaoxin KX-7000 CPU. Those GPUs are direct evolutions of the Via/S3 Chrome GPUs that were popular in laptops some years ago.
The workaround is to disable the realtime lighting because for reasons we haven’t figured out yet, the render goes garbage when that is enabled (even if not used). That smells like a bug… With that workaround shipped in the engine, Unvanquished 0.56.2 runs out of the box without user tweaking. Maybe we will find a more subtle workaround to re-enable realtime lighting, or something will be fixed on Zhaoxin side one day, but for now this is enough to get the game running.
Like the Moore Threads GPU, the Zhaoxin GPU cannot handle large models, so the OpenMP implementation for our CPU model code we shipped with Dæmon 0.56 is bringing a huge performance boost on it as well.
Crunchy semaphores
David20321 fixed some named-semaphore leak and constructor race in the Crunch image conversion tool when built for macOS. We discovered on such occasion that Crunch is used by Wolfire games for their Overgrowth game.
Initially developed by Binomial and improved by Unity, we started improving and maintaining Crunch in 2014, 12 years ago! Dæmon Crunch receives the same kind of care the rest of our tools receive: active maintenance, lots of fixes and new features, improved compatibility with image formats, cross-platform compatibility with many systems and hardware, and a CI not only testing the build succeeds but also validating the output of the conversions with a library of specially crafted inputs…
It’s nice to see our beloved Crunch being adopted. Free software gives the opportunity to develop collaboration and that’s very cool.
Goldsmithing the graphics presets
Illwieckz reworked a bit the graphics presets. Thanks to Slipher having implemented the ability to force blend regime, we now use a forced naive blending in low and lowest graphics preset. It happens that, when special features like normal mapping and specular mapping are disabled, blending sRGB lightmaps with sRGB textures without conversion provides an acceptable approximation of the physically correct linear pipeline, without doing any color conversion. And since lower presets don’t use high-precision frame-buffers, avoiding those conversions also prevents a lot of color banding. So with lower presets we now compute less and look better.
All the little things that makes everything greater
A lot of many other things were done, that have no obvious effect, but are very important, like preparing work for other things, cleaning-up things.
Among things with a bit of visibility, Afontain made the CMake build report which SDL version is used to build the engine, that is useful for debugging purpose. Slipher fixed the bug that sometime made the scoreboard stuck. Ishq fixed a segfault related to mistakes with model tags. Slipher restored the ping column in the server list. He also deduplicated the UI language lists, cleaned up APIs for color code and emoticon control, and cleaned up unused model code. Slipher also made it possible to use a fixed seed for pseudo-randomness, so that scenes involving particle systems and other random elements can be reproducible for renderer tests. Slipher also made the shader parser compatible with file paths with backslashes as separators, improving compatibility with Smokin’ Guns assets (🤫️). And further, many things with cryptic commit messages just making things better.
More to come
More improvements are coming, like some SDL input fixes for macOS. The fixes are in SDL itself and we didn’t find the time to upgrade our dependencies, so those fixes are for a future release.
It’s time to download Unvanquished and play the game! ![]()
Changelog
Unvanquished translations:
- Russian, Spanish, Ukrainian and French translation updates – Adem4ik, NeonKnight, XblateX, Illwieckz.
Unvanquished assets, weapons models:
- Very cool rockets – Enneract
- Brighten grenades – Enneract
Unvanquished assets, player models:
- Rename
head_tagastag_head– Illwieckz
Unvanquished game code:
- Sync entity cache before
trap_R_SyncLerpTags– Slipher - Fix harmless mistake with entity realloc copy count – Slipher
- Write short X.Y abi version string – Illwieckz
- ui: reword a bit to make it easier to translate – Illwieckz
- Add gameplay presets to server setup menu – Slipher
- Update BP vampire on/off state in UI – Slipher
- presets: set
r_accurateSRGB offin medium graphics preset – Illwieckz - ui: add sRGB conversion accuracy option – Illwieckz
- ui: add blend regime option – Illwieckz
- presets: set
r_forceBlendRegime 1in low and lowest graphics presets – Illwieckz - Don’t unpower buildables due to BP in vampire mode – Slipher
- Fix muzzle PS particle system corruption – Slipher
- presets: add vampire and mining gameplay presets – Illwieckz
- sgame: enable Vampire mode by default – Illwieckz
- Server list: resurrect ping column – Slipher
- Rewrite entity cache allocation function – Slipher
- Fix 3 bugs in
EntityCacheallocator – Slipher - Stop trying realloc trick in
AddRefEntities()– Slipher - EntityCache: minor cleanup – Slipher
- NUKE (segmented) MD3 player model support – Slipher
- NUKE “nonsegmented” MD3 player model code – Slipher
- Unused function
BG_NonSegModel()– Slipher - Clean up interface of
Rocket_QuakeToRML()function – Slipher - Split
Rocket_SetInnerRML()toRocket_SetInnerQuake(),Rocket_SetInnerPlainText()– Slipher - Merge “quake”, “emoticon” attrs for
<translate>,<inlinecvar>– Slipher - Get rid of
CG_Rocket_QuakeToRML()function – Slipher - Comment entity caching fields of
centity_t– Slipher - Fix cache invalidation for
predictedPlayerEntityduring teleports – Reaper - Fix entity cache free for predicted player entity – Reaper
- Use a configstring to transmit pmove params – Slipher
- CG_Init: call configstring modified handler for each cs – Slipher
- Don’t check for
CS_MUSICmodifications – Slipher - Unused variables:
cgs.timelimit,cgs.maxclients– Slipher - Remove unused configstring
CS_GAME_VERSION– Slipher - Remove barrel model from
/testgun– Slipher - Don’t set
sv_killserveruponCA_DISCONNECTEDstate – Slipher - Move gameplay cvars out of serverinfo – Slipher
- Close scoreboard if
CS_INTERMISSIONchanges to 0 – Slipher - sgame: resend configstrings that could be wrong – Slipher
- Fix
AT_TAGattachments, improveattachment_tpacking – Reaper - Use the BG generator for remaining random numbers – Slipher
- Allow fixing random generator seeds – Slipher
- NUKE
<include>RML element – Slipher - Deduplicate RML language list using
<template>– Slipher - Force developer mode in server creation UI when NaCl is unavailable – Runlevel5
- Fix macOS CI – Slipher
- Update readme – Slipher
Dæmon engine:
- sdl_glimp: do not assume non-Mesa Linux driver on AMD hardware is OGLP – Illwieckz
- glsl: fix
int/floattype mismatch – Illwieckz - Fix dynamic lights being always disabled – Slipher
- sdl_glimp: disable realtime lighting on Zhaoxin driver – Illwieckz
- sdl_glimp: move
EnableAvailableFeatures()from tr_share – Illwieckz - DetectGLVendors: bikeshedding wording and whitespace – Illwieckz
- DetectGLVendors: detect Zhaoxin ZX integrated graphics – Illwieckz
- DetectGLVendors: reorder things – Illwieckz
- DetectGLVendors: detect Imagination PowerVR – Illwieckz
- DetectGLVendors: detect GL4ES translation layer and underlying technology – Illwieckz
- Refactor
SetUniform_Color*fallbacks as classes – Slipher - Remove unused ColorGlobal uniform classes – Slipher
- Respect
GL_MAX_UNIFORM_BLOCK_SIZEfor dlights buffer – Slipher - Add
r_forceBlendRegime: force linear/naive blending – Slipher - Fix rgbGen linearization – Slipher
- sync master submodules – Illwieckz
- NUKE now-unused
ST_PORTALMAPstage – Slipher - Move
alphaGen portalsupport to “generic” shader – Slipher - Allow backslashes, extra slashes in shader/image names – Slipher
- Remove pointless slash normalization in hash functions – Slipher
- Consistently name entity cache-related funcs – Slipher
- Use
bool8_ttypedef for IPC booleans – Slipher - Fix null renderer
SyncLerpTags– Slipher - Remove nonexistent function’s declaration – Slipher
CL_FillServerCommand: remove demo special case – Slipher- Drop on impossible server command sequence nums – Slipher
- Remove useless
trap_R_AddRefEntityToScene()return value – Slipher - Add include guards to headers lacking – Slipher
- Don’t include
RefAPI.hfrom gamelogic – Slipher - Discard old server commands upon new gamestate – Slipher
- Print used SDL path and version – Afontain
- Make error message slightly more clear – Afontain
- Remove version number from default server name – Slipher
- lerptag: Ensure we never return uninitialized data – Ishq
- Box64 hybrid NaCl emulation for unsupported platforms – Runlevel5
- Add ppc64le/ppc64 architecture support – Runlevel5
Crunch:
- Fix macOS named-semaphore leak and constructor race – David20321

One thought on “Unvanquished 0.56.2, quality!”