STEELPUNK

STEELPUNK is a squad-based roguelike looter-shooter for PC about reclaiming a dead Earth consumed by a colossal machine.

Players take on missions as a team to explore and recover resources from vast and imaginative procedurally generated industrial-mechanical dungeon environments guarded by intelligent and hostile machines.

Players explore the unknown with their friends, delving as deep as they dare.

Since January 2023, I've been a Software Engineer at Blast Furnace Games, an independent game development studio spun out of Carnegie Mellon University's Game Creation Society and the developers of STEELPUNK.

I'm incredibly excited to be a part of the team and to share what we've accomplished!

Aerial Enemy 3D Pathfinding

The Pathfinder is a component which can create a map of a 3D space, then use that map to find optimal unobstructed paths between any two points by performing an implementation of the A* algorithm.

This is computationally expensive and required careful optimization. The algorithm utilizes time-efficient data structures such as priority queues, hashmaps, and multidimensional arrays. It also runs as a coroutine which distributes the operations across multiple frames. I'm currently working on utilizing Unity's multithreading Job System to increase performance even further.

Aerial Enemy 3D Navigation

The Navigator is the component responsible for safely requesting a path to a goal and translating the returned path into a single target vector by which a Controller component can simply navigate. It abstracts the series of coroutines and callbacks required to interface with the Pathfinder.

This abstraction also allows Controllers to utilize the Navigator for numerous purposes. The Eye Enemy Controller uses it to regain line-of-sight on the player, while the Healer Enemy Controller uses it to navigate to an optimal position from which to repair damaged enemies.

Eye Enemy Behavior

These Eye Enemies pose an intelligent threat to the player. Upon losing a clear shot, they actively seek to regain line-of-sight on the player. When targeted by the player, they dash out of the line of fire. They correct themselves when they fly too high or low.

The enemy's eye color conveys information about it's current state. If it's green, it means it's hunting down the player. If it turns purple, it means it's avoiding the player's gaze. If its red, it means it has a clear shot and the player is in danger.

Healers are small drones which repair all damaged enemies within range.

Healers are assigned enemies to repair by a single Healer Manager. Assignments are coordinated such that together, they maximize the collective regeneration of all enemies in the room.

This coordination is made challenging by a few key constraints. Healers should heal enemies that enter their range and stop healing those that leave it. Yet an enemy should never be healed by more than one healer at a time.

The assignment algorithm and the logic that allows Healers to update their assignment on the fly interface with a shared dictionary of all the room's enemies and their states. This enables a coordination which maintains the illusion of intelligence.

The lifecycle of a healer is managed by a state machine.

The unassigned healer requests an assignment from the Healer Manager, then calculates and navigates to an optimal position from which to execute their assignment.

They then carry out their assignment, updating it as unassigned enemies enter and assigned enemies leave their range, until they once again are unassigned.

Along the way, they constantly recalculate the optimal position from which to maximize enemy regeneration, repair damaged enemies, and perform an idle animation.

The Procedural Level Generation Algorithm is capable of creating a branching map from a configured set of tile-based rooms. It randomly selects free doors, rooms to place adjecent to them, and orientations in which they fits the available space.

By maintaining a graph of the generated level, the algorithm is capable of garunteeing a number of each room type within a set range, creating cycles between spawned paths at a set frequency, and manipulating the density of the final map.

Click here to see a full code walkthrough of the complete algorithm.

The Crafting System is an API which attaches to a player's inventory. Its primary function consumes ingredient items from the attached inventory and produces the corresponding craftable item.

The Crafting System is fully integrated into the Inventory UI, allowing players to essentially interface with the API themselves. Recipes are configured in a global scriptable object and programatically rendered.

Like any item, Weapon Upgrades are configured as scriptable objects (WUSOs). However, WUSOs specifically epose properties and functions which apply to the weapon to which the WUSO is attached.

A WUSO can modify its weapon's base properties or execute code upon player actions such as equipping, firing, or hitting a target with the weapon.

WUSOs are fully integrated into the Inventory UI, allowing players to attach any upgrade to any weapon at any time.

Placeable AoE items are consumables players can cast down on any surface within range. Once placed, the item creates a bubbly field that applies an effect to players or enemies inside it.

The effect and its targets are entirely configurable via scriptable objects, allowing us to reuse effects implemented for single-target consumables and weapon damage payloads.

Movement Speed Modification System

This system allows for the application of modifiers to a player's speed. This is currently utilized by a consumable item which temporarily increases the user's speed, but such a modifier could also be applied by equipment, a weapon, or an AoE.

My Experience

Working on a Team

Working within a community of similarly inspired game developers is exciting each and every day. It's fulfilling and empowering not only to be doing the work I feel I'm meant to do, but to share that mission with friends. I can't wait to bring the game into the next stage of development and production.

Sharpening my Skills

The opportunity to solve problems in the Unity editor each and every day has given me the best practice I could ever have. I'm happy to be learning new practical skills and patterns in a hands-on environment.

On this project, I've solved problems I'd never be assigned in a classroom. Analyzing and optimizing the runtime complexity of algorithms I've written is far more compelling when a player's frame rate is at stake!

I've also practiced what may be my most valuable skill- understanding and building atop an existing codebase belonging to another developer. I'm now quite comfortable diving into an unfamiliar codebase and quickly coming up to speed in order to make meaningful contributions.

Developing the Game

I'm incredibly proud to have developed major features and systems that cleanly integrate with and support the rest of the project.

I find joy in adding layers of complexity and creativity to the game which improve the player experience.

I've discovered an excitement in developing tools and systems which enable the team to work at a higher level and bring their visions to life