Deep Attack Customization: To support the design needs of a bullet-hell game, I programmed a highly customizable bullet controller and emitter so that designers could create a wide variety of attacks without writing any code. It includes support for waves of bullets, oscillating patterns, randomization, and secondary bullet clusters. [Code Sample]
Player controller: I programmed the game’s player controller with a wide variety of actions, including a melee attack with support for acquiring different weapons with different attack patterns, an acquirable special attack with a cooldown, and a collectible utility pickup.
Shaders and VFX: I programmed several shader effects in Willow, and created VFX using Unity’s particle system [Show enemy spawn shader, enemy death, fog walls, dodge, and firework charm]
Aim assist: I built an aim assist system to pull the player’s aim toward enemies, without ever directing them away from a valid target or snapping unintuitively. The math underlying the system depends on a custom implementation of monotonic cubic splines, a type of spline so niche that I had to base my implementation on a math paper from 1980. [Code Sample]
Custom gravity system: Rigidbodies can be affected by various gravity manipulation mechanics, remember the last direction their gravity was set, and accelerate in that direction. Each object has its own gravity direction, so multiple objects can “fall” in different directions.
Omnidirectional player controller: The player controller moves smoothly along both flat and sloped terrain, no matter its current orientation. [Code Sample]
Puzzle mechanics: I programmed numerous mechanics for use in the game’s puzzles, including doors, buttons, gravity fields, object sensors, selective barriers, disintegrators, dispensers, and the player’s gravity manipulator.
I used UnityEvents to make all these mechanics interoperable, allowing level designers to connect them without writing any additional code. I also programmed custom gizmos to render the connections between puzzle elements in the level editor.
I designed and programmed several custom shaders for visual effects, using both HLSL code and ShaderGraph. [Code Sample]
Fixed point math library: The GBA’s processor doesn’t support floating point arithmetic, so using floats in the code requires the compiler to insert expensive software implementations of float math to get around the lack of hardware support, which quickly eats up performance. To get around this limitation I implemented a fixed point number library, which provides a way to represent non-integers with much cheaper arithmetic operations. My library includes full support for operator overrides and casting from other numeric types, so fixed points can be used like any primitive type in the rest of the codebase. [Code Sample]
GameObject system: I built a simple Entity-Component system, inspired by Unity’s GameObjects, to represent the game’s elements, including the player, enemies, gems, and the various components they depend on, like sprites, colliders, and cameras.
Dynamic spritemap manager: The GBA has a limited 256x256 pixel spritemap. The game’s full sprites can’t fit in that space all at once, so I built an allocator to manage that space dynamically. Each sprite component can be configured to request an individual sprite, a single animation, or a group of animations to be loaded into the spritemap. The sprite manager keeps track of how many requests for a given sprite are active, and reallocates that space once a sprite is no longer needed. This way, the game can dynamically request sprites without having to worry about designing the spritemap and hardcoding sprite locations, like many GBA games do. [Code Sample]
Procedural level generation: DownwellGBA generates its levels from predefined “blocks” of terrain, stitching blocks together at random until the level reaches a given length. Since the generated level is far too long to render on a single tilemap, the renderer takes advantage of the GBA’s looping tilemaps to only draw the map line-by-line as the player moves downward, looping back to the top of the map every 64 tiles.
Camera system: Inspired by Unity’s Cinemachine system, DownwellGBA’s cameras support target following with damping and lookahead, bounding boxes, and smooth transitions between cameras.
UI renderer & menu system: The game’s UI uses a palette of tiles to generate its layout and content at runtime. Its API includes methods for drawing decoration, text in different styles, and generating smooth progress bars out of individual tile segments. The game’s menus use arrays of MenuItem structs to support complex menu behavior, including submenus, toggles, and context-aware items.
Asset pipeline: Python scripts automatically convert image assets into the GBA’s sprite data format at compile-time. [Code Sample]
Pixelation render feature: We wanted to achieve a pixelated 3D look similar to the game A Short Hike, but Unity’s pixel-perfect camera would only work with the 2D renderer. So, I programmed a custom render feature that would pixelate the screen while still rendering at the full window resolution.
Triplanar terrain shader: I programmed a toon terrain shader that uses the angle of the terrain to choose whether to show the rock or snow texture at any given point. It also incorporates the additional texture channels of a terrain shader, allowing the designers to paint additional textures over the generated ones.
Snowball trajectory visualizer: Updates a line renderer to show the expected trajectory of the snowball before you throw it.
Artistic shaders: I contributed a few other shaders to the game, including the cartoony blocks of ice and the trajectory preview for snowball throwing.
I was the main programmer and technical artist on this project, responsible for 100% of the code. Key features I implemented include:
Handheld tablet device using diegetic, world space UI, which the player can use to find new audio logs and listen to them once found.
Keypad devices placed in the world that smoothly transition to screen UI for the player to interact with.
Multiple custom shaders including a waving flag, the beam of a handheld scanner, and a laser barrier reacting to the player's presence.
I have been taking part in game jams for several years, which has given me valuable skills in rapid prototyping and working under tight deadlines. A sampling of my game jam work is included here.
Team of ~5, Programmming & Pixel Art
Team of 3, Design & Programming
Team of ~5, Programming
Team of ~5, Programming