Unvanquished 0.53.2: refinements

Here comes the second point release of Unvanquished 0.53, ready to be downloaded! If you play using our launcher or Flatpak, the update will be proposed to you automatically!

Alongside some new features for game servers owners and some gameplay adjustments, this release brings engine fixes for rendering bugs, better compatibility with legacy Tremulous maps, some network fixes, and the regression preventing to type Unicode characters in chat is gone.

We recommend you to update the full game including the engine, because while the engine shipped in 0.53.0 and 0.53.1 can run 0.53.2 game code without any problem, some people may start hosting servers on network ports only 0.53.2 engines can connect to.

As promised, we published a retrospective blog post celebrating our 10 years anniversary: 10 years and Unvanquished. 👀️

Antares map with Battlesuits and Dragoon
Antares map with Battlesuits and Advanced Dragoon.

Gameplay and server features

So let’s talk about this game update!

On game code side, Someone implemented the g_maxMiners cvars allowing a server owner to cap the maximum amount of miners a team can have in game.

Kai implemented the /slap admin command to make an user feel the authority of a server admin (sends a warning message to an user, optionally with some in-game penalty) and reverted the commit turning the advanced granger slowing blob into a locking blob (making it a slowing blob again). The locking blob was basically a counter measure to the flamer being over powered, and since the flamer was nerfed, the advanced granger blob had to be nerfed as well.

Slipher implemented the g_persistDevmap developer cvar to make possible for the dev mode to be kept enabled after map changes. It is useful for development scenarios which need to last beyond the end of a map. Slipher also implemented spectator team chat and fixed an RmlUi regression preventing to type Unicode text in game chat.

Bmorel fixed some bug affecting the underwater oxygen bar. He added the print_momentum command to print the current momentum of teams and implemented some new cvars. The g_bot_defaultFill cvar can be used by a server owner to set a default amount of bots to be loaded by the game server without having to rely on the default map config file, and the g_rewardDestruction cvar can be enabled to reward credits to players destroying enemy buildables. He also improved the display of the listrotation command.

On bot side, afontain also introduced fallback behavior tree nodes.

Ishq fixed a bug related to alien buildables attacking people with notarget flag and implemented the ability for servers to run per-map-layout configurations. At map loading time, the game now executes default.cfg for all maps, <mapname>.cfg, <mapname>/default.cfg, and <mapname>/<layoutname>.cfg.

Game code refinement: RmlUi update and port to GLM

In the past year bmorel had worked on porting our vector math code to GLM. For historical reasons the Quake 3 code used a custom library for vector math functions and we inherited it. There was also some attempts done to implement new C++ vector functions and that ended into our code base suffering for custom math library proliferation. GLM is now meant to be the Unvanquished math library, not only on purpose to purge all the custom math functions that proliferated but also to entirely delegate the task of writing a math library to another team dedicated to that (and doing it well).

Afontain picked up the merge task and already merged the first bunch of GLM commits into Unvanquished. The GLM port of Unvanquished is already used since a year on bmorel’s bot testing servers as a groundwork of his bot code rewrite and enhancement, so the merge is long time overdue. We lacked manpower to merge this before as we were busy on other heavy tasks like porting RmlUi and other things. Now the GLM merge process has started for good and this release is already running GLM.

Ishq ported our user interface code to the latest version of RmlUi. Unvanquished 0.53 seen the migration from libRocket to RmlUi, which is a maintained fork of the now defunct libRocket. But the port being a huge task, we still relied on an old version of RmlUi that was used at the time we started the port (a couple of years ago). So 0.53.0 seen the port from very old libRocket to less old RmlUi, the 0.53.1 brought some fixes for bugs we found in RmlUi, and the 0.53.2 version finished the migration by porting from old RmlUi to current RmlUi. While at it, Ishq implemented the ability to quickly clear text in chat with Control+C for when someone decides to not send a message he already wrote.

Engine fixes

It’s now possible to hosts server using UDP ports above 32768 and clients to join them. This limitation was due to some signedness problem and remained unnoticed for decades as there was literally dozens of thousands of usable ports so no one needed to use an higher port number to host a server until now. But there is now a shortage of IPv4 addresses and in some countries some Internet Service Providers are now sharing the same IPv4 among multiples users, giving to each of them only a fixed range of UDP/TCP ports, and some users get port ranges above 32768, meaning they could not host game servers. The bug would also have prevented clients to join servers using a port above 32768 if only the server was fixed. The fix was submitted by DaVinciCode.

This is why we recommend you to update the full game including the engine, because while 0.53.0 engine can run the 0.53.2 game code, some people may start hosting servers on ports only 0.53.2 engines can connect to.

On rendering side, slipher refined the fix for specular mapping black patches, it appeared the previous fix was not enough.

Illwieckz implemented a workaround for some problems affecting light styles. Light styles are special lightmap effects inherited from Quake 3: lightmaps storing precomputed light may be baked multiple times with different light values, the engine switching the lightmap on the fly using some functions to simulate a dynamic light. Many old Tremulous maps used this features and since Someone ported some hundreds of legacy maps some bugs became more obvious.

On a very close topic, we dropped the fatLightmap implementation. Quake 3 had very small lightmap files being stored in the BSP file (the compiled map format). The fatLightmap implementation was concatenating multiple of those tiny lightmap files into a single image to upload it once to the GPU. The code was untested, unmaintained and riddled with bugs, while right next to this code we already had a well tested working code used by external lightmaps (our recommended format).

The single advantage of fatLightmap (single image upload) was severely outweighted by its disadvantages: complex code to read and assemble the fatLightmap, extra computations at rendering time to transform the coordinates, hard-solvable problems (some pieces of code had to know the lightmap was fat or not to do some computations in places this information is not expected to be known), etc. The maintenance cost of fatLightmap was also considered too high for the need.

By dropping the fatLightmap implementation, all lightmaps now use the exact same code path whatever their storage form and size, which means it is more robust, and it’s not possible for a bug to be introduced in a way it only affects some storage variant without remaining unnoticed on others. Doing that we not only dropped some unmaintained code, made our code base smaller and cleaner, it also fixed a handful of visual glitches affecting the legacy lightmaps of old Tremulous maps. The removal of the fatLightmap code, the enablement of the external lightmap code for internal lightmaps and the testing was done by illwieckz.

Illwieckz also rewrote the shaderlist debug command he used to debug the light style bugs.

Ishq silenced some “invalid bevel” warnings that were spamming the screen at map load while believed to be harmless since it was even completely disabled by default in id Software upstream since Wolfenstein: Enemy Territory. They already reported at the time that all maps would produce those warnings if turned on anyway, so those warnings are now only seen when debug logging is enabled.

Infrastructure work

Kai and illwieckz upgraded our forums to the latest version of phpBB, a Markdown plugin was also added and enabled to allow users to use the more convenient Markdown syntax to format their messages instead of the painful bbcode.

Before that we evaluated the opportunity to migrate to Discourse and tested it deeply but this evaluation did not reached satisfaction. Among concerns being raised by testing Discourse were the loss of subforums categorization below second level, subcategories being transformed to sort of labels, and no main page layout that would satisfy our needs despite multiple attempts to customize the various proposed layouts. Also the credentials were not ported properly with the accounts. So we decided to continue with phpBB.

Illwieckz implemented a chat notification service that notifies our channels when someone posts in forums or edit a page in wiki. As something being forgotten is like something not existing and with time forums got a bit forgotten. One of the reasons why our forums faded out is that most developers and users follow our chat and we had chat notifications for GitHub events (like when someone submits a pull request, open an issue or write a comment). Because GitHub was guaranteeing exposure through chat notifications, with time GitHub tended to be abused for things that better live in forums or in wiki. By bringing our forums and wiki to the same level of notifications of GitHub we reduce the risk of discouraging people to post in forums or contribute in wiki.


Someone ported some hundreds of Tremulous maps with help of bmorel, they can be played on some community servers. Efforts were done to provide convenient web lists of maps (example).

As you’ve noticed, this is the third consecutive release in three months! While we were accustomed to publish monthly releases for many years, for the 0.51 and the 0.52 development cycles we had to lower the release rhythm as some of us were very busy. We had enough manpower to contribute, but not enough to both contribute and release. The team is now more active again, both because long time members returning to activity and newcomers bringing fresh blood to the project. So we try to return to shorter release cycles. We currently don’t set any hard schedule like “every month” but we want to avoid releases being spaced by more than two months. If we are available for releasing and there are enough things to release, we may even do a monthly release like this one.

Don’t forget to also read our 10 years anniversary retrospective article! 👀️

📥 Download the game, join our chat and our forums 🥰️, play the game! :bsuit: