Umbra Mortis

September 2024 - July 2025

Engine/Tools: Unreal
Platforms: Windows
Duration: 10 Months
Programmers: 6
Designers: 6
Artists: 10

Umbra Mortis is a 1-3 player coop FPS shooter, where you fight hordes of zombies in the streets of Venice.

It was amazing to get experience with Unreal’s networking and multiplayer programming systems, and all the challenges that came with them. I was lucky enough to be able to work together in an amazing team of 22 developers, collaborating closely and achieving our goal of a successful Steam release.

My Contributions

  • Created development tools, such as the objectives system, cheat menu, analytics, automated crash reports & improved logging.
  • Gameplay features, such as the homing bell, an AI director, spectating, as well as the functionality behind many widgets and triggerable events in the level.
  • Optimising enemy navigation, created efficient local avoidance for 3D environments.
  • Bug fixing, mainly replication related issues, leading to an incredibly stable build on release.

This page is still under construction, with more details about my contributions coming soon. In the meantime, feel free to check out our game on Steam!

Procedurally animated enemies

In the early days of prototyping our game, I added a feature for supporting thousands of procedurally animated enemies, with very minimal bandwith overhead, using flowfields.

A single agent using the flowfield to move along any nearby surface towards the target.

agents ⚠️ Arachnophobia Warning: Click to view

A swarm of agents, climbing along walls and on eachother to reach the target.

Since the agents follow a fixed flow-field, most of the time, they do not care about the player’s position; they just follow the flow field. In order to reduce bandwidth usage, the player positions would be collected on the server at small intervals, which would be sent back to the client with an instruction to generate a new flowfield using the more up-to-date information, and to swap it inat a specific time. This led to the flowfields being consistently synced across the clients: thousands of agents synced at the cost of sending only a handfull of bytes periodically.

There is a caveat to this: agents consistently move to the position the player was at just a second ago. They are acting on slightly out of date information. My solution? Slowly change their behaviour to have them move towards directly the player once they start getting very close to the player. The agents are marked as ‘dirty’, and their positions are now temporarily fully replicated.

In the end, this feature was scrapped due to design and artist restrictions for our game. I shared the prototype with another team, who used it as a starting point for their steam release Oh Bugger.