So, we did it! Let’s welcome our latest, long awaited release, the 0.51 one! Get it while it’s hot!
There is a lot of changes in that release since previous one was published 2 years and 8 months ago and development was not asleep so it will be hard to talk about everything.
However, the game code itself is very stable as we were able to backport almost everything on the previous release throughout the years, I say “almost” because a (now fixed) file-system bug prevented us to indefinitely override our packages with newer ones making us not able to showcase some models. But gameplay was entirely backported and players were able to play it since more than one year with their unmodified 0.50 client, just by joining servers. This is a very good point for us and demonstrate the robustness of the architecture and showcases how the Dæmon engine is a strong modable platform.
You already know that kharnov lefts, and since that’s our first release without him we dedicate the alpha 0.51 to him. We know how hard he awaited this release and he hoped so much to see this being the first beta. Don’t worry kharnov, the beta is very near. To remind it to our readers, we call our releases alpha and beta not because of stability because of the completeness of our objectives. This one is flagged as an alpha one even if we would have liked to put the beta label on it, but let’s play it safe: we prefer to call beta something the players got their hands on. 🙂
You’ll probably notice the game has the 0.51.1 version string at some place, yes we sneakily tagged a 0.51.0 version some weeks ago that acted as a kind of release-candidate. After some last-minute fixes, we are ready to publicly release the game again! Enjoy!
Updater, game launcher!
So, let’s welcome our new updater! We now officially release it and it’s now the official way to download and update Unvanquished. Basically, it’s an Unvanquished launcher. You just download one binary, run it, and it fetches missing things before launching the game. The next time you will launch it the game will be updated before running it if a new release is available.
That updater also gives a preview of the latest blog post so while you wait for the update you’ll see there is some news and you just click on it to read the whole article!
Despite not being announced, some people already used the previous iteration of the updater so we were able to listen for needs and ideas to make it better. Not only the behaviour was improved to fit player’s needs, the updater was entirely remade using QML and looks better! This updater is the work by Ishq from a mockup by Gireen.
So, let’s talk about gameplay changes because that’s the whole point of game development!
Resource mining and territory control
This version introduces a big change in how build points are managed. You probably know the drill and the leech if you already played the game before. The drill is an human machine to mine build points and the leech is the alien alter-ego, a live being due to the nature of that species.
Each drill or leech built contributes a certain amount of build points and power to the team’s total pool which is now global and not linked to locations. Other buildables like turrets, armouries, acid tubes or eggs consume the build points and power provided by drills and leeches. It means drills and leeches have to be defended since the destruction of them leaves the dependent buildables unpowered. Additionally, when buildables are destroyed, it takes a while for the used build points to be released back into the available pool.
To be efficient drills and leeches have to maintain a certain distance between them. This gameplay change encourages territory wars in the way teams need to control foreign territories to build outer drills or leeches as needed to build their bases. Since the mechanism makes buildables dependent on mining device it provides an alternative to the old Tremulous’ sudden-death: the more the game lasts the longer it takes to recover build points after a structure is destroyed, weakening the least well managed base therefore accelerating its destruction.
The repeator is now removed. The repeator was the human structure built to power other buildables in forward bases. Now the drill also does the job of the repeater: both mining the resources, storing them and powering the whole including the forward bases. Since the repeater had a nicer model than the drill one, the drill reuses the repeater model and the drill model is now removed. Basically, that model looks like a small reactor which makes sense a lot: the reactor is the main power generator and nerve center.
Dretch + Turret = 💜
Dretches are able to attack turrets and rocket pods again! Dretches are one of the two alien forms an alien player can spawn with, the other being the granger builder form. The dretch is a small and weak attack form the alien player uses before morphing to stronger and deadlier forms. The original Tremulous game allowed those dretches to attack defensive structures like turrets, but this feature was disabled in the gameplay preview (GPP) of the never-released 1.2 release. Players were asking for the return of this feature and it made a lot of sense because it looked a bit inconsistent that a lone basic alien would not be able to destroy the human base when a lone unarmored human can destroy the alien one.
Some changes were implemented on the way player moves as requested by some players and by listening to them and taking care of problems their reported. It’s now possible to bounce on walls to help to reach some platforms more easily. Human sliding changed a bit and human dodging was disabled.
Enneract implemented this great change! Players now have an immediate visual feedback of how efficient their attack is. It will also help players to naturally understand which weapon or attack is better for each situation, and how well their aim is trained or if there is some place for improvements!
The spiker was improved to be more useful and efficient. The spiker is an alien defensive buildable that throws deadly spikes to careless humans. The spiker now fires only when expected damage reaches a threshold to not waste its deadly attack (it reloads slowly) and it now tries to avoid friendly fire when other alien buildables are in line of sight. Before its default behavior was to not attack in case of friendly fire but that made it useless when another buildable was not correctly placed. Now the spiker aims the target more precisely to avoid to damage team’s structures. The spikes themselves also got some gravity compensation.
Huge work on game assets
You probably noticed it if you read the previous blog posts, but a huge work was done on the asset management part. Not only they are now hosted on git repositories, we also rebuilt past history when it was possible, by replaying the published packages on tree for example.
An huge clean-up was done, nuking leftovers and deduplicating stuff. Our package management system allowed us to overrides previously released packages but this was just adding new files to existing ones since all the previously released packages had to be shipped in anyway.
Some fixes were done on the common texture set to rename or drop some obsolete stuff, the ej01 texture sets were merged as one, repeater model was dropped as explained, and there was a lot of shader clean-up. Here shader is meant as Quake3 shader, a simple way to define materials, not GLSL shader. The whole data set received a large amount of file rename to unify things and standardize more.
To tell some numbers, alpha 50 was 737MB heavy with 6322 files while alpha 51 is 488MB with 4178 files, that’s a 34% saving!
That release also welcomes the new dragoon model and the new battlesuit model! The Dragoon is a model by Raphaël “RXMT” Moreault-Truchon and the Battlesuit a model by Luiz Henrique “lhdc” de Camargo.
The legacy hand was repainted. The legacy hand is the first-person hand model that is used with the legacy weapons that are not yet replaced. Some of them are not so bad and since we are in need for animators and implementors it’s ok to keep them for some time. With that hand being repainted to look like the newer one there is far less inconsistency displayed on your screen!
Despite the engine being able to translate, rotate and scale models at runtime based on some configuration files we now do it at asset build time and ship them already translated, rotated and scaled so third-party tools like level editors can render them correctly too. A bug was found on engine side regarding to zOffset (vertical translation) so the models were fixed to be displayed correctly once the bug is fixed.
Some work started on the dark side of the sound. Obani contributed some of them (jetpack sound, buildable prebuild sound), and some were picked-up on free open assets repositories like opengameart from various authors when they sounded close enough to what we already had (chaingun shooting, battlesuit clang step…). After a license check-up some Tremulous sounds that were verified as safe were imported back.
We now ship a resource package named res-legacy to provide things inherited by Tremulous that have to be replaced or moved to other repositories when they are verified to be safe and free. This package shipping placeholders is meant to be ditched entirely one day so please don’t put this package in the dependency list of your own packages.
A load of map fixes are shipped within this release: places were the granger was able to build outside the battlezone in Antares, Perseus and Spacetracks are now marked as not buildable. A place were spectator can leave the battlezone in Perseus was sealed off.
On Thunder an outdoor furniture mistakenly allowed players to hide in, this model is now properly clipped. In Spacetracks some fullclip surfaces were replaced by weaponclip surfaces to let projectiles go through some half-open doors without letting players escape the map.
On the Chasm map some work was done to prevent granger to build some eggs at the edge of space or within chasm and some snowflakes particle systems were added in a place where they were missing. Chasm also seen hint optimizations.
Maps like Parpax, Station15, Spacetracks and Chasm got some caulking work done, sometime reducing the lightmap size by 1/4 for the two laters. Thunder got some missing textures fixed along a huge deduplication effort: this map predates most of texture set but now relies on them.
Some minor changes were done by Viech on Parpax and EmperorJack updated his Forlorn map to beta 1. You’ll get all of this in this release.
On the community side
Supertanker published a preview of an urban map named Freeway that is not yet distributed as part of the game as there is still much work to do but you can already try it out on servers!
On the community side some mappers made some nice maps you’ll probably enjoy while playing on servers. Despite not being official ones, they are worth the look and the play: Math released a remake of the good old Tremor map under the USS Tremor name, a remake of UTCS named CTCS plus a desert-themed map named Fortification with a layout remembering a bit ATCS. You’ll notice the impressive Hangar28 map by tvezet that tells so much stories by itself. Freeslave ported its Stalkyard map to Unvanquished and cu-kai is doing the same with its combat-t3 map. So, alongside official updates there is plenty of new stuff to try out and enjoy on servers!
The main/ directory from Unvanquished repository is now extracted as its own repository named unvanquished_src.dpkdir and re-imported as a submodule under a pkg/ directory within the Unvanquished repository. This package directory does not contains enough stuff to play the game but has enough bits to launch the game, join a server and fetch everything else from there.
Polishing game code
So, it will be hard to list all the fixes, but let’s try to do it. First not only assets but also code got some cleaning and leftovers were dropped.
Bots can now unstuck themselves and bot filling is now implemented (the bot fill command): this is the common way bots are usually managed on online games where a pool of bots are spawned on empty servers then are removed automatically one after the other as real players join the game. Those two features were long-awaited ones.
On the bot side again the game code now removes bots on game end even on map restart, and a division by zero occurring when bot aiming skill was 10 is now fixed.
Model animation, user interface, sound playing
Some buggy animation interpolation causing them to not be smooth were fixed, skeletal animation was refactored, spiker and overmind attacks are not disrupted anymore by pain animations. Players don’t lean twice in the direction of travel anymore. As said previously the model dimension parsing was fixed and model scaled accordingly.
About the user interface thing the listmap filtering and output was fixed (it’s a console thing), more stuff are restarted on map restart to clear scoreboard from screen on this kind of event for example, and long strings do not displace elements in tables anymore : previously some long nicknames were able to mess with scoreboard, same with server names in server list: this is now fixed.
Sound paths are now extension independent. This allows us to ship new sounds using a newer format without having to care about the old format still being there in dependency packages. Before that if an obsolete sound effect was named sound.wav and the replacement was using a newer format and was named sound.opus the old one would have been loaded in any way. Now the newer file takes precedence whatever the format.
Network, initialization, component system
A nasty bug was fixed in inforesponse packet, this is used by third-party query tools and server browsers like qstat or XQF and the bug just displayed the wrong amount of players when querying servers.
When the game is started for the very first time some option initialization were not done, leading to some wrong option menu. This is fixed. A crash occurring when restarting with switchteam is now fixed.
The component system was deeply refactored, especially on buildable side, and think components were optimized.
A new “give bp” cheat was added to give oneself arbitrary amount of build point for testing purpose, and a new developer option named “g_neverEnd” was added to not end the game even if there is no spawn at all. This is useful for mappers who need to try their work in progress maps or for developers having to open maps from other games within Unvanquished while they work on a port and their game is not yet complete: they just have to enable this option and load the map with devmap.
A small hack was introduced to prevent battlesuit weapon clipping. Some dead code was removed, thanks to Slipher taking care of it. Oh and game can now be built against a Dæmon engine directory that is stored outside of the Unvanquished source tree.
Many fixes were done thanks to static analysis. This is true for engine code too.
This version breaks compatibility with previous release in many aspect: package management, user data storage, input… Since compatibility was going to be broken in any way, it was the best moment to implement all other compat-breaking changes that were waiting for a long time. It was time to drop legacies.
It’s time to announce a great improvement on the usability side: thanks to Slipher’s work players can now bind non-ASCII characters and there is multiple way to define a key binding, one of them using the character printed by a given key according to player’s keyboard layout, one using hardware identifiers that are layout agnostic. This mean we can now ship a default keymap that works whatever the keyboard layout and language while allowing people to customize it using the key name within their own language. Note that old keybinds are automatically converted from previous settings to be used by the new engine, but they will not be loadable by older engines after that. EACFreddy also worked on better game controller support.
The user data storage now follows the XDG recommendations on Linux. So, unless you have some customized environment variable the engine now uses the “~/.local/share/unvanquished” path on Linux, automatically moving the previous legacy “.unvanquished” dot directory.
We also upgraded the Crunch code base to rebase on Unity’s upstream. Crunch is an image compression tool and an image format targeting GPU : textures may be shipped in a compressed format that is streamable to GPU directly, saving disk file space, host memory, CPU computation and bandwidth hence loading time. Crunch is a tool and a format initially developed by BinomialLLC but later Unity puts their hand on the code and improved it a lot. By a lot I mean a lot.
Unity guys said that their modified crunch tool “can compress up to 2.5 times faster, while providing about 10% better compression ratio”. So we driven a test on our own asset repository, re-crunching all the resources and textures packages. The given corpus at the time we did the the test produced 1797 .crn files. We benchmarked both our old crunch tool based on BinomialLLC code and the new Unity one with our patches applied. We rebuilt the binaries so there is no bias on that part. And here come the results :
- compression time: 115 minutes 8 seconds
- produced file size: 269 megabytes
- compression time: 26 minutes 43 seconds
- produced file size: 239 megabytes
So the Unity’s crunch tool reduced compression time by 4.31 and reduced size by 11.15%. They said “up to 2.5 time faster” but we’ve seen some textures being compressed 6 time faster and the average of the whole is 4.3 time faster, and yes the tool compresses more than 10% more. The results are really impressive and look very good.
The bad thing is that new crunch tool breaks the format in order to makes those improvements (read more in our forums), by the way the BinomialLLC code is dormant while the Unity one is not only active but implemented in Unity (it’s a large user base), and even the original author from BinomialLLC seems to have himself forked the Unity tree… so we did the jump.
Unity’s upstream does not look to be merging pull-requests so if you’re a game developer interested in Crunch, have a look at our fork that maintains Linux and macOS compilation fixes, fixed Makefile , CMake toolchain integration (it looks like Unity guys only focus on Windows and Visual Studio), assert customization and optional normal map normalization while keeping in sync with Unity’s upstream.
Dealing with broken drivers and fixing our own mistakes
A crash occurring with specific Nvidia hardware and software is now fixed. This bug was very annoying and even the load of log files shared by players in bug reports were not enough to circumscribe correctly the issue. Hopefully someone of the development team managed to put his hands on this broken piece of junk, allowing us to reproduce and workaround the bug as we know the driver will not be updated anymore.
We fixed a GLSL mistake that crashed the game on correct drivers, because eh, not only the others do mistakes but at least we fix ours. A bug related to light culling is now fixed too. The SSAO shader is now fixed on OpenGL 2.1 and some OpenGL 2.x incompatibilities were fixed.
A nasty bug leading to a crash when too much warnings were printed on user’s terminal is now fixed. On the terminal side again the wrong initialization causing curse console display issue in some case is a thing of the past.
We discovered an issue related to private slot management (the amount of connected people reported to client was wrong in some case), now fixed.
Making the engine more friendly
To improve compatibility with other games trying to port themselves to the Dæmon engine, the DXT3/BC2 support was added, it’s used in some picture format like DDS (DirectDrawSurfaces). The engine now supports the “dds/” prefix game engines like the Doom 3 one and Darkplaces expect. Shader parsing does not abort anymore on warnings (we still talk about Quake 3 materials), this was a mistake since warnings are meant to warn not to abort, and this fix also helps third-party data to load even if incomplete or if trying to use unsupported features.
The engine does not uglily recompress skyboxes anymore. That was using the very inefficient OpenGL compression before and we don’t do this kind of thing anymore since texture compression is now handled at asset build time, picking the best format for good looking, short loading and high compression results. That inefficient recompression produced very ugly skyboxes and that was very problematic since the skybox produces a static picture in front of player’s eyes by design, sometime filling the whole screen. Hence any artifact would be very visible and annoying so it’s not tolerable.
The GLSL shaders are now embedded in engine at build time. Some other efforts where done to make the engine more standalone, making some font file optional for example. This work is not complete: the engine still needs some game asset to load but it’s better than before. Making the engine standalone makes game porting easier.
The demo code was cleaned-up by Melanosuchus, cvars were properly renamed and broken functionalities were removed. Melanosuchus was the guy who already imported the RGB color codes from Xonotic back in 0.43 time, T4im made some color fixes this time.
The quaternion math stuff was refactored, don’t count on me to explain it in details. The engine now uses non-blocking calls to generate randomness if possible. Some C++ modernization were driven by T4im. Gimhael fixed a bug occurring with maps not having lightmap, bug that was discovered by our friends of the work-in-progress UnrealArena project.
An issue related to breakpad (crash reporter) was fixed and an issue preventing to build the engine from a directory outside of the source tree got a fix. The filesystem issue preventing us to publish some preview builds in some case was fixed, as told before.
More and more
There was a lot of work done on the map editing chain, the NetRadiant editor and the q3map2 map compiler are now fully supported. There is so much to say that a dedicated blog post is required. Stay tuned!
The engine can now query multiple master servers, and the game now does : we’ve setup a secondary master server (master2.unvanquished.net), it makes the game more resilient when bad things happen.
We still wait for the remaining permission from dsalt to switch the Wiki from the non-free CC By-NC-SA license to the free CC By-SA one. We are still without news from chris807, his models being the last ones to not be under the same license as the others.
As announced in previous publications, we now have a page to follow development activity and a discord room was opened. IRC channels are still welcoming you, join us and be part of a big and exciting project such Unvanquished!
Our friends of Smokin’ Guns announced an attempt to port their games to the Dæmon engine, let’s hope they will succeed because this game is very fun and deserves a refresh!
It would be hard to name everyone involved in this release, but we deeply thank everyone from the team and every contributors.
We are in need for animators and implementers so we can ship some newer models that are already modeled. The game is in need for a map vote screen, getting server-side demo the Xonotic way would be cool, importing the water effect and sRGB lightmaps from Darkplaces would be awesome, experimenting with WebAssembly in order to replace Native Client one day would be a great move for our sandboxing system.
We are still in need for new sounds, one guy said he is working on redoing the sound library so if you want to contribute on that part it’s better to get in touch with him.
And now the better thing to do: let’s play!