I am currently an activity designer at Bungie. I have experience working on large and small teams in technical designer and level designer roles. My interests are in transferring complex emotion through physicality-focused gameplay.
Resume
Work Experience
Bungie (2021- Present)
-Activity Designer
Worked on Destiny 2 seasonal content
Worked with a wide range of disciplines (from World Art to Narrative to Tech Design) to bring whole activities from brainstorm to polish
Designed unfurling gameplay and narrative beats told through weekly engagement with a spread of activities
 
Bungie (2019- 2020)
-Associate Technical Designer
Worked on Destiny 2: Beyond Light
Rebuilt Destiny 2 activities using new content authoring workflow with the goal of making content indistinguishable from the original
Maintained documentation for onboarding and knowledge-sharing
 
Avalanche Studios (2017- 2019)
-Destruction Designer
Worked on Just Cause 4
Created and maintained destructible physics objects using Maya and visual scripting tools
Optimized destructible objects to fit within performance constraints
Populated open world with AI vignettes and side objectives
 
Sledgehammer Games (2016- 2017)
-Assistant Level Designer
Worked on Call of Duty: WWII
Designed and scripted single-player encounters across a range of levels
Created tools and systems applicable in all levels by other designers
Worked closely with artists and system programmers to debug issues
 
Champlain College Emergent Media Center (2015)
-Interactive Designer
Worked on two installation game projects, Icarus and Variance (See above)
Implemented gameplay features in Unity
Interfaced Arduino hardware with Unity
 
Champlain College Tutoring Lab (2014)
-Unity Tutor
Tutored classmates to complete weekly Unity rapid prototyping assignments in C# scripting.
Projects
Ripples (2016)
Competitive rhythm/musical brawler
Position: Game Designer
Prototyped primary mechanics
Designed and implemented core gameplay, feedback systems, and character-specific abilities
Created soft goals and interactive objects in virtual space
Created feedback for goals and interactive objects
Interfaced on-suit Arduino with Unity
Maintained hardware integrity through live demos
 
Variance (2015)
Multi-controller cooperative experience
Position: Interactive Designer
Created controllers using mix of software (Imitone), different sensors, and Arduinos
Interfaced different controllers to respond in Unity
Maintained hardware integrity through live demos
 
Blindsight (2014)
Multiplayer FPS
Position: Sound Designer
Foley work, audio mixing
Position: Level Designer
Level whiteboxing, balance tweaking, playtesting
Ripples
Position:
Technical/Game Designer
Technologies:
Unity
Date:
August 2015
My senior project for Champlain College, I worked alongside a small team (4-9) over the course of two semesters to create Ripples, a competitive rhythmic pseudo-bullet-hell brawler where players are martial arts masters dueling on water to the beat of music. The project began as a reimagined shoot'em up on a pond with ripple-based offensive mechanics, where one's bullets are ripples, and shooting is achieved by jumping on the water's surface. This slowly evolved to have more rhythm game elements; players jump automatically to the beat of the musical track in the background, allowing players to focus on positioning and activating their character's special abilities. I prototyped the primary mechanics, iterated on them throughout development, and created systems of player feedback. I was also in charge of building boss encounters using musical tracks.
One of the projects I worked on at Champlain College's Emergent Media Center, Icarus has players don the Oculus Rift and a custom-made wingsuit to interact with a procedurally generated abstract world. I added some interactive elements to the world in the form of flying orbs and "birds" that followed them. Should players catch the orbs, birds flock around the player instead for a limited time. Players may also interact with floating rings to increase the longevity of their bird-influence. I also iterated on an intuitive and natural control scheme using the wingsuit. Apart from the gameplay elements of Icarus, I also helped with hardware maintenance and interfacing the wingsuit's Arduino guts with Unity.
Another of the projects I worked on at Champlain College's Emergent Media Center, Variance tasks three players with placing a ball into a box. Movement in each of the ball's three axes is controlled by a different controller, a microphone, an exercise gripper, and a stationary bike. I worked on concepting and implementing the different controllers.
Footage of Variance at a Burlington art event(0:20-0:31)
Kamikaze Titan Hearts
Position:
Game Designer/Programmer (Solo Project)
Technologies:
Unity
Date:
December 2014 - January 2015
A grappling hook-based 2D boss fighter, Kamikaze Titan Hearts tasks the player with injecting love directly into the heart of a homing rocket-spewing, laser-firing, bullet-spitting, and chronically depressed multi-stage death mechanism. Created over the course of 3 weeks, KTH is an attempt to subvert the generally shootastic genre of boss rush/bullet hell games, removing shooting in favor of a grappling hook movement and defense mechanic. The player's grappling rope reflects or absorbs projectiles, and when enough reflection occurs, the player is able to emit an offensive burst of hearts, which can detach the boss' outer segments, or assail the heart directly.
/*The laser implementation works as such: a reticle moves
in the player's general direction, with some wobbling to
simulate inaccuracy. Once the reticule has moved for a
preset amount of time, it stops and directs a ray between
the appropriate boss module and itself for a period of time,
then resumes seeking.*/
//Reticule imperative
private void SeekPlayer()
{
if (!firing)
{
//Move if distance from target is greater than 1
if (player != null && Vector3.Distance(transform.position, player.transform.position) > 1f)
{
transform.Translate(Vector3.forward * trackSpeed* Time.deltaTime);
transform.position = new Vector3(transform.position.x, transform.position.y, 185);
}
}
}
//Coroutine that constantly picks out points close
//to the player's actual location, directing the reticule.
IEnumerator FindRandom()
{
while (true)
{
if (player != null)
{
randomPoint = new Vector2(Random.Range(player.transform.position.x - inaccuracy, player.transform.position.x + inaccuracy),
Random.Range(player.transform.position.y - inaccuracy, player.transform.position.y + inaccuracy));
}
yield return new WaitForSeconds(fireInterval / 3);
}
}
//Laser intersection check
private void LaserCheckHit()
{
//First, cast a ray between the reticule and the boss module.
RaycastHit2D[] hit = Physics2D.RaycastAll(transform.position, thisRet.transform.position - transform.position);
//If the ray intersects another object...
if (hit.Length > 0)
{
foreach (RaycastHit2D hitObj in hit)
{
/*If the object is the player's grappling rope, have the linerenderer
be reflected to an appropriate position, and increase the player's
secondary resource count.*/
if (Input.GetMouseButton(0) && hitObj.collider.gameObject.tag == "LineCollider")
{
line.SetVertexCount(3);
line.SetPosition(1, hitObj.point);
Vector2 newPoint = (Vector3.Reflect(thisRet.transform.position - transform.position, hitObj.normal)*10);
line.SetPosition(2, newPoint);
playerLove.addLove(1);
}
/*If the object is the player, enable a variety of secondary effects
and decrement player health.*/
if (hitObj.collider.gameObject.tag == "Player" && !reflected)
{
playerHealthInfo.AlterHealth(-damage);
camInfo.shake = 0.3f;
camVig.enabled = true;
laserEffect.chromeTime ++;
sparks.Play();
laserEffect.StartCoroutine("ChromeOff");
}
}
line.SetWidth(10, 3);
Invoke("ReduceLaser", 3);
}
shooting = false;
}
Cellotype
Position:
Game Designer/Programmer
Technologies:
Unity, Imitone
Date:
February 2015 (Ongoing)
An experiment to create an interactive experience I can control with my cello, the Cellotype uses Imitone (a sound input-to-MIDI software) to drive a shaped assortment of cubes, each elastically tethered to its starting position. Each cube responds to a certain pitch, reacting physically to sounds picked up by a microphone. This creates an interactive mobile driven by sound.
Blindsight
Position:
Game Designer, Sound Designer, Level Designer
Technologies:
Unity
Date:
January 2014
Created for Global Game Jam 2014, Blindsight is a networked deathmatch FPS in which players are blind statues hunting each other with echolocation and screams. I worked on mechanical concepting, level design, and sound design (foley work) for Blindsight, the intent being to create an unsettling and mechanically unconventional deathmatch experience. There are several nuances to the gameplay, the primary one being that all actions are visible. To kill another player, one need only scream in their general direction. Because of the echolocation mechanics, a player screaming to kill another can be pinpointed because of the visible sound waves caused by the scream. Secondly, killing other statues allows the killer to assume its last victim's shape. This creates emergent patterns of play, such as stalking other players by standing still at opportune moments and locations.
Lonely Gods
Position:
Game Designer/Programmer (Solo Project)
Technologies:
Unity
Date:
February 2016 - March 2016
Initially created for Global Game Jam 2016, Lonely Gods is a slow experience where players are deposited in a persistent world with its own system of stars. Once per real-world day, players can point to the skies and connect stars to form constellations, which then tell the player a fortune. Fortunes are unique and are synced with an ever-growing list online, ensuring that the player's experience is never repeated. The game also features a steganographic screenshot feature, which allows players to take a picture of their world, and then share that picture as a portal to their particular worldseed.
void GenerateWorld(int newSeed)
{
//Check if the worldseed has already been set
if (seed == 0)
{
while(seed == 0)
seed = (int)Random.Range(-1024, 1024);
}
seed = newSeed;
Debug.Log("Seed: " + seed);
Random.seed = seed;
//Generate stars
for (int i = 0; i < starCount; i++)
{
//Stars are generated at random projections from a sphere
Vector3 p = Random.onUnitSphere;
//Thrust projections into space, setting star distance
//to somewhere between the min and max specified
p *= Random.Range(minRadius, maxRadius);
GameObject star = Instantiate(starObject, p, Quaternion.identity) as GameObject;
star.transform.parent = this.transform;
//Previously used a completely random color for the
//stars, but later realized that picked colors are
//more aesthetically pleasing
//Color col = new Color(Random.Range(0f, 1f), Random.Range(0, 1f), Random.Range(0, 1f));
//Picked color implementation.
//Most stars will be white, with a small number of
//stars being other colors. Draws from a list of
//colors specified in-editor, then chooses a final
//color by deviating slightly from the picked hue.
Color col;
int colChance = (int)Random.Range(0, colOneInMod);
if (colChance == 1)
{
col = starColors[Random.Range(0, starColors.Count)];
float shift = Random.Range(-colorVariation, colorVariation);
col.r += shift;
col.g += shift;
col.b += shift;
}
else
{
col = new Color(1, 1, 1);
}
//Generate other miscellaneous attributes, then
//initialize those values within the instantiated
//Star object. Also push the star into a list for
//other game functionality.
float starSize = Random.Range(minStarSize, maxStarSize);
float bMod = Random.Range(minStarTwinkleMod, maxStarTwinkleMod);
string name = (int)Random.Range(1, 5012) + " Archetype";
Star thisStarScript = star.GetComponent<Star>();
thisStarScript.InitStar(col, starSize, bMod, name, activatedSize);
stars.Add(thisStarScript);
}
}