"Hunt: Showdown is a competitive first-person PvP bounty hunting game with heavy PvE elements, from the makers of Crysis.
Set in the darkest corners of the world, it packs the thrill of survival games into a match-based format."
- Official description on Steam
Presently I work on Hunt: Showdown as a Senior Gameplay Programmer, up until recently I was also involved in the UI programming department. Every feature I mention here was built in a collaborative manner and I explicitly do not claim sole credit for the work done.
Development time: October 2017 - now (ongoing)
Engine used: CryEngine
Language: C++, occasionally C#
As a general game programmer, I worked on a lot of game and engine systems, be it editor tools, network communication and, of course, actual gameplay. These are the major features I was involved in. More detailed information can be found on the following pages.
Interaction System & UI
One of the first systems I took ownership of when I started at Crytek was the interaction system. It allows the player to interact with the world and the items within it.
Examples for this are doors, weapons, ladders or ammunition crates. I inherited the system from a previous programmer, added features based on requests made by
the (technical) design team and improved the system's performance where it was feasible.
Since I had my hands in this system ever since the early access days of Hunt, I was tasked with a lot of fundamental functionalities like client prediction, efficient runtime queries for nearby interaction objects based on a large set of parameters, network safety and continuous adjustments made to make the life of our designers easier. Of course there are also extensive ways to debug the system to quickly find potential bugs, be they systemical or because of a setup issue.
For this all nearly all of the other features I worked on for Hunt, I had to expose functionality to our visual scripting language Schematyc. It has similarities to other well known node-based languages like Unreal Engine's Blueprints or Unity's Playmaker plugin, but is more tailored towards network synchronization and preventing its user from shooting themselves in the foot. I frequently interacted with our technical designers who are the main users of this language and adjusted my features and interfaces to make their workflows easier and more efficient.
Due to a shortage of UI programmers during the earlier stages of the game, I also worked on a lot of UI systems to support the respective programming department. Among the features I worked on in that position are the damage history, the options menu, the ingame HUD and the spectator mode. I was also involved in setting up dynamic keybinding support for keyboard/mouse and controllers.
Initially Hunt lacked a way for players to learn about the circumstances of their death within a match. The design department wanted to tackle this by giving the killed player at least rough information about who or what killed them. For this I created and maintained the instigator system which keeps track of a player's killer and the context of their death. By passing along information about the AI or player who e.g. made an explosive barrel explode, the game is able to reconstruct this damage chain and display it to the player in an easy-to-understand manner as a death recap.
One of the major hurdles for this feature was that the game was already a few months into its Early Access phase and none of the system in the game so far had taken a concept like the instigator into account. Thus, I had to touch all places in code and in our visual scripting language where damage was being dealt to a player to record information about who or what caused that damage event to take place.
There were more caveats though and the introduction of this system had repercurssions for even more parts of the game's systems. To give an example:
Hunt features a diverse cast of AI controlled enemies that act more like distractions than real obstacles. If the player is not careful though, they can be overwhelmed by a horde of these NPCs. Due to the sandbox-y nature of the game some of these enemies are capable to damage the player long after they themselves have died. A grunt wielding a knife can harm the player and cause them to bleed and lose health every second. If the player kills that grunt in return but dies to the bleeding later down the line, the zombie is still the instigator of the deadly knife attack. Unfortunately in Hunt AI despawns shortly after death. To accomodate this fact the instigator system had to be independent of dynamic variables like living entities as much as possible.
Console & Live Service
For the Xbox One and Playstation 4 release in 2019 and 2020 respectively, I was involved in setting up communication between the game and the console OS. For PS4 I also hooked up PSN's online matchmaking functions and player lobbies to the ones we use in Hunt. Apart from that I helped out wherever TRCs needed to be complied with.
Starting with Halloween 2020 we added support for live events which allows the game to provide content within a backend-defined timeframe. I lead the implementation of this system and worked on communication between the backend, the game clients and game servers to keep track of currently running events and provided hooks and functions for coders and technical designers.
In late 2021 we shipped patch 1.7 which introduced the capability to reconnect to a running match if a player's connection to Hunt's servers was lost. I oversaw development of this feature and also adjusted large parts of the gameplay logic to re-synchronize the mission state and dynamic entities to rejoining players. Due to time constraints Hunt was not written with reconnect support in mind. This plus the already advanced state of the game made the endeavour more challenging than usual.