Sub-Nivis screenshot
Sub-Nivis screenshot
Sub-Nivis screenshot
Sub-Nivis screenshot
Sub-Nivis screenshot

SUB NIVIS

Sub Nivis is a first-person 3D retro shooter inspired by classics like Quake and Doom. Play as Sister Maria, a nun sent to succeed where others like the Vatican and the UN failed: the Black Pyramid of Alaska.

This game has been made in a custom engine called 'The Other Engine'. Together with other designers, artists and programmers, Sub Nivis was made as part of a school project.

role icon

Gameplay Programmer
QA Lead

team icon

15 people

time icon

8 weeks

platform icon

Windows
PlayStation 4

platform icon

Custom Engine

platform icon

ENTT

Trigger Boxes

During the development of Sub Nivis, I was tasked with creating trigger boxes that could be used by designers to create levels. As our custom engine (The Other Engine) was designed to work with Trenchbroom to allow designers to have an easier time, I had to implement these triggers in Trenchbroom as well.

To do this, I modfied the FGD file to add the trigger entities to our list. Once in place, the designers would be able to create a trigger box entity in their level and change the type of trigger it would be. Depending on the trigger, it would display different input fields that designers could fill in to connect entities. The image shows a trigger box in the level that would open a door once all connected enemies have been slain. Here, 'killtarget' are the enemies that have to be defeated. While 'target' is the door that would be opened.

To make sure designers knew how to use this mechanic in Trenchbroom, I also wrote documentation on my feature so they would easily be able to use it. This in turn allowed for clearance and gave them to possibily to look it up if there were to forget it.

Code snippit of the triggerbox in the fgd file

To allow these triggers to work within our game, I created functions for each type of trigger. As the custom engine makes use of an Entity Component System (ECS) using the ENTT library, I would create a function pointer that points to a lambda. This function would be called whenever collision would happen with the trigger box. Afterwards, the trigger box would be created and passed to the ECS to add the entity.

The gif demonstrates the trigger box in action within our game. In this case, the door would open once all enemies on the bottom floor were slain.

Code snippit of the triggerbox in C++

Shotgun Spread

One of my other tasks during the development of Sub Nivis was to improve and implement the shotgun's alt-fire. The idea of the alt-fire was to be similar to the Super Shotgun from Doom. The designers requested the bullets to be mainly distributed in the center of where you aim, while slowly spreading out towards the outer radius.

To do this, I began searching for normally distributed transformations, one of which was the Box-Mullet transformation. The Box-Mullet transformation did exactly what I was looking for, as it normally distributes the points with a focus towards the center in a circle.

Following the equation of this transformation, I passed our uniformly distributed numbers and used the returning normally distributed numbers as the location of the bullets when the shotgun would be fired. This created the desired effect that the designers were looking for.

Code snippit of the shotgun spread in C++

QA Lead

As we had a limited number of designers on our team, I took up the role of QA lead within our team. Although this is not related to programming, it is still an important part of the development process that I found interesting.

One task that I had as QA lead was to keep track of which assets in the game were final, and which one were still missing or were placeholders. To track this, I made a simple document that would be updated whenever an asset changed within our game.

To ensure that our game was stable, I would also create and run smoke tests before we release and updated our game. Just like with the assets, I would go over my smoke test document to check if everything still functioned as it should be, and to make sure no bugs would occur.
Only once everything passed, would we submit our build to Itch.io.