Technical Game Designer
Project Wannabe, January 2022 - January 2024
Project Overview & Responsibilities
Project Wannabe is a first-person shooter that is inspired by Doom Eternal's fast-paced arena-style combat and flexible AI. I was brought onto this project as a Technical Designer where I worked off an on the project over the course of my schooling and sometime afterwards.
What I did
-
Simplified existing systems to be easier for designers to use.
-
Created combat AI to fit contend with player mobility while in the air.
-
Scripted and designed player mechanics alongside VFX artists and other designers.
-
Provided level designers with gadgets to spice up gameplay
-
Problem solved technical issues for team members throughout the duration of the project.
-
Wrote onboarding documents to setup source control.
Gameplay Contributions
Thunderstrike
The Thunderstrike is an ability that provides the player with resources such as health and ammo. It does this by increasing the amount of said resources that spawn upon an enemy's death. For the experience of the ability, I was aiming for something along the lines of Destinys' Fist of Havoc Ability, the weight of the impact and landing effect on enemies being the two things I wanted to replicate.

The version that matched the references

Here is the clip used for reference
When working with the VFX artist for this, I drew a diagram of what the mechanics experience was and gave him the reference video that I was using to make the motion and feel of the mechanic. From there I made the first iteration of the mechanic with the above concepts in mind. The second iteration contained tweaks to the amount of resources that were being dropped from enemies as well as the addition of the VFX which you can see below.

First iteration with no VFX
To add weight to the ability, I gave the player some air time between when they launch and when they land. I wanted to emphasize the power of the landing so enemies that are killed dissolve and fly away from the player. This was done so that the player could see a direct cause of them killing something with their ability as opposed to just killing an enemy regularly.
Death animation
During an internal playtesting session we received feedback that players were getting frustrated when they died. Not because of their unfortunate passing, but because their death was unclear. They still have full control of their character then suddenly their character snapped back to a checkpoint with no indication of why.

Old death state
There's no communication to the player for what has happened aside from the HUD disappearing. So I set out to fix this. I knew before making this that I wanted to have multiple points of clear feedback to the player that they died. So I settled on: Removing the arms from the screen, the camera falling to the ground, a camera fade to black and a UI pop-up.

Encounter System Updates
When I first joined Project Wannabe, the encounter system was over complicated. It was our biggest hurdle with onboarding new level designers so I took it upon myself to simplify the encounter design process.
I started this task by analyzing the components of the encounter system. It's made up of three components: the enemy spawner, interactables, and the combat director. The spawners are simple enough, they create enemies of a specified type when told to via the level blueprint. Interactables include things that a designer would want to react throughout the world, such as doors or lights. Finally the combat director is the most important part. It manages enemy attacks, holds critical pieces of enemy information and various combat related functions. So let me show you why my changes needed to be made.
I want to setup a combat encounter with three waves, I want to spawn each wave after the last wave has been entirely wiped out. Then once the encounter is over I want to open a set of doors allowing the player to proceed. What does setting that up look like prior to my changes?
This is a one minute video of me setting up the encounter. I drag out the same functions multiple times, targeting different enemy spawners and then finally open the doors once everything is dead. It was a needlessly tedious setup. So I made it faster. I utilized the combat director as a hub for organizing combat encounters. I did this by exposing variables within the combat director which designers fill with all sorts of things.

A screenshot of the Combat Directors details panel
Activatable objects are anything a designer wants to react when combat ends or starts. Existing enemies is for any characters placed on the map. Then you have your wave arrays. For each wave you select enemy spawners to spawn enemies. You then select when a next wave spawns via the wave transfer conditions enumerator and can even customize the delay between one wave to the next.

Now this is me setting up the exact same encounter with the changes to the combat director. It takes half the amount of time for the exact same result. The best part in my opinion was that I didn't have to create much new code for this to work. Most of what I did was create functions which utilized the newly exposed arrays.
This is the primary function for working through our waves of enemy spawners. It utilizes various macros from the combat director such as what type of enemies are alive, spawn functions and delayed function calls to create a wave system. It was something that I was able to integrate into the already existing encounter framework very organically and overall resulted in a positive and effective change to the encounter design workflow.