Recursion
Project Manager / Gameplay Programmer
Project Manager / Gameplay Programmer
In Recursion, players invade an alien research station overrun by a cult. Stealthily make your way through the station, or go loud and blaze your way through enemies. When caught, killed, or after extracting, loop back to the start of your mission. Beware, the cult leader seeks to stop you at every point.
Break the cycle.
Recursion was developed over 15 weeks alongside some Michigan State alumni currently working at Bungie. This was the opportunity from a lifetime to learn from fantastic industry mentors, and I'm grateful for the guidance they provided throughout the project!
Play the game here!
Programming Responsibilities
When we were designing the enemies for Recursion, there were a few key ideas we stood by. We wanted enemies to:
Have a looping schedule the player could learn over multiple runs that didn't change
Interact with the world around them (be able to open doors, notice distractions or things wrong around them)
Be challenging in combat to discourage players from fighting every time it was possible.
With that in mind, I developed two enemy types: The basic Melee enemy and the tougher Ranged enemy. Both enemies use the same base class for player detection, alerting other enemies when the player is spotted, and base variables (like health, movement speed, etc).
Patrolling Behaviors:
Enemies will follow a set path, repeating until they spot the player.
Once spotted, a detection meter will increase, influenced by how close the player is (the closer, the faster the detection)
Once detection meter is filled, enemies will alert other enemies in a short radius and enter combat.
Alert Behaviors:
If enemies lose sight of the player during combat or after a certain detection, they will become alert
Alert enemies will move to the player's last known position or a position of interest, then procedurally look around trying to find the player
If player is not spotted, they will return to patrol behaviors. If spotted, the enemy will enter combat.
Combat Behaviors:
During combat, melee enemies will try to reach the player and attack if their attack is off cooldown. Otherwise, they will slowly approach the player or circle slowly around them, depending on how fast the player is moving away). Ranged enemies will always attempt to maintain a certain distance from the player, and will similarly kite around the player or slowly approach them depending on distance and speed of the player.
If the enemy loses sight of the player for enough time, or hasn't done damage for a set amount of time, they will exit combat and enter alert mode.
We wanted our player controller to be slow, grounded, and very realistic feeling with hints of Dishonored in the peeking.
We alternated a few times between a free camera or Rainbow Six Siege-esque, eventually settling on the latter for simplicity sake.
I programmed our original player controller and movement. As the project went on, this work was later passed onto our technical designer, who added more systems and juice.
For this project, our designers wanted one, modifiable gun with stats they could easily adjust. Our gun went through a variety of changes throughout the project (starting off as a heat based weapon, and moving to ammo-based), and having a jumping-off point no matter the change made the gun flexible to new changes.
The images on the left showcase the scrapped heat system (with a system to visually heat up the coils per shot) and the variable spread for the gun, allowing designers to tweak settings to the maximum.
For this project, we needed a way to subtly guide the player through the level. I implemented this objective system, which types out an objective for the player and then flashes to draw attention.
Programmatically, I made this system a singleton so that its methods could be accessed across a variety of other scripts.
To use, other developers simply had to call:
ChangeObjectiveText(what they wanted the objective to be)
and the Objective Manager would update accordingly.
We wanted our enemies to interact with the environment in meaningful ways. To do this, I implemented a distraction system that utilizes an overlap sphere to notify enemies of an area of interest. As shown above, when enemies are pinged by the distraction, they will move to investigate, and if they don't spot the player, will return to normal patrol.
Designers simply had to add the Distraction script to game objects, fill out a few variables (i.e. the range of the distraction, what collisions trigger it), and the distraction was ready to go.
Production Responsibilities
For this project, I served as the manager / producer. One of my responsibilities included designating tasks weekly to all members of the team. I chose to use Jira to easily organize and categorize tasks by discipline and their current state. Each week, I would check in with team members for updates on their tasks and update the Jira board accordingly.
Each week, we met with Bungie mentors to discuss our work from the past week, playtest the game, and field feedback and critiques about the current version. I was in charge of scheduling these meetings (which were a mix of online or in-person), playtesting a version of the build before our meeting, and delivering the build to our mentors.
Lessons Learned
This project challenged me in a multitude of ways. Throughout it's lifespan, I battled a variety of team conflicts and juggling other school responsibilities.
There are a few key takeaways from this project for me: First, do something right the first time! A few times throughout the project, I had to go back and refactor certain systems because they were not scalable. This taught me to think with more foresight when designing systems or planning out code. Second, You have to meet people where they're at. There were multiple times throughout this project where team members were unable to fully contribute to their roles or tasks. Instead of getting frustrated or upset at them, we brainstormed solutions to their tasks, whether that meant doing something else to get the ball rolling or allowing someone else to take the task. This helped promote a better, more communicative team environment where everyone could push themselves.