Unvanquished 0.53 Beta, what a milestone!

We are pleased to announce the 2nd Beta release of Unvanquished, a First Person Shooter featuring the ability to build and two factions with radically different abilities: humans who master technology versus aliens and their many specialized evolutions.

Unvanquished splash
Fear the beast!

If you are new to Unvanquished, you may want more information about how the game plays.

You can download the game right now for Linux, Windows and macOS and join online servers for immediate gameplay. We recommend using the Launcher (updater) or the Flatpak, which will handle all the small setup you would have to do with a manual install.

If you’re too young to die, you may want to read more. 👇

Summary and number crunching

This new release received lot of changes, but most are not too visible for the players, like the many bugs squashed or the many maintenance improvements such as refactoring and documentation which will make it easier for new contributors to join us and ease the life of existing contributors. This article will try to focus on things players, modders and server admins will be most likely be interested in.

Those changes were been made possible by two new official contributors, who were already contributing but have been accepted in the team: afontain and bmorel.

Areas which received the most attention for this release are:

  • AI has been improved, so that bots are less boring to play with or against;
  • The GUI/HUD framework libRocket was replaced with RmlUi (we wrote a dedicated article about that migration), which iYo dawgs mostly compatible with previous codebase and, most importantly, still maintained. Some parts of the UI look better, particularly the circle menus. On the other hand, there will inevitably be new bugs in that area. If you find problems, please report them, and sorry for the inconvenience!
RmlUi
I heard you like rockets so we put rockets on your rocket.

The project also now hosts a nightly build server, which, as its name says, is “where we break stuff”. This is a server hosting the latest version of the “master” git branch. It is rebuilt a few minutes after some new contribution is accepted and includes every package: gamelogic, assets, models and UI. This means that it’s almost the “next-release”, except for the changes that would require the players to update their client engine. Those changes are waiting for the next release. 😉️

For those around interested by raw, meaningless numbers, this release, as of July 2022:

  • 573 changes for gamelogic alone (excludes changes in “configuration”, content and artworks), roughly 14KLoC added, 11KLoC removed for a total of 144KLoC;
  • 291 changes in the engine, the program which runs the actual game, 4KLoC added, 6KLoC removed, for around 156KLoC

As you can see, there was a focus on the game itself. Because even if the engine is still not perfect, it is still pretty good and robust thanks to all the care it received previously.

For players

Most visible changes and Gameplay

The Flamer now deals less damage and is less likely to start fires on the ground, to try to balance it. Direct damage was reduced from 10 to 5, ignition probability on buildings from 50% to 20% (per missile!), and ignition probability on ground from 30% to 10%. Also, advanced grangers are now rewarded to extinguish fires with small amount of credits.

Armoury’s shopping range has been modified so that people using the armoury menu can access it from the same distance as those using key bindings. Previously, the menu could only be triggered from a smaller range. This often gave the feeling that bots were cheating, but they were only using their key binding equivalent. Resupply range for both armoury and reactor is also affected.

Drills, the replacement for repeaters, now have repeater’s energy weapon resupply ability.

The Parpax map received a major overhaul. Chances are that you won’t much recognize the layout anymore.

Updated Parpax map by Viech.
Updated Parpax map by Viech.

Advanced granger’s firefighting ability has been improved. Previously its radius range was 20qu (Quake Units), it is now 64qu, which should make it easier to remove fires on the ground. Furthermore, grangers are now rewarded some morph points for each fire they extinguish.

Quality of life

When an alien player tried to evolve too close to a wall, it was previously refused with an error message. Now, the player may be slightly shifted to a place where the evolution is possible.

When sprinting, the HUD indicates it. This is especially useful for people who toggle sprint mode, instead of holding down a key the whole time.

The running indicator on the stamina bar.
The running indicator on the stamina bar.

The HUD now displays the player’s oxygen reserves when underwater.

Underwater oxygen indicator on the HUD.
Underwater oxygen indicator on the HUD.Inventory icons’ size has been increased.

Map loading messages are back. They’re mostly here to entertain during the wait, but they help know the map loading progression, and some can even be useful for players, like those which inform the user that GLSL shaders are being compiled (happens rarely as those are cached).

Map loading messages.
Map loading messages.

Lone players are no longer forbidden to vote after a time, so they no longer need to call a draw to change the map.

For players who keep the on-screen key binding notes enabled, instructions for low health and out of ammo situations are now shown in orange to make them easier to notice.

In-game descriptions for battlesuit, chaingun and advanced granger have been updated so that they are more accurate and complete. Things like battlesuit not preventing crouching, battlesuit reducing chaingun’s recoil, and granger’s firefighting and immobilization abilities are now explicitly described.

When placing buildables, blueprints are shown in yellow instead of red if the buildable cannot be constructed for a reason other than an unsuitable location. For example, because the overmind or reactor is still under construction.

All gamelogic cvars (cg_ and g_ prefixes) now have descriptions and type information.

AI changes

Lots of work was done on AIs. This section only lists the bigger changes, without entering in the details.

Generic

Bots try to flee fast, if their skill is high enough (5 or more, which is the default).

It is harder to guess when they will start fleeing, and they will go heal even if they are not under 50% health, depending on their distance from the healing source and their skill.

They will also try to save money before starting a rush, and might decide to rush whatever the stage they are in (before, it was depending on a very limited list of equipment or classes). Again, their skill will factor into that decision.

Humans

Human bots now use grenades, and can roam near a busy medistation when they want to heal instead of passively waiting to be killed.

Also, if they see an enemy while close to the Reactor or Medistation, they will stop fleeing and fight back.

If they are equipped with a lucifer cannon while trying to fight near the armoury or reactor, they will sell it to buy a pulse rifle, to limit collateral damage.

Bots’ shopping decisions consider the equipment worn by their team mates, so that they might skip buying a radar if everyone else already has one, or buy pulse rifles to balance flamer usage.

Another shopping fix: they were previously affected by a bug preventing them from buying light armor until radar was unlocked, making them very, very easy targets. No more!

Lastly, in some conditions, bots were not able to reach the armoury due to pathfinding issues. A workaround has been applied which slightly improves the situation.

Aliens

Alien bots will now only evolve if they’re healthy enough to avoid immediately being killed, to not waste their evolution points.

They will also think about evolving before fighting, which prevents them to go fight as dretch if an enemy is in range.

(Some of the most noticeable) bugfixes

There were a lot of bugfixes that are difficult to notice or seldom encountered by players. The following list is not complete, but includes the most visible ones:

Previously, it was possible to spawn overlapping another player standing near the spawn point, immobilizing both players until one of them died. This is no longer true!

There was a very annoying bug in the server list which made servers disappear from the list. This was a problem with an automatic purge of “master” servers (the yellow page servers, if you prefer) which was hence removed, since not that useful after all (it was, in the past… for Windows 95, notably).

The Jetpack’s sound and the Spacetracks elevator buttons are now damped with distance. This was caused by the sounds being in stereo, while positional sounds must be mono.

Lucifer Cannon now vibrates when it is loading. This is a visual effect which was around in code before, but broke in 0.51.1.

Frames per second has been capped to 333 to prevent bugs. Benchmarks based on timedemo are not affected (by those bugs, hence not capped).

Music volume in main menu and when loading maps can now be adjusted separately from other sound effects. Previously, the music volume slider did nothing. It is also now possible to play without a working sound system.

OpenGL initialization code was redone so that error messages can be used to understand what is wrong more easily (thanks for testing papap!). Also, main menu does not compile shaders it does not use, which allows tweaking settings faster and hence getting into action sooner. It’s also useful on low-end systems since you can now disable features on first start before them being compiled.

Missing OpenGL error message.
Missing OpenGL error message.

We also fixed a rendering bug that affected Intel UHD owners on Linux and started to affect some Nvidia GPUs. If you experienced black areas and had to disable dynamic lighting you can re-enable it again!

For server admins and LAN gamers

The friendly fire modifier is now configured per faction, and halved by default for aliens to make team damage less devastating on this team. Server owners can tweak those with g_friendlyFireAlienMultiplier and g_friendlyFireHumanMultiplier.

Additional permissions have been given to administrators who aren’t server operators. Level 4 (“senior admins”) can now use following commands: pausebuildlogrevertbot. Level 3 and 2 (“junior admins” and “team managers”) can now use the bot command. For this change to take effect on an already established server, you unfortunately need to backup <homepath>/game/admin.dat, delete the file, start and stop the server, and then edit back your server admins inside this file.

The file autogen_server.cfg is no longer executed on server startup.

Demo files were renamed to allow date/time sorting of files.

GeoIP is no longer used. It was used by the the game server to know from where clients were connecting.

Cvar changes:

  • logs.logLevel.* cvars have been renamed to logs.level.*
  • g_autoPause is now disabled by default, since it freezes people but doesn’t stop time flowing. So it “pauses” the game, in a way that breaks the momentum and BP systems.
  • many obsolete or broken commands and cvars were dropped, most often they were simply never implemented. Notably g_botKickVotesAllowed and g_botKickVotesAllowedThisMap were replaced by g_disabledVoteCalls.
  • 23 unused cvars were removed from the gamelogic.
  • suicide delay (/kill command) can now be adjusted with cvar g_killDelay.
  • g_teamForceBalance has a new setting. When this cvar is set to “2”, the server will now allow all players to join the same team, as long as the other team only has bots.

The cvars documentation has been improved too: all the cvars that have a game impact now have an explanation text. This means that you can use /listCvars to find inspiration.

AI stuff

Options to control bots behaviors which were not implemented (toggle rush, toggle heal, group size, toggle build…) has been removed, and options to allow or prevent them to buy any equipment or class has been added, and integrated to the UI.

Also, it is possible to adjust the number (in percent) of radars bots will want in their team.

It is possible to change the default skill of bots, which means it is no longer mandatory to systematically add the skill when adding bots if you want harder or easier games.

It is no longer possible to have bots with a skill level of 10, since this broke their aim badly.

It is no longer required to create .dpk files to provide custom “behavior tree” or “navmesh”. These files can be customized by placing the modified version in the game/ subdirectory of the homepath.

For mappers, modders and contributors

Area of distance sphere debug tool.
Area of distance sphere debug tool.

The GUI library used to implement almost all the HUD and GUI was long since abandoned by its authors. We completed the switch from libRocket to RmlUi. The latter is a maintained fork of libRocket with some new features. This should make it possible to implement nicer HUD/GUI, for example texts can have outlines to be easier to read in areas where lights are too bright.

Translation mechanism as been re-implemented and includes the GUI/HUD elements. Old translations have not been used, since they are mostly outdated (hence, this update in the “for contributors” section).

Many gameplay-related files were moved from various repos to unvanquished_src.dpkdir to ease maintenance.

Dropped nobuildsurfacenoalienbuildsurface and nohumanbuildsurface which are obsoleted by nobuild contentparm (surfaces inherit the property from the content).

Debug tools: /cg_drawBBOX shows area of effect of ground flames (in addition to player and buildable bounding boxes).  cg_drawDebugDistance shows a sphere around the player of selected size to allow grasping a sense of distances.

Area of effect of ground flames (debug feature).
Area of effect of ground flames (debug feature).

The .arena files are no longer used when listing maps to avoid slow disk accesses when listing maps.

The /give command now allows giving momentum to a specific team.

Bots can now directly target closest enemy/ally building, invert behavior tree nodes have been added, and various other changes. You can find a work-in-progress page dedicated to documenting behavior tree mechanism and API in the wiki.

The /testmodel command works with skeletal models.

The new cvar cg_lazyLoadModels can be used to speed up gamelogic loading during /devmap.

To improve compatibility with Tremulous maps, the solid flag on env_afx_gravity / trigger_gravity is now removed automatically. This means one can now enter a modified gravity zone while those were treated like walls with 0.52.1. Likewise trigger_class and trigger_equipement now should work like they did in Tremulous.

The maps packages file names now have to start by map-<mapname> convention, and they must contain a file maps/<mapname>.bsp.

Paks can use DELETED files (like DEPS) to ignore parent’s files, which can be used to create delta paks which suppress things from official game.

C++14 is now allowed in Daemon and the codebase is more ASAN-friendly.

The build is easier to configure thanks to saner defaults and improved option descriptions.

Benchmarking abilities

For benchmarkers and people writing benchmark software and want an Unvanquished benchmark, a demo is provided on purpose here. Uncompress the .dm_86 file and store it in <homepath>/demos/ folder and run this command:

daemon -set demo.timedemo on -set common.shutdownOnDrop on +demo_play unvanquished-benchmark_0.53.0

The game will start, run the demo and quit automatically. Some statistics like that can then be found in <homepath>/daemon.log file:

6199 frames, 12.9s: 479.6 fps 
Demo completed

The provided demo file is specific to the game version so you may want to download here the new demo file when a new game release is published. Such demo file is reliable to compare performance of various hardware and software using the same game version, not to compare performance of the same game across game versions.

Conclusion

There is still a lot of work for us to do: many AI improvements are still possible, we still need to update the GUI/HUD lib we use to its latest version, and to implement better GUIs with it, and most importantly we still hope to replace our old NaCl integration with Wasm, which would allow us to support more hardware architectures like ARM systems.

We also know the gameplay is not perfect, but we believe we improved the game a lot in that year of development. If you find new problems or want to discuss about the gameplay or the game, please come talk with us on either our forums or bug tracker. You can also come chat with us when you’re tired of fragging.

We hope you will enjoy this release as much as we do.

Unvanquished turned 10 years old! We will publish in the next days a rich retrospective about our history! Stay alert! :bsuit: