Our largest update for Doom: Eternal was recently released with a bevy of new features like a horde mode and new master levels. My largest contribution was my work towards a new playable character called the dread knight in our multiplayer mode.
This is our first playable melee aggro character and was a lot of fun to prototype. My initial work started around February of 2020 and over the past 18 months it has gone through many iterations and design changes. Some of the major challenges required to implement the dread knight include:
- Multi-hand melee combos using collision tests based on animation events
- Animation FSM and blend tree implementation for first and third person models
- Special physics for the teleport and ground slam spline
- Consequences of invisibility for the enshroud ability
- Server and client authority and messaging
You can see a sample of the playable dread knight gameplay below.
Made a small update to the GitHub repository for the console command variables and functions library I've been working on. Now both functions and variables can use functions with pre-computed hash values.
This has numerous benefits related to code size, initialization time, and perhaps most importantly security. Unfortunately the trade off is that programmers need to calculate the hash value themselves. To ease with this I've added 2 defines that allow you to compile an executable that makes this pretty easy. By defining _HASH_COMMAND_VARIABLE and compiling you can create a simple command line utility that formats the HASH_COMMAND_VARIABLE macro for you. By adding the folder this executable lives in to your system variables you can open up the command prompt and copy paste the values fairly easily. Another _HASH_COMMAND_FUNCTION define has also been added to do the equivalent for the CONSOLE_COMMAND_FUNCTION_HASH macro.
I started working on Doom: Eternal in January of 2019 until it shipped in March 2020 and I am still actively supporting it post launch today. The commercial and critical feedback for Doom: Eternal has been very positive despite a pandemic forcing the closure of many retail outlets (yes people still buy games that way). Some reviews have called it "one of the most intense shooters ever" and others have even given the game perfect 10 out 10 scores! My personal experience differed with the one I had with Red Dead Redemption 2 for numerous reasons. The team was much smaller, the genre was a first person shooter rather than an open world game, and rather than being on the project from the very start I joined relatively late into the development cycle of the project. This meant I had to carry existing features across the finish line more often than architect them from the ground up and I had to become acquainted with these systems very quickly. The project was originally scheduled to ship in November of the same year so this "whatever needs fixing fix it" attitude was more or less my experience working on the game. Rather than linking to other videos I captured and edited some footage myself this time. The compilation below does a good job of quickly demonstrating features I contributed to on the project. You will likely want to watch on YouTube and manually set the quality to 720p to get an acceptable resolution compared to the embedded video.I captured the footage on an old 1680x1050 display and apologize for the inconvenience.
Weapons
I spent a lot of time working on the player’s Ballista
weapon.This included work on all 3 fire
modes, the AI gore wounds used when hit by it, damage related issues, and the impact
VFX.This resulted in adding a few
collision filtering features to our physics system, special shapetests for the
primary fire, adding support for ‘sliced’ full body gore wounds, and splitting
up the VFX into multiple instances for different positions and normal.
I did a lot of work on various weapons in the game aside
from the Ballista.This ranged from
various damage issues, queueing up the equipment launcher, hit scan logic, smoke
bombs for the playable mancubus, and many issues related to the upgrades for
each weapon.
Gore
I fixed numerous features for gore systems and added a
pattern for the destroyer blade gore cut behavior that could be re-used to
replace demons with custom rigs, split ragdoll constraints, and shoot the
pieces off with a random range of speed and direction.I also worked on other gore behaviors like
the blood punch, syncing wounds for multiplayer, and the deferred blood pools
left behind by a corpse.
Multiplayer
My previous industry experience at Rockstar Games always
used a peer to peer networking system which would migrate ownership of entities
to different player machines during active gameplay.Doom: Eternal was a fun learning and growth
experience for me because it instead used a server authoritative method.This meant I needed to learn new methods to deal
with things that needed to be client authoritative such as hitscan weapon hits
and how to validate it on the server.Animation issues also could be much more difficult.Previously during something like a ledge grab
with a peer to peer setup we could simply disable all network blending but with
a server authoritative setup this got much murkier and complicated than that.
I supported many gameplay features specific to our PVP
gametype known as Battlemode.This
included demon character work (e.g. the revenant jetpack or the marauder
shotgun), summon wheel abilities, 3rd person ledge grab animations,
1st person spectating, and a considerable amount of work adding
features to our visual scripting system for the Battlemode tutorials.
Misc
Soft body repulsors that prevented characters
from visually clipping into each other
Contributions to a heat map performance tool to
find bottlenecks in a level
Contributions to player customization from getting
skins to appear in cutscenes, animated deaths, and on remotely controlled
clones in multiplayer
Gore nest secret encounter systems support
Boss voice over audio for the doom hunter boss
fight
Numerous bug fixes for VFX, damage, stats and
milestones not working as intended
Went to my first QuakeCon in July and had a great time meeting fans and being a part of the largest LAN party in North America. The keynote for Doom: Eternal can be seen below.
An in game console and the ability to modify parts of your application from a file of command line arguments can be very useful for development. I've written a fairly simple C++ solution that allows you to set any static variable using the interface and invoke functions from a file. An actual in game console would be the next step after this and admittedly quite a bit of work. You can go pretty far with this stuff with features like autocomplete, resetting back to default values, etc. To use it yourself if you are using visual studio you can right click your project and go to Properties > Debugging and insert the path to the file in the Command Arguments.
After over 6 years of working at Rockstar Games I'm excited to announce that I have accepted an offer with iD Software. We've moved to the Dallas area and I will begin working on Doom Eternal on Monday!
I worked on Red Dead Redemption 2 since milestone 1 in June of 2012. It has been 6.5 years and it's surreal to see the game has finally been shipped and well received by critics. Here are some of the features I made major contributions to during the course of the project.
The embedded videos have been resized to fit the Blogger post so they may not be as high quality as the actual video on YouTube itself. Compared to the full YouTube videos these embeds have start and end times appropriate for quickly explaining the features.
Human Body Looting
Red Dead Redemption 2 features realistic and seamless dead body looting that lifts up the corpse slightly and picks at appropriate spots (waist, chest, etc) to get items. We had lots of challenges to deal with related to ragdolls, slopes, and custom animation implementations to get such a feature to work. Support for fallback swipes uses a generic asynchronous helper which does probes and route checks.
Animal Skinning
One of the most well received features I worked on is the animal skinning. Compared to the previous entry in the series animal skinning in this game is seamless, gritty, and realistic. Very small animals (e.g. rats) can be put straight into your satchel. Slightly larger animals like rabbits need to be skinned with a pelt you put away like so. Doing this seamlessly presented many challenges dealing with dynamic terrain, obstacles, target poses, slopes, and foot sliding.
Medium sized animals like deer have a carriable pelt after the skinning that you can put onto your horse. We also had to support this in first person which presented some challenges with cameras and forced us to deliver on a high fidelity for such a feature that lets the player get this close to the action.
For the very large animals you can only get a large pelt and we do allow fade transitions to speed it along but the entries into it are still seamless.
Hogtie
A major tool for bounty hunting, missions, and ambient fun is the ability to hogtie (tie up) a character to carry them around without killing them. Consistent with other improvements from the first Red Dead Redemption the hogtie, cut free, pickup, drop, stow, and unstow actions are seamless. Compared to the other carriables like dead humans and objects hogtied characters are alive and thus support directional idles for various situations like being in shallow water or gun shots whizzing by.
Lasso
I spent a good deal of time getting the lasso working in a new codebase. The basic blend trees, casting out, and reaction behaviors. We have a fully physically simulated rope for the lasso in Redemption 2 so I'm really happy with the quality of it.
Carrying
You can pickup, drop, throw, stow, and unstow a lot of different things in Red Dead Redemption 2. This presented complicated problems related to IK, reservations, mover fixups on sloped surfaces, and syncing it in multiplayer. The final product supports pickup actions with humans (dead, knocked out, hogtied, dead and hogtied), animals (dead), and objects (moneybags, pelts, etc). Fallbacks are supported for messy situations such as the corpse being under a wagon.
Another challenge we had to deal with was seamless transitions to and from cutscenes to carrying gameplay (see below).
Plant Picking
As part of our collection and looting mechanics we also have plant picking which features separate prompts for eating and storing in the player's satchel. Similar to the other interactions we don't have camera cuts like in the first Red Dead Redemption and it's all seamless. The player can walk away and continue this action with an upperbody performance when appropriate.
If you have time you can watch a video of all the herbs you can pick below.
Vehicle Locks
A minor but fun ambient feature in Red Dead Redemption 2 involves saving prisoners from the back of wagons and looting coaches with locks on the back. To avoid making noise you can sometimes use a lockbreaker item to do it silently. I worked on the basic vehicle extension for this which would spawn and attach the right lock object models and correctly sync this to the vehicle door state when broken.
Scenario Script Interface (Ambient AI)
Our scenario system in Red Dead Redemption 2 is used to give believable schedules and behaviors to NPCs in our world. Typically we have points that are placed by designers and saved out into a binary file. The script interface I added allowed scripters to add, remove, and modify scenario points on the fly which was very handy for missions and ambient scripts.
Volume Editor
We have an in-house tool that allows designers to specify volumes in their scripts to be used for queries and triggers. I provided some support for this editor early in development to make it easier to use and add some features they needed.
Horse Saddlebag Searching
A relatively minor but still fun feature allows the player to loot the horse saddlebags of horses not owned by the player or the gang.
Dead Horse Saddlebag Searching
Searching a dead horse saddlebag is quite a bit different than our other dead interactions because we only animate the saddlebag itself. This presented a very tricky penetration and animation problem which required a convex hull, swept circle, a static frame pose, and a lot of IK to alleviate.
Damage Tracking
Part of the challenge with hunting in Red Dead Redemption 2 is not just finding, killing, and skinning animals but retrieving high quality pelts and corpses. This means the way the animal is killed matters in terms of where they are shot, the weapon used, and the ammo used. From a programming perspective this meant we had to classify damage for an animal and then correlate that damage to the item received based on that damage quality.
Other
Minor contributions to early dueling prototypes, weapon prototypes, loot tables, blocking areas, ransacking, etc.
I made a forum post on gamedev.net about templates and how they can be used to catch and prevent mistakes programmers inevitably make all the time. I felt it was worth linking to it here.